@stravica-ai/rcf-schemas 0.2.1 → 0.3.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 CHANGED
@@ -4,6 +4,25 @@ All notable changes to `@stravica-ai/rcf-schemas` are documented in this file.
4
4
 
5
5
  The format roughly follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and the project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). Pre-1.0 breaking changes are signalled by a minor bump per semver 0.x convention.
6
6
 
7
+ ## 0.3.0 - 2026-07-10
8
+
9
+ Adds the Code Node (`CN`) document kind, the eleventh in the family, bridging the requirements graph to source code.
10
+
11
+ ### Added
12
+
13
+ - **`cn.schema.json`**: new schema. One file per Code Node. Identity is `path`, a repo-relative source location, optionally `#symbol`-suffixed (for example `src/store/validator.js` or `src/store/validator.js#getAjv`); granularity (file vs symbol) is derived from the presence of `#` and is never stored as its own field. Required: `cnId`, `path`, `implementsAcIds` (may be empty; an orphan CN is a legitimate state), `version`, `status`, `createdAt`, `updatedAt`. Optional: `title`, `description`, `dependencies[]` (CN-to-CN edges, hand-declared).
14
+ - **`common.schema.json`**: new `$defs.cnId` (`^CN-\d{3,}$`) and `$defs.cnStatus` (`draft` | `approved` | `deprecated`).
15
+ - Fixtures under `fixtures/valid/cn/` and `fixtures/invalid/cn/`; targeted tests in `test/cn.test.js`.
16
+ - Recommended file layout: `rcf/code-nodes/`, file naming `cn-NNN.json` (see `docs/file-layout.md`).
17
+
18
+ ### Changed
19
+
20
+ - **Canonical `$id`** URLs bumped from `https://schemas.stravica.io/rcf/v0.2.0/...` to `https://schemas.stravica.io/rcf/v0.3.0/...` on every schema, in lock-step with the bundle version (unchanged content for the 10 pre-existing document schemas; only `common.schema.json` gains new `$defs` and `cn.schema.json` is new).
21
+
22
+ ### Notes
23
+
24
+ - The project manifest (`manifest.schema.json`) is intentionally unchanged: it is roots-only (`prd`, `tad`, `bs`) and no document kind, including CN, is enumerated there. CN discovery follows the same convention-derived-path pattern as every other kind (see `docs/file-layout.md`), not a manifest field.
25
+
7
26
  ## 0.2.1 - 2026-07-02
8
27
 
9
28
  Added optional `tacIds[]` cross-link field on `user-story.schema.json` to close a Phase 3.7 §D2/OQ-P37-1 silent miss. Forward-compatible; no consumer populates the field until Phase 4 CRUD. Backward-compatible - existing US docs without `tacIds` remain valid.
package/README.md CHANGED
@@ -4,15 +4,15 @@ JSON Schemas for the [Requirements Confidence Framework (RCF)](https://stravica.
4
4
 
5
5
  **Language-neutral. No code in this package, only schema files, docs, and fixtures.** Every consumer language is first-class: Node, Python, Java, or anything else with a JSON Schema 2020-12 validator.
6
6
 
7
- > **Status:** v0.2.0 - public preview.
7
+ > **Status:** v0.3.0 - public preview.
8
8
  >
9
9
  > This package is available on the public npm registry as a preview. Ship-quality contract, small consumer surface. The methodology's reference implementation (`Stravica/rcf-build-lite`) is being migrated to consume 0.2.0 during Phase 3.7 of the RCF build and stays private until Phase 9; expect the public consumer path to sharpen up as that lands. If you want to experiment, `npm install @stravica-ai/rcf-schemas` is stable; docs at `https://schemas.stravica.io/` land at Phase 9.
10
10
 
11
11
  ## What's here
12
12
 
13
- - **11 schema files** in `schemas/`:
13
+ - **12 schema files** in `schemas/`:
14
14
  - `common.schema.json` - shared `$defs` (id patterns, status enums, version, timestamp, `docRef`). Referenced via `$ref` from every other schema.
15
- - `prd`, `req`, `user-story`, `tad`, `tac`, `adr`, `build-sequence`, `fbs`, `test-suite`, `manifest`.
15
+ - `prd`, `req`, `user-story`, `tad`, `tac`, `adr`, `build-sequence`, `fbs`, `test-suite`, `manifest`, `cn`.
16
16
  - **Per-schema docs** in `docs/` (one page per schema) plus cross-cutting `id-conventions.md` and `file-layout.md`.
17
17
  - **JSON test fixtures** in `fixtures/valid/` and `fixtures/invalid/` (every schema covered).
18
18
  - **CHANGELOG** in `CHANGELOG.md`.
@@ -38,7 +38,7 @@ pip install stravica-rcf-schemas
38
38
  Maven coordinate:
39
39
 
40
40
  ```
41
- io.stravica.rcf:rcf-schemas:0.2.0
41
+ io.stravica.rcf:rcf-schemas:0.3.0
42
42
  ```
43
43
 
44
44
  ### Direct fetch (Phase 9 onwards)
@@ -46,7 +46,7 @@ io.stravica.rcf:rcf-schemas:0.2.0
46
46
  Each schema is fetchable by its canonical `$id`:
47
47
 
48
48
  ```
49
- https://schemas.stravica.io/rcf/v0.2.0/<name>.schema.json
49
+ https://schemas.stravica.io/rcf/v0.3.0/<name>.schema.json
50
50
  ```
51
51
 
52
52
  ## Use
@@ -66,7 +66,7 @@ const pkgRoot = require.resolve('@stravica-ai/rcf-schemas/package.json').replace
66
66
 
67
67
  const names = [
68
68
  'common', 'prd', 'req', 'user-story', 'tad', 'tac', 'adr',
69
- 'build-sequence', 'fbs', 'test-suite', 'manifest'
69
+ 'build-sequence', 'fbs', 'test-suite', 'manifest', 'cn'
70
70
  ];
71
71
 
72
72
  const ajv = new Ajv({ strict: true, allErrors: true });
@@ -77,7 +77,7 @@ for (const name of names) {
77
77
  ajv.addSchema(schema);
78
78
  }
79
79
 
80
- const validatePrd = ajv.getSchema('https://schemas.stravica.io/rcf/v0.2.0/prd.schema.json');
80
+ const validatePrd = ajv.getSchema('https://schemas.stravica.io/rcf/v0.3.0/prd.schema.json');
81
81
  const ok = validatePrd(myPrdDoc);
82
82
  if (!ok) console.error(validatePrd.errors);
83
83
  ```
@@ -95,7 +95,7 @@ pkg = files('stravica_rcf_schemas') / 'schemas'
95
95
 
96
96
  names = [
97
97
  'common', 'prd', 'req', 'user-story', 'tad', 'tac', 'adr',
98
- 'build-sequence', 'fbs', 'test-suite', 'manifest'
98
+ 'build-sequence', 'fbs', 'test-suite', 'manifest', 'cn'
99
99
  ]
100
100
 
101
101
  resources = []
@@ -115,9 +115,9 @@ Configure a `SchemaClient` (everit) or `SchemaLoader` (networknt) that resolves
115
115
 
116
116
  ### Any other language
117
117
 
118
- The schemas use JSON Schema Draft 2020-12. Any validator that supports 2020-12 + multi-file `$ref` will work. Register the 11 schemas (with `common.schema.json` first) and resolve by `$id`.
118
+ The schemas use JSON Schema Draft 2020-12. Any validator that supports 2020-12 + multi-file `$ref` will work. Register the 12 schemas (with `common.schema.json` first) and resolve by `$id`.
119
119
 
120
- ## Chain shape (0.2.0)
120
+ ## Chain shape (0.3.0)
121
121
 
122
122
  Every parent-child edge in the RCF chain is encoded exactly once, on the child, as a mandatory `<parent>Id` field. Parents never store child lists; walkers invert the child references at load time to build the `childrenByParent` map. This makes tree drift structurally impossible.
123
123
 
@@ -126,6 +126,7 @@ Every parent-child edge in the RCF chain is encoded exactly once, on the child,
126
126
  - TAD is the root of the architecture chain. TAC and ADR each carry `tadId`.
127
127
  - BS is the root of the build-sequence chain. FBS carries `bsId`, `buildOrder`, `executionStatus`, and `dependsOnFbsIds[]`.
128
128
  - TS carries `usId` and `acIds[]` (the ACs verified). TC lives inline in TS with per-TC `acId`.
129
+ - CN (added 0.3.0) bridges the chain to source code: `implementsAcIds[]` anchors a node to the ACs it satisfies, `dependencies[]` declares CN-to-CN edges. Identity is `path` (optionally `#symbol`-suffixed), not a parent reference - CN sits alongside the chain rather than inside it.
129
130
 
130
131
  ## Schema reference
131
132
 
@@ -134,7 +135,7 @@ Per-schema docs in [`docs/`](./docs/README.md):
134
135
  - [common](./docs/common.md) | [prd](./docs/prd.md) | [req](./docs/req.md) | [user-story](./docs/user-story.md)
135
136
  - [tad](./docs/tad.md) | [tac](./docs/tac.md) | [adr](./docs/adr.md)
136
137
  - [build-sequence](./docs/build-sequence.md) | [fbs](./docs/fbs.md) | [test-suite](./docs/test-suite.md)
137
- - [manifest](./docs/manifest.md)
138
+ - [manifest](./docs/manifest.md) | [cn](./docs/cn.md)
138
139
 
139
140
  Cross-cutting:
140
141
 
package/docs/README.md CHANGED
@@ -17,6 +17,7 @@ One page per schema file under `schemas/`.
17
17
  - [fbs](./fbs.md) - Functional Build Specification.
18
18
  - [test-suite](./test-suite.md) - Test Suite for a single AC.
19
19
  - [manifest](./manifest.md) - project roots-only manifest.
20
+ - [cn](./cn.md) - Code Node, bridging the spec graph to source.
20
21
 
21
22
  ## Cross-cutting
22
23
 
package/docs/adr.md CHANGED
@@ -4,7 +4,7 @@ Architectural Decision Record. One per decision, one file each. Follows the Nyga
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/adr.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/adr.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
@@ -4,7 +4,7 @@ Build Sequence. One per project. Pure planning shell. FBS files each carry the m
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/build-sequence.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/build-sequence.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
package/docs/cn.md ADDED
@@ -0,0 +1,50 @@
1
+ # cn.schema.json
2
+
3
+ Code Node. One file per node. Bridges the requirements graph to source code: identity is a working-tree path, `implementsAcIds` anchors the node into the AC layer, `dependencies` declares CN-to-CN edges.
4
+
5
+ ## Canonical `$id`
6
+
7
+ `https://schemas.stravica.io/rcf/v0.3.0/cn.schema.json`
8
+
9
+ ## Required fields
10
+
11
+ | Field | Type | Notes |
12
+ |---|---|---|
13
+ | `cnId` | `^CN-\d{3,}$` | This node's identifier. |
14
+ | `path` | string, min 1 | Repo-relative source path, optionally `#symbol`-suffixed. |
15
+ | `implementsAcIds` | array of `acId`, `minItems: 0` | Acceptance criteria this node satisfies. May be empty: an orphan CN (utilities, glue, wiring) is a legitimate state. |
16
+ | `version` | semver | Per-document version. |
17
+ | `status` | `cnStatus` enum (`draft`, `approved`, `deprecated`) | Lifecycle status. |
18
+ | `createdAt` / `updatedAt` | ISO 8601 date-time | Lifecycle timestamps. |
19
+
20
+ ## Optional fields
21
+
22
+ | Field | Type | Purpose |
23
+ |---|---|---|
24
+ | `title` | string | Short human-readable label. |
25
+ | `description` | string | Free-form description of what the node does. |
26
+ | `dependencies` | array of `cnId`, `minItems: 0` | Code nodes this node depends on (CN-to-CN edges). Hand-declared. |
27
+
28
+ ## Identity: `path`, optionally `#symbol`-suffixed
29
+
30
+ Two granularities, both supported by the same `path` field:
31
+
32
+ - **File-level:** `"src/store/validator.js"` - coarse "this module serves these ACs" mapping.
33
+ - **Symbol-level:** `"src/store/validator.js#getAjv"` - precise, load-bearing nodes.
34
+
35
+ Granularity is not a stored field. It is fully derivable from the presence of `#` in `path`: a stored copy would be a cross-field consistency bug waiting to happen. A tool that needs to distinguish the two checks for `#` in the path string.
36
+
37
+ The `path` pattern (`^[^#]+(#[A-Za-z_$][A-Za-z0-9_$]*)?$`) allows at most one `#symbol` suffix, and the symbol portion must look like a valid JS/TS identifier start. This is a shape check only: the schema does not (and cannot) verify the path exists or the symbol resolves in any particular working tree. That is validation-time tooling's job, not the schema's.
38
+
39
+ ## Edges
40
+
41
+ - **`implementsAcIds[]`** (CN -> AC): the anchor into the spec graph. May be empty.
42
+ - **`dependencies[]`** (CN -> CN): what this node depends on. Optional, hand-declared in this schema version. Auto-derivation from static analysis tooling is a consumer-side concern, not a schema concern.
43
+
44
+ ## Example
45
+
46
+ See `fixtures/valid/cn/cn-002-comprehensive.json` for a symbol-level CN with both edge types populated.
47
+
48
+ ## Recommended file layout
49
+
50
+ `rcf/code-nodes/`, file naming `cn-NNN.json` (or `CN-NNN.json`; the schema does not constrain filenames). See [file-layout](./file-layout.md).
package/docs/common.md CHANGED
@@ -1,10 +1,10 @@
1
1
  # common.schema.json
2
2
 
3
- Shared `$defs` referenced via `$ref` from every other RCF schema. ID patterns, status enums, version string, timestamp format, and the `docRef` shape live here. This file is not itself a document schema; consumers register it alongside the other 10 schemas at validator init.
3
+ Shared `$defs` referenced via `$ref` from every other RCF schema. ID patterns, status enums, version string, timestamp format, and the `docRef` shape live here. This file is not itself a document schema; consumers register it alongside the other 11 schemas at validator init.
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/common.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/common.schema.json`
8
8
 
9
9
  ## What's in `$defs`
10
10
 
@@ -21,11 +21,13 @@ Shared `$defs` referenced via `$ref` from every other RCF schema. ID patterns, s
21
21
  | `fbsId` | string, `^FBS-\d{3,}$` | `fbs.fbsId`, `fbs.dependsOnFbsIds[]` |
22
22
  | `tsId` | string, `^TS-\d{3}$` | `test-suite.id` |
23
23
  | `tcId` | string, `^TC-\d{3}-[a-z0-9-]+$` | `test-suite.testCases[].id` |
24
+ | `cnId` | string, `^CN-\d{3,}$` | `cn.cnId`, `cn.dependencies[]` |
24
25
  | `version` | string, `^\d+\.\d+\.\d+$` | every doc-type schema |
25
26
  | `timestamp` | string, format `date-time` | every doc-type schema |
26
27
  | `authoringStatus` | enum: `draft`, `review`, `needsRevision`, `approved`, `superseded` | PRD, REQ, US, TAD, TAC, BS |
27
28
  | `adrStatus` | enum: `draft`, `proposed`, `accepted`, `superseded`, `deprecated` | ADR |
28
29
  | `executionStatus` | enum: `notStarted`, `inProgress`, `complete`, `verified` | FBS doc + BS slot |
30
+ | `cnStatus` | enum: `draft`, `approved`, `deprecated` | CN |
29
31
  | `docRef` | object `{ id, path }` | manifest `prd`, `tad`, `bs` |
30
32
 
31
33
  ## Why these are shared
@@ -40,4 +42,4 @@ Per-doc-type enums (REQ `category`, REQ `priority`, FBS `riskLevel`, BS `generat
40
42
 
41
43
  ## Version
42
44
 
43
- Carried on the `$id` URL path segment (`/v0.2.0/`). Bumps in lock-step with the bundle.
45
+ Carried on the `$id` URL path segment (`/v0.3.0/`). Bumps in lock-step with the bundle.
package/docs/fbs.md CHANGED
@@ -6,7 +6,7 @@ Structurally, each FBS carries the mandatory `bsId` back-reference plus `buildOr
6
6
 
7
7
  ## Canonical `$id`
8
8
 
9
- `https://schemas.stravica.io/rcf/v0.2.0/fbs.schema.json`
9
+ `https://schemas.stravica.io/rcf/v0.3.0/fbs.schema.json`
10
10
 
11
11
  ## Required fields
12
12
 
@@ -28,9 +28,12 @@ project-root/
28
28
  | |-- fbs/
29
29
  | | |-- FBS-001.json
30
30
  | | `-- FBS-002.json
31
- | `-- test-suites/
32
- | |-- ts-001.json
33
- | `-- ts-002.json
31
+ | |-- test-suites/
32
+ | | |-- ts-001.json
33
+ | | `-- ts-002.json
34
+ | `-- code-nodes/
35
+ | |-- cn-001.json
36
+ | `-- cn-002.json
34
37
  ```
35
38
 
36
39
  ## Why everything lives under `rcf/`
@@ -58,5 +61,6 @@ Tools that walk from the manifest roots can resolve child paths by convention:
58
61
  - ADR-001 -> `rcf/adrs/ADR-001.json`
59
62
  - FBS-001 -> `rcf/fbs/FBS-001.json`
60
63
  - TS-001 -> `rcf/test-suites/ts-001.json`
64
+ - CN-001 -> `rcf/code-nodes/cn-001.json`
61
65
 
62
66
  A future minor bump may introduce an optional `paths` override block on the manifest for adopters who deviate from the recommendation; 0.2.0 ships convention-only.
@@ -27,6 +27,7 @@ Two families deviate from the family default and are documented alongside their
27
27
  | `FBS` | Functional Build Specification | yes | `fbs.schema.json` |
28
28
  | `TS` | Test Suite | yes (one file per suite, sequential id `TS-\d{3}`) | `test-suite.schema.json` |
29
29
  | `TC` | Test Case | no (nested in TS, id `TC-<TS-suffix>-<slug>`) | `test-suite.schema.json` |
30
+ | `CN` | Code Node | yes | `cn.schema.json` |
30
31
 
31
32
  All prefixes are defined exactly once in `common.schema.json#/$defs` and referenced via `$ref` everywhere.
32
33
 
@@ -49,11 +50,15 @@ Pick per project; the schema does not enforce either form. The published `Stravi
49
50
 
50
51
  Rationale: sequential numbering for TCs is brittle if you renumber; slug-based ids give readable pointers in test-suite bodies and traceability queries.
51
52
 
53
+ ## CN ids
54
+
55
+ `^CN-\d{3,}$`, same shape as the family default. A CN's *identity within the working tree* is a separate field, `path` (optionally `#symbol`-suffixed) - see [cn](./cn.md). The `cnId` is the document id used for cross-references (`dependencies[]`, and inbound from any future kind that anchors to a CN); `path` is what the CN actually points at.
56
+
52
57
  ## File-level vs nested-level: the asymmetry
53
58
 
54
59
  | Lives in its own file | Lives nested inside a parent |
55
60
  |---|---|
56
- | PRD, REQ, US, TAD, TAC, ADR, BS, FBS, TS | AC (inside US), TC (inside TS) |
61
+ | PRD, REQ, US, TAD, TAC, ADR, BS, FBS, TS, CN | AC (inside US), TC (inside TS) |
57
62
 
58
63
  **The rule:** narrative-heavy structured documents that grow over time live in their own files (per-doc git history, parallel-safe authoring, no merge conflict on append). Tightly-coupled child structures (AC inside US, TC inside TS) stay nested, splitting them multiplies file counts without benefit.
59
64
 
package/docs/manifest.md CHANGED
@@ -4,7 +4,7 @@ Project manifest. Roots-only shape: declares `prd`, `tad`, `bs`. Children are ow
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/manifest.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/manifest.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
@@ -39,11 +39,13 @@ Both fields are required.
39
39
 
40
40
  Singular by design; no child arrays:
41
41
 
42
- - No `userStories[]`, `tacs[]`, `adrs[]`, `fbs[]`, `testSuites[]`, `requirements[]`.
42
+ - No `userStories[]`, `tacs[]`, `adrs[]`, `fbs[]`, `testSuites[]`, `requirements[]`, `codeNodes[]`.
43
43
  - No `prds: [...]` array (single-PRD per project).
44
44
  - No `activePrdId` (multi-PRD assumption retired).
45
45
  - No `buildSequence` (renamed to `bs` for abbreviation consistency with `prd`, `tad`, `fbs`, `tac`, `adr`).
46
46
 
47
+ CN (added 0.3.0) follows the same rule as every other non-root kind: no manifest field. Discovery is by the convention-derived path (see [file-layout](./file-layout.md)), same as TAC, ADR, FBS and TS.
48
+
47
49
  ## Why roots-only
48
50
 
49
51
  SSoT discipline. Every parent-child edge is encoded exactly once, on the child, as a mandatory `<parent>Id` field:
package/docs/prd.md CHANGED
@@ -4,7 +4,7 @@ Product Requirements Document. One per project. Pure shell document; REQ bodies
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/prd.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/prd.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
package/docs/req.md CHANGED
@@ -4,7 +4,7 @@ Individual Requirement within a PRD. One file per REQ. Recommended path: `rcf/re
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/req.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/req.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
package/docs/tac.md CHANGED
@@ -4,7 +4,7 @@ Technical Architecture Component. One file per architectural component. Verbose
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/tac.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/tac.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
package/docs/tad.md CHANGED
@@ -4,7 +4,7 @@ Master Technical Architecture Document. One per project. Pure shell for cross-cu
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/tad.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/tad.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
@@ -4,7 +4,7 @@ Test Suite. One file per Test Suite. The JSON specification of what Test Cases e
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/test-suite.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/test-suite.schema.json`
8
8
 
9
9
  ## TS-as-JSON: what this schema is for
10
10
 
@@ -4,7 +4,7 @@ User Story document. One file per US. Contains Acceptance Criteria inline as `ac
4
4
 
5
5
  ## Canonical `$id`
6
6
 
7
- `https://schemas.stravica.io/rcf/v0.2.0/user-story.schema.json`
7
+ `https://schemas.stravica.io/rcf/v0.3.0/user-story.schema.json`
8
8
 
9
9
  ## Required fields
10
10
 
@@ -0,0 +1,9 @@
1
+ {
2
+ "cnId": "CODE-001",
3
+ "path": "src/store/validator.js",
4
+ "implementsAcIds": [],
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "createdAt": "2026-01-01T00:00:00Z",
8
+ "updatedAt": "2026-01-01T00:00:00Z"
9
+ }
@@ -0,0 +1,8 @@
1
+ {
2
+ "cnId": "CN-001",
3
+ "path": "src/store/validator.js",
4
+ "version": "0.1.0",
5
+ "status": "draft",
6
+ "createdAt": "2026-01-01T00:00:00Z",
7
+ "updatedAt": "2026-01-01T00:00:00Z"
8
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "cnId": "CN-001",
3
+ "path": "src/store/validator.js",
4
+ "granularity": "file",
5
+ "implementsAcIds": [],
6
+ "version": "0.1.0",
7
+ "status": "draft",
8
+ "createdAt": "2026-01-01T00:00:00Z",
9
+ "updatedAt": "2026-01-01T00:00:00Z"
10
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "cnId": "CN-001",
3
+ "path": "src/store/validator.js",
4
+ "implementsAcIds": [],
5
+ "dependencies": ["not-a-cn-id"],
6
+ "version": "0.1.0",
7
+ "status": "draft",
8
+ "createdAt": "2026-01-01T00:00:00Z",
9
+ "updatedAt": "2026-01-01T00:00:00Z"
10
+ }
@@ -0,0 +1,9 @@
1
+ {
2
+ "cnId": "CN-001",
3
+ "path": "src/store/validator.js",
4
+ "implementsAcIds": [],
5
+ "version": "0.1.0",
6
+ "status": "draft",
7
+ "createdAt": "2026-01-01T00:00:00Z",
8
+ "updatedAt": "2026-01-01T00:00:00Z"
9
+ }
@@ -0,0 +1,12 @@
1
+ {
2
+ "cnId": "CN-042",
3
+ "path": "src/store/validator.js#getAjv",
4
+ "title": "getAjv",
5
+ "description": "Builds and caches the configured ajv instance used across the validate pipeline.",
6
+ "implementsAcIds": ["AC-101-1", "AC-101-2"],
7
+ "dependencies": ["CN-006", "CN-011"],
8
+ "version": "1.0.0",
9
+ "status": "approved",
10
+ "createdAt": "2026-01-01T00:00:00Z",
11
+ "updatedAt": "2026-07-09T12:00:00Z"
12
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@stravica-ai/rcf-schemas",
3
- "version": "0.2.1",
3
+ "version": "0.3.0",
4
4
  "type": "module",
5
5
  "description": "JSON Schemas for the Requirements Confidence Framework (RCF). Language-neutral. The contract every RCF tool keys to.",
6
6
  "license": "Apache-2.0",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/adr.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/adr.schema.json",
4
4
  "title": "RCF Architectural Decision Record",
5
5
  "description": "Architectural Decision Record. One per decision, one file each. Nygard / MADR convention.",
6
6
  "type": "object",
@@ -19,11 +19,11 @@
19
19
  "updatedAt"
20
20
  ],
21
21
  "properties": {
22
- "adrId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/adrId" },
23
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
24
- "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tadId" },
25
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
26
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/adrStatus" },
22
+ "adrId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/adrId" },
23
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
24
+ "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tadId" },
25
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
26
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/adrStatus" },
27
27
 
28
28
  "title": { "type": "string", "minLength": 1 },
29
29
  "context": { "type": "string", "minLength": 1 },
@@ -34,14 +34,14 @@
34
34
  "items": { "$ref": "#/$defs/alternative" }
35
35
  },
36
36
 
37
- "supersededBy": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/adrId" },
37
+ "supersededBy": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/adrId" },
38
38
  "relatedAdrs": {
39
39
  "type": "array",
40
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/adrId" }
40
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/adrId" }
41
41
  },
42
42
 
43
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
44
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
43
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
44
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
45
45
  },
46
46
  "$defs": {
47
47
  "alternative": {
@@ -1,22 +1,22 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/build-sequence.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/build-sequence.schema.json",
4
4
  "title": "RCF Build Sequence",
5
5
  "description": "One per project. Pure planning shell. FBSs each carry the mandatory bsId parent reference plus buildOrder; the ordered FBS list is computed by loading every FBS under rcf/fbs/, filtering by bsId, and sorting by buildOrder. Duplicate buildOrder within one BS is a validation error at load time.",
6
6
  "type": "object",
7
7
  "additionalProperties": false,
8
8
  "required": ["bsId", "prdId", "version", "status", "createdAt", "updatedAt"],
9
9
  "properties": {
10
- "bsId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/bsId" },
11
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
12
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
13
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
10
+ "bsId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/bsId" },
11
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
12
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
13
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
14
14
  "title": { "type": "string" },
15
15
  "buildPhilosophy": { "type": "string" },
16
16
  "generationStrategy": {
17
17
  "enum": ["verticalSlice", "dependencyFirst", "domainGrouped", "riskFrontLoaded"]
18
18
  },
19
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
20
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
19
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
20
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
21
21
  }
22
22
  }
@@ -0,0 +1,36 @@
1
+ {
2
+ "$schema": "https://json-schema.org/draft/2020-12/schema",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/cn.schema.json",
4
+ "title": "RCF Code Node",
5
+ "description": "Code Node document. One file per node. Identity is a working-tree path, optionally #symbol-suffixed; granularity (file vs symbol) is derived from the presence of '#', never stored. Bridges the spec graph to source: implementsAcIds anchors the node into the AC layer, dependencies declares CN-to-CN edges.",
6
+ "type": "object",
7
+ "additionalProperties": false,
8
+ "required": ["cnId", "path", "implementsAcIds", "version", "status", "createdAt", "updatedAt"],
9
+ "properties": {
10
+ "cnId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/cnId" },
11
+ "path": {
12
+ "type": "string",
13
+ "minLength": 1,
14
+ "pattern": "^[^#]+(#[A-Za-z_$][A-Za-z0-9_$]*)?$",
15
+ "description": "Repo-relative source path, optionally #symbol-suffixed (e.g. \"src/store/validator.js\" or \"src/store/validator.js#getAjv\")."
16
+ },
17
+ "title": { "type": "string", "minLength": 1 },
18
+ "description": { "type": "string" },
19
+ "implementsAcIds": {
20
+ "type": "array",
21
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/acId" },
22
+ "minItems": 0,
23
+ "description": "Acceptance criteria this code node satisfies. May be empty: an orphan CN (utilities, glue, wiring) is a legitimate state."
24
+ },
25
+ "dependencies": {
26
+ "type": "array",
27
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/cnId" },
28
+ "minItems": 0,
29
+ "description": "Code nodes this node depends on (CN-to-CN edges). Hand-declared in v1."
30
+ },
31
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
32
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/cnStatus" },
33
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
34
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
35
+ }
36
+ }
@@ -1,8 +1,8 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json",
4
4
  "title": "RCF Shared Definitions",
5
- "description": "Shared $defs referenced via $ref from every other RCF schema. ID patterns, status enums, version string, timestamp format, and the docRef shape. This file is not a document schema; consumers register it alongside the 10 doc-type schemas at validator init.",
5
+ "description": "Shared $defs referenced via $ref from every other RCF schema. ID patterns, status enums, version string, timestamp format, and the docRef shape. This file is not a document schema; consumers register it alongside the 11 doc-type schemas at validator init.",
6
6
  "$defs": {
7
7
  "prdId": {
8
8
  "type": "string",
@@ -59,6 +59,11 @@
59
59
  "pattern": "^TC-\\d{3}-[a-z0-9-]+$",
60
60
  "description": "Test Case identifier. TS suffix (three digits) joined to a lowercase alphanumeric slug."
61
61
  },
62
+ "cnId": {
63
+ "type": "string",
64
+ "pattern": "^CN-\\d{3,}$",
65
+ "description": "Code Node identifier. Three-digit minimum, unbounded above."
66
+ },
62
67
  "version": {
63
68
  "type": "string",
64
69
  "pattern": "^\\d+\\.\\d+\\.\\d+$",
@@ -81,6 +86,10 @@
81
86
  "enum": ["notStarted", "inProgress", "complete", "verified"],
82
87
  "description": "Execution-state status for FBS documents and FBS slots within a Build Sequence."
83
88
  },
89
+ "cnStatus": {
90
+ "enum": ["draft", "approved", "deprecated"],
91
+ "description": "Lifecycle status for Code Node documents."
92
+ },
84
93
  "docRef": {
85
94
  "type": "object",
86
95
  "additionalProperties": false,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/fbs.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/fbs.schema.json",
4
4
  "title": "RCF Functional Build Spec",
5
5
  "description": "Functional Build Specification. One per build session. Carries the mandatory bsId parent reference plus buildOrder and executionStatus. Owns its acIds[] scope (Acceptance Criteria delivered by this FBS) and its dependsOnFbsIds[] graph edge (other FBSs this one depends on).",
6
6
  "type": "object",
@@ -19,23 +19,23 @@
19
19
  "updatedAt"
20
20
  ],
21
21
  "properties": {
22
- "fbsId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/fbsId" },
23
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
24
- "bsId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/bsId" },
22
+ "fbsId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/fbsId" },
23
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
24
+ "bsId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/bsId" },
25
25
  "buildOrder": { "type": "integer", "minimum": 1 },
26
- "executionStatus": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/executionStatus" },
26
+ "executionStatus": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/executionStatus" },
27
27
  "title": { "type": "string", "minLength": 1 },
28
28
  "summary": { "type": "string", "minLength": 1 },
29
29
  "approach": { "type": "string" },
30
30
  "acIds": {
31
31
  "type": "array",
32
32
  "minItems": 1,
33
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" }
33
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/acId" }
34
34
  },
35
35
  "dependsOnFbsIds": {
36
36
  "type": "array",
37
37
  "minItems": 0,
38
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/fbsId" }
38
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/fbsId" }
39
39
  },
40
40
  "contextRequirements": {
41
41
  "type": "object",
@@ -51,11 +51,11 @@
51
51
  },
52
52
  "tacIds": {
53
53
  "type": "array",
54
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tacId" }
54
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tacId" }
55
55
  },
56
56
  "adrIds": {
57
57
  "type": "array",
58
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/adrId" }
58
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/adrId" }
59
59
  },
60
60
  "existingModules": {
61
61
  "type": "array",
@@ -84,7 +84,7 @@
84
84
  "riskLevel": { "enum": ["low", "medium", "high"] },
85
85
  "domain": { "type": "string" },
86
86
  "notes": { "type": "string" },
87
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
88
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
87
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
88
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
89
89
  }
90
90
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/manifest.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/manifest.schema.json",
4
4
  "title": "RCF Project Manifest",
5
5
  "description": "Project manifest. Roots-only shape: declares prd, tad, bs. Children are owned by their parents and discovered by walking from the roots.",
6
6
  "type": "object",
@@ -10,8 +10,8 @@
10
10
  "version": { "type": "string", "const": "2.0.0" },
11
11
  "projectName": { "type": "string", "minLength": 1 },
12
12
  "description": { "type": "string" },
13
- "prd": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/docRef" },
14
- "tad": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/docRef" },
15
- "bs": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/docRef" }
13
+ "prd": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/docRef" },
14
+ "tad": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/docRef" },
15
+ "bs": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/docRef" }
16
16
  }
17
17
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/prd.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/prd.schema.json",
4
4
  "title": "RCF PRD",
5
5
  "description": "Product Requirements Document. One per project. The PRD is a pure shell document; requirement bodies live in individual req.schema.json files and each REQ carries the mandatory prdId back-reference. The walker computes the PRD's requirement list by inverting REQ.prdId at load time.",
6
6
  "type": "object",
@@ -16,10 +16,10 @@
16
16
  "updatedAt"
17
17
  ],
18
18
  "properties": {
19
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
19
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
20
20
  "productName": { "type": "string", "minLength": 1 },
21
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
22
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
21
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
22
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
23
23
  "executiveSummary": { "type": "string" },
24
24
  "problemStatement": { "type": "string", "minLength": 1 },
25
25
  "targetUsers": {
@@ -43,7 +43,7 @@
43
43
  "type": "array",
44
44
  "items": { "type": "string", "minLength": 1 }
45
45
  },
46
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
47
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
46
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
47
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
48
48
  }
49
49
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/req.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/req.schema.json",
4
4
  "title": "RCF Requirement",
5
5
  "description": "Individual requirement within a PRD. One file per requirement. Recommended path: rcf/requirements/REQ-001.json. Carries the mandatory prdId parent reference; the PRD does not list its requirements.",
6
6
  "type": "object",
@@ -19,8 +19,8 @@
19
19
  "updatedAt"
20
20
  ],
21
21
  "properties": {
22
- "reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/reqId" },
23
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
22
+ "reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/reqId" },
23
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
24
24
  "title": { "type": "string", "minLength": 1 },
25
25
  "description": { "type": "string", "minLength": 1 },
26
26
  "category": { "enum": ["functional", "nonFunctional", "technical", "security"] },
@@ -31,9 +31,9 @@
31
31
  "type": "array",
32
32
  "items": { "type": "string" }
33
33
  },
34
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
35
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
36
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
37
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
34
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
35
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
36
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
37
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
38
38
  }
39
39
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/tac.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/tac.schema.json",
4
4
  "title": "RCF Technical Architecture Component",
5
5
  "description": "One per architectural component. Verbose per-component descriptions are fine; the schema does not constrain length.",
6
6
  "type": "object",
@@ -18,11 +18,11 @@
18
18
  "updatedAt"
19
19
  ],
20
20
  "properties": {
21
- "tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tacId" },
22
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
23
- "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tadId" },
24
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
25
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
21
+ "tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tacId" },
22
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
23
+ "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tadId" },
24
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
25
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
26
26
 
27
27
  "name": { "type": "string", "minLength": 1 },
28
28
  "purpose": { "type": "string", "minLength": 1 },
@@ -44,8 +44,8 @@
44
44
  "tradeoffs": { "type": "string" },
45
45
  "notes": { "type": "string" },
46
46
 
47
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
48
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
47
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
48
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
49
49
  },
50
50
  "$defs": {
51
51
  "interfaceDef": {
@@ -65,7 +65,7 @@
65
65
  "properties": {
66
66
  "name": { "type": "string", "minLength": 1 },
67
67
  "kind": { "enum": ["tac", "external"] },
68
- "tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tacId" },
68
+ "tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tacId" },
69
69
  "description": { "type": "string" }
70
70
  }
71
71
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/tad.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/tad.schema.json",
4
4
  "title": "RCF Technical Architecture Document",
5
5
  "description": "Master Technical Architecture Document. One per project. TACs and ADRs each carry the mandatory tadId parent reference; the TAD does not list them. The walker computes both children lists by inverting TAC.tadId and ADR.tadId at load time. The schema defines the FULL set of possible sections; what's required for a given project is a tooling decision.",
6
6
  "type": "object",
@@ -15,10 +15,10 @@
15
15
  "updatedAt"
16
16
  ],
17
17
  "properties": {
18
- "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tadId" },
19
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
20
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
21
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
18
+ "tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tadId" },
19
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
20
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
21
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
22
22
 
23
23
  "systemOverview": { "$ref": "#/$defs/systemOverview" },
24
24
 
@@ -32,8 +32,8 @@
32
32
  "deploymentArchitecture": { "$ref": "#/$defs/deploymentArchitecture" },
33
33
  "operationalConcerns": { "$ref": "#/$defs/operationalConcerns" },
34
34
 
35
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
36
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
35
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
36
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
37
37
  },
38
38
  "$defs": {
39
39
  "systemOverview": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/test-suite.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/test-suite.schema.json",
4
4
  "title": "RCF Test Suite",
5
5
  "description": "One file per Test Suite. Verifies one or more Acceptance Criteria (on the User Story identified by usId) via inline Test Cases. Test Suites hold the AC references; ACs stay clean of downstream references. Test-run status per TC is authored (Phase 3.7) and later derived from real test runs (Phase 6+).",
6
6
  "type": "object",
@@ -18,24 +18,24 @@
18
18
  "updatedAt"
19
19
  ],
20
20
  "properties": {
21
- "id": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tsId" },
22
- "usId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/usId" },
21
+ "id": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tsId" },
22
+ "usId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/usId" },
23
23
  "title": { "type": "string", "minLength": 1 },
24
24
  "purpose": { "type": "string", "minLength": 1 },
25
25
  "testLevel": { "enum": ["unit", "integration", "e2e", "contract", "manual"] },
26
26
  "acIds": {
27
27
  "type": "array",
28
28
  "minItems": 1,
29
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" }
29
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/acId" }
30
30
  },
31
31
  "testCases": {
32
32
  "type": "array",
33
33
  "minItems": 0,
34
34
  "items": { "$ref": "#/$defs/testCase" }
35
35
  },
36
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
37
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
38
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
36
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
37
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
38
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
39
39
  },
40
40
  "$defs": {
41
41
  "testCase": {
@@ -48,7 +48,7 @@
48
48
  "pattern": "^TC-\\d{3}-[a-z0-9-]+$",
49
49
  "description": "Test Case identifier. TS suffix (three digits) joined to a lowercase alphanumeric slug (hyphens allowed)."
50
50
  },
51
- "acId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" },
51
+ "acId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/acId" },
52
52
  "description": { "type": "string", "minLength": 1 },
53
53
  "testPointer": {
54
54
  "type": "string",
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "$schema": "https://json-schema.org/draft/2020-12/schema",
3
- "$id": "https://schemas.stravica.io/rcf/v0.2.0/user-story.schema.json",
3
+ "$id": "https://schemas.stravica.io/rcf/v0.3.0/user-story.schema.json",
4
4
  "title": "RCF User Story",
5
5
  "description": "User Story document. One file per US. Contains its Acceptance Criteria inline as acceptanceCriteria[].",
6
6
  "type": "object",
@@ -20,11 +20,11 @@
20
20
  "updatedAt"
21
21
  ],
22
22
  "properties": {
23
- "usId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/usId" },
24
- "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/prdId" },
25
- "reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/reqId" },
26
- "version": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/version" },
27
- "status": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/authoringStatus" },
23
+ "usId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/usId" },
24
+ "prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/prdId" },
25
+ "reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/reqId" },
26
+ "version": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/version" },
27
+ "status": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/authoringStatus" },
28
28
  "title": { "type": "string", "minLength": 1 },
29
29
  "description": { "type": "string" },
30
30
  "asA": { "type": "string", "minLength": 1 },
@@ -38,10 +38,10 @@
38
38
  "tacIds": {
39
39
  "type": "array",
40
40
  "minItems": 0,
41
- "items": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/tacId" }
41
+ "items": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/tacId" }
42
42
  },
43
- "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" },
44
- "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/timestamp" }
43
+ "createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" },
44
+ "updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/timestamp" }
45
45
  },
46
46
  "$defs": {
47
47
  "acceptanceCriterion": {
@@ -49,7 +49,7 @@
49
49
  "additionalProperties": false,
50
50
  "required": ["id", "description", "testable"],
51
51
  "properties": {
52
- "id": { "$ref": "https://schemas.stravica.io/rcf/v0.2.0/common.schema.json#/$defs/acId" },
52
+ "id": { "$ref": "https://schemas.stravica.io/rcf/v0.3.0/common.schema.json#/$defs/acId" },
53
53
  "description": { "type": "string", "minLength": 1 },
54
54
  "given": { "type": "string" },
55
55
  "when": { "type": "string" },