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
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
## 1. Read this if
|
|
6
6
|
|
|
7
|
-
You are the agent starting a project with a human. The end state is concrete: a validated RCF tree (PRD, requirements, stories with testable acceptance criteria, architecture captured as TAC / ADR) and an actionable FBS queue, reachable in one or two sittings. When you finish, `rcf validate` is clean and `rcf build --next` hands back a real work item.
|
|
7
|
+
You are the agent starting a project with a human. The end state is concrete: a validated RCF tree (PRD, requirements, stories with testable acceptance criteria, architecture captured as TAC / ADR) and an actionable FBS queue, reachable in one or two sittings. When you finish, `rcf define validate` is clean and `rcf build bundle --next` hands back a real work item.
|
|
8
8
|
|
|
9
9
|
This is the lite tier of the elicitation method: one operator voice, one agent, blank directory to first build loop. Section 9 states plainly what sits above this tier; section 11 states the integrity rules that hold across the whole conversation - read it, the failures it forecloses are quiet ones. Section 12 sets the register you hold with the operator throughout: plain language, one decision per message, the method invisible.
|
|
10
10
|
|
|
@@ -24,7 +24,7 @@ as it emerges -> TAC / ADR (architecture, captured or authored)
|
|
|
24
24
|
then -> BS / FBS (the ordered build queue)
|
|
25
25
|
```
|
|
26
26
|
|
|
27
|
-
Write documents as you go with `rcf create` and `rcf update`; do not batch the tree up in your head for one big write at the end. Run `rcf validate` after every level. Start from the scaffold:
|
|
27
|
+
Write documents as you go with `rcf define create` and `rcf define update`; do not batch the tree up in your head for one big write at the end. Run `rcf define validate` after every level. Start from the scaffold:
|
|
28
28
|
|
|
29
29
|
```
|
|
30
30
|
$ rcf init --project-name "Field notes" --non-interactive
|
|
@@ -61,11 +61,11 @@ One testable capability per REQ. Capture `category` (functional or non-functiona
|
|
|
61
61
|
Decomposition heuristics. Too big: the REQ needs "and" to state ("capture and search and tag notes" is three). Too vague: no observable behaviour survives questioning ("the product should be fast" becomes a non-functional REQ only once "fast at what, measured how" has an answer). A REQ that resists both splits and sharpening usually belongs in the PRD's out-of-scope list instead.
|
|
62
62
|
|
|
63
63
|
```
|
|
64
|
-
$ rcf create req --parent PRD-001 --title "Capture a note from the command line"
|
|
64
|
+
$ rcf define create req --parent PRD-001 --title "Capture a note from the command line"
|
|
65
65
|
REQ-002 created at rcf/requirements/req-002.json
|
|
66
66
|
```
|
|
67
67
|
|
|
68
|
-
The created document carries a TODO description and default category / priority values; replace the description and add the rationale with `rcf update` before moving on. TODOs left in place are honest, visible debt, but a REQ still wearing its defaults is not yet elicited.
|
|
68
|
+
The created document carries a TODO description and default category / priority values; replace the description and add the rationale with `rcf define update` before moving on. TODOs left in place are honest, visible debt, but a REQ still wearing its defaults is not yet elicited.
|
|
69
69
|
|
|
70
70
|
## 5. Stories and acceptance criteria (US / AC)
|
|
71
71
|
|
|
@@ -77,7 +77,7 @@ Question frames per REQ:
|
|
|
77
77
|
- Walk me through one concrete use, start to finish. The walk-through is where ACs come from.
|
|
78
78
|
|
|
79
79
|
```
|
|
80
|
-
$ rcf create us --parent REQ-002 --title "Capture a note in one command" --from-file story.json
|
|
80
|
+
$ rcf define create us --parent REQ-002 --title "Capture a note in one command" --from-file story.json
|
|
81
81
|
US-201 created at rcf/user-stories/us-201.json
|
|
82
82
|
```
|
|
83
83
|
|
|
@@ -91,7 +91,7 @@ The testable-AC quality bar, applied to every AC before it lands:
|
|
|
91
91
|
- **`testable: true` means a machine could check it.** Read the AC as a test skeleton; if you cannot see the assertion, rewrite the AC.
|
|
92
92
|
|
|
93
93
|
```
|
|
94
|
-
$ rcf create ac --parent US-201 --description "Adding a note creates a note file and exits 0" --from-file ac.json
|
|
94
|
+
$ rcf define create ac --parent US-201 --description "Adding a note creates a note file and exits 0" --from-file ac.json
|
|
95
95
|
AC-201-2 created at rcf/user-stories/us-201.json
|
|
96
96
|
```
|
|
97
97
|
|
|
@@ -169,17 +169,17 @@ Same story, one AC versus five. The extra four are not gold-plating - they are t
|
|
|
169
169
|
|
|
170
170
|
Every REQ this playbook draws out has a shape (§5.5.1), and each shape carries a baseline set of acceptance criteria (§5.5.2) that must hold unless the operator explicitly rules otherwise. Baselines exist because a UI REQ without a shared-nav AC lets the build ship a UI without a shared nav, and a persistence REQ without a crash-safety AC lets the build ship a store that loses writes on kill. The four-questions sweep of §5 asks the operator what they want, which is the right question. It does not ask what any operator would want if they knew to ask. The baselines are that second question, mechanised.
|
|
171
171
|
|
|
172
|
-
Silence is not agreement. When the sweep proposes a baseline AC, the operator either accepts it or opts out with a recorded reason. A "we can skip that for now" without a reason leaves the sweep open, and Stage 1 (Define) refuses `rcf build --next` for any FBS that binds ACs on a story with open sweeps. The refusal is the safeguard against the exact failure mode that produced four review-phase defects on the cold run.
|
|
172
|
+
Silence is not agreement. When the sweep proposes a baseline AC, the operator either accepts it or opts out with a recorded reason. A "we can skip that for now" without a reason leaves the sweep open, and Stage 1 (Define) refuses `rcf build bundle --next` for any FBS that binds ACs on a story with open sweeps. The refusal is the safeguard against the exact failure mode that produced four review-phase defects on the cold run.
|
|
173
173
|
|
|
174
174
|
### 5.5.1 The five shapes
|
|
175
175
|
|
|
176
|
-
`webUi` for HTML rendered for a person to look at. `httpApi` for programmatic HTTP endpoints for machine clients. `auth` for identity, sessions, credentials. `persistence` for durable storage the operator's data lives in across restarts. `notifications` for outbound delivery to a human channel. A REQ can carry more than one; a REQ that carries none records `shapes: [none]` (legitimate for pure business-rule REQs). Detection is deterministic keyword-scan over the REQ's `title`, `description` and `rationale` plus the parent PRD's `intent` and `problem` as fallback context; the classifier fires automatically on `rcf create req` and `rcf update req --description`, and `rcf req-classify <req-id>` re-runs it on demand.
|
|
176
|
+
`webUi` for HTML rendered for a person to look at. `httpApi` for programmatic HTTP endpoints for machine clients. `auth` for identity, sessions, credentials. `persistence` for durable storage the operator's data lives in across restarts. `notifications` for outbound delivery to a human channel. A REQ can carry more than one; a REQ that carries none records `shapes: [none]` (legitimate for pure business-rule REQs). Detection is deterministic keyword-scan over the REQ's `title`, `description` and `rationale` plus the parent PRD's `intent` and `problem` as fallback context; the classifier fires automatically on `rcf define create req` and `rcf define update req --description`, and `rcf discover req-classify <req-id>` re-runs it on demand.
|
|
177
177
|
|
|
178
178
|
### 5.5.2 Baseline sweep and opt-out ledger
|
|
179
179
|
|
|
180
|
-
`rcf req-baseline sweep --req <id>` walks every US under the target REQ and proposes any baseline AC not yet present. The operator accepts each candidate (which writes it as an AC with `provenance.authoredBy: baseline` and the `baselineKey` set) or opts out with a reason (which writes a `baselineAcOptOuts[]` entry so future USes under the same REQ inherit the ruling). The opt-out reason has a 20-character floor: a one-word "no" reads as silence, and silence is exactly what the ledger exists to prevent. The C+D-native `rcf req-baseline opt-out` verb is always available; Track A preflight's design-shape questions surface (`auth.htmlLoginPage` in v1) writes the same ledger for the preflight-driven case, so a preflight session and this playbook share one truth.
|
|
180
|
+
`rcf discover req-baseline sweep --req <id>` walks every US under the target REQ and proposes any baseline AC not yet present. The operator accepts each candidate (which writes it as an AC with `provenance.authoredBy: baseline` and the `baselineKey` set) or opts out with a reason (which writes a `baselineAcOptOuts[]` entry so future USes under the same REQ inherit the ruling). The opt-out reason has a 20-character floor: a one-word "no" reads as silence, and silence is exactly what the ledger exists to prevent. The C+D-native `rcf discover req-baseline opt-out` verb is always available; Track A preflight's design-shape questions surface (`auth.htmlLoginPage` in v1) writes the same ledger for the preflight-driven case, so a preflight session and this playbook share one truth.
|
|
181
181
|
|
|
182
|
-
Cross-references: the four-questions sweep of §5 still runs; baselines augment it, do not replace it. Track A preflight (see the build-cycle playbook §3 and `rcf preflight`) owns the design-shape questions that flip baselines before build. Track B's `uiBaseline.defaults` is the truth source for `webUi` baseline values (see `rcf ui-baseline`).
|
|
182
|
+
Cross-references: the four-questions sweep of §5 still runs; baselines augment it, do not replace it. Track A preflight (see the build-cycle playbook §3 and `rcf discover preflight`) owns the design-shape questions that flip baselines before build. Track B's `uiBaseline.defaults` is the truth source for `webUi` baseline values (see `rcf discover ui-baseline`).
|
|
183
183
|
|
|
184
184
|
## 6. Capturing architecture as it emerges (TAC / ADR)
|
|
185
185
|
|
|
@@ -191,7 +191,7 @@ What is asked early is the question, not a provider. The owner is free to answer
|
|
|
191
191
|
|
|
192
192
|
- **Ask it as its own item, early.** Put the deploy-target question in the conversation before the architecture takes any concrete shape. A one-line answer is enough to constrain everything downstream: "I've got Netlify", "it lives on my Cloudflare account", "it runs on my own machine". Those three are in alphabetical order, which is the only ordering rule this list has - it is not a ranking, and nothing in this playbook picks a provider for the owner.
|
|
193
193
|
- **Constrain the stack to the answer.** Once the target is known, the stack you choose (section below) must be one that target can actually host. Do not commit a stack the host cannot run - a Node-and-native-module stack on a Cloudflare-only account is the exact dead-end this rule exists to foreclose. If the only good stack for the app is incompatible with the stated host, that is a tradeoff to surface (section 11), not a silent override.
|
|
194
|
-
- **Capture it as an ADR on the project's own tree.** Record the deploy target and the stack constraint it implies as an ADR, so the decision is visible and revisable rather than buried in the agent's head. `rcf create adr --parent TAD-001 --title "Deploy target: <where> - stack constrained to <what it can host>"`.
|
|
194
|
+
- **Capture it as an ADR on the project's own tree.** Record the deploy target and the stack constraint it implies as an ADR, so the decision is visible and revisable rather than buried in the agent's head. `rcf define create adr --parent TAD-001 --title "Deploy target: <where> - stack constrained to <what it can host>"`.
|
|
195
195
|
- **Not choosing is also an answer.** "I do not know", "not yet", "I am not sure I want this built" and "this is not being deployed" are complete answers to the question, not failures to answer it. The two branches below take them, and neither ends with you naming a provider for the owner.
|
|
196
196
|
|
|
197
197
|
### When the owner does not know and wants to settle it: the hosting-choice walkthrough
|
|
@@ -213,7 +213,7 @@ Deferral does not mean the same thing for every capability, so branch on what th
|
|
|
213
213
|
|
|
214
214
|
So the question per capability is "what would deferring this actually cost to keep open?", not "is this deferred?". Defer the decision that needs an account. Build the part that does not.
|
|
215
215
|
|
|
216
|
-
**Record the deferral as the ADR.** A deferral is a decision and gets written down like one: `rcf create adr --parent TAD-001 --title "Deploy target: deferred - no target chosen"`, `status` left at `proposed`, context stating that the owner has not committed, consequences naming what stays open (the stack is unconstrained by a host; the done state is the local preview), alternatives being the options that were on the table and not taken. Leave it revisable - a deferral is a decision to decide later, and this ADR is what the later conversation reopens. An undecided deploy target recorded nowhere is indistinguishable from one nobody ever asked about.
|
|
216
|
+
**Record the deferral as the ADR.** A deferral is a decision and gets written down like one: `rcf define create adr --parent TAD-001 --title "Deploy target: deferred - no target chosen"`, `status` left at `proposed`, context stating that the owner has not committed, consequences naming what stays open (the stack is unconstrained by a host; the done state is the local preview), alternatives being the options that were on the table and not taken. Leave it revisable - a deferral is a decision to decide later, and this ADR is what the later conversation reopens. An undecided deploy target recorded nowhere is indistinguishable from one nobody ever asked about.
|
|
217
217
|
|
|
218
218
|
**Never let a deferral become a silent stub.** This is the one thing deferral must not do. When a capability is deferred outright, the acceptance criteria that require it are deferred with it, visibly - marked deferred, or lifted out of the queue and named as lifted - or scoped down to a stub the owner explicitly agreed to, in those words. An agent that quietly fakes the deferred thing (an auth path that waves everyone through, a store that forgets on restart, a send that goes nowhere) and then reports the build green has manufactured exactly the false green the verification side of this method exists to prevent. Deferring is honest; stubbing without saying so is not. The tree gives you nowhere to hide it either: an AC either holds or it is deferred, and both of those are things you say out loud.
|
|
219
219
|
|
|
@@ -224,9 +224,9 @@ Which document: a **TAC** is a lasting component - it has a purpose, responsibil
|
|
|
224
224
|
Minimum capture: a TAC needs its purpose and responsibilities; an ADR needs context, decision and consequences, plus the alternatives considered and why each was not chosen. One honest sentence per field beats a page of hedged ones.
|
|
225
225
|
|
|
226
226
|
```
|
|
227
|
-
$ rcf create tac --parent TAD-001 --title "Note store"
|
|
227
|
+
$ rcf define create tac --parent TAD-001 --title "Note store"
|
|
228
228
|
TAC-002 created at rcf/tacs/tac-002.json
|
|
229
|
-
$ rcf create adr --parent TAD-001 --title "Notes are plain files on disk"
|
|
229
|
+
$ rcf define create adr --parent TAD-001 --title "Notes are plain files on disk"
|
|
230
230
|
ADR-002 created at rcf/adrs/adr-002.json
|
|
231
231
|
```
|
|
232
232
|
|
|
@@ -247,7 +247,7 @@ Group ACs into FBS items. One FBS is a coherent deliverable, buildable in one si
|
|
|
247
247
|
- **Sizing bands.** `small` is roughly an hour to half a day (1-4h), `medium` half a day to a day (4-8h), `large` one to two days (8-16h). The schema caps `estimatedHours` at 16: an item that wants more is two items.
|
|
248
248
|
|
|
249
249
|
```
|
|
250
|
-
$ rcf create fbs --parent BS-001 --title "Note capture command" --acs AC-201-2
|
|
250
|
+
$ rcf define create fbs --parent BS-001 --title "Note capture command" --acs AC-201-2
|
|
251
251
|
FBS-002 created at rcf/fbs/fbs-002.json
|
|
252
252
|
```
|
|
253
253
|
|
|
@@ -258,9 +258,9 @@ The done-bar, all five together:
|
|
|
258
258
|
1. Every REQ has at least one US.
|
|
259
259
|
2. Every US has at least one testable AC.
|
|
260
260
|
3. The queue's head item is actionable: `rcf build` shows a `Next actionable` id.
|
|
261
|
-
4. `rcf validate` is clean.
|
|
262
|
-
5. `rcf coverage` has been run and its zero-covered baseline is understood.
|
|
263
|
-
6. Every classified REQ has completed its baseline sweep (no open candidates). `rcf req-baseline sweep --all --status` prints the open-candidate queue; the Stage 1 gate refuses `rcf build --next` for any FBS binding an AC on a US that still has one.
|
|
261
|
+
4. `rcf define validate` is clean.
|
|
262
|
+
5. `rcf audit coverage` has been run and its zero-covered baseline is understood.
|
|
263
|
+
6. Every classified REQ has completed its baseline sweep (no open candidates). `rcf discover req-baseline sweep --all --status` prints the open-candidate queue; the Stage 1 gate refuses `rcf build bundle --next` for any FBS binding an AC on a US that still has one.
|
|
264
264
|
|
|
265
265
|
Queue-head evidence from the scratch project:
|
|
266
266
|
|
|
@@ -283,12 +283,12 @@ Parallel-safe tiers (items in the same tier have no dependency between them and
|
|
|
283
283
|
Next actionable: FBS-001
|
|
284
284
|
```
|
|
285
285
|
|
|
286
|
-
Note the head item: it is the scaffold's placeholder FBS, still wearing its TODO title, and it will be the first thing `rcf build --next` hands the build loop. Rescope it to real work or delete it before you declare the queue done; a placeholder at the head of the queue fails the done-bar even though it is technically actionable.
|
|
286
|
+
Note the head item: it is the scaffold's placeholder FBS, still wearing its TODO title, and it will be the first thing `rcf build bundle --next` hands the build loop. Rescope it to real work or delete it before you declare the queue done; a placeholder at the head of the queue fails the done-bar even though it is technically actionable.
|
|
287
287
|
|
|
288
288
|
And the coverage baseline:
|
|
289
289
|
|
|
290
290
|
```
|
|
291
|
-
$ rcf coverage
|
|
291
|
+
$ rcf audit coverage
|
|
292
292
|
Coverage mode: shallow-any
|
|
293
293
|
Requirements: 2 covered: 0 uncovered: 2
|
|
294
294
|
|
|
@@ -299,15 +299,15 @@ REQ-002 no AC-201-1 no -
|
|
|
299
299
|
AC-201-2 no -
|
|
300
300
|
```
|
|
301
301
|
|
|
302
|
-
Zero covered is the correct end state for elicitation. Tests come from the build cycle, stage by stage, not from this conversation. Stopping here is the discipline: the tree does not need to be complete, it needs to be valid, honest and actionable. New requirements will surface during the build; they enter through `rcf create`, not through reopening elicitation wholesale.
|
|
302
|
+
Zero covered is the correct end state for elicitation. Tests come from the build cycle, stage by stage, not from this conversation. Stopping here is the discipline: the tree does not need to be complete, it needs to be valid, honest and actionable. New requirements will surface during the build; they enter through `rcf define create`, not through reopening elicitation wholesale.
|
|
303
303
|
|
|
304
304
|
**Offer a review before the build starts.** The done-bar is met and the build loop is next, but the operator has not seen the tree you drafted from their answers. Do not roll straight into building. Offer the review, in plain words rather than document names: "The plan is drafted and everything checks out: what we're building, the requirements, and the build order. Want to look it over before I start building, or shall I go?" Then wait. A tree the operator never saw becomes a build they cannot course-correct, and the review is cheapest now, before any code hangs off the ACs. The build-cycle playbook (section 11) holds the same gate from the build side.
|
|
305
305
|
|
|
306
|
-
**UI-baseline check when a Web UI REQ is present (Track B soft nudge).** After the tree is drafted and before Stage 1 of the first UI-bearing FBS begins, look at the requirements one more time: does any REQ shape as a Web UI (matched by the shared `matchReqShapeSignals` classifier's `webUi` shape, or by the operator naming pages / screens / dashboards in prose)? If so, prompt the operator to run `rcf ui-baseline init` before the build cycle picks up its first FBS. The baseline captures the ruled UI defaults once per project (theme mode, shared layout, contrast targets, component vocabulary, auth-flow expectations); every subsequent UI-bearing FBS inherits from it. This is a soft check, not a hard gate at elicitation time - the hard refusal fires later at `rcf design <fbs-id>` when the FBS is uiBearing and no baseline exists.
|
|
306
|
+
**UI-baseline check when a Web UI REQ is present (Track B soft nudge).** After the tree is drafted and before Stage 1 of the first UI-bearing FBS begins, look at the requirements one more time: does any REQ shape as a Web UI (matched by the shared `matchReqShapeSignals` classifier's `webUi` shape, or by the operator naming pages / screens / dashboards in prose)? If so, prompt the operator to run `rcf discover ui-baseline init` before the build cycle picks up its first FBS. The baseline captures the ruled UI defaults once per project (theme mode, shared layout, contrast targets, component vocabulary, auth-flow expectations); every subsequent UI-bearing FBS inherits from it. This is a soft check, not a hard gate at elicitation time - the hard refusal fires later at `rcf define design <fbs-id>` when the FBS is uiBearing and no baseline exists.
|
|
307
307
|
|
|
308
308
|
## 8.5 Pre-flight config
|
|
309
309
|
|
|
310
|
-
Between the tree being drafted (section 8) and the build cycle picking up its first FBS (build-cycle playbook, section 3), one more session runs: `rcf preflight`. The session is not part of elicitation but sits at the seam between it and the build. It exists because a mocked integration test looks identical to a live one, and the honest answer to "how are we verifying this" has to be captured while the operator is thinking about the product, not while a test suite is going green.
|
|
310
|
+
Between the tree being drafted (section 8) and the build cycle picking up its first FBS (build-cycle playbook, section 3), one more session runs: `rcf discover preflight`. The session is not part of elicitation but sits at the seam between it and the build. It exists because a mocked integration test looks identical to a live one, and the honest answer to "how are we verifying this" has to be captured while the operator is thinking about the product, not while a test suite is going green.
|
|
311
311
|
|
|
312
312
|
**What it is.** One pass over every third-party service the PRD (and optionally a TAD) names. The scanner surfaces candidates; the session forces one of five attestation modes per service, plus any applicable design-shape answers (v1 catalogue: `auth.htmlLoginPage`), and writes a `preFlightConfig` record on the manifest. No code changes at this stage.
|
|
313
313
|
|
|
@@ -327,7 +327,7 @@ Pick honestly. A `mocked` where the ship intent is `live` is the exact failure t
|
|
|
327
327
|
|
|
328
328
|
**Credentials never enter the chain.** The session prompts for env-var NAMES only. Values are read from the shell at test / finalise time; the name-metadata lives in `.rcf/preflight-secrets.local.json`, which is gitignored via the managed block written by `rcf init`.
|
|
329
329
|
|
|
330
|
-
**Hand-off to the build cycle.** Once the record is written, the build cycle picks up as normal. `rcf build --next` warns (not refuses) when an in-scope FBS touches an AC whose services are not covered by any `preFlightConfig` record; the operator re-runs `rcf preflight` and continues.
|
|
330
|
+
**Hand-off to the build cycle.** Once the record is written, the build cycle picks up as normal. `rcf build bundle --next` warns (not refuses) when an in-scope FBS touches an AC whose services are not covered by any `preFlightConfig` record; the operator re-runs `rcf discover preflight` and continues.
|
|
331
331
|
|
|
332
332
|
## 9. What this playbook deliberately does not do
|
|
333
333
|
|
|
@@ -368,18 +368,18 @@ Agent: So: as a note keeper, you want to capture a note with one
|
|
|
368
368
|
The commands behind that exchange, run as it happened:
|
|
369
369
|
|
|
370
370
|
```
|
|
371
|
-
$ rcf create req --parent PRD-001 --title "Capture a note from the command line"
|
|
371
|
+
$ rcf define create req --parent PRD-001 --title "Capture a note from the command line"
|
|
372
372
|
REQ-002 created at rcf/requirements/req-002.json
|
|
373
|
-
$ rcf create us --parent REQ-002 --title "Capture a note in one command" --from-file story.json
|
|
373
|
+
$ rcf define create us --parent REQ-002 --title "Capture a note in one command" --from-file story.json
|
|
374
374
|
US-201 created at rcf/user-stories/us-201.json
|
|
375
|
-
$ rcf create ac --parent US-201 --description "Adding a note creates a note file and exits 0" --from-file ac.json
|
|
375
|
+
$ rcf define create ac --parent US-201 --description "Adding a note creates a note file and exits 0" --from-file ac.json
|
|
376
376
|
AC-201-2 created at rcf/user-stories/us-201.json
|
|
377
377
|
```
|
|
378
378
|
|
|
379
379
|
And the captured document, read back:
|
|
380
380
|
|
|
381
381
|
```
|
|
382
|
-
$ rcf read US-201
|
|
382
|
+
$ rcf define read US-201
|
|
383
383
|
{
|
|
384
384
|
"createdAt": "2026-07-06T12:26:00.851Z",
|
|
385
385
|
"updatedAt": "2026-07-06T12:26:00.931Z",
|
|
@@ -410,7 +410,7 @@ $ rcf read US-201
|
|
|
410
410
|
}
|
|
411
411
|
```
|
|
412
412
|
|
|
413
|
-
One piece of visible debt in that read-back: `AC-201-1` is the placeholder `rcf create us` seeds every new story with. Fill it from the next walk-through or delete it; do not leave TODO criteria in a tree you are about to call done.
|
|
413
|
+
One piece of visible debt in that read-back: `AC-201-1` is the placeholder `rcf define create us` seeds every new story with. Fill it from the next walk-through or delete it; do not leave TODO criteria in a tree you are about to call done.
|
|
414
414
|
|
|
415
415
|
Frame, answer, document, command. That rhythm, held level by level through sections 3 to 7, is the whole method.
|
|
416
416
|
|
|
@@ -92,7 +92,7 @@ leaving it out.
|
|
|
92
92
|
|
|
93
93
|
### RULE 3: The test layer is mandatory.
|
|
94
94
|
|
|
95
|
-
Author TS and TC documents and run `rcf coverage --strict`. Do not
|
|
95
|
+
Author TS and TC documents and run `rcf audit coverage --strict`. Do not
|
|
96
96
|
declare the work done while coverage fails, unless the stakeholder has
|
|
97
97
|
explicitly accepted the gap.
|
|
98
98
|
|
|
@@ -180,10 +180,52 @@ things the operator does not want in the shared repo. The absence of
|
|
|
180
180
|
the file is not an error; a fresh clone from another developer has no
|
|
181
181
|
profile of yours yet.
|
|
182
182
|
|
|
183
|
+
### RULE 11: Validate the chain before you act on it.
|
|
184
|
+
|
|
185
|
+
Before you emit a build spec, execute one, edit the tree, or run any
|
|
186
|
+
verb that reads the tree as truth, run `rcf define validate`. The
|
|
187
|
+
operator does not have to ask, and the check does not wait for a stage
|
|
188
|
+
that names it. A dirty tree is caught here rather than mid-Build, mid-
|
|
189
|
+
Test, or at the ship gate. If validation fails or coverage is broken
|
|
190
|
+
against the work in hand, stop and surface the finding to the operator
|
|
191
|
+
(RULE 12) before touching code or authoring documents. Everything
|
|
192
|
+
downstream assumes the tree you are reading is the tree the referee
|
|
193
|
+
thinks it is; the pre-action check is what keeps that assumption true.
|
|
194
|
+
|
|
195
|
+
### RULE 12: Surface method findings in the operator's language.
|
|
196
|
+
|
|
197
|
+
When `rcf define validate`, `rcf audit coverage`, `rcf audit trace` or a
|
|
198
|
+
spec inspection turns up a gap, translate it into plain intent before
|
|
199
|
+
you raise it. The operator hears the behaviour that is missing, not the
|
|
200
|
+
document id that is missing. "The plan for search does not say what
|
|
201
|
+
should happen when nothing matches, want me to add a check for that?"
|
|
202
|
+
beats "AC-207 has no covering TS". Method terms and document ids belong
|
|
203
|
+
in files and command output; the conversation carries the intent behind
|
|
204
|
+
them. An id appears only when you are pointing the operator at a
|
|
205
|
+
specific file, or after the operator used it first. The general
|
|
206
|
+
register for talking to the operator is set higher in this file; this
|
|
207
|
+
rule is that register applied to findings.
|
|
208
|
+
|
|
209
|
+
### RULE 13: The method's failure modes are yours to catch.
|
|
210
|
+
|
|
211
|
+
The failure modes the method exists to guard against are agent-side
|
|
212
|
+
self-checks, not defects for the operator to spot and name. Skipping a
|
|
213
|
+
layer, gold-plating past the AC set, editing a test to pass instead of
|
|
214
|
+
fixing the code, marking complete before the merge, drifting off the
|
|
215
|
+
bundle, inventing a fact the stakeholder never gave you, treating a
|
|
216
|
+
rubber-stamp read as review, marking a stage done without its referee
|
|
217
|
+
output: you catch each one before the stage ends. Before you commit a
|
|
218
|
+
stage, run the self-check: every in-scope AC maps to a diff location;
|
|
219
|
+
every planned step traces to an AC id; the referee output actually ran
|
|
220
|
+
and named the id you were working on; nothing landed the bundle did not
|
|
221
|
+
ask for. A failure the operator has to point out is a failure you did
|
|
222
|
+
not check for. The depth for each stage's self-check lives in the
|
|
223
|
+
build-cycle playbook.
|
|
224
|
+
|
|
183
225
|
### Session start
|
|
184
226
|
|
|
185
|
-
Run `rcf validate`. A broken tree is fixed or reported before anything
|
|
186
|
-
else. Run `rcf build` for queue state: what is done, in progress,
|
|
227
|
+
Run `rcf define validate`. A broken tree is fixed or reported before anything
|
|
228
|
+
else. Run `rcf build queue` for queue state: what is done, in progress,
|
|
187
229
|
blocked. Run `rcf doctor` if the last upgrade of the package changed
|
|
188
230
|
these rules. The block you are reading may be out of date; `rcf doctor
|
|
189
231
|
--fix` rewrites it.
|
|
@@ -194,17 +236,17 @@ Docs-review gate: when the tree has just been elicited, offer the
|
|
|
194
236
|
stakeholder a review of it before the first build. Do not roll from
|
|
195
237
|
elicitation straight into building without the offer.
|
|
196
238
|
|
|
197
|
-
Run `rcf build --next` to get the spec bundle for the next actionable
|
|
239
|
+
Run `rcf build bundle --next` to get the spec bundle for the next actionable
|
|
198
240
|
item, then execute the five-stage runbook it prints: Define, Build,
|
|
199
241
|
Review, Test, Finalise. Every stage ends in a commit. Drive the whole
|
|
200
|
-
queue, not one item. After each item's Finalise, loop `rcf build --next`
|
|
242
|
+
queue, not one item. After each item's Finalise, loop `rcf build bundle --next`
|
|
201
243
|
until it reports the queue complete. If your harness can spawn
|
|
202
244
|
sub-agents, run each FBS in its own worker so the driving context stays
|
|
203
245
|
clean across the queue: one write worker at a time.
|
|
204
246
|
|
|
205
247
|
Record lifecycle transitions with the exact mark commands the bundle
|
|
206
|
-
prints. Never mark backwards. Run `rcf validate` after any tree edit,
|
|
207
|
-
and `rcf trace <id>` or `rcf impact <id>` before touching anything with
|
|
248
|
+
prints. Never mark backwards. Run `rcf define validate` after any tree edit,
|
|
249
|
+
and `rcf audit trace <id>` or `rcf audit impact <id>` before touching anything with
|
|
208
250
|
dependents. PR bodies are evidence-first: lead with what was verified
|
|
209
251
|
and how, traced to AC and FBS ids, not a diff walk.
|
|
210
252
|
|
|
@@ -212,7 +254,7 @@ Run the fresh-context self-review every few FBS builds and once at the
|
|
|
212
254
|
end: a reviewer that drives the running app against its ACs, not one
|
|
213
255
|
that reads the code. Method: `rcf guidance build-cycle-playbook`,
|
|
214
256
|
section 16. It is the cheap in-loop check between builds, and it is not
|
|
215
|
-
the independent verification gate. `rcf finalise` runs that, and only
|
|
257
|
+
the independent verification gate. `rcf build finalise` runs that, and only
|
|
216
258
|
that writes `verified`.
|
|
217
259
|
|
|
218
260
|
If context gets unreliable on a large build, do not stall. Write a
|
|
@@ -224,7 +266,7 @@ without re-elicitation.
|
|
|
224
266
|
### Write discipline
|
|
225
267
|
|
|
226
268
|
Prefer the `rcf` verbs (`create`, `update`, `delete`, `link`) for tree
|
|
227
|
-
edits. After any hand edit to a file under `rcf/`, run `rcf validate`
|
|
269
|
+
edits. After any hand edit to a file under `rcf/`, run `rcf define validate`
|
|
228
270
|
before proceeding.
|
|
229
271
|
|
|
230
272
|
### Escalation
|
|
@@ -254,4 +296,4 @@ These rules only govern a session that loads this fragment. A project that was n
|
|
|
254
296
|
|
|
255
297
|
## Check it took
|
|
256
298
|
|
|
257
|
-
Four checks. Ask the agent to state the loop; the answer should name the five stages and the mark commands. Ask what it does before authoring documents; the answer should name the elicitation playbook and stakeholder questions, not drafting. Watch its first `rcf build --next` cycle: the bundle's runbook should be followed stage by stage, with a commit at each stage end. And read its first message to the operator: it should be a few plain sentences ending in one clear question, with no rule numbers and no document-id inventory.
|
|
299
|
+
Four checks. Ask the agent to state the loop; the answer should name the five stages and the mark commands. Ask what it does before authoring documents; the answer should name the elicitation playbook and stakeholder questions, not drafting. Watch its first `rcf build bundle --next` cycle: the bundle's runbook should be followed stage by stage, with a commit at each stage end. And read its first message to the operator: it should be a few plain sentences ending in one clear question, with no rule numbers and no document-id inventory.
|
|
@@ -35,7 +35,7 @@ doctor writes into an installed project, see the files below.
|
|
|
35
35
|
reports and exits 0 clean, 3 dirty. `rcf doctor --fix` is the only
|
|
36
36
|
path that repairs.
|
|
37
37
|
- **Never auto-repair.** No hook, no post-install script, no `rcf init`
|
|
38
|
-
or `rcf validate` sub-call invokes `--fix` implicitly. Init writes
|
|
38
|
+
or `rcf define validate` sub-call invokes `--fix` implicitly. Init writes
|
|
39
39
|
the block on a fresh scaffold; doctor maintains an existing project.
|
|
40
40
|
Both are operator-typed.
|
|
41
41
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
70e0048d6160f15191dfbcf43588b0ba4cd24349b7ee8098671f121110677348
|
|
@@ -79,7 +79,7 @@ leaving it out.
|
|
|
79
79
|
|
|
80
80
|
### RULE 3: The test layer is mandatory.
|
|
81
81
|
|
|
82
|
-
Author TS and TC documents and run `rcf coverage --strict`. Do not
|
|
82
|
+
Author TS and TC documents and run `rcf audit coverage --strict`. Do not
|
|
83
83
|
declare the work done while coverage fails, unless the stakeholder has
|
|
84
84
|
explicitly accepted the gap.
|
|
85
85
|
|
|
@@ -167,10 +167,52 @@ things the operator does not want in the shared repo. The absence of
|
|
|
167
167
|
the file is not an error; a fresh clone from another developer has no
|
|
168
168
|
profile of yours yet.
|
|
169
169
|
|
|
170
|
+
### RULE 11: Validate the chain before you act on it.
|
|
171
|
+
|
|
172
|
+
Before you emit a build spec, execute one, edit the tree, or run any
|
|
173
|
+
verb that reads the tree as truth, run `rcf define validate`. The
|
|
174
|
+
operator does not have to ask, and the check does not wait for a stage
|
|
175
|
+
that names it. A dirty tree is caught here rather than mid-Build, mid-
|
|
176
|
+
Test, or at the ship gate. If validation fails or coverage is broken
|
|
177
|
+
against the work in hand, stop and surface the finding to the operator
|
|
178
|
+
(RULE 12) before touching code or authoring documents. Everything
|
|
179
|
+
downstream assumes the tree you are reading is the tree the referee
|
|
180
|
+
thinks it is; the pre-action check is what keeps that assumption true.
|
|
181
|
+
|
|
182
|
+
### RULE 12: Surface method findings in the operator's language.
|
|
183
|
+
|
|
184
|
+
When `rcf define validate`, `rcf audit coverage`, `rcf audit trace` or a
|
|
185
|
+
spec inspection turns up a gap, translate it into plain intent before
|
|
186
|
+
you raise it. The operator hears the behaviour that is missing, not the
|
|
187
|
+
document id that is missing. "The plan for search does not say what
|
|
188
|
+
should happen when nothing matches, want me to add a check for that?"
|
|
189
|
+
beats "AC-207 has no covering TS". Method terms and document ids belong
|
|
190
|
+
in files and command output; the conversation carries the intent behind
|
|
191
|
+
them. An id appears only when you are pointing the operator at a
|
|
192
|
+
specific file, or after the operator used it first. The general
|
|
193
|
+
register for talking to the operator is set higher in this file; this
|
|
194
|
+
rule is that register applied to findings.
|
|
195
|
+
|
|
196
|
+
### RULE 13: The method's failure modes are yours to catch.
|
|
197
|
+
|
|
198
|
+
The failure modes the method exists to guard against are agent-side
|
|
199
|
+
self-checks, not defects for the operator to spot and name. Skipping a
|
|
200
|
+
layer, gold-plating past the AC set, editing a test to pass instead of
|
|
201
|
+
fixing the code, marking complete before the merge, drifting off the
|
|
202
|
+
bundle, inventing a fact the stakeholder never gave you, treating a
|
|
203
|
+
rubber-stamp read as review, marking a stage done without its referee
|
|
204
|
+
output: you catch each one before the stage ends. Before you commit a
|
|
205
|
+
stage, run the self-check: every in-scope AC maps to a diff location;
|
|
206
|
+
every planned step traces to an AC id; the referee output actually ran
|
|
207
|
+
and named the id you were working on; nothing landed the bundle did not
|
|
208
|
+
ask for. A failure the operator has to point out is a failure you did
|
|
209
|
+
not check for. The depth for each stage's self-check lives in the
|
|
210
|
+
build-cycle playbook.
|
|
211
|
+
|
|
170
212
|
### Session start
|
|
171
213
|
|
|
172
|
-
Run `rcf validate`. A broken tree is fixed or reported before anything
|
|
173
|
-
else. Run `rcf build` for queue state: what is done, in progress,
|
|
214
|
+
Run `rcf define validate`. A broken tree is fixed or reported before anything
|
|
215
|
+
else. Run `rcf build queue` for queue state: what is done, in progress,
|
|
174
216
|
blocked. Run `rcf doctor` if the last upgrade of the package changed
|
|
175
217
|
these rules. The block you are reading may be out of date; `rcf doctor
|
|
176
218
|
--fix` rewrites it.
|
|
@@ -181,17 +223,17 @@ Docs-review gate: when the tree has just been elicited, offer the
|
|
|
181
223
|
stakeholder a review of it before the first build. Do not roll from
|
|
182
224
|
elicitation straight into building without the offer.
|
|
183
225
|
|
|
184
|
-
Run `rcf build --next` to get the spec bundle for the next actionable
|
|
226
|
+
Run `rcf build bundle --next` to get the spec bundle for the next actionable
|
|
185
227
|
item, then execute the five-stage runbook it prints: Define, Build,
|
|
186
228
|
Review, Test, Finalise. Every stage ends in a commit. Drive the whole
|
|
187
|
-
queue, not one item. After each item's Finalise, loop `rcf build --next`
|
|
229
|
+
queue, not one item. After each item's Finalise, loop `rcf build bundle --next`
|
|
188
230
|
until it reports the queue complete. If your harness can spawn
|
|
189
231
|
sub-agents, run each FBS in its own worker so the driving context stays
|
|
190
232
|
clean across the queue: one write worker at a time.
|
|
191
233
|
|
|
192
234
|
Record lifecycle transitions with the exact mark commands the bundle
|
|
193
|
-
prints. Never mark backwards. Run `rcf validate` after any tree edit,
|
|
194
|
-
and `rcf trace <id>` or `rcf impact <id>` before touching anything with
|
|
235
|
+
prints. Never mark backwards. Run `rcf define validate` after any tree edit,
|
|
236
|
+
and `rcf audit trace <id>` or `rcf audit impact <id>` before touching anything with
|
|
195
237
|
dependents. PR bodies are evidence-first: lead with what was verified
|
|
196
238
|
and how, traced to AC and FBS ids, not a diff walk.
|
|
197
239
|
|
|
@@ -199,7 +241,7 @@ Run the fresh-context self-review every few FBS builds and once at the
|
|
|
199
241
|
end: a reviewer that drives the running app against its ACs, not one
|
|
200
242
|
that reads the code. Method: `rcf guidance build-cycle-playbook`,
|
|
201
243
|
section 16. It is the cheap in-loop check between builds, and it is not
|
|
202
|
-
the independent verification gate. `rcf finalise` runs that, and only
|
|
244
|
+
the independent verification gate. `rcf build finalise` runs that, and only
|
|
203
245
|
that writes `verified`.
|
|
204
246
|
|
|
205
247
|
If context gets unreliable on a large build, do not stall. Write a
|
|
@@ -211,7 +253,7 @@ without re-elicitation.
|
|
|
211
253
|
### Write discipline
|
|
212
254
|
|
|
213
255
|
Prefer the `rcf` verbs (`create`, `update`, `delete`, `link`) for tree
|
|
214
|
-
edits. After any hand edit to a file under `rcf/`, run `rcf validate`
|
|
256
|
+
edits. After any hand edit to a file under `rcf/`, run `rcf define validate`
|
|
215
257
|
before proceeding.
|
|
216
258
|
|
|
217
259
|
### Escalation
|
package/guidance/manifest.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
{"slug": "persona-programme", "file": "persona-programme.md", "title": "Persona programme: tail-interview template"}
|
|
9
9
|
],
|
|
10
10
|
"prompts": [
|
|
11
|
-
{"name": "rcf_execute_build_cycle", "file": "build-cycle-playbook.md", "description": "How to execute the RCF 5-stage build cycle well: per-stage guidance, referee commands, failure modes, escalation rules. Fetch once per session, then drive rcf build --next."},
|
|
11
|
+
{"name": "rcf_execute_build_cycle", "file": "build-cycle-playbook.md", "description": "How to execute the RCF 5-stage build cycle well: per-stage guidance, referee commands, failure modes, escalation rules. Fetch once per session, then drive rcf build bundle --next."},
|
|
12
12
|
{"name": "rcf_elicit_requirements", "file": "elicitation-playbook.md", "description": "How to draw a valid RCF tree out of a conversation: question frames for PRD / REQ / US / AC, the testable-AC quality bar, TAC / ADR capture, FBS queue construction, and when to stop."}
|
|
13
13
|
],
|
|
14
14
|
"platformInvariants": [
|
package/guidance/overview.md
CHANGED
|
@@ -25,9 +25,9 @@ The full per-type detail is in `rcf://docs/document-model`.
|
|
|
25
25
|
|
|
26
26
|
Every RCF query is one of three questions:
|
|
27
27
|
|
|
28
|
-
1. **Is it covered?** Does every acceptance criterion have a test case whose pointer resolves to a real test? (`rcf coverage`)
|
|
29
|
-
2. **What does it trace to?** Which requirement asked for this; which stories, criteria and tests hang off it? (`rcf trace`)
|
|
30
|
-
3. **What breaks if it changes?** Which documents and tests are invalidated by a change to this one? (`rcf impact`)
|
|
28
|
+
1. **Is it covered?** Does every acceptance criterion have a test case whose pointer resolves to a real test? (`rcf audit coverage`)
|
|
29
|
+
2. **What does it trace to?** Which requirement asked for this; which stories, criteria and tests hang off it? (`rcf audit trace`)
|
|
30
|
+
3. **What breaks if it changes?** Which documents and tests are invalidated by a change to this one? (`rcf audit impact`)
|
|
31
31
|
|
|
32
32
|
## The build cycle in five lines
|
|
33
33
|
|
|
@@ -41,7 +41,7 @@ Every stage ends in a commit. The normative statement is `rcf://docs/build-cycle
|
|
|
41
41
|
|
|
42
42
|
## Mechanical, not semantic
|
|
43
43
|
|
|
44
|
-
The tool referees structure, never adequacy. `rcf validate` proves every document matches its schema and every reference resolves; `rcf coverage` proves every acceptance criterion has a test case whose `testPointer` resolves to a real, named test in the tree - a test-case row with a dead or missing pointer is reported as `covered-unresolved`, never as coverage. Neither proves that the acceptance criteria capture the requirement's intent, or that a test asserts the right behaviour: a renamed test is caught, a gutted test that kept its name is not. That judgement belongs to the agent and the human operating the loop. The tool's contribution is to make the structural half of confidence mechanical, so judgement is spent only where judgement is needed.
|
|
44
|
+
The tool referees structure, never adequacy. `rcf define validate` proves every document matches its schema and every reference resolves; `rcf audit coverage` proves every acceptance criterion has a test case whose `testPointer` resolves to a real, named test in the tree - a test-case row with a dead or missing pointer is reported as `covered-unresolved`, never as coverage. Neither proves that the acceptance criteria capture the requirement's intent, or that a test asserts the right behaviour: a renamed test is caught, a gutted test that kept its name is not. That judgement belongs to the agent and the human operating the loop. The tool's contribution is to make the structural half of confidence mechanical, so judgement is spent only where judgement is needed.
|
|
45
45
|
|
|
46
46
|
---
|
|
47
47
|
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rcf-lite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.11.0",
|
|
4
4
|
"type": "module",
|
|
5
|
-
"description": "One-install tooling for the Requirements Confidence Framework (RCF): the unified `rcf` CLI (
|
|
5
|
+
"description": "One-install tooling for the Requirements Confidence Framework (RCF): the unified `rcf` CLI grouped into the five RCF tool groups (discover, define, build, verify, audit) plus a small core set (init, doctor, guidance, mcp), an MCP server, the live tree viewer and the fresh-context adversarial ship-gate verifier. Consumes @stravica-ai/rcf-schemas.",
|
|
6
6
|
"license": "Apache-2.0",
|
|
7
7
|
"homepage": "https://github.com/Stravica/rcf-lite",
|
|
8
8
|
"bugs": "https://github.com/Stravica/rcf-lite/issues",
|
|
@@ -20,8 +20,7 @@
|
|
|
20
20
|
"node": ">=24.0.0"
|
|
21
21
|
},
|
|
22
22
|
"bin": {
|
|
23
|
-
"rcf": "bin/rcf.js"
|
|
24
|
-
"rcf-verify": "bin/rcf-verify.js"
|
|
23
|
+
"rcf": "bin/rcf.js"
|
|
25
24
|
},
|
|
26
25
|
"files": [
|
|
27
26
|
"bin",
|
|
@@ -71,7 +70,6 @@
|
|
|
71
70
|
"vendor": "node scripts/vendor-mermaid.mjs",
|
|
72
71
|
"build:managed": "node scripts/gen-managed-artefacts.mjs",
|
|
73
72
|
"canary:register": "node scripts/canary-register.mjs",
|
|
74
|
-
"rcf": "node bin/rcf.js"
|
|
75
|
-
"rcf-verify": "node bin/rcf-verify.js"
|
|
73
|
+
"rcf": "node bin/rcf.js"
|
|
76
74
|
}
|
|
77
75
|
}
|
package/rcf/adrs/adr-008.json
CHANGED
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
{
|
|
9
9
|
"name": "Require verification against the deployed runtime",
|
|
10
10
|
"summary": "Mandate that every verification run against the real deployed target, removing the provenance ambiguity by removing local verification.",
|
|
11
|
-
"reasonNotChosen": "Not always possible for the owner (no deploy yet, no account), and it belongs to the productised independent gate (rcf
|
|
11
|
+
"reasonNotChosen": "Not always possible for the owner (no deploy yet, no account), and it belongs to the productised independent gate (rcf verify-lite); the base offering's job is to label provenance honestly, not to force a deployed run."
|
|
12
12
|
},
|
|
13
13
|
{
|
|
14
14
|
"name": "Trust green suites as verification",
|
package/rcf/adrs/adr-009.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"createdAt": "2026-07-20T17:03:19.722Z",
|
|
3
3
|
"updatedAt": "2026-07-28T16:40:20.554Z",
|
|
4
|
-
"context": "The persona programme showed self-verification is only as truthful as the runtime it verifies against, and that a green suite plus a confident claim can still ship a user-facing defect (runs 03 and 05). The durable answer is a productised independent verification gate (rcf
|
|
5
|
-
"decision": "The guidance carries interim self-review guidance - documentation and prompt-level, not a new subsystem - for a carefully-scoped manual-review subagent dispatch: a periodic review every few FBS builds plus one at the end of the build. The reviewer runs fresh-context, drives the APP against the acceptance criteria rather than reading the code, and targets the defect classes green suites miss: session-class bugs, false-promise UI (stubs that imply real actions), runtime mismatch (localhost versus deployed), dead auth paths, and dead code. The guidance states plainly that this is an interim stopgap until rcf
|
|
6
|
-
"consequences": "The base offering gains a review step that catches the defect classes the five-stage loop demonstrably missed, at documentation cost and with no new code surface to maintain. Because it is guidance, it can ship now and be retired or folded into rcf
|
|
4
|
+
"context": "The persona programme showed self-verification is only as truthful as the runtime it verifies against, and that a green suite plus a confident claim can still ship a user-facing defect (runs 03 and 05). The durable answer is a productised independent verification gate (rcf verify-lite), being scoped separately at HQ. But the base offering needs a stopgap now, and it must not pretend to be the independent gate: an in-loop self-review by the same agent is not an independent check and cannot be sold as one.",
|
|
5
|
+
"decision": "The guidance carries interim self-review guidance - documentation and prompt-level, not a new subsystem - for a carefully-scoped manual-review subagent dispatch: a periodic review every few FBS builds plus one at the end of the build. The reviewer runs fresh-context, drives the APP against the acceptance criteria rather than reading the code, and targets the defect classes green suites miss: session-class bugs, false-promise UI (stubs that imply real actions), runtime mismatch (localhost versus deployed), dead auth paths, and dead code. The guidance states plainly that this is an interim stopgap until rcf verify-lite exists and that it is not the independent verification gate.",
|
|
6
|
+
"consequences": "The base offering gains a review step that catches the defect classes the five-stage loop demonstrably missed, at documentation cost and with no new code surface to maintain. Because it is guidance, it can ship now and be retired or folded into rcf verify-lite later without a migration. The cost and the honesty boundary are the same point: a same-programme reviewer is better than nothing and weaker than an independent gate, and the guidance says so rather than overclaiming. Update 2026-07-28: rcf verify-lite has since shipped and rcf build finalise runs it as the independent gate, so the 'stopgap until the gate exists' framing recorded in the decision above is spent. The decision itself stands - the self-review is still guidance, still not a subsystem, still not the gate - but it is now positioned as the cheap in-loop check that runs between builds, subordinate to the finalise gate rather than a placeholder for it, and AC-805-4 and the guidance were reworded to match.",
|
|
7
7
|
"alternativesConsidered": [
|
|
8
8
|
{
|
|
9
|
-
"name": "Wait for rcf
|
|
9
|
+
"name": "Wait for rcf verify-lite",
|
|
10
10
|
"summary": "Ship no review step until the productised independent gate exists.",
|
|
11
11
|
"reasonNotChosen": "Leaves the base offering shipping the exact defect classes the programme caught, for months, against users who cannot catch them themselves."
|
|
12
12
|
},
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"cnId": "CN-016",
|
|
3
3
|
"path": "src/view/mermaid-diagram.js",
|
|
4
4
|
"title": "Mermaid diagram emission (file-level)",
|
|
5
|
-
"description": "Builds the per-requirement mermaid subdiagrams (REQ -> US -> AC -> FBS, and Code Node cross-links) that rcf view renders.",
|
|
5
|
+
"description": "Builds the per-requirement mermaid subdiagrams (REQ -> US -> AC -> FBS, and Code Node cross-links) that rcf audit view renders.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-201-1",
|
|
8
8
|
"AC-201-2",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-019",
|
|
3
3
|
"path": "src/cli/read.js",
|
|
4
|
-
"title": "rcf read subcommand (file-level)",
|
|
4
|
+
"title": "rcf define read subcommand (file-level)",
|
|
5
5
|
"description": "Prints a document body or a single dot-path field by id, including inline AC / TC resolution.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-301-1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-020",
|
|
3
3
|
"path": "src/cli/create.js",
|
|
4
|
-
"title": "rcf create subcommand (file-level)",
|
|
4
|
+
"title": "rcf define create subcommand (file-level)",
|
|
5
5
|
"description": "CLI parsing, per-kind mandatory-field checks and defaults for the create verb; delegates persistence to the writer.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-302-1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-021",
|
|
3
3
|
"path": "src/cli/update.js",
|
|
4
|
-
"title": "rcf update subcommand (file-level)",
|
|
4
|
+
"title": "rcf define update subcommand (file-level)",
|
|
5
5
|
"description": "Parses --set dot-path lists and --from-file patches into a writer update call; refuses to touch immutable fields.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-303-1",
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"cnId": "CN-022",
|
|
3
3
|
"path": "src/cli/delete.js",
|
|
4
|
-
"title": "rcf delete subcommand (file-level)",
|
|
4
|
+
"title": "rcf define delete subcommand (file-level)",
|
|
5
5
|
"description": "Refuses a delete by default when the target has dependents; --cascade opts in and drops backrefs; --dry-run plans without executing.",
|
|
6
6
|
"implementsAcIds": [
|
|
7
7
|
"AC-304-1",
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
"createdAt": "2026-07-20T18:03:32.280Z",
|
|
11
11
|
"updatedAt": "2026-07-28T16:39:55.660Z",
|
|
12
12
|
"title": "Self-review scoped as an in-loop check, not the gate",
|
|
13
|
-
"description": "Playbook s16 scopes the review as an in-loop check subordinate to the rcf finalise gate, guidance not a subsystem, not the independent gate (AC-805-4)."
|
|
13
|
+
"description": "Playbook s16 scopes the review as an in-loop check subordinate to the rcf build finalise gate, guidance not a subsystem, not the independent gate (AC-805-4)."
|
|
14
14
|
}
|
|
@@ -10,5 +10,5 @@
|
|
|
10
10
|
"createdAt": "2026-08-11T00:00:00Z",
|
|
11
11
|
"updatedAt": "2026-08-11T00:00:00Z",
|
|
12
12
|
"title": "Unified `rcf` bin: verify subcommand dispatch",
|
|
13
|
-
"description": "The umbrella CLI entry point. Imports the alias bin's `main` and registers it as the `verify` entry on the top-level SUBCOMMANDS map so `rcf verify <verb>` dispatches through the same handlers as `rcf
|
|
13
|
+
"description": "The umbrella CLI entry point. Imports the alias bin's `main` and registers it as the `verify` entry on the top-level SUBCOMMANDS map so `rcf verify <verb>` dispatches through the same handlers as `rcf verify <verb>`."
|
|
14
14
|
}
|