Skip to content

STU-445: pipeline holding window matches the mock + split Refine/Regenerate captions - #104

Merged
sgardoll merged 4 commits into
milestone/stu-implement-updated-ui-uxfrom
sgardoll/stu445-pipeline-results
Sep 28, 2026
Merged

sgardoll merged 4 commits into
milestone/stu-implement-updated-ui-uxfrom
sgardoll/stu445-pipeline-results

Conversation

@sgardoll

Copy link
Copy Markdown
Owner

STU-445 — two items

1. "The 3 stage holding window does not reflect the mock:"

The owner attached a screenshot of staging (25 Sept) showing the legacy window. I rendered the branch state first, then compared it against the canonical pipeline view in /Users/home/Projects/Custom-Code-Connect-redesign/custom-code-connect-hero.html (.walkthrough-layout / .pipeline-view, stageCopy; the before-* variants and the numbered .pipeline-list are excluded — the list exists only as dead CSS in the canonical file, with no markup anywhere).

Deltas confirmed by render + computed styles, then fixed (before → after, measured at 1440×900 unless noted):

# Delta Before After (mock)
1 Glyph legacy </> spinner circle (80px lavender disc, indigo #4f46e5 icon, orange arc) rendered alongside the STU-390 mark legacy spinner removed; the authored mark is the only glyph, drawn in --muted, 24px above the title (16px stacked)
2 Prompt recap placement centred card (400px, border+radius+surface) above the glyph, in the middle of the flow the panel's left sidebar: 310px column, 30px inset, 1px --border hairline, kicker/prompt/Edit-prompt closed at its bottom-left (mock .walkthrough-sidebar)
3 Layout single centred flex column, everything centred two-column grid 310px minmax(0,1fr); the stage view is a left-aligned block centred in the main column (mock .pipeline-view); at ≤920px the workflow leads and the prompt follows beneath (mock's stacked order)
4 Typography — title 18px/600 sans 34px/1.2 --font-display, weight 500, -0.025em
5 Supporting line subtitle "Step 1 of 3 — Prompt Architect" (13px --muted-2), duplicating the meta line the mock's description line: 16px --muted, 44ch, per-stage copy from the mock's stageCopy ("Turning your idea into a clear FlutterFlow specification." / "Building the Dart source, widget parameters and animation." / "Checking the generated code and preparing the file review."). The precise step/stage/state line stays in the aria-live region as sr-only, so announcements are unchanged
6 Track 6px #e2e8f0, radius 3px, indigo→blue gradient fill + shimmer animation 4px pill, radius 999px, --track background, --fg fill, --t-progress/--ease transition
7 Meta 11px sans --muted-2 12px --font-mono --muted (the run's real elapsed time + "Step N of 3", as the app needs both ends of the mock's space-between line)
8 Stage dots centred, active indigo #6366f1 + glow, done green #22c55e left-aligned under the block; pending --border, active --fg + --fg 14% ring, done --fg, failed --bad

Evidence: before render current-pipeline-1440.png (base) vs after render (both captured with the dev server + Playwright at 1440×900 and 390×844); the after state is additionally pinned as asserted computed styles/geometry in e2e/stu377-pipeline-progress.spec.js → "Holding window matches the canonical pipeline view" (2-column count and 310px first track, recap.x < view.x, 1px hairline, mark.x === title.x, 34px/500 title, mock description text and 16px size, 4px/999px track, fillColor === var(--fg), DM Mono 12px meta, active dot === --fg, stage-2 description copy, done dot === --fg; stacked order at 390px).

Stage semantics survive: #pdot-1/2/3 + data-state, aria-current, aria-pressed, keyboard reach, skipped-stage behaviour, failure states and the #pipeline-status live region are untouched; the full stu377 spec passes on the new contract (the stage nav is the app's accessible Architect → Generator → Review progression, which the mock's scripted demo does not carry — kept deliberately, see "not implemented" below).

2. "Refine & Regenerate acts on the selected artifact · build-error fixes regenerate the whole bundle."

Split so each half sits under its button, and the combined sentence is gone:

  • under Refine & Regenerate: Refine & Regenerate acts on the selected artifact
  • under Add FlutterFlow Build Errors & Regenerate: Acts on the whole bundle

Each action is now a column (.results-action) that owns its button and its caption (.results-action-scope); the two action icons are pinned to the intended 14px in the bar's CSS so the three buttons keep one height in environments where Tailwind's CDN utilities are unavailable (the browser suite). Renders verified at 1440×900 (three 44px buttons, captions beneath) and 390×844 (stacked).

Fail → pass evidence

  • src/resultsLayout.test.js → "splits the action scope sentence under its own button"
    • base index.html: not ok 341 - splits the action scope sentence under its own button → # fail 1, # pass 354
    • after: # tests 355, # pass 355, # fail 0
  • e2e/stu377-pipeline-progress.spec.js → "Holding window matches the canonical pipeline view" (2 tests)
    • base index.html + app.js (implementation reverted, tests kept): 2 failed — "element(s) not found" for .pipeline-view, and the legacy .pipeline-progress-icon still present
    • after: 2 passed; repeated 4× with --retries=0 → 8 passed
  • e2e/stu378-results.spec.js action locator: widened .results-action-bar > button → .results-action-bar button (the captions wrap the two buttons). All assertions kept: count 3, order, visibility, and the equal-prominence checks pass.

Full CI on the pushed head (28428a2)

Step Result
CI=1 npm test 355 pass / 0 fail (baseline 354 + 1 new)
CI=1 npm run build ✓ built
CI=1 CCC_TEST_PORT=3117 npm run test:ui 208 tests: 207 passed, 0 failed, 1 flaky (stu375 "200% zoom…" — navigation timeout under load, passed on retry)
CI=1 npm run test:accessibility 7 shells passed
CI=1 npm run test:deploy-guard 9/9
CI=1 npm run test:proxies 30/30
CI=1 python3 scripts/scan_bundle_for_leaks.py No leaks found

Notes: the reserved port 3107 was held by another worker's dev server (gate-modal worktree), so the UI suite ran on 3117 — same command, different port. The two known CI-only failures (stu385:148, stu391:260) did not appear locally. dist/ and screenshots/ were restored to HEAD; the commit contains only the five source/spec files.

What I did NOT implement / judgement calls

  • No visible "Step N of 3 — Prompt Architect" subtitle: the mock has no such line; its information is in the meta line ("Step N of 3"), the dots' labels and the sr-only live region. This is the "subtitle vs the mock's meta line" delta resolved toward the mock.
  • Stage nav dots kept (the mock's demo has none): they are the app's real, accessible stage navigation with #pdot-1/2/3 + data-state load-bearing for ~20 tests, and the brief requires stage semantics to survive. They are restyled to the redesign's inks, not removed.
  • Elapsed timer kept in the meta line (left slot of the mock's space-between line): it is real elapsed-time functionality, not mock copy.
  • Stage titles unchanged ("Generating Dart code" / "Running the code audit"): the mock's stage descriptions were adopted verbatim, but changing the titles would require editing PIPELINE_STAGE_TITLES in app.js outside the owned function ranges; stage 1's title already matches the mock and the done titles ("Prompt understood") are pinned by stu377.
  • src/logoMotion.css untouched (outside ownership): the mark's colour/margin deltas are applied via a scoped override in index.html's pipeline CSS.
  • Noted, not deleted (pre-existing dead code, per the surgical-change policy): the unused .progress-dot.active / .progress-dot.completed rules (indigo/green) that no markup has used since STU-377.
  • Uncertainty: the mock's mark at rest is --muted; if the owner prefers the mark in --fg (as STU-390 shipped it), that is a one-line override to drop.

…erate captions

Holding window (owner: "The 3 stage holding window does not reflect the
mock:"). Rendered the branch, compared it to the canonical pipeline view
(custom-code-connect-hero.html .walkthrough-layout / .pipeline-view), and
fixed the real deltas:

- glyph: removed the legacy </> spinner circle and its orange arc; the
  authored STU-390 mark is now the only glyph, drawn in --muted and aligned
  with the copy's left edge, 24px above the title (16px stacked).
- layout: the panel is the mock's two-column interior - the submitted prompt
  is the left sidebar (30px inset, hairline, Edit prompt closed at its
  bottom-left) and the stage view is a left-aligned block centred in the main
  column. At <=920px the workflow leads and the prompt follows beneath it.
- typography: title 34px/1.2 display at weight 500; a visible supporting line
  carrying the mock's stage copy (16px, --muted, 44ch) replaces the duplicated
  "Step N of 3 - Stage" subtitle, which stays in the live region sr-only.
- bar: 4px pill, --fg fill on the --track token (no indigo/blue gradient,
  no shimmer); meta line is mono 12px --muted.
- stage nav: keeps its semantics and locators but paints in the system's ink
  (--fg dots, --border pending, --bad failed) instead of indigo/green.

Results captions (owner: split the scope sentence so each half sits under its
button): "Refine & Regenerate acts on the selected artifact" under Refine &
Regenerate, "Acts on the whole bundle" under Add FlutterFlow Build Errors &
Regenerate; the combined sentence is gone. Each action is a column that owns
its caption, and the two action icons are pinned to the intended 14px so the
buttons keep one height when Tailwind's CDN utilities are unavailable.

Tests: new holding-window contract in stu377 (computed styles and geometry,
fails on the old window) plus the copy-split pin in resultsLayout; stu378's
action locator widened to a descendant selector because the captions wrap the
buttons. Full CI green: 355 unit, 208 Playwright (207 pass + 1 load flake
retried), 7 a11y shells, 9/9 deploy-guard, 30/30 proxies, leak scan clean.
@sgardoll
sgardoll marked this pull request as ready for review September 28, 2026 07:44
@greptile-apps

greptile-apps Bot commented Sep 28, 2026

Copy link
Copy Markdown
Contributor

This PR does not match any of the 1 configured review trigger rule.

devin-ai-integration[bot]

This comment was marked as resolved.

sgardoll and others added 2 commits September 28, 2026 18:56
At <=920px the workflow is displayed above the prompt recap, but the recap
still came first in the DOM, so Tab reached Edit prompt before the active
stage button. The workflow now precedes the recap in the document; desktop
grid areas keep the prompt in the left column, and the stacked breakpoint
drops its order overrides so DOM and displayed order agree everywhere,
failure actions included.
Devin Review flagged that on desktop the workflow column received focus
before the left-hand prompt recap: the DOM led with .pipeline-view while
grid-template-areas painted it second, so Tab travelled right-to-left.

initPipelinePanelOrder now moves the two regions to match the active
breakpoint — workflow first when stacked (<=920px), recap first on
desktop — and plain grid auto-placement paints them in that order, so
document order, displayed order and sequential focus order agree at
every width. A 1440px spec pins Edit prompt before the active stage
button; the <=920px assertions are unchanged.

Co-Authored-By: Stuart Gardoll <sgardoll@gmail.com>
devin-ai-integration[bot]

This comment was marked as resolved.

Devin Review round 2: reparenting the recap blurs a focused descendant,
so crossing 920px with Edit prompt focused dropped keyboard focus to the
document. The focused element is captured before the move and refocused
afterward; a spec drives the resize in both directions with Edit prompt
focused and asserts both the new order and the retained focus.

Co-Authored-By: Stuart Gardoll <sgardoll@gmail.com>
@sgardoll
sgardoll merged commit 83989b7 into milestone/stu-implement-updated-ui-ux Sep 28, 2026
2 checks passed
sgardoll pushed a commit that referenced this pull request Sep 28, 2026
…u445-exact-html-fidelity

Re-sync STU-445 onto base f1c819d (merges #108 -> #104 -> #103).

Single conflict, in index.html, comment-only: the base adds a five-line
comment above <div class="pipeline-view"> documenting #104's
initPipelinePanelOrder focus-order contract. Resolved by taking the base
side's comment. The base's #104 CSS changes (dropping grid-template-areas
in favour of JS-driven region ordering) auto-merge and are preserved.

dist/ regenerated from the merged sources: app.js differs from both parents,
so the previous bundle was pre-merge. index-CD_p5Yhb.js -> index-C31N1DOp.js.
CSS is byte-identical (index-BQUorxWE.css), and a second build is a no-op.

npm test 388/388 green (the base contributes 3 tests over the prior 385).
No test changed, skipped, or weakened by this merge.
sgardoll pushed a commit that referenced this pull request Sep 28, 2026
…ndow

Both are test-setup corrections. Neither weakens, skips or removes any
assertion; no application code is touched.

"desktop: keyboard focus follows the prompt-then-workflow order" walked
focus from `document.activeElement?.blur()`. Blur does not move Chromium's
sequential-focus-navigation starting point, so the sweep resumed wherever
focus last was -- landing inside the view, hitting pdot-1, and only
wrapping around to the recap afterwards, so edit(7) < pdot1(1) failed.
Anchor the walk on a deterministic element instead, mirroring the sibling
stacked test's #progress-stage-count anchor: #topbar-avatar is the last
tabbable ahead of the panel, so the sweep enters at the recap and still
proves edit precedes pdot-1 in tab order (edit=3, pdot1=5 from the top of
the document).

"resizing across the breakpoint keeps focus inside the moved recap" called
.focus() on the Edit prompt the instant the stage went active, with no wait
for the composer -> pipeline morph, so the button was still 0x0 and focus
never landed -- the send button blurred to BODY and focusedId came back "".
This is pre-existing breakage from 83972f1 in #104, born red. Add the
await expect(page.locator(".pipeline-view")).toBeVisible() that every other
test in this spec already has. The poll assertions are unchanged, so focus
retention across the resize is still genuinely verified in both directions.
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.

1 participant