Skip to content

feat(deploy): #431 sectioned train renderer with attributed warnings - #440

Merged
elliotBraem merged 7 commits into
fix/runtime-diagnosticsfrom
feat/deploy-output-polish
Oct 16, 2026
Merged

elliotBraem merged 7 commits into
fix/runtime-diagnosticsfrom
feat/deploy-output-polish

Conversation

@elliotBraem

Copy link
Copy Markdown
Contributor

Closes #431

Stacked on #439 (base fix/runtime-diagnostics), which is stacked on #438 (feat/cli-split) — the full restructure chain: #432 → #433 → #434 → #435 → #436 → #437 → #438 → #439 → this. No file overlap with #439.

What

The deferred output bucket (ADR 0031's last piece: presentation lives in cli/render/, services never print):

  • Sectioned renderer — DeployTrainRenderService (the WorkspaceBuildRenderService exemplar) implemented by cli/render/deploy-train.ts: Build / Upload / Publish sections in deterministic target order. Parallel upload units (Deploy speed: parallel uploads, content-hash rebuild oracle, network dedupe #430) can no longer interleave their lines.
  • Attributed warnings — WorkspaceDeployResult gains the warnings field the CLI was already rendering (dead plumbing wired: the schema had no field, nothing set it). Build stderr is buffered per workspace, warning segments extracted (WARNING/⚠ lines through the next blank line; $ command echoes never count), rendered as name-padded per-workspace rows in the Build section. Raw stderr streams only under --verbose.
  • One line per workspace upload by default — the ✓ row: aligned 28-char name column, bundle base, uploaded/skipped counts, duration. Detail lines (manifest-diff skips, the version-manifest pin row, source archive) only under --verbose, indented under the workspace's named line — the version-manifest row no longer pads an EMPTY name and scatters into other workspaces' output.
  • The upload leg is silent — uploadWorkspaceBundle returns structured detail (base/manifestFile/notes); the renderer decides how it shows.
  • Output snapshot tests (chalk.level = 0): column alignment, default-vs-verbose, the publish section, warnings attribution, and the leg's silence.

Verification

  • 1,626 tests green across workspaces (host 140 · everything-dev 1,295 · auth 191)
  • lint 0 errors · typecheck 12/12 workspaces (2 known pre-existing baselines) · build train green · test:structure 11
  • Red-green at the seams: silence test (leg prints nothing), warnings attribution (via onChunk, matching the real stream), snapshot diffs reviewed

Sectioned output through a presentation seam: DeployTrainRenderService
(mirroring WorkspaceBuildRenderService) implemented by
cli/render/deploy-train.ts — Build / Upload / Publish sections in
deterministic target order; the train reports, the renderer shows, and
parallel upload units can no longer interleave their lines.

Attributed warnings: WorkspaceDeployResult gains the warnings field the
CLI was already rendering (dead plumbing wired — the schema had no
field, nothing set it). buildOneWorkspace buffers child stderr, extracts
warning segments (WARNING/⚠ lines through the next blank line; "$ "
command echoes never count), and attributes them to the workspace;
raw stderr streams only under --verbose.

One line per workspace upload by default: the ✓ row carries the aligned
28-char name column, bundle base, upload/skip counts, and duration;
detail lines (manifest-diff skips, the version-manifest pin row — which
padded an EMPTY name before, source archive) print only under --verbose.
uploadWorkspaceBundle is silent — it returns structured detail
(base/manifest/notes) and the renderer decides; the train attaches it
to the #430 upload outcomes.

Output snapshot tests (chalk.level 0): column alignment, default vs
verbose, the publish section (registry URL, fingerprint, slot pins,
audit manifest), warnings attribution, and the silence of the leg.

1,624 tests green across workspaces (140 host + 1,293 everything-dev +
191 auth); lint 0 errors; typecheck at the 2 known baselines; build
train green.
…gs rows

extractBuildWarnings reads the onChunk buffer only — the template also
concatenated proc.stderr (the same captured bytes), rendering every
warning twice. The unit test feeds chunks through onChunk, matching the
real stream. renderBuildWarnings prints one attributed sub-block per
workspace (name-padded rows; multi-line segments indent continuations
under the same column), replacing cli.ts's unattributed flatMap block;
snapshot-pinned. upload-leg drops dead defensiveness; the changeset
now describes the version-manifest row accurately (attributed by
nesting under the workspace's named line) and scopes Image+Railway to
the existing leg rows.
@railway-app

railway-app Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

🚅 Deployed to the everything-dev-pr-440 environment in heartfelt-ambition

Service Status Web Updated
upload.everything.dev ✅ Success (View Logs) Oct 16, 2026 at 7:52 pm UTC
8 services not affected by this PR
  • dev-app
  • api-db
  • projects
  • app
  • api-db-6AR0
  • projects-db
  • auth-db-ISTt
  • auth-db

@elliotBraem
elliotBraem added this pull request to stack #442 October 16, 2026 18:34
Sectioned output through a presentation seam: DeployTrainRenderService
(mirroring WorkspaceBuildRenderService) implemented by
cli/render/deploy-train.ts — Build / Upload / Publish sections in
deterministic target order; the train reports, the renderer shows, and
parallel upload units can no longer interleave their lines.

Attributed warnings: WorkspaceDeployResult gains the warnings field the
CLI was already rendering (dead plumbing wired — the schema had no
field, nothing set it). buildOneWorkspace buffers child stderr, extracts
warning segments (WARNING/⚠ lines through the next blank line; "$ "
command echoes never count), and attributes them to the workspace;
raw stderr streams only under --verbose.

One line per workspace upload by default: the ✓ row carries the aligned
28-char name column, bundle base, upload/skip counts, and duration;
detail lines (manifest-diff skips, the version-manifest pin row — which
padded an EMPTY name before, source archive) print only under --verbose.
uploadWorkspaceBundle is silent — it returns structured detail
(base/manifest/notes) and the renderer decides; the train attaches it
to the #430 upload outcomes.

Output snapshot tests (chalk.level 0): column alignment, default vs
verbose, the publish section (registry URL, fingerprint, slot pins,
audit manifest), warnings attribution, and the silence of the leg.

1,624 tests green across workspaces (140 host + 1,293 everything-dev +
191 auth); lint 0 errors; typecheck at the 2 known baselines; build
train green.
…gs rows

extractBuildWarnings reads the onChunk buffer only — the template also
concatenated proc.stderr (the same captured bytes), rendering every
warning twice. The unit test feeds chunks through onChunk, matching the
real stream. renderBuildWarnings prints one attributed sub-block per
workspace (name-padded rows; multi-line segments indent continuations
under the same column), replacing cli.ts's unattributed flatMap block;
snapshot-pinned. upload-leg drops dead defensiveness; the changeset
now describes the version-manifest row accurately (attributed by
nesting under the workspace's named line) and scopes Image+Railway to
the existing leg rows.
@railway-app
railway-app Bot temporarily deployed to heartfelt-ambition / everything-dev-pr-440 October 16, 2026 19:50 Destroyed
@elliotBraem
elliotBraem merged commit 522397c into main Oct 16, 2026
19 checks passed
@railway-app
railway-app Bot temporarily deployed to heartfelt-ambition / everything-dev-pr-440 October 16, 2026 20:44 Destroyed

This branch was successfully deployed

No deployments
heartfelt-ambition / everything-dev-pr-440 — 89f0f551 Deployed Oct 16, 2026 by railway-app[bot]
Sign up for free to 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.

Deploy output polish: sectioned renderer, attributed warnings

1 participant