@stravica-ai/rcf-schemas 0.4.5 → 0.5.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 +28 -0
- package/README.md +2 -2
- package/docs/adr.md +1 -1
- package/docs/build-sequence.md +1 -1
- package/docs/cn.md +1 -1
- package/docs/common.md +1 -1
- package/docs/fbs.md +1 -1
- package/docs/manifest.md +1 -1
- 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 +6 -2
- package/docs/user-story.md +1 -1
- package/fixtures/invalid/test-suite/ts-008-passing-tc-missing-testpointer.json +19 -0
- package/fixtures/invalid/test-suite/ts-009-failing-tc-missing-testpointer.json +19 -0
- package/fixtures/invalid/test-suite/ts-010-empty-testpointer.json +20 -0
- package/fixtures/valid/test-suite/ts-003-runtime-provenance.json +1 -0
- package/fixtures/valid/test-suite/ts-004-widened-tsId.json +2 -0
- package/fixtures/valid/test-suite/ts-006-testpointer-conditional.json +46 -0
- package/package.json +6 -6
- package/schemas/adr.schema.json +10 -10
- package/schemas/build-sequence.schema.json +7 -7
- package/schemas/cn.schema.json +8 -8
- package/schemas/common.schema.json +1 -1
- package/schemas/fbs.schema.json +17 -17
- package/schemas/manifest.schema.json +51 -51
- package/schemas/prd.schema.json +6 -6
- package/schemas/req.schema.json +9 -9
- package/schemas/tac.schema.json +9 -9
- package/schemas/tad.schema.json +7 -7
- package/schemas/test-suite.schema.json +29 -12
- package/schemas/user-story.schema.json +13 -13
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,34 @@ 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.5.0 - 2026-08-28
|
|
8
|
+
|
|
9
|
+
Minor bump for the `testPointer` conditional-by-status ruling (`w-2026-08-27-dave-001`, Baz ratified 2026-08-27). `testPointer` on a Test Case is now REQUIRED when the TC's `status` is `passing` or `failing`, and OPTIONAL when the TC's `status` is `pending` or `skipped`. This closes the "a passing verdict may point at nothing" hole the 0.4.x shape allowed and moves the durable landing point for the rule out of `rcf-lite`'s local strictness overlay (`w-2026-07-28-005`) into the shared schema, where every consumer inherits it uniformly.
|
|
10
|
+
|
|
11
|
+
### Changed
|
|
12
|
+
|
|
13
|
+
- **`test-suite.schema.json`**: `$defs.testCase.testPointer` gains `minLength: 1` (a `testPointer` present at all must be non-empty; empty-string pointers were the same class of dishonest-coverage failure as absent pointers). A new `allOf` clause on `$defs.testCase` conditionally requires `testPointer` when `status` is `passing` or `failing`; other statuses may still omit it. The `additionalProperties: false` guarantee is preserved: nothing new is permitted; only the requiredness on one existing field is tightened for two of the four status values.
|
|
14
|
+
- **Canonical `$id`** URLs bumped from `https://schemas.stravica.io/rcf/v0.4.0/...` to `https://schemas.stravica.io/rcf/v0.5.0/...` on every schema, in lock-step with the bundle version. Matches the precedent set at 0.3.0 and 0.4.0 (patch releases keep the URL pinned; minor releases bump the URL). No consumer in the Stravica org hard-codes the URL literal (org-wide search 2026-08-28 hit only this repo's own files); `rcf-lite`, `rcf-build-lite`, `rcf-tools`, and every persona-run repo load schemas by file path and register with whatever `$id` the file declares.
|
|
15
|
+
- **Documentation URLs bumped in lock-step.** The `docs/*.md` canonical-`$id` references were stale on `v0.3.0` (never bumped at 0.4.0); this release syncs every doc page and the `README.md` code example to `v0.5.0`.
|
|
16
|
+
|
|
17
|
+
### Added
|
|
18
|
+
|
|
19
|
+
- **Fixtures (valid)**: `fixtures/valid/test-suite/ts-006-testpointer-conditional.json` (a five-TC suite exercising every branch: passing+pointer, failing+pointer, pending without pointer, skipped without pointer, and pending with a declared-intent pointer).
|
|
20
|
+
- **Fixtures (invalid)**: `fixtures/invalid/test-suite/ts-008-passing-tc-missing-testpointer.json`, `fixtures/invalid/test-suite/ts-009-failing-tc-missing-testpointer.json` (the two directions of the new required rule), `fixtures/invalid/test-suite/ts-010-empty-testpointer.json` (the `minLength: 1` guard against empty-string pointers).
|
|
21
|
+
- **Tests**: `test/test-suite.test.js` gains the conditional-required cases (pending/skipped without pointer still valid; passing/failing without pointer rejected with an error referencing `testPointer`; passing/failing with pointer valid; pending/skipped may still carry a declared pointer; empty-string pointer rejected; mixed-status suite valid). Existing tests that constructed `status: passing` TCs without `testPointer` were updated to include a pointer so they exercise their originally intended assertion (id-slug pattern, scope tags, runtime provenance, and so on) rather than fail on the new rule.
|
|
22
|
+
|
|
23
|
+
### Migration
|
|
24
|
+
|
|
25
|
+
- **Pre-0.5.0 docs with only `pending`/`skipped` TCs missing `testPointer`**: remain valid unchanged.
|
|
26
|
+
- **Pre-0.5.0 docs with `passing` or `failing` TCs missing `testPointer`**: were already dishonest coverage claims; validate against 0.5.0 by either (a) adding the real `testPointer` (the honest fix; the pointer is what the TC is asserting exists), or (b) downgrading the TC to `pending` or `skipped` if no executable landed. `rcf-lite`'s pre-0.5.0 strictness overlay already forced this in practice for tools that ran through the CLI; 0.5.0 makes the schema the single source of truth.
|
|
27
|
+
- **`rcf-lite` consumers**: the durable landing was called out in `rcf-lite`'s own overlay comment ("drop this block when that ships"). A follow-up `rcf-lite` release pins `@stravica-ai/rcf-schemas` to `0.5.0` and removes the local overlay so validation is inherited from the schema uniformly.
|
|
28
|
+
|
|
29
|
+
### Notes
|
|
30
|
+
|
|
31
|
+
- Pre-1.0 semver convention (repo has followed this since 0.1.0): breaking-in-any-direction schema changes bump minor. This release breaks docs that authored dishonest `passing`/`failing`-without-pointer TCs; hence 0.5.0, not a patch.
|
|
32
|
+
- The rule is expressed as an `allOf` with an `if`/`then` conditional (the same pattern 0.4.2 used for per-kind `testTheatreFinding.tsId` requiredness). Ajv strict mode requires `testPointer` to be redeclared inside `then.properties`; the redeclaration mirrors the outer shape (`type: string, minLength: 1`) and is not an independent constraint.
|
|
33
|
+
- The 0.4.4 `back-compat-freeze.test.js` byte-for-byte pin is on a manifest fixture (`manifest-011-preblueprint-chain-frozen.json`) and is untouched by this release; it continues to pass on 0.5.0.
|
|
34
|
+
|
|
7
35
|
## 0.4.5 - 2026-08-19
|
|
8
36
|
|
|
9
37
|
Additive patch bump for the blueprint conflict-resolution mechanism landing in `rcf-lite` Phase 3.5. Adds the schema seam the `rcf blueprint supersede` and `rcf blueprint add --resolve` verbs key to, so a project can record an operator ruling that resolves a cross-blueprint conflict on a scope:global ADR topic. Every change is additive: every 0.4.4-valid document remains valid, and every existing id continues to validate byte-for-byte.
|
package/README.md
CHANGED
|
@@ -46,7 +46,7 @@ io.stravica.rcf:rcf-schemas:0.3.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.5.0/<name>.schema.json
|
|
50
50
|
```
|
|
51
51
|
|
|
52
52
|
## Use
|
|
@@ -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.5.0/prd.schema.json');
|
|
81
81
|
const ok = validatePrd(myPrdDoc);
|
|
82
82
|
if (!ok) console.error(validatePrd.errors);
|
|
83
83
|
```
|
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.5.0/build-sequence.schema.json`
|
|
8
8
|
|
|
9
9
|
## Required fields
|
|
10
10
|
|
package/docs/cn.md
CHANGED
package/docs/common.md
CHANGED
package/docs/fbs.md
CHANGED
package/docs/manifest.md
CHANGED
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.5.0/test-suite.schema.json`
|
|
8
8
|
|
|
9
9
|
## TS-as-JSON: what this schema is for
|
|
10
10
|
|
|
@@ -39,10 +39,14 @@ Each entry in `testCases[]`:
|
|
|
39
39
|
| `id` | `^TC-\d{3,}-[a-z0-9-]+$` | yes | TC identifier. `TC-<TS-suffix>-<slug>`; slug is a lowercase alphanumeric identifier (hyphens allowed). Slug uniqueness is within-TS, not global. TS-suffix widened to three-digit minimum, unbounded above (0.4.3). |
|
|
40
40
|
| `acId` | `^AC-\d{3,}(-\d+)?$` | yes | Which AC on the parent US this TC verifies. |
|
|
41
41
|
| `description` | string, min 1 | yes | What the TC covers. |
|
|
42
|
-
| `testPointer` | string |
|
|
42
|
+
| `testPointer` | string, min 1 | conditional | Pointer to the executable test, `filePath::testName` format. **Required** when `status` is `passing` or `failing` (a passing or failing verdict claims coverage and must point at the test that produced the verdict). **Optional** when `status` is `pending` or `skipped` (no executable test has landed yet, and there is nothing honest to point at). Non-empty when present. Behaviour ratified 2026-08-27; landed in 0.5.0. |
|
|
43
43
|
| `status` | enum | yes | `pending`, `passing`, `failing`, `skipped`. Authored in 0.2.0; derived from real test runs in Phase 6+. |
|
|
44
44
|
| `scope` | `scopeTag` enum | no | `library`, `runtime`, `deployed`, `unclassified`. Optional at schema level (0.4.3). Ruleset-enforcing consumers may require the TC scope to be equal to or wider than the covered AC's scope. |
|
|
45
45
|
|
|
46
|
+
## What changed in 0.5.0
|
|
47
|
+
|
|
48
|
+
`testPointer` moved from unconditionally-optional to conditionally-required by `status`. A TC with `status: passing` or `status: failing` MUST carry a non-empty `testPointer`; a TC with `status: pending` or `status: skipped` MAY omit it (and may still declare a planned pointer). The old shape (unconditionally optional) let a TC claim a passing verdict while pointing at nothing, which is dishonest coverage; 0.5.0 makes the schema express what the rcf-lite consumer already enforced as a local overlay (`w-2026-07-28-005`). Consumers on 0.4.x that shipped only `pending`/`skipped` TCs without `testPointer` remain valid; consumers that shipped `passing`/`failing` TCs without `testPointer` need to add pointers or downgrade the verdict.
|
|
49
|
+
|
|
46
50
|
## What changed in 0.2.0
|
|
47
51
|
|
|
48
52
|
The 0.1.0 shape was per-AC (`acId` + `prdId` + `version` + `testCases[given/when/then]`). 0.2.0 makes the suite per-US-and-across-ACs, keeps the TS id in `common.schema.json` (`tsId`), and moves the Given/When/Then verbiage into the TC's `description` (specialised BDD-style step language belongs in the executable test, not the JSON spec).
|
package/docs/user-story.md
CHANGED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-201",
|
|
3
|
+
"usId": "US-201",
|
|
4
|
+
"title": "Passing TC missing required testPointer",
|
|
5
|
+
"purpose": "0.5.0 requires testPointer on passing TCs; this fixture omits it and must be rejected.",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": ["AC-201-1"],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-201-passing-no-pointer",
|
|
11
|
+
"acId": "AC-201-1",
|
|
12
|
+
"description": "Claims a passing verdict but points at nothing; the conditional-required rule rejects this shape.",
|
|
13
|
+
"status": "passing"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"status": "draft",
|
|
17
|
+
"createdAt": "2026-08-28T00:00:00Z",
|
|
18
|
+
"updatedAt": "2026-08-28T00:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-202",
|
|
3
|
+
"usId": "US-202",
|
|
4
|
+
"title": "Failing TC missing required testPointer",
|
|
5
|
+
"purpose": "0.5.0 requires testPointer on failing TCs; this fixture omits it and must be rejected.",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": ["AC-202-1"],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-202-failing-no-pointer",
|
|
11
|
+
"acId": "AC-202-1",
|
|
12
|
+
"description": "Claims a failing verdict but points at nothing; the conditional-required rule rejects this shape.",
|
|
13
|
+
"status": "failing"
|
|
14
|
+
}
|
|
15
|
+
],
|
|
16
|
+
"status": "draft",
|
|
17
|
+
"createdAt": "2026-08-28T00:00:00Z",
|
|
18
|
+
"updatedAt": "2026-08-28T00:00:00Z"
|
|
19
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-203",
|
|
3
|
+
"usId": "US-203",
|
|
4
|
+
"title": "Empty testPointer is rejected",
|
|
5
|
+
"purpose": "0.5.0 requires testPointer to be non-empty (minLength 1); an empty string is not a legitimate pointer.",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": ["AC-203-1"],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-203-empty-pointer",
|
|
11
|
+
"acId": "AC-203-1",
|
|
12
|
+
"description": "Empty pointer would let a TC claim coverage while pointing at nothing.",
|
|
13
|
+
"testPointer": "",
|
|
14
|
+
"status": "passing"
|
|
15
|
+
}
|
|
16
|
+
],
|
|
17
|
+
"status": "draft",
|
|
18
|
+
"createdAt": "2026-08-28T00:00:00Z",
|
|
19
|
+
"updatedAt": "2026-08-28T00:00:00Z"
|
|
20
|
+
}
|
|
@@ -10,6 +10,7 @@
|
|
|
10
10
|
"id": "TC-1000-startup-loads-config",
|
|
11
11
|
"acId": "AC-1001-1",
|
|
12
12
|
"description": "On boot, the config loader wires and dispatches the first tick.",
|
|
13
|
+
"testPointer": "test/boot.test.ts::startup loads config",
|
|
13
14
|
"status": "passing",
|
|
14
15
|
"scope": "runtime"
|
|
15
16
|
},
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
"id": "TC-1000-deployed-smoke",
|
|
18
19
|
"acId": "AC-1001-1",
|
|
19
20
|
"description": "On the deployed instance, the first probe fires against a real target.",
|
|
21
|
+
"testPointer": "test/deploy.smoke.ts::deployed first probe",
|
|
20
22
|
"status": "passing",
|
|
21
23
|
"scope": "deployed"
|
|
22
24
|
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
{
|
|
2
|
+
"id": "TS-200",
|
|
3
|
+
"usId": "US-200",
|
|
4
|
+
"title": "TC testPointer conditional-by-status coverage",
|
|
5
|
+
"purpose": "Prove the 0.5.0 rule: testPointer is required for passing/failing TCs and optional for pending/skipped TCs.",
|
|
6
|
+
"testLevel": "unit",
|
|
7
|
+
"acIds": ["AC-200-1"],
|
|
8
|
+
"testCases": [
|
|
9
|
+
{
|
|
10
|
+
"id": "TC-200-passing-with-pointer",
|
|
11
|
+
"acId": "AC-200-1",
|
|
12
|
+
"description": "Passing TC carries the executable pointer.",
|
|
13
|
+
"testPointer": "test/example.test.js::passing case",
|
|
14
|
+
"status": "passing"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"id": "TC-200-failing-with-pointer",
|
|
18
|
+
"acId": "AC-200-1",
|
|
19
|
+
"description": "Failing TC still points at the executable that produced the verdict.",
|
|
20
|
+
"testPointer": "test/example.test.js::failing case",
|
|
21
|
+
"status": "failing"
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
"id": "TC-200-pending-no-pointer",
|
|
25
|
+
"acId": "AC-200-1",
|
|
26
|
+
"description": "Pending TC has no landed executable yet, so no pointer.",
|
|
27
|
+
"status": "pending"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"id": "TC-200-skipped-no-pointer",
|
|
31
|
+
"acId": "AC-200-1",
|
|
32
|
+
"description": "Skipped TC also has no executable to point at.",
|
|
33
|
+
"status": "skipped"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"id": "TC-200-pending-with-pointer",
|
|
37
|
+
"acId": "AC-200-1",
|
|
38
|
+
"description": "A pending TC may still declare its intended pointer.",
|
|
39
|
+
"testPointer": "test/example.test.js::planned case",
|
|
40
|
+
"status": "pending"
|
|
41
|
+
}
|
|
42
|
+
],
|
|
43
|
+
"status": "approved",
|
|
44
|
+
"createdAt": "2026-08-28T00:00:00Z",
|
|
45
|
+
"updatedAt": "2026-08-28T00:00:00Z"
|
|
46
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@stravica-ai/rcf-schemas",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.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",
|
|
@@ -19,9 +19,6 @@
|
|
|
19
19
|
"LICENSE",
|
|
20
20
|
"CHANGELOG.md"
|
|
21
21
|
],
|
|
22
|
-
"scripts": {
|
|
23
|
-
"test": "node --test test/*.test.js"
|
|
24
|
-
},
|
|
25
22
|
"devDependencies": {
|
|
26
23
|
"ajv": "^8.17.1",
|
|
27
24
|
"ajv-formats": "^3.0.1"
|
|
@@ -40,5 +37,8 @@
|
|
|
40
37
|
"json-schema",
|
|
41
38
|
"specifications",
|
|
42
39
|
"traceability"
|
|
43
|
-
]
|
|
44
|
-
|
|
40
|
+
],
|
|
41
|
+
"scripts": {
|
|
42
|
+
"test": "node --test test/*.test.js"
|
|
43
|
+
}
|
|
44
|
+
}
|
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.5.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.5.0/common.schema.json#/$defs/adrId" },
|
|
23
|
+
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/prdId" },
|
|
24
|
+
"tadId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/tadId" },
|
|
25
|
+
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/version" },
|
|
26
|
+
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.5.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.5.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.5.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.5.0/common.schema.json#/$defs/timestamp" },
|
|
44
|
+
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.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.5.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.5.0/common.schema.json#/$defs/bsId" },
|
|
11
|
+
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/prdId" },
|
|
12
|
+
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/version" },
|
|
13
|
+
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.5.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.5.0/common.schema.json#/$defs/timestamp" },
|
|
20
|
+
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" }
|
|
21
21
|
}
|
|
22
22
|
}
|
package/schemas/cn.schema.json
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
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.5.0/cn.schema.json",
|
|
4
4
|
"title": "RCF Code Node",
|
|
5
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
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["cnId", "path", "implementsAcIds", "version", "status", "createdAt", "updatedAt"],
|
|
9
9
|
"properties": {
|
|
10
|
-
"cnId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
10
|
+
"cnId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/cnId" },
|
|
11
11
|
"path": {
|
|
12
12
|
"type": "string",
|
|
13
13
|
"minLength": 1,
|
|
@@ -18,19 +18,19 @@
|
|
|
18
18
|
"description": { "type": "string" },
|
|
19
19
|
"implementsAcIds": {
|
|
20
20
|
"type": "array",
|
|
21
|
-
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
21
|
+
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/acId" },
|
|
22
22
|
"minItems": 0,
|
|
23
23
|
"description": "Acceptance criteria this code node satisfies. May be empty: an orphan CN (utilities, glue, wiring) is a legitimate state."
|
|
24
24
|
},
|
|
25
25
|
"dependencies": {
|
|
26
26
|
"type": "array",
|
|
27
|
-
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
27
|
+
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/cnId" },
|
|
28
28
|
"minItems": 0,
|
|
29
29
|
"description": "Code nodes this node depends on (CN-to-CN edges). Hand-declared in v1."
|
|
30
30
|
},
|
|
31
|
-
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
32
|
-
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
33
|
-
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
34
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
31
|
+
"version": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/version" },
|
|
32
|
+
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/cnStatus" },
|
|
33
|
+
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" },
|
|
34
|
+
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" }
|
|
35
35
|
}
|
|
36
36
|
}
|
|
@@ -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.5.0/common.schema.json",
|
|
4
4
|
"title": "RCF Shared Definitions",
|
|
5
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. From 0.4.4 the reqId/usId/prdId/bsId/tadId/tsId patterns accept an optional lowercase kebab-slug prefix (for example, spa-REQ-001) so blueprint mechanisms can contribute namespaced doc ids without colliding with project-authored ids. Existing numeric-only ids remain valid. The adrId/tacId/fbsId/cnId patterns already carry an optional kebab-slug SUFFIX (0.4.3) and are intentionally left untouched: id grammar is mixed across types for tonight (prefix for REQ/US/PRD/BS/TAD/TS; suffix for ADR/TAC/FBS/CN); unifying is a schemas follow-up.",
|
|
6
6
|
"$defs": {
|
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.5.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). From 0.4.4 the contextRequirements block carries an optional standardIds[] array. It is the host for the bundle assembler's selective-retrieval step: the assembler analyses the FBS work text against the manifest.standards[] tag vocabulary and populates standardIds for that bundle only, or honours an operator override authored on the FBS. Every added field is optional; pre-0.4.4 FBSes remain valid.",
|
|
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.5.0/common.schema.json#/$defs/fbsId" },
|
|
23
|
+
"prdId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/prdId" },
|
|
24
|
+
"bsId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.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.5.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.5.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.5.0/common.schema.json#/$defs/fbsId" }
|
|
39
39
|
},
|
|
40
40
|
"contextRequirements": {
|
|
41
41
|
"type": "object",
|
|
@@ -51,15 +51,15 @@
|
|
|
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.5.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.5.0/common.schema.json#/$defs/adrId" }
|
|
59
59
|
},
|
|
60
60
|
"standardIds": {
|
|
61
61
|
"type": "array",
|
|
62
|
-
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
62
|
+
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/standardSlug" },
|
|
63
63
|
"description": "Standards-pack slugs (from manifest.standards[]) that apply to this FBS. Populated by the bundle assembler's agentic selective-retrieval step at bundle-assembly time; an operator-authored value overrides the agentic selection for that FBS. Empty or absent means no standards content is included in the bundle; the assembler never blocks on an empty selection."
|
|
64
64
|
},
|
|
65
65
|
"existingModules": {
|
|
@@ -108,8 +108,8 @@
|
|
|
108
108
|
"type": "boolean",
|
|
109
109
|
"description": "Set to true by the Design worker or by rcf design --mark-complete once journeys, navModel, and themeAndA11y are authored and the operator considers the design settled. Gates the --mark complete transition on uiBearing FBSes."
|
|
110
110
|
},
|
|
111
|
-
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
112
|
-
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
111
|
+
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" },
|
|
112
|
+
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" }
|
|
113
113
|
},
|
|
114
114
|
"$defs": {
|
|
115
115
|
"serviceDependency": {
|
|
@@ -132,11 +132,11 @@
|
|
|
132
132
|
"minLength": 1,
|
|
133
133
|
"description": "What this FBS uses the service for."
|
|
134
134
|
},
|
|
135
|
-
"attestationMode": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
135
|
+
"attestationMode": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/attestationMode" },
|
|
136
136
|
"acIds": {
|
|
137
137
|
"type": "array",
|
|
138
138
|
"minItems": 1,
|
|
139
|
-
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
139
|
+
"items": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/acId" },
|
|
140
140
|
"description": "Acceptance criteria within this FBS's scope that this service dependency governs. An FBS may span mixed services."
|
|
141
141
|
},
|
|
142
142
|
"preFlightRef": {
|
|
@@ -164,7 +164,7 @@
|
|
|
164
164
|
"items": { "$ref": "#/$defs/uiClassificationSignal" },
|
|
165
165
|
"description": "Matched signals when reason is keyword-scan."
|
|
166
166
|
},
|
|
167
|
-
"classifiedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
167
|
+
"classifiedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" }
|
|
168
168
|
},
|
|
169
169
|
"description": "Provenance for the UI-bearing classifier verdict on this FBS."
|
|
170
170
|
},
|
|
@@ -177,7 +177,7 @@
|
|
|
177
177
|
"enum": ["summary", "ac.description", "us.iWant", "us.soThat", "req.description"],
|
|
178
178
|
"description": "Which text field the signal was matched in."
|
|
179
179
|
},
|
|
180
|
-
"acId": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
180
|
+
"acId": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/acId" },
|
|
181
181
|
"match": {
|
|
182
182
|
"type": "string",
|
|
183
183
|
"minLength": 1,
|
|
@@ -197,7 +197,7 @@
|
|
|
197
197
|
},
|
|
198
198
|
"navModel": { "$ref": "#/$defs/designNavModel" },
|
|
199
199
|
"themeAndA11y": { "$ref": "#/$defs/designThemeAndA11y" },
|
|
200
|
-
"authoredAt": { "$ref": "https://schemas.stravica.io/rcf/v0.
|
|
200
|
+
"authoredAt": { "$ref": "https://schemas.stravica.io/rcf/v0.5.0/common.schema.json#/$defs/timestamp" },
|
|
201
201
|
"authoredBy": {
|
|
202
202
|
"type": "string",
|
|
203
203
|
"minLength": 1,
|