@stravica-ai/rcf-schemas 0.6.1 → 0.6.3
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 +52 -0
- package/docs/req.md +1 -0
- package/docs/user-story.md +3 -0
- package/fixtures/invalid/manifest/manifest-024-ship-without-eval-bad-id.json +19 -0
- package/fixtures/invalid/manifest/manifest-025-ship-without-eval-missing-reason.json +18 -0
- package/fixtures/invalid/manifest/manifest-026-probe-pack-check-applicable-omitted-no-verdict.json +35 -0
- package/fixtures/invalid/req/req-006-delivered-by-not-object.json +14 -0
- package/fixtures/invalid/user-story/us-006-ac-owner-ref-not-object.json +21 -0
- package/fixtures/invalid/user-story/us-007-ac-disposition-bad-enum.json +21 -0
- package/fixtures/invalid/user-story/us-008-ac-vendor-citation-missing-verified-on.json +23 -0
- package/fixtures/valid/manifest/manifest-015-ship-without-eval.json +27 -0
- package/fixtures/valid/manifest/manifest-016-probe-pack-check-applicable-false.json +37 -0
- package/fixtures/valid/req/req-004-delivered-by.json +19 -0
- package/fixtures/valid/user-story/us-006-ac-ownership-and-disposition.json +47 -0
- package/package.json +1 -1
- package/schemas/manifest.schema.json +78 -5
- package/schemas/req.schema.json +16 -1
- package/schemas/user-story.schema.json +40 -0
package/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,58 @@ 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.6.3 - 2026-09-17
|
|
8
|
+
|
|
9
|
+
Patch bump for the last two schema-shaped claims on the rcf-lite 0.28.0 referee-guarantees train (docs claims C-33 and C-38). Adds an additive, optional `shipWithoutEval[]` carrier on the manifest (sister of `shipWithoutVerified`, written by `rcf finalise --ship-without-eval`), and an additive, optional `applicable` boolean on `browserVerificationProbePackCheck` (mirrors the pack-level `applicable`, so a check whose own `appliesTo` predicate returned false records `applicable: false` at the check level without a stray verdict or severity). Every change is additive: every 0.6.2-valid manifest keeps validating.
|
|
10
|
+
|
|
11
|
+
Patch semver convention: URLs pinned at `v0.6.0`. No breaking change; every 0.6.2-valid document keeps validating.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **`manifest.schema.json`**: new optional `shipWithoutEval` array on the top-level properties. Items are the new `$defs.shipWithoutEvalRecord` def: required `id` (pattern `^swe-FBS-\d{3,}(?:-[a-z0-9]+(?:-[a-z0-9]+)*)?-\d+$`, mirroring the `swv-` family and accepting both numeric-only and kebab-slug FBS ids), `fbsId`, `ackedAt` (ISO timestamp), `reason` (min-length-1 string, the operator's `--ship-without-eval "<reason>"` argument), `declaredAcs` (min-items-1, items are the new `$defs.shipWithoutEvalDeclaredAc` def with required `acId` and `verdict` enum `EVAL-MISSING | EVAL-BELOW-THRESHOLD`, plus an optional verify-supplied `reason`), and `reportPath` (min-length-1 string). `additionalProperties: false` on both new objects. Written by `packages/rcf-lite/src/finalise/ship-without-eval.js`; the writer's file header (rcf-lite `main` at time of this release) already names the exact deltas landed here.
|
|
16
|
+
- **`manifest.schema.json`**: new optional `applicable` boolean on `$defs.browserVerificationProbePackCheck`. When present and false, `verdict` and `severity` are omitted and the aggregate verdict rule (per spec section 3.4) treats the check as neither pass nor fail. When absent or true, the pre-0.6.3 requiredness of `verdict` and `severity` is preserved via an `if/then` guard, so every 0.6.1-valid check keeps validating. Mirrors the pack-level `applicable` on `browserVerificationProbePack`. Emitted by `packages/rcf-lite/src/browser-verify/pack-runner.js` from rcf-lite 0.28.0 for a check whose own `appliesTo` predicate returned false (rcf-lite `main` file header names the check-level `applicable: false` write path that this schema addition unblocks).
|
|
17
|
+
- **`manifest.schema.json`**: top-level `description` extended to name the new `shipWithoutEval[]` field and the check-level `applicable` flag, following the "From 0.X.Y the manifest additionally carries..." precedent set at 0.4.1, 0.4.4, 0.4.5, and 0.5.1.
|
|
18
|
+
- **Fixtures (valid)**: `fixtures/valid/manifest/manifest-015-ship-without-eval.json` (one ack with two `declaredAcs`, one carrying an optional verify-supplied `reason`, both verdict enum values exercised), `fixtures/valid/manifest/manifest-016-probe-pack-check-applicable-false.json` (a probe-pack with three checks: two normal `pass`, one `applicable: false` with a detail and no verdict / severity).
|
|
19
|
+
- **Fixtures (invalid)**: `fixtures/invalid/manifest/manifest-024-ship-without-eval-bad-id.json` (id does not match the `swe-FBS-<n>` pattern), `fixtures/invalid/manifest/manifest-025-ship-without-eval-missing-reason.json` (record missing the required `reason`), `fixtures/invalid/manifest/manifest-026-probe-pack-check-applicable-omitted-no-verdict.json` (a check omits `applicable` and omits `verdict` / `severity`, so the back-compat requiredness fires).
|
|
20
|
+
- **Tests**: `test/manifest.test.js` gains 15 cases: 11 for `shipWithoutEval` (positive shape, both verdict enum values, slugged FBS id, id-pattern rejection, verdict enum restriction, `reason` requiredness with both missing and empty-string, empty `declaredAcs` rejection, missing `fbsId`, empty `reportPath`, unknown-property rejection on the record, and a back-compat absent-`shipWithoutEval` case); 4 for the check-level `applicable` field (positive `applicable: false` with no verdict / severity, `applicable: true` still requires verdict + severity, back-compat check without `applicable` still requires verdict + severity, `applicable` typed as boolean not string). Total suite grows from 350 to 365.
|
|
21
|
+
|
|
22
|
+
### Migration
|
|
23
|
+
|
|
24
|
+
- **Existing chains on 0.6.2**: bump `@stravica-ai/rcf-schemas` to `0.6.3`. Every existing document keeps validating; both additions are optional and unknown to pre-0.6.3 callers.
|
|
25
|
+
- **rcf-lite consumer bump**: `rcf-lite` pins `@stravica-ai/rcf-schemas` exactly. rcf-lite 0.28.0 already emits both shapes (the `shipWithoutEval[]` writer and the check-level `applicable: false` path); the follow-up rcf-lite PR bumps its schema pin to `0.6.3` and drops the two "schema-skipped" workarounds (the manifest-write validator skip in `ship-without-eval.js` and the `verdict: 'skipped'` fallback in the check-level applicability arm of `pack-runner.js`) so both writers persist through the strict validator.
|
|
26
|
+
|
|
27
|
+
### Notes
|
|
28
|
+
|
|
29
|
+
- Traces to work item `w-2026-09-16-dave-019` (project `rcf-lite-wsd`) and the referee-guarantees train that shipped rcf-lite 0.28.0 (referee page docs claims C-33 for `shipWithoutEval` and C-38 for check-level `applicable`).
|
|
30
|
+
- The check-level `applicable` change uses a JSON Schema `if / then` conditional (mirroring the pattern set by the `uiBaselineDrift` per-kind `tsId` requiredness rule at 0.4.2): the `if` matches only when `applicable` is present with value `false`, so the `then` clause requiring `verdict` and `severity` is applied to every other case (absent `applicable` and `applicable: true` alike). Back-compat for every pre-0.6.3 probe-pack check is preserved.
|
|
31
|
+
- Sub-defs for `shipWithoutEval` sit alongside the existing `shipWithoutVerifiedRecord` and `shipWithoutVerifiedDeclaredAc` peers; the id family (`swe-FBS-<n>`) and verdict enum (`EVAL-MISSING | EVAL-BELOW-THRESHOLD`) are the eval-node analogues of the verify-integrity `swv-FBS-<n>` and `MOCK-ONLY-DECLARED | BLOCKED-BY-DECLARATION` shapes.
|
|
32
|
+
|
|
33
|
+
## 0.6.2 - 2026-09-09
|
|
34
|
+
|
|
35
|
+
Patch bump for four additive, optional fields that let a blueprint's own layers point at their owning artefacts rather than restating shapes and promises inline. Adds `deliveredBy` on the requirement record (naming the TAC or ADR that delivers the requirement's externally promised property), and `ownerRef`, `disposition`, and `vendorCitation` on the acceptance criterion inline on a user story. Every change is additive: every 0.6.1-valid document remains valid.
|
|
36
|
+
|
|
37
|
+
Patch semver convention: URLs pinned at `v0.6.0`. No breaking change; every 0.6.1-valid document keeps validating.
|
|
38
|
+
|
|
39
|
+
### Added
|
|
40
|
+
|
|
41
|
+
- **`req.schema.json`**: new optional `deliveredBy` on the requirement record, `$defs.deliveredBy`. Object with three optional sub-fields (`tacId` via the shared `common.$defs.tacId` pattern, `adrId` via `common.$defs.adrId`, and a min-length-1 `field` string carrying an optional dotted path into the delivering record). `additionalProperties: false` on the object. All sub-fields are optional at the schema surface so the record composes additively; consumer rulesets that gate the delivery link may require at least one of `tacId` or `adrId`.
|
|
42
|
+
- **`user-story.schema.json`**: new optional `ownerRef` on the inline `$defs.acceptanceCriterion`, `$defs.acOwnerRef`. Same shape as `deliveredBy` (optional `tacId`, optional `adrId`, optional `field`), naming the owning TAC or ADR an acceptance criterion references instead of restating. `additionalProperties: false`.
|
|
43
|
+
- **`user-story.schema.json`**: new optional `disposition` on the inline `$defs.acceptanceCriterion`, `$defs.acDisposition`. Enum `fixed | template`. Marks whether the criterion is the blueprint's to fix (mechanism-invariant, inherited unchanged by every applying project) or the applying agent's to set (project-parameterised, shape-given and value-open). Absence carries no default: a consumer that requires the marker treats an unmarked AC as a defect, and a consumer that does not require it ignores the absence.
|
|
44
|
+
- **`user-story.schema.json`**: new optional `vendorCitation` on the inline `$defs.acceptanceCriterion`, `$defs.acVendorCitation`. Object with two required sub-fields (`url`, JSON Schema `format: uri`, min-length-1; `verifiedOn`, `format: date`, ISO-8601 `YYYY-MM-DD`) for any criterion whose truth rests on a third-party platform fact. `additionalProperties: false`. Consumers may fetch the URL at gate time so a dead link is a finding, and may compare `verifiedOn` against a tolerance window.
|
|
45
|
+
- **Fixtures (valid)**: `fixtures/valid/req/req-004-delivered-by.json` (a REQ with `deliveredBy` pointing at a TAC field), `fixtures/valid/user-story/us-006-ac-ownership-and-disposition.json` (a US with two ACs exercising `ownerRef`, `disposition` at both enum values, and `vendorCitation`).
|
|
46
|
+
- **Fixtures (invalid)**: `fixtures/invalid/req/req-006-delivered-by-not-object.json` (deliveredBy as a bare id string), `fixtures/invalid/user-story/us-006-ac-owner-ref-not-object.json` (ownerRef as a bare id string), `fixtures/invalid/user-story/us-007-ac-disposition-bad-enum.json` (disposition outside the `fixed | template` enum), `fixtures/invalid/user-story/us-008-ac-vendor-citation-missing-verified-on.json` (vendorCitation object missing its required `verifiedOn` date).
|
|
47
|
+
- **Tests**: `test/req.test.js` gains 7 cases for `deliveredBy` (optional back-compat, TAC-pointing, ADR-pointing, empty object, string rejection, unknown-property rejection, bad-tacId-shape rejection). `test/user-story.test.js` gains 13 cases across `ownerRef`, `disposition`, and `vendorCitation` (both enum values, both id targets, missing required sub-fields, bad `verifiedOn` format, unknown property rejections, and a combined-shape case alongside `scope`, `determinism`-adjacent optional fields, and `provenance`). Total suite grows from 330 to 350.
|
|
48
|
+
|
|
49
|
+
### Migration
|
|
50
|
+
|
|
51
|
+
- **Existing chains on 0.6.1**: bump `@stravica-ai/rcf-schemas` to `0.6.2`. Every existing document keeps validating; all four fields are optional and unknown to pre-0.6.2 callers.
|
|
52
|
+
- **Consumers that inline the AC record**: pre-0.6.2 code that used `additionalProperties: false` at the AC level via a local extension keeps refusing the new fields until the consumer's own schema pins are bumped. The shared record accepts the fields immediately.
|
|
53
|
+
|
|
54
|
+
### Notes
|
|
55
|
+
|
|
56
|
+
- Sub-defs sit alongside the existing `acProvenance` peer on the user story schema, and alongside `reqShapeClassification` on the requirement schema. Both `deliveredBy` and `acOwnerRef` are the same {`tacId?`, `adrId?`, `field?`} shape but defined per file rather than in `common.schema.json`, on the same grounds as `reqShapeClassification` and `acProvenance`: a small, record-local $def keeps the change surface additive on exactly the two files it lives on.
|
|
57
|
+
- The lint mechanics that consume these fields (single-definition ownership, REQ delivery, disposition ledger, vendor-citation freshness) live in the consuming `rcf-lite` build, not in this schema. The schema surface stays validation-only.
|
|
58
|
+
|
|
7
59
|
## 0.6.1 - 2026-09-05
|
|
8
60
|
|
|
9
61
|
Patch bump for the T-0 visual-round Playwright-first ship-gate seam (`projects/blueprint-library/specs/visual-round-spec-2026-09-04.md`, section 3.4). Adds an additive, optional `probePacks[]` carrier on `browserVerificationRecord` so the record shape that rcf-lite's `packages/rcf-lite/src/browser-verify/pack-runner.js` already emits (per pack `packName`, `packVersion`, `blueprintSlug`, `applicable`, `checks[]`, optional `preChecks[]`, optional pack-level `detail` string) can persist without tripping `additionalProperties: false`.
|
package/docs/req.md
CHANGED
|
@@ -27,6 +27,7 @@ Individual Requirement within a PRD. One file per REQ. Recommended path: `rcf/re
|
|
|
27
27
|
|---|---|---|
|
|
28
28
|
| `rationale` | string | Why this REQ exists. |
|
|
29
29
|
| `tags` | array of strings | Free-form tags for grouping or filtering. |
|
|
30
|
+
| `deliveredBy` | object: `{tacId?, adrId?, field?}` | 0.6.2. Back-reference naming the TAC or ADR that delivers the requirement's externally promised property (a global staleness ceiling, an anti-enumeration guarantee, a forward-only migration invariant, a boot-event contract). `tacId` and `adrId` re-use the shared id patterns; `field` is an optional dotted path into the delivering record (for example, `responsibilities.replicationCeiling` or `decision.retryPolicy`). All sub-fields optional at schema level so the record composes additively; consumer rulesets may require at least one of `tacId` or `adrId` on a REQ that promises an externally observable property. `additionalProperties: false`. |
|
|
30
31
|
|
|
31
32
|
## Why REQ is its own file
|
|
32
33
|
|
package/docs/user-story.md
CHANGED
|
@@ -44,6 +44,9 @@ Each AC inside `acceptanceCriteria[]`:
|
|
|
44
44
|
| `testable` | boolean | yes | Author declares the AC is testable. |
|
|
45
45
|
| `scope` | `scopeTag` enum | no | `library`, `runtime`, `deployed`, `unclassified`. Optional at schema level (0.4.3). Names the scope at which the AC is observable; governs which test scopes count as coverage. |
|
|
46
46
|
| `determinism` | enum: `deterministic`, `nonDeterministic` | no | 0.6.0. Author's declaration of whether the AC's observable output is deterministic or non-deterministic (LLM-generated text, ranked results, generated code, judgement calls). Optional at schema level; absence is treated as `deterministic` by every consumer. Governs whether an EVAL is required by `rcf audit eval coverage --strict` and whether the merge gate emits `EVAL-MISSING` / `EVAL-BELOW-THRESHOLD` per-AC verdicts. |
|
|
47
|
+
| `ownerRef` | object: `{tacId?, adrId?, field?}` | no | 0.6.2. Back-reference naming the owning TAC or ADR the criterion observes rather than restating. `tacId` and `adrId` re-use the shared id patterns; `field` is an optional dotted path into the owning record (for example, `interfaces.principal.fields` or `decision.retryPolicy`) pinpointing the surface. All sub-fields optional at schema level so the record composes additively; consumers may require at least one of `tacId` or `adrId` when the criterion references an owning artefact. `additionalProperties: false`. |
|
|
48
|
+
| `disposition` | enum: `fixed`, `template` | no | 0.6.2. Marks whether the criterion is the blueprint's to fix (mechanism-invariant, inherited unchanged by every applying project) or the applying agent's to set (project-parameterised, shape-given and value-open). Optional at schema level; consumer rulesets that gate blueprint contributions may require it on every AC of a shipped blueprint. Absence carries no default: a consumer that requires the marker treats an unmarked AC as a defect, and a consumer that does not require it ignores the absence. |
|
|
49
|
+
| `vendorCitation` | object: `{url, verifiedOn}` | no | 0.6.2. Vendor citation for a criterion whose truth rests on a third-party platform fact. Both sub-fields required when the object is present: `url` is the vendor documentation URL (JSON Schema `format: uri`); `verifiedOn` is the ISO-8601 date (`format: date`, `YYYY-MM-DD`) the fact was verified against that URL. Consumers may fetch the URL at gate time so a dead link is a finding, and may compare `verifiedOn` against a tolerance window. `additionalProperties: false`. |
|
|
47
50
|
|
|
48
51
|
The Given/When/Then triple is optional at the schema level so non-Gherkin teams aren't forced into it; the `testable` boolean is required to make authors stop and confirm the AC can actually be tested.
|
|
49
52
|
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Ship-without-eval bad id",
|
|
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
|
+
"shipWithoutEval": [
|
|
8
|
+
{
|
|
9
|
+
"id": "not-a-swe-id",
|
|
10
|
+
"fbsId": "FBS-015",
|
|
11
|
+
"ackedAt": "2026-09-16T14:20:00Z",
|
|
12
|
+
"reason": "reason string",
|
|
13
|
+
"declaredAcs": [
|
|
14
|
+
{ "acId": "AC-1501-2", "verdict": "EVAL-MISSING" }
|
|
15
|
+
],
|
|
16
|
+
"reportPath": ".rcf-verify-report.json"
|
|
17
|
+
}
|
|
18
|
+
]
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Ship-without-eval missing reason",
|
|
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
|
+
"shipWithoutEval": [
|
|
8
|
+
{
|
|
9
|
+
"id": "swe-FBS-015-1",
|
|
10
|
+
"fbsId": "FBS-015",
|
|
11
|
+
"ackedAt": "2026-09-16T14:20:00Z",
|
|
12
|
+
"declaredAcs": [
|
|
13
|
+
{ "acId": "AC-1501-2", "verdict": "EVAL-MISSING" }
|
|
14
|
+
],
|
|
15
|
+
"reportPath": ".rcf-verify-report.json"
|
|
16
|
+
}
|
|
17
|
+
]
|
|
18
|
+
}
|
package/fixtures/invalid/manifest/manifest-026-probe-pack-check-applicable-omitted-no-verdict.json
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Probe-pack check omits verdict without applicable:false",
|
|
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
|
+
"browserVerification": [
|
|
8
|
+
{
|
|
9
|
+
"id": "bv-FBS-042-3",
|
|
10
|
+
"fbsId": "FBS-042",
|
|
11
|
+
"createdAt": "2026-09-16T15:10:00Z",
|
|
12
|
+
"mode": "agentScreenshotCritique",
|
|
13
|
+
"runtimeProfile": "local-dev",
|
|
14
|
+
"runtimeUrl": "http://127.0.0.1:3000",
|
|
15
|
+
"routesChecked": [
|
|
16
|
+
{ "path": "/", "screenshotPath": ".rcf/artefacts/x.png", "themeApplied": "light" }
|
|
17
|
+
],
|
|
18
|
+
"invariantChecks": [
|
|
19
|
+
{ "invariant": "sharedNavPresent", "verdict": "pass" }
|
|
20
|
+
],
|
|
21
|
+
"probePacks": [
|
|
22
|
+
{
|
|
23
|
+
"packName": "application-datatable-grid-shell",
|
|
24
|
+
"packVersion": "1.0.0",
|
|
25
|
+
"blueprintSlug": "application-datatable",
|
|
26
|
+
"applicable": true,
|
|
27
|
+
"checks": [
|
|
28
|
+
{ "id": "AC-17101-2" }
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
],
|
|
32
|
+
"verdict": "pass"
|
|
33
|
+
}
|
|
34
|
+
]
|
|
35
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "REQ-201",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"title": "Delivered-by must be an object, not a string",
|
|
5
|
+
"description": "Rejects a REQ whose deliveredBy is a bare id string instead of the {tacId?, adrId?, field?} object.",
|
|
6
|
+
"category": "functional",
|
|
7
|
+
"domain": "cache",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"version": "1.0.0",
|
|
10
|
+
"status": "draft",
|
|
11
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
12
|
+
"updatedAt": "2026-09-09T00:00:00Z",
|
|
13
|
+
"deliveredBy": "TAC-401"
|
|
14
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-201",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"reqId": "REQ-201",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Owner-ref must be an object, not a string",
|
|
8
|
+
"asA": "author",
|
|
9
|
+
"iWant": "the AC's ownerRef to be the {tacId?, adrId?, field?} object shape",
|
|
10
|
+
"soThat": "the reference is machine-checkable rather than free text",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-201-1",
|
|
14
|
+
"description": "Owner ref is a string instead of an object.",
|
|
15
|
+
"testable": true,
|
|
16
|
+
"ownerRef": "TAC-401"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
20
|
+
"updatedAt": "2026-09-09T00:00:00Z"
|
|
21
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-201",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"reqId": "REQ-201",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Disposition outside the enum is rejected",
|
|
8
|
+
"asA": "author",
|
|
9
|
+
"iWant": "disposition to be one of fixed or template",
|
|
10
|
+
"soThat": "the marker is unambiguous for a consumer that gates on it",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-201-1",
|
|
14
|
+
"description": "Disposition is neither fixed nor template.",
|
|
15
|
+
"testable": true,
|
|
16
|
+
"disposition": "invariant"
|
|
17
|
+
}
|
|
18
|
+
],
|
|
19
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
20
|
+
"updatedAt": "2026-09-09T00:00:00Z"
|
|
21
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-201",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"reqId": "REQ-201",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "draft",
|
|
7
|
+
"title": "Vendor citation without verifiedOn is rejected",
|
|
8
|
+
"asA": "author",
|
|
9
|
+
"iWant": "a vendor citation to carry both url and the ISO-8601 verified-on date",
|
|
10
|
+
"soThat": "a consumer can tell a fresh fact from a stale one",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-201-1",
|
|
14
|
+
"description": "Vendor citation without the required verifiedOn date.",
|
|
15
|
+
"testable": true,
|
|
16
|
+
"vendorCitation": {
|
|
17
|
+
"url": "https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
],
|
|
21
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
22
|
+
"updatedAt": "2026-09-09T00:00:00Z"
|
|
23
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Ship-without-eval 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
|
+
"shipWithoutEval": [
|
|
8
|
+
{
|
|
9
|
+
"id": "swe-FBS-015-1",
|
|
10
|
+
"fbsId": "FBS-015",
|
|
11
|
+
"ackedAt": "2026-09-16T14:20:00Z",
|
|
12
|
+
"reason": "grading rubric still needs an operator pass; ship the FBS on shape review only",
|
|
13
|
+
"declaredAcs": [
|
|
14
|
+
{
|
|
15
|
+
"acId": "AC-1501-2",
|
|
16
|
+
"verdict": "EVAL-MISSING",
|
|
17
|
+
"reason": "no EVAL doc authored for the non-deterministic AC"
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
"acId": "AC-1501-3",
|
|
21
|
+
"verdict": "EVAL-BELOW-THRESHOLD"
|
|
22
|
+
}
|
|
23
|
+
],
|
|
24
|
+
"reportPath": ".rcf-verify-report.json"
|
|
25
|
+
}
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": "2.0.0",
|
|
3
|
+
"projectName": "Probe-pack check-level applicable:false 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
|
+
"browserVerification": [
|
|
8
|
+
{
|
|
9
|
+
"id": "bv-FBS-042-1",
|
|
10
|
+
"fbsId": "FBS-042",
|
|
11
|
+
"createdAt": "2026-09-16T15:00:00Z",
|
|
12
|
+
"mode": "agentScreenshotCritique",
|
|
13
|
+
"runtimeProfile": "local-dev",
|
|
14
|
+
"runtimeUrl": "http://127.0.0.1:3000",
|
|
15
|
+
"routesChecked": [
|
|
16
|
+
{ "path": "/", "screenshotPath": ".rcf/artefacts/bv-FBS-042-1/root.png", "themeApplied": "light" }
|
|
17
|
+
],
|
|
18
|
+
"invariantChecks": [
|
|
19
|
+
{ "invariant": "sharedNavPresent", "verdict": "pass" }
|
|
20
|
+
],
|
|
21
|
+
"probePacks": [
|
|
22
|
+
{
|
|
23
|
+
"packName": "application-datatable-grid-shell",
|
|
24
|
+
"packVersion": "1.0.0",
|
|
25
|
+
"blueprintSlug": "application-datatable",
|
|
26
|
+
"applicable": true,
|
|
27
|
+
"checks": [
|
|
28
|
+
{ "id": "AC-17101-1", "verdict": "pass", "severity": "block" },
|
|
29
|
+
{ "id": "AC-17101-2", "applicable": false, "detail": "check-level appliesTo: capability datatable-server-side-sort not applied" },
|
|
30
|
+
{ "id": "AC-17101-3", "verdict": "pass", "severity": "warn" }
|
|
31
|
+
]
|
|
32
|
+
}
|
|
33
|
+
],
|
|
34
|
+
"verdict": "pass"
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
{
|
|
2
|
+
"reqId": "REQ-201",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"title": "Application cache stays fresh within a stated ceiling",
|
|
5
|
+
"description": "The application cache surfaces stale reads no older than the ceiling stated in the delivering TAC's replication guarantee.",
|
|
6
|
+
"category": "nonFunctional",
|
|
7
|
+
"domain": "cache",
|
|
8
|
+
"priority": "must",
|
|
9
|
+
"rationale": "Stale reads beyond the ceiling break invalidation-sensitive views.",
|
|
10
|
+
"tags": ["cache", "freshness"],
|
|
11
|
+
"version": "1.0.0",
|
|
12
|
+
"status": "approved",
|
|
13
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
14
|
+
"updatedAt": "2026-09-09T00:00:00Z",
|
|
15
|
+
"deliveredBy": {
|
|
16
|
+
"tacId": "TAC-401-cache-aside-store",
|
|
17
|
+
"field": "responsibilities.replicationCeiling"
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
{
|
|
2
|
+
"usId": "US-201",
|
|
3
|
+
"prdId": "PRD-100",
|
|
4
|
+
"reqId": "REQ-201",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"status": "approved",
|
|
7
|
+
"title": "Deploy a Durable Object namespace with a migration record",
|
|
8
|
+
"asA": "operator deploying a Worker that mints a Durable Object namespace",
|
|
9
|
+
"iWant": "the wrangler configuration and migration record to be consistent with the platform's minting rules",
|
|
10
|
+
"soThat": "the deploy succeeds and the namespace mints on the current backend",
|
|
11
|
+
"acceptanceCriteria": [
|
|
12
|
+
{
|
|
13
|
+
"id": "AC-201-1",
|
|
14
|
+
"description": "The migration record carries the new_sqlite_classes keyword against every minted class name.",
|
|
15
|
+
"given": "a Worker configuration with a Durable Object binding block",
|
|
16
|
+
"when": "the deploy runs",
|
|
17
|
+
"then": "the migration record uses the vendor-current keyword and the deploy succeeds",
|
|
18
|
+
"testable": true,
|
|
19
|
+
"scope": "deployed",
|
|
20
|
+
"ownerRef": {
|
|
21
|
+
"tacId": "TAC-401-durable-objects-namespace",
|
|
22
|
+
"field": "interfaces.migration.keyword"
|
|
23
|
+
},
|
|
24
|
+
"disposition": "fixed",
|
|
25
|
+
"vendorCitation": {
|
|
26
|
+
"url": "https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/",
|
|
27
|
+
"verifiedOn": "2026-09-08"
|
|
28
|
+
}
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "AC-201-2",
|
|
32
|
+
"description": "The wrangler binding names commit to the project's chosen class names on both binding blocks.",
|
|
33
|
+
"given": "a Worker configuration with a Durable Object binding block",
|
|
34
|
+
"when": "the applying agent has substituted the project's chosen class names",
|
|
35
|
+
"then": "each binding's class_name appears once in the migration record",
|
|
36
|
+
"testable": true,
|
|
37
|
+
"scope": "runtime",
|
|
38
|
+
"ownerRef": {
|
|
39
|
+
"tacId": "TAC-401-durable-objects-namespace",
|
|
40
|
+
"field": "interfaces.wrangler.bindings"
|
|
41
|
+
},
|
|
42
|
+
"disposition": "template"
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
"createdAt": "2026-01-01T00:00:00Z",
|
|
46
|
+
"updatedAt": "2026-09-09T00:00:00Z"
|
|
47
|
+
}
|
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.6.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. 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. From 0.4.4 the manifest carries two optional additive sections that host the blueprint-library mechanism: blueprints[] (applied-blueprints registry written by rcf blueprint add / remove / upgrade) and standards[] (standards-pack registry written at rcf init and rcf standards add). From 0.4.5 the manifest additionally carries an optional resolutions[] section: one entry per operator-authored resolution of a cross-blueprint conflict, keyed at first by the globalAdrTopic conflict class (two applied blueprints each contributing a scope:global ADR on the same topic, resolved by a project-level ADR that supersedes both). Written by rcf blueprint supersede and by rcf blueprint add --resolve; read by the conflict detector so the resolved conflict is honoured and both blueprint ADRs may co-reside as superseded history. From 0.5.1 the appliedBlueprintRecord carries an optional libraryPrefix (blueprintSlug), stamped when an apply resolves through a registered external blueprint library so the library-registered ownership is durable on the record itself rather than derived by string-matching source; absent for shelf or path applies. 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. From 0.4.4 the manifest carries two optional additive sections that host the blueprint-library mechanism: blueprints[] (applied-blueprints registry written by rcf blueprint add / remove / upgrade) and standards[] (standards-pack registry written at rcf init and rcf standards add). From 0.4.5 the manifest additionally carries an optional resolutions[] section: one entry per operator-authored resolution of a cross-blueprint conflict, keyed at first by the globalAdrTopic conflict class (two applied blueprints each contributing a scope:global ADR on the same topic, resolved by a project-level ADR that supersedes both). Written by rcf blueprint supersede and by rcf blueprint add --resolve; read by the conflict detector so the resolved conflict is honoured and both blueprint ADRs may co-reside as superseded history. From 0.5.1 the appliedBlueprintRecord carries an optional libraryPrefix (blueprintSlug), stamped when an apply resolves through a registered external blueprint library so the library-registered ownership is durable on the record itself rather than derived by string-matching source; absent for shelf or path applies. From 0.6.3 the manifest additionally carries an optional shipWithoutEval[] section written by rcf finalise --ship-without-eval (sister of shipWithoutVerified; acknowledges EVAL-MISSING or EVAL-BELOW-THRESHOLD per-AC verdicts on the verify report and carries the operator's reason string); and the browserVerificationProbePackCheck item accepts an optional applicable:boolean flag, letting a check-level appliesTo predicate record applicable:false without a verdict or severity (aggregate verdict treats such a check as neither pass nor fail). 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"],
|
|
@@ -56,6 +56,11 @@
|
|
|
56
56
|
"items": { "$ref": "#/$defs/shipWithoutVerifiedRecord" },
|
|
57
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
58
|
},
|
|
59
|
+
"shipWithoutEval": {
|
|
60
|
+
"type": "array",
|
|
61
|
+
"items": { "$ref": "#/$defs/shipWithoutEvalRecord" },
|
|
62
|
+
"description": "Operator acknowledgements recorded when rcf finalise --ship-without-eval acknowledges an EVAL-MISSING or EVAL-BELOW-THRESHOLD per-AC verdict on the verify report and ships the FBS at complete without a passing EVAL. One entry per acknowledgement. Sister of shipWithoutVerified; carries the operator's --ship-without-eval reason string on the record (rcf-eval-node spec sections 5.2 and 8). The ack is durable and greppable at ship time."
|
|
63
|
+
},
|
|
59
64
|
"blueprints": {
|
|
60
65
|
"type": "array",
|
|
61
66
|
"items": { "$ref": "#/$defs/appliedBlueprintRecord" },
|
|
@@ -502,23 +507,44 @@
|
|
|
502
507
|
"browserVerificationProbePackCheck": {
|
|
503
508
|
"type": "object",
|
|
504
509
|
"additionalProperties": false,
|
|
505
|
-
"required": ["id"
|
|
510
|
+
"required": ["id"],
|
|
506
511
|
"properties": {
|
|
507
512
|
"id": {
|
|
508
513
|
"type": "string",
|
|
509
514
|
"minLength": 1,
|
|
510
515
|
"description": "Check id. For a browser check the id equals an AC id contributed by the same blueprint (loader cross-checks this at pack load time)."
|
|
511
516
|
},
|
|
517
|
+
"applicable": {
|
|
518
|
+
"type": "boolean",
|
|
519
|
+
"description": "Optional check-level applicability flag. When present and false, the check's own appliesTo predicate returned false (typically because the applied capability set does not include a capability the check depends on); verdict and severity are then omitted and the aggregate verdict treats the check as neither pass nor fail. When absent or true, verdict and severity are required as before. Mirrors the pack-level applicable boolean on browserVerificationProbePack. Emitted by packages/rcf-lite/src/browser-verify/pack-runner.js from rcf-lite 0.28.0."
|
|
520
|
+
},
|
|
512
521
|
"verdict": {
|
|
513
522
|
"enum": ["pass", "warn", "fail", "skipped"],
|
|
514
|
-
"description": "Check verdict. skipped is emitted by the pack-runner when a browser check's dependsOn pre-check failed."
|
|
523
|
+
"description": "Check verdict. skipped is emitted by the pack-runner when a browser check's dependsOn pre-check failed. Required when applicable is absent or true; omitted when applicable is false."
|
|
515
524
|
},
|
|
516
525
|
"severity": {
|
|
517
526
|
"enum": ["block", "warn", "advisory"],
|
|
518
|
-
"description": "Check severity, copied from the pack declaration. Feeds the aggregate verdict rule per spec section 3.4."
|
|
527
|
+
"description": "Check severity, copied from the pack declaration. Feeds the aggregate verdict rule per spec section 3.4. Required when applicable is absent or true; omitted when applicable is false."
|
|
519
528
|
},
|
|
520
529
|
"detail": { "type": "string" }
|
|
521
|
-
}
|
|
530
|
+
},
|
|
531
|
+
"allOf": [
|
|
532
|
+
{
|
|
533
|
+
"if": {
|
|
534
|
+
"not": {
|
|
535
|
+
"properties": { "applicable": { "const": false } },
|
|
536
|
+
"required": ["applicable"]
|
|
537
|
+
}
|
|
538
|
+
},
|
|
539
|
+
"then": {
|
|
540
|
+
"properties": {
|
|
541
|
+
"verdict": true,
|
|
542
|
+
"severity": true
|
|
543
|
+
},
|
|
544
|
+
"required": ["verdict", "severity"]
|
|
545
|
+
}
|
|
546
|
+
}
|
|
547
|
+
]
|
|
522
548
|
},
|
|
523
549
|
"browserVerificationRoute": {
|
|
524
550
|
"type": "object",
|
|
@@ -846,6 +872,53 @@
|
|
|
846
872
|
}
|
|
847
873
|
}
|
|
848
874
|
},
|
|
875
|
+
"shipWithoutEvalRecord": {
|
|
876
|
+
"type": "object",
|
|
877
|
+
"additionalProperties": false,
|
|
878
|
+
"required": ["id", "fbsId", "ackedAt", "reason", "declaredAcs", "reportPath"],
|
|
879
|
+
"properties": {
|
|
880
|
+
"id": {
|
|
881
|
+
"type": "string",
|
|
882
|
+
"pattern": "^swe-FBS-\\d{3,}(?:-[a-z0-9]+(?:-[a-z0-9]+)*)?-\\d+$",
|
|
883
|
+
"description": "Ship-without-eval acknowledgement id. Format: swe-<fbsId>-<n>; the trailing integer increments per acknowledgement of the same FBS. Accepts both numeric-only and kebab-slug FBS ids. Sister of the shipWithoutVerified swv- id family."
|
|
884
|
+
},
|
|
885
|
+
"fbsId": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/fbsId" },
|
|
886
|
+
"ackedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/timestamp" },
|
|
887
|
+
"reason": {
|
|
888
|
+
"type": "string",
|
|
889
|
+
"minLength": 1,
|
|
890
|
+
"description": "Operator-supplied reason string passed on the finalise command (rcf finalise --ship-without-eval \"<reason>\"). Required and non-empty; the acknowledgement's purpose is to record why the operator shipped without a passing EVAL."
|
|
891
|
+
},
|
|
892
|
+
"declaredAcs": {
|
|
893
|
+
"type": "array",
|
|
894
|
+
"minItems": 1,
|
|
895
|
+
"items": { "$ref": "#/$defs/shipWithoutEvalDeclaredAc" },
|
|
896
|
+
"description": "The per-AC verdicts on the verify report that the operator acknowledged. At least one entry, otherwise there is nothing to acknowledge."
|
|
897
|
+
},
|
|
898
|
+
"reportPath": {
|
|
899
|
+
"type": "string",
|
|
900
|
+
"minLength": 1,
|
|
901
|
+
"description": "Path (repo-relative or absolute as recorded by finalise) to the verify report file that carried the acknowledged verdicts."
|
|
902
|
+
}
|
|
903
|
+
},
|
|
904
|
+
"description": "Operator acknowledgement recorded on rcf finalise --ship-without-eval. Records the FBS, the operator's reason string, the verify verdicts acknowledged, and the report they came from, so the ack is durable and greppable at ship time. Written by packages/rcf-lite/src/finalise/ship-without-eval.js."
|
|
905
|
+
},
|
|
906
|
+
"shipWithoutEvalDeclaredAc": {
|
|
907
|
+
"type": "object",
|
|
908
|
+
"additionalProperties": false,
|
|
909
|
+
"required": ["acId", "verdict"],
|
|
910
|
+
"properties": {
|
|
911
|
+
"acId": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/acId" },
|
|
912
|
+
"verdict": {
|
|
913
|
+
"enum": ["EVAL-MISSING", "EVAL-BELOW-THRESHOLD"],
|
|
914
|
+
"description": "The verify per-AC verdict class the operator acknowledged. Only these two verdict classes are legitimately acknowledgeable via --ship-without-eval."
|
|
915
|
+
},
|
|
916
|
+
"reason": {
|
|
917
|
+
"type": "string",
|
|
918
|
+
"description": "Optional verify-supplied reason string carried through from the report entry."
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
},
|
|
849
922
|
"appliedBlueprintRecord": {
|
|
850
923
|
"type": "object",
|
|
851
924
|
"additionalProperties": false,
|
package/schemas/req.schema.json
CHANGED
|
@@ -35,9 +35,24 @@
|
|
|
35
35
|
"status": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/authoringStatus" },
|
|
36
36
|
"createdAt": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/timestamp" },
|
|
37
37
|
"updatedAt": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/timestamp" },
|
|
38
|
-
"shapeClassification": { "$ref": "#/$defs/reqShapeClassification" }
|
|
38
|
+
"shapeClassification": { "$ref": "#/$defs/reqShapeClassification" },
|
|
39
|
+
"deliveredBy": { "$ref": "#/$defs/deliveredBy" }
|
|
39
40
|
},
|
|
40
41
|
"$defs": {
|
|
42
|
+
"deliveredBy": {
|
|
43
|
+
"type": "object",
|
|
44
|
+
"additionalProperties": false,
|
|
45
|
+
"properties": {
|
|
46
|
+
"tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/tacId" },
|
|
47
|
+
"adrId": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/adrId" },
|
|
48
|
+
"field": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"minLength": 1,
|
|
51
|
+
"description": "Optional dotted path into the owning TAC or ADR record (for example, 'principal.fields' or 'decision.retryPolicy') that pinpoints the delivering surface. Optional; presence is not enforced."
|
|
52
|
+
}
|
|
53
|
+
},
|
|
54
|
+
"description": "Optional back-reference on a REQ naming the TAC or ADR that delivers the requirement's externally promised property. All sub-fields are optional at schema level so the record composes additively; ruleset-enforcing consumers may require at least one of tacId or adrId when the REQ carries a delivery promise."
|
|
55
|
+
},
|
|
41
56
|
"reqShapeClassification": {
|
|
42
57
|
"type": "object",
|
|
43
58
|
"additionalProperties": false,
|
|
@@ -68,9 +68,49 @@
|
|
|
68
68
|
"enum": ["deterministic", "nonDeterministic"],
|
|
69
69
|
"description": "Whether the AC's observable output is deterministic (same inputs, same outputs) or non-deterministic (LLM-generated text, ranked results, generated code, judgement calls). Optional at schema level; absence is treated as 'deterministic' by every consumer. Governs whether an EVAL is required by rcf audit eval coverage --strict and whether the merge gate emits EVAL-MISSING or EVAL-BELOW-THRESHOLD per-AC verdicts."
|
|
70
70
|
},
|
|
71
|
+
"ownerRef": { "$ref": "#/$defs/acOwnerRef" },
|
|
72
|
+
"disposition": { "$ref": "#/$defs/acDisposition" },
|
|
73
|
+
"vendorCitation": { "$ref": "#/$defs/acVendorCitation" },
|
|
71
74
|
"provenance": { "$ref": "#/$defs/acProvenance" }
|
|
72
75
|
}
|
|
73
76
|
},
|
|
77
|
+
"acOwnerRef": {
|
|
78
|
+
"type": "object",
|
|
79
|
+
"additionalProperties": false,
|
|
80
|
+
"properties": {
|
|
81
|
+
"tacId": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/tacId" },
|
|
82
|
+
"adrId": { "$ref": "https://schemas.stravica.io/rcf/v0.6.0/common.schema.json#/$defs/adrId" },
|
|
83
|
+
"field": {
|
|
84
|
+
"type": "string",
|
|
85
|
+
"minLength": 1,
|
|
86
|
+
"description": "Optional dotted path into the owning TAC or ADR record (for example, 'interfaces.principal.fields' or 'decision.retryPolicy') that pinpoints the referenced surface. Optional; presence is not enforced."
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
"description": "Optional back-reference on an acceptance criterion naming the owning TAC or ADR the criterion observes rather than restating. All sub-fields are optional at schema level so the record composes additively; ruleset-enforcing consumers may require at least one of tacId or adrId when the criterion references an owning artefact."
|
|
90
|
+
},
|
|
91
|
+
"acDisposition": {
|
|
92
|
+
"enum": ["fixed", "template"],
|
|
93
|
+
"description": "Marks whether an acceptance criterion is the blueprint's to fix (mechanism-invariant, inherited unchanged by every applying project) or the applying agent's to set (project-parameterised, shape-given and value-open). Optional at schema level; consumer rulesets that gate blueprint contributions may require it on every AC of a shipped blueprint. Absence carries no default: a consumer that requires the marker treats an unmarked AC as a defect, and a consumer that does not require it ignores the absence."
|
|
94
|
+
},
|
|
95
|
+
"acVendorCitation": {
|
|
96
|
+
"type": "object",
|
|
97
|
+
"additionalProperties": false,
|
|
98
|
+
"required": ["url", "verifiedOn"],
|
|
99
|
+
"properties": {
|
|
100
|
+
"url": {
|
|
101
|
+
"type": "string",
|
|
102
|
+
"format": "uri",
|
|
103
|
+
"minLength": 1,
|
|
104
|
+
"description": "Vendor documentation URL the third-party fact rests on. Consumers may fetch it at gate time so a dead link is a finding."
|
|
105
|
+
},
|
|
106
|
+
"verifiedOn": {
|
|
107
|
+
"type": "string",
|
|
108
|
+
"format": "date",
|
|
109
|
+
"description": "ISO-8601 date (YYYY-MM-DD) the vendor fact was verified against the cited URL. Consumers compare against their own tolerance window and refuse or warn when the citation is beyond it."
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
"description": "Vendor citation for an acceptance criterion whose truth rests on a third-party platform fact. Optional at schema level; consumer rulesets may require it on any AC that asserts a vendor fact (for example, a platform migration keyword or a rate-limit value)."
|
|
113
|
+
},
|
|
74
114
|
"acProvenance": {
|
|
75
115
|
"type": "object",
|
|
76
116
|
"additionalProperties": false,
|