-
Notifications
You must be signed in to change notification settings - Fork 0
Review 5632
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
a0c034b7c6fccdf6ff5adea3dd7ed949bd6ac7d0 — direct child of approved #5630 head d7681c97aa7c1c2567c7f36ac91860a9bb7a18dc, stacked on approved #5608 head 37d70566fd5203763877d8f93f8e8469255f9005.
LOOP VERSION: 1.9.1
AUDIT RUBRIC: 1.14.3 (the official page's Current line at gate 1; its history already contains a 1.14.4 row)
LANE: full WHY: this changes cross-cutting CI scope and trust boundaries, adds a shared classifier, changes workflow gates, and can silently suppress browser/a11y evidence.
There was no prior Review-5632 record and no human GitHub feedback at this head. The only PR comments were generated Vercel and PR Analysis reports.
The approved parent records establish that #5608 keeps one baseline-owned membership source and current deletion/failure verdicts, while #5630 keeps PR acceptance/promotion non-pruning, Probe current-only, and removal-bearing plans inside the 25/41 review budget. This top commit changes none of those approved evidence, acceptance, comparison, or promotion files.
Current main is 936256386b74d67f88a41adee235b91699977b2f, the stack base. No current-main commit touches the twelve top-commit files.
WHY 1: component-only pull requests need bounded visual, RTL, and accessibility checks, while shared rendering inputs cannot be reduced to one trustworthy component list. WHY 2: broad PR sweeps can produce hundreds of shots a reviewer cannot judge, but silently skipping a real dependency leaves a green-looking PR with no evidence. WHY 3: a maintainer needs every rendering/audit input to reach exactly one of two outcomes: a bounded exact PR check or an explicit protected-main deferral. USER-FACING PROBLEM: a maintainer reviewing a component or rendering-infrastructure change needs a truthful scope decision; otherwise the check can either overwhelm review or report no work for a change that affects output. PROBLEM SEVERITY: broken task — an unclassified input can make all three PR browser/a11y jobs skip with no deferral. NEW FEATURE CASE: not a product feature — this repairs existing CI coverage routing. EARLY STOP: clear — the PR body, approved parent contracts, exact-head workflow log, and production classifier probes establish the intended two-outcome model.
VERDICT: clear
A shared classifier reads changed paths and assigns component source to an exact component set. Shared or uncertain rendering inputs instead mark the visual and accessibility lanes for protected-main coverage. The workflow gates use that result, the report explains it, and lab readiness accepts both the old pathspec syntax and the new affected-root marker.
SOLUTION (3 decisions · 6 runtime/workflow files, +420/−146)
- Add one changed-path classifier for exact components and global/uncertain dependencies.
- Route CI and report generation through exact scope versus explicit protected-main deferral.
- Preserve lab-readiness compatibility by parsing both the legacy pathspec and a new root marker.
BURDEN: medium — one new module, three consumers, one workflow gate, one parser marker, two new output booleans, and 145 focused tests across nine files. BURDEN MATCH: proportionate in shape, but incomplete in coverage — the central classifier is the right-sized owner, yet known inputs still fall through to “no scope.”
VERDICT: BLOCKS — the new two-outcome model has a third silent outcome for real component, theme, browser, and dependency inputs
OWNER: .github/scripts/lib/affected-scope.js owns changed-path dependency classification.
TIER 1: git changed-file list, component package roots, Storybook config, theme/build infrastructure, setup/browser inputs, package manifests, and the lockfile.
TIER 2: none.
SEAMS: component root versus nested runtime files, shared infrastructure, stable theme packages, Storybook preview/config/static assets, browser setup/version, dependency resolution, mixed component+global changes, missing merge base, analysis/comment output, and legacy/current lab-readiness syntax.
BEHAVIOR UNIT: pure utility — the classifier is deterministic and directly probeable from a path list.
COMPLEXITY BUDGET: one classifier, one authoritative component-root source, every known input classified exact-or-deferred, one bounded O(changed paths) pass, and zero independent hand-maintained copies.
ACTUAL BURDEN: 12 files, +709/−173 total; 6 runtime/workflow files +420/−146; 6 test files +289/−27; one new classifier module; one new comment marker that independently repeats the component roots; no dependency or lockfile change.
BURDEN TREND: first reviewed head; relative to approved #5630, the top commit adds one classifier/consumer layer without changing the parent evidence or mutation authorities.
RESET TRIGGER: not triggered — this is the first model-level finding, and the contraction is local: complete the classifier and make readiness consume the same root source.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| affected dependency class | affected-scope.js |
analysis JSON and workflow outputs | none, but the source list is incomplete |
| component package roots |
COMPONENT_PACKAGES in affected-scope.js
|
exact component records |
ci.yml affected-root comment, parsed independently by lab readiness — can drift |
| stable theme eligibility | package manifests | trusted snapshots and stableThemes
|
none |
| protected-main coverage | scheduled/manual Release Gate | visual/a11y verdict and report | none |
| seam | driven result |
|---|---|
packages/core/src/Button/Button.tsx |
exact Core/Button scope; no deferral |
packages/core/src/Calendar/hooks/index.ts |
no component and no deferral, although Calendar, DateInput, and DateTimeInput import this runtime barrel |
packages/core/src/theme/tokens.ts |
shared-theme deferral |
packages/core/src/utils/parseStyleKey.ts |
no component and no deferral, although theme rule generation imports it and its own contract says it is shared by CSS generation and component class rendering |
apps/storybook/.storybook/preview.tsx |
Storybook-config deferral |
apps/storybook/public/demo.woff2 |
Storybook-static-asset deferral; the current rendering roots contain no checked-in static/font asset, so this path class is synthetic/future-facing |
.github/actions/setup/action.yml |
browser-version deferral |
.nvmrc |
no component and no deferral, although the setup action names it as the single Node-version source |
pnpm-lock.yaml / root or package manifest |
uncertain dependency deferral |
pnpm-workspace.yaml |
no component and no deferral, although it owns the Vite catalog, overrides, linker, and allowed install scripts |
| component + lockfile | component is discovered internally, but workflow outputs suppress the exact component jobs and defer the whole bundle |
| no merge base | explicit visual/a11y deferral; no broad PR run |
| legacy pathspec / current marker | both parse to Core + Lab; the marker is not behaviorally tied to COMPONENT_PACKAGES and can false-pass after classifier drift |
The catch-all metadata exclusion at affected-scope.js lines 17–36 drops nested runtime barrels as well as component-root metadata. The global/uncertain list at lines 39–87 omits actual setup and theme inputs. The workflow then turns any fallthrough into false/no-defer outputs at visual-scope.mjs lines 154–173.
VERDICT: BLOCKS — known inputs can bypass both exact PR scope and explicit deferral, and component roots have two writable representations
A pull request changing a nested component barrel, the Node source of truth, the workspace dependency catalog, or the shared theme selector parser receives has_components=false, has_stable_visual=false, a11y_deferred=false, and stable_visual_deferred=false. Its visual, RTL, and a11y jobs therefore skip as if nothing relevant changed. A mixed component+global change also loses its exact component run instead of preserving the bounded part.
NEW FEATURE IMPACT: not a product feature.
VERDICT: BLOCKS — maintainers can receive a clean-looking no-scope result for a real rendering or audit dependency
No published package API changes. Internal CI surfaces add analysis.affectedScope, stable_visual_deferred, a11y_deferred, and the affected-root marker.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
+ |
affectedScope analysis object |
internal artifact | existing PR analysis | source/tests | finding — incomplete input coverage |
+ |
deferred scope outputs/reasons | internal workflow contract | existing component/visual outputs | source/tests | finding — false/no-defer outcome remains |
+ |
affected-component-roots marker |
internal parser contract | legacy pathspec fallback | source/tests | finding — independent writable root copy |
OSSIFICATION: no consumer package surface. The internal contract is repairable before landing; its exact-or-deferred invariant should be pinned now rather than learned from a skipped future PR.
VERDICT: BLOCKS — the new internal scope contract does not represent every dependency it claims to own
No token, target, selector, CSS, or rendered theme changes. The review did trace theme dependencies: core theme files, reset/tailwind CSS, themeProps, theming-target discovery, build files, and stable theme packages defer correctly; parseStyleKey.ts, which feeds generateThemeRules, currently falls through.
VERDICT: BLOCKS — one real shared theme-generation input is outside the new dependency model
BEHAVIOR: yes inside CI — exact component jobs now skip on broad/uncertain input and broad work defers to the protected scheduled lane. API: no public package API change. VISUAL: no product pixels change in this top commit. THEME: no theme contract changes; only scope classification changes.
VERDICT: BLOCKS — intended routing works for listed paths, but omitted paths silently retain the old false-negative behavior
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none. LAYOUT: none. BUNDLE: no dependency or lockfile delta. Classification is one bounded pass over changed paths plus set deduplication/sort; no recursion, browser, network request, or unbounded capture is added.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the twelve top-commit files are CI scripts/tests, one workflow, and lab-readiness tooling. No component implementation, story, style, theme, asset, or rendered app file changes. Storybook was not started.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product role, accessible state, focus path, string, locale, or direction behavior changes. The finding is about whether a11y/RTL checks run: exact component source is scoped correctly in the positive case, but the omitted component/global inputs above can skip both PR coverage and explicit deferral.
VERDICT: BLOCKS — the changed gate can silently omit required a11y/RTL evidence
| slot | verdict |
|---|---|
| PROBLEM | clear |
| SOLUTION | BLOCKS — silent third outcome remains |
| ARCHITECTURE | BLOCKS — incomplete dependency model and duplicated roots |
| IMPACT | BLOCKS — real inputs can look irrelevant |
| API | BLOCKS — internal scope contract is incomplete |
| THEMING | BLOCKS — shared parser omitted |
| BREAKING | BLOCKS — false-negative routing remains |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | BLOCKS — required evidence can skip |
GOAL: partly met — six requested positive classes route as designed, but four actual repository inputs and nested runtime barrels produce neither exact scope nor deferral; mixed changes suppress the exact component lane.
DISPOSITION: incomplete dependency classification and duplicated root ownership block now. Acceptance criteria: (1) every input in the declared component/theme/Storybook/asset/browser/dependency classes resolves to exact scope or explicit deferral; (2) nested runtime barrels, .nvmrc, pnpm-workspace.yaml, and parseStyleKey.ts are pinned; (3) mixed component+global behavior preserves the exact bounded component lane or explicitly proves why whole-PR deferral is required; (4) current lab readiness derives roots from the executable classifier while legacy pathspec parsing remains covered; (5) a non-exempt path inside the declared dependency roots cannot silently mean “no scope.”
ADVICE: bounded outcome criteria — keep the new classifier as the owner; do not add another independent path registry.
AUTHOR CAN PROCEED: yes — the defect and acceptance criteria are concrete; implementation choice remains with the author.
WORST OUTCOME: “maintainers can receive a clean-looking no-scope result for a real rendering or audit dependency” → request changes.
JUDGEMENT NEEDED: none — correctness defect in the existing CI contract.
request changes
- Known rendering/audit inputs fall through the classifier, and the readiness root marker can drift from executable scope.
→ a maintainer can merge a change after visual, RTL, and a11y jobs all skip without an explicit protected-main deferral ·
.github/scripts/lib/affected-scope.js:17-87
Semantic verdict: request changes
Thanks — centralizing scope is the right shape, but this head can still return “no scope” for real inputs. ROOT_METADATA drops every nested index.ts, including the Calendar hook barrel used by Calendar and both date inputs. The dependency list also misses .nvmrc, pnpm-workspace.yaml, and the shared theme parseStyleKey.ts; each produces no component and no deferral. Mixed component+global changes suppress the exact component lane too. Lab readiness then trusts a comment marker that can drift from the executable map.
Please keep the executable classifier as the one root source, and ensure every input in these declared dependency classes resolves to exact scope or explicit protected-main deferral, with the negative and mixed cases pinned.
[Reviewed by Robohands]
None.
- Exact-head focused Vitest passed 9 files / 145 tests; changed-script syntax, actionlint for the three interacting workflows, and
check:repopassed. - Exact-head CI run 33164175791 passed every executed code job. Its scope log correctly classified the parent-stack workflow/script paths as
browser-version-input;pr-a11y,pr-rtl, and Stable visual regression skipped by design. - Security review found a fork head with changed workflows/scripts, but no package, lockfile, workspace, Node-version, lifecycle-script, permission, env/credential read, or network-call delta in the top commit; parent execution surfaces were already approved at their exact heads.
TIME total 10m setup 3m exact heads, fresh code/wiki checkouts, current authorities, trust screening, dependency seed reading 3m parent records, semantic delta, dependency consumers, workflow logs measuring 2m 145 focused tests, syntax, actionlint, repository checks, classifier/parser probes writing 2m presentation, two critic passes, exact-head GitHub/wiki delivery waste 1m first broad patch render was truncated and replaced with semantic-diff and direct-file reads
- The changed trusted
workflow_runcomment path cannot execute from PR-head code; the current generated comment therefore does not exercise this head's deferral wording. - The protected scheduled Release Gate was not dispatched. No Storybook/browser run was required for this non-rendering CI change.
Posted as drafted in the exact-head GitHub COMMENT review; GitHub recorded COMMENTED at a0c034b7c6fccdf6ff5adea3dd7ed949bd6ac7d0.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
d8d553774f79b80672035c0fbd8c2cf8a082d732 — direct child of approved #5630 head d7681c97aa7c1c2567c7f36ac91860a9bb7a18dc, stacked on approved #5608.
LOOP VERSION: 1.9.1 AUDIT RUBRIC: 1.14.4
LANE: full WHY: this re-review changes cross-cutting visual/a11y scope, trusted workflow routing, and the source of lab-readiness evidence after a prior architecture request-changes round.
Our Round 1 review at a0c034b7c6fccdf6ff5adea3dd7ed949bd6ac7d0 asked for nested runtime barrels, .nvmrc, pnpm-workspace.yaml, and parseStyleKey.ts to resolve exact-or-deferred; mixed exact+broad input to retain both lanes; unknown/non-exempt inputs not to become no-scope; one executable component-root source; and legacy/current readiness syntax coverage. The replacement head shares parent d7681c97 with the reviewed head; the semantic delta is 10 files, +169/−43.
The exact PR head remained d8d553774f79b80672035c0fbd8c2cf8a082d732, clean and mergeable, throughout the run. The approved parent contracts from #5608 and #5630 were re-read; this delta does not change their baseline ownership, removal authority, Probe policy, or promotion mutation paths.
WHY 1: component-only pull requests need bounded visual, RTL, and accessibility checks, while shared or unknown rendering inputs need explicit protected-main deferral.
WHY 2: a third outcome — neither exact work nor deferral — makes a green-looking skip indistinguishable from irrelevant files; a split exact+broad result can also route into a workflow path that refuses its own scope.
WHY 3: the maintainer needs one truthful, executable routing decision for every non-exempt changed path before trusting the review evidence.
USER-FACING PROBLEM: a maintainer changing a nested barrel, shared parser/hook, or the shared RTL audit harness can still receive missing evidence or a trusted-plan failure even though the classifier reports a relevant change.
PROBLEM SEVERITY: broken task — the named parseStyleKey.ts case deterministically enters exact capture and is then refused as broad-only, while other non-exempt paths still emit no visual or a11y scope.
NEW FEATURE CASE: not a product feature — this repairs existing CI coverage routing.
EARLY STOP: clear — the prior acceptance criteria, current source, GitHub-output probes, workflow predicates, and production CLI failure establish the intended and actual behavior.
VERDICT: BLOCKS — the exact-or-deferred contract still has rejecting and silent third outcomes
The delta correctly adds the four named inputs to classification, keeps exact component data when a known global input also defers, and exports a component-root command for readiness. It then introduces a second exact-visual predicate over Core files, while the helper retains its own component/root predicates and readiness detects an invocation string before loading the helper through a fallback. These independent interpretations disagree on the named parser, nested barrels, unknown shared inputs, and malformed current syntax.
SOLUTION (3 decisions · 4 runtime/workflow files, +68/−24; 10 files, +169/−43 including tests)
- Expand known global/uncertain inputs and nested-barrel component discovery — fixes the named positive cases in the helper.
- Separate exact visual presence from broad deferral so mixed inputs can set both — fixes the output booleans but not every downstream route.
- Replace the readiness comment marker with a helper command — points at the right owner, but the command is unused by CI classification and the parser fallback can accept a missing/mistyped helper.
BURDEN: medium — one classifier, a second visual runtime predicate, two routing booleans, workflow predicates, a root CLI, a readiness loader/fallback, and six focused test surfaces. BURDEN MATCH: disproportionate at the contract boundary — the repair adds another representation of exact scope and roots instead of making one classifier result authoritative.
VERDICT: BLOCKS — multiple predicates still own the same scope facts
OWNER: .github/scripts/lib/affected-scope.js should own component identity, component roots, global/uncertain classification, and exact-or-deferred outcomes; workflows and readiness should consume that result.
TIER 1: changed-file list, Core/Lab component roots, Storybook inputs, theme/build infrastructure, browser/setup inputs, package/dependency inputs, and protected-main coverage.
TIER 2: none.
SEAMS: nested barrels, component metadata exemptions, shared Core hooks/utilities, known/unknown audit inputs, named global inputs, exact+broad mixtures, trusted-plan routing, current helper syntax, malformed helper syntax, and legacy pathspec syntax.
BEHAVIOR UNIT: one pure classifier plus one executable serialization of its result; callers should not re-derive component/root/scope semantics.
COMPLEXITY BUDGET: one classifier, one component-root source, one exact-or-deferred result per non-exempt path, one mixed union, zero shadow predicates or fallback data sources.
ACTUAL BURDEN: COMPONENT_ROOTS, componentSource()'s separate core|lab regex, visual-scope.mjs's separate isRuntimeCoreFile() and component extraction, an unused workflow COMPONENT_ROOTS variable, and a readiness parser that recognizes the command text then can load another checkout through a catch-all fallback; 10-file delta, +169/−43.
BURDEN TREND: first reviewed head had one incomplete classifier plus a copied marker; current head adds the missing named entries but also adds another root representation and exact-visual routing predicate. The number of owners for component/root/scope facts grew rather than contracted.
RESET TRIGGER: triggered — the prior one-source finding was repaired by adding another representation/guard for the same facts, and the named parseStyleKey.ts path now fails between those representations. Redraw around one classifier result before adding cases.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| component roots | intended COMPONENT_ROOTS
|
helper CLI output |
componentSource() regex; isRuntimeCoreFile() root regex; readiness legacy parser |
| exact component identity | componentSource() |
affected.components |
visual-scope.mjs independently derives stableComponents from stableCoreFiles
|
| global/uncertain deferral | inputKind() |
reason lists and workflow outputs |
visual-scope.mjs independently broadens all Core runtime files |
| mixed exact+broad routing | classifier result | CI outputs / trusted scope | workflow chooses exact capture or broad defer as mutually exclusive paths |
| readiness roots | helper should be sole current source | current CLI output; legacy pathspec parse | catch-all fallback can source roots outside the inspected fixture/repoRoot |
| seam | driven result |
|---|---|
.nvmrc |
fixed: visual+a11y explicit browser-version-input deferral |
pnpm-workspace.yaml |
fixed: visual+a11y explicit lockfile-ambiguity deferral |
nested Calendar/hooks/index.ts
|
a11y exact Calendar; visual outputs has_stable_visual=false and stable_visual_deferred=false
|
parseStyleKey.ts |
reports exact=true + broad=true, no exact component/story; exact workflow calls trusted-plan, which exits 1: broad stable scope must be deferred instead of captured
|
component + .nvmrc
|
exact and broad booleans both true; exact a11y components retained, but visual broad-defer step is suppressed when exact is true and report generation does not carry its deferred reasons |
unknown apps/storybook/rtl-audit/rtl-audit.mjs
|
all exact/deferred visual+a11y outputs false — the real RTL harness is silent no-scope |
shared packages/core/src/hooks/useLayer.tsx
|
exact visual=true + broad visual=true with no component; no a11y component or deferral; trusted-plan rejection shape |
| helper-root mutation | advertising Core only still classifies Lab/Drawer exact — the list does not own classification |
| valid current helper CLI | prints Core + Lab roots |
malformed component-roots-broken CLI |
exits 0 with no output; readiness parser still returns Core + Lab when the fixture helper is absent because the regex/fallback false-passes |
| legacy pathspec | still parses Core + Lab in the focused regression test |
| exempt test/doc files | remain intentionally no-scope |
The representative split is visual-scope.mjs lines 154–171: exact visual scope is re-derived independently from affected components/deferral, then trusted workflow routing treats exact and broad as exclusive actions. The rejecting guard is visual-acceptance.mjs lines 767–775, and the root split begins at affected-scope.js lines 12–38.
VERDICT: BLOCKS — component identity, roots, and routing still have multiple owners and disagree on real inputs
A maintainer changing parseStyleKey.ts reaches a trusted publisher failure rather than protected-main deferral. A nested barrel still receives no visual scope, the real RTL audit harness can receive no scope anywhere, and a shared hook can lack a11y/RTL deferral. Mixed known input retains its exact checks, but the visual evidence path does not publish the broad half of the routing decision.
NEW FEATURE IMPACT: not a product feature.
VERDICT: BLOCKS — required review evidence can still be absent, incomplete, or deterministically red
No published package API change. Internal CI surfaces add exactStableVisual, componentRoots(), the component-roots CLI mode, new scope booleans, and parser syntax.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
+ |
componentRoots(): string[] + CLI output |
internal CI/parser contract | existing component package map | tests/source | BLOCKS — does not own classifier roots |
+ |
exactStableVisual: boolean |
internal trusted workflow contract | existing stable component/story scope | tests/source | BLOCKS — separate predicate conflicts with deferral |
~ |
mixed exact+broad booleans | internal workflow output | existing exact/deferred lanes | tests/source | note — flags are preserved, but visual downstream union is incomplete |
~ |
readiness current syntax + legacy fallback | internal audit parser | existing legacy pathspec | test/source | BLOCKS — malformed/missing helper can false-pass |
OSSIFICATION: no consumer package surface. These internal fields gate required evidence, so locking in mutually inconsistent meanings creates silent skips and trusted-job failures.
VERDICT: BLOCKS — the internal scope contract is not single-source or total
No CSS, theme target, token, variable, or rendered theme output changes. parseStyleKey.ts is correctly identified as shared theme infrastructure by the helper, but the visual caller also marks it exact and sends it to a trusted-plan path that rejects it.
VERDICT: BLOCKS — the specifically requested shared theme parser still cannot complete its routing path
BEHAVIOR: yes inside CI — the four named classifications and mixed flags change, but some now route to failure or remain silent. API: no published package API. VISUAL: no product pixels change in this delta. THEME: no theme contract change; only theme-change evidence routing changes.
VERDICT: BLOCKS — intended scope correction remains incomplete end to end
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none. LAYOUT: none. BUNDLE: no dependency or lockfile delta. Classification remains O(changed paths) plus set/sort work; the defect is ownership/routing rather than cost.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the delta changes CI scripts/tests, workflows, and lab-readiness parsing only. No component implementation, story, style, asset, theme package, or rendered app path changes. No Storybook server or browser was started.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product role, accessible state, focus path, string, locale, or direction behavior changes. The affected gate is itself an a11y/RTL evidence boundary: nested barrels now reach exact a11y, but unknown shared inputs can still produce neither component scope nor protected-main a11y deferral.
VERDICT: BLOCKS — required a11y/RTL evidence can still silently disappear
| slot | verdict |
|---|---|
| PROBLEM | BLOCKS — exact/deferred routing still has silent and rejecting outcomes |
| SOLUTION | BLOCKS — added predicates do not share one owner |
| ARCHITECTURE | BLOCKS — root/component/scope facts have multiple writable representations |
| IMPACT | BLOCKS — required evidence can be absent or red |
| API | BLOCKS — internal contract meanings disagree |
| THEMING | BLOCKS — named parser path still fails |
| BREAKING | BLOCKS — CI behavior remains incomplete |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | BLOCKS — unknown shared inputs still skip deferral |
GOAL: partly met — .nvmrc, pnpm-workspace.yaml, helper-level nested barrels, parseStyleKey.ts classification, and mixed booleans move as requested; the production parseStyleKey.ts route still fails, nested visual scope and unknown/global totality remain incomplete, and roots still have shadow parsers.
DISPOSITION: the prior one-source/exact-or-deferred finding still blocks now. Acceptance criteria: one executable classifier/root source drives exact components and broad deferral; every non-exempt path gets at least one truthful outcome; mixed input preserves and publishes both outcomes; parseStyleKey.ts completes by deferral rather than exact-plan refusal; valid current and legacy syntax pass while missing/malformed current syntax fails closed.
ADVICE: bounded contraction criteria — remove shadow derivation and consume one classifier result; no implementation is prescribed.
AUTHOR CAN PROCEED: yes — the failing paths, invariants, and positive/negative/mixed regression matrix are deterministic.
WORST OUTCOME: “A maintainer can receive no required evidence or a trusted-plan failure for a real rendering/audit dependency.” → request changes.
JUDGEMENT NEEDED: none — correctness defect in an existing CI contract.
request changes
- Scope and root facts still have multiple owners, producing silent or rejecting third outcomes.
→ a maintainer changing a nested barrel, shared parser/hook, or the real RTL audit harness can lose visual/a11y evidence or receive a deterministic trusted-plan failure ·
visual-scope.mjs:154→ confirmed independently by production CLI output/failure plus root/parser mutations that leave the test suite green while breaking the claimed contract.
Semantic verdict: request changes
Thanks — the four named inputs now classify, and mixed changes preserve the exact booleans, but the exact/deferred contract is still split.
At this head, parseStyleKey.ts becomes both exact and broad while yielding no exact component/story; the exact workflow path then calls trusted-plan, which refuses it as broad-only. A nested barrel still has no visual outcome, and the real RTL audit harness has no outcome anywhere. The root command is also not the owner: changing its roots leaves component classification unchanged, while readiness accepts a missing or mistyped helper through its fallback.
Please contract this to one executable classifier consumed by workflow and readiness, with every non-exempt path producing exact scope or explicit deferral. Pin the positive, negative, ambiguous, mixed, and legacy/current syntax cases.
[Reviewed by Robohands]
None — the defect is one cross-file ownership/routing model.
-
.nvmrcandpnpm-workspace.yamlnow produce broad visual+a11y deferral with the intended reasons; component +.nvmrcretains exact component and broad flags. - Exact-head GitHub reports 17 successful and 5 path-skipped checks, 0 pending/failed; the check-components log classifies this stack’s known workflow/scripts as
browser-version-inputand defers them. - Security screening found no top-delta dependency, lockfile, lifecycle-script, permission, credential, or network-call addition; parent execution surfaces were already approved at exact heads.
TIME total 12m setup 4m exact heads, trust screening, fresh isolated code/wiki worktrees, dependency clone reading 3m current kit/rubric, all Review-5608/5630/5632 rounds, source and workflow consumers measuring 3m focused tests/checks, old/new matrix, production CLI failure, root/parser mutations, exact CI writing 2m presentation, template gate, two critic passes, GitHub/wiki delivery waste 1m first verification command inherited the parent directory and was rerun from the exact-head worktree
- The changed trusted
workflow_runpublisher cannot execute PR-head workflow code; exact-head Actions therefore prove repository code checks, not this modified default-branch publisher path. - The protected scheduled Release Gate was not dispatched, as requested. No Storybook/browser run was needed for this non-rendering CI change.
Posted as drafted in the exact-head GitHub COMMENT review; GitHub recorded COMMENTED at d8d553774f79b80672035c0fbd8c2cf8a082d732.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
fbf0e9b1dddfee059fca6a3d5e305901cf0b74f9 — direct child of approved #5630 head d7681c97aa7c1c2567c7f36ac91860a9bb7a18dc, stacked on approved #5608.
LOOP VERSION: 1.9.1 AUDIT RUBRIC: 1.14.4
LANE: full WHY: this re-review must settle a standing architecture block across changed-path classification, trusted visual routing, exact a11y/RTL filters, and lab-readiness contract parsing.
Our Round 2 review at d8d553774f79b80672035c0fbd8c2cf8a082d732 asked for one executable classifier/root source consumed by workflows and readiness, every non-exempt path to produce exact scope or explicit deferral, mixed scope to preserve both outcomes, parseStyleKey.ts to defer rather than enter rejected planning, and current syntax to fail closed while legacy syntax remains compatible.
This replacement commit has the same approved parent. Ignoring formatting-only rewrites, the prior-head delta changes three files by +38/−8: the helper becomes directly executable, visual scope consumes its component parser, and CI invokes the helper before the visual wrapper. Current main remains 936256386b74d67f88a41adee235b91699977b2f, the stack base; no current-main commit invalidates these paths.
WHY 1: one component path must produce the same exact a11y and RTL filter everywhere it is used. WHY 2: if a workflow rebuilds that filter independently, changing the shared classifier can leave the gate green while the browser job receives no component. WHY 3: the maintainer then cannot trust a green routing contract to mean the named component was actually audited. USER-FACING PROBLEM: a maintainer extending or correcting component scope can update the advertised owner while a11y/RTL keep using a shadow parser; the tests still report green and the required exact check can silently disappear or broaden. PROBLEM SEVERITY: broken task — the PR exists to eliminate scope drift, but an executable mutation proves that drift remains undetected at the workflow boundary. NEW FEATURE CASE: not a product feature — this repairs existing CI evidence routing. EARLY STOP: clear — prior acceptance criteria, exact-head source, workflow output tracing, direct syntax probes, and a mutation run establish both the intended and actual contracts.
VERDICT: BLOCKS — exact component identity still has multiple executable owners
The changed-path helper now correctly owns the named path classifications and the stable visual wrapper consumes its component parser. It also emits exact component names as workflow outputs. The a11y and RTL steps do not consume those outputs: they rebuild their filters from the older analysis component lists, while readiness recognizes command text and can load a helper outside the inspected repository after failure.
SOLUTION (3 decisions · one new module plus four runtime/workflow consumers)
- Make the shared helper executable and serialize exact/deferred scope — correct and useful.
- Route stable visual component identity through the helper — fixes the prior rejected exact-plan path.
- Keep a11y/RTL selection on the older analysis parser and readiness on a catch-all loader fallback — leaves the one-source contract incomplete.
BURDEN: medium — 14 top-commit files, +916/−195 against the approved parent; one classifier module, two workflow classifier invocations, two component-list representations, one readiness command marker/fallback, and 158 focused tests. BURDEN MATCH: disproportionate at the remaining seam — the new executable output is written but discarded before the two browser jobs that need it.
VERDICT: BLOCKS — the repair adds an output without removing the consumers’ shadow parser
OWNER: .github/scripts/lib/affected-scope.js should own component identity, component roots, and exact/deferred changed-path scope; visual, a11y, RTL, reporting, and readiness should consume source-identified projections.
TIER 1: git changed paths, Core/Lab roots, Storybook/theme/browser/dependency inputs, trusted visual publisher, a11y/RTL browser jobs, and lab-readiness derivation.
TIER 2: none.
SEAMS: nested barrels, shared theme parsers, Node/workspace globals, mixed exact+broad unions, exact a11y/RTL filters, current helper syntax, malformed/missing helper syntax, and legacy pathspec compatibility.
BEHAVIOR UNIT: one pure classifier plus one executable serialization; workflows should pass its component list rather than reconstruct it.
COMPLEXITY BUDGET: one classifier/root source, one exact component set, one exact-or-deferred decision per path, one mixed union, and zero shadow parsers or fallback sources.
ACTUAL BURDEN: one helper module; visual scope consumes it; analysis both imports it and separately rebuilds component identity; CI writes affected_components/affected_core_components but exports neither and both browser jobs read newComponents + modifiedComponents; readiness conditionally requires the helper but catches failure by loading from the process working directory.
BURDEN TREND: Round 1 had one incomplete classifier plus a copied root marker; Round 2 added the named cases but also shadow visual/root predicates; Round 3 contracts visual component identity into the helper, but exact a11y/RTL identity and readiness failure behavior remain independently writable. Owner count shrinks by one and remains above the stated budget.
RESET TRIGGER: remains triggered — the prior architecture reset required one executable owner, while this round leaves the same disputed component fact in the helper and the analysis parser and adds an unused workflow serialization.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| changed-path dependency class | affected-scope.js |
visual scope and analysis metadata | none for the named inputs |
| exact component identity | intended helper components
|
affected_components / affected_core_components
|
analyze-pr.js independently derives newComponents / modifiedComponents, and a11y/RTL consume those instead |
| current component roots | helper COMPONENT_ROOTS
|
component-roots CLI output |
readiness first parses CI command text, then can load a helper from another working directory |
| exact/broad visual routing | helper plus stable story/theme metadata | trusted scope JSON | no rejected exact plan for the named broad-only cases |
| seam | driven result |
|---|---|
nested Calendar/hooks/index.ts
|
fixed: exact Core/Calendar component and exact visual scope |
parseStyleKey.ts |
fixed: exact visual false, broad visual/a11y true; protected-main deferral precedes exact planning |
.nvmrc / pnpm-workspace.yaml
|
fixed: explicit broad visual/a11y deferral |
Core/Button + .nvmrc
|
exact Button plus broad visual/a11y flags are both retained |
| Lab/Drawer | helper reports exact @astryxdesign/lab:Drawer
|
| workflow use of exact components | helper writes the names, but the check-components job does not expose them; a11y and RTL read the independent analysis arrays |
| shadow-parser mutation | changing only analysis’s Lab directory makes its exact list empty while the helper still reports Lab/Drawer; all 80 focused contract tests pass |
| current helper syntax | real repository returns Core + Lab roots |
| legacy pathspec syntax | explicit compatibility parser returns Core + Lab roots |
| missing current helper | readiness still returns Core + Lab by loading the process-working-directory helper |
mistyped component-roots-broken syntax |
readiness still returns Core + Lab for the same reason |
| exact-head Actions | parent-stack workflow/script paths defer broadly; a11y, RTL, and visual are skipped, so the run does not exercise an exact component filter |
The representative workflow boundary is ci.yml lines 478–484: a11y builds its component filter from analysis.json; the RTL step repeats the same expression at lines 722–740. The helper’s emitted component outputs are only defined and tested, not consumed. Readiness’s cross-checkout fallback is at automated.mjs lines 100–112.
VERDICT: BLOCKS — component identity and current-syntax failure still have multiple executable sources
A maintainer changing the shared classifier’s roots or component policy can get a green helper contract while the exact a11y and RTL jobs receive a different filter. The executable Lab mutation demonstrates the full failure: the advertised owner still reports Drawer, the browser-job source becomes empty, and every focused contract test remains green. A missing or mistyped current helper can also be certified by unrelated local code rather than failing the inspected repository. NEW FEATURE IMPACT: not a product feature.
VERDICT: BLOCKS — required evidence can silently use a different component set from the advertised scope owner
No published package API changes. Internal workflow surface adds executable JSON/GitHub outputs for affected components and deferred reasons.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
+ |
affected_components / affected_core_components
|
internal workflow output | existing component filter | source/tests | BLOCKS — written but not consumed by a11y/RTL |
~ |
stable visual exact scope from helper component identity | internal trusted scope | existing visual scope | source/tests | clear |
~ |
readiness current helper syntax + legacy pathspec | internal audit parser | existing compatibility contract | source/tests | BLOCKS — missing/malformed current syntax false-passes |
OSSIFICATION: no consumer package surface. These internal values gate whether required evidence runs, so independent parsers create the exact silent-drift class the PR is intended to remove.
VERDICT: BLOCKS — the internal exact-component contract is serialized but not authoritative
No CSS, token, target, variable, selector, or rendered theme output changes. The named shared parser now correctly broad-defers before exact planning.
VERDICT: clear
BEHAVIOR: yes inside CI — nested barrels and named global inputs now route correctly, but the exact a11y/RTL component filter still comes from the prior parser. API: no published package API. VISUAL: no product pixel change. THEME: no theme contract change; only evidence routing changes.
VERDICT: BLOCKS — the intended one-source routing behavior is incomplete at two browser-job consumers
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none. LAYOUT: none. BUNDLE: no dependency or lockfile delta. Classification remains one bounded pass over changed paths; the defect is ownership and workflow consumption, not cost.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the top commit changes CI scripts/tests, workflows, and lab-readiness tooling only. No component implementation, story, style, asset, theme package, or rendered app path changes. No Storybook server or browser was started.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product role, accessible state, focus path, string, locale, or direction behavior changes. The affected boundary decides whether exact a11y/RTL evidence runs: both jobs still derive their component list from analysis.json rather than the helper output, and the mutation test proves the two can diverge without a failing contract test.
VERDICT: BLOCKS — exact a11y/RTL selection does not consume the shared component source
| slot | verdict |
|---|---|
| PROBLEM | BLOCKS — one-source evidence routing remains unproved |
| SOLUTION | BLOCKS — executable output is discarded before a11y/RTL |
| ARCHITECTURE | BLOCKS — exact component identity still has shadow parsers |
| IMPACT | BLOCKS — browser jobs can receive a different component set |
| API | BLOCKS — internal output is not authoritative |
| THEMING | clear |
| BREAKING | BLOCKS — intended routing is incomplete |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | BLOCKS — exact filters remain independently derived |
GOAL: partly met — nested barrels, parseStyleKey.ts, .nvmrc, pnpm-workspace.yaml, and mixed exact+broad classification now produce the required values; the exact component outputs are not consumed by a11y/RTL, and missing/malformed current readiness syntax still false-passes.
DISPOSITION: the prior one-source architecture finding still blocks now. Acceptance criteria: (1) the executable classifier’s exact component set is the filter input for a11y and RTL, not merely another artifact field; (2) a drift mutation in any former parser fails a contract test; (3) current helper syntax loads only the inspected repository and missing/malformed current syntax fails closed; (4) legacy pathspec compatibility remains explicit; (5) the passing named path and mixed-union cases remain.
ADVICE: bounded contraction criteria — consume the existing executable output and remove or demote shadow derivation; no new owner is needed.
AUTHOR CAN PROCEED: yes — the ownership defect, failed mutation guard, and exact acceptance criteria are deterministic.
WORST OUTCOME: “the shared classifier says a component is in scope while both browser-job filters receive no component and every contract test stays green” → request changes.
JUDGEMENT NEEDED: none — correctness and architecture defect inside an existing CI contract.
request changes
- Exact component identity is emitted by one module but consumed from another parser.
→ a maintainer changing scope can silently lose the exact a11y/RTL component filter while the advertised classifier and all contract tests stay green ·
ci.yml:478→ confirmed independently by source/output tracing and a Lab-parser mutation that produced divergent filters while 80 focused tests passed.
Semantic verdict: request changes
We asked for one executable scope owner; the named path cases now route correctly, but the contract still stops at classification.
At the browser-job filter boundary, a11y—and the matching RTL step—rebuild their component filter from analysis.json’s independent newComponents + modifiedComponents parser instead of consuming the component list emitted by affected-scope.js. Mutating only that shadow parser to drop Lab leaves the shared classifier reporting Lab/Drawer while both jobs receive no component; all 80 focused contract tests still pass. Lab readiness likewise accepts missing or mistyped current helper syntax by loading another checkout through its fallback.
Please make the executable classifier’s component set the a11y/RTL workflow input and make current-syntax readiness fail closed, while keeping legacy syntax as an explicit compatibility branch.
[Reviewed by Robohands]
None — one cross-file ownership defect carries the verdict.
- Exact-head focused Vitest passed 9 files / 158 tests; the drift mutation passed 5 files / 80 tests while producing the helper-versus-analysis mismatch.
- Actionlint passed the four interacting workflows; six changed runtime files passed
node --check;git diff --checkandcheck:repopassed. - Exact-head CI run 33171909063 is green for every executed job; exact a11y, RTL, and visual jobs are path-skipped because this stack’s workflow/script files broad-defer.
TIME total 12m setup 3m exact heads, fresh code/wiki checkouts, live rules/rubric, trust screening, dependency seed reading 3m every parent/current round, prior-head semantic delta, workflow and readiness consumers measuring 4m 158 tests, path/syntax matrix, shadow-parser mutation, actionlint, syntax, repository and CI checks writing 2m presentation, two critic passes, exact-head GitHub/wiki delivery waste 1m one broad source search produced irrelevant component-path references and was replaced with targeted consumer reads
- The changed trusted
workflow_runpublisher cannot execute PR-head workflow code; current Actions prove repository checks and broad deferral, not an exact component consumer path. - The protected scheduled Release Gate was not dispatched. No Storybook/browser run was needed for this non-rendering CI change.
Posted as drafted in the exact-head GitHub COMMENT review; GitHub recorded COMMENTED at fbf0e9b1dddfee059fca6a3d5e305901cf0b74f9.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
a5676f81cab6fe9ecaa1352ff0b73aa2e8338e82 — direct child of approved #5630 head d7681c97aa7c1c2567c7f36ac91860a9bb7a18dc, stacked on approved #5608.
LOOP VERSION: 1.9.1 AUDIT RUBRIC: 1.14.4
LANE: full WHY: this fourth exact-head round must settle a standing one-source architecture block across every PR visual/a11y/RTL consumer and fail-closed lab-readiness parsing.
Our Round 3 review at fbf0e9b1dddfee059fca6a3d5e305901cf0b74f9 asked for the executable classifier’s exact component set to feed a11y/RTL, every former parser’s drift mutation to fail, and current helper syntax to fail closed while legacy syntax stays explicit. The current five-file delta fixes the a11y/RTL filters and rejects missing, malformed-export, throwing, and cross-checkout fallback helpers, but it leaves another PR visual parser and accepts malformed invocation syntax.
The exact head remained a5676f81cab6fe9ecaa1352ff0b73aa2e8338e82, clean and mergeable, throughout the review. Its parent is the approved #5630 head; current main remains base 936256386b74d67f88a41adee235b91699977b2f, so no later-main change invalidates this delta.
WHY 1: every PR browser/audit consumer must receive the same exact component and global-deferral decision. WHY 2: a handwritten inventory can omit a real workflow while all listed-consumer tests stay green, and a prefix parser can certify a command CI would not execute. WHY 3: maintainers need scope/readiness evidence to fail on drift rather than silently widen, skip, or certify a broken gate. USER-FACING PROBLEM: a maintainer changing component or story scope can still receive visual evidence derived from the legacy component parser, while a malformed current readiness command is reported as covering Core and Lab. PROBLEM SEVERITY: broken task — one executable drift mutation survives the complete consumer-contract test and two malformed current commands false-pass. NEW FEATURE CASE: not a new feature — this repairs existing CI evidence routing. EARLY STOP: clear — the prior acceptance criteria, exact-head source, consumer inventory, direct path probes, and executable mutations establish the remaining failures.
VERDICT: BLOCKS — the one-source/fail-closed goal remains incomplete
The delta adds versioned scope metadata and a declared consumer list, routes the exact a11y and RTL filters through the shared analysis projection, and makes readiness import and execute the inspected helper. Those changes fix the Round 3 Lab drift and cross-checkout fallback. The consumer list and its readiness copy are still handwritten and omit the in-workflow Stable visual job, while readiness recognizes a command prefix and then executes a different canonical command.
SOLUTION (3 decisions · 3 runtime/workflow files, +63/−13; 5 files, +174/−13 including tests)
- Publish schema, roots, and a declared consumer inventory from the classifier.
- Read a11y/RTL component filters from
analysis.affectedScope.components. - Validate, import, and execute the inspected scope helper for readiness.
BURDEN: medium — one classifier, three serialized projections, three handwritten consumer inventories/checks, two workflow component-filter paths, and one readiness syntax/loader boundary. BURDEN MATCH: disproportionate at the remaining boundary — metadata names five consumers without enforcing the actual set, so the same one-source defect survives behind another list.
VERDICT: BLOCKS — the repair does not cover every consumer or the actual current command syntax
OWNER: .github/scripts/lib/affected-scope.js should own component identity, roots, and exact/deferred scope; every visual/a11y/RTL/readiness consumer should execute it or consume a source-identified projection.
TIER 1: changed paths, Core/Lab roots, exact component filters, stable-story scope, broad deferral, PR visual jobs, and lab-readiness derivation.
TIER 2: none.
SEAMS: nested barrels, shared theme parser, Node/workspace inputs, exact+broad mixtures, Lab a11y/RTL filters, stable-story-only visual scope, malformed current helper invocations, explicit legacy pathspec syntax, and the real RTL harness input.
BEHAVIOR UNIT: one pure classifier plus one executable serialization; consumer membership and invocation syntax need executable validation rather than parallel lists/prefixes.
COMPLEXITY BUDGET: one classifier/root source, one complete consumer inventory derived from actual workflow use, one exact-or-deferred result per non-exempt path, and zero shadow parsers or fallback commands.
ACTUAL BURDEN: 14 top-commit files, +1080/−198 against approved #5630; the final delta is 5 files, +174/−13. The helper CONSUMERS, readiness EXPECTED_SCOPE_CONSUMERS, and workflow test’s hand-selected jobs are three inventories; ci.pr-visual is in none. Readiness matches a command prefix but always executes canonical component-roots itself.
BURDEN TREND: Round 3 was 14 files, +916/−195; current grows by +174/−13. A11y/RTL and cross-checkout loading contract correctly, but consumer/invocation representations grow while the same one-source finding remains.
RESET TRIGGER: triggered — this is the fourth round of the same model-level finding, and the repair adds another consumer representation without covering the actual consumer set.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| exact component identity | affected-scope.js |
analysis.affectedScope, visual-scope result |
ci.pr-visual still reads newComponents + modifiedComponents
|
| scope-consumer membership | none | none | helper CONSUMERS, readiness expected list, workflow-test slices; all omit ci.pr-visual
|
| current readiness invocation |
ci.yml command |
helper module/CLI result | prefix regex accepts malformed command then runs a different canonical command |
| broad/global deferral | affected-scope.js |
visual/a11y reasons | the RTL harness path still has no exact or deferred outcome |
| seam | driven result |
|---|---|
nested Calendar/hooks/index.ts
|
exact Core/Calendar; no deferral |
parseStyleKey.ts |
no exact component; visual+a11y defer with shared-theme-token-infrastructure
|
.nvmrc |
visual+a11y defer with browser-version-input
|
pnpm-workspace.yaml |
visual+a11y defer with lockfile-ambiguity
|
Core/Button + .nvmrc
|
exact Button plus both broad-defer flags |
| Lab/Drawer | exact Lab component; a11y/RTL consume affectedScope; Lab-root mutation is rejected by 2 failing tests |
| a11y+RTL old-parser mutation | rejected by the workflow contract test |
| cross-checkout readiness fallback mutation | rejected by the missing/malformed/throwing helper test |
| missing / malformed exports / throwing helper | all return no roots at exact head |
| Stable visual legacy-parser mutation | all 13 workflow consumer-contract tests still pass |
| stable-story-only change |
visual-scope.mjs reports exact story scope, while ci.pr-visual sees no legacy component and enters the broad full-surface arm |
component-roots-broken / component-roots --unexpected
|
both return Core + Lab instead of failing closed |
apps/storybook/rtl-audit/rtl-audit.mjs |
no exact component and no protected-main deferral |
VERDICT: BLOCKS — actual consumers and current-syntax validity are not represented by one executable contract
The a11y and RTL component filters now follow the shared source and reject a Lab-parser drift. The remaining Stable visual job can still widen or diverge under a legacy parser while its inventory test stays green, and lab readiness can certify Core/Lab coverage for a command CI would not execute as intended. NEW FEATURE IMPACT: not a new feature.
VERDICT: BLOCKS — maintainers can receive green contract tests for a drifted visual consumer or malformed readiness wiring
No published package API change. Internal CI surfaces add schema/version metadata, a consumer list, component roots, and changed workflow/readiness parsing.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
+ |
scope schema/version, roots, consumer inventory | internal CI metadata | existing affected-scope contract | source/tests | BLOCKS — inventory is incomplete and duplicated |
~ |
a11y/RTL filters from affectedScope.components
|
internal workflow contract | existing exact component filter | source/tests | clear |
~ |
readiness helper validation/execution | internal audit contract | existing current + legacy syntax | source/tests | BLOCKS — malformed current invocation false-passes |
OSSIFICATION: no consumer package surface. These internal fields gate review evidence, so a partial inventory or permissive parser directly recreates the drift this PR is meant to remove.
VERDICT: BLOCKS — the internal contract is not complete or fail-closed
No CSS, token, target, variable, selector, or rendered theme output changes. parseStyleKey.ts still broad-defers correctly.
VERDICT: clear
BEHAVIOR: yes inside CI — a11y/RTL now use the canonical component projection and readiness removes the cross-checkout fallback; another visual parser and malformed syntax remain. API: no published package API. VISUAL: no product pixel change. THEME: no theme contract change; only evidence routing changes.
VERDICT: BLOCKS — intended one-source routing remains incomplete at a visual consumer and readiness parser
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none. LAYOUT: none. BUNDLE: no dependency or lockfile delta; classification remains bounded by changed paths.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the final delta changes CI scripts/tests, one workflow, and lab-readiness tooling only. No component implementation, story, style, asset, theme package, or rendered app path changes. Exact-head Stable visual regression, pr-a11y, and pr-rtl are path-skipped and are not claimed as evidence.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product role, accessible state, focus path, string, locale, or direction behavior changes. The affected boundary determines whether exact a11y/RTL evidence runs: both exact filters now consume the canonical analysis projection, and their legacy-parser mutant fails. The actual RTL harness input itself still produces no exact or deferred scope.
VERDICT: BLOCKS — the exact filters are fixed, but the shared RTL audit input remains outside the total path contract
| slot | verdict |
|---|---|
| PROBLEM | BLOCKS — one-source/fail-closed goal remains incomplete |
| SOLUTION | BLOCKS — declared inventory does not enforce the actual consumers |
| ARCHITECTURE | BLOCKS — one visual parser and malformed invocation remain independent |
| IMPACT | BLOCKS — green tests can certify drifted scope/readiness |
| API | BLOCKS — internal contract is incomplete |
| THEMING | clear |
| BREAKING | BLOCKS — intended CI behavior is incomplete |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | BLOCKS — RTL harness input still has no outcome |
GOAL: partly met — a11y/RTL consume affectedScope, Lab and cross-checkout fallback mutants fail, and missing/malformed-export/throwing helpers return no roots; the actual Stable visual consumer is omitted and its drift mutant survives, malformed current commands return roots, and the RTL harness path remains no-scope.
DISPOSITION: the standing one-source architecture finding still blocks now. Acceptance criteria: (1) every actual PR visual/a11y/RTL/readiness consumer is inventoried from executable use and consumes the shared result; (2) mutating any former parser makes a contract test fail; (3) current helper syntax is matched/executed exactly and rejects missing, malformed, throwing, mistyped, or extra-argument forms; (4) the RTL harness input resolves to explicit protected-main coverage; (5) the passing nested-barrel, shared-parser, Node/workspace, mixed, Lab, and legacy cases remain.
ADVICE: bounded contraction criteria — remove the remaining shadow parser and derive the inventory/syntax check from actual executable wiring; do not add another list.
AUTHOR CAN PROCEED: yes — the failing consumer, commands, path, and regression outcomes are deterministic.
WORST OUTCOME: “all consumer-contract tests stay green while a real Stable visual job no longer receives the canonical exact scope.” → request changes.
JUDGEMENT NEEDED: none — correctness and architecture defect inside an existing CI contract.
request changes
- The declared consumer inventory omits a real Stable visual scope parser.
→ a maintainer can receive broad or divergent visual evidence while the shared classifier and all consumer-contract tests stay green ·
ci.yml:633 - Readiness recognizes malformed current commands and the RTL harness path has no scope outcome.
→ a Lab promotion can be certified against wiring CI would not execute, while a change to the audit implementation receives no explicit coverage route ·
automated.mjs:143
Semantic verdict: request changes
We asked for every scope consumer to use one executable owner. The a11y/RTL filters and helper loading now do, but the consumer inventory still misses pr-visual.
Stable visual regression still builds its component plan from newComponents + modifiedComponents. Mutating only that parser to return no components left all 13 consumer-contract tests green; a stable-story-only change likewise has exact story scope in visual-scope.mjs but falls into this job’s broad full-surface arm.
Lab readiness also accepts component-roots-broken and component-roots --unexpected: its prefix match recognizes either, then executes the canonical command instead. Both returned Core + Lab in the fail-closed probe. The real RTL harness path still yields neither exact scope nor protected-main deferral.
Please include every PR visual consumer in the executable contract, make each drift mutant fail, and reject malformed current helper invocations.
[Reviewed by Robohands]
None — both defects cross inventory, workflow, and readiness boundaries.
- Exact-head path matrix: nested Calendar barrel exact;
parseStyleKey.ts,.nvmrc, and workspace config defer; mixed Button + Node keeps exact plus broad; Lab/Drawer reaches both exact a11y/RTL consumers. - Exact PR test plan: 9 files / 162 tests passed; an additional compare suite brings the focused total to 10 files / 182 tests. Twelve changed runtime/test scripts pass syntax; exact actionlint,
git diff --check, andcheck:repopass. - Exact-head Actions: 17 checks/statuses pass and 5 are path-skipped, with 0 pending/failed. Stable visual, pr-a11y, and pr-rtl did not exercise an exact component consumer on this head.
TIME total 12m setup 3m exact heads, claim, fresh code/wiki worktrees, current rules/rubric, trust screening reading 3m every parent/current review round, five-file delta, full consumer and workflow dataflow measuring 4m path/readiness matrix, four mutations, 182 tests, syntax, actionlint, repo checks, exact CI writing 2m presentation, literal template gate, two critic passes, GitHub/wiki delivery waste 1m four mutation probes were first launched with a reserved shell variable and repeated serially
- Modified PR workflow code cannot execute from the PR head; exact-head Actions prove repository checks and broad path-skips, not these exact consumer paths.
- The protected scheduled Release Gate was not dispatched, and no automation state was changed. No Storybook/browser run was needed for this non-rendering CI delta.
Posted as drafted in the exact-head self-authored GitHub COMMENT review; GitHub recorded COMMENTED at a5676f81cab6fe9ecaa1352ff0b73aa2e8338e82.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
e0148bb94091ff082ff77dd8d92bdf0e36a1009c — direct child of approved #5630 head d7681c97aa7c1c2567c7f36ac91860a9bb7a18dc, stacked on approved #5608 head 37d70566fd5203763877d8f93f8e8469255f9005.
LOOP VERSION: 1.9.1 AUDIT RUBRIC: 1.14.4
LANE: full WHY: this final round must clear four standing scope/architecture findings across every PR visual, a11y, RTL, and readiness consumer, and must verify a rewritten functional delta plus an exact green header-only tip.
Our Round 4 review at a5676f81cab6fe9ecaa1352ff0b73aa2e8338e82 asked for every actual PR visual/a11y/RTL/readiness consumer to use the executable shared result; every former parser drift mutant to fail; malformed current helper invocations to fail closed; the RTL harness to receive explicit protected-main coverage; and the nested-barrel, shared-parser, Node/workspace, mixed, Lab, exact, and legacy cases to remain.
The replacement functional head 8f37fbb650116265d5b5476ffe00e315cb1268b1 shares the approved parent d7681c97 and changes 10 files, +406/−69 from Round 4. Exact head e0148bb9 differs from it by only the required two-line copyright header on the new composite action; failed CI run 33178767409 identifies that single missing header, and current exact-head CI is green. Current main remains 936256386b74d67f88a41adee235b91699977b2f; no touched path moved after Round 4.
WHY 1: PR visual, a11y, and RTL jobs previously rebuilt component scope through separate parsers, so one consumer could drift while another stayed green. WHY 2: a maintainer could receive skipped, broadened, or misleading review evidence for the same changed path even though the advertised classifier was correct. WHY 3: required evidence is trustworthy only when every workflow consumer enters through one executable scope contract and broad inputs fail visibly into protected-main coverage. USER-FACING PROBLEM: a maintainer reviewing component or rendering-infrastructure work needs every browser/audit job to use the same exact-or-deferred decision; otherwise a green review can omit the path that changed. PROBLEM SEVERITY: broken task — Round 4 proved one real visual consumer and malformed readiness syntax could diverge while the contract tests stayed green. NEW FEATURE CASE: not a new feature — this repairs existing CI evidence routing. EARLY STOP: clear — prior findings, exact-head source, action-use inventory, path probes, mutation failures, and CI establish the need and result.
VERDICT: clear
One local composite action now runs the shared changed-path classifier in both changed-file and analysis-artifact modes. The check-components, accessibility, stable visual, and RTL jobs consume that action’s outputs instead of rebuilding component identity. Lab readiness validates the action, every current workflow entry, the helper schema, and a representative classification while retaining the explicit legacy pathspec branch.
SOLUTION (3 decisions · 10-file functional delta, +406/−69)
- Add one executable workflow entry over the existing shared classifier.
- Replace all four PR workflow component parsers with the action’s exact outputs.
- Make readiness reject missing action fields, missing consumers, direct/shadow helper commands, malformed current wiring, and helper/schema drift.
BURDEN: medium — one 55-line composite action, one extended classifier result, four workflow invocations, one readiness contract check, and focused source/workflow mutation tests. BURDEN MATCH: proportionate — the standing defect was cross-workflow drift; one shared entry plus fail-closed consumer checks is the smallest model that removes it.
VERDICT: clear
OWNER: .github/scripts/lib/affected-scope.js owns component identity and exact/broad dependency classification; .github/actions/affected-scope/action.yml is its sole PR workflow entry.
TIER 1: changed paths, Core/Lab roots, exact component filters, stable visual supplemental story/theme classification, a11y/RTL jobs, and protected-main deferral.
TIER 2: none.
SEAMS: direct changed-file input, analysis artifact input, nested barrels, shared theme parser, Node/workspace globals, mixed exact+broad input, Lab components, stable visual Core filtering, RTL harness inputs, malformed/shadow commands, and legacy readiness syntax.
BEHAVIOR UNIT: pure utility plus a local composite action — deterministic from a path list and testable without a browser.
COMPLEXITY BUDGET: one classifier, one workflow entry, four current PR job consumers, one stable-visual supplement for story/theme metadata, zero workflow component parsers, and one fail-closed readiness contract.
ACTUAL BURDEN: 15 top-commit files, +1438/−217 against approved #5630; Round 5 functional delta is 10 files, +406/−69; one new action; four action call sites; 169 focused tests across nine files; four banked mutation classes.
BURDEN TREND: Round 4 had one shared classifier plus three inline consumer representations and permissive readiness parsing. Round 5 adds one projection action while deleting every workflow component parser; runtime owners contract to one and every current job mutation is rejected.
RESET TRIGGER: cleared by the requested architecture reset — no additional writable classifier or fallback source remains in a PR visual/a11y/RTL workflow.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| exact component identity | affected-scope.js |
composite action outputs, analysis.affectedScope, visual-scope’s imported result |
report-only newComponents/modifiedComponents remain, but no workflow gate consumes them |
| PR workflow scope entry | local composite action | four ci.yml uses; workflow/readiness contract tests |
none |
| stable story/theme visual scope |
visual-scope.mjs, layered over the shared classifier |
check-components flags and trusted PR-comment scope | none |
| broad/global and RTL-harness deferral |
affected-scope.js inputKind()
|
visual/a11y/RTL booleans and reasons | none |
| readiness compatibility | current composite-action contract; explicit legacy pathspec branch | helper schema/root/sample validation | no catch-all or cross-checkout fallback |
| seam | driven result |
|---|---|
packages/core/src/Button/Button.tsx |
exact Core/Button; no broad deferral |
packages/lab/src/Drawer/index.ts |
exact Lab/Drawer; a11y/RTL consume the shared output |
packages/core/src/Calendar/hooks/index.ts |
exact Core/Calendar nested-barrel scope |
packages/core/src/utils/parseStyleKey.ts |
no exact component; visual, a11y, and RTL broad-defer as shared theme infrastructure |
.nvmrc |
all three lanes broad-defer as browser-version input |
pnpm-workspace.yaml |
all three lanes broad-defer as lockfile ambiguity |
Button + .nvmrc
|
exact Button and all broad-defer flags coexist |
RTL script, targets, weekly workflow, summary, and rtlStyles.ts
|
all classify rtl-harness-input and broad-defer |
component-roots-broken / component-roots --unexpected
|
readiness returns no roots; injected shadow command fails the workflow contracts |
| action input modes | stdin changed-files and analysis.json produce byte-equivalent classifier results |
Four action uses are present in ci.yml: check-components, pr-a11y, pr-visual, and pr-rtl. Repository-wide workflow inspection found no direct affected-scope.js invocation and no newComponents + modifiedComponents or affectedScope.components component parser in any workflow; visual-scope.mjs remains only for stable story/theme metadata and imports the shared classifier.
VERDICT: clear
Maintainers now get one component set in every PR visual/a11y/RTL job, while shared or ambiguous inputs retain explicit protected-main deferral. Removing an action consumer, restoring the old visual parser, adding a direct malformed helper command, or dropping a declared contract consumer fails focused tests before the drift can ship. NEW FEATURE IMPACT: not a new feature.
VERDICT: clear
No published package API changes. Internal CI adds the local action inputs/outputs and an rtl deferral projection; both action input modes are pinned to the same helper output.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
+ |
composite changed-files / analysis-file inputs |
internal workflow contract | existing changed-path classifier | action/test | clear |
+ |
exact component/core-component, a11y/RTL deferral, reasons, and JSON outputs | internal workflow contract | existing affected-scope result | action/test | clear |
~ |
readiness current action contract + explicit legacy pathspec | internal audit contract | existing compatibility path | source/test | clear |
OSSIFICATION: no consumer package surface. Workflow consumers now share one executable projection, and the two input forms are parity-tested.
VERDICT: clear
No CSS, token, target, variable, selector, or rendered theme output changes. The existing shared-theme path remains broad: parseStyleKey.ts produces shared-theme-token-infrastructure deferral in visual, a11y, and RTL.
VERDICT: clear
BEHAVIOR: yes inside CI — all four PR scope jobs now consume one action, malformed current wiring fails closed, and RTL harness changes explicitly defer. API: no published package API change. VISUAL: no product pixels, DOM, styles, stories, assets, or rendered theme output change. THEME: no theme contract change; only evidence routing for shared theme inputs remains broad.
VERDICT: clear
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none. LAYOUT: none. BUNDLE: no dependency or lockfile delta. Scope work remains one bounded pass over changed paths; the action invokes the same helper once per consumer.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the functional delta changes CI scripts/tests, one local action, one workflow, and lab-readiness tooling only. It changes no component implementation, story, style, asset, theme package, DOM, or rendered app path. Storybook/browser capture was not required.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product role, accessible state, focus path, string, locale, direction, or rendered behavior changes. The evidence gate itself is repaired: exact a11y and RTL filters consume the action outputs, and the RTL harness script, targets, weekly workflow, summary, and shared RTL utility all broad-defer. Their broad-defer and mixed-exact cases were driven directly.
VERDICT: clear
| slot | verdict |
|---|---|
| PROBLEM | clear |
| SOLUTION | clear |
| ARCHITECTURE | clear |
| IMPACT | clear |
| API | clear |
| THEMING | clear |
| BREAKING | clear |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | clear |
GOAL: met — all four actual PR jobs enter through the composite action; repository-wide workflow search finds no shadow component parser; four independent mutants fail; malformed command probes fail closed; and every prior exact/broad/mixed/RTL path returns its intended outcome. DISPOSITION: every Round 4 finding is satisfied; no new blocking finding. The PR remains a draft, so the self-authored public disposition is a semantic COMMENT approving once undrafted. ADVICE: omitted — no corrective action remains. AUTHOR CAN PROCEED: yes — undraft when the approved parent stack is ready; this review authorizes no merge or auto-merge. WORST OUTCOME: none found → approve once undrafted.
JUDGEMENT NEEDED: none — correctness repair inside the existing CI contract.
approve once undrafted
Semantic verdict: approve once undrafted
Thanks — one action now owns four PR scope jobs. Drift mutants fail, the exact/deferred matrix holds, and the tip is header-only.
[Reviewed by Robohands]
None.
- Exact-head focused Vitest passed 9 files / 169 tests. Consumer-removal,
pr-visualshadow-parser, malformed direct-command, and declared-inventory mutants each failed the intended workflow/readiness contracts; the restored pair passed 40/40. - Exact action input parity and 14-case path matrix passed; the nested barrel,
parseStyleKey.ts,.nvmrc, workspace, mixed, Core, Lab, and five RTL-harness cases produced the intended exact/broad outcomes. Twelve changed scripts passednode --check; exact PR-plan actionlint,git diff --check, andcheck:repopassed. - Exact-head CI run 33180678847 has 17 passing and 5 intentionally skipped checks, with 0 failed/pending. Its check-components log runs the new action and broad-defers this workflow/script stack; the prior red run and
8f37fbb..e0148bbdiff independently prove the final tip is copyright-only.
TIME total 12m setup 2m exact heads, fresh code/wiki worktrees, current rules/rubric, fork trust screening, dependency seed reading 3m all four prior rounds, PR body, functional/header deltas, every workflow consumer, readiness/action contracts measuring 5m path matrix, four mutations, 169 tests, syntax, actionlint, repository gate, exact CI logs writing 2m presentation, literal template gate, two critic passes, GitHub/wiki delivery waste 1m first actionlint run emitted known repository shell/runner diagnostics before the PR’s exact flags were used
- Exact-head Actions path-skipped Stable visual, pr-a11y, and pr-rtl because this stack changes shared workflow/scripts; their exact component branches were verified locally through clean tests and mutations rather than a live exact-component PR run.
- The protected scheduled Release Gate, weekly RTL/a11y sweeps, and disabled Automations were not dispatched or changed. No Storybook/browser run was required for this non-rendering CI delta.
Posted as drafted in the exact-head self-authored GitHub COMMENT review; GitHub recorded COMMENTED at e0148bb94091ff082ff77dd8d92bdf0e36a1009c.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
1763ae1bc9ef4b5f8e1c8f802146da31869b0334 — direct child of code-approved #5630 exact head 04246c0051029d017e6aa76b3b649bc55bb622dc, whose parent is landed #5608 merge commit a83c559a51fb86260f8309f695b68acd612b2eef.
AUTHORITATIVE ROUND: Round 5's approval at e0148bb9 is invalidated. #5608 landed one minute after that review, changing the stack parent; this round reviews the restacked exact head fresh.
LOOP VERSION: 1.9.1 AUDIT RUBRIC: 1.14.4
LANE: full WHY: this is a fresh restack review of a cross-workflow exact/deferred scope authority after the prior approval was invalidated by a parent landing.
Round 5 approved e0148bb94091ff082ff77dd8d92bdf0e36a1009c on parent d7681c97. That approval cannot carry across #5608's land without restack proof and a current-head contract review.
The restack itself is exact: old and landed #5608 trees are both 3d673168; old/new #5630 trees are both d696514f; old/new #5632 trees are both f98f0264; the old/new #5632 top patches are byte-identical and share stable patch id 7ba1fbfb; git range-diff reports e0148bb = 1763ae1. The current head is a direct child of the separately re-approved #5630 head. No #5608 implementation byte is charged to this top commit.
Fresh review found a standing top-commit contract gap that Round 5 missed: generic shared Core hooks/utilities receive neither exact scope nor protected-main a11y/RTL deferral, while the separate visual wrapper broad-defers them. The helper CLI also accepts malformed command forms with exit 0.
WHY 1: every changed path that can alter shared visual, accessibility, or RTL behavior needs one truthful exact-or-deferred decision.
WHY 2: shared focus and behavior utilities feed many components, so treating them as irrelevant skips the precise jobs most likely to catch regressions.
WHY 3: a maintainer must not see visual deferral beside a no-component/no-deferral a11y result for the same file.
USER-FACING PROBLEM: a maintainer changing useFocusTrap, useListFocus, useLayer, or a shared runtime utility can receive no exact a11y/RTL run and no explicit protected-main deferral, while the visual lane independently says the change is broad.
PROBLEM SEVERITY: broken task — the new one-source contract produces contradictory coverage decisions for reachable shared infrastructure.
NEW FEATURE CASE: not a product feature — this repairs CI evidence routing.
EARLY STOP: clear — source tracing, direct production-module probes, the clean focused suite, and exact-head CI establish the mismatch.
VERDICT: BLOCKS — shared runtime inputs still have a silent third outcome in a11y/RTL
The PR correctly centralizes named component and global path cases behind one helper and one composite action. Four CI jobs use the action, current readiness validates those call sites, and named exact/broad/mixed cases work. The helper's global classifier remains enumerative, while visual-scope.mjs keeps a separate catch-all for non-component Core runtime; that split leaves ordinary shared hooks/utilities broad only in visual scope. The executable CLI also defaults unknown commands to empty-stdin classification and ignores extra arguments to component-roots.
SOLUTION (3 decisions · 15-file top delta, +1438/−217)
- Add one executable classifier and composite action for exact component/global scope.
- Route four PR jobs through the action and validate the wiring from readiness.
- Retain a visual-only shared-Core catch-all and permissive CLI dispatch, leaving the one-source/fail-closed model incomplete.
BURDEN: medium — one classifier, one composite entry, four action call sites, one visual supplement, one readiness contract, and 169 focused tests. BURDEN MATCH: disproportionate at the remaining boundary — one visual-only path parser exists because the shared classifier does not own the class.
VERDICT: BLOCKS — the action is not the sole owner of broad shared-runtime classification
OWNER: .github/scripts/lib/affected-scope.js should own exact component identity and broad/global classification; the composite action should project that result to every PR consumer.
TIER 1: Core/Lab component roots, shared Core runtime, Storybook/theme/browser/RTL inputs, exact component filters, and protected-main deferral.
TIER 2: none.
SEAMS: component source, nested barrels, named theme infrastructure, ordinary shared hooks/utilities, Node/workspace inputs, mixed exact+broad input, RTL harness input, action input parity, current/legacy readiness syntax, and malformed helper CLI arguments.
BEHAVIOR UNIT: one pure classifier plus one strict executable projection.
COMPLEXITY BUDGET: one classifier, one action entry, four CI job consumers, one source-identified story/theme supplement, zero independent broad-runtime parsers, and fail-closed command dispatch.
ACTUAL BURDEN: 15 files, +1438/−217; one helper/action; four action uses; visual-scope.mjs still owns isRuntimeCoreFile() and broadens non-component Core runtime independently; the helper's inputKind() returns null for generic hooks/ and utils/ runtime files; unknown or extra CLI command arguments exit 0.
BURDEN TREND: Round 5 → current restack is byte-flat, but fresh class verification finds the prior one-source reset incomplete. No restack byte added the gap; it remains in #5632's unchanged functional patch.
RESET TRIGGER: triggered — the approved model still has a second executable owner for broad shared-runtime scope, the same architecture class prior rounds required this PR to remove.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| exact component identity | affected-scope.js |
action outputs, analysis metadata, visual scope | none found |
| named global/uncertain deferral | affected-scope.js |
action and report outputs | none found |
| generic shared Core runtime deferral | none | visual-only broad flag |
visual-scope.mjs:isRuntimeCoreFile(); absent from helper a11y/RTL result |
| action consumers | readiness workflow contract | four ci.yml action uses |
helper CONSUMERS names pr-comment.visual but not ci.pr-visual
|
| helper CLI grammar | implicit branch on argv[2]
|
roots or default JSON | unknown commands fall into default mode; extra root args are ignored |
| seam | driven result |
|---|---|
Core Button.tsx
|
exact Core/Button; no deferral |
Lab Drawer/index.ts
|
exact Lab/Drawer for a11y/RTL; no stable visual scope |
nested Calendar/hooks/index.ts
|
exact Core/Calendar |
parseStyleKey.ts |
visual/a11y/RTL broad-defer as shared theme infrastructure |
.nvmrc |
all three broad-defer as browser-version input |
pnpm-workspace.yaml |
all three broad-defer as lockfile ambiguity |
Button + .nvmrc
|
exact Button plus all broad flags |
| RTL harness | all three broad-defer as rtl-harness-input
|
useLayer.tsx, useFocusTrap.ts, useListFocus.ts, sharedResizeObserver.ts
|
zero components; visual/a11y/RTL helper deferral all false; visual wrapper independently broad true |
| missing/malformed-export/throwing readiness helper | returns no roots in the explicit fixture test |
| legacy pathspec / current action syntax | both return Core + Lab roots |
| removed action consumer / shadow parser / direct malformed command / missing declared consumer | each mutation reds the two current readiness contract tests; restored head is clean |
component-roots-broken |
exits 0 and emits empty-scope JSON |
component-roots --unexpected |
exits 0 and emits Core + Lab roots |
The split is between inputKind(), which returns null for generic shared runtime, and isRuntimeCoreFile(), which broadens the same files only for visual scope. Permissive CLI dispatch is at affected-scope.js lines 197–214.
VERDICT: BLOCKS — one shared-runtime fact still has two outcomes and malformed commands do not fail closed
A maintainer changing a shared focus/navigation hook can see Stable visual defer while has_components=false, a11y_deferred=false, and rtl_deferred=false. Exact a11y/RTL jobs skip, and the generated accessibility section can report no violations instead of naming protected-main coverage. A malformed helper command can also succeed with an unrelated result rather than expose broken wiring.
NEW FEATURE IMPACT: not a new feature.
VERDICT: BLOCKS — required evidence can silently disappear for shared runtime changes
No published package API changes. Internal CI adds action inputs/outputs, helper result/schema, consumer metadata, and the component-roots CLI mode.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
+ |
exact component and visual/a11y/RTL deferral result | internal CI contract | existing PR checks | source/tests | BLOCKS — shared runtime is not total |
+ |
composite action inputs/outputs | internal workflow contract | existing classifier | action/tests | clear for the four current call sites |
+ |
component-roots command |
internal readiness contract | current/legacy root discovery | source/tests | BLOCKS — unknown/extra arguments succeed |
OSSIFICATION: no consumer package surface. This internal contract gates whether required evidence exists, so silent success is a correctness failure rather than a documentation nit.
VERDICT: BLOCKS — the internal executable scope contract is incomplete and permissive
No CSS, token, target, variable, selector, or rendered theme output changes. The named parseStyleKey.ts and theme infrastructure cases correctly broad-defer in all three lanes.
VERDICT: clear
BEHAVIOR: yes inside CI — named component/global paths are centralized, but generic shared runtime still gets inconsistent lane behavior. API: no published package API change. VISUAL: no product pixels, DOM, styles, stories, assets, or theme output change. THEME: no theme contract change; only evidence routing for shared infrastructure changes.
VERDICT: BLOCKS — intended one-source CI behavior remains incomplete
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none added. LAYOUT: none. BUNDLE: no dependency or lockfile delta. Classification remains bounded by changed paths.
VERDICT: clear
VISUAL CHECK: not applicable WHY: all top-commit files are CI scripts/tests, workflows, one local action, docs, and lab-readiness tooling. No component implementation, story, style, asset, theme package, DOM, or rendered app path changes. No Storybook/browser capture was required.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product role, accessible state, focus path, string, locale, direction, or rendered behavior changes. The changed boundary determines whether a11y/RTL evidence runs. Named exact and RTL-harness cases work, but shared focus/navigation hooks receive neither exact scope nor explicit deferral.
VERDICT: BLOCKS — the new gate can silently omit the exact evidence class it protects
| slot | verdict |
|---|---|
| PROBLEM | BLOCKS — shared runtime has a silent third outcome |
| SOLUTION | BLOCKS — visual retains an independent broad parser |
| ARCHITECTURE | BLOCKS — the one-source reset is incomplete |
| IMPACT | BLOCKS — a11y/RTL evidence can disappear |
| API | BLOCKS — internal command/scope contract is permissive |
| THEMING | clear |
| BREAKING | BLOCKS — intended routing remains incomplete |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | BLOCKS — shared hooks skip exact and deferred coverage |
GOAL: partly met — the four action consumers, requested exact/broad/mixed path matrix, readiness failure fixtures, and four drift mutations pass; generic shared Core runtime still splits visual from a11y/RTL, and malformed helper commands succeed. DISPOSITION: the prior one-source architecture finding blocks again. Acceptance criteria: (1) the executable classifier owns generic shared runtime classification for every lane; (2) visual supplements consume that source rather than independently broadening the class; (3) unknown commands and extra arguments exit nonzero; (4) shared focus/utility and malformed-command regression cases are pinned; (5) all currently passing named cases and mutants remain. ADVICE: bounded outcome criteria — contract the remaining broad parser into the executable owner and fail closed at its CLI boundary. AUTHOR CAN PROCEED: yes — failing files, commands, and expected outcomes are deterministic. WORST OUTCOME: “a shared focus-hook change receives no exact a11y/RTL run and no protected-main deferral while the PR report looks clean” → request changes.
JUDGEMENT NEEDED: none — correctness and architecture defect inside the new CI contract.
request changes
- Generic shared Core runtime is broad only in the visual wrapper, not the executable classifier.
→ maintainers changing shared focus/navigation behavior can lose a11y and RTL evidence while the report looks irrelevant/clean ·
affected-scope.js:49 - The helper accepts unknown commands and extra
component-rootsarguments with exit 0. → malformed wiring can return an unrelated valid-looking result instead of failing closed ·affected-scope.js:197
Semantic verdict: request changes
Thanks — the restack itself is byte-identical, but the one-source scope contract still has a silent shared-infrastructure lane.
inputKind() defers only named utilities. Changes to shared runtime such as useFocusTrap.ts, useListFocus.ts, or sharedResizeObserver.ts return no component and all three deferred flags false; visual-scope.mjs independently broad-defers those same paths, so visual coverage defers while a11y/RTL skip and the PR report can say no violations. The helper also exits 0 for component-roots-broken and component-roots --unexpected.
Please make the executable classifier total for shared runtime inputs, reject unknown/extra CLI arguments, and pin both classes.
[Reviewed by Robohands]
None — both failures cross the executable owner and consumer boundary.
- Exact restack proof: #5608 old/landed trees
3d673168; #5630 old/new treesd696514f; #5632 old/new treesf98f0264; stable patch id7ba1fbfb; byte-identical top patches;range-diffequality; direct parent04246c00. - Exact-head focused Vitest passed 9 files / 169 tests. Consumer-removal, visual shadow-parser, malformed direct-command, and declared-inventory mutants each failed the intended readiness contract; restored worktree is clean. Missing/malformed/throwing helper, current/legacy syntax, and action contract fixtures passed 3/3.
- Action stdin/analysis-file results were byte-identical. Named path matrix passed for Core, Lab, nested barrel,
parseStyleKey,.nvmrc, workspace, mixed exact+broad, and RTL harness. The added shared-hook/shared-utility control exposed the contradictory lane result. - Twelve changed JS/MJS files pass
node --check; the three interacting workflows pass exact actionlint;git diff --checkandcheck:repopass. - Exact-head CI run 33183590319 has 17 passing checks/statuses, 5 intentional skips, and 0 pending/failed. Its log proves the new action executed on the top stack and broad-deferred the listed workflow/visual-gate files.
TIME total 13m setup 3m exact heads, fresh code/wiki worktrees, current kit/rubric, trust screening, dependency seed reading 3m all Review-5632 rounds, parent authoritative records, restack topology, action/workflow/readiness dataflow measuring 5m 169 tests, path/CLI matrix, four mutations, fail-closed fixtures, syntax/actionlint/repo gates, exact CI writing 2m presentation, two critic passes, exact-head GitHub/wiki delivery waste 1m two shell probes used a reserved scalar/argument form and were immediately rerun correctly
- PR-head workflow code cannot fully exercise the trusted default-branch publisher path; local source-identified contracts and mutations cover it instead.
- The protected Release Gate, weekly RTL/a11y sweeps, and disabled Automations were not dispatched or changed. No Storybook/browser run was needed for this non-rendering CI delta.
Posted as drafted in the exact-head self-authored GitHub COMMENT review; GitHub recorded COMMENTED at 1763ae1bc9ef4b5f8e1c8f802146da31869b0334. This Round 6 record supersedes the invalidated Round 5 approval. No merge or auto-merge was enabled.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
341632258626f824ebc978fdf415d88322615fd0 — direct child of the exact-patch #5630 copy 6413ca02d148085ae130f282d7304437d09e7589 on main 1b706d5d2d35cf141fd8384ce9952d660d0a9221.
AUTHORITATIVE ROUND: Round 7 supersedes Round 6 at 1763ae1bc9ef4b5f8e1c8f802146da31869b0334. Round 5's invalidated approval remains historical; this is the current exact-head disposition.
LOOP VERSION: 1.9.1
AUDIT RUBRIC: 1.14.4 (the page header and newest history row; its stale Current line still says 1.14.3)
LANE: full WHY: this is a final re-review of a repeatedly-blocked cross-workflow scope authority, its CLI trust boundary, every prior path/consumer/mutation case, and a current-main restack.
Our Round 6 review asked for generic shared Core runtime to broad-defer in visual, a11y, and RTL from the executable owner; visual scope to stop independently owning that class; unknown and extra CLI arguments to fail; focused path/CLI regressions to be pinned; and every prior named case and drift mutant to remain.
The Round 6 head 1763ae1b and fixed pre-restack candidate 73e0a60c share parent 04246c00; their functional delta is 7 files, +198/−32. The current parent 6413ca02 has the same stable patch id 8aa2e884 as approved #5630 head 04246c00. 73e0a60c → 34163225 range-diff changes only the expected ci.yml context from the old theme-layer step to the current guest fixture-contrast job. Current main f0043d8f adds only the canonical setup-composition step immediately before that job on the overlapping path; a synthetic merge is clean, and its two scope-contract suites plus actionlint pass.
WHY 1: every shared runtime change needs the same exact-or-deferred answer in visual, accessibility, and RTL checks. WHY 2: a path one classifier misses can make exact checks skip while another classifier reports broad coverage, producing contradictory green-looking evidence. WHY 3: a maintainer needs malformed workflow wiring to fail immediately rather than execute with an unrelated valid result. USER-FACING PROBLEM: a maintainer changing shared direction, translation, or naming behavior can still receive visual deferral while accessibility and RTL silently skip; a malformed action command can also be certified as ready. PROBLEM SEVERITY: broken task — required review evidence can disappear for real shared runtime files and command drift can remain green. NEW FEATURE CASE: not a new feature — this repairs an existing CI evidence contract. EARLY STOP: clear — direct production-path and action-command probes establish both reachable failures.
VERDICT: BLOCKS — the exact-or-deferred and fail-closed contracts remain incomplete
A single classifier is intended to decide whether a change has a bounded component scope or needs protected-main coverage. The new delta broadens four named shared-runtime directories and gives the helper explicit commands, while the composite action remains the common workflow entry. The classification still enumerates selected directories rather than owning the whole shared-runtime class, and its argument parser rejects unknown flags but silently ignores bare tokens.
SOLUTION (3 decisions · 7-file Round 6 delta, +198/−32)
- Broad-defer shared
hooks/,utils/,focus/, andruntime/inputs in all three lanes. - Require explicit helper subcommands and changed-file input modes.
- Preserve the composite action, four CI consumers, readiness contract, and prior regression matrix.
BURDEN: medium — one classifier, one action, four CI workflow consumers, one visual supplement, one readiness contract, and 178 focused tests. BURDEN MATCH: disproportionate at the remaining boundary — selected directory and token checks still encode a class that already has another broader visual owner.
VERDICT: BLOCKS — the repair closes named examples but not the shared-runtime or CLI grammar class
OWNER: .github/scripts/lib/affected-scope.js should own exact component identity and broad shared-runtime classification; .github/actions/affected-scope/action.yml should be its strict executable projection.
TIER 1: Core/Lab component roots, non-component Core runtime, Storybook/theme/browser/RTL inputs, exact component filters, and protected-main deferral.
TIER 2: none.
SEAMS: component source, nested barrels, hooks, utilities, focus/runtime helpers, i18n, root shared modules, Node/workspace inputs, exact+broad unions, RTL harness paths, action inputs, current/legacy readiness, and malformed CLI tokens.
BEHAVIOR UNIT: pure utility plus one local composite action — deterministic from a changed-path list and directly testable.
COMPLEXITY BUDGET: one classifier, one workflow entry, four CI consumers, one source-identified story/theme supplement, zero independent shared-runtime parsers, and zero ignored CLI tokens.
ACTUAL BURDEN: 15 top-commit files, +1604/−217; Round 6 → fixed candidate is 7 files, +198/−32; one new broad-directory regex and three CLI parsing helpers; 178 focused tests. visual-scope.mjs:isRuntimeCoreFile() still broadens real Core runtime that inputKind() does not classify.
BURDEN TREND: Round 6 → current grows to cover four named roots and explicit flag forms, but the number of owners for generic non-component Core runtime stays at two and the strict grammar remains partial.
RESET TRIGGER: remains triggered — this is the next round of the same one-source finding, and the repair remains an enumerated subset rather than contracting the whole class into its owner.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| exact component identity | affected-scope.js |
action/analysis/visual projections | none found |
| named shared runtime deferral |
affected-scope.js directory regex |
visual/a11y/RTL outputs | none for the four named roots |
| all non-component Core runtime deferral | none | visual-only broad flag |
visual-scope.mjs:isRuntimeCoreFile(); helper omits actual i18n/ and root naming.ts
|
| workflow entry and consumers | composite action + readiness contract | four ci.yml action uses |
no direct helper or shadow component parser found |
| CLI grammar |
affected-scope.js dispatch/parser |
action command lines | bare positional tokens are silently ignored; action validation uses substring matching |
| seam | driven result |
|---|---|
Core Button.tsx / Lab Drawer/index.ts
|
exact component scope, no deferral |
nested Calendar/hooks/index.ts
|
exact Core/Calendar |
parseStyleKey.ts, .nvmrc, workspace config |
all three lanes broad-defer with the expected reason |
shared hooks/, utils/, focus/, runtime/
|
all three lanes broad-defer as shared runtime |
Button + .nvmrc + RTL harness |
exact Button plus visual/a11y/RTL broad union |
i18n/useDirection.ts |
no component and all helper deferrals false; visual supplement alone marks broad |
root naming.ts
|
no component and all helper deferrals false; it is consumed by components, themes, and build tooling |
| four CI consumers | each uses the composite action; no workflow direct-helper or legacy component parser found |
| prior consumer-removal, visual-shadow-parser, direct-helper, and inventory mutants | each reds the intended contract tests |
classify unexpected --changed-files-stdin / trailing unexpected
|
both exit 0; adding the token to both action commands leaves the workflow/readiness contract suite green |
VERDICT: BLOCKS — shared runtime still has two executable owners and malformed action syntax can be certified
A change to useDirection.ts or useTranslator.ts can affect direction, locale, and accessible strings across many components. Current outputs are has_components=false, a11y_deferred=false, and rtl_deferred=false, while only the separate visual supplement says broad; exact a11y/RTL work therefore skips without protected-main attribution. A stray positional token in either action command also exits successfully and survives readiness validation.
NEW FEATURE IMPACT: not a new feature.
VERDICT: BLOCKS — maintainers can still receive incomplete evidence for real shared runtime or malformed wiring
No published package API changes. Internal CI changes the affected-scope CLI grammar and broad-dependency classification.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
~ |
shared runtime classification | internal CI contract | existing exact/deferred scope | source/tests | BLOCKS — actual i18n/root runtime remains outside the owner |
~ |
explicit component-roots / classify grammar |
internal executable contract | existing action/readiness seam | source/tests | BLOCKS — unconsumed positional tokens succeed |
= |
composite action inputs/outputs | internal workflow contract | existing four-consumer entry | action/tests | clear |
OSSIFICATION: no consumer package surface. These internal contracts decide whether required evidence exists, so silent acceptance creates durable false-green behavior.
VERDICT: BLOCKS — the internal classifier and CLI contracts are not total
No product CSS, tokens, targets, selectors, or rendered theme output changes. The omitted root naming.ts owns class, data-attribute, CSS-variable, and layer names and is consumed by component and theme generation, yet receives no helper deferral.
VERDICT: BLOCKS — one real shared theme/runtime source remains outside affected-scope ownership
BEHAVIOR: yes inside CI — the named shared roots and strict flag forms now route correctly, but actual i18n/root runtime and bare-token syntax still do not. API: no published package API change. VISUAL: no product pixel, DOM, story, style, or asset change. THEME: no theme output change; only its evidence routing is incomplete.
VERDICT: BLOCKS — intended one-source and fail-closed CI behavior remains incomplete
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none added. LAYOUT: none. BUNDLE: no dependency or lockfile delta; classification remains one bounded pass over changed paths.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the functional delta changes CI scripts/tests, one local action, one workflow, and lab-readiness tooling only. It changes no component implementation, story, style, asset, theme package, DOM, or rendered app output. No Storybook/browser capture was required.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product accessibility or localization implementation changes. This PR controls whether those changes receive evidence: i18n/useDirection.ts and i18n/useTranslator.ts are actual shared runtime consumers across the component set, but currently produce neither exact scope nor a11y/RTL deferral.
VERDICT: BLOCKS — the changed gate can silently omit a11y/RTL evidence for its own shared i18n runtime
| slot | verdict |
|---|---|
| PROBLEM | BLOCKS — real shared runtime and malformed wiring retain silent outcomes |
| SOLUTION | BLOCKS — named cases do not close either class |
| ARCHITECTURE | BLOCKS — generic runtime still has two owners |
| IMPACT | BLOCKS — required evidence can disappear |
| API | BLOCKS — internal classifier/CLI contracts are incomplete |
| THEMING | BLOCKS — shared naming source is omitted |
| BREAKING | BLOCKS — intended CI behavior remains partial |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | BLOCKS — shared i18n changes can skip both lanes |
GOAL: partly met — all twelve requested named exact/broad/mixed/RTL cases pass, action input parity holds, four prior drift mutants fail, and four CI jobs use the action; actual i18n/root runtime still splits visual from a11y/RTL, while two bare-token command forms and the matching action mutant remain green. DISPOSITION: shared-runtime totality blocks now; unconsumed CLI tokens block now. ADVICE: bounded outcome criteria — make the shared classifier own the same non-component Core runtime class visual scope treats as broad, reject every token not consumed by the command grammar, and pin the real-path/action-command controls. AUTHOR CAN PROCEED: yes — both failing path/command forms and expected outputs are deterministic. WORST OUTCOME: “a maintainer changing shared direction behavior can receive visual deferral while accessibility and RTL silently skip” → request changes.
JUDGEMENT NEEDED: none — correctness and architecture defects inside the existing CI contract.
request changes
- Actual shared Core runtime remains outside the executable owner.
→ direction, translation, or naming changes can lose a11y/RTL evidence while visual scope alone says broad ·
affected-scope.js:67 - The strict parser ignores bare positional tokens.
→ malformed action wiring can execute successfully and be certified by readiness ·
affected-scope.js:183
Semantic verdict: request changes
Thanks — we asked for one total scope owner and strict CLI. The four named shared-runtime roots and all four CI consumers now pass, but two parts remain.
inputKind() omits real shared Core runtime under i18n/ and the root naming.ts. useDirection.ts returns no component and no visual/a11y/RTL deferral, while visual-scope.mjs independently broadens it; a11y and RTL can still skip. Please make the shared classifier own the same non-component Core runtime class that visual scope treats as broad.
assertNoUnknownArgs() ignores bare tokens, so malformed classify action wiring can succeed and pass readiness. Please reject every unconsumed token and pin that action-command mutation.
[Reviewed by Robohands]
None — both failures cross classifier, action, and consumer boundaries.
- Exact-head focused Vitest passed 9 files / 178 tests; the 12-case exact/broad/mixed/RTL matrix and action stdin/analysis parity passed. Four prior drift mutants red; a new extra-positional action-command mutant stayed green in both contract suites (40/40).
- Twelve changed JS/MJS files pass
node --check; exact actionlint,git diff --check, andcheck:repopass. The worktree returned byte-clean after every mutation. - Exact-head CI has 18 successful and 5 intentionally skipped checks/statuses, 0 failed/pending. The shared action executed and deferred this workflow/script stack; fixture contrast passed in both modes. Current-main synthetic integration changes only the added canonical setup step and passes 40 scope-contract tests plus actionlint.
TIME total 16m setup 3m exact heads, untrusted CI screening, fresh code/wiki checkouts, current kit/rubric, dependency seed reading 4m all six prior rounds/invalidation, fixed/restacked delta, classifier/action/workflow/readiness dataflow measuring 6m 178 tests, path/CLI probes, five mutations, syntax, actionlint, repo gate, current-main merge, exact CI logs writing 3m presentation, literal template gate, two critic passes, exact-head GitHub/wiki delivery waste 1m initial broad patch and review-page reads were truncated, so direct files and bounded chunks were reread
- PR-head Actions path-skipped exact Stable visual, pr-a11y, and pr-rtl because this stack itself broad-defers; their exact and mixed branches were driven locally.
- Protected scheduled Release Gate and weekly RTL/a11y jobs were not dispatched. Scheduled Automations remained disabled and untouched. No Storybook/browser run was required for this non-rendering CI delta.
Posted as drafted in the exact-head self-authored GitHub COMMENT review; GitHub recorded COMMENTED at 341632258626f824ebc978fdf415d88322615fd0. This Round 7 record supersedes Round 6 at the prior head. No merge or auto-merge was enabled.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
185dc58b5ac39629d813789ebd6e2cccef7faaa9 — direct child of the exact-patch #5630 copy 6413ca02d148085ae130f282d7304437d09e7589 on branch base 1b706d5d2d35cf141fd8384ce9952d660d0a9221.
AUTHORITATIVE ROUND: Round 8 supersedes Round 7 at 341632258626f824ebc978fdf415d88322615fd0. Round 5's invalidated approval remains historical; this is the current exact-head disposition.
LOOP VERSION: 1.9.1
AUDIT RUBRIC: 1.14.4 (the official page header and newest history row; its stale Current line still says 1.14.3)
LANE: full WHY: this is a repeatedly blocked cross-workflow scope and CLI trust boundary; the final round must re-run every prior path, consumer, mutation, current-main, and exact-CI invariant.
Our Round 7 review at 341632258626f824ebc978fdf415d88322615fd0 asked for i18n/** and root naming.ts to broad-defer visual, a11y, and RTL from the executable owner; every unconsumed CLI token to fail; the real path and malformed-action cases to be pinned; and all prior exact/broad/mixed/consumer/RTL behavior to remain.
The current three-file delta is +52/−5. Current main is 8e2751be7c1595506e43a8514527811a58e9e28b; its only post-base commit on a touched path is f0043d8f in ci.yml. A synthetic merge is clean and passes the four scope-contract files (103/103), syntax, and actionlint. The parent 6413ca02 and approved #5630 head 04246c00 share stable patch id 8aa2e884.
WHY 1: shared runtime changes need the same exact-or-deferred answer in visual, accessibility, and RTL, and the action CLI must reject malformed wiring. WHY 2: otherwise required review evidence can silently skip or a workflow can run with an unintended command shape. WHY 3: maintainers rely on the focused contract suite to prove those failures remain impossible after later parser or action edits. USER-FACING PROBLEM: a maintainer changing the scope parser can currently re-allow stray positional tokens while the test named for malformed invocations remains green. PROBLEM SEVERITY: broken task — the strictness repair works now, but its regression test does not distinguish the intended parser error from a later malformed-path error. NEW FEATURE CASE: not a new feature — this repairs and regression-proofs an existing CI evidence contract. EARLY STOP: clear — prior acceptance criteria, exact-head execution, and two independent mutations establish the remaining test defect.
VERDICT: clear
The classifier now treats shared translation and naming code as broad infrastructure, so all three review lanes defer together. The CLI rejects unknown commands, stray positionals, duplicate or missing options, malformed JSON, and unsafe changed paths. The new table intends to pin those failures, but gives every case a second malformed input that can throw after the grammar check is removed.
SOLUTION (3 decisions · 9 net runtime lines + 43 test lines; 3 files, +52/−5)
- Broad-defer
packages/core/src/i18n/**and rootnaming.tsin visual, a11y, and RTL. - Make
classifyconsume exactly one known command/input grammar with no stray positional tokens. - Add path and CLI regressions for the fixed cases.
BURDEN: low for this round — one classifier condition, one parser branch, and two focused test tables; the full top commit remains one helper/action owner with four CI job consumers. BURDEN MATCH: proportionate in implementation, incomplete in evidence — the added positional rows are green under the prior permissive behavior.
VERDICT: BLOCKS — the malformed-CLI regression passes when positional rejection is removed, so Round 7's action-command mutation is not pinned
OWNER: .github/scripts/lib/affected-scope.js owns exact component identity, broad shared-runtime classification, and CLI grammar; .github/actions/affected-scope/action.yml is its sole PR workflow entry.
TIER 1: Core/Lab roots, non-component Core runtime, Storybook/theme/browser/RTL inputs, four PR job consumers, and protected-main deferral.
TIER 2: none.
SEAMS: exact Core/Lab files, nested barrels, shared theme parser, all current i18n runtime files, root naming, Node/workspace inputs, mixed exact+broad input, five RTL inputs, action input parity, consumer inventory, and malformed action commands.
BEHAVIOR UNIT: pure utility plus one local composite action — deterministic from changed paths and directly executable in both action modes.
COMPLEXITY BUDGET: one classifier, one action entry, four workflow consumers, one visual story/theme supplement, zero shadow component parsers, zero ignored CLI tokens, and one red regression per grammar defect.
ACTUAL BURDEN: top commit 15 files, +1651/−217; Round 7→8 is 3 files, +52/−5; owner count is flat. Exact source inventory compared 456 Core runtime-looking paths: the only visual/helper mismatches are type declarations, BaseProps.ts, and __tests__ support—not another shipped runtime owner.
BURDEN TREND: Round 7→8 shrinks the production gap without adding an owner; i18n/naming and runtime command behavior now contract into the helper. Test authority remains incomplete because malformed cases share an unrelated failure input.
RESET TRIGGER: cleared for runtime ownership; not triggered by the remaining focused test-evidence defect.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| exact component identity | affected-scope.js |
action outputs, analysis metadata, visual scope | no workflow parser found |
| broad shared-runtime deferral | affected-scope.js |
visual/a11y/RTL flags and report reasons | visual supplement has only non-runtime false-positive remainder |
| workflow entry/consumers | composite action + readiness contract | four ci.yml uses |
no direct helper or legacy parser found |
| CLI grammar |
affected-scope.js dispatch/parser |
two action command lines | tests do not isolate each grammar failure |
| seam | driven result |
|---|---|
11 non-test/doc files under packages/core/src/i18n/
|
zero exact components; visual/a11y/RTL all broad-defer as shared Core runtime |
root packages/core/src/naming.ts
|
zero exact components; visual/a11y/RTL all broad-defer as shared Core runtime |
| Core Button / Lab Drawer / nested Calendar barrel | exact component scope; no broad deferral |
parseStyleKey.ts, .nvmrc, workspace config |
all three lanes broad-defer with the expected reason |
| Button + Node version + RTL harness | exact Button plus all broad flags and reasons |
| four action consumers / prior removal, shadow-parser, direct-helper, and inventory mutants | four uses found; every prior mutant reds the intended workflow/readiness tests |
| 27 strict CLI/JSON/path cases with otherwise valid controls | 256 assertions pass; each observed failure carries its expected message |
| malformed action, analysis and stdin arms | executing either arm exits 1 with unexpected positional argument stray-action-token
|
| malformed action contract mutant | all 70 helper/workflow/readiness tests remain green |
| positional parser mutant |
classify stray-before --changed-files-stdin succeeds for valid Button input; all 30 helper tests remain green |
VERDICT: clear — runtime ownership and command behavior contract to one source; the remaining defect is regression-test fidelity
Current maintainers get explicit visual/a11y/RTL deferral for shared translation and naming files, and malformed action commands fail closed in both input modes. The remaining gap reaches the next maintainer: removing positional rejection or appending a token still leaves the focused suites green, so the promised regression signal is absent until live action execution. NEW FEATURE IMPACT: not a new feature.
VERDICT: BLOCKS — a future parser/action regression can pass the contract suite that claims to guard it
No published package API changes. Internal CI changes the shared-runtime classification and the affected-scope.js command grammar.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
~ |
i18n/** and naming.ts → shared-runtime deferral |
internal CI contract | existing broad dependency classification | source/tests | clear |
~ |
strict component-roots / classify grammar |
internal executable contract | existing action/readiness seam | source/tests | clear at runtime; test finding is in SOLUTION/IMPACT |
OSSIFICATION: no consumer package surface. The internal runtime meanings are now total for every requested real path and strict command case.
VERDICT: clear
No product CSS, token, target, selector, or rendered theme output changes. Root naming.ts and shared parseStyleKey.ts now both receive explicit broad deferral across visual, a11y, and RTL; direct probes and focused tests agree.
VERDICT: clear
BEHAVIOR: yes inside CI — i18n/naming now defer consistently and stray positionals fail instead of being ignored. API: no published package API change. VISUAL: no product pixel, DOM, story, style, asset, or rendered theme change. THEME: no theme contract change; only evidence routing for shared naming/theme inputs changes.
VERDICT: clear — the intended current-head behavior is correct and fail-closed
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none added. LAYOUT: none. BUNDLE: no dependency or lockfile delta; classification remains one bounded pass over changed paths.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the top commit changes CI scripts/tests, one local action, workflows, and lab-readiness tooling only. It changes no component implementation, story, style, asset, theme package, DOM, or rendered app output. Exact-head visual/a11y/RTL jobs intentionally skip because this workflow/script stack broad-defers; no manual Storybook/browser capture was required.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product accessibility, localization, locale, or direction implementation changes. This PR controls whether those changes receive evidence: every current non-test/doc i18n file and root naming source now broad-defer visual, a11y, and RTL; nested/exact/mixed/RTL controls remain clean.
VERDICT: clear
| slot | verdict |
|---|---|
| PROBLEM | clear |
| SOLUTION | BLOCKS — malformed grammar regressions are not isolated or pinned |
| ARCHITECTURE | clear |
| IMPACT | BLOCKS — future parser/action drift can leave focused suites green |
| API | clear |
| THEMING | clear |
| BREAKING | clear |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | clear |
GOAL: partly met — all requested runtime path/grammar outcomes, exact/broad/mixed cases, action parity, prior mutants, current-main integration, repository checks, and exact CI pass; the positional-parser and malformed-action mutants still pass the committed regression/contract suites. DISPOSITION: the false-positive malformed invocation test blocks now. Acceptance criteria: (1) each grammar case runs with otherwise valid input and asserts its expected stderr/exit; (2) removing positional rejection makes the helper test red; (3) appending a stray token to either composite-action command makes a checked-in action/readiness contract test red for that command shape; (4) all passing path, consumer, JSON/path, current-main, and CI behavior remains. ADVICE: bounded outcome criteria — isolate the failing variable in the existing test table and validate the full action command, rather than adding another parser owner. AUTHOR CAN PROCEED: yes — both surviving mutations, the false-positive input, and the required red outcomes are deterministic. WORST OUTCOME: “a positional-parser regression returns exact Button scope while all 30 malformed-invocation tests stay green” → request changes.
JUDGEMENT NEEDED: none — test correctness for an existing CI contract.
request changes
- The malformed invocation table fails later on the same invalid changed path, so it does not prove the grammar error it names.
→ a maintainer can remove positional rejection or drift an action command while all focused contract tests remain green ·
.github/scripts/lib/affected-scope.test.mjs:95-135→ confirmed independently by a parser mutant that succeeds on a valid Button path with 30/30 tests green, and an action-command mutant with 70/70 tests green while both executed arms fail on the stray token.
Semantic verdict: request changes
Thanks — runtime behavior is now right: the shared i18n runtime and root naming source defer together, and both action arms reject a stray token. The regression still is not pinned.
The malformed-CLI table gives every case ../bad/path.ts. Replacing positional rejection with continue lets a valid Button path accept stray-before, while all 30 tests stay green. Appending a stray token to both action commands likewise leaves all 70 helper/workflow/readiness tests green; only executing the action fails.
Could you give each grammar case otherwise-valid input, assert its expected error, and make the action-command mutant red?
[Reviewed by Robohands]
None — the defect spans the helper test and action/readiness contract.
- Exact head: 9 focused files / 182 tests; 12 changed JS/MJS syntax checks; exact actionlint,
git diff --check, andcheck:repopass. Custom matrix passes 256 assertions over 11 i18n runtime files, naming, exact Core/Lab, nested barrel, shared parser, Node/workspace, mixed, RTL, unique options, JSON, and changed paths. - Prior consumer-removal, consumer-inventory, shadow-parser, direct-helper, and i18n/naming mutants each red the intended suites; the restored exact worktree is byte-clean after every arm.
- Current-main synthetic integration passes 4 files / 103 tests, actionlint, syntax, and diff check; the temporary worktree was removed.
- Exact-head CI run 33193068818 has 18 successful checks/statuses, 5 intentional skips, and 0 failed/pending. Its check-components log executes the composite action and broad-defers the workflow/script stack as
browser-version-input.
TIME total 21m setup 4m exact head/parent, untrusted diff screening, fresh code/wiki worktrees, current kit/rubric, dependency clone reading 6m all seven Review-5632 rounds, full diff, repo authorities, classifier/action/workflow/readiness dataflow measuring 7m 182 tests, 256 assertions, seven mutations, syntax/actionlint/repo gates, exact CI, current-main integration writing 4m presentation, literal template gate, two critic passes, exact-head GitHub/wiki delivery waste 2m broad rubric/review reads truncated and were reread in bounded chunks; first mutation harness stopped before its final action arm
- PR-head Actions intentionally skipped exact Stable visual, pr-a11y, and pr-rtl because this workflow/script stack broad-defers; their exact and mixed branches were driven locally.
- The protected Release Gate and weekly RTL/a11y jobs were not dispatched. No Storybook/browser run was required for this non-rendering CI delta.
Critic pass 1 made three precision-only edits; critic pass 2 passed. Posted the exact final text in the self-authored GitHub COMMENT review; GitHub recorded COMMENTED at 185dc58b5ac39629d813789ebd6e2cccef7faaa9. This Round 8 record supersedes Round 7 at the prior head. No merge or auto-merge was enabled.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
ffe38f07ba7fd0761d35f70f15185b8aaeb7e263 — direct child of the exact-patch #5630 copy 6413ca02d148085ae130f282d7304437d09e7589; that parent's stable patch id 8aa2e884f0376fb120174a200871317dcf6658e8 matches approved #5630 head 04246c0051029d017e6aa76b3b649bc55bb622dc.
AUTHORITATIVE ROUND: Round 9 supersedes Round 8 at 185dc58b5ac39629d813789ebd6e2cccef7faaa9. Round 5's invalidated approval remains historical; this is the current exact-head disposition.
LOOP VERSION: 1.9.1
AUDIT RUBRIC: 1.14.4 (the official page header and newest history row; its stale Current line still says 1.14.3)
LANE: full WHY: this is a repeatedly blocked cross-workflow scope and CLI trust boundary; it requires the prior exact/broad/mixed/path/mutation matrix, real action execution, untrusted workflow screening, current-main integration, and exact-CI inspection.
Our Round 8 review at 185dc58b5ac39629d813789ebd6e2cccef7faaa9 found current runtime behavior correct but asked for each malformed grammar case to use otherwise-valid input, the positional-rejection mutant to turn red, and the malformed action command shape to be regression-pinned.
The current six-file delta is +183/−53: the composite shell wrapper becomes a 98-line ESM Node action, its metadata becomes using: node20 / main: index.mjs, and focused tests/readiness validation move to that contract. Current main is 7cb5bac59e62b8879a2cf036976204192d6055aa; only f0043d8f touches a reviewed path, adding five independent lines to ci.yml. A synthetic merge is clean and its four scope-contract files pass 104/104 with actionlint and syntax clean. Exact-head CI also ran the action from the GitHub merge ref against base d51dbad8009607dea1853b920071dc218d8d4362.
WHY 1: strict parser behavior needs a regression test that fails when each rejected grammar form becomes accepted.
WHY 2: a test that fails later on an unrelated malformed path gives maintainers a false green signal after positional validation is removed.
WHY 3: the next maintainer must be able to change the parser and trust the focused suite to expose an accidental widening before CI scope becomes permissive.
USER-FACING PROBLEM: the next maintainer can remove positional rejection, run the specifically named malformed-invocation suite, and be told all 31 tests pass while stray-before is accepted.
PROBLEM SEVERITY: broken task — the regression suite does not detect the defect it claims to pin.
NEW FEATURE CASE: not a new feature — this repairs and regression-proofs an existing CI evidence contract.
EARLY STOP: clear — the prior finding, exact-head test source, a one-variable parser mutant, and a valid-input direct probe establish the failure.
VERDICT: clear
The workflow now calls the shared classifier through a JavaScript action instead of assembling shell commands. The action accepts either changed-file text or an analysis artifact, validates paths, writes one JSON result, and exposes the same outputs to all four jobs. Its new happy-path test proves the entry executes; the unchanged malformed-CLI table still lets a parser bug hide behind a second invalid input.
SOLUTION (1 current-head runtime decision · 6 files, +183/−53)
- Replace the composite shell transport with one ESM Node action and update its metadata, readiness contract, and focused tests.
BURDEN: low for this round — one 98-line adapter, one metadata switch, one end-to-end test, and contract-fixture updates; no new dependency or workflow consumer. BURDEN MATCH: proportionate in runtime, incomplete in evidence — the new action removes the malformed shell-command seam, but the prior positional regression remains unpinned.
VERDICT: BLOCKS — removing positional rejection still leaves the focused helper suite green
OWNER: .github/scripts/lib/affected-scope.js owns dependency classification and helper CLI grammar; .github/actions/affected-scope/index.mjs is the environment-to-result adapter for PR workflows.
TIER 1: changed paths, Core/Lab roots, shared runtime/theme/browser/RTL inputs, four PR jobs, and protected-main deferral.
TIER 2: none.
SEAMS: changed-files action input, analysis-file action input, exact components, broad shared inputs, mixed exact+broad input, CLI subcommands/options/JSON/paths, action metadata, and current/legacy readiness parsing.
BEHAVIOR UNIT: pure utility plus one Node action adapter — deterministic and directly executable without a browser.
COMPLEXITY BUDGET: one classifier, one strict CLI, one shell-free action entry, four workflow consumers, zero shadow component parsers, and one failing regression per grammar defect.
ACTUAL BURDEN: #5632's top commit is 16 files, +1781/−217; Round 8→9 is 6 files, +183/−53. The action has one helper import and one result projection; all four workflows still use it; the focused suite is 9 files / 183 tests. The malformed CLI table uses one invalid path for every grammar row.
BURDEN TREND: Round 8→9 contracts the action transport from two shell command strings to one imported Node entry and leaves classifier ownership flat. Test authority does not contract: positional grammar can still drift without a red suite.
RESET TRIGGER: not triggered — runtime ownership is smaller and coherent; the remaining defect is one isolated regression-test false positive.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| dependency classification | affected-scope.js |
action/analysis/visual outputs | none found |
| action transport | index.mjs |
GitHub outputs + temp JSON | no shell run remains |
| workflow consumer set | action contract/readiness checks | four ci.yml uses |
no direct helper or legacy component parser found |
| helper CLI grammar | affected-scope.js |
malformed-invocation tests | test inputs do not isolate each grammar rule |
| seam | driven result |
|---|---|
| action metadata |
using: node20, main: index.mjs, zero shell run keys |
| action changed-files / analysis-file | both execute end to end and produce byte-equivalent classifier JSON; Node 20.20.2 passes locally |
| malformed action environment | both-input, unsafe path, and missing-output controls exit 1 with the intended message |
| action shell-run / no-op mutants | metadata mutant reds 3/40 contract assertions; no-op entry mutant reds the end-to-end test 1/31 |
| prior consumer removal/inventory/shadow-parser/direct-helper mutants | all red their intended workflow/readiness assertions |
| prior i18n/naming omission mutant | reds 4/64 exact helper/visual assertions |
| positional-rejection mutant | helper test remains 31/31 green; direct valid Button input accepts stray-before and returns exact Button scope |
VERDICT: clear — runtime ownership and action transport are coherent; the surviving defect is test fidelity
Current CI behavior is correct: malformed helper invocations fail and the Node action produces the expected exact/deferred outputs. The remaining gap reaches the next maintainer: removing one positional guard still passes the focused suite advertised as the contract, so permissive scope grammar can return without a regression signal. NEW FEATURE IMPACT: not a new feature.
VERDICT: BLOCKS — the regression suite can certify a parser that accepts stray positional input
No published package API change. Internal CI changes the action execution model from composite shell steps to a Node entry while keeping the existing input/output names.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
~ |
runs.using: composite → node20; main: index.mjs
|
internal action contract | existing affected-scope transport | metadata/tests | clear |
= |
changed-files / analysis-file and seven outputs |
internal workflow contract | existing four-consumer scope result | metadata/tests | clear |
= |
strict helper subcommands/options/JSON/path behavior | internal executable contract | existing readiness/helper seam | source/tests | clear at runtime; regression test blocks in SOLUTION/IMPACT |
OSSIFICATION: no consumer package surface. The internal action preserves its established names and outputs; the production contract is correct at this head.
VERDICT: clear
No product CSS, token, target, selector, or rendered theme output changes. parseStyleKey.ts, root naming.ts, and every current non-test/doc i18n runtime file still broad-defer visual, a11y, and RTL from the shared classifier.
VERDICT: clear
BEHAVIOR: yes inside CI — the action transport changes from shell to Node, while direct changed-files and analysis-file outputs remain equivalent and malformed action inputs fail closed. API: no published package API change. VISUAL: no product pixel, DOM, story, style, asset, or rendered theme change. THEME: no theme contract change; only evidence routing remains.
VERDICT: clear — current-head behavior is preserved and the removed shell-command seam is covered
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none added. LAYOUT: none. BUNDLE: no package or lockfile change. Each job invokes one Node process, reads one input, classifies one bounded changed-path list, writes one temporary JSON file, and appends seven outputs; no network or child process is added by the action.
VERDICT: clear
VISUAL CHECK: not applicable WHY: the delta and full top commit change CI scripts/tests, workflows, one local action, docs, and lab-readiness tooling only. No component implementation, story, style, asset, theme package, DOM, or rendered app output changes. No Storybook/browser capture was required.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product accessibility, localization, locale, or direction implementation changes. This PR controls whether those changes receive evidence: all 11 current non-test/doc i18n files, root naming.ts, four shared runtime representatives, parseStyleKey.ts, .nvmrc, workspace metadata, and five RTL inputs produce the expected visual/a11y/RTL outcomes. Mixed Button + Node-version + RTL input retains exact Button scope and all broad reasons.
VERDICT: clear
| slot | verdict |
|---|---|
| PROBLEM | clear |
| SOLUTION | BLOCKS — positional regression remains unpinned |
| ARCHITECTURE | clear |
| IMPACT | BLOCKS — focused tests can certify permissive grammar |
| API | clear |
| THEMING | clear |
| BREAKING | clear |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | clear |
GOAL: partly met — the action is a real shell-free Node action, changed-files/analysis parity and malformed-action mutants pass, every prior runtime/path/consumer mutation remains red, current-main integration passes, and exact CI is green; removing positional rejection still leaves all 31 helper tests green. DISPOSITION: the Round 8 positional-regression finding still blocks now. The malformed shell-action finding is resolved by construction and by red metadata/no-op mutants. ADVICE: bounded outcome criteria — give each grammar case otherwise-valid input and assert its intended stderr/exit so the one-variable positional mutant turns red. AUTHOR CAN PROCEED: yes — the surviving mutant, valid control input, expected error, and acceptance test are deterministic. WORST OUTCOME: “the next maintainer removes positional rejection and the focused contract suite says all 31 tests pass” → request changes.
JUDGEMENT NEEDED: none — regression-test correctness for an existing CI contract.
request changes
- The malformed invocation table still fails later on the same unsafe path instead of proving each grammar rejection.
→ a maintainer can re-allow positional tokens while the focused contract suite stays green ·
.github/scripts/lib/affected-scope.test.mjs:129-168→ confirmed independently by replacing the positional failure withcontinue: valid Button input succeeds and the committed helper suite remains 31/31 green.
Semantic verdict: request changes
Thanks — the Node action is now a real shell-free action; its metadata and end-to-end mutants fail. We previously asked for the positional regression to turn red, and that finding remains.
The malformed-CLI table still gives every case ../bad/path.ts. Replacing positional rejection with continue lets classify stray-before --changed-files-stdin accept valid Button.tsx, while all 31 helper tests stay green. That lets a future parser regression pass the suite meant to guard it.
Could each grammar case use otherwise-valid input and assert its intended stderr, so the positional mutant turns red?
[Reviewed by Robohands]
None — the defect is in the cross-case test setup rather than one product line.
- Exact head passes 9 focused files / 183 tests,
check:repo, action-entry ESLint, 19 changed-script syntax checks, exact actionlint, and diff-check. A direct 15-case grammar matrix verifies every current subcommand/option/JSON/path error by message; Node 20 action execution verifies both input forms and malformed environment errors. - Seven regression mutants red for their intended reason: consumer removal, inventory drift, shadow parser, direct helper, i18n/naming omission, action shell
run, and action-entry no-op. The positional mutant alone survives 31/31 and accepts valid Button input. - Exact-head CI run 33199258727 has 18 successful checks/statuses and 5 intentional skips, with 0 failed/pending; the real local action executes in check-components. Latest-main synthetic integration is clean and passes 104/104 focused contracts plus actionlint/syntax.
TIME total 18m setup 4m exact head/parent, untrusted workflow screening, fresh code/wiki checkouts, current authorities, dependency seed reading 5m all eight prior rounds, full diff, exact six-file delta, action/helper/workflow/readiness dataflow measuring 6m 183 tests, direct matrices, eight mutants, Node 20 action, repository gates, exact CI logs, current-main integration writing 3m presentation, literal template gate, two critic passes, GitHub/wiki delivery waste 2m large authority reads needed smaller chunks; one syntax command and the first mutation harness invocation were corrected and rerun
- Exact Stable visual, pr-a11y, and pr-rtl jobs intentionally skipped because this workflow/script stack broad-defers; their exact and mixed branches were driven locally, and the action itself ran in exact-head CI.
- Protected Release Gate and weekly RTL/a11y jobs were not dispatched. Scheduled Automations remained disabled and untouched. No Storybook/browser run was required for this non-rendering CI change.
Critic pass 1 added the explicit prior-review reconciliation; critic pass 2 passed. Posted the exact final text in the self-authored GitHub COMMENT review; GitHub recorded COMMENTED at ffe38f07ba7fd0761d35f70f15185b8aaeb7e263. This Round 9 record supersedes Round 8 at the prior head. No merge or auto-merge was enabled.
#5632 — fix(ci): trace affected PR check dependencies by @cixzhang (bucket: the maintainer)
ad79df2334de751fa54586ce17afb5985b4cee0f — direct child of the exact-patch #5630 copy 6413ca02d148085ae130f282d7304437d09e7589.
AUTHORITATIVE ROUND: Round 10 supersedes Round 9 at ffe38f07ba7fd0761d35f70f15185b8aaeb7e263. Round 5's invalidated approval remains historical; this is the current exact-head disposition.
LOOP VERSION: 1.9.1
AUDIT RUBRIC: 1.14.4 (the official page header and newest history row; its stale Current line still says 1.14.3)
LANE: full WHY: this is a repeatedly blocked cross-workflow scope and CLI test boundary; the final round must prove the prior surviving mutant turns red without losing runtime, action, path, deferral, drift, current-main, or exact-CI invariants.
Our Round 9 review at ffe38f07ba7fd0761d35f70f15185b8aaeb7e263 found the shell-free action and every prior runtime/path/consumer mutant sound, but asked for each malformed grammar case to use otherwise-valid input and assert its own stderr so removing positional rejection turns the focused helper test red.
The ffe38f07 → ad79df23 tree delta is exactly one test file, +100/−26: .github/scripts/lib/affected-scope.test.mjs. Every runtime, action, workflow, path classifier, visual/a11y/RTL consumer, parent-stack, and documentation byte is unchanged. Current main is c84106ba267929a9e7c4ad11e1fcda7895b9808e; only f0043d8f overlaps a PR path, the same independent ci.yml setup context already exercised by exact-head CI. A fresh synthetic merge is clean and its four scope-contract suites pass 104/104 with actionlint and syntax clean.
WHY 1: each rejected CLI grammar form needs a regression assertion that fails if that exact rejection disappears.
WHY 2: reusing one malformed changed path across every row lets a parser bug pass because a later path check still exits nonzero.
WHY 3: the next maintainer must be able to edit the parser and trust the focused suite to distinguish strict grammar from unrelated setup failure.
USER-FACING PROBLEM: the next maintainer previously could remove positional rejection and receive 31 green helper tests while classify stray-before --changed-files-stdin accepted an otherwise-valid Button path.
PROBLEM SEVERITY: broken task — the regression suite at the prior head did not detect the defect it claimed to pin.
NEW FEATURE CASE: not a new feature — this is test-only protection for an existing CI contract.
EARLY STOP: clear — the prior review, exact semantic delta, current test table, direct grammar matrix, and one-variable mutant establish the problem and fix.
VERDICT: clear
Each malformed CLI row now provides only the input needed for that case: otherwise-valid Button stdin or analysis JSON for grammar errors, malformed JSON only for JSON parsing, and unsafe paths only for path validation. Every row names its expected stderr as well as requiring nonzero exit and empty stdout. The production parser and action are untouched.
SOLUTION (1 decision · 0 runtime lines; 1 test file, +100/−26)
- Isolate the malformed CLI table so each grammar, JSON, and path case proves its own failure.
BURDEN: low — one existing test rewritten as case records with explicit input and expected stderr; no runtime owner, workflow, schema, dependency, or public surface changes. BURDEN MATCH: proportionate — the prior defect was a false-positive regression test, and the repair changes only that test's fixtures and assertions.
VERDICT: clear
OWNER: .github/scripts/lib/affected-scope.js remains the sole dependency-classification and helper-grammar owner; .github/actions/affected-scope/index.mjs remains the sole PR workflow adapter.
TIER 1: Core/Lab roots, shared runtime/theme/browser/RTL inputs, four PR job consumers, and protected-main deferral.
TIER 2: none.
SEAMS: CLI command, options, positional tokens, JSON and changed paths; action changed-files/analysis-file inputs; exact, broad, mixed, consumer, and current/legacy readiness paths.
BEHAVIOR UNIT: unchanged pure classifier plus Node action adapter; this round changes only its focused test oracle.
COMPLEXITY BUDGET: zero runtime decisions, zero new owners/representations/workflows, one isolated test table, and one red regression per grammar defect.
ACTUAL BURDEN: 1 test file, +100/−26 from Round 9; the full #5632 top commit remains 16 files, +1855/−217; no runtime, action, workflow, dependency, schema, or documentation delta from the reviewed runtime head.
BURDEN TREND: Round 9 → Round 10 is runtime-flat and test-only; the test oracle contracts each case to one failing variable instead of sharing an unrelated malformed path.
RESET TRIGGER: not triggered — runtime ownership was already coherent, and this repair adds no owner, representation, or guard.
| domain fact | one authoritative writable source | generated / immutable projections | other writable copies |
|---|---|---|---|
| dependency classification | affected-scope.js |
action, analysis, visual/a11y/RTL outputs | none found |
| helper CLI grammar | affected-scope.js |
case-specific immutable test expectations | none |
| action transport | index.mjs |
GitHub outputs and temporary JSON | no shell path |
| workflow consumer set | local action plus readiness/workflow contracts | four ci.yml uses |
no direct helper or shadow parser found |
| seam | driven result |
|---|---|
| prior positional mutant | valid Button stdin succeeds under the mutant, then the committed test fails at expect(result.status).not.toBe(0) with received 0 — the intended grammar assertion |
action shell-run metadata mutant |
3/40 workflow/readiness assertions fail, including the explicit no-run: contract |
| action-entry no-op mutant | the real E2E test fails at has_components=true, not at static metadata |
| consumer path / inventory / visual shadow parser / direct helper mutants | each fails its intended workflow/readiness contract |
| i18n + root naming omission mutant | 4/64 helper/visual assertions fail on the real paths |
| direct helper grammar | 15/15 command, option, positional, JSON, and path errors exit nonzero with the expected stderr and empty stdout |
| Node 20 action | changed-files and analysis-file modes produce equivalent exact Button + broad Node-version output; both-input, unsafe-path, and missing-output controls fail closed |
| path/deferral matrix | 171 assertions pass across 11 i18n runtime files, root naming, exact Core/Lab/nested barrel, shared parser, Node/workspace, mixed, and five RTL controls |
VERDICT: clear
The next maintainer now gets a red focused test when positional rejection is removed, and the failure points at the nonzero-status assertion for the otherwise-valid positional case. JSON and path rows still fail only for their own malformed inputs. The action, consumer, scope, and deferral contracts retain their prior mutation coverage. NEW FEATURE IMPACT: not a new feature.
VERDICT: clear
No published or runtime API changes. The internal CLI/action contract is byte-identical to Round 9; only its malformed-invocation test data and stderr assertions change.
| change | public? | class | doc'd? | verdict | |
|---|---|---|---|---|---|
~ |
malformed CLI case fixtures and expected stderr | test-only | existing strict helper grammar | test source | clear |
= |
helper CLI, action metadata/entry, seven outputs | internal runtime contract | existing affected-scope owner | source/tests | clear |
OSSIFICATION: no consumer or new internal runtime surface; this round only strengthens the test oracle for an existing contract.
VERDICT: clear
No CSS, token, target, selector, theme package, or rendered theme output changes. The unchanged shared parser and root naming paths still broad-defer visual, a11y, and RTL in the direct matrix and omission mutant.
VERDICT: clear
BEHAVIOR: no runtime behavior change from Round 9; helper, action, workflow, and scope bytes are identical. API: no published or internal runtime API change. VISUAL: no product pixels, DOM, stories, styles, assets, or rendered output change. THEME: no theme contract change.
VERDICT: clear
EFFECTS: zero.
| Effect + deps | external system | why render/handler cannot do it | measured render cost | lifetime + cleanup | focused test |
|---|---|---|---|---|---|
| none | none | n/a | n/a | n/a | n/a |
RENDER: no product render path. LISTENERS/OBSERVERS: none added or changed. LAYOUT: none. BUNDLE: no runtime, package, or lockfile delta; test execution adds only case-specific subprocess assertions.
VERDICT: clear
VISUAL CHECK: not applicable
WHY: the entire Round 9 → Round 10 delta is one non-rendering .test.mjs file. No component, story, style, asset, theme, DOM, or visible behavior changes; manual frames and Storybook are not applicable.
VERDICT: clear
REMEDY SEARCH: not triggered — no proven visual defect
No product accessibility, localization, locale, direction, or rendered behavior changes. The unchanged evidence-routing contract was re-driven: every current i18n runtime file plus root naming broad-defers visual/a11y/RTL, exact and mixed controls remain, and the omission mutant fails four intended assertions.
VERDICT: clear
| slot | verdict |
|---|---|
| PROBLEM | clear |
| SOLUTION | clear |
| ARCHITECTURE | clear |
| IMPACT | clear |
| API | clear |
| THEMING | clear |
| BREAKING | clear |
| PERFORMANCE | clear |
| VISUAL | clear |
| A11Y & I18N | clear |
GOAL: met — the semantic delta is test-only; the positional mutant now fails at the intended status assertion on valid Button input; malformed action and all prior scope/path/drift mutants remain red; clean focused, direct, current-main, repository, and exact-CI checks pass. DISPOSITION: the Round 9 positional-regression finding is satisfied; no new negative finding remains. ADVICE: omitted — no corrective action remains. AUTHOR CAN PROCEED: yes — undraft when the approved parent stack is ready. WORST OUTCOME: none found → approve once undrafted.
JUDGEMENT NEEDED: none — test-only repair of an existing CI contract.
approve once undrafted
Semantic verdict: approve once undrafted
Thanks — ad79df23 isolates every CLI error. Positional, action, and prior scope mutants fail; focused tests and exact-head CI are green.
[Reviewed by Robohands]
None.
- Exact head passes 9 focused files / 183 tests; the restored post-mutation contract subset passes 4 files / 104 tests; direct Node 20 grammar/action checks pass 15/15 errors, both action input modes, and three malformed-environment controls.
- Eight inspected one-variable mutants all turn red: positional rejection 1/31 at the intended status assertion; action shell metadata 3/40; action no-op 1/31 at the output assertion; consumer path, inventory, visual shadow parser, direct helper, and i18n/naming omission at their named contracts.
- Nineteen changed scripts pass syntax; action-entry ESLint, exact actionlint, diff-check, and
check:repopass. Current-main synthetic integration passes 104/104. Exact-head CI run 33202404798 has 18 successes and 5 intentional skips, with the real local action executing on the merge ref.
TIME total 20m setup 4m exact head/parent, untrusted workflow screening, fresh code/wiki worktrees, current kit/rubric, dependency seed reading 5m all nine prior rounds, full diff, exact test-only delta, source/action/workflow/readiness contracts measuring 8m 183 clean tests, 171 path assertions, direct Node 20 matrix, eight mutants, repository gates, CI logs, current-main integration writing 3m presentation, literal template gate, two critic passes, GitHub/wiki delivery waste 1m one mutation-output marker and one integration donor argument were corrected and rerun
- Exact Stable visual, pr-a11y, and pr-rtl jobs intentionally skipped because this workflow/script stack broad-defers; their exact and mixed scope branches were driven locally.
- Protected Release Gate and weekly RTL/a11y jobs were not dispatched. No Storybook/browser run was applicable.
Critic pass 1 tightened length and public-safe wording; critic pass 2 passed. Posted the exact final text in the self-authored GitHub COMMENT review; GitHub recorded COMMENTED at ad79df2334de751fa54586ce17afb5985b4cee0f. This Round 10 record supersedes Round 9 at the prior head.