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
package/blueprints/application-error-handling/contributions/probes/two-boundaries-registered.mjs
ADDED
|
@@ -0,0 +1,343 @@
|
|
|
1
|
+
// two-boundaries-registered probe for application-error-handling v1.0.12.
|
|
2
|
+
//
|
|
3
|
+
// Row 1 (AC-16102-2): the framework-level boundary catches a thrown
|
|
4
|
+
// handler exception whose induced stack carries system-path and file-URI
|
|
5
|
+
// substrings, and the wire response body carries none of them.
|
|
6
|
+
// This observation targets the specific scrub AC.
|
|
7
|
+
// Row 2 (AC-16102-1): the framework-level boundary produces a
|
|
8
|
+
// mapped wire response body (five envelope fields, no stack marker),
|
|
9
|
+
// separate from the scrub-substring observation on row 1.
|
|
10
|
+
// Row 3 (AC-16101-1): the process-level boundary catches a REAL
|
|
11
|
+
// uncaught exception on the runtime, emits ONE JSON line at
|
|
12
|
+
// level=error with the record on it (category unknown, stack on
|
|
13
|
+
// cause) and exits the process with OS code 1. Observed by
|
|
14
|
+
// spawning the fixture as a child, hitting /crash-real, and
|
|
15
|
+
// reading the child's stderr and OS exit code from the exit event.
|
|
16
|
+
// Row 4 (AC-16102-4, streaming-close): the fixture flushes headers,
|
|
17
|
+
// writes a partial body and tears the socket down after the write
|
|
18
|
+
// drains, so a Node client observes a premature-close error and no
|
|
19
|
+
// wire bytes past the partial body. The probe drives that endpoint,
|
|
20
|
+
// records the client's premature-close, and observes the exact-one
|
|
21
|
+
// mid-stream companion emission at level=error whose message names
|
|
22
|
+
// the streaming-in-progress condition with category='unknown'. AC
|
|
23
|
+
// AC-16102-4's shipped description names only the connection-close,
|
|
24
|
+
// the exact companion emission, the level, message and category;
|
|
25
|
+
// every clause is server-observable here so the row is a full
|
|
26
|
+
// counting row with anchorAcId, not conformanceOnly.
|
|
27
|
+
// Row 5 (REQ-004): the framework AND process boundaries both emit
|
|
28
|
+
// through the injected logging companion factory. Observed on the
|
|
29
|
+
// SAME spawned child: the child first hits /throw-handler
|
|
30
|
+
// (framework path, emits through the companion); the uncaught path
|
|
31
|
+
// then emits through the SAME companion inside the uncaughtException
|
|
32
|
+
// handler before writing the level=error line, and dumps the
|
|
33
|
+
// companion's invocations array to stderr as a level=info line
|
|
34
|
+
// immediately before process.exit(1). The probe reads both lines
|
|
35
|
+
// from the child's stderr.
|
|
36
|
+
//
|
|
37
|
+
// anchorAcId: per-row.
|
|
38
|
+
|
|
39
|
+
import { spawn } from 'node:child_process';
|
|
40
|
+
import { resolve, dirname } from 'node:path';
|
|
41
|
+
import { fileURLToPath } from 'node:url';
|
|
42
|
+
import { startFixture, evidenceFromResponse, conformanceOnlyResult, notObservableHereResult } from './probe-utils.mjs';
|
|
43
|
+
|
|
44
|
+
export const anchorReqId = 'application-error-handling-REQ-001';
|
|
45
|
+
export const accountBound = false;
|
|
46
|
+
|
|
47
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
48
|
+
const FIXTURE_SERVER = resolve(HERE, '..', '..', '..', '..', 'packages/rcf-lite/test/fixtures/probe-pack-application-error-handling/server.js');
|
|
49
|
+
|
|
50
|
+
export default async function runProbe() {
|
|
51
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-error-handling/server.js');
|
|
52
|
+
// Framework-boundary observations use an in-process fixture with no crash arm.
|
|
53
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
54
|
+
const results = [];
|
|
55
|
+
try {
|
|
56
|
+
// Row 1: AC-16102-2 stack/path/file:// scrub.
|
|
57
|
+
const fw = await fetch(`${fixture.baseUrl}/throw-handler`);
|
|
58
|
+
const fwBody = await fw.text();
|
|
59
|
+
const fwParsed = JSON.parse(fwBody);
|
|
60
|
+
const noStack = !/at\s+.*:\d+:\d+/.test(fwBody);
|
|
61
|
+
const noUsersPath = !/\/Users\//.test(fwBody);
|
|
62
|
+
const noHomePath = !/\/home\//.test(fwBody);
|
|
63
|
+
const noFileUrl = !/file:\/\//.test(fwBody);
|
|
64
|
+
const scrubOk = fw.status === 500 && noStack && noUsersPath && noHomePath && noFileUrl;
|
|
65
|
+
results.push({
|
|
66
|
+
anchorAcId: 'application-error-handling-AC-16102-2',
|
|
67
|
+
verdict: scrubOk ? 'pass' : 'fail',
|
|
68
|
+
detail: `Given a handler that throws a JavaScript Error - the wire response for /throw-handler carried noStack=${noStack} noUsersPath=${noUsersPath} noHomePath=${noHomePath} noFileUrl=${noFileUrl} at status ${fw.status}`,
|
|
69
|
+
evidence: evidenceFromResponse({
|
|
70
|
+
route: '/throw-handler',
|
|
71
|
+
response: fw,
|
|
72
|
+
bodyText: fwBody,
|
|
73
|
+
extraFields: {
|
|
74
|
+
input: { thrownStackContainsInducedSubstrings: true },
|
|
75
|
+
derived: { noStack, noUsersPath, noHomePath, noFileUrl, mappedCode: fwParsed.error?.code ?? null },
|
|
76
|
+
},
|
|
77
|
+
}),
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
// Row 2: AC-16102-1 handler-throws-produces-mapped-response.
|
|
81
|
+
const mappedShape = fwParsed.error
|
|
82
|
+
&& typeof fwParsed.error.code === 'string'
|
|
83
|
+
&& typeof fwParsed.error.category === 'string'
|
|
84
|
+
&& typeof fwParsed.error.correlationId === 'string';
|
|
85
|
+
const mappedOk = fw.status === 500 && mappedShape;
|
|
86
|
+
results.push({
|
|
87
|
+
anchorAcId: 'application-error-handling-AC-16102-1',
|
|
88
|
+
verdict: mappedOk ? 'pass' : 'fail',
|
|
89
|
+
detail: `A handler that throws produces a wire response - /throw-handler returned status ${fw.status} with mapped envelope (code, category, correlationId all strings): ${mappedShape}`,
|
|
90
|
+
evidence: evidenceFromResponse({
|
|
91
|
+
route: '/throw-handler',
|
|
92
|
+
response: fw,
|
|
93
|
+
bodyText: fwBody,
|
|
94
|
+
extraFields: {
|
|
95
|
+
input: { path: '/throw-handler' },
|
|
96
|
+
derived: { mappedShape, code: fwParsed.error?.code, category: fwParsed.error?.category, correlationId: fwParsed.error?.correlationId },
|
|
97
|
+
},
|
|
98
|
+
}),
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
// Row 3: AC-16101-1 via a spawned child. The child first hits
|
|
102
|
+
// /throw-handler (framework boundary through the companion), then
|
|
103
|
+
// /crash-real which triggers the real uncaught exception. The
|
|
104
|
+
// uncaughtException handler emits through the same companion,
|
|
105
|
+
// writes a level=error line and dumps companion state as
|
|
106
|
+
// level=info type=companion-dump, then process.exit(1).
|
|
107
|
+
const childExit = await new Promise((resolveExit, rejectExit) => {
|
|
108
|
+
const child = spawn(process.execPath, [
|
|
109
|
+
'-e',
|
|
110
|
+
`
|
|
111
|
+
(async () => {
|
|
112
|
+
const mod = await import(${JSON.stringify(FIXTURE_SERVER)});
|
|
113
|
+
const { server, port } = await mod.startServer({ port: 0, crashOnRequest: true });
|
|
114
|
+
try {
|
|
115
|
+
const first = await fetch('http://127.0.0.1:' + port + '/throw-handler');
|
|
116
|
+
await first.text();
|
|
117
|
+
const second = await fetch('http://127.0.0.1:' + port + '/crash-real');
|
|
118
|
+
await second.text();
|
|
119
|
+
} catch (e) {}
|
|
120
|
+
setTimeout(() => { try { server.close(); } catch (e) {}; process.exit(42); }, 3000);
|
|
121
|
+
})();
|
|
122
|
+
`,
|
|
123
|
+
], { stdio: ['ignore', 'pipe', 'pipe'], env: { ...process.env } });
|
|
124
|
+
let stdout = ''; let stderr = '';
|
|
125
|
+
child.stdout.on('data', (b) => { stdout += b.toString(); });
|
|
126
|
+
child.stderr.on('data', (b) => { stderr += b.toString(); });
|
|
127
|
+
const t = setTimeout(() => { try { child.kill('SIGKILL'); } catch {} rejectExit(new Error('child timeout')); }, 15000);
|
|
128
|
+
child.on('exit', (code, signal) => {
|
|
129
|
+
clearTimeout(t);
|
|
130
|
+
resolveExit({ code, signal, stdout: stdout.slice(0, 4000), stderr });
|
|
131
|
+
});
|
|
132
|
+
child.on('error', (err) => { clearTimeout(t); rejectExit(err); });
|
|
133
|
+
});
|
|
134
|
+
|
|
135
|
+
const stderrLines = childExit.stderr.split('\n').map((l) => l.trim()).filter(Boolean);
|
|
136
|
+
let errorLine = null;
|
|
137
|
+
let errorCount = 0;
|
|
138
|
+
let dumpLine = null;
|
|
139
|
+
// The companion factory writes ONE level=error JSON line for
|
|
140
|
+
// EVERY emit; the child in this run drives /throw-handler
|
|
141
|
+
// (framework-boundary, category='permanent') and then /crash-real
|
|
142
|
+
// (process-boundary, category='unknown'). Count only the
|
|
143
|
+
// process-boundary line so oneJsonLine tests AC-16101-1: exactly
|
|
144
|
+
// one level=error emission from the uncaughtException path.
|
|
145
|
+
for (const line of stderrLines) {
|
|
146
|
+
try {
|
|
147
|
+
const j = JSON.parse(line);
|
|
148
|
+
if (j && j.level === 'error' && j.record && j.boundary === 'process') { errorCount += 1; errorLine = j; }
|
|
149
|
+
else if (j && j.level === 'info' && j.type === 'companion-dump') { dumpLine = j; }
|
|
150
|
+
} catch { /* not JSON */ }
|
|
151
|
+
}
|
|
152
|
+
const oneJsonLine = errorCount === 1;
|
|
153
|
+
const exitOk = childExit.code === 1;
|
|
154
|
+
const categoryUnknown = errorLine && errorLine.record && errorLine.record.category === 'unknown';
|
|
155
|
+
const stackOnCause = !!(errorLine && errorLine.record && errorLine.record.cause
|
|
156
|
+
&& errorLine.record.cause.context && typeof errorLine.record.cause.context.stack === 'string'
|
|
157
|
+
&& errorLine.record.cause.context.stack.length > 0
|
|
158
|
+
&& /at\s+.*:\d+:\d+/.test(errorLine.record.cause.context.stack));
|
|
159
|
+
const rec = errorLine && errorLine.record;
|
|
160
|
+
const rowOk = exitOk && oneJsonLine && categoryUnknown && stackOnCause;
|
|
161
|
+
// Evidence for this row: the child emits its own identifiers.
|
|
162
|
+
// xFixtureRequestId carries the emitted record's correlationId
|
|
163
|
+
// (the fixture-stamped correlation id for this emission); status
|
|
164
|
+
// carries the OS exit code the process ended with. The row is
|
|
165
|
+
// conformanceOnly with limitation naming these substitutions,
|
|
166
|
+
// because a process-boundary observation runs off the HTTP wire.
|
|
167
|
+
results.push(conformanceOnlyResult({
|
|
168
|
+
anchorAcId: 'application-error-handling-AC-16101-1',
|
|
169
|
+
verdict: rowOk ? 'pass' : 'fail',
|
|
170
|
+
detail: `An uncaughtException on the Node runtime (or an - spawned child fixture exited with OS code ${childExit.code}; stderr carried ${errorCount} level=error JSON line(s); record.category=${rec?.category ?? 'null'}; stackOnCause=${stackOnCause}`,
|
|
171
|
+
evidence: {
|
|
172
|
+
route: '/crash-real (via spawned child)',
|
|
173
|
+
status: exitOk ? 1 : (childExit.code ?? 0) || 1,
|
|
174
|
+
xFixtureRequestId: (rec && rec.correlationId) || `child-exit-${childExit.code ?? 'null'}`,
|
|
175
|
+
bodyExcerpt: (errorLine ? JSON.stringify(errorLine) : childExit.stderr || childExit.stdout).slice(0, 240),
|
|
176
|
+
input: { childMode: 'crashOnRequest', trigger: 'GET /throw-handler then GET /crash-real' },
|
|
177
|
+
derived: {
|
|
178
|
+
osExitCode: childExit.code,
|
|
179
|
+
signal: childExit.signal,
|
|
180
|
+
oneJsonLine,
|
|
181
|
+
jsonLineCount: errorCount,
|
|
182
|
+
categoryUnknown,
|
|
183
|
+
stackOnCause,
|
|
184
|
+
level: errorLine?.level ?? null,
|
|
185
|
+
recordCorrelationId: rec?.correlationId ?? null,
|
|
186
|
+
recordCauseCorrelationId: rec?.cause?.correlationId ?? null,
|
|
187
|
+
companionDumpPresent: !!dumpLine,
|
|
188
|
+
},
|
|
189
|
+
},
|
|
190
|
+
limitation: 'application-error-handling-AC-16101-1: process-boundary observation runs off the HTTP wire; evidence.status carries the OS exit code observed by the OS on the child.on(exit) event, and evidence.xFixtureRequestId carries the emitted record\'s correlationId (the fixture-stamped identifier for this emission), because there is no fixture-stamped x-fixture-request-id header on a process exit',
|
|
191
|
+
}));
|
|
192
|
+
|
|
193
|
+
// Row 4: AC-16102-4 mid-stream close. The AC has three clauses:
|
|
194
|
+
// (a) the connection is closed without rewriting the wire
|
|
195
|
+
// response, observed as the client's premature socket close on
|
|
196
|
+
// /stream-then-throw after status 200 and the partial-body
|
|
197
|
+
// prefix have been flushed,
|
|
198
|
+
// (b) exactly one error record emits through the logging
|
|
199
|
+
// companion at error level naming the streaming-in-progress
|
|
200
|
+
// condition, and
|
|
201
|
+
// (c) the recorded record has category 'unknown' unless the
|
|
202
|
+
// throwing site supplied one.
|
|
203
|
+
// The probe drives /stream-then-throw with a Node client that
|
|
204
|
+
// exposes premature-close errors, observes the exact-one companion
|
|
205
|
+
// emission with level='error' and a message naming the
|
|
206
|
+
// streaming-in-progress condition, and records the row as a full
|
|
207
|
+
// anchored counting result whose predicate requires midStatus 200,
|
|
208
|
+
// prematureClose true, exactly-one companion emission at error
|
|
209
|
+
// level naming the streaming-in-progress condition, and the
|
|
210
|
+
// recorded category 'unknown'. Every clause is observable here;
|
|
211
|
+
// no browser-network sub-clause is carved out.
|
|
212
|
+
const invBefore = await (await fetch(`${fixture.baseUrl}/companion-invocations`)).json();
|
|
213
|
+
const invBeforeLen = invBefore.invocations.length;
|
|
214
|
+
let midStatus = null;
|
|
215
|
+
let midHeadersRequestId = null;
|
|
216
|
+
let midBody = '';
|
|
217
|
+
let clientErrorMessage = null;
|
|
218
|
+
let prematureClose = false;
|
|
219
|
+
try {
|
|
220
|
+
const midRes = await fetch(`${fixture.baseUrl}/stream-then-throw`);
|
|
221
|
+
midStatus = midRes.status;
|
|
222
|
+
midHeadersRequestId = midRes.headers.get('x-fixture-request-id');
|
|
223
|
+
// Read body chunks incrementally so a partial body received
|
|
224
|
+
// before the premature close is retained in midBody even when
|
|
225
|
+
// the read then throws. Using res.text() would discard whatever
|
|
226
|
+
// was already delivered on the reader when the socket aborts.
|
|
227
|
+
const decoder = new TextDecoder('utf-8');
|
|
228
|
+
const reader = midRes.body ? midRes.body.getReader() : null;
|
|
229
|
+
if (reader) {
|
|
230
|
+
// eslint-disable-next-line no-constant-condition
|
|
231
|
+
while (true) {
|
|
232
|
+
let step;
|
|
233
|
+
try {
|
|
234
|
+
step = await reader.read();
|
|
235
|
+
} catch (readErr) {
|
|
236
|
+
clientErrorMessage = String(readErr && readErr.message ? readErr.message : readErr);
|
|
237
|
+
prematureClose = true;
|
|
238
|
+
break;
|
|
239
|
+
}
|
|
240
|
+
if (step && step.done) break;
|
|
241
|
+
if (step && step.value) {
|
|
242
|
+
midBody += decoder.decode(step.value, { stream: true });
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
midBody += decoder.decode();
|
|
246
|
+
} else {
|
|
247
|
+
// Fallback for runtimes that do not expose a body stream.
|
|
248
|
+
try {
|
|
249
|
+
midBody = await midRes.text();
|
|
250
|
+
} catch (bodyErr) {
|
|
251
|
+
clientErrorMessage = String(bodyErr && bodyErr.message ? bodyErr.message : bodyErr);
|
|
252
|
+
prematureClose = true;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
} catch (fetchErr) {
|
|
256
|
+
clientErrorMessage = String(fetchErr && fetchErr.message ? fetchErr.message : fetchErr);
|
|
257
|
+
prematureClose = true;
|
|
258
|
+
}
|
|
259
|
+
const invAfter = await (await fetch(`${fixture.baseUrl}/companion-invocations`)).json();
|
|
260
|
+
const newInvocations = invAfter.invocations.slice(invBeforeLen);
|
|
261
|
+
const midEmissions = newInvocations.filter((x) => x.source === 'framework-boundary-mid-stream');
|
|
262
|
+
const exactlyOneMidEmission = midEmissions.length === 1;
|
|
263
|
+
const midCategoryUnknown = exactlyOneMidEmission && midEmissions[0].category === 'unknown';
|
|
264
|
+
const midLevelError = exactlyOneMidEmission && midEmissions[0].level === 'error';
|
|
265
|
+
const streamingCondition = 'streaming-in-progress';
|
|
266
|
+
const midMessage = exactlyOneMidEmission ? (midEmissions[0].message || '') : '';
|
|
267
|
+
const midMessageNamesCondition = midMessage.includes(streamingCondition);
|
|
268
|
+
const partialBodyPrefix = 'partial-body-before-throw';
|
|
269
|
+
const partialBodyReceived = midBody.startsWith(partialBodyPrefix);
|
|
270
|
+
const socketClosedEarly = prematureClose || (partialBodyReceived && midBody === partialBodyPrefix && clientErrorMessage);
|
|
271
|
+
// AC-16102-4 requires the connection be closed without rewriting
|
|
272
|
+
// the wire response. Recording partialBodyReceived is not a
|
|
273
|
+
// substitute for the close: a normal completed 200 response that
|
|
274
|
+
// happens to carry the prefix must fail this row. The predicate
|
|
275
|
+
// therefore requires status 200 (headers were flushed before the
|
|
276
|
+
// throw), prematureClose===true (the socket was aborted after the
|
|
277
|
+
// partial write), and the exact-one companion emission at
|
|
278
|
+
// level=error with the streaming-in-progress condition and
|
|
279
|
+
// category unknown; partialBodyReceived is recorded but does not
|
|
280
|
+
// participate in the verdict.
|
|
281
|
+
const ac4ServerOk = midStatus === 200
|
|
282
|
+
&& prematureClose === true
|
|
283
|
+
&& exactlyOneMidEmission
|
|
284
|
+
&& midCategoryUnknown
|
|
285
|
+
&& midLevelError
|
|
286
|
+
&& midMessageNamesCondition;
|
|
287
|
+
results.push({
|
|
288
|
+
anchorAcId: 'application-error-handling-AC-16102-4',
|
|
289
|
+
verdict: ac4ServerOk ? 'pass' : 'fail',
|
|
290
|
+
detail: `Given a handler that throws AFTER the response body: companion recorded ${midEmissions.length} mid-stream emission(s) with category=${midEmissions[0]?.category ?? 'MISSING'} level=${midEmissions[0]?.level ?? 'MISSING'} messageNamesStreamingInProgress=${midMessageNamesCondition}; client saw prematureClose=${prematureClose} partialBodyPrefix=${partialBodyReceived}`,
|
|
291
|
+
evidence: {
|
|
292
|
+
route: '/stream-then-throw',
|
|
293
|
+
status: midStatus == null ? 0 : midStatus,
|
|
294
|
+
xFixtureRequestId: midHeadersRequestId || (exactlyOneMidEmission ? midEmissions[0].correlationId : ''),
|
|
295
|
+
bodyExcerpt: (midBody || clientErrorMessage || '').slice(0, 240),
|
|
296
|
+
input: { flushedHeadersFirst: true, wroteBytesBeforeThrow: partialBodyPrefix },
|
|
297
|
+
derived: {
|
|
298
|
+
invBeforeLen,
|
|
299
|
+
invAfterLen: invAfter.invocations.length,
|
|
300
|
+
midEmissions,
|
|
301
|
+
exactlyOneMidEmission,
|
|
302
|
+
midCategoryUnknown,
|
|
303
|
+
midLevelError,
|
|
304
|
+
midMessage,
|
|
305
|
+
midMessageNamesCondition,
|
|
306
|
+
partialBodyReceived,
|
|
307
|
+
prematureClose,
|
|
308
|
+
socketClosedEarly: !!socketClosedEarly,
|
|
309
|
+
clientErrorMessage,
|
|
310
|
+
midStatus,
|
|
311
|
+
midHeadersRequestId,
|
|
312
|
+
},
|
|
313
|
+
},
|
|
314
|
+
});
|
|
315
|
+
|
|
316
|
+
// Row 5: REQ-004 - the SAME companion saw the framework-boundary
|
|
317
|
+
// emission from /throw-handler AND the process-boundary emission
|
|
318
|
+
// from the uncaughtException handler on the same child. The
|
|
319
|
+
// companion-dump line carries the invocations array recorded in
|
|
320
|
+
// the child before process.exit.
|
|
321
|
+
const invocations = (dumpLine && dumpLine.invocations) || [];
|
|
322
|
+
const sources = new Set(invocations.map((i) => i.source || null).filter(Boolean));
|
|
323
|
+
const bothBoundaries = sources.has('framework-boundary') && sources.has('process-boundary');
|
|
324
|
+
const req4Ok = !!dumpLine && bothBoundaries;
|
|
325
|
+
results.push({
|
|
326
|
+
anchorReqId: 'application-error-handling-REQ-004',
|
|
327
|
+
verdict: req4Ok ? 'pass' : 'fail',
|
|
328
|
+
detail: `Error emission goes through the logging companion factory, - companion-dump line ${dumpLine ? 'present' : 'MISSING'}; recorded sources=[${[...sources].join(',')}]; both boundaries observed on the SAME companion instance in the same child run: ${bothBoundaries}`,
|
|
329
|
+
evidence: {
|
|
330
|
+
route: 'child stderr / companion-dump line',
|
|
331
|
+
status: exitOk ? 1 : (childExit.code ?? 0) || 1,
|
|
332
|
+
xFixtureRequestId: (rec && rec.correlationId) || `child-exit-${childExit.code ?? 'null'}`,
|
|
333
|
+
bodyExcerpt: dumpLine ? JSON.stringify(dumpLine).slice(0, 240) : childExit.stderr.slice(0, 240),
|
|
334
|
+
input: { drove: ['/throw-handler', '/crash-real'] },
|
|
335
|
+
derived: { dumpPresent: !!dumpLine, invocationCount: invocations.length, sourcesSeen: [...sources], bothBoundaries, invocations },
|
|
336
|
+
},
|
|
337
|
+
});
|
|
338
|
+
|
|
339
|
+
return { results };
|
|
340
|
+
} finally {
|
|
341
|
+
await fixture.close();
|
|
342
|
+
}
|
|
343
|
+
}
|
|
@@ -1,5 +1,27 @@
|
|
|
1
1
|
# application-file-upload CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 1.2.7 - 2026-09-11
|
|
4
|
+
|
|
5
|
+
- per-file-progressbar now emits a notObservableHere row for AC-23102-2 alongside the existing conformanceOnly server row: the AC's when/then names the aggregate announcement text emitted through the polite live region, and that half is a browser DOM observation the server-side probe pack cannot make. The AC is now represented on the shelf as (i) a conformanceOnly counting row observing the byte-weighted aggregate from the server's uploaded-bytes accounting and (ii) a notObservableHere row carrying the AC id and the browser-observable-half reason.
|
|
6
|
+
- Anatomy test pin bumped to 1.2.7.
|
|
7
|
+
|
|
8
|
+
## 1.2.6 - 2026-09-11
|
|
9
|
+
|
|
10
|
+
- Corrects the stale chunked-transport-endpoints probe header: the AC-23104-1 row drives one declared 16 KiB file split into four sequential 4 KiB chunks against one sessionId, and the header now says so rather than "three real chunk POSTs with distinct byte payloads"; the code and evidence were already the four-equal-chunk shape.
|
|
11
|
+
- Anatomy test pin bumped to 1.2.6.
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## 1.2.5 - 2026-09-11
|
|
15
|
+
|
|
16
|
+
- Adds a contributions/probes pack meeting rule 7d.
|
|
17
|
+
- Probes: upload-surface-shape, per-file-progressbar, chunked-transport-endpoints, assertive-completion-slot.
|
|
18
|
+
- Chunked-transport row for AC-23104-1 is conformanceOnly: the probe observes multipart chunk-count bytes server-side; the DOM half ([data-transport], [data-chunks-uploaded]) and the browser-network half (PATCH requests carrying Upload-Offset) are notObservableHere. AC-23104-3 remains a positive row on the tus branch (post-409 state read + resume PATCH from the acknowledged offset).
|
|
19
|
+
- Per-file aggregate row for AC-23102-2 is conformanceOnly with limitation naming that the polite live region's rendered aggregate announcement text is browser-only; the row drives three files of 1/2/5 MiB through /upload/chunk and shows byte-weighted percent differs materially from plain per-file average at the intermediate steps (12.5% vs 33.33% after file 1; 37.5% vs 66.67% after file 2) and converges to 100% at completion.
|
|
20
|
+
- Enter-press / focus surface (AC-23101-1) is conformanceOnly with limitation naming that the button-Enter-open-picker interaction is browser-only.
|
|
21
|
+
- Aggregate completion is derived from request-body bytes.
|
|
22
|
+
- Anatomy test pin bumped to 1.2.5.
|
|
23
|
+
|
|
24
|
+
|
|
3
25
|
## 1.2.0 (2026-09-10)
|
|
4
26
|
|
|
5
27
|
### Added
|
|
@@ -21,11 +43,11 @@
|
|
|
21
43
|
|
|
22
44
|
- Register: neutral wording in shipped prose (no capability change).
|
|
23
45
|
|
|
24
|
-
## 1.1.0 (2026-09-10
|
|
46
|
+
## 1.1.0 (2026-09-10)
|
|
25
47
|
|
|
26
48
|
### Added
|
|
27
49
|
|
|
28
|
-
- Failure-path acceptance criteria on US-23101 (MIME and size cap refusal), US-23102 (byte-weighted aggregate progress, tick-cadence cap), US-23103 (per-file failure with focus on retry), US-23104 (tus prerequisite apply refusal with TUS_PREREQUISITE_MISSING, Upload-Offset semantics on retry, malformed Upload-Offset handling), US-23105 (successful removal with polite announce, failed DELETE with data-remove-outcome=failed, completion-once idempotency), US-23106 (Upload-Offset regression abort with UPLOAD_OFFSET_REGRESSION), US-23107 (prefers-reduced-motion static-text fallback)
|
|
50
|
+
- Failure-path acceptance criteria added on US-23101 (MIME and size cap refusal), US-23102 (byte-weighted aggregate progress, tick-cadence cap), US-23103 (per-file failure with focus on retry), US-23104 (tus prerequisite apply refusal with TUS_PREREQUISITE_MISSING, Upload-Offset semantics on retry, malformed Upload-Offset handling), US-23105 (successful removal with polite announce, failed DELETE with data-remove-outcome=failed, completion-once idempotency), US-23106 (Upload-Offset regression abort with UPLOAD_OFFSET_REGRESSION), US-23107 (prefers-reduced-motion static-text fallback), so applying projects have explicit failure-path acceptance criteria on each story.
|
|
29
51
|
- Vendor citations on the tus.io resumable-upload protocol AC and the WCAG animation-from-interactions AC (verified 2026-09-10).
|
|
30
52
|
|
|
31
53
|
### Changed
|
|
@@ -33,10 +55,10 @@
|
|
|
33
55
|
- Every REQ now carries a deliveredBy link into TAC-2401 (input), TAC-2402 (transport) or TAC-2403 (progress-announcer).
|
|
34
56
|
- Every AC on every user story now carries an explicit disposition (fixed or template); ACs that observe removeFile carry ownerRef into TAC-2402.
|
|
35
57
|
|
|
36
|
-
## 1.0.0 (
|
|
58
|
+
## 1.0.0 (2026-09-06)
|
|
37
59
|
|
|
38
|
-
-
|
|
39
|
-
- Ships `probe-packs/application-file-upload.pack.mjs`: four surface-observable browser-verify checks anchored one per contract (`AC-23101-1` input surface, `AC-23102-1` progress announcer, `AC-23103-1` refusal contract, `AC-23104-1` chunked transport). Every URL is composed by the `withUrl(runtimeUrl, path)` helper
|
|
40
|
-
- Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-file-upload/` with a Node HTTP server realising both transport branches honestly (`?transport=multipart` default, `?transport=tus` elicited alternative) and break switches (`?break=no-input`, `?break=no-live-region`, `?break=send-refused`, `?break=no-chunks`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?transport=`, every `?seed=`, every `?break=`, the manual boot line and the two-line
|
|
60
|
+
- Initial shipped version of the shelf's file-upload blueprint. Five REQs (input contract with a labelled file input plus drop-zone plus keyboard alternative per WCAG 2.5.7, progress contract with per-file percent and aggregate percent and polite live-region tick, refusal contract with MIME and size and virus-scan gates and aria-describedby error binding and focus-to-retry, transport contract chunked-and-resumable with multipart POST default and tus.io elicited alternative, completion contract with assertive-slot success announcement per WCAG 4.1.3 and per-file remove and retry), seven USs 23101-23107 binding one runtime-observable AC per REQ plus two cross-cutting cases (network-interruption resumption AC-23106-1, background-tab progress AC-23107-1), three TACs 2401-2403 (upload input surface, upload transport contract, upload progress announcer), three ADRs 2401-2403 (transport branch with multipart recommendedDefault true and tus and vendor-sdk elicited, accepted MIME set and per-file size cap elicited, virus-scan integration via a capability-plus-elicit). No new global topics.
|
|
61
|
+
- Ships `probe-packs/application-file-upload.pack.mjs`: four surface-observable browser-verify checks anchored one per contract (`AC-23101-1` input surface, `AC-23102-1` progress announcer, `AC-23103-1` refusal contract, `AC-23104-1` chunked transport). Every URL is composed by the `withUrl(runtimeUrl, path)` helper; no bare string concatenation. The pack-level `appliesTo` predicate references BOTH `tacIds` (TAC-2401) AND `route` (the operator-configured upload path glob).
|
|
62
|
+
- Ships a dependency-free sample-app fixture at `packages/rcf-lite/test/fixtures/probe-pack-application-file-upload/` with a Node HTTP server realising both transport branches honestly (`?transport=multipart` default, `?transport=tus` elicited alternative) and break switches (`?break=no-input`, `?break=no-live-region`, `?break=send-refused`, `?break=no-chunks`) driving the negative runs from a single boot. The fixture ships its own README naming PORT, every `?transport=`, every `?seed=`, every `?break=`, the manual boot line and the two-line manual boot.
|
|
41
63
|
- Declares `suggestedCompanions` `logging` (every refused upload writes one request-scoped log line with the closed refusal reason and the correlation identifier) and `errorHandling` (refusals and transport-layer failures construct an internal error record through the applied error-handling factory). Does NOT declare `providesRoles` (leaf blueprint per spec; loader refuses an empty `providesRoles` array when set, so the leaf-blueprint intent is expressed by omitting the field). Does NOT declare `capabilities` and does NOT declare `requiresAppliedCapabilities` (no auth required).
|
|
42
64
|
- Seventh shipped consumer of the earlier release probe-pack runner extension.
|
|
@@ -52,7 +52,7 @@ Every file row on the fixture cycles through the closed state set `idle` -> `upl
|
|
|
52
52
|
|
|
53
53
|
## The one runtime gate
|
|
54
54
|
|
|
55
|
-
`probe-packs/application-file-upload.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2401-application-file-upload-input` or whose nav model routes name an operator-configured upload path. Each check drives the real Playwright browser the runner provisions, reads the accessibility tree and the DOM (and the request log for the refusal check and the tus branch), and returns a verdict. URLs are composed by the `withUrl(runtimeUrl, path)` helper
|
|
55
|
+
`probe-packs/application-file-upload.pack.mjs` ships four checks the `rcf verify browser` runner invokes on any FBS whose surface binds `TAC-2401-application-file-upload-input` or whose nav model routes name an operator-configured upload path. Each check drives the real Playwright browser the runner provisions, reads the accessibility tree and the DOM (and the request log for the refusal check and the tus branch), and returns a verdict. URLs are composed by the `withUrl(runtimeUrl, path)` helper; no bare string concatenation.
|
|
56
56
|
|
|
57
57
|
## Quality bar
|
|
58
58
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "application-file-upload",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"category": "application",
|
|
5
5
|
"suggestedCompanions": [
|
|
6
6
|
{
|
|
@@ -165,5 +165,6 @@
|
|
|
165
165
|
],
|
|
166
166
|
"capabilities": [
|
|
167
167
|
"virusScan"
|
|
168
|
-
]
|
|
168
|
+
],
|
|
169
|
+
"updatedAt": "2026-09-11T16:04:17Z"
|
|
169
170
|
}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
// assertive-completion-slot probe for application-file-upload v1.2.7.
|
|
2
|
+
//
|
|
3
|
+
// AC-23105-1 (server-observable half): after the fixture completes
|
|
4
|
+
// the upload set, the assertive-slot in the shell reads
|
|
5
|
+
// /^\d+ files uploaded successfully$/ derived from real bytes.
|
|
6
|
+
// The DOM-observable per-row remove/retry controls are browser-only,
|
|
7
|
+
// so this probe records ONE conformanceOnly row for AC-23105-1
|
|
8
|
+
// carrying real evidence for the observed half.
|
|
9
|
+
//
|
|
10
|
+
// anchorAcId: application-file-upload-AC-23105-1.
|
|
11
|
+
|
|
12
|
+
import { startFixture, evidenceFromResponse, conformanceOnlyResult } from './probe-utils.mjs';
|
|
13
|
+
import { randomUUID } from 'node:crypto';
|
|
14
|
+
|
|
15
|
+
export const anchorReqId = 'application-file-upload-REQ-005';
|
|
16
|
+
export const accountBound = false;
|
|
17
|
+
|
|
18
|
+
const COMPLETION_RE = /^\d+ files uploaded successfully$/;
|
|
19
|
+
|
|
20
|
+
export default async function runProbe() {
|
|
21
|
+
const { startServer } = await import('../../../../packages/rcf-lite/test/fixtures/probe-pack-application-file-upload/server.js');
|
|
22
|
+
const fixture = await startFixture({ startServer, port: 0 });
|
|
23
|
+
try {
|
|
24
|
+
const results = [];
|
|
25
|
+
|
|
26
|
+
const sessionId = `probe-${randomUUID()}`;
|
|
27
|
+
const files = [{ name: 'p.bin', bytes: 100 }, { name: 'q.bin', bytes: 200 }, { name: 'r.bin', bytes: 300 }];
|
|
28
|
+
const total = files.reduce((s, f) => s + f.bytes, 0);
|
|
29
|
+
await fetch(`${fixture.baseUrl}/upload/session?sessionId=${sessionId}`, {
|
|
30
|
+
method: 'POST', headers: { 'content-type': 'application/json' },
|
|
31
|
+
body: JSON.stringify({ totalExpectedBytes: total, files }),
|
|
32
|
+
});
|
|
33
|
+
for (const [i, f] of files.entries()) {
|
|
34
|
+
await fetch(`${fixture.baseUrl}/upload/chunk?n=${i + 1}&sessionId=${sessionId}`, {
|
|
35
|
+
method: 'POST', body: Buffer.alloc(f.bytes, 65 + i),
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
const completionRes = await fetch(`${fixture.baseUrl}/upload/completion?sessionId=${sessionId}`);
|
|
39
|
+
const completionBody = await completionRes.text();
|
|
40
|
+
const completionParsed = JSON.parse(completionBody);
|
|
41
|
+
const completeDerived = completionParsed.complete === true && completionParsed.uploadedBytes === total
|
|
42
|
+
&& COMPLETION_RE.test(completionParsed.completionText);
|
|
43
|
+
|
|
44
|
+
const shellRes = await fetch(`${fixture.baseUrl}/upload?sessionId=${sessionId}`);
|
|
45
|
+
const shellBody = await shellRes.text();
|
|
46
|
+
const slotMatch = shellBody.match(/<div[^>]+data-assertive-slot[^>]+aria-live="assertive"[^>]*>([^<]*)<\/div>/);
|
|
47
|
+
const slotText = slotMatch ? slotMatch[1].trim() : '';
|
|
48
|
+
const shellOk = shellRes.status === 200 && !!slotMatch && COMPLETION_RE.test(slotText)
|
|
49
|
+
&& slotText === completionParsed.completionText;
|
|
50
|
+
const pass = completeDerived && shellOk;
|
|
51
|
+
results.push(conformanceOnlyResult({
|
|
52
|
+
anchorAcId: 'application-file-upload-AC-23105-1',
|
|
53
|
+
anchorReqId: 'application-file-upload-REQ-005',
|
|
54
|
+
verdict: pass ? 'pass' : 'fail',
|
|
55
|
+
detail: `After the fixture completes the upload set the - drove three real chunk uploads (${total} bytes) under sessionId=${sessionId}; fixture derived completionText="${completionParsed.completionText}"; shell assertive-slot text="${slotText}"`,
|
|
56
|
+
evidence: evidenceFromResponse({
|
|
57
|
+
route: `/upload?sessionId=${sessionId}`,
|
|
58
|
+
response: shellRes,
|
|
59
|
+
bodyText: shellBody,
|
|
60
|
+
extraFields: {
|
|
61
|
+
input: { sessionId, files, totalExpectedBytes: total },
|
|
62
|
+
derived: {
|
|
63
|
+
uploadedBytes: completionParsed.uploadedBytes,
|
|
64
|
+
complete: completionParsed.complete,
|
|
65
|
+
completionText: completionParsed.completionText,
|
|
66
|
+
assertiveSlotText: slotText,
|
|
67
|
+
},
|
|
68
|
+
altBodyExcerpt: completionBody.slice(0, 240),
|
|
69
|
+
},
|
|
70
|
+
}),
|
|
71
|
+
limitation: 'application-file-upload-AC-23105-1: per-row remove and retry controls need browser DOM inspection',
|
|
72
|
+
}));
|
|
73
|
+
|
|
74
|
+
return { results };
|
|
75
|
+
} finally {
|
|
76
|
+
await fixture.close();
|
|
77
|
+
}
|
|
78
|
+
}
|