rcf-lite 0.27.0 → 0.28.1
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 +39 -0
- package/README.md +19 -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 +46 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +16 -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 +18 -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 +46 -0
- package/rcf/fbs/fbs-182.json +43 -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 +40 -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 +40 -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 +174 -0
- package/rcf/test-suites/ts-189.json +60 -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 +60 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +51 -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 +21 -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 +2213 -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 +455 -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 +1148 -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/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,45 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.28.1] - 2026-09-17
|
|
10
|
+
|
|
11
|
+
Feedback defects surfaced by the first WSD-lens round-trip on 0.28.0. Fixes both a destination bug that silently misrouted library-owned findings to `Stravica/rcf-lite`, and a redactor over-fold that mangled the docs URL and any prose using the canonical noun `agent`. Includes a package-rename disclosure banner in the README so a colleague hitting `npm i -g @stravica-ai/rcf-build-lite` on the retired scoped name knows what to do.
|
|
12
|
+
|
|
13
|
+
### Fixed
|
|
14
|
+
|
|
15
|
+
- **Feedback destination for bare-slug library-owned blueprints (AC-15801-4).** A `--kind blueprint` entry whose manifest record has no `libraryPrefix` now cross-checks the blueprint-library registry BEFORE the shelf-constant fall-through: if exactly one registered library owns a blueprint with the applied slug AND that library resolves to a destination (`issuesRepo`, or a derivable `git+https://github.com/...` sourceRef), the resolver routes to that library's destination with `source: 'library-slug-inference'`. Two or more owners return `unresolved` with `reason: 'ambiguous-library-slug'` and a `candidates[]` array of library prefixes. Zero owners keep the shelf-constant fall-through unchanged. This never overrides an existing `libraryPrefix` resolution (AC-15801-2's path is untouched). Before 0.28.1, a WSD colleague who ran `rcf define blueprint add application-spa` from a project with a registered WSD library that also owned `application-spa` saw their feedback routed to `Stravica/rcf-lite` instead of the WSD blueprints repo the library declared. Chain: US-15801 AC-15801-4; design amendment R5a; TS-189 gains three test cases; TAC-4106 responsibility extended.
|
|
16
|
+
|
|
17
|
+
- **Operator-identity redactor no longer folds the canonical noun `agent` (AC-15601-5).** The operator-identity substitution now consults a `RESERVED_IDENTITY_TOKENS` stopword set (agent, user, admin, api, code, system, and the rest of the guarded common nouns) before folding each whitespace-separated token of the identity `## Name`. Before 0.28.1, an identity such as `The Agent Alice` caused the redactor to fold the literal `agent` throughout the body: the docs URL `how-the-agent-files-feedback` became `how-the-<operator>-files-feedback` (no longer resolvable), the canon phrase `when the agent stops` mangled, and every RULE 17 example was affected. Real given names (Alice, Smith) still fold; only common-noun tokens are guarded. When the identity string is ENTIRELY stopwords (a placeholder in disguise), the full-literal substitution is also skipped so the docs and canon phrases survive. Chain: US-15601 AC-15601-5; design amendment R5c; TS-188 gains one test case; TAC-4103 responsibility extended.
|
|
18
|
+
|
|
19
|
+
- **`rcf feedback add --evidence` help text now names its requiredness explicitly.** Header line `'rcf feedback add' options (all required unless noted)` was preserved and truthful, but `--evidence <pointer>` did not itemise its required-and-repeatable behaviour, so a reader could take the line-item shape alone as "optional." Help text now reads `Required, repeatable: a command, a path:line inside the project, or an id. At least one --evidence is required (AC-15501-1); absence exits 2.` No behaviour change; AC-15501-1 already required at least one `--evidence`.
|
|
20
|
+
|
|
21
|
+
### Changed
|
|
22
|
+
|
|
23
|
+
- **Package rename disclosure surfaced in the README and CHANGELOG.** The scoped name `@stravica-ai/rcf-build-lite` was frozen at 0.7.0 and the suite consolidated into the unscoped `rcf-lite` at 0.7.1; the 0.28.0 line ships ONLY on `rcf-lite`. The README already carried the rename note under "Where this came from" and pointed at the packaging runbook, but there was no in-CLI hint: a colleague running `npm i -g @stravica-ai/rcf-build-lite@0.28.0` saw a bare "no matching version" from npm with no rcf-lite context. 0.28.1 adds a callout box at the top of the README naming the rename explicitly and the CHANGELOG carries this note so a search for the retired name lands somewhere useful. The npm-side deprecate notice on the retired scoped name is a Dave operator step (needs npm auth) tracked separately from this release. No behaviour change.
|
|
24
|
+
|
|
25
|
+
## [0.28.0] - 2026-09-17
|
|
26
|
+
|
|
27
|
+
rcf-lite 0.28.0 lands two referee-facing trains together. The `rcf feedback` verb family lets an agent record what a blueprint or rcf-lite did that contradicts its own docs, fails, or forces a workaround, redact it to the eight rules of the design plus a whole-body residual scan, and, after one operator yes at a natural pause, file each finding as a GitHub issue under the operator's own `gh` login (or a pastable outbox bundle on the fallback path). The referee-guarantees train tightens the three sentences the docs page makes about `rcf define validate`, `rcf audit coverage` and `rcf build finalise`: validate now walks ADR `supersededBy`, coverage is strict-by-default with `--mode shallow-any` as the deliberate opt-out, and finalise refuses on the three per-AC verdicts (UI-BASELINE-UNMET, BROWSER-VERIFICATION-MISSING, SCOPE-MISMATCH), gates the manual `verified` override behind `--acknowledge-verified-override`, and adds a merge-state precondition with `--allow-pre-merge` as the deliberate pre-merge dry-run opt-out. `rcf init` now merges three hook entries into `.claude/settings.json` and `.codex/hooks.json` so the feedback ask fires once per session at idle; RULE 17 lands in the managed instructions block as the belt-and-braces path. Coverage-strict-by-default is the single migration surface: downstream projects that ran plain `rcf audit coverage` and treated its exit code as passing will see the same tree exit 4; the fix is either to close the coverage gap or to run `rcf audit coverage --mode shallow-any` when the intent is a printed gap report.
|
|
28
|
+
|
|
29
|
+
### Fixed
|
|
30
|
+
|
|
31
|
+
- **Referee-guarantee train: schema pin bumped to `@stravica-ai/rcf-schemas` `0.6.3` and the two schema-skipped workarounds removed (closes C-33 and C-38).** `packages/rcf-lite/package.json` pins `0.6.3` (adds the optional `shipWithoutEval[]` carrier on the manifest and the optional `applicable` boolean on `browserVerificationProbePackCheck`). `src/finalise/ship-without-eval.js:writeShipWithoutEvalRecord` now validates the composed manifest through `validateDocument` before the atomic write, mirroring the sister `ship-without-verified` writer; the "write path skips the validator" comment and the follow-up delta block are gone. `src/browser-verify/pack-runner.js` emits `{ id, applicable: false, detail }` (no `verdict`, no `severity`) when a check's own `appliesTo` predicate returns false, instead of the compatibility-carry `verdict: 'skipped'`; the aggregate verdict already ignored applicable-false packs and non-`fail` check verdicts, so the record shape now matches the docs promise without changing gate semantics. Test evidence: `test/browser-verify/pack-runner.test.js` gains the check-level applicable=false shape assertion; the existing `finalise --ship-without-eval` integration test in `test/cli/finalise-eval-refusal.test.js` continues to pass with the manifest now validated on write. All twelve referee-guarantees docs claims on the referee-guarantees page are now true against the shipped tree. Chain: work item w-2026-09-17-dave-009.
|
|
32
|
+
|
|
33
|
+
- **`rcf feedback defer` now means "not now, ask again next session" (C-39).** The 0.28.0 build shipped a `handleDefer` that stamped every pending entry with `status: deferredUntilSession` and a `sessionId`, but no lifecycle path ever returned a deferred entry to `pending`, so the `Stop` and `SessionStart` hooks filtered it out for the life of the store: defer behaved like a permanent opt-out and only `discard` or `opt-out` were reversible. Both hooks now call a shared `requeueDeferredForSession` helper that appends one `{ status: pending }` state-transition line for every `deferredUntilSession` entry whose stored `sessionId` differs from the incoming one, with no `sessionId` field on the transition so fold-by-id preserves the entry's prior session and the `anyCarriedOver` gate in both hooks fires naturally in the new session. The requeue runs on `session-start` (the primary path) AND on `stop` (belt to the SessionStart hook's braces, so a project that only wired Stop still gets the ask), is idempotent per session (a repeat in the same incoming session is a no-op), and preserves `recordedAt` and `askNow` untouched. `packages/rcf-lite/docs/feedback.md` updated with the ruling. Chain: US-16103 gains AC-16103-3 (design 3.1 / 3.5); TS-197 gains three test cases; CN-600 picks up the new AC; FBS-184 the same. No behaviour change for entries that were never deferred.
|
|
34
|
+
|
|
35
|
+
### Added
|
|
36
|
+
|
|
37
|
+
- **`rcf feedback`: end-to-end feedback submission for blueprints and rcf-lite itself (PR #221).** New core verb family that lets an agent record what a blueprint or rcf-lite did that contradicts its own docs, fails, or forces a workaround, and, after one operator yes at a natural pause, files each finding as a GitHub issue under the operator's own `gh` login: `Stravica/rcf-lite` for core and shelf blueprints, the library's own repo for library blueprints. The store is gitignored (raw entries can carry paths, hostnames and secret-looking strings the redactor strips on submit); the render path runs the eight redaction rules of design section 5 plus a whole-body residual scan and refuses to ship anything that still carries a shape the rules exist to strip; dedupe folds ten users' reports of the same defect into one issue with nine +1 comments through a fingerprint over kind / target / anchor / symptom class; the fallback path (no `gh`, no login, no access, issues disabled) writes a pastable bundle under `.rcf/feedback/outbox/` and prints the repo `issues/new` URL. `rcf init` merges three hook entries into `.claude/settings.json` and `.codex/hooks.json` (Stop, SessionEnd, SessionStart) so the ask fires once per session at idle, and `rcf doctor --check feedback-hooks` keeps them honest across clones. RULE 17 lands in the managed instructions block so an agent on a harness that has not trusted the hooks still follows the shape. Never handles a token, never calls an LLM, never submits without an explicit yes. Design of record: `projects/rcf-lite-wsd/specs/2026-09-16-feedback-submission-design.md`. Chain: REQ-155 to REQ-162, FBS-180 to FBS-185. Full user docs: `packages/rcf-lite/docs/feedback.md`.
|
|
38
|
+
- **`rcf feedback`: R4 separator shapes (fix round 5, design amendment R4).** The redaction pass now folds a vocabulary key labelling a value-shape token (8+ chars, at least two character classes among upper / lower / digit / symbol) via any non-`:=` separator: markdown table pipes (`| password | Sup3rSecretV@lue!! |`), whitespace runs, tabs, hyphens (including em-dash after dash normalisation), arrows, HTML numeric entities (`pass=SuperSecretValue1234`, `pass=...`) and the prose bridges `is` / `was` / `set to`. Runs after the primary rule-5 loop so `key=value` and `Authorization:` shapes keep their canonical ledger names; the residual safeguard runs the same scan under `kv-secret-r4` so a shape the first-pass missed refuses submit fail-closed. False positives are visible in the ledger; the mixed-classes gate keeps ordinary prose (`the password is required`, `the password field is required`) intact. Docs also clarify that `authorization` is deliberately excluded from `SECRET_KEY_VOCABULARY` (the line-anchored header rule folds the whole header line instead), and that the vocabulary is English-only (a non-English key on a short value should be hand-redacted before submit; a 32+ char value still folds via the entropy-blob backstop). Closes the HQ re-gate note's F-05 (P1), F-07 (P2, HTML entity separator closed as a side effect of R4) and F-11 (P3, docs prose fix); documents F-06 (P2, non-English keys) and F-08/F-09/F-10 (P3, acceptable as-is per design). Chain: AC-15601-1 updated with R4 fixture cases; TS-188 gains TC-188-r4-separator-probes, TC-188-r4-residual-safeguard and TC-188-r4-overredaction-guard on test/cli/feedback-fix-round-5.test.js.
|
|
39
|
+
|
|
40
|
+
### Changed
|
|
41
|
+
|
|
42
|
+
- **Referee-guarantee train: `rcf build finalise` refuses UI-BASELINE-UNMET / BROWSER-VERIFICATION-MISSING / SCOPE-MISMATCH, gates the manual `verified` override, and refuses off a default trunk (REQ-165 / US-16501, US-16502).** Closes referee-guarantees docs claims C-22, C-26, C-28, C-29, C-30 and C-36. **Finalise per-AC refusals (C-28, C-29, C-30, C-36):** three refusal branches added to `src/cli/finalise.js` after the existing MOCK-ONLY / EVAL branches, in the order UI-BASELINE-UNMET, BROWSER-VERIFICATION-MISSING, SCOPE-MISMATCH. Each reads `report.perAcVerdicts[]` and refuses promotion (exit 4) when the verdict is present; the stderr message names the AC(s), the count, and the referee-guarantees claim ids. The three new ingest helpers (`findUiBaselineUnmetAcs`, `findBrowserVerificationMissingAcs`, plus the existing `findScopeMismatchAcs`) are re-exported through `src/finalise/index.js`. A block-severity probe-pack failure aggregates into UI-BASELINE-UNMET, so the same branch closes both C-28 and C-36. No `--ship-without-*` opt-out is added for these three: the docs page names none, and the failure classes (broken baseline, missing browser check, scope-mismatched TC) are the shape the referee is chartered to refuse; the fix is on the tree. **Manual verified-override gate (C-22):** the writer refuses `FBS.executionStatus=verified` unless the caller passes `options.allowVerifiedOverride: true`. `rcf define update` exposes `--acknowledge-verified-override` as the deliberate manual escape (a logged operator decision that skips the post-merge runtime check); `rcf build finalise`'s own updateDocument call passes the flag through so the finalise happy path is unchanged. **Merge-state precondition (C-26):** finalise spawns `git rev-parse --abbrev-ref HEAD` just before the executionStatus write and refuses promotion (exit 4) when the branch is not one of `{main, master}`. `--allow-pre-merge` is the deliberate pre-merge dry-run opt-out; the decision is logged on stdout so the operator sees it. Absent a git checkout the check degrades to a warn line rather than a hard fail. Chain: REQ-165, US-16501 (AC-16501-1 UI-BASELINE-UNMET, AC-16501-2 BROWSER-VERIFICATION-MISSING, AC-16501-3 SCOPE-MISMATCH), US-16502 (AC-16502-1 writer refusal, AC-16502-2 writer opt-out seam, AC-16502-3 merge-state), TAC-4111, TAC-4112, ADR-4111, ADR-4112, TS-202, TS-203. **C-33 and C-38 closed by the rcf-schemas 0.6.3 pin bump follow-up in the Fixed section above:** the manifest write in `src/finalise/ship-without-eval.js` now validates through the schema, and `src/browser-verify/pack-runner.js` emits the check-level `applicable: false` shape 0.6.3 accepts.
|
|
43
|
+
|
|
44
|
+
- **Referee-guarantee train: `rcf audit coverage` is strict-by-default (REQ-164 / US-16401).** The 0.27.0 default is shallow-any and strict is opt-in via `--strict`, so the referee-guarantees docs page's "a stub or stale pointer fails the gate exactly as a missing test does when the displayed command (`rcf audit coverage`) is run" is false against the shipped default. This release flips the default to strict: plain `rcf audit coverage` runs per-AC strict and exits 4 on any gap. The explicit opt-out is `--mode shallow-any` (prints gaps, exits 0) for author-time exploration on a not-yet-shippable chain. The legacy `--strict` flag is a no-op alias for the new default, so every existing invocation stays green: the repo's own CI, every shipped blueprint's `rcf audit coverage --strict` gate (delivery-ci-workflows ADR-702), the getting-started walkthrough, and downstream projects' pipelines. `--mode shallow-any --strict` (or the inverse) is a usage refusal (exit 2) so a scripted invocation cannot silently disagree with itself; `--mode <unknown>` is likewise exit 2. **Migration:** downstream projects that ran the plain `rcf audit coverage` and treated its exit code as passing will see the same tree exit 4; the fix is either to close the coverage gap or to run `rcf audit coverage --mode shallow-any` when the intent is a printed gap report rather than a gate. The repo's own CI dogfood step in `.github/workflows/ci.yml` is updated to the shipped default. Chain: REQ-164, US-16401 (AC-16401-1 strict-by-default, AC-16401-2 shallow-any opt-out, AC-16401-3 conflict refusal), TAC-4110, ADR-4110, TS-201. Closes referee-guarantees docs claims C-11 and C-14 (audit at `reviews/2026-09-15-docs-claims-audit/how-it-works__what-the-referee-guarantees.json`). C-20 (the rcf-lite project's CI runs both ordinary coverage and EVAL coverage in strict mode) is closed alongside: the CI workflow now runs `rcf audit eval coverage --strict` after the coverage step, so the referee-page CI sentence holds by inspection.
|
|
45
|
+
|
|
46
|
+
- **Referee-guarantee train: `rcf define validate` walks ADR supersededBy; relatedAdrs stays a schemas follow-up (REQ-163 / US-16301, compatibility carry).** The 0.27.0 walker's referential-integrity pass checks parent-id fields and FBS / TS / EVAL / CN cross-links but skips the two ADR-schema-declared reference fields, `supersededBy` (single ADR id) and `relatedAdrs` (array of ADR ids). That leaves an honest gap against the referee-guarantees docs promise that every reference in every document resolves: an ADR whose supersededBy names a stem with no file on disk passes validate. `collectBrokenReferences` now walks `supersededBy` under the same `check` helper as every other cross-link, reusing the existing `brokenReference` error shape (`documentId`, `filePath`, `field`, `rule: 'resolveTo:adr'`). `supersededBy` is optional, so an absent or empty field stays silent; a present target must resolve to a loaded ADR of the expected kind. **Compatibility carry (escalation clause on this dispatch):** `relatedAdrs` is intentionally NOT walked. `rcf define blueprint supersede` writes a project ruling ADR whose relatedAdrs lists BOTH the applied blueprint ADR (present on disk) AND the incoming blueprint ADR (not yet on disk: the incoming add is the closing step of the option-3 workflow the conflict message prints). Walking relatedAdrs would refuse that ratified workflow between the supersede write and the re-add. Tightening the soft back-reference is a schemas follow-up (value-narrow to already-applied ADR ids, or a workflow-aware exception on the supersede write path). Chain: REQ-163, US-16301 (AC-16301-1 supersededBy walked, AC-16301-2 relatedAdrs stays silent), TAC-4109, ADR-4109, TS-200. Partial-closes referee-guarantees docs claim C-7 (the strong reference half; the soft-reference half tracked as a schemas follow-up).
|
|
47
|
+
|
|
9
48
|
## [0.27.0] - 2026-09-11
|
|
10
49
|
|
|
11
50
|
rcf-lite 0.27.0 is a shelf-wide hardening release. Every shipped blueprint has been re-verified against the 2026-09-08 authoring criteria: every requirement is backed at the REQ layer, every user story carries a sufficient acceptance-criteria set with disposition and owner references, and chain-consistency lint reports zero on every slug. Shipped prose is now customer-facing throughout: internal workflow labels, operator names, work-item and dispatch identifiers, and long dashes are gone. CI adds a hard register-scan gate and flips the chain-consistency lint gate to hard mode over the monorepo-root shelf. One CLI reliability fix lands alongside: the `rcf audit view` SIGINT handler is now installed before the readiness line is written, closing a race with Node's default signal disposition. Nothing here is breaking.
|
package/README.md
CHANGED
|
@@ -7,6 +7,15 @@
|
|
|
7
7
|
|
|
8
8
|
Build software with an AI coding agent without losing the plot.
|
|
9
9
|
|
|
10
|
+
> **Package name note (0.7.1+).** This tool ships as `rcf-lite` on npm. The retired scoped name `@stravica-ai/rcf-build-lite` was frozen at 0.7.0 in August 2026 and every release from 0.7.1 onwards lives here. If `npm install -g @stravica-ai/rcf-build-lite@<version>` returns "no matching version" for any version above 0.7.0, uninstall the scoped name and install `rcf-lite` at the same version instead:
|
|
11
|
+
>
|
|
12
|
+
> ```sh
|
|
13
|
+
> npm uninstall -g @stravica-ai/rcf-build-lite
|
|
14
|
+
> npm install -g rcf-lite
|
|
15
|
+
> ```
|
|
16
|
+
>
|
|
17
|
+
> The `rcf` and `rcf-verify` bin names are unchanged.
|
|
18
|
+
|
|
10
19
|
Anyone who has shipped with a coding agent knows the failure mode: the code arrives fast, but what the product is supposed to do lives in prompt history, and prompt history is not a spec. Three weeks later nobody can say what is covered, what is tested, or what breaks when something changes.
|
|
11
20
|
|
|
12
21
|
RCF Lite keeps those answers machine-checkable. It maintains a live chain from what you asked for, through requirements, user stories, acceptance criteria and tests, into the code itself, as plain JSON files in your own repository. Your agent works the chain instead of improvising; `rcf define validate` catches drift the moment it happens; and when your app is deployed, `rcf verify` sends an independent verifier at it before anything gets called done.
|
|
@@ -40,6 +49,16 @@ Let's get started.
|
|
|
40
49
|
|
|
41
50
|
If you'd rather drive it by hand, [docs/getting-started.md](docs/getting-started.md) covers the same ground at human pace. Prerequisites, install checks and agent-harness wiring live in [docs/install.md](docs/install.md).
|
|
42
51
|
|
|
52
|
+
## Agent support
|
|
53
|
+
|
|
54
|
+
Claude Code is the supported path today. Codex CLI works end to end for a small app, with three sharp edges to know about before you start:
|
|
55
|
+
|
|
56
|
+
- The `.mcp.json` that `rcf init` writes uses the Claude Code convention, which Codex does not read. To make the RCF MCP entry reachable from Codex, copy it by hand into `~/.codex/config.toml` under `[mcp_servers]`.
|
|
57
|
+
- The chain discipline in `AGENTS.md` holds when nothing pushes on the session. Under user pressure for pace, Codex has been observed to drop the chain and ship code without the intervening `rcf define` calls; keep an eye on `rcf define validate` between turns.
|
|
58
|
+
- `rcf init` does not `git init` the directory, so every `codex exec` and `codex exec resume` needs `--skip-git-repo-check` until you initialise git yourself.
|
|
59
|
+
|
|
60
|
+
Fuller Codex support is on the roadmap; for now the recommended path is Claude Code.
|
|
61
|
+
|
|
43
62
|
## Migrating from the pre-0.7.1 packages
|
|
44
63
|
|
|
45
64
|
If your project pinned one of the pre-consolidation packages, replace it with `rcf-lite`:
|
package/bin/rcf.js
CHANGED
|
@@ -23,6 +23,7 @@ import { main as coverageMain } from '../src/cli/coverage.js';
|
|
|
23
23
|
import { main as createMain } from '../src/cli/create.js';
|
|
24
24
|
import { main as deleteMain } from '../src/cli/delete.js';
|
|
25
25
|
import { main as doctorMain } from '../src/cli/doctor.js';
|
|
26
|
+
import { main as feedbackMain } from '../src/cli/feedback.js';
|
|
26
27
|
import { main as finaliseMain } from '../src/cli/finalise.js';
|
|
27
28
|
import { main as guidanceMain } from '../src/cli/guidance.js';
|
|
28
29
|
import { main as helpMain, TOP_LEVEL_HELP, GROUP_HELP, HELP_MAP } from '../src/cli/help.js';
|
|
@@ -68,6 +69,7 @@ export const CORE = {
|
|
|
68
69
|
guidance: guidanceMain,
|
|
69
70
|
mcp: mcpMain,
|
|
70
71
|
version: versionMain,
|
|
72
|
+
feedback: feedbackMain,
|
|
71
73
|
// help handled inline below (needs group context)
|
|
72
74
|
};
|
|
73
75
|
|
|
@@ -1,5 +1,35 @@
|
|
|
1
1
|
# application-account-settings CHANGELOG
|
|
2
2
|
|
|
3
|
+
## 1.2.7 - 2026-09-12
|
|
4
|
+
|
|
5
|
+
- Register cleanup on branch-added prose: fixture server comment above the server-scoped theme store now names the single-organisation fixture default explicitly; theme-radiogroup notObservableHere reason and detail now say "change-event firing" and "firing a change event" for the browser-only DOM-event half of AC-25108-1, so the register-token grep on the added lines is clean. No probe or fixture behaviour change; blueprint contributions unchanged.
|
|
6
|
+
|
|
7
|
+
## 1.2.6 - 2026-09-12
|
|
8
|
+
|
|
9
|
+
- Positive-evidence row shape tightened in the anatomy helper: a positive row now requires a non-empty engine-returned `requestId` AND (a non-empty `bodyExcerpt` OR a non-empty `derived` object); a `{derived:{}}` alone or a `requestId` alone no longer counts, with two new negative-case tests covering the empty-derived and id-only patterns. Fixture `?break=no-persist` extended to also refuse the server-side POST `/api/theme` with HTTP 507 `THEME_WRITE_REFUSED` and DELETE `/api/theme` with HTTP 507 `THEME_CLEAR_REFUSED`, so the anatomy negative-variant map now drives the theme-radiogroup positive server-scoped-persistence row (AC-25108-1) to fail under `PROBE_BREAK=no-persist` (added to `brokenExpectations`).
|
|
10
|
+
|
|
11
|
+
## 1.2.5 - 2026-09-12
|
|
12
|
+
|
|
13
|
+
- Rule-7d shape fix on the de-claimed conformance rows across shell-tablist (AC-25101-1), profile-form-autocomplete (AC-25102-1) and sessions-surface-shape (both AC-25105-1 branches): each row now carries `anchorAcId: null` and names the anchored AC in the `limitation` field per the shipped shape (a `conformanceOnly:true` row must not simultaneously claim an anchor). theme-radiogroup positive server-scoped-persistence row's detail is corrected to open on AC-25108-1's first eight words verbatim ("When application-spa is in the applied-blueprint set, GET"), and a stale source comment previously stating the aggregate skipped the notObservableHere row is corrected to reflect the shipped aggregate (any warn row lifts the aggregate to warn; the notObservableHere row emits warn honestly). Prior 1.2.4 CHANGELOG note asserted the shipped fixture break switches drive the adapter-uniform aggregate to fail; the shipped anatomy negative-variant map covers profile-form-autocomplete (under `no-autocomplete`) and shell-tablist-per-capability (under `leak-tab`) - the sessions-adapter-uniform probe is not among the mapped fails. That earlier CHANGELOG line is superseded here; the anatomy negative map is unchanged. Fixture README env-var manifest now declares `PROBE_BREAK` (the fixture reads it as an alternate to a per-request `?break=`) and the probe-utils `DECLARED_ENV` list mirrors the addition. Anatomy shape check tightened to reject an anchored `conformanceOnly` row (a positive evidence field no longer bypasses the null-anchor + limitation contract); a new negative-case test constructs an anchored `conformanceOnly` row and asserts the shape helper throws.
|
|
14
|
+
|
|
15
|
+
## 1.2.4 - 2026-09-11
|
|
16
|
+
|
|
17
|
+
- Shared `aggregate()` no longer promotes warn rows to pass: any row with verdict warn (including honest de-claim rows) lifts the aggregate to warn; a probe whose rows are all warn aggregates to warn, not pass. Shared teardown propagates a SIGKILL failure through the returned kill() promise instead of swallowing it. Overclaiming rows across shell-tablist (AC-25101-1), profile-form-autocomplete (AC-25102-1), sessions-surface-shape (AC-25105-1) and theme-radiogroup interaction-half (AC-25108-1) are de-claimed to `conformanceOnly:true` with `verdict:'warn'` and a `limitation` field naming the anchored AC and the browser-only or varied-input clause that lives outside the Node HTTP probe. sessions-adapter-uniform (AC-25106-1) stays as a positive-observation row (three distinct per-provider raw inventories, disjoint device-label sets, per-row column uniformity, ISO lastActive derivation). theme-radiogroup server-scoped persistence row (AC-25108-1 server-observable half) stays positive (POST-then-GET reflects on `<html data-theme>`; DELETE returns to default). Anatomy test extended with a negative-variant assertion that the shipped fixture break switches drive the adapter-uniform aggregate to fail.
|
|
18
|
+
|
|
19
|
+
## 1.2.3 - 2026-09-11
|
|
20
|
+
|
|
21
|
+
- sessions-adapter-uniform now proves the AC-25106-1 uniform-render contract against three DISTINCT per-provider raw inventories. Fixture ships three provider-specific raw payload shapes (clerk uses `session_id`/`ua`/`last_seen_iso`, keycloak uses `sid`/`client`/`lastAccessed` epoch ms, oauth2 uses `tokenSubject`/`deviceLabel`/`issuedAt`) with per-provider adapters that normalise each to a common `id`/`device`/`lastActive` ISO / `current` row. Probe asserts: sizes vary across providers (proves raw payloads are distinct, not one array echoed with a swapped label), device-label sets are pairwise disjoint, the per-row column set is uniform across providers, and every lastActive value is ISO 8601 (keycloak epoch-ms conversion is a derived-output check). sessions-surface-shape now `await`s both fixture teardown calls (teardown failure fails the verdict). theme-radiogroup grows a server-scoped persistence row for the observable half of AC-25108-1: fixture ships `POST /api/theme?theme=X` (writes per principal only when `theme-persistence=server-scoped`), the subsequent GET renders the stored theme on `<html data-theme>` and pre-checks the matching radio, DELETE clears back to default. The interaction-half row is now conformance-only (null anchor + `limitation` naming the browser-only clause) and emits `verdict:'warn'` (never `pass`). Anatomy test extended to enumerate the shipped AC/REQ id set and refuse any row whose anchor is not in it, and to accept the conformance-only row shape.
|
|
22
|
+
|
|
23
|
+
## 1.2.2 - 2026-09-11
|
|
24
|
+
|
|
25
|
+
- sessions-adapter-uniform earlier introduced a `?provider=<clerk|keycloak|oauth2>` query switch and a `<meta data-observed-provider="X">` marker inside `[data-surface="sessions"]`; the earlier probe compared normalised subtrees to a reference for byte equality but the fixture served the same hard-coded rows regardless of provider, so the check was self-consistent rather than adapter-derived (superseded by 1.2.3 above). theme-radiogroup earlier de-claimed the AC-25108-1 interaction half to `notObservableHere`; profile-form-autocomplete's positive-anchor-on-absence broken row was removed; rule 10 applied to every row detail across all five probes; anatomy test extended to accept notObservableHere row shape; register cleanup.
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
## 1.2.1 - 2026-09-11
|
|
29
|
+
|
|
30
|
+
- Added a criterion-e probe pack (`contributions/probes/`) covering 5 properties the fixture engine at `packages/rcf-lite/test/fixtures/probe-pack-application-account-settings/server.js` answers: `shell-tablist-per-capability`, `profile-form-autocomplete`, `sessions-surface-shape`, `sessions-adapter-uniform`, `theme-radiogroup`. Every response now carries an `x-fixture-request-id` header; probes record the id, the HTTP status and a body excerpt as positive evidence per rule 7d. Fixture README declares every env var the pack reads. Anatomy test at `packages/rcf-lite/test/blueprint/application-account-settings-anatomy.test.js` pins the new pack files and asserts each result carries one of the four 7d evidence shapes.
|
|
31
|
+
|
|
32
|
+
|
|
3
33
|
## 1.2.0 (2026-09-10)
|
|
4
34
|
|
|
5
35
|
### Added
|
|
@@ -18,21 +48,20 @@
|
|
|
18
48
|
|
|
19
49
|
- Register: neutral wording in shipped prose (no capability change).
|
|
20
50
|
|
|
21
|
-
## 1.1.0 (2026-09-10
|
|
51
|
+
## 1.1.0 (2026-09-10)
|
|
22
52
|
|
|
23
53
|
### Added
|
|
24
54
|
|
|
25
|
-
- REQ-007 (reauth-window option coverage) and US-25111: never, 5, 15 and 60 each carry a defined runtime clause tied to the applied auth providers session inventory (owner TAC-1003-security-auth-clerk-session-verifier interfaces.sessionInventory), with REAUTH_REQUIRED, REAUTH_STALE and REAUTH_WINDOW_UNKNOWN refusal branches.
|
|
26
|
-
- Failure-path acceptance criteria on US-25101 (unauthenticated /account routes to the forbidden state with sign-in link and no profile data), US-25105 (inventory read failure, terminate write failure, current-session protection).
|
|
55
|
+
- REQ-007 (reauth-window option coverage) and US-25111: never, 5, 15 and 60 each carry a defined runtime clause tied to the applied auth providers session inventory (owner TAC-1003-security-auth-clerk-session-verifier interfaces.sessionInventory), with REAUTH_REQUIRED, REAUTH_STALE and REAUTH_WINDOW_UNKNOWN refusal branches.
|
|
56
|
+
- Failure-path acceptance criteria on US-25101 (unauthenticated /account routes to the forbidden state with sign-in link and no profile data), US-25105 (inventory read failure, terminate write failure, current-session protection).
|
|
27
57
|
|
|
28
58
|
### Changed
|
|
29
59
|
|
|
30
|
-
- sessionInventory prose corrected across README (provider table row and companion paragraph), blueprint.json (custom-auth-provides-session-inventory prompt and suggestedCompanions logging reason), docs/topics.md (topics enumeration and reserved-topic entry), TAC-2604 (responsibilities[0]) and US-25106 (title, prose and AC-25106-1). observability-logging 1.3.0 no longer provides sessionInventory; the owner is security-auth-clerk TAC-1003 interfaces.sessionInventory and equivalent TACs on other auth blueprints. requiresAppliedCapabilities remains [principalDirectory].
|
|
60
|
+
- sessionInventory prose corrected across README (provider table row and companion paragraph), blueprint.json (custom-auth-provides-session-inventory prompt and suggestedCompanions logging reason), docs/topics.md (topics enumeration and reserved-topic entry), TAC-2604 (responsibilities[0]) and US-25106 (title, prose and AC-25106-1). observability-logging 1.3.0 no longer provides sessionInventory; the owner is security-auth-clerk TAC-1003 interfaces.sessionInventory and equivalent TACs on other auth blueprints. requiresAppliedCapabilities remains [principalDirectory].
|
|
31
61
|
- Every REQ now carries a deliveredBy link into TAC-2601, TAC-2603 or TAC-2604.
|
|
32
62
|
- Every AC on every user story now carries an explicit disposition (fixed or template); ACs that observe a session-inventory row carry ownerRef into TAC-1003.
|
|
33
63
|
- TAC-2601 responsibilities extended with renderProfileSurface, renderPreferencesSurface and renderCorrelationId; TAC-2604 extended with reauthWindowGate and sessionInventoryConsumer.
|
|
34
|
-
-
|
|
35
|
-
|
|
64
|
+
- elicit-token coverage tightened on REQ-003 to name `self-service`, `hosted-link-out` and `hosted-embed` literally alongside the branch prose; principalDirectory named literally in REQ-001; template ACs on US-25104, US-25108 and US-25101 carry an `Applying agent sets: <elicit-id>.` clause; anatomy test name at TC-056-shelf-doc-consistency renamed to say observability-logging drops sessionInventory.
|
|
36
65
|
## 1.0.0 (visual round, spec 2026-09-06 section 5.4)
|
|
37
66
|
|
|
38
67
|
- First shipped version. Introduces the account-settings shell (ARIA APG tabs, WCAG 2.4.6 landmark), the profile surface (WCAG 1.3.5 autocomplete tokens, aria-live save-status), the security surface (self-service branch and hosted-UI branch through ADR-2602's elicited security-surface-shape), the sessions surface (ARIA APG dialog-modal terminate flow, aria-live session-terminated announcement, current-session cannot terminate itself), the notification-preferences surface (per-category silence, per-channel opt-in) and the theme surface (light/dark/system radiogroup persisted per ADR-2603's elicited theme-persistence).
|
|
@@ -62,7 +62,7 @@ A project that declares `principalDirectory` (so apply is not refused at the bar
|
|
|
62
62
|
2. Renders the shell WITHOUT a security tab (AC-25101-1, probed by the pack).
|
|
63
63
|
3. Refuses the security surface at load time through TAC-2603 hosted-ui-bridge if a project-side FBS renders `/account/security` regardless (project-side enforcement per AC-25110-1 known mechanism-reach gap, spec section 5.4.1).
|
|
64
64
|
|
|
65
|
-
No `auth managed elsewhere` placeholder ships from the shipped shell surface.
|
|
65
|
+
No `auth managed elsewhere` placeholder ships from the shipped shell surface. The shell never lies about a surface that has no home.
|
|
66
66
|
|
|
67
67
|
## Custom-auth projects (auth outside the shelf)
|
|
68
68
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"slug": "application-account-settings",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.7",
|
|
4
4
|
"category": "application",
|
|
5
5
|
"requiresAppliedCapabilities": {
|
|
6
6
|
"capabilities": [
|
|
@@ -250,5 +250,7 @@
|
|
|
250
250
|
"elicited": true,
|
|
251
251
|
"standardsTraceClause": "WCAG 3.3.4 Error Prevention (Legal, Financial, Data)"
|
|
252
252
|
}
|
|
253
|
-
]
|
|
253
|
+
],
|
|
254
|
+
"updatedAt": "2026-09-12T01:30:44Z",
|
|
255
|
+
"updatedIso": "2026-09-11T22:30:00Z"
|
|
254
256
|
}
|
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"title": "Security surface shape: password vs passkey vs hosted-UI vs link-out per applied auth",
|
|
8
8
|
"context": "The security surface has four legal shapes depending on the applied auth: self-service password (Keycloak, OAuth2 with a self-service endpoint), self-service passkey (WebAuthn where the auth blueprint declares credentialSelfService and the operator has stood up a passkey flow), hosted link-out to a portal (Clerk, Auth0), or hosted embed of the same portal in an iframe. The spec section 5.4 marks security-surface-shape as elicited with no recommended default because the security surface leaks the vendors identity architecture and no default is honest across all four applied-auth combinations.",
|
|
9
9
|
"decision": "security-surface-shape is elicited (enum: self-service | hosted-link-out | hosted-embed). No recommended default. Recording no default is the point: the operator picks the shape that matches the applied auth vendors surface. When the elicit is answered but no applied blueprint declares credentialSelfService (for self-service) or hostedIdentityUi (for the two hosted branches), apply refuses (AC-25110-1). The hosted-embed sandbox default is allow-scripts allow-forms allow-same-origin; a project that needs a different token set writes a project-scoped ADR overriding the sandbox.",
|
|
10
|
-
"consequences": "The operator makes an explicit choice at apply that reads on the sidecar; downstream
|
|
10
|
+
"consequences": "The operator makes an explicit choice at apply that reads on the sidecar; downstream inspection sees a stable record of which security-surface-shape was elicited. A project that mis-answers (elicits hosted-link-out on a Keycloak project) hits the AC-25110-1 refusal at apply, not at runtime.",
|
|
11
11
|
"alternativesConsidered": [
|
|
12
12
|
{
|
|
13
13
|
"name": "Alternative approach considered",
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
// Shared helpers for application-account-settings contributions/probes/.
|
|
2
|
+
//
|
|
3
|
+
// The real engine for every probe in this pack is the fixture HTTP
|
|
4
|
+
// server at packages/rcf-lite/test/fixtures/probe-pack-application-account-settings/server.js
|
|
5
|
+
// booted on a scratch port from the family range 47620-47629.
|
|
6
|
+
// The fixture echoes a per-request x-fixture-request-id header on
|
|
7
|
+
// every response; probes record that id and a response body excerpt
|
|
8
|
+
// as positive evidence per rule 7d.
|
|
9
|
+
//
|
|
10
|
+
// No account credentials or network calls: every probe is
|
|
11
|
+
// local-fixture-driven, so no probe carries an account-bound branch
|
|
12
|
+
// or a CI_HAS_* gate. Declared env vars are the fixture's own
|
|
13
|
+
// PORT and (where the fixture reads them) the CAPS/state switches
|
|
14
|
+
// the probes drive via query string.
|
|
15
|
+
|
|
16
|
+
import { spawn } from 'node:child_process';
|
|
17
|
+
import { mkdir, writeFile } from 'node:fs/promises';
|
|
18
|
+
import { createServer } from 'node:net';
|
|
19
|
+
import { dirname, resolve } from 'node:path';
|
|
20
|
+
import { fileURLToPath } from 'node:url';
|
|
21
|
+
|
|
22
|
+
const HERE = dirname(fileURLToPath(import.meta.url));
|
|
23
|
+
|
|
24
|
+
export const SLUG = 'application-account-settings';
|
|
25
|
+
export const PROJECT_ROOT = resolve(HERE, '..', '..', '..', '..');
|
|
26
|
+
export const FIXTURE_DIR = resolve(PROJECT_ROOT, 'packages/rcf-lite/test/fixtures/probe-pack-application-account-settings');
|
|
27
|
+
export const REPORT_DIR = resolve(PROJECT_ROOT, '.rcf/reports/blueprints/application-account-settings');
|
|
28
|
+
export const PORT_RANGE_START = 47620;
|
|
29
|
+
export const PORT_RANGE_END = 47629;
|
|
30
|
+
export const DECLARED_ENV = Object.freeze(['PORT', 'ACCOUNT_SETTINGS_CAPS', 'ACCOUNT_SETTINGS_APPS', 'ACCOUNT_SETTINGS_SECURITY_SHAPE', 'ACCOUNT_SETTINGS_HOSTED_URL', 'ACCOUNT_SETTINGS_THEME_PERSIST', 'PROBE_BREAK']);
|
|
31
|
+
export const REQUEST_ID_HEADER = 'x-fixture-request-id';
|
|
32
|
+
|
|
33
|
+
// Pick a free port from the fixture family range. Falls back to
|
|
34
|
+
// asking the OS for an ephemeral port only if the whole range is
|
|
35
|
+
// held by other workers (never expected on a single-machine run).
|
|
36
|
+
export async function pickPort() {
|
|
37
|
+
for (let port = PORT_RANGE_START; port <= PORT_RANGE_END; port += 1) {
|
|
38
|
+
if (await canBind(port)) return port;
|
|
39
|
+
}
|
|
40
|
+
return await bindEphemeral();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function canBind(port) {
|
|
44
|
+
return new Promise((res) => {
|
|
45
|
+
const s = createServer();
|
|
46
|
+
s.once('error', () => res(false));
|
|
47
|
+
s.listen(port, '127.0.0.1', () => {
|
|
48
|
+
const bound = s.address();
|
|
49
|
+
s.close(() => res(!!bound));
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
function bindEphemeral() {
|
|
55
|
+
return new Promise((res) => {
|
|
56
|
+
const s = createServer();
|
|
57
|
+
s.listen(0, '127.0.0.1', () => {
|
|
58
|
+
const port = s.address().port;
|
|
59
|
+
s.close(() => res(port));
|
|
60
|
+
});
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Spawns the fixture server as a child on `port` with the given
|
|
65
|
+
// env overlay; resolves once the fixture has printed LISTENING and
|
|
66
|
+
// returns { child, url, kill } (kill is synchronous best-effort).
|
|
67
|
+
export async function startFixture({ port, env = {} } = {}) {
|
|
68
|
+
const boundPort = port ?? await pickPort();
|
|
69
|
+
const child = spawn(process.execPath, ['server.js'], {
|
|
70
|
+
cwd: FIXTURE_DIR,
|
|
71
|
+
env: { ...process.env, PORT: String(boundPort), ...env },
|
|
72
|
+
stdio: ['ignore', 'pipe', 'pipe'],
|
|
73
|
+
});
|
|
74
|
+
await new Promise((res, rej) => {
|
|
75
|
+
const timer = setTimeout(() => rej(new Error(`fixture did not print LISTENING within 4s on port ${boundPort}`)), 4000);
|
|
76
|
+
let stderrBuf = '';
|
|
77
|
+
child.stderr.on('data', (chunk) => { stderrBuf += String(chunk); });
|
|
78
|
+
child.on('exit', (code) => rej(new Error(`fixture exited early (code=${code}) stderr=${stderrBuf.slice(0, 400)}`)));
|
|
79
|
+
child.stdout.on('data', (chunk) => {
|
|
80
|
+
if (String(chunk).includes(`LISTENING ${boundPort}`)) { clearTimeout(timer); res(); }
|
|
81
|
+
});
|
|
82
|
+
});
|
|
83
|
+
const url = new URL(`http://127.0.0.1:${boundPort}`);
|
|
84
|
+
return {
|
|
85
|
+
child,
|
|
86
|
+
url,
|
|
87
|
+
port: boundPort,
|
|
88
|
+
// Await child exit and propagate any error. A teardown failure
|
|
89
|
+
// must fail the verdict (the teardown-propagation rule);
|
|
90
|
+
// no swallowed errors here.
|
|
91
|
+
kill: () => new Promise((res, rej) => {
|
|
92
|
+
let settled = false;
|
|
93
|
+
const done = (err) => { if (settled) return; settled = true; err ? rej(err) : res(); };
|
|
94
|
+
child.once('exit', () => done());
|
|
95
|
+
child.once('error', (err) => done(err));
|
|
96
|
+
try { child.kill('SIGTERM'); } catch (err) { return done(err); }
|
|
97
|
+
setTimeout(() => {
|
|
98
|
+
if (settled) return;
|
|
99
|
+
try { child.kill('SIGKILL'); } catch (err) { return done(err); }
|
|
100
|
+
}, 4000);
|
|
101
|
+
}),
|
|
102
|
+
};
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// Issue an HTTP request against the fixture and return
|
|
106
|
+
// { status, headers, body, requestId }.
|
|
107
|
+
export async function fixtureFetch(url, pathAndQuery, init = {}) {
|
|
108
|
+
const target = new URL(pathAndQuery, url);
|
|
109
|
+
const res = await fetch(target, init);
|
|
110
|
+
const body = await res.text();
|
|
111
|
+
const requestId = res.headers.get(REQUEST_ID_HEADER);
|
|
112
|
+
return { status: res.status, headers: Object.fromEntries(res.headers.entries()), body, requestId };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export function excerpt(body, maxLen = 240) {
|
|
116
|
+
if (typeof body !== 'string') return '';
|
|
117
|
+
return body.length <= maxLen ? body : body.slice(0, maxLen) + '…';
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export function aggregate(results) {
|
|
121
|
+
// Positive-evidence rule: no-checks-ran is a fail.
|
|
122
|
+
if (!Array.isArray(results) || results.length === 0) return 'fail';
|
|
123
|
+
if (results.some((r) => r.verdict === 'fail')) return 'fail';
|
|
124
|
+
// Any warn row lifts the aggregate to warn, including honest
|
|
125
|
+
// notObservableHere de-claims. A probe whose rows are all warn
|
|
126
|
+
// aggregates to warn, not pass; the shelf reads amber and the tally
|
|
127
|
+
// accepts a warn aggregate as problems=0 when no fail row is present.
|
|
128
|
+
if (results.some((r) => r && r.verdict === 'warn')) return 'warn';
|
|
129
|
+
return 'pass';
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export async function writeReport({ probeName, engine, results, extra }) {
|
|
133
|
+
await mkdir(REPORT_DIR, { recursive: true });
|
|
134
|
+
const report = {
|
|
135
|
+
slug: SLUG,
|
|
136
|
+
probeName,
|
|
137
|
+
runAt: new Date().toISOString(),
|
|
138
|
+
engine,
|
|
139
|
+
results,
|
|
140
|
+
aggregateVerdict: aggregate(results),
|
|
141
|
+
...(extra ?? {}),
|
|
142
|
+
};
|
|
143
|
+
const filepath = resolve(REPORT_DIR, `${probeName}.json`);
|
|
144
|
+
await writeFile(filepath, JSON.stringify(report, null, 2) + '\n', 'utf8');
|
|
145
|
+
return { report, path: filepath };
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export async function runShim(probeName, engine, mainFn) {
|
|
149
|
+
try {
|
|
150
|
+
const outcome = (await mainFn()) ?? { results: [] };
|
|
151
|
+
const { results, extra } = outcome;
|
|
152
|
+
const { report, path: filepath } = await writeReport({ probeName, engine, results, extra });
|
|
153
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
154
|
+
process.stdout.write(`report written to ${filepath}\n`);
|
|
155
|
+
if (report.aggregateVerdict === 'fail') process.exitCode = 1;
|
|
156
|
+
} catch (err) {
|
|
157
|
+
// Positive-evidence rule (exception fallback): exception rows have no
|
|
158
|
+
// observed AC; anchor null (never a fabricated id like
|
|
159
|
+
// "unknown"), carry an evidence object with the error excerpt.
|
|
160
|
+
const message = err && err.message ? err.message : String(err);
|
|
161
|
+
const stack = err && err.stack ? err.stack : String(err);
|
|
162
|
+
const results = [{
|
|
163
|
+
anchorAcId: null,
|
|
164
|
+
verdict: 'fail',
|
|
165
|
+
detail: `probe threw: ${message}`,
|
|
166
|
+
evidence: {
|
|
167
|
+
errorMessage: message,
|
|
168
|
+
errorExcerpt: excerpt(stack, 480),
|
|
169
|
+
},
|
|
170
|
+
}];
|
|
171
|
+
const { report, path: filepath } = await writeReport({ probeName, engine, results });
|
|
172
|
+
process.stdout.write(JSON.stringify(report, null, 2) + '\n');
|
|
173
|
+
process.stderr.write(`probe error: ${stack}\n`);
|
|
174
|
+
process.stderr.write(`report written to ${filepath}\n`);
|
|
175
|
+
process.exitCode = 1;
|
|
176
|
+
}
|
|
177
|
+
}
|
package/blueprints/application-account-settings/contributions/probes/profile-form-autocomplete.mjs
ADDED
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
// application-account-settings probe: profile form autocomplete
|
|
2
|
+
// tokens (AC-25102-1). AC-25102-1 requires <form data-surface="profile">
|
|
3
|
+
// with inputs carrying autocomplete tokens "name", "email", "bday",
|
|
4
|
+
// and "country". Derived observation: parse the form's input elements
|
|
5
|
+
// and match each required field to the autocomplete token it carries.
|
|
6
|
+
//
|
|
7
|
+
// A previous revision carried a second row that drove the
|
|
8
|
+
// ?break=no-autocomplete rig and asserted "every autocomplete token
|
|
9
|
+
// is dropped" while positive-anchoring to AC-25102-1. That row is
|
|
10
|
+
// removed: the shipped AC forbids the absence, so pass-on-absence
|
|
11
|
+
// under the positive anchor was a de-claim violation. The negative
|
|
12
|
+
// rig still exists in the fixture for anatomy-test coverage of the
|
|
13
|
+
// break switches; it is not evidence for AC-25102-1.
|
|
14
|
+
|
|
15
|
+
import { fixtureFetch, startFixture, excerpt } from './probe-utils.mjs';
|
|
16
|
+
|
|
17
|
+
export const anchorAcId = 'application-account-settings-AC-25102-1';
|
|
18
|
+
export const accountBound = false;
|
|
19
|
+
|
|
20
|
+
const FIRST_EIGHT = 'GET /account/profile renders a <form data-surface="profile"> with inputs';
|
|
21
|
+
|
|
22
|
+
const REQUIRED = [
|
|
23
|
+
{ field: 'name', autocomplete: 'name' },
|
|
24
|
+
{ field: 'email', autocomplete: 'email' },
|
|
25
|
+
{ field: 'bday', autocomplete: 'bday' },
|
|
26
|
+
{ field: 'country', autocomplete: 'country' },
|
|
27
|
+
];
|
|
28
|
+
|
|
29
|
+
function inputAutocompletes(body) {
|
|
30
|
+
const results = {};
|
|
31
|
+
for (const m of body.matchAll(/<input[^>]*name="([^"]+)"[^>]*>/g)) {
|
|
32
|
+
const attrs = m[0];
|
|
33
|
+
const autoMatch = attrs.match(/autocomplete="([^"]+)"/);
|
|
34
|
+
results[m[1]] = autoMatch ? autoMatch[1] : null;
|
|
35
|
+
}
|
|
36
|
+
return results;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export default async function runProbe() {
|
|
40
|
+
const fixture = await startFixture();
|
|
41
|
+
const results = [];
|
|
42
|
+
try {
|
|
43
|
+
const r = await fixtureFetch(fixture.url, '/account/profile');
|
|
44
|
+
const surfacePresent = /<form data-surface="profile"/.test(r.body);
|
|
45
|
+
const autos = inputAutocompletes(r.body);
|
|
46
|
+
const missing = REQUIRED.filter((req) => autos[req.field] !== req.autocomplete);
|
|
47
|
+
const pass = r.status === 200 && !!r.requestId && surfacePresent && missing.length === 0;
|
|
48
|
+
results.push({
|
|
49
|
+
anchorAcId: null,
|
|
50
|
+
conformanceOnly: true,
|
|
51
|
+
limitation: 'application-account-settings-AC-25102-1: save-action activation and outcome semantics (the AC clause requiring the save action to succeed on a submit and surface a save-success or save-failure state on a subsequent GET) are browser-driven and not observed by this Node HTTP probe; the profile-form autocomplete-token walk is a partial observation of AC-25102-1',
|
|
52
|
+
verdict: pass ? 'warn' : 'fail',
|
|
53
|
+
detail: pass
|
|
54
|
+
? `${FIRST_EIGHT} carrying autocomplete tokens name/email/bday/country: the profile form renders and every required input carries the AC-25102-1 token verbatim; derived autocompletes=${JSON.stringify(autos)}; x-fixture-request-id=${r.requestId}`
|
|
55
|
+
: `${FIRST_EIGHT} autocomplete gap: status=${r.status} rid=${r.requestId} surface=${surfacePresent} autos=${JSON.stringify(autos)} missing=${JSON.stringify(missing)}`,
|
|
56
|
+
evidence: {
|
|
57
|
+
requestId: r.requestId,
|
|
58
|
+
responseStatus: r.status,
|
|
59
|
+
bodyExcerpt: excerpt((r.body.match(/<form data-surface="profile"[^]{0,240}/) || [''])[0]),
|
|
60
|
+
derived: { autos, missing, surfacePresent },
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
} finally {
|
|
64
|
+
await fixture.kill();
|
|
65
|
+
}
|
|
66
|
+
return { results };
|
|
67
|
+
}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import runProbe from './profile-form-autocomplete.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const engine = { kind: 'fixture', image: 'test/fixtures/probe-pack-application-account-settings/server.js', healthy: true };
|
|
5
|
+
runShim('profile-form-autocomplete', engine, runProbe);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import runProbe from './sessions-adapter-uniform.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const engine = { kind: 'fixture', image: 'test/fixtures/probe-pack-application-account-settings/server.js', healthy: true };
|
|
5
|
+
runShim('sessions-adapter-uniform', engine, runProbe);
|
package/blueprints/application-account-settings/contributions/probes/run-sessions-surface-shape.mjs
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import runProbe from './sessions-surface-shape.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const engine = { kind: 'fixture', image: 'test/fixtures/probe-pack-application-account-settings/server.js', healthy: true };
|
|
5
|
+
runShim('sessions-surface-shape', engine, runProbe);
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import runProbe from './shell-tablist-per-capability.mjs';
|
|
2
|
+
import { runShim } from './probe-utils.mjs';
|
|
3
|
+
|
|
4
|
+
const engine = { kind: 'fixture', image: 'test/fixtures/probe-pack-application-account-settings/server.js', healthy: true };
|
|
5
|
+
runShim('shell-tablist-per-capability', engine, runProbe);
|