rcf-lite 0.28.4 → 0.29.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/CHANGELOG.md +107 -1
  2. package/bin/rcf.js +4 -0
  3. package/fixtures/canary-manifest.json +9 -9
  4. package/guidance/define-draft-shapes.md +89 -0
  5. package/guidance/define-intake.md +97 -0
  6. package/guidance/define-intent.md +107 -0
  7. package/guidance/discover-prototype.md +67 -0
  8. package/guidance/discovery-prototypes.md +69 -0
  9. package/guidance/harness-template.md +34 -0
  10. package/guidance/managed/agent-instructions-block.hash +1 -1
  11. package/guidance/managed/agent-instructions-block.md +34 -0
  12. package/guidance/manifest.json +9 -2
  13. package/package.json +1 -1
  14. package/rcf/adrs/adr-4124-define-freeze-verb.json +30 -0
  15. package/rcf/adrs/adr-4126-persona-tagged-blockers-two-levels.json +40 -0
  16. package/rcf/adrs/adr-4127-readiness-tab-order-and-register.json +40 -0
  17. package/rcf/adrs/adr-4129-questions-harness-driven-loop.json +25 -0
  18. package/rcf/adrs/adr-4130-intake-harness-split-tool-scanned.json +20 -0
  19. package/rcf/adrs/adr-4132-prototypes-in-discovery-as-evidence.json +20 -0
  20. package/rcf/adrs/adr-4133-dag-dependency-depth-layout.json +40 -0
  21. package/rcf/adrs/adr-4134-index-json-route.json +35 -0
  22. package/rcf/adrs/adr-4135-readiness-po-register-and-adapter.json +35 -0
  23. package/rcf/adrs/adr-4136-embedding-host-fixture.json +35 -0
  24. package/rcf/code-nodes/cn-725.json +18 -2
  25. package/rcf/code-nodes/cn-726.json +10 -2
  26. package/rcf/code-nodes/cn-727.json +13 -4
  27. package/rcf/code-nodes/cn-728.json +18 -2
  28. package/rcf/code-nodes/cn-729.json +10 -2
  29. package/rcf/code-nodes/cn-730.json +13 -3
  30. package/rcf/code-nodes/cn-731.json +20 -0
  31. package/rcf/code-nodes/cn-732.json +14 -0
  32. package/rcf/code-nodes/cn-733.json +14 -0
  33. package/rcf/code-nodes/cn-734.json +14 -0
  34. package/rcf/code-nodes/cn-735.json +20 -0
  35. package/rcf/code-nodes/cn-736.json +14 -0
  36. package/rcf/code-nodes/cn-737.json +14 -0
  37. package/rcf/code-nodes/cn-738.json +14 -0
  38. package/rcf/code-nodes/cn-739.json +18 -0
  39. package/rcf/code-nodes/cn-740.json +19 -0
  40. package/rcf/code-nodes/cn-741.json +16 -0
  41. package/rcf/code-nodes/cn-742.json +16 -0
  42. package/rcf/code-nodes/cn-743.json +15 -0
  43. package/rcf/code-nodes/cn-744.json +22 -0
  44. package/rcf/code-nodes/cn-745.json +16 -0
  45. package/rcf/code-nodes/cn-746.json +14 -0
  46. package/rcf/code-nodes/cn-747.json +18 -0
  47. package/rcf/code-nodes/cn-748.json +16 -0
  48. package/rcf/code-nodes/cn-749.json +16 -0
  49. package/rcf/code-nodes/cn-750.json +15 -0
  50. package/rcf/code-nodes/cn-751.json +18 -0
  51. package/rcf/code-nodes/cn-752.json +14 -0
  52. package/rcf/fbs/fbs-196.json +13 -5
  53. package/rcf/fbs/fbs-198.json +42 -0
  54. package/rcf/fbs/fbs-199.json +59 -0
  55. package/rcf/fbs/fbs-200.json +46 -0
  56. package/rcf/fbs/fbs-201.json +49 -0
  57. package/rcf/fbs/fbs-202.json +110 -0
  58. package/rcf/fbs/fbs-203.json +100 -0
  59. package/rcf/requirements/req-002.json +2 -2
  60. package/rcf/requirements/req-173.json +2 -2
  61. package/rcf/requirements/req-174.json +10 -4
  62. package/rcf/requirements/req-175.json +10 -4
  63. package/rcf/requirements/req-176.json +25 -0
  64. package/rcf/requirements/req-180.json +31 -0
  65. package/rcf/requirements/req-181.json +31 -0
  66. package/rcf/requirements/req-182.json +25 -0
  67. package/rcf/requirements/req-186.json +25 -0
  68. package/rcf/requirements/req-187.json +31 -0
  69. package/rcf/requirements/req-188.json +25 -0
  70. package/rcf/tacs/tac-4121-define-ledgers.json +15 -3
  71. package/rcf/tacs/tac-4122-define-gates.json +40 -4
  72. package/rcf/tacs/tac-4123-define-readiness.json +39 -3
  73. package/rcf/tacs/tac-4124-define-freeze.json +28 -0
  74. package/rcf/tacs/tac-4127-readiness-view.json +49 -0
  75. package/rcf/tacs/tac-4128-define-guidance.json +53 -0
  76. package/rcf/tacs/tac-4129-define-questions.json +45 -0
  77. package/rcf/tacs/tac-4130-define-intake-brief.json +35 -0
  78. package/rcf/tacs/tac-4131-build-dag-view.json +39 -0
  79. package/rcf/tacs/tac-4132-id-lookup.json +42 -0
  80. package/rcf/tacs/tac-4133-readiness-po-layer.json +37 -0
  81. package/rcf/tacs/tac-4134-wespa-host-fixture.json +54 -0
  82. package/rcf/test-suites/ts-016.json +3 -3
  83. package/rcf/test-suites/ts-215.json +148 -4
  84. package/rcf/test-suites/ts-216.json +19 -3
  85. package/rcf/test-suites/ts-218.json +78 -0
  86. package/rcf/test-suites/ts-219.json +70 -0
  87. package/rcf/test-suites/ts-220.json +78 -0
  88. package/rcf/test-suites/ts-221.json +78 -0
  89. package/rcf/test-suites/ts-222.json +100 -0
  90. package/rcf/test-suites/ts-223.json +94 -0
  91. package/rcf/test-suites/ts-224.json +70 -0
  92. package/rcf/test-suites/ts-225.json +78 -0
  93. package/rcf/test-suites/ts-226.json +158 -0
  94. package/rcf/test-suites/ts-227.json +38 -0
  95. package/rcf/test-suites/ts-228.json +86 -0
  96. package/rcf/test-suites/ts-229.json +83 -0
  97. package/rcf/user-stories/us-17302.json +50 -0
  98. package/rcf/user-stories/us-17401.json +14 -2
  99. package/rcf/user-stories/us-17402.json +55 -0
  100. package/rcf/user-stories/us-17403.json +60 -0
  101. package/rcf/user-stories/us-17502.json +60 -0
  102. package/rcf/user-stories/us-17503.json +65 -0
  103. package/rcf/user-stories/us-17601.json +58 -0
  104. package/rcf/user-stories/us-18001.json +55 -0
  105. package/rcf/user-stories/us-18002.json +35 -0
  106. package/rcf/user-stories/us-18101.json +35 -0
  107. package/rcf/user-stories/us-18202.json +40 -0
  108. package/rcf/user-stories/us-18601.json +55 -0
  109. package/rcf/user-stories/us-18602.json +50 -0
  110. package/rcf/user-stories/us-18603.json +45 -0
  111. package/rcf/user-stories/us-18701.json +50 -0
  112. package/rcf/user-stories/us-18702.json +50 -0
  113. package/rcf/user-stories/us-18801.json +45 -0
  114. package/rcf/user-stories/us-204.json +59 -0
  115. package/rcf/user-stories/us-205.json +64 -0
  116. package/rcf/user-stories/us-206.json +54 -0
  117. package/releases/releases.yaml +11 -1
  118. package/src/cli/freeze.js +730 -0
  119. package/src/cli/help.js +12 -0
  120. package/src/cli/ledger.js +228 -12
  121. package/src/cli/questions.js +288 -0
  122. package/src/cli/readiness.js +267 -49
  123. package/src/cli/view.js +29 -0
  124. package/src/define/freeze-record.js +30 -15
  125. package/src/define/ledgers.js +210 -11
  126. package/src/intake/index.js +1 -1
  127. package/src/intake/orchestrator.js +117 -0
  128. package/src/mcp/tools.js +354 -0
  129. package/src/query/delta.js +6 -0
  130. package/src/query/gates.js +314 -39
  131. package/src/query/index.js +16 -2
  132. package/src/query/questions.js +438 -0
  133. package/src/query/readiness.js +248 -7
  134. package/src/server/index.js +24 -2
  135. package/src/server/routes.js +68 -1
  136. package/src/setup/identity-seed.js +17 -0
  137. package/src/view/build-dag.js +563 -0
  138. package/src/view/components/badge.js +41 -0
  139. package/src/view/components/diff.js +72 -0
  140. package/src/view/components/doc-row.js +62 -0
  141. package/src/view/components/empty-state.js +35 -0
  142. package/src/view/components/entity-selector.js +137 -0
  143. package/src/view/components/filter-bar.js +97 -0
  144. package/src/view/components/findings-list.js +49 -0
  145. package/src/view/components/index.js +12 -0
  146. package/src/view/components/pill.js +46 -0
  147. package/src/view/components/sub-tab-strip.js +43 -0
  148. package/src/view/components/toast.js +25 -0
  149. package/src/view/components-fixture.js +265 -0
  150. package/src/view/doc-renderers/architecture.js +304 -0
  151. package/src/view/doc-renderers/build.js +160 -0
  152. package/src/view/doc-renderers/index.js +2 -0
  153. package/src/view/doc-renderers/prd.js +35 -6
  154. package/src/view/html-page.js +700 -602
  155. package/src/view/index.js +96 -3
  156. package/src/view/live-client.js +39 -6
  157. package/src/view/needs-work.js +79 -0
  158. package/src/view/page-init.js +2193 -0
  159. package/src/view/readiness/phrasebook.js +115 -0
  160. package/src/view/readiness/po-layer.js +288 -0
  161. package/src/view/readiness/question-adapter.js +329 -0
  162. package/src/view/readiness/stage-legend.js +71 -0
  163. package/src/view/readiness.js +505 -0
  164. package/src/view/style.css +2017 -382
  165. package/src/view/test-host/embed-client.js +121 -0
  166. package/src/view/test-host/fixture.js +183 -0
  167. package/src/view/test-host/lints.js +220 -0
  168. package/src/view/view-index.js +323 -0
@@ -0,0 +1,100 @@
1
+ {
2
+ "createdAt": "2026-10-01T16:00:00Z",
3
+ "updatedAt": "2026-10-01T16:00:00Z",
4
+ "purpose": "Cover US-17503: --level and --persona flags, the exit matrix (section 3.2), the two verdict lines (section 2.3) and the persona-grouped text report (section 4) of the DEFINE step 2 persona-levels spec. Shares `formatVerdictLines` with the Readiness tab (PR C).",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-17503-1",
8
+ "AC-17503-2",
9
+ "AC-17503-3",
10
+ "AC-17503-4",
11
+ "AC-17503-5",
12
+ "AC-17503-6",
13
+ "AC-17503-7",
14
+ "AC-17503-8",
15
+ "AC-17503-9"
16
+ ],
17
+ "id": "TS-222",
18
+ "usId": "US-17503",
19
+ "title": "rcf define readiness --level / --persona flags, exit matrix and verdict wording",
20
+ "testCases": [
21
+ {
22
+ "id": "TC-222-exit-matrix",
23
+ "acId": "AC-17503-1",
24
+ "description": "Parameterised exit matrix across all rows of spec section 3.2 (no flag, --check <stage>, --check all, --level intent, --level build, --level + --check).",
25
+ "status": "pending",
26
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-1 exit matrix (parameterised: --check + --level combinations)"
27
+ },
28
+ {
29
+ "id": "TC-222-level-intent-pass",
30
+ "acId": "AC-17503-2",
31
+ "description": "--level intent exits 0 on a tree where every PO check passes.",
32
+ "status": "pending",
33
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-2 --level intent exits 0 when PO is clean"
34
+ },
35
+ {
36
+ "id": "TC-222-level-intent-fail",
37
+ "acId": "AC-17503-3",
38
+ "description": "--level intent exits 4 when any PO check fails.",
39
+ "status": "pending",
40
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-3 --level intent exits 4 when PO fails"
41
+ },
42
+ {
43
+ "id": "TC-222-level-build-strict-ack",
44
+ "acId": "AC-17503-4",
45
+ "description": "--level build exits 4 on an unacknowledged D3 failure even when every blocking stage passes; the [warn] line still prints.",
46
+ "status": "pending",
47
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-4 --level build exits 4 on a failing tree and prints warn lines for unacked warn-with-ack stages"
48
+ },
49
+ {
50
+ "id": "TC-222-check-all-unchanged",
51
+ "acId": "AC-17503-5",
52
+ "description": "--check all exit behaviour unchanged on a warn-with-ack-only failure: 0 with a stderr [warn] line.",
53
+ "status": "pending",
54
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-5 --check all unchanged on warn-with-ack"
55
+ },
56
+ {
57
+ "id": "TC-222-persona-collapses-other",
58
+ "acId": "AC-17503-6",
59
+ "description": "--persona productOwner collapses the engineer block to one line and leaves the exit code identical to the no-flag invocation; same for engineer and the PO block.",
60
+ "status": "pending",
61
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-6 --persona filters text and does not change exit"
62
+ },
63
+ {
64
+ "id": "TC-222-unknown-values-exit-2-level",
65
+ "acId": "AC-17503-7",
66
+ "description": "--level ship exits 2 with the usage line naming intent|build.",
67
+ "status": "pending",
68
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-7 unknown --level exits 2 with usage line"
69
+ },
70
+ {
71
+ "id": "TC-222-unknown-values-exit-2-persona",
72
+ "acId": "AC-17503-7",
73
+ "description": "--persona architect exits 2 with the usage line naming productOwner|engineer.",
74
+ "status": "pending",
75
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-7 unknown --persona exits 2 with usage line"
76
+ },
77
+ {
78
+ "id": "TC-222-json-meta-level",
79
+ "acId": "AC-17503-8",
80
+ "description": "--json --level intent emits _meta.level === 'intent' and carries levels and personas.",
81
+ "status": "pending",
82
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-8 --json --level intent carries _meta.level and preserves levels + personas"
83
+ },
84
+ {
85
+ "id": "TC-222-text-persona-grouping",
86
+ "acId": "AC-17503-9",
87
+ "description": "On a failing tree the text report puts the product-owner block before the engineer block and every per-check line carries the persona inside the parenthesis after over.",
88
+ "status": "pending",
89
+ "testPointer": "test/cli/readiness.test.js::readiness cli: AC-17503-9 text report groups PO before engineer with persona in detail lines"
90
+ },
91
+ {
92
+ "id": "TC-222-verdict-lines-four-strings",
93
+ "acId": "AC-17503-1",
94
+ "description": "formatVerdictLines builds the four exact strings in spec section 2.3 (L1 ok, L1 not ok, L2 ok, L2 not ok) from crafted fixture results.",
95
+ "status": "pending",
96
+ "testPointer": "test/query/readiness.test.js::readiness (ADR-4126): formatVerdictLines returns the section 2.3 wording"
97
+ }
98
+ ],
99
+ "status": "draft"
100
+ }
@@ -0,0 +1,94 @@
1
+ {
2
+ "createdAt": "2026-10-01T18:00:00Z",
3
+ "updatedAt": "2026-10-01T18:00:00Z",
4
+ "purpose": "Cover US-18001 (Readiness as tab 1 and the PRD rename) and US-18101 (shared pill, findings-list and diff components). Shares the readiness fixture builders with TS-222 so the tab and the CLI assertions ride the same shapes.",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-18001-1",
8
+ "AC-18001-2",
9
+ "AC-18001-3",
10
+ "AC-18001-4",
11
+ "AC-18001-5",
12
+ "AC-18001-6",
13
+ "AC-18001-7",
14
+ "AC-18101-1",
15
+ "AC-18101-2",
16
+ "AC-18101-3"
17
+ ],
18
+ "id": "TS-223",
19
+ "usId": "US-18001",
20
+ "title": "Readiness tab layout, PRD rename and shared pill, findings-list and diff components",
21
+ "testCases": [
22
+ {
23
+ "id": "TC-223-tab-order-and-rename",
24
+ "acId": "AC-18001-1",
25
+ "description": "First tab button is Readiness, second is PRD; the PRD panel contains the former Overview body unchanged.",
26
+ "status": "pending",
27
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-1 tab order and PRD rename"
28
+ },
29
+ {
30
+ "id": "TC-223-verdict-pills-match-cli",
31
+ "acId": "AC-18001-2",
32
+ "description": "The two verdict pills carry formatVerdictLines(result) strings as labels; variant pins the verdict family and the value class carries yes/no.",
33
+ "status": "pending",
34
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-2 verdict pill labels equal formatVerdictLines"
35
+ },
36
+ {
37
+ "id": "TC-223-po-blockers-as-findings-list",
38
+ "acId": "AC-18001-3",
39
+ "description": "Each PO blocker renders as a findings list headed by its question with its ids as anchor links into the document tabs.",
40
+ "status": "pending",
41
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-3 PO blockers render as findings lists with id anchors"
42
+ },
43
+ {
44
+ "id": "TC-223-register-orders-persona-groups",
45
+ "acId": "AC-18001-4",
46
+ "description": "With a profile register of productOwner, the PO group is expanded first and the engineer group collapses with its count visible.",
47
+ "status": "pending",
48
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-4 register orders the pair and collapses the opposite"
49
+ },
50
+ {
51
+ "id": "TC-223-no-blocker-id-omitted",
52
+ "acId": "AC-18001-5",
53
+ "description": "Under any register, every PO blocker id and every engineer blocker id appears somewhere in the DOM.",
54
+ "status": "pending",
55
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-5 no blocker id is omitted from the DOM"
56
+ },
57
+ {
58
+ "id": "TC-223-freeze-now-disabled",
59
+ "acId": "AC-18001-6",
60
+ "description": "When levels.readyToBuild.ok is false the Freeze now control is disabled and names the failing gates from levels.readyToBuild.blockedBy.",
61
+ "status": "pending",
62
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-6 Freeze now is disabled and names the failing gates"
63
+ },
64
+ {
65
+ "id": "TC-223-ids-on-tab-match-cli-json",
66
+ "acId": "AC-18001-7",
67
+ "description": "Walking the rendered anchors and matching against the --json for the same tree hash: every id on the tab is present in the JSON.",
68
+ "status": "pending",
69
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18001-7 every id on the tab appears in the CLI --json for the same tree"
70
+ },
71
+ {
72
+ "id": "TC-223-pill-vocabulary",
73
+ "acId": "AC-18101-1",
74
+ "description": "pill renders the same markup shape with a per-value vocabulary class for a gate state, a level verdict, a persona and an AC class.",
75
+ "status": "pending",
76
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18101-1 pill emits one shape with per-value vocabulary classes"
77
+ },
78
+ {
79
+ "id": "TC-223-findings-list-markup",
80
+ "acId": "AC-18101-2",
81
+ "description": "findingsList called with identical inputs from the Readiness and Product Map call paths returns byte-identical markup.",
82
+ "status": "pending",
83
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18101-2 findingsList is byte-identical across call sites"
84
+ },
85
+ {
86
+ "id": "TC-223-no-existing-tab-tests-change",
87
+ "acId": "AC-18101-3",
88
+ "description": "No existing Product Map or Requirements test expectation changes; only the Readiness-specific additions land.",
89
+ "status": "pending",
90
+ "testPointer": "test/view/readiness-tab.test.js::readiness tab: AC-18101-3 existing Product Map and Requirements tests retain their expectations"
91
+ }
92
+ ],
93
+ "status": "draft"
94
+ }
@@ -0,0 +1,70 @@
1
+ {
2
+ "createdAt": "2026-10-02T19:00:00Z",
3
+ "updatedAt": "2026-10-02T19:00:00Z",
4
+ "purpose": "Cover US-204 (engineer sees the FBS DAG): depth columns from dependsOnFbsIds, click-to-highlight closure, inspector with needs/waits links and Open-in-Specs, deep links on #tab=build&sub=dag&entity=<id>, filters that keep the selection, cycle handling and the no-outbound-postMessage guard. Points at the twelve new DAG unit tests under test/view/build-tab.test.js.",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-204-1",
8
+ "AC-204-2",
9
+ "AC-204-3",
10
+ "AC-204-4",
11
+ "AC-204-5",
12
+ "AC-204-6",
13
+ "AC-204-7"
14
+ ],
15
+ "id": "TS-224",
16
+ "usId": "US-204",
17
+ "title": "Build/DAG sub-tab: layout, closure, inspector, deep links, filters, cycles, no outbound postMessage",
18
+ "testCases": [
19
+ {
20
+ "id": "TC-224-depth-columns",
21
+ "acId": "AC-204-1",
22
+ "description": "buildDagLayout places every connected FBS in a column whose index equals its longest dependency depth from dependsOnFbsIds; rows inside a column are ordered by buildOrder ascending.",
23
+ "status": "pending",
24
+ "testPointer": "test/view/build-tab.test.js::buildDagLayout: columns are dependency-depth tiers from dependsOnFbsIds (AC-204-1)"
25
+ },
26
+ {
27
+ "id": "TC-224-closures-upstream-downstream",
28
+ "acId": "AC-204-2",
29
+ "description": "buildDagLayout carries upstream and downstream closures transitively per node; renderBuildDag outlines upstream in link colour and downstream in warning (checked via data-rcf-dag-role on nodes and edges in the client wiring markers).",
30
+ "status": "pending",
31
+ "testPointer": "test/view/build-tab.test.js::buildDagLayout: closures carry upstream and downstream transitively (AC-204-2 / AC-204-3)"
32
+ },
33
+ {
34
+ "id": "TC-224-inspector-payload",
35
+ "acId": "AC-204-3",
36
+ "description": "buildDagInspectorPayload emits status, area, buildOrder, acCount, buildable, needs and waits (direct + transitive totals) plus needsMeta/waitsMeta for every node, so the client inspector lists them without recomputing the layout.",
37
+ "status": "pending",
38
+ "testPointer": "test/view/build-tab.test.js::buildDagInspectorPayload: carries status/area/order/AC/buildable + needs and waits (AC-204-3)"
39
+ },
40
+ {
41
+ "id": "TC-224-hash-round-trip",
42
+ "acId": "AC-204-4",
43
+ "description": "page-init.js carries the Build/DAG wiring: click-to-highlight writes #tab=build&sub=dag&entity=<id>, applyBuildHash restores the selection and scrolls the node into view (auto-pressing Show-unconnected when the restored node sits in the unconnected lane).",
44
+ "status": "pending",
45
+ "testPointer": "test/view/build-tab.test.js::page-init.js carries the Build/DAG wiring (click-to-highlight, hash round-trip, filters)"
46
+ },
47
+ {
48
+ "id": "TC-224-filters-keep-selection",
49
+ "acId": "AC-204-5",
50
+ "description": "DAG filter chips (status, area, Buildable-now, Critical-path, Show-unconnected) in the DagToolbar; applyDagFilters keeps the current selection intact across toggles; renderBuildDag emits the toolbar with the six filter controls and the unconnected count.",
51
+ "status": "pending",
52
+ "testPointer": "test/view/build-tab.test.js::renderBuildDag: toolbar renders status chips, area select, three toggles and the unconnected count"
53
+ },
54
+ {
55
+ "id": "TC-224-cycle-handling",
56
+ "acId": "AC-204-6",
57
+ "description": "buildDagLayout surfaces cycle members as cycleIds and excludes them from the depth layout; non-cycle FBS still render.",
58
+ "status": "pending",
59
+ "testPointer": "test/view/build-tab.test.js::buildDagLayout: cycles are surfaced as cycleIds and excluded from depth layout (AC-204-6)"
60
+ },
61
+ {
62
+ "id": "TC-224-no-outbound-postmessage",
63
+ "acId": "AC-204-7",
64
+ "description": "The rendered Build tab slice (DAG panel) does not contain any postMessage( call site; the inspector payload rides on a data-rcf-dag-inspector-data attribute, not a function call.",
65
+ "status": "pending",
66
+ "testPointer": "test/view/build-tab.test.js::Build/DAG renderer never emits window.postMessage (AC-204-7, no outbound postMessage)"
67
+ }
68
+ ],
69
+ "status": "draft"
70
+ }
@@ -0,0 +1,78 @@
1
+ {
2
+ "createdAt": "2026-10-03T00:00:00Z",
3
+ "updatedAt": "2026-10-03T00:00:00Z",
4
+ "purpose": "Cover US-205 (engineer jumps to any document or AC by id): id-first ranking (exact / prefix / contains), word-match title above snippet, single-char ids-only, hash pick lands and expands the entity, mount URL round-trip, embed/theme preservation, empty-state on fetch failure, no outbound postMessage / storage / cookies. Points at the 22 new unit tests under test/view/id-lookup.test.js.",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-205-1",
8
+ "AC-205-2",
9
+ "AC-205-3",
10
+ "AC-205-4",
11
+ "AC-205-5",
12
+ "AC-205-6",
13
+ "AC-205-7",
14
+ "AC-205-8"
15
+ ],
16
+ "id": "TS-225",
17
+ "usId": "US-205",
18
+ "title": "ID lookup: ranking, hash pick, embed/theme round-trip, empty state, no outbound side effects",
19
+ "testCases": [
20
+ {
21
+ "id": "TC-225-id-exact-prefix-first",
22
+ "acId": "AC-205-1",
23
+ "description": "rankLookupRows ranks an exact id match first, a prefix match second and a contains match third; the first ranked row is pre-highlighted in the LookupModal shell.",
24
+ "status": "pending",
25
+ "testPointer": "test/view/id-lookup.test.js::rankLookupRows: exact id ranks first (AC-205-1)"
26
+ },
27
+ {
28
+ "id": "TC-225-word-title-above-snippet",
29
+ "acId": "AC-205-2",
30
+ "description": "rankLookupRows ranks a word match in the title above a word match in the snippet when the id does not match; every query word must match title or snippet.",
31
+ "status": "pending",
32
+ "testPointer": "test/view/id-lookup.test.js::rankLookupRows: a title match ranks above a snippet-only match (AC-205-2)"
33
+ },
34
+ {
35
+ "id": "TC-225-single-char-ids-only",
36
+ "acId": "AC-205-3",
37
+ "description": "rankLookupRows with a one-character query returns only id matches; the title / snippet word-match pass is skipped.",
38
+ "status": "pending",
39
+ "testPointer": "test/view/id-lookup.test.js::rankLookupRows: single-character queries search ids only (AC-205-3)"
40
+ },
41
+ {
42
+ "id": "TC-225-pick-writes-hash",
43
+ "acId": "AC-205-4",
44
+ "description": "wireLookup pick writes `#tab=<tab>&entity=<id>` through writeHash; the Router activates the tab, opens every ancestor DocRow and the entity, scrolls into view and flashes the target.",
45
+ "status": "pending",
46
+ "testPointer": "test/view/id-lookup.test.js::page-init.js carries the wireLookup contract: Cmd/Ctrl+F binding, lazy fetch, up/down/Enter/Esc"
47
+ },
48
+ {
49
+ "id": "TC-225-mount-url-round-trip",
50
+ "acId": "AC-205-5",
51
+ "description": "A mount URL of `?tab=requirements&entity=US-304` lands on the same position at first paint via the Router (PR 1 contract), independent of the LookupModal.",
52
+ "status": "pending",
53
+ "testPointer": "test/view/id-lookup.test.js::page-init.js urlWithHash preserves ?tab=&entity= + any other query at mount (AC-205-5)"
54
+ },
55
+ {
56
+ "id": "TC-225-embed-theme-preserved",
57
+ "acId": "AC-205-6",
58
+ "description": "A pick with `?embed=1&theme=dark` on the URL leaves both query params in place; only the hash fragment changes. Verified against writeHash + the hash-preservation helpers.",
59
+ "status": "pending",
60
+ "testPointer": "test/view/id-lookup.test.js::page-init.js writeHash preserves ?embed= and ?theme= through every pick (AC-205-6)"
61
+ },
62
+ {
63
+ "id": "TC-225-empty-state-on-fetch-failure",
64
+ "acId": "AC-205-7",
65
+ "description": "A non-2xx / malformed `./index.json` response renders the empty state (The index could not be loaded.) with a visible Reload index button; no result rows show; the reload affordance re-fetches on click.",
66
+ "status": "pending",
67
+ "testPointer": "test/view/id-lookup.test.js::renderLookupModal carries the empty-state + reload affordance markers (AC-205-7)"
68
+ },
69
+ {
70
+ "id": "TC-225-no-outbound-side-effects",
71
+ "acId": "AC-205-8",
72
+ "description": "wireLookup never calls window.postMessage, never writes to localStorage / sessionStorage / document.cookie, and makes no outbound fetch other than `./index.json`; asserted by a source-level scan of page-init.js (no postMessage, no storage, no cookie writes in wireLookup).",
73
+ "status": "pending",
74
+ "testPointer": "test/view/id-lookup.test.js::page-init.js does not add outbound postMessage, localStorage, sessionStorage or cookies in the lookup wiring (AC-205-8)"
75
+ }
76
+ ],
77
+ "status": "draft"
78
+ }
@@ -0,0 +1,158 @@
1
+ {
2
+ "createdAt": "2026-10-02T18:00:00Z",
3
+ "updatedAt": "2026-10-02T18:00:00Z",
4
+ "purpose": "Cover US-18601 (the question set), US-18602 (the verb and the tools) and US-18603 (write-back and termination): computeQuestions turns every failing PO item into a question carrying its write-back; the CLI verb and the MCP tool emit the same object; the scripted loop converges; engineer edits never re-open the PO loop.",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-18601-1",
8
+ "AC-18601-2",
9
+ "AC-18601-3",
10
+ "AC-18601-4",
11
+ "AC-18601-5",
12
+ "AC-18601-6",
13
+ "AC-18601-7",
14
+ "AC-18602-1",
15
+ "AC-18602-2",
16
+ "AC-18602-3",
17
+ "AC-18602-4",
18
+ "AC-18602-5",
19
+ "AC-18602-6",
20
+ "AC-18603-1",
21
+ "AC-18603-2",
22
+ "AC-18603-3",
23
+ "AC-18603-4",
24
+ "AC-18603-5"
25
+ ],
26
+ "id": "TS-226",
27
+ "usId": "US-18601",
28
+ "title": "DEFINE step 3 PR 2: computeQuestions, the questions verb, MCP tools and loop convergence",
29
+ "testCases": [
30
+ {
31
+ "id": "TC-226-q-shape",
32
+ "acId": "AC-18601-1",
33
+ "description": "On a fixture failing brief:openQuestions, skeleton:resolvedBy and stories:reqHasUs, computeQuestions(persona=productOwner) returns one entry per failing item with id, stage, check, itemId, heading, ask, answerKinds, writeBack and blocks intent.",
34
+ "status": "pending",
35
+ "testPointer": "test/query/questions.test.js::AC-18601-1: openQuestions + resolvedBy + reqHasUs failing items each produce one question with the full shape"
36
+ },
37
+ {
38
+ "id": "TC-226-q-deterministic",
39
+ "acId": "AC-18601-2",
40
+ "description": "Two consecutive computeQuestions runs on the same tree return deep-equal questions[] ordered D1, D2, D4, D7 then by source span.",
41
+ "status": "pending",
42
+ "testPointer": "test/query/questions.test.js::AC-18601-2: two runs are deep-equal and ordered D1, D2, D4, D7 then by source span"
43
+ },
44
+ {
45
+ "id": "TC-226-q-optional-decisions",
46
+ "acId": "AC-18601-3",
47
+ "description": "An open decision with two options and a default appears in optional[] with blocks build and not in questions[].",
48
+ "status": "pending",
49
+ "testPointer": "test/query/questions.test.js::AC-18601-3: a two-option decision with a default appears in optional[], not questions[]"
50
+ },
51
+ {
52
+ "id": "TC-226-q-empty-when-ok",
53
+ "acId": "AC-18601-4",
54
+ "description": "On a tree where levels.intentComplete.ok, computeQuestions(persona=productOwner) returns ok:true and empty questions[].",
55
+ "status": "pending",
56
+ "testPointer": "test/query/questions.test.js::AC-18601-4: ok tree returns ok:true and empty questions[]"
57
+ },
58
+ {
59
+ "id": "TC-226-q-engineer-persona",
60
+ "acId": "AC-18601-5",
61
+ "description": "computeQuestions(persona=engineer) returns one entry per failing engineer item in failing stages with blocks build.",
62
+ "status": "pending",
63
+ "testPointer": "test/query/questions.test.js::AC-18601-5: persona engineer returns engineer blockers in failing stages, blocks: build"
64
+ },
65
+ {
66
+ "id": "TC-226-q-usage-error",
67
+ "acId": "AC-18601-6",
68
+ "description": "computeQuestions throws a usage error naming productOwner and engineer when given any other persona value.",
69
+ "status": "pending",
70
+ "testPointer": "test/query/questions.test.js::AC-18601-6: unknown persona throws naming the accepted values"
71
+ },
72
+ {
73
+ "id": "TC-226-q-writes-nothing",
74
+ "acId": "AC-18601-7",
75
+ "description": "computeQuestions never creates or modifies a file under rcf/ (mtime guard); every writeBack.command names a verb registered in the CLI help.",
76
+ "status": "pending",
77
+ "testPointer": "test/query/questions.test.js::AC-18601-7: computeQuestions is pure; every writeBack.command names a registered verb"
78
+ },
79
+ {
80
+ "id": "TC-226-cli-json",
81
+ "acId": "AC-18602-1",
82
+ "description": "rcf define questions --json on a failing tree prints the computeQuestions object to stdout and exits 0.",
83
+ "status": "pending",
84
+ "testPointer": "test/cli/questions.test.js::AC-18602-1: --json on a failing tree prints the questions object and exits 0"
85
+ },
86
+ {
87
+ "id": "TC-226-cli-persona-default",
88
+ "acId": "AC-18602-2",
89
+ "description": "Without --persona, the verb picks engineer on a profile whose register is engineer, else productOwner.",
90
+ "status": "pending",
91
+ "testPointer": "test/cli/questions.test.js::AC-18602-2: persona defaults from profile register"
92
+ },
93
+ {
94
+ "id": "TC-226-cli-stage-limit",
95
+ "acId": "AC-18602-3",
96
+ "description": "--stage skeleton --limit 2 caps questions[] to two D2 entries and reports remaining counting every D2 item.",
97
+ "status": "pending",
98
+ "testPointer": "test/cli/questions.test.js::AC-18602-3: --stage brief --limit 1 caps the output but keeps remaining honest"
99
+ },
100
+ {
101
+ "id": "TC-226-mcp-parity",
102
+ "acId": "AC-18602-4",
103
+ "description": "MCP tool rcf_define_questions returns structuredContent deep-equal to the verb's --json output on the same tree.",
104
+ "status": "pending",
105
+ "testPointer": "test/mcp/define-questions.test.js::AC-18602-4: rcf_define_questions structuredContent deep-equals the verb --json"
106
+ },
107
+ {
108
+ "id": "TC-226-cli-usage-persona",
109
+ "acId": "AC-18602-5",
110
+ "description": "--persona architect exits 2 with the usage line naming productOwner and engineer.",
111
+ "status": "pending",
112
+ "testPointer": "test/cli/questions.test.js::AC-18602-5: --persona architect exits 2 naming productOwner and engineer"
113
+ },
114
+ {
115
+ "id": "TC-226-cli-writes-nothing",
116
+ "acId": "AC-18602-6",
117
+ "description": "No file under rcf/ is created or modified during any invocation of rcf define questions.",
118
+ "status": "pending",
119
+ "testPointer": "test/cli/questions.test.js::AC-18602-6: questions writes nothing under rcf/"
120
+ },
121
+ {
122
+ "id": "TC-226-loop-convergence",
123
+ "acId": "AC-18603-1",
124
+ "description": "Scripted loop fixture: applying each writeBack and recomputing drives questions count strictly down each turn and to zero.",
125
+ "status": "pending",
126
+ "testPointer": "test/query/questions-loop.test.js::AC-18603-1: scripted loop converges strictly to zero within a bounded number of turns"
127
+ },
128
+ {
129
+ "id": "TC-226-loop-new-req",
130
+ "acId": "AC-18603-2",
131
+ "description": "A statement resolved to a new REQ carrying description and domain passes skeleton:reqIntent and raises stories:reqHasUs once.",
132
+ "status": "pending",
133
+ "testPointer": "test/query/questions-loop.test.js::AC-18603-2: a new REQ with description and domain passes reqIntent and asks reqHasUs once"
134
+ },
135
+ {
136
+ "id": "TC-226-loop-l1-draft-stable",
137
+ "acId": "AC-18603-3",
138
+ "description": "At L1, adding [draft] entities, TAC stubs and interfaces leaves intentComplete.ok true and the PO question set empty.",
139
+ "status": "pending",
140
+ "testPointer": "test/query/questions-loop.test.js::AC-18603-3: at L1 adding engineer-only draft entities keeps the PO question set empty"
141
+ },
142
+ {
143
+ "id": "TC-226-loop-decision-wellformed",
144
+ "acId": "AC-18603-4",
145
+ "description": "An openQuestion promoted to a decision with one option and no default makes decisions:wellFormed ask once and brief:openQuestions pass.",
146
+ "status": "pending",
147
+ "testPointer": "test/query/questions-loop.test.js::AC-18603-4: an openQuestion promoted to a one-option decision asks decisions:wellFormed once"
148
+ },
149
+ {
150
+ "id": "TC-226-loop-engineer-isolation",
151
+ "acId": "AC-18603-5",
152
+ "description": "No product-owner check changes from ok to failing after an engineer-only edit.",
153
+ "status": "pending",
154
+ "testPointer": "test/query/questions-loop.test.js::AC-18603-5: an engineer-only edit never changes the PO question set"
155
+ }
156
+ ],
157
+ "status": "draft"
158
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "createdAt": "2026-10-03T09:30:00Z",
3
+ "updatedAt": "2026-10-03T09:30:00Z",
4
+ "purpose": "Cover US-18002 (the Readiness tab renders question cards grouped by source span): the questions block lists each group with its asks and every id is in the JSON (AC-18002-1), the empty questions set renders the intent-complete verdict line (AC-18002-2), and engineer blockers are never removed from the DOM in any register (AC-18002-3). Points at the three AC tests under test/view/readiness-po-layer.test.js.",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-18002-1",
8
+ "AC-18002-2",
9
+ "AC-18002-3"
10
+ ],
11
+ "id": "TS-227",
12
+ "usId": "US-18002",
13
+ "title": "Readiness PO question cards: groups and asks, intent-complete empty state, engineer DOM preserved across registers",
14
+ "testCases": [
15
+ {
16
+ "id": "TC-227-groups-and-asks",
17
+ "acId": "AC-18002-1",
18
+ "description": "renderReadinessPO is given a readiness object with questions[] non-empty; every group label, every ask and every question id appears in the panel, and data-rcf-source=\"readiness.questions\" is stamped so the source path is unambiguous.",
19
+ "status": "pending",
20
+ "testPointer": "test/view/readiness-po-layer.test.js::PO layer: AC-18002-1 given questions[] non-empty, the block lists each group with its asks and every id is in the JSON"
21
+ },
22
+ {
23
+ "id": "TC-227-empty-questions-verdict",
24
+ "acId": "AC-18002-2",
25
+ "description": "renderReadinessPO is given a clean readiness object with both levels ok and no blockers; the panel renders the exact intent-complete verdict line (formatVerdictLines(result).intentComplete) inside the questions block and marks the section data-rcf-empty=\"yes\".",
26
+ "status": "pending",
27
+ "testPointer": "test/view/readiness-po-layer.test.js::PO layer: AC-18002-2 given questions[] empty, the block shows the intent-complete verdict line"
28
+ },
29
+ {
30
+ "id": "TC-227-engineer-dom-preserved",
31
+ "acId": "AC-18002-3",
32
+ "description": "renderReadinessPanel across every register (null / productOwner / engineer) keeps every engineer blocker id in the DOM, keeps every PO blocker id in the DOM and renders the CLI verdict strings verbatim inside the For-engineers DocRow; the For-engineers DocRow is closed under productOwner / unstated and open under engineer.",
33
+ "status": "pending",
34
+ "testPointer": "test/view/readiness-po-layer.test.js::PO layer: AC-18002-3 engineer blockers are not removed from the DOM in any register"
35
+ }
36
+ ],
37
+ "status": "draft"
38
+ }
@@ -0,0 +1,86 @@
1
+ {
2
+ "createdAt": "2026-10-03T00:00:00Z",
3
+ "updatedAt": "2026-10-03T00:00:00Z",
4
+ "purpose": "Cover US-18801 (the draft homes) and US-18202 (the DEFINE-stage guidance pack): parseInterfaceDraft and shapes:draftSettled extended to TAC.purpose, coreEntities[].description and TAC.interfaces[].description with the three id forms; a draft-only tree is L1-neutral; the guidance manifest advertises the two new slugs and five prompts; the register scan rejects an em-dash in any new guidance file; the managed block regeneration keeps every existing rule.",
5
+ "testLevel": "unit",
6
+ "acIds": [
7
+ "AC-18801-1",
8
+ "AC-18801-2",
9
+ "AC-18801-3",
10
+ "AC-18801-4",
11
+ "AC-18801-5",
12
+ "AC-18202-1",
13
+ "AC-18202-2",
14
+ "AC-18202-3",
15
+ "AC-18202-4"
16
+ ],
17
+ "id": "TS-228",
18
+ "usId": "US-18801",
19
+ "title": "DEFINE step 3 PR 3: draft marker extension, DISCOVERY prototypes guidance and prompts",
20
+ "testCases": [
21
+ {
22
+ "id": "TC-228-draft-coreentity",
23
+ "acId": "AC-18801-1",
24
+ "description": "A coreEntities entry whose description starts with [draft] fails shapes:draftSettled with id TAD.entity:<name>.",
25
+ "status": "pending",
26
+ "testPointer": "test/query/gates.test.js::gates (REQ-188, AC-18801-1): draft on coreEntity description fails draftSettled with TAD.entity:<name>"
27
+ },
28
+ {
29
+ "id": "TC-228-draft-tac-purpose",
30
+ "acId": "AC-18801-2",
31
+ "description": "A TAC whose purpose starts with [draft] fails shapes:draftSettled with id <tacId>; shapes:tacHasInterface counts the TAC as present.",
32
+ "status": "pending",
33
+ "testPointer": "test/query/gates.test.js::gates (REQ-188, AC-18801-2): draft on TAC.purpose fails draftSettled with <tacId>, tacHasInterface counts it present"
34
+ },
35
+ {
36
+ "id": "TC-228-draft-cleared",
37
+ "acId": "AC-18801-3",
38
+ "description": "When every [draft] marker across the three homes is cleared, shapes:draftSettled passes.",
39
+ "status": "pending",
40
+ "testPointer": "test/query/gates.test.js::gates (REQ-188, AC-18801-3): three draft homes cleared, draftSettled passes"
41
+ },
42
+ {
43
+ "id": "TC-228-draft-template-markers",
44
+ "acId": "AC-18801-4",
45
+ "description": "A [draft] recordShape without fields: fails shapes:templateMarkers exactly as a settled one. (shapes:templateMarkers lands in PR 5; this TC is pending PR 5.)",
46
+ "status": "pending",
47
+ "testPointer": "test/query/gates.test.js::gates (REQ-188, AC-18801-4 pending PR 5): draft recordShape without fields fails templateMarkers"
48
+ },
49
+ {
50
+ "id": "TC-228-draft-no-po-read",
51
+ "acId": "AC-18801-5",
52
+ "description": "No productOwner check reads any [draft] content: every productOwner check on a draft-only tree is ok (L1-neutral).",
53
+ "status": "pending",
54
+ "testPointer": "test/query/gates.test.js::gates (REQ-188, AC-18801-5): draft-only tree keeps every productOwner check ok (L1-neutral)"
55
+ },
56
+ {
57
+ "id": "TC-228-guidance-prints",
58
+ "acId": "AC-18202-1",
59
+ "description": "rcf guidance define-intent and rcf guidance discovery-prototypes each print their file byte-faithfully.",
60
+ "status": "pending",
61
+ "testPointer": "test/guidance/verbs.test.js::guidance (REQ-182, AC-18202-1): rcf guidance define-intent and discovery-prototypes each print their file"
62
+ },
63
+ {
64
+ "id": "TC-228-manifest-prompts",
65
+ "acId": "AC-18202-2",
66
+ "description": "The manifest lists rcf_define_intent, rcf_define_intake, rcf_define_draft_shapes and rcf_discover_prototype as argument-free; rcf_define_litmus is recorded as pending PR 7.",
67
+ "status": "pending",
68
+ "testPointer": "test/guidance/inventory.test.js::guidance (REQ-182, AC-18202-2): four argument-free DEFINE prompts present, litmus pending PR 7"
69
+ },
70
+ {
71
+ "id": "TC-228-register-scan-em-dash",
72
+ "acId": "AC-18202-3",
73
+ "description": "A new guidance file containing an em-dash fails the register scan.",
74
+ "status": "pending",
75
+ "testPointer": "test/guidance/canonical-text-lint.test.js::guidance (REQ-182, AC-18202-3): em-dash in a new guidance file fails the register scan"
76
+ },
77
+ {
78
+ "id": "TC-228-managed-block-preserves-rules",
79
+ "acId": "AC-18202-4",
80
+ "description": "The managed block regeneration keeps every existing rule: regenerating never removes a line.",
81
+ "status": "pending",
82
+ "testPointer": "test/guidance/fragment.test.js::guidance (REQ-182, AC-18202-4): managed-block regeneration keeps every existing rule"
83
+ }
84
+ ],
85
+ "status": "draft"
86
+ }