Skip to content

feat(screen-plan): follow the final design page; audit treats headless-hidden scrollbars as visible - #110

Draft
devfive-relay-c70423[bot] wants to merge 149 commits into
mainfrom
devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames
Draft

devfive-relay-c70423[bot] wants to merge 149 commits into
mainfrom
devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames

Conversation

@devfive-relay-c70423

@devfive-relay-c70423 devfive-relay-c70423 Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Summary

  • Screen plan follows the final design page. State-variant frames (Desktop 1441, Mobile 361/362, extra form states) now fold into the route they belong to instead of becoming new screens. remap moves an existing route to a newer frame.
  • Runtime audit: headless-hidden scrollbars. Headless Chromium hides every scrollbar (--hide-scrollbars). Because of that, no-clipped-content reported plain overflow-x: auto tab strips and tables as clipped content. The runner now probes whether the browser hides scrollbars, and in that case only scrollbar-width: none counts as an invisible scroller. Covered by a new case in test/layout.test.mjs.
  • Feedback batch (items 2–66), from building chondrogen. One commit per item, merged from six branches:
Area Items What changed
Codegen 66, 64, 65, 44, 32 componentTsx works when the root is a component set, a single variant or an instance, and is named after the set. data-figma-node-id is only emitted with figmaNodeIds: true. Instances resolve to their component. Link hover/focus states sit on the element rendered as the link.
Search / bridge 8, 13, 50, 57, 35 Search lists by node type with an empty query, scans every page without switching, and reports when results were cut. A bad limit is an input error. Trash/hidden frames are flagged. Bridge referencePng accepts a single frame id and reports PNGs it can't render instead of dropping them.
Project plan 2, 7, 49, 51, 52, 54, 55 confirm no longer overwrites model files and drops columns that exist on disk (55). status without planId returns recovery actions. intake on an existing plan offers resume or an archived restart. Column type errors and model drift are reported. Recommendations follow recorded evidence.
Screen plan 14, 15, 53, 56, 58, 59 The proposal hides inactive conditional rows and groups collision rows. Site metadata is checked in the app the plan targets. auditPlan run from apps/front finds the plan at the monorepo root, and a rerun refreshes its own output. 14 and 15 were already fixed; regression tests added.
Runtime audit 60, 61, 62, 63, 46 The emitted runner includes every module it imports. A page without document.body or a failing probe makes that one check inconclusive instead of aborting the run. Checks anchored on node ids absent from the source are not-run with a reason. auditPlan returns the exact dev-server start command (the runner does not start it itself). 46 was already fixed.
Skills / docs 42, 48, 64, 65 User decisions go through the question tool. New figma-bridge-setup skill. No instruction to add an audit plugin to the app build config. Component-first workflow: export components with componentTsx, record .devup/component-map.json, then assemble pages; no hand-written TSX from Figma nodes.

Not done in this PR: the runner starting the dev server itself (60), a devup_figma_bridge ensure tool and stale-host/out-of-view next actions in status (48), section-level export (65), and the legacy strip-plugin file still emitted by auditPlan (64).

Verification

Check Result
cargo fmt --all --check pass
cargo clippy --workspace --all-targets -- -D warnings pass
cargo test --workspace pass (145 suites, 0 failed)*
harness/runtime-audit npm test pass

* r3_asset_job_timeout_keeps_first_asset_and_resumes_pending_read failed once on the first full run and passed alone (3/3) and on the next two full runs. It uses a paused clock and looks timing-sensitive under load.

Tested on chondrogen (14 routes, 5 widths: 1440/1100/858/390/360)

Earlier in this PR, before the feedback batch. Plans were regenerated with devup_screen_plan auditPlan and run with the updated runner.

Route Before the runner fix After
/ 58 pass / 5 fail 63 pass / 0 fail*
/company 63 / 0 63 / 0
/company/vision 63 / 0 63 / 0
/company/location 63 / 0 63 / 0
/technology 61 / 2 63 / 0
/technology/research 61 / 2 63 / 0
/technology/osteoarthritis 61 / 2 63 / 0
/technology/patents 61 / 2 63 / 0
/technology/achievements 61 / 2 63 / 0
/products 57 / 1 / 5 inconclusive 58 / 0 / 5 inconclusive
/products/oa-model 62 / 1 63 / 0
/news 63 / 0 63 / 0
/news/notice 63 / 0 63 / 0
/contact 63 / 0 63 / 0

* The 5 failures on / were a real finding: a decorative marquee in a 1.22:1 colour. It was fixed in the app (aria-hidden), not in the runner.

Remaining: /products has 5 no-low-contrast-text results that are inconclusive, where 2 text samples have backgrounds that can't be judged. /news/[id] is not audited because no static params or detail-frame text are available.

chondrogen app checks after the changes: bun run lint:fix, oxlint --deny-warnings, tsc --noEmit, bun run build, bun test (4 pass, 100% coverage) all exit 0.


Submitted via Devfive hub. Employee: ; device: 3099154426bffbeef8b62999b80bb038

leader added 30 commits October 22, 2026 17:15
…s-hidden scrollbars as visible

State-variant frames (Desktop 1441, Mobile 361/362, extra form states) fold into their route instead of becoming new screens, and remap moves a route to a newer frame. The runtime audit no longer reports overflow:auto tab strips and tables as clipped just because headless Chromium hides every scrollbar; only scrollbar-width:none still counts.
Existing envelope spill fixes cover the reported single-frame scenario. Assume synthetic 569-issue metadata reproduces its transport pressure without retaining private design data.
Reuse existing narrowed recovery and spill behavior. Assume top eight serialized JSON fields are the useful diagnostic budget; preserve total retained output bytes when checking the resource envelope.
Reuse one stem for identical image hashes across layer roles and preserve variant identity. Refresh codegen snapshots and fixture checksums for kebab-case asset paths; refresh platform float serialization in the diagnostics snapshot.
Keep existing manifest auto-add behavior, disclose it, select job fields after job attachment, and judge requested captures rather than all discovered assets. Assume nodes paths remain capture-scoped while other paths prefer the assembled reply. Exercise MCP calls and actual output file bytes in regression coverage.
…s (30)

Existing original-source defaults already choose WebP q85. Apply the display-width times two cap when omitted and auto-select lossless encoding for alpha graphics with at most 256 colors. Explicit codec and lossless choices remain authoritative.
Keep the existing shared manifest-to-TSX reconciliation, verified by its real-file dedup regression. Add required placeholder paths to reviewChecklist even when acquisition itself is complete.
Resolve node requests to captured fill evidence before determining write state, and avoid reporting a request's own internal fill as a duplicate. Existing partial/resume and request-count regressions remain covered.
Assume legacy plans without app fields remain valid; explicit route app bindings must match. Search all ancestors rather than four levels.
…es (19)

Assume existing section-based device renaming is authoritative; reproduce Main Desktop/Mobile alongside another section without a mobile URL.
leader added 30 commits October 24, 2026 02:14
…to devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames
…nto devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames
…devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames
…o devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames
…o devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames
…nto devfive/3099154426bffbeef8b62999b80bb038/screen-plan-final-frames

# Conflicts:
#	crates/devup-mcp/src/server/text/devup-project-plan.md
- quote non-identifier lookup keys (button set produced invalid TSX)
- treat an aborted OXC parse as a validation error (parserAborted)
- expose unbound TEXT nodes in a component set as string props with the Figma copy as default
- drop set-canvas placement from variant roots, keep a containing block for absolute descendants
- emit cond ? value : undefined instead of cond && value
…ext prop names

- account for diagnosed variant-child fallback nodes as ignored trace entries so componentTsx no longer fails the exactly-once check (ApplicationsCard, RnDLinkRow, TechStep)
- give non-ASCII declared TEXT properties unique identifiers instead of overwriting defaults
…ops, partial variant maps, boolean props and state selectors

- keep typography and Image src scalar across responsive variants
- add undefined branches for variant lookups missing union keys
- declare and destructure referenced boolean props with collision-free names
- map selected/hoevr states to valid selectors; keep src out of pseudo objects
…src off container variant merges

- one-sided responsive Image src becomes scalar src plus endpoint visibility
- source splitting only applies to Image; container merges never take a leaf variant's src
- guard test across all chondrogen fixtures: no scalar arrays, no src on non-Image elements
…nd keep boolean-controlled layers

- variant lookups use Definition.source, so icon/mask/src/state styles are no longer dropped (empty Caret/Logo/DropdownOption bodies)
- children with a visible property reference count as visible for asset classification (IconButton text layer)
- responsive expressions drop redundant trailing inheritance and collapse slot-0-only arrays to scalars
- guard test: every declared prop is referenced in the body
…ps href, and treat controls inside links as wired
…primitive as a dynamic target, not unmapped
…itory root holds from an app directory, and status never takes another app's page for a route
…nparsed files, not truncated component lists
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.

0 participants