rcf-lite 0.8.0 → 0.10.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 +124 -51
- package/README.md +8 -4
- package/bin/rcf.js +147 -53
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/README.md +1 -1
- package/guidance/build-cycle-playbook.md +51 -51
- package/guidance/build-cycle.md +7 -7
- package/guidance/document-model.md +1 -1
- package/guidance/elicitation-playbook.md +29 -29
- package/guidance/harness-template.md +21 -10
- package/guidance/managed/README.md +1 -1
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +20 -9
- package/guidance/manifest.json +1 -1
- package/guidance/overview.md +4 -4
- package/package.json +5 -7
- package/rcf/adrs/adr-008.json +1 -1
- package/rcf/adrs/adr-009.json +4 -4
- package/rcf/adrs/adr-010.json +30 -0
- package/rcf/code-nodes/cn-016.json +1 -1
- package/rcf/code-nodes/cn-019.json +1 -1
- package/rcf/code-nodes/cn-020.json +1 -1
- package/rcf/code-nodes/cn-021.json +1 -1
- package/rcf/code-nodes/cn-022.json +1 -1
- package/rcf/code-nodes/cn-049.json +1 -1
- package/rcf/code-nodes/cn-055.json +1 -1
- package/rcf/code-nodes/cn-057.json +5 -5
- package/rcf/code-nodes/cn-058.json +18 -0
- package/rcf/code-nodes/cn-059.json +14 -0
- package/rcf/code-nodes/cn-060.json +14 -0
- package/rcf/code-nodes/cn-061.json +14 -0
- package/rcf/code-nodes/cn-062.json +14 -0
- package/rcf/code-nodes/cn-063.json +15 -0
- package/rcf/code-nodes/cn-064.json +15 -0
- package/rcf/code-nodes/cn-065.json +16 -0
- package/rcf/code-nodes/cn-066.json +14 -0
- package/rcf/code-nodes/cn-067.json +15 -0
- package/rcf/code-nodes/cn-068.json +15 -0
- package/rcf/code-nodes/cn-069.json +16 -0
- package/rcf/fbs/fbs-005.json +1 -1
- package/rcf/fbs/fbs-006.json +2 -2
- package/rcf/fbs/fbs-007.json +1 -1
- package/rcf/fbs/fbs-014.json +1 -1
- package/rcf/fbs/fbs-015.json +9 -8
- package/rcf/fbs/fbs-016.json +39 -0
- package/rcf/fbs/fbs-017.json +40 -0
- package/rcf/fbs/fbs-018.json +34 -0
- package/rcf/fbs/fbs-019.json +33 -0
- package/rcf/requirements/req-008.json +1 -1
- package/rcf/requirements/req-009.json +2 -2
- package/rcf/requirements/req-010.json +20 -0
- package/rcf/test-suites/PENDING.md +2 -2
- package/rcf/test-suites/ts-004.json +1 -1
- package/rcf/test-suites/ts-006.json +3 -3
- package/rcf/test-suites/ts-008.json +2 -2
- package/rcf/test-suites/ts-009.json +2 -2
- package/rcf/test-suites/ts-017.json +1 -1
- package/rcf/test-suites/ts-024.json +1 -1
- package/rcf/test-suites/ts-025.json +32 -18
- package/rcf/test-suites/ts-026.json +54 -0
- package/rcf/test-suites/ts-027.json +115 -0
- package/rcf/test-suites/ts-028.json +46 -0
- package/rcf/test-suites/ts-029.json +46 -0
- package/rcf/user-stories/us-1001.json +56 -0
- package/rcf/user-stories/us-1002.json +96 -0
- package/rcf/user-stories/us-1003.json +48 -0
- package/rcf/user-stories/us-1004.json +48 -0
- package/rcf/user-stories/us-805.json +2 -2
- package/rcf/user-stories/us-901.json +13 -13
- package/src/blueprint/apply.js +464 -0
- package/src/blueprint/conflicts.js +351 -0
- package/src/blueprint/diff.js +82 -0
- package/src/blueprint/index.js +12 -0
- package/src/blueprint/list.js +21 -0
- package/src/blueprint/loader.js +163 -0
- package/src/blueprint/manifest-writer.js +49 -0
- package/src/blueprint/namespace.js +145 -0
- package/src/blueprint/remove.js +105 -0
- package/src/blueprint/resolutions.js +83 -0
- package/src/blueprint/standards.js +148 -0
- package/src/blueprint/supersede.js +318 -0
- package/src/browser-verify/invariants.js +33 -6
- package/src/build/bundle.js +37 -14
- package/src/build/formatters/markdown.js +9 -9
- package/src/build/mark.js +3 -3
- package/src/build/queue.js +1 -1
- package/src/build/standards-selector.js +52 -0
- package/src/cli/blueprint.js +325 -0
- package/src/cli/browser-verify.js +1 -1
- package/src/cli/build.js +139 -69
- package/src/cli/coverage.js +1 -1
- package/src/cli/create.js +48 -3
- package/src/cli/delete.js +2 -2
- package/src/cli/design.js +10 -10
- package/src/cli/fbs.js +1 -1
- package/src/cli/finalise.js +22 -20
- package/src/cli/help.js +269 -89
- package/src/cli/impact.js +1 -1
- package/src/cli/init.js +20 -5
- package/src/cli/intake.js +3 -3
- package/src/cli/link.js +3 -3
- package/src/cli/preflight.js +2 -2
- package/src/cli/read.js +1 -1
- package/src/cli/req-baseline.js +2 -2
- package/src/cli/req-classify.js +3 -3
- package/src/cli/review.js +1 -1
- package/src/cli/standards.js +127 -0
- package/src/cli/test-suite.js +1 -1
- package/src/cli/trace.js +1 -1
- package/src/cli/ui-baseline.js +3 -3
- package/src/cli/ui-classify.js +4 -4
- package/src/cli/update.js +2 -2
- package/src/cli/validate.js +2 -2
- package/src/cli/view.js +12 -10
- package/src/core/store/ids.js +168 -18
- package/src/core/store/loader.js +27 -16
- package/src/core/store/walker.js +27 -15
- package/src/core/store/writer.js +1 -1
- package/src/deployment/index.js +13 -0
- package/src/deployment/placeholder-detector.js +113 -0
- package/src/design/writer.js +3 -3
- package/src/finalise/detect.js +32 -38
- package/src/finalise/index.js +0 -1
- package/src/finalise/install.js +9 -8
- package/src/finalise/spawn.js +14 -10
- package/src/mcp/tools.js +1 -1
- package/src/query/formatters/table.js +7 -10
- package/src/query/trace.js +45 -4
- package/src/req-baseline/gate.js +1 -1
- package/src/ui-baseline/manifest-writer.js +2 -2
- package/src/verify/cli/cleanup.js +1 -1
- package/src/verify/cli/mcp.js +1 -1
- package/src/verify/cli/provision.js +1 -1
- package/src/verify/cli/report.js +1 -1
- package/src/verify/cli/run.js +1 -1
- package/src/view-supervisor/manifest-writer.js +2 -2
- package/bin/rcf-verify.js +0 -122
- package/src/verify/cli/help.js +0 -56
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-057",
|
|
3
|
-
"path": "bin/rcf
|
|
3
|
+
"path": "bin/rcf.js",
|
|
4
4
|
"implementsAcIds": [
|
|
5
5
|
"AC-901-3"
|
|
6
6
|
],
|
|
7
7
|
"dependencies": [],
|
|
8
|
-
"version": "0.
|
|
8
|
+
"version": "0.2.0",
|
|
9
9
|
"status": "draft",
|
|
10
10
|
"createdAt": "2026-08-11T00:00:00Z",
|
|
11
|
-
"updatedAt": "2026-08-
|
|
12
|
-
"title": "
|
|
13
|
-
"description": "
|
|
11
|
+
"updatedAt": "2026-08-26T00:00:00Z",
|
|
12
|
+
"title": "Clean-break dispatcher: old-flat-form refusal with pointer at the new grouped form",
|
|
13
|
+
"description": "The 0.10.0 CLI reorganisation deletes the standalone `rcf-verify` bin outright. bin/rcf.js recognises the old flat verb tokens via OLD_FLAT_MAP and, on match, writes a one-line stderr hint naming the new grouped form ('Try rcf <group> <verb>...') before exiting 2. Not a back-compat fallback; the invocation still fails."
|
|
14
14
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-058",
|
|
3
|
+
"path": "src/blueprint/apply.js#applyBlueprint",
|
|
4
|
+
"title": "Blueprint apply orchestrator",
|
|
5
|
+
"description": "Loads a blueprint from a source directory, runs the conflict-detection pass BEFORE any file write, stamps contribution ids into the blueprint's namespace, copies contribution files into the tree, and appends a validated entry to manifest.blueprints[]. Idempotent on same-slug + same-version re-apply. From Phase 3.5 (w-2026-08-19-008) also composes any operator --resolve declarations into manifest.resolutions[] BEFORE detection so the resolution is honoured this run and persists alongside the applied-blueprint update, wires the singular --reason onto every generated declaration (whitespace-only refused at the writer edge), and dedupes duplicate --resolve topics within a single add (first-wins) surfacing a warning to the caller.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1001-1",
|
|
8
|
+
"AC-1001-4",
|
|
9
|
+
"AC-1002-2",
|
|
10
|
+
"AC-1002-6",
|
|
11
|
+
"AC-1002-7"
|
|
12
|
+
],
|
|
13
|
+
"dependencies": [],
|
|
14
|
+
"version": "0.1.0",
|
|
15
|
+
"status": "draft",
|
|
16
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
17
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
18
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-059",
|
|
3
|
+
"path": "src/blueprint/list.js#listBlueprints",
|
|
4
|
+
"title": "Blueprint list projection",
|
|
5
|
+
"description": "Reads manifest.blueprints[] and returns rows in appliedAt order.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1001-2"
|
|
8
|
+
],
|
|
9
|
+
"dependencies": [],
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"status": "draft",
|
|
12
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
13
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-060",
|
|
3
|
+
"path": "src/blueprint/remove.js#removeBlueprint",
|
|
4
|
+
"title": "Blueprint remove with referring-doc guard",
|
|
5
|
+
"description": "Refuses when any project-authored doc references a contribution id; otherwise unlinks contribution files and rewrites the manifest.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1001-3"
|
|
8
|
+
],
|
|
9
|
+
"dependencies": [],
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"status": "draft",
|
|
12
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
13
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-061",
|
|
3
|
+
"path": "src/cli/blueprint.js#main",
|
|
4
|
+
"title": "rcf define blueprint CLI dispatcher",
|
|
5
|
+
"description": "Wires the blueprint verb family into the unified rcf bin; dispatches add|list|remove.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1001-5"
|
|
8
|
+
],
|
|
9
|
+
"dependencies": [],
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"status": "draft",
|
|
12
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
13
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-062",
|
|
3
|
+
"path": "src/blueprint/namespace.js#stampId",
|
|
4
|
+
"title": "Blueprint id namespacing (prefix + suffix families)",
|
|
5
|
+
"description": "Stamps a doc id with a blueprint slug according to family: prefix for REQ/US/PRD/BS/TAD/TS, suffix for ADR/TAC/FBS/CN.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1002-1"
|
|
8
|
+
],
|
|
9
|
+
"dependencies": [],
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"status": "draft",
|
|
12
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
13
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-063",
|
|
3
|
+
"path": "src/blueprint/conflicts.js#detectGlobalAdrConflicts",
|
|
4
|
+
"title": "scope:global ADR conflict detection",
|
|
5
|
+
"description": "Detects two applied blueprints each contributing a scope:global ADR on the same topic; returns Conflict records.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1002-2",
|
|
8
|
+
"AC-1002-4"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": [],
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
14
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-064",
|
|
3
|
+
"path": "src/blueprint/conflicts.js#renderConflictReport",
|
|
4
|
+
"title": "Conflict-presentation report writer",
|
|
5
|
+
"description": "Renders a Conflict[] list into an operator-facing block with per-side `blueprint <slug>: <title> — <decision>` headers (Phase 3.5 reshape; falls back to `<id> at <path>` when the tree did not carry the ADR body), a refs footer, and four honest resolution paths with actual conflicting blueprint slugs substituted. Symmetric enrichment: BOTH sides (incoming from the blueprint's ADR file on disk, existing from the walker's tree) are decorated with title + one-sentence decision before rendering. A parallel `conflictReportJson(conflicts)` returns the same shape as a JSON object with per-conflict `resolutions[]` triples for agent-driven composition.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1002-3",
|
|
8
|
+
"AC-1002-8"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": [],
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
14
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-065",
|
|
3
|
+
"path": "src/blueprint/standards.js#registerStandardsPack",
|
|
4
|
+
"title": "Standards ingestion (reference-by-default + out-of-root copy)",
|
|
5
|
+
"description": "Detects whether the source lives inside the project root; references-in-place when yes, copies into rcf/standards/<slug>/ when no; writes the manifest.standards[] entry.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1003-1",
|
|
8
|
+
"AC-1003-2",
|
|
9
|
+
"AC-1003-3"
|
|
10
|
+
],
|
|
11
|
+
"dependencies": [],
|
|
12
|
+
"version": "0.1.0",
|
|
13
|
+
"status": "draft",
|
|
14
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
15
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-066",
|
|
3
|
+
"path": "src/cli/standards.js#main",
|
|
4
|
+
"title": "rcf define standards CLI dispatcher",
|
|
5
|
+
"description": "Wires the standards verb family into the unified rcf bin; dispatches add|list.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1003-4"
|
|
8
|
+
],
|
|
9
|
+
"dependencies": [],
|
|
10
|
+
"version": "0.1.0",
|
|
11
|
+
"status": "draft",
|
|
12
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
13
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
14
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-067",
|
|
3
|
+
"path": "src/build/standards-selector.js#selectStandards",
|
|
4
|
+
"title": "Deterministic tag-scoring standards selector",
|
|
5
|
+
"description": "Reads FBS work text against manifest standards tags and returns the deterministic subset of relevant slugs.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1004-1",
|
|
8
|
+
"AC-1004-4"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": [],
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
14
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-068",
|
|
3
|
+
"path": "src/build/bundle.js#assembleBundle",
|
|
4
|
+
"title": "Bundle assembler standardIds host (0.4.4)",
|
|
5
|
+
"description": "Bundle assembler branch that hosts operator-authored contextRequirements.standardIds override + agentic selection, and renders the standards payload alongside TACs/ADRs.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1004-2",
|
|
8
|
+
"AC-1004-3"
|
|
9
|
+
],
|
|
10
|
+
"dependencies": [],
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"createdAt": "2026-08-19T00:00:00Z",
|
|
14
|
+
"updatedAt": "2026-08-19T00:00:00Z"
|
|
15
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-069",
|
|
3
|
+
"path": "src/blueprint/supersede.js#supersedeBlueprintTopic",
|
|
4
|
+
"title": "Project-ADR supersession scaffolder (conflict-pair second side)",
|
|
5
|
+
"description": "Scaffolds a project-level ADR under rcf/adrs/adr-NNN-<kebab-topic>.json that supersedes the CONFLICT PAIR on the topic (one currently-applied blueprint's scope:global ADR + one incoming blueprint's scope:global ADR — Baz ruling, w-2026-08-19-008 round 3), and appends a matching manifest.resolutions[] record so the conflict detector honours the resolution when the operator re-runs `rcf define blueprint add <incoming source>`. The verb accepts an optional `--incoming <source>` argument (required when applied count on the topic is < 2; informational when >= 2): the verb loads the incoming blueprint from disk, finds its scope:global ADR on the topic, stamps the id into the incoming blueprint's namespace, and uses that {slug, adrId} as the second side of supersedes[]. This lets option 3 as printed by the reshaped conflict message execute VERBATIM from the refused-add state — no --resolve prep, no menu-copy weakening. Topic is a LOOKUP KEY (see ADR-010): any string that exact-matches an applied ADR's declared topic is accepted (schema minLength:1, whitespace-only refused at the writer edge; camelCase, snake_case and kebab-case all pass). The scaffolded ADR id derives its slug tail by kebab-ifying the topic (`authModel` -> `ADR-NNN-auth-model`) so the ADR grammar's `[a-z0-9](-[a-z0-9]+)*` tail is satisfied. Every rcfError message returned by this module is prefix-free (no `blueprint supersede: ` in the message body); the CLI edge prepends the single `[error] blueprint supersede: ` line. Refuses when the manifest is missing prd or tad, when applied+incoming count on the topic is < 2, and when a file already exists at the scaffolded ADR path.",
|
|
6
|
+
"implementsAcIds": [
|
|
7
|
+
"AC-1002-5",
|
|
8
|
+
"AC-1002-9",
|
|
9
|
+
"AC-1002-10"
|
|
10
|
+
],
|
|
11
|
+
"dependencies": [],
|
|
12
|
+
"version": "0.1.0",
|
|
13
|
+
"status": "draft",
|
|
14
|
+
"createdAt": "2026-08-19T14:35:00.000Z",
|
|
15
|
+
"updatedAt": "2026-08-19T14:35:00.000Z"
|
|
16
|
+
}
|
package/rcf/fbs/fbs-005.json
CHANGED
package/rcf/fbs/fbs-006.json
CHANGED
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"estimatedSize": "medium",
|
|
32
32
|
"estimatedHours": 8,
|
|
33
33
|
"deliverables": [
|
|
34
|
-
"rcf create verb with parent linkage and conflict detection",
|
|
35
|
-
"rcf update verb with safe field updates",
|
|
34
|
+
"rcf define create verb with parent linkage and conflict detection",
|
|
35
|
+
"rcf define update verb with safe field updates",
|
|
36
36
|
"Validation-error renderer covering both verbs"
|
|
37
37
|
],
|
|
38
38
|
"riskLevel": "medium",
|
package/rcf/fbs/fbs-007.json
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"estimatedSize": "medium",
|
|
23
23
|
"estimatedHours": 6,
|
|
24
24
|
"deliverables": [
|
|
25
|
-
"rcf delete verb with reference-safe default",
|
|
25
|
+
"rcf define delete verb with reference-safe default",
|
|
26
26
|
"Cascade flag with parent-reference cleanup"
|
|
27
27
|
],
|
|
28
28
|
"riskLevel": "medium",
|
package/rcf/fbs/fbs-014.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"createdAt": "2026-07-20T17:05:46.941Z",
|
|
3
3
|
"updatedAt": "2026-07-20T17:05:46.941Z",
|
|
4
4
|
"summary": "Harden the build-cycle guidance so every build lands a documented local preview as its default outcome, every verification claim names the runtime it was checked against, and the method carries interim fresh-context self-review guidance. Edits the build-cycle playbook, the build-cycle contract and the harness fragment; no runtime subsystem.",
|
|
5
|
-
"approach": "In the build-cycle guidance, make a working, documented local preview loop (dev server, seeded data where needed, ideally one command) a required, hosting-independent part of a build's definition of done. Require every 'verified'/'tested' claim - in the Test and Finalise stages and in the PR body's verification section - to name the runtime it was checked against, forbid any claim implying deploy-runtime verification that did not happen, and add an explicit labelled-claim example. Add an interim self-review section describing a periodic and end-of-build fresh-context reviewer dispatch that drives the app against its ACs, targeting session-class bugs, false-promise UI, runtime mismatch, dead auth paths and dead code, scoped honestly as a stopgap until rcf
|
|
5
|
+
"approach": "In the build-cycle guidance, make a working, documented local preview loop (dev server, seeded data where needed, ideally one command) a required, hosting-independent part of a build's definition of done. Require every 'verified'/'tested' claim - in the Test and Finalise stages and in the PR body's verification section - to name the runtime it was checked against, forbid any claim implying deploy-runtime verification that did not happen, and add an explicit labelled-claim example. Add an interim self-review section describing a periodic and end-of-build fresh-context reviewer dispatch that drives the app against its ACs, targeting session-class bugs, false-promise UI, runtime mismatch, dead auth paths and dead code, scoped honestly as a stopgap until rcf verify-lite and explicitly not the independent gate. Add matching harness-fragment rules and extend the guidance drift tests.",
|
|
6
6
|
"deliverables": [
|
|
7
7
|
"Build-cycle guidance: local preview loop as default, hosting-independent definition-of-done item",
|
|
8
8
|
"Build-cycle and PR-authoring guidance: runtime-provenance labelling with a worked example",
|
package/rcf/fbs/fbs-015.json
CHANGED
|
@@ -4,19 +4,20 @@
|
|
|
4
4
|
"bsId": "BS-001",
|
|
5
5
|
"buildOrder": 15,
|
|
6
6
|
"executionStatus": "complete",
|
|
7
|
-
"title": "`rcf verify`
|
|
8
|
-
"summary": "Route the adversarial ship-gate verifier under the unified `rcf` CLI as `rcf verify <run|report|provision|cleanup|mcp>`. The
|
|
9
|
-
"approach": "
|
|
7
|
+
"title": "`rcf verify` group routing (0.10.0 CLI reorganisation)",
|
|
8
|
+
"summary": "Route the adversarial ship-gate verifier under the unified `rcf` CLI as `rcf verify <run|report|provision|cleanup|mcp|browser>`. The legacy standalone `rcf-verify` bin (0.7.1 transition-grace alias) is deleted outright; consumers move to `rcf verify <verb>` in one hop.",
|
|
9
|
+
"approach": "bin/rcf.js declares a `verify` entry in the top-level GROUPS map whose sub-verbs (run, report, provision, cleanup, mcp, browser) resolve to the corresponding main() exports from src/verify/cli/*.js and src/cli/browser-verify.js. The unified CLI's help output lists the verify group with its sub-verbs, sourced from the per-verb HELP exports via HELP_MAP.verify (single-source rule). The dispatcher additionally recognises pre-0.10.0 flat verb tokens through OLD_FLAT_MAP: on match it writes a one-line stderr hint naming the new grouped form before exiting 2. This is a usage-error affordance, not a fallback; the invocation fails.",
|
|
10
10
|
"deliverables": [
|
|
11
|
-
"bin/rcf.js: `verify` on the top-level
|
|
12
|
-
"bin/rcf
|
|
13
|
-
"
|
|
11
|
+
"bin/rcf.js: `verify` on the top-level GROUPS map, dispatching per sub-verb to the verify-suite handlers plus browser-verify",
|
|
12
|
+
"bin/rcf.js: OLD_FLAT_MAP recognises pre-0.10.0 flat verbs and emits a stderr hint at the new grouped form before exit 2",
|
|
13
|
+
"package.json: `bin` field carries only `rcf`; the historical `rcf-verify` entry and bin/rcf-verify.js file are deleted",
|
|
14
|
+
"src/cli/help.js: verify group header + sub-verb catalogue in TOP_LEVEL_HELP; `rcf help verify` prints the group help; `rcf help verify <verb>` prints per-verb help via HELP_MAP"
|
|
14
15
|
],
|
|
15
16
|
"estimatedSize": "small",
|
|
16
17
|
"estimatedHours": 1,
|
|
17
18
|
"riskLevel": "low",
|
|
18
19
|
"domain": "cli",
|
|
19
|
-
"notes": "Ratified in the 2026-08-
|
|
20
|
+
"notes": "Ratified in the 2026-08-26 CLI group-design ruling (clean break: no aliases, no shims, no back-compat fallbacks). Supersedes the 0.7.1 alias-bin transition-grace posture; the alias bin is deleted.",
|
|
20
21
|
"contextRequirements": {
|
|
21
22
|
"tacIds": [],
|
|
22
23
|
"adrIds": []
|
|
@@ -28,5 +29,5 @@
|
|
|
28
29
|
],
|
|
29
30
|
"dependsOnFbsIds": [],
|
|
30
31
|
"createdAt": "2026-08-11T00:00:00Z",
|
|
31
|
-
"updatedAt": "2026-08-
|
|
32
|
+
"updatedAt": "2026-08-26T00:00:00Z"
|
|
32
33
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-016",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 16,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "Blueprint verb family (add, list, remove, upgrade) with manifest.blueprints[] writes",
|
|
8
|
+
"summary": "Introduce the `rcf define blueprint <verb>` verb family and its manifest-writing path. Adds `src/blueprint/` module (loader, applier, contribution-writer) and `src/cli/blueprint.js` (parseArgs, dispatch, HELP block). Adds `blueprint` to the top-level SUBCOMMANDS map on `bin/rcf.js` and to the `TOP_LEVEL` block on `src/cli/help.js` so `rcf --help` advertises it. Every apply writes an entry to `manifest.blueprints[]` per the 0.4.4 schema (slug, version, appliedAt, source, namespace, contributions[]). `add` is idempotent on a clean re-apply; `remove` refuses when any project-authored doc references a contribution id.",
|
|
9
|
+
"approach": "One dispatcher, one loader, one applier, one writer. bin/rcf.js gains `blueprint: blueprintMain` on SUBCOMMANDS; src/cli/blueprint.js parses `add|list|remove|upgrade` and dispatches to src/blueprint/ handlers. Blueprint loading is a small package-metadata reader (slug, version, ADR contributions with optional scope, doc contributions manifest); Phase 1 keeps the resolver `file://` and `link:` only, with the registry/git-ref shape captured in the source string so the schema forward-compat holds. Contribution writing goes through the existing store writer paths so a blueprint apply produces the same doc files a hand-created doc would. Removal is a manifest patch + contribution-path unlink; the referring-doc check reuses the existing tree walker to enumerate every string field for id occurrences.",
|
|
10
|
+
"deliverables": [
|
|
11
|
+
"src/cli/blueprint.js: parseArgs + HELP + main() dispatching add/list/remove/upgrade",
|
|
12
|
+
"src/blueprint/index.js: barrel re-exporting apply, list, remove, upgrade, loadBlueprint, detectGlobalAdrConflicts",
|
|
13
|
+
"src/blueprint/apply.js: apply(tree, blueprint, opts) — idempotency + conflict detection + contribution writes + manifest update",
|
|
14
|
+
"src/blueprint/loader.js: loadBlueprint(source) — reads a blueprint's metadata (slug, version, ADR contributions with scope, doc contributions)",
|
|
15
|
+
"src/blueprint/remove.js: remove(tree, slug, opts) — referring-doc scan + manifest patch + file unlinks",
|
|
16
|
+
"src/blueprint/list.js: list(tree) — reads manifest.blueprints[] and returns rows",
|
|
17
|
+
"bin/rcf.js: `blueprint: blueprintMain` on SUBCOMMANDS",
|
|
18
|
+
"src/cli/help.js: `blueprint <verb>` on the TOP_LEVEL block, `help blueprint` prints the blueprint HELP",
|
|
19
|
+
"test/blueprint/apply.test.js, list.test.js, remove.test.js, cli.test.js — behaviour tests keyed to AC-1001-1..5"
|
|
20
|
+
],
|
|
21
|
+
"acIds": [
|
|
22
|
+
"AC-1001-1",
|
|
23
|
+
"AC-1001-2",
|
|
24
|
+
"AC-1001-3",
|
|
25
|
+
"AC-1001-4",
|
|
26
|
+
"AC-1001-5"
|
|
27
|
+
],
|
|
28
|
+
"contextRequirements": {
|
|
29
|
+
"tacIds": [],
|
|
30
|
+
"adrIds": []
|
|
31
|
+
},
|
|
32
|
+
"dependsOnFbsIds": [],
|
|
33
|
+
"domain": "cli",
|
|
34
|
+
"estimatedSize": "medium",
|
|
35
|
+
"riskLevel": "low",
|
|
36
|
+
"notes": "Landing car of Phase 1 blueprint mechanism (w-2026-08-18-016, design-brief.md v2 §Composition model). Written against @stravica-ai/rcf-schemas 0.4.4 (blueprints[] host schema); dev pin to feature/blueprint-additive-0.4.4 on the schemas repo carries until the Baz 2FA publish flips the pin to registry-resolved 0.4.4.",
|
|
37
|
+
"createdAt": "2026-08-18T22:56:02.353Z",
|
|
38
|
+
"updatedAt": "2026-08-18T22:56:02.353Z"
|
|
39
|
+
}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-017",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 17,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "Namespaced blueprint ids and scope:global ADR conflict surfacing",
|
|
8
|
+
"summary": "Blueprint-contributed docs are namespaced by the blueprint's slug: REQ/US/PRD/BS/TAD/TS via the 0.4.4 slug PREFIX (e.g. `spa-REQ-001`), and ADR/TAC/FBS/CN via the 0.4.3 kebab SUFFIX (e.g. `ADR-005-rest-versioning`). `rcf define blueprint add` runs a conflict-detection pass BEFORE writing anything: two blueprints both contributing an ADR tagged `scope: global` on the same topic exit non-zero with both sides printed and four honest resolution paths named (adopt-incoming, keep-existing, supersede via project ADR, declare-on-add via `--resolve`). Non-global TACs, ADRs, REQs, USs and FBSes namespace cleanly and cannot topic-conflict; cross-blueprint id claims (an incoming id already recorded on another applied blueprint) are refused via the authoritative manifest record, not string grammar.",
|
|
9
|
+
"approach": "Namespacing is enforced at the loader: contribution ids are stamped with the blueprint slug at load time; a contribution whose declared id already carries a namespace is trusted verbatim (author declaration is the truth for what that blueprint owns; the earlier grammar-veto of legitimate slug-tail ids like `ADR-201-spa-theme` under blueprint `spa` was retired in w-2026-08-19-005). Ownership of a written contribution is answered by the manifest's `appliedBlueprintRecord.contributions[]` list — the authoritative record — not by re-parsing the id string. Conflict detection reads the applied `blueprints[]` and the applying blueprint's contributions, and scores collisions along two axes: `scope: global` ADR topic collision (two applied ADRs both tagged `scope: global` with a matching `topic` field), and cross-blueprint ownership (an incoming id whose manifest record is on a DIFFERENT applied blueprint's contribution list — the class the record consultation catches once grammar stopped being a trust surface). Presentation: per-conflict block leads with both ADR titles and their one-sentence decisions, ids and paths as a footer, and four honest resolution paths with actual blueprint slugs filled in — no placeholders. A `--json` output shape is available for agent-driven composition. Phase 3.5 (w-2026-08-19-008) added the `supersede` and `diff` verbs plus the `--resolve` add-time flag, backed by `manifest.resolutions[]` on the 0.4.5 schema; both blueprint ADRs may now co-reside on disk as superseded history alongside a project-level ADR that supersedes them.",
|
|
10
|
+
"deliverables": [
|
|
11
|
+
"src/blueprint/namespace.js: pure functions that stamp/verify contribution namespacing for all doc kinds",
|
|
12
|
+
"src/blueprint/conflicts.js: detectGlobalAdrConflicts(appliedBlueprints, incomingContributions) returning zero-or-more Conflict records",
|
|
13
|
+
"Updates to src/blueprint/apply.js: conflict pass runs BEFORE any file write; non-empty conflict list short-circuits with a printed report + non-zero exit",
|
|
14
|
+
"test/blueprint/namespace.test.js: prefix/suffix stamping tests keyed to AC-1002-1",
|
|
15
|
+
"test/blueprint/conflicts.test.js: global-ADR conflict cases keyed to AC-1002-2 / AC-1002-3, non-conflict cases for AC-1002-4"
|
|
16
|
+
],
|
|
17
|
+
"acIds": [
|
|
18
|
+
"AC-1002-1",
|
|
19
|
+
"AC-1002-2",
|
|
20
|
+
"AC-1002-3",
|
|
21
|
+
"AC-1002-4",
|
|
22
|
+
"AC-1002-5",
|
|
23
|
+
"AC-1002-6",
|
|
24
|
+
"AC-1002-7",
|
|
25
|
+
"AC-1002-8",
|
|
26
|
+
"AC-1002-9",
|
|
27
|
+
"AC-1002-10"
|
|
28
|
+
],
|
|
29
|
+
"contextRequirements": {
|
|
30
|
+
"tacIds": [],
|
|
31
|
+
"adrIds": []
|
|
32
|
+
},
|
|
33
|
+
"dependsOnFbsIds": ["FBS-016"],
|
|
34
|
+
"domain": "cli",
|
|
35
|
+
"estimatedSize": "medium",
|
|
36
|
+
"riskLevel": "medium",
|
|
37
|
+
"notes": "Prototype-unknown #1 (design-brief.md v2 §Depth for v1) — conflict-presentation ergonomics settled here as first pass; Phase 3 (REST blueprint) exposed the ergonomic friction against the real SPA+REST conflict; Phase 3.5 (w-2026-08-19-008) reshaped the message and added the supersede / diff / --resolve verbs plus the `manifest.resolutions[]` seam (rcf-schemas 0.4.5). Ownership-via-manifest-record rewrite landed separately in w-2026-08-19-005.",
|
|
38
|
+
"createdAt": "2026-08-18T22:56:02.353Z",
|
|
39
|
+
"updatedAt": "2026-08-18T22:56:02.353Z"
|
|
40
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-018",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 18,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "Standards ingestion: rcf define standards add + reference-by-default",
|
|
8
|
+
"summary": "Introduce a `rcf define standards <verb>` verb family (`add`, `list`) that registers standards packs on the project manifest. Reference-by-default when the source lives inside the project root; copy into `rcf/standards/<slug>/` only when the source lives outside. Manifest registration is authoritative; every add writes a `manifest.standards[]` entry per the 0.4.4 `standardsPackRecord` schema.",
|
|
9
|
+
"approach": "One dispatcher, one applier. src/cli/standards.js parses `add|list`; src/blueprint/standards.js resolves whether the source is inside or outside the project root (via node:path.relative + startsWith), copies when needed, and writes the manifest entry. Copy path is fs.cp recursive with a per-run overwrite guard (idempotent re-adds refuse to re-copy unless `--refresh` is passed; Phase 1 keeps to add-only + idempotent read, `refresh` verb deferred to Phase 3).",
|
|
10
|
+
"deliverables": [
|
|
11
|
+
"src/cli/standards.js: parseArgs + HELP + main() for add/list",
|
|
12
|
+
"src/blueprint/standards.js: registerStandardsPack(root, opts) — in-root vs out-of-root detection + optional copy + manifest.standards[] write",
|
|
13
|
+
"bin/rcf.js: `standards: standardsMain` on SUBCOMMANDS",
|
|
14
|
+
"src/cli/help.js: `standards <verb>` on the TOP_LEVEL block",
|
|
15
|
+
"test/blueprint/standards.test.js: in-root reference / out-of-root copy / idempotency cases keyed to AC-1003-1..4"
|
|
16
|
+
],
|
|
17
|
+
"acIds": [
|
|
18
|
+
"AC-1003-1",
|
|
19
|
+
"AC-1003-2",
|
|
20
|
+
"AC-1003-3",
|
|
21
|
+
"AC-1003-4"
|
|
22
|
+
],
|
|
23
|
+
"contextRequirements": {
|
|
24
|
+
"tacIds": [],
|
|
25
|
+
"adrIds": []
|
|
26
|
+
},
|
|
27
|
+
"dependsOnFbsIds": [],
|
|
28
|
+
"domain": "cli",
|
|
29
|
+
"estimatedSize": "small",
|
|
30
|
+
"riskLevel": "low",
|
|
31
|
+
"notes": "Reference-by-default is ratified decision 2 (design-brief.md v2). Copy path targets rcf/standards/<slug>/ (ratified decision 3).",
|
|
32
|
+
"createdAt": "2026-08-18T22:56:02.353Z",
|
|
33
|
+
"updatedAt": "2026-08-18T22:56:02.353Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
{
|
|
2
|
+
"fbsId": "FBS-019",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"bsId": "BS-001",
|
|
5
|
+
"buildOrder": 19,
|
|
6
|
+
"executionStatus": "notStarted",
|
|
7
|
+
"title": "Selective retrieval at bundle assembly (contextRequirements.standardIds)",
|
|
8
|
+
"summary": "Extend `src/build/bundle.js#assembleBundle` so its `context` section reads `contextRequirements.standardIds`. When the FBS carries an operator-authored `standardIds` array, that array is honoured verbatim. Otherwise a deterministic tag-scoring selector reads the FBS work text (title + summary + approach + notes + AC descriptions) against `manifest.standards[]` (tags + slug + summary) and returns the subset of slugs whose tags occur in the work text. The bundle's context.standardIds carries the selection; the standards' summaries render into the standards payload alongside TACs and ADRs.",
|
|
9
|
+
"approach": "The selector is a pure function in src/build/standards-selector.js — no wall clock, no random source, no network. Scoring is deterministic tag-hit counting with lowercase-normalised substring match; ties break by manifest order (standards[] is authored). The bundle assembler prefers operator-authored `contextRequirements.standardIds` when present (design principle 5 override path) and calls the selector otherwise. Empty selection is legitimate and never blocks. Phase 1 keeps the selector local and heuristic; the design brief allows a small model call, but adding an LLM dependency to a pure projection is out of scope for the mechanism landing — the heuristic satisfies the ACs and the seam is where a smarter selector plugs in.",
|
|
10
|
+
"deliverables": [
|
|
11
|
+
"src/build/standards-selector.js: selectStandards(fbs, standards) — deterministic tag-hit scoring returning the ordered subset of slugs",
|
|
12
|
+
"src/build/bundle.js: contextRequirements.standardIds hosts operator override or selector output; standards payload rendered into context alongside tacs/adrs",
|
|
13
|
+
"test/build/standards-selector.test.js: deterministic-selection cases keyed to AC-1004-1, AC-1004-3, AC-1004-4",
|
|
14
|
+
"test/build/bundle-standards.test.js: bundle-shape cases (default + override) keyed to AC-1004-1, AC-1004-2"
|
|
15
|
+
],
|
|
16
|
+
"acIds": [
|
|
17
|
+
"AC-1004-1",
|
|
18
|
+
"AC-1004-2",
|
|
19
|
+
"AC-1004-3",
|
|
20
|
+
"AC-1004-4"
|
|
21
|
+
],
|
|
22
|
+
"contextRequirements": {
|
|
23
|
+
"tacIds": [],
|
|
24
|
+
"adrIds": []
|
|
25
|
+
},
|
|
26
|
+
"dependsOnFbsIds": ["FBS-018"],
|
|
27
|
+
"domain": "build",
|
|
28
|
+
"estimatedSize": "small",
|
|
29
|
+
"riskLevel": "low",
|
|
30
|
+
"notes": "Ratified decision 4 (agentic at bundle-assembly time, operator override supported). Heuristic-tag selector satisfies the deterministic ACs; a smarter selector plugs into the same seam without touching the bundle assembler.",
|
|
31
|
+
"createdAt": "2026-08-18T22:56:02.353Z",
|
|
32
|
+
"updatedAt": "2026-08-18T22:56:02.353Z"
|
|
33
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
"category": "functional",
|
|
5
5
|
"priority": "must",
|
|
6
6
|
"description": "The agent guidance pack teaches a build method that keeps the deployment runtime present in the loop from elicitation to verification, so that a non-coding owner who cannot self-verify is not led into an undeployable stack or a false 'verified' claim. It requires four properties of the method the tool ships: (1) every build lands a working, documented local preview loop as its default outcome; (2) elicitation establishes where the app will run early and constrains the stack to that answer, with a jargon-free hosting-choice walkthrough when the owner does not know; (3) every 'verified' or 'tested' claim names the runtime it was checked against and never implies deploy-runtime verification that did not happen; (4) the method carries guidance for a periodic and end-of-build fresh-context self-review that drives the app against its acceptance criteria, subordinate to the independent verification gate rather than a substitute for it. This requirement governs the shipped guidance/prompt surface, not a new runtime subsystem.",
|
|
7
|
-
"rationale": "The five-run rcf-persona-testing programme (concluded 2026-07-20) found the tool builds excellently at every level but its own loop missed a ship-blocking or user-facing defect in three of five runs, with a single root cause: the deploy runtime is absent from the loop. It is absent from elicitation (runs 03/04 chose Cloudflare-incompatible stacks a CF-only holder cannot host, run 03 silently) and absent from verification (run 05 shipped a production auth 500 while 89/89 tests were green and the tool claimed a live-Worker verification its E2E never ran). The target user cannot diagnose 'wrong stack for your host' or 'verified against the wrong runtime', so the method itself must foreclose both. These are Tier-1 hardening fixes to make the base offering usable now, while the productised independent verification gate (rcf
|
|
7
|
+
"rationale": "The five-run rcf-persona-testing programme (concluded 2026-07-20) found the tool builds excellently at every level but its own loop missed a ship-blocking or user-facing defect in three of five runs, with a single root cause: the deploy runtime is absent from the loop. It is absent from elicitation (runs 03/04 chose Cloudflare-incompatible stacks a CF-only holder cannot host, run 03 silently) and absent from verification (run 05 shipped a production auth 500 while 89/89 tests were green and the tool claimed a live-Worker verification its E2E never ran). The target user cannot diagnose 'wrong stack for your host' or 'verified against the wrong runtime', so the method itself must foreclose both. These are Tier-1 hardening fixes to make the base offering usable now, while the productised independent verification gate (rcf verify-lite) is built separately.",
|
|
8
8
|
"reqId": "REQ-008",
|
|
9
9
|
"prdId": "PRD-001",
|
|
10
10
|
"title": "Deploy-aware, runtime-honest build guidance",
|
|
@@ -2,11 +2,11 @@
|
|
|
2
2
|
"reqId": "REQ-009",
|
|
3
3
|
"prdId": "PRD-001",
|
|
4
4
|
"title": "Umbrella CLI: verify as a first-class subcommand",
|
|
5
|
-
"description": "Post 0.7.1 packaging consolidation the RCF Lite suite ships as one npm package with one unified `rcf` CLI. The adversarial ship-gate verifier that used to live behind its own `rcf
|
|
5
|
+
"description": "Post 0.7.1 packaging consolidation the RCF Lite suite ships as one npm package with one unified `rcf` CLI. The adversarial ship-gate verifier that used to live behind its own `rcf verify` bin is mounted as `rcf verify <run|report|provision|cleanup|mcp>` on that unified CLI. The pre-existing `rcf verify` bin remains as a transition-grace alias that dispatches through the same handlers, deprecated in favour of `rcf verify`. Behaviour of each verify verb is unchanged; only the invocation form gains a canonical route.",
|
|
6
6
|
"category": "functional",
|
|
7
7
|
"domain": "cli",
|
|
8
8
|
"priority": "must",
|
|
9
|
-
"rationale": "The packaging consolidation ruling (docs/2026-08-06_packaging-consolidation-proposal.md, ratified 2026-08-11) picks one install (`rcf-lite`) with one CLI verb space (`rcf`). Verify is a first-class part of the RCF chain (define, build, verify) and must sit inside that verb space, not beside it. Keeping `rcf
|
|
9
|
+
"rationale": "The packaging consolidation ruling (docs/2026-08-06_packaging-consolidation-proposal.md, ratified 2026-08-11) picks one install (`rcf-lite`) with one CLI verb space (`rcf`). Verify is a first-class part of the RCF chain (define, build, verify) and must sit inside that verb space, not beside it. Keeping `rcf verify` as an alias avoids a hard break for existing scripts across a transition window.",
|
|
10
10
|
"tags": [
|
|
11
11
|
"packaging",
|
|
12
12
|
"cli",
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-08-18T22:54:27.031Z",
|
|
3
|
+
"updatedAt": "2026-08-18T22:57:45.660Z",
|
|
4
|
+
"description": "The framework provides a Blueprint mechanism the operator uses to compose blueprint packages (specifications + assets, not code) onto a project tree at any point in its life. Composition is many blueprints per project. Blueprint-contributed docs are namespaced by the blueprint's slug so multiple blueprints cannot collide on ids. Standards packs register at rcf init (or later via rcf define standards add), reference-by-default, copied to rcf/standards/<slug>/ only when the source lives outside the project root. Manifest registration is authoritative. Selective retrieval populates fbs.contextRequirements.standardIds at bundle-assembly time by analysing the FBS work text against the standards tag vocabulary; operator override is supported by authoring the array on the FBS. scope:global ADR contributions surface as blocking conflicts at rcf define blueprint add time.",
|
|
5
|
+
"reqId": "REQ-010",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "Blueprint library mechanism (composition, standards, selective retrieval)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "cli",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"none"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-08-18T22:54:27.048Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -15,8 +15,8 @@ a genuine feature gap - was closed by porting the parallel-safe tier
|
|
|
15
15
|
computation from the full RCF platform into the build queue and binding
|
|
16
16
|
TC-014-independent-items-share-tier to it.
|
|
17
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
|
|
18
|
+
Status: **76 bound / 0 pending** of 76 ACs. `rcf audit coverage --strict`
|
|
19
|
+
exits 0, and CI runs `rcf define validate` and `rcf audit coverage --strict` as
|
|
20
20
|
required steps, so a new uncovered AC or a non-resolving testPointer
|
|
21
21
|
fails the build. A future genuine gap gets a row here (AC id, US, kind,
|
|
22
22
|
what a sufficient test must assert, nearest existing test) until its
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
"acId": "AC-202-1",
|
|
38
38
|
"description": "the view serves from a local server process and never writes files to disk",
|
|
39
39
|
"status": "pending",
|
|
40
|
-
"testPointer": "test/view/cli.test.js::rcf view never writes any files to disk (regression against static mode)"
|
|
40
|
+
"testPointer": "test/view/cli.test.js::rcf audit view never writes any files to disk (regression against static mode)"
|
|
41
41
|
}
|
|
42
42
|
],
|
|
43
43
|
"status": "draft"
|
|
@@ -15,21 +15,21 @@
|
|
|
15
15
|
"acId": "AC-301-2",
|
|
16
16
|
"description": "reading an unknown id exits 2 with a structured not-found usage error",
|
|
17
17
|
"status": "pending",
|
|
18
|
-
"testPointer": "test/cli/read.test.js::rcf read UNKNOWN-999 exits 2 (usage, unknown id)"
|
|
18
|
+
"testPointer": "test/cli/read.test.js::rcf define read UNKNOWN-999 exits 2 (usage, unknown id)"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
21
|
"id": "TC-006-read-reports-valid",
|
|
22
22
|
"acId": "AC-301-1",
|
|
23
23
|
"description": "read returns the body on stdout and reports the document valid against its schema on stderr",
|
|
24
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)"
|
|
25
|
+
"testPointer": "test/cli/read.test.js::rcf define read REQ-001 returns the body and reports it valid against its schema (AC-301-1)"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
28
|
"id": "TC-006-read-invalid-content-plus-errors",
|
|
29
29
|
"acId": "AC-301-3",
|
|
30
30
|
"description": "read on an invalid-but-present document returns the content together with the validation errors",
|
|
31
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)"
|
|
32
|
+
"testPointer": "test/cli/read.test.js::rcf define read on an invalid-but-present document returns the content together with the validation errors (AC-301-3)"
|
|
33
33
|
}
|
|
34
34
|
],
|
|
35
35
|
"status": "draft"
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"acId": "AC-303-1",
|
|
17
17
|
"description": "a valid update persists the change and advances updatedAt on disk",
|
|
18
18
|
"status": "pending",
|
|
19
|
-
"testPointer": "test/cli/update.test.js::rcf update REQ-001 --set title=X changes the title and bumps updatedAt"
|
|
19
|
+
"testPointer": "test/cli/update.test.js::rcf define update REQ-001 --set title=X changes the title and bumps updatedAt"
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"id": "TC-008-invalid-update-refused",
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"acId": "AC-303-3",
|
|
31
31
|
"description": "update on a nonexistent id returns a structured not-found error naming the id and writes nothing",
|
|
32
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)"
|
|
33
|
+
"testPointer": "test/cli/update.test.js::rcf define update REQ-999 returns a structured not-found error and writes nothing (AC-303-3)"
|
|
34
34
|
}
|
|
35
35
|
],
|
|
36
36
|
"status": "draft"
|
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
"acId": "AC-304-1",
|
|
18
18
|
"description": "delete without cascade refuses with exit 4 naming dependents",
|
|
19
19
|
"status": "pending",
|
|
20
|
-
"testPointer": "test/cli/delete.test.js::rcf delete REQ-001 without --cascade refuses with exit 4"
|
|
20
|
+
"testPointer": "test/cli/delete.test.js::rcf define delete REQ-001 without --cascade refuses with exit 4"
|
|
21
21
|
},
|
|
22
22
|
{
|
|
23
23
|
"id": "TC-009-cascade-removes-subtree",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"acId": "AC-304-3",
|
|
32
32
|
"description": "deleting an unreferenced leaf removes the file with exit 0 on a still-valid tree",
|
|
33
33
|
"status": "pending",
|
|
34
|
-
"testPointer": "test/cli/delete.test.js::rcf delete leaf ADR-001 removes the file (exit 0)"
|
|
34
|
+
"testPointer": "test/cli/delete.test.js::rcf define delete leaf ADR-001 removes the file (exit 0)"
|
|
35
35
|
}
|
|
36
36
|
],
|
|
37
37
|
"status": "draft"
|