rcf-lite 0.18.0 → 0.19.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 (108) hide show
  1. package/CHANGELOG.md +38 -0
  2. package/blueprints/application-api-rest/blueprint.json +12 -4
  3. package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +3 -3
  4. package/blueprints/application-api-rest/docs/topics.md +4 -2
  5. package/blueprints/application-error-handling/README.md +42 -0
  6. package/blueprints/application-error-handling/assets/schemas/error-record.schema.json +17 -0
  7. package/blueprints/application-error-handling/blueprint.json +27 -0
  8. package/blueprints/application-error-handling/contributions/adrs/adr-1701-application-error-handling-record-shape.json +25 -0
  9. package/blueprints/application-error-handling/contributions/adrs/adr-1702-application-error-handling-classification-vocabulary.json +20 -0
  10. package/blueprints/application-error-handling/contributions/adrs/adr-1703-application-error-handling-transport-mapping.json +20 -0
  11. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-001.json +15 -0
  12. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-002.json +15 -0
  13. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-003.json +15 -0
  14. package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-004.json +15 -0
  15. package/blueprints/application-error-handling/contributions/tacs/tac-1701-application-error-handling-boundary.json +45 -0
  16. package/blueprints/application-error-handling/contributions/tacs/tac-1702-application-error-handling-record-factory.json +40 -0
  17. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16101.json +25 -0
  18. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16102.json +25 -0
  19. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16103.json +34 -0
  20. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16104.json +25 -0
  21. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16105.json +25 -0
  22. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16106.json +25 -0
  23. package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16107.json +25 -0
  24. package/blueprints/application-error-handling/docs/topics.md +24 -0
  25. package/blueprints/application-error-handling/guide/application-error-handling.md +35 -0
  26. package/blueprints/application-spa/blueprint.json +12 -2
  27. package/blueprints/application-spa/docs/topics.md +2 -0
  28. package/blueprints/observability-logging/README.md +44 -0
  29. package/blueprints/observability-logging/assets/samples/log-line.json +13 -0
  30. package/blueprints/observability-logging/blueprint.json +27 -0
  31. package/blueprints/observability-logging/contributions/adrs/adr-1601-observability-logging-line-shape.json +25 -0
  32. package/blueprints/observability-logging/contributions/adrs/adr-1602-observability-logging-correlation-id-header.json +25 -0
  33. package/blueprints/observability-logging/contributions/adrs/adr-1603-observability-logging-redaction-categories.json +25 -0
  34. package/blueprints/observability-logging/contributions/adrs/adr-1604-observability-logging-level-vocabulary.json +20 -0
  35. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-001.json +15 -0
  36. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-002.json +15 -0
  37. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-003.json +15 -0
  38. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-004.json +15 -0
  39. package/blueprints/observability-logging/contributions/requirements/observability-logging-req-005.json +15 -0
  40. package/blueprints/observability-logging/contributions/tacs/tac-1601-observability-logging-logger-factory.json +46 -0
  41. package/blueprints/observability-logging/contributions/tacs/tac-1602-observability-logging-redaction-boundary.json +27 -0
  42. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15101.json +34 -0
  43. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15102.json +43 -0
  44. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15103.json +34 -0
  45. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15104.json +25 -0
  46. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15105.json +34 -0
  47. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15106.json +25 -0
  48. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15107.json +25 -0
  49. package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15108.json +25 -0
  50. package/blueprints/observability-logging/docs/topics.md +21 -0
  51. package/blueprints/observability-logging/guide/observability-logging.md +36 -0
  52. package/fixtures/canary-manifest.json +6 -6
  53. package/guidance/harness-template.md +8 -0
  54. package/guidance/managed/agent-instructions-block.hash +1 -1
  55. package/guidance/managed/agent-instructions-block.md +8 -0
  56. package/package.json +1 -1
  57. package/rcf/code-nodes/cn-077.json +14 -0
  58. package/rcf/code-nodes/cn-078.json +15 -0
  59. package/rcf/code-nodes/cn-079.json +14 -0
  60. package/rcf/code-nodes/cn-080.json +15 -0
  61. package/rcf/code-nodes/cn-081.json +15 -0
  62. package/rcf/code-nodes/cn-082.json +15 -0
  63. package/rcf/code-nodes/cn-083.json +14 -0
  64. package/rcf/code-nodes/cn-084.json +15 -0
  65. package/rcf/code-nodes/cn-085.json +14 -0
  66. package/rcf/code-nodes/cn-086.json +16 -0
  67. package/rcf/code-nodes/cn-087.json +14 -0
  68. package/rcf/code-nodes/cn-088.json +14 -0
  69. package/rcf/code-nodes/cn-089.json +14 -0
  70. package/rcf/code-nodes/cn-090.json +14 -0
  71. package/rcf/code-nodes/cn-091.json +14 -0
  72. package/rcf/code-nodes/cn-092.json +15 -0
  73. package/rcf/code-nodes/cn-093.json +15 -0
  74. package/rcf/code-nodes/cn-094.json +14 -0
  75. package/rcf/code-nodes/cn-095.json +14 -0
  76. package/rcf/code-nodes/cn-096.json +14 -0
  77. package/rcf/code-nodes/cn-097.json +14 -0
  78. package/rcf/fbs/fbs-028.json +27 -0
  79. package/rcf/fbs/fbs-029.json +27 -0
  80. package/rcf/fbs/fbs-030.json +27 -0
  81. package/rcf/fbs/fbs-031.json +27 -0
  82. package/rcf/fbs/fbs-032.json +27 -0
  83. package/rcf/fbs/fbs-033.json +27 -0
  84. package/rcf/fbs/fbs-034.json +27 -0
  85. package/rcf/requirements/req-013.json +22 -0
  86. package/rcf/requirements/req-014.json +22 -0
  87. package/rcf/requirements/req-015.json +21 -0
  88. package/rcf/test-suites/ts-038.json +41 -0
  89. package/rcf/test-suites/ts-039.json +41 -0
  90. package/rcf/test-suites/ts-040.json +57 -0
  91. package/rcf/test-suites/ts-041.json +57 -0
  92. package/rcf/test-suites/ts-042.json +57 -0
  93. package/rcf/test-suites/ts-043.json +49 -0
  94. package/rcf/test-suites/ts-044.json +41 -0
  95. package/rcf/user-stories/us-1301.json +43 -0
  96. package/rcf/user-stories/us-1302.json +43 -0
  97. package/rcf/user-stories/us-1401.json +43 -0
  98. package/rcf/user-stories/us-1402.json +43 -0
  99. package/rcf/user-stories/us-1403.json +43 -0
  100. package/rcf/user-stories/us-1404.json +43 -0
  101. package/rcf/user-stories/us-1501.json +43 -0
  102. package/releases/releases.yaml +11 -1
  103. package/src/blueprint/apply.js +8 -0
  104. package/src/blueprint/companions.js +485 -0
  105. package/src/blueprint/index.js +16 -0
  106. package/src/blueprint/loader.js +243 -1
  107. package/src/cli/blueprint.js +309 -0
  108. package/src/cli/validate.js +7 -0
@@ -0,0 +1,15 @@
1
+ {
2
+ "cnId": "CN-093",
3
+ "path": "src/blueprint/loader.js#preserveAdrDisciplineFields",
4
+ "title": "Loader preserves recommendedDefault, elicited and standardsTraceClause on ADR contributions so consumers read them off the LoadedBlueprint",
5
+ "description": "Anchored by the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022); see the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md for the full trace.",
6
+ "implementsAcIds": [
7
+ "AC-1501-1",
8
+ "AC-1501-3"
9
+ ],
10
+ "dependencies": [],
11
+ "version": "0.1.0",
12
+ "status": "draft",
13
+ "createdAt": "2026-09-04T12:20:00Z",
14
+ "updatedAt": "2026-09-04T12:20:00Z"
15
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-094",
3
+ "path": "../../blueprints/application-api-rest/blueprint.json",
4
+ "title": "application-api-rest 2.1.0 declares suggestedCompanions for logging + errorHandling; ADR-304 retained without scope:global (topic transferred to ADR-1601)",
5
+ "description": "Anchored by the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022); see the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md for the full trace.",
6
+ "implementsAcIds": [
7
+ "AC-1402-1"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-04T12:20:00Z",
13
+ "updatedAt": "2026-09-04T12:20:00Z"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-095",
3
+ "path": "../../blueprints/application-spa/blueprint.json",
4
+ "title": "application-spa 1.5.0 declares suggestedCompanions for logging + errorHandling to inform the browser-facing boundary",
5
+ "description": "Anchored by the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022); see the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md for the full trace.",
6
+ "implementsAcIds": [
7
+ "AC-1402-1"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-04T12:20:00Z",
13
+ "updatedAt": "2026-09-04T12:20:00Z"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-096",
3
+ "path": "src/blueprint/apply.js#applyBlueprint",
4
+ "title": "apply.js: ApplyResult carries suggestedCompanions from the source blueprint so the CLI can render the resolved suggestion block after a successful apply",
5
+ "description": "Anchored by the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022); see the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md for the full trace.",
6
+ "implementsAcIds": [
7
+ "AC-1402-1"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-04T12:20:00Z",
13
+ "updatedAt": "2026-09-04T12:20:00Z"
14
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "cnId": "CN-097",
3
+ "path": "src/blueprint/companions.js#unsetCompanionPin",
4
+ "title": "companions.js: unsetCompanionPin removes the roles.<role> entry, deletes the file when empty, refuses exit 2 when no pin exists for the role",
5
+ "description": "Anchored by the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022); see the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md for the full trace.",
6
+ "implementsAcIds": [
7
+ "AC-1403-2"
8
+ ],
9
+ "dependencies": [],
10
+ "version": "0.1.0",
11
+ "status": "draft",
12
+ "createdAt": "2026-09-04T12:20:00Z",
13
+ "updatedAt": "2026-09-04T12:20:00Z"
14
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-028",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 28,
6
+ "executionStatus": "verified",
7
+ "title": "observability-logging v1.0.0 shelf blueprint (contributions + README + guide + docs/topics.md + assets), applies clean into a fresh fixture",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1301-1",
11
+ "AC-1301-2",
12
+ "AC-1301-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-027"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-029",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 29,
6
+ "executionStatus": "verified",
7
+ "title": "application-error-handling v1.0.0 shelf blueprint (contributions + README + guide + docs/topics.md + assets); errorHandling topic distinct from errorEnvelope",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1302-1",
11
+ "AC-1302-2",
12
+ "AC-1302-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-028"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-030",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 30,
6
+ "executionStatus": "verified",
7
+ "title": "Loader accepts providesRoles[] and suggestedCompanions[] with shape validation + em-dash / emoji refusal on reason strings + paired-scope:global-ADR gate",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1401-1",
11
+ "AC-1401-2",
12
+ "AC-1401-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-029"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-031",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 31,
6
+ "executionStatus": "verified",
7
+ "title": "rcf define blueprint add prints resolved companion suggestions after apply; --companion selectors preflight-refuse non-providers; --no-companion-suggestions suppresses both phases; pins land in rcf/companions.json",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1402-1",
11
+ "AC-1402-2",
12
+ "AC-1402-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-030"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-032",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 32,
6
+ "executionStatus": "verified",
7
+ "title": "rcf define blueprint companions <slug>|set|unset sub-verbs (text output with origin annotations; --json envelope; set/unset round-trip; unset without pin refuses)",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1403-1",
11
+ "AC-1403-2",
12
+ "AC-1403-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-031"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-033",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 33,
6
+ "executionStatus": "verified",
7
+ "title": "Deterministic tier ladder resolver (applied > pinned > registered library > shelf); two-libraries-one-role refuses exit 3 with three-path resolution message on both add and companions verb; validate refuses unresolvable pin exit 3",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1404-1",
11
+ "AC-1404-2",
12
+ "AC-1404-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-032"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,27 @@
1
+ {
2
+ "fbsId": "FBS-034",
3
+ "prdId": "PRD-001",
4
+ "bsId": "BS-001",
5
+ "buildOrder": 34,
6
+ "executionStatus": "verified",
7
+ "title": "Loader accepts standardsTrace[] + per-ADR recommendedDefault / elicited / standardsTraceClause; refuses missing standardsTraceClause when standardsTrace is declared; no cross-check on clause severity to kind (amendment A2)",
8
+ "summary": "Core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). Covers the AC set above end to end through the shipped code paths named on the paired CN implementsAcIds[] and the paired TS testPointer entries under packages/rcf-lite/test/. Runtime provenance: Node 24.14.0 on the repo's dogfood tree; each fixture verified in scratchpad. See the spec at projects/rcf-lite-wsd/specs/rcf-lite-core-companions-spec-2026-09-04.md.",
9
+ "acIds": [
10
+ "AC-1501-1",
11
+ "AC-1501-2",
12
+ "AC-1501-3"
13
+ ],
14
+ "dependsOnFbsIds": [
15
+ "FBS-033"
16
+ ],
17
+ "contextRequirements": {
18
+ "tacIds": [],
19
+ "adrIds": []
20
+ },
21
+ "domain": "blueprints",
22
+ "estimatedSize": "small",
23
+ "riskLevel": "low",
24
+ "notes": "Part of the core companions train (w-2026-09-03-dave-030, d-2026-09-04-022). One FBS per US on REQ-013/014/015.",
25
+ "createdAt": "2026-09-04T12:20:00Z",
26
+ "updatedAt": "2026-09-04T12:20:00Z"
27
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "reqId": "REQ-013",
3
+ "prdId": "PRD-001",
4
+ "title": "Core shelf gains two general-enterprise-practice companion blueprints: observability-logging and application-error-handling",
5
+ "description": "The shipped core shelf carries two new blueprints written to general enterprise practice, not to any one organisation's standards. `observability-logging` v1.0.0 (category `observability`, US band 15101-15899, ADR/TAC suffix block 16xx) contributes REQs, USs, TACs and ADRs for a structured single-line JSON emission surface with a correlation-identifier propagation contract, a redaction boundary anchored to named PII categories, an operator-elicited level vocabulary, and an environment/service-name/service-version stamping contract. Its `providesRoles` field carries `[\"logging\"]` and its ADR-1601 mints the shelf-wide `logging` global topic (transferred from `application-api-rest-ADR-304`, retained there as a superseded record per version-rule discipline). `application-error-handling` v1.0.0 (category `application`, US band 16101-16899, ADR/TAC suffix block 17xx) contributes REQs, USs, TACs and ADRs for the uncaught-exception boundary, the internal error record shape (code, category, message, correlation identifier, cause chain, redacted context), a transient/permanent/unknown classification vocabulary, and error emission delegated through the logging companion. Its `providesRoles` carries `[\"errorHandling\"]` and its ADR-1701 mints the `errorHandling` global topic (distinct from `errorEnvelope`, which stays with `application-api-rest` as the REST wire shape). Both blueprints ship the same anatomy every shipped shelf blueprint teaches: `blueprint.json` + `contributions/` + `README.md` + `guide/<slug>.md` + `docs/topics.md` + `assets/`; every AC is runtime-observable through a stdout capture, a filesystem-write observer, or a stubbed transport.",
6
+ "category": "functional",
7
+ "domain": "blueprints",
8
+ "priority": "must",
9
+ "rationale": "The core shelf carried no logging or error-handling blueprint before this train; every WSD-facing service blueprint (Dex's `wsd-api-rest`) stated its companion suggestions in prose only, with no core fallback for projects that had not registered the WSD library. Baz on 2026-09-03 during the WSD blueprint round review ratified two decisions in one clause: the core shelf carries a `logging` and an `error-handling` blueprint written to general enterprise practice (not to any one organisation's standards), and a companion-suggestion mechanism (REQ-014) surfaces them at apply time. Shipping the two blueprints as general-enterprise-practice siblings of the WSD library halves means every project falls back to a sensible logging and error-handling contract without adopting a library, and the WSD library becomes a specialisation (adds `standardsTrace[]`, adds WSD-specific ADR clauses) that the mechanism resolves in preference to the core when the library is registered.",
10
+ "tags": [
11
+ "blueprints",
12
+ "observability",
13
+ "logging",
14
+ "error-handling",
15
+ "companions",
16
+ "shelf"
17
+ ],
18
+ "version": "0.1.0",
19
+ "status": "draft",
20
+ "createdAt": "2026-09-04T12:20:00Z",
21
+ "updatedAt": "2026-09-04T12:20:00Z"
22
+ }
@@ -0,0 +1,22 @@
1
+ {
2
+ "reqId": "REQ-014",
3
+ "prdId": "PRD-001",
4
+ "title": "Companion-suggestion mechanism: additive manifest fields, deterministic resolution rule, `rcf define blueprint companions` verb, refusal shapes, project-level pin file, agent-facing paragraph",
5
+ "description": "The blueprint mechanism gains a suggestion channel that a service blueprint uses to name the companion roles it recommends alongside itself, and the loader resolves each role deterministically. Two additive optional top-level fields land on `blueprint.json`: `providesRoles[]` names the roles a blueprint provides (lower camelCase strings on `^[a-z][a-zA-Z0-9]*$`); a blueprint declaring a role MUST also carry the paired `scope: global` ADR on the topic string the role names (a `logging` role carries a `scope: global, topic: logging` ADR; a `errorHandling` role carries `scope: global, topic: errorHandling`). `suggestedCompanions[]` is a non-empty array of `{role, reason}` objects the service blueprint recommends. The resolution rule walks a deterministic tier ladder for each suggested role: applied provider wins first (already resolved at apply time), then registered library provider (`rcf/blueprint-libraries.json`), then core-shelf provider. A single library candidate wins over the shelf candidate; two library candidates for one role refuses at apply and at `rcf define blueprint companions` with exit 3 and a three-path resolution message (explicit `--companion` selector, project-level pin, or removing one library). A `--companion <role>=<slug>` selector on `rcf define blueprint add` accepts `<libraryPrefix>:<slug>` or a bare shelf slug and writes the choice to `rcf/companions.json`; naming a slug that does not declare the role refuses exit 2. A project-level `rcf/companions.json` (schemaVersion 1, current pin only per amendment A1, no per-apply history, no severity field) records role-to-provider pinnings; `rcf define blueprint companions set|unset` writes and removes pins; the file rides git. `rcf define validate` refuses exit 3 when a pinned role names an unresolvable provider. The apply-time suggestion block prints after `rcf define blueprint add` succeeds and is suppressible with `--no-companion-suggestions`. The three surfaces (apply-time block, `rcf define blueprint companions <slug>` verb, `rcf define blueprint list` annotation for suggested-but-not-applied companions) render the same resolution through a single loader function. A paragraph on the managed agent-instructions block's `How to talk to your operator` section (regenerated via `scripts/gen-managed-artefacts.mjs`) tells the agent to surface resolved companions verbally without picking. The mechanism is suggestion, never compulsion: a blueprint that declares `suggestedCompanions: [\"logging\"]` still applies cleanly with no logging blueprint present. Backward-compatible: a blueprint that does not declare `suggestedCompanions[]` produces an empty resolution and prints no block.",
6
+ "category": "functional",
7
+ "domain": "blueprints",
8
+ "priority": "must",
9
+ "rationale": "Before this train, service blueprints named their companion suggestions in prose in each README and each guide, and the machine could not act on them: `rcf define blueprint add` could not print a suggestion, `rcf define blueprint list` could not annotate an outstanding one, the agent could not know which library provider to prefer, and the operator had no place to record a project-level choice that outlived any single apply. Baz on 2026-09-03 during the WSD blueprint round review ratified the mechanism in the same clause as the two new core blueprints: the mechanism surfaces the suggestion three ways from one resolution rule, the agent surfaces the resolved companions verbally, and the operator adopts explicitly. Suggestion by role (not by slug) is the load-bearing choice: a service blueprint ships once and works with every library that provides the role; the operator's opt-in to a library IS the choice the resolution rule records.",
10
+ "tags": [
11
+ "blueprints",
12
+ "companions",
13
+ "provides-roles",
14
+ "suggested-companions",
15
+ "resolution",
16
+ "pin"
17
+ ],
18
+ "version": "0.1.0",
19
+ "status": "draft",
20
+ "createdAt": "2026-09-04T12:20:00Z",
21
+ "updatedAt": "2026-09-04T12:20:00Z"
22
+ }
@@ -0,0 +1,21 @@
1
+ {
2
+ "reqId": "REQ-015",
3
+ "prdId": "PRD-001",
4
+ "title": "Standards-derived-blueprint discipline: authoring standard section 8a, additive contribution fields, load-time validation",
5
+ "description": "The blueprint-authoring standard gains a section 8a that names the standards-derived discipline for any blueprint that composes on an organisational or industry standard: MUST clauses become ACs where the clause binds a testable runtime or artefact behaviour; a MUST that binds an operator choice (choice-shaped) may land as a `recommendedDefault: true` ADR carrying the clause id on `standardsTraceClause`; not-carried rows stay allowed with a named reason (per amendment A2, Baz 2026-09-04T12:20:31Z). SHOULD clauses become recommended ADR defaults (`recommendedDefault: true`) with the elicited-parameter alternative documented in the ADR's consequences. MAY clauses become elicited ADR choices (`elicited: true`) that the applying operator supplies at apply. Three additive optional ADR-contribution fields on `blueprint.json`: `recommendedDefault: true` marks the ADR as a SHOULD (or a choice-shaped MUST); `elicited: true` marks the ADR as taking an operator-supplied value at apply; `standardsTraceClause` records the standard clause identifier verbatim (`WSD-001 clause 3.1`, `RFC 7807 section 3.1`) or the sentinel `\"generic enterprise practice\"` for the neutral shelf blueprints. `recommendedDefault` and `elicited` are mutually independent. One additive blueprint-level field: `standardsTrace[]` is a list of `{id, version}` objects naming the standards the blueprint composes; optional; a blueprint that ships without it is a general-enterprise-practice blueprint by default. Load-time validation: if `standardsTrace[]` is set, every ADR contribution MUST carry a non-null `standardsTraceClause` (refusal 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'.`); no cross-check on clause severity to kind mapping (that discipline is prose, not code). The discipline lands the moment a blueprint declares `standardsTrace[]`; zero shelf blueprints declare it today (the two new core blueprints in REQ-013 are general enterprise practice). Dex's WSD library at 0.9.1 already ships standards-trace tables that this discipline formalises.",
6
+ "category": "functional",
7
+ "domain": "blueprints",
8
+ "priority": "must",
9
+ "rationale": "Dex's WSD library composes on the WSD-001 through WSD-012 standards with clause-level trace tables under `docs/standards-trace.md`. Before this train, the trace lived in prose only, and a library blueprint's ADR could omit any standard reference without the loader noticing. Baz on 2026-09-03 during the WSD blueprint round review ratified the discipline as `really good idea` and made it the shelf standard for any future library or shipped blueprint that composes on named standards. Baz amendment A2 (2026-09-04T12:20:31Z) refined the MUST-to-kind mapping to admit choice-shaped MUSTs as ADRs so the WSD library's 41 MUSTs (27 to AC, 8 to ADR, 8 not-carried per Dex's tables) fit under the discipline without renumbering. The additive fields and load-time validation give machine-checkable adherence without changing any existing blueprint (zero shelf blueprints declare `standardsTrace[]` today).",
10
+ "tags": [
11
+ "blueprints",
12
+ "authoring",
13
+ "standards",
14
+ "traceability",
15
+ "loader"
16
+ ],
17
+ "version": "0.1.0",
18
+ "status": "draft",
19
+ "createdAt": "2026-09-04T12:20:00Z",
20
+ "updatedAt": "2026-09-04T12:20:00Z"
21
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "id": "TS-038",
3
+ "usId": "US-1301",
4
+ "title": "observability-logging v1.0.0 ships on the core shelf with the ratified anatomy and applies clean",
5
+ "purpose": "Cover the three ACs on US-1301: shipped anatomy (blueprint.json + contributions + README + guide + docs/topics.md + assets), clean apply into a fresh fixture, and shelf-canonical logging global topic on ADR-1601 with providesRoles logging.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1301-1",
9
+ "AC-1301-2",
10
+ "AC-1301-3"
11
+ ],
12
+ "testCases": [
13
+ {
14
+ "id": "TC-038-blueprint-json-fields",
15
+ "acId": "AC-1301-1",
16
+ "description": "blueprints/observability-logging/blueprint.json declares slug, version 1.0.0, category observability, providesRoles [\"logging\"], and includes contributions for REQ-001..005, US-15101..15108, TAC-1601, TAC-1602 and ADR-1601..1604 with ADR-1601 carrying scope global and topic logging.",
17
+ "testPointer": "test/blueprint/observability-logging-anatomy.test.js::observability-logging: blueprint.json declares the ratified shape (TC-038-blueprint-json-fields)",
18
+ "status": "pending",
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "TC-038-clean-apply",
23
+ "acId": "AC-1301-2",
24
+ "description": "rcf define blueprint add against a fresh fixture applies observability-logging cleanly (exit 0), records manifest.blueprints[] with slug observability-logging at 1.0.0, and writes rcf/adr/adr-1601-observability-logging-line-shape.json.",
25
+ "testPointer": "test/blueprint/observability-logging-anatomy.test.js::observability-logging: apply into a fresh fixture succeeds and writes the namespaced contributions (TC-038-clean-apply)",
26
+ "status": "pending",
27
+ "scope": "library"
28
+ },
29
+ {
30
+ "id": "TC-038-anatomy-and-topics",
31
+ "acId": "AC-1301-3",
32
+ "description": "The blueprint anatomy is complete: README.md carries the Apply block and Known mechanism-reach gaps section; docs/topics.md names the logging global topic string and records the 15101-15899 band with 16xx suffix block; guide/observability-logging.md exists.",
33
+ "testPointer": "test/blueprint/observability-logging-anatomy.test.js::observability-logging: anatomy files exist with the required sections (TC-038-anatomy-and-topics)",
34
+ "status": "pending",
35
+ "scope": "library"
36
+ }
37
+ ],
38
+ "status": "draft",
39
+ "createdAt": "2026-09-04T12:20:00Z",
40
+ "updatedAt": "2026-09-04T12:20:00Z"
41
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "id": "TS-039",
3
+ "usId": "US-1302",
4
+ "title": "application-error-handling v1.0.0 ships on the core shelf with providesRoles errorHandling and mints the errorHandling global topic distinct from errorEnvelope",
5
+ "purpose": "Cover the three ACs on US-1302: shipped anatomy and blueprint.json fields, clean apply into a fresh fixture, and errorHandling vs errorEnvelope topic distinction.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1302-1",
9
+ "AC-1302-2",
10
+ "AC-1302-3"
11
+ ],
12
+ "testCases": [
13
+ {
14
+ "id": "TC-039-blueprint-json-fields",
15
+ "acId": "AC-1302-1",
16
+ "description": "blueprints/application-error-handling/blueprint.json declares slug, version 1.0.0, category application, providesRoles [\"errorHandling\"], and includes contributions for REQ-001..004, US-16101..16107, TAC-1701, TAC-1702 and ADR-1701..1703 with ADR-1701 carrying scope global and topic errorHandling.",
17
+ "testPointer": "test/blueprint/application-error-handling-anatomy.test.js::application-error-handling: blueprint.json declares the ratified shape (TC-039-blueprint-json-fields)",
18
+ "status": "pending",
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "TC-039-clean-apply",
23
+ "acId": "AC-1302-2",
24
+ "description": "rcf define blueprint add applies application-error-handling cleanly into a fresh fixture, records manifest.blueprints[] with the slug at 1.0.0, and writes rcf/adr/adr-1701-application-error-handling-record-shape.json.",
25
+ "testPointer": "test/blueprint/application-error-handling-anatomy.test.js::application-error-handling: apply into a fresh fixture succeeds and writes the namespaced contributions (TC-039-clean-apply)",
26
+ "status": "pending",
27
+ "scope": "library"
28
+ },
29
+ {
30
+ "id": "TC-039-topics-distinct",
31
+ "acId": "AC-1302-3",
32
+ "description": "docs/topics.md distinguishes errorHandling from errorEnvelope (errorHandling internal record and boundary; errorEnvelope stays with application-api-rest as REST wire shape) and reserves the 16101-16899 band with 17xx suffix block.",
33
+ "testPointer": "test/blueprint/application-error-handling-anatomy.test.js::application-error-handling: docs/topics.md distinguishes errorHandling from errorEnvelope (TC-039-topics-distinct)",
34
+ "status": "pending",
35
+ "scope": "library"
36
+ }
37
+ ],
38
+ "status": "draft",
39
+ "createdAt": "2026-09-04T12:20:00Z",
40
+ "updatedAt": "2026-09-04T12:20:00Z"
41
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "id": "TS-040",
3
+ "usId": "US-1401",
4
+ "title": "Loader accepts providesRoles and suggestedCompanions with shape validation and paired-ADR gate",
5
+ "purpose": "Cover the three ACs on US-1401: accepted shape (both fields optional and independent), refusal shapes for camelCase pattern / empty reason / em-dash / emoji, paired-scope-global-ADR gate.",
6
+ "testLevel": "unit",
7
+ "acIds": [
8
+ "AC-1401-1",
9
+ "AC-1401-2",
10
+ "AC-1401-3"
11
+ ],
12
+ "testCases": [
13
+ {
14
+ "id": "TC-040-loader-accepts-both",
15
+ "acId": "AC-1401-1",
16
+ "description": "loadBlueprint against a fixture declaring providesRoles: [\"logging\"] and suggestedCompanions: [{role: \"logging\", reason: \"...\"}] returns the fields on the LoadedBlueprint object; a fixture declaring neither also loads clean.",
17
+ "testPointer": "test/blueprint/loader-companions.test.js::loader accepts and preserves providesRoles and suggestedCompanions (AC-1401-1)",
18
+ "status": "pending",
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "TC-040-refuse-bad-camelcase",
23
+ "acId": "AC-1401-2",
24
+ "description": "loadBlueprint refuses a fixture declaring providesRoles: [\"Logging\"] (upper camel) with rcfError kind validation naming providesRoles[0] and the offending value.",
25
+ "testPointer": "test/blueprint/loader-companions.test.js::loader refuses providesRoles value that fails the lower camelCase pattern (AC-1401-2)",
26
+ "status": "pending",
27
+ "scope": "library"
28
+ },
29
+ {
30
+ "id": "TC-040-refuse-empty-reason",
31
+ "acId": "AC-1401-2",
32
+ "description": "loadBlueprint refuses a fixture with suggestedCompanions entry whose reason is empty or whitespace-only.",
33
+ "testPointer": "test/blueprint/loader-companions.test.js::loader refuses suggestedCompanions entry with empty or whitespace-only reason (AC-1401-2)",
34
+ "status": "pending",
35
+ "scope": "library"
36
+ },
37
+ {
38
+ "id": "TC-040-refuse-em-dash-and-emoji",
39
+ "acId": "AC-1401-2",
40
+ "description": "loadBlueprint refuses a fixture with an em-dash (U+2014) or an emoji in the reason string.",
41
+ "testPointer": "test/blueprint/loader-companions.test.js::loader refuses em-dash in suggestedCompanions reason (AC-1401-2)",
42
+ "status": "pending",
43
+ "scope": "library"
44
+ },
45
+ {
46
+ "id": "TC-040-paired-adr-required",
47
+ "acId": "AC-1401-3",
48
+ "description": "loadBlueprint refuses a fixture declaring providesRoles: [\"logging\"] but no scope:global ADR carrying topic 'logging' with the exact paired-ADR refusal message.",
49
+ "testPointer": "test/blueprint/loader-companions.test.js::loader refuses providesRoles without a paired scope:global ADR on the topic string (AC-1401-3)",
50
+ "status": "pending",
51
+ "scope": "library"
52
+ }
53
+ ],
54
+ "status": "draft",
55
+ "createdAt": "2026-09-04T12:20:00Z",
56
+ "updatedAt": "2026-09-04T12:20:00Z"
57
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "id": "TS-041",
3
+ "usId": "US-1402",
4
+ "title": "rcf define blueprint add prints resolved companion suggestions and honours --companion / --no-companion-suggestions with persistence to rcf/companions.json",
5
+ "purpose": "Cover the three ACs on US-1402: apply-time suggestion block and its suppression, --companion selectors and refusal for non-providers, companions.json shape and pin overwrite behaviour.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1402-1",
9
+ "AC-1402-2",
10
+ "AC-1402-3"
11
+ ],
12
+ "testCases": [
13
+ {
14
+ "id": "TC-041-suggestion-block",
15
+ "acId": "AC-1402-1",
16
+ "description": "rcf define blueprint add application-api-rest into a fresh fixture prints the header line and one line per suggested role with the origin annotation; the apply does not adopt any companion.",
17
+ "testPointer": "test/cli/blueprint-companions.test.js::apply prints resolved companion suggestion block after success (TC-041-suggestion-block)",
18
+ "status": "pending",
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "TC-041-no-suggestions-flag",
23
+ "acId": "AC-1402-1",
24
+ "description": "rcf define blueprint add application-api-rest --no-companion-suggestions succeeds and produces no suggestion block on stdout.",
25
+ "testPointer": "test/cli/blueprint-companions.test.js::--no-companion-suggestions suppresses the block (TC-041-no-suggestions-flag)",
26
+ "status": "pending",
27
+ "scope": "library"
28
+ },
29
+ {
30
+ "id": "TC-041-companion-flag-writes-pin",
31
+ "acId": "AC-1402-2",
32
+ "description": "rcf define blueprint add application-api-rest --companion logging=observability-logging --companion errorHandling=application-error-handling writes rcf/companions.json with both pins carrying pinnedAt.",
33
+ "testPointer": "test/cli/blueprint-companions.test.js::--companion selectors write rcf/companions.json pins with pinnedAt (TC-041-companion-flag-writes-pin)",
34
+ "status": "pending",
35
+ "scope": "library"
36
+ },
37
+ {
38
+ "id": "TC-041-companion-flag-non-provider",
39
+ "acId": "AC-1402-2",
40
+ "description": "rcf define blueprint add --companion logging=observability-essentials (which does not declare providesRoles containing logging) refuses exit 2 with the specified message shape.",
41
+ "testPointer": "test/cli/blueprint-companions.test.js::--companion naming a non-provider refuses exit 2 with no side effects (TC-041-companion-flag-non-provider)",
42
+ "status": "pending",
43
+ "scope": "library"
44
+ },
45
+ {
46
+ "id": "TC-041-pin-file-shape-and-overwrite",
47
+ "acId": "AC-1402-3",
48
+ "description": "rcf/companions.json is created lazily with schemaVersion 1 and current-pin-only shape; a re-run with a different --companion value overwrites the pin and prints the pin-transition stderr line.",
49
+ "testPointer": "test/cli/blueprint-companions.test.js::rcf/companions.json shape and pin overwrite prints transition line (TC-041-pin-file-shape-and-overwrite)",
50
+ "status": "pending",
51
+ "scope": "library"
52
+ }
53
+ ],
54
+ "status": "draft",
55
+ "createdAt": "2026-09-04T12:20:00Z",
56
+ "updatedAt": "2026-09-04T12:20:00Z"
57
+ }
@@ -0,0 +1,57 @@
1
+ {
2
+ "id": "TS-042",
3
+ "usId": "US-1403",
4
+ "title": "rcf define blueprint companions <slug>|set|unset verb: text output, --json envelope, exit codes",
5
+ "purpose": "Cover the three ACs on US-1403: <slug> resolution printing with origin annotations, set/unset pin round-trip and refusals, --json envelope on all three sub-verbs.",
6
+ "testLevel": "integration",
7
+ "acIds": [
8
+ "AC-1403-1",
9
+ "AC-1403-2",
10
+ "AC-1403-3"
11
+ ],
12
+ "testCases": [
13
+ {
14
+ "id": "TC-042-companions-slug-text",
15
+ "acId": "AC-1403-1",
16
+ "description": "rcf define blueprint companions application-api-rest with application-api-rest applied prints the header and one line per role with the origin annotations already-applied / shelf-fallback / registered-library.",
17
+ "testPointer": "test/cli/blueprint-companions.test.js::rcf define blueprint companions <slug> prints resolved companions with origin (TC-042-companions-slug-text)",
18
+ "status": "pending",
19
+ "scope": "library"
20
+ },
21
+ {
22
+ "id": "TC-042-companions-slug-not-applied",
23
+ "acId": "AC-1403-1",
24
+ "description": "rcf define blueprint companions <slug> refuses exit 2 when the named slug is not applied on the project.",
25
+ "testPointer": "test/cli/blueprint-companions.test.js::rcf define blueprint companions refuses when slug is not applied (TC-042-companions-slug-not-applied)",
26
+ "status": "pending",
27
+ "scope": "library"
28
+ },
29
+ {
30
+ "id": "TC-042-companions-set-unset-round-trip",
31
+ "acId": "AC-1403-2",
32
+ "description": "rcf define blueprint companions set logging observability-logging writes companions.json; rcf define blueprint companions unset logging removes the entry; an unset without a pin refuses exit 2.",
33
+ "testPointer": "test/cli/blueprint-companions.test.js::companions set writes pin and unset removes it; unset without pin refuses (TC-042-companions-set-unset-round-trip)",
34
+ "status": "pending",
35
+ "scope": "library"
36
+ },
37
+ {
38
+ "id": "TC-042-companions-set-refuses-non-provider",
39
+ "acId": "AC-1403-2",
40
+ "description": "rcf define blueprint companions set logging observability-essentials refuses exit 2 because observability-essentials does not declare providesRoles containing logging.",
41
+ "testPointer": "test/cli/blueprint-companions.test.js::companions set refuses non-provider slug (TC-042-companions-set-refuses-non-provider)",
42
+ "status": "pending",
43
+ "scope": "library"
44
+ },
45
+ {
46
+ "id": "TC-042-companions-json-envelope",
47
+ "acId": "AC-1403-3",
48
+ "description": "rcf define blueprint companions application-api-rest --json emits {slug, suggestions: [{role, provider, origin, notes}]} preserving the order of suggestedCompanions[].",
49
+ "testPointer": "test/cli/blueprint-companions.test.js::--json emits machine-readable envelope preserving suggestedCompanions order (TC-042-companions-json-envelope)",
50
+ "status": "pending",
51
+ "scope": "library"
52
+ }
53
+ ],
54
+ "status": "draft",
55
+ "createdAt": "2026-09-04T12:20:00Z",
56
+ "updatedAt": "2026-09-04T12:20:00Z"
57
+ }