Repository navigation
Conversation
… row (#291, part 2) Once design/interaction-model.md exists, bin/lib/interaction-model-check.sh (sourced by gate-check.sh) reports one FAIL per: - BRD role (top-level actors) with no row in the "Role homes" table; - BRD approval/user-task use case with neither an inbox row nor a stated reason; - design/wireframes/*.html without a valid `Page parameter:` line in its wf-contract block (Module.Entity or "none — <reason>"). Any un-waived finding fails Stage 3. Findings are waived by hand in the register ("Waived artifact interaction-model[/<unit>]: reason"); a project adopted above stage 3 reports ADOPTED. artifact-manifest.tsv gains the interaction-model row (stage 3, report-only), so a missing artifact reports PENDING through the artifact check. checkpoint-design.md asks "who lands where, and how does each role find its work" next to the layout question; brd-to-build-plan.md Step 7 reads wire points from the artifact (the build-plan consumer the manifest row cites). Fixture: tests/wave2/test-interaction-model-gate.sh — base 10 passed/19 failed, head 29/0. Synthetic trees only; no field run yet. Refs #291 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
…oles MANUAL, tighter task match, robust wf-contract parse
- Inbox coverage: any line under an "Inbox" heading (table row or -/*/1. bullet)
names a task; the skill's own Step 2 writes inboxes as bullets.
- Roles: BRD actors are not the confirmed role model, so an actor with no
"Role homes" row is MANUAL ("confirm it is a user role, or add a row
`none — <reason>`"), never FAIL; a `none — <reason>` row covers it.
- Task selection: title starts with approve/review/sign-off (after an
optional id prefix), title contains "user task", or mdlRefs names a user
task. "View approval history", "Configure approval thresholds" and
"Disapprove…" are no longer demanded an inbox.
- Wireframes: inline tags stripped before matching (<b>, <code>), block end
found by <div> depth, hyphen and en dash accepted next to the em dash,
CRLF read like LF.
- Wireframe FAILs print one remedy line (add the line, or waive per
wireframe) — the expected path for wireframes drawn before the model.
Fixture: the reviewer's probe trees are cases T3c, T9–T12. 44/0 on head,
27/17 on the previous head 986f4e7, 19/25 on the base branch.
Refs #291
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VJgWP5vEoAsNsJYqCDMGNw
This was referenced Oct 14, 2026
Merged
Owner
Author
|
After 1.0: part 2 of #291 is still not on master. This needs a rebase over bin/gate-check.sh and the one field run the description asks for. |
This was referenced Oct 21, 2026
Conflict: bin/gate-check.sh check_stage_3 — master added the process-map freshness check where this branch added the interaction-model verdict. Both kept: master's process-map check first, then the interaction-model case. Already on master and left as master has it: part 1 (#317) — skills/interaction-model.md, its routing row, design-artifacts.md Step 2b and the wf-contract block. Part 2 is not on master. CHANGELOG: this branch's two lines had landed inside the released v2026.10.19 section. They are now one line (the post-review wording) under Unreleased. Run against six Stage-3 worker outputs (a synthetic "puffin" requirements project from the Stage-3 A/B runs), comparing master's gate-check with this branch's. That found two defects, both fixed here: - A MANUAL interaction-model finding returned before the register check, so a project with no Stage-3 CONFIRMED decision reported MANUAL (exit 2) where master reports FAIL (2 of 6 runs). FAIL still returns early; MANUAL now replaces only a PASS. - A Role homes cell with a trailing note in parentheses ("Owner (signed-in User who owns dashboards)") did not name the role Owner (1 of 6 runs). The note is dropped before the match. Fixture cases T13 and T14: 44/4 on the pre-fix code, 48/0 on head. Refs #291 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018LeNWZV2sVH62vkgfYh5u5
…med remedy, read "Homes" headings (#291 review) Review fixes for #333: - Page parameter accepts a trailing parenthesised note after Module.Entity (`Puffin.Dashboard (new)`); `Puffin Dashboard` and `Puffin.Dashboard or none` still FAIL. design-artifacts.md Step 3 says a trailing (note) is allowed. - A Page parameter line that is there but malformed gets its own remedy (write the bare Module.Entity, optionally with a (note), or none — <reason>); the add-the-line remedy stays for a missing block or line. - An interaction-model FAIL at Stage 3 also says "; also: no Stage-3 CONFIRMED decision" when the register has none. - A heading naming "homes" (e.g. "Homes and inboxes") and a `Home` column read as the Role homes table; a heading naming both is read both ways, so inbox detection matches exactly the headings it did before. Fixture cases T15-T18 (each fails on the previous head). Re-run against the six Stage-3 worker outputs with a Stage-3 CONFIRMED row: S1, S3, PA2, PA3 PASS; S2, PA1 MANUAL (unmatched actor names). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018LeNWZV2sVH62vkgfYh5u5
…d as an inbox (review fix) The previous round made the inbox heading test unconditional, so a heading such as 'Role homes and inbox notes' over a role table counted that table as inbox coverage (a false PASS). Restore the 'role homes' exclusion; 'Homes and inboxes' is still read both ways. New fixture case T18c fails on 97c9d89 (61/1) and passes here (62/0). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_018LeNWZV2sVH62vkgfYh5u5
…del-gate-v2 # Conflicts: # CHANGELOG.md
…del-gate-v2 # Conflicts: # CHANGELOG.md
…del-gate-v2 # Conflicts: # CHANGELOG.md
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Direct lane
Supersedes #332. These are the same two commits as #332, replayed onto master after the integration batch (#329) squash-merged. The tree is identical to #332's head
c236e62plus master's #330 changes.Review status. An independent review returned MERGE-AFTER-FIX, the fixes landed as
c236e62, and a confirmation review returned MERGE atc236e62. Minor follow-ups remain: "Review audit log" is a false FAIL; an id-only mention under Inbox counts as covered; "Order approval" is missed withoutmdlRefs; a<td>-split contract line is not parsed. This needs one field run on a real project before merging (CLAUDE.md "Shipping an instrument", rule 4).What changed and why (one paragraph):
Part 1 (#317) added
skills/interaction-model.mdand the wireframewf-contractblock, but nothing yet noticed when the artifact was missing or incomplete. This PR adds the facts half and leaves judgement in the skill.bin/lib/artifact-manifest.tsvgains aninteraction-modelrow (stage 3, report-only). Ifdesign/interaction-model.mdis missing, the artifact check reports itPENDINGout loud. This does not block.bin/lib/interaction-model-check.shis sourced bygate-check.shafter the artifact block. Its findings print underInteraction model (stage 3 facts):with denominators:design/wireframes/*.htmlwhosewf-contractblock has no validPage parameter:line.check_stage_3turns any un-waived FAIL into a Stage-3 FAIL. If the only open findings are MANUAL ones, Stage 3 is MANUAL (exit 2).checkpoint-design.mdgains Q1b, "who lands where, and how does each role find its work", asked next to the layout question.brd-to-build-plan.mdStep 7 gets one sentence telling the build plan to read its wire points from the artifact. Without it, the manifest row's build-plan consumer would be a false citation.Changes after review (c236e62):
Inbox coverage. Any line under an "Inbox" heading covers a task: a table row, a
-or*bullet, or a numbered item. The skill's own Step 2 writes inboxes as bullets.Roles. A BRD actor with no Role homes row is now MANUAL. The message names the actor and says: confirm it is a user role, or add a
| <actor> | none — <reason> |row (system actor / merged into another role). Anone — <reason>row counts as covered.Which use cases count as tasks. A use case is checked only when:
UC013:); ormdlRefsnames a user task."View approval history", "Configure approval thresholds" and "Disapprove…" no longer FAIL, and fixture cases assert that.
Wireframe parser.
<b>Page parameter:</b> Sales.Orderand<code>Sales.Order</code>read.wf-contractblock is found by counting<div>depth, not by taking the first</div>.none — <reason>may be a hyphen, an en dash or an em dash, and HTML entities for the dashes are decoded.Projects that write the interaction model mid-build. The Stage-3 check runs again on every gate run. A project that writes
design/interaction-model.mdduring the build therefore gets one FAIL per wireframe drawn before the model existed. That is intended. The FAIL output now ends with one remedy line: add<p>Page parameter: …</p>to the wireframe'swf-contractblock, or waive that wireframe withWaived artifact interaction-model/<file>.html: <reason>.Ambiguities, resolved narrowly:
bin/script reads a role model from PROJECT.md. The only role list anybin/script reads is the BRD top-levelactors, inbin/brd-report.sh, so that is the source. Because it is not the confirmed role model, a missing actor is MANUAL only.RoleandHome page. Inbox lines are any lines under a heading containing "Inbox".UC002covers that id in every BRD. Waivers and FAIL lines use<BRD id>/<UC id>.design/wireframes/*.html, the glob as written.Waived artifact interaction-model: …waives the whole artifact. This is the artifact check's existing hand-written line.Waived artifact interaction-model/<unit>: …waives one finding. The unit is an actor name,<BRD>/<UC>, or a wireframe file name.Waived stage 3does not hide these FAILs, which is consistent withwaiver_applies.PENDING, not a FAIL. This follows the part-2 design rather than the issue's acceptance criterion 4, so projects already past Stage 3 are not suddenly blocked.Field evidence: none yet. This has run only on synthetic project trees, including the independent reviewer's probe trees, reproduced as fixture cases T3c and T9–T12. A field run is still owed on a real project the maintainer chooses.
No client data anywhere in the diff
Size cap: within cap, excluding the fixture and CHANGELOG
Test tier: fixture level, on synthetic trees.
tests/wave2/test-interaction-model-gate.shresults:986f4e7c236e62Existing fixtures on head, all with 0 failed:
test-bug03-gates.shtest-source-sufficiency-gate.shtest-source-ledger.shtest-closeout.shtest-wrong-verdicts.shtest-wireframe-count.shNew instrument, golden input: synthetic, built from the skill shapes and the reviewer's probes, not captured from a real project.
analysis/<name>/.jq, which gate-check already requires; no mac-only tools; CRLF covered. Not run on Git Bash.CHANGELOG line, credited "field retro (Usability/flow defects pass every gate: proposal for a Stage-3 interaction-model deliverable and gate #291)"
Checks run (head
c236e62): all exit 0.bin/render-routing.sh --check: in sync. Baseline is 74,959 words before and after;checkpoint-design.mdis not in the always-on set.bin/check-scripts.shbin/check-portability.shLEAKGUARD_ALLOW_NO_DENYLIST=1 bin/check-no-client-data.shbin/check-pr-discipline.sh origin/masterRisks:
design/interaction-model.mdcan turn red at Stage 3. A project that writes it mid-build gets one FAIL per legacy wireframe, with the remedy line shown above.none — <reason>row.brd-to-build-plan.mdandcheckpoint-design.mdtriggers the protocol-changed notice at stages 3 and 4.Refs #291
Update 2026-11-03
Head
c90aad0. This mergesorigin/master(dbd9b3e, 155 commits) into the branch. There was no rebase and no force-push.Merge. There was one conflict, in
bin/gate-check.shcheck_stage_3. Master had added the process-map freshness check (design/process-model.json→process-map.html) at the same spot where this branch adds the interaction-model verdict. Both are kept: master's process-map check runs first, then the interaction-model case. Every other file merged cleanly. The manifest row now sits next to master's newprocess-maprow, andartifact-check.sh's helpers (_art_field,_art_adopted_stage,_art_rank) still exist with the same signatures after master's register-cache rewrite (#583).Dropped, because master already has it. Part 1 (#317) is on master:
skills/interaction-model.md, its routing row,design-artifacts.mdStep 2b, and thewf-contractblock. This branch never touched those files, so nothing was removed from the diff. Part 2 (the check, the manifest row, Q1b and the Step 7 sentence) is not on master; it is all still here. One part of the CHANGELOG was dropped: the branch's two lines had ended up inside the releasedv2026.10.19section. They are now one line under## Unreleased, using the post-review wording.Verdict-flip analysis (what changes for an existing project after
sync-project.sh). The check is called from the toolkit'sbin/, sosync-project.shcopies nothing new into the project. The change reaches a project with the nextgit pull.PENDINGand the facts line reports PENDING. The Stage-3 verdict does not change (fixture T2).interaction-model.mdwritten by the Stage 3 workers, and it can now go from PASS to FAIL or MANUAL.c90aad0. In 2 of 6 runs Stage 3 went FAIL → MANUAL (exit 2). The MANUAL return ran before the register check, so a MANUAL role finding hid "no Stage-3 CONFIRMED decision". Now a FAIL still returns early, and a MANUAL only replaces a PASS. Fixture T13.Owner (signed-in User who owns dashboards), did not name the roleOwner(1 of 6 runs). The note in parentheses is now dropped before matching. Fixture T14.Page parameter: Puffin.Dashboard (new)orPuffin.ViewContext (built from …)and FAIL as "neither Module.Entity nor none — ". That is correct underdesign-artifacts.md("exactly that form"), but workers produce the shape often. Accepting a trailing parenthetical would be a one-line parser change.User (as owner)for actorOwner, which is also MANUAL. Both are correct MANUALs.Test evidence (head
c90aad0, scoped fixtures only). Every run exited 0.test-interaction-model-gate.shtest-bug03-gates.shtest-process-map.shtest-closeout.shtest-wrong-verdicts.shtest-wireframe-count.shtest-source-ledger.shtest-source-sufficiency-gate.shThese scripts also exit 0:
bin/check-scripts.sh,bin/check-portability.sh,LEAKGUARD_ALLOW_NO_DENYLIST=1 bin/check-no-client-data.sh, andbin/check-pr-discipline.sh origin/master.Word delta.
bin/render-routing.sh --checkis in sync. Baseline is 64,252 words on master and on head, against a budget of 80,000, so the delta is 0. None of the changed skill files is in the always-loaded set.Still owed. A field run on a client project the maintainer chooses (rule 4). The worker-output probe above was run, but it is not that field run.
Review: pending independent review
🤖 Generated with Claude Code