rcf-lite 0.27.0 → 0.28.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 +23 -0
- package/README.md +10 -0
- package/bin/rcf.js +2 -0
- package/blueprints/application-account-settings/CHANGELOG.md +35 -6
- package/blueprints/application-account-settings/README.md +1 -1
- package/blueprints/application-account-settings/blueprint.json +4 -2
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
- package/blueprints/application-account-settings/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs +67 -0
- package/blueprints/application-account-settings/contributions/probes/run-profile-form-autocomplete.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-adapter-uniform.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-shell-tablist-per-capability.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/run-theme-radiogroup.mjs +5 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-adapter-uniform.mjs +130 -0
- package/blueprints/application-account-settings/contributions/probes/sessions-surface-shape.mjs +70 -0
- package/blueprints/application-account-settings/contributions/probes/shell-tablist-per-capability.mjs +60 -0
- package/blueprints/application-account-settings/contributions/probes/theme-radiogroup.mjs +126 -0
- package/blueprints/application-admin-console/CHANGELOG.md +32 -6
- package/blueprints/application-admin-console/README.md +1 -1
- package/blueprints/application-admin-console/blueprint.json +4 -2
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +1 -1
- package/blueprints/application-admin-console/contributions/probes/audit-log-surface.mjs +79 -0
- package/blueprints/application-admin-console/contributions/probes/org-switcher-surface.mjs +83 -0
- package/blueprints/application-admin-console/contributions/probes/permission-matrix-grid.mjs +67 -0
- package/blueprints/application-admin-console/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-admin-console/contributions/probes/run-audit-log-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-org-switcher-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-permission-matrix-grid.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-sign-in-access-gated-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/run-users-directory-surface.mjs +5 -0
- package/blueprints/application-admin-console/contributions/probes/sign-in-access-gated-surface.mjs +117 -0
- package/blueprints/application-admin-console/contributions/probes/users-directory-surface.mjs +145 -0
- package/blueprints/application-api-rest/CHANGELOG.md +16 -8
- package/blueprints/application-api-rest/README.md +3 -3
- package/blueprints/application-api-rest/blueprint.json +3 -2
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +1 -1
- package/blueprints/application-api-rest/contributions/probes/cursor-pagination-round-trip.mjs +154 -0
- package/blueprints/application-api-rest/contributions/probes/health-probes-distinct.mjs +124 -0
- package/blueprints/application-api-rest/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-api-rest/contributions/probes/problem-details-on-error.mjs +77 -0
- package/blueprints/application-api-rest/contributions/probes/request-id-echoed.mjs +76 -0
- package/blueprints/application-api-rest/contributions/probes/run-cursor-pagination-round-trip.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-health-probes-distinct.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-problem-details-on-error.mjs +5 -0
- package/blueprints/application-api-rest/contributions/probes/run-request-id-echoed.mjs +5 -0
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-charts/CHANGELOG.md +35 -9
- package/blueprints/application-charts/README.md +6 -6
- package/blueprints/application-charts/blueprint.json +5 -3
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +1 -1
- package/blueprints/application-charts/contributions/probes/keyboard-traversal.mjs +151 -0
- package/blueprints/application-charts/contributions/probes/non-colour-distinction.mjs +67 -0
- package/blueprints/application-charts/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-charts/contributions/probes/run-keyboard-traversal.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-non-colour-distinction.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/run-text-alternative-table.mjs +5 -0
- package/blueprints/application-charts/contributions/probes/text-alternative-table.mjs +139 -0
- package/blueprints/application-charts/contributions/requirements/application-charts-req-001.json +1 -1
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +1 -1
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +5 -5
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +1 -1
- package/blueprints/application-charts/guide/application-charts.md +1 -1
- package/blueprints/application-dashboard/CHANGELOG.md +20 -10
- package/blueprints/application-dashboard/README.md +6 -6
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
- package/blueprints/application-dashboard/blueprint.json +3 -2
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +1 -1
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +1 -1
- package/blueprints/application-dashboard/contributions/probes/export-handle-formats.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/four-tile-states.mjs +75 -0
- package/blueprints/application-dashboard/contributions/probes/primary-kpi-top-left.mjs +58 -0
- package/blueprints/application-dashboard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-dashboard/contributions/probes/run-export-handle-formats.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-four-tile-states.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-primary-kpi-top-left.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/run-shell-five-regions.mjs +4 -0
- package/blueprints/application-dashboard/contributions/probes/shell-five-regions.mjs +93 -0
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +1 -1
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +1 -1
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +2 -2
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +5 -5
- package/blueprints/application-dashboard/docs/topics.md +2 -2
- package/blueprints/application-dashboard/guide/application-dashboard.md +2 -2
- package/blueprints/application-datatable/CHANGELOG.md +19 -9
- package/blueprints/application-datatable/README.md +2 -2
- package/blueprints/application-datatable/blueprint.json +3 -2
- package/blueprints/application-datatable/contributions/probes/apg-table-shape.mjs +57 -0
- package/blueprints/application-datatable/contributions/probes/four-states-regions.mjs +80 -0
- package/blueprints/application-datatable/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-datatable/contributions/probes/run-apg-table-shape.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-four-states-regions.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-search-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/run-sort-adapter-round-trip.mjs +4 -0
- package/blueprints/application-datatable/contributions/probes/search-adapter-round-trip.mjs +58 -0
- package/blueprints/application-datatable/contributions/probes/sort-adapter-round-trip.mjs +60 -0
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +1 -1
- package/blueprints/application-datatable/docs/topics.md +1 -1
- package/blueprints/application-empty-error-states/CHANGELOG.md +33 -3
- package/blueprints/application-empty-error-states/blueprint.json +4 -2
- package/blueprints/application-empty-error-states/contributions/probes/empty-list-and-no-search.mjs +66 -0
- package/blueprints/application-empty-error-states/contributions/probes/error-boundary-alert.mjs +65 -0
- package/blueprints/application-empty-error-states/contributions/probes/forbidden-and-server-error.mjs +167 -0
- package/blueprints/application-empty-error-states/contributions/probes/not-found-and-recovery.mjs +61 -0
- package/blueprints/application-empty-error-states/contributions/probes/permission-denied-and-offline.mjs +155 -0
- package/blueprints/application-empty-error-states/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-empty-list-and-no-search.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-error-boundary-alert.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-forbidden-and-server-error.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-not-found-and-recovery.mjs +5 -0
- package/blueprints/application-empty-error-states/contributions/probes/run-permission-denied-and-offline.mjs +5 -0
- package/blueprints/application-error-handling/CHANGELOG.md +45 -6
- package/blueprints/application-error-handling/blueprint.json +3 -2
- package/blueprints/application-error-handling/contributions/probes/category-vocabulary.mjs +90 -0
- package/blueprints/application-error-handling/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-error-handling/contributions/probes/record-shape-adr-1701.mjs +78 -0
- package/blueprints/application-error-handling/contributions/probes/run-category-vocabulary.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-record-shape-adr-1701.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/run-two-boundaries-registered.mjs +5 -0
- package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs +343 -0
- package/blueprints/application-file-upload/CHANGELOG.md +28 -6
- package/blueprints/application-file-upload/README.md +1 -1
- package/blueprints/application-file-upload/blueprint.json +3 -2
- package/blueprints/application-file-upload/contributions/probes/assertive-completion-slot.mjs +78 -0
- package/blueprints/application-file-upload/contributions/probes/chunked-transport-endpoints.mjs +173 -0
- package/blueprints/application-file-upload/contributions/probes/per-file-progressbar.mjs +124 -0
- package/blueprints/application-file-upload/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-file-upload/contributions/probes/run-assertive-completion-slot.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-chunked-transport-endpoints.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-per-file-progressbar.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/run-upload-surface-shape.mjs +4 -0
- package/blueprints/application-file-upload/contributions/probes/upload-surface-shape.mjs +55 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-001.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +1 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +1 -1
- package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +1 -1
- package/blueprints/application-forms-wizard/CHANGELOG.md +20 -6
- package/blueprints/application-forms-wizard/README.md +2 -2
- package/blueprints/application-forms-wizard/blueprint.json +3 -2
- package/blueprints/application-forms-wizard/contributions/probes/draft-persistence-round-trip.mjs +110 -0
- package/blueprints/application-forms-wizard/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-draft-persistence-round-trip.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-step-page-shape.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/run-task-list-surface.mjs +4 -0
- package/blueprints/application-forms-wizard/contributions/probes/step-page-shape.mjs +61 -0
- package/blueprints/application-forms-wizard/contributions/probes/task-list-surface.mjs +109 -0
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-001.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +1 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +1 -1
- package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +1 -1
- package/blueprints/application-notifications-in-app/CHANGELOG.md +38 -5
- package/blueprints/application-notifications-in-app/README.md +4 -4
- package/blueprints/application-notifications-in-app/blueprint.json +4 -2
- package/blueprints/application-notifications-in-app/contributions/adrs/adr-2101-application-notifications-in-app-live-region-role-mapping.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/probes/centre-acknowledge-round-trip.mjs +210 -0
- package/blueprints/application-notifications-in-app/contributions/probes/live-region-preseeding.mjs +93 -0
- package/blueprints/application-notifications-in-app/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-centre-acknowledge-round-trip.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-live-region-preseeding.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/run-toast-contract.mjs +5 -0
- package/blueprints/application-notifications-in-app/contributions/probes/toast-contract.mjs +92 -0
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2101-application-notifications-in-app-live-region.json +3 -3
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2102-application-notifications-in-app-centre.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +1 -1
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +1 -1
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +3 -3
- package/blueprints/application-onboarding-tour/CHANGELOG.md +31 -5
- package/blueprints/application-onboarding-tour/README.md +1 -1
- package/blueprints/application-onboarding-tour/blueprint.json +5 -3
- package/blueprints/application-onboarding-tour/contributions/probes/checklist-anchor-open.mjs +81 -0
- package/blueprints/application-onboarding-tour/contributions/probes/completion-persistence.mjs +159 -0
- package/blueprints/application-onboarding-tour/contributions/probes/first-run-detection.mjs +67 -0
- package/blueprints/application-onboarding-tour/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-checklist-anchor-open.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-completion-persistence.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-first-run-detection.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/run-stepper-role-dialog.mjs +5 -0
- package/blueprints/application-onboarding-tour/contributions/probes/stepper-role-dialog.mjs +45 -0
- package/blueprints/application-spa/CHANGELOG.md +20 -11
- package/blueprints/application-spa/README.md +9 -10
- package/blueprints/application-spa/blueprint.json +3 -2
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +1 -1
- package/blueprints/application-spa/contributions/probes/designed-empty-state.mjs +72 -0
- package/blueprints/application-spa/contributions/probes/probe-utils.mjs +177 -0
- package/blueprints/application-spa/contributions/probes/route-inventory-published.mjs +185 -0
- package/blueprints/application-spa/contributions/probes/run-designed-empty-state.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-route-inventory-published.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/run-shell-nav-present.mjs +5 -0
- package/blueprints/application-spa/contributions/probes/shell-nav-present.mjs +69 -0
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +3 -3
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +2 -2
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +1 -1
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +31 -11
- package/blueprints/delivery-ci-workflows/README.md +3 -3
- package/blueprints/delivery-ci-workflows/blueprint.json +3 -2
- package/blueprints/delivery-ci-workflows/contributions/adrs/adr-702-delivery-ci-workflows-strict-coverage-gate.json +2 -2
- package/blueprints/delivery-ci-workflows/contributions/probes/node-gate-entrypoint.mjs +76 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/probe-utils.mjs +56 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/real-account-github-actions-run-record.mjs +139 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-node-gate-entrypoint.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-real-account-github-actions-run-record.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/run-workflow-template-shape.mjs +3 -0
- package/blueprints/delivery-ci-workflows/contributions/probes/workflow-template-shape.mjs +94 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +1 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
- package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +4 -4
- package/blueprints/deploy-cloudflare-workers/README.md +3 -3
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +2 -2
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
- package/blueprints/deploy-hetzner-server/CHANGELOG.md +98 -7
- package/blueprints/deploy-hetzner-server/blueprint.json +7 -6
- package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +46 -21
- package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +344 -83
- package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +211 -42
- package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +140 -22
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +111 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +158 -30
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +154 -32
- package/blueprints/edge-cloudflare-access/CHANGELOG.md +6 -5
- package/blueprints/edge-cloudflare-access/blueprint.json +1 -1
- package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
- package/blueprints/edge-cloudflare-access/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +4 -7
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +4 -6
- package/blueprints/edge-cloudflare-tunnel/README.md +1 -2
- package/blueprints/edge-cloudflare-tunnel/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +2 -3
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
- package/blueprints/email-smtp-resend/CHANGELOG.md +24 -8
- package/blueprints/email-smtp-resend/README.md +2 -2
- package/blueprints/email-smtp-resend/blueprint.json +3 -2
- package/blueprints/email-smtp-resend/contributions/probes/probe-utils.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/real-account-resend-send.mjs +50 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-real-account-resend-send.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-smtp-round-trip.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/run-unverified-sender-refusal.mjs +3 -0
- package/blueprints/email-smtp-resend/contributions/probes/smtp-round-trip.mjs +43 -0
- package/blueprints/email-smtp-resend/contributions/probes/unverified-sender-refusal.mjs +99 -0
- package/blueprints/email-smtp-resend/docs/topics.md +2 -3
- package/blueprints/jobs-background/CHANGELOG.md +66 -5
- package/blueprints/jobs-background/README.md +2 -2
- package/blueprints/jobs-background/blueprint.json +3 -2
- package/blueprints/jobs-background/contributions/probes/apply-time-override.mjs +38 -10
- package/blueprints/jobs-background/contributions/probes/apply-time-refusal.mjs +28 -6
- package/blueprints/jobs-background/contributions/probes/event-secrecy.mjs +16 -2
- package/blueprints/jobs-background/contributions/probes/fake-clock-cron.mjs +102 -21
- package/blueprints/jobs-background/contributions/probes/probe-utils.mjs +10 -2
- package/blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs +355 -0
- package/blueprints/jobs-background/contributions/probes/retry-and-fail.mjs +33 -2
- package/blueprints/jobs-background/contributions/probes/run-retry-and-fail-real-account.mjs +12 -0
- package/blueprints/jobs-background/docs/topics.md +1 -1
- package/blueprints/jobs-background/guide/jobs-background.md +1 -1
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +25 -19
- package/blueprints/messaging-queue-cloudflare/README.md +12 -12
- package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +2 -2
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3002-messaging-queue-cloudflare-delivery-semantics.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +180 -12
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +1 -1
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +2 -2
- package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +2 -2
- package/blueprints/object-storage-s3/CHANGELOG.md +75 -4
- package/blueprints/object-storage-s3/blueprint.json +3 -2
- package/blueprints/object-storage-s3/contributions/probes/event-secrecy.mjs +73 -12
- package/blueprints/object-storage-s3/contributions/probes/facade-round-trip.mjs +55 -7
- package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +102 -18
- package/blueprints/object-storage-s3/contributions/probes/multipart-upload.mjs +105 -36
- package/blueprints/object-storage-s3/contributions/probes/presigned-url.mjs +104 -55
- package/blueprints/object-storage-s3/contributions/probes/probe-utils.mjs +129 -7
- package/blueprints/object-storage-s3/contributions/probes/put-get-round-trip.mjs +80 -18
- package/blueprints/object-storage-s3/contributions/probes/r2-real-account-smoke.mjs +291 -37
- package/blueprints/object-storage-s3/contributions/probes/run-event-secrecy.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-facade-round-trip.mjs +5 -5
- package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +8 -5
- package/blueprints/object-storage-s3/contributions/probes/run-multipart-upload.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-presigned-url.mjs +8 -2
- package/blueprints/object-storage-s3/contributions/probes/run-put-get-round-trip.mjs +6 -3
- package/blueprints/object-storage-s3/contributions/probes/run-r2-real-account-smoke.mjs +10 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +1 -1
- package/blueprints/object-storage-s3/docs/topics.md +1 -1
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +1 -1
- package/blueprints/observability-essentials/CHANGELOG.md +23 -7
- package/blueprints/observability-essentials/README.md +2 -2
- package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +1 -1
- package/blueprints/observability-essentials/blueprint.json +3 -2
- package/blueprints/observability-essentials/contributions/probes/liveness-probe.mjs +84 -0
- package/blueprints/observability-essentials/contributions/probes/metrics-endpoint.mjs +96 -0
- package/blueprints/observability-essentials/contributions/probes/probe-utils.mjs +52 -0
- package/blueprints/observability-essentials/contributions/probes/readiness-probe.mjs +171 -0
- package/blueprints/observability-essentials/contributions/probes/run-liveness-probe.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-metrics-endpoint.mjs +3 -0
- package/blueprints/observability-essentials/contributions/probes/run-readiness-probe.mjs +3 -0
- package/blueprints/observability-essentials/docs/topics.md +2 -3
- package/blueprints/observability-logging/CHANGELOG.md +29 -4
- package/blueprints/observability-logging/README.md +2 -2
- package/blueprints/observability-logging/blueprint.json +3 -2
- package/blueprints/observability-logging/contributions/probes/correlation-id-flow.mjs +173 -0
- package/blueprints/observability-logging/contributions/probes/line-shape-and-fields.mjs +82 -0
- package/blueprints/observability-logging/contributions/probes/probe-utils.mjs +47 -0
- package/blueprints/observability-logging/contributions/probes/redaction-boundary.mjs +130 -0
- package/blueprints/observability-logging/contributions/probes/run-correlation-id-flow.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-line-shape-and-fields.mjs +3 -0
- package/blueprints/observability-logging/contributions/probes/run-redaction-boundary.mjs +3 -0
- package/blueprints/observability-probe-endpoints/CHANGELOG.md +23 -8
- package/blueprints/observability-probe-endpoints/README.md +3 -3
- package/blueprints/observability-probe-endpoints/blueprint.json +3 -2
- package/blueprints/observability-probe-endpoints/contributions/probes/kubernetes-startup-enabled.mjs +80 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/partial-profile-refusal.mjs +101 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/probe-utils.mjs +49 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/profile-boot-materialisation.mjs +69 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-kubernetes-startup-enabled.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-partial-profile-refusal.mjs +3 -0
- package/blueprints/observability-probe-endpoints/contributions/probes/run-profile-boot-materialisation.mjs +3 -0
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/persistence-data-d1/CHANGELOG.md +16 -3
- package/blueprints/persistence-data-d1/README.md +2 -2
- package/blueprints/persistence-data-d1/blueprint.json +3 -2
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +1 -1
- package/blueprints/persistence-data-d1/contributions/probes/facade-round-trip.mjs +140 -0
- package/blueprints/persistence-data-d1/contributions/probes/migrations-forward-only.mjs +66 -0
- package/blueprints/persistence-data-d1/contributions/probes/probe-utils.mjs +51 -0
- package/blueprints/persistence-data-d1/contributions/probes/real-account-d1-round-trip.mjs +133 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-facade-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-migrations-forward-only.mjs +3 -0
- package/blueprints/persistence-data-d1/contributions/probes/run-real-account-d1-round-trip.mjs +3 -0
- package/blueprints/persistence-data-d1/docs/topics.md +2 -3
- package/blueprints/persistence-data-postgres/CHANGELOG.md +84 -4
- package/blueprints/persistence-data-postgres/README.md +2 -2
- package/blueprints/persistence-data-postgres/blueprint.json +3 -2
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/probes/facade-round-trip.mjs +87 -12
- package/blueprints/persistence-data-postgres/contributions/probes/migration-apply.mjs +245 -19
- package/blueprints/persistence-data-postgres/contributions/probes/pool-posture-smoke.mjs +109 -26
- package/blueprints/persistence-data-postgres/contributions/probes/prepared-statement-scan.mjs +151 -38
- package/blueprints/persistence-data-postgres/contributions/probes/probe-utils.mjs +24 -6
- package/blueprints/persistence-data-postgres/contributions/probes/recovery-restore-round-trip.mjs +261 -48
- package/blueprints/persistence-data-postgres/contributions/probes/transaction-atomicity.mjs +76 -20
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +1 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
- package/blueprints/persistence-data-sqlite/CHANGELOG.md +16 -2
- package/blueprints/persistence-data-sqlite/README.md +2 -2
- package/blueprints/persistence-data-sqlite/blueprint.json +3 -2
- package/blueprints/persistence-data-sqlite/contributions/probes/boot-open-migrate.mjs +90 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/facade-round-trip.mjs +82 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/probe-utils.mjs +83 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-boot-open-migrate.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-facade-round-trip.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/run-wal-checkpoint.mjs +5 -0
- package/blueprints/persistence-data-sqlite/contributions/probes/wal-checkpoint.mjs +137 -0
- package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +5 -5
- package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +6 -10
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +1 -1
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +16 -12
- package/blueprints/platform-cloudflare-kv/README.md +2 -4
- package/blueprints/platform-cloudflare-kv/blueprint.json +2 -2
- package/blueprints/platform-cloudflare-kv/docs/topics.md +1 -1
- package/blueprints/platform-docker-compose-host/CHANGELOG.md +92 -5
- package/blueprints/platform-docker-compose-host/blueprint.json +2 -2
- package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +116 -29
- package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +181 -109
- package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +146 -26
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +238 -24
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +207 -21
- package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +246 -42
- package/blueprints/platform-docker-compose-host/docs/topics.md +1 -1
- package/blueprints/security-auth-clerk/CHANGELOG.md +18 -6
- package/blueprints/security-auth-clerk/README.md +3 -3
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
- package/blueprints/security-auth-clerk/blueprint.json +3 -2
- package/blueprints/security-auth-clerk/contributions/probes/hosted-identity-ui-config.mjs +61 -0
- package/blueprints/security-auth-clerk/contributions/probes/probe-utils.mjs +188 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-principal-directory-round-trip.mjs +216 -0
- package/blueprints/security-auth-clerk/contributions/probes/real-account-session-inventory.mjs +260 -0
- package/blueprints/security-auth-clerk/contributions/probes/role-model-adapter.mjs +53 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-hosted-identity-ui-config.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-principal-directory-round-trip.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-real-account-session-inventory.mjs +4 -0
- package/blueprints/security-auth-clerk/contributions/probes/run-role-model-adapter.mjs +4 -0
- package/blueprints/security-auth-clerk/docs/topics.md +2 -3
- package/blueprints/security-auth-keycloak/CHANGELOG.md +18 -7
- package/blueprints/security-auth-keycloak/README.md +2 -2
- package/blueprints/security-auth-keycloak/blueprint.json +3 -2
- package/blueprints/security-auth-keycloak/contributions/probes/discovery-shape.mjs +68 -0
- package/blueprints/security-auth-keycloak/contributions/probes/introspection-shape.mjs +88 -0
- package/blueprints/security-auth-keycloak/contributions/probes/jwt-verifier-shape.mjs +86 -0
- package/blueprints/security-auth-keycloak/contributions/probes/probe-utils.mjs +180 -0
- package/blueprints/security-auth-keycloak/contributions/probes/real-account-realm-round-trip.mjs +91 -0
- package/blueprints/security-auth-keycloak/contributions/probes/role-adapter-shape.mjs +69 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-discovery-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-introspection-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-jwt-verifier-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-real-account-realm-round-trip.mjs +4 -0
- package/blueprints/security-auth-keycloak/contributions/probes/run-role-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
- package/blueprints/security-auth-magic-link/CHANGELOG.md +15 -4
- package/blueprints/security-auth-magic-link/README.md +2 -2
- package/blueprints/security-auth-magic-link/assets/principal-registry-samples/single-address.md +1 -1
- package/blueprints/security-auth-magic-link/blueprint.json +3 -2
- package/blueprints/security-auth-magic-link/contributions/probes/probe-utils.mjs +174 -0
- package/blueprints/security-auth-magic-link/contributions/probes/real-account-magic-link-send.mjs +139 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-real-account-magic-link-send.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-entropy-shape.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/run-token-issue-verify.mjs +4 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-entropy-shape.mjs +60 -0
- package/blueprints/security-auth-magic-link/contributions/probes/token-issue-verify.mjs +90 -0
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +16 -5
- package/blueprints/security-auth-oauth2/README.md +2 -2
- package/blueprints/security-auth-oauth2/blueprint.json +3 -2
- package/blueprints/security-auth-oauth2/contributions/probes/authorisation-code-flow-shape.mjs +259 -0
- package/blueprints/security-auth-oauth2/contributions/probes/pkce-challenge-shape.mjs +58 -0
- package/blueprints/security-auth-oauth2/contributions/probes/probe-utils.mjs +190 -0
- package/blueprints/security-auth-oauth2/contributions/probes/provider-adapter-shape.mjs +64 -0
- package/blueprints/security-auth-oauth2/contributions/probes/real-account-authorisation-code-flow.mjs +93 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-authorisation-code-flow-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-pkce-challenge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-provider-adapter-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-real-account-authorisation-code-flow.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/run-session-bridge-shape.mjs +4 -0
- package/blueprints/security-auth-oauth2/contributions/probes/session-bridge-shape.mjs +78 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
- package/blueprints/security-secrets-management/CHANGELOG.md +15 -4
- package/blueprints/security-secrets-management/README.md +2 -2
- package/blueprints/security-secrets-management/blueprint.json +3 -2
- package/blueprints/security-secrets-management/contributions/probes/add-recipient-rotation.mjs +107 -0
- package/blueprints/security-secrets-management/contributions/probes/encrypt-decrypt-round-trip.mjs +122 -0
- package/blueprints/security-secrets-management/contributions/probes/key-rotation.mjs +93 -0
- package/blueprints/security-secrets-management/contributions/probes/mismatched-key-refusal.mjs +74 -0
- package/blueprints/security-secrets-management/contributions/probes/probe-utils.mjs +214 -0
- package/blueprints/security-secrets-management/contributions/probes/run-add-recipient-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-encrypt-decrypt-round-trip.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-key-rotation.mjs +4 -0
- package/blueprints/security-secrets-management/contributions/probes/run-mismatched-key-refusal.mjs +4 -0
- package/blueprints/security-secrets-management/docs/topics.md +2 -3
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/harness-template.md +25 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +25 -0
- package/package.json +2 -2
- package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
- package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
- package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
- package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
- package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
- package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
- package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
- package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
- package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
- package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
- package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
- package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
- package/rcf/code-nodes/cn-600.json +45 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +15 -0
- package/rcf/code-nodes/cn-603.json +12 -0
- package/rcf/code-nodes/cn-604.json +14 -0
- package/rcf/code-nodes/cn-605.json +17 -0
- package/rcf/code-nodes/cn-606.json +12 -0
- package/rcf/code-nodes/cn-607.json +12 -0
- package/rcf/code-nodes/cn-608.json +14 -0
- package/rcf/code-nodes/cn-609.json +17 -0
- package/rcf/code-nodes/cn-620.json +18 -0
- package/rcf/code-nodes/cn-621.json +14 -0
- package/rcf/code-nodes/cn-622.json +15 -0
- package/rcf/code-nodes/cn-623.json +16 -0
- package/rcf/code-nodes/cn-624.json +14 -0
- package/rcf/code-nodes/cn-625.json +15 -0
- package/rcf/code-nodes/cn-626.json +13 -0
- package/rcf/code-nodes/cn-627.json +13 -0
- package/rcf/code-nodes/cn-628.json +14 -0
- package/rcf/code-nodes/cn-629.json +12 -0
- package/rcf/code-nodes/cn-630.json +12 -0
- package/rcf/code-nodes/cn-631.json +13 -0
- package/rcf/code-nodes/cn-632.json +13 -0
- package/rcf/fbs/fbs-180.json +45 -0
- package/rcf/fbs/fbs-181.json +45 -0
- package/rcf/fbs/fbs-182.json +42 -0
- package/rcf/fbs/fbs-183.json +50 -0
- package/rcf/fbs/fbs-184.json +49 -0
- package/rcf/fbs/fbs-185.json +34 -0
- package/rcf/fbs/fbs-186.json +16 -0
- package/rcf/fbs/fbs-187.json +17 -0
- package/rcf/fbs/fbs-188.json +17 -0
- package/rcf/fbs/fbs-189.json +17 -0
- package/rcf/requirements/req-155.json +13 -0
- package/rcf/requirements/req-156.json +13 -0
- package/rcf/requirements/req-157.json +13 -0
- package/rcf/requirements/req-158.json +13 -0
- package/rcf/requirements/req-159.json +13 -0
- package/rcf/requirements/req-160.json +13 -0
- package/rcf/requirements/req-161.json +13 -0
- package/rcf/requirements/req-162.json +13 -0
- package/rcf/requirements/req-163.json +13 -0
- package/rcf/requirements/req-164.json +13 -0
- package/rcf/requirements/req-165.json +13 -0
- package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
- package/rcf/tacs/tac-4102-feedback-store.json +50 -0
- package/rcf/tacs/tac-4103-feedback-redact.json +39 -0
- package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
- package/rcf/tacs/tac-4105-feedback-render.json +45 -0
- package/rcf/tacs/tac-4106-feedback-destination.json +39 -0
- package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
- package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
- package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
- package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
- package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
- package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
- package/rcf/test-suites/ts-140.json +9 -9
- package/rcf/test-suites/ts-150.json +9 -9
- package/rcf/test-suites/ts-185.json +54 -0
- package/rcf/test-suites/ts-186.json +58 -0
- package/rcf/test-suites/ts-187.json +44 -0
- package/rcf/test-suites/ts-188.json +166 -0
- package/rcf/test-suites/ts-189.json +38 -0
- package/rcf/test-suites/ts-190.json +30 -0
- package/rcf/test-suites/ts-191.json +51 -0
- package/rcf/test-suites/ts-192.json +37 -0
- package/rcf/test-suites/ts-193.json +60 -0
- package/rcf/test-suites/ts-194.json +67 -0
- package/rcf/test-suites/ts-195.json +52 -0
- package/rcf/test-suites/ts-196.json +58 -0
- package/rcf/test-suites/ts-197.json +66 -0
- package/rcf/test-suites/ts-198.json +87 -0
- package/rcf/test-suites/ts-199.json +51 -0
- package/rcf/test-suites/ts-200.json +30 -0
- package/rcf/test-suites/ts-201.json +38 -0
- package/rcf/test-suites/ts-202.json +38 -0
- package/rcf/test-suites/ts-203.json +38 -0
- package/rcf/user-stories/us-15501.json +60 -0
- package/rcf/user-stories/us-15502.json +33 -0
- package/rcf/user-stories/us-15503.json +33 -0
- package/rcf/user-stories/us-15601.json +51 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +42 -0
- package/rcf/user-stories/us-15802.json +33 -0
- package/rcf/user-stories/us-15901.json +33 -0
- package/rcf/user-stories/us-15902.json +51 -0
- package/rcf/user-stories/us-16001.json +51 -0
- package/rcf/user-stories/us-16101.json +42 -0
- package/rcf/user-stories/us-16102.json +33 -0
- package/rcf/user-stories/us-16103.json +42 -0
- package/rcf/user-stories/us-16104.json +42 -0
- package/rcf/user-stories/us-16201.json +33 -0
- package/rcf/user-stories/us-16301.json +36 -0
- package/rcf/user-stories/us-16401.json +45 -0
- package/rcf/user-stories/us-16501.json +45 -0
- package/rcf/user-stories/us-16502.json +45 -0
- package/releases/releases.yaml +11 -1
- package/src/blueprint/library-loader.js +48 -0
- package/src/blueprint/library-registry.js +13 -0
- package/src/browser-verify/pack-runner.js +7 -12
- package/src/build/mark.js +1 -1
- package/src/cli/blueprint-library.js +149 -0
- package/src/cli/coverage.js +49 -24
- package/src/cli/doctor.js +195 -7
- package/src/cli/feedback.js +2204 -0
- package/src/cli/finalise.js +158 -1
- package/src/cli/help.js +6 -0
- package/src/cli/init.js +63 -0
- package/src/cli/update.js +21 -1
- package/src/core/store/walker.js +33 -0
- package/src/core/store/writer.js +23 -0
- package/src/feedback/destination.js +361 -0
- package/src/feedback/fingerprint.js +132 -0
- package/src/feedback/gh.js +376 -0
- package/src/feedback/hook.js +183 -0
- package/src/feedback/labels.js +87 -0
- package/src/feedback/redact-allowlist.json +14 -0
- package/src/feedback/redact.js +1108 -0
- package/src/feedback/render.js +267 -0
- package/src/feedback/store.js +604 -0
- package/src/finalise/index.js +4 -0
- package/src/finalise/ingest.js +61 -0
- package/src/finalise/ship-without-eval.js +19 -7
- package/src/mcp/tools.js +8 -2
- package/src/setup/feedback-hooks.js +397 -0
- package/src/setup/managed-gitignore.js +3 -0
- package/src/view/html-page.js +5 -5
- package/src/view/style.css +2 -2
|
@@ -1,12 +1,73 @@
|
|
|
1
1
|
# Changelog
|
|
2
2
|
|
|
3
|
+
## 1.1.10 - 2026-09-12
|
|
4
|
+
|
|
5
|
+
The AC-30109-1 counting-row `detail` now opens with the first eight words of the AC's `description` text ("The retry-and-fail probe's report, after the three failing") before naming the observation, so the row is textually attached to its anchor AC. The record was regenerated verbatim against the shipped in-memory fixture. Anatomy pin bumped to 1.1.10.
|
|
6
|
+
|
|
7
|
+
- fix: `blueprints/jobs-background/contributions/probes/retry-and-fail.mjs` AC-30109-1 row `detail` (both `pass` and `fail` verdict branches) opens with the first eight words of the AC's `description`, then names the observation.
|
|
8
|
+
|
|
9
|
+
## 1.1.9 - 2026-09-12
|
|
10
|
+
|
|
11
|
+
AC-30109-1 is now observed locally (`dlqInvoked:true`); `STRICT_ID_KEYS` is tightened to engine-returned scalars only; the anatomy comment is aligned with the in-memory validation the predicate enforces. Anatomy pin bumped to 1.1.9.
|
|
12
|
+
|
|
13
|
+
- fix: `packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/jobs-runtime.mjs` terminal-failure branch now routes the message to the driver's DLQ producer path (`msg.retry()` on an already-terminal attempt increments attempts past `maxRetries` so the driver pushes the entry to `state.dlq`). The earlier behaviour ack'd terminally failing messages, which silently discarded the failing job.
|
|
14
|
+
- fix: `blueprints/jobs-background/contributions/probes/retry-and-fail.mjs` adds a second row anchored to AC-30109-1 that asserts `dlqInvoked:true` after the three failing jobStarted events and the terminal jobFailed event. The row carries the scheduler-minted `jobId` as its scalar id witness alongside `attemptsSequence` as derived.
|
|
15
|
+
- fix: `packages/rcf-lite/test/blueprint/jobs-background-anatomy.test.js` STRICT_ID_KEYS removed the plural / probe-selected keys (`requestIds`, `vendorRequestIds`, `metadataRequestId`, `httpRequestId`, `observedUploadId`, `dlqTransportMessageIds`, `primaryTransportMessageId`, `jobIds`, `dlqPayloadJobIds`, `expectedPayloadJobId`) so only engine-returned scalar identifiers qualify as id-witnesses.
|
|
16
|
+
- prose: anatomy header comment corrected to describe the in-memory validation the anatomy performs (probes invoked directly; no `.rcf/reports` record read on this seam).
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
## 1.1.8 - 2026-09-11
|
|
20
|
+
|
|
21
|
+
Engine-returned identifiers only, plus non-"true" gate-skip parseability. The jobs-background anatomy `STRICT_ID_KEYS` retains engine-returned scalars only, the anatomy enforces distinct `idWitness` / `derivedWitness` keys, and the non-"true" gate-skip reason on `retry-and-fail-real-account` is emitted in the `<VAR> (not "true")` shape the anatomy parses to the same bare env-var name as `<VAR> unset`. Pre-condition failure branches on `apply-time-override` and `apply-time-refusal` are `conformanceOnly` (they fire before any job or message id is minted). A negative unit test in the anatomy proves both skip shapes parse to the bare env-var name and rejects malformed shapes. Anatomy pin bumped to 1.1.8.
|
|
22
|
+
|
|
23
|
+
- fix: `blueprints/jobs-background/contributions/probes/retry-and-fail-real-account.mjs` line 104 now emits `skipRow('CI_HAS_CLOUDFLARE_ACCOUNT (not "true")')` when the gate variable is set to a non-"true" value, matching the shape the anatomy strips via `/ unset$| \(not "true"\)$/`.
|
|
24
|
+
- fix: `packages/rcf-lite/test/blueprint/jobs-background-anatomy.test.js` STRICT_ID_KEYS retains engine-returned scalars only (`requestId`, `eTag`, `versionId`, `uploadId`, `queueId`, `messageId`, `jobId`, `rowId`, `insertedId`, `backendPid`, `transactionId`, `migrationVersion` and their labelled siblings). `bucketName`, `scratchBucket`, `queueName`, `databaseName` and the checksum keys were removed. Same-file strict-AND now asserts idWitness and derivedWitness sit under DIFFERENT keys.
|
|
25
|
+
- fix: `apply-time-override` and `apply-time-refusal` pre-condition failure branches (rcf init / apply failing before the runtime probe path) are declaimed to `conformanceOnly` with a limitation naming the runtime AC and why no engine-minted id exists on this row.
|
|
26
|
+
- add: `packages/rcf-lite/test/blueprint/jobs-background-anatomy.test.js` carries a negative unit test that constructs the `<VAR> unset` and `<VAR> (not "true")` shapes and asserts both parse to the same bare env-var name; malformed shapes such as `<VAR> set to "1" (not "true")` are rejected.
|
|
27
|
+
- prose: run-notes reworded to state engine-returned-only identifiers where relevant.
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## 1.1.7 - 2026-09-11
|
|
32
|
+
|
|
33
|
+
The probe owns its skip, the anatomy invokes every probe unconditionally, and the anatomy-only `RCF_ANATOMY_RUN_PROBES` gate is retired. The jobs-background anatomy test removes the outer gate, invokes each probe directly, and validates whatever comes back: local probes (`apply-time-refusal`, `apply-time-override`, `fake-clock-cron`, `retry-and-fail`, `event-secrecy`) drive the in-memory queue driver and the rcf-lite CLI on scratch dirs and produce real evidence rows; the live probe (`retry-and-fail-real-account`) returns its own exact one-variable `accountBoundSkipped` row when `CF_API_BASE` or an account variable is unset. Anatomy pin bumped to 1.1.7.
|
|
34
|
+
|
|
35
|
+
- fix: `RCF_ANATOMY_RUN_PROBES` outer gate retired from the jobs anatomy test; the probe owns its skip.
|
|
36
|
+
- fix: fake-clock-cron rows carry a scalar `jobId` (from the jobStarted / jobScheduled event) so the strict AND-witness check sees a real engine-minted id alongside the derived counters.
|
|
37
|
+
- fix: retry-and-fail row carries a scalar `jobId` (the first observed jobStarted event); the distinct-jobId list moves to `distinctJobIdList` (a non-id key).
|
|
38
|
+
- fix: event-secrecy row carries a scalar `jobId` (from the first event on the run-log stream) alongside the whitelist and leaked-literal derived witnesses.
|
|
39
|
+
- fix: apply-time-refusal and apply-time-override rows are honestly de-claimed to `conformanceOnly` against their real ACs (AC-jobs-requiresQueue and AC-jobs-overrideRecorded): compose-time refusal and sidecar-notes properties are observed by CLI exit code and stderr/notes grep, not by a minted engine id.
|
|
40
|
+
- fix: anatomy identifier predicate is string-only and non-empty; booleans, numbers, arrays and objects never satisfy an engine-minted id key.
|
|
41
|
+
- fix: anatomy limitation-token regex broadened to `AC-[A-Za-z0-9-]+` so every AC token is checked for membership in the shipped user-story AC set.
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
## 1.1.6 - 2026-09-11
|
|
45
|
+
|
|
46
|
+
Strict-anatomy rewrite of the 7d witness rules. The anatomy test now REQUIRES an AC-id-membership check on every limitation and every notObservableHere.ac against the shipped user-story set (numeric AC-30xxx-x and labelled AC-jobs-* both accepted), REQUIRES both an id-shape witness AND a derived-value witness on every non-declaimed row (strict AND, never OR), invokes every probe directly and validates each returned row in-memory, and requires accountBoundSkipped rows to name exactly one env var declared on the probe DECLARED_ENV list. Anatomy pin bumped to 1.1.6.
|
|
47
|
+
|
|
48
|
+
- fix: fake-clock-cron probe row 0 now carries `fireEventCount` and `firePresent` alongside `fires`/`cron`; row 1 carries `jobStartedTimestamp` and `jobStartedAttempts` alongside `jobStartedEvent`; row 2 carries `jobCompletedDurationMs` and `jobCompletedTimestamp` alongside `jobCompletedEvent`. The `extra.engineNote` now honestly acknowledges that the paired real-account probe does NOT exercise cron and therefore does NOT supply cron-trigger evidence; live wrangler-dev cron-trigger firing under workerCron scheduler mode remains a per-AC mechanism-reach gap.
|
|
49
|
+
- fix: retry-and-fail-real-account.mjs API base URL is now a required declared variable: `CF_API_BASE` is on `DECLARED_ENV` and the probe reads it directly with no literal endpoint host in source. When unset the probe records an exact one-variable skip on the row.
|
|
50
|
+
- fix: run-notes correction so the queue-listing polls-taken count matches the record (pollsTaken=1).
|
|
51
|
+
- register: neutral wording on the 1.0.0 and 1.1.5 entries (no capability change).
|
|
52
|
+
|
|
53
|
+
## 1.1.5 - 2026-09-11
|
|
54
|
+
|
|
55
|
+
Positive-evidence conformance work on the shared infra-s3-and-queue fixture (authoring standard section 7d), plus one live-engine run on Cloudflare Queues for the real-account probe. The infra-s3-and-queue fixture README gains a Declared env vars table for the jobs-background pack (naming the actual env reads on `src/producer.mjs`: `RCF_QUEUE_NAME`, `RCF_DLQ_NAME`, `RCF_MAX_RETRIES`, `RCF_BATCH_SIZE`, `RCF_BATCH_TIMEOUT_MS`, `WRANGLER_DEV_PORT`, plus the `SIMULATE_HANDLER_THROW` and `SIMULATE_PII_IN_JOB_INPUT` switches, and the new probe's `CI_HAS_CLOUDFLARE_ACCOUNT`, `CF_ACCOUNT_ID`, `CF_API_TOKEN` real-account gates); an off-table read is refused at gate. The five local probes execute against the in-memory queue-driver seam and fake-clock scheduler as shipped, producing rcf-lite bin exit codes, stable-message-id tags, sidecar contents, jobId-and-attempts trajectories, and a run-log grep-clean over the PII fixture literals as positive evidence. Anatomy pin extended to include the Declared env vars section on the fixture README, to derive the declared names from actual `process.env` and `env.` reads on producer.mjs AND the real-account probe (so table drift on either surface is caught statically), and to pin `fake-clock-cron` as a local-conformance probe.
|
|
56
|
+
|
|
57
|
+
- fix: fixture Declared env vars table for the jobs-background pack replaces the legacy names `QUEUE_NAME`/`DLQ_NAME`/`QUEUE_MAX_RETRIES` (which the code does not read) with the actual `RCF_*` reads + `WRANGLER_DEV_PORT`; the anatomy test derives the expected env-var list from concrete `env.<NAME>` matches on both `packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/producer.mjs` and the real-account probe source.
|
|
58
|
+
- fix: fake-clock-cron probe records the scheduled-to-started latency (jobStarted timestamp minus jobScheduled timestamp) but does NOT assert a tolerance: the row is conformance-only (`anchorAcId: null`, limitation names AC-jobs-scheduledRunsOnCron and states that `scheduledAt` is `new Date().toISOString()` at publish time so the delta is a same-clock intra-runtime measurement, not a wall-clock cron-boundary comparison). The row no longer claims the paired real-account run provides cron-trigger coverage (the real-account run only drives Cloudflare Queues).
|
|
59
|
+
- fix: probe results carry per-row `evidence` bags; `aggregate([])` returns `fail` with `no checks ran` instead of default-pass; the `runShim` also fails-with-no-checks-ran on a null/undefined probe return.
|
|
60
|
+
- add: `retry-and-fail-real-account.mjs` (live-engine coverage) drives a scratch Cloudflare Queue and DLQ through the vendor's REST + `http_pull` consumer contract. Every non-skip row is conformance-only (`anchorAcId: null`) with a limitation naming the nearest shipped AC id and the property it states that this probe does not positively observe: the attempts-counter row cites AC-jobs-retryOnHandlerFailure (the AC states applied in-memory queue redelivery and jobStarted-on-sink events; the probe records the vendor Cloudflare Queues attempts counter [0,1,2,3] instead), the DLQ landing row cites AC-30109-1 (the AC pins the in-memory driver DLQ-producer invocation; the probe records real Cloudflare Queues DLQ landing), and the queue provisioning + teardown rows cite AC-jobs-requiresQueue as the nearest shipped AC. The row scope is the vendor queue transport (not the in-process jobs runtime; that surface is proven by `retry-and-fail.mjs`). Post-run absence is asserted only when the Queues listing returns HTTP 200 and json.success=true (an unsuccessful listing never normalises to an empty list). DLQ ack failures land on the teardown record and fail the teardown row. Both queues are destroyed on teardown and teardown is a result row (teardown FAIL fails the verdict).
|
|
61
|
+
- fixture: `src/scheduler.mjs`'s `publishOne` records `scheduledAt` as `new Date().toISOString()` in the runtime's own time domain (matching the `Date.now()` domain the runtime stamps on `jobStarted`), and the fake clock still drives WHEN cron fires; `src/bucket-ops.mjs` added as a thin `@aws-sdk/client-s3` wrapper (see object-storage-s3 changelog); no new runtime dependencies land on rcf-lite or the fixture.
|
|
62
|
+
- fix: fixture Declared env vars section headers name only the pack; supporting prose no longer carries internal provenance references.
|
|
63
|
+
|
|
3
64
|
## 1.1.4 - 2026-09-10
|
|
4
65
|
|
|
5
66
|
Register cleanup on shipped prose: neutral wording in README, `jobs-background-REQ-001.description`, `ADR-3103.consequences` and `TAC-3101.dependencies[2].description` with no capability change. README opening now names the applied-capability mechanism directly. REQ-001 states the exit-code and stable-message-id assertions in neutral form. ADR-3103 describes the sidecar-note construction in plain external terms without the internal repo-path reference. TAC-3101 reads "via the applied-capability mechanism". REQ-001, ADR-3103 and TAC-3101 patch-bumped. Anatomy pin updated to 1.1.4. Chain-consistency lint zero on pass 1 and pass 2. Closes criterion-f findings 3, 4, 5 and 7 for jobs-background; findings 2 and 6 were already closed on origin/main.
|
|
6
67
|
|
|
7
68
|
## 1.1.3 - 2026-09-10
|
|
8
69
|
|
|
9
|
-
|
|
70
|
+
Dimension-d ownership sweep for REQ-002 continued: migrated every reference from the intermediary `TAC-3101.responsibilities[0]` to the true owner `TAC-3101.interfaces.jobModule.default`. Removed the five-field shape restatement from `TAC-3101.purpose`, `AC-30102-1` (description and then-clause), the README table row for REQ-002, the "What this gives you" bullet, and the guide's "Writing a job" intro; each surface now points at the owner. The guide's demonstrative code sample remains as usage-demonstration below a one-line owner pointer. Anatomy pin updated to 1.1.3. TAC-3101, REQ-002 and user-story-30102 patch-bumped. Chain-consistency lint zero on repeat invocation. Later residues cleared without a further bump: the user-story-30102 title and the guide's "What does NOT change" bullet now reference the owner instead of restating the five-field shape.
|
|
10
71
|
|
|
11
72
|
## 1.1.2 - 2026-09-10
|
|
12
73
|
|
|
@@ -24,17 +85,17 @@ Adds the elicits block (jobs-directory, scheduler-mode, max-attempts, retry-back
|
|
|
24
85
|
|
|
25
86
|
## 1.0.0 - 2026-09-06
|
|
26
87
|
|
|
27
|
-
Initial release. Background-jobs discipline over an applied `queue` capability, with a job-definition contract, a POSIX-cron plus one-shot-delayed scheduler, a retry contract that inherits the applied queue's max-attempts ceiling, and a metadata-only run-log event stream at four moments. Composes on the capability-consumer mechanism from the
|
|
88
|
+
Initial release. Background-jobs discipline over an applied `queue` capability, with a job-definition contract, a POSIX-cron plus one-shot-delayed scheduler, a retry contract that inherits the applied queue's max-attempts ceiling, and a metadata-only run-log event stream at four moments. Composes on the capability-consumer mechanism from the composition guide; on a bare project with no applied `queue` capability, apply refuses with exit 3 and the stable message id `jobs-background-no-queue`. Chains after `messaging-queue-cloudflare` v1.0.0 as the applied queue capability.
|
|
28
89
|
|
|
29
90
|
- 22 contributions: 6 REQs on `requiresAppliedCapabilities: [queue]` / job-definition / scheduler / retry / run-log / operator-facing surface; 9 USs at 30101-30109 (one per REQ plus three cross-cutting cases: apply-time refusal, scheduled fire on cron, retry-then-DLQ); 3 TACs (3101 job-definition module, 3102 scheduler, 3103 run-log event sink); 4 ADRs (3101 `scope: global` on new topic `backgroundJobModel` retry-and-schedule as the shipped shape, 3102 scheduler mode elicited across `inProcess` / `workerCron` / `external` with reserved v1.1.0 `workflows` slot per section 5.7 of the spec, 3103 requires `capabilities: ["queue"]` with `allowSkipFlag: "allow-no-queue-yet"` and refusal message id `jobs-background-no-queue`, 3104 default handler timeout 60 seconds floor 1 second ceiling bounded by the applied queue's consumer wall-clock which for Cloudflare Queues is 15 minutes per the fetched limits doc).
|
|
30
|
-
- Five Node-only probes under `contributions/probes/` proven against the in-memory queue-driver seam and a fake-clock scheduler seam (
|
|
91
|
+
- Five Node-only probes under `contributions/probes/` proven against the in-memory queue-driver seam and a fake-clock scheduler seam (user-story-29107 accepts the in-memory realisation of the Cloudflare Queues binding shape as the shipped local seam): `apply-time-refusal`, `apply-time-override`, `fake-clock-cron`, `retry-and-fail`, `event-secrecy`. All five carry `accountBound: false`; the live `wrangler dev` cron-trigger path is documented as a per-AC mechanism-reach gap in the fixture README per the AC-mechanism-reach checklist item 6.g.
|
|
31
92
|
- The jobs-background slice of the shared sample-app fixture at `packages/rcf-lite/test/fixtures/infra-s3-and-queue/` adds a `jobs/` directory carrying two toy job-definition modules (`send-welcome-email.mjs` with `retryPolicy: { maxAttempts: 3, backoff: exponential }` and `timeoutMs: 60000`; `refresh-cache.mjs` with `retryPolicy: { maxAttempts: 5, backoff: constant }`, `timeoutMs: 10000`, `cron: '* * * * *'`), `src/jobs-runtime.mjs` realising the runtime, `src/scheduler.mjs` realising the `inProcess` scheduler with a fake-clock seam, and `src/job-run-log.mjs` realising the jobs-background-owned event sink (whitelist `event, jobId, jobName, attempts, duration, timestamp` plus optional `terminalErrorCode`). Two wired induced-failure switches (`SIMULATE_HANDLER_THROW`, `SIMULATE_PII_IN_JOB_INPUT`) drive the retry-and-fail and event-secrecy probe negative-run paths.
|
|
32
93
|
- Declares `capabilities: ["backgroundJobs"]`, `suggestedCompanions: [{role: "logging"}, {role: "errorHandling"}]`, `providesRoles` absent, `requiresAppliedCapabilities: { capabilities: ["queue"], allowSkipFlag: "allow-no-queue-yet", refusalMessageId: "jobs-background-no-queue" }`. The `messaging-queue-cloudflare` v1.0.0 is the shipped provider of the `queue` capability.
|
|
33
94
|
- Contributes ADR-3101 as `scope: global` on new topic `backgroundJobModel`. Future stateful-workflow siblings (Temporal-shape, Airflow-shape) will conflict here by design; the reserved round-6 Workflows adapter (per spec section 5.7) lives INSIDE this blueprint as a v1.1.0 minor scheduler-mode value at ADR-3102, not as a sibling.
|
|
34
|
-
- Every ADR contribution entry on `blueprint.json` carries a `standardsTraceClause` per section 8a.2 (mandatory
|
|
95
|
+
- Every ADR contribution entry on `blueprint.json` carries a `standardsTraceClause` per section 8a.2 (mandatory).
|
|
35
96
|
- Extends `packages/rcf-lite/docs/blueprint-authoring.md` section 6a capability-declaration table with one row for `backgroundJobs` naming the reserved stateful-workflow sibling posture per spec section 5.6.
|
|
36
97
|
- Extends `packages/rcf-lite/src/cli/blueprint.js` OPTION_SPEC with `--allow-no-queue-yet` boolean flag piped into `allowNoAuthYet` alongside `--allow-no-auth-yet` and `--allow-no-secrets-yet`, and `packages/rcf-lite/src/blueprint/apply.js` `buildOverrideNote` family derivation to detect `queue` from the flag name so the sidecar notes read "no queue yet: applied under --allow-no-queue-yet" instead of "no auth yet".
|
|
37
98
|
- Extends `packages/rcf-lite/test/blueprint/capabilities-apply.test.js` with four cases covering the queue-capability path end to end: bare-project refusal with tag and provider-name assertions, `--allow-no-queue-yet` override with queue-family sidecar-note assertion, happy path with `messaging-queue-cloudflare` applied producing `appliedCapabilities` including `queue`, and backward-compatible `--allow-no-auth-yet` also unblocks the override.
|
|
38
99
|
- Reserved v1.1.0 minor: adds `scheduler: "workflows"` mode under ADR-3102 wrapping the same job-definition contract with Cloudflare Workflows `step.do` orchestration per section 5.7 of the spec and the fetched Workflows documentation.
|
|
39
100
|
|
|
40
|
-
|
|
101
|
+
Adds two option-binding ACs on scheduler-mode (AC-30103-3 workerCron, AC-30103-4 external) to close section 7c on the elicits catalogue. Adds four failure-path ACs walking the guide - retryPolicy.maxAttempts above the applied queue ceiling (AC-30102-3), and effective-delay per backoff shape with the 10-minute cap: exponential (AC-30104-3), constant (AC-30104-4), linear (AC-30104-5). Adds deliveredBy on REQ-003, REQ-005, REQ-006.
|
|
@@ -70,7 +70,7 @@ Each probe module lives under `contributions/probes/` and exports the spec secti
|
|
|
70
70
|
|
|
71
71
|
## Running the probes
|
|
72
72
|
|
|
73
|
-
The probes drive against the shared sample-app fixture at `packages/rcf-lite/test/fixtures/infra-s3-and-queue/` (extended with `jobs/`, `src/jobs-runtime.mjs`, `src/scheduler.mjs`, `src/job-run-log.mjs`). No Docker, no `wrangler dev` process required; the in-memory queue-driver seam is the shipped local seam per
|
|
73
|
+
The probes drive against the shared sample-app fixture at `packages/rcf-lite/test/fixtures/infra-s3-and-queue/` (extended with `jobs/`, `src/jobs-runtime.mjs`, `src/scheduler.mjs`, `src/job-run-log.mjs`). No Docker, no `wrangler dev` process required; the in-memory queue-driver seam is the shipped local seam per the wrangler-dev-equivalent seam decision.
|
|
74
74
|
|
|
75
75
|
Two-line boot for the two headline probes:
|
|
76
76
|
|
|
@@ -94,7 +94,7 @@ The remaining three shims (`run-apply-time-override.mjs`, `run-retry-and-fail.mj
|
|
|
94
94
|
|
|
95
95
|
- AC-jobs-requiresQueue: PROVEN via `apply-time-refusal.mjs` against a bare scratch project on the shipped head (exit code and message id assertions run in-process). No live-only gap.
|
|
96
96
|
- AC-jobs-overrideRecorded: PROVEN via `apply-time-override.mjs` on the shipped head (sidecar note grep asserts `no queue yet`, `--allow-no-queue-yet`, and family word `queue`). No live-only gap.
|
|
97
|
-
- AC-jobs-scheduledRunsOnCron: PROVEN via `fake-clock-cron.mjs` on the shipped head against the in-memory queue-driver seam plus the injected fake-clock scheduler seam. LIVE `wrangler dev` cron-trigger firing under `workerCron` scheduler mode is the
|
|
97
|
+
- AC-jobs-scheduledRunsOnCron: PROVEN via `fake-clock-cron.mjs` on the shipped head against the in-memory queue-driver seam plus the injected fake-clock scheduler seam. LIVE `wrangler dev` cron-trigger firing under `workerCron` scheduler mode is the gate reviewer's follow-up run per the wrangler-dev-equivalent seam decision; the shipped local seam proves the scheduler and runtime dispatch chain without a Cloudflare Queues account.
|
|
98
98
|
- AC-jobs-retryOnHandlerFailure: PROVEN via `retry-and-fail.mjs` on the shipped head (three `jobStarted` records at attempts 1, 2, 3 followed by terminal `jobFailed`). The in-memory queue-driver's re-delivery loop matches Cloudflare Queues' retry semantics per the messaging-queue-cloudflare opaque-adapter clause; a live-account run against Cloudflare Queues is the messaging-queue-cloudflare real-account concurrency smoke's territory, not this blueprint's.
|
|
99
99
|
- AC-jobs-eventSecrecy: PROVEN via `event-secrecy.mjs` on the shipped head (grep on the serialised run-log stream returns zero matches for every PII fixture literal). No live-only gap; the whitelist enforcement lives in code, not in a runtime environment.
|
|
100
100
|
- `workerCron` refuses on an applied queue with no cron surface: DOCUMENTED at ADR-3102 in this blueprint's contribution set; not exercised at v1.0.0 because the shipped provider (`messaging-queue-cloudflare` v1.0.0) does not itself claim a cron surface (the cron surface is Workers-side per Cloudflare Cron Triggers, not Queues-side). A follow-up train fires the refusal live once a `queue`-capability provider with a cron surface ships.
|
|
@@ -19,6 +19,8 @@ import { fileURLToPath } from 'node:url';
|
|
|
19
19
|
|
|
20
20
|
import { PROJECT_ROOT } from './probe-utils.mjs';
|
|
21
21
|
|
|
22
|
+
const AC_FIRST8 = 'On a fresh init scratch project with NO';
|
|
23
|
+
|
|
22
24
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
23
25
|
const BLUEPRINT_DIR = resolve(HERE, '..', '..');
|
|
24
26
|
const RCF_BIN = resolve(PROJECT_ROOT, 'packages/rcf-lite/bin/rcf.js');
|
|
@@ -40,9 +42,12 @@ export default async function runProbe() {
|
|
|
40
42
|
const init = await runNode([RCF_BIN, 'init'], { cwd: scratch });
|
|
41
43
|
if (init.code !== 0) {
|
|
42
44
|
return [{
|
|
43
|
-
anchorAcId:
|
|
45
|
+
anchorAcId: null,
|
|
46
|
+
conformanceOnly: true,
|
|
47
|
+
limitation: `${OVERRIDE_PRECOND_LIM}`,
|
|
44
48
|
verdict: 'fail',
|
|
45
|
-
detail: `rcf init failed exit=${init.code} stderr=${init.stderr}`,
|
|
49
|
+
detail: `conformanceOnly (${OVERRIDE_PRECOND_LIM}) - rcf init failed exit=${init.code} stderr=${init.stderr}`,
|
|
50
|
+
evidence: { initExitCode: init.code, initStderrSample: init.stderr.slice(0, 400) },
|
|
46
51
|
}];
|
|
47
52
|
}
|
|
48
53
|
const apply = await runNode(
|
|
@@ -51,18 +56,24 @@ export default async function runProbe() {
|
|
|
51
56
|
);
|
|
52
57
|
if (apply.code !== 0) {
|
|
53
58
|
return [{
|
|
54
|
-
anchorAcId:
|
|
59
|
+
anchorAcId: null,
|
|
60
|
+
conformanceOnly: true,
|
|
61
|
+
limitation: `${OVERRIDE_PRECOND_LIM}`,
|
|
55
62
|
verdict: 'fail',
|
|
56
|
-
detail: `apply --allow-no-queue-yet expected exit 0; got exit=${apply.code} stderr=${apply.stderr}`,
|
|
63
|
+
detail: `conformanceOnly (${OVERRIDE_PRECOND_LIM}) - apply --allow-no-queue-yet expected exit 0; got exit=${apply.code} stderr=${apply.stderr}`,
|
|
64
|
+
evidence: { applyExitCode: apply.code, applyStderrSample: apply.stderr.slice(0, 400) },
|
|
57
65
|
}];
|
|
58
66
|
}
|
|
59
67
|
// Sidecar path.
|
|
60
68
|
const sidecarPath = join(scratch, 'rcf', 'blueprints', 'jobs-background.applied.json');
|
|
61
69
|
try { await stat(sidecarPath); } catch {
|
|
62
70
|
return [{
|
|
63
|
-
anchorAcId:
|
|
71
|
+
anchorAcId: null,
|
|
72
|
+
conformanceOnly: true,
|
|
73
|
+
limitation: `${OVERRIDE_PRECOND_LIM}`,
|
|
64
74
|
verdict: 'fail',
|
|
65
|
-
detail: `sidecar ${sidecarPath} missing after --allow-no-queue-yet apply`,
|
|
75
|
+
detail: `conformanceOnly (${OVERRIDE_PRECOND_LIM}) - sidecar ${sidecarPath} missing after --allow-no-queue-yet apply`,
|
|
76
|
+
evidence: { sidecarPathAbsent: true },
|
|
66
77
|
}];
|
|
67
78
|
}
|
|
68
79
|
const doc = JSON.parse(await readFile(sidecarPath, 'utf8'));
|
|
@@ -79,17 +90,34 @@ export default async function runProbe() {
|
|
|
79
90
|
notesNotSecretsFamily: !notes.includes('no secrets-management yet'),
|
|
80
91
|
};
|
|
81
92
|
const pass = Object.values(checks).every(Boolean);
|
|
93
|
+
// The apply-time-override property is observed by CLI exit code
|
|
94
|
+
// and sidecar-notes grep; no engine-minted id is produced on this
|
|
95
|
+
// row (a sidecar-notes assertion, not a runtime job/message id).
|
|
96
|
+
// Row is conformanceOnly against AC-jobs-overrideRecorded with
|
|
97
|
+
// the no-engine-id clause named on the limitation.
|
|
82
98
|
results.push({
|
|
83
|
-
anchorAcId:
|
|
99
|
+
anchorAcId: null,
|
|
100
|
+
conformanceOnly: true,
|
|
101
|
+
limitation: `AC-jobs-overrideRecorded: with the override flag the apply verb exits 0 and the sidecar carries 'no queue yet' and '--allow-no-queue-yet' on notes; observed here through CLI exit code and sidecar grep. Not observed on this row: an engine-minted id (the sidecar-notes assertion is compose-time, not runtime).`,
|
|
84
102
|
verdict: pass ? 'pass' : 'fail',
|
|
85
103
|
detail: pass
|
|
86
|
-
?
|
|
87
|
-
:
|
|
104
|
+
? `${AC_FIRST8} - exit=0; sidecar recorded slug=jobs-background allowNoAuthYet=true appliedCapabilities=[]; notes carry 'no queue yet' + '--allow-no-queue-yet' + 'queue' and none of the auth/secrets family words`
|
|
105
|
+
: `${AC_FIRST8} - checks=${JSON.stringify(checks)}; notes='${notes}'`,
|
|
106
|
+
evidence: { checks, sidecarDoc: doc, exitCode: apply.code },
|
|
88
107
|
});
|
|
89
108
|
// Do NOT include the sidecarPath (a per-run tmp path) in the report;
|
|
90
109
|
// the sidecar contents (doc) is the load-bearing evidence.
|
|
91
110
|
return { results, extra: { sidecar: doc } };
|
|
92
111
|
} finally {
|
|
93
|
-
try { await rm(scratch, { recursive: true, force: true }); } catch {
|
|
112
|
+
try { await rm(scratch, { recursive: true, force: true }); } catch (err) {
|
|
113
|
+
results.push({
|
|
114
|
+
anchorAcId: null,
|
|
115
|
+
conformanceOnly: true,
|
|
116
|
+
limitation: `${TEARDOWN_PRECOND_LIM}`,
|
|
117
|
+
verdict: 'fail',
|
|
118
|
+
detail: 'conformanceOnly (' + TEARDOWN_PRECOND_LIM + ') - scratch dir teardown failed: ' + (err && err.message),
|
|
119
|
+
evidence: { teardownStep: 'rm scratch', error: err && err.message },
|
|
120
|
+
});
|
|
121
|
+
}
|
|
94
122
|
}
|
|
95
123
|
}
|
|
@@ -24,6 +24,8 @@ import { fileURLToPath } from 'node:url';
|
|
|
24
24
|
|
|
25
25
|
import { PROJECT_ROOT } from './probe-utils.mjs';
|
|
26
26
|
|
|
27
|
+
const AC_FIRST8 = 'On a fresh init scratch project with NO';
|
|
28
|
+
|
|
27
29
|
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
28
30
|
const BLUEPRINT_DIR = resolve(HERE, '..', '..');
|
|
29
31
|
const RCF_BIN = resolve(PROJECT_ROOT, 'packages/rcf-lite/bin/rcf.js');
|
|
@@ -46,9 +48,12 @@ export default async function runProbe() {
|
|
|
46
48
|
const init = await runNode([RCF_BIN, 'init'], { cwd: scratch });
|
|
47
49
|
if (init.code !== 0) {
|
|
48
50
|
return [{
|
|
49
|
-
anchorAcId:
|
|
51
|
+
anchorAcId: null,
|
|
52
|
+
conformanceOnly: true,
|
|
53
|
+
limitation: `${REFUSAL_PRECOND_LIM}`,
|
|
50
54
|
verdict: 'fail',
|
|
51
|
-
detail: `rcf init failed exit=${init.code} stderr=${init.stderr}`,
|
|
55
|
+
detail: `conformanceOnly (${REFUSAL_PRECOND_LIM}) - rcf init failed exit=${init.code} stderr=${init.stderr}`,
|
|
56
|
+
evidence: { initExitCode: init.code, initStderrSample: init.stderr.slice(0, 400) },
|
|
52
57
|
}];
|
|
53
58
|
}
|
|
54
59
|
// 2. Attempt to apply jobs-background on the bare project.
|
|
@@ -63,12 +68,20 @@ export default async function runProbe() {
|
|
|
63
68
|
const overrideMatch = apply.stderr.includes('--allow-no-queue-yet');
|
|
64
69
|
const codeMatch = apply.code === 3;
|
|
65
70
|
const pass = codeMatch && tagMatch && providerMatch && overrideMatch;
|
|
71
|
+
// The compose-time refusal is observed by CLI exit code and
|
|
72
|
+
// stderr grep; no engine-minted id is produced on this row (the
|
|
73
|
+
// apply pipeline refuses before minting any job/message id).
|
|
74
|
+
// Row is conformanceOnly against AC-jobs-requiresQueue with the
|
|
75
|
+
// no-engine-id clause named on the limitation.
|
|
66
76
|
results.push({
|
|
67
|
-
anchorAcId:
|
|
77
|
+
anchorAcId: null,
|
|
78
|
+
conformanceOnly: true,
|
|
79
|
+
limitation: `AC-jobs-requiresQueue: on a bare project the apply verb refuses with exit 3 and stderr carrying [jobs-background-no-queue]; observed here through CLI exit code and stderr grep. Not observed on this row: an engine-minted id (the refusal happens before any job or message id is minted).`,
|
|
68
80
|
verdict: pass ? 'pass' : 'fail',
|
|
69
81
|
detail: pass
|
|
70
|
-
?
|
|
71
|
-
:
|
|
82
|
+
? `${AC_FIRST8} - exit=${apply.code}; stderr first line carries [jobs-background-no-queue] tag; stderr names messaging-queue-cloudflare; stderr names --allow-no-queue-yet`
|
|
83
|
+
: `${AC_FIRST8} - expected exit=3 AND first-line tag [jobs-background-no-queue] AND messaging-queue-cloudflare AND --allow-no-queue-yet; got exit=${apply.code}; firstLine='${firstLine}'; tagMatch=${tagMatch}; providerMatch=${providerMatch}; overrideMatch=${overrideMatch}`,
|
|
84
|
+
evidence: { exitCode: apply.code, stderrFirstLine: firstLine, tagPresent: tagMatch, providerPresent: providerMatch, overrideFlagPresent: overrideMatch },
|
|
72
85
|
});
|
|
73
86
|
// Do NOT include the scratch dir path in the committed report; it is
|
|
74
87
|
// a per-run tmp path and would leak the machine's tmp naming into the
|
|
@@ -77,6 +90,15 @@ export default async function runProbe() {
|
|
|
77
90
|
} finally {
|
|
78
91
|
// rm -rf the scratch dir (deletion discipline: literal absolute
|
|
79
92
|
// scratch path created this call).
|
|
80
|
-
try { await rm(scratch, { recursive: true, force: true }); } catch {
|
|
93
|
+
try { await rm(scratch, { recursive: true, force: true }); } catch (err) {
|
|
94
|
+
results.push({
|
|
95
|
+
anchorAcId: null,
|
|
96
|
+
conformanceOnly: true,
|
|
97
|
+
limitation: `${TEARDOWN_PRECOND_LIM_R}`,
|
|
98
|
+
verdict: 'fail',
|
|
99
|
+
detail: 'conformanceOnly (' + TEARDOWN_PRECOND_LIM_R + ') - scratch dir teardown failed: ' + (err && err.message),
|
|
100
|
+
evidence: { teardownStep: 'rm scratch', error: err && err.message },
|
|
101
|
+
});
|
|
102
|
+
}
|
|
81
103
|
}
|
|
82
104
|
}
|
|
@@ -19,6 +19,7 @@ import { resolve } from 'node:path';
|
|
|
19
19
|
|
|
20
20
|
const PII_LITERALS = ['1234', '123-45-6789', 'test@example.com'];
|
|
21
21
|
const EVENT_WHITELIST = new Set(['event', 'jobId', 'jobName', 'attempts', 'duration', 'timestamp', 'terminalErrorCode']);
|
|
22
|
+
const AC_FIRST8 = 'With SIMULATE_PII_IN_JOB_INPUT=true set on the shared sample-app fixture,';
|
|
22
23
|
|
|
23
24
|
export default async function runProbe() {
|
|
24
25
|
const cfg = queueConfigFromEnv();
|
|
@@ -58,12 +59,25 @@ export default async function runProbe() {
|
|
|
58
59
|
}
|
|
59
60
|
const results = [];
|
|
60
61
|
const pass = leaks.length === 0 && wrongKeys.size === 0 && events.some((e) => e.event === 'jobCompleted');
|
|
62
|
+
const engineJobId = (() => {
|
|
63
|
+
for (const e of events) if (typeof e.jobId === 'string' && e.jobId) return e.jobId;
|
|
64
|
+
return null;
|
|
65
|
+
})();
|
|
61
66
|
results.push({
|
|
62
67
|
anchorAcId: 'AC-jobs-eventSecrecy',
|
|
63
68
|
verdict: pass ? 'pass' : 'fail',
|
|
64
69
|
detail: pass
|
|
65
|
-
?
|
|
66
|
-
:
|
|
70
|
+
? `${AC_FIRST8} - no PII literal appears in the serialised run-log stream; every event carries only whitelisted keys ${JSON.stringify([...EVENT_WHITELIST])}; ${events.length} events recorded`
|
|
71
|
+
: `${AC_FIRST8} - leaks=${JSON.stringify(leaks)}; wrongKeys=${JSON.stringify([...wrongKeys])}; events=${JSON.stringify(events)}`,
|
|
72
|
+
evidence: {
|
|
73
|
+
jobId: engineJobId,
|
|
74
|
+
piiLiteralsChecked: PII_LITERALS,
|
|
75
|
+
leakedLiterals: leaks,
|
|
76
|
+
whitelist: [...EVENT_WHITELIST],
|
|
77
|
+
nonWhitelistedKeys: [...wrongKeys],
|
|
78
|
+
eventCount: events.length,
|
|
79
|
+
jobCompletedFired: events.some((e) => e.event === 'jobCompleted'),
|
|
80
|
+
},
|
|
67
81
|
});
|
|
68
82
|
return { results, extra: { events, piiLiterals: PII_LITERALS } };
|
|
69
83
|
}
|
|
@@ -1,19 +1,30 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Fake-clock cron probe.
|
|
2
|
+
* Fake-clock cron probe (local-conformance flavour).
|
|
3
3
|
*
|
|
4
|
-
* Drives the fixture scheduler (inProcess mode with the fake-clock
|
|
5
|
-
* plus the in-memory queue seam plus the jobs-runtime through
|
|
6
|
-
* one POSIX cron minute for the refresh-cache job. Asserts
|
|
7
|
-
* event fires on the injected run-log sink within the elicited
|
|
8
|
-
* fireToleranceMs window (default 30000 ms) with jobName 'refresh-cache'
|
|
9
|
-
* and attempts 1; asserts a jobCompleted event fires within the elicited
|
|
10
|
-
* timeoutMs (10000 ms for refresh-cache).
|
|
4
|
+
* Drives the fixture scheduler (inProcess mode with the fake-clock
|
|
5
|
+
* seam) plus the in-memory queue seam plus the jobs-runtime through
|
|
6
|
+
* one POSIX cron minute for the refresh-cache job. Asserts:
|
|
11
7
|
*
|
|
12
|
-
*
|
|
8
|
+
* - one fire (`fires === 1`),
|
|
9
|
+
* - a jobStarted event fires on the injected run-log sink with
|
|
10
|
+
* jobName 'refresh-cache' and attempts === 1,
|
|
11
|
+
* - a jobCompleted event fires,
|
|
12
|
+
* - jobCompleted.duration <= registry.get('refresh-cache').timeoutMs,
|
|
13
|
+
* - a scheduled-to-started DELTA computed in one clock domain
|
|
14
|
+
* (both timestamps come from Date.now() in the shipped scheduler):
|
|
15
|
+
* the probe asserts the delta is within the
|
|
16
|
+
* tolerance the row claims. When no tolerance can be defended,
|
|
17
|
+
* the row records the observed delta and reports it as the
|
|
18
|
+
* observed value; it never claims a tolerance it does not check.
|
|
19
|
+
*
|
|
20
|
+
* The queue driver is in-memory and the clock is fake, so this row
|
|
21
|
+
* verifies LOCAL conformance of the jobs-runtime and scheduler
|
|
22
|
+
* against the elicited contract. Real Cloudflare Queues cron-trigger
|
|
23
|
+
* coverage is the paired real-account row; this row's AMBER status
|
|
24
|
+
* (in the criterion-e evidence sidecar) is honest about the local
|
|
25
|
+
* engine.
|
|
13
26
|
*
|
|
14
|
-
*
|
|
15
|
-
* clock, not a live wrangler dev process. The README's per-AC
|
|
16
|
-
* mechanism-reach section names the live-only follow-up per SDR-3-a.
|
|
27
|
+
* Anchors AC-jobs-scheduledRunsOnCron.
|
|
17
28
|
*/
|
|
18
29
|
|
|
19
30
|
import { createQueuePair } from '../../../../packages/rcf-lite/test/fixtures/infra-s3-and-queue/src/queue-driver.mjs';
|
|
@@ -25,6 +36,8 @@ import { PROJECT_ROOT } from './probe-utils.mjs';
|
|
|
25
36
|
import { resolve } from 'node:path';
|
|
26
37
|
|
|
27
38
|
const FIRE_TOLERANCE_MS = 30000;
|
|
39
|
+
const AC_FIRST8 = 'With messaging-queue-cloudflare and jobs-background both applied on the';
|
|
40
|
+
const TOLERANCE_LIMITATION = 'AC-jobs-scheduledRunsOnCron: the AC states a jobStarted fires within fireToleranceMs (default 30000 ms) of the scheduled cron boundary; this row observes the scheduled-to-started latency in a fake-clock domain and does NOT assert the elicited fireToleranceMs (a fake-clock scheduled boundary is not a wall-clock boundary comparable to the wall-clock Date.now() the runtime stamps on jobStarted)';
|
|
28
41
|
|
|
29
42
|
export default async function runProbe() {
|
|
30
43
|
const cfg = queueConfigFromEnv();
|
|
@@ -43,23 +56,91 @@ export default async function runProbe() {
|
|
|
43
56
|
const clock = createFakeClock(0);
|
|
44
57
|
const scheduler = createScheduler({ mode: 'inProcess', clock, publisher: producer, runLog });
|
|
45
58
|
scheduler.cron({ jobName: 'refresh-cache', cronString: '* * * * *', input: { cacheKey: 'demo' } });
|
|
46
|
-
// Advance clock past one cron minute; tick to publish.
|
|
47
59
|
clock.advance(60000);
|
|
48
60
|
const fires = await scheduler.tick();
|
|
49
|
-
// Drain runtime.
|
|
50
61
|
await runtime.drain({ driverState: pair.state, maxIterations: 16 });
|
|
62
|
+
|
|
63
|
+
const jobScheduled = events.find((e) => e.event === 'jobScheduled' && e.jobName === 'refresh-cache');
|
|
51
64
|
const jobStarted = events.find((e) => e.event === 'jobStarted' && e.jobName === 'refresh-cache');
|
|
52
65
|
const jobCompleted = events.find((e) => e.event === 'jobCompleted' && e.jobName === 'refresh-cache');
|
|
66
|
+
|
|
53
67
|
const results = [];
|
|
54
|
-
|
|
68
|
+
|
|
69
|
+
// Engine-minted jobId (from the jobStarted or jobScheduled event)
|
|
70
|
+
// is carried on every row so anatomy strict validation sees a real
|
|
71
|
+
// id witness alongside the derived counters.
|
|
72
|
+
const engineJobId = (jobStarted && typeof jobStarted.jobId === 'string' && jobStarted.jobId)
|
|
73
|
+
|| (jobScheduled && typeof jobScheduled.jobId === 'string' && jobScheduled.jobId)
|
|
74
|
+
|| null;
|
|
75
|
+
const firesPass = fires === 1;
|
|
76
|
+
results.push({
|
|
77
|
+
anchorAcId: 'AC-jobs-scheduledRunsOnCron',
|
|
78
|
+
verdict: firesPass ? 'pass' : 'fail',
|
|
79
|
+
detail: firesPass
|
|
80
|
+
? `${AC_FIRST8} - scheduler.tick() published exactly 1 fire after clock.advance(60000)`
|
|
81
|
+
: `${AC_FIRST8} - expected fires=1, got fires=${fires}`,
|
|
82
|
+
evidence: { jobId: engineJobId, fires, cron: '* * * * *', fireEventCount: fires, firePresent: fires === 1 },
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
const startedOk = jobStarted && jobStarted.attempts === 1;
|
|
86
|
+
results.push({
|
|
87
|
+
anchorAcId: 'AC-jobs-scheduledRunsOnCron',
|
|
88
|
+
verdict: startedOk ? 'pass' : 'fail',
|
|
89
|
+
detail: startedOk
|
|
90
|
+
? `${AC_FIRST8} - jobStarted fired for refresh-cache with attempts=${jobStarted.attempts}`
|
|
91
|
+
: `${AC_FIRST8} - jobStarted missing or attempts wrong: ${JSON.stringify(jobStarted)}`,
|
|
92
|
+
evidence: { jobId: engineJobId, jobStartedEvent: jobStarted || null, jobStartedTimestamp: jobStarted ? jobStarted.timestamp : null, jobStartedAttempts: jobStarted ? jobStarted.attempts : null },
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
const completedOk = jobCompleted != null;
|
|
55
96
|
const durationOk = jobCompleted ? jobCompleted.duration <= registry.get('refresh-cache').timeoutMs : false;
|
|
56
|
-
const pass = fires === 1 && startPass && !!jobCompleted && durationOk;
|
|
57
97
|
results.push({
|
|
58
98
|
anchorAcId: 'AC-jobs-scheduledRunsOnCron',
|
|
59
|
-
verdict:
|
|
60
|
-
detail:
|
|
61
|
-
?
|
|
62
|
-
:
|
|
99
|
+
verdict: completedOk && durationOk ? 'pass' : 'fail',
|
|
100
|
+
detail: completedOk && durationOk
|
|
101
|
+
? `${AC_FIRST8} - jobCompleted fired for refresh-cache with duration=${jobCompleted.duration}ms within timeoutMs=${registry.get('refresh-cache').timeoutMs}`
|
|
102
|
+
: `${AC_FIRST8} - completedOk=${completedOk} durationOk=${durationOk}; jobCompleted=${JSON.stringify(jobCompleted)}`,
|
|
103
|
+
evidence: { jobId: engineJobId, jobCompletedEvent: jobCompleted || null, timeoutMs: registry.get('refresh-cache').timeoutMs, jobCompletedDurationMs: jobCompleted ? jobCompleted.duration : null, jobCompletedTimestamp: jobCompleted ? jobCompleted.timestamp : null },
|
|
63
104
|
});
|
|
64
|
-
|
|
105
|
+
|
|
106
|
+
// The fake-clock setup means "scheduledAt" is not a real wall-clock
|
|
107
|
+
// boundary the way a live cron would be; the delta between jobScheduled
|
|
108
|
+
// and jobStarted here is scheduled-to-started latency, not a meaningful wait from
|
|
109
|
+
// a scheduled boundary. This row RECORDS the observed scheduled-to-started
|
|
110
|
+
// latency for reader inspection but does NOT claim it satisfies
|
|
111
|
+
// an "elicited fireToleranceMs" - no AC states such a tolerance for
|
|
112
|
+
// fake-clock fires. Anchor stays on AC-jobs-scheduledRunsOnCron
|
|
113
|
+
// because the property this row proves is "the runtime published
|
|
114
|
+
// the fired job into jobStarted"; the wait-from-scheduled-boundary
|
|
115
|
+
// property is only meaningful for live crons and is not observed
|
|
116
|
+
// here.
|
|
117
|
+
let scheduledToStartedMs = null;
|
|
118
|
+
if (jobScheduled && jobStarted) {
|
|
119
|
+
scheduledToStartedMs = Date.parse(jobStarted.timestamp) - Date.parse(jobScheduled.timestamp);
|
|
120
|
+
}
|
|
121
|
+
results.push({
|
|
122
|
+
anchorAcId: null,
|
|
123
|
+
conformanceOnly: true,
|
|
124
|
+
limitation: TOLERANCE_LIMITATION,
|
|
125
|
+
verdict: (jobScheduled && jobStarted) ? 'pass' : 'fail',
|
|
126
|
+
detail: (jobScheduled && jobStarted)
|
|
127
|
+
? `conformanceOnly (${TOLERANCE_LIMITATION}) - the fired refresh-cache job produced both jobScheduled and jobStarted on the run-log; scheduled-to-started latency observed (not asserted) at ${scheduledToStartedMs}ms`
|
|
128
|
+
: `conformanceOnly (${TOLERANCE_LIMITATION}) - jobScheduled or jobStarted missing: jobScheduled=${JSON.stringify(jobScheduled)} jobStarted=${JSON.stringify(jobStarted)}`,
|
|
129
|
+
evidence: {
|
|
130
|
+
jobScheduledTimestamp: jobScheduled && jobScheduled.timestamp,
|
|
131
|
+
jobStartedTimestamp: jobStarted && jobStarted.timestamp,
|
|
132
|
+
scheduledToStartedLatencyMs: scheduledToStartedMs,
|
|
133
|
+
toleranceAsserted: false,
|
|
134
|
+
note: 'fake-clock setup; scheduledAt is not a wall-clock cron boundary. The paired live-account probe does not exercise cron either; live wrangler-dev cron-trigger coverage remains a per-AC mechanism-reach gap.',
|
|
135
|
+
},
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
return {
|
|
139
|
+
results,
|
|
140
|
+
extra: {
|
|
141
|
+
events,
|
|
142
|
+
fireToleranceMs: FIRE_TOLERANCE_MS,
|
|
143
|
+
engineNote: 'in-memory queue driver + fake-clock seam; the paired live-account probe (retry-and-fail-real-account) does NOT exercise cron and therefore does NOT supply cron-trigger evidence; live wrangler-dev cron-trigger firing under workerCron scheduler mode is a per-AC mechanism-reach gap',
|
|
144
|
+
},
|
|
145
|
+
};
|
|
65
146
|
}
|
|
@@ -30,6 +30,9 @@ export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/jobs-ba
|
|
|
30
30
|
* - pass otherwise
|
|
31
31
|
*/
|
|
32
32
|
export function aggregate(results) {
|
|
33
|
+
// Empty or null result sets are a FAIL: a probe that emitted no rows
|
|
34
|
+
// proved nothing (authoring-standard rule 3, criterion e conformance).
|
|
35
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
33
36
|
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
34
37
|
if (results.some((r) => r.verdict === 'warn')) return 'warn';
|
|
35
38
|
return 'pass';
|
|
@@ -58,7 +61,7 @@ export async function writeReport({ probeName, engine, results, extra = {} }) {
|
|
|
58
61
|
|
|
59
62
|
/**
|
|
60
63
|
* Drive an async main() and exit 0 on aggregate pass, 1 otherwise.
|
|
61
|
-
* Prints the report JSON to stdout for the gate-
|
|
64
|
+
* Prints the report JSON to stdout for the gate-operator to read.
|
|
62
65
|
*/
|
|
63
66
|
export async function runShim(probeName, engine, mainFn) {
|
|
64
67
|
try {
|
|
@@ -69,9 +72,10 @@ export async function runShim(probeName, engine, mainFn) {
|
|
|
69
72
|
process.exit(report.aggregateVerdict === 'pass' ? 0 : 1);
|
|
70
73
|
} catch (err) {
|
|
71
74
|
const results = [{
|
|
72
|
-
|
|
75
|
+
anchorReqId: 'jobs-background-REQ-001',
|
|
73
76
|
verdict: 'fail',
|
|
74
77
|
detail: `probe threw: ${err && err.message ? err.message : String(err)}`,
|
|
78
|
+
evidence: { probeThrew: true, errorMessage: err && err.message ? err.message : String(err), errorName: err && err.name },
|
|
75
79
|
}];
|
|
76
80
|
const { report, path } = await writeReport({ probeName, engine, results });
|
|
77
81
|
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
@@ -82,6 +86,10 @@ export async function runShim(probeName, engine, mainFn) {
|
|
|
82
86
|
}
|
|
83
87
|
|
|
84
88
|
function normaliseMain(value) {
|
|
89
|
+
if (value == null) {
|
|
90
|
+
// A probe that returned null / undefined proved nothing (authoring-standard rule 3).
|
|
91
|
+
return { results: [{ anchorReqId: 'jobs-background-REQ-001', verdict: 'fail', detail: 'no checks ran (probe returned null / undefined)', evidence: { probeReturnedNullOrUndefined: true } }], extra: {} };
|
|
92
|
+
}
|
|
85
93
|
if (Array.isArray(value)) return { results: value, extra: {} };
|
|
86
94
|
if (value && Array.isArray(value.results)) {
|
|
87
95
|
const { results, ...extra } = value;
|