rcf-lite 0.0.1 → 0.7.1
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.
- package/CHANGELOG.md +288 -0
- package/LICENSE +202 -0
- package/README.md +92 -4
- package/bin/rcf-verify.js +122 -0
- package/bin/rcf.js +174 -0
- package/bin/view-supervisor-child.mjs +14 -0
- package/fixtures/canary-manifest.json +103 -0
- package/guidance/README.md +25 -0
- package/guidance/build-cycle-playbook.md +492 -0
- package/guidance/build-cycle.md +40 -0
- package/guidance/document-model.md +45 -0
- package/guidance/elicitation-playbook.md +442 -0
- package/guidance/harness-template.md +246 -0
- package/guidance/managed/README.md +63 -0
- package/guidance/managed/agent-instructions-block.hash +1 -0
- package/guidance/managed/agent-instructions-block.md +220 -0
- package/guidance/managed/legacy-fragment-hashes.json +22 -0
- package/guidance/manifest.json +21 -0
- package/guidance/overview.md +48 -0
- package/guidance/persona-programme.md +44 -0
- package/package.json +69 -8
- package/rcf/adrs/adr-001.json +25 -0
- package/rcf/adrs/adr-002.json +25 -0
- package/rcf/adrs/adr-003.json +25 -0
- package/rcf/adrs/adr-004.json +20 -0
- package/rcf/adrs/adr-005.json +20 -0
- package/rcf/adrs/adr-006.json +25 -0
- package/rcf/adrs/adr-007.json +25 -0
- package/rcf/adrs/adr-008.json +25 -0
- package/rcf/adrs/adr-009.json +25 -0
- package/rcf/build-sequence.json +11 -0
- package/rcf/code-nodes/cn-001.json +14 -0
- package/rcf/code-nodes/cn-002.json +14 -0
- package/rcf/code-nodes/cn-003.json +15 -0
- package/rcf/code-nodes/cn-004.json +17 -0
- package/rcf/code-nodes/cn-005.json +19 -0
- package/rcf/code-nodes/cn-006.json +17 -0
- package/rcf/code-nodes/cn-007.json +16 -0
- package/rcf/code-nodes/cn-008.json +19 -0
- package/rcf/code-nodes/cn-009.json +16 -0
- package/rcf/code-nodes/cn-010.json +18 -0
- package/rcf/code-nodes/cn-011.json +18 -0
- package/rcf/code-nodes/cn-012.json +18 -0
- package/rcf/code-nodes/cn-013.json +19 -0
- package/rcf/code-nodes/cn-014.json +16 -0
- package/rcf/code-nodes/cn-015.json +16 -0
- package/rcf/code-nodes/cn-016.json +16 -0
- package/rcf/code-nodes/cn-017.json +16 -0
- package/rcf/code-nodes/cn-018.json +15 -0
- package/rcf/code-nodes/cn-019.json +16 -0
- package/rcf/code-nodes/cn-020.json +16 -0
- package/rcf/code-nodes/cn-021.json +16 -0
- package/rcf/code-nodes/cn-022.json +16 -0
- package/rcf/code-nodes/cn-023.json +16 -0
- package/rcf/code-nodes/cn-024.json +16 -0
- package/rcf/code-nodes/cn-025.json +16 -0
- package/rcf/code-nodes/cn-026.json +16 -0
- package/rcf/code-nodes/cn-027.json +16 -0
- package/rcf/code-nodes/cn-028.json +16 -0
- package/rcf/code-nodes/cn-029.json +19 -0
- package/rcf/code-nodes/cn-030.json +14 -0
- package/rcf/code-nodes/cn-031.json +14 -0
- package/rcf/code-nodes/cn-032.json +14 -0
- package/rcf/code-nodes/cn-033.json +14 -0
- package/rcf/code-nodes/cn-034.json +14 -0
- package/rcf/code-nodes/cn-035.json +14 -0
- package/rcf/code-nodes/cn-036.json +14 -0
- package/rcf/code-nodes/cn-037.json +14 -0
- package/rcf/code-nodes/cn-038.json +14 -0
- package/rcf/code-nodes/cn-039.json +14 -0
- package/rcf/code-nodes/cn-040.json +14 -0
- package/rcf/code-nodes/cn-041.json +14 -0
- package/rcf/code-nodes/cn-042.json +14 -0
- package/rcf/code-nodes/cn-043.json +14 -0
- package/rcf/code-nodes/cn-044.json +14 -0
- package/rcf/code-nodes/cn-045.json +14 -0
- package/rcf/code-nodes/cn-046.json +14 -0
- package/rcf/code-nodes/cn-047.json +14 -0
- package/rcf/code-nodes/cn-048.json +14 -0
- package/rcf/code-nodes/cn-049.json +14 -0
- package/rcf/code-nodes/cn-050.json +14 -0
- package/rcf/code-nodes/cn-051.json +14 -0
- package/rcf/code-nodes/cn-052.json +14 -0
- package/rcf/code-nodes/cn-053.json +14 -0
- package/rcf/code-nodes/cn-054.json +14 -0
- package/rcf/code-nodes/cn-055.json +14 -0
- package/rcf/code-nodes/cn-056.json +14 -0
- package/rcf/code-nodes/cn-057.json +14 -0
- package/rcf/fbs/fbs-001.json +49 -0
- package/rcf/fbs/fbs-002.json +42 -0
- package/rcf/fbs/fbs-003.json +37 -0
- package/rcf/fbs/fbs-004.json +39 -0
- package/rcf/fbs/fbs-005.json +38 -0
- package/rcf/fbs/fbs-006.json +48 -0
- package/rcf/fbs/fbs-007.json +39 -0
- package/rcf/fbs/fbs-008.json +40 -0
- package/rcf/fbs/fbs-009.json +36 -0
- package/rcf/fbs/fbs-010.json +41 -0
- package/rcf/fbs/fbs-011.json +36 -0
- package/rcf/fbs/fbs-012.json +46 -0
- package/rcf/fbs/fbs-013.json +42 -0
- package/rcf/fbs/fbs-014.json +49 -0
- package/rcf/fbs/fbs-015.json +32 -0
- package/rcf/manifest.json +17 -0
- package/rcf/prd.json +47 -0
- package/rcf/requirements/req-001.json +19 -0
- package/rcf/requirements/req-002.json +19 -0
- package/rcf/requirements/req-003.json +19 -0
- package/rcf/requirements/req-004.json +19 -0
- package/rcf/requirements/req-005.json +19 -0
- package/rcf/requirements/req-006.json +19 -0
- package/rcf/requirements/req-007.json +19 -0
- package/rcf/requirements/req-008.json +19 -0
- package/rcf/requirements/req-009.json +19 -0
- package/rcf/tacs/tac-001.json +45 -0
- package/rcf/tacs/tac-002.json +109 -0
- package/rcf/tacs/tac-003.json +40 -0
- package/rcf/tacs/tac-004.json +51 -0
- package/rcf/tacs/tac-005.json +52 -0
- package/rcf/tacs/tac-006.json +104 -0
- package/rcf/tacs/tac-007.json +38 -0
- package/rcf/tacs/tac-008.json +51 -0
- package/rcf/tad.json +51 -0
- package/rcf/test-suites/PENDING.md +23 -0
- package/rcf/test-suites/ts-001.json +38 -0
- package/rcf/test-suites/ts-002.json +38 -0
- package/rcf/test-suites/ts-003.json +43 -0
- package/rcf/test-suites/ts-004.json +44 -0
- package/rcf/test-suites/ts-005.json +30 -0
- package/rcf/test-suites/ts-006.json +36 -0
- package/rcf/test-suites/ts-007.json +43 -0
- package/rcf/test-suites/ts-008.json +37 -0
- package/rcf/test-suites/ts-009.json +38 -0
- package/rcf/test-suites/ts-010.json +38 -0
- package/rcf/test-suites/ts-011.json +44 -0
- package/rcf/test-suites/ts-012.json +36 -0
- package/rcf/test-suites/ts-013.json +38 -0
- package/rcf/test-suites/ts-014.json +38 -0
- package/rcf/test-suites/ts-015.json +38 -0
- package/rcf/test-suites/ts-016.json +37 -0
- package/rcf/test-suites/ts-017.json +38 -0
- package/rcf/test-suites/ts-018.json +38 -0
- package/rcf/test-suites/ts-019.json +37 -0
- package/rcf/test-suites/ts-020.json +46 -0
- package/rcf/test-suites/ts-021.json +46 -0
- package/rcf/test-suites/ts-022.json +46 -0
- package/rcf/test-suites/ts-023.json +46 -0
- package/rcf/test-suites/ts-024.json +46 -0
- package/rcf/test-suites/ts-025.json +52 -0
- package/rcf/user-stories/us-101.json +40 -0
- package/rcf/user-stories/us-102.json +40 -0
- package/rcf/user-stories/us-201.json +40 -0
- package/rcf/user-stories/us-202.json +40 -0
- package/rcf/user-stories/us-203.json +32 -0
- package/rcf/user-stories/us-301.json +40 -0
- package/rcf/user-stories/us-302.json +40 -0
- package/rcf/user-stories/us-303.json +40 -0
- package/rcf/user-stories/us-304.json +40 -0
- package/rcf/user-stories/us-401.json +40 -0
- package/rcf/user-stories/us-402.json +40 -0
- package/rcf/user-stories/us-403.json +40 -0
- package/rcf/user-stories/us-501.json +40 -0
- package/rcf/user-stories/us-502.json +40 -0
- package/rcf/user-stories/us-503.json +40 -0
- package/rcf/user-stories/us-601.json +40 -0
- package/rcf/user-stories/us-602.json +40 -0
- package/rcf/user-stories/us-701.json +40 -0
- package/rcf/user-stories/us-702.json +40 -0
- package/rcf/user-stories/us-801.json +49 -0
- package/rcf/user-stories/us-802.json +49 -0
- package/rcf/user-stories/us-803.json +49 -0
- package/rcf/user-stories/us-804.json +49 -0
- package/rcf/user-stories/us-805.json +49 -0
- package/rcf/user-stories/us-901.json +40 -0
- package/src/.gitkeep +0 -0
- package/src/browser-verify/auth-smoke.js +109 -0
- package/src/browser-verify/index.js +29 -0
- package/src/browser-verify/invariants.js +336 -0
- package/src/browser-verify/manifest-writer.js +189 -0
- package/src/browser-verify/runner.js +171 -0
- package/src/build/bundle.js +198 -0
- package/src/build/formatters/json.js +18 -0
- package/src/build/formatters/markdown.js +406 -0
- package/src/build/index.js +14 -0
- package/src/build/mark.js +177 -0
- package/src/build/queue.js +285 -0
- package/src/cli/browser-verify.js +231 -0
- package/src/cli/build.js +584 -0
- package/src/cli/coverage.js +219 -0
- package/src/cli/create.js +355 -0
- package/src/cli/delete.js +127 -0
- package/src/cli/design.js +353 -0
- package/src/cli/doctor.js +548 -0
- package/src/cli/fbs.js +171 -0
- package/src/cli/finalise.js +377 -0
- package/src/cli/guidance.js +206 -0
- package/src/cli/help.js +156 -0
- package/src/cli/impact.js +119 -0
- package/src/cli/init.js +282 -0
- package/src/cli/intake.js +153 -0
- package/src/cli/link.js +128 -0
- package/src/cli/mcp.js +160 -0
- package/src/cli/preflight.js +220 -0
- package/src/cli/read.js +162 -0
- package/src/cli/req-baseline.js +269 -0
- package/src/cli/req-classify.js +135 -0
- package/src/cli/review.js +295 -0
- package/src/cli/test-suite.js +216 -0
- package/src/cli/trace.js +172 -0
- package/src/cli/ui-baseline.js +292 -0
- package/src/cli/ui-classify.js +108 -0
- package/src/cli/update.js +197 -0
- package/src/cli/validate.js +168 -0
- package/src/cli/view.js +452 -0
- package/src/core/baseline-catalog/data/auth.json +42 -0
- package/src/core/baseline-catalog/data/http-api.json +42 -0
- package/src/core/baseline-catalog/data/notifications.json +33 -0
- package/src/core/baseline-catalog/data/persistence.json +33 -0
- package/src/core/baseline-catalog/data/web-ui.json +60 -0
- package/src/core/baseline-catalog/index.js +121 -0
- package/src/core/errors/index.js +167 -0
- package/src/core/fixtures/register-canary/canary-prompt-01.json +18 -0
- package/src/core/fixtures/register-canary/canary-prompt-02.json +21 -0
- package/src/core/fixtures/register-canary/canary-prompt-03.json +17 -0
- package/src/core/isolation/index.js +60 -0
- package/src/core/mcp/framing.js +103 -0
- package/src/core/mcp/index.js +8 -0
- package/src/core/mcp/server.js +228 -0
- package/src/core/patterns/register-canary.js +209 -0
- package/src/core/patterns/req-shapes.js +158 -0
- package/src/core/patterns/services.js +358 -0
- package/src/core/patterns/ui-shapes.js +166 -0
- package/src/core/store/cn-resolve.js +134 -0
- package/src/core/store/derive-deps.js +93 -0
- package/src/core/store/ids.js +78 -0
- package/src/core/store/index.js +20 -0
- package/src/core/store/init.js +255 -0
- package/src/core/store/loader.js +211 -0
- package/src/core/store/tp-resolve.js +176 -0
- package/src/core/store/validator.js +191 -0
- package/src/core/store/walker.js +898 -0
- package/src/core/store/writer.js +1849 -0
- package/src/design/index.js +11 -0
- package/src/design/writer.js +271 -0
- package/src/finalise/detect.js +129 -0
- package/src/finalise/index.js +17 -0
- package/src/finalise/ingest.js +119 -0
- package/src/finalise/install.js +119 -0
- package/src/finalise/ship-without-verified.js +131 -0
- package/src/finalise/spawn.js +84 -0
- package/src/intake/fidelity.js +105 -0
- package/src/intake/index.js +6 -0
- package/src/intake/manifest-writer.js +100 -0
- package/src/intake/orchestrator.js +138 -0
- package/src/intake/validate.js +80 -0
- package/src/mcp/map-errors.js +131 -0
- package/src/mcp/prompts.js +49 -0
- package/src/mcp/resources.js +244 -0
- package/src/mcp/tools.js +1204 -0
- package/src/preflight/design-shapes.js +185 -0
- package/src/preflight/index.js +90 -0
- package/src/preflight/manifest-writer.js +264 -0
- package/src/preflight/scanner.js +206 -0
- package/src/preflight/secrets.js +134 -0
- package/src/preflight/session.js +246 -0
- package/src/query/attestation.js +285 -0
- package/src/query/coverage.js +308 -0
- package/src/query/formatters/json.js +21 -0
- package/src/query/formatters/mermaid.js +209 -0
- package/src/query/formatters/table.js +203 -0
- package/src/query/impact.js +173 -0
- package/src/query/index.js +9 -0
- package/src/query/trace.js +345 -0
- package/src/register-canary/fixture-loader.js +87 -0
- package/src/register-canary/index.js +10 -0
- package/src/register-canary/record-writer.js +132 -0
- package/src/register-canary/runner.js +156 -0
- package/src/req-baseline/gate.js +86 -0
- package/src/req-baseline/index.js +27 -0
- package/src/req-baseline/open-candidates.js +143 -0
- package/src/req-baseline/opt-out.js +195 -0
- package/src/req-baseline/sweep.js +230 -0
- package/src/req-detection/classifier.js +181 -0
- package/src/req-detection/index.js +9 -0
- package/src/req-detection/persist.js +55 -0
- package/src/review/index.js +325 -0
- package/src/review/mutation.js +117 -0
- package/src/review/ui-baseline-drift.js +138 -0
- package/src/server/index.js +178 -0
- package/src/server/routes.js +110 -0
- package/src/server/sse.js +118 -0
- package/src/setup/agent-setup.js +362 -0
- package/src/setup/identity-seed.js +104 -0
- package/src/setup/knowledge-seed.js +123 -0
- package/src/setup/managed-block.js +193 -0
- package/src/setup/managed-gitignore.js +166 -0
- package/src/setup/managed-markers.js +49 -0
- package/src/ui-baseline/defaults.js +119 -0
- package/src/ui-baseline/index.js +25 -0
- package/src/ui-baseline/manifest-writer.js +282 -0
- package/src/ui-baseline/session.js +178 -0
- package/src/ui-detection/classifier.js +192 -0
- package/src/verify/chain/index.js +190 -0
- package/src/verify/cli/cleanup.js +61 -0
- package/src/verify/cli/help.js +56 -0
- package/src/verify/cli/mcp.js +98 -0
- package/src/verify/cli/provision.js +71 -0
- package/src/verify/cli/report.js +71 -0
- package/src/verify/cli/run.js +155 -0
- package/src/verify/engine/brief.js +87 -0
- package/src/verify/engine/index.js +177 -0
- package/src/verify/engine/launcher.js +307 -0
- package/src/verify/mcp/tools.js +107 -0
- package/src/verify/profile/index.js +146 -0
- package/src/verify/provision/index.js +256 -0
- package/src/verify/report/index.js +139 -0
- package/src/verify/report/renderer.js +118 -0
- package/src/verify/verdict/index.js +246 -0
- package/src/view/doc-renderers/adr.js +44 -0
- package/src/view/doc-renderers/build-sequence.js +40 -0
- package/src/view/doc-renderers/fbs.js +128 -0
- package/src/view/doc-renderers/helpers.js +159 -0
- package/src/view/doc-renderers/index.js +12 -0
- package/src/view/doc-renderers/prd.js +45 -0
- package/src/view/doc-renderers/req.js +43 -0
- package/src/view/doc-renderers/tac.js +38 -0
- package/src/view/doc-renderers/tad.js +74 -0
- package/src/view/doc-renderers/test-suite.js +45 -0
- package/src/view/doc-renderers/user-story.js +63 -0
- package/src/view/html-page.js +462 -0
- package/src/view/index.js +63 -0
- package/src/view/live-client.js +338 -0
- package/src/view/mermaid-diagram.js +178 -0
- package/src/view/style.css +735 -0
- package/src/view/tree-model.js +152 -0
- package/src/view/vendored/mermaid.min.js +2607 -0
- package/src/view-supervisor/index.js +26 -0
- package/src/view-supervisor/logs.js +32 -0
- package/src/view-supervisor/manifest-writer.js +178 -0
- package/src/view-supervisor/persist-until.js +85 -0
- package/src/view-supervisor/supervisor.js +276 -0
- package/src/watch/index.js +152 -0
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-006",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"name": "MCP server",
|
|
8
|
+
"purpose": "Expose store, query, view and build operations as local stdio MCP tools so an AI harness can drive the whole feature set without shelling out to the CLI.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Register tools with structured input and output for every CRUD, query, view and build operation",
|
|
11
|
+
"Route each tool to the same core operation the CLI uses",
|
|
12
|
+
"Communicate over local stdio only and open no network listener",
|
|
13
|
+
"Serialise structured errors so an AI tool can act on them"
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "A thin MCP adapter registers each tool with a schema for its input and output and maps each tool to a core function. Errors are converted to structured objects via the error and reporting component.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "rcf.read",
|
|
19
|
+
"kind": "mcpTool",
|
|
20
|
+
"description": "Read any RCF document by id over MCP."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "rcf.create",
|
|
24
|
+
"kind": "mcpTool",
|
|
25
|
+
"description": "Create a document with parent linkage over MCP."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "rcf.update",
|
|
29
|
+
"kind": "mcpTool",
|
|
30
|
+
"description": "Update fields on a document over MCP."
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"name": "rcf.delete",
|
|
34
|
+
"kind": "mcpTool",
|
|
35
|
+
"description": "Delete a document with reference safety over MCP."
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"name": "rcf.coverage",
|
|
39
|
+
"kind": "mcpTool",
|
|
40
|
+
"description": "Report coverage gaps over MCP."
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"name": "rcf.trace",
|
|
44
|
+
"kind": "mcpTool",
|
|
45
|
+
"description": "Trace forward or back over MCP."
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"name": "rcf.impact",
|
|
49
|
+
"kind": "mcpTool",
|
|
50
|
+
"description": "Report impact over MCP."
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"name": "rcf.view",
|
|
54
|
+
"kind": "mcpTool",
|
|
55
|
+
"description": "Generate the diagram and the static page over MCP."
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"name": "rcf.build.assemble",
|
|
59
|
+
"kind": "mcpTool",
|
|
60
|
+
"description": "Assemble a build prompt over MCP."
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"name": "rcf.build.markDone",
|
|
64
|
+
"kind": "mcpTool",
|
|
65
|
+
"description": "Mark a slice done over MCP."
|
|
66
|
+
}
|
|
67
|
+
],
|
|
68
|
+
"dependencies": [
|
|
69
|
+
{
|
|
70
|
+
"name": "Document store",
|
|
71
|
+
"kind": "tac",
|
|
72
|
+
"tacId": "TAC-001",
|
|
73
|
+
"description": "CRUD tools route through the store."
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
"name": "View renderer",
|
|
77
|
+
"kind": "tac",
|
|
78
|
+
"tacId": "TAC-003",
|
|
79
|
+
"description": "The view tool routes to the renderer."
|
|
80
|
+
},
|
|
81
|
+
{
|
|
82
|
+
"name": "Query engine",
|
|
83
|
+
"kind": "tac",
|
|
84
|
+
"tacId": "TAC-004",
|
|
85
|
+
"description": "Coverage, trace and impact tools route to the query engine."
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"name": "Build adapter",
|
|
89
|
+
"kind": "tac",
|
|
90
|
+
"tacId": "TAC-005",
|
|
91
|
+
"description": "Build tools route to the build adapter."
|
|
92
|
+
},
|
|
93
|
+
{
|
|
94
|
+
"name": "Error and reporting",
|
|
95
|
+
"kind": "tac",
|
|
96
|
+
"tacId": "TAC-007",
|
|
97
|
+
"description": "Structured errors are serialised for the MCP client."
|
|
98
|
+
}
|
|
99
|
+
],
|
|
100
|
+
"tradeoffs": "Local stdio sacrifices the convenience of a hosted MCP but is the only transport that preserves filesystem access; the trade is locked by the differentiator.",
|
|
101
|
+
"notes": "The MCP surface mirrors the CLI verb set so behaviour is identical across surfaces.",
|
|
102
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
103
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
104
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-007",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"name": "Error and reporting",
|
|
8
|
+
"purpose": "The structured error type and the consistent rendering of errors across CLI and MCP surfaces.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Define a structured error type carrying the offending field, the rule broken and the document id",
|
|
11
|
+
"Render errors as readable terminal output for the CLI",
|
|
12
|
+
"Serialise errors as structured objects for MCP clients",
|
|
13
|
+
"Aggregate multiple validation failures so all are reported together"
|
|
14
|
+
],
|
|
15
|
+
"internalStructure": "A small error type and a pair of renderers (terminal and structured). The renderers are pure functions over the error type.",
|
|
16
|
+
"interfaces": [
|
|
17
|
+
{
|
|
18
|
+
"name": "RcfError",
|
|
19
|
+
"kind": "type",
|
|
20
|
+
"description": "The structured error type used throughout the tool."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"name": "renderForTerminal",
|
|
24
|
+
"kind": "function",
|
|
25
|
+
"description": "Render an RcfError as human-readable terminal output."
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"name": "renderForMcp",
|
|
29
|
+
"kind": "function",
|
|
30
|
+
"description": "Serialise an RcfError as a structured object for an MCP client."
|
|
31
|
+
}
|
|
32
|
+
],
|
|
33
|
+
"dependencies": [],
|
|
34
|
+
"tradeoffs": "A single error type across surfaces costs a small loss of surface-specific detail but guarantees that error reporting does not drift between CLI and MCP.",
|
|
35
|
+
"notes": "Validation failures aggregate; the renderers preserve the full list, not just the first.",
|
|
36
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
37
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
38
|
+
}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-20T17:01:52.768Z",
|
|
3
|
+
"updatedAt": "2026-07-20T17:01:52.768Z",
|
|
4
|
+
"purpose": "Ship the agent-facing method layer - the elicitation and build-cycle playbooks, the reference docs and the harness fragment - that teaches an AI agent how to run the RCF method well, served over MCP as resources and prompts and readable in place under guidance/.",
|
|
5
|
+
"responsibilities": [
|
|
6
|
+
"Carry the elicitation method (question frames, AC-depth bar, deploy-target elicitation, hosting-choice guidance) the eliciting agent runs with a human",
|
|
7
|
+
"Carry the build-cycle method (five stages, local-preview default outcome, runtime-provenance discipline, interim self-review) the operating agent runs per FBS",
|
|
8
|
+
"Carry the harness fragment rcf init writes into CLAUDE.md and AGENTS.md, whose RULE blocks foreclose observed failure modes",
|
|
9
|
+
"Keep every shipped claim, verb and channel address mechanically agreed with the tool via the drift tests"
|
|
10
|
+
],
|
|
11
|
+
"internalStructure": "Static markdown files under guidance/, indexed by guidance/manifest.json which maps each file to one canonical MCP address (resources for reference docs, prompts for the playbooks). The harness fragment is a fenced block in harness-template.md that src/setup extracts and writes into agent-instructions files. Drift tests (test/guidance) assert content-and-inventory invariants so the pack and the tool cannot silently diverge.",
|
|
12
|
+
"interfaces": [
|
|
13
|
+
{
|
|
14
|
+
"name": "rcf_elicit_requirements",
|
|
15
|
+
"kind": "prompt",
|
|
16
|
+
"description": "The elicitation playbook, served as an MCP prompt to the eliciting agent."
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"name": "rcf_execute_build_cycle",
|
|
20
|
+
"kind": "prompt",
|
|
21
|
+
"description": "The build-cycle playbook, served as an MCP prompt to the operating agent."
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"name": "harness fragment",
|
|
25
|
+
"kind": "artifact",
|
|
26
|
+
"description": "The RULE-bearing block rcf init writes into CLAUDE.md and AGENTS.md."
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"dependencies": [
|
|
30
|
+
{
|
|
31
|
+
"name": "MCP server",
|
|
32
|
+
"kind": "tac",
|
|
33
|
+
"tacId": "TAC-006",
|
|
34
|
+
"description": "Serves the pack's docs as resources and playbooks as prompts over local stdio."
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"name": "Build adapter",
|
|
38
|
+
"kind": "tac",
|
|
39
|
+
"tacId": "TAC-005",
|
|
40
|
+
"description": "The build-cycle method the pack teaches is executed against the bundles the build adapter assembles."
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"tradeoffs": "The pack is prose served to a model, not enforced code: it can teach a property (local preview, provenance labelling) but cannot mechanically compel it the way a schema compels document shape. Drift tests hold the pack honest against the tool's verbs and inventory; the method's behavioural properties are held by the RULE blocks and the ACs that require them, not by a runtime gate. The productised independent gate is out of scope here (see ADR-009).",
|
|
44
|
+
"notes": "Modelled as a component for the first time by the Tier-1 hardening set; the pack existed and shipped before this TAC captured it.",
|
|
45
|
+
"tacId": "TAC-008",
|
|
46
|
+
"prdId": "PRD-001",
|
|
47
|
+
"tadId": "TAD-001",
|
|
48
|
+
"version": "0.1.0",
|
|
49
|
+
"status": "draft",
|
|
50
|
+
"name": "Agent guidance pack"
|
|
51
|
+
}
|
package/rcf/tad.json
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tadId": "TAD-001",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"version": "0.1.0",
|
|
5
|
+
"status": "draft",
|
|
6
|
+
"systemOverview": {
|
|
7
|
+
"executiveSummary": "Build Lite is a Node 24 ESM toolset whose core is a set of local filesystem operations over a project's RCF documents. CRUD, query, view, the build loop and the MCP surface are all thin layers over a shared document store that reads and writes the on-disk rcf tree and validates against the published schemas at every boundary.",
|
|
8
|
+
"systemPurpose": "Run the full RCF method over in-repository documents and surface it through deterministic, structured operations for a non-engineering owner and for AI tooling.",
|
|
9
|
+
"architecturalApproach": "Layered. A document-store core owns load, validate and persist. A CLI binary, a view renderer, a query engine, a build adapter and an MCP server are all consumers of that core. No layer reaches the filesystem except through the store.",
|
|
10
|
+
"keyCapabilities": [
|
|
11
|
+
"Filesystem-backed RCF document store with schema validation at boundaries",
|
|
12
|
+
"Deterministic CRUD verbs over every document type",
|
|
13
|
+
"Diagram and HTML rendering of the whole tree",
|
|
14
|
+
"Traceability and query over the chain",
|
|
15
|
+
"Build-specification to implementation-prompt assembly",
|
|
16
|
+
"Local stdio MCP surface over the whole feature set"
|
|
17
|
+
]
|
|
18
|
+
},
|
|
19
|
+
"architecturePrinciples": [
|
|
20
|
+
{
|
|
21
|
+
"name": "Filesystem is the source of truth",
|
|
22
|
+
"description": "Every read and write goes to the local rcf tree; no other store mirrors it.",
|
|
23
|
+
"rationale": "Guarantees the in-repository differentiator and keeps the tool harness-agnostic."
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"name": "Validate at every boundary",
|
|
27
|
+
"description": "Documents are validated against the published schemas on load and before persist.",
|
|
28
|
+
"rationale": "A non-coder cannot catch a malformed document by eye; the tool must refuse to write invalid state."
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"name": "Adapters are thin",
|
|
32
|
+
"description": "CLI, MCP and the build loop carry no business logic the core does not already own.",
|
|
33
|
+
"rationale": "One behaviour, many surfaces; no drift between how a verb behaves on the CLI versus over MCP."
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"name": "Harness-agnostic",
|
|
37
|
+
"description": "The tool runs the same against any AI harness because behaviour lives on the local filesystem and not in a hosted surface.",
|
|
38
|
+
"rationale": "Survives a change of AI harness without re-implementation or migration."
|
|
39
|
+
}
|
|
40
|
+
],
|
|
41
|
+
"integrationArchitecture": {
|
|
42
|
+
"apiDesign": "The store exposes a typed-by-convention internal API of document operations. The CLI maps verbs to those operations and renders results for a terminal. The MCP server maps tools to the same operations and returns structured results. No HTTP API is exposed.",
|
|
43
|
+
"eventModel": "None. Operations are synchronous filesystem reads and writes."
|
|
44
|
+
},
|
|
45
|
+
"operationalConcerns": {
|
|
46
|
+
"healthChecks": "Not applicable for a local binary; a validate command reports project health by validating every document and listing broken references.",
|
|
47
|
+
"logging": "Human-readable terminal output by default; a quiet flag for scripting and a verbose flag for diagnostics."
|
|
48
|
+
},
|
|
49
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
50
|
+
"updatedAt": "2026-07-02T10:22:43Z"
|
|
51
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
# Pending test cases
|
|
2
|
+
|
|
3
|
+
Register of acceptance criteria with **no** Test Case. A TC binds an AC
|
|
4
|
+
only when an existing test genuinely asserts the AC's *outcome* - a
|
|
5
|
+
test that merely exercises the same module does not count. An AC that
|
|
6
|
+
cannot yet be honestly bound is registered here as a row, never stubbed
|
|
7
|
+
as a TC.
|
|
8
|
+
|
|
9
|
+
The register is empty. The assertion-level audit of all 76 ACs
|
|
10
|
+
(w-2026-07-28-005 step 4) opened it with 14 rows; 4 AC-drift rows were
|
|
11
|
+
resolved by operator ruling (AC text revised to the deliberate design,
|
|
12
|
+
then bound), 9 assertion gaps got their tests written and bound
|
|
13
|
+
(w-2026-07-29-014 / w-2026-07-29-015), and the final row - AC-502-2,
|
|
14
|
+
a genuine feature gap - was closed by porting the parallel-safe tier
|
|
15
|
+
computation from the full RCF platform into the build queue and binding
|
|
16
|
+
TC-014-independent-items-share-tier to it.
|
|
17
|
+
|
|
18
|
+
Status: **76 bound / 0 pending** of 76 ACs. `rcf coverage --strict`
|
|
19
|
+
exits 0, and CI runs `rcf validate` and `rcf coverage --strict` as
|
|
20
|
+
required steps, so a new uncovered AC or a non-resolving testPointer
|
|
21
|
+
fails the build. A future genuine gap gets a row here (AC id, US, kind,
|
|
22
|
+
what a sufficient test must assert, nearest existing test) until its
|
|
23
|
+
test lands.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:17.054Z",
|
|
3
|
+
"updatedAt": "2026-07-29T12:57:17.346Z",
|
|
4
|
+
"purpose": "Verify initialisation creates the canonical rcf structure, refuses to overwrite an existing project, and yields a tree walkable from the manifest roots.",
|
|
5
|
+
"testLevel": "unit",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-101-1",
|
|
8
|
+
"AC-101-2",
|
|
9
|
+
"AC-101-3"
|
|
10
|
+
],
|
|
11
|
+
"id": "TS-001",
|
|
12
|
+
"usId": "US-101",
|
|
13
|
+
"title": "Project initialisation on disk",
|
|
14
|
+
"testCases": [
|
|
15
|
+
{
|
|
16
|
+
"id": "TC-001-init-clean-tree-roots",
|
|
17
|
+
"acId": "AC-101-1",
|
|
18
|
+
"description": "initProject followed by walkTree yields a clean tree whose manifest declares the PRD, TAD and BS roots",
|
|
19
|
+
"status": "pending",
|
|
20
|
+
"testPointer": "test/core/store/init.test.js::initProject + walkTree yields a clean tree (AC-101-1, AC-101-3)"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "TC-001-init-refuses-overwrite",
|
|
24
|
+
"acId": "AC-101-2",
|
|
25
|
+
"description": "a second initProject on the same directory refuses with a usage error reporting the project already exists",
|
|
26
|
+
"status": "pending",
|
|
27
|
+
"testPointer": "test/core/store/init.test.js::initProject refuses to overwrite an existing manifest (AC-101-2)"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "TC-001-children-discoverable-from-roots",
|
|
31
|
+
"acId": "AC-101-3",
|
|
32
|
+
"description": "every scaffolded child document is resolved by walking parent id lists from the manifest roots",
|
|
33
|
+
"status": "pending",
|
|
34
|
+
"testPointer": "test/core/store/init.test.js::initProject + walkTree yields a clean tree (AC-101-1, AC-101-3)"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"status": "draft"
|
|
38
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:17.443Z",
|
|
3
|
+
"updatedAt": "2026-07-29T12:57:17.739Z",
|
|
4
|
+
"purpose": "Verify loading reads the manifest roots, resolves every child by walking parent id lists, and reports missing, unparseable or broken documents as structured errors without crashing.",
|
|
5
|
+
"testLevel": "unit",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-102-1",
|
|
8
|
+
"AC-102-2",
|
|
9
|
+
"AC-102-3"
|
|
10
|
+
],
|
|
11
|
+
"id": "TS-002",
|
|
12
|
+
"usId": "US-102",
|
|
13
|
+
"title": "Tree load and walk",
|
|
14
|
+
"testCases": [
|
|
15
|
+
{
|
|
16
|
+
"id": "TC-002-walk-loads-every-document",
|
|
17
|
+
"acId": "AC-102-1",
|
|
18
|
+
"description": "walkTree reads the manifest roots and loads every document on the live tree with zero errors",
|
|
19
|
+
"status": "pending",
|
|
20
|
+
"testPointer": "test/store/walker.test.js::walkTree on the live tree loads every document and returns zero errors"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "TC-002-parse-failure-structured-no-crash",
|
|
24
|
+
"acId": "AC-102-2",
|
|
25
|
+
"description": "an unparseable document surfaces as a structured parseFailure naming the document id while the walk continues",
|
|
26
|
+
"status": "pending",
|
|
27
|
+
"testPointer": "test/store/walker.test.js::walkTree reports parseFailure without crashing the walk"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "TC-002-broken-reference-reported",
|
|
31
|
+
"acId": "AC-102-3",
|
|
32
|
+
"description": "a broken prdId reference surfaces as a brokenReference error naming document, field and file",
|
|
33
|
+
"status": "pending",
|
|
34
|
+
"testPointer": "test/store/walker.test.js::walkTree reports a REQ with a broken prdId as brokenReference (D7 step 5, D8)"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"status": "draft"
|
|
38
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:17.843Z",
|
|
3
|
+
"updatedAt": "2026-07-29T13:35:26.351Z",
|
|
4
|
+
"purpose": "Verify the tree renders to mermaid diagram source. AC-201-1 and AC-201-2 are pending: no existing test asserts PRD plus architecture documents in the diagram, nor visible broken-link marking (see test-suites/PENDING.md).",
|
|
5
|
+
"testLevel": "unit",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-201-3"
|
|
8
|
+
],
|
|
9
|
+
"id": "TS-003",
|
|
10
|
+
"usId": "US-201",
|
|
11
|
+
"title": "Mermaid diagram generation",
|
|
12
|
+
"testCases": [
|
|
13
|
+
{
|
|
14
|
+
"id": "TC-003-diagram-emitted-as-source",
|
|
15
|
+
"acId": "AC-201-3",
|
|
16
|
+
"description": "the requirement subdiagram is emitted as mermaid flowchart source",
|
|
17
|
+
"status": "pending",
|
|
18
|
+
"testPointer": "test/view/mermaid-diagram.test.js::requirementSubdiagram uses flowchart LR orientation"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "TC-003-per-req-subdiagram-chain-edges",
|
|
22
|
+
"acId": "AC-201-1",
|
|
23
|
+
"description": "each REQ subdiagram carries chain edges REQ to US to AC plus FBS delivery back-links, scoped to that requirement only",
|
|
24
|
+
"status": "pending",
|
|
25
|
+
"testPointer": "test/view/mermaid-diagram.test.js::requirementSubdiagram carries chain edges and delivers back-links"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "TC-003-one-subdiagram-per-req",
|
|
29
|
+
"acId": "AC-201-1",
|
|
30
|
+
"description": "every requirement is rendered as its own subdiagram (per-REQ design)",
|
|
31
|
+
"status": "pending",
|
|
32
|
+
"testPointer": "test/view/mermaid-diagram.test.js::allRequirementSubdiagrams returns one diagram per REQ"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "TC-003-broken-node-marked-visibly",
|
|
36
|
+
"acId": "AC-201-2",
|
|
37
|
+
"description": "a broken node still renders in the subdiagram and carries the broken class rather than being omitted",
|
|
38
|
+
"status": "pending",
|
|
39
|
+
"testPointer": "test/view/mermaid-diagram.test.js::requirementSubdiagram marks a broken node visibly rather than omitting it (AC-201-2)"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"status": "draft"
|
|
43
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:18.038Z",
|
|
3
|
+
"updatedAt": "2026-07-29T13:35:14.688Z",
|
|
4
|
+
"purpose": "Verify documents render as readable curated fields with working inter-document links. AC-202-1 is pending: its static-files-no-server clause predates the Phase 3.8 server-only view (see test-suites/PENDING.md).",
|
|
5
|
+
"testLevel": "unit",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-202-2",
|
|
8
|
+
"AC-202-3"
|
|
9
|
+
],
|
|
10
|
+
"id": "TS-004",
|
|
11
|
+
"usId": "US-202",
|
|
12
|
+
"title": "Browsable page rendering",
|
|
13
|
+
"testCases": [
|
|
14
|
+
{
|
|
15
|
+
"id": "TC-004-curated-fields-not-raw-json",
|
|
16
|
+
"acId": "AC-202-2",
|
|
17
|
+
"description": "renderPage renders curated key fields as readable text rather than raw JSON",
|
|
18
|
+
"status": "pending",
|
|
19
|
+
"testPointer": "test/view/html-page.test.js::renderPage renders curated key fields, not raw JSON (AC-202-2)"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "TC-004-doc-links-navigate-to-sections",
|
|
23
|
+
"acId": "AC-202-3",
|
|
24
|
+
"description": "document links render as anchors targeting the raw doc id section",
|
|
25
|
+
"status": "pending",
|
|
26
|
+
"testPointer": "test/view/doc-renderers/helpers.test.js::docLink renders an anchor to the raw id"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "TC-004-valid-html5-page",
|
|
30
|
+
"acId": "AC-202-1",
|
|
31
|
+
"description": "the rendered page is a valid HTML5 document",
|
|
32
|
+
"status": "pending",
|
|
33
|
+
"testPointer": "test/view/html-page.test.js::renderPage emits a valid HTML5 document (AC-202-1)"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "TC-004-served-live-no-files-written",
|
|
37
|
+
"acId": "AC-202-1",
|
|
38
|
+
"description": "the view serves from a local server process and never writes files to disk",
|
|
39
|
+
"status": "pending",
|
|
40
|
+
"testPointer": "test/view/cli.test.js::rcf view never writes any files to disk (regression against static mode)"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"status": "draft"
|
|
44
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:18.331Z",
|
|
3
|
+
"updatedAt": "2026-07-29T12:57:18.527Z",
|
|
4
|
+
"purpose": "Verify the view is produced fresh from the on-disk tree on every regeneration and carries no cached prior state.",
|
|
5
|
+
"testLevel": "integration",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-203-1",
|
|
8
|
+
"AC-203-2"
|
|
9
|
+
],
|
|
10
|
+
"id": "TS-005",
|
|
11
|
+
"usId": "US-203",
|
|
12
|
+
"title": "View freshness",
|
|
13
|
+
"testCases": [
|
|
14
|
+
{
|
|
15
|
+
"id": "TC-005-edit-present-after-regenerate",
|
|
16
|
+
"acId": "AC-203-1",
|
|
17
|
+
"description": "an on-disk edit is present in the regenerated view output",
|
|
18
|
+
"status": "pending",
|
|
19
|
+
"testPointer": "test/view/integration.test.js::renderModelToPage picks up manifest changes between calls (re-walk is fresh)"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "TC-005-no-cached-prior-state",
|
|
23
|
+
"acId": "AC-203-2",
|
|
24
|
+
"description": "regeneration re-walks the tree fresh and drops all prior-state content",
|
|
25
|
+
"status": "pending",
|
|
26
|
+
"testPointer": "test/view/integration.test.js::renderModelToPage picks up manifest changes between calls (re-walk is fresh)"
|
|
27
|
+
}
|
|
28
|
+
],
|
|
29
|
+
"status": "draft"
|
|
30
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:18.625Z",
|
|
3
|
+
"updatedAt": "2026-07-29T13:35:26.548Z",
|
|
4
|
+
"purpose": "Verify reading behaviour for unknown ids. AC-301-1 and AC-301-3 are pending: the read verb does not report per-document validity today (see test-suites/PENDING.md).",
|
|
5
|
+
"testLevel": "integration",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-301-2"
|
|
8
|
+
],
|
|
9
|
+
"id": "TS-006",
|
|
10
|
+
"usId": "US-301",
|
|
11
|
+
"title": "Read verb",
|
|
12
|
+
"testCases": [
|
|
13
|
+
{
|
|
14
|
+
"id": "TC-006-read-unknown-id-not-found",
|
|
15
|
+
"acId": "AC-301-2",
|
|
16
|
+
"description": "reading an unknown id exits 2 with a structured not-found usage error",
|
|
17
|
+
"status": "pending",
|
|
18
|
+
"testPointer": "test/cli/read.test.js::rcf read UNKNOWN-999 exits 2 (usage, unknown id)"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "TC-006-read-reports-valid",
|
|
22
|
+
"acId": "AC-301-1",
|
|
23
|
+
"description": "read returns the body on stdout and reports the document valid against its schema on stderr",
|
|
24
|
+
"status": "pending",
|
|
25
|
+
"testPointer": "test/cli/read.test.js::rcf read REQ-001 returns the body and reports it valid against its schema (AC-301-1)"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "TC-006-read-invalid-content-plus-errors",
|
|
29
|
+
"acId": "AC-301-3",
|
|
30
|
+
"description": "read on an invalid-but-present document returns the content together with the validation errors",
|
|
31
|
+
"status": "pending",
|
|
32
|
+
"testPointer": "test/cli/read.test.js::rcf read on an invalid-but-present document returns the content together with the validation errors (AC-301-3)"
|
|
33
|
+
}
|
|
34
|
+
],
|
|
35
|
+
"status": "draft"
|
|
36
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:18.823Z",
|
|
3
|
+
"updatedAt": "2026-07-29T13:35:48.640Z",
|
|
4
|
+
"purpose": "Verify create refuses conflicting ids. AC-302-1 (PRD requirementIds list, removed by D2) and AC-302-3 (create-invalid-body path untested) are pending (see test-suites/PENDING.md).",
|
|
5
|
+
"testLevel": "unit",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-302-2"
|
|
8
|
+
],
|
|
9
|
+
"id": "TS-007",
|
|
10
|
+
"usId": "US-302",
|
|
11
|
+
"title": "Create verb safety",
|
|
12
|
+
"testCases": [
|
|
13
|
+
{
|
|
14
|
+
"id": "TC-007-create-id-collision-refused",
|
|
15
|
+
"acId": "AC-302-2",
|
|
16
|
+
"description": "create with a conflicting id returns a clear conflict error and writes nothing",
|
|
17
|
+
"status": "pending",
|
|
18
|
+
"testPointer": "test/core/store/writer.test.js::createDocument refuses on id collision (exit 2) and writes nothing (AC-302-2)"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "TC-007-create-writes-validating-child",
|
|
22
|
+
"acId": "AC-302-1",
|
|
23
|
+
"description": "create writes the requirement file carrying its prdId parent edge and the reloaded tree validates clean",
|
|
24
|
+
"status": "pending",
|
|
25
|
+
"testPointer": "test/core/store/writer.test.js::createDocument req writes a schema-valid child file"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "TC-007-create-leaves-prd-untouched",
|
|
29
|
+
"acId": "AC-302-1",
|
|
30
|
+
"description": "create leaves the parent PRD file byte-identical (child-owned parent edges)",
|
|
31
|
+
"status": "pending",
|
|
32
|
+
"testPointer": "test/core/store/writer.test.js::createDocument does NOT mutate the parent PRD file (Phase 3.7 §D2)"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "TC-007-create-invalid-writes-nothing",
|
|
36
|
+
"acId": "AC-302-3",
|
|
37
|
+
"description": "create with a schema-invalid body returns the validation error and writes no file",
|
|
38
|
+
"status": "pending",
|
|
39
|
+
"testPointer": "test/core/store/writer.test.js::createDocument with a schema-invalid body writes nothing and returns the validation error (AC-302-3)"
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
"status": "draft"
|
|
43
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:19.018Z",
|
|
3
|
+
"updatedAt": "2026-07-29T13:35:26.749Z",
|
|
4
|
+
"purpose": "Verify valid updates persist with updatedAt advanced and invalidating updates are refused. AC-303-3 (update on unknown id) is pending (see test-suites/PENDING.md).",
|
|
5
|
+
"testLevel": "integration",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-303-1",
|
|
8
|
+
"AC-303-2"
|
|
9
|
+
],
|
|
10
|
+
"id": "TS-008",
|
|
11
|
+
"usId": "US-303",
|
|
12
|
+
"title": "Update verb safety",
|
|
13
|
+
"testCases": [
|
|
14
|
+
{
|
|
15
|
+
"id": "TC-008-valid-update-persists-updatedat",
|
|
16
|
+
"acId": "AC-303-1",
|
|
17
|
+
"description": "a valid update persists the change and advances updatedAt on disk",
|
|
18
|
+
"status": "pending",
|
|
19
|
+
"testPointer": "test/cli/update.test.js::rcf update REQ-001 --set title=X changes the title and bumps updatedAt"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "TC-008-invalid-update-refused",
|
|
23
|
+
"acId": "AC-303-2",
|
|
24
|
+
"description": "a schema-invalidating update on a valid tree is refused with the validation error",
|
|
25
|
+
"status": "pending",
|
|
26
|
+
"testPointer": "test/core/store/writer-postwrite.test.js::(e) normal-path refusal intact: invalid doc into a VALID tree still refuses"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"id": "TC-008-update-unknown-id-not-found",
|
|
30
|
+
"acId": "AC-303-3",
|
|
31
|
+
"description": "update on a nonexistent id returns a structured not-found error naming the id and writes nothing",
|
|
32
|
+
"status": "pending",
|
|
33
|
+
"testPointer": "test/cli/update.test.js::rcf update REQ-999 returns a structured not-found error and writes nothing (AC-303-3)"
|
|
34
|
+
}
|
|
35
|
+
],
|
|
36
|
+
"status": "draft"
|
|
37
|
+
}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-07-29T12:57:19.311Z",
|
|
3
|
+
"updatedAt": "2026-07-29T12:57:19.605Z",
|
|
4
|
+
"purpose": "Verify delete refuses while dependants exist, cascades cleanly, and removes unreferenced leaves leaving the tree valid.",
|
|
5
|
+
"testLevel": "integration",
|
|
6
|
+
"acIds": [
|
|
7
|
+
"AC-304-1",
|
|
8
|
+
"AC-304-2",
|
|
9
|
+
"AC-304-3"
|
|
10
|
+
],
|
|
11
|
+
"id": "TS-009",
|
|
12
|
+
"usId": "US-304",
|
|
13
|
+
"title": "Delete with reference safety",
|
|
14
|
+
"testCases": [
|
|
15
|
+
{
|
|
16
|
+
"id": "TC-009-delete-refused-with-dependents",
|
|
17
|
+
"acId": "AC-304-1",
|
|
18
|
+
"description": "delete without cascade refuses with exit 4 naming dependents",
|
|
19
|
+
"status": "pending",
|
|
20
|
+
"testPointer": "test/cli/delete.test.js::rcf delete REQ-001 without --cascade refuses with exit 4"
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"id": "TC-009-cascade-removes-subtree",
|
|
24
|
+
"acId": "AC-304-2",
|
|
25
|
+
"description": "cascade delete removes the sub-tree files leaving the tree valid",
|
|
26
|
+
"status": "pending",
|
|
27
|
+
"testPointer": "test/core/store/writer.test.js::deleteDocument REQ --cascade removes REQ + descendant USes + TSs"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "TC-009-leaf-delete-removes-file",
|
|
31
|
+
"acId": "AC-304-3",
|
|
32
|
+
"description": "deleting an unreferenced leaf removes the file with exit 0 on a still-valid tree",
|
|
33
|
+
"status": "pending",
|
|
34
|
+
"testPointer": "test/cli/delete.test.js::rcf delete leaf ADR-001 removes the file (exit 0)"
|
|
35
|
+
}
|
|
36
|
+
],
|
|
37
|
+
"status": "draft"
|
|
38
|
+
}
|