rcf-lite 0.18.0 → 0.20.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.
Files changed (142) hide show
  1. package/CHANGELOG.md +53 -0
  2. package/bin/rcf.js +5 -0
  3. package/blueprints/application-api-rest/blueprint.json +12 -4
  4. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +3 -3
  5. package/blueprints/application-api-rest/docs/topics.md +4 -2
  6. package/blueprints/application-error-handling/README.md +42 -0
  7. package/blueprints/application-error-handling/assets/schemas/error-record.schema.json +17 -0
  8. package/blueprints/application-error-handling/blueprint.json +27 -0
  9. package/blueprints/application-error-handling/contributions/adrs/adr-1701-application-error-handling-record-shape.json +25 -0
  10. package/blueprints/application-error-handling/contributions/adrs/adr-1702-application-error-handling-classification-vocabulary.json +20 -0
  11. package/blueprints/application-error-handling/contributions/adrs/adr-1703-application-error-handling-transport-mapping.json +20 -0
  12. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-001.json +15 -0
  13. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-002.json +15 -0
  14. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-003.json +15 -0
  15. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-004.json +15 -0
  16. package/blueprints/application-error-handling/contributions/tacs/tac-1701-application-error-handling-boundary.json +45 -0
  17. package/blueprints/application-error-handling/contributions/tacs/tac-1702-application-error-handling-record-factory.json +40 -0
  18. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16101.json +25 -0
  19. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16102.json +25 -0
  20. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16103.json +34 -0
  21. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16104.json +25 -0
  22. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16105.json +25 -0
  23. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16106.json +25 -0
  24. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16107.json +25 -0
  25. package/blueprints/application-error-handling/docs/topics.md +24 -0
  26. package/blueprints/application-error-handling/guide/application-error-handling.md +35 -0
  27. package/blueprints/application-spa/blueprint.json +12 -2
  28. package/blueprints/application-spa/docs/topics.md +2 -0
  29. package/blueprints/observability-logging/README.md +44 -0
  30. package/blueprints/observability-logging/assets/samples/log-line.json +13 -0
  31. package/blueprints/observability-logging/blueprint.json +27 -0
  32. package/blueprints/observability-logging/contributions/adrs/adr-1601-observability-logging-line-shape.json +25 -0
  33. package/blueprints/observability-logging/contributions/adrs/adr-1602-observability-logging-correlation-id-header.json +25 -0
  34. package/blueprints/observability-logging/contributions/adrs/adr-1603-observability-logging-redaction-categories.json +25 -0
  35. package/blueprints/observability-logging/contributions/adrs/adr-1604-observability-logging-level-vocabulary.json +20 -0
  36. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-001.json +15 -0
  37. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-002.json +15 -0
  38. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-003.json +15 -0
  39. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-004.json +15 -0
  40. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-005.json +15 -0
  41. package/blueprints/observability-logging/contributions/tacs/tac-1601-observability-logging-logger-factory.json +46 -0
  42. package/blueprints/observability-logging/contributions/tacs/tac-1602-observability-logging-redaction-boundary.json +27 -0
  43. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15101.json +34 -0
  44. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15102.json +43 -0
  45. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15103.json +34 -0
  46. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15104.json +25 -0
  47. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15105.json +34 -0
  48. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15106.json +25 -0
  49. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15107.json +25 -0
  50. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15108.json +25 -0
  51. package/blueprints/observability-logging/docs/topics.md +21 -0
  52. package/blueprints/observability-logging/guide/observability-logging.md +36 -0
  53. package/fixtures/canary-manifest.json +6 -6
  54. package/guidance/harness-template.md +8 -0
  55. package/guidance/managed/agent-instructions-block.hash +1 -1
  56. package/guidance/managed/agent-instructions-block.md +8 -0
  57. package/package.json +2 -2
  58. package/rcf/code-nodes/cn-077.json +14 -0
  59. package/rcf/code-nodes/cn-078.json +15 -0
  60. package/rcf/code-nodes/cn-079.json +14 -0
  61. package/rcf/code-nodes/cn-080.json +15 -0
  62. package/rcf/code-nodes/cn-081.json +15 -0
  63. package/rcf/code-nodes/cn-082.json +15 -0
  64. package/rcf/code-nodes/cn-083.json +14 -0
  65. package/rcf/code-nodes/cn-084.json +15 -0
  66. package/rcf/code-nodes/cn-085.json +14 -0
  67. package/rcf/code-nodes/cn-086.json +16 -0
  68. package/rcf/code-nodes/cn-087.json +14 -0
  69. package/rcf/code-nodes/cn-088.json +14 -0
  70. package/rcf/code-nodes/cn-089.json +14 -0
  71. package/rcf/code-nodes/cn-090.json +14 -0
  72. package/rcf/code-nodes/cn-091.json +14 -0
  73. package/rcf/code-nodes/cn-092.json +15 -0
  74. package/rcf/code-nodes/cn-093.json +15 -0
  75. package/rcf/code-nodes/cn-094.json +14 -0
  76. package/rcf/code-nodes/cn-095.json +14 -0
  77. package/rcf/code-nodes/cn-096.json +14 -0
  78. package/rcf/code-nodes/cn-097.json +14 -0
  79. package/rcf/code-nodes/cn-098.json +13 -0
  80. package/rcf/code-nodes/cn-099.json +13 -0
  81. package/rcf/code-nodes/cn-100.json +13 -0
  82. package/rcf/code-nodes/cn-101.json +13 -0
  83. package/rcf/code-nodes/cn-102.json +13 -0
  84. package/rcf/code-nodes/cn-103.json +13 -0
  85. package/rcf/code-nodes/cn-104.json +13 -0
  86. package/rcf/code-nodes/cn-105.json +13 -0
  87. package/rcf/evals/eval-001.json +55 -0
  88. package/rcf/fbs/fbs-028.json +27 -0
  89. package/rcf/fbs/fbs-029.json +27 -0
  90. package/rcf/fbs/fbs-030.json +27 -0
  91. package/rcf/fbs/fbs-031.json +27 -0
  92. package/rcf/fbs/fbs-032.json +27 -0
  93. package/rcf/fbs/fbs-033.json +27 -0
  94. package/rcf/fbs/fbs-034.json +27 -0
  95. package/rcf/fbs/fbs-035.json +18 -0
  96. package/rcf/requirements/req-013.json +22 -0
  97. package/rcf/requirements/req-014.json +22 -0
  98. package/rcf/requirements/req-015.json +21 -0
  99. package/rcf/requirements/req-016.json +37 -0
  100. package/rcf/test-suites/ts-038.json +41 -0
  101. package/rcf/test-suites/ts-039.json +41 -0
  102. package/rcf/test-suites/ts-040.json +57 -0
  103. package/rcf/test-suites/ts-041.json +57 -0
  104. package/rcf/test-suites/ts-042.json +57 -0
  105. package/rcf/test-suites/ts-043.json +49 -0
  106. package/rcf/test-suites/ts-044.json +41 -0
  107. package/rcf/test-suites/ts-045.json +46 -0
  108. package/rcf/user-stories/us-1301.json +43 -0
  109. package/rcf/user-stories/us-1302.json +43 -0
  110. package/rcf/user-stories/us-1401.json +43 -0
  111. package/rcf/user-stories/us-1402.json +43 -0
  112. package/rcf/user-stories/us-1403.json +43 -0
  113. package/rcf/user-stories/us-1404.json +43 -0
  114. package/rcf/user-stories/us-1501.json +43 -0
  115. package/rcf/user-stories/us-1601.json +37 -0
  116. package/releases/releases.yaml +20 -1
  117. package/src/blueprint/apply.js +8 -0
  118. package/src/blueprint/companions.js +485 -0
  119. package/src/blueprint/index.js +16 -0
  120. package/src/blueprint/loader.js +243 -1
  121. package/src/cli/blueprint.js +309 -0
  122. package/src/cli/create.js +14 -0
  123. package/src/cli/eval-coverage.js +221 -0
  124. package/src/cli/eval.js +43 -0
  125. package/src/cli/finalise.js +64 -0
  126. package/src/cli/help.js +4 -0
  127. package/src/cli/validate.js +7 -0
  128. package/src/core/store/ids.js +5 -1
  129. package/src/core/store/init.js +4 -0
  130. package/src/core/store/loader.js +4 -0
  131. package/src/core/store/validator.js +8 -1
  132. package/src/core/store/walker.js +71 -2
  133. package/src/core/store/writer.js +4 -0
  134. package/src/eval/judge.js +338 -0
  135. package/src/finalise/index.js +8 -0
  136. package/src/finalise/ingest.js +27 -0
  137. package/src/finalise/ship-without-eval.js +123 -0
  138. package/src/query/eval-coverage.js +162 -0
  139. package/src/verify/chain/index.js +67 -0
  140. package/src/verify/cli/run.js +15 -0
  141. package/src/verify/engine/index.js +10 -0
  142. package/src/verify/verdict/index.js +46 -0
@@ -0,0 +1,43 @@
1
+ {
2
+ "usId": "US-1403",
3
+ "prdId": "PRD-001",
4
+ "reqId": "REQ-014",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "title": "`rcf define blueprint companions` verb: three sub-verbs (print resolution, set pin, unset pin) with --json on all three",
8
+ "asA": "operator inspecting or pinning companion suggestions on an applied service blueprint outside the apply flow",
9
+ "iWant": "a `rcf define blueprint companions <slug>` sub-verb that prints the resolved companion set for one applied service blueprint, `rcf define blueprint companions set <role> <slug>` that writes a project-level pin to rcf/companions.json, and `rcf define blueprint companions unset <role>` that removes a pin",
10
+ "soThat": "I can read the current resolution without re-applying, pin a decision the operator makes outside the apply, and lift a pin cleanly",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-1403-1",
14
+ "description": "`rcf define blueprint companions <slug>` (three positionals: `blueprint`, `companions`, `<slug>`) with `<slug>` naming an applied service blueprint that declares `suggestedCompanions[]` prints on stdout: header `<slug> suggests companions:` and one line per role in the shape ` <role> -> <resolved-provider> (<origin-note>)`, where the origin note reads `already applied` / `pinned via rcf/companions.json` / `registered library '<prefix>' (overrides shelf provider <shelf-slug>)` / `shelf fallback (no registered library provides this role)`. Exit 0. Refuses with exit 2 when `<slug>` names no applied blueprint or the applied blueprint declares no `suggestedCompanions[]`.",
15
+ "given": "a fixture project with application-api-rest v2.1.0 applied and observability-logging applied",
16
+ "when": "the operator runs `rcf define blueprint companions application-api-rest`",
17
+ "then": "stdout carries the header and one line per role with `already applied` on `logging` and `shelf fallback` (or similar) on `errorHandling`; a slug that is not applied refuses exit 2",
18
+ "testable": true,
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "AC-1403-2",
23
+ "description": "`rcf define blueprint companions set <role> <slug>` writes `rcf/companions.json` under `roles.<role>.provider` with `pinnedAt` ISO-8601 (or updates it if present); refuses exit 2 when `<slug>` names no blueprint or the named blueprint does not declare `providesRoles` containing `<role>`. `rcf define blueprint companions unset <role>` removes the `roles.<role>` entry (leaves the rest of the file intact); refuses exit 2 when no pin exists for `<role>`. Both sub-verbs honour `--json` (emit `{ok: true, role, provider, pinnedAt}` on success; `{ok: false, error: {...}}` on refusal).",
24
+ "given": "a fixture project with no existing pin",
25
+ "when": "the operator runs `rcf define blueprint companions set logging observability-logging`, then `rcf define blueprint companions unset logging`",
26
+ "then": "the first run writes companions.json with the pin (exit 0); the second run removes the pin and prints `[blueprint] companion pin for role 'logging' removed` on stdout (exit 0); an unset on a role without a pin refuses exit 2",
27
+ "testable": true,
28
+ "scope": "library"
29
+ },
30
+ {
31
+ "id": "AC-1403-3",
32
+ "description": "`--json` on `rcf define blueprint companions <slug>` emits a machine-readable object: `{slug, suggestions: [{role, provider, origin, notes}]}`, exit 0. The suggestions array preserves the order of the applied blueprint's `suggestedCompanions[]`.",
33
+ "given": "a fixture project with application-api-rest applied and both companions applied",
34
+ "when": "the operator runs `rcf define blueprint companions application-api-rest --json`",
35
+ "then": "stdout carries a JSON object of the shape above and jq queries against it return the resolved provider per role",
36
+ "testable": true,
37
+ "scope": "library"
38
+ }
39
+ ],
40
+ "tacIds": [],
41
+ "createdAt": "2026-09-04T12:20:00Z",
42
+ "updatedAt": "2026-09-04T12:20:00Z"
43
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "usId": "US-1404",
3
+ "prdId": "PRD-001",
4
+ "reqId": "REQ-014",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "title": "Resolution rule prefers applied > registered library > core shelf; two libraries on one role refuse exit 3; validate refuses an unresolvable pin exit 3",
8
+ "asA": "operator resolving a companion suggestion on a project with a registered library that provides the same role as the shelf",
9
+ "iWant": "the deterministic tier ladder (applied provider wins, single library candidate wins over shelf, two library candidates refuse with the explicit three-path resolution message, shelf provider is the terminal fallback) and validate to refuse a pin that names no known provider",
10
+ "soThat": "the operator's opt-in to a library is honoured over the shelf, ambiguity refuses with the explicit remedy paths rather than picking silently, and a stale pin cannot silently drift after a library is removed",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-1404-1",
14
+ "description": "For each role suggested by an applied service blueprint, the resolver walks the tier ladder in order: (1) any applied blueprint whose `providesRoles[]` contains the role wins immediately with origin `already applied`; (2) otherwise, any registered library blueprint (from `rcf/blueprint-libraries.json` + each library's `library.json:blueprints[]`) whose source `providesRoles[]` contains the role wins with origin `registered library '<prefix>'`; (3) otherwise, the single core-shelf blueprint whose `providesRoles[]` contains the role wins with origin `shelf fallback`; (4) otherwise the role is unresolved (origin `unresolved`, provider null). A pin in `rcf/companions.json` overrides steps (2) and (3) with origin `pinned via rcf/companions.json` when the pin names a known provider.",
15
+ "given": "three fixture projects: (a) core-only; (b) one registered library providing logging + the core provider; (c) an already-applied library-side logging provider",
16
+ "when": "the resolver runs on the same suggestedCompanions[] from application-api-rest",
17
+ "then": "(a) resolves logging to observability-logging with `shelf fallback`; (b) resolves logging to the library provider with `registered library '<prefix>'`; (c) resolves logging to the applied library provider with `already applied`",
18
+ "testable": true,
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "AC-1404-2",
23
+ "description": "When two or more registered libraries each carry a `providesRoles[]` containing the same role and no explicit selector or pin is set, the resolver refuses with exit 3 and prints (on `rcf define blueprint add` and on `rcf define blueprint companions <slug>`, both) a message naming the ambiguous role, both library-qualified slugs, and three resolution paths verbatim per spec section 2.4: (1) `rcf define blueprint add <service-slug> --companion <role>=<lib>:<slug>` at apply; (2) `rcf define blueprint companions set <role> <lib>:<slug>` to pin at project level; (3) `rcf define blueprint library remove <prefix>` to remove one library.",
24
+ "given": "a fixture project with two registered libraries both providing role `logging`, no pin",
25
+ "when": "the operator runs `rcf define blueprint add <path>/application-api-rest`",
26
+ "then": "the exit code is 3 and stderr carries the refusal message with both library slugs and the three resolution paths verbatim",
27
+ "testable": true,
28
+ "scope": "library"
29
+ },
30
+ {
31
+ "id": "AC-1404-3",
32
+ "description": "`rcf define validate` refuses exit 3 when `rcf/companions.json` pins a role to a slug that no applied blueprint, no registered library and no shelf blueprint provides; message shape `rcf/companions.json pins role '<role>' to '<slug>' but no such provider is applied, registered or on the shelf.`. The check runs on every validate pass alongside the existing schema and referential-integrity checks; a missing `rcf/companions.json` file is not itself a validation error.",
33
+ "given": "a fixture project whose companions.json pins `logging` to `nope:nope`",
34
+ "when": "the operator runs `rcf define validate`",
35
+ "then": "the exit code is 3 and stderr carries the unresolvable-pin refusal message with the exact quoted role and slug",
36
+ "testable": true,
37
+ "scope": "library"
38
+ }
39
+ ],
40
+ "tacIds": [],
41
+ "createdAt": "2026-09-04T12:20:00Z",
42
+ "updatedAt": "2026-09-04T12:20:00Z"
43
+ }
@@ -0,0 +1,43 @@
1
+ {
2
+ "usId": "US-1501",
3
+ "prdId": "PRD-001",
4
+ "reqId": "REQ-015",
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "title": "Loader accepts standardsTrace[], recommendedDefault, elicited and standardsTraceClause; refuses a declared standardsTrace missing a clause reference on any ADR contribution",
8
+ "asA": "library author writing a standards-derived blueprint (e.g. wsd-logging composing on WSD-001)",
9
+ "iWant": "the loader to accept a blueprint-level standardsTrace[] and per-ADR-contribution recommendedDefault, elicited and standardsTraceClause fields, and refuse the load when standardsTrace[] is declared but any ADR contribution has no standardsTraceClause",
10
+ "soThat": "the standards-derived discipline is machine-checkable at load time and a mis-authored library blueprint fails fast, before an apply lands into the tree",
11
+ "acceptanceCriteria": [
12
+ {
13
+ "id": "AC-1501-1",
14
+ "description": "The loader accepts optional top-level `standardsTrace[]` (array of `{id: string, version: string}` objects; `id` is a non-empty string; `version` is a non-empty string), optional ADR-contribution fields `recommendedDefault: true|false`, `elicited: true|false` and `standardsTraceClause: string`. `recommendedDefault` and `elicited` are mutually independent (a SHOULD may be elicited; a MAY need not have a recommended default). The loader does NOT cross-check clause severity against kind (no refusal for a MUST clause mapped to an ADR; the discipline is prose in section 8a, not code, per amendment A2 Baz 2026-09-04T12:20:31Z).",
15
+ "given": "a blueprint fixture declaring standardsTrace with WSD-001 v2026-05, and one ADR contribution with recommendedDefault: true, elicited: false and standardsTraceClause: 'WSD-001 clause 3.1'",
16
+ "when": "the loader parses the file",
17
+ "then": "the LoadedBlueprint object carries the fields verbatim and returns no rcfError",
18
+ "testable": true,
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "AC-1501-2",
23
+ "description": "The loader refuses (rcfError kind `validation`) when `standardsTrace[]` is set but any ADR contribution has no `standardsTraceClause` (or has it set to an empty or whitespace-only string). Refusal message shape: `blueprint '<slug>' declares standardsTrace but ADR contribution '<id>' has no standardsTraceClause; every ADR must reference a standard clause or the sentinel 'generic enterprise practice'.`. At the CLI edge the exit code is 2.",
24
+ "given": "a fixture blueprint with standardsTrace declared and one ADR contribution missing standardsTraceClause",
25
+ "when": "the loader parses the file",
26
+ "then": "the loader returns an rcfError of kind `validation` with the exact refusal message shape",
27
+ "testable": true,
28
+ "scope": "library"
29
+ },
30
+ {
31
+ "id": "AC-1501-3",
32
+ "description": "A blueprint that DOES NOT declare `standardsTrace[]` (every core shelf blueprint today, including the two new core-companion blueprints in REQ-013) loads clean regardless of whether ADR contributions carry `standardsTraceClause` (the discipline lands only when standardsTrace[] is present). The sentinel string `\"generic enterprise practice\"` is accepted as a standardsTraceClause value; the discipline documented in section 8a of blueprint-authoring.md names it explicitly.",
33
+ "given": "the two new core companion blueprints (observability-logging, application-error-handling) with no standardsTrace declared, and a fixture that declares standardsTrace and uses 'generic enterprise practice' on every ADR",
34
+ "when": "the loader parses each",
35
+ "then": "the core blueprints load clean; the fixture with the sentinel on every ADR loads clean",
36
+ "testable": true,
37
+ "scope": "library"
38
+ }
39
+ ],
40
+ "tacIds": [],
41
+ "createdAt": "2026-09-04T12:20:00Z",
42
+ "updatedAt": "2026-09-04T12:20:00Z"
43
+ }
@@ -0,0 +1,37 @@
1
+ {
2
+ "createdAt": "2026-09-04T16:21:28.205Z",
3
+ "updatedAt": "2026-09-04T16:22:01.527Z",
4
+ "description": "As a project owner shipping non-deterministic behaviour, I want rcf-lite to speak the eval-node surface at every stage of the build cycle so that a non-deterministic AC is graded, audited, verdict-annotated and merge-gated without me holding four disconnected mental models. The surface is one train: audit reports coverage, verify annotates per-AC verdicts, finalise refuses on missing / failing evals with an opt-out, and define authors the determinism flag.",
5
+ "usId": "US-1601",
6
+ "prdId": "PRD-001",
7
+ "reqId": "REQ-016",
8
+ "version": "0.1.0",
9
+ "status": "draft",
10
+ "title": "The four-track eval-node surface (audit / verdict / finalise / define) reads a single spec across four independent consumers",
11
+ "asA": "project owner shipping non-deterministic behaviour on an rcf-lite project",
12
+ "iWant": "rcf-lite to speak the eval-node surface at every stage of the build cycle",
13
+ "soThat": "a non-deterministic AC is graded, audited, verdict-annotated and merge-gated without me holding four disconnected mental models",
14
+ "acceptanceCriteria": [
15
+ {
16
+ "id": "AC-1601-1",
17
+ "description": "`rcf audit eval coverage --strict` exits 0 on a chain with zero nonDeterministic ACs and exits 4 on any nonDeterministic AC without a resolving EVAL (a non-superseded EVAL whose most recent runRecord entry is not pending). Non-strict runs always exit 0; the mermaid format colours the AC glyph green (deterministic), amber (covered) or red (missing).",
18
+ "testable": true
19
+ },
20
+ {
21
+ "id": "AC-1601-2",
22
+ "description": "The verify verdict layer emits EVAL-MISSING on any nonDeterministic AC without a resolving EVAL and EVAL-BELOW-THRESHOLD on any nonDeterministic AC whose bound EVAL last ran with verdict fail. Deterministic ACs never emit either verdict. Both entries ride report.perAcVerdicts[] without expanding the top-level VERDICTS set (backward compatibility on validateReportShape). runStats.evalCoverage rolls up the counts and the CLI prints the preflight line on stderr.",
23
+ "testable": true
24
+ },
25
+ {
26
+ "id": "AC-1601-3",
27
+ "description": "rcf finalise refuses (exit 4) with the spec-verbatim message when the verify report carries EVAL-MISSING or EVAL-BELOW-THRESHOLD, and accepts --ship-without-eval <reason> (mandatory reason string; exit 2 without one, refused when the value looks like a flag). The acknowledgement lands on the manifest under shipWithoutEval[] with a monotonic id, the reason, the declared per-AC verdicts and the report path.",
28
+ "testable": true
29
+ },
30
+ {
31
+ "id": "AC-1601-4",
32
+ "description": "The LLM-as-judge run path spawns claude (or codex) on PATH, passes the per-case payload on stdin, captures stdout, validates against the declared response schema and composes a runRecord[] entry (aggregateScore, criticalFailures, verdict). No API keys or HTTP APIs enter rcf-lite; the estate subscription-only rule holds. The grader's aggregate verdict is a non-deterministic judgement over graded output, which is the correct home for an EVAL contract on the dogfood tree.",
33
+ "testable": true,
34
+ "determinism": "nonDeterministic"
35
+ }
36
+ ]
37
+ }
@@ -40,8 +40,27 @@
40
40
  # `npm install rcf-lite`.
41
41
 
42
42
  feedVersion: 1
43
- latest: "0.18.0"
43
+ latest: "0.20.0"
44
44
  releases:
45
+ - version: "0.20.0"
46
+ date: "2026-09-04"
47
+ breaking: true
48
+ headlines:
49
+ - "rcf-lite 0.20.0 adds an optional evaluation step to the chain for the acceptance criteria whose outcome cannot be checked deterministically. You mark such a criterion when you define it, attach an evaluation with its own pass threshold, and the audit, verify and finalise steps refuse to ship while it is missing, with an explicit opt-out that records its reason."
50
+ - "The schema floor moves to rcf-schemas 0.6.0."
51
+ minAgentAction: "rerun-init"
52
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
53
+
54
+ - version: "0.19.0"
55
+ date: "2026-09-04"
56
+ breaking: false
57
+ headlines:
58
+ - "The rcf-lite core shelf gains two new blueprints, observability-logging and application-error-handling, that carry the widely followed rules for structured logging and internal error handling so a service can compose them alongside its own blueprint."
59
+ - "Service blueprints can now name the roles they want alongside them and rcf define blueprint suggests the most specific provider for each at apply time, preferring an applied provider first, then a project-level pin, then a registered library, then the shipped shelf; the operator still applies each companion by hand."
60
+ - "The authoring standard grows a written discipline for blueprints that derive from an outside standard, so a must-clause that binds a testable behaviour becomes a test and a choice-shaped clause becomes a recommended default. Rerun rcf init to refresh the agent-instructions block."
61
+ minAgentAction: "rerun-init"
62
+ notesUrl: "https://stravica.ai/docs/rcf/changelog/"
63
+
45
64
  - version: "0.18.0"
46
65
  date: "2026-09-04"
47
66
  breaking: true
@@ -307,6 +307,14 @@ export async function applyBlueprint({ projectRoot, tree, source, displaySource,
307
307
  slug: appliedSlug,
308
308
  version: blueprint.version,
309
309
  contributions: writtenContributions,
310
+ // Companion-suggestion mechanism (spec 2.6). Bubble the source
311
+ // blueprint's `suggestedCompanions[]` up on the result so the CLI
312
+ // can render the resolved-suggestion block after a successful
313
+ // apply. Unresolved here (the CLI holds the tree + libraries to
314
+ // run the resolver); apply owns only the raw copy.
315
+ ...(Array.isArray(blueprint.suggestedCompanions) && blueprint.suggestedCompanions.length > 0
316
+ ? { suggestedCompanions: blueprint.suggestedCompanions }
317
+ : {}),
310
318
  ...(duplicateResolveTopics.length > 0 ? { warnings: [{ kind: 'duplicateResolveTopic', topics: duplicateResolveTopics }] } : {}),
311
319
  };
312
320
  }