rcf-lite 0.0.1 → 0.8.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.
- package/CHANGELOG.md +344 -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 +71 -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/admissibility/enforce.js +142 -0
- package/src/admissibility/index.js +8 -0
- package/src/admissibility/markers.js +104 -0
- package/src/admissibility/scope-lint.js +163 -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 +358 -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 +168 -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 +221 -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 +214 -0
- package/src/core/store/tp-resolve.js +176 -0
- package/src/core/store/validator.js +191 -0
- package/src/core/store/walker.js +944 -0
- package/src/core/store/writer.js +1879 -0
- package/src/design/index.js +11 -0
- package/src/design/writer.js +271 -0
- package/src/finalise/detect.js +151 -0
- package/src/finalise/index.js +31 -0
- package/src/finalise/ingest.js +160 -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 +1212 -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 +13 -0
- package/src/query/refuse-on-admissibility.js +73 -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/ruleset/index.js +140 -0
- package/src/ruleset/ruleset.json +146 -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 +221 -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 +313 -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,52 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-025",
|
|
3
|
+
"usId": "US-901",
|
|
4
|
+
"title": "`rcf verify` subcommand routing (0.7.1 consolidation)",
|
|
5
|
+
"purpose": "Verify the umbrella CLI mounts `rcf verify` as a first-class subcommand that dispatches to the same handlers the transition-grace `rcf-verify` alias bin exposes, that the top-level help advertises it, and that the alias bin emits a one-line stderr deprecation notice (suppressible via RCF_QUIET) when run directly.",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": [
|
|
8
|
+
"AC-901-1",
|
|
9
|
+
"AC-901-2",
|
|
10
|
+
"AC-901-3"
|
|
11
|
+
],
|
|
12
|
+
"testCases": [
|
|
13
|
+
{
|
|
14
|
+
"id": "TC-025-verify-routes-to-alias-dispatcher",
|
|
15
|
+
"acId": "AC-901-1",
|
|
16
|
+
"description": "the `verify` entry on the top-level SUBCOMMANDS map is the same `main` function the alias bin exports",
|
|
17
|
+
"status": "pending",
|
|
18
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-1: `verify` on the top-level SUBCOMMANDS map is the alias bin's dispatcher"
|
|
19
|
+
},
|
|
20
|
+
{
|
|
21
|
+
"id": "TC-025-verify-help-parity",
|
|
22
|
+
"acId": "AC-901-1",
|
|
23
|
+
"description": "`rcf verify --help` and `rcf-verify --help` print byte-identical help",
|
|
24
|
+
"status": "pending",
|
|
25
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-1 (routing surface): `rcf verify --help` dispatches to the same help block as `rcf-verify --help`"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"id": "TC-025-top-level-help-lists-verify",
|
|
29
|
+
"acId": "AC-901-2",
|
|
30
|
+
"description": "the top-level rcf --help output lists `verify <verb>` alongside the other commands",
|
|
31
|
+
"status": "pending",
|
|
32
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-2: `rcf --help` advertises the verify subcommand"
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
"id": "TC-025-alias-emits-deprecation-notice",
|
|
36
|
+
"acId": "AC-901-3",
|
|
37
|
+
"description": "`rcf-verify` alias bin emits exactly one stderr line pointing at `rcf verify` when invoked directly",
|
|
38
|
+
"status": "pending",
|
|
39
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3: `rcf-verify` alias emits a one-line stderr deprecation notice on direct invocation"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"id": "TC-025-alias-honours-quiet-env",
|
|
43
|
+
"acId": "AC-901-3",
|
|
44
|
+
"description": "RCF_QUIET=1 silences the deprecation notice for scripted callers",
|
|
45
|
+
"status": "pending",
|
|
46
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3 (silencing): `rcf-verify` with RCF_QUIET=1 does not emit the deprecation notice"
|
|
47
|
+
}
|
|
48
|
+
],
|
|
49
|
+
"status": "draft",
|
|
50
|
+
"createdAt": "2026-08-11T00:00:00Z",
|
|
51
|
+
"updatedAt": "2026-08-11T00:00:00Z"
|
|
52
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Initialise an RCF project on disk",
|
|
8
|
+
"description": "A project owner starts a new RCF project and gets the canonical on-disk structure created for them, ready to receive documents.",
|
|
9
|
+
"asA": "project owner starting a new RCF project",
|
|
10
|
+
"iWant": "to run a single initialise command that creates the rcf folder, the manifest and the root document placeholders",
|
|
11
|
+
"soThat": "I have a valid RCF project structure on disk without authoring any layout by hand",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-101-1",
|
|
15
|
+
"description": "Initialise creates the rcf folder and a manifest declaring the three roots",
|
|
16
|
+
"given": "an empty target directory",
|
|
17
|
+
"when": "the initialise command runs",
|
|
18
|
+
"then": "an rcf folder exists containing a manifest that declares prd, tad and bs root references and validates against the manifest schema",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-101-2",
|
|
23
|
+
"description": "Initialise refuses to overwrite an existing project",
|
|
24
|
+
"given": "a directory that already contains an rcf manifest",
|
|
25
|
+
"when": "the initialise command runs without an explicit force flag",
|
|
26
|
+
"then": "the command exits non-zero, makes no changes and reports that a project already exists",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-101-3",
|
|
31
|
+
"description": "Every document is discoverable by walking from the roots",
|
|
32
|
+
"given": "an initialised project with a PRD, a TAD and a Build Sequence",
|
|
33
|
+
"when": "the project is loaded",
|
|
34
|
+
"then": "all child documents are resolved by reading the parent id lists, with no child enumeration in the manifest",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-001",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Load and walk the tree",
|
|
8
|
+
"description": "A project owner or an AI tool loads the whole RCF tree from on-disk files in one operation, producing a single validated in-memory view for later commands.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to load the whole RCF tree from the on-disk files in one operation",
|
|
11
|
+
"soThat": "every later command works against a single, validated in-memory view of the project",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-102-1",
|
|
15
|
+
"description": "Loading reads the manifest roots and resolves every child by walking parent id lists",
|
|
16
|
+
"given": "an initialised project",
|
|
17
|
+
"when": "the tree is loaded",
|
|
18
|
+
"then": "the manifest roots are read and every child is resolved by walking the parent id lists",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-102-2",
|
|
23
|
+
"description": "Missing or unparseable files are reported as structured errors and do not crash the load",
|
|
24
|
+
"given": "a document file that is missing or unparseable",
|
|
25
|
+
"when": "the tree is loaded",
|
|
26
|
+
"then": "the load reports a structured error naming the document id and the file path, and does not crash",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-102-3",
|
|
31
|
+
"description": "Broken references are reported as part of project health, not swallowed",
|
|
32
|
+
"given": "a reference to a document id that has no file",
|
|
33
|
+
"when": "the tree is loaded",
|
|
34
|
+
"then": "the broken reference is reported as part of project health, not swallowed",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-201",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-002",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Render the tree as a diagram",
|
|
8
|
+
"description": "A non-coding owner sees the whole RCF tree at a glance as a diagram of documents and the links between them.",
|
|
9
|
+
"asA": "project owner who cannot read code",
|
|
10
|
+
"iWant": "a diagram of the whole RCF tree showing documents and the links between them",
|
|
11
|
+
"soThat": "I can see what is specified at a glance",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-201-1",
|
|
15
|
+
"description": "The tree is rendered as per-requirement subdiagrams carrying chain edges",
|
|
16
|
+
"given": "a loaded project",
|
|
17
|
+
"when": "the diagrams are generated",
|
|
18
|
+
"then": "each requirement is rendered as its own subdiagram showing the requirement, its user stories and acceptance criteria with edges following the chain and FBS delivery back-links, scoped to that requirement only",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-201-2",
|
|
23
|
+
"description": "Broken references are marked visibly rather than omitted",
|
|
24
|
+
"given": "a project with a broken reference",
|
|
25
|
+
"when": "the diagram is generated",
|
|
26
|
+
"then": "the broken link is marked visibly rather than omitted silently",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-201-3",
|
|
31
|
+
"description": "The diagram is produced as source that renders without a running server",
|
|
32
|
+
"given": "a valid project",
|
|
33
|
+
"when": "the diagram is generated",
|
|
34
|
+
"then": "it is produced as a diagram source that renders without a running server",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-07-29T13:34:38.816Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-202",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-002",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Browse the tree as a static page",
|
|
8
|
+
"description": "A project owner opens a static browsable page of the whole RCF tree locally, with each document shown as readable text and inter-document links navigating between sections.",
|
|
9
|
+
"asA": "project owner",
|
|
10
|
+
"iWant": "a browsable static page of the whole tree that I can open locally",
|
|
11
|
+
"soThat": "I can read each document's content and follow its links without a server or a JSON viewer",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-202-1",
|
|
15
|
+
"description": "The view serves a live page from a local server process and writes no files",
|
|
16
|
+
"given": "a loaded project",
|
|
17
|
+
"when": "the view runs",
|
|
18
|
+
"then": "a valid HTML5 page is served live by a local server process and no files are written to disk",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-202-2",
|
|
23
|
+
"description": "Each document's key fields are rendered as readable text, not raw JSON",
|
|
24
|
+
"given": "the page",
|
|
25
|
+
"when": "a document is shown",
|
|
26
|
+
"then": "its key fields are rendered as readable text, not raw JSON",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-202-3",
|
|
31
|
+
"description": "Inter-document links navigate between sections",
|
|
32
|
+
"given": "the page",
|
|
33
|
+
"when": "a document links to another",
|
|
34
|
+
"then": "the link navigates to that document's section",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-07-29T13:34:38.914Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-203",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-002",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "View reflects current on-disk state",
|
|
8
|
+
"description": "A project owner regenerates the view and sees exactly what is currently on disk, never a stale snapshot.",
|
|
9
|
+
"asA": "project owner",
|
|
10
|
+
"iWant": "the view to reflect exactly what is on disk at the moment it is generated",
|
|
11
|
+
"soThat": "I never review a stale snapshot",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-203-1",
|
|
15
|
+
"description": "An edit on disk is present after the view is regenerated",
|
|
16
|
+
"given": "a document edited on disk",
|
|
17
|
+
"when": "the view is regenerated",
|
|
18
|
+
"then": "the change is present in the output",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-203-2",
|
|
23
|
+
"description": "The view is produced fresh from the on-disk tree and carries no cached prior state",
|
|
24
|
+
"given": "the view output",
|
|
25
|
+
"when": "it is generated",
|
|
26
|
+
"then": "it is produced fresh from the on-disk tree and carries no cached prior state",
|
|
27
|
+
"testable": true
|
|
28
|
+
}
|
|
29
|
+
],
|
|
30
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
31
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
32
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-301",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-003",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Read any document",
|
|
8
|
+
"description": "A project owner or AI tool reads any RCF document by id and gets its current content together with a validity report.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to read any RCF document by its id",
|
|
11
|
+
"soThat": "I can inspect a document's current content without opening files by hand",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-301-1",
|
|
15
|
+
"description": "Reading a valid document returns it and reports it as valid",
|
|
16
|
+
"given": "a document id",
|
|
17
|
+
"when": "read runs",
|
|
18
|
+
"then": "the document is returned and reported as valid against its schema",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-301-2",
|
|
23
|
+
"description": "Reading an id with no file returns a structured not-found error naming the id",
|
|
24
|
+
"given": "an id with no file",
|
|
25
|
+
"when": "read runs",
|
|
26
|
+
"then": "a structured not-found error is returned naming the id",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-301-3",
|
|
31
|
+
"description": "Reading an invalid document returns both the content and the validation errors",
|
|
32
|
+
"given": "a document that exists but fails validation",
|
|
33
|
+
"when": "read runs",
|
|
34
|
+
"then": "the document is returned together with the validation errors, so the caller sees both content and the problem",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-302",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-003",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Create a document with parent linkage",
|
|
8
|
+
"description": "A project owner or AI tool creates a new RCF document and the tool maintains the parent linkage automatically.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to create a new RCF document and have its parent linkage maintained",
|
|
11
|
+
"soThat": "the tree stays consistent without me editing two files by hand",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-302-1",
|
|
15
|
+
"description": "Creating a requirement writes a validating child file carrying the parent edge; the PRD file is not modified",
|
|
16
|
+
"given": "a request to create a requirement under a PRD",
|
|
17
|
+
"when": "create runs",
|
|
18
|
+
"then": "the requirement file is written carrying its prdId parent edge and validating, and the parent PRD file is not modified (child-owned parent edges)",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-302-2",
|
|
23
|
+
"description": "Creating a document with a conflicting id writes nothing and returns a clear conflict error",
|
|
24
|
+
"given": "a request to create a document whose id already exists",
|
|
25
|
+
"when": "create runs",
|
|
26
|
+
"then": "no file is written and a clear conflict error is returned",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-302-3",
|
|
31
|
+
"description": "Creating an invalid document writes nothing and returns the validation error",
|
|
32
|
+
"given": "a request to create a document that would not validate",
|
|
33
|
+
"when": "create runs",
|
|
34
|
+
"then": "nothing is written and the validation error is returned",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-07-29T13:34:39.028Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-303",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-003",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Update fields safely",
|
|
8
|
+
"description": "A project owner or AI tool updates fields on an existing document; valid updates persist and invalid updates are refused without disturbing disk state.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to update fields on an existing document",
|
|
11
|
+
"soThat": "I can revise content without rewriting the whole document or risking an invalid result",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-303-1",
|
|
15
|
+
"description": "A valid update is persisted with updatedAt advanced and validates",
|
|
16
|
+
"given": "a valid field update",
|
|
17
|
+
"when": "update runs",
|
|
18
|
+
"then": "the document is rewritten with the change and its updatedAt timestamp advanced, and it validates",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-303-2",
|
|
23
|
+
"description": "An update that would invalidate the document leaves disk unchanged and returns the validation error",
|
|
24
|
+
"given": "an update that would make the document invalid",
|
|
25
|
+
"when": "update runs",
|
|
26
|
+
"then": "the document on disk is unchanged and the validation error is returned",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-303-3",
|
|
31
|
+
"description": "Updating a non-existent document returns a not-found error and writes nothing",
|
|
32
|
+
"given": "an update to a document that does not exist",
|
|
33
|
+
"when": "update runs",
|
|
34
|
+
"then": "a not-found error is returned and nothing is written",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-304",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-003",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Delete with reference safety",
|
|
8
|
+
"description": "A project owner or AI tool deletes a document and the tool refuses to silently orphan its dependants, offering a cascade flag for intentional sub-tree removal.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to delete a document without silently orphaning the documents that depend on it",
|
|
11
|
+
"soThat": "I cannot accidentally break the tree",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-304-1",
|
|
15
|
+
"description": "Deleting a document with dependants without the cascade flag is refused and the blocking references are listed",
|
|
16
|
+
"given": "a document with children or inbound references",
|
|
17
|
+
"when": "delete runs without a cascade flag",
|
|
18
|
+
"then": "nothing is deleted and the blocking references are listed",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-304-2",
|
|
23
|
+
"description": "Deleting with the cascade flag removes the sub-tree and cleans parent references, leaving the tree valid",
|
|
24
|
+
"given": "a document with children",
|
|
25
|
+
"when": "delete runs with a cascade flag",
|
|
26
|
+
"then": "the document and its children are removed and every parent reference to them is cleaned up, leaving the tree valid",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-304-3",
|
|
31
|
+
"description": "Deleting an unreferenced document removes the file and updates the parent id list",
|
|
32
|
+
"given": "a document with no references",
|
|
33
|
+
"when": "delete runs",
|
|
34
|
+
"then": "the file is removed and the parent id list is updated, leaving the tree valid",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-401",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-004",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Coverage report",
|
|
8
|
+
"description": "A project owner generates a coverage report over the tree, listing what is unspecified and untested without reading every document.",
|
|
9
|
+
"asA": "project owner",
|
|
10
|
+
"iWant": "a coverage report over the tree",
|
|
11
|
+
"soThat": "I can see at a glance what is unspecified or untested without reading every document",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-401-1",
|
|
15
|
+
"description": "Coverage lists every requirement that has no user story",
|
|
16
|
+
"given": "a loaded project",
|
|
17
|
+
"when": "coverage runs",
|
|
18
|
+
"then": "it lists every requirement that has no user story",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-401-2",
|
|
23
|
+
"description": "Coverage lists every acceptance criterion that has no test suite",
|
|
24
|
+
"given": "a loaded project",
|
|
25
|
+
"when": "coverage runs",
|
|
26
|
+
"then": "it lists every acceptance criterion that has no test suite",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-401-3",
|
|
31
|
+
"description": "A fully covered project reports complete coverage with no gaps",
|
|
32
|
+
"given": "a fully covered project",
|
|
33
|
+
"when": "coverage runs",
|
|
34
|
+
"then": "it reports complete coverage with no gaps",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-402",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-004",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Trace forward and back",
|
|
8
|
+
"description": "A project owner or AI tool traces from any document forward to its descendants or back to its ancestors, walking only the intent chain.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to trace from any document forward to its descendants and back to its ancestors",
|
|
11
|
+
"soThat": "I can follow an agreed decision down to the work that satisfies it, or a piece of work up to the decision it serves",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-402-1",
|
|
15
|
+
"description": "Trace forward from a requirement returns the user stories, acceptance criteria and any test suites beneath it",
|
|
16
|
+
"given": "a requirement id",
|
|
17
|
+
"when": "trace forward runs",
|
|
18
|
+
"then": "it returns the user stories, acceptance criteria and any test suites beneath it",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-402-2",
|
|
23
|
+
"description": "Trace back from an acceptance criterion returns the parent user story, its requirement and the PRD",
|
|
24
|
+
"given": "an acceptance criterion id",
|
|
25
|
+
"when": "trace back runs",
|
|
26
|
+
"then": "it returns the parent user story, its requirement and the PRD",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-402-3",
|
|
31
|
+
"description": "Forward trace surfaces delivering FBS as cross-link leaves; backward trace walks the intent chain only",
|
|
32
|
+
"given": "the trace",
|
|
33
|
+
"when": "it is computed",
|
|
34
|
+
"then": "forward trace surfaces an AC's delivering FBS items as cross-link leaves and never traverses through the FBS layer, and backward trace walks the intent chain only (AC to US to REQ to PRD) with no FBS nodes",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-07-29T13:34:39.127Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-403",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-004",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Impact analysis",
|
|
8
|
+
"description": "A project owner or AI tool asks what is affected if a document changes and gets the descendants and FBS slots that ripple from the edit.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to ask what is affected if I change a given document",
|
|
11
|
+
"soThat": "I understand the ripple of an edit before I make it",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-403-1",
|
|
15
|
+
"description": "Impact analysis on a requirement returns descendant documents and FBS slots whose acceptance criteria fall under it",
|
|
16
|
+
"given": "a requirement id",
|
|
17
|
+
"when": "impact analysis runs",
|
|
18
|
+
"then": "it returns the descendant documents that depend on it and any FBS slots whose acceptance criteria fall under it",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-403-2",
|
|
23
|
+
"description": "Impact analysis on an architecture document returns the FBS items that reference it as context",
|
|
24
|
+
"given": "an architecture document id",
|
|
25
|
+
"when": "impact analysis runs",
|
|
26
|
+
"then": "it returns the FBS items that reference it as context",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-403-3",
|
|
31
|
+
"description": "Impact analysis on a document with no dependents reports an empty impact set",
|
|
32
|
+
"given": "a document with no dependents",
|
|
33
|
+
"when": "impact analysis runs",
|
|
34
|
+
"then": "it reports an empty impact set",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-501",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-005",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Assemble a build prompt",
|
|
8
|
+
"description": "A project owner or AI tool turns a Functional Build Specification into a single implementation prompt with the acceptance criteria and the architectural context the coding agent needs.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "to turn a Functional Build Specification into a single implementation prompt",
|
|
11
|
+
"soThat": "a coding agent has everything it needs to implement the slice, traceable to the acceptance criteria it must satisfy",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-501-1",
|
|
15
|
+
"description": "Build assembly walks each AC in acIds to its parent user story and includes the Given/When/Then in the prompt",
|
|
16
|
+
"given": "an FBS id",
|
|
17
|
+
"when": "build assembly runs",
|
|
18
|
+
"then": "it walks each acceptance criterion in acIds to its parent user story and includes the criterion's Given/When/Then in the prompt",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-501-2",
|
|
23
|
+
"description": "Build assembly walks the referenced TACs and ADRs and includes their relevant content in the prompt",
|
|
24
|
+
"given": "an FBS that declares architectural context",
|
|
25
|
+
"when": "build assembly runs",
|
|
26
|
+
"then": "it walks the referenced TACs and ADRs and includes their relevant content in the prompt",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-501-3",
|
|
31
|
+
"description": "The assembled prompt is a single markdown document naming FBS, summary, approach, ACs and architectural context",
|
|
32
|
+
"given": "the assembled prompt",
|
|
33
|
+
"when": "it is produced",
|
|
34
|
+
"then": "it is a single markdown document naming the FBS, its summary and approach, the acceptance criteria, and the architectural context",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-502",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "REQ-005",
|
|
5
|
+
"version": "0.1.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Build order respects dependencies",
|
|
8
|
+
"description": "A project owner or AI tool computes a build order that honours the dependency graph declared on FBS items, surfaces parallel-safe items, and detects cycles.",
|
|
9
|
+
"asA": "project owner or AI tool",
|
|
10
|
+
"iWant": "the build order to respect the dependency graph declared on the FBS items",
|
|
11
|
+
"soThat": "no slice is built before the work it depends on",
|
|
12
|
+
"acceptanceCriteria": [
|
|
13
|
+
{
|
|
14
|
+
"id": "AC-502-1",
|
|
15
|
+
"description": "The computed order is a valid topological order in which dependencies precede dependents",
|
|
16
|
+
"given": "a set of FBS items with declared dependencies",
|
|
17
|
+
"when": "the build order is computed",
|
|
18
|
+
"then": "it is a valid ordering in which every dependency precedes the items that depend on it",
|
|
19
|
+
"testable": true
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-502-2",
|
|
23
|
+
"description": "FBS items with no dependency between them are reported as parallel-safe",
|
|
24
|
+
"given": "FBS items with no dependency between them",
|
|
25
|
+
"when": "the build order is computed",
|
|
26
|
+
"then": "they are reported as parallel-safe",
|
|
27
|
+
"testable": true
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "AC-502-3",
|
|
31
|
+
"description": "A dependency cycle is detected and reported rather than producing a partial order",
|
|
32
|
+
"given": "a dependency cycle",
|
|
33
|
+
"when": "the build order is computed",
|
|
34
|
+
"then": "the cycle is detected and reported rather than producing a partial order",
|
|
35
|
+
"testable": true
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"createdAt": "2026-06-25T00:00:00Z",
|
|
39
|
+
"updatedAt": "2026-06-25T00:00:00Z"
|
|
40
|
+
}
|