enhance(#2151): probe interactive-control for loading and error states#2575
enhance(#2151): probe interactive-control for loading and error states#2575davesienkowski wants to merge 2 commits into
Conversation
The ui-consideration-probe taxonomy mapped interactive-control to only one consideration (long-text), so a control-only UI surface (e.g. a theme toggle) lifted no loading or error consideration — the verifier never asked what a control shows while its action is in flight or when it fails, and a spec omitting those states could PASS. Add 'interactive-control' to the loading and error entries' elements in UI_TAXONOMY so control-only surfaces are probed for in-flight and failure states. empty is deliberately excluded (a control is not data-bearing; empty would be Goodhart noise). No new categories, no cue-map change, no probe-core change — a widening within the closed shape-rooted 8 (ADR-550), an independently-versionable predicate- generator adapter (ADR-857). Regenerated the reference-doc coverage table and the 19 golden-install- parity fixtures (reference-doc hash). Regression test added first (RED: interactive-control yielded only long-text; GREEN: now error+loading+long-text). Closes #2151
trek-e
left a comment
There was a problem hiding this comment.
Summary
This is a clean, tightly-scoped enhancement: it adds interactive-control to the loading and error entries of UI_TAXONOMY in src/ui-consideration-probe.cts, so a control-only UI surface (button/toggle/switch/slider) now gets probed for its in-flight and failure states, not just long-text. The implementation matches the approved issue exactly, the fail-first regression test is valid, the reference-doc/golden-fixture cascade is complete and consistent, and the changeset is well-formed. One title/classification issue needs fixing before merge.
Classification & gate compliance
Issue #2151 carries approved-enhancement (not approved-feature) — correctly matched to the Enhancement PR template, which the body follows section-for-section. Closes #2151 present. Changeset .changeset/bold-deer-caper.md is well-formed (type: Changed, real pr: 2575, no placeholder). no-docs label is a legitimate, script-recognized opt-out here — docs/AGENTS.md has no prior mention of this taxonomy, and the actual canonical doc (gsd-core/references/ui-consideration-probe.md) is updated in-diff. No new ADR needed; the change aligns with ADR-550's mixed-axis boundary and ADR-857's core-default-generator model, verified directly against both ADR files rather than taking the PR body's claim at face value.
However, the PR title feat(#2151): … will misfile this PR under "Feature" in the GitHub auto-generated release notes. This repo's own classifier (scripts/release-notes/conventional-title.cjs, wired into pr-title-validator.yml and documented in CONTRIBUTING.md:873) buckets any feat-prefixed title as "Feature" regardless of the linked issue's track — but #2151 is explicitly approved-enhancement, and CONTRIBUTING.md:249 shows the established token for this exact situation is enhance(#N): …. The title-validator CI only checks shape, not this semantic mismatch, so it's green despite the mis-bucket. Please retitle to enhance(#2151): … before merge.
Functional checklist
- Loading now probes
interactive-control— met (src/ui-consideration-probe.cts:101) - Error now probes
interactive-control— met (src/ui-consideration-probe.cts:102) emptydeliberately not added — met, matches the issue's own Goodhart-noise rationale- No new consideration ids, element kinds, cue changes, or
probe-corechanges — met, diff is exactly the 2-line widen plus the required cascade
Blast radius
applicableCategories (ui-consideration-probe.cts) has exactly 2 callers, both in the same file/module (proposeConsiderations, proposeElements), zero cross-repo callers, and no cross-module graph issues on the actual diff. Fully contained to this one adapter, as the PR claims.
Co-change completeness
All expected companions are present: changeset fragment, reference-doc coverage table, all 19 golden-install-parity fixtures (consistent single new hash, no divergence), and the extended test suite. Nothing missing.
Findings
Blockers
None.
Major
None.
Minor
- PR title
feat(#2151): …mis-buckets this enhancement under "Feature" in the GitHub release notes perscripts/release-notes/conventional-title.cjs'sFEATURE_REanchor, contradicting the issue'sapproved-enhancementtrack andCONTRIBUTING.md's ownenhance(#N): …convention for this case. Retitle toenhance(#2151): …before merge. (Not unique to this PR — I found the same pattern on the previously-merged #1421 — but it's still a real, fixable defect in this title.)
Nits
None.
Verdict
Request changes — retitle the PR (feat → enhance) so the release notes bucket matches the issue's approved-enhancement track; everything else is clean and ready to merge once that's fixed.
Files/paths referenced in this review (all absolute, on the PR head or next as noted):
src/ui-consideration-probe.cts(PR head, lines 99–108) — theUI_TAXONOMYwidengsd-core/references/ui-consideration-probe.md(PR head, lines 30–32) — coverage-table cascade.changeset/bold-deer-caper.md(PR head) — changeset fragmenttests/ui-consideration-probe.test.cjs(PR head, lines 86–88) — new regression test/Users/trekkie/projects/gsd-core/CONTRIBUTING.md:231-249,873— PR-title convention + feat→Feature mapping/Users/trekkie/projects/gsd-core/scripts/release-notes/conventional-title.cjs:20-44—FEATURE_RE/classifyBucket()/Users/trekkie/projects/gsd-core/scripts/changeset/render.cjsandgithub-release-notes.cjs— confirmed CHANGELOG.md itself is unaffected (driven by changesettype:frontmatter, not PR title)/Users/trekkie/projects/gsd-core/docs/adr/857-capability-system.md:96,docs/adr/550-spec-phase-probe-contract.md— ADR conformance verification/Users/trekkie/projects/gsd-core/scripts/lint-docs-required.cjs— confirmedno-docslabel legitimacy
Memtrace Evidence
-
get_symbol_context(applicableCategories, ui-consideration-probe.cts): 2 callers, both in-file; 0 cross-repo. -
get_impact: bare-name lookup hit a same-named symbol in edge-probe.cts (name collision, disregarded); file-scoped context is the trustworthy signal. -
recall_decision/governing_contracts: clean (ADR-550/857 verified directly). -
find_cross_module_issues: 0.get_cochange_context: 19 goldens + reference doc + test present — no gap. -
find_code_review_issues: 0 issues on the diff.
Enhancement PR
Linked Issue
Closes #2151
What this enhancement improves
The
ui-consideration-probeadapter (src/ui-consideration-probe.cts) — its element-kind → consideration coverage map (UI_TAXONOMY). A UI surface classified only asinteractive-control(a button/toggle/switch/slider) previously lifted probe coverage forlong-textonly — noloadingorerrorconsideration — even though a control commonly has an in-flight state (submit spinner, disabled-while-pending) and a failure state.Before / After
Before:
After:
A control-only surface is now probed for its in-flight and failure states, so at ui-phase Step 9.5 a genuinely-missing loading/error state surfaces as an unresolved consideration (→ honest human-routing, #1154) instead of passing unnoticed.
How it was implemented
Added
'interactive-control'to theelementsarrays of theloadinganderrorentries inUI_TAXONOMY(src/ui-consideration-probe.cts). That is the whole logic change —applicableCategories(the relevance intersection) does the rest.probe-corechange. A widening within the closed shape-rooted 8 (ADR-550); the adapter is core-default but independently versionable (ADR-857).emptydeliberately excluded — a control is not data-bearing, so an "empty" prompt would be false-positive Goodhart noise (per the approved issue).gsd-core/references/ui-consideration-probe.mdcoverage table and the 19golden-install-parityfixtures (reference-doc hash) — the Enhancement: UI-specific edge-probe taxonomy for gsd-ui-checker (exogenous alternative to persona) #1867 cascade discipline.src/*.cts, built tobin/libper ADR-457.Testing
How I verified the enhancement works
Regression test written first and watched fail, then pass:
applicableCategories(['interactive-control'])returned['long-text']→ the new assertion for['error','loading','long-text']failed.build:lib): fullui-consideration-probesuite 41/41; probe suites (ui-consideration-probe+probe-core+edge-probe) 180 pass / 0 fail;golden-install-parity19/19;npm run lint:ciexit 0 (eslint + generated-sync + all sub-lints).≥1 category per element kindinvariant still holds; no existing assertion pinnedinteractive-control's set, so nothing was rewritten — only a new assertion added.Platforms tested
Runtimes tested
Scope confirmation
CONSIDERATIONS→UI_TAXONOMYrename Dave noted on re-validation; fix applies verbatim)Documentation
The coverage table in
gsd-core/references/ui-consideration-probe.md(the installed, agent-read reference — the canonical doc for this taxonomy) is updated in lockstep. Nodocs/prose enumerates this per-element map, sono-docsis applied.Checklist
Closes #2151(hasapproved-enhancement)bin/libbuild drift forapi-coverage/state-transitionwas discarded, not shipped)npm run lint:cipass.changeset/fragment added (Changed);no-docslabel applied (canonical doc is the payload reference, updated)Breaking changes
None. Strictly additive coverage for
interactive-control; every other element kind's coverage is unchanged andapplicableCategories([]) === []holds. The only observable change — more considerations lifted for control-only surfaces — is captured in the regenerated golden fixtures (disclosed per Hyrum).Need help on this PR? Tag
@codesmith-botwith what you need. Autofix is disabled.