rcf-lite 0.26.0 → 0.28.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +43 -0
- package/README.md +10 -0
- package/bin/rcf.js +2 -0
- package/blueprints/application-account-settings/CHANGELOG.md +64 -2
- package/blueprints/application-account-settings/README.md +10 -10
- package/blueprints/application-account-settings/blueprint.json +26 -4
- package/blueprints/application-account-settings/contributions/adrs/adr-2601-application-account-settings-capability-vocabulary.json +1 -1
- package/blueprints/application-account-settings/contributions/adrs/adr-2602-application-account-settings-security-surface-shape.json +1 -1
- package/blueprints/application-account-settings/contributions/adrs/adr-2604-application-account-settings-reauth-window.json +5 -5
- 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-account-settings/contributions/requirements/application-account-settings-req-001.json +6 -2
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-002.json +4 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-003.json +7 -3
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-004.json +4 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-005.json +4 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-006.json +6 -2
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-007.json +22 -0
- package/blueprints/application-account-settings/contributions/requirements/application-account-settings-req-009.json +21 -0
- package/blueprints/application-account-settings/contributions/tacs/tac-2601-application-account-settings-shell.json +8 -4
- package/blueprints/application-account-settings/contributions/tacs/tac-2602-application-account-settings-capability-discovery.json +3 -3
- package/blueprints/application-account-settings/contributions/tacs/tac-2604-application-account-settings-session-store.json +13 -7
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25101.json +19 -3
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25102.json +27 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25103.json +13 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25104.json +23 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25105.json +51 -3
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25106.json +25 -6
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25107.json +13 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25108.json +27 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25109.json +4 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25110.json +13 -2
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25111.json +71 -0
- package/blueprints/application-account-settings/contributions/user-stories/application-account-settings-us-25112.json +77 -0
- package/blueprints/application-account-settings/docs/topics.md +4 -4
- package/blueprints/application-account-settings/guide/application-account-settings.md +1 -1
- package/blueprints/application-account-settings/probe-packs/application-account-settings.pack.mjs +2 -2
- package/blueprints/application-admin-console/CHANGELOG.md +69 -7
- package/blueprints/application-admin-console/README.md +4 -4
- package/blueprints/application-admin-console/blueprint.json +34 -2
- package/blueprints/application-admin-console/contributions/adrs/adr-2201-application-admin-console-capability-vocabulary.json +2 -2
- package/blueprints/application-admin-console/contributions/adrs/adr-2203-application-admin-console-invite-transport.json +5 -5
- package/blueprints/application-admin-console/contributions/adrs/adr-2204-application-admin-console-audit-retention.json +7 -7
- package/blueprints/application-admin-console/contributions/adrs/adr-2214-application-admin-console-consume-zero-trust-gate.json +3 -3
- 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-admin-console/contributions/requirements/application-admin-console-req-001.json +4 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-002.json +5 -1
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-003.json +4 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-004.json +4 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-005.json +6 -2
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-006.json +4 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-007.json +22 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-008.json +22 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-009.json +21 -0
- package/blueprints/application-admin-console/contributions/requirements/application-admin-console-req-014.json +6 -2
- package/blueprints/application-admin-console/contributions/tacs/tac-2201-application-admin-console-shell.json +9 -7
- package/blueprints/application-admin-console/contributions/tacs/tac-2202-application-admin-console-capability-discovery.json +6 -6
- package/blueprints/application-admin-console/contributions/tacs/tac-2204-application-admin-console-audit-view.json +1 -1
- package/blueprints/application-admin-console/contributions/tacs/tac-2214-application-admin-console-access-gated-signin-surface.json +5 -5
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21101.json +4 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21102.json +4 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21103.json +10 -4
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21104.json +13 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21105.json +15 -3
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21106.json +35 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21107.json +22 -3
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21108.json +4 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21109.json +4 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21110.json +68 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21111.json +76 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21112.json +77 -0
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21815.json +21 -2
- package/blueprints/application-admin-console/contributions/user-stories/application-admin-console-us-21816.json +21 -2
- package/blueprints/application-admin-console/guide/application-admin-console.md +3 -3
- package/blueprints/application-admin-console/probe-packs/application-admin-console.pack.mjs +2 -2
- package/blueprints/application-api-rest/CHANGELOG.md +34 -0
- package/blueprints/application-api-rest/README.md +3 -3
- package/blueprints/application-api-rest/assets/samples/request-response-pairs.md +2 -0
- package/blueprints/application-api-rest/blueprint.json +3 -2
- package/blueprints/application-api-rest/contributions/adrs/adr-301-application-api-rest-error-envelope.json +1 -1
- package/blueprints/application-api-rest/contributions/adrs/adr-302-application-api-rest-auth-model.json +2 -2
- package/blueprints/application-api-rest/contributions/adrs/adr-303-application-api-rest-api-versioning.json +1 -1
- package/blueprints/application-api-rest/contributions/adrs/adr-304-application-api-rest-logging.json +1 -1
- package/blueprints/application-api-rest/contributions/adrs/adr-305-application-api-rest-pagination.json +1 -1
- package/blueprints/application-api-rest/contributions/adrs/adr-306-application-api-rest-idempotency.json +3 -3
- package/blueprints/application-api-rest/contributions/adrs/adr-307-application-api-rest-openapi-generation.json +1 -1
- package/blueprints/application-api-rest/contributions/adrs/adr-308-application-api-rest-rate-limiting.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/contributions/requirements/application-api-rest-req-001.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-002.json +7 -3
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-003.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-004.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-005.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-006.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-007.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-008.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-009.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-010.json +8 -4
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-011.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-012.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-013.json +7 -3
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-014.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-015.json +6 -2
- package/blueprints/application-api-rest/contributions/requirements/application-api-rest-req-016.json +6 -2
- package/blueprints/application-api-rest/contributions/tacs/tac-301-application-api-rest-request-pipeline.json +1 -1
- package/blueprints/application-api-rest/contributions/tacs/tac-302-application-api-rest-auth-middleware.json +1 -1
- package/blueprints/application-api-rest/contributions/tacs/tac-303-application-api-rest-contract-surface.json +2 -2
- package/blueprints/application-api-rest/contributions/tacs/tac-304-application-api-rest-resource-layer.json +1 -1
- package/blueprints/application-api-rest/contributions/tacs/tac-305-application-api-rest-observability.json +1 -1
- package/blueprints/application-api-rest/contributions/tacs/tac-306-application-api-rest-operability.json +1 -1
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2101.json +13 -7
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2102.json +27 -13
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2103.json +18 -9
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2104.json +32 -10
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2105.json +19 -6
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2106.json +14 -8
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2107.json +20 -12
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2108.json +37 -15
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2109.json +15 -9
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2110.json +21 -11
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2111.json +42 -8
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2112.json +23 -13
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2113.json +17 -11
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2114.json +13 -8
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2115.json +13 -8
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2116.json +11 -6
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2117.json +19 -14
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2118.json +20 -10
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2119.json +20 -7
- package/blueprints/application-api-rest/contributions/user-stories/application-api-rest-us-2120.json +16 -10
- package/blueprints/application-api-rest/docs/topics.md +1 -1
- package/blueprints/application-charts/CHANGELOG.md +53 -6
- package/blueprints/application-charts/README.md +10 -10
- package/blueprints/application-charts/blueprint.json +115 -19
- package/blueprints/application-charts/contributions/adrs/adr-1901-application-charts-engine-choice.json +2 -2
- package/blueprints/application-charts/contributions/adrs/adr-1902-application-charts-accessible-palette.json +1 -1
- package/blueprints/application-charts/contributions/adrs/adr-1903-application-charts-motion.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 +11 -4
- package/blueprints/application-charts/contributions/requirements/application-charts-req-002.json +11 -4
- package/blueprints/application-charts/contributions/requirements/application-charts-req-003.json +10 -3
- package/blueprints/application-charts/contributions/requirements/application-charts-req-004.json +10 -3
- package/blueprints/application-charts/contributions/tacs/tac-1901-application-charts-render-shell.json +3 -2
- package/blueprints/application-charts/contributions/tacs/tac-1902-application-charts-keyboard-traversal.json +1 -1
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18101.json +52 -8
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18102.json +58 -6
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18103.json +54 -6
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18104.json +55 -6
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18105.json +64 -8
- package/blueprints/application-charts/contributions/user-stories/application-charts-us-18106.json +45 -7
- package/blueprints/application-charts/docs/topics.md +2 -2
- package/blueprints/application-charts/guide/application-charts.md +3 -3
- package/blueprints/application-charts/probe-packs/application-charts.pack.mjs +2 -2
- package/blueprints/application-dashboard/CHANGELOG.md +39 -8
- package/blueprints/application-dashboard/README.md +13 -13
- package/blueprints/application-dashboard/assets/guidance/dashboard-design.md +2 -2
- package/blueprints/application-dashboard/blueprint.json +149 -22
- package/blueprints/application-dashboard/contributions/adrs/adr-2001-application-dashboard-primary-kpi-enum.json +4 -4
- package/blueprints/application-dashboard/contributions/adrs/adr-2002-application-dashboard-timeframe-presets.json +2 -2
- package/blueprints/application-dashboard/contributions/adrs/adr-2003-application-dashboard-export-formats.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-001.json +10 -3
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-002.json +11 -4
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-003.json +11 -4
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-004.json +11 -4
- package/blueprints/application-dashboard/contributions/requirements/application-dashboard-req-005.json +11 -4
- package/blueprints/application-dashboard/contributions/tacs/tac-2001-application-dashboard-tile-grid.json +1 -1
- package/blueprints/application-dashboard/contributions/tacs/tac-2002-application-dashboard-filter-chrome.json +2 -2
- package/blueprints/application-dashboard/contributions/tacs/tac-2003-application-dashboard-export-handle.json +3 -3
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19101.json +55 -7
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19102.json +56 -8
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19103.json +59 -7
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19104.json +55 -7
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19105.json +55 -7
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19106.json +60 -8
- package/blueprints/application-dashboard/contributions/user-stories/application-dashboard-us-19107.json +57 -9
- package/blueprints/application-dashboard/docs/topics.md +3 -3
- package/blueprints/application-dashboard/guide/application-dashboard.md +5 -5
- package/blueprints/application-dashboard/probe-packs/application-dashboard.pack.mjs +4 -4
- package/blueprints/application-datatable/CHANGELOG.md +36 -5
- package/blueprints/application-datatable/README.md +4 -4
- package/blueprints/application-datatable/blueprint.json +169 -26
- package/blueprints/application-datatable/contributions/adrs/adr-1801-application-datatable-pattern-choice.json +1 -1
- package/blueprints/application-datatable/contributions/adrs/adr-1802-application-datatable-url-state.json +1 -1
- package/blueprints/application-datatable/contributions/adrs/adr-1803-application-datatable-page-size.json +1 -1
- package/blueprints/application-datatable/contributions/adrs/adr-1804-application-datatable-selection-persistence.json +1 -1
- 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-001.json +11 -4
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-002.json +11 -4
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-003.json +10 -3
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-004.json +11 -4
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-005.json +10 -3
- package/blueprints/application-datatable/contributions/requirements/application-datatable-req-006.json +11 -4
- package/blueprints/application-datatable/contributions/tacs/tac-1801-application-datatable-shell.json +1 -1
- package/blueprints/application-datatable/contributions/tacs/tac-1802-application-datatable-query-adapter.json +1 -1
- package/blueprints/application-datatable/contributions/tacs/tac-1803-application-datatable-selection-model.json +2 -2
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17101.json +29 -7
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17102.json +29 -7
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17103.json +28 -6
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17104.json +65 -7
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17105.json +32 -7
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17106.json +60 -7
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17107.json +72 -7
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17108.json +59 -9
- package/blueprints/application-datatable/contributions/user-stories/application-datatable-us-17109.json +58 -9
- package/blueprints/application-datatable/docs/topics.md +1 -1
- package/blueprints/application-datatable/guide/application-datatable.md +1 -1
- package/blueprints/application-empty-error-states/CHANGELOG.md +64 -4
- package/blueprints/application-empty-error-states/README.md +3 -3
- package/blueprints/application-empty-error-states/blueprint.json +38 -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-empty-error-states/contributions/requirements/application-empty-error-states-req-001.json +4 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-002.json +7 -3
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-003.json +4 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-004.json +6 -2
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-005.json +7 -3
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-006.json +21 -0
- package/blueprints/application-empty-error-states/contributions/requirements/application-empty-error-states-req-007.json +21 -0
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2301-application-empty-error-states-state-machine.json +7 -4
- package/blueprints/application-empty-error-states/contributions/tacs/tac-2303-application-empty-error-states-offline-buffer.json +3 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22101.json +17 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22102.json +31 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22103.json +27 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22104.json +13 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22105.json +33 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22106.json +13 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22107.json +23 -2
- package/blueprints/application-empty-error-states/contributions/user-stories/application-empty-error-states-us-22108.json +27 -2
- package/blueprints/application-empty-error-states/probe-packs/application-empty-error-states.pack.mjs +93 -9
- package/blueprints/application-error-handling/CHANGELOG.md +56 -0
- package/blueprints/application-error-handling/blueprint.json +106 -20
- package/blueprints/application-error-handling/contributions/adrs/adr-1701-application-error-handling-record-shape.json +1 -1
- package/blueprints/application-error-handling/contributions/adrs/adr-1702-application-error-handling-classification-vocabulary.json +1 -1
- package/blueprints/application-error-handling/contributions/adrs/adr-1703-application-error-handling-transport-mapping.json +1 -1
- 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-error-handling/contributions/requirements/application-error-handling-req-001.json +10 -3
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-002.json +10 -3
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-003.json +10 -3
- package/blueprints/application-error-handling/contributions/requirements/application-error-handling-req-004.json +10 -3
- package/blueprints/application-error-handling/contributions/tacs/tac-1701-application-error-handling-boundary.json +1 -1
- package/blueprints/application-error-handling/contributions/tacs/tac-1702-application-error-handling-record-factory.json +1 -1
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16101.json +63 -4
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16102.json +49 -4
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16103.json +51 -5
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16104.json +49 -4
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16105.json +49 -4
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16106.json +49 -4
- package/blueprints/application-error-handling/contributions/user-stories/application-error-handling-us-16107.json +53 -4
- package/blueprints/application-file-upload/CHANGELOG.md +60 -5
- package/blueprints/application-file-upload/README.md +1 -1
- package/blueprints/application-file-upload/blueprint.json +58 -2
- package/blueprints/application-file-upload/contributions/adrs/adr-2402-application-file-upload-accepted-set.json +3 -3
- 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 +5 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-002.json +8 -4
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-003.json +7 -3
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-004.json +7 -3
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-005.json +5 -1
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-006.json +21 -0
- package/blueprints/application-file-upload/contributions/requirements/application-file-upload-req-007.json +21 -0
- package/blueprints/application-file-upload/contributions/tacs/tac-2401-application-file-upload-input.json +4 -2
- package/blueprints/application-file-upload/contributions/tacs/tac-2402-application-file-upload-transport.json +7 -2
- package/blueprints/application-file-upload/contributions/tacs/tac-2403-application-file-upload-progress-announcer.json +16 -6
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23101.json +23 -2
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23102.json +29 -4
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23103.json +13 -2
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23104.json +45 -2
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23105.json +37 -2
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23106.json +13 -2
- package/blueprints/application-file-upload/contributions/user-stories/application-file-upload-us-23107.json +17 -2
- package/blueprints/application-file-upload/probe-packs/application-file-upload.pack.mjs +14 -5
- package/blueprints/application-forms-wizard/CHANGELOG.md +50 -5
- package/blueprints/application-forms-wizard/README.md +3 -3
- package/blueprints/application-forms-wizard/blueprint.json +59 -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 +5 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-002.json +7 -3
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-003.json +7 -3
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-004.json +7 -3
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-005.json +5 -1
- package/blueprints/application-forms-wizard/contributions/requirements/application-forms-wizard-req-006.json +21 -0
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2501-application-forms-wizard-task-list.json +6 -4
- package/blueprints/application-forms-wizard/contributions/tacs/tac-2502-application-forms-wizard-error-summary.json +4 -3
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24101.json +35 -2
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24102.json +27 -2
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24103.json +21 -2
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24104.json +13 -2
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24105.json +33 -2
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24106.json +18 -3
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24107.json +23 -2
- package/blueprints/application-forms-wizard/contributions/user-stories/application-forms-wizard-us-24108.json +13 -2
- package/blueprints/application-forms-wizard/probe-packs/application-forms-wizard.pack.mjs +3 -3
- package/blueprints/application-notifications-in-app/CHANGELOG.md +70 -5
- package/blueprints/application-notifications-in-app/README.md +9 -9
- package/blueprints/application-notifications-in-app/blueprint.json +153 -23
- 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/requirements/application-notifications-in-app-req-001.json +11 -4
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-002.json +8 -1
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-003.json +10 -3
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-004.json +11 -4
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-005.json +12 -5
- package/blueprints/application-notifications-in-app/contributions/requirements/application-notifications-in-app-req-006.json +21 -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 +15 -9
- package/blueprints/application-notifications-in-app/contributions/tacs/tac-2103-application-notifications-in-app-preferences.json +2 -2
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20101.json +30 -6
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20102.json +44 -6
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20103.json +40 -6
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20104.json +31 -5
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20105.json +51 -9
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20106.json +19 -4
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20107.json +19 -4
- package/blueprints/application-notifications-in-app/contributions/user-stories/application-notifications-in-app-us-20108.json +19 -4
- package/blueprints/application-notifications-in-app/guide/application-notifications-in-app.md +4 -4
- package/blueprints/application-notifications-in-app/probe-packs/application-notifications-in-app.pack.mjs +4 -4
- package/blueprints/application-onboarding-tour/CHANGELOG.md +59 -2
- package/blueprints/application-onboarding-tour/README.md +3 -3
- package/blueprints/application-onboarding-tour/blueprint.json +24 -2
- package/blueprints/application-onboarding-tour/contributions/adrs/adr-2702-application-onboarding-tour-completion-store-shape.json +4 -4
- 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-onboarding-tour/contributions/requirements/application-onboarding-tour-req-001.json +6 -2
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-002.json +6 -2
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-003.json +4 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-004.json +4 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-005.json +22 -0
- package/blueprints/application-onboarding-tour/contributions/requirements/application-onboarding-tour-req-006.json +22 -0
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2702-application-onboarding-tour-checklist-slot.json +2 -1
- package/blueprints/application-onboarding-tour/contributions/tacs/tac-2703-application-onboarding-tour-completion-store.json +7 -7
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26101.json +67 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26102.json +35 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26103.json +13 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26104.json +33 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26105.json +13 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26106.json +13 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26107.json +17 -2
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26108.json +62 -0
- package/blueprints/application-onboarding-tour/contributions/user-stories/application-onboarding-tour-us-26109.json +72 -0
- package/blueprints/application-onboarding-tour/docs/topics.md +2 -2
- package/blueprints/application-onboarding-tour/guide/application-onboarding-tour.md +1 -1
- package/blueprints/application-onboarding-tour/probe-packs/application-onboarding-tour.pack.mjs +2 -2
- package/blueprints/application-spa/CHANGELOG.md +39 -0
- package/blueprints/application-spa/README.md +11 -12
- package/blueprints/application-spa/blueprint.json +3 -2
- package/blueprints/application-spa/contributions/adrs/adr-201-application-spa-routing.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-202-application-spa-theming.json +2 -2
- package/blueprints/application-spa/contributions/adrs/adr-203-application-spa-client-state.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-204-application-spa-error-envelope.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-205-application-spa-auth-model.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-206-application-spa-iconography.json +2 -2
- package/blueprints/application-spa/contributions/adrs/adr-207-application-spa-motion.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-208-application-spa-i18n.json +1 -1
- package/blueprints/application-spa/contributions/adrs/adr-209-application-spa-telemetry-naming.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/requirements/application-spa-req-001.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-002.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-003.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-004.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-005.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-006.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-007.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-008.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-009.json +7 -3
- package/blueprints/application-spa/contributions/requirements/application-spa-req-010.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-011.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-012.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-013.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-014.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-015.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-016.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-017.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-018.json +7 -3
- package/blueprints/application-spa/contributions/requirements/application-spa-req-019.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-020.json +6 -2
- package/blueprints/application-spa/contributions/requirements/application-spa-req-021.json +6 -2
- package/blueprints/application-spa/contributions/tacs/tac-201-application-spa-app-shell.json +4 -3
- package/blueprints/application-spa/contributions/tacs/tac-202-application-spa-theme-system.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-203-application-spa-component-library.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-204-application-spa-client-data-layer.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-205-application-spa-forms-engine.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-206-application-spa-telemetry.json +1 -1
- package/blueprints/application-spa/contributions/tacs/tac-207-application-spa-token-adherence-probe.json +2 -2
- package/blueprints/application-spa/contributions/tacs/tac-208-application-spa-icon-adherence-probe.json +3 -3
- package/blueprints/application-spa/contributions/tacs/tac-209-application-spa-csp-styled-adherence-probe.json +4 -4
- package/blueprints/application-spa/contributions/tacs/tac-210-application-spa-external-dependency-provisioning-probe.json +3 -3
- package/blueprints/application-spa/contributions/tacs/tac-211-application-spa-core-flow-e2e-probe.json +3 -3
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1101.json +22 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1102.json +18 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1103.json +13 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1104.json +15 -10
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1105.json +13 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1106.json +12 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1107.json +25 -6
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1108.json +17 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1109.json +17 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1110.json +19 -10
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1111.json +19 -11
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1112.json +15 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1113.json +15 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1114.json +15 -10
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1115.json +13 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1116.json +15 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1117.json +20 -10
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1118.json +9 -5
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1119.json +11 -6
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1120.json +16 -10
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1121.json +13 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1122.json +13 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1123.json +28 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1124.json +11 -6
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1125.json +14 -8
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1126.json +24 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1127.json +11 -6
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1128.json +11 -7
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1129.json +25 -5
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1130.json +25 -5
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1131.json +19 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1132.json +40 -10
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1133.json +35 -9
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1134.json +23 -3
- package/blueprints/application-spa/contributions/user-stories/application-spa-us-1135.json +19 -3
- package/blueprints/application-spa/docs/topics.md +1 -1
- package/blueprints/application-spa/guide/application-spa.md +2 -2
- package/blueprints/delivery-ci-workflows/CHANGELOG.md +40 -2
- package/blueprints/delivery-ci-workflows/README.md +4 -4
- package/blueprints/delivery-ci-workflows/blueprint.json +64 -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-001.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-002.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-003.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-004.json +5 -1
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-005.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-006.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-007.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-008.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-009.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-010.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-011.json +6 -2
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-012.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-013.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-014.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-015.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-016.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-017.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-018.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-019.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-020.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-021.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-022.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/requirements/delivery-ci-workflows-req-023.json +4 -0
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6101.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6102.json +19 -3
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6103.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6104.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6105.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6106.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6107.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6108.json +20 -4
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6109.json +12 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6110.json +21 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6111.json +21 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6112.json +35 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6113.json +21 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6114.json +8 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6115.json +21 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6116.json +19 -3
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6117.json +19 -3
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6118.json +21 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6119.json +19 -3
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6120.json +19 -3
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6121.json +23 -6
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6122.json +24 -7
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6123.json +21 -5
- package/blueprints/delivery-ci-workflows/contributions/user-stories/delivery-ci-workflows-us-6124.json +19 -3
- package/blueprints/delivery-ci-workflows/docs/topics.md +2 -3
- package/blueprints/deploy-cloudflare-workers/CHANGELOG.md +19 -4
- package/blueprints/deploy-cloudflare-workers/README.md +5 -5
- package/blueprints/deploy-cloudflare-workers/blueprint.json +4 -4
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1303-deploy-cloudflare-workers-preview-vs-production.json +1 -1
- package/blueprints/deploy-cloudflare-workers/contributions/adrs/adr-1306-deploy-cloudflare-workers-spa-shape.json +4 -4
- package/blueprints/deploy-cloudflare-workers/contributions/probes/assets-manifest-scan.mjs +25 -7
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-001.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-002.json +6 -2
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-003.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-004.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-005.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-006.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-007.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-008.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-009.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-010.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-011.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-012.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-013.json +5 -1
- package/blueprints/deploy-cloudflare-workers/contributions/requirements/deploy-cloudflare-workers-req-014.json +7 -3
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1301-deploy-cloudflare-workers-deploy-adapter.json +3 -2
- package/blueprints/deploy-cloudflare-workers/contributions/tacs/tac-1302-deploy-cloudflare-workers-wrangler-manifest.json +5 -2
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12101.json +21 -9
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12102.json +23 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12103.json +7 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12104.json +7 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12105.json +11 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12106.json +7 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12107.json +7 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12108.json +15 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12109.json +11 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12110.json +7 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12111.json +11 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12112.json +11 -4
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12113.json +41 -3
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12114.json +17 -2
- package/blueprints/deploy-cloudflare-workers/contributions/user-stories/deploy-cloudflare-workers-us-12115.json +18 -3
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +2 -2
- package/blueprints/deploy-cloudflare-workers/guide/deploy-cloudflare-workers.md +7 -2
- package/blueprints/deploy-hetzner-server/CHANGELOG.md +115 -8
- package/blueprints/deploy-hetzner-server/README.md +12 -12
- package/blueprints/deploy-hetzner-server/blueprint.json +8 -7
- package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3801-deploy-hetzner-server-cloud-host-contract.json +2 -2
- package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json +2 -2
- 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/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-001.json +6 -2
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-002.json +6 -2
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-003.json +5 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-004.json +5 -1
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-005.json +6 -2
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-006.json +5 -1
- package/blueprints/deploy-hetzner-server/contributions/schemas/hetzner-server.schema.json +1 -1
- package/blueprints/deploy-hetzner-server/contributions/templates/cloud-init.yaml.tmpl +1 -1
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37101.json +63 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37102.json +35 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37103.json +59 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37104.json +31 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37105.json +25 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37106.json +35 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37107.json +31 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37108.json +43 -2
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37109.json +31 -2
- package/blueprints/deploy-hetzner-server/docs/topics.md +2 -2
- package/blueprints/deploy-hetzner-server/guide/deploy-hetzner-server.md +12 -11
- package/blueprints/edge-cloudflare-access/CHANGELOG.md +36 -3
- package/blueprints/edge-cloudflare-access/README.md +2 -2
- package/blueprints/edge-cloudflare-access/blueprint.json +12 -2
- package/blueprints/edge-cloudflare-access/contributions/probes/admin-console-gate-surface.mjs +9 -1
- package/blueprints/edge-cloudflare-access/contributions/probes/real-account-gated-url.mjs +10 -2
- package/blueprints/edge-cloudflare-access/contributions/probes/wrangler-seam.mjs +1 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-001.json +5 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-002.json +5 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-003.json +5 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-004.json +6 -2
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-005.json +5 -1
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-006.json +7 -3
- package/blueprints/edge-cloudflare-access/contributions/requirements/edge-cloudflare-access-req-007.json +22 -0
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34101.json +13 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34102.json +63 -2
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34103.json +18 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34104.json +36 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34105.json +13 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34106.json +9 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34107.json +68 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34108.json +5 -3
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34109.json +10 -4
- package/blueprints/edge-cloudflare-access/contributions/user-stories/edge-cloudflare-access-us-34110.json +33 -0
- package/blueprints/edge-cloudflare-access/docs/topics.md +2 -2
- package/blueprints/edge-cloudflare-rate-limiting/CHANGELOG.md +33 -2
- package/blueprints/edge-cloudflare-rate-limiting/README.md +3 -3
- package/blueprints/edge-cloudflare-rate-limiting/blueprint.json +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/probes/real-account-burst-and-429.mjs +10 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-001.json +6 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-002.json +5 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-003.json +5 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-004.json +6 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/requirements/edge-cloudflare-rate-limiting-req-005.json +5 -1
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3701-edge-cloudflare-rate-limiting-manifest-schema.json +2 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/tacs/tac-3703-edge-cloudflare-rate-limiting-drift-audit-runner.json +2 -2
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36101.json +27 -3
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36102.json +9 -3
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36103.json +24 -5
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36104.json +88 -3
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36105.json +5 -3
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36106.json +22 -3
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36107.json +16 -5
- package/blueprints/edge-cloudflare-rate-limiting/contributions/user-stories/edge-cloudflare-rate-limiting-us-36108.json +14 -3
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-rate-limiting/guide/edge-cloudflare-rate-limiting.md +2 -2
- package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +40 -7
- package/blueprints/edge-cloudflare-tunnel/README.md +21 -23
- package/blueprints/edge-cloudflare-tunnel/blueprint.json +29 -4
- package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4001-edge-cloudflare-tunnel-ingress-bridge-contract.json +4 -4
- package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4002-edge-cloudflare-tunnel-connector-runtime.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/manifest-schema-validate.mjs +3 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/probe-utils.mjs +13 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-connector-healthy.mjs +8 -9
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-tunnel-hostname-routes.mjs +2 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-001.json +6 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-002.json +5 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-003.json +7 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-004.json +5 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-005.json +5 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-006.json +22 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-007.json +22 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +1 -1
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4004-edge-cloudflare-tunnel-zone-and-hostname-apply.json +29 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39101.json +39 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39102.json +23 -4
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39103.json +53 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39104.json +33 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39105.json +25 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39106.json +86 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39107.json +25 -3
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39108.json +35 -2
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39109.json +74 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39110.json +60 -0
- package/blueprints/edge-cloudflare-tunnel/docs/topics.md +2 -2
- package/blueprints/edge-cloudflare-tunnel/guide/edge-cloudflare-tunnel.md +60 -13
- package/blueprints/edge-cloudflare-turnstile/CHANGELOG.md +32 -1
- package/blueprints/edge-cloudflare-turnstile/README.md +2 -2
- package/blueprints/edge-cloudflare-turnstile/blueprint.json +1 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-001.json +6 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-002.json +5 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-003.json +6 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-004.json +5 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/requirements/edge-cloudflare-turnstile-req-005.json +5 -1
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3601-edge-cloudflare-turnstile-widget-mount.json +2 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/tacs/tac-3602-edge-cloudflare-turnstile-server-verifier.json +2 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35101.json +46 -5
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35102.json +53 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35103.json +81 -2
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35104.json +29 -6
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35105.json +14 -4
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35106.json +9 -3
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35107.json +5 -3
- package/blueprints/edge-cloudflare-turnstile/contributions/user-stories/edge-cloudflare-turnstile-us-35108.json +5 -3
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +1 -1
- package/blueprints/edge-cloudflare-turnstile/probe-packs/edge-cloudflare-turnstile.pack.mjs +27 -5
- package/blueprints/email-smtp-resend/CHANGELOG.md +40 -0
- package/blueprints/email-smtp-resend/README.md +4 -4
- package/blueprints/email-smtp-resend/assets/stub-adapter.md +2 -0
- package/blueprints/email-smtp-resend/blueprint.json +121 -18
- 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/contributions/requirements/email-smtp-resend-req-001.json +7 -3
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-002.json +4 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-003.json +4 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-004.json +4 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-005.json +4 -0
- package/blueprints/email-smtp-resend/contributions/requirements/email-smtp-resend-req-006.json +4 -0
- package/blueprints/email-smtp-resend/contributions/tacs/tac-401-email-smtp-resend-send-adapter.json +3 -3
- package/blueprints/email-smtp-resend/contributions/tacs/tac-402-email-smtp-resend-webhook-verifier.json +7 -2
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4101.json +15 -8
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4102.json +27 -7
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4103.json +49 -4
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4104.json +6 -3
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4105.json +21 -5
- package/blueprints/email-smtp-resend/contributions/user-stories/email-smtp-resend-us-4106.json +27 -7
- package/blueprints/email-smtp-resend/docs/topics.md +2 -3
- package/blueprints/email-smtp-resend/guide/email-smtp-resend.md +2 -2
- package/blueprints/jobs-background/CHANGELOG.md +91 -6
- package/blueprints/jobs-background/README.md +8 -8
- package/blueprints/jobs-background/blueprint.json +57 -3
- package/blueprints/jobs-background/contributions/adrs/adr-3102-jobs-background-scheduler-mode.json +1 -1
- package/blueprints/jobs-background/contributions/adrs/adr-3103-jobs-background-requires-applied-capabilities.json +6 -6
- 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 +14 -6
- 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/contributions/requirements/jobs-background-req-001.json +7 -3
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-002.json +7 -3
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-003.json +5 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-004.json +5 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-005.json +5 -1
- package/blueprints/jobs-background/contributions/requirements/jobs-background-req-006.json +5 -1
- package/blueprints/jobs-background/contributions/tacs/tac-3101-jobs-background-job-definition.json +5 -5
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30101.json +20 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30102.json +44 -9
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30103.json +48 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30104.json +63 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30105.json +20 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30106.json +20 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30107.json +20 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30108.json +21 -3
- package/blueprints/jobs-background/contributions/user-stories/jobs-background-us-30109.json +23 -6
- package/blueprints/jobs-background/docs/topics.md +3 -3
- package/blueprints/jobs-background/guide/jobs-background.md +6 -6
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +41 -19
- package/blueprints/messaging-queue-cloudflare/README.md +14 -14
- package/blueprints/messaging-queue-cloudflare/blueprint.json +127 -19
- package/blueprints/messaging-queue-cloudflare/contributions/adrs/adr-3001-messaging-queue-cloudflare-adapter.json +3 -3
- 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 +183 -15
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-001.json +6 -2
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-002.json +6 -2
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-003.json +5 -1
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-004.json +6 -2
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-005.json +6 -2
- package/blueprints/messaging-queue-cloudflare/contributions/requirements/messaging-queue-cloudflare-req-006.json +6 -2
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29101.json +22 -4
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29102.json +23 -4
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29103.json +20 -3
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29104.json +29 -7
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29105.json +20 -3
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29106.json +25 -4
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29107.json +25 -3
- package/blueprints/messaging-queue-cloudflare/contributions/user-stories/messaging-queue-cloudflare-us-29108.json +28 -6
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +3 -3
- package/blueprints/messaging-queue-cloudflare/guide/messaging-queue-cloudflare.md +8 -6
- package/blueprints/object-storage-s3/CHANGELOG.md +94 -6
- package/blueprints/object-storage-s3/README.md +2 -2
- package/blueprints/object-storage-s3/blueprint.json +156 -24
- 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 +103 -19
- 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-001.json +6 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-002.json +6 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-003.json +5 -1
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-004.json +6 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-005.json +6 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-006.json +6 -2
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-101.json +5 -1
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28101.json +36 -4
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28102.json +32 -5
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28103.json +42 -3
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28104.json +22 -4
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28105.json +25 -4
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28106.json +13 -5
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28107.json +10 -4
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28108.json +12 -4
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28110.json +20 -3
- package/blueprints/object-storage-s3/docs/topics.md +1 -1
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +3 -3
- package/blueprints/observability-essentials/CHANGELOG.md +37 -0
- package/blueprints/observability-essentials/README.md +3 -3
- package/blueprints/observability-essentials/assets/probe-samples/probe-response-baseline.v2.json +17 -0
- package/blueprints/observability-essentials/blueprint.json +34 -2
- package/blueprints/observability-essentials/contributions/adrs/adr-801-observability-essentials-health-probes.json +1 -1
- 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/contributions/requirements/observability-essentials-req-001.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-002.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-003.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-004.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-005.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-006.json +6 -2
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-007.json +7 -3
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-008.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-009.json +4 -0
- package/blueprints/observability-essentials/contributions/requirements/observability-essentials-req-010.json +4 -0
- package/blueprints/observability-essentials/contributions/tacs/tac-802-observability-essentials-readiness-probe.json +6 -1
- package/blueprints/observability-essentials/contributions/tacs/tac-803-observability-essentials-status-page.json +1 -1
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7101.json +25 -7
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7102.json +9 -5
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7103.json +51 -6
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7104.json +7 -4
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7105.json +6 -3
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7106.json +37 -6
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7107.json +18 -11
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7108.json +6 -3
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7109.json +7 -4
- package/blueprints/observability-essentials/contributions/user-stories/observability-essentials-us-7110.json +8 -5
- package/blueprints/observability-essentials/docs/topics.md +3 -4
- package/blueprints/observability-essentials/guide/observability-essentials.md +1 -1
- package/blueprints/observability-logging/CHANGELOG.md +44 -4
- package/blueprints/observability-logging/README.md +2 -2
- package/blueprints/observability-logging/blueprint.json +78 -29
- package/blueprints/observability-logging/contributions/adrs/adr-1605-observability-logging-serialisation-refusal.json +25 -0
- 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-logging/contributions/requirements/observability-logging-req-001.json +10 -3
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-002.json +8 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-003.json +8 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-004.json +8 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-005.json +8 -1
- package/blueprints/observability-logging/contributions/requirements/observability-logging-req-006.json +16 -0
- package/blueprints/observability-logging/contributions/tacs/tac-1601-observability-logging-logger-factory.json +4 -4
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15101.json +62 -8
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15102.json +11 -6
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15103.json +37 -5
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15104.json +35 -4
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15105.json +24 -6
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15106.json +22 -4
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15107.json +34 -3
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15108.json +21 -3
- package/blueprints/observability-logging/contributions/user-stories/observability-logging-us-15109.json +71 -0
- package/blueprints/observability-probe-endpoints/CHANGELOG.md +32 -0
- package/blueprints/observability-probe-endpoints/README.md +4 -4
- package/blueprints/observability-probe-endpoints/blueprint.json +42 -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/contributions/requirements/observability-probe-endpoints-req-001.json +6 -2
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-002.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-003.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-004.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-005.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-006.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-007.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/requirements/observability-probe-endpoints-req-008.json +4 -0
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14101.json +30 -9
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14102.json +24 -6
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14103.json +6 -3
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14104.json +9 -6
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14105.json +49 -4
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14106.json +9 -6
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14107.json +12 -8
- package/blueprints/observability-probe-endpoints/contributions/user-stories/observability-probe-endpoints-us-14108.json +6 -3
- package/blueprints/observability-probe-endpoints/docs/topics.md +2 -2
- package/blueprints/observability-probe-endpoints/guide/observability-probe-endpoints.md +3 -6
- package/blueprints/persistence-data-d1/CHANGELOG.md +32 -0
- package/blueprints/persistence-data-d1/README.md +3 -3
- package/blueprints/persistence-data-d1/assets/batch-usage/batch-atomicity-example.md +2 -0
- package/blueprints/persistence-data-d1/assets/facade-shape/facade-module-shape.md +2 -0
- package/blueprints/persistence-data-d1/blueprint.json +108 -23
- package/blueprints/persistence-data-d1/contributions/adrs/adr-1404-persistence-data-d1-store-boundary.json +4 -4
- 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/contributions/requirements/persistence-data-d1-req-001.json +5 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-002.json +5 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-003.json +5 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-004.json +7 -3
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-005.json +5 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-006.json +5 -1
- package/blueprints/persistence-data-d1/contributions/requirements/persistence-data-d1-req-007.json +5 -1
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13101.json +35 -4
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13102.json +25 -4
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13103.json +11 -4
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13104.json +13 -6
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13105.json +11 -4
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13106.json +7 -4
- package/blueprints/persistence-data-d1/contributions/user-stories/persistence-data-d1-us-13107.json +23 -3
- package/blueprints/persistence-data-d1/docs/topics.md +2 -3
- package/blueprints/persistence-data-postgres/CHANGELOG.md +99 -3
- package/blueprints/persistence-data-postgres/README.md +2 -2
- package/blueprints/persistence-data-postgres/blueprint.json +203 -24
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2801-persistence-data-postgres-driver.json +1 -1
- package/blueprints/persistence-data-postgres/contributions/adrs/adr-2805-persistence-data-postgres-connection-pool-posture.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-001.json +6 -2
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-002.json +6 -2
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-003.json +6 -2
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-004.json +7 -3
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-005.json +6 -2
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-006.json +6 -2
- package/blueprints/persistence-data-postgres/contributions/requirements/persistence-data-postgres-req-007.json +7 -3
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2802-persistence-data-postgres-migration-runner.json +2 -2
- package/blueprints/persistence-data-postgres/contributions/tacs/tac-2803-persistence-data-postgres-transaction-helper.json +5 -5
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27101.json +22 -4
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27102.json +118 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27103.json +20 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27104.json +26 -5
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27105.json +62 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27106.json +20 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27107.json +20 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27108.json +20 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27109.json +20 -3
- package/blueprints/persistence-data-postgres/contributions/user-stories/persistence-data-postgres-us-27110.json +48 -3
- package/blueprints/persistence-data-postgres/docs/topics.md +1 -1
- package/blueprints/persistence-data-sqlite/CHANGELOG.md +28 -0
- package/blueprints/persistence-data-sqlite/README.md +2 -2
- package/blueprints/persistence-data-sqlite/blueprint.json +148 -31
- 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/contributions/requirements/persistence-data-sqlite-req-001.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-002.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-003.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-004.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-005.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-006.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-007.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-008.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-009.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-010.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/requirements/persistence-data-sqlite-req-011.json +5 -1
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5101.json +35 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5102.json +7 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5103.json +19 -3
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5104.json +21 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5105.json +7 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5106.json +11 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5107.json +7 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5108.json +7 -4
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5109.json +11 -8
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5110.json +23 -3
- package/blueprints/persistence-data-sqlite/contributions/user-stories/persistence-data-sqlite-us-5111.json +19 -3
- package/blueprints/persistence-data-sqlite/docs/topics.md +2 -3
- package/blueprints/persistence-data-sqlite/guide/persistence-data-sqlite.md +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/CHANGELOG.md +40 -2
- package/blueprints/platform-cloudflare-cron-triggers/README.md +2 -3
- package/blueprints/platform-cloudflare-cron-triggers/blueprint.json +78 -17
- package/blueprints/platform-cloudflare-cron-triggers/contributions/adrs/adr-3301-platform-cloudflare-cron-triggers-scheduled-trigger-contract.json +2 -2
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/real-account-scheduled-smoke.mjs +24 -3
- package/blueprints/platform-cloudflare-cron-triggers/contributions/probes/skew-tolerance.mjs +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-001.json +6 -2
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-002.json +5 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-003.json +5 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/requirements/platform-cloudflare-cron-triggers-req-004.json +6 -2
- package/blueprints/platform-cloudflare-cron-triggers/contributions/tacs/tac-3301-platform-cloudflare-cron-triggers-scheduled-handler.json +1 -1
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32101.json +86 -5
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32102.json +69 -5
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32103.json +51 -4
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32104.json +65 -4
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32105.json +68 -5
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32106.json +62 -3
- package/blueprints/platform-cloudflare-cron-triggers/contributions/user-stories/platform-cloudflare-cron-triggers-us-32107.json +56 -3
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +4 -4
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +40 -4
- package/blueprints/platform-cloudflare-durable-objects/README.md +6 -6
- package/blueprints/platform-cloudflare-durable-objects/blueprint.json +3 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3401-platform-cloudflare-durable-objects-single-cell-contract.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/adrs/adr-3402-platform-cloudflare-durable-objects-websocket-hub-contract.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +2 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +41 -35
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/wrangler-seam.mjs +11 -5
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-001.json +5 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-002.json +6 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-003.json +5 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-004.json +5 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-005.json +6 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-006.json +6 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-007.json +5 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/requirements/platform-cloudflare-durable-objects-req-008.json +5 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33101.json +73 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33102.json +59 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33103.json +77 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33104.json +75 -6
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33105.json +73 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33106.json +49 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33107.json +45 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33108.json +84 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33109.json +45 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33110.json +59 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33111.json +45 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33112.json +53 -2
- package/blueprints/platform-cloudflare-durable-objects/contributions/user-stories/platform-cloudflare-durable-objects-us-33113.json +68 -5
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +2 -2
- package/blueprints/platform-cloudflare-durable-objects/guide/platform-cloudflare-durable-objects.md +9 -9
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +58 -12
- package/blueprints/platform-cloudflare-kv/README.md +7 -11
- package/blueprints/platform-cloudflare-kv/blueprint.json +115 -20
- package/blueprints/platform-cloudflare-kv/contributions/adrs/adr-3201-platform-cloudflare-kv-key-value-store-contract.json +3 -3
- package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +53 -18
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-001.json +6 -2
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-002.json +5 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-003.json +5 -1
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-004.json +6 -2
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-005.json +7 -3
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-006.json +22 -0
- package/blueprints/platform-cloudflare-kv/contributions/requirements/platform-cloudflare-kv-req-007.json +22 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31101.json +59 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31102.json +45 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31103.json +73 -3
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31104.json +67 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31105.json +59 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31106.json +45 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31107.json +45 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31108.json +45 -2
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31109.json +92 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31110.json +88 -0
- package/blueprints/platform-cloudflare-kv/contributions/user-stories/platform-cloudflare-kv-us-31111.json +89 -0
- package/blueprints/platform-cloudflare-kv/docs/topics.md +2 -2
- package/blueprints/platform-cloudflare-kv/guide/platform-cloudflare-kv.md +2 -2
- package/blueprints/platform-docker-compose-host/CHANGELOG.md +124 -3
- package/blueprints/platform-docker-compose-host/README.md +7 -7
- package/blueprints/platform-docker-compose-host/blueprint.json +23 -6
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3901-platform-docker-compose-host-contract.json +3 -3
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3902-platform-docker-compose-host-reverse-proxy.json +4 -4
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3903-platform-docker-compose-host-reject-coolify.json +2 -2
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3904-platform-docker-compose-host-log-driver.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 -25
- 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/contributions/requirements/platform-docker-compose-host-req-001.json +6 -2
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-002.json +5 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-003.json +6 -2
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-004.json +5 -1
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-005.json +6 -2
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-006.json +6 -2
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-007.json +22 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38101.json +73 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38102.json +67 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38103.json +59 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38104.json +75 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38105.json +49 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38106.json +45 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38107.json +49 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38108.json +49 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38109.json +57 -2
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38110.json +92 -0
- package/blueprints/platform-docker-compose-host/docs/topics.md +4 -4
- package/blueprints/platform-docker-compose-host/guide/platform-docker-compose-host.md +6 -6
- package/blueprints/security-auth-clerk/CHANGELOG.md +36 -4
- package/blueprints/security-auth-clerk/README.md +4 -4
- package/blueprints/security-auth-clerk/assets/wiring/workers-wrangler-toml-shape.md +1 -1
- package/blueprints/security-auth-clerk/blueprint.json +23 -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/contributions/requirements/security-auth-clerk-req-001.json +6 -2
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-002.json +5 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-003.json +6 -2
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-004.json +6 -2
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-005.json +5 -2
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-006.json +5 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-007.json +4 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-008.json +4 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-009.json +4 -1
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-010.json +22 -0
- package/blueprints/security-auth-clerk/contributions/requirements/security-auth-clerk-req-011.json +22 -0
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1001-security-auth-clerk-middleware.json +14 -4
- package/blueprints/security-auth-clerk/contributions/tacs/tac-1003-security-auth-clerk-session-verifier.json +7 -1
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9101.json +6 -3
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9102.json +19 -3
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9103.json +6 -3
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9104.json +6 -3
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9105.json +4 -2
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9106.json +4 -2
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9107.json +4 -2
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9108.json +13 -3
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9109.json +8 -2
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9110.json +4 -2
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9111.json +4 -2
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9112.json +102 -0
- package/blueprints/security-auth-clerk/contributions/user-stories/security-auth-clerk-us-9113.json +103 -0
- package/blueprints/security-auth-clerk/docs/topics.md +2 -3
- package/blueprints/security-auth-keycloak/CHANGELOG.md +34 -4
- package/blueprints/security-auth-keycloak/README.md +3 -3
- package/blueprints/security-auth-keycloak/blueprint.json +103 -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/contributions/requirements/security-auth-keycloak-req-001.json +5 -2
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-002.json +5 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-003.json +5 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-004.json +5 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-005.json +6 -2
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-006.json +6 -2
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-007.json +4 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-008.json +4 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-009.json +4 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-010.json +4 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-011.json +5 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-012.json +4 -1
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-013.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-014.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-015.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-016.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-017.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-018.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/requirements/security-auth-keycloak-req-019.json +22 -0
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1201-security-auth-keycloak-discovery-client.json +4 -2
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1202-security-auth-keycloak-jwt-verifier.json +8 -2
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1203-security-auth-keycloak-introspection-client.json +8 -2
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1204-security-auth-keycloak-provider-router.json +3 -1
- package/blueprints/security-auth-keycloak/contributions/tacs/tac-1205-security-auth-keycloak-role-adapter.json +2 -1
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11101.json +6 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11102.json +10 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11103.json +12 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11104.json +8 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11105.json +6 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11106.json +18 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11107.json +6 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11108.json +6 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11109.json +4 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11110.json +6 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11111.json +14 -3
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11112.json +4 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11113.json +4 -2
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11114.json +72 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11115.json +88 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11116.json +117 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11117.json +117 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11118.json +117 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11119.json +117 -0
- package/blueprints/security-auth-keycloak/contributions/user-stories/security-auth-keycloak-us-11120.json +103 -0
- package/blueprints/security-auth-keycloak/docs/topics.md +1 -2
- package/blueprints/security-auth-keycloak/guide/security-auth-keycloak.md +1 -1
- package/blueprints/security-auth-magic-link/CHANGELOG.md +30 -3
- package/blueprints/security-auth-magic-link/README.md +3 -3
- 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/contributions/requirements/security-auth-magic-link-req-001.json +4 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-002.json +5 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-003.json +6 -2
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-004.json +5 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-005.json +5 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-006.json +4 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-007.json +4 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-008.json +5 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-009.json +5 -1
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-010.json +6 -2
- package/blueprints/security-auth-magic-link/contributions/requirements/security-auth-magic-link-req-011.json +6 -2
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3101.json +10 -5
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3102.json +8 -4
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3103.json +6 -3
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3104.json +8 -4
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3105.json +6 -3
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3106.json +6 -3
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3107.json +8 -4
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3108.json +6 -3
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3109.json +6 -3
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3110.json +6 -3
- package/blueprints/security-auth-magic-link/contributions/user-stories/security-auth-magic-link-us-3111.json +14 -3
- package/blueprints/security-auth-magic-link/docs/topics.md +1 -1
- package/blueprints/security-auth-magic-link/guide/security-auth-magic-link.md +1 -1
- package/blueprints/security-auth-oauth2/CHANGELOG.md +32 -4
- package/blueprints/security-auth-oauth2/README.md +3 -3
- package/blueprints/security-auth-oauth2/blueprint.json +35 -3
- 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/contributions/requirements/security-auth-oauth2-req-001.json +5 -2
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-002.json +5 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-003.json +5 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-004.json +4 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-005.json +5 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-006.json +6 -2
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-007.json +4 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-008.json +6 -2
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-009.json +5 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-010.json +4 -1
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-011.json +22 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-012.json +22 -0
- package/blueprints/security-auth-oauth2/contributions/requirements/security-auth-oauth2-req-013.json +22 -0
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1102-security-auth-oauth2-provider-adapter.json +2 -1
- package/blueprints/security-auth-oauth2/contributions/tacs/tac-1103-security-auth-oauth2-session-bridge.json +9 -2
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10101.json +6 -3
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10102.json +6 -3
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10103.json +4 -2
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10104.json +4 -2
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10105.json +8 -4
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10106.json +6 -3
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10107.json +6 -3
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10108.json +6 -3
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10109.json +4 -2
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10110.json +4 -2
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10111.json +17 -2
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10112.json +82 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10113.json +68 -0
- package/blueprints/security-auth-oauth2/contributions/user-stories/security-auth-oauth2-us-10114.json +88 -0
- package/blueprints/security-auth-oauth2/docs/topics.md +1 -2
- package/blueprints/security-secrets-management/CHANGELOG.md +26 -3
- package/blueprints/security-secrets-management/README.md +2 -2
- package/blueprints/security-secrets-management/blueprint.json +170 -32
- 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/contributions/requirements/security-secrets-management-req-001.json +5 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-002.json +6 -2
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-003.json +6 -2
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-004.json +5 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-005.json +6 -2
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-006.json +5 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-007.json +5 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-008.json +5 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-009.json +5 -1
- package/blueprints/security-secrets-management/contributions/requirements/security-secrets-management-req-010.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8101.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8102.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8103.json +4 -2
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8104.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8105.json +8 -4
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8106.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8107.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8108.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8109.json +6 -3
- package/blueprints/security-secrets-management/contributions/user-stories/security-secrets-management-us-8110.json +6 -3
- package/blueprints/security-secrets-management/docs/topics.md +2 -3
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/harness-template.md +25 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +25 -0
- package/package.json +2 -2
- package/rcf/adrs/adr-4101-feedback-store-gitignored.json +20 -0
- package/rcf/adrs/adr-4102-fingerprint-and-labels.json +25 -0
- package/rcf/adrs/adr-4103-redaction-rule-based.json +20 -0
- package/rcf/adrs/adr-4104-destination-on-library.json +25 -0
- package/rcf/adrs/adr-4105-gh-ambient-auth.json +20 -0
- package/rcf/adrs/adr-4106-bundled-entries-terminal.json +20 -0
- package/rcf/adrs/adr-4107-stop-is-ask-event.json +30 -0
- package/rcf/adrs/adr-4108-hooks-in-committed-config.json +25 -0
- package/rcf/adrs/adr-4109-referee-validate-adr-crosslinks.json +25 -0
- package/rcf/adrs/adr-4110-referee-coverage-strict-by-default.json +25 -0
- package/rcf/adrs/adr-4111-referee-finalise-refusals.json +20 -0
- package/rcf/adrs/adr-4112-referee-finalise-verified-invariant.json +30 -0
- package/rcf/code-nodes/cn-600.json +45 -0
- package/rcf/code-nodes/cn-601.json +18 -0
- package/rcf/code-nodes/cn-602.json +15 -0
- package/rcf/code-nodes/cn-603.json +12 -0
- package/rcf/code-nodes/cn-604.json +14 -0
- package/rcf/code-nodes/cn-605.json +17 -0
- package/rcf/code-nodes/cn-606.json +12 -0
- package/rcf/code-nodes/cn-607.json +12 -0
- package/rcf/code-nodes/cn-608.json +14 -0
- package/rcf/code-nodes/cn-609.json +17 -0
- package/rcf/code-nodes/cn-620.json +18 -0
- package/rcf/code-nodes/cn-621.json +14 -0
- package/rcf/code-nodes/cn-622.json +15 -0
- package/rcf/code-nodes/cn-623.json +16 -0
- package/rcf/code-nodes/cn-624.json +14 -0
- package/rcf/code-nodes/cn-625.json +15 -0
- package/rcf/code-nodes/cn-626.json +13 -0
- package/rcf/code-nodes/cn-627.json +13 -0
- package/rcf/code-nodes/cn-628.json +14 -0
- package/rcf/code-nodes/cn-629.json +12 -0
- package/rcf/code-nodes/cn-630.json +12 -0
- package/rcf/code-nodes/cn-631.json +13 -0
- package/rcf/code-nodes/cn-632.json +13 -0
- package/rcf/fbs/fbs-180.json +45 -0
- package/rcf/fbs/fbs-181.json +45 -0
- package/rcf/fbs/fbs-182.json +42 -0
- package/rcf/fbs/fbs-183.json +50 -0
- package/rcf/fbs/fbs-184.json +49 -0
- package/rcf/fbs/fbs-185.json +34 -0
- package/rcf/fbs/fbs-186.json +16 -0
- package/rcf/fbs/fbs-187.json +17 -0
- package/rcf/fbs/fbs-188.json +17 -0
- package/rcf/fbs/fbs-189.json +17 -0
- package/rcf/requirements/req-155.json +13 -0
- package/rcf/requirements/req-156.json +13 -0
- package/rcf/requirements/req-157.json +13 -0
- package/rcf/requirements/req-158.json +13 -0
- package/rcf/requirements/req-159.json +13 -0
- package/rcf/requirements/req-160.json +13 -0
- package/rcf/requirements/req-161.json +13 -0
- package/rcf/requirements/req-162.json +13 -0
- package/rcf/requirements/req-163.json +13 -0
- package/rcf/requirements/req-164.json +13 -0
- package/rcf/requirements/req-165.json +13 -0
- package/rcf/tacs/tac-4101-feedback-cli.json +77 -0
- package/rcf/tacs/tac-4102-feedback-store.json +50 -0
- package/rcf/tacs/tac-4103-feedback-redact.json +39 -0
- package/rcf/tacs/tac-4104-feedback-fingerprint.json +33 -0
- package/rcf/tacs/tac-4105-feedback-render.json +45 -0
- package/rcf/tacs/tac-4106-feedback-destination.json +39 -0
- package/rcf/tacs/tac-4107-feedback-gh.json +43 -0
- package/rcf/tacs/tac-4108-feedback-hook.json +46 -0
- package/rcf/tacs/tac-4109-referee-validate-adr-crosslinks.json +20 -0
- package/rcf/tacs/tac-4110-referee-coverage-mode-selector.json +21 -0
- package/rcf/tacs/tac-4111-referee-finalise-per-ac-refusals.json +21 -0
- package/rcf/tacs/tac-4112-referee-finalise-verified-invariant.json +22 -0
- package/rcf/test-suites/ts-050.json +1 -1
- package/rcf/test-suites/ts-052.json +1 -1
- package/rcf/test-suites/ts-053.json +2 -2
- package/rcf/test-suites/ts-054.json +2 -2
- package/rcf/test-suites/ts-055.json +2 -2
- package/rcf/test-suites/ts-056.json +4 -4
- package/rcf/test-suites/ts-057.json +2 -2
- package/rcf/test-suites/ts-140.json +9 -9
- package/rcf/test-suites/ts-150.json +9 -9
- package/rcf/test-suites/ts-185.json +54 -0
- package/rcf/test-suites/ts-186.json +58 -0
- package/rcf/test-suites/ts-187.json +44 -0
- package/rcf/test-suites/ts-188.json +166 -0
- package/rcf/test-suites/ts-189.json +38 -0
- package/rcf/test-suites/ts-190.json +30 -0
- package/rcf/test-suites/ts-191.json +51 -0
- package/rcf/test-suites/ts-192.json +37 -0
- package/rcf/test-suites/ts-193.json +60 -0
- package/rcf/test-suites/ts-194.json +67 -0
- package/rcf/test-suites/ts-195.json +52 -0
- package/rcf/test-suites/ts-196.json +58 -0
- package/rcf/test-suites/ts-197.json +66 -0
- package/rcf/test-suites/ts-198.json +87 -0
- package/rcf/test-suites/ts-199.json +51 -0
- package/rcf/test-suites/ts-200.json +30 -0
- package/rcf/test-suites/ts-201.json +38 -0
- package/rcf/test-suites/ts-202.json +38 -0
- package/rcf/test-suites/ts-203.json +38 -0
- package/rcf/user-stories/us-15501.json +60 -0
- package/rcf/user-stories/us-15502.json +33 -0
- package/rcf/user-stories/us-15503.json +33 -0
- package/rcf/user-stories/us-15601.json +51 -0
- package/rcf/user-stories/us-15701.json +42 -0
- package/rcf/user-stories/us-15801.json +42 -0
- package/rcf/user-stories/us-15802.json +33 -0
- package/rcf/user-stories/us-15901.json +33 -0
- package/rcf/user-stories/us-15902.json +51 -0
- package/rcf/user-stories/us-16001.json +51 -0
- package/rcf/user-stories/us-16101.json +42 -0
- package/rcf/user-stories/us-16102.json +33 -0
- package/rcf/user-stories/us-16103.json +42 -0
- package/rcf/user-stories/us-16104.json +42 -0
- package/rcf/user-stories/us-16201.json +33 -0
- package/rcf/user-stories/us-16301.json +36 -0
- package/rcf/user-stories/us-16401.json +45 -0
- package/rcf/user-stories/us-16501.json +45 -0
- package/rcf/user-stories/us-16502.json +45 -0
- package/rcf/user-stories/us-7701.json +3 -3
- 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 +2204 -0
- package/src/cli/finalise.js +158 -1
- package/src/cli/help.js +6 -0
- package/src/cli/init.js +63 -0
- package/src/cli/update.js +21 -1
- package/src/cli/view.js +22 -11
- package/src/core/store/walker.js +33 -0
- package/src/core/store/writer.js +23 -0
- package/src/feedback/destination.js +361 -0
- package/src/feedback/fingerprint.js +132 -0
- package/src/feedback/gh.js +376 -0
- package/src/feedback/hook.js +183 -0
- package/src/feedback/labels.js +87 -0
- package/src/feedback/redact-allowlist.json +14 -0
- package/src/feedback/redact.js +1108 -0
- package/src/feedback/render.js +267 -0
- package/src/feedback/store.js +604 -0
- package/src/finalise/index.js +4 -0
- package/src/finalise/ingest.js +61 -0
- package/src/finalise/ship-without-eval.js +19 -7
- package/src/mcp/tools.js +8 -2
- package/src/setup/feedback-hooks.js +397 -0
- package/src/setup/managed-gitignore.js +3 -0
- package/src/view/html-page.js +5 -5
- package/src/view/style.css +2 -2
|
@@ -0,0 +1,1108 @@
|
|
|
1
|
+
// Feedback redactor (TAC-4103-feedback-redact, ADR-4103). Slice 2
|
|
2
|
+
// (FBS-181) ships the rules of design section 5 (eight in slice 2, plus rule 9 url-credential added round 4 for R3b), applied to any
|
|
3
|
+
// string that would leave the machine (issue title, body, evidence
|
|
4
|
+
// pointers). Pure, deterministic, no network, no LLM.
|
|
5
|
+
//
|
|
6
|
+
// Every replacement lands on a ledger of { rule, before, after, count }
|
|
7
|
+
// entries so `rcf feedback preview` can show the operator exactly what
|
|
8
|
+
// was stripped. Rule 8 is the second-pass refusal: if the redacted
|
|
9
|
+
// output still matches rule 5 (a secret-shaped run of characters), we
|
|
10
|
+
// return residual { line, snippet } markers so the caller can refuse
|
|
11
|
+
// the entry rather than send it.
|
|
12
|
+
//
|
|
13
|
+
// The rules, in canonical order (also the ledger's rule-name
|
|
14
|
+
// vocabulary): `project-root`, `absolute-path`, `email`, `hostname`,
|
|
15
|
+
// `private-ip`, `secret-token`, `operator-identity`, `size-shape`,
|
|
16
|
+
// `url-credential` (design amendment R3b, added fix round 4).
|
|
17
|
+
// Rule 6 in the design (operator identity) is applied AFTER rule 5
|
|
18
|
+
// (secret-token) so a name that looks like a random token is redacted
|
|
19
|
+
// as a token first; both are load-bearing and this ordering keeps the
|
|
20
|
+
// secret-shape check the last line of defence, which is what the
|
|
21
|
+
// residual-match refusal in rule 8 leans on.
|
|
22
|
+
|
|
23
|
+
import { readFileSync } from 'node:fs';
|
|
24
|
+
import { dirname, resolve } from 'node:path';
|
|
25
|
+
import { fileURLToPath } from 'node:url';
|
|
26
|
+
|
|
27
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
28
|
+
const BUNDLED_ALLOWLIST = JSON.parse(
|
|
29
|
+
readFileSync(resolve(here, 'redact-allowlist.json'), 'utf8'),
|
|
30
|
+
);
|
|
31
|
+
|
|
32
|
+
/** Body size cap (bytes). Mirrors src/cli/feedback.js:BODY_CAP_BYTES. */
|
|
33
|
+
export const BODY_CAP_BYTES = 8 * 1024;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Open secret-key vocabulary (design amendment R3a). A key/value pair
|
|
37
|
+
* is treated as a secret when the key, right-bounded at a word edge so
|
|
38
|
+
* `keyword` and `authors` do not fold, matches any stem below. False
|
|
39
|
+
* positives (`mypw=1`) are acceptable per design; false negatives are
|
|
40
|
+
* not. Consumed in exactly three places so the first pass, the residual
|
|
41
|
+
* pass and the whole-text safeguard scan share ONE vocabulary:
|
|
42
|
+
*
|
|
43
|
+
* 1. `kv-secret` early-guard regex in `redact()` (before path pass).
|
|
44
|
+
* 2. `kv-secret` entry in `secretPatterns()` (rule 5 primary pass).
|
|
45
|
+
* 3. `matchesSecretKeyLoose()` used by the rule-9 URL-credential
|
|
46
|
+
* scanner for query-parameter names.
|
|
47
|
+
*
|
|
48
|
+
* The list intentionally covers the full shortname surface the HQ gate
|
|
49
|
+
* on PR #221 (F-P0-A) named as leaking: `pw`, `pwd`, `pass`, `key`,
|
|
50
|
+
* `auth`, plus the long list from R3a. Word-boundary detail:
|
|
51
|
+
* `stem\b` at the right side only. That fails inside `keyword`
|
|
52
|
+
* (`y` -> `w`, no boundary) but succeeds inside `dbpassword`
|
|
53
|
+
* (`d` -> `=`, boundary), matching the round 3 gate probes.
|
|
54
|
+
*/
|
|
55
|
+
export const SECRET_KEY_VOCABULARY = Object.freeze([
|
|
56
|
+
// Long forms first so alternation prefers them (does not change
|
|
57
|
+
// correctness under `\b`, but keeps the ledger `before` samples
|
|
58
|
+
// stable for the operator).
|
|
59
|
+
//
|
|
60
|
+
// `authorization` is intentionally NOT in this list. The
|
|
61
|
+
// `Authorization:` header shape is handled by a line-anchored
|
|
62
|
+
// pattern in `secretPatterns()` that folds the WHOLE header line
|
|
63
|
+
// (scheme + credential + any tail), which is what the operator
|
|
64
|
+
// wants for the header case (F-slice-2-02). Adding `authorization`
|
|
65
|
+
// to the kv vocabulary would preempt that pattern: the guard would
|
|
66
|
+
// fold `Authorization: Basic` alone and leave the credential.
|
|
67
|
+
'passphrase',
|
|
68
|
+
'clientsecret',
|
|
69
|
+
'client_secret',
|
|
70
|
+
'client-secret',
|
|
71
|
+
'privatekey',
|
|
72
|
+
'private_key',
|
|
73
|
+
'private-key',
|
|
74
|
+
'accesskey',
|
|
75
|
+
'access_key',
|
|
76
|
+
'access-key',
|
|
77
|
+
'apikey',
|
|
78
|
+
'api_key',
|
|
79
|
+
'api-key',
|
|
80
|
+
'credential',
|
|
81
|
+
'credentials',
|
|
82
|
+
'signature',
|
|
83
|
+
'password',
|
|
84
|
+
'passwd',
|
|
85
|
+
'session',
|
|
86
|
+
'cookie',
|
|
87
|
+
'secret',
|
|
88
|
+
'bearer',
|
|
89
|
+
'creds',
|
|
90
|
+
'token',
|
|
91
|
+
'salt',
|
|
92
|
+
'cred',
|
|
93
|
+
'pass',
|
|
94
|
+
'auth',
|
|
95
|
+
'pwd',
|
|
96
|
+
'sig',
|
|
97
|
+
'pw',
|
|
98
|
+
'key',
|
|
99
|
+
// `hash` is intentionally NOT in this vocabulary. Per design R3a
|
|
100
|
+
// the `hash` stem is only a secret when the value is 16+ chars.
|
|
101
|
+
// The specific `hash`-with-long-value pattern is a separate regex
|
|
102
|
+
// handled inside `secretPatterns()` so a bare `hash=abc` (short
|
|
103
|
+
// digest displayed for humans) does not fold.
|
|
104
|
+
]);
|
|
105
|
+
|
|
106
|
+
// Build the alternation source ONCE at module load. Regex-escapes each
|
|
107
|
+
// stem (currently none carry regex metacharacters, but the escape keeps
|
|
108
|
+
// the constant safe if vocabulary is extended by extension in future).
|
|
109
|
+
const SECRET_KEY_ALTERNATION = SECRET_KEY_VOCABULARY.map(escapeReStatic).join('|');
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Regex source for the vocabulary above, right-bounded with `\b` so
|
|
113
|
+
* `keyword` and `authors` do not fold but `dbpassword` still does.
|
|
114
|
+
* Callers wrap this in a larger regex with their own value pattern.
|
|
115
|
+
*/
|
|
116
|
+
export function secretKeyRegexSource() {
|
|
117
|
+
return `(?:${SECRET_KEY_ALTERNATION})\\b`;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Value-shape character class (design amendment R4). Common secret /
|
|
122
|
+
* URL-safe alphabet plus punctuation that turns up in passwords. Used
|
|
123
|
+
* by the R4 separator scanner to bound the value token; the length
|
|
124
|
+
* gate and mixed-classes check are applied by `looksLikeSecretValue`.
|
|
125
|
+
*/
|
|
126
|
+
const R4_VALUE_CHAR_CLASS = `[A-Za-z0-9._~+/=@!#$%^&*?\\-]`;
|
|
127
|
+
|
|
128
|
+
/**
|
|
129
|
+
* R4 separator: one of the prose bridges `is` / `was` / `set to`
|
|
130
|
+
* bounded by whitespace, OR up to 40 units of a non-word non-newline
|
|
131
|
+
* character or an HTML numeric entity (`=`, `=`). Ordering
|
|
132
|
+
* matters: the entity alternative is tried first so the digits inside
|
|
133
|
+
* (`61`) do not stop the run at the leading `&#`. The prose bridge
|
|
134
|
+
* captures markdown-table pipes, bullet-list dashes, arrows,
|
|
135
|
+
* whitespace, tabs and `:` / `=` alongside the R3a shape.
|
|
136
|
+
*/
|
|
137
|
+
const R4_SEPARATOR_SRC =
|
|
138
|
+
'(?:\\s+(?:is|was|set\\s+to)\\s+|(?:&#(?:\\d+|x[0-9a-fA-F]+);|[^\\w\\n]){1,40})';
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* R4 combined regex source: `<vocab-key>\b<separator><value-shape>`.
|
|
142
|
+
* The value shape is bounded by the R4 character class so `\S{8,}`
|
|
143
|
+
* greed does not consume adjacent structural punctuation (e.g. the
|
|
144
|
+
* closing pipe of a markdown table cell). Post-match, callers apply
|
|
145
|
+
* `looksLikeSecretValue` to gate on 2+ character classes so plain
|
|
146
|
+
* English words (`required`, `enabled`) do not fold.
|
|
147
|
+
*/
|
|
148
|
+
const R4_REGEX_SRC =
|
|
149
|
+
`\\b(?:${SECRET_KEY_ALTERNATION})\\b${R4_SEPARATOR_SRC}(${R4_VALUE_CHAR_CLASS}{8,})`;
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Round 5 (design amendment R4): does a candidate value shape look
|
|
153
|
+
* like a secret? Guards R4 against over-redaction of ordinary prose:
|
|
154
|
+
* requires 8+ chars AND at least two character classes among {upper,
|
|
155
|
+
* lower, digit, symbol}. Rejects single-class runs like `required`
|
|
156
|
+
* (all lower) and `12345678` (all digits) so a sentence like
|
|
157
|
+
* `the password is required` does not fold the trailing word.
|
|
158
|
+
*
|
|
159
|
+
* @param {string} value
|
|
160
|
+
*/
|
|
161
|
+
function looksLikeSecretValue(value) {
|
|
162
|
+
if (typeof value !== 'string') return false;
|
|
163
|
+
if (value.length < 8) return false;
|
|
164
|
+
let classes = 0;
|
|
165
|
+
if (/[A-Z]/.test(value)) classes += 1;
|
|
166
|
+
if (/[a-z]/.test(value)) classes += 1;
|
|
167
|
+
if (/\d/.test(value)) classes += 1;
|
|
168
|
+
if (/[^A-Za-z0-9]/.test(value)) classes += 1;
|
|
169
|
+
return classes >= 2;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Round 5 (design amendment R4): scan `text` for vocabulary keys
|
|
174
|
+
* separated from a value-shape token by any separator. Returns the
|
|
175
|
+
* match ranges the redactor should fold (and the residual scan should
|
|
176
|
+
* flag). Skips matches whose value fails `looksLikeSecretValue` so
|
|
177
|
+
* ordinary prose survives.
|
|
178
|
+
*
|
|
179
|
+
* @param {string} text
|
|
180
|
+
* @returns {Array<{start: number, end: number, match: string, value: string}>}
|
|
181
|
+
*/
|
|
182
|
+
function scanR4Leaks(text) {
|
|
183
|
+
const re = new RegExp(R4_REGEX_SRC, 'gi');
|
|
184
|
+
const out = [];
|
|
185
|
+
let m;
|
|
186
|
+
while ((m = re.exec(text)) !== null) {
|
|
187
|
+
const value = m[1];
|
|
188
|
+
if (!looksLikeSecretValue(value)) {
|
|
189
|
+
// Guard against zero-width infinite loops on future pattern
|
|
190
|
+
// changes; the fixed regex above cannot match zero-length.
|
|
191
|
+
if (re.lastIndex === m.index) re.lastIndex += 1;
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
out.push({ start: m.index, end: m.index + m[0].length, match: m[0], value });
|
|
195
|
+
}
|
|
196
|
+
return out;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Case-insensitive test: does `name`, after lower-casing and stripping
|
|
201
|
+
* separators, MATCH any vocabulary stem? Used by the rule-9 URL-
|
|
202
|
+
* credential scanner to decide whether a URL query parameter name
|
|
203
|
+
* (`?apiKey=...`, `?client-secret=...`) is secret-carrying. Distinct
|
|
204
|
+
* from the regex above because query-parameter names are already
|
|
205
|
+
* isolated by the URL parser, so we do not need a boundary check.
|
|
206
|
+
*
|
|
207
|
+
* @param {string} name
|
|
208
|
+
*/
|
|
209
|
+
export function matchesSecretKeyLoose(name) {
|
|
210
|
+
if (typeof name !== 'string' || name.length === 0) return false;
|
|
211
|
+
const norm = name.toLowerCase().replace(/[_\-\s]/g, '');
|
|
212
|
+
for (const stem of SECRET_KEY_VOCABULARY) {
|
|
213
|
+
if (norm === stem.replace(/[_\-]/g, '')) return true;
|
|
214
|
+
}
|
|
215
|
+
return false;
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Known webhook-style hosts where the credential lives in the URL path
|
|
220
|
+
* (design amendment R3b). Format: `host[/pathPrefix]`. When a URL's
|
|
221
|
+
* host matches (exact or as a suffix under a subdomain), any path
|
|
222
|
+
* segments AFTER the recognisable prefix are folded to
|
|
223
|
+
* `<url-credential>` because the token IS the path.
|
|
224
|
+
*/
|
|
225
|
+
const WEBHOOK_HOST_PATH_PREFIXES = Object.freeze([
|
|
226
|
+
{ host: 'hooks.slack.com', prefix: '/services' },
|
|
227
|
+
{ host: 'discord.com', prefix: '/api/webhooks' },
|
|
228
|
+
{ host: 'discordapp.com', prefix: '/api/webhooks' },
|
|
229
|
+
{ host: 'hooks.zapier.com', prefix: '' },
|
|
230
|
+
{ host: 'api.telegram.org', prefix: '/bot' },
|
|
231
|
+
]);
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Presigned-URL query parameter names (design amendment R3b). Lower-
|
|
235
|
+
* cased on match. The rule-9 scanner also consults the open vocabulary
|
|
236
|
+
* above via `matchesSecretKeyLoose`, so `?token=` and `?api_key=` fold
|
|
237
|
+
* without appearing here; this list carries the presigned-only names
|
|
238
|
+
* that would not otherwise trip the vocabulary.
|
|
239
|
+
*/
|
|
240
|
+
const PRESIGNED_QUERY_NAMES = Object.freeze(new Set([
|
|
241
|
+
'x-amz-signature',
|
|
242
|
+
'x-amz-credential',
|
|
243
|
+
'x-amz-security-token',
|
|
244
|
+
'x-amz-date',
|
|
245
|
+
'sas',
|
|
246
|
+
'se',
|
|
247
|
+
'sv',
|
|
248
|
+
'sp',
|
|
249
|
+
'access_token',
|
|
250
|
+
]));
|
|
251
|
+
|
|
252
|
+
// Small local escape helper used at module-init time before the main
|
|
253
|
+
// `escapeRe` is defined below. Cheap and duplicates one line to keep
|
|
254
|
+
// module ordering simple.
|
|
255
|
+
function escapeReStatic(s) {
|
|
256
|
+
return String(s).replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/**
|
|
260
|
+
* @typedef {object} RedactionContext
|
|
261
|
+
* @property {string | string[]} [projectRoot] absolute path (redacted to `<project>`);
|
|
262
|
+
* an array carries every spelling that names the same root (the as-typed
|
|
263
|
+
* spelling AND its realpath, e.g. `/tmp/foo` and `/private/tmp/foo` on macOS)
|
|
264
|
+
* so a path expressed either way is stripped (design 5 rule 1, F-slice-2-06).
|
|
265
|
+
* @property {string} [projectName] manifest projectName (redacted to `<project>`)
|
|
266
|
+
* @property {string} [operatorName] identity ## Name line, or null
|
|
267
|
+
* @property {string | string[]} [gitRemote] git remote url or URLs (redacted to `<project-remote>`);
|
|
268
|
+
* an array carries every remote a `git remote -v` walk names (F-slice-2-07).
|
|
269
|
+
* @property {string[]} [allowHosts] extension list merged with the bundled allowlist
|
|
270
|
+
*/
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @typedef {object} LedgerRow
|
|
274
|
+
* @property {string} rule
|
|
275
|
+
* @property {string} before
|
|
276
|
+
* @property {string} after
|
|
277
|
+
* @property {number} count
|
|
278
|
+
*/
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* @typedef {object} ResidualHit
|
|
282
|
+
* @property {number} line 1-indexed line number in redacted output
|
|
283
|
+
* @property {string} snippet matched substring (already redacted string)
|
|
284
|
+
* @property {string} pattern short label for the pattern family
|
|
285
|
+
*/
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* @typedef {object} RedactResult
|
|
289
|
+
* @property {string} text redacted string
|
|
290
|
+
* @property {LedgerRow[]} ledger ordered by rule application
|
|
291
|
+
* @property {ResidualHit[]} residual rule-8 second-pass hits (empty on ok)
|
|
292
|
+
*/
|
|
293
|
+
|
|
294
|
+
/**
|
|
295
|
+
* Redact one string with the rules from design section 5 (eight core plus rule 9 url-credential).
|
|
296
|
+
* Deterministic; safe to call repeatedly; no I/O beyond the bundled
|
|
297
|
+
* allowlist read at module load.
|
|
298
|
+
*
|
|
299
|
+
* @param {string} input
|
|
300
|
+
* @param {RedactionContext} [context]
|
|
301
|
+
* @returns {RedactResult}
|
|
302
|
+
*/
|
|
303
|
+
export function redact(input, context = {}) {
|
|
304
|
+
if (typeof input !== 'string') input = String(input ?? '');
|
|
305
|
+
const ledger = [];
|
|
306
|
+
let text = input;
|
|
307
|
+
|
|
308
|
+
// Rule 1: project root -> <project>. Applied first so absolute paths
|
|
309
|
+
// under it keep their relative tail rather than getting basename-only
|
|
310
|
+
// treatment from rule 2. Accepts either a single string or an array
|
|
311
|
+
// of spellings (typed AND realpath) so a path expressed either way
|
|
312
|
+
// is stripped (F-slice-2-06).
|
|
313
|
+
const projectRootSpellings = normaliseRootSpellings(context.projectRoot);
|
|
314
|
+
for (const spelling of projectRootSpellings) {
|
|
315
|
+
const norm = spelling.replace(/[/\\]+$/, '');
|
|
316
|
+
text = replaceAndLog(text, escapedLiteral(norm), '<project>', 'project-root', ledger);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
// Rule 1.5: KV-secret early guard runs BEFORE the absolute-path
|
|
320
|
+
// pass. A body like `/tmp/cache password=Abc12345` was previously
|
|
321
|
+
// consumed by the terminal-directory extension of the path regex
|
|
322
|
+
// (the space plus `password` folded into the path match), so the
|
|
323
|
+
// `password` key label vanished into `<path>` and the kv-secret
|
|
324
|
+
// pass then saw a bare `=Abc12345` with no key label to bind. The
|
|
325
|
+
// guard redacts every `keyname=value` pair first, so the path
|
|
326
|
+
// sweep only sees `/tmp/cache <redacted:secret>` and cannot swallow
|
|
327
|
+
// the key. Round 3: R-P0-3 P0 regression from round 2.
|
|
328
|
+
//
|
|
329
|
+
// Round 4 (F-P0-A): vocabulary comes from the shared
|
|
330
|
+
// SECRET_KEY_VOCABULARY constant so this guard, the rule-5 first-
|
|
331
|
+
// pass entry and the residual-scan safeguard cover the same set.
|
|
332
|
+
const kvSecretGuardRe = new RegExp(
|
|
333
|
+
`${secretKeyRegexSource()}["'\\s]*[:=][ \\t]*(?:"(?:\\\\.|[^"\\\\\\n])+"|'(?:\\\\.|[^'\\\\\\n])+'|[^\\s,;)}\\]]+)`,
|
|
334
|
+
'gi',
|
|
335
|
+
);
|
|
336
|
+
text = replaceEachDistinct(text, kvSecretGuardRe, '<redacted:secret>', 'secret-token', ledger);
|
|
337
|
+
// Round 4: `hash` is redacted only when the value is 16+ chars
|
|
338
|
+
// (design R3a). Handled as its own regex so a short `hash=abc` shape
|
|
339
|
+
// (public commit digest displayed for humans) does not fold.
|
|
340
|
+
const kvHashGuardRe = /\bhash["'\s]*[:=][ \t]*(?:"(?:\\.|[^"\\\n]){16,}"|'(?:\\.|[^'\\\n]){16,}'|[^\s,;)}\]]{16,})/gi;
|
|
341
|
+
text = replaceEachDistinct(text, kvHashGuardRe, '<redacted:secret>', 'secret-token', ledger);
|
|
342
|
+
|
|
343
|
+
// Rule 2: other absolute paths -> <path>/<basename>. POSIX and
|
|
344
|
+
// Windows shapes. Path segments allow letters, digits, dots,
|
|
345
|
+
// hyphens, underscores, tildes, pluses, colons, at-signs and
|
|
346
|
+
// spaces. A non-terminal segment carrying spaces (e.g.
|
|
347
|
+
// `/Users/john doe/work` or `/Users/john doe/work` with a double
|
|
348
|
+
// space) is accepted when it is followed by another separator, so
|
|
349
|
+
// any width of whitespace between tokens folds. A terminal
|
|
350
|
+
// (no-separator) segment accepts a space continuation of any width
|
|
351
|
+
// (`[ \t]+`) so `/Users/john doe` (double space) also folds; a
|
|
352
|
+
// sentence like `in /Users/john doe end here` still folds only
|
|
353
|
+
// `/Users/john doe` because the continuation is a single word,
|
|
354
|
+
// not the rest of the sentence (F-slice-2-06).
|
|
355
|
+
// Terminal-segment shape: a first word with a `.` looks like a
|
|
356
|
+
// filename (no space continuation - space starts a sentence again,
|
|
357
|
+
// as in `/foo.js line 42`); a first word without a `.` looks like
|
|
358
|
+
// a directory (allow one continuation - `john doe` is one dir on
|
|
359
|
+
// macOS). This split avoids swallowing the trailing sentence when
|
|
360
|
+
// the path ends in a filename.
|
|
361
|
+
const posixAbsRe = /(?<![A-Za-z0-9_/-])\/(?:Users|home|tmp|var|opt|private|etc|root)(?:\/(?:[A-Za-z0-9._+@~-]+(?:\s+[A-Za-z0-9._+@~-]+)*(?=\/)|[A-Za-z0-9_+@~-]+(?:[ \t]+[A-Za-z0-9._+@~-]+)?|[A-Za-z0-9._+@~-]+))+/g;
|
|
362
|
+
text = replaceRegex(text, posixAbsRe, (match) => {
|
|
363
|
+
const bn = match.split('/').filter(Boolean).pop() ?? 'file';
|
|
364
|
+
// A basename with a space is almost always a username directory
|
|
365
|
+
// (e.g. macOS `Users/First Last`); dropping the basename keeps
|
|
366
|
+
// the personal name off the wire (F-slice-2-06 terminal case).
|
|
367
|
+
if (/\s/.test(bn)) return '<path>';
|
|
368
|
+
return `<path>/${bn}`;
|
|
369
|
+
}, 'absolute-path', ledger);
|
|
370
|
+
const winAbsRe = /(?<![A-Za-z0-9])[A-Z]:\\(?:(?:[A-Za-z0-9._+@~-]+(?:\s+[A-Za-z0-9._+@~-]+)*(?=\\))|[A-Za-z0-9_+@~-]+(?:[ \t]+[A-Za-z0-9._+@~-]+)?|[A-Za-z0-9._+@~-]+)(?:\\(?:(?:[A-Za-z0-9._+@~-]+(?:\s+[A-Za-z0-9._+@~-]+)*(?=\\))|[A-Za-z0-9_+@~-]+(?:[ \t]+[A-Za-z0-9._+@~-]+)?|[A-Za-z0-9._+@~-]+))+/g;
|
|
371
|
+
text = replaceRegex(text, winAbsRe, (match) => {
|
|
372
|
+
const bn = match.split('\\').pop() ?? 'file';
|
|
373
|
+
if (/\s/.test(bn)) return '<path>';
|
|
374
|
+
return `<path>\\${bn}`;
|
|
375
|
+
}, 'absolute-path', ledger);
|
|
376
|
+
|
|
377
|
+
// Operator identity as a literal substitution happens BEFORE the
|
|
378
|
+
// shape-based rules 3-6 so a git remote of the form
|
|
379
|
+
// `git@github.com:owner/repo.git` is not first consumed by the email
|
|
380
|
+
// rule. The operator-name literal likewise takes precedence over
|
|
381
|
+
// any accidental shape overlaps. Accepts either a single remote or
|
|
382
|
+
// an array (F-slice-2-07: `git remote -v` yields multiple).
|
|
383
|
+
const gitRemotes = Array.isArray(context.gitRemote)
|
|
384
|
+
? context.gitRemote
|
|
385
|
+
: (typeof context.gitRemote === 'string' && context.gitRemote.length > 0 ? [context.gitRemote] : []);
|
|
386
|
+
for (const gr of gitRemotes) {
|
|
387
|
+
text = replaceAndLog(text, escapedLiteral(gr), '<project-remote>', 'operator-identity', ledger);
|
|
388
|
+
}
|
|
389
|
+
if (context.operatorName) {
|
|
390
|
+
const opName = context.operatorName.trim();
|
|
391
|
+
if (opName.length > 0) {
|
|
392
|
+
text = replaceAndLog(text, escapedLiteral(opName), '<operator>', 'operator-identity', ledger);
|
|
393
|
+
for (const tok of opName.split(/\s+/)) {
|
|
394
|
+
if (tok.length > 3) {
|
|
395
|
+
text = replaceAndLog(text, `\\b${escapeRe(tok)}\\b`, '<operator>', 'operator-identity', ledger);
|
|
396
|
+
}
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
if (context.projectName) {
|
|
401
|
+
const pn = context.projectName.trim();
|
|
402
|
+
if (pn.length > 0) {
|
|
403
|
+
text = replaceAndLog(text, `\\b${escapeRe(pn)}\\b`, '<project>', 'operator-identity', ledger);
|
|
404
|
+
}
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
// Rule 3: emails -> <email>. RFC-5322 lite; case-insensitive.
|
|
408
|
+
const emailRe = /[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}/g;
|
|
409
|
+
text = replaceRegex(text, emailRe, () => '<email>', 'email', ledger);
|
|
410
|
+
|
|
411
|
+
// Rule 4: hostnames and URLs whose registrable domain is not on the
|
|
412
|
+
// allowlist. URLs keep their path suffix; bare hostnames collapse.
|
|
413
|
+
// Loopback (localhost, 127.0.0.1) and everything on the allowlist
|
|
414
|
+
// survive; every other public hostname or URL loses its host.
|
|
415
|
+
const allowHosts = new Set([
|
|
416
|
+
...BUNDLED_ALLOWLIST.hosts,
|
|
417
|
+
...(Array.isArray(context.allowHosts) ? context.allowHosts : []),
|
|
418
|
+
].map((h) => h.toLowerCase()));
|
|
419
|
+
|
|
420
|
+
// Rule 9: URL-embedded credentials (design amendment R3b, added
|
|
421
|
+
// round 4 for F-P0-B). Runs BEFORE the rule-4 hostname pass so a
|
|
422
|
+
// Slack/Discord webhook URL whose path IS the credential has that
|
|
423
|
+
// path folded to `<url-credential>` before the host itself is
|
|
424
|
+
// folded to `<host>` and the path suffix would otherwise leave the
|
|
425
|
+
// machine intact. Same for `user:pass@host` userinfo, presigned
|
|
426
|
+
// query tokens, and any query parameter whose name matches the
|
|
427
|
+
// shared secret-key vocabulary. The ledger names this rule
|
|
428
|
+
// `url-credential`; false positives are visible in the disclosure.
|
|
429
|
+
text = redactUrlCredentials(text, ledger);
|
|
430
|
+
|
|
431
|
+
// URLs first (http/https), then bare hostnames.
|
|
432
|
+
const urlRe = /https?:\/\/([A-Za-z0-9.-]+)((?::[0-9]+)?(?:\/[^\s)]*)?)/g;
|
|
433
|
+
text = replaceRegex(text, urlRe, (_m, host, tail) => {
|
|
434
|
+
if (isHostAllowed(host, allowHosts)) return `https://${host}${tail}`;
|
|
435
|
+
return `<host>${tail}`;
|
|
436
|
+
}, 'hostname', ledger);
|
|
437
|
+
// Bare hostnames: a word that looks like a domain (has a dot,
|
|
438
|
+
// ends with a 2+ letter TLD) and is not on the allowlist. Skip if
|
|
439
|
+
// preceded by @ (already handled by rule 3), a slash or backslash
|
|
440
|
+
// (path fragment; the winAbsRe substitution leaves `<path>\file.ext`
|
|
441
|
+
// which must not fold to `<host>`), a digit-dot (IP handled by
|
|
442
|
+
// rule 5b), or another word character (a longer host suffix).
|
|
443
|
+
const bareHostRe = /(?<![@/\\\w.])(?:[A-Za-z0-9-]+\.)+[A-Za-z]{2,}(?![\w.-])/g;
|
|
444
|
+
text = replaceRegex(text, bareHostRe, (host) => {
|
|
445
|
+
if (isHostAllowed(host, allowHosts)) return host;
|
|
446
|
+
return '<host>';
|
|
447
|
+
}, 'hostname', ledger);
|
|
448
|
+
|
|
449
|
+
// Rule 5: private and link-local IPs -> <ip>. Loopback survives.
|
|
450
|
+
// Deliberately named `private-ip` in the ledger vocabulary.
|
|
451
|
+
const privateIpRe = /\b(?:10\.\d{1,3}\.\d{1,3}\.\d{1,3}|172\.(?:1[6-9]|2\d|3[01])\.\d{1,3}\.\d{1,3}|192\.168\.\d{1,3}\.\d{1,3}|169\.254\.\d{1,3}\.\d{1,3})\b/g;
|
|
452
|
+
text = replaceRegex(text, privateIpRe, () => '<ip>', 'private-ip', ledger);
|
|
453
|
+
// Any other public IPv4 outside loopback also collapses.
|
|
454
|
+
const publicIpRe = /\b(?!127\.)(?!0\.)(?:\d{1,3}\.){3}\d{1,3}\b/g;
|
|
455
|
+
text = replaceRegex(text, publicIpRe, () => '<ip>', 'private-ip', ledger);
|
|
456
|
+
|
|
457
|
+
// F-slice-2-05: IPv6 is also part of rule 4 (design 5 explicitly
|
|
458
|
+
// names fc00::/7). Match unique-local (fc00::/7), link-local
|
|
459
|
+
// (fe80::/10) and generic IPv6 shapes (including :: compression),
|
|
460
|
+
// but keep loopback `::1`. Runs after IPv4 so a `::ffff:10.0.0.1`
|
|
461
|
+
// mapped-address form still folds sensibly.
|
|
462
|
+
// F-slice-2-05: preserve loopback in every legal spelling - `::1`,
|
|
463
|
+
// the fully expanded `0:0:0:0:0:0:0:1`, and every zero-padded
|
|
464
|
+
// variant of it (`0000:0000:0000:0000:0000:0000:0000:0001`, etc).
|
|
465
|
+
// A single `::1` matcher would let the expanded forms fall through
|
|
466
|
+
// to the general ipv6 pattern and get redacted against design 5
|
|
467
|
+
// rule 4's loopback exemption.
|
|
468
|
+
const ipv6LoopbackRe = /(?<![0-9A-Fa-f:])(?:::1|(?:0{1,4}:){7}0{0,3}1)(?![0-9A-Fa-f:])/g;
|
|
469
|
+
const ipv6Re = /(?<![0-9A-Fa-f:])(?:(?:[0-9A-Fa-f]{1,4}:){7}[0-9A-Fa-f]{1,4}|(?:[0-9A-Fa-f]{1,4}:){1,7}:|(?:[0-9A-Fa-f]{1,4}:){1,6}:[0-9A-Fa-f]{1,4}|(?:[0-9A-Fa-f]{1,4}:){1,5}(?::[0-9A-Fa-f]{1,4}){1,2}|(?:[0-9A-Fa-f]{1,4}:){1,4}(?::[0-9A-Fa-f]{1,4}){1,3}|(?:[0-9A-Fa-f]{1,4}:){1,3}(?::[0-9A-Fa-f]{1,4}){1,4}|(?:[0-9A-Fa-f]{1,4}:){1,2}(?::[0-9A-Fa-f]{1,4}){1,5}|[0-9A-Fa-f]{1,4}:(?::[0-9A-Fa-f]{1,4}){1,6}|:(?::[0-9A-Fa-f]{1,4}){1,7})(?![0-9A-Fa-f:])/g;
|
|
470
|
+
// Protect loopback markers before the general pattern runs.
|
|
471
|
+
const LOOPBACK_TOKEN = 'IPV6LO';
|
|
472
|
+
const savedLoopback = [];
|
|
473
|
+
text = text.replace(ipv6LoopbackRe, (m) => {
|
|
474
|
+
savedLoopback.push(m);
|
|
475
|
+
return `${LOOPBACK_TOKEN}${savedLoopback.length - 1}${LOOPBACK_TOKEN}`;
|
|
476
|
+
});
|
|
477
|
+
text = replaceRegex(text, ipv6Re, () => '<ip>', 'private-ip', ledger);
|
|
478
|
+
text = text.replace(new RegExp(`${LOOPBACK_TOKEN}(\\d+)${LOOPBACK_TOKEN}`, 'g'), (_m, i) => savedLoopback[Number(i)]);
|
|
479
|
+
|
|
480
|
+
// Rule 8a-early: dash normalisation runs BEFORE the rule-6 secret
|
|
481
|
+
// pass so em-dash-delimited shapes (e.g. `—BEGIN PRIVATE KEY—`)
|
|
482
|
+
// reach the secret patterns as ASCII forms. Doing this later would
|
|
483
|
+
// let a PEM block with em-dashes on the delimiters slip both the
|
|
484
|
+
// first-pass PEM regex (needs `-`) AND the residual pass because
|
|
485
|
+
// the residual scan runs after this normalisation - R-P0-2.
|
|
486
|
+
// Normalise dashes: em (—), en (–), figure (‒),
|
|
487
|
+
// horizontal bar (―), hyphen (‐), non-breaking hyphen
|
|
488
|
+
// (‑), minus sign (−). All become ASCII hyphen.
|
|
489
|
+
const dashRe = /[‐-―−]/g;
|
|
490
|
+
let dashes = 0;
|
|
491
|
+
text = text.replace(dashRe, () => {
|
|
492
|
+
dashes += 1;
|
|
493
|
+
return '-';
|
|
494
|
+
});
|
|
495
|
+
|
|
496
|
+
// Rule 6: secret-looking strings -> <redacted:secret>. This block is
|
|
497
|
+
// the last line of defence and rule 8's residual check re-runs it.
|
|
498
|
+
text = redactSecrets(text, ledger);
|
|
499
|
+
|
|
500
|
+
// Rule 8a-late: size / shape. Strip control characters; truncate to
|
|
501
|
+
// BODY_CAP_BYTES with an explicit marker. Dash normalisation is now
|
|
502
|
+
// in 8a-early above; the size-shape ledger row still totals both.
|
|
503
|
+
const before = text;
|
|
504
|
+
let ctrl = 0;
|
|
505
|
+
text = text.replace(/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]/g, () => {
|
|
506
|
+
ctrl += 1;
|
|
507
|
+
return '';
|
|
508
|
+
});
|
|
509
|
+
let truncated = 0;
|
|
510
|
+
if (Buffer.byteLength(text, 'utf8') > BODY_CAP_BYTES) {
|
|
511
|
+
text = truncateToBytes(text, BODY_CAP_BYTES - 32);
|
|
512
|
+
text = `${text}\n[truncated by rcf feedback]\n`;
|
|
513
|
+
truncated = 1;
|
|
514
|
+
}
|
|
515
|
+
if (ctrl > 0 || dashes > 0 || truncated > 0) {
|
|
516
|
+
ledger.push({
|
|
517
|
+
rule: 'size-shape',
|
|
518
|
+
before: `${before.length} chars, ${ctrl} control, ${dashes} dashes${truncated ? ', over cap' : ''}`,
|
|
519
|
+
after: `${text.length} chars`,
|
|
520
|
+
count: ctrl + dashes + truncated,
|
|
521
|
+
});
|
|
522
|
+
}
|
|
523
|
+
|
|
524
|
+
// Rule 8b: second-pass residual secret check. Any surviving match
|
|
525
|
+
// for the rule-5 pattern family names the failing line and lets
|
|
526
|
+
// `submit` refuse without sending. `preview` shows the same list so
|
|
527
|
+
// the agent can rewrite the body.
|
|
528
|
+
const residual = findResidualSecrets(text);
|
|
529
|
+
|
|
530
|
+
return { text, ledger, residual };
|
|
531
|
+
}
|
|
532
|
+
|
|
533
|
+
/**
|
|
534
|
+
* Detect residual secrets in already-redacted text. Wider than the
|
|
535
|
+
* first-pass `redactSecrets` set: the residual check drops the word-
|
|
536
|
+
* boundary anchors so a token buried inside a longer identifier
|
|
537
|
+
* (a shape the first pass would skip) still trips the refusal. Used
|
|
538
|
+
* by `preview` for the disclosure line and by `submit` (slice 4) for
|
|
539
|
+
* the refusal.
|
|
540
|
+
*
|
|
541
|
+
* @param {string} text
|
|
542
|
+
* @returns {ResidualHit[]}
|
|
543
|
+
*/
|
|
544
|
+
export function findResidualSecrets(text) {
|
|
545
|
+
// F-slice-2-04 / R-P0-2: the residual pass runs the SAME pattern
|
|
546
|
+
// family the first pass used, plus the word-boundary-loosened
|
|
547
|
+
// token variants so a secret buried inside a longer identifier
|
|
548
|
+
// still trips the refusal. Scans the WHOLE text with each pattern
|
|
549
|
+
// (not line-by-line) so multiline shapes such as a PEM block are
|
|
550
|
+
// matched: a per-line loop could never see a BEGIN..END pair on
|
|
551
|
+
// its own line. Every rule-5 family is represented: what leaves
|
|
552
|
+
// the machine cannot include a shape the first pass would have
|
|
553
|
+
// caught even after later normalisation.
|
|
554
|
+
const primaries = secretPatterns();
|
|
555
|
+
const looseTokens = [
|
|
556
|
+
{ name: 'github-token', re: /(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}/g },
|
|
557
|
+
{ name: 'github-pat', re: /github_pat_[A-Za-z0-9_]{20,}/g },
|
|
558
|
+
{ name: 'aws-access', re: /AKIA[0-9A-Z]{16}/g },
|
|
559
|
+
{ name: 'stripe', re: /sk_(?:live|test)_[A-Za-z0-9]{20,}/g },
|
|
560
|
+
{ name: 'openai', re: /sk-[A-Za-z0-9]{20,}/g },
|
|
561
|
+
{ name: 'slack', re: /xox[abp]-[A-Za-z0-9-]{10,}/g },
|
|
562
|
+
{ name: 'jwt', re: /eyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}/g },
|
|
563
|
+
{ name: 'bearer', re: /Bearer\s+[A-Za-z0-9._~+/=-]{4,}/g },
|
|
564
|
+
];
|
|
565
|
+
const residualPatterns = [...primaries, ...looseTokens];
|
|
566
|
+
/** @type {ResidualHit[]} */
|
|
567
|
+
const hits = [];
|
|
568
|
+
const seen = new Set();
|
|
569
|
+
// Round 3: also scan a diacritic-stripped shadow copy so a key
|
|
570
|
+
// label carrying a Latin-1 supplement letter (`pássword=Abc12345`,
|
|
571
|
+
// `sécret=X`, homoglyph variants) still trips the residual pass and
|
|
572
|
+
// submit refuses fail-closed. The shadow scan preserves byte
|
|
573
|
+
// offsets by mapping combining marks and diacritics to their base
|
|
574
|
+
// ASCII counterparts one codepoint at a time; every non-ASCII
|
|
575
|
+
// codepoint that is not a diacritic marker collapses to a single
|
|
576
|
+
// `_` placeholder so line and column offsets survive intact.
|
|
577
|
+
const shadow = stripDiacritics(text);
|
|
578
|
+
const scans = [
|
|
579
|
+
{ source: text, label: '' },
|
|
580
|
+
...(shadow !== text ? [{ source: shadow, label: 'unicode-key' }] : []),
|
|
581
|
+
];
|
|
582
|
+
for (const { source, label } of scans) {
|
|
583
|
+
for (const { name, re } of residualPatterns) {
|
|
584
|
+
re.lastIndex = 0;
|
|
585
|
+
let m;
|
|
586
|
+
while ((m = re.exec(source)) !== null) {
|
|
587
|
+
// Line number = 1 + count of newlines before m.index. Uses
|
|
588
|
+
// `text` (not `source`) because the shadow preserves newline
|
|
589
|
+
// positions, so the raw text's line count is authoritative
|
|
590
|
+
// for what the operator sees on stdout.
|
|
591
|
+
let line = 1;
|
|
592
|
+
for (let i = 0; i < m.index; i += 1) {
|
|
593
|
+
if (text.charCodeAt(i) === 10) line += 1;
|
|
594
|
+
}
|
|
595
|
+
// Snippet is drawn from the RAW text so the operator sees the
|
|
596
|
+
// actual bytes at the offending line, not the placeholder.
|
|
597
|
+
const rawSnippet = text.slice(m.index, m.index + m[0].length);
|
|
598
|
+
const snippet = rawSnippet.replace(/\s+/g, ' ').slice(0, 80);
|
|
599
|
+
const pattern = label ? `${label}:${name}` : name;
|
|
600
|
+
const key = `${pattern}|${line}|${snippet}`;
|
|
601
|
+
if (!seen.has(key)) {
|
|
602
|
+
seen.add(key);
|
|
603
|
+
hits.push({ line, snippet, pattern });
|
|
604
|
+
}
|
|
605
|
+
// Guard against zero-width matches (defensive; no such pattern
|
|
606
|
+
// in the set today, but a future pattern with an optional
|
|
607
|
+
// group could hang the loop otherwise).
|
|
608
|
+
if (re.lastIndex === m.index) re.lastIndex += 1;
|
|
609
|
+
}
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
// Round 5 (design amendment R4): also scan for a vocabulary key
|
|
613
|
+
// labelling a value-shape token via a non-`:=` separator (markdown
|
|
614
|
+
// table pipe, prose bridge, whitespace, tab, hyphen, arrow, HTML
|
|
615
|
+
// entity). The residual pass and the primary pass share
|
|
616
|
+
// `scanR4Leaks` so the mixed-classes gate is the same on both
|
|
617
|
+
// sides: what the redactor deemed benign under R4 does not
|
|
618
|
+
// resurface as a refusal here.
|
|
619
|
+
for (const scan of scans) {
|
|
620
|
+
const r4Hits = scanR4Leaks(scan.source);
|
|
621
|
+
for (const hit of r4Hits) {
|
|
622
|
+
let line = 1;
|
|
623
|
+
for (let i = 0; i < hit.start; i += 1) {
|
|
624
|
+
if (text.charCodeAt(i) === 10) line += 1;
|
|
625
|
+
}
|
|
626
|
+
const rawSnippet = text.slice(hit.start, hit.end);
|
|
627
|
+
const snippet = rawSnippet.replace(/\s+/g, ' ').slice(0, 80);
|
|
628
|
+
const pattern = scan.label ? `${scan.label}:kv-secret-r4` : 'kv-secret-r4';
|
|
629
|
+
const key = `${pattern}|${line}|${snippet}`;
|
|
630
|
+
if (!seen.has(key)) {
|
|
631
|
+
seen.add(key);
|
|
632
|
+
hits.push({ line, snippet, pattern });
|
|
633
|
+
}
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
hits.sort((a, b) => a.line - b.line || a.pattern.localeCompare(b.pattern));
|
|
637
|
+
return hits;
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
/**
|
|
641
|
+
* Return a copy of `input` where every non-ASCII codepoint that carries
|
|
642
|
+
* a base ASCII letter (via NFKD decomposition) is folded to that letter,
|
|
643
|
+
* every remaining non-ASCII codepoint collapses to `_`, and every ASCII
|
|
644
|
+
* character passes through untouched. The output has the same length in
|
|
645
|
+
* codepoints as the input, so `String.prototype.replace` match indices
|
|
646
|
+
* carry over one-for-one for line-number arithmetic in the residual pass.
|
|
647
|
+
* Fail-closed: on any exception, return the input unchanged so the raw
|
|
648
|
+
* scan is still authoritative.
|
|
649
|
+
*
|
|
650
|
+
* @param {string} input
|
|
651
|
+
* @returns {string}
|
|
652
|
+
*/
|
|
653
|
+
function stripDiacritics(input) {
|
|
654
|
+
try {
|
|
655
|
+
let out = '';
|
|
656
|
+
for (let i = 0; i < input.length; i += 1) {
|
|
657
|
+
const c = input.charCodeAt(i);
|
|
658
|
+
if (c < 128) { out += input[i]; continue; }
|
|
659
|
+
// Preserve UTF-16 code-unit alignment. A high surrogate plus a
|
|
660
|
+
// low surrogate is one non-BMP codepoint; emit two `_` so the
|
|
661
|
+
// shadow has the same `.length` and regex offsets carry over
|
|
662
|
+
// unchanged for line-number arithmetic.
|
|
663
|
+
if (c >= 0xD800 && c <= 0xDBFF) {
|
|
664
|
+
out += '__';
|
|
665
|
+
i += 1;
|
|
666
|
+
continue;
|
|
667
|
+
}
|
|
668
|
+
// BMP non-ASCII: NFKD fold to the first ASCII letter or digit
|
|
669
|
+
// in the decomposition (e.g. `á` -> `a` + combining acute).
|
|
670
|
+
// If nothing ASCII remains, collapse to `_` so the placeholder
|
|
671
|
+
// holds the offset without introducing pattern shapes of its own.
|
|
672
|
+
const decomposed = input[i].normalize('NFKD');
|
|
673
|
+
let picked = null;
|
|
674
|
+
for (const dch of decomposed) {
|
|
675
|
+
const cc = dch.charCodeAt(0);
|
|
676
|
+
if ((cc >= 48 && cc <= 57) || (cc >= 65 && cc <= 90) || (cc >= 97 && cc <= 122)) {
|
|
677
|
+
picked = dch;
|
|
678
|
+
break;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
out += picked ?? '_';
|
|
682
|
+
}
|
|
683
|
+
return out;
|
|
684
|
+
} catch {
|
|
685
|
+
return input;
|
|
686
|
+
}
|
|
687
|
+
}
|
|
688
|
+
|
|
689
|
+
/**
|
|
690
|
+
* Merge the bundled allowlist with the per-project extension.
|
|
691
|
+
* Public helper so callers can preview the merged set (doctor,
|
|
692
|
+
* `feedback status` in slice 5) without re-implementing the merge.
|
|
693
|
+
*
|
|
694
|
+
* @param {string[]} [extend]
|
|
695
|
+
* @returns {string[]}
|
|
696
|
+
*/
|
|
697
|
+
export function allowedHosts(extend = []) {
|
|
698
|
+
return [...new Set([
|
|
699
|
+
...BUNDLED_ALLOWLIST.hosts,
|
|
700
|
+
...(Array.isArray(extend) ? extend : []),
|
|
701
|
+
].map((h) => h.toLowerCase()))];
|
|
702
|
+
}
|
|
703
|
+
|
|
704
|
+
/**
|
|
705
|
+
* Rule 9 (design amendment R3b): fold URL-embedded credentials.
|
|
706
|
+
* Called from `redact()` before the rule-4 hostname pass so the
|
|
707
|
+
* webhook path IS folded before the host would collapse and leave
|
|
708
|
+
* the credential-carrying tail intact. Every replacement lands on
|
|
709
|
+
* the ledger as one `url-credential` row per distinct before-URL
|
|
710
|
+
* so the operator sees exactly what was stripped.
|
|
711
|
+
*
|
|
712
|
+
* The URL regex is deliberately looser than the rule-4 hostname
|
|
713
|
+
* regex: it captures optional userinfo, host with optional port,
|
|
714
|
+
* an optional path, and an optional query. A match that leaves the
|
|
715
|
+
* URL unchanged (no credential detected) is treated as a no-op and
|
|
716
|
+
* the ledger stays clean.
|
|
717
|
+
*
|
|
718
|
+
* @param {string} input
|
|
719
|
+
* @param {LedgerRow[]} ledger
|
|
720
|
+
* @returns {string}
|
|
721
|
+
*/
|
|
722
|
+
function redactUrlCredentials(input, ledger) {
|
|
723
|
+
// Optional userinfo (`user:pass@`), host with optional port,
|
|
724
|
+
// optional path (up to `?`, `#` or whitespace), optional query.
|
|
725
|
+
const re = /https?:\/\/(?:([^\s@/]+)@)?([A-Za-z0-9.-]+(?::[0-9]+)?)(\/[^\s?#)]*)?(\?[^\s#)]*)?/g;
|
|
726
|
+
const counts = new Map();
|
|
727
|
+
const afterFor = new Map();
|
|
728
|
+
const out = input.replace(re, (match, userinfo, hostAndPort, path, query) => {
|
|
729
|
+
const rewritten = rewriteOneUrlForCredentials(match, userinfo, hostAndPort, path, query);
|
|
730
|
+
if (rewritten === match) return match;
|
|
731
|
+
counts.set(match, (counts.get(match) ?? 0) + 1);
|
|
732
|
+
afterFor.set(match, rewritten);
|
|
733
|
+
return rewritten;
|
|
734
|
+
});
|
|
735
|
+
for (const [before, count] of counts) {
|
|
736
|
+
ledger.push({
|
|
737
|
+
rule: 'url-credential',
|
|
738
|
+
before,
|
|
739
|
+
after: afterFor.get(before) ?? '',
|
|
740
|
+
count,
|
|
741
|
+
});
|
|
742
|
+
}
|
|
743
|
+
return out;
|
|
744
|
+
}
|
|
745
|
+
|
|
746
|
+
/**
|
|
747
|
+
* Per-match URL rewriter. Extracted from `redactUrlCredentials` so the
|
|
748
|
+
* inner logic is straight-line and unit-testable. Returns the original
|
|
749
|
+
* `match` string when no credential shape was detected (caller treats
|
|
750
|
+
* that as a no-op and does not append a ledger row).
|
|
751
|
+
*
|
|
752
|
+
* @param {string} match
|
|
753
|
+
* @param {string | undefined} userinfo
|
|
754
|
+
* @param {string} hostAndPort
|
|
755
|
+
* @param {string | undefined} path
|
|
756
|
+
* @param {string | undefined} query
|
|
757
|
+
* @returns {string}
|
|
758
|
+
*/
|
|
759
|
+
function rewriteOneUrlForCredentials(match, userinfo, hostAndPort, path, query) {
|
|
760
|
+
let credRedacted = false;
|
|
761
|
+
let out = match.slice(0, match.indexOf('://') + 3);
|
|
762
|
+
|
|
763
|
+
if (userinfo) {
|
|
764
|
+
// Drop the userinfo entirely so the rule-4 hostname pass that
|
|
765
|
+
// runs next still sees a well-formed URL and can fold a non-
|
|
766
|
+
// allowlisted host to `<host>`. Keeping a `<url-credential>@`
|
|
767
|
+
// marker in front of the host would leave the regex looking at
|
|
768
|
+
// a `<` first char and the host would leak. The ledger row for
|
|
769
|
+
// this URL still names `url-credential` so the operator sees
|
|
770
|
+
// exactly what was stripped (before -> after diff).
|
|
771
|
+
credRedacted = true;
|
|
772
|
+
}
|
|
773
|
+
out += hostAndPort;
|
|
774
|
+
|
|
775
|
+
let pathOut = path ?? '';
|
|
776
|
+
if (path) {
|
|
777
|
+
const hostOnly = hostAndPort.toLowerCase().split(':')[0];
|
|
778
|
+
let webhookHit = false;
|
|
779
|
+
for (const wh of WEBHOOK_HOST_PATH_PREFIXES) {
|
|
780
|
+
if (hostOnly === wh.host || hostOnly.endsWith(`.${wh.host}`)) {
|
|
781
|
+
const prefix = wh.prefix;
|
|
782
|
+
if (prefix === '' || path === prefix || path.startsWith(`${prefix}/`)) {
|
|
783
|
+
const suffix = path.slice(prefix.length);
|
|
784
|
+
if (suffix.length > 1) {
|
|
785
|
+
pathOut = `${prefix}/<url-credential>`;
|
|
786
|
+
credRedacted = true;
|
|
787
|
+
webhookHit = true;
|
|
788
|
+
}
|
|
789
|
+
break;
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
}
|
|
793
|
+
if (!webhookHit) {
|
|
794
|
+
const parts = path.split('/');
|
|
795
|
+
for (let i = 1; i < parts.length; i += 1) {
|
|
796
|
+
if (looksHighEntropyPath(parts[i])) {
|
|
797
|
+
parts[i] = '<url-credential>';
|
|
798
|
+
credRedacted = true;
|
|
799
|
+
}
|
|
800
|
+
}
|
|
801
|
+
pathOut = parts.join('/');
|
|
802
|
+
}
|
|
803
|
+
}
|
|
804
|
+
out += pathOut;
|
|
805
|
+
|
|
806
|
+
let queryOut = '';
|
|
807
|
+
if (query) {
|
|
808
|
+
const kvs = query.slice(1).split('&').map((pair) => {
|
|
809
|
+
if (!pair.includes('=')) return pair;
|
|
810
|
+
const eq = pair.indexOf('=');
|
|
811
|
+
const k = pair.slice(0, eq);
|
|
812
|
+
const v = pair.slice(eq + 1);
|
|
813
|
+
const kLower = k.toLowerCase();
|
|
814
|
+
if (PRESIGNED_QUERY_NAMES.has(kLower) || matchesSecretKeyLoose(k)) {
|
|
815
|
+
if (v.length > 0) {
|
|
816
|
+
credRedacted = true;
|
|
817
|
+
return `${k}=<url-credential>`;
|
|
818
|
+
}
|
|
819
|
+
return pair;
|
|
820
|
+
}
|
|
821
|
+
if (looksHighEntropyPath(v)) {
|
|
822
|
+
credRedacted = true;
|
|
823
|
+
return `${k}=<url-credential>`;
|
|
824
|
+
}
|
|
825
|
+
return pair;
|
|
826
|
+
});
|
|
827
|
+
queryOut = `?${kvs.join('&')}`;
|
|
828
|
+
}
|
|
829
|
+
out += queryOut;
|
|
830
|
+
|
|
831
|
+
return credRedacted ? out : match;
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* Entropy heuristic for URL path or query values: 16+ chars of the
|
|
836
|
+
* URL-safe alphabet with at least two character classes present. The
|
|
837
|
+
* webhook token `AAAAAAAAAAAAAAAAAAAAAAAA` (single class) will NOT
|
|
838
|
+
* trip this on its own; the webhook host-prefix rule catches it. The
|
|
839
|
+
* threshold is lower than the general `entropy-blob` (32) because a
|
|
840
|
+
* URL segment carrying a credential is usually shorter than a raw
|
|
841
|
+
* secret in prose.
|
|
842
|
+
*
|
|
843
|
+
* @param {string} value
|
|
844
|
+
*/
|
|
845
|
+
function looksHighEntropyPath(value) {
|
|
846
|
+
if (typeof value !== 'string') return false;
|
|
847
|
+
if (value.length < 16) return false;
|
|
848
|
+
if (!/^[A-Za-z0-9._~+/=-]+$/.test(value)) return false;
|
|
849
|
+
let classes = 0;
|
|
850
|
+
if (/[A-Z]/.test(value)) classes += 1;
|
|
851
|
+
if (/[a-z]/.test(value)) classes += 1;
|
|
852
|
+
if (/\d/.test(value)) classes += 1;
|
|
853
|
+
if (/[._~+/=-]/.test(value)) classes += 1;
|
|
854
|
+
return classes >= 2;
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
// -- internal helpers -----------------------------------------------------
|
|
858
|
+
|
|
859
|
+
/**
|
|
860
|
+
* Fold a `projectRoot` context value (string, array of strings, or
|
|
861
|
+
* nullish) into a deduped array of spellings, longest first, so
|
|
862
|
+
* `/private/tmp/foo` is stripped before `/tmp/foo` would leave the
|
|
863
|
+
* trailing tail untouched.
|
|
864
|
+
*
|
|
865
|
+
* @param {string | string[] | null | undefined} value
|
|
866
|
+
* @returns {string[]}
|
|
867
|
+
*/
|
|
868
|
+
function normaliseRootSpellings(value) {
|
|
869
|
+
if (!value) return [];
|
|
870
|
+
const raw = Array.isArray(value) ? value : [value];
|
|
871
|
+
const seen = new Set();
|
|
872
|
+
const out = [];
|
|
873
|
+
for (const s of raw) {
|
|
874
|
+
if (typeof s !== 'string' || s.length === 0) continue;
|
|
875
|
+
if (seen.has(s)) continue;
|
|
876
|
+
seen.add(s);
|
|
877
|
+
out.push(s);
|
|
878
|
+
}
|
|
879
|
+
out.sort((a, b) => b.length - a.length);
|
|
880
|
+
return out;
|
|
881
|
+
}
|
|
882
|
+
|
|
883
|
+
function replaceAndLog(text, pattern, replacement, rule, ledger) {
|
|
884
|
+
const re = pattern instanceof RegExp ? pattern : new RegExp(pattern, 'g');
|
|
885
|
+
let count = 0;
|
|
886
|
+
let sample = null;
|
|
887
|
+
const out = text.replace(re, (match) => {
|
|
888
|
+
count += 1;
|
|
889
|
+
if (sample === null) sample = match;
|
|
890
|
+
return typeof replacement === 'function' ? replacement(match) : replacement;
|
|
891
|
+
});
|
|
892
|
+
if (count > 0) {
|
|
893
|
+
ledger.push({
|
|
894
|
+
rule,
|
|
895
|
+
before: String(sample),
|
|
896
|
+
after: typeof replacement === 'function' ? replacement(sample) : replacement,
|
|
897
|
+
count,
|
|
898
|
+
});
|
|
899
|
+
}
|
|
900
|
+
return out;
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
function replaceRegex(text, re, replacer, rule, ledger) {
|
|
904
|
+
let count = 0;
|
|
905
|
+
let sampleBefore = null;
|
|
906
|
+
let sampleAfter = null;
|
|
907
|
+
const out = text.replace(re, (match, ...args) => {
|
|
908
|
+
const after = replacer(match, ...args);
|
|
909
|
+
if (after === match) return match;
|
|
910
|
+
count += 1;
|
|
911
|
+
if (sampleBefore === null) {
|
|
912
|
+
sampleBefore = match;
|
|
913
|
+
sampleAfter = after;
|
|
914
|
+
}
|
|
915
|
+
return after;
|
|
916
|
+
});
|
|
917
|
+
if (count > 0) {
|
|
918
|
+
ledger.push({ rule, before: sampleBefore, after: sampleAfter, count });
|
|
919
|
+
}
|
|
920
|
+
return out;
|
|
921
|
+
}
|
|
922
|
+
|
|
923
|
+
/**
|
|
924
|
+
* Variant of `replaceRegex` that logs ONE ledger row per distinct
|
|
925
|
+
* before-sample the pattern matched, not one row per pattern call.
|
|
926
|
+
* Two `password=A` and `password=B` hits in a single field both land
|
|
927
|
+
* as their own rows so the operator disclosure ledger names every
|
|
928
|
+
* secret that was stripped (F-slice-2-09 within-field case).
|
|
929
|
+
*
|
|
930
|
+
* @param {string} text
|
|
931
|
+
* @param {RegExp} re a /g flag is required
|
|
932
|
+
* @param {string} replacement the after text (constant)
|
|
933
|
+
* @param {string} rule ledger row rule name
|
|
934
|
+
* @param {LedgerRow[]} ledger
|
|
935
|
+
* @returns {string}
|
|
936
|
+
*/
|
|
937
|
+
function replaceEachDistinct(text, re, replacement, rule, ledger) {
|
|
938
|
+
const counts = new Map();
|
|
939
|
+
const out = text.replace(re, (match) => {
|
|
940
|
+
counts.set(match, (counts.get(match) ?? 0) + 1);
|
|
941
|
+
return replacement;
|
|
942
|
+
});
|
|
943
|
+
for (const [before, count] of counts) {
|
|
944
|
+
ledger.push({ rule, before, after: replacement, count });
|
|
945
|
+
}
|
|
946
|
+
return out;
|
|
947
|
+
}
|
|
948
|
+
|
|
949
|
+
function escapeRe(s) {
|
|
950
|
+
return s.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
function escapedLiteral(s) {
|
|
954
|
+
return escapeRe(s);
|
|
955
|
+
}
|
|
956
|
+
|
|
957
|
+
function isHostAllowed(host, allowSet) {
|
|
958
|
+
const h = host.toLowerCase();
|
|
959
|
+
if (allowSet.has(h)) return true;
|
|
960
|
+
// Match by registrable-domain suffix: `sub.github.com` matches
|
|
961
|
+
// `github.com` when the allowlist has `github.com`.
|
|
962
|
+
for (const allowed of allowSet) {
|
|
963
|
+
if (h === allowed) return true;
|
|
964
|
+
if (h.endsWith(`.${allowed}`)) return true;
|
|
965
|
+
}
|
|
966
|
+
return false;
|
|
967
|
+
}
|
|
968
|
+
|
|
969
|
+
function truncateToBytes(text, maxBytes) {
|
|
970
|
+
const buf = Buffer.from(text, 'utf8');
|
|
971
|
+
if (buf.length <= maxBytes) return text;
|
|
972
|
+
// Truncate at a UTF-8 boundary. Buffer.toString('utf8') on a slice
|
|
973
|
+
// that lands mid-codepoint would emit replacement chars; walk back
|
|
974
|
+
// to the last complete codepoint.
|
|
975
|
+
let cut = maxBytes;
|
|
976
|
+
while (cut > 0 && (buf[cut] & 0xc0) === 0x80) cut -= 1;
|
|
977
|
+
return buf.slice(0, cut).toString('utf8');
|
|
978
|
+
}
|
|
979
|
+
|
|
980
|
+
// Secret patterns are the closed vocabulary rule 5 (secret-token in the
|
|
981
|
+
// ledger) applies. Kept as a module-scope helper so `findResidualSecrets`
|
|
982
|
+
// runs the same set the redactor used.
|
|
983
|
+
//
|
|
984
|
+
// F-slice-2-01: `kv-secret` must catch short and quoted values too;
|
|
985
|
+
// any well-known key name paired with any non-empty value is a secret.
|
|
986
|
+
// F-slice-2-02: `authorization` matches to end of line so the header
|
|
987
|
+
// value AND the credential fold together.
|
|
988
|
+
// F-slice-2-03: `pem` matches the whole BEGIN..END block, not just
|
|
989
|
+
// the BEGIN delimiter, so the key payload leaves with it.
|
|
990
|
+
function secretPatterns() {
|
|
991
|
+
return [
|
|
992
|
+
{ name: 'github-token', re: /\b(?:ghp|gho|ghu|ghs|ghr)_[A-Za-z0-9]{20,}\b/g },
|
|
993
|
+
{ name: 'github-pat', re: /\bgithub_pat_[A-Za-z0-9_]{20,}\b/g },
|
|
994
|
+
{ name: 'aws-access', re: /\bAKIA[0-9A-Z]{16}\b/g },
|
|
995
|
+
{ name: 'stripe', re: /\bsk_(?:live|test)_[A-Za-z0-9]{20,}\b/g },
|
|
996
|
+
{ name: 'openai', re: /\bsk-[A-Za-z0-9]{20,}\b/g },
|
|
997
|
+
{ name: 'slack', re: /\bxox[abp]-[A-Za-z0-9-]{10,}\b/g },
|
|
998
|
+
{ name: 'jwt', re: /\beyJ[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\.[A-Za-z0-9_-]{10,}\b/g },
|
|
999
|
+
// R-P0-2: broaden PEM to accept 1..5 dashes on each delimiter so a
|
|
1000
|
+
// block whose fences were folded by dash normalisation earlier in
|
|
1001
|
+
// the pass (em-dash `—BEGIN...—` -> `-BEGIN...-`) still
|
|
1002
|
+
// matches. The eight-rule ordering keeps this the last line of
|
|
1003
|
+
// defence before the residual scan.
|
|
1004
|
+
{ name: 'pem', re: /-{1,5}BEGIN (?:[A-Z0-9 ]+ )?PRIVATE KEY-{1,5}[\s\S]*?-{1,5}END (?:[A-Z0-9 ]+ )?PRIVATE KEY-{1,5}/g },
|
|
1005
|
+
{ name: 'bearer', re: /\bBearer\s+[A-Za-z0-9._~+/=-]{4,}/g },
|
|
1006
|
+
{ name: 'authorization', re: /^[ \t]*authorization[ \t]*:[^\n]+/gim },
|
|
1007
|
+
// Well-known key names paired with ANY non-empty value are
|
|
1008
|
+
// secrets by convention. The value class stays permissive so
|
|
1009
|
+
// short and quoted values (e.g. "password": "abc") fold too.
|
|
1010
|
+
// R-P0-1: allow tab (and any whitespace) between key and the
|
|
1011
|
+
// `:` / `=` separator; the previous ["' ]* class dropped tabs
|
|
1012
|
+
// and let `password\t=Abc12345` slip past the redactor.
|
|
1013
|
+
// F-slice-2-01: quoted values with an embedded escaped quote
|
|
1014
|
+
// (`"ab\"cd"`) previously truncated at the first `"`; the value
|
|
1015
|
+
// alternatives now consume `\<any>` escape sequences too.
|
|
1016
|
+
// Round 4 (F-P0-A): vocabulary comes from the shared
|
|
1017
|
+
// SECRET_KEY_VOCABULARY constant so the first-pass, early-guard
|
|
1018
|
+
// and residual-scan safeguard cover the same set.
|
|
1019
|
+
{
|
|
1020
|
+
name: 'kv-secret',
|
|
1021
|
+
re: new RegExp(
|
|
1022
|
+
`${secretKeyRegexSource()}["'\\s]*[:=][ \\t]*(?:"(?:\\\\.|[^"\\\\\\n])+"|'(?:\\\\.|[^'\\\\\\n])+'|[^\\s,;)}\\]]+)`,
|
|
1023
|
+
'gi',
|
|
1024
|
+
),
|
|
1025
|
+
},
|
|
1026
|
+
// Round 4 (R3a): `hash` fires only when the value is 16+ chars.
|
|
1027
|
+
{ name: 'kv-hash-long', re: /\bhash["'\s]*[:=][ \t]*(?:"(?:\\.|[^"\\\n]){16,}"|'(?:\\.|[^'\\\n]){16,}'|[^\s,;)}\]]{16,})/gi },
|
|
1028
|
+
// Round 4 (R3b): URL-embedded credentials caught at residual time.
|
|
1029
|
+
// Slack/Discord webhook path shape and userinfo shape. The first-
|
|
1030
|
+
// pass rule 9 handles these; this residual pattern is the belt-
|
|
1031
|
+
// and-braces backstop for a body that reassembled a webhook URL
|
|
1032
|
+
// from parts the primary scan did not treat as one URL.
|
|
1033
|
+
{ name: 'webhook-path', re: /\/(?:services|api\/webhooks|bot)\/[A-Za-z0-9._~+/=-]{20,}/g },
|
|
1034
|
+
{ name: 'url-userinfo', re: /https?:\/\/[^\s\/@]+:[^\s\/@]+@[A-Za-z0-9.-]+/g },
|
|
1035
|
+
// High-entropy blob. Anchored to non-word boundaries so it does not
|
|
1036
|
+
// fold with the specific patterns above; excludes 7/12/40-char
|
|
1037
|
+
// hex-only sha values (git object shape).
|
|
1038
|
+
{ name: 'entropy-blob', re: /\b(?![0-9a-f]{7}\b)(?![0-9a-f]{12}\b)(?![0-9a-f]{40}\b)(?=[A-Za-z0-9_-]{32,})(?=.*[A-Z])(?=.*[a-z])(?=.*\d)[A-Za-z0-9_-]{32,}\b/g },
|
|
1039
|
+
];
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
/**
|
|
1043
|
+
* Round 5 (design amendment R4): apply the R4 scanner and fold each
|
|
1044
|
+
* hit to `<redacted:secret>`. Ledger rows land under the canonical
|
|
1045
|
+
* `secret-token` rule name so operator disclosure stays consistent
|
|
1046
|
+
* with the primary kv-secret pass; `replaceEachDistinct` in the
|
|
1047
|
+
* caller-side ledger fold sums counts across identical before-samples.
|
|
1048
|
+
*
|
|
1049
|
+
* @param {string} text
|
|
1050
|
+
* @param {LedgerRow[]} ledger
|
|
1051
|
+
* @returns {string}
|
|
1052
|
+
*/
|
|
1053
|
+
function redactR4Separators(text, ledger) {
|
|
1054
|
+
const hits = scanR4Leaks(text);
|
|
1055
|
+
if (hits.length === 0) return text;
|
|
1056
|
+
// Splice from the right so earlier indices stay valid.
|
|
1057
|
+
const counts = new Map();
|
|
1058
|
+
let out = text;
|
|
1059
|
+
for (let i = hits.length - 1; i >= 0; i -= 1) {
|
|
1060
|
+
const { start, end, match } = hits[i];
|
|
1061
|
+
counts.set(match, (counts.get(match) ?? 0) + 1);
|
|
1062
|
+
out = `${out.slice(0, start)}<redacted:secret>${out.slice(end)}`;
|
|
1063
|
+
}
|
|
1064
|
+
for (const [before, count] of counts) {
|
|
1065
|
+
ledger.push({ rule: 'secret-token', before, after: '<redacted:secret>', count });
|
|
1066
|
+
}
|
|
1067
|
+
return out;
|
|
1068
|
+
}
|
|
1069
|
+
|
|
1070
|
+
function redactSecrets(input, ledger) {
|
|
1071
|
+
let text = input;
|
|
1072
|
+
for (const { re } of secretPatterns()) {
|
|
1073
|
+
text = replaceEachDistinct(text, re, '<redacted:secret>', 'secret-token', ledger);
|
|
1074
|
+
}
|
|
1075
|
+
// Round 5 (design amendment R4): a vocabulary key labelling a value
|
|
1076
|
+
// via any separator (markdown table pipe, whitespace, tab, hyphen,
|
|
1077
|
+
// arrow, HTML entity, or the prose bridges is / was / set to) is a
|
|
1078
|
+
// secret. Runs AFTER the primary rule-5 loop so `key=value` and
|
|
1079
|
+
// `Authorization:` shapes already folded (canonical rule names
|
|
1080
|
+
// stay visible in the ledger), and AFTER the dash normalisation in
|
|
1081
|
+
// rule 8a-early so em-dash and other Unicode separators reach this
|
|
1082
|
+
// pass as ASCII hyphens. False positives are visible in the ledger
|
|
1083
|
+
// (design says false positives are acceptable; a labelled value
|
|
1084
|
+
// reaching the body is not) but the mixed-classes gate in
|
|
1085
|
+
// `looksLikeSecretValue` keeps ordinary prose intact.
|
|
1086
|
+
text = redactR4Separators(text, ledger);
|
|
1087
|
+
// F-slice-2-09: keep every distinct before/after pair so the
|
|
1088
|
+
// operator disclosure ledger shows exactly what was stripped.
|
|
1089
|
+
// `replaceEachDistinct` already writes one row per distinct
|
|
1090
|
+
// before-sample WITHIN a single pattern, so two different
|
|
1091
|
+
// `password=A` / `password=B` hits in the same field are two rows.
|
|
1092
|
+
// The fold below dedupes across DIFFERENT patterns that produced
|
|
1093
|
+
// the same before text (e.g. a token caught by both a specific
|
|
1094
|
+
// pattern and the loose entropy-blob) and sums their counts.
|
|
1095
|
+
const folded = [];
|
|
1096
|
+
for (const row of ledger) {
|
|
1097
|
+
if (row.rule !== 'secret-token') {
|
|
1098
|
+
folded.push(row);
|
|
1099
|
+
continue;
|
|
1100
|
+
}
|
|
1101
|
+
const twin = folded.find((r) => r.rule === 'secret-token' && r.before === row.before);
|
|
1102
|
+
if (twin) twin.count += row.count;
|
|
1103
|
+
else folded.push({ ...row });
|
|
1104
|
+
}
|
|
1105
|
+
ledger.length = 0;
|
|
1106
|
+
for (const r of folded) ledger.push(r);
|
|
1107
|
+
return text;
|
|
1108
|
+
}
|