@stravica-ai/rcf-schemas 0.4.0 → 0.4.2
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,42 @@ 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.4.2 - 2026-07-31
|
|
8
|
+
|
|
9
|
+
Additive patch bump: closes the Track B N-5 review finding on the 0.7.0 train. The `testTheatreFinding` shape now expresses "not every finding kind anchors on a test suite" honestly instead of forcing a UI-drift finding to smuggle an FBS id through the `tsId` slot.
|
|
10
|
+
|
|
11
|
+
### Added
|
|
12
|
+
|
|
13
|
+
- **`manifest.schema.json`**: new optional `anchorId` (string, `minLength: 1`) on `$defs.testTheatreFinding`, for kinds whose anchor is not a test suite (for example, `uiBaselineDrift`, which anchors on the FBS id or a file path).
|
|
14
|
+
- Fixture: `fixtures/valid/manifest/manifest-007-ui-baseline-drift-anchor.json` proves the new shape (a `uiBaselineDrift` finding without `tsId`, carrying `anchorId`) validates alongside a legacy test-theatre finding on the same record.
|
|
15
|
+
- Tests: `manifest.test.js` covers the new `anchorId` field, the per-kind `tsId` requiredness rule (drift may omit; test-theatre kinds still must supply), the back-compat guarantee (a pre-0.4.2 emitter's `uiBaselineDrift` with `tsId` still validates), the `anchorId` `minLength: 1` guard, and the coexistence of `anchorId` + `tsId` on one finding.
|
|
16
|
+
|
|
17
|
+
### Changed
|
|
18
|
+
|
|
19
|
+
- **`$defs.testTheatreFinding`**: top-level `required` list drops `tsId` (now `["kind", "detail", "severity"]`); a new `allOf` clause requires `tsId` for every kind other than `uiBaselineDrift`. Test-theatre kinds (`mockOnlyIntegrationClaim`, `testPointerBroken`, `assertionStrengthWeak`, `acIdsCoverageDrift`, `otherDeclared`) still cannot omit `tsId`.
|
|
20
|
+
- `manifest.schema.json` description names the 0.4.2 addition and restates the back-compat guarantee.
|
|
21
|
+
|
|
22
|
+
### Notes
|
|
23
|
+
|
|
24
|
+
- Additive-only: every 0.4.0- or 0.4.1-valid manifest remains valid. The change relaxes a required field on one specific kind and adds an optional field; nothing that previously validated stops validating.
|
|
25
|
+
- Canonical `$id` URLs stay at `v0.4.0`, following the patch-release precedent set at 0.2.1, 0.3.1, and 0.4.1.
|
|
26
|
+
- Consumed by `rcf-build-lite`'s Track B fix pass (PR `Stravica/rcf-lite#75`), which will bump its `@stravica-ai/rcf-schemas` dep to `^0.4.2` and emit `uiBaselineDrift` findings with `anchorId` instead of the legacy `tsId: fbs.fbsId` smuggle.
|
|
27
|
+
|
|
28
|
+
## 0.4.1 - 2026-07-31
|
|
29
|
+
|
|
30
|
+
Additive patch bump: closes the verification-integrity B-1 finding on the 0.7.0 train by giving `rcf finalise --ship-without-verified` a durable, greppable manifest record.
|
|
31
|
+
|
|
32
|
+
### Added
|
|
33
|
+
|
|
34
|
+
- **`manifest.schema.json`**: new optional `shipWithoutVerified[]` array on the manifest. Each entry carries `id` (pattern `swv-<fbsId>-<n>`), `fbsId`, `ackedAt` timestamp, `declaredAcs[]` (each with `acId`, a `verdict` enum restricted to `MOCK-ONLY-DECLARED` or `BLOCKED-BY-DECLARATION`, and an optional `reason` string), and `reportPath`. New `$defs`: `shipWithoutVerifiedRecord`, `shipWithoutVerifiedDeclaredAc`. Written by build-side `rcf finalise --ship-without-verified` (rcf-build-lite 0.7.0 train, verification-integrity-cluster-spec section 5.2).
|
|
35
|
+
- Fixture: `fixtures/valid/manifest/manifest-006-ship-without-verified.json` proves the new field validates, alongside a fresh pre-0.4.1 back-compat fixture pass.
|
|
36
|
+
- Tests: `manifest.test.js` covers the new field, the id pattern, the verdict enum guard, and back-compat.
|
|
37
|
+
|
|
38
|
+
### Notes
|
|
39
|
+
|
|
40
|
+
- Additive-only: pre-0.4.0 and 0.4.0 manifests remain valid unchanged.
|
|
41
|
+
- Canonical `$id` URLs stay at `v0.4.0`, following the patch-release precedent set at 0.2.1 and 0.3.1.
|
|
42
|
+
|
|
7
43
|
## 0.4.0 - 2026-07-30
|
|
8
44
|
|
|
9
45
|
Additive minor bump carrying the 0.7.0 release-train schema surface for `rcf-lite`: three ratified track specs (verification-integrity, UI-design-gate, elicitation-and-playbook-hardening) co-ship every new schema field in one release, resolved through a single `$defs`-uniqueness sweep. Every field is optional at schema level; pre-0.4.0 chains remain valid. The 0.6.0 init-hygiene spec is pure build-side and touches no schemas here.
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Ship-without-verified ack coverage",
|
|
4
|
+
"prd": { "id": "PRD-001", "path": "rcf/prd.json" },
|
|
5
|
+
"tad": { "id": "TAD-001", "path": "rcf/tad.json" },
|
|
6
|
+
"bs": { "id": "BS-001", "path": "rcf/build-sequence.json" },
|
|
7
|
+
"shipWithoutVerified": [
|
|
8
|
+
{
|
|
9
|
+
"id": "swv-FBS-011-1",
|
|
10
|
+
"fbsId": "FBS-011",
|
|
11
|
+
"ackedAt": "2026-07-31T10:15:00Z",
|
|
12
|
+
"declaredAcs": [
|
|
13
|
+
{
|
|
14
|
+
"acId": "AC-1001-2",
|
|
15
|
+
"verdict": "MOCK-ONLY-DECLARED",
|
|
16
|
+
"reason": "no Resend live-path credentials available at ship time"
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"acId": "AC-1001-3",
|
|
20
|
+
"verdict": "BLOCKED-BY-DECLARATION"
|
|
21
|
+
}
|
|
22
|
+
],
|
|
23
|
+
"reportPath": ".rcf-verify-report.json"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "uiBaselineDrift anchor coverage",
|
|
4
|
+
"prd": { "id": "PRD-001", "path": "rcf/prd.json" },
|
|
5
|
+
"tad": { "id": "TAD-001", "path": "rcf/tad.json" },
|
|
6
|
+
"bs": { "id": "BS-001", "path": "rcf/build-sequence.json" },
|
|
7
|
+
"reviewAudit": [
|
|
8
|
+
{
|
|
9
|
+
"id": "ra-FBS-016-1",
|
|
10
|
+
"fbsId": "FBS-016",
|
|
11
|
+
"createdAt": "2026-07-31T15:10:00Z",
|
|
12
|
+
"testTheatreFindings": [
|
|
13
|
+
{
|
|
14
|
+
"anchorId": "FBS-016",
|
|
15
|
+
"kind": "uiBaselineDrift",
|
|
16
|
+
"detail": "hex literal #ff0000 detected in src/ui/dashboard.ts (baseline defaults.noHexInViewFiles: true).",
|
|
17
|
+
"severity": "block"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"tsId": "TS-016",
|
|
21
|
+
"kind": "mockOnlyIntegrationClaim",
|
|
22
|
+
"detail": "testLevel=integration but runtimeProvenance.profile=mock",
|
|
23
|
+
"severity": "block"
|
|
24
|
+
}
|
|
25
|
+
],
|
|
26
|
+
"verdict": "block"
|
|
27
|
+
}
|
|
28
|
+
]
|
|
29
|
+
}
|
package/package.json
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
"$schema": "https://json-schema.org/draft/2020-12/schema",
|
|
3
3
|
"$id": "https://schemas.stravica.io/rcf/v0.4.0/manifest.schema.json",
|
|
4
4
|
"title": "RCF Project Manifest",
|
|
5
|
-
"description": "Project manifest. Roots-only shape: declares prd, tad, bs. Children are owned by their parents and discovered by walking from the roots. From 0.4.0 the manifest also carries optional records for pre-flight configuration, review audits, UI baselines, browser verification, baseline-AC opt-outs, intake classification, register-regression canaries, and the review-surface state. Every added field is optional; pre-0.4.0 manifests remain valid.",
|
|
5
|
+
"description": "Project manifest. Roots-only shape: declares prd, tad, bs. Children are owned by their parents and discovered by walking from the roots. From 0.4.0 the manifest also carries optional records for pre-flight configuration, review audits, UI baselines, browser verification, baseline-AC opt-outs, intake classification, register-regression canaries, and the review-surface state. From 0.4.1 the manifest additionally carries optional shipWithoutVerified acknowledgements written by rcf finalise --ship-without-verified. From 0.4.2 the testTheatreFinding shape carries an optional anchorId and drops tsId from its required list when kind is uiBaselineDrift (the drift finding is not anchored on a test suite); every other kind still requires tsId, and any 0.4.0- or 0.4.1-valid record remains valid. Every added field is optional; pre-0.4.0 manifests remain valid.",
|
|
6
6
|
"type": "object",
|
|
7
7
|
"additionalProperties": false,
|
|
8
8
|
"required": ["version", "projectName", "prd", "tad", "bs"],
|
|
@@ -50,7 +50,12 @@
|
|
|
50
50
|
"items": { "$ref": "#/$defs/registerCanaryRecord" },
|
|
51
51
|
"description": "Register-regression canary records. One entry per canary run at release preparation."
|
|
52
52
|
},
|
|
53
|
-
"reviewSurface": { "$ref": "#/$defs/reviewSurfaceRecord" }
|
|
53
|
+
"reviewSurface": { "$ref": "#/$defs/reviewSurfaceRecord" },
|
|
54
|
+
"shipWithoutVerified": {
|
|
55
|
+
"type": "array",
|
|
56
|
+
"items": { "$ref": "#/$defs/shipWithoutVerifiedRecord" },
|
|
57
|
+
"description": "Operator acknowledgements recorded when rcf finalise --ship-without-verified acknowledges a MOCK-ONLY-DECLARED or BLOCKED-BY-DECLARATION verdict on the verify report and ships the FBS at complete without promoting to verified. One entry per acknowledgement (verification-integrity-cluster-spec section 5.2). The ack is durable and greppable at ship time."
|
|
58
|
+
}
|
|
54
59
|
},
|
|
55
60
|
"$defs": {
|
|
56
61
|
"preFlightConfigRecord": {
|
|
@@ -173,10 +178,15 @@
|
|
|
173
178
|
"testTheatreFinding": {
|
|
174
179
|
"type": "object",
|
|
175
180
|
"additionalProperties": false,
|
|
176
|
-
"required": ["
|
|
181
|
+
"required": ["kind", "detail", "severity"],
|
|
177
182
|
"properties": {
|
|
178
183
|
"tsId": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/tsId" },
|
|
179
184
|
"tcId": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/tcId" },
|
|
185
|
+
"anchorId": {
|
|
186
|
+
"type": "string",
|
|
187
|
+
"minLength": 1,
|
|
188
|
+
"description": "Free-form anchor for findings whose kind does not map to a test suite (for example, uiBaselineDrift, which anchors on the FBS id or a file path). Optional; test-theatre kinds keep tsId as the anchor."
|
|
189
|
+
},
|
|
180
190
|
"kind": {
|
|
181
191
|
"enum": [
|
|
182
192
|
"mockOnlyIntegrationClaim",
|
|
@@ -202,7 +212,19 @@
|
|
|
202
212
|
"enum": ["advisory", "warn", "block"],
|
|
203
213
|
"description": "Severity of the finding. Only block severities force a block verdict on the audit."
|
|
204
214
|
}
|
|
205
|
-
}
|
|
215
|
+
},
|
|
216
|
+
"allOf": [
|
|
217
|
+
{
|
|
218
|
+
"if": { "properties": { "kind": { "const": "uiBaselineDrift" } }, "required": ["kind"] },
|
|
219
|
+
"then": {},
|
|
220
|
+
"else": {
|
|
221
|
+
"properties": {
|
|
222
|
+
"tsId": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/tsId" }
|
|
223
|
+
},
|
|
224
|
+
"required": ["tsId"]
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
]
|
|
206
228
|
},
|
|
207
229
|
"mutationSamplingRecord": {
|
|
208
230
|
"type": "object",
|
|
@@ -700,6 +722,48 @@
|
|
|
700
722
|
"lastHeartbeatAt": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/timestamp" },
|
|
701
723
|
"operatorRequestedPersistUntil": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/timestamp" }
|
|
702
724
|
}
|
|
725
|
+
},
|
|
726
|
+
"shipWithoutVerifiedRecord": {
|
|
727
|
+
"type": "object",
|
|
728
|
+
"additionalProperties": false,
|
|
729
|
+
"required": ["id", "fbsId", "ackedAt", "declaredAcs", "reportPath"],
|
|
730
|
+
"properties": {
|
|
731
|
+
"id": {
|
|
732
|
+
"type": "string",
|
|
733
|
+
"pattern": "^swv-FBS-\\d{3,}-\\d+$",
|
|
734
|
+
"description": "Ship-without-verified acknowledgement id. Format: swv-<fbsId>-<n>; the trailing integer increments per acknowledgement of the same FBS."
|
|
735
|
+
},
|
|
736
|
+
"fbsId": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/fbsId" },
|
|
737
|
+
"ackedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/timestamp" },
|
|
738
|
+
"declaredAcs": {
|
|
739
|
+
"type": "array",
|
|
740
|
+
"minItems": 1,
|
|
741
|
+
"items": { "$ref": "#/$defs/shipWithoutVerifiedDeclaredAc" },
|
|
742
|
+
"description": "The per-AC verdicts on the verify report that the operator acknowledged. At least one entry, otherwise there is nothing to acknowledge."
|
|
743
|
+
},
|
|
744
|
+
"reportPath": {
|
|
745
|
+
"type": "string",
|
|
746
|
+
"minLength": 1,
|
|
747
|
+
"description": "Path (repo-relative or absolute as recorded by finalise) to the verify report file that carried the acknowledged verdicts."
|
|
748
|
+
}
|
|
749
|
+
},
|
|
750
|
+
"description": "Operator acknowledgement recorded on rcf finalise --ship-without-verified. Records the FBS, the verify verdicts acknowledged, and the report they came from, so the ack is durable and greppable at ship time."
|
|
751
|
+
},
|
|
752
|
+
"shipWithoutVerifiedDeclaredAc": {
|
|
753
|
+
"type": "object",
|
|
754
|
+
"additionalProperties": false,
|
|
755
|
+
"required": ["acId", "verdict"],
|
|
756
|
+
"properties": {
|
|
757
|
+
"acId": { "$ref": "https://schemas.stravica.io/rcf/v0.4.0/common.schema.json#/$defs/acId" },
|
|
758
|
+
"verdict": {
|
|
759
|
+
"enum": ["MOCK-ONLY-DECLARED", "BLOCKED-BY-DECLARATION"],
|
|
760
|
+
"description": "The verify per-AC verdict class the operator acknowledged. Only these two verdict classes are legitimately acknowledgeable via --ship-without-verified."
|
|
761
|
+
},
|
|
762
|
+
"reason": {
|
|
763
|
+
"type": "string",
|
|
764
|
+
"description": "Optional verify-supplied reason string carried through from the report entry."
|
|
765
|
+
}
|
|
766
|
+
}
|
|
703
767
|
}
|
|
704
768
|
}
|
|
705
769
|
}
|