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,46 @@
1
+ {
2
+ "createdAt": "2026-10-01T16:00:00Z",
3
+ "updatedAt": "2026-10-01T16:00:00Z",
4
+ "acIds": [
5
+ "AC-17503-1",
6
+ "AC-17503-2",
7
+ "AC-17503-3",
8
+ "AC-17503-4",
9
+ "AC-17503-5",
10
+ "AC-17503-6",
11
+ "AC-17503-7",
12
+ "AC-17503-8",
13
+ "AC-17503-9"
14
+ ],
15
+ "fbsId": "FBS-200",
16
+ "prdId": "PRD-001",
17
+ "bsId": "BS-001",
18
+ "buildOrder": 200,
19
+ "executionStatus": "complete",
20
+ "title": "DEFINE step 2 (0.29.0) PR B: --level, --persona and persona-grouped text report on rcf define readiness (ADR-4126)",
21
+ "summary": "Add --level intent|build and --persona productOwner|engineer to rcf define readiness, print the two verdict lines at the top of the text report, regroup blockers into product-owner and engineer sections ordered by the profile.md register, carry _meta.level in the JSON envelope, and wire the exit matrix per spec section 3.2. --persona is a display filter only; --level drives the exit code and --level build is stricter than --check all on unacknowledged warn-with-ack failures. Chain-first: US-17503 and TS-222 land first; TAC-4123 gains the new interfaces and responsibility bump.",
22
+ "dependsOnFbsIds": ["FBS-199"],
23
+ "approach": "One pass through src/cli/readiness.js parses the two new flags via parseLevelFlag / parsePersonaFlag (shared usage-line shape with --check), passes the resolved level into the JSON envelope's _meta, prints the verdict pair (formatVerdictLines) at the top of the text report, renders a Product owner / Engineer blocker pair ordered by the profile register (PO first by default), and emits the per-stage detail with the persona inside the parenthesis after `over`. --persona X collapses the opposite-persona block to one 'hidden; run without --persona' line and restricts the per-stage detail to matching-persona checks. decideExitCode now folds the --check policy (unchanged), --level intent (4 iff levels.intentComplete.ok === false) and --level build (4 iff levels.readyToBuild.ok === false, with the warn-with-ack warn lines still emitted). src/cli/help.js is unchanged because the per-verb HELP is sourced directly from readiness.js.",
24
+ "contextRequirements": {
25
+ "tacIds": [
26
+ "TAC-4123-define-readiness"
27
+ ],
28
+ "adrIds": [
29
+ "ADR-4126-persona-tagged-blockers-two-levels"
30
+ ]
31
+ },
32
+ "deliverables": [
33
+ "src/cli/readiness.js: --level and --persona on OPTION_SPEC; parseLevelFlag / parsePersonaFlag calls; pickRegister from profile.md; renderText emits verdict pair, per-persona next actions, PO + engineer blocker blocks ordered by register, per-stage detail with persona in the parenthesis; decideExitCode folds --check and --level per spec section 3.2; HELP text updated",
34
+ "src/query/readiness.js: parseLevelFlag and parsePersonaFlag helpers exported for the CLI (and the Readiness tab's future test-shared harness)",
35
+ "test/cli/readiness.test.js: AC-17503-1 through AC-17503-9 cases, including the parameterised exit matrix",
36
+ "rcf/user-stories/us-17503.json, rcf/test-suites/ts-222.json: chain documents under REQ-175 / TAC-4123",
37
+ "rcf/tacs/tac-4123-define-readiness.json: responsibility bump for PR B's dispatch and text regrouping; interfaces[] gains parseLevelFlag / parsePersonaFlag as [draft] other-kind entries",
38
+ "rcf/fbs/fbs-200.json: this file, carrying AC-17503-* ownership",
39
+ "CHANGELOG [Unreleased] 0.29.0 PR B bullet"
40
+ ],
41
+ "riskLevel": "low",
42
+ "domain": "defineDetection",
43
+ "estimatedSize": "small",
44
+ "estimatedHours": 2,
45
+ "notes": "PR C (Readiness viewer tab) is the remaining 0.29.0 step-2 PR under REQ-180 / REQ-181. rcf define freeze is untouched; the no-mutation contract (TS-221 TC-no-write-on-invocation) still holds."
46
+ }
@@ -0,0 +1,49 @@
1
+ {
2
+ "createdAt": "2026-10-01T18:00:00Z",
3
+ "updatedAt": "2026-10-01T18:00:00Z",
4
+ "acIds": [
5
+ "AC-18001-1",
6
+ "AC-18001-2",
7
+ "AC-18001-3",
8
+ "AC-18001-4",
9
+ "AC-18001-5",
10
+ "AC-18001-6",
11
+ "AC-18001-7",
12
+ "AC-18101-1",
13
+ "AC-18101-2",
14
+ "AC-18101-3"
15
+ ],
16
+ "fbsId": "FBS-201",
17
+ "prdId": "PRD-001",
18
+ "bsId": "BS-001",
19
+ "buildOrder": 201,
20
+ "executionStatus": "complete",
21
+ "title": "DEFINE step 2 (0.29.0) PR C: Readiness tab as tab 1, Overview-to-PRD rename, shared pill, findings-list and diff components (REQ-180, REQ-181, TAC-4127, ADR-4127)",
22
+ "summary": "Land src/view/readiness.js plus src/view/components/{pill,findings-list,diff}.js; wire Readiness as the first tab in html-page.js; rename the Overview button and panel to PRD with no content change; keep the data-tab=overview identifier so existing hash anchors still resolve. The tab renders the computeReadiness result passed in from renderModelToPage (which loads the freeze record, ledgers, test pointers and profile text once per rewalk). Document-level diff only; criterion-level before-and-after is deferred per ADR-4127. Product Map and Requirements markup is unchanged; the shared components are additive in 0.29.0.",
23
+ "dependsOnFbsIds": ["FBS-200"],
24
+ "approach": "html-page.js: insert the Readiness tab button as the first entry; relabel the Overview button and panel heading to PRD (identifiers preserved); add the inline-script TABS entry 'readiness' as the first value; renderContent receives the readiness result on the model and emits the Readiness tabpanel ahead of the PRD tabpanel. src/view/readiness.js: eleven block builders in spec-section-5 order calling the three shared components; register ordering picked once at the top; blocker ids rendered as hash anchors so the existing resolveHash routine opens the right document tab. src/view/components/*.js: three small, pure modules each exporting the one function the tab calls. src/view/index.js: renderModelToPage loads freeze, ledgers, testPointers and profileText once per walk and attaches the readiness result to the model so the SSE live-update path carries the recomputed object. Tests under test/view/readiness-tab.test.js cover AC-18001-1..7 and AC-18101-1..3; the layout-regression baseline is regenerated as a result of the new DOM.",
25
+ "contextRequirements": {
26
+ "tacIds": [
27
+ "TAC-4127-readiness-view"
28
+ ],
29
+ "adrIds": [
30
+ "ADR-4127-readiness-tab-order-and-register"
31
+ ]
32
+ },
33
+ "deliverables": [
34
+ "src/view/readiness.js: renderReadinessPanel(result, { profile }); eleven ordered blocks per spec section 5; pure, no I/O",
35
+ "src/view/components/pill.js, findings-list.js, diff.js: the three shared view components",
36
+ "src/view/html-page.js: Readiness tab as first entry; PRD rename (label-only); inline-script TABS array updated",
37
+ "src/view/index.js: renderModelToPage loads freeze, ledgers, testPointers and profileText; attaches the computed readiness result to the model",
38
+ "test/view/readiness-tab.test.js: AC-18001-1 through AC-18001-7 and AC-18101-1 through AC-18101-3",
39
+ "test/view/layout-regression.test.js: baseline regenerated to include the Readiness tabpanel",
40
+ "rcf/requirements/req-180.json, rcf/requirements/req-181.json, rcf/user-stories/us-18001.json, rcf/user-stories/us-18101.json, rcf/tacs/tac-4127-readiness-view.json, rcf/adrs/adr-4127-readiness-tab-order-and-register.json, rcf/test-suites/ts-223.json: the chain documents under PRD-001 / TAD-001 / BS-001",
41
+ "rcf/fbs/fbs-201.json: this file, carrying AC-18001-* and AC-18101-* ownership",
42
+ "CHANGELOG [Unreleased] 0.29.0 PR C bullet"
43
+ ],
44
+ "riskLevel": "low",
45
+ "domain": "defineDetection",
46
+ "estimatedSize": "medium",
47
+ "estimatedHours": 4,
48
+ "notes": "`rcf define freeze` is untouched; the no-mutation contract (TS-221 TC-no-write-on-invocation) still holds. Product Map and Requirements rendering is unchanged in this PR; the shared components are additive and existing tab tests pass without edits."
49
+ }
@@ -0,0 +1,110 @@
1
+ {
2
+ "createdAt": "2026-10-02T16:40:00Z",
3
+ "updatedAt": "2026-10-03T00:00:00Z",
4
+ "acIds": [
5
+ "AC-17302-1",
6
+ "AC-17302-2",
7
+ "AC-17302-3",
8
+ "AC-17302-4",
9
+ "AC-17302-5",
10
+ "AC-17302-6",
11
+ "AC-18701-1",
12
+ "AC-18701-2",
13
+ "AC-18701-3",
14
+ "AC-18701-4",
15
+ "AC-18701-5",
16
+ "AC-18701-6",
17
+ "AC-18702-1",
18
+ "AC-18702-2",
19
+ "AC-18702-3",
20
+ "AC-18702-4",
21
+ "AC-18702-5",
22
+ "AC-18702-6",
23
+ "AC-18601-1",
24
+ "AC-18601-2",
25
+ "AC-18601-3",
26
+ "AC-18601-4",
27
+ "AC-18601-5",
28
+ "AC-18601-6",
29
+ "AC-18601-7",
30
+ "AC-18602-1",
31
+ "AC-18602-2",
32
+ "AC-18602-3",
33
+ "AC-18602-4",
34
+ "AC-18602-5",
35
+ "AC-18602-6",
36
+ "AC-18603-1",
37
+ "AC-18603-2",
38
+ "AC-18603-3",
39
+ "AC-18603-4",
40
+ "AC-18603-5",
41
+ "AC-18801-1",
42
+ "AC-18801-2",
43
+ "AC-18801-3",
44
+ "AC-18801-4",
45
+ "AC-18801-5",
46
+ "AC-18202-1",
47
+ "AC-18202-2",
48
+ "AC-18202-3",
49
+ "AC-18202-4"
50
+ ],
51
+ "fbsId": "FBS-202",
52
+ "prdId": "PRD-001",
53
+ "bsId": "BS-001",
54
+ "buildOrder": 202,
55
+ "executionStatus": "notStarted",
56
+ "title": "DEFINE step 3 PRs 1-3: intake markers, ledger update, resolvedBy grammar (PR 1); computeQuestions, questions verb and MCP tools (PR 2); draft-shape marker extension, DISCOVERY prototypes guidance and prompts (PR 3)",
57
+ "summary": "Carry the ACs for PRs 1, 2 and 3 of the DEFINE step 3 spec (2026-10-01). PR 1: statement-file markers in parseBriefFromFile ([kind] and (source: ...)), the brief add --scan / --no-scan / --findings / --dry-run / --json wiring, the new ledger <name> update <id> subverb, and the resolvedBy closed pointer grammar validated by D2 (title-hit fallback dropped). PR 2: computeQuestions pure compute over readiness per persona; `rcf define questions` verb; three MCP tools (rcf_define_questions, rcf_define_readiness, rcf_define_ledger); the define-intent guidance file and the rcf_define_intent + rcf_define_intake prompts; two new managed-block rules. PR 3: parseInterfaceDraft extended to TAC.purpose and coreEntities[].description, shapes:draftSettled reports all three id forms (<tacId>:<name>, <tacId>, TAD.entity:<name>); the two new argument-free prompts rcf_define_draft_shapes and rcf_discover_prototype plus guidance/discovery-prototypes.md (REQ-188 + REQ-182 amended, ADR-4132). Chain-first commits landed before the code in each PR. FBS stays notStarted until the CN axis mints Code Nodes against the ACs across the PRs. PR 1 tests ride TS-215; PR 2 tests ride TS-226; PR 3 tests ride TS-228 (renumbered from the cloud build's TS-227 after viewer PR 8 claimed TS-227 for US-18002).",
58
+ "dependsOnFbsIds": [
59
+ "FBS-195",
60
+ "FBS-201"
61
+ ],
62
+ "approach": "PR 1: parseBriefFromFile parses a leading [kind] and a trailing (source: ...) marker; unknown kind raises LedgerError code 'usage' before any write. updateEntry patches named fields and re-runs validateLedger. parseResolvedBy / isResolvedByGrammar implement the closed pointer grammar. runIntakeScansOnDelta composes the three mechanical scans in src/intake/validate.js over new-plus-existing statements, attributing findings to the statement ids that participate. The CLI brief add wires --scan / --no-scan / --findings / --dry-run / --json; the update subverb lives beside add in src/cli/ledger.js. D2's skeleton:resolvedBy drops the title-hit fallback and refuses a pointer outside the grammar with 'pointer does not resolve'. PR 2: src/query/questions.js exports computeQuestions(readiness, { tree, ledgers, profileText, persona }) folding readiness blockers into questions through a per-check template; src/cli/questions.js registers `rcf define questions` with --json, --persona, --stage, --limit; src/mcp/tools.js adds rcf_define_questions, rcf_define_readiness and rcf_define_ledger (thin wrapper over the ledger handler); guidance/define-intent.md and guidance/elicitation-playbook.md ship the loop content; guidance/manifest.json registers the new slug and the two argument-free prompts rcf_define_intent and rcf_define_intake; guidance/managed/agent-instructions-block.md adds the two new rules.",
63
+ "contextRequirements": {
64
+ "tacIds": [
65
+ "TAC-4121-define-ledgers",
66
+ "TAC-4130-define-intake-brief",
67
+ "TAC-4129-define-questions",
68
+ "TAC-4128-define-guidance",
69
+ "TAC-4122-define-gates"
70
+ ],
71
+ "adrIds": [
72
+ "ADR-4129-questions-harness-driven-loop",
73
+ "ADR-4130-intake-harness-split-tool-scanned",
74
+ "ADR-4132-prototypes-in-discovery-as-evidence"
75
+ ]
76
+ },
77
+ "deliverables": [
78
+ "src/define/ledgers.js: parseBriefFromFile with markers; updateEntry; parseResolvedBy; isResolvedByGrammar; brief resolvedBy field in validateEntry",
79
+ "src/intake/orchestrator.js: runIntakeScansOnDelta",
80
+ "src/intake/index.js: re-export runIntakeScansOnDelta",
81
+ "src/cli/ledger.js: brief add scan wiring, --findings, --dry-run, --json; update subverb",
82
+ "src/query/gates.js: D2 skeleton:resolvedBy validates the closed pointer grammar; title-hit fallback dropped",
83
+ "src/query/questions.js: computeQuestions over readiness per persona (PR 2)",
84
+ "src/cli/questions.js: rcf define questions verb (PR 2)",
85
+ "src/mcp/tools.js: rcf_define_questions, rcf_define_readiness, rcf_define_ledger tools (PR 2)",
86
+ "guidance/define-intent.md, guidance/define-intake.md and guidance/elicitation-playbook.md (restructured): the PO loop and intake prose (PR 2)",
87
+ "guidance/managed/agent-instructions-block.md: two new rules (PR 2)",
88
+ "guidance/manifest.json: define-intent slug and the two new prompts (PR 2)",
89
+ "test/define/ledgers.test.js: AC-17302-1..5, AC-18701-1..5 unit cases",
90
+ "test/intake/validate.test.js: runIntakeScansOnDelta unit cases",
91
+ "test/query/gates.test.js: AC-17302-3/5/6 D2 cases",
92
+ "test/cli/ledger.test.js: AC-17302-1/4, AC-18701-1/5/6, AC-18702-1/2/4/5/6 CLI cases",
93
+ "test/query/questions.test.js: AC-18601-1..7 unit cases (PR 2)",
94
+ "test/cli/questions.test.js: AC-18602-1..6 CLI cases (PR 2)",
95
+ "test/mcp/define-questions.test.js: AC-18602-4 MCP parity (PR 2)",
96
+ "test/query/questions-loop.test.js: AC-18603-1..5 scripted loop cases (PR 2)",
97
+ "rcf/requirements/req-187.json, rcf/requirements/req-173.json (amended), rcf/user-stories/us-18701.json, us-18702.json, us-17302.json, rcf/tacs/tac-4121-define-ledgers.json (amended), tac-4130-define-intake-brief.json, rcf/test-suites/ts-215.json (extended), rcf/fbs/fbs-202.json: this file",
98
+ "rcf/requirements/req-186.json, rcf/user-stories/us-18601.json, us-18602.json, us-18603.json, rcf/tacs/tac-4129-define-questions.json, tac-4128-define-guidance.json, rcf/adrs/adr-4129-questions-harness-driven-loop.json, adr-4130-intake-harness-split-tool-scanned.json, rcf/test-suites/ts-226.json (PR 2 chain)",
99
+ "rcf/requirements/req-188.json, rcf/requirements/req-182.json (new on this PR; see report.md shift note), rcf/user-stories/us-18801.json, us-18202.json, rcf/tacs/tac-4122-define-gates.json (amended), tac-4128-define-guidance.json (amended), rcf/adrs/adr-4132-prototypes-in-discovery-as-evidence.json, rcf/test-suites/ts-228.json, docs/capability-tags.md (capability:define-drafts) (PR 3 chain)",
100
+ "src/query/gates.js: parseInterfaceDraft extended to TAC.purpose and coreEntities[].description; checkD3Shapes shapes:draftSettled enumerates all three homes (PR 3)",
101
+ "guidance/define-draft-shapes.md, guidance/discover-prototype.md, guidance/discovery-prototypes.md and guidance/manifest.json entries for the two prompts and the two slugs (PR 3)",
102
+ "guidance/managed/agent-instructions-block.md: the prototype rule from ADR-4132 (PR 3)",
103
+ "test/query/gates.test.js: extended for the three draft homes; test/guidance/manifest.test.js and test/guidance/register-scan.test.js: new slugs and five prompts, em-dash scan (PR 3)"
104
+ ],
105
+ "riskLevel": "low",
106
+ "domain": "defineLedgers",
107
+ "estimatedSize": "medium",
108
+ "estimatedHours": 4,
109
+ "notes": "FBS-202 was reserved as 'next free' in the dispatch brief and allocated here to keep the dogfood no-orphan-AC invariant. executionStatus is 'notStarted' so the CN axis stays legitimately deferred for this PR (test additions ride existing test suites, no new CN per brief). Later DEFINE PRs promote this FBS to inProgress / complete as their deliveries land."
110
+ }
@@ -0,0 +1,100 @@
1
+ {
2
+ "createdAt": "2026-10-02T19:00:00Z",
3
+ "updatedAt": "2026-10-03T09:55:00Z",
4
+ "acIds": [
5
+ "AC-204-1",
6
+ "AC-204-2",
7
+ "AC-204-3",
8
+ "AC-204-4",
9
+ "AC-204-5",
10
+ "AC-204-6",
11
+ "AC-204-7",
12
+ "AC-205-1",
13
+ "AC-205-2",
14
+ "AC-205-3",
15
+ "AC-205-4",
16
+ "AC-205-5",
17
+ "AC-205-6",
18
+ "AC-205-7",
19
+ "AC-205-8",
20
+ "AC-18002-1",
21
+ "AC-18002-2",
22
+ "AC-18002-3",
23
+ "AC-206-1",
24
+ "AC-206-2",
25
+ "AC-206-3",
26
+ "AC-206-4",
27
+ "AC-206-5",
28
+ "AC-206-6"
29
+ ],
30
+ "fbsId": "FBS-203",
31
+ "prdId": "PRD-001",
32
+ "bsId": "BS-001",
33
+ "buildOrder": 203,
34
+ "executionStatus": "inProgress",
35
+ "title": "Viewer UI refresh build stream: Build/DAG sub-tab, filters, inspector and later tab deltas (US-204, US-205, US-18002 and successor USs)",
36
+ "summary": "Single FBS owning the Build/DAG sub-tab acceptance criteria (AC-204-1..7, US-204) that land as the viewer UI refresh PR 6, the ID lookup acceptance criteria (AC-205-1..8, US-205) that land as PR 7, the Readiness PO redesign acceptance criteria (AC-18002-1..3, US-18002) that land as PR 8, plus the successor acceptance criteria the same build stream picks up in PR 9. The stream delivers one chain-first tab delta per PR: DAG (PR 6), ID lookup (PR 7), Readiness PO redesign (PR 8), and the shared chrome and release prep (PR 9). This FBS stays `inProgress` for the length of the stream so the AC-ownership check on origin/main is green between PRs; successor PRs extend the `acIds` list under this file as their new USs land.",
37
+ "dependsOnFbsIds": [],
38
+ "approach": "Build the DAG sub-tab (PR 6) under src/view/build-dag.js with buildDagLayout, renderBuildDag, renderDagInspector and buildDagInspectorPayload; wire html-page.js's renderBuildPanel to call the new renderer in place of the PR 5 placeholder; add wireBuildDag in page-init.js for click-to-highlight, filters, inspector fill from the data-* attribute payload and `#tab=build&sub=dag&entity=` deep links. Inspector payload rides on a `data-rcf-dag-inspector-data` attribute on the inspector shell per the PR 1 contract (no inline <script> body). `currentDagHashExtras` keeps Specs filter keys unknown on the DAG sub-tab so the decision 11 preservation contract holds. applyBuildHash auto-presses Show-unconnected on restoring an unconnected FBS. PR 7 to PR 9 extend the renderer, add their own sub-tab, filter and inspector pieces and append the new ACs to this FBS's `acIds` array; this file is the single owner of the AC coverage for the whole stream so the dogfood tree's `every AC covered by at least one FBS` check stays green at every merge.",
39
+ "contextRequirements": {
40
+ "tacIds": [
41
+ "TAC-4131-build-dag-view",
42
+ "TAC-4132-id-lookup",
43
+ "TAC-4134-wespa-host-fixture"
44
+ ],
45
+ "adrIds": [
46
+ "ADR-4133-dag-dependency-depth-layout",
47
+ "ADR-4134-index-json-route",
48
+ "ADR-4136-embedding-host-fixture"
49
+ ]
50
+ },
51
+ "deliverables": [
52
+ "packages/rcf-lite/src/view/build-dag.js: buildDagLayout, renderBuildDag, renderDagInspector, buildDagInspectorPayload (pure HTML string + data-attr payload shell)",
53
+ "packages/rcf-lite/src/view/html-page.js: renderBuildPanel calls renderBuildDag with the inspector payload argument (PR 5 placeholder removed)",
54
+ "packages/rcf-lite/src/view/page-init.js: wireBuildDag (click-to-highlight, filters, inspector fill, hash round-trip, auto-press show-unconnected on restore); currentDagHashExtras preserves non-DAG hash params",
55
+ "packages/rcf-lite/src/view/style.css: `.rcf-dag-*` tokens aligned with the Stravica brand palette, both themes",
56
+ "packages/rcf-lite/test/view/build-tab.test.js: twelve new unit tests for buildDagLayout (depth columns, closures, critical path, cycle, unconnected lane), renderBuildDag (toolbar, canvas, edges), buildDagInspectorPayload, page-init DAG wiring markers and the AC-204-7 postMessage guard",
57
+ "packages/rcf-lite/test/view/fixtures/phase-3-6-static.html: baseline regenerated to include the DAG panel with the data-attr inspector payload shell",
58
+ "packages/rcf-lite/rcf/requirements/req-002.json: description amended with the DAG sub-tab coverage",
59
+ "packages/rcf-lite/rcf/user-stories/us-204.json: US-204 with AC-204-1..7",
60
+ "packages/rcf-lite/rcf/tacs/tac-4131-build-dag-view.json, packages/rcf-lite/rcf/adrs/adr-4133-dag-dependency-depth-layout.json: chain docs",
61
+ "packages/rcf-lite/src/view/view-index.js: buildViewIndex, serialiseViewIndex, rankLookupRows (PR 7)",
62
+ "packages/rcf-lite/src/server/routes.js + packages/rcf-lite/src/server/index.js: GET /index.json route (PR 7)",
63
+ "packages/rcf-lite/src/view/html-page.js: renderSearchButton + renderLookupModal shell (PR 7)",
64
+ "packages/rcf-lite/src/view/page-init.js: wireLookup + rankLookupRows mirror (PR 7)",
65
+ "packages/rcf-lite/src/view/live-client.js: __rcfLookupDirty on SSE tree-update (PR 7)",
66
+ "packages/rcf-lite/test/view/id-lookup.test.js: 22 unit tests for ID lookup (PR 7)",
67
+ "packages/rcf-lite/rcf/user-stories/us-205.json, packages/rcf-lite/rcf/tacs/tac-4132-id-lookup.json, packages/rcf-lite/rcf/adrs/adr-4134-index-json-route.json: PR 7 chain docs",
68
+ "packages/rcf-lite/rcf/test-suites/ts-225.json: TS-225 covering AC-205-1..8 (PR 7)",
69
+ "packages/rcf-lite/rcf/code-nodes/cn-741..cn-745.json: CN entries mapping PR 7 code files to AC-205-* (PR 7)",
70
+ "packages/rcf-lite/src/view/readiness/po-layer.js: renderReadinessPO building two VerdictCards, QuestionCards grouped by source span, the Requirements-that-still-need-work table and the For-engineers DocRow shell (PR 8)",
71
+ "packages/rcf-lite/src/view/readiness/question-adapter.js: toQuestions + preferReadinessQuestions, feature-detected on readiness.questions[], consuming the computeQuestions shape with phrasebook fallback (PR 8)",
72
+ "packages/rcf-lite/src/view/readiness/phrasebook.js: PO ask / heading / hint entries keyed by checkId:itemId with a plain-checkId fallback (PR 8)",
73
+ "packages/rcf-lite/src/view/readiness/stage-legend.js: renderStageLegend + stageTitle for D1..D8 chips and the dialog (PR 8)",
74
+ "packages/rcf-lite/src/view/readiness.js: renderReadinessPanel wraps the PO layer around the engineer body and threads the register from profile.md (PR 8)",
75
+ "packages/rcf-lite/src/view/index.js: attaches computeQuestions output onto model.readiness so the adapter feature-detects the real shape (PR 8 landing fix)",
76
+ "packages/rcf-lite/src/view/page-init.js: StageLegend <dialog> wiring on D-chip click (PR 8)",
77
+ "packages/rcf-lite/src/view/style.css: `.rcf-po-*`, `.rcf-pill--*`, `.rcf-stage-legend*`, `.rcf-chain-term` tokens, both themes (PR 8)",
78
+ "packages/rcf-lite/test/view/readiness-po-layer.test.js: 14 unit tests covering the adapter branches, PO blocks, equal-height card markup, For-engineers register wiring, StageLegend shape, D-chip hover-title/data-rcf-stage-ref, phrasebook em-dash guard, Reqwork empty + populated, and AC-18002-1/2/3 (PR 8)",
79
+ "packages/rcf-lite/rcf/requirements/req-180.json: description amended with the question-cards grouped-by-source-span rendering (PR 8)",
80
+ "packages/rcf-lite/rcf/user-stories/us-18002.json: US-18002 with AC-18002-1..3 (PR 8)",
81
+ "packages/rcf-lite/rcf/tacs/tac-4133-readiness-po-layer.json: TAC-4133 for the Readiness PO layer (PR 8)",
82
+ "packages/rcf-lite/rcf/adrs/adr-4135-readiness-po-register-and-adapter.json: ADR-4135 for the two-audience split by register and the adapter seam (PR 8)",
83
+ "packages/rcf-lite/rcf/test-suites/ts-227.json: TS-227 covering AC-18002-1..3 (PR 8)",
84
+ "packages/rcf-lite/rcf/code-nodes/cn-746..cn-749.json: CN entries mapping PR 8 code files to AC-18002-* (PR 8)",
85
+ "packages/rcf-lite/src/view/test-host/fixture.js: renderTestHostPage (pure HTML string; 56px header, resizable sidebar, iframe mounted at ./?embed=1&theme=light; no inline <script>) (PR 9)",
86
+ "packages/rcf-lite/src/view/test-host/embed-client.js: /test-host.js wiring (theme toggle posts rcf-view-theme to iframe.contentWindow targeting window.location.origin; sidebar drag + collapse/expand; no localStorage persist) (PR 9)",
87
+ "packages/rcf-lite/src/view/test-host/lints.js: assertFramingHeaders, assertNoTargetTop, assertLocalStorageNamespace (three pure embedding lints) (PR 9)",
88
+ "packages/rcf-lite/src/cli/view.js, packages/rcf-lite/src/server/index.js, packages/rcf-lite/src/server/routes.js: --test-host CLI flag + RCF_VIEW_TEST_HOST=1 env guard, 404-by-default route surface for /test-host.html and /test-host.js (PR 9)",
89
+ "packages/rcf-lite/test/view/wespa-host-fixture.test.js: 11 unit tests covering the fixture shell, 404-by-default route surface, HTTP round-trip, and the three lints (positive + negative) (PR 9)",
90
+ "packages/rcf-lite/rcf/user-stories/us-206.json: US-206 with AC-206-1..6 (PR 9)",
91
+ "packages/rcf-lite/rcf/tacs/tac-4134-wespa-host-fixture.json: TAC-4134 (test-host fixture + three embedding lints) (PR 9)",
92
+ "packages/rcf-lite/rcf/adrs/adr-4136-embedding-host-fixture.json: ADR-4136 (CI host fixture + three lints; fixture does not persist theme) (PR 9)",
93
+ "packages/rcf-lite/rcf/test-suites/ts-229.json: TS-229 covering AC-206-1..6 (PR 9 landing)",
94
+ "packages/rcf-lite/rcf/code-nodes/cn-750..cn-752.json: CN entries mapping PR 9 code files to AC-206-* (PR 9 landing)"
95
+ ],
96
+ "riskLevel": "low",
97
+ "domain": "reviewSurface",
98
+ "estimatedSize": "large",
99
+ "notes": "Single FBS for the whole viewer UI refresh build stream (ruling 2026-10-02): keeping one FBS avoids a sprawl of near-duplicate FBS entries for the same renderer family. PRs 7 to 9 extended the acIds list under this file as AC-205-*, AC-18002-* and AC-206-* arrived. Status stays `inProgress` after PR 9 lands because every TC on this stream's TS docs is still `pending` (not yet flipped to `passing`); flip to `verified` is a separate housekeeping pass once each TC's status is advanced to `passing` against the green suite."
100
+ }
@@ -2,7 +2,7 @@
2
2
  "reqId": "REQ-002",
3
3
  "prdId": "PRD-001",
4
4
  "title": "Visual review surface",
5
- "description": "Build Lite renders the whole RCF tree as a diagram and as a browsable static page, so a non-coding owner can see the documents and their links without reading any JSON. The view is read-only and generated from the on-disk tree on demand.",
5
+ "description": "Build Lite renders the whole RCF tree as a diagram and as a browsable static page, so a non-coding owner can see the documents and their links without reading any JSON. The view is read-only and generated from the on-disk tree on demand. Build/DAG sub-tab lays FBS by `dependsOnFbsIds` depth with click-to-highlight closure, dependency inspector, filters, unconnected lane and `#tab=build&sub=dag&entity=` deep links, per viewer UI refresh design section 7. ID lookup over a server-built `./index.json` of every document id and AC, opened by the SearchButton or Cmd/Ctrl+F, navigates to `#tab=<tab>&entity=<id>` preserving `embed` and `theme`, per viewer UI refresh design section 6. Embedding proof: a same-origin test-host fixture mounts the viewer with `embed=1` and `theme=` and the three lints keep framing headers, `target='_top'` and localStorage namespace in place, per viewer UI refresh design section 9 and Dex's wespa requirements of 2026-10-02.",
6
6
  "category": "functional",
7
7
  "domain": "view",
8
8
  "priority": "must",
@@ -16,5 +16,5 @@
16
16
  "version": "0.1.0",
17
17
  "status": "draft",
18
18
  "createdAt": "2026-06-25T00:00:00Z",
19
- "updatedAt": "2026-09-21T17:00:00.000Z"
19
+ "updatedAt": "2026-10-02T20:00:00.000Z"
20
20
  }
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "createdAt": "2026-09-24T12:00:00Z",
3
- "updatedAt": "2026-09-24T12:00:00Z",
3
+ "updatedAt": "2026-10-02T16:40:00Z",
4
4
  "reqId": "REQ-173",
5
5
  "prdId": "PRD-001",
6
6
  "title": "Sidecar ledgers under rcf/define/ and the rcf define ledger verb",
7
- "description": "Four sidecars live under rcf/define/, each one JSON file, each with one numbered sequence for the life of the project (proposal 2026-09-22 v3 section 2.5, 3.2, 8.2). Names and shapes: brief-ledger.json (statements[] kinded from a closed set), decisions-ledger.json (decisions[] in the numbered #241 format), concern-ledger.json (concerns[] with disposition applied or waived), probe-ledger.json (probes[] with severity low, medium, high). A local schema in rcf-lite validates every write until schemas 0.7. Reading a missing ledger file returns an empty ledger so callers can compose without a per-file null check; a malformed file raises a clear error. The rcf define ledger name verb pattern (brief, decisions, concerns, probes; add, resolve, list) is the operator surface. brief add --from <file> splits statements one per non-empty line, mints sequential ids and writes; the intake-scan-against-frozen-statements hook is a named seam this slice leaves for a later one. decisions list prints the #241 numbered format (one decision per item, options with letters, the default, what it blocks). The walker never reads under rcf/define/ so the sidecars stay invisible to every existing tree consumer.",
7
+ "description": "Four sidecars live under rcf/define/, each one JSON file, each with one numbered sequence for the life of the project (proposal 2026-09-22 v3 section 2.5, 3.2, 8.2). Names and shapes: brief-ledger.json (statements[] kinded from a closed set), decisions-ledger.json (decisions[] in the numbered #241 format), concern-ledger.json (concerns[] with disposition applied or waived), probe-ledger.json (probes[] with severity low, medium, high). A local schema in rcf-lite validates every write until schemas 0.7. Reading a missing ledger file returns an empty ledger so callers can compose without a per-file null check; a malformed file raises a clear error. The rcf define ledger name verb pattern (brief, decisions, concerns, probes; add, resolve, list) is the operator surface. brief add --from <file> splits statements one per non-empty line, mints sequential ids and writes; the intake-scan-against-frozen-statements hook is a named seam this slice leaves for a later one. decisions list prints the #241 numbered format (one decision per item, options with letters, the default, what it blocks). The walker never reads under rcf/define/ so the sidecars stay invisible to every existing tree consumer. Every ledger supports `update <id>` with field patches validated as `add` validates; `resolvedBy` on a brief statement is a closed pointer grammar (REQ-nnn, TAD.entity:<name>, PRD.user:<name>, TAD.system:<name>, TAC-nnnn, omitted:<reason>) validated by D2.",
8
8
  "category": "functional",
9
9
  "domain": "defineLedgers",
10
10
  "priority": "must",
@@ -1,21 +1,27 @@
1
1
  {
2
2
  "createdAt": "2026-09-24T14:30:00Z",
3
- "updatedAt": "2026-09-24T14:30:00Z",
3
+ "updatedAt": "2026-10-01T14:13:27Z",
4
4
  "reqId": "REQ-174",
5
5
  "prdId": "PRD-001",
6
6
  "title": "DEFINE stage gates D1..D8 as pure check functions",
7
- "description": "rcf-lite gains src/query/gates.js with one check function per stage D1..D8. Each function takes (tree, ledgers, profile, scope) and returns { stage, gate, state, checks[] } where every check is { name, ok, over: 'delta'|'tree', pass, total, failing: [{ id, why }] }. Stage state is 'passed' | 'failing' | 'acknowledged' (only for D3, D5, D6 and only when the freeze record acknowledges that gate at the current hash) | 'notApplicable' (the stage decides that itself from the scope per the proposal 2026-09-22 v3 section 3.2 rules and the summary table in section 2.7). Blocking in 0.29.0: D1 brief, D2 skeleton, D4 floors (every REQ in scope has a US; every US in scope has a testable AC, a failure AC and a must-not AC, or a reasoned opt-out per class; tacIds non-empty and resolving; no scaffold placeholder), D7 decisions, D8 freeze (prior gates passed or acknowledged at the current hash, every AC owned by exactly one FBS, queue head actionable and not a placeholder, validate clean; preflight and ui-baseline presence as the section 3.2 rules specify). Warn-with-ack in 0.29.0: D3, D5, D6 build only the cheap data-backed checks (D3: every TAC in scope has at least one interface and each interface kind is in the closed vocabulary of section 5.2; D5: TAD securityArchitecture present when any auth or httpApi REQ exists, operationalConcerns present when deployed-scope ACs exist, concern-ledger entries applied or waived where they exist; D6: validate clean tree-wide plus open probe-ledger count). The D3 template parser, entity join, D5 catalogue, D6 contradiction and unsatisfiable scans, and the probe runner are 0.30 and left as named seams. AC class is a bracketed prefix on AC description ('[failure] ...', '[must-not] ...', '[happy]', '[edge]', '[non-functional]', decision 6); opt-out per class reuses the existing manifest.baselineAcOptOuts[] array with a baselineKey of the shape 'defineD4:failure' or 'defineD4:mustNot' (recorded in ADR-4122). No storage state, no 'stale' state.",
7
+ "description": "rcf-lite gains src/query/gates.js with one check function per stage D1..D8. Each function takes (tree, ledgers, profile, scope) and returns { stage, gate, state, checks[] } where every check is { name, ok, over: 'delta'|'tree', pass, total, failing: [{ id, why }] }. Stage state is 'passed' | 'failing' | 'acknowledged' (only for D3, D5, D6 and only when the freeze record acknowledges that gate at the current hash) | 'notApplicable' (the stage decides that itself from the scope per the proposal 2026-09-22 v3 section 3.2 rules and the summary table in section 2.7). Blocking in 0.29.0: D1 brief, D2 skeleton, D4 floors (every REQ in scope has a US; every US in scope has a testable AC, a failure AC and a must-not AC, or a reasoned opt-out per class; tacIds non-empty and resolving; no scaffold placeholder), D7 decisions, D8 freeze (prior gates passed or acknowledged at the current hash, every AC owned by exactly one FBS, queue head actionable and not a placeholder, validate clean; preflight and ui-baseline presence as the section 3.2 rules specify). Warn-with-ack in 0.29.0: D3, D5, D6 build only the cheap data-backed checks (D3: every TAC in scope has at least one interface and each interface kind is in the closed vocabulary of section 5.2; D5: TAD securityArchitecture present when any auth or httpApi REQ exists, operationalConcerns present when deployed-scope ACs exist, concern-ledger entries applied or waived where they exist; D6: validate clean tree-wide plus open probe-ledger count). The D3 template parser, entity join, D5 catalogue, D6 contradiction and unsatisfiable scans, and the probe runner are 0.30 and left as named seams. AC class is a bracketed prefix on AC description ('[failure] ...', '[must-not] ...', '[happy]', '[edge]', '[non-functional]', decision 6); opt-out per class reuses the existing manifest.baselineAcOptOuts[] array with a baselineKey of the shape 'defineD4:failure' or 'defineD4:mustNot' (recorded in ADR-4122). No storage state, no 'stale' state. ADR-4126 (0.29.0) amendment: every gate check declares an owning persona, `productOwner` or `engineer`, and a one-sentence `question` in that persona’s register. A check that would need both personas is split so every check is homogeneous: `skeleton:reqFields` becomes `skeleton:reqIntent` (productOwner: description + domain) + `skeleton:reqShape` (engineer: shapeClassification.shapes); `decisions:allAnswered` becomes `decisions:wellFormed` (productOwner: enumerated per #241 format) + `decisions:allAnswered` (engineer: zero open). A new D3 check `shapes:draftSettled` fails every interface whose description still carries the leading `[draft]` marker so an L1-pre-populated interface stays distinguishable from one the engineer has settled.",
8
8
  "category": "functional",
9
9
  "domain": "defineDetection",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
12
  "status": "draft",
13
13
  "shapeClassification": {
14
- "shapes": ["persistence"],
14
+ "shapes": [
15
+ "persistence"
16
+ ],
15
17
  "reason": "keyword-scan",
16
18
  "classifiedAt": "2026-09-24T14:30:00Z",
17
19
  "signals": [
18
- { "source": "description", "shape": "persistence", "match": "record" }
20
+ {
21
+ "source": "description",
22
+ "shape": "persistence",
23
+ "match": "record"
24
+ }
19
25
  ]
20
26
  },
21
27
  "rationale": "Baz ruled on 2026-09-22 (proposal section 9, decision 2) that gates block where the data exists and warn-with-ack for D3, D5 and D6 until 0.31 (Baz ruled 2026-09-24 that 0.31 renumbers to 0.30, so this train ships D3/D5/D6 as warn-with-ack in 0.29.0). One check function per stage is the seam every later consumer reads: the readiness view (REQ-175) composes them, the freeze verb (slice 3) refuses on any failing stage, the viewer's Readiness tab (slice 5) prints the same checks[]. Building the check functions now, with cheap data-backed checks only, keeps 0.29.0 shippable while leaving named seams for 0.30's template parser, entity join, catalogue walk, probe runner and consistency scans.",
@@ -1,21 +1,27 @@
1
1
  {
2
2
  "createdAt": "2026-09-24T14:30:00Z",
3
- "updatedAt": "2026-09-24T14:30:00Z",
3
+ "updatedAt": "2026-10-01T14:13:27Z",
4
4
  "reqId": "REQ-175",
5
5
  "prdId": "PRD-001",
6
6
  "title": "computeReadiness and the rcf define readiness CLI verb",
7
- "description": "rcf-lite gains src/query/readiness.js with computeReadiness(tree, { freeze, ledgers, profile, testPointers }) returning the exact section 2.4 shape { tree, delta, stages, nextAction, coverage, decisions, freezeable }. computeReadiness composes computeDelta (slice 1), calls computeImpact once per id in changed union added (the union is the fan-out; impacted names every id, impactedFbs names the re-execute subset), runs the gates D1..D8 over scope = changed union added union impacted ids, calls computeCoverage tree-wide plus per REQ ancestor of the delta (using the testPointers map the CLI produces exactly as src/cli/coverage.js builds it), lists open decisions (in the #241 numbered format from the decisions ledger), derives a nextAction { stage, check, ids, command } from the first failing gate, and reports freezeable when every stage state is passed, acknowledged or notApplicable. rcf-lite also gains src/cli/readiness.js implementing rcf define readiness [--json] [--check <stage>|all] (stage accepts D1..D8 or the gate short name: brief, skeleton, shapes, stories, crosscut, consistency, decisions, freeze). Text output: tree line, next action, stage chips, delta list, failing items. --check exits 0 green, 4 red (matching coverage refusal exit); warn-with-ack stages failing but unacknowledged exit 0 with a visible warning. The producer is wrapped with runWithAdmissibilityGate as the ruleset toolScope requires. loadAllLedgers (src/define/ledgers.js) is corrected so a project that never authored a ledger does not get ledger:<name> hashes in the docHashes map (slice-1 P3 resolution: code and JSDoc agree that absent ledger files contribute no docHash).",
7
+ "description": "rcf-lite gains src/query/readiness.js with computeReadiness(tree, { freeze, ledgers, profile, testPointers }) returning the exact section 2.4 shape { tree, delta, stages, nextAction, coverage, decisions, freezeable }. computeReadiness composes computeDelta (slice 1), calls computeImpact once per id in changed union added (the union is the fan-out; impacted names every id, impactedFbs names the re-execute subset), runs the gates D1..D8 over scope = changed union added union impacted ids, calls computeCoverage tree-wide plus per REQ ancestor of the delta (using the testPointers map the CLI produces exactly as src/cli/coverage.js builds it), lists open decisions (in the #241 numbered format from the decisions ledger), derives a nextAction { stage, check, ids, command } from the first failing gate, and reports freezeable when every stage state is passed, acknowledged or notApplicable. rcf-lite also gains src/cli/readiness.js implementing rcf define readiness [--json] [--check <stage>|all] (stage accepts D1..D8 or the gate short name: brief, skeleton, shapes, stories, crosscut, consistency, decisions, freeze). Text output: tree line, next action, stage chips, delta list, failing items. --check exits 0 green, 4 red (matching coverage refusal exit); warn-with-ack stages failing but unacknowledged exit 0 with a visible warning. The producer is wrapped with runWithAdmissibilityGate as the ruleset toolScope requires. loadAllLedgers (src/define/ledgers.js) is corrected so a project that never authored a ledger does not get ledger:<name> hashes in the docHashes map (slice-1 P3 resolution: code and JSDoc agree that absent ledger files contribute no docHash). ADR-4126 (0.29.0) amendment: the readiness object carries two computed levels on the one ladder. `levels.intentComplete.ok` is true when every `productOwner` check is ok across every stage (stage state ignored); `levels.readyToBuild.ok` equals `freezeable`. Neither is recorded. `personas.productOwner.blockers` deep-equals `levels.intentComplete.blockedBy`; `personas.engineer.blockers` is the failing engineer checks in failing stages. `deriveNextAction(stages, persona?)` gains an optional persona filter; the productOwner next-action command carries `--level intent`. `formatVerdictLines(result)` builds the two verdict strings the CLI (PR B) and the Readiness tab (PR C) share so they cannot disagree.",
8
8
  "category": "functional",
9
9
  "domain": "defineDetection",
10
10
  "priority": "must",
11
11
  "version": "0.1.0",
12
12
  "status": "draft",
13
13
  "shapeClassification": {
14
- "shapes": ["persistence"],
14
+ "shapes": [
15
+ "persistence"
16
+ ],
15
17
  "reason": "keyword-scan",
16
18
  "classifiedAt": "2026-09-24T14:30:00Z",
17
19
  "signals": [
18
- { "source": "description", "shape": "persistence", "match": "record" }
20
+ {
21
+ "source": "description",
22
+ "shape": "persistence",
23
+ "match": "record"
24
+ }
19
25
  ]
20
26
  },
21
27
  "rationale": "Baz ruled on 2026-09-22 (proposal section 2.4, section 6, section 9 decision 4) that Readiness is one object rendered by two consumers (the CLI and the viewer tab) so the two cannot disagree. The Product Map precedent (PR #238) established the shape: one pure compute, one JSON envelope, two renderers. computeReadiness is the object; rcf define readiness is the CLI twin the viewer tab (REQ-180, slice 5) will render unchanged. Slice 3 (rcf define freeze) reads freezeable and the per-stage state and refuses on any failing stage; slice 4's bundle --next reads the same object; slice 6's guidance points at the CLI as the one 'am I ready to build' surface. Fixing the slice-1 P3 in the same slice as the reader that consumes it keeps the ledger docHash contract single-sourced before it stabilises across the fleet.",
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-09-24T16:33:15Z",
3
+ "updatedAt": "2026-09-24T16:33:15Z",
4
+ "reqId": "REQ-176",
5
+ "prdId": "PRD-001",
6
+ "title": "rcf define freeze verb writes freeze.json and closes the change",
7
+ "description": "rcf-lite gains src/cli/freeze.js implementing 'rcf define freeze [--ack <gate> --reason <text>]... [--litmus-attested <D3,D6>] [--note <text>] [--status] [--json]'. The verb runs computeReadiness (REQ-175) once over the live tree, freeze record and four ledgers; refuses with exit 4 when any stage state is 'failing' after applying any --ack argument, printing the failing gates and their first failing ids; and, on success, writes rcf/define/freeze.json via saveFreezeRecord (REQ-172) with { frozenAt, treeHash, docHashes, briefStatements, gates, counts, litmus, versions, note, override } and prints the proposal section 2.5 one-line summary derived from the pre-freeze delta ('frozen at <short treeHash>: <n> REQ, <n> stories, <n> criteria, <n> interfaces added; <ids> amended; ...'; first freeze reports 'first freeze: <whole-tree counts>'). --ack is accepted only for the three warn-with-ack gates (define.shapes, define.crosscut, define.consistency; short names shapes / crosscut / consistency; readiness's stage aliases); ack on any other gate is a usage refusal (exit 2), ack without --reason is a usage refusal. An acked gate lands in freeze.gates as { state: 'acknowledged', at: { hash: <currentTreeHash>, reason: <text> }, failing: [<id>, ...] }. --litmus-attested records the operator's per-decision attestation (Baz decision 7: default { attestedAt: [], readers: 0 }); the numbered --litmus <n> dispatch is NOT built (slice-6 seam). counts derives req/us/ac/tac/adr/fbs from tree.byId groupings, acByClass by parsing bracketed class markers on AC.description, and interfaces by kind from every TAC's interfaces[]. versions reads rcfLite from package.json, ruleset from src/ruleset/ruleset.json, and schemas from the installed @stravica-ai/rcf-schemas. --status prints the current freeze record (short hash, frozenAt, note, counts, acknowledged gates + reasons, litmus, versions, override) plus the live delta summary; --status --json emits the record and computeDelta object. The producer is wrapped with runWithAdmissibilityGate (ADR-4123: refusal is informational, the freeze still runs). Same slice: (a) src/define/freeze-record.js is corrected so the local schema requires override as a nullable field and every writer stamps override: null on a fresh freeze; loadFreezeRecord tolerates older records that lack the key by defaulting to null on load; (b) the ' -- ' double-dash in the readiness CLI stage header and the CHANGELOG regex line is replaced with a colon.",
8
+ "category": "functional",
9
+ "domain": "defineDetection",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": ["persistence"],
15
+ "reason": "keyword-scan",
16
+ "classifiedAt": "2026-09-24T16:33:15Z",
17
+ "signals": [
18
+ { "source": "description", "shape": "persistence", "match": "record" }
19
+ ]
20
+ },
21
+ "rationale": "Baz ruled on 2026-09-22 (proposal section 2.5) that closing a change is freezing again: the freeze verb is the only close verb, nothing is minted, and the one-line summary is what the operator signs off. Slice 3 is the smallest coherent seam between the pieces slices 1 and 2 built (delta, freeze-record writer, gates, computeReadiness) and the readers slices 4 and 5 will add (bundle --next, viewer Readiness tab). Warn-with-ack ack is accepted only on D3 / D5 / D6 per proposal section 9 decision 2 (Baz 2026-09-24) so the escape hatch matches the fold rule in gates.js. The freeze verb is also the only writer of freeze.gates and freeze.litmus, so writing them in the same slice that ships the writer keeps the record's schema surface single-sourced before slice 4 reads it. Bundling the slice-1 override-nullable P3 and the double-dash hygiene here is the same reasoning: the freeze verb is now the only writer of the record, so making override always-written is a one-touch change; the readiness CLI header's ' -- ' pattern is a small blast radius carried across the slice boundary.",
22
+ "tags": [
23
+ "capability:define-detection"
24
+ ]
25
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "createdAt": "2026-10-01T18:00:00Z",
3
+ "updatedAt": "2026-10-02T19:30:00Z",
4
+ "reqId": "REQ-180",
5
+ "prdId": "PRD-001",
6
+ "title": "Readiness tab as tab 1 and the Overview-to-PRD rename",
7
+ "description": "src/view/readiness.js lands and html-page.js wires it as the first tab. The former Overview tab becomes PRD (same panel content; the rename is label-only). The Readiness panel renders the computeReadiness object top-to-bottom in the layout the DEFINE step 2 spec section 5 pins: tree line (formatTreeLine), two verdict pills with formatVerdictLines strings as the labels and blockedBy.length as the count, two per-persona next-action lines anchored into the stage detail, D1..D8 state chips with reason/acknowledgement text on hover, blockers grouped by persona (profile register orders the pair; the non-register group collapses with its count visible, never omitted), delta list grouped by REQ ancestor with a document-level diff on changed items (criterion-level diff deferred to the UX review per ADR-4127), per-stage check detail with persona pill and findings list when not ok, coverage tree-versus-delta with re-verify and re-execute counts, decisions outstanding in the #241 numbered format, a Freeze now control enabled iff levels.readyToBuild.ok (showing the `rcf define freeze` command and what it will record; disabled it names the failing gates from levels.readyToBuild.blockedBy; no intent-complete button), and the loaded freeze record (hash, when, note, counts, acknowledged gates with reasons). The view is pure: it never recomputes readiness, so the tab and `rcf define readiness --json` cannot disagree on the same tree hash. question cards grouped by source span rendering the questions object, per the viewer UI refresh design section 8.",
8
+ "category": "functional",
9
+ "domain": "defineDetection",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "webUi"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-10-01T18:00:00Z",
19
+ "signals": [
20
+ {
21
+ "source": "description",
22
+ "shape": "webUi",
23
+ "match": "tab"
24
+ }
25
+ ]
26
+ },
27
+ "rationale": "Baz ruling 2026-09-22 (DEFINE step 2 spec section 2.4, decision 2): one object, two renderers. The CLI (REQ-175, PR B) and the tab (REQ-180, PR C) read the same computeReadiness result so they cannot disagree. Readiness is where an operator starts, so it must be tab 1. The Overview panel is just the PRD body today (phase 3.6 dropped the diagram) so the rename is honest; keeping the hash-anchor `#tab-overview` preserves every existing link into the surface. The L1 pre-population posture (ADR-4126) requires the tab to visibly distinguish [draft] shapes from settled ones, which the shapes:draftSettled check row makes legible.",
28
+ "tags": [
29
+ "capability:define-detection"
30
+ ]
31
+ }
@@ -0,0 +1,31 @@
1
+ {
2
+ "createdAt": "2026-10-01T18:00:00Z",
3
+ "updatedAt": "2026-10-01T18:00:00Z",
4
+ "reqId": "REQ-181",
5
+ "prdId": "PRD-001",
6
+ "title": "Shared pill, findings-list and diff view components",
7
+ "description": "src/view/components/{pill,findings-list,diff}.js land as three stable modules every tab can call. pill({ value, variant, title?, href? }) returns a span (or anchor when href is set) with the vocabulary class `rcf-pill--<variant>` for the vocabulary family (gate state green/amber/red; level verdict yes/no; persona po/eng; AC class) and `rcf-pill--<normalisedValue>` for the specific value, so one call site renders one markup shape across every family. findingsList({ heading, count, items }) returns a heading plus an ordered id list, each item an anchor into the document tabs with a one-line `why` string, ids capped at 20 and a `... N more suppressed` tail beyond. diff(before, after) returns a two-column rendering of two document bodies for the delta list. Readiness is the first consumer in 0.29.0; Product Map and Requirements are re-pointed only where the swap is mechanical in this PR (otherwise their markup stays and the swap is a follow-up), so no existing Product Map or Requirements test expectation changes.",
8
+ "category": "functional",
9
+ "domain": "defineDetection",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "webUi"
16
+ ],
17
+ "reason": "keyword-scan",
18
+ "classifiedAt": "2026-10-01T18:00:00Z",
19
+ "signals": [
20
+ {
21
+ "source": "description",
22
+ "shape": "webUi",
23
+ "match": "render"
24
+ }
25
+ ]
26
+ },
27
+ "rationale": "Three tabs today each ship their own markup for the same visual roles (status pill, items list, before-after). The hand-rolled copies drift so a gate state on one tab reads differently from the same gate state on another. Factoring to three shared components makes gate state, persona, level verdict and AC class read the same everywhere and is the smallest surface the Readiness tab needs. The spec is explicit (section 5): one module each, same markup shape across callers; existing tab tests change only where the PR explicitly re-points.",
28
+ "tags": [
29
+ "capability:define-detection"
30
+ ]
31
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-10-03T00:00:00Z",
3
+ "updatedAt": "2026-10-03T00:00:00Z",
4
+ "reqId": "REQ-182",
5
+ "prdId": "PRD-001",
6
+ "title": "DEFINE-stage guidance pack",
7
+ "description": "The DEFINE-stage guidance pack is served through `rcf guidance <slug>`, the `rcf://docs/<slug>` resources and the argument-free MCP prompts registered in guidance/manifest.json: define-intent and discovery-prototypes guidance, the elicitation-playbook restructure, two managed-block rules.",
8
+ "category": "functional",
9
+ "domain": "define",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "none"
16
+ ],
17
+ "reason": "operatorOverride",
18
+ "classifiedAt": "2026-10-03T00:00:00Z",
19
+ "signals": []
20
+ },
21
+ "rationale": "Spec 2026-10-01 (DEFINE step 3) section 6 pins the DEFINE-stage guidance surface: argument-free prompts (served from markdown in guidance/), resource URIs under `rcf://docs/`, and two managed-block rules the harness picks up through `rcf doctor`. REQ-182 was reserved by the PR 2 chain for this pack but did not land on origin/main; this PR authors it minimally with the amended description from spec section 11.8 (that shift is recorded at the top of report.md) so US-18202 has an owning REQ and the pack has a single home across DEFINE step 3 PRs. The amendment keeps room for later PRs to append: step 3 PR 7 will add `rcf_define_litmus` under the same REQ.",
22
+ "tags": [
23
+ "capability:define-intent"
24
+ ]
25
+ }
@@ -0,0 +1,25 @@
1
+ {
2
+ "createdAt": "2026-10-02T18:00:00Z",
3
+ "updatedAt": "2026-10-02T18:00:00Z",
4
+ "reqId": "REQ-186",
5
+ "prdId": "PRD-001",
6
+ "title": "guided product-owner elicitation",
7
+ "description": "rcf-lite computes, from the readiness object, the ordered set of questions one persona can answer, each with the write-back that answers it, so that a harness can conduct the intent-complete loop without an engineer. Nothing is stored; the loop ends when `levels.intentComplete.ok` is true.",
8
+ "category": "functional",
9
+ "domain": "define",
10
+ "priority": "must",
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "shapeClassification": {
14
+ "shapes": [
15
+ "none"
16
+ ],
17
+ "reason": "operatorOverride",
18
+ "classifiedAt": "2026-10-02T18:00:00Z",
19
+ "signals": []
20
+ },
21
+ "rationale": "Spec 2026-10-01 (DEFINE step 3) section 1 pins the loop as harness-driven. rcf-lite supplies the questions, the write-backs and the verdict; the harness holds the conversation. One new read verb `rcf define questions` turns every failing product-owner check into a per-item plain-sentence question carrying its exact write-back; `levels.intentComplete.ok === true` terminates the loop. The engineer register rides the same mechanism with `--persona engineer`.",
22
+ "tags": [
23
+ "capability:define-intent"
24
+ ]
25
+ }