rcf-lite 0.9.0 → 0.11.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 +95 -54
- package/README.md +8 -4
- package/bin/rcf.js +145 -57
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/README.md +1 -1
- package/guidance/build-cycle-playbook.md +108 -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 +52 -10
- package/guidance/managed/README.md +1 -1
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +51 -9
- package/guidance/manifest.json +1 -1
- package/guidance/overview.md +4 -4
- package/package.json +4 -6
- package/rcf/adrs/adr-008.json +1 -1
- package/rcf/adrs/adr-009.json +4 -4
- 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-061.json +1 -1
- package/rcf/code-nodes/cn-066.json +1 -1
- package/rcf/code-nodes/cn-069.json +1 -1
- 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 +1 -1
- package/rcf/fbs/fbs-017.json +1 -1
- package/rcf/fbs/fbs-018.json +2 -2
- package/rcf/requirements/req-008.json +1 -1
- package/rcf/requirements/req-009.json +2 -2
- package/rcf/requirements/req-010.json +1 -1
- 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 +1 -1
- package/rcf/test-suites/ts-027.json +7 -7
- package/rcf/test-suites/ts-028.json +1 -1
- package/rcf/user-stories/us-1001.json +10 -10
- package/rcf/user-stories/us-1002.json +12 -12
- package/rcf/user-stories/us-1003.json +6 -6
- package/rcf/user-stories/us-805.json +2 -2
- package/rcf/user-stories/us-901.json +13 -13
- package/src/blueprint/conflicts.js +15 -15
- package/src/blueprint/supersede.js +6 -6
- package/src/build/bundle.js +3 -3
- package/src/build/formatters/markdown.js +9 -9
- package/src/build/mark.js +3 -3
- package/src/build/queue.js +1 -1
- package/src/cli/blueprint.js +3 -3
- 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 +3 -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 +267 -95
- package/src/cli/impact.js +1 -1
- 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 +1 -1
- 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/writer.js +1 -1
- 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/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
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-061",
|
|
3
3
|
"path": "src/cli/blueprint.js#main",
|
|
4
|
-
"title": "rcf blueprint CLI dispatcher",
|
|
4
|
+
"title": "rcf define blueprint CLI dispatcher",
|
|
5
5
|
"description": "Wires the blueprint verb family into the unified rcf bin; dispatches add|list|remove.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-1001-5"
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-066",
|
|
3
3
|
"path": "src/cli/standards.js#main",
|
|
4
|
-
"title": "rcf standards CLI dispatcher",
|
|
4
|
+
"title": "rcf define standards CLI dispatcher",
|
|
5
5
|
"description": "Wires the standards verb family into the unified rcf bin; dispatches add|list.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-1003-4"
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"cnId": "CN-069",
|
|
3
3
|
"path": "src/blueprint/supersede.js#supersedeBlueprintTopic",
|
|
4
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 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.",
|
|
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
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-1002-5",
|
|
8
8
|
"AC-1002-9",
|
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
|
}
|
package/rcf/fbs/fbs-016.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"buildOrder": 16,
|
|
6
6
|
"executionStatus": "notStarted",
|
|
7
7
|
"title": "Blueprint verb family (add, list, remove, upgrade) with manifest.blueprints[] writes",
|
|
8
|
-
"summary": "Introduce the `rcf 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.",
|
|
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
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
10
|
"deliverables": [
|
|
11
11
|
"src/cli/blueprint.js: parseArgs + HELP + main() dispatching add/list/remove/upgrade",
|
package/rcf/fbs/fbs-017.json
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
"buildOrder": 17,
|
|
6
6
|
"executionStatus": "notStarted",
|
|
7
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 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.",
|
|
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
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
10
|
"deliverables": [
|
|
11
11
|
"src/blueprint/namespace.js: pure functions that stamp/verify contribution namespacing for all doc kinds",
|
package/rcf/fbs/fbs-018.json
CHANGED
|
@@ -4,8 +4,8 @@
|
|
|
4
4
|
"bsId": "BS-001",
|
|
5
5
|
"buildOrder": 18,
|
|
6
6
|
"executionStatus": "notStarted",
|
|
7
|
-
"title": "Standards ingestion: rcf standards add + reference-by-default",
|
|
8
|
-
"summary": "Introduce a `rcf 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.",
|
|
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
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
10
|
"deliverables": [
|
|
11
11
|
"src/cli/standards.js: parseArgs + HELP + main() for add/list",
|
|
@@ -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",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"createdAt": "2026-08-18T22:54:27.031Z",
|
|
3
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 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 blueprint add time.",
|
|
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
5
|
"reqId": "REQ-010",
|
|
6
6
|
"prdId": "PRD-001",
|
|
7
7
|
"title": "Blueprint library mechanism (composition, standards, selective retrieval)",
|
|
@@ -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"
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
"acId": "AC-602-2",
|
|
25
25
|
"description": "rcf_build returns the assembled bundle deep-equal to the CLI output for the named FBS",
|
|
26
26
|
"status": "pending",
|
|
27
|
-
"testPointer": "test/mcp/parity.test.js::parity: rcf_build FBS-001 structuredContent deep-equals live `rcf build FBS-001 --format json`"
|
|
27
|
+
"testPointer": "test/mcp/parity.test.js::parity: rcf_build FBS-001 structuredContent deep-equals live `rcf build bundle FBS-001 --format json`"
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"id": "TC-017-mcp-invalid-write-refused",
|
|
@@ -37,7 +37,7 @@
|
|
|
37
37
|
{
|
|
38
38
|
"id": "TC-024-in-loop-not-the-gate",
|
|
39
39
|
"acId": "AC-805-4",
|
|
40
|
-
"description": "the self-review is scoped as an in-loop check naming rcf finalise as the gate",
|
|
40
|
+
"description": "the self-review is scoped as an in-loop check naming rcf build finalise as the gate",
|
|
41
41
|
"status": "pending",
|
|
42
42
|
"testPointer": "test/guidance/tier1-hardening.test.js::AC-805-4: the self-review is honestly scoped as an in-loop check subordinate to the independent gate"
|
|
43
43
|
}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "TS-025",
|
|
3
3
|
"usId": "US-901",
|
|
4
|
-
"title": "`rcf verify`
|
|
5
|
-
"purpose": "Verify the umbrella CLI mounts `
|
|
4
|
+
"title": "`rcf verify` group routing (0.10.0 CLI reorganisation)",
|
|
5
|
+
"purpose": "Verify the umbrella CLI mounts the `verify` group with the six sub-verbs (run, report, provision, cleanup, mcp, browser), that the top-level help advertises the group with its catalogue, and that the legacy standalone `rcf-verify` bin is deleted at 0.10.0 (with old flat verb tokens on the umbrella `rcf` bin refused with a stderr hint at the new grouped form).",
|
|
6
6
|
"testLevel": "unit",
|
|
7
7
|
"acIds": [
|
|
8
8
|
"AC-901-1",
|
|
@@ -11,42 +11,56 @@
|
|
|
11
11
|
],
|
|
12
12
|
"testCases": [
|
|
13
13
|
{
|
|
14
|
-
"id": "TC-025-verify-routes-
|
|
14
|
+
"id": "TC-025-verify-group-routes-per-subverb",
|
|
15
15
|
"acId": "AC-901-1",
|
|
16
|
-
"description": "
|
|
16
|
+
"description": "`verify` on the top-level GROUPS map wires each sub-verb (run / report / provision / cleanup / mcp / browser) to its corresponding verify-suite main() (browser routes to src/cli/browser-verify.js main)",
|
|
17
17
|
"status": "pending",
|
|
18
|
-
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-1: `verify` on
|
|
18
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-1: `verify` group on GROUPS wires each sub-verb to the verify-suite handler"
|
|
19
19
|
},
|
|
20
20
|
{
|
|
21
|
-
"id": "TC-025-verify-help-
|
|
21
|
+
"id": "TC-025-verify-help-routes-to-group-help",
|
|
22
22
|
"acId": "AC-901-1",
|
|
23
|
-
"description": "`rcf verify --help`
|
|
23
|
+
"description": "`rcf verify --help` prints the verify group help (Usage: rcf verify <verb>) including the browser sub-verb",
|
|
24
24
|
"status": "pending",
|
|
25
|
-
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-1 (routing surface): `rcf verify --help`
|
|
25
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-1 (routing surface): `rcf verify --help` prints the verify group help"
|
|
26
26
|
},
|
|
27
27
|
{
|
|
28
|
-
"id": "TC-025-top-level-help-lists-verify",
|
|
28
|
+
"id": "TC-025-top-level-help-lists-verify-group",
|
|
29
29
|
"acId": "AC-901-2",
|
|
30
|
-
"description": "the top-level rcf --help output
|
|
30
|
+
"description": "the top-level `rcf --help` output carries the verify group header with its sub-verb catalogue (run, report, provision, cleanup, mcp, browser)",
|
|
31
31
|
"status": "pending",
|
|
32
|
-
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-2: `rcf --help`
|
|
32
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-2: `rcf --help` carries the verify group header and sub-verb catalogue"
|
|
33
33
|
},
|
|
34
34
|
{
|
|
35
|
-
"id": "TC-025-alias-
|
|
35
|
+
"id": "TC-025-alias-bin-deleted-file",
|
|
36
36
|
"acId": "AC-901-3",
|
|
37
|
-
"description": "
|
|
37
|
+
"description": "the pre-0.10.0 alias bin file is deleted: bin/rcf-verify.js does not exist in the published package",
|
|
38
38
|
"status": "pending",
|
|
39
|
-
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3:
|
|
39
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3: bin/rcf-verify.js is deleted from the package"
|
|
40
40
|
},
|
|
41
41
|
{
|
|
42
|
-
"id": "TC-025-alias-
|
|
42
|
+
"id": "TC-025-alias-bin-deleted-package-json",
|
|
43
43
|
"acId": "AC-901-3",
|
|
44
|
-
"description": "
|
|
44
|
+
"description": "package.json bin field carries only `rcf`; the historical `rcf-verify` entry is gone",
|
|
45
45
|
"status": "pending",
|
|
46
|
-
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3
|
|
46
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3: package.json:bin carries no `rcf-verify` entry"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"id": "TC-025-old-flat-validate-refused",
|
|
50
|
+
"acId": "AC-901-3",
|
|
51
|
+
"description": "calling `rcf <old-flat-validate>` via the umbrella bin exits 2 with a stderr hint at `rcf define validate` as the new grouped form",
|
|
52
|
+
"status": "pending",
|
|
53
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3: `rcf <old-flat-validate>` exits 2 with a stderr hint at `rcf define validate`"
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
"id": "TC-025-old-flat-browser-verify-refused",
|
|
57
|
+
"acId": "AC-901-3",
|
|
58
|
+
"description": "calling `rcf <old-flat-browser-verify>` via the umbrella bin exits 2 with a stderr hint at `rcf verify browser` as the new grouped form",
|
|
59
|
+
"status": "pending",
|
|
60
|
+
"testPointer": "test/cli/rcf-verify-subcommand.test.js::AC-901-3: `rcf <old-flat-browser-verify>` exits 2 with a hint at `rcf verify browser`"
|
|
47
61
|
}
|
|
48
62
|
],
|
|
49
63
|
"status": "draft",
|
|
50
64
|
"createdAt": "2026-08-11T00:00:00Z",
|
|
51
|
-
"updatedAt": "2026-08-
|
|
65
|
+
"updatedAt": "2026-08-26T00:00:00Z"
|
|
52
66
|
}
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "TS-026",
|
|
3
3
|
"usId": "US-1001",
|
|
4
4
|
"title": "Blueprint verb family",
|
|
5
|
-
"purpose": "Cover rcf blueprint add/list/remove verb family behaviour and the manifest.blueprints[] write path.",
|
|
5
|
+
"purpose": "Cover rcf define blueprint add/list/remove verb family behaviour and the manifest.blueprints[] write path.",
|
|
6
6
|
"testLevel": "unit",
|
|
7
7
|
"acIds": [
|
|
8
8
|
"AC-1001-1",
|
|
@@ -55,36 +55,36 @@
|
|
|
55
55
|
{
|
|
56
56
|
"id": "TC-027-shipped-blueprints-option-3-executable",
|
|
57
57
|
"acId": "AC-1002-5",
|
|
58
|
-
"description": "shipped SPA + REST option-3 verbatim-from-refused-state money probe: fresh scaffold; add spa; add rest (refused with the reshaped message); follow option 3 EXACTLY as printed (`rcf blueprint supersede errorEnvelope --incoming <rest>` and `rcf blueprint supersede authModel --incoming <rest>`) with ZERO prep; then re-run `rcf blueprint add <rest>` and verify co-residence + honour",
|
|
58
|
+
"description": "shipped SPA + REST option-3 verbatim-from-refused-state money probe: fresh scaffold; add spa; add rest (refused with the reshaped message); follow option 3 EXACTLY as printed (`rcf define blueprint supersede errorEnvelope --incoming <rest>` and `rcf define blueprint supersede authModel --incoming <rest>`) with ZERO prep; then re-run `rcf define blueprint add <rest>` and verify co-residence + honour",
|
|
59
59
|
"testPointer": "test/blueprint/cli.test.js::shipped SPA + REST: option 3 executes VERBATIM from the refused-add state (rev-3 P1-1, Baz ruling on the conflict-pair supersede precondition)",
|
|
60
60
|
"status": "pending"
|
|
61
61
|
},
|
|
62
62
|
{
|
|
63
63
|
"id": "TC-027-add-reason-persists",
|
|
64
64
|
"acId": "AC-1002-6",
|
|
65
|
-
"description": "rcf blueprint add --reason attaches the ruling text to every resolutions[] record on that add",
|
|
66
|
-
"testPointer": "test/blueprint/cli.test.js::rcf blueprint add --reason: reason lands on every resolution record (rev-2 P1-2)",
|
|
65
|
+
"description": "rcf define blueprint add --reason attaches the ruling text to every resolutions[] record on that add",
|
|
66
|
+
"testPointer": "test/blueprint/cli.test.js::rcf define blueprint add --reason: reason lands on every resolution record (rev-2 P1-2)",
|
|
67
67
|
"status": "pending"
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"id": "TC-027-add-reason-whitespace-refused",
|
|
71
71
|
"acId": "AC-1002-6",
|
|
72
72
|
"description": "whitespace-only --reason on add refused at the writer edge (exit 2, no record written)",
|
|
73
|
-
"testPointer": "test/blueprint/cli.test.js::rcf blueprint add --reason: whitespace-only reason is refused at the writer edge (rev-2 P1-2)",
|
|
73
|
+
"testPointer": "test/blueprint/cli.test.js::rcf define blueprint add --reason: whitespace-only reason is refused at the writer edge (rev-2 P1-2)",
|
|
74
74
|
"status": "pending"
|
|
75
75
|
},
|
|
76
76
|
{
|
|
77
77
|
"id": "TC-027-add-resolve-dedupes-with-warn",
|
|
78
78
|
"acId": "AC-1002-7",
|
|
79
79
|
"description": "duplicate --resolve for the same topic keeps the first declaration, drops the rest, and warns on stderr",
|
|
80
|
-
"testPointer": "test/blueprint/cli.test.js::rcf blueprint add --resolve: duplicate topic dedupes with a stderr warning; only one record persists (rev-2 P3-b)",
|
|
80
|
+
"testPointer": "test/blueprint/cli.test.js::rcf define blueprint add --resolve: duplicate topic dedupes with a stderr warning; only one record persists (rev-2 P3-b)",
|
|
81
81
|
"status": "pending"
|
|
82
82
|
},
|
|
83
83
|
{
|
|
84
84
|
"id": "TC-027-add-resolve-error-no-double-prefix",
|
|
85
85
|
"acId": "AC-1002-7",
|
|
86
86
|
"description": "--resolve validation error carries the CLI's single '[error] blueprint add: ' prefix — the underlying rcfError message MUST NOT prepend its own 'blueprint add: '",
|
|
87
|
-
"testPointer": "test/blueprint/cli.test.js::rcf blueprint add --resolve: validation error carries no doubled prefix (rev-2 P3-a)",
|
|
87
|
+
"testPointer": "test/blueprint/cli.test.js::rcf define blueprint add --resolve: validation error carries no doubled prefix (rev-2 P3-a)",
|
|
88
88
|
"status": "pending"
|
|
89
89
|
},
|
|
90
90
|
{
|
|
@@ -105,7 +105,7 @@
|
|
|
105
105
|
"id": "TC-027-supersede-no-double-prefix",
|
|
106
106
|
"acId": "AC-1002-10",
|
|
107
107
|
"description": "every error path in supersede.js exits at the CLI with exactly one `[error] blueprint supersede: ` prefix; the doubled `blueprint supersede: blueprint supersede:` string never appears",
|
|
108
|
-
"testPointer": "test/blueprint/cli.test.js::rcf blueprint supersede: every rcfError message lands with exactly one `[error] blueprint supersede:` prefix (rev-3 mechanical P1)",
|
|
108
|
+
"testPointer": "test/blueprint/cli.test.js::rcf define blueprint supersede: every rcfError message lands with exactly one `[error] blueprint supersede:` prefix (rev-3 mechanical P1)",
|
|
109
109
|
"status": "pending"
|
|
110
110
|
}
|
|
111
111
|
],
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"id": "TS-028",
|
|
3
3
|
"usId": "US-1003",
|
|
4
4
|
"title": "Standards ingestion",
|
|
5
|
-
"purpose": "Cover rcf standards add reference-by-default and out-of-root copy paths.",
|
|
5
|
+
"purpose": "Cover rcf define standards add reference-by-default and out-of-root copy paths.",
|
|
6
6
|
"testLevel": "unit",
|
|
7
7
|
"acIds": [
|
|
8
8
|
"AC-1003-1",
|
|
@@ -5,40 +5,40 @@
|
|
|
5
5
|
"version": "0.1.0",
|
|
6
6
|
"status": "draft",
|
|
7
7
|
"title": "Blueprint verb family: add, list, remove, upgrade",
|
|
8
|
-
"description": "A `rcf blueprint` verb family provides the primary operator seat for composing blueprints onto a project. Every verb runs against the current tree, is idempotent where the semantics allow, and writes to the manifest's `blueprints[]` registry so the applied set is greppable and mechanical.",
|
|
8
|
+
"description": "A `rcf define blueprint` verb family provides the primary operator seat for composing blueprints onto a project. Every verb runs against the current tree, is idempotent where the semantics allow, and writes to the manifest's `blueprints[]` registry so the applied set is greppable and mechanical.",
|
|
9
9
|
"asA": "operator on an RCF project",
|
|
10
|
-
"iWant": "to add, list, remove and upgrade blueprints against my project tree from a single `rcf blueprint` verb family",
|
|
10
|
+
"iWant": "to add, list, remove and upgrade blueprints against my project tree from a single `rcf define blueprint` verb family",
|
|
11
11
|
"soThat": "composition is a first-class action instead of a one-shot init flag, and I can layer several blueprints across the life of a project without hand-editing the manifest",
|
|
12
12
|
"acceptanceCriteria": [
|
|
13
13
|
{
|
|
14
14
|
"id": "AC-1001-1",
|
|
15
|
-
"description": "`rcf blueprint add <slug>` on a project with no blueprints applied writes an entry into `manifest.blueprints[]` and prints the applied slug and version",
|
|
15
|
+
"description": "`rcf define blueprint add <slug>` on a project with no blueprints applied writes an entry into `manifest.blueprints[]` and prints the applied slug and version",
|
|
16
16
|
"given": "a validated project tree with no existing `blueprints[]` entries and a resolvable blueprint slug",
|
|
17
|
-
"when": "`rcf blueprint add <slug>` runs",
|
|
17
|
+
"when": "`rcf define blueprint add <slug>` runs",
|
|
18
18
|
"then": "the manifest gains one `blueprints[]` entry (slug, version, appliedAt, source, and any contributions[] the blueprint wrote), and stdout names the slug and applied version",
|
|
19
19
|
"testable": true
|
|
20
20
|
},
|
|
21
21
|
{
|
|
22
22
|
"id": "AC-1001-2",
|
|
23
|
-
"description": "`rcf blueprint list` prints every applied blueprint (slug, version, appliedAt) in apply order",
|
|
23
|
+
"description": "`rcf define blueprint list` prints every applied blueprint (slug, version, appliedAt) in apply order",
|
|
24
24
|
"given": "a project with one or more blueprints already applied",
|
|
25
|
-
"when": "`rcf blueprint list` runs",
|
|
25
|
+
"when": "`rcf define blueprint list` runs",
|
|
26
26
|
"then": "every applied blueprint prints, one per line, ordered by `appliedAt`, with slug, version and apply timestamp columns",
|
|
27
27
|
"testable": true
|
|
28
28
|
},
|
|
29
29
|
{
|
|
30
30
|
"id": "AC-1001-3",
|
|
31
|
-
"description": "`rcf blueprint remove <slug>` removes the manifest entry and refuses when any project-authored doc references a contributed id",
|
|
31
|
+
"description": "`rcf define blueprint remove <slug>` removes the manifest entry and refuses when any project-authored doc references a contributed id",
|
|
32
32
|
"given": "a project with the blueprint applied and no project-authored doc referencing any of the contributions[] ids",
|
|
33
|
-
"when": "`rcf blueprint remove <slug>` runs",
|
|
33
|
+
"when": "`rcf define blueprint remove <slug>` runs",
|
|
34
34
|
"then": "the `blueprints[]` entry is dropped from the manifest; when a project-authored doc DOES reference a contribution, the verb exits non-zero and prints the referencing id + path without mutating the manifest",
|
|
35
35
|
"testable": true
|
|
36
36
|
},
|
|
37
37
|
{
|
|
38
38
|
"id": "AC-1001-4",
|
|
39
|
-
"description": "`rcf blueprint add <slug>` is idempotent: repeating on an already-applied clean slug is a no-op with a friendly message",
|
|
39
|
+
"description": "`rcf define blueprint add <slug>` is idempotent: repeating on an already-applied clean slug is a no-op with a friendly message",
|
|
40
40
|
"given": "a project with `<slug>` already in `blueprints[]`",
|
|
41
|
-
"when": "`rcf blueprint add <slug>` runs again with no conflicts to surface",
|
|
41
|
+
"when": "`rcf define blueprint add <slug>` runs again with no conflicts to surface",
|
|
42
42
|
"then": "the manifest is not rewritten, exit code is 0, and stdout names the slug as already applied at the applied version",
|
|
43
43
|
"testable": true
|
|
44
44
|
},
|