rcf-lite 0.19.0 → 0.21.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 +38 -0
- package/bin/rcf.js +5 -0
- package/blueprints/application-admin-console/CHANGELOG.md +11 -0
- package/blueprints/application-admin-console/README.md +98 -0
- package/blueprints/application-admin-console/blueprint.json +226 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +25 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2202-application-admin-console-baseline-roles.json +25 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +20 -0
- package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +20 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-001.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +18 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +18 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +40 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +44 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2203-application-admin-console-permission-matrix.json +34 -0
- package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +40 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +28 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +34 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +27 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +33 -0
- package/blueprints/application-admin-console/docs/topics.md +35 -0
- package/blueprints/application-admin-console/guide/application-admin-console.md +29 -0
- package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +182 -0
- package/blueprints/application-api-rest/docs/topics.md +5 -0
- package/blueprints/application-charts/CHANGELOG.md +12 -0
- package/blueprints/application-charts/README.md +73 -0
- package/blueprints/application-charts/blueprint.json +26 -0
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +25 -0
- package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +25 -0
- package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.json +25 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +15 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +15 -0
- package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +42 -0
- package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +40 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +35 -0
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +35 -0
- package/blueprints/application-charts/docs/topics.md +37 -0
- package/blueprints/application-charts/guide/application-charts.md +44 -0
- package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +191 -0
- package/blueprints/application-dashboard/CHANGELOG.md +10 -0
- package/blueprints/application-dashboard/README.md +102 -0
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +124 -0
- package/blueprints/application-dashboard/blueprint.json +29 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +25 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +25 -0
- package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.json +25 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-001.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +15 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +15 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +47 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +41 -0
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +35 -0
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +35 -0
- package/blueprints/application-dashboard/docs/topics.md +43 -0
- package/blueprints/application-dashboard/guide/application-dashboard.md +48 -0
- package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +231 -0
- package/blueprints/application-datatable/CHANGELOG.md +8 -0
- package/blueprints/application-datatable/README.md +43 -0
- package/blueprints/application-datatable/blueprint.json +33 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +25 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +20 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +20 -0
- package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +20 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-001.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +15 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +15 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +50 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +39 -0
- package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +28 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +44 -0
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +44 -0
- package/blueprints/application-datatable/docs/topics.md +35 -0
- package/blueprints/application-datatable/guide/application-datatable.md +38 -0
- package/blueprints/application-datatable/probe-packs/application-datatable.pack.mjs +240 -0
- package/blueprints/application-error-handling/docs/topics.md +5 -0
- package/blueprints/application-notifications-in-app/CHANGELOG.md +9 -0
- package/blueprints/application-notifications-in-app/README.md +80 -0
- package/blueprints/application-notifications-in-app/blueprint.json +30 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2102-application-notifications-in-app-toast-timeout-floor.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2103-application-notifications-in-app-retention-window.json +25 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-001.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +15 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +46 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +52 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +40 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +35 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +26 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +26 -0
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +26 -0
- package/blueprints/application-notifications-in-app/docs/topics.md +39 -0
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +47 -0
- package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +328 -0
- package/blueprints/application-spa/docs/topics.md +5 -0
- package/blueprints/delivery-ci-workflows/docs/topics.md +5 -0
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +5 -0
- package/blueprints/email-smtp-resend/docs/topics.md +5 -0
- package/blueprints/observability-essentials/docs/topics.md +5 -0
- package/blueprints/observability-logging/CHANGELOG.md +5 -0
- package/blueprints/observability-logging/README.md +1 -1
- package/blueprints/observability-logging/blueprint.json +113 -21
- package/blueprints/observability-logging/docs/topics.md +5 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +5 -0
- package/blueprints/persistence-data-d1/docs/topics.md +5 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +5 -0
- package/blueprints/security-auth-clerk/CHANGELOG.md +5 -0
- package/blueprints/security-auth-clerk/blueprint.json +2 -1
- package/blueprints/security-auth-clerk/docs/topics.md +5 -0
- package/blueprints/security-auth-keycloak/CHANGELOG.md +5 -0
- package/blueprints/security-auth-keycloak/blueprint.json +2 -1
- package/blueprints/security-auth-keycloak/docs/topics.md +5 -0
- package/blueprints/security-auth-magic-link/CHANGELOG.md +5 -0
- package/blueprints/security-auth-magic-link/blueprint.json +2 -1
- package/blueprints/security-auth-magic-link/docs/topics.md +5 -0
- package/blueprints/security-auth-oauth2/CHANGELOG.md +5 -0
- package/blueprints/security-auth-oauth2/blueprint.json +2 -1
- package/blueprints/security-auth-oauth2/docs/topics.md +5 -0
- package/blueprints/security-secrets-management/docs/topics.md +5 -0
- package/fixtures/canary-manifest.json +9 -9
- package/package.json +2 -2
- package/rcf/code-nodes/cn-098.json +13 -0
- package/rcf/code-nodes/cn-099.json +13 -0
- package/rcf/code-nodes/cn-100.json +13 -0
- package/rcf/code-nodes/cn-101.json +13 -0
- package/rcf/code-nodes/cn-102.json +13 -0
- package/rcf/code-nodes/cn-103.json +13 -0
- package/rcf/code-nodes/cn-104.json +13 -0
- package/rcf/code-nodes/cn-105.json +13 -0
- package/rcf/code-nodes/cn-106.json +13 -0
- package/rcf/code-nodes/cn-107.json +14 -0
- package/rcf/code-nodes/cn-108.json +13 -0
- package/rcf/code-nodes/cn-109.json +12 -0
- package/rcf/code-nodes/cn-110.json +12 -0
- package/rcf/code-nodes/cn-111.json +14 -0
- package/rcf/code-nodes/cn-112.json +14 -0
- package/rcf/code-nodes/cn-113.json +12 -0
- package/rcf/code-nodes/cn-114.json +13 -0
- package/rcf/code-nodes/cn-115.json +13 -0
- package/rcf/code-nodes/cn-116.json +12 -0
- package/rcf/code-nodes/cn-117.json +13 -0
- package/rcf/code-nodes/cn-118.json +13 -0
- package/rcf/code-nodes/cn-119.json +13 -0
- package/rcf/code-nodes/cn-120.json +13 -0
- package/rcf/code-nodes/cn-121.json +12 -0
- package/rcf/code-nodes/cn-122.json +12 -0
- package/rcf/code-nodes/cn-123.json +13 -0
- package/rcf/code-nodes/cn-124.json +13 -0
- package/rcf/code-nodes/cn-125.json +13 -0
- package/rcf/code-nodes/cn-126.json +13 -0
- package/rcf/code-nodes/cn-127.json +12 -0
- package/rcf/code-nodes/cn-128.json +14 -0
- package/rcf/code-nodes/cn-129.json +14 -0
- package/rcf/code-nodes/cn-130.json +14 -0
- package/rcf/code-nodes/cn-131.json +15 -0
- package/rcf/code-nodes/cn-132.json +12 -0
- package/rcf/code-nodes/cn-133.json +13 -0
- package/rcf/evals/eval-001.json +55 -0
- package/rcf/fbs/fbs-035.json +18 -0
- package/rcf/fbs/fbs-036.json +22 -0
- package/rcf/fbs/fbs-037.json +19 -0
- package/rcf/fbs/fbs-038.json +19 -0
- package/rcf/fbs/fbs-039.json +21 -0
- package/rcf/fbs/fbs-040.json +20 -0
- package/rcf/fbs/fbs-041.json +13 -0
- package/rcf/fbs/fbs-042.json +13 -0
- package/rcf/requirements/req-016.json +37 -0
- package/rcf/requirements/req-017.json +18 -0
- package/rcf/requirements/req-018.json +18 -0
- package/rcf/requirements/req-019.json +38 -0
- package/rcf/requirements/req-020.json +13 -0
- package/rcf/requirements/req-021.json +13 -0
- package/rcf/requirements/req-022.json +13 -0
- package/rcf/requirements/req-023.json +14 -0
- package/rcf/test-suites/ts-045.json +46 -0
- package/rcf/test-suites/ts-046.json +78 -0
- package/rcf/test-suites/ts-047.json +54 -0
- package/rcf/test-suites/ts-048.json +54 -0
- package/rcf/test-suites/ts-049.json +70 -0
- package/rcf/test-suites/ts-050.json +69 -0
- package/rcf/test-suites/ts-051.json +22 -0
- package/rcf/test-suites/ts-052.json +20 -0
- package/rcf/user-stories/us-1601.json +37 -0
- package/rcf/user-stories/us-1701.json +56 -0
- package/rcf/user-stories/us-1801.json +40 -0
- package/rcf/user-stories/us-1901.json +40 -0
- package/rcf/user-stories/us-2001.json +50 -0
- package/rcf/user-stories/us-2101.json +45 -0
- package/rcf/user-stories/us-2201.json +60 -0
- package/rcf/user-stories/us-2301.json +51 -0
- package/releases/releases.yaml +20 -1
- package/src/blueprint/apply.js +98 -1
- package/src/blueprint/capabilities.js +318 -0
- package/src/blueprint/loader.js +247 -0
- package/src/browser-verify/boot.js +180 -0
- package/src/browser-verify/index.js +13 -0
- package/src/browser-verify/manifest-writer.js +31 -6
- package/src/browser-verify/pack-browser.js +294 -0
- package/src/browser-verify/pack-loader.js +176 -0
- package/src/browser-verify/pack-runner.js +193 -0
- package/src/browser-verify/pack-schema.js +155 -0
- package/src/browser-verify/runner.js +24 -1
- package/src/cli/blueprint.js +92 -0
- package/src/cli/browser-verify.js +147 -7
- package/src/cli/create.js +14 -0
- package/src/cli/eval-coverage.js +221 -0
- package/src/cli/eval.js +43 -0
- package/src/cli/finalise.js +64 -0
- package/src/cli/help.js +4 -0
- package/src/core/errors/index.js +7 -0
- package/src/core/store/ids.js +5 -1
- package/src/core/store/init.js +4 -0
- package/src/core/store/loader.js +4 -0
- package/src/core/store/validator.js +8 -1
- package/src/core/store/walker.js +71 -2
- package/src/core/store/writer.js +4 -0
- package/src/eval/judge.js +338 -0
- package/src/finalise/index.js +8 -0
- package/src/finalise/ingest.js +27 -0
- package/src/finalise/ship-without-eval.js +123 -0
- package/src/query/eval-coverage.js +162 -0
- package/src/verify/chain/index.js +67 -0
- package/src/verify/cli/run.js +15 -0
- package/src/verify/engine/index.js +10 -0
- package/src/verify/verdict/index.js +46 -0
package/src/cli/finalise.js
CHANGED
|
@@ -37,13 +37,17 @@ import { kindOf } from '../query/index.js';
|
|
|
37
37
|
import {
|
|
38
38
|
buildVerifyArgs,
|
|
39
39
|
composeShipWithoutVerifiedRecord,
|
|
40
|
+
composeShipWithoutEvalRecord,
|
|
40
41
|
detectVerify,
|
|
42
|
+
findEvalRefusalAcs,
|
|
41
43
|
findMockOnlyDeclaredAcs,
|
|
42
44
|
loadReport,
|
|
45
|
+
reportHasEvalRefusal,
|
|
43
46
|
reportHasMockOnlyDeclared,
|
|
44
47
|
resolveAbsentVerify,
|
|
45
48
|
spawnVerify,
|
|
46
49
|
summariseReport,
|
|
50
|
+
writeShipWithoutEvalRecord,
|
|
47
51
|
writeShipWithoutVerifiedRecord,
|
|
48
52
|
} from '../finalise/index.js';
|
|
49
53
|
|
|
@@ -74,6 +78,11 @@ const OPTION_SPEC = {
|
|
|
74
78
|
// ship the FBS 'complete' without promoting to 'verified'. Records
|
|
75
79
|
// the operator's ack on the manifest.
|
|
76
80
|
'ship-without-verified': { type: 'boolean' },
|
|
81
|
+
// rcf-eval-node spec 2026-09-04 sections 5.2 + 8: sister opt-out for
|
|
82
|
+
// EVAL-MISSING / EVAL-BELOW-THRESHOLD. Takes a mandatory reason
|
|
83
|
+
// string (spec section 8: missing reason exits 2). Shape mirrors
|
|
84
|
+
// `--provision`: a value that looks like a flag is refused.
|
|
85
|
+
'ship-without-eval': { type: 'string' },
|
|
77
86
|
quiet: { type: 'boolean' },
|
|
78
87
|
help: { type: 'boolean' },
|
|
79
88
|
};
|
|
@@ -123,6 +132,13 @@ Options:
|
|
|
123
132
|
'complete'. Without this flag, the gate
|
|
124
133
|
refuses to promote when any AC lands in
|
|
125
134
|
those verdicts.
|
|
135
|
+
--ship-without-eval "..." Acknowledge EVAL-MISSING /
|
|
136
|
+
EVAL-BELOW-THRESHOLD per-AC verdicts and
|
|
137
|
+
proceed with an audit-log entry
|
|
138
|
+
(rcf-eval-node spec section 5.2). Reason
|
|
139
|
+
string is mandatory; a missing reason exits
|
|
140
|
+
2. The ack lands on the manifest under
|
|
141
|
+
shipWithoutEval[] with a monotonic id.
|
|
126
142
|
--quiet Suppress non-error confirmations
|
|
127
143
|
--help Print this help
|
|
128
144
|
|
|
@@ -345,6 +361,54 @@ export async function main(argv, deps = {}) {
|
|
|
345
361
|
stderr.write(`Report: ${outPath}\n`);
|
|
346
362
|
return 4;
|
|
347
363
|
}
|
|
364
|
+
// rcf-eval-node spec section 5.2: EVAL-MISSING / EVAL-BELOW-THRESHOLD
|
|
365
|
+
// refusal, sister of the mock-only refusal above. Opt-out via
|
|
366
|
+
// --ship-without-eval "<reason>"; missing reason exits 2, matching
|
|
367
|
+
// the ship-without-verified argv-shape lesson.
|
|
368
|
+
if (passLoaded.ok && reportHasEvalRefusal(passLoaded.report)) {
|
|
369
|
+
const evalDeclared = findEvalRefusalAcs(passLoaded.report);
|
|
370
|
+
const missingAcIds = evalDeclared.filter((e) => e.verdict === 'EVAL-MISSING').map((e) => e.acId);
|
|
371
|
+
const belowAcIds = evalDeclared.filter((e) => e.verdict === 'EVAL-BELOW-THRESHOLD').map((e) => e.acId);
|
|
372
|
+
const swe = flags['ship-without-eval'];
|
|
373
|
+
if (swe !== undefined) {
|
|
374
|
+
// A --ship-without-eval that looks like a flag is a swallowed
|
|
375
|
+
// next option; refuse it (parallel to the --provision guard).
|
|
376
|
+
if (typeof swe !== 'string' || swe.startsWith('-') || swe.trim().length === 0) {
|
|
377
|
+
stderr.write('[error] usage finalise: --ship-without-eval requires a reason string\n');
|
|
378
|
+
return 2;
|
|
379
|
+
}
|
|
380
|
+
const evalAck = composeShipWithoutEvalRecord({
|
|
381
|
+
manifest: tree.manifest,
|
|
382
|
+
fbsId,
|
|
383
|
+
reason: swe,
|
|
384
|
+
declaredAcs: evalDeclared,
|
|
385
|
+
reportPath: outPath,
|
|
386
|
+
});
|
|
387
|
+
const evalAckResult = await writeShipWithoutEvalRecord({
|
|
388
|
+
projectRoot, tree, record: evalAck,
|
|
389
|
+
});
|
|
390
|
+
if (isRcfError(evalAckResult)) {
|
|
391
|
+
if (evalAckResult.kind === 'ioFailure') { writeUnexpectedFailure(evalAckResult, stderr); return 1; }
|
|
392
|
+
stderr.write(`[error] ${evalAckResult.kind} ${evalAckResult.message}\n`);
|
|
393
|
+
if (evalAckResult.kind === 'validation' || evalAckResult.kind === 'brokenReference') return 3;
|
|
394
|
+
return 1;
|
|
395
|
+
}
|
|
396
|
+
if (!quiet) {
|
|
397
|
+
stdout.write(`[finalise] gate passed and ${evalDeclared.length} AC(s) came back with EVAL refusals; --ship-without-eval acknowledged (${evalAck.id} on rcf/manifest.json, reason: ${swe}); ${fbsId} left '${currentStatus}'. Report: ${outPath}\n`);
|
|
398
|
+
stdout.write(summariseReport(passLoaded.report));
|
|
399
|
+
}
|
|
400
|
+
return 0;
|
|
401
|
+
}
|
|
402
|
+
if (missingAcIds.length > 0) {
|
|
403
|
+
stderr.write(`finalise refused: EVAL missing on AC(s) ${missingAcIds.join(', ')}; author an EVAL or --ship-without-eval "reason"\n`);
|
|
404
|
+
}
|
|
405
|
+
if (belowAcIds.length > 0) {
|
|
406
|
+
stderr.write(`finalise refused: EVAL below threshold on AC(s) ${belowAcIds.join(', ')}; investigate the run record or --ship-without-eval "reason"\n`);
|
|
407
|
+
}
|
|
408
|
+
stderr.write(summariseReport(passLoaded.report));
|
|
409
|
+
stderr.write(`Report: ${outPath}\n`);
|
|
410
|
+
return 4;
|
|
411
|
+
}
|
|
348
412
|
const result = await updateDocument({
|
|
349
413
|
projectRoot, tree, id: fbsId, sets: [{ path: 'executionStatus', value: 'verified' }], options: {},
|
|
350
414
|
});
|
package/src/cli/help.js
CHANGED
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
|
|
16
16
|
import { HELP as BUILD_HELP } from './build.js';
|
|
17
17
|
import { HELP as COVERAGE_HELP } from './coverage.js';
|
|
18
|
+
import { HELP as AUDIT_EVAL_HELP } from './eval.js';
|
|
18
19
|
import { HELP as CREATE_HELP } from './create.js';
|
|
19
20
|
import { HELP as DELETE_HELP } from './delete.js';
|
|
20
21
|
import { HELP as DOCTOR_HELP } from './doctor.js';
|
|
@@ -237,6 +238,8 @@ Verbs:
|
|
|
237
238
|
view Live HTML tree render (long-running server).
|
|
238
239
|
coverage [scope-id] Structural coverage over the PRD -> REQ -> US ->
|
|
239
240
|
AC -> TS -> TC chain.
|
|
241
|
+
eval coverage [scope-id] EVAL coverage over nonDeterministic ACs
|
|
242
|
+
(spec rcf-eval-node-2026-09-04 section 4).
|
|
240
243
|
trace <id> Walk the graph forward, back, or both from a node.
|
|
241
244
|
impact <id> Change-impact fan-out from a node.
|
|
242
245
|
|
|
@@ -299,6 +302,7 @@ export const HELP_MAP = {
|
|
|
299
302
|
coverage: COVERAGE_HELP,
|
|
300
303
|
trace: TRACE_HELP,
|
|
301
304
|
impact: IMPACT_HELP,
|
|
305
|
+
eval: AUDIT_EVAL_HELP,
|
|
302
306
|
},
|
|
303
307
|
};
|
|
304
308
|
|
package/src/core/errors/index.js
CHANGED
|
@@ -42,6 +42,13 @@ const VALID_KINDS = new Set([
|
|
|
42
42
|
// individually schema-clean) and from `brokenReference` (nothing
|
|
43
43
|
// dangles; the graph is over-connected, not under-connected).
|
|
44
44
|
'duplicateId',
|
|
45
|
+
// Visual round T-5 (spec section 5.5.1): a consumer blueprint whose
|
|
46
|
+
// requiresAppliedCapabilities gate refuses because no applied
|
|
47
|
+
// blueprint declares any of the required capabilities AND the CLI
|
|
48
|
+
// did not pass the allow-skip flag. The apply verb returns this kind
|
|
49
|
+
// with the spec-verbatim refusal message; the CLI translates it to
|
|
50
|
+
// exit 3 (not exit 2) with the message printed as-is on stderr.
|
|
51
|
+
'requiresAppliedCapabilities',
|
|
45
52
|
]);
|
|
46
53
|
|
|
47
54
|
/**
|
package/src/core/store/ids.js
CHANGED
|
@@ -34,7 +34,10 @@
|
|
|
34
34
|
// Family membership (the single source for downstream re-exports)
|
|
35
35
|
// ---------------------------------------------------------------------------
|
|
36
36
|
|
|
37
|
-
|
|
37
|
+
// EVAL joins the prefix families in rcf-schemas 0.6.0 (evalId shape mirrors
|
|
38
|
+
// tsId: three-digit minimum with an optional lowercase kebab-slug prefix).
|
|
39
|
+
// EVAL is a peer of a Test Suite; it grades non-deterministic behaviour.
|
|
40
|
+
export const PREFIX_FAMILIES = Object.freeze(['REQ', 'US', 'PRD', 'BS', 'TAD', 'TS', 'EVAL']);
|
|
38
41
|
export const SUFFIX_FAMILIES = Object.freeze(['ADR', 'TAC', 'FBS', 'CN']);
|
|
39
42
|
export const UNNAMESPACED_FAMILIES = Object.freeze(['AC', 'TC']);
|
|
40
43
|
|
|
@@ -85,6 +88,7 @@ const FAMILY_TO_LOCATION = new Map([
|
|
|
85
88
|
['FBS', { kind: 'fbs', subdir: 'fbs', rootFile: null }],
|
|
86
89
|
['TS', { kind: 'testSuite', subdir: 'test-suites', rootFile: null }],
|
|
87
90
|
['CN', { kind: 'codeNode', subdir: 'code-nodes', rootFile: null }],
|
|
91
|
+
['EVAL', { kind: 'evalDoc', subdir: 'evals', rootFile: null }],
|
|
88
92
|
['PRD', { kind: 'prd', subdir: null, rootFile: 'prd.json' }],
|
|
89
93
|
['TAD', { kind: 'tad', subdir: null, rootFile: 'tad.json' }],
|
|
90
94
|
['BS', { kind: 'buildSequence', subdir: null, rootFile: 'build-sequence.json' }],
|
package/src/core/store/init.js
CHANGED
|
@@ -231,6 +231,10 @@ export async function initProject({ projectRoot, projectName = 'New RCF Project'
|
|
|
231
231
|
'rcf/adrs',
|
|
232
232
|
'rcf/fbs',
|
|
233
233
|
'rcf/test-suites',
|
|
234
|
+
// rcf-schemas 0.6.0: EVAL doc subdir. Empty by default; created so
|
|
235
|
+
// `rcf audit eval coverage` can find the subdir when the walker
|
|
236
|
+
// enumerates children even before any EVAL has been authored.
|
|
237
|
+
'rcf/evals',
|
|
234
238
|
];
|
|
235
239
|
for (const d of dirs) {
|
|
236
240
|
await mkdir(join(projectRoot, d), { recursive: true });
|
package/src/core/store/loader.js
CHANGED
|
@@ -30,6 +30,10 @@ export function subdirFor(kind) {
|
|
|
30
30
|
case 'testSuite': return 'test-suites';
|
|
31
31
|
// Phase 10 (X2 CodeNode bridge): Code Node document type.
|
|
32
32
|
case 'codeNode': return 'code-nodes';
|
|
33
|
+
// rcf-schemas 0.6.0 EVAL doc type. One file per EVAL under rcf/evals/.
|
|
34
|
+
// EVAL is optional in the chain; required only for ACs marked
|
|
35
|
+
// determinism: nonDeterministic.
|
|
36
|
+
case 'evalDoc': return 'evals';
|
|
33
37
|
default: return null;
|
|
34
38
|
}
|
|
35
39
|
}
|
|
@@ -28,6 +28,9 @@ import testSuiteSchema from '@stravica-ai/rcf-schemas/schemas/test-suite.schema.
|
|
|
28
28
|
// Phase 10 (X2 CodeNode bridge): 11th document kind, delivered in
|
|
29
29
|
// @stravica-ai/rcf-schemas@0.3.0.
|
|
30
30
|
import cnSchema from '@stravica-ai/rcf-schemas/schemas/cn.schema.json' with { type: 'json' };
|
|
31
|
+
// rcf-schemas 0.6.0: the EVAL doc type. Optional peer of a Test Suite,
|
|
32
|
+
// used to grade nonDeterministic acceptance criteria.
|
|
33
|
+
import evalSchema from '@stravica-ai/rcf-schemas/schemas/eval.schema.json' with { type: 'json' };
|
|
31
34
|
|
|
32
35
|
import { rcfError } from '../errors/index.js';
|
|
33
36
|
|
|
@@ -39,7 +42,7 @@ import { rcfError } from '../errors/index.js';
|
|
|
39
42
|
// schema, unmodified.
|
|
40
43
|
|
|
41
44
|
/**
|
|
42
|
-
* @typedef {('manifest'|'prd'|'req'|'userStory'|'tad'|'tac'|'adr'|'buildSequence'|'fbs'|'testSuite'|'codeNode')} DocKind
|
|
45
|
+
* @typedef {('manifest'|'prd'|'req'|'userStory'|'tad'|'tac'|'adr'|'buildSequence'|'fbs'|'testSuite'|'codeNode'|'evalDoc')} DocKind
|
|
43
46
|
*/
|
|
44
47
|
|
|
45
48
|
const SCHEMAS = {
|
|
@@ -55,6 +58,8 @@ const SCHEMAS = {
|
|
|
55
58
|
testSuite: testSuiteSchema,
|
|
56
59
|
// Phase 10: Code Node.
|
|
57
60
|
codeNode: cnSchema,
|
|
61
|
+
// rcf-schemas 0.6.0: EVAL doc.
|
|
62
|
+
evalDoc: evalSchema,
|
|
58
63
|
};
|
|
59
64
|
|
|
60
65
|
const ID_FIELD = {
|
|
@@ -72,6 +77,8 @@ const ID_FIELD = {
|
|
|
72
77
|
testSuite: 'id',
|
|
73
78
|
// Phase 10: Code Node.
|
|
74
79
|
codeNode: 'cnId',
|
|
80
|
+
// rcf-schemas 0.6.0: EVAL doc uses the plain `id` field (mirrors TS).
|
|
81
|
+
evalDoc: 'id',
|
|
75
82
|
};
|
|
76
83
|
|
|
77
84
|
let cachedAjv = null;
|
package/src/core/store/walker.js
CHANGED
|
@@ -87,7 +87,9 @@ function idFromFilenameStem(stem) {
|
|
|
87
87
|
// Phase 10 (X2 CodeNode bridge): 'codeNode' appended. The load-then-invert
|
|
88
88
|
// engine treats it exactly like any other child kind - extending the graph
|
|
89
89
|
// into code is additive, not a rewrite (PoC-proven, poc/codenode-bridge).
|
|
90
|
-
|
|
90
|
+
// rcf-schemas 0.6.0: 'evalDoc' appended. EVAL is a peer of TS; it grades
|
|
91
|
+
// non-deterministic ACs and rides the same load-then-invert engine.
|
|
92
|
+
const CHILD_KINDS = ['req', 'userStory', 'tac', 'adr', 'fbs', 'testSuite', 'codeNode', 'evalDoc'];
|
|
91
93
|
|
|
92
94
|
const ID_FIELD_BY_KIND = {
|
|
93
95
|
prd: 'prdId',
|
|
@@ -102,6 +104,8 @@ const ID_FIELD_BY_KIND = {
|
|
|
102
104
|
testSuite: 'id',
|
|
103
105
|
// Phase 10: Code Node.
|
|
104
106
|
codeNode: 'cnId',
|
|
107
|
+
// rcf-schemas 0.6.0: EVAL doc.
|
|
108
|
+
evalDoc: 'id',
|
|
105
109
|
};
|
|
106
110
|
|
|
107
111
|
function idOfDoc(doc, kind) {
|
|
@@ -125,6 +129,9 @@ function newTree() {
|
|
|
125
129
|
testSuites: [],
|
|
126
130
|
// Phase 10 (X2 CodeNode bridge): Code Nodes.
|
|
127
131
|
codeNodes: [],
|
|
132
|
+
// rcf-schemas 0.6.0: EVAL docs. A peer of testSuites; walked and
|
|
133
|
+
// integrity-checked like every other child kind.
|
|
134
|
+
evals: [],
|
|
128
135
|
byId: new Map(),
|
|
129
136
|
rawById: new Map(),
|
|
130
137
|
kindById: new Map(),
|
|
@@ -146,6 +153,10 @@ function newTree() {
|
|
|
146
153
|
// fbsByAcId / dependentsByFbsId for the code layer.
|
|
147
154
|
cnByAcId: new Map(),
|
|
148
155
|
dependentsByCnId: new Map(),
|
|
156
|
+
// rcf-schemas 0.6.0: EVAL -> AC inversion. Key: acId, value: EVAL ids
|
|
157
|
+
// whose acIds[] names that AC. Consumed by `rcf audit eval coverage`
|
|
158
|
+
// to answer "does this AC have a resolving EVAL?" in constant time.
|
|
159
|
+
evalByAcId: new Map(),
|
|
149
160
|
};
|
|
150
161
|
}
|
|
151
162
|
|
|
@@ -174,6 +185,8 @@ function recordDoc(tree, id, doc, raw, kind) {
|
|
|
174
185
|
case 'testSuite': tree.testSuites.push(doc); break;
|
|
175
186
|
// Phase 10: Code Node.
|
|
176
187
|
case 'codeNode': tree.codeNodes.push(doc); break;
|
|
188
|
+
// rcf-schemas 0.6.0: EVAL doc.
|
|
189
|
+
case 'evalDoc': tree.evals.push(doc); break;
|
|
177
190
|
default: break;
|
|
178
191
|
}
|
|
179
192
|
}
|
|
@@ -315,6 +328,8 @@ export async function walkTree({ projectRoot }) {
|
|
|
315
328
|
tree.fbsItems = sortById(tree.fbsItems, 'fbsId');
|
|
316
329
|
tree.testSuites = sortById(tree.testSuites, 'id');
|
|
317
330
|
tree.codeNodes = sortById(tree.codeNodes, 'cnId'); // Phase 10
|
|
331
|
+
// rcf-schemas 0.6.0: EVAL doc uses `id` field (mirrors TS).
|
|
332
|
+
tree.evals = sortById(tree.evals, 'id');
|
|
318
333
|
|
|
319
334
|
// Referential integrity + graph inversion.
|
|
320
335
|
invertGraph(tree);
|
|
@@ -416,11 +431,21 @@ function invertGraph(tree) {
|
|
|
416
431
|
}
|
|
417
432
|
}
|
|
418
433
|
|
|
434
|
+
// rcf-schemas 0.6.0: invert EVAL edges.
|
|
435
|
+
// EVAL.usId -> US (parent-child)
|
|
436
|
+
// EVAL.acIds -> evalByAcId (keyed on AC, value = EVAL grading it)
|
|
437
|
+
for (const evalDoc of tree.evals) {
|
|
438
|
+
if (isKind(evalDoc.usId, 'userStory')) linkParent(evalDoc.id, evalDoc.usId);
|
|
439
|
+
for (const acId of evalDoc.acIds ?? []) {
|
|
440
|
+
if (acIds.has(acId)) pushToMap(tree.evalByAcId, acId, evalDoc.id);
|
|
441
|
+
}
|
|
442
|
+
}
|
|
443
|
+
|
|
419
444
|
// Sort children lists deterministically.
|
|
420
445
|
for (const [k, list] of tree.childrenByParent) {
|
|
421
446
|
tree.childrenByParent.set(k, [...list].sort());
|
|
422
447
|
}
|
|
423
|
-
for (const map of [tree.fbsByAcId, tree.dependentsByFbsId, tree.tsByAcId, tree.usByTacId, tree.cnByAcId, tree.dependentsByCnId]) {
|
|
448
|
+
for (const map of [tree.fbsByAcId, tree.dependentsByFbsId, tree.tsByAcId, tree.usByTacId, tree.cnByAcId, tree.dependentsByCnId, tree.evalByAcId]) {
|
|
424
449
|
for (const [k, list] of map) map.set(k, [...list].sort());
|
|
425
450
|
}
|
|
426
451
|
}
|
|
@@ -519,6 +544,8 @@ export function simulateWriteErrors({ tree, preErrors = [], upserts = [], delete
|
|
|
519
544
|
post.fbsItems = sortById(post.fbsItems, 'fbsId');
|
|
520
545
|
post.testSuites = sortById(post.testSuites, 'id');
|
|
521
546
|
post.codeNodes = sortById(post.codeNodes, 'cnId'); // Phase 10
|
|
547
|
+
// rcf-schemas 0.6.0: EVAL doc.
|
|
548
|
+
post.evals = sortById(post.evals, 'id');
|
|
522
549
|
invertGraph(post);
|
|
523
550
|
collectBrokenReferences(post, errors);
|
|
524
551
|
// w-2026-07-28-017: uniqueness is part of the post-write gate, so a
|
|
@@ -953,4 +980,46 @@ function collectBrokenReferences(tree, errors) {
|
|
|
953
980
|
});
|
|
954
981
|
}
|
|
955
982
|
}
|
|
983
|
+
|
|
984
|
+
// rcf-schemas 0.6.0: EVAL doc cross-link integrity. Mirrors the TS
|
|
985
|
+
// parent + acIds shape (usId -> parent US; every acId -> a known AC).
|
|
986
|
+
// Cross-US EVAL bindings are refused at v1: an EVAL only grades ACs
|
|
987
|
+
// that live on its parent US, matching the TS scoping rule.
|
|
988
|
+
for (const evalDoc of tree.evals) {
|
|
989
|
+
check({
|
|
990
|
+
docId: evalDoc.id,
|
|
991
|
+
docKind: 'evalDoc',
|
|
992
|
+
fromField: 'usId',
|
|
993
|
+
targetId: evalDoc.usId,
|
|
994
|
+
expectedKind: 'userStory',
|
|
995
|
+
filePath: `rcf/evals/${(evalDoc.id ?? '').toLowerCase()}.json`,
|
|
996
|
+
message: `EVAL ${evalDoc.id} references unknown US ${evalDoc.usId}`,
|
|
997
|
+
});
|
|
998
|
+
const parentUs = tree.userStories.find((u) => u.usId === evalDoc.usId);
|
|
999
|
+
const parentAcIds = new Set(
|
|
1000
|
+
(parentUs?.acceptanceCriteria ?? []).map((ac) => ac?.id).filter(Boolean),
|
|
1001
|
+
);
|
|
1002
|
+
for (const [i, acId] of (evalDoc.acIds ?? []).entries()) {
|
|
1003
|
+
if (!acIds.has(acId)) {
|
|
1004
|
+
errors.push(rcfError({
|
|
1005
|
+
kind: 'brokenReference',
|
|
1006
|
+
message: `EVAL ${evalDoc.id} references unknown acceptance criterion ${acId}`,
|
|
1007
|
+
documentId: evalDoc.id,
|
|
1008
|
+
filePath: `rcf/evals/${(evalDoc.id ?? '').toLowerCase()}.json`,
|
|
1009
|
+
field: `acIds[${i}]`,
|
|
1010
|
+
rule: 'resolveTo:ac',
|
|
1011
|
+
}));
|
|
1012
|
+
tree.brokenIds.add(acId);
|
|
1013
|
+
} else if (parentUs && !parentAcIds.has(acId)) {
|
|
1014
|
+
errors.push(rcfError({
|
|
1015
|
+
kind: 'brokenReference',
|
|
1016
|
+
message: `EVAL ${evalDoc.id} lists AC ${acId} that lives outside its parent US ${evalDoc.usId} (cross-US EVAL bindings are not permitted)`,
|
|
1017
|
+
documentId: evalDoc.id,
|
|
1018
|
+
filePath: `rcf/evals/${(evalDoc.id ?? '').toLowerCase()}.json`,
|
|
1019
|
+
field: `acIds[${i}]`,
|
|
1020
|
+
rule: 'evalAcIdsScopedToParentUs',
|
|
1021
|
+
}));
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
}
|
|
956
1025
|
}
|
package/src/core/store/writer.js
CHANGED
|
@@ -862,6 +862,10 @@ async function createInlineAc({ projectRoot, tree, options, body, walkErrors = [
|
|
|
862
862
|
...(body?.given !== undefined ? { given: body.given } : {}),
|
|
863
863
|
...(body?.when !== undefined ? { when: body.when } : {}),
|
|
864
864
|
...(body?.then !== undefined ? { then: body.then } : {}),
|
|
865
|
+
// rcf-eval-node spec 2026-09-04 section 2.2: authored determinism
|
|
866
|
+
// survives write. Absence is treated as 'deterministic' by every
|
|
867
|
+
// consumer, so we only serialise when the CLI passed a value.
|
|
868
|
+
...(body?.determinism !== undefined ? { determinism: body.determinism } : {}),
|
|
865
869
|
};
|
|
866
870
|
const nextAcs = replacingPhantom
|
|
867
871
|
? currentAcs.map((ac, i) => (i === seedIndex ? acEntry : ac))
|