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
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
// Boot-time open-and-migrate probe for persistence-data-sqlite.
|
|
2
|
+
//
|
|
3
|
+
// AC-5101-1 requires ONE named module export invoked exactly ONCE
|
|
4
|
+
// before request handlers bind. A storeOpened event fired on the
|
|
5
|
+
// sink is not proof of "invoked exactly once before handlers bind"
|
|
6
|
+
// (there are no handlers). Row de-claimed (anchorAcId=null,
|
|
7
|
+
// conformanceOnly true) with the limitation naming AC-5101-1.
|
|
8
|
+
//
|
|
9
|
+
// AC-5101-2 requires (a) the store to open with a path sourced from
|
|
10
|
+
// application configuration AND (b) a grep of the source tree to
|
|
11
|
+
// find the identifier resolved from configuration rather than
|
|
12
|
+
// hard-coded. This row observes only clause (a) (path equality on
|
|
13
|
+
// the opened event); a shelf probe cannot cheaply prove absence of
|
|
14
|
+
// hard-coded paths across every consumer module in a downstream
|
|
15
|
+
// project. Row de-claimed with the limitation naming AC-5101-2.
|
|
16
|
+
//
|
|
17
|
+
// AC-5101-3 (open returns only after migrations have run) IS
|
|
18
|
+
// observable as schemaVersion === MAX_SCHEMA_VERSION after open and
|
|
19
|
+
// is kept as a real AC anchor.
|
|
20
|
+
//
|
|
21
|
+
// The reopen row (no migrations applied on second open) is not
|
|
22
|
+
// AC-5101-3 (that AC is about first open completing migrations); it
|
|
23
|
+
// belongs to REQ-002 (idempotent reopen). Row de-claimed with the
|
|
24
|
+
// limitation naming AC-5101-3.
|
|
25
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
26
|
+
import { tmpdir } from 'node:os';
|
|
27
|
+
import { join } from 'node:path';
|
|
28
|
+
import { openStore, MAX_SCHEMA_VERSION } from '../../../../packages/rcf-lite/test/fixtures/probe-pack-persistence-data-sqlite/src/store.mjs';
|
|
29
|
+
|
|
30
|
+
export const anchorAcId = 'AC-5101-3';
|
|
31
|
+
export const accountBound = false;
|
|
32
|
+
const AC3 = 'The open entry point returns only after migrations';
|
|
33
|
+
const LIM_5101_1 = `AC-5101-1: requires a SINGLE named module export invoked exactly ONCE before request handlers bind on the running process. A storeOpened event on the fixture eventSink is not evidence of an application-level export invocation ordering against handler binding.`;
|
|
34
|
+
const LIM_5101_2 = `AC-5101-2: requires (a) the store to open with a path sourced from application configuration AND (b) a grep of the source tree to find the identifier resolved from configuration rather than hard-coded. This row observes only clause (a); the shelf cannot cheaply prove absence of hard-coded paths across every consumer module of a downstream project.`;
|
|
35
|
+
const LIM_5101_3_REOPEN = `AC-5101-3: asserts the open entry point returns only after migrations have RUN (first open). Reopen idempotency (a no-migration second open) is a related but distinct property not stated on AC-5101-3.`;
|
|
36
|
+
|
|
37
|
+
export default async function runProbe() {
|
|
38
|
+
const dir = await mkdtemp(join(tmpdir(), 'rcf-sqlite-boot-'));
|
|
39
|
+
const path = process.env.RCF_FIXTURE_SQLITE_PATH || join(dir, 'store.sqlite');
|
|
40
|
+
const events = [];
|
|
41
|
+
const results = [];
|
|
42
|
+
let bootReport, reopenReport;
|
|
43
|
+
try {
|
|
44
|
+
const store = openStore({ path, eventSink: (r) => events.push(r) });
|
|
45
|
+
const opened = events.filter((e) => e.event === 'storeOpened');
|
|
46
|
+
results.push({
|
|
47
|
+
anchorAcId: null,
|
|
48
|
+
conformanceOnly: true,
|
|
49
|
+
limitation: LIM_5101_1,
|
|
50
|
+
verdict: opened.length === 1 ? 'pass' : 'fail',
|
|
51
|
+
detail: `observed storeOpened emitted ${opened.length} time(s) on the eventSink; path=${opened[0]?.path} timestamp=${opened[0]?.timestamp}. Not evidence of a named export invocation ordering against handler binding.`,
|
|
52
|
+
evidence: { event: opened[0], appliedMigrations: store.appliedMigrations, bodyExcerpt: `storeOpened count=${opened.length}` },
|
|
53
|
+
});
|
|
54
|
+
results.push({
|
|
55
|
+
anchorAcId: null,
|
|
56
|
+
conformanceOnly: true,
|
|
57
|
+
limitation: LIM_5101_2,
|
|
58
|
+
verdict: opened[0]?.path === path ? 'pass' : 'fail',
|
|
59
|
+
detail: `observed opened event path=${opened[0]?.path} matches the configuration input path=${path}. Absence of hard-coded paths across every consumer module of a downstream project not observed.`,
|
|
60
|
+
evidence: { pathFromConfig: path, pathOnEvent: opened[0]?.path, bodyExcerpt: `path=${opened[0]?.path}` },
|
|
61
|
+
});
|
|
62
|
+
const schemaAtOpen = store.schemaVersion();
|
|
63
|
+
// Seed put through the facade so the row carries a real integer
|
|
64
|
+
// rowId as its resource identifier (real returned engine row id).
|
|
65
|
+
const seed = store.put('probe-boot-open-migrate', String(Date.now()));
|
|
66
|
+
results.push({
|
|
67
|
+
anchorAcId: 'AC-5101-3',
|
|
68
|
+
verdict: schemaAtOpen === MAX_SCHEMA_VERSION && Number.isInteger(seed.rowId) && seed.rowId > 0 ? 'pass' : 'fail',
|
|
69
|
+
detail: `${AC3} have run - observed schema version after open=${schemaAtOpen} equals build max known=${MAX_SCHEMA_VERSION}; appliedMigrations=${JSON.stringify(store.appliedMigrations)}; a seed put through the facade returned real integer rowId=${seed.rowId}.`,
|
|
70
|
+
evidence: { rowId: seed.rowId, schemaVersion: schemaAtOpen, appliedMigrations: store.appliedMigrations, bodyExcerpt: `schema=${schemaAtOpen} applied=${JSON.stringify(store.appliedMigrations)} rowId=${seed.rowId}` },
|
|
71
|
+
});
|
|
72
|
+
bootReport = { appliedMigrations: [...store.appliedMigrations], schemaVersion: schemaAtOpen };
|
|
73
|
+
store.close();
|
|
74
|
+
|
|
75
|
+
const store2 = openStore({ path, eventSink: (r) => events.push(r) });
|
|
76
|
+
reopenReport = { appliedMigrations: [...store2.appliedMigrations], schemaVersion: store2.schemaVersion() };
|
|
77
|
+
results.push({
|
|
78
|
+
anchorAcId: null,
|
|
79
|
+
conformanceOnly: true,
|
|
80
|
+
limitation: LIM_5101_3_REOPEN,
|
|
81
|
+
verdict: store2.appliedMigrations.length === 0 && store2.schemaVersion() === MAX_SCHEMA_VERSION ? 'pass' : 'fail',
|
|
82
|
+
detail: `observed reopen appliedMigrations=${JSON.stringify(store2.appliedMigrations)}; schema=${store2.schemaVersion()} (idempotent reopen at max version; distinct property from AC-5101-3 first-open-completes-migrations).`,
|
|
83
|
+
evidence: { schemaVersion: reopenReport.schemaVersion, appliedMigrations: reopenReport.appliedMigrations, bodyExcerpt: `reopen applied=${JSON.stringify(reopenReport.appliedMigrations)}` },
|
|
84
|
+
});
|
|
85
|
+
store2.close();
|
|
86
|
+
} finally {
|
|
87
|
+
await rm(dir, { recursive: true, force: true });
|
|
88
|
+
}
|
|
89
|
+
return { results, extra: { envDeclared: ['RCF_FIXTURE_SQLITE_PATH'], bootReport, reopenReport, eventCount: events.length } };
|
|
90
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
// Facade round-trip probe for persistence-data-sqlite.
|
|
2
|
+
//
|
|
3
|
+
// The CRUD rows (put/get/delete via the fixture's store facade) do
|
|
4
|
+
// NOT observe AC-5107-1's sole-importer property (an import-graph
|
|
5
|
+
// scan over the project's source modules) and do not exhaustively
|
|
6
|
+
// verify AC-5107-2's absence of a general-purpose query method
|
|
7
|
+
// across the facade's public surface. Rows are de-claimed
|
|
8
|
+
// (conformanceOnly, anchorAcId=null) with the limitation naming
|
|
9
|
+
// AC-5107-2 (nearest shipped AC on the CRUD verb surface).
|
|
10
|
+
//
|
|
11
|
+
// The event row observes entryPut / entryRead / entryDeleted which
|
|
12
|
+
// are NOT among the four defined lifecycle events on AC-5106-1
|
|
13
|
+
// (opened, migrated, backupCheckpoint, closed). Row de-claimed
|
|
14
|
+
// with the limitation naming AC-5106-1.
|
|
15
|
+
import { mkdtemp, rm } from 'node:fs/promises';
|
|
16
|
+
import { tmpdir } from 'node:os';
|
|
17
|
+
import { join } from 'node:path';
|
|
18
|
+
import { openStore } from '../../../../packages/rcf-lite/test/fixtures/probe-pack-persistence-data-sqlite/src/store.mjs';
|
|
19
|
+
|
|
20
|
+
export const anchorAcId = 'AC-5107-2';
|
|
21
|
+
export const accountBound = false;
|
|
22
|
+
|
|
23
|
+
const LIM_5107_2 = `AC-5107-2: requires the store facade to expose named verbs for every persistence operation the domain requires AND not to expose a general-purpose query method accepting raw engine-native queries. Runtime CRUD round-trips through the facade demonstrate that the facade's put/get/delete verbs WORK; a probe would still need an exhaustive scan of the facade's public surface to prove absence of a general-purpose query method. Row observes only the narrow-verb round-trip.`;
|
|
24
|
+
const LIM_5106_1 = `AC-5106-1: defines the four lifecycle events (opened, migrated, backupCheckpoint, closed) the store facade must emit. The fixture-extended entryPut/entryRead/entryDeleted events are fixture-added observations, not any of the four defined events.`;
|
|
25
|
+
|
|
26
|
+
export default async function runProbe() {
|
|
27
|
+
const dir = await mkdtemp(join(tmpdir(), 'rcf-sqlite-round-'));
|
|
28
|
+
const path = process.env.RCF_FIXTURE_SQLITE_PATH || join(dir, 'store.sqlite');
|
|
29
|
+
const events = [];
|
|
30
|
+
const results = [];
|
|
31
|
+
let rowId, value = 'hello-world-' + Date.now();
|
|
32
|
+
try {
|
|
33
|
+
const store = openStore({ path, eventSink: (r) => events.push(r) });
|
|
34
|
+
const putResult = store.put('probe/key', value);
|
|
35
|
+
rowId = putResult.rowId;
|
|
36
|
+
results.push({
|
|
37
|
+
anchorAcId: null,
|
|
38
|
+
conformanceOnly: true,
|
|
39
|
+
limitation: LIM_5107_2,
|
|
40
|
+
verdict: Number.isInteger(rowId) && rowId > 0 && putResult.changes === 1 ? 'pass' : 'fail',
|
|
41
|
+
detail: `observed put returned real integer rowId=${rowId} changes=${putResult.changes} through the facade's narrow put verb (no raw SQL).`,
|
|
42
|
+
evidence: { rowId, changes: putResult.changes, bodyExcerpt: `put rowId=${rowId} changes=${putResult.changes}` },
|
|
43
|
+
});
|
|
44
|
+
const got = store.get('probe/key');
|
|
45
|
+
results.push({
|
|
46
|
+
anchorAcId: null,
|
|
47
|
+
conformanceOnly: true,
|
|
48
|
+
limitation: LIM_5107_2,
|
|
49
|
+
verdict: got && got.value === value && got.rowId === rowId ? 'pass' : 'fail',
|
|
50
|
+
detail: `observed get returned rowId=${got?.rowId} valueBytes=${got?.value?.length} match=${got?.value === value} through the facade's narrow get verb.`,
|
|
51
|
+
evidence: { rowIdOnRead: got?.rowId, valueExcerpt: got?.value?.slice(0, 32), bodyExcerpt: `get rowId=${got?.rowId}` },
|
|
52
|
+
});
|
|
53
|
+
const del = store.delete('probe/key');
|
|
54
|
+
const missed = store.get('probe/key');
|
|
55
|
+
results.push({
|
|
56
|
+
anchorAcId: null,
|
|
57
|
+
conformanceOnly: true,
|
|
58
|
+
limitation: LIM_5107_2,
|
|
59
|
+
verdict: del.changes === 1 && missed === null ? 'pass' : 'fail',
|
|
60
|
+
detail: `observed delete changes=${del.changes}; re-read after delete=${missed === null ? 'absent' : 'present'} through the facade's narrow delete then get verbs.`,
|
|
61
|
+
evidence: { rowIdCreatedThenDeleted: rowId, deleteChanges: del.changes, presentAfterDelete: missed !== null, bodyExcerpt: `delete changes=${del.changes} presentAfterDelete=${missed !== null}` },
|
|
62
|
+
});
|
|
63
|
+
const evPut = events.filter((e) => e.event === 'entryPut');
|
|
64
|
+
const evRead = events.filter((e) => e.event === 'entryRead');
|
|
65
|
+
const evDel = events.filter((e) => e.event === 'entryDeleted');
|
|
66
|
+
const eventOk = evPut.length === 1 && evRead.length === 2 && evDel.length === 1;
|
|
67
|
+
const allowedKeys = new Set(['event', 'key', 'size', 'hit', 'timestamp']);
|
|
68
|
+
const extraKeys = [...evPut, ...evRead, ...evDel].flatMap((e) => Object.keys(e)).filter((k) => !allowedKeys.has(k));
|
|
69
|
+
results.push({
|
|
70
|
+
anchorAcId: null,
|
|
71
|
+
conformanceOnly: true,
|
|
72
|
+
limitation: LIM_5106_1,
|
|
73
|
+
verdict: eventOk && extraKeys.length === 0 ? 'pass' : 'fail',
|
|
74
|
+
detail: `observed event counts put=${evPut.length} read=${evRead.length} delete=${evDel.length}; extraFields=${JSON.stringify(extraKeys)} on the eventSink; the fixture-extended entry* events carry only metadata fields.`,
|
|
75
|
+
evidence: { entryPut: evPut[0], entryReadHit: evRead[0], entryReadMiss: evRead[1], entryDeleted: evDel[0], bodyExcerpt: `entryPut=${evPut.length} entryRead=${evRead.length} entryDeleted=${evDel.length}` },
|
|
76
|
+
});
|
|
77
|
+
store.close();
|
|
78
|
+
} finally {
|
|
79
|
+
await rm(dir, { recursive: true, force: true });
|
|
80
|
+
}
|
|
81
|
+
return { results, extra: { envDeclared: ['RCF_FIXTURE_SQLITE_PATH'], rowIdCreatedThenDeleted: rowId, valueBytes: value.length } };
|
|
82
|
+
}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
// Shared helpers for persistence-data-sqlite probes.
|
|
2
|
+
//
|
|
3
|
+
// Runtime posture: probes import the fixture's store facade at
|
|
4
|
+
// packages/rcf-lite/test/fixtures/probe-pack-persistence-data-sqlite/src/store.mjs
|
|
5
|
+
// which opens node:sqlite (Node 24 built-in). No probe uses a mock;
|
|
6
|
+
// every probe runs against the real engine and records positive
|
|
7
|
+
// evidence (a real integer row id, a real migration list, the real
|
|
8
|
+
// WAL checkpoint counters).
|
|
9
|
+
//
|
|
10
|
+
// The blueprint has no account-bound branch, so the accountBoundSkipped
|
|
11
|
+
// path is not exercised by this pack; the helper is retained for
|
|
12
|
+
// symmetry with the shelf's probe-utils shape.
|
|
13
|
+
|
|
14
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
15
|
+
import { dirname, resolve } from 'node:path';
|
|
16
|
+
import { fileURLToPath } from 'node:url';
|
|
17
|
+
|
|
18
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
19
|
+
export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
|
|
20
|
+
export const FIXTURE_DIR = resolve(
|
|
21
|
+
PROJECT_ROOT,
|
|
22
|
+
'packages/rcf-lite/test/fixtures/probe-pack-persistence-data-sqlite',
|
|
23
|
+
);
|
|
24
|
+
export const REPORT_DIR = resolve(
|
|
25
|
+
PROJECT_ROOT,
|
|
26
|
+
'.rcf/reports/blueprints/persistence-data-sqlite',
|
|
27
|
+
);
|
|
28
|
+
|
|
29
|
+
export const DECLARED_ENV = new Set([
|
|
30
|
+
'RCF_FIXTURE_SQLITE_PATH',
|
|
31
|
+
]);
|
|
32
|
+
|
|
33
|
+
export function aggregate(results) {
|
|
34
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
35
|
+
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
36
|
+
if (results.some((r) => r.verdict === 'warn')) return 'warn';
|
|
37
|
+
return 'pass';
|
|
38
|
+
}
|
|
39
|
+
export function isSkipped(results) { return Array.isArray(results) && results.length > 0 && results.every((r) => r.accountBoundSkipped === true); }
|
|
40
|
+
|
|
41
|
+
export async function writeReport({ probeName, engine, results, extra }) {
|
|
42
|
+
await mkdir(REPORT_DIR, { recursive: true });
|
|
43
|
+
const normalised = (Array.isArray(results) && results.length > 0)
|
|
44
|
+
? results
|
|
45
|
+
: [{ anchorAcId: null, harnessError: true, verdict: 'fail', detail: 'no checks ran', evidence: { reason: 'no checks ran', probeName, runAt: new Date().toISOString(), engine } }];
|
|
46
|
+
const raw = aggregate(normalised);
|
|
47
|
+
const aggregateVerdict = isSkipped(normalised) ? 'pass' : raw;
|
|
48
|
+
const report = {
|
|
49
|
+
slug: 'persistence-data-sqlite',
|
|
50
|
+
probeName,
|
|
51
|
+
runAt: new Date().toISOString(),
|
|
52
|
+
engine,
|
|
53
|
+
results: normalised,
|
|
54
|
+
aggregateVerdict,
|
|
55
|
+
...(extra ?? {}),
|
|
56
|
+
};
|
|
57
|
+
const path = resolve(REPORT_DIR, `${probeName}.json`);
|
|
58
|
+
await writeFile(path, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
59
|
+
return { report, path };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export async function runShim(probeName, engine, mainFn) {
|
|
63
|
+
try {
|
|
64
|
+
const outcome = (await mainFn()) ?? { results: [] };
|
|
65
|
+
const { results, extra } = outcome;
|
|
66
|
+
const { report, path } = await writeReport({ probeName, engine, results, extra });
|
|
67
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
68
|
+
process.stdout.write(`report written to ${path}\n`);
|
|
69
|
+
if (report.aggregateVerdict === 'fail') process.exitCode = 1;
|
|
70
|
+
} catch (err) {
|
|
71
|
+
const results = [{
|
|
72
|
+
anchorAcId: null, harnessError: true,
|
|
73
|
+
verdict: 'fail',
|
|
74
|
+
detail: `probe threw: ${err && err.message ? err.message : String(err)}`,
|
|
75
|
+
evidence: { thrown: true, message: err && err.message ? err.message : String(err), name: err && err.name ? err.name : 'Error', probeName, runAt: new Date().toISOString(), engine },
|
|
76
|
+
}];
|
|
77
|
+
const { report, path } = await writeReport({ probeName, engine, results });
|
|
78
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
79
|
+
process.stderr.write(`probe error: ${err && err.stack ? err.stack : String(err)}\n`);
|
|
80
|
+
process.stderr.write(`report written to ${path}\n`);
|
|
81
|
+
process.exitCode = 1;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
// WAL checkpoint probe for persistence-data-sqlite.
|
|
2
|
+
//
|
|
3
|
+
// The FIRST row (AC-5105-3 anchor) observes the complete durability
|
|
4
|
+
// posture the AC names: write-ahead log AND synchronous commit floor
|
|
5
|
+
// AND the absence of consumer configuration. Concretely the row
|
|
6
|
+
// asserts:
|
|
7
|
+
// - PRAGMA journal_mode returns 'wal' (facade-set at open)
|
|
8
|
+
// - PRAGMA synchronous returns >= NORMAL (facade-set at open)
|
|
9
|
+
// - a grep of consumer code (every probe file plus every fixture
|
|
10
|
+
// src file except the facade store.mjs itself) finds no direct
|
|
11
|
+
// PRAGMA journal_mode / PRAGMA synchronous statement.
|
|
12
|
+
// A seed put through the facade provides a real integer rowId as the
|
|
13
|
+
// row's resource identifier.
|
|
14
|
+
//
|
|
15
|
+
// The SECOND (wal_checkpoint TRUNCATE size transition) and THIRD
|
|
16
|
+
// (walCheckpoint event) rows observe checkpoint mechanics and a
|
|
17
|
+
// fixture-added event. Neither is one of the four defined lifecycle
|
|
18
|
+
// events on AC-5106-1 {opened, migrated, backupCheckpoint, closed}
|
|
19
|
+
// and neither observes crash recovery (AC-5105-1). Rows de-claimed
|
|
20
|
+
// (conformanceOnly, anchorAcId=null) with limitations naming the
|
|
21
|
+
// nearest shipped ACs.
|
|
22
|
+
import { mkdtemp, readFile, readdir, rm, stat } from 'node:fs/promises';
|
|
23
|
+
import { tmpdir } from 'node:os';
|
|
24
|
+
import { dirname, join } from 'node:path';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
import { openStore } from '../../../../packages/rcf-lite/test/fixtures/probe-pack-persistence-data-sqlite/src/store.mjs';
|
|
27
|
+
|
|
28
|
+
export const anchorAcId = 'AC-5105-3';
|
|
29
|
+
export const accountBound = false;
|
|
30
|
+
const AC_PREFIX = "The store's durability posture (write-ahead log";
|
|
31
|
+
|
|
32
|
+
const LIM_5105_1 = `AC-5105-1: requires a write committed before SIGKILL to be present when a fresh process reopens the same store. Observing wal_checkpoint TRUNCATE size mechanics is engine housekeeping, not a crash-recovery observation.`;
|
|
33
|
+
const LIM_5106_1 = `AC-5106-1: defines the four lifecycle events (opened, migrated, backupCheckpoint, closed). The fixture-extended 'walCheckpoint' event is a fixture-added observation, not one of the four defined events.`;
|
|
34
|
+
|
|
35
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
36
|
+
const PROBES_DIR = HERE;
|
|
37
|
+
const FIXTURE_SRC_DIR = join(HERE, '..', '..', '..', '..', 'packages', 'rcf-lite', 'test', 'fixtures', 'probe-pack-persistence-data-sqlite', 'src');
|
|
38
|
+
const FACADE_BASENAME = 'store.mjs';
|
|
39
|
+
const PRAGMA_RE = /['"\`]PRAGMA\s+(journal_mode|synchronous)\b/i;
|
|
40
|
+
|
|
41
|
+
async function safeSize(p) { try { return Number((await stat(p)).size); } catch { return null; } }
|
|
42
|
+
|
|
43
|
+
async function listMjs(dir) {
|
|
44
|
+
const out = [];
|
|
45
|
+
async function walk(d) {
|
|
46
|
+
let entries = [];
|
|
47
|
+
try { entries = await readdir(d, { withFileTypes: true }); } catch { return; }
|
|
48
|
+
for (const e of entries) {
|
|
49
|
+
const p = join(d, e.name);
|
|
50
|
+
if (e.isDirectory()) await walk(p);
|
|
51
|
+
else if (e.isFile() && p.endsWith('.mjs')) out.push(p);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
await walk(dir);
|
|
55
|
+
return out;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// Consumer grep: every probe file + every fixture src file except the
|
|
59
|
+
// facade store.mjs. A hit is a direct PRAGMA journal_mode / synchronous
|
|
60
|
+
// statement outside the facade - which AC-5105-3 forbids.
|
|
61
|
+
async function greppConsumerFilesForPragmaLeaks() {
|
|
62
|
+
const probeFiles = (await listMjs(PROBES_DIR)).filter((p) => !p.endsWith('probe-utils.mjs'));
|
|
63
|
+
const fixtureFilesAll = await listMjs(FIXTURE_SRC_DIR);
|
|
64
|
+
const fixtureFiles = fixtureFilesAll.filter((p) => !p.endsWith('/' + FACADE_BASENAME));
|
|
65
|
+
const consumerFiles = [...probeFiles, ...fixtureFiles];
|
|
66
|
+
const offenders = [];
|
|
67
|
+
for (const p of consumerFiles) {
|
|
68
|
+
let text = '';
|
|
69
|
+
try { text = await readFile(p, 'utf8'); } catch { continue; }
|
|
70
|
+
if (PRAGMA_RE.test(text)) offenders.push(p);
|
|
71
|
+
}
|
|
72
|
+
return { consumerFilesScanned: consumerFiles.map((p) => p.slice(p.indexOf('/rcf-lite') === -1 ? 0 : p.indexOf('/rcf-lite'))), consumerFilesWithPragma: offenders };
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
export default async function runProbe() {
|
|
76
|
+
const dir = await mkdtemp(join(tmpdir(), 'rcf-sqlite-wal-'));
|
|
77
|
+
const path = process.env.RCF_FIXTURE_SQLITE_PATH || join(dir, 'store.sqlite');
|
|
78
|
+
const events = [];
|
|
79
|
+
const results = [];
|
|
80
|
+
let checkpoint, mode, walBefore, walAfter, syncLevel, grep, seedRowId;
|
|
81
|
+
try {
|
|
82
|
+
const store = openStore({ path, eventSink: (r) => events.push(r) });
|
|
83
|
+
mode = store.journalModeNow();
|
|
84
|
+
syncLevel = store.synchronousNow();
|
|
85
|
+
grep = await greppConsumerFilesForPragmaLeaks();
|
|
86
|
+
// Seed put through the facade so the row carries a real integer
|
|
87
|
+
// rowId as its resource identifier.
|
|
88
|
+
const seed = store.put('probe-durability-posture', String(Date.now()));
|
|
89
|
+
seedRowId = seed.rowId;
|
|
90
|
+
const modeOk = mode === 'wal';
|
|
91
|
+
// NORMAL = 1, FULL = 2, EXTRA = 3. The AC names a floor, not a
|
|
92
|
+
// specific level; require >= NORMAL.
|
|
93
|
+
const syncOk = Number.isInteger(syncLevel) && syncLevel >= 1;
|
|
94
|
+
const noConsumerPragma = Array.isArray(grep.consumerFilesWithPragma) && grep.consumerFilesWithPragma.length === 0;
|
|
95
|
+
results.push({
|
|
96
|
+
anchorAcId: 'AC-5105-3',
|
|
97
|
+
verdict: modeOk && syncOk && noConsumerPragma && Number.isInteger(seedRowId) && seedRowId > 0 ? 'pass' : 'fail',
|
|
98
|
+
detail: `${AC_PREFIX} and synchronous commit floor) - observed the facade's PRAGMA journal_mode='${mode}' AND PRAGMA synchronous=${syncLevel} (>=1 required); consumer-source grep across ${grep.consumerFilesScanned.length} .mjs files finds ${grep.consumerFilesWithPragma.length} direct PRAGMA journal_mode/synchronous statements outside the facade store.mjs. Seed put returned rowId=${seedRowId} through the facade.`,
|
|
99
|
+
evidence: {
|
|
100
|
+
rowId: seedRowId,
|
|
101
|
+
pragmaJournalMode: mode,
|
|
102
|
+
pragmaSynchronous: `level=${syncLevel}`,
|
|
103
|
+
consumerFilesScannedCount: grep.consumerFilesScanned.length,
|
|
104
|
+
consumerFilesWithPragma: grep.consumerFilesWithPragma,
|
|
105
|
+
consumerConfiguresPragmas: !noConsumerPragma,
|
|
106
|
+
bodyExcerpt: `journal_mode=${mode} synchronous=${syncLevel} consumerPragmaHits=${grep.consumerFilesWithPragma.length} seedRowId=${seedRowId}`,
|
|
107
|
+
},
|
|
108
|
+
});
|
|
109
|
+
for (let i = 0; i < 200; i++) store.put(`k/${i}`, `v-${i}-${Date.now()}`);
|
|
110
|
+
walBefore = await safeSize(walPath(path));
|
|
111
|
+
checkpoint = store.walCheckpoint('TRUNCATE');
|
|
112
|
+
walAfter = await safeSize(walPath(path));
|
|
113
|
+
results.push({
|
|
114
|
+
anchorAcId: null,
|
|
115
|
+
conformanceOnly: true,
|
|
116
|
+
limitation: LIM_5105_1,
|
|
117
|
+
verdict: checkpoint.busy === 0 && Number.isInteger(checkpoint.pagesLog) && Number.isInteger(checkpoint.pagesCheckpointed) && typeof walBefore === 'number' && walBefore > 0 && walAfter === 0 ? 'pass' : 'fail',
|
|
118
|
+
detail: `observed wal_checkpoint(TRUNCATE) busy=${checkpoint.busy} pagesLog=${checkpoint.pagesLog} pagesCheckpointed=${checkpoint.pagesCheckpointed}; walSizeBytes before=${walBefore} after=${walAfter}.`,
|
|
119
|
+
evidence: { checkpoint, walSizeBefore: walBefore, walSizeAfter: walAfter, bodyExcerpt: `walSize ${walBefore} -> ${walAfter}` },
|
|
120
|
+
});
|
|
121
|
+
const ev = events.find((e) => e.event === 'walCheckpoint');
|
|
122
|
+
results.push({
|
|
123
|
+
anchorAcId: null,
|
|
124
|
+
conformanceOnly: true,
|
|
125
|
+
limitation: LIM_5106_1,
|
|
126
|
+
verdict: ev && ev.mode === 'TRUNCATE' ? 'pass' : 'fail',
|
|
127
|
+
detail: `observed the fixture-added walCheckpoint event mode=${ev?.mode} timestamp=${ev?.timestamp} on the eventSink after the TRUNCATE checkpoint (not one of the four defined events on AC-5106-1).`,
|
|
128
|
+
evidence: { event: ev ? { event: ev.event, mode: ev.mode, timestamp: ev.timestamp } : null, bodyExcerpt: `event=${ev?.event}` },
|
|
129
|
+
});
|
|
130
|
+
store.close();
|
|
131
|
+
} finally {
|
|
132
|
+
await rm(dir, { recursive: true, force: true });
|
|
133
|
+
}
|
|
134
|
+
return { results, extra: { envDeclared: ['RCF_FIXTURE_SQLITE_PATH'], writtenRows: 200, journalMode: mode, synchronousLevel: syncLevel, seedRowId, checkpoint, walSize: { before: walBefore, after: walAfter }, consumerGrep: grep } };
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
function walPath(base) { return base + '-wal'; }
|
|
@@ -17,7 +17,7 @@ Rules for new topics (inherited from the application-spa and REST vocabularies,
|
|
|
17
17
|
|
|
18
18
|
## Id number bands (registry bootstrap)
|
|
19
19
|
|
|
20
|
-
AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is
|
|
20
|
+
AC ids (and therefore US numeric ids, which anchor them) are NOT namespaced by the 0.4.4 schema grammar; the band allocation IS the AC-collision enforcement mechanism. Composing blueprints take a fresh band rather than proposing namespaced AC ids. Band allocation is policy; this table is the shared registry-bootstrap replicated across every shipped and forthcoming blueprint's `docs/topics.md` until a mechanism-side central registry lands (v1.1 candidate).
|
|
21
21
|
|
|
22
22
|
This table is maintained shelf-wide across every blueprint's `docs/topics.md`. Rows are recorded at ship, never predicted.
|
|
23
23
|
|
|
@@ -62,8 +62,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
62
62
|
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
63
63
|
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
64
64
|
|
|
65
|
-
US 5101-5111 sit at the LOW end of the 5101-5899 band on purpose. A project-side story that mechanically derives from `persistence-data-sqlite-REQ-011` into the number `5111` would collide against persistence-data-sqlite-US-5111 in this package; the band leaves headroom at the HIGH end (US 5181-5899) so a project's own stories anchored to persistence-data-sqlite REQs can allocate without conflict.
|
|
66
|
-
|
|
65
|
+
US 5101-5111 sit at the LOW end of the 5101-5899 band on purpose. A project-side story that mechanically derives from `persistence-data-sqlite-REQ-011` into the number `5111` would collide against persistence-data-sqlite-US-5111 in this package; the band leaves headroom at the HIGH end (US 5181-5899) so a project's own stories anchored to persistence-data-sqlite REQs can allocate without conflict.
|
|
67
66
|
## Shared expectations for future composing blueprints
|
|
68
67
|
|
|
69
68
|
- Reuse `persistenceStore` exactly as spelled here when your blueprint holds an opinion on the project's primary durable store engine; contribute your own scope:global ADR on that string and let composition surface the pairing. A Postgres-first blueprint (see the persistence guide 'when it does not fit') will conflict here by design.
|
|
@@ -30,15 +30,15 @@ Capability token named in the requirements layer; owner reference for the schedu
|
|
|
30
30
|
- Close chain-contradiction specimen F-1: `AC-32101-1` and the fixture `src/scheduled.mjs` now emit `cronReady` with the cron-vocabulary metadata payload `{event, expression, scheduledTime, outcome, duration}` per TAC-3303's allow-list. The previous KV-shaped payload `{event, key, size, ttl, timestamp}` on the boot ready-check is retired; `TS-090` on the anatomy test asserts the new shape.
|
|
31
31
|
- `AC-32102-1` reworded to describe the injected `sink` parameter (no longer restates the literal owned by TAC-3303's interface); no behavioural change in the shipped code path.
|
|
32
32
|
|
|
33
|
-
### Added
|
|
33
|
+
### Added
|
|
34
34
|
|
|
35
|
-
- Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 26 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6
|
|
35
|
+
- Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 26 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6: US-32101 gains four failure-path ACs (empty routes, invalid sink, repeat-boot idempotency, sole-reader source-tree scan); US-32102 gains four ACs (single-handler mode, malformed event, duplicate expressions, empty routes at construction); US-32103 gains three ACs (exact-boundary at skewToleranceMs, one millisecond past, early-fire negative delta); US-32104 gains four ACs (handler-throw pre-budget, handler-throw post-budget, exact-boundary at softBudgetMs, single-cronStalled idempotency); US-32105 gains four ACs (CI gate on bind/fire failures, bounded-wait timeout, mid-run crash, teardown discipline); US-32106 gains four ACs (allow-list forbidden-key mutation, empty-payload boundary, expression-literal-is-not-PII exclusion, no fixture-state carry between cases); US-32107 gains three ACs (bounded-wait timeout, partial env-var configuration, non-2xx API response). Every new AC carries `disposition`, most carry `ownerRef` into the owning TAC, and vendor-fact ACs carry `vendorCitation` (scheduled handler, cron triggers, wrangler CLI, workers platform limits).
|
|
36
36
|
- `rcf define blueprint lint-consistency` still reports zero pass-1 and pass-2 findings. Blueprint stays at v1.1.0 on the same unreleased minor.
|
|
37
37
|
|
|
38
|
-
### Fixed
|
|
38
|
+
### Fixed
|
|
39
39
|
|
|
40
|
-
- `AC-32105-1` reworded so the warn branch stays a describable probe outcome but no longer states the CI gate behaviour; `AC-32105-2` alone owns the harness gate on non-pass verdicts, resolving the two-AC single-definition-ownership contradiction on US-32105
|
|
41
|
-
- Enum-branch dispositions on the `cron-dispatcher-mode` elicit set correctly: `AC-32102-1` and `AC-32102-2` (expression-routed branch) and `AC-32102-3` (single-handler branch) flip from `fixed` to `template`; the applying project chooses the mode. Factory-invariant refusal ACs (`AC-32102-4/5/6`) stay `fixed
|
|
40
|
+
- `AC-32105-1` reworded so the warn branch stays a describable probe outcome but no longer states the CI gate behaviour; `AC-32105-2` alone owns the harness gate on non-pass verdicts, resolving the two-AC single-definition-ownership contradiction on US-32105.
|
|
41
|
+
- Enum-branch dispositions on the `cron-dispatcher-mode` elicit set correctly: `AC-32102-1` and `AC-32102-2` (expression-routed branch) and `AC-32102-3` (single-handler branch) flip from `fixed` to `template`; the applying project chooses the mode. Factory-invariant refusal ACs (`AC-32102-4/5/6`) stay `fixed`.
|
|
42
42
|
|
|
43
43
|
## 1.0.0 (2026-09-07)
|
|
44
44
|
|
|
@@ -27,9 +27,8 @@ logging companion can render without ever writing a body byte.
|
|
|
27
27
|
`deltaMs`). Two-layer secrecy assertion in the event-secrecy
|
|
28
28
|
probe.
|
|
29
29
|
- A decision-tree cross-reference in the guide to `jobs-background`
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
need durable, retried, workflow-shaped scheduled work.
|
|
30
|
+
and to the Workflows adapter for cases that need durable, retried,
|
|
31
|
+
workflow-shaped scheduled work.
|
|
33
32
|
|
|
34
33
|
## The four REQs
|
|
35
34
|
|
|
@@ -59,7 +59,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
59
59
|
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
60
60
|
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
61
61
|
|
|
62
|
-
US 32101-32107 sit at the LOW end of the 32101-32899 band on purpose
|
|
62
|
+
US 32101-32107 sit at the LOW end of the 32101-32899 band on purpose. A project-side story mechanically derived from a platform-cloudflare-cron-triggers REQ id into the number 32110 would collide against a shipped US-32110; band headroom (32108-32899) leaves that space.
|
|
63
63
|
|
|
64
64
|
ADR/TAC suffixes for this blueprint use the 3301-3399 block, continuing the shelf pattern.
|
|
65
65
|
|
|
@@ -30,22 +30,18 @@ Owner reference for the DO event-record whitelist.
|
|
|
30
30
|
- Guide casing correction: `SINGLE-CELL` -> `single-cell` (contract-drift against TAC-3402.purpose per pass-1 lint).
|
|
31
31
|
- `rcf define blueprint lint-consistency` reports zero pass-1 and pass-2 findings.
|
|
32
32
|
|
|
33
|
-
### Added
|
|
33
|
+
### Added
|
|
34
34
|
|
|
35
|
-
- Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 50 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6
|
|
36
|
-
- `rcf define blueprint lint-consistency` still reports zero pass-1 and pass-2 findings. Blueprint stays at v1.1.0 on the same unreleased minor.
|
|
35
|
+
- Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 50 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6: US-33101 gains five failure-path ACs (env.CELL unbound closing the namespace gap, env.HUB unbound, invalid sink, repeat-boot idempotency, sole-reader boundary); US-33102 gains four ACs (N=10 concurrent, mixed +1/-1 deltas, zero-delta, single-caller identity); US-33103 gains five ACs (SQL query surface exists, KV batch refuses KV, driver write failure with kind DO_STORAGE_WRITE_FAILED closing the write gap, empty/populated list boundaries, 128 KiB vendor-cited value cap with vendor URL); US-33104 gains four ACs (setAlarm(-1) refuses closing the alarm gap, re-schedule overwrites, handler-throw isolates with DO_ALARM_HANDLER_FAILED, deleteAlarm before fire); US-33105 gains five ACs (malformed message closing the hub gap, empty-hub persistence, slow-socket isolation, N=10 concurrent broadcasts, unknown message type); US-33106 gains three ACs (allow-list mutation, no fixture-state carry between cases, empty-payload boundary); US-33107 gains three ACs (comment-only mention, nested-directory recursion, extension filter); US-33108 gains four ACs (rename-as-new-migration-tag, silent-rename refuses, missing migrations block, stale new_classes keyword vendor-cited); US-33109 gains three ACs (read has no witness, reset has no witness, N=100 concurrent); US-33110 gains four ACs (cold-start reconstruction, wake-on-message closing the second gap half, hibernate-before-broadcast, repeated cycles idempotency); US-33111 gains three ACs (SQL query verbs SQL, KV refusal kind, unknown backend refuses); US-33112 gains three ACs (bounded-wait timeout, partial env-vars, non-2xx API response); US-33113 gains four ACs (wrangler-not-installed warn, bind-timeout warn, workerd-handler-throws fail, teardown discipline). Every new AC carries `disposition`, most carry `ownerRef` into the owning TAC, and vendor-fact ACs carry `vendorCitation` (migrations page, DO overview, DO limits, DO alarms, DO websockets).
|
|
37
36
|
|
|
38
|
-
### Fixed
|
|
37
|
+
### Fixed
|
|
39
38
|
|
|
40
|
-
- `AC-33108-1` gains `vendorCitation` to the Cloudflare Durable Objects migrations page
|
|
41
|
-
- `AC-33108-5`
|
|
42
|
-
- Probe `wrangler-seam.mjs` comment reworded to align with the cited page (drops the internal cutover date and HTTP code claims); ADR-3402 context de-personified ("WSD lane" removed) (review F-3, F-5).
|
|
43
|
-
- Register sweep: every guide, README, ADR, blueprint.json, US, AC, TAC and probe comment surface on the blueprint has internal operator names, host names, work-item and dispatch ids, and train labels neutralised to concept ("a follow-up", "the throwaway prefix", "the shipped default"). CHANGELOG entries keep internal provenance (review F-3).
|
|
39
|
+
- `AC-33108-1` gains `vendorCitation` to the Cloudflare Durable Objects migrations page so the vendor-fact leader carries a citation alongside `AC-33108-2..4`.
|
|
40
|
+
- `AC-33108-5` states what the cited vendor page carries: key-value backed namespaces can no longer be created; only `new_sqlite_classes` mints a fresh namespace.
|
|
44
41
|
|
|
45
42
|
## 1.0.1 (2026-09-08)
|
|
46
43
|
|
|
47
|
-
|
|
48
|
-
|
|
44
|
+
Probe-integrity patch (`h2-cf-platform-probe-integrity`). No capability change.
|
|
49
45
|
### Changed
|
|
50
46
|
|
|
51
47
|
- Replaced the credential-readiness pass-stub in `real-account-storage-smoke.mjs` with a real HTTP PUT-then-GET storage round-trip driver against a deployed Worker route (`/cell/:id/storage/:key`) that opens the DO facade, writes a fixture key, reads it back, and asserts byte equality. Activated when `CI_HAS_CLOUDFLARE_ACCOUNT` is set with `CF_DO_WORKER_URL`, `CF_ACCOUNT_ID`, `CF_DO_NAMESPACE_ID` and `CF_API_TOKEN`. Locally proven against `wrangler dev --local` (64-byte round-trip byte-equal). A pass is no longer reachable from credential presence alone.
|
|
@@ -60,7 +60,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
60
60
|
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
61
61
|
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
62
62
|
|
|
63
|
-
US 33101-33112 sit at the LOW end of the 33101-33899 band on purpose
|
|
63
|
+
US 33101-33112 sit at the LOW end of the 33101-33899 band on purpose. A project-side story mechanically derived from a platform-cloudflare-durable-objects REQ id into the number 33113 would collide against a shipped US-33113; band headroom (33113-33899) leaves that space.
|
|
64
64
|
|
|
65
65
|
ADR/TAC suffixes for this blueprint use the 3401-3499 block, continuing the shelf pattern.
|
|
66
66
|
|
|
@@ -2,6 +2,13 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to `platform-cloudflare-kv` are recorded here. The shape follows Keep a Changelog and Semantic Versioning per the blueprint authoring standard.
|
|
4
4
|
|
|
5
|
+
## 1.1.4 - 2026-09-12
|
|
6
|
+
|
|
7
|
+
Event-secrecy anatomy runs the mutation-switch case in-process so the shipped report record stays untouched.
|
|
8
|
+
|
|
9
|
+
- Anatomy: `test/blueprint/platform-cloudflare-kv-anatomy.test.js` toggles `SIMULATE_PII_LEAK` inside the test process and invokes the `event-secrecy` probe module a second time, then validates the returned result set against fail and forbiddenKeys in memory. The prior child-process spawn of `contributions/probes/run-event-secrecy.mjs` is removed; the probe body and the fixture-side shim are unchanged.
|
|
10
|
+
- Reports: the tracked `event-secrecy` record under `.rcf/reports/blueprints/platform-cloudflare-kv/` is now byte-identical after a full `pnpm test` run and is regenerated only through a deliberate shim invocation.
|
|
11
|
+
|
|
5
12
|
## 1.1.3 - 2026-09-10
|
|
6
13
|
|
|
7
14
|
Positive-evidence rule alignment on the probe pack skip path (authoring standard section 7d), plus a register and citation patch.
|
|
@@ -34,19 +41,17 @@ Owner reference for the KV event-record whitelist.
|
|
|
34
41
|
- `platform-cloudflare-kv-REQ-005` reworded to separate the applied cache-aside TTL (LOCAL expiry) from the KV eventual-consistency propagation window (vendor-owned, up to 60 seconds or more per the Cloudflare KV documentation). The v1.0.x wording that called the elicited TTL a "global staleness ceiling" is retired; the guide surfaces the two clocks separately and cross-references `platform-cloudflare-durable-objects` as the strong-consistency answer (F-3).
|
|
35
42
|
- Every existing REQ carries a `deliveredBy` link into a TAC or ADR (five links). Every existing AC carries `disposition`. `rcf define blueprint lint-consistency` reports zero pass-1 and pass-2 findings.
|
|
36
43
|
|
|
37
|
-
### Added
|
|
44
|
+
### Added
|
|
38
45
|
|
|
39
|
-
- Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 36 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6
|
|
40
|
-
- `rcf define blueprint lint-consistency` still reports zero pass-1 and pass-2 findings. Blueprint stays at v1.1.0 on the same unreleased minor.
|
|
46
|
+
- Every story on this blueprint now reaches the section 7a AC-set-sufficiency floor. 36 new hand-authored ACs cover the documented failure paths named in the guide and TAC records, per-story range 4-6: US-31101 gains four failure-path ACs (binding-unbound closing the write gap, invalid sink, repeat-boot idempotency, ready-check rejects with KV_FACADE_NOT_READY); US-31102 gains three ACs (non-facade leak, comment-only mention, nested-directory recursion); US-31103 gains four ACs (getWithMetadata, per-call TTL propagation, write-failed with KV_WRITE_FAILED, read-failed with KV_READ_FAILED); US-31104 gains four ACs (cursor pagination, empty prefix, no-match, list_complete indicator); US-31105 gains four ACs (TTL floor clamping, origin-throws, concurrent-miss single-flight, source classification); US-31106 gains three ACs (per-call TTL override, per-call TTL below floor clamps, TTL boundary strict less-than); US-31107 gains three ACs (additional-field mutation, causal ordering, closed vocabulary); US-31108 gains three ACs (metadata-blob never a body, substring scan across all kinds, layer separation); US-31109 gains three ACs (vendor propagation window in guide, DO as strong-consistency alternative in guide, no cross-region claim on any AC); US-31110 gains three ACs (unknown mode refuses, empty prefix behaves as flat, nested prefix); US-31111 gains two ACs (strict FIFO drain of 10 pre-ready calls, post-ready no-queue path). Every new AC carries `disposition`, most carry `ownerRef` into the owning TAC, and vendor-fact ACs carry `vendorCitation` (KV overview, KV API, KV how-KV-works, KV limits).
|
|
41
47
|
|
|
42
|
-
### Fixed
|
|
48
|
+
### Fixed
|
|
43
49
|
|
|
44
|
-
- `AC-31109-1` disposition flipped from `fixed` to `template`: the applying project sets the cache-aside TTL, so an AC that binds the local-expiry window to `elicitedTtlMs` is an elicit-branch AC per section 7b
|
|
45
|
-
- Register sweep: README, ADR and probe comments have internal operator names, host names, work-item ids, internal train labels and "operator ruling" references neutralised to concept ("throwaway prefix", "probe-integrity pass", "operator ruling"); code literals bound to real Cloudflare API state ("h2-cf-probe-integrity-scratch-kv-" and similar) are unchanged. CHANGELOG entries keep internal provenance (review F-3).
|
|
50
|
+
- `AC-31109-1` disposition flipped from `fixed` to `template`: the applying project sets the cache-aside TTL, so an AC that binds the local-expiry window to `elicitedTtlMs` is an elicit-branch AC per section 7b.
|
|
46
51
|
|
|
47
52
|
## 1.0.2 (2026-09-08)
|
|
48
53
|
|
|
49
|
-
|
|
54
|
+
The real-account KV probe self-provisions its own throwaway namespace, so a pre-declared namespace id is no longer required at the real-account gate. No shipped-code capability change.
|
|
50
55
|
|
|
51
56
|
### Changed
|
|
52
57
|
|
|
@@ -65,15 +70,14 @@ The local proof harness under `packages/rcf-lite/test/fixtures/cf-platform/test/
|
|
|
65
70
|
|
|
66
71
|
## 1.0.1 (2026-09-08)
|
|
67
72
|
|
|
68
|
-
|
|
69
|
-
|
|
73
|
+
Probe-integrity patch (`h2-cf-platform-probe-integrity`) across the four Cloudflare-platform blueprints. No capability change.
|
|
70
74
|
### Changed
|
|
71
75
|
|
|
72
|
-
- Re-anchored all five KV probes and the README from the defunct `AC-5xxx` id space to the shipped `AC-31xxx` band (nine shipped ACs: `AC-31101-1`, `AC-31102-1`, `AC-31103-1`, `AC-31103-2`, `AC-31104-1`, `AC-31105-1`, `AC-31106-1`, `AC-31107-1`, `AC-31108-1`). Every one of the nine now has a runtime observable through a re-anchored probe. Anatomy-test assertions in `packages/rcf-lite/test/blueprint/platform-cloudflare-kv-anatomy.test.js` moved with the re-anchor.
|
|
76
|
+
- Re-anchored all five KV probes and the README from the defunct `AC-5xxx` id space to the shipped `AC-31xxx` band (nine shipped ACs: `AC-31101-1`, `AC-31102-1`, `AC-31103-1`, `AC-31103-2`, `AC-31104-1`, `AC-31105-1`, `AC-31106-1`, `AC-31107-1`, `AC-31108-1`). Every one of the nine now has a runtime observable through a re-anchored probe. Anatomy-test assertions in `packages/rcf-lite/test/blueprint/platform-cloudflare-kv-anatomy.test.js` moved with the re-anchor.
|
|
73
77
|
- Moved the `SIMULATE_CACHE_MISS` mutation switch out of `cache-aside-hit-then-miss.mjs` into fixture shim `packages/rcf-lite/test/fixtures/cf-platform/h2-cf-kv-cache-aside-shim.mjs`; the probe body holds zero `SIMULATE_` token references (`AC-15401-1` mutation-purity rule).
|
|
74
78
|
- Moved the `SIMULATE_PII_LEAK` mutation switch out of `event-secrecy.mjs` into fixture shim `packages/rcf-lite/test/fixtures/cf-platform/h2-cf-kv-event-secrecy-shim.mjs`; the probe body holds zero `SIMULATE_` token references.
|
|
75
79
|
- Reworded the "fake clock" comment on `cache-aside-hit-then-miss.mjs` header to name the local test double honestly ("elicited deterministic clock the fixture advances").
|
|
76
|
-
-
|
|
80
|
+
- The `Known limitations` (CHANGELOG) and `Known mechanism-reach gaps` (README) entries name the loader `elicits[]` `when` block behaviour: only `requiresCapability` arrays are currently supported, so an `elicitedNonEmpty` predicate is not available and the elicit fires unconditionally. Supporting the predicate requires a loader-side capability extension.
|
|
77
81
|
|
|
78
82
|
### Fixed
|
|
79
83
|
|
|
@@ -99,4 +103,4 @@ hardening pass (`h2-cf-platform-probe-integrity`): probe-integrity patch across
|
|
|
99
103
|
|
|
100
104
|
- The `real-account-eventual-consistency-smoke` probe records `accountBoundSkipped: true` and aggregates to `pass` when `CI_HAS_CLOUDFLARE_ACCOUNT` is unset (spec section 3.5 pass-with-skip). Full mechanism reach requires a CI environment with the paired `CF_ACCOUNT_ID`, `CF_KV_NAMESPACE_ID` and `CF_API_TOKEN` env vars.
|
|
101
105
|
- The four local probes drive an in-memory KV driver whose shape matches the Workers KV binding at the facade boundary. Vendor surface changes beyond that boundary (a new list cursor format, a header-only limit) are not caught by the local probes; the real-account smoke is the mechanism-reach closure for that gap.
|
|
102
|
-
- The loader's supported `when` block on `elicits[]` currently accepts only `requiresCapability` arrays
|
|
106
|
+
- The loader's supported `when` block on `elicits[]` currently accepts only `requiresCapability` arrays. An `elicitedNonEmpty` predicate for gating `kv-metadata-field-pattern` on `kv-binding-name` is not supported by the loader today, so the elicit fires unconditionally; the guide teaches the intended pattern.
|