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.
- package/CHANGELOG.md +53 -0
- package/bin/rcf.js +5 -0
- package/blueprints/application-api-rest/blueprint.json +12 -4
- package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +3 -3
- package/blueprints/application-api-rest/docs/topics.md +4 -2
- package/blueprints/application-error-handling/README.md +42 -0
- package/blueprints/application-error-handling/assets/schemas/error-record.schema.json +17 -0
- package/blueprints/application-error-handling/blueprint.json +27 -0
- package/blueprints/application-error-handling/contributions/adrs/adr-1701-application-error-handling-record-shape.json +25 -0
- package/blueprints/application-error-handling/contributions/adrs/adr-1702-application-error-handling-classification-vocabulary.json +20 -0
- package/blueprints/application-error-handling/contributions/adrs/adr-1703-application-error-handling-transport-mapping.json +20 -0
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-001.json +15 -0
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-002.json +15 -0
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-003.json +15 -0
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-004.json +15 -0
- package/blueprints/application-error-handling/contributions/tacs/tac-1701-application-error-handling-boundary.json +45 -0
- package/blueprints/application-error-handling/contributions/tacs/tac-1702-application-error-handling-record-factory.json +40 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16101.json +25 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16102.json +25 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16103.json +34 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16104.json +25 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16105.json +25 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16106.json +25 -0
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16107.json +25 -0
- package/blueprints/application-error-handling/docs/topics.md +24 -0
- package/blueprints/application-error-handling/guide/application-error-handling.md +35 -0
- package/blueprints/application-spa/blueprint.json +12 -2
- package/blueprints/application-spa/docs/topics.md +2 -0
- package/blueprints/observability-logging/README.md +44 -0
- package/blueprints/observability-logging/assets/samples/log-line.json +13 -0
- package/blueprints/observability-logging/blueprint.json +27 -0
- package/blueprints/observability-logging/contributions/adrs/adr-1601-observability-logging-line-shape.json +25 -0
- package/blueprints/observability-logging/contributions/adrs/adr-1602-observability-logging-correlation-id-header.json +25 -0
- package/blueprints/observability-logging/contributions/adrs/adr-1603-observability-logging-redaction-categories.json +25 -0
- package/blueprints/observability-logging/contributions/adrs/adr-1604-observability-logging-level-vocabulary.json +20 -0
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-001.json +15 -0
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-002.json +15 -0
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-003.json +15 -0
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-004.json +15 -0
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-005.json +15 -0
- package/blueprints/observability-logging/contributions/tacs/tac-1601-observability-logging-logger-factory.json +46 -0
- package/blueprints/observability-logging/contributions/tacs/tac-1602-observability-logging-redaction-boundary.json +27 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15101.json +34 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15102.json +43 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15103.json +34 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15104.json +25 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15105.json +34 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15106.json +25 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15107.json +25 -0
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15108.json +25 -0
- package/blueprints/observability-logging/docs/topics.md +21 -0
- package/blueprints/observability-logging/guide/observability-logging.md +36 -0
- package/fixtures/canary-manifest.json +6 -6
- package/guidance/harness-template.md +8 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +8 -0
- package/package.json +2 -2
- package/rcf/code-nodes/cn-077.json +14 -0
- package/rcf/code-nodes/cn-078.json +15 -0
- package/rcf/code-nodes/cn-079.json +14 -0
- package/rcf/code-nodes/cn-080.json +15 -0
- package/rcf/code-nodes/cn-081.json +15 -0
- package/rcf/code-nodes/cn-082.json +15 -0
- package/rcf/code-nodes/cn-083.json +14 -0
- package/rcf/code-nodes/cn-084.json +15 -0
- package/rcf/code-nodes/cn-085.json +14 -0
- package/rcf/code-nodes/cn-086.json +16 -0
- package/rcf/code-nodes/cn-087.json +14 -0
- package/rcf/code-nodes/cn-088.json +14 -0
- package/rcf/code-nodes/cn-089.json +14 -0
- package/rcf/code-nodes/cn-090.json +14 -0
- package/rcf/code-nodes/cn-091.json +14 -0
- package/rcf/code-nodes/cn-092.json +15 -0
- package/rcf/code-nodes/cn-093.json +15 -0
- package/rcf/code-nodes/cn-094.json +14 -0
- package/rcf/code-nodes/cn-095.json +14 -0
- package/rcf/code-nodes/cn-096.json +14 -0
- package/rcf/code-nodes/cn-097.json +14 -0
- package/rcf/code-nodes/cn-098.json +13 -0
- package/rcf/code-nodes/cn-099.json +13 -0
- package/rcf/code-nodes/cn-100.json +13 -0
- package/rcf/code-nodes/cn-101.json +13 -0
- package/rcf/code-nodes/cn-102.json +13 -0
- package/rcf/code-nodes/cn-103.json +13 -0
- package/rcf/code-nodes/cn-104.json +13 -0
- package/rcf/code-nodes/cn-105.json +13 -0
- package/rcf/evals/eval-001.json +55 -0
- package/rcf/fbs/fbs-028.json +27 -0
- package/rcf/fbs/fbs-029.json +27 -0
- package/rcf/fbs/fbs-030.json +27 -0
- package/rcf/fbs/fbs-031.json +27 -0
- package/rcf/fbs/fbs-032.json +27 -0
- package/rcf/fbs/fbs-033.json +27 -0
- package/rcf/fbs/fbs-034.json +27 -0
- package/rcf/fbs/fbs-035.json +18 -0
- package/rcf/requirements/req-013.json +22 -0
- package/rcf/requirements/req-014.json +22 -0
- package/rcf/requirements/req-015.json +21 -0
- package/rcf/requirements/req-016.json +37 -0
- package/rcf/test-suites/ts-038.json +41 -0
- package/rcf/test-suites/ts-039.json +41 -0
- package/rcf/test-suites/ts-040.json +57 -0
- package/rcf/test-suites/ts-041.json +57 -0
- package/rcf/test-suites/ts-042.json +57 -0
- package/rcf/test-suites/ts-043.json +49 -0
- package/rcf/test-suites/ts-044.json +41 -0
- package/rcf/test-suites/ts-045.json +46 -0
- package/rcf/user-stories/us-1301.json +43 -0
- package/rcf/user-stories/us-1302.json +43 -0
- package/rcf/user-stories/us-1401.json +43 -0
- package/rcf/user-stories/us-1402.json +43 -0
- package/rcf/user-stories/us-1403.json +43 -0
- package/rcf/user-stories/us-1404.json +43 -0
- package/rcf/user-stories/us-1501.json +43 -0
- package/rcf/user-stories/us-1601.json +37 -0
- package/releases/releases.yaml +20 -1
- package/src/blueprint/apply.js +8 -0
- package/src/blueprint/companions.js +485 -0
- package/src/blueprint/index.js +16 -0
- package/src/blueprint/loader.js +243 -1
- package/src/cli/blueprint.js +309 -0
- package/src/cli/create.js +14 -0
- package/src/cli/eval-coverage.js +221 -0
- package/src/cli/eval.js +43 -0
- package/src/cli/finalise.js +64 -0
- package/src/cli/help.js +4 -0
- package/src/cli/validate.js +7 -0
- package/src/core/store/ids.js +5 -1
- package/src/core/store/init.js +4 -0
- package/src/core/store/loader.js +4 -0
- package/src/core/store/validator.js +8 -1
- package/src/core/store/walker.js +71 -2
- package/src/core/store/writer.js +4 -0
- package/src/eval/judge.js +338 -0
- package/src/finalise/index.js +8 -0
- package/src/finalise/ingest.js +27 -0
- package/src/finalise/ship-without-eval.js +123 -0
- package/src/query/eval-coverage.js +162 -0
- package/src/verify/chain/index.js +67 -0
- package/src/verify/cli/run.js +15 -0
- package/src/verify/engine/index.js +10 -0
- package/src/verify/verdict/index.js +46 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"tacId": "TAC-1602-observability-logging-redaction-boundary",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"tadId": "TAD-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"name": "Redaction boundary",
|
|
8
|
+
"purpose": "Owns the redaction pass every emission passes through before the line lands on the sink. Encapsulates the category vocabulary from ADR-1603 (recommended defaults plus elicited additions) and the field-name matching rule; a payload field whose name or path label matches a category is replaced with the literal string [REDACTED:<category>] in the SERIALISED line, never in the caller's original object.",
|
|
9
|
+
"responsibilities": [
|
|
10
|
+
"Apply the redaction rule on a deep-cloned copy of the emission payload so the caller's original object is not mutated (AC-15103-1).",
|
|
11
|
+
"Accept elicited additional category names at boot (kebab or dotted-namespace grammar) and apply them alongside the recommended defaults (AC-15103-2).",
|
|
12
|
+
"Refuse construction when an elicited category name fails the accepted grammar (AC-15108-1)."
|
|
13
|
+
],
|
|
14
|
+
"internalStructure": "One module exporting createRedactionBoundary({ categories }) -> { redact(payload) -> payload }. Categories is a Set of strings; matching walks payload keys (dot-path in nested objects) and replaces the value on the returned clone when the key equals or ends in a category name. The clone is a structuredClone unless the payload includes non-cloneable values, in which case the boundary falls back to a JSON round-trip clone with the serialisation-refused fold from TAC-1601.",
|
|
15
|
+
"interfaces": [
|
|
16
|
+
{
|
|
17
|
+
"name": "createRedactionBoundary",
|
|
18
|
+
"kind": "factory",
|
|
19
|
+
"description": "createRedactionBoundary({ categories: string[] }) -> { redact(payload: object): object }. Called once at boot from the logger factory; the factory holds the returned redact function and applies it on every emission."
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"dependencies": [],
|
|
23
|
+
"tradeoffs": "Redaction runs at the serialisation boundary and therefore only redacts fields the payload declares under a category-named key. Free-text redaction in the message string (an email pasted into a warning message) is out of scope for v1: the mechanism reach is field-level, not text-level. A project that needs text-level redaction wires a project-side wrapper around the logger call sites; the blueprint's guide names this gap.",
|
|
24
|
+
"notes": "",
|
|
25
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
26
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
27
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15101",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Every log emission lands as one JSON object per line on stdout with the ratified minimum field set",
|
|
8
|
+
"asA": "operator running the application and consuming its stdout through a log ingestion pipeline",
|
|
9
|
+
"iWant": "every log emission to arrive as one JSON object on one line, carrying the shared minimum field set the pipeline expects",
|
|
10
|
+
"soThat": "the ingestion pipeline parses every line without special cases and no emission escapes as unstructured text",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15101-1",
|
|
14
|
+
"description": "A log emission at any level from any call site produces exactly one line on stdout, that line parses as valid JSON, and the parsed object carries every field of the shared minimum set: message, level, timestamp, correlationId, environment, serviceName, serviceVersion.",
|
|
15
|
+
"given": "a running application with the logger factory constructed and an ambient correlation context",
|
|
16
|
+
"when": "any call site emits at any level",
|
|
17
|
+
"then": "one stdout line results, JSON.parse succeeds, and the object has all seven minimum fields present with the correct types",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-15101-2",
|
|
23
|
+
"description": "A log emission whose payload contains a non-JSON-representable value (a BigInt, a function reference, a circular object) is caught at the boundary, dropped with one stderr notice naming the offending field, and the calling code path returns as if the emission had succeeded; the service does not crash.",
|
|
24
|
+
"given": "a running application and a caller passing a BigInt or a circular object as part of a log payload",
|
|
25
|
+
"when": "the emission is attempted",
|
|
26
|
+
"then": "stdout carries no line for this emission, stderr carries one notice naming the offending field, and the caller's next line of code executes without throwing",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1601-observability-logging-logger-factory"],
|
|
32
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
33
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15102",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-002",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A correlation identifier read from the inbound request header rides every log line and every outbound request until the request ends",
|
|
8
|
+
"asA": "operator debugging a request path that spans multiple services",
|
|
9
|
+
"iWant": "the correlation identifier from the inbound request to appear on every log line the application emits during the request AND on every outbound request the application initiates within the same context",
|
|
10
|
+
"soThat": "log search returns the whole chain of a logical request across services from one string query",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15102-1",
|
|
14
|
+
"description": "A request arriving with the elicited correlation header (default X-Correlation-Id per ADR-1602) causes every log line emitted during the handler and its callees to carry correlationId equal to the header value; a request arriving without the header causes the application to mint a v4 UUID and the same value appears on every log line for the request.",
|
|
15
|
+
"given": "a running application with the correlation header configured and an inbound request",
|
|
16
|
+
"when": "the request is processed (with or without the header set)",
|
|
17
|
+
"then": "every log line emitted during the request carries the same correlationId value; header value wins when present; a v4 UUID is minted otherwise",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-15102-2",
|
|
23
|
+
"description": "An outbound HTTP request initiated from within a request-scoped handler carries the ambient correlationId as the same elicited header name.",
|
|
24
|
+
"given": "an inbound request handler that issues an outbound HTTP call",
|
|
25
|
+
"when": "the outbound request is sent",
|
|
26
|
+
"then": "the outbound request headers include the correlation header with the ambient value",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-15102-3",
|
|
32
|
+
"description": "A log emission with no ambient correlation context (boot line, scheduled task, background worker startup) carries correlationId equal to null; the field is present.",
|
|
33
|
+
"given": "a running application with no ambient request context",
|
|
34
|
+
"when": "a boot-time or background emission occurs",
|
|
35
|
+
"then": "the line carries correlationId: null",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime"
|
|
38
|
+
}
|
|
39
|
+
],
|
|
40
|
+
"tacIds": ["TAC-1601-observability-logging-logger-factory"],
|
|
41
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
42
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
43
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15103",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Fields named or path-labelled with a PII category are redacted at the boundary regardless of call-site discipline",
|
|
8
|
+
"asA": "operator concerned that PII leaks through logs",
|
|
9
|
+
"iWant": "the emission boundary to redact fields with named PII categories automatically",
|
|
10
|
+
"soThat": "a rogue caller that forgets to redact does not leak PII to the log destination",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15103-1",
|
|
14
|
+
"description": "A log payload containing a field named or path-tagged with any of the recommended-default categories (credential, pii.email, pii.name, pii.address, token, bearer) is replaced with the literal string [REDACTED:<category>] in the emitted line; the caller's original object is not mutated (a subsequent read of the same object still shows the original value).",
|
|
15
|
+
"given": "an emission at any level whose payload includes a field tagged as pii.email",
|
|
16
|
+
"when": "the emission passes through the boundary",
|
|
17
|
+
"then": "the stdout line's field value equals [REDACTED:pii.email] and the caller-side object still holds the original address",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-15103-2",
|
|
23
|
+
"description": "A project may add its own redaction categories at apply through the ADR-1603 elicited-additions parameter; a new category name (kebab or dotted-namespace) is accepted and applied by the boundary in the same round.",
|
|
24
|
+
"given": "a project that elicited an additional category ssn on ADR-1603",
|
|
25
|
+
"when": "an emission includes a field tagged ssn",
|
|
26
|
+
"then": "the stdout line's field value equals [REDACTED:ssn]",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1602-observability-logging-redaction-boundary"],
|
|
32
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
33
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15104",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Emissions below the operator-elicited minimum level are dropped before serialisation",
|
|
8
|
+
"asA": "operator sizing log volume for a production environment",
|
|
9
|
+
"iWant": "emissions below the minimum level to be dropped without serialising them",
|
|
10
|
+
"soThat": "log volume matches the operator's chosen signal budget and the level filter is honoured line-by-line",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15104-1",
|
|
14
|
+
"description": "With the elicited minimum level set to info, an emission at trace or debug produces no stdout line; an emission at info, warn, error or fatal produces one stdout line each.",
|
|
15
|
+
"given": "a running application with minimum level set to info",
|
|
16
|
+
"when": "one emission is issued at each of the six levels",
|
|
17
|
+
"then": "the stdout line count equals 4 (info, warn, error, fatal), and no line at trace or debug appears",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-1601-observability-logging-logger-factory"],
|
|
23
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15105",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-005",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Every log line reflects the operator-elicited environment, serviceName and serviceVersion",
|
|
8
|
+
"asA": "operator debugging in a shared log destination",
|
|
9
|
+
"iWant": "every log line to carry the environment, serviceName and serviceVersion the operator set at boot",
|
|
10
|
+
"soThat": "log queries partition by those three fields without prose parsing on the message string",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15105-1",
|
|
14
|
+
"description": "The logger factory refuses to construct when environment, serviceName or serviceVersion is missing or blank; construction failure throws with a message naming the missing field.",
|
|
15
|
+
"given": "an application booting with one of the three fields absent",
|
|
16
|
+
"when": "the logger factory is constructed",
|
|
17
|
+
"then": "the construction throws, the error message names the missing field, and the process exits before any emission is possible",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
},
|
|
21
|
+
{
|
|
22
|
+
"id": "AC-15105-2",
|
|
23
|
+
"description": "Every emitted line carries environment, serviceName and serviceVersion at fixed field names and equal to the values the operator supplied at boot.",
|
|
24
|
+
"given": "a running application constructed with the three fields set",
|
|
25
|
+
"when": "any emission is issued",
|
|
26
|
+
"then": "the stdout line's three fields equal the operator-supplied values verbatim",
|
|
27
|
+
"testable": true,
|
|
28
|
+
"scope": "runtime"
|
|
29
|
+
}
|
|
30
|
+
],
|
|
31
|
+
"tacIds": ["TAC-1601-observability-logging-logger-factory"],
|
|
32
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
33
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
34
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15106",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-004",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "The logger factory refuses to construct with an unknown level string",
|
|
8
|
+
"asA": "operator wiring the logger factory at boot with a mis-configured minimum level",
|
|
9
|
+
"iWant": "the factory to refuse construction with a message naming the unknown level and the accepted vocabulary",
|
|
10
|
+
"soThat": "a typo in the environment variable is caught at boot rather than silently dropping every emission",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15106-1",
|
|
14
|
+
"description": "The factory refuses to construct when the elicited minimum level is not one of the recommended-default vocabulary (trace, debug, info, warn, error, fatal); the thrown error names the offending value and lists the accepted set.",
|
|
15
|
+
"given": "an application booting with minimum level set to 'verbose'",
|
|
16
|
+
"when": "the factory is constructed",
|
|
17
|
+
"then": "the construction throws with a message naming 'verbose' as the offending value and listing the accepted vocabulary",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-1601-observability-logging-logger-factory"],
|
|
23
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15107",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-001",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A test double captures emitted lines for assertion without touching stdout",
|
|
8
|
+
"asA": "test author verifying that the application emits the expected log lines during a test",
|
|
9
|
+
"iWant": "a test double the factory produces that captures emitted lines in memory instead of writing to stdout",
|
|
10
|
+
"soThat": "assertions on log emissions do not depend on stdout capture and do not pollute test output",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15107-1",
|
|
14
|
+
"description": "The blueprint's guide names an in-memory capture mode of the factory contract that returns an ordered array of the emitted structured objects; the capture mode is a documented API of TAC-1601 and can be constructed in a test without any stdout redirection.",
|
|
15
|
+
"given": "a test that constructs the factory in capture mode",
|
|
16
|
+
"when": "the code under test emits any number of log lines",
|
|
17
|
+
"then": "the returned array contains one entry per emission with the same object shape the runtime writes to stdout, and stdout carries no line",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-1601-observability-logging-logger-factory"],
|
|
23
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "observability-logging-US-15108",
|
|
3
|
+
"prdId": "PRD-001",
|
|
4
|
+
"reqId": "observability-logging-REQ-003",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "A redaction category unknown to the boundary is refused at configuration time rather than silently ignored",
|
|
8
|
+
"asA": "operator elicited into ADR-1603 with a mis-spelled additional category name",
|
|
9
|
+
"iWant": "the factory to refuse the redaction category at configuration time with a message naming the offending value",
|
|
10
|
+
"soThat": "a typo in an added category does not silently disable redaction for that field pattern",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-15108-1",
|
|
14
|
+
"description": "The factory's redaction configuration accepts kebab-cased or dotted-namespace category names (matching the ADR-1603 recommended-default shape) and refuses any other shape with a message naming the offending value and the accepted grammar.",
|
|
15
|
+
"given": "an application configured with a redaction categories list including 'PII Email' (space, mixed case)",
|
|
16
|
+
"when": "the factory is constructed",
|
|
17
|
+
"then": "construction throws with a message naming 'PII Email' as the offending value",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "runtime"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"tacIds": ["TAC-1602-observability-logging-redaction-boundary"],
|
|
23
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
24
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
25
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
# observability-logging: coordination vocabulary
|
|
2
|
+
|
|
3
|
+
## Global topics
|
|
4
|
+
|
|
5
|
+
| Topic | Owning ADR | Meaning | Composition note |
|
|
6
|
+
|---|---|---|---|
|
|
7
|
+
| `logging` | `ADR-1601-observability-logging-line-shape` | Structured single-line JSON emission contract with the shared minimum field set. | Shelf-canonical claim from v1.0.0. A composing blueprint that ships a different logging contract (structured multi-line, per-service special format, non-JSON) conflicts by design; the operator resolves at project level via `rcf define blueprint supersede logging --incoming <source>`. A library-registered logging provider (wsd-logging, acme-log-emit) is preferred over this shelf provider by the companion-suggestion mechanism. |
|
|
8
|
+
|
|
9
|
+
## Deliberately unclaimed topics
|
|
10
|
+
|
|
11
|
+
- `logRedaction` (text-level redaction of the `message` string). Named here so a future companion blueprint can claim it cleanly; this blueprint's redaction is field-name granularity per ADR-1603.
|
|
12
|
+
- `logTransport` (the transport downstream of stdout). Owned by the surrounding platform; a future blueprint may claim it if the shelf ever ships one.
|
|
13
|
+
- `logMetricsBridge` (emitting log-derived metrics). Named here so a future `metrics-store` companion can claim it cleanly.
|
|
14
|
+
|
|
15
|
+
## Shelf id band and suffix block
|
|
16
|
+
|
|
17
|
+
| Blueprint | US band | ADR/TAC suffix block | Status | Global topics |
|
|
18
|
+
|---|---|---|---|---|
|
|
19
|
+
| observability-logging | 15101-15899 | 16xx | shipped v1.0.0 | `logging` |
|
|
20
|
+
|
|
21
|
+
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# Guide: observability-logging (v1.0.0)
|
|
2
|
+
|
|
3
|
+
## What it is
|
|
4
|
+
|
|
5
|
+
A shipped, org-neutral logging contract for a rcf-lite project. Every log emission lands as one JSON object per line on stdout with a shared field set the applying operator's ingestion pipeline can consume without a per-service parser. Correlation identifiers propagate through the request-scoped context and reflect on outbound requests. A field-name redaction boundary keeps PII out of emitted lines by rule, not by hope. The operator elicits the correlation header name, the redaction category additions and the minimum level per environment at apply.
|
|
6
|
+
|
|
7
|
+
## What it deliberately is not
|
|
8
|
+
|
|
9
|
+
- Not a log transport. The blueprint ships to stdout; the applying platform pipes it into whatever ingestion service the operator chose. Elastic Common Schema, Loki, Datadog and Splunk all consume one JSON object per line without a per-blueprint adapter.
|
|
10
|
+
- Not a metrics or tracing surface. Metrics belong to a future `metrics-store` companion; tracing belongs to a distributed-tracing companion. This blueprint contributes neither.
|
|
11
|
+
- Not a text-level PII scrubber. Redaction is field-name granularity per ADR-1603; a PII value concatenated into the `message` string is not caught.
|
|
12
|
+
|
|
13
|
+
## When to reach for it
|
|
14
|
+
|
|
15
|
+
- Any project that has not yet applied a logging companion. Applying this blueprint gives a working structured emission surface without registering a library.
|
|
16
|
+
- Any project whose applied service blueprints (application-api-rest, application-spa) declare `suggestedCompanions: ["logging"]` and no more specific library provides the role.
|
|
17
|
+
|
|
18
|
+
## When it does not fit
|
|
19
|
+
|
|
20
|
+
- A project standing on an organisation with a shipped logging library (`wsd-logging`, `acme-log-emit`) that provides the `logging` role. Register the library and the companion-suggestion mechanism resolves to the library's provider over this shelf fallback.
|
|
21
|
+
- A project that needs multi-line stack trace emission for a legacy consumer. This blueprint ships single-line JSON only; a project-level `logging` topic supersede lets the project author a different contract.
|
|
22
|
+
|
|
23
|
+
## What a good outcome looks like
|
|
24
|
+
|
|
25
|
+
- One JSON object per line on stdout, correlation identifier threaded across services, PII fields redacted at the boundary, level filter honoured per environment, in-memory capture mode used in tests. `rcf define validate` clean; log ingestion pipeline queries partition cleanly by environment, serviceName and serviceVersion.
|
|
26
|
+
|
|
27
|
+
## The operator decisions that remain open
|
|
28
|
+
|
|
29
|
+
- **The inbound correlation header name** (ADR-1602). Recommended default `X-Correlation-Id`; elicited alternative per project. Set the value the surrounding platform's proxy or client tooling already stamps.
|
|
30
|
+
- **The redaction categories additions** (ADR-1603). Recommended defaults cover the six common cases; a project with a domain-specific field (ssn, iban, jwt) adds it at apply.
|
|
31
|
+
- **The minimum log level per environment** (ADR-1604). Recommended vocabulary is trace / debug / info / warn / error / fatal; elicited minimum per environment. Production is typically info; development is typically debug or trace.
|
|
32
|
+
- **The log transport downstream of stdout.** Out of scope for this blueprint; the surrounding platform's pipe wires ingestion.
|
|
33
|
+
|
|
34
|
+
## Cost-honesty
|
|
35
|
+
|
|
36
|
+
Applying this blueprint adds five REQs, eight USs, two TACs and four ADRs to the project's chain. The runtime cost is one factory per boot plus one redaction pass per emission. There is no runtime dependency added to the project's `package.json`; the factory is authored against the applying project's own runtime. The main hidden cost is the discipline of routing every emission through the factory: the guide's `Known mechanism-reach gaps` section names the class and the project-side workarounds.
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
"registerCanary": [
|
|
3
3
|
{
|
|
4
4
|
"id": "rc-2026-09-04-001",
|
|
5
|
-
"createdAt": "2026-09-
|
|
6
|
-
"buildVersion": "0.
|
|
5
|
+
"createdAt": "2026-09-04T17:57:54.464Z",
|
|
6
|
+
"buildVersion": "0.20.0-mockdriver",
|
|
7
7
|
"fixturePromptId": "canary-prompt-01",
|
|
8
8
|
"responseWordCount": 55,
|
|
9
9
|
"grades": {
|
|
@@ -35,8 +35,8 @@
|
|
|
35
35
|
},
|
|
36
36
|
{
|
|
37
37
|
"id": "rc-2026-09-04-002",
|
|
38
|
-
"createdAt": "2026-09-
|
|
39
|
-
"buildVersion": "0.
|
|
38
|
+
"createdAt": "2026-09-04T17:57:54.465Z",
|
|
39
|
+
"buildVersion": "0.20.0-mockdriver",
|
|
40
40
|
"fixturePromptId": "canary-prompt-02",
|
|
41
41
|
"responseWordCount": 55,
|
|
42
42
|
"grades": {
|
|
@@ -68,8 +68,8 @@
|
|
|
68
68
|
},
|
|
69
69
|
{
|
|
70
70
|
"id": "rc-2026-09-04-003",
|
|
71
|
-
"createdAt": "2026-09-
|
|
72
|
-
"buildVersion": "0.
|
|
71
|
+
"createdAt": "2026-09-04T17:57:54.465Z",
|
|
72
|
+
"buildVersion": "0.20.0-mockdriver",
|
|
73
73
|
"fixturePromptId": "canary-prompt-03",
|
|
74
74
|
"responseWordCount": 55,
|
|
75
75
|
"grades": {
|
|
@@ -65,6 +65,14 @@ non-technical; the method must be invisible in what they read.
|
|
|
65
65
|
Library-qualified names like `wsd:auth-oauth2`, the ids each apply
|
|
66
66
|
stamps, and the exact CLI lines belong in files and in `rcf`
|
|
67
67
|
output, not in the conversation.
|
|
68
|
+
- Companion suggestions. When you apply a service blueprint that
|
|
69
|
+
declares suggested companions, tell the operator the resolved
|
|
70
|
+
companion set in plain language, name what each companion
|
|
71
|
+
contributes, and offer the apply command. Do not apply a companion
|
|
72
|
+
without the operator's explicit go. Where a registered library
|
|
73
|
+
provides a role, prefer the library over the shelf provider in
|
|
74
|
+
your suggestion, and say so. The mechanism is suggestion, never
|
|
75
|
+
compulsion.
|
|
68
76
|
|
|
69
77
|
Before / after - the same first status after project setup:
|
|
70
78
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
|
|
1
|
+
129f4018f526ececaef7ae5bea19ecd72be03a957e2cf2ee3323e85f117f6cba
|
|
@@ -52,6 +52,14 @@ non-technical; the method must be invisible in what they read.
|
|
|
52
52
|
Library-qualified names like `wsd:auth-oauth2`, the ids each apply
|
|
53
53
|
stamps, and the exact CLI lines belong in files and in `rcf`
|
|
54
54
|
output, not in the conversation.
|
|
55
|
+
- Companion suggestions. When you apply a service blueprint that
|
|
56
|
+
declares suggested companions, tell the operator the resolved
|
|
57
|
+
companion set in plain language, name what each companion
|
|
58
|
+
contributes, and offer the apply command. Do not apply a companion
|
|
59
|
+
without the operator's explicit go. Where a registered library
|
|
60
|
+
provides a role, prefer the library over the shelf provider in
|
|
61
|
+
your suggestion, and say so. The mechanism is suggestion, never
|
|
62
|
+
compulsion.
|
|
55
63
|
|
|
56
64
|
Before / after - the same first status after project setup:
|
|
57
65
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "rcf-lite",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.20.0",
|
|
4
4
|
"type": "module",
|
|
5
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",
|
|
@@ -60,7 +60,7 @@
|
|
|
60
60
|
"#admissibility": "./src/admissibility/index.js"
|
|
61
61
|
},
|
|
62
62
|
"dependencies": {
|
|
63
|
-
"@stravica-ai/rcf-schemas": "0.
|
|
63
|
+
"@stravica-ai/rcf-schemas": "0.6.0",
|
|
64
64
|
"ajv": "^8.20.0",
|
|
65
65
|
"ajv-formats": "^3.0.1"
|
|
66
66
|
},
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-077",
|
|
3
|
+
"path": "../../blueprints/observability-logging/blueprint.json",
|
|
4
|
+
"title": "observability-logging v1.0.0 shipped blueprint metadata (providesRoles logging, ADR-1601 global topic logging)",
|
|
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-1301-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,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-078",
|
|
3
|
+
"path": "../../blueprints/observability-logging/README.md",
|
|
4
|
+
"title": "observability-logging blueprint tree (README, guide, docs/topics.md, assets, contributions/) applies clean into a fresh fixture",
|
|
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-1301-2",
|
|
8
|
+
"AC-1301-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-079",
|
|
3
|
+
"path": "../../blueprints/application-error-handling/blueprint.json",
|
|
4
|
+
"title": "application-error-handling v1.0.0 shipped blueprint metadata (providesRoles errorHandling, ADR-1701 global topic errorHandling)",
|
|
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-1302-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,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-080",
|
|
3
|
+
"path": "../../blueprints/application-error-handling/README.md",
|
|
4
|
+
"title": "application-error-handling blueprint tree applies clean and docs/topics.md distinguishes errorHandling from errorEnvelope",
|
|
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-1302-2",
|
|
8
|
+
"AC-1302-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,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-081",
|
|
3
|
+
"path": "src/blueprint/loader.js#validateProvidesRoles",
|
|
4
|
+
"title": "Loader accepts providesRoles[] with lower camelCase shape validation",
|
|
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-1401-1",
|
|
8
|
+
"AC-1401-2"
|
|
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,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-082",
|
|
3
|
+
"path": "src/blueprint/loader.js#validateSuggestedCompanions",
|
|
4
|
+
"title": "Loader accepts suggestedCompanions[] with role/reason shape validation, em-dash and emoji refusal on the reason string",
|
|
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-1401-1",
|
|
8
|
+
"AC-1401-2"
|
|
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-083",
|
|
3
|
+
"path": "src/blueprint/loader.js#validateProvidesRolesPairedAdrs",
|
|
4
|
+
"title": "Loader refuses providesRoles without a paired scope:global ADR carrying the topic string equal to the role name",
|
|
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-1401-3"
|
|
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,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-084",
|
|
3
|
+
"path": "src/cli/blueprint.js#main",
|
|
4
|
+
"title": "rcf define blueprint add: --no-companion-suggestions, --companion selectors preflighted, post-apply resolved suggestion block printed",
|
|
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
|
+
"AC-1402-2"
|
|
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-085",
|
|
3
|
+
"path": "src/blueprint/companions.js#setCompanionPin",
|
|
4
|
+
"title": "companions.js: setCompanionPin lazily creates rcf/companions.json (schemaVersion 1, current pin per role, pinnedAt ISO-8601) and prints the pin-transition line on overwrite",
|
|
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-3"
|
|
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,16 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-086",
|
|
3
|
+
"path": "src/cli/blueprint.js#handleCompanionsVerb",
|
|
4
|
+
"title": "rcf define blueprint companions <slug>|set|unset sub-verbs: text output with origin annotations, --json envelope",
|
|
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-1",
|
|
8
|
+
"AC-1403-2",
|
|
9
|
+
"AC-1403-3"
|
|
10
|
+
],
|
|
11
|
+
"dependencies": [],
|
|
12
|
+
"version": "0.1.0",
|
|
13
|
+
"status": "draft",
|
|
14
|
+
"createdAt": "2026-09-04T12:20:00Z",
|
|
15
|
+
"updatedAt": "2026-09-04T12:20:00Z"
|
|
16
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"cnId": "CN-087",
|
|
3
|
+
"path": "src/blueprint/companions.js#resolveCompanionRole",
|
|
4
|
+
"title": "companions.js: deterministic tier ladder resolver (applied > pinned > registered library > core shelf) with per-origin notes",
|
|
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-1404-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
|
+
}
|