Skip to content

feat(data ingest): honest waits + plain-language run output (#172) - #173

Merged
saadqbal merged 1 commit into
developfrom
feat/ingest-honest-waits
Jul 8, 2026
Merged

feat(data ingest): honest waits + plain-language run output (#172)#173
saadqbal merged 1 commit into
developfrom
feat/ingest-honest-waits

Conversation

@LukasWodka

Copy link
Copy Markdown
Contributor

Summary

Fixes #172 (from the ingest-flow UX audit): the tracebloc data ingest run worked but spoke Kubernetes and went silent right after the most important step. Three fixes, output-copy + progress only — no control-flow or exit-code changes.

1. No more silent hang after submit

WatchJob's waitForJobPod polls up to PodReadyTimeout (5 min) for the ingestor Pod to schedule + pull its image, printing nothing — the CLI looked hung. Now a live spinner ("Waiting for the ingestion to start…", with a Ctrl-C hint) covers that wait, then a clean Ingestion started — live progress: precedes the log stream. WatchJob gained a nil-safe *ui.Printer for this; passing nil (tests, non-TTY) keeps the old silent behavior.

2. The 1-hour watch cap is disclosed up front

JobWatchTimeout is 1h; on expiry the CLI silently detached. Step 4 now says so — and only when not--detach (the old hints promised streaming even under --detach, which was itself dishonest — an adversarial-review catch).

3. Plain language instead of k8s jargon

Reworded the whole run narrative: upload-channel wording instead of stage Pod, Submitted — tracebloc is validating your data…, Connecting to your workspace to submit the run…, and plain detach/timeout messages. The raw kubectl logs reconnect stays (there's no CLI re-attach verb yet) but as a labelled optional follow.

From the adversarial review (folded in)

  • The green ✔ Ingestion started now shows only for a live/completed pod — a Pod already Failed (immediate crash, or a prior backoffLimit retry that bestPod selects) gets a neutral streaming logs: line, not a success checkmark before its crash output (waitForJobPod now returns the selected pod's phase).
  • The pod-wait-timeout detach message no longer claims "you don't need to do anything" — false for the PSA-rejection / unschedulable subcases the same path covers.

What the user sees now

The full happy-path flow (with the new lines marked) is in the terminal walkthrough I shared with Lukas; the headline change is that the 5-minute post-submit silence is now a live spinner, and every line reads in plain language.

Tests

Updated submit_test.go (reworded strings), watch_test.go (the new waitForJobPod phase return + nil-printer callers, with phase assertions added), stage_test.go (new substrings). Full internal/... suite green; gofmt/go vet clean.

Scope / follow-ups

Independent of #167 (staging reclaim) — this is copy + progress. Deliberately not in scope, noted in #172: the client/workspace/cluster terminology sweep, the orphan-warning kubectl delete copy, naming the destination table in the success summary, and a real re-attach verb.

Closes#172. Part of the data ingest UX sweep (epic #67).

🤖 Generated with Claude Code

The `tracebloc data ingest` run worked but spoke Kubernetes and went
silent at the worst moment. Three UX fixes surfaced by the ingest-flow
audit:
1. Silent hang after submit. WatchJob's waitForJobPod polls up to 5 min
(PodReadyTimeout) for the ingestor Pod to schedule + pull its image,
printing nothing — the CLI looked hung right after the key step. Now
a live spinner ("Waiting for the ingestion to start…", with a Ctrl-C
hint) covers that wait, then a clean "Ingestion started — live
progress:" precedes the log stream. WatchJob takes a nil-safe
*ui.Printer for this; nil (tests) stays silent as before.
2. Undisclosed 1-hour watch cap. JobWatchTimeout is 1h; on expiry the
CLI silently "detached". Step 4 now discloses the follow window up
front — and only when NOT --detach (the hints used to promise
streaming even under --detach, which was itself dishonest).
3. Kubernetes jargon on the happy path. Reworded the run narrative to
plain language: upload-channel wording instead of "stage Pod",
"Submitted — tracebloc is validating your data…", "Connecting to your
workspace to submit the run…", and plain detach/timeout messages. The
raw `kubectl logs` reconnect stays (there is no CLI re-attach verb
yet) but as a labelled optional follow, not jargon in a sentence.
From the pre-PR adversarial review: the green "✔ Ingestion started" now
only shows for a live/completed pod — a Pod already Failed (immediate
crash, or a prior backoffLimit retry) gets a neutral "streaming logs:"
line instead of a success checkmark before its crash output
(waitForJobPod now returns the selected pod's phase). The
pod-wait-timeout detach message no longer claims "you don't need to do
anything" (false for the PSA-rejection / unschedulable subcases the same
path covers).
No control-flow or exit-code changes — output copy + one nil-safe
progress-reporter param. Tests updated for the reworded strings + the
new waitForJobPod phase return.
Closes#172. Part of the data ingest UX sweep (epic #67).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@LukasWodkaLukasWodka self-assigned this Jul 7, 2026
@LukasWodka
LukasWodka requested a review from saadqbalJuly 7, 2026 15:24
LukasWodka added a commit that referenced this pull request Jul 7, 2026
…nomy
Draft RFC capturing the ingest-UX redesign discussed with Lukas:
- Invert the flow: ask for the DATA first, sniff the family from the
layout, then offer only the compatible tasks — instead of the current
task-first 16-item wall shown before anything is known about the data.
- Accept a flexible input path (a bare .csv for tabular/time, a directory
otherwise) — today every family requires a directory, even tabular.
- Never "upload/push/stage" in user copy — the data stays on the user's
own infrastructure; "ingest" umbrella, "copy into your storage" for the
move. Rename --category -> --task (required), --intent -> --split.
- Reduce ceremony: one environment, so drop "Connect to your workspace"
and the cluster/PVC fields; Kubernetes behind --verbose.
- The 15 ML tasks with data-scientist-facing names + one-liners (HF /
scikit-learn / Papers With Code research); the label column is
task-specific (skipped for the self-supervised text tasks).
- The taxonomy contract: the task list is duplicated in 5 places across 3
repos with one enforced edge; make the schema enum the single source of
truth + cross-repo drift checks.
- Phased delivery incl. wiring the 5 CLI-pending text tasks so the CLI
matches the platform.
Grounded in a code-level audit of CLI develop + the ingestor + the
backend. Supersedes the copy in #173 where they conflict.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@saadqbal

Copy link
Copy Markdown
Collaborator

bugbot run

@cursor

cursorBot commented Jul 8, 2026

Copy link
Copy Markdown

Bugbot couldn't run

Bugbot is not enabled for your user on this team.

Ask your team administrator to increase your team's hard limit for Bugbot seats or add you to the allowlist in the Cursor dashboard.

@saadqbal

Copy link
Copy Markdown
Collaborator

Clean, careful PR 👍 — one tiny thing: on the fast-completion path waitForJobPod can return a pod already in PodSucceeded, and the else branch still prints "Ingestion started — live progress:" for it (logs are replayed, not live). Same honesty-of-wording standard you applied to the Failed case. Not worth a round-trip unless you're touching that spot anyway.

@saadqbal
saadqbal merged commit a2c8128 into developJul 8, 2026
17 checks passed
saadqbal pushed a commit that referenced this pull request Jul 8, 2026
…nomy (#174)
* docs(rfc-0002): tracebloc data ingest — flow, terminology & task taxonomy
Draft RFC capturing the ingest-UX redesign discussed with Lukas:
- Invert the flow: ask for the DATA first, sniff the family from the
layout, then offer only the compatible tasks — instead of the current
task-first 16-item wall shown before anything is known about the data.
- Accept a flexible input path (a bare .csv for tabular/time, a directory
otherwise) — today every family requires a directory, even tabular.
- Never "upload/push/stage" in user copy — the data stays on the user's
own infrastructure; "ingest" umbrella, "copy into your storage" for the
move. Rename --category -> --task (required), --intent -> --split.
- Reduce ceremony: one environment, so drop "Connect to your workspace"
and the cluster/PVC fields; Kubernetes behind --verbose.
- The 15 ML tasks with data-scientist-facing names + one-liners (HF /
scikit-learn / Papers With Code research); the label column is
task-specific (skipped for the self-supervised text tasks).
- The taxonomy contract: the task list is duplicated in 5 places across 3
repos with one enforced edge; make the schema enum the single source of
truth + cross-repo drift checks.
- Phased delivery incl. wiring the 5 CLI-pending text tasks so the CLI
matches the platform.
Grounded in a code-level audit of CLI develop + the ingestor + the
backend. Supersedes the copy in #173 where they conflict.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(rfc-0002): Rev 2 — split→name→path order, file-or-folder echo, label column task-specific
Per discussion with Lukas: settle the Phase-1 prompt order (train/test →
name → path → task), make the file-or-folder mental model explicit (point
at your data in whatever shape it has; the "Found ..." echo removes the
confusion), and move the label column fully into the task-specific
questions.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(rfc-0002): Rev 3 — label design (kill #340 silent-null) + full 15-task input matrix
Rewrite the label section: three shapes (class/target/absent), precise
per-family wording (never the ambiguous "label to predict"), and
pick-from-real-headers + exact-match-or-hard-fail validation that closes
the data-ingestors#340 case-mismatch silent-NULL-label bug. Add the full
task-specific input matrix for all 15 tasks. New reconciliation open
questions (drop vestigial --label-column for sidecar-labeled vision,
forecasting timestamp gap, target_size placement, schema-for-regression).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
* docs(rfc-0002): Rev 4 — settle the 4 reconciliation decisions
Per Lukas: drop --label-column for sidecar-labeled vision (object
detection/keypoint/segmentation); forecasting gets a first-class
timestamp prompt + preflight; normalize --target-size to file_options;
surface inferred schema for confirmation on the regression family.
Task display names remain under review (decoupled from the wire task_id).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@saadqbal

Copy link
Copy Markdown
Collaborator

/fr-pass

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@LukasWodka@saadqbal