@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 +19 -0
- package/README.md +12 -11
- package/docs/README.md +1 -0
- package/docs/adr.md +1 -1
- package/docs/build-sequence.md +1 -1
- package/docs/cn.md +50 -0
- package/docs/common.md +5 -3
- package/docs/fbs.md +1 -1
- package/docs/file-layout.md +7 -3
- package/docs/id-conventions.md +6 -1
- package/docs/manifest.md +4 -2
- package/docs/prd.md +1 -1
- package/docs/req.md +1 -1
- package/docs/tac.md +1 -1
- package/docs/tad.md +1 -1
- package/docs/test-suite.md +1 -1
- package/docs/user-story.md +1 -1
- package/fixtures/invalid/cn/cn-001-bad-cnid-prefix.json +9 -0
- package/fixtures/invalid/cn/cn-002-missing-implementsacids.json +8 -0
- package/fixtures/invalid/cn/cn-003-legacy-granularity-field.json +10 -0
- package/fixtures/invalid/cn/cn-004-bad-dependency-shape.json +10 -0
- package/fixtures/valid/cn/cn-001-minimal.json +9 -0
- package/fixtures/valid/cn/cn-002-comprehensive.json +12 -0
- package/package.json +1 -1
- package/schemas/adr.schema.json +10 -10
- package/schemas/build-sequence.schema.json +7 -7
- package/schemas/cn.schema.json +36 -0
- package/schemas/common.schema.json +11 -2
- package/schemas/fbs.schema.json +11 -11
- package/schemas/manifest.schema.json +4 -4
- package/schemas/prd.schema.json +6 -6
- package/schemas/req.schema.json +7 -7
- package/schemas/tac.schema.json +9 -9
- package/schemas/tad.schema.json +7 -7
- package/schemas/test-suite.schema.json +8 -8
- package/schemas/user-story.schema.json +10 -10
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.
|
|
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
|
-
- **
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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.
|
|
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
package/docs/build-sequence.md
CHANGED
|
@@ -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.
|
|
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
|
|
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.
|
|
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.
|
|
45
|
+
Carried on the `$id` URL path segment (`/v0.3.0/`). Bumps in lock-step with the bundle.
|
package/docs/fbs.md
CHANGED
package/docs/file-layout.md
CHANGED
|
@@ -28,9 +28,12 @@ project-root/
|
|
|
28
28
|
| |-- fbs/
|
|
29
29
|
| | |-- FBS-001.json
|
|
30
30
|
| | `-- FBS-002.json
|
|
31
|
-
|
|
|
32
|
-
|
|
|
33
|
-
|
|
|
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.
|
package/docs/id-conventions.md
CHANGED
|
@@ -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.
|
|
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
package/docs/req.md
CHANGED
package/docs/tac.md
CHANGED
package/docs/tad.md
CHANGED
package/docs/test-suite.md
CHANGED
|
@@ -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.
|
|
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
|
|
package/docs/user-story.md
CHANGED
|
@@ -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
package/schemas/adr.schema.json
CHANGED
|
@@ -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.
|
|
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.
|
|
23
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
24
|
-
"tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
25
|
-
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
26
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
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.
|
|
44
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
11
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
12
|
-
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
13
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
20
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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
|
|
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,
|
package/schemas/fbs.schema.json
CHANGED
|
@@ -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.
|
|
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.
|
|
23
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
24
|
-
"bsId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
88
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
14
|
-
"tad": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
15
|
-
"bs": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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
|
}
|
package/schemas/prd.schema.json
CHANGED
|
@@ -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.
|
|
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.
|
|
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.
|
|
22
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
47
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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
|
}
|
package/schemas/req.schema.json
CHANGED
|
@@ -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.
|
|
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.
|
|
23
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
35
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
36
|
-
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
37
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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
|
}
|
package/schemas/tac.schema.json
CHANGED
|
@@ -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.
|
|
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.
|
|
22
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
23
|
-
"tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
24
|
-
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
25
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
48
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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
|
}
|
package/schemas/tad.schema.json
CHANGED
|
@@ -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.
|
|
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.
|
|
19
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
20
|
-
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
21
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
36
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
22
|
-
"usId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
37
|
-
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
38
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
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.
|
|
24
|
-
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
25
|
-
"reqId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
26
|
-
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
27
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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.
|
|
44
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
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.
|
|
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" },
|