rcf-lite 0.24.0 → 0.26.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 +36 -0
- package/blueprints/application-account-settings/docs/topics.md +4 -1
- package/blueprints/application-admin-console/docs/topics.md +4 -1
- package/blueprints/application-api-rest/docs/topics.md +4 -1
- package/blueprints/application-charts/docs/topics.md +4 -1
- package/blueprints/application-dashboard/docs/topics.md +4 -1
- package/blueprints/application-datatable/docs/topics.md +4 -1
- package/blueprints/application-empty-error-states/docs/topics.md +4 -1
- package/blueprints/application-error-handling/docs/topics.md +4 -1
- package/blueprints/application-file-upload/docs/topics.md +4 -1
- package/blueprints/application-forms-wizard/docs/topics.md +4 -1
- package/blueprints/application-notifications-in-app/docs/topics.md +4 -1
- package/blueprints/application-onboarding-tour/docs/topics.md +4 -1
- package/blueprints/application-spa/docs/topics.md +4 -1
- package/blueprints/delivery-ci-workflows/docs/topics.md +4 -1
- package/blueprints/deploy-cloudflare-workers/docs/topics.md +4 -1
- package/blueprints/deploy-hetzner-server/CHANGELOG.md +55 -0
- package/blueprints/deploy-hetzner-server/README.md +202 -0
- package/blueprints/deploy-hetzner-server/blueprint.json +233 -0
- package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3801-deploy-hetzner-server-cloud-host-contract.json +14 -0
- package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3802-deploy-hetzner-server-snapshot-cadence.json +14 -0
- package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json +20 -0
- package/blueprints/deploy-hetzner-server/contributions/adrs/adr-3804-deploy-hetzner-server-hardening-baseline.json +14 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/cloud-init-render-lint.mjs +71 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/hcloud-dry-run-mock.mjs +164 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/manifest-schema-validate.mjs +182 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/probe-utils.mjs +112 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-cloud-init-hardened.mjs +64 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-snapshot-on-demand.mjs +60 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/real-account-throwaway-server-provision.mjs +58 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/run-cloud-init-render-lint.mjs +9 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/run-hcloud-dry-run-mock.mjs +9 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/run-manifest-schema-validate.mjs +9 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/run-real-account-cloud-init-hardened.mjs +9 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/run-real-account-snapshot-on-demand.mjs +9 -0
- package/blueprints/deploy-hetzner-server/contributions/probes/run-real-account-throwaway-server-provision.mjs +9 -0
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-001.json +18 -0
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-002.json +18 -0
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-003.json +18 -0
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-004.json +18 -0
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-005.json +18 -0
- package/blueprints/deploy-hetzner-server/contributions/requirements/deploy-hetzner-server-req-006.json +18 -0
- package/blueprints/deploy-hetzner-server/contributions/schemas/hetzner-server.schema.json +108 -0
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3801-deploy-hetzner-server-provisioner.json +27 -0
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3802-deploy-hetzner-server-manifest-schema.json +26 -0
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3803-deploy-hetzner-server-cloud-init-template.json +26 -0
- package/blueprints/deploy-hetzner-server/contributions/tacs/tac-3804-deploy-hetzner-server-firewall-shape.json +25 -0
- package/blueprints/deploy-hetzner-server/contributions/templates/cloud-init.yaml.tmpl +113 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37101.json +24 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37102.json +24 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37103.json +25 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37104.json +24 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37105.json +24 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37106.json +25 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37107.json +24 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37108.json +24 -0
- package/blueprints/deploy-hetzner-server/contributions/user-stories/deploy-hetzner-server-us-37109.json +24 -0
- package/blueprints/deploy-hetzner-server/docs/topics.md +48 -0
- package/blueprints/deploy-hetzner-server/guide/deploy-hetzner-server.md +180 -0
- package/blueprints/edge-cloudflare-access/docs/topics.md +4 -1
- package/blueprints/edge-cloudflare-rate-limiting/docs/topics.md +4 -1
- package/blueprints/edge-cloudflare-tunnel/CHANGELOG.md +23 -0
- package/blueprints/edge-cloudflare-tunnel/README.md +257 -0
- package/blueprints/edge-cloudflare-tunnel/blueprint.json +168 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4001-edge-cloudflare-tunnel-ingress-bridge-contract.json +23 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4002-edge-cloudflare-tunnel-connector-runtime.json +19 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/adrs/adr-4003-edge-cloudflare-tunnel-hostname-mode.json +19 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/aud-presence-check.mjs +114 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/cloudflared-config-lint.mjs +80 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/manifest-schema-validate.mjs +237 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/probe-utils.mjs +231 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-connector-healthy.mjs +143 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/real-account-tunnel-hostname-routes.mjs +166 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-aud-presence-check.mjs +4 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-cloudflared-config-lint.mjs +4 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-manifest-schema-validate.mjs +4 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-real-account-connector-healthy.mjs +4 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/run-real-account-tunnel-hostname-routes.mjs +4 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/probes/tunnel-manifest.schema.json +55 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-001.json +18 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-002.json +18 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-003.json +18 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-004.json +18 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/requirements/edge-cloudflare-tunnel-req-005.json +18 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +26 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4002-edge-cloudflare-tunnel-manifest-schema.json +26 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/tacs/tac-4003-edge-cloudflare-tunnel-access-binding.json +25 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39101.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39102.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39103.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39104.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39105.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39106.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39107.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/contributions/user-stories/edge-cloudflare-tunnel-us-39108.json +24 -0
- package/blueprints/edge-cloudflare-tunnel/docs/topics.md +72 -0
- package/blueprints/edge-cloudflare-tunnel/guide/edge-cloudflare-tunnel.md +204 -0
- package/blueprints/edge-cloudflare-turnstile/docs/topics.md +4 -1
- package/blueprints/email-smtp-resend/docs/topics.md +4 -1
- package/blueprints/jobs-background/docs/topics.md +4 -1
- package/blueprints/messaging-queue-cloudflare/CHANGELOG.md +19 -0
- package/blueprints/messaging-queue-cloudflare/README.md +2 -2
- package/blueprints/messaging-queue-cloudflare/blueprint.json +1 -1
- package/blueprints/messaging-queue-cloudflare/contributions/probes/real-account-concurrency-smoke.mjs +192 -37
- package/blueprints/messaging-queue-cloudflare/docs/topics.md +4 -1
- package/blueprints/object-storage-s3/CHANGELOG.md +11 -0
- package/blueprints/object-storage-s3/README.md +14 -1
- package/blueprints/object-storage-s3/blueprint.json +12 -1
- package/blueprints/object-storage-s3/contributions/adrs/adr-2905-object-storage-s3-hetzner-object-storage-provider.json +30 -0
- package/blueprints/object-storage-s3/contributions/probes/hetzner-object-storage-round-trip.mjs +136 -0
- package/blueprints/object-storage-s3/contributions/probes/run-hetzner-object-storage-round-trip.mjs +11 -0
- package/blueprints/object-storage-s3/contributions/requirements/object-storage-s3-req-101.json +18 -0
- package/blueprints/object-storage-s3/contributions/tacs/tac-2904-object-storage-s3-hetzner-endpoint-helper.json +34 -0
- package/blueprints/object-storage-s3/contributions/user-stories/object-storage-s3-us-28110.json +25 -0
- package/blueprints/object-storage-s3/docs/topics.md +4 -1
- package/blueprints/object-storage-s3/guide/object-storage-s3.md +36 -0
- package/blueprints/observability-essentials/docs/topics.md +4 -1
- package/blueprints/observability-logging/docs/topics.md +4 -1
- package/blueprints/observability-probe-endpoints/docs/topics.md +4 -1
- package/blueprints/persistence-data-d1/docs/topics.md +4 -1
- package/blueprints/persistence-data-postgres/docs/topics.md +4 -1
- package/blueprints/persistence-data-sqlite/docs/topics.md +4 -1
- package/blueprints/platform-cloudflare-cron-triggers/docs/topics.md +4 -1
- package/blueprints/platform-cloudflare-durable-objects/CHANGELOG.md +15 -0
- package/blueprints/platform-cloudflare-durable-objects/blueprint.json +1 -1
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/namespace-facade-ready.mjs +3 -3
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/probe-utils.mjs +28 -14
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/real-account-storage-smoke.mjs +132 -26
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/sole-reader-scan.mjs +40 -39
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/storage-round-trip.mjs +26 -16
- package/blueprints/platform-cloudflare-durable-objects/contributions/probes/websocket-hub-broadcast.mjs +31 -34
- package/blueprints/platform-cloudflare-durable-objects/docs/topics.md +4 -1
- package/blueprints/platform-cloudflare-kv/CHANGELOG.md +40 -1
- package/blueprints/platform-cloudflare-kv/README.md +41 -13
- package/blueprints/platform-cloudflare-kv/blueprint.json +1 -1
- package/blueprints/platform-cloudflare-kv/contributions/probes/cache-aside-hit-then-miss.mjs +26 -26
- package/blueprints/platform-cloudflare-kv/contributions/probes/event-secrecy.mjs +49 -31
- package/blueprints/platform-cloudflare-kv/contributions/probes/facade-round-trip.mjs +58 -16
- package/blueprints/platform-cloudflare-kv/contributions/probes/list-with-prefix.mjs +6 -5
- package/blueprints/platform-cloudflare-kv/contributions/probes/real-account-eventual-consistency-smoke.mjs +131 -67
- package/blueprints/platform-cloudflare-kv/docs/topics.md +4 -1
- package/blueprints/platform-docker-compose-host/CHANGELOG.md +12 -0
- package/blueprints/platform-docker-compose-host/README.md +76 -0
- package/blueprints/platform-docker-compose-host/blueprint.json +209 -0
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3901-platform-docker-compose-host-contract.json +14 -0
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3902-platform-docker-compose-host-reverse-proxy.json +14 -0
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3903-platform-docker-compose-host-reject-coolify.json +14 -0
- package/blueprints/platform-docker-compose-host/contributions/adrs/adr-3904-platform-docker-compose-host-log-driver.json +14 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/caddyfile-validate.mjs +108 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/compose-config-lint.mjs +231 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/probe-utils.mjs +185 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-minimal-stack-up.mjs +41 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/real-account-reload-burst.mjs +36 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/run-caddyfile-validate.mjs +5 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/run-compose-config-lint.mjs +5 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/run-real-account-minimal-stack-up.mjs +5 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/run-real-account-reload-burst.mjs +5 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/run-secrets-as-files-scan.mjs +5 -0
- package/blueprints/platform-docker-compose-host/contributions/probes/secrets-as-files-scan.mjs +116 -0
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-001.json +18 -0
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-002.json +18 -0
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-003.json +18 -0
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-004.json +18 -0
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-005.json +18 -0
- package/blueprints/platform-docker-compose-host/contributions/requirements/platform-docker-compose-host-req-006.json +18 -0
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3901-platform-docker-compose-host-compose-layout.json +26 -0
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3902-platform-docker-compose-host-secrets-mount.json +26 -0
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3903-platform-docker-compose-host-healthcheck-lint.json +26 -0
- package/blueprints/platform-docker-compose-host/contributions/tacs/tac-3904-platform-docker-compose-host-reverse-proxy-artefact.json +26 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38101.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38102.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38103.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38104.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38105.json +25 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38106.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38107.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38108.json +24 -0
- package/blueprints/platform-docker-compose-host/contributions/user-stories/platform-docker-compose-host-us-38109.json +24 -0
- package/blueprints/platform-docker-compose-host/docs/topics.md +71 -0
- package/blueprints/platform-docker-compose-host/guide/platform-docker-compose-host.md +94 -0
- package/blueprints/security-auth-clerk/docs/topics.md +4 -1
- package/blueprints/security-auth-keycloak/docs/topics.md +4 -1
- package/blueprints/security-auth-magic-link/docs/topics.md +4 -1
- package/blueprints/security-auth-oauth2/docs/topics.md +4 -1
- package/blueprints/security-secrets-management/docs/topics.md +4 -1
- package/fixtures/canary-manifest.json +9 -9
- package/guidance/harness-template.md +67 -0
- package/guidance/managed/agent-instructions-block.hash +1 -1
- package/guidance/managed/agent-instructions-block.md +67 -0
- package/package.json +2 -2
- package/rcf/adrs/adr-3801-deploy-hetzner-server-cloud-host-contract.json +13 -0
- package/rcf/adrs/adr-3802-deploy-hetzner-server-snapshot-cadence.json +13 -0
- package/rcf/adrs/adr-3803-deploy-hetzner-server-provisioning-tool.json +13 -0
- package/rcf/adrs/adr-3804-deploy-hetzner-server-hardening-baseline.json +13 -0
- package/rcf/adrs/adr-3901-platform-docker-compose-host-contract.json +13 -0
- package/rcf/adrs/adr-3902-platform-docker-compose-host-reverse-proxy.json +13 -0
- package/rcf/adrs/adr-3903-platform-docker-compose-host-reject-coolify.json +13 -0
- package/rcf/adrs/adr-3904-platform-docker-compose-host-log-driver.json +13 -0
- package/rcf/adrs/adr-4001-edge-cloudflare-tunnel-ingress-bridge-contract.json +13 -0
- package/rcf/adrs/adr-4002-edge-cloudflare-tunnel-connector-runtime.json +13 -0
- package/rcf/adrs/adr-4003-edge-cloudflare-tunnel-hostname-mode.json +13 -0
- package/rcf/code-nodes/cn-410.json +20 -0
- package/rcf/code-nodes/cn-440.json +20 -0
- package/rcf/code-nodes/cn-470.json +19 -0
- package/rcf/code-nodes/cn-500.json +12 -0
- package/rcf/code-nodes/cn-510.json +12 -0
- package/rcf/code-nodes/cn-520.json +14 -0
- package/rcf/code-nodes/cn-521.json +12 -0
- package/rcf/code-nodes/cn-522.json +13 -0
- package/rcf/code-nodes/cn-523.json +12 -0
- package/rcf/code-nodes/cn-524.json +14 -0
- package/rcf/code-nodes/cn-525.json +12 -0
- package/rcf/code-nodes/cn-526.json +14 -0
- package/rcf/fbs/fbs-130.json +23 -0
- package/rcf/fbs/fbs-140.json +23 -0
- package/rcf/fbs/fbs-150.json +22 -0
- package/rcf/fbs/fbs-160.json +15 -0
- package/rcf/fbs/fbs-165.json +15 -0
- package/rcf/fbs/fbs-170.json +16 -0
- package/rcf/fbs/fbs-171.json +16 -0
- package/rcf/fbs/fbs-172.json +15 -0
- package/rcf/fbs/fbs-173.json +17 -0
- package/rcf/fbs/fbs-174.json +17 -0
- package/rcf/requirements/req-110.json +58 -0
- package/rcf/requirements/req-111.json +32 -0
- package/rcf/requirements/req-112.json +42 -0
- package/rcf/requirements/req-113.json +33 -0
- package/rcf/requirements/req-114.json +20 -0
- package/rcf/requirements/req-115.json +38 -0
- package/rcf/requirements/req-120.json +20 -0
- package/rcf/requirements/req-121.json +20 -0
- package/rcf/requirements/req-122.json +20 -0
- package/rcf/requirements/req-123.json +42 -0
- package/rcf/requirements/req-124.json +27 -0
- package/rcf/requirements/req-125.json +20 -0
- package/rcf/requirements/req-130.json +32 -0
- package/rcf/requirements/req-131.json +54 -0
- package/rcf/requirements/req-132.json +27 -0
- package/rcf/requirements/req-133.json +20 -0
- package/rcf/requirements/req-134.json +42 -0
- package/rcf/requirements/req-140.json +149 -0
- package/rcf/requirements/req-145.json +53 -0
- package/rcf/requirements/req-150.json +20 -0
- package/rcf/requirements/req-151.json +85 -0
- package/rcf/requirements/req-152.json +20 -0
- package/rcf/requirements/req-153.json +59 -0
- package/rcf/requirements/req-154.json +44 -0
- package/rcf/tacs/tac-3801-deploy-hetzner-server-provisioner.json +17 -0
- package/rcf/tacs/tac-3802-deploy-hetzner-server-manifest-schema.json +17 -0
- package/rcf/tacs/tac-3803-deploy-hetzner-server-cloud-init-template.json +17 -0
- package/rcf/tacs/tac-3804-deploy-hetzner-server-firewall-shape.json +16 -0
- package/rcf/tacs/tac-3901-platform-docker-compose-host-compose-layout.json +17 -0
- package/rcf/tacs/tac-3902-platform-docker-compose-host-secrets-mount.json +17 -0
- package/rcf/tacs/tac-3903-platform-docker-compose-host-healthcheck-lint.json +17 -0
- package/rcf/tacs/tac-3904-platform-docker-compose-host-reverse-proxy-artefact.json +17 -0
- package/rcf/tacs/tac-4001-edge-cloudflare-tunnel-connector-shape.json +17 -0
- package/rcf/tacs/tac-4002-edge-cloudflare-tunnel-manifest-schema.json +17 -0
- package/rcf/tacs/tac-4003-edge-cloudflare-tunnel-access-binding.json +16 -0
- package/rcf/test-suites/ts-071.json +2 -2
- package/rcf/test-suites/ts-086.json +2 -2
- package/rcf/test-suites/ts-140.json +86 -0
- package/rcf/test-suites/ts-150.json +86 -0
- package/rcf/test-suites/ts-160.json +78 -0
- package/rcf/test-suites/ts-170.json +22 -0
- package/rcf/test-suites/ts-175.json +22 -0
- package/rcf/test-suites/ts-180.json +30 -0
- package/rcf/test-suites/ts-181.json +30 -0
- package/rcf/test-suites/ts-182.json +22 -0
- package/rcf/test-suites/ts-183.json +38 -0
- package/rcf/test-suites/ts-184.json +38 -0
- package/rcf/user-stories/us-11001.json +23 -0
- package/rcf/user-stories/us-11101.json +23 -0
- package/rcf/user-stories/us-11102.json +24 -0
- package/rcf/user-stories/us-11201.json +23 -0
- package/rcf/user-stories/us-11202.json +23 -0
- package/rcf/user-stories/us-11301.json +24 -0
- package/rcf/user-stories/us-11401.json +23 -0
- package/rcf/user-stories/us-11402.json +23 -0
- package/rcf/user-stories/us-11501.json +23 -0
- package/rcf/user-stories/us-12001.json +23 -0
- package/rcf/user-stories/us-12101.json +23 -0
- package/rcf/user-stories/us-12102.json +23 -0
- package/rcf/user-stories/us-12201.json +23 -0
- package/rcf/user-stories/us-12202.json +24 -0
- package/rcf/user-stories/us-12301.json +23 -0
- package/rcf/user-stories/us-12401.json +23 -0
- package/rcf/user-stories/us-12402.json +23 -0
- package/rcf/user-stories/us-12501.json +23 -0
- package/rcf/user-stories/us-13001.json +23 -0
- package/rcf/user-stories/us-13002.json +23 -0
- package/rcf/user-stories/us-13101.json +23 -0
- package/rcf/user-stories/us-13102.json +23 -0
- package/rcf/user-stories/us-13201.json +23 -0
- package/rcf/user-stories/us-13301.json +23 -0
- package/rcf/user-stories/us-13302.json +23 -0
- package/rcf/user-stories/us-13401.json +23 -0
- package/rcf/user-stories/us-14001.json +21 -0
- package/rcf/user-stories/us-14501.json +24 -0
- package/rcf/user-stories/us-15001.json +26 -0
- package/rcf/user-stories/us-15101.json +26 -0
- package/rcf/user-stories/us-15201.json +21 -0
- package/rcf/user-stories/us-15301.json +31 -0
- package/rcf/user-stories/us-15401.json +31 -0
- package/releases/releases.yaml +21 -1
- package/src/blueprint/apply.js +64 -0
- package/src/blueprint/consistency-lint.js +432 -0
- package/src/blueprint/disposition-ledger.js +224 -0
- package/src/blueprint/dispositions.js +44 -0
- package/src/blueprint/index.js +19 -0
- package/src/browser-verify/manifest-writer.js +53 -2
- package/src/browser-verify/pack-runner.js +18 -0
- package/src/cli/blueprint.js +103 -0
- package/src/setup/identity-seed.js +18 -0
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T01:40:05.035Z",
|
|
3
|
+
"updatedAt": "2026-09-08T01:40:05.264Z",
|
|
4
|
+
"description": "The reverse-proxy config file (caddy/Caddyfile when reverseProxy=caddy; traefik/traefik.yaml when reverseProxy=traefik) is a first-class versioned artefact under the applying repo. The compose runtime bind-mounts the file into the proxy service so an operator change to the file is picked up by the reload verb. The reload verb is docker compose exec caddy caddy reload when Caddy, or the documented Traefik equivalent. The reload window is elicited (10 s default). During the window a client burst against the proxy sees no non-2xx and no dropped connection. Chain: HQ round-7 T-2 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-2 track of hetzner-round-7-spec-2026-09-07 section 5.2.",
|
|
5
|
+
"reqId": "REQ-124",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-2 platform-docker-compose-host: zero-downtime reverse-proxy reload via bind-mounted config; verb per proxy; no non-2xx or dropped connection inside the elicited window (10 s default)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"webUi"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T01:40:05.078Z",
|
|
19
|
+
"signals": [
|
|
20
|
+
{
|
|
21
|
+
"source": "description",
|
|
22
|
+
"shape": "webUi",
|
|
23
|
+
"match": "sees"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T01:40:05.460Z",
|
|
3
|
+
"updatedAt": "2026-09-08T01:40:05.690Z",
|
|
4
|
+
"description": "Every container writes stdout and stderr through the elicited log driver. Journald is the shipped default matching the Debian 12 and Ubuntu 24.04 baselines the T-1 cloud-init sets up. Loki is the opt-in alternative when the applying project runs Grafana. The choice is elicited via the log-driver ADR. When observability-logging is applied, the compose file wires the elicited driver to that companion. Chain: HQ round-7 T-2 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-2 track of hetzner-round-7-spec-2026-09-07 section 5.2.",
|
|
5
|
+
"reqId": "REQ-125",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-2 platform-docker-compose-host: log shipping to the elicited observability-logging sink (journald default; loki opt-in when the project runs Grafana)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"none"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T01:40:05.504Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T03:20:33.239Z",
|
|
3
|
+
"updatedAt": "2026-09-08T03:20:33.285Z",
|
|
4
|
+
"description": "The edge-cloudflare-tunnel v1.0.0 blueprint contributes a cloudflared connector whose runtime shape switches on the applied capability set: when the containerHost capability is applied (T-2 platform-docker-compose-host on top of T-1 deploy-hetzner-server), the connector ships as a compose service alongside the applying project's other services on the same web-net network; when the host runs bare (only T-1 applied), the connector ships as a systemd unit per the cloudflared as-a-service local-configuration-file docs. Either shape emits cloudflaredReady on boot with connector id, region and version metadata (metadata only; no token or tunnel credentials in the payload). Chain: HQ round-7 T-3 reserved-block per HQ chain-block ruling 2026-09-07 (REQ-130..139 / TS-160..169 / FBS-150..159 / CN-470..499). Round-7 T-3 track of hetzner-round-7-spec-2026-09-07 section 5.3.",
|
|
5
|
+
"reqId": "REQ-130",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-3 edge-cloudflare-tunnel v1.0.0 blueprint: cloudflared connector install shape (compose-service default on containerHost, systemd-unit alternative on bare cloudHost); cloudflaredReady fires on boot",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"auth"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T03:20:33.284Z",
|
|
19
|
+
"signals": [
|
|
20
|
+
{
|
|
21
|
+
"source": "description",
|
|
22
|
+
"shape": "auth",
|
|
23
|
+
"match": "token"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"source": "description",
|
|
27
|
+
"shape": "auth",
|
|
28
|
+
"match": "credential"
|
|
29
|
+
}
|
|
30
|
+
]
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T03:20:33.475Z",
|
|
3
|
+
"updatedAt": "2026-09-08T03:20:33.520Z",
|
|
4
|
+
"description": "The applying project ships one tunnel manifest per named tunnel at cloudflare/tunnels/<name>.yaml. The schema requires: a tunnel id (uuid-shaped string), a credentials-file reference into security-secrets-management (secretRef, never a literal path or JSON body inline), and an ingress rules array mapping public hostname to internal service URL with a mandatory catch-all rule returning http_status 404. The manifest is the single source of truth for what the connector serves; cloudflared refuses to boot if it fails the shipped JSON-schema validation. Chain: HQ round-7 T-3 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-3 track of hetzner-round-7-spec-2026-09-07 section 5.3.",
|
|
5
|
+
"reqId": "REQ-131",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-3 edge-cloudflare-tunnel v1.0.0 blueprint: tunnel manifest schema at cloudflare/tunnels/<name>.yaml (tunnel id, credentials secretRef, ingress rules with catch-all 404)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"httpApi",
|
|
16
|
+
"auth",
|
|
17
|
+
"persistence"
|
|
18
|
+
],
|
|
19
|
+
"reason": "keyword-scan",
|
|
20
|
+
"classifiedAt": "2026-09-08T03:20:33.519Z",
|
|
21
|
+
"signals": [
|
|
22
|
+
{
|
|
23
|
+
"source": "title",
|
|
24
|
+
"shape": "persistence",
|
|
25
|
+
"match": "schema"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"source": "title",
|
|
29
|
+
"shape": "auth",
|
|
30
|
+
"match": "credential"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"source": "description",
|
|
34
|
+
"shape": "persistence",
|
|
35
|
+
"match": "schema"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"source": "description",
|
|
39
|
+
"shape": "auth",
|
|
40
|
+
"match": "credential"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"source": "description",
|
|
44
|
+
"shape": "httpApi",
|
|
45
|
+
"match": "JSON body"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"source": "description",
|
|
49
|
+
"shape": "persistence",
|
|
50
|
+
"match": "schema"
|
|
51
|
+
}
|
|
52
|
+
]
|
|
53
|
+
}
|
|
54
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T03:20:33.710Z",
|
|
3
|
+
"updatedAt": "2026-09-08T03:20:33.755Z",
|
|
4
|
+
"description": "The applying project MUST NOT open a public port on the host firewall for the origin path when only edge-cloudflare-tunnel provides ingress. T-1 deploy-hetzner-server's firewall shape allows port 22 unconditionally and ports 80/443 only when a reverse proxy is applied on the host. A project that applies only T-1 plus T-3 (no reverse proxy) declares zero 80/443 firewall rules; the tunnel manifest schema check refuses the apply if an ingress rule tries to bind a port on the host directly (the ingress URL must reference an internal address, never the public interface). Chain: HQ round-7 T-3 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-3 track of hetzner-round-7-spec-2026-09-07 section 5.3.",
|
|
5
|
+
"reqId": "REQ-132",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-3 edge-cloudflare-tunnel v1.0.0 blueprint: no public origin ports on the host (firewall stays 22 plus 80/443-only-when-reverse-proxy; manifest refuses if an origin port is asked for)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"persistence"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T03:20:33.754Z",
|
|
19
|
+
"signals": [
|
|
20
|
+
{
|
|
21
|
+
"source": "description",
|
|
22
|
+
"shape": "persistence",
|
|
23
|
+
"match": "schema"
|
|
24
|
+
}
|
|
25
|
+
]
|
|
26
|
+
}
|
|
27
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T03:20:33.944Z",
|
|
3
|
+
"updatedAt": "2026-09-08T03:20:33.990Z",
|
|
4
|
+
"description": "The blueprint reads the applying project's sidecar rcf/blueprints/edge-cloudflare-tunnel.applied.json at apply time and inspects appliedCapabilities. When zeroTrustGate is present (i.e. edge-cloudflare-access v1.0.0 has been applied on the same project), every ingress rule under the tunnel manifest attaches an originRequest.access block naming the Access AUD; cloudflared then refuses at the edge any request that arrives without a valid Access JWT for that AUD. When zeroTrustGate is absent, the block is omitted and the tunnel serves in public-hostname mode (open ingress on the public hostname). The aud-presence-check probe asserts the shape flips correctly on both fixture variants; the shape MUST NOT silently degrade to open ingress on a project that intended the gated shape. Chain: HQ round-7 T-3 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-3 track of hetzner-round-7-spec-2026-09-07 section 5.3.",
|
|
5
|
+
"reqId": "REQ-133",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-3 edge-cloudflare-tunnel v1.0.0 blueprint: Access-gated composition (when zeroTrustGate is applied, the ingress rule sets originRequest.access.aud; when absent, the block is omitted and the tunnel serves in public-hostname mode)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"none"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T03:20:33.989Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T03:20:34.180Z",
|
|
3
|
+
"updatedAt": "2026-09-08T03:20:34.226Z",
|
|
4
|
+
"description": "The tunnel credentials file the cloudflared connector reads at boot MUST land on the host at mode 0o400 (owner read only), MUST be referenced from the tunnel manifest as a secretRef (never as a literal path to a committed file), MUST NOT be committed to the applying project's git tree (a grep across the working tree for the credentials-file body's uuid-shaped tunnel id and its account-tag literal refuses if either appears in a tracked file), and MUST NOT appear in any cloudflaredReady, tunnelConnectorUp or ingressRuleReloaded event body. A leaked credentials file gives an attacker lateral movement across every hostname the tunnel serves; the discipline is defensive against silent loss. Chain: HQ round-7 T-3 reserved-block per HQ chain-block ruling 2026-09-07. Round-7 T-3 track of hetzner-round-7-spec-2026-09-07 section 5.3.",
|
|
5
|
+
"reqId": "REQ-134",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "T-3 edge-cloudflare-tunnel v1.0.0 blueprint: credentials-file discipline (JSON at mode 0o400, referenced via security-secrets-management, not committed to the applying tree, grep-refuse on the literal)",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"auth"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T03:20:34.225Z",
|
|
19
|
+
"signals": [
|
|
20
|
+
{
|
|
21
|
+
"source": "title",
|
|
22
|
+
"shape": "auth",
|
|
23
|
+
"match": "credential"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"source": "description",
|
|
27
|
+
"shape": "auth",
|
|
28
|
+
"match": "credential"
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"source": "description",
|
|
32
|
+
"shape": "auth",
|
|
33
|
+
"match": "credential"
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"source": "description",
|
|
37
|
+
"shape": "auth",
|
|
38
|
+
"match": "credential"
|
|
39
|
+
}
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T09:02:25.166Z",
|
|
3
|
+
"updatedAt": "2026-09-08T09:02:37.052Z",
|
|
4
|
+
"description": "The object-storage-s3 blueprint gains a Hetzner Object Storage provider value under its shipped v1.0.0 S3-API facade contract. The delta adds an endpoint-shape helper hetzner-endpoint.mjs composing the vendor-documented pattern <bucket>.<location>.your-objectstorage.com from an elicited bucket and location (fsn1 fal, hel1 hel, nbg1 nur per the Hetzner storage overview); a new probe hetzner-object-storage-round-trip.mjs drives put/get/delete against the composed endpoint with accountBound true gated on CI_HAS_HETZNER_OBJECT_STORAGE (records accountBoundSkipped when unset per spec section 3.5); one blueprint-owned REQ (object-storage-s3-REQ-101) and one blueprint-owned US (object-storage-s3-US-28110) anchor the AC AC-28110-1; one blueprint TAC (TAC-2904-object-storage-s3-hetzner-endpoint-helper) formalises the helper contract; one blueprint ADR (ADR-2905-object-storage-s3-hetzner-object-storage-provider, scope local) documents the Hetzner provider value alongside R2, AWS, MinIO with standardsTraceClause Hetzner Object Storage S3 compatibility documented endpoint shape. The existing MinIO local emulator round-trip and R2 real-account smoke stay byte-identical; blueprint bumps 1.0.0 to 1.1.0; rcf-lite package version does NOT bump (spec 8). Chain: HQ round-7 follow-up per HQ chain-block ruling 2026-09-08 (adapter block REQ-140..144, TS-170..174, FBS-160..164, CN-500..509). Section 5.4 of hetzner-round-7-spec-2026-09-07.",
|
|
5
|
+
"reqId": "REQ-140",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "Adapter object-storage-s3 v1.1.0 Hetzner Object Storage: endpoint-shape helper composes <bucket>.<location>.your-objectstorage.com per Hetzner storage overview; delta contributions add hetzner-object-storage-round-trip probe (accountBound gated on CI_HAS_HETZNER_OBJECT_STORAGE); MinIO and R2 paths unchanged",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"webUi",
|
|
16
|
+
"httpApi",
|
|
17
|
+
"persistence"
|
|
18
|
+
],
|
|
19
|
+
"reason": "keyword-scan",
|
|
20
|
+
"classifiedAt": "2026-09-08T09:02:25.212Z",
|
|
21
|
+
"signals": [
|
|
22
|
+
{
|
|
23
|
+
"source": "title",
|
|
24
|
+
"shape": "persistence",
|
|
25
|
+
"match": "storage"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"source": "title",
|
|
29
|
+
"shape": "persistence",
|
|
30
|
+
"match": "Storage"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"source": "title",
|
|
34
|
+
"shape": "httpApi",
|
|
35
|
+
"match": "endpoint"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"source": "title",
|
|
39
|
+
"shape": "persistence",
|
|
40
|
+
"match": "storage"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"source": "title",
|
|
44
|
+
"shape": "persistence",
|
|
45
|
+
"match": "storage"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"source": "description",
|
|
49
|
+
"shape": "persistence",
|
|
50
|
+
"match": "storage"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"source": "description",
|
|
54
|
+
"shape": "persistence",
|
|
55
|
+
"match": "Storage"
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
"source": "description",
|
|
59
|
+
"shape": "httpApi",
|
|
60
|
+
"match": "API"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"source": "description",
|
|
64
|
+
"shape": "httpApi",
|
|
65
|
+
"match": "endpoint"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"source": "description",
|
|
69
|
+
"shape": "httpApi",
|
|
70
|
+
"match": "endpoint"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"source": "description",
|
|
74
|
+
"shape": "persistence",
|
|
75
|
+
"match": "storage"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"source": "description",
|
|
79
|
+
"shape": "persistence",
|
|
80
|
+
"match": "storage"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"source": "description",
|
|
84
|
+
"shape": "httpApi",
|
|
85
|
+
"match": "put"
|
|
86
|
+
},
|
|
87
|
+
{
|
|
88
|
+
"source": "description",
|
|
89
|
+
"shape": "httpApi",
|
|
90
|
+
"match": "get"
|
|
91
|
+
},
|
|
92
|
+
{
|
|
93
|
+
"source": "description",
|
|
94
|
+
"shape": "httpApi",
|
|
95
|
+
"match": "delete"
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"source": "description",
|
|
99
|
+
"shape": "httpApi",
|
|
100
|
+
"match": "endpoint"
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"source": "description",
|
|
104
|
+
"shape": "persistence",
|
|
105
|
+
"match": "storage"
|
|
106
|
+
},
|
|
107
|
+
{
|
|
108
|
+
"source": "description",
|
|
109
|
+
"shape": "persistence",
|
|
110
|
+
"match": "storage"
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"source": "description",
|
|
114
|
+
"shape": "persistence",
|
|
115
|
+
"match": "storage"
|
|
116
|
+
},
|
|
117
|
+
{
|
|
118
|
+
"source": "description",
|
|
119
|
+
"shape": "httpApi",
|
|
120
|
+
"match": "endpoint"
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"source": "description",
|
|
124
|
+
"shape": "webUi",
|
|
125
|
+
"match": "form"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"source": "description",
|
|
129
|
+
"shape": "persistence",
|
|
130
|
+
"match": "storage"
|
|
131
|
+
},
|
|
132
|
+
{
|
|
133
|
+
"source": "description",
|
|
134
|
+
"shape": "persistence",
|
|
135
|
+
"match": "storage"
|
|
136
|
+
},
|
|
137
|
+
{
|
|
138
|
+
"source": "description",
|
|
139
|
+
"shape": "persistence",
|
|
140
|
+
"match": "Storage"
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
"source": "description",
|
|
144
|
+
"shape": "httpApi",
|
|
145
|
+
"match": "endpoint"
|
|
146
|
+
}
|
|
147
|
+
]
|
|
148
|
+
}
|
|
149
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T10:50:11.871Z",
|
|
3
|
+
"updatedAt": "2026-09-08T10:50:27.769Z",
|
|
4
|
+
"description": "H-1 patch train against deploy-hetzner-server 1.0.0 shipped in rcf-lite 0.25.0 (real-account gate d-2026-09-08-010 report). Nine defects; every real-account probe throws before writing the scratch id file so destroy cannot tear the server down. This REQ adds the standing requirement that mocked probes for deploy-hetzner-server consume the same rendered cloud-init user-data the real path consumes (renderer writes the file; mock and real path both read it) and that the rendered user-data carries a real ssh public-key line for the deploy user plus NOPASSWD sudo for that user; that provision.mjs projects snake_case hcloud fields; that destroy.mjs and sweep-orphans.mjs never pass --output json to a delete verb (accepts arrays or objects); that snapshot-verb.mjs shells hcloud server create-image --type snapshot; that ssh baseline checks poll ssh readiness before firing and shell NOPASSWD sudo; and that the manifest ssh-key name is overridable via RCF_LITE_CI_SSH_KEY_NAME. Domain functional. Chain: HQ hardening block H-1 per HQ chain-block ruling 2026-09-08 (REQ-145..149 / TS-175..179 / FBS-165..169 / CN-510..519). Blueprint version 1.0.0 to 1.0.1; every existing contribution id byte-identical.",
|
|
5
|
+
"reqId": "REQ-145",
|
|
6
|
+
"prdId": "PRD-001",
|
|
7
|
+
"title": "Hardening H-1: throwaway-server fixture real-path fidelity for deploy-hetzner-server; provision reads hcloud snake_case; renderer inlines ssh key material; destroy/sweep drop --output json; snapshot verb uses hcloud server create-image; ssh baseline waits for cloud-init and runs under NOPASSWD deploy; sshKeyIds override via RCF_LITE_CI_SSH_KEY_NAME; mock consumes the same rendered cloud-init",
|
|
8
|
+
"category": "functional",
|
|
9
|
+
"domain": "functional",
|
|
10
|
+
"priority": "must",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"webUi",
|
|
16
|
+
"httpApi"
|
|
17
|
+
],
|
|
18
|
+
"reason": "keyword-scan",
|
|
19
|
+
"classifiedAt": "2026-09-08T10:50:11.918Z",
|
|
20
|
+
"signals": [
|
|
21
|
+
{
|
|
22
|
+
"source": "title",
|
|
23
|
+
"shape": "webUi",
|
|
24
|
+
"match": "render"
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"source": "title",
|
|
28
|
+
"shape": "webUi",
|
|
29
|
+
"match": "rendered"
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
"source": "description",
|
|
33
|
+
"shape": "webUi",
|
|
34
|
+
"match": "rendered"
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"source": "description",
|
|
38
|
+
"shape": "webUi",
|
|
39
|
+
"match": "render"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
"source": "description",
|
|
43
|
+
"shape": "webUi",
|
|
44
|
+
"match": "rendered"
|
|
45
|
+
},
|
|
46
|
+
{
|
|
47
|
+
"source": "description",
|
|
48
|
+
"shape": "httpApi",
|
|
49
|
+
"match": "delete"
|
|
50
|
+
}
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T12:16:28.007Z",
|
|
3
|
+
"updatedAt": "2026-09-08T12:16:28.158Z",
|
|
4
|
+
"description": "The rcf-lite platform-cloudflare-kv blueprint ships eight approved user stories (US-31101..US-31108) with nine ACs (AC-31101-1, AC-31102-1, AC-31103-1, AC-31103-2, AC-31104-1, AC-31105-1, AC-31106-1, AC-31107-1, AC-31108-1). Its five contributed probes and the README still anchor the defunct AC-5001..AC-5401 id band that never became chain rows on this repo. This train re-anchors every probe result and the README chain-slice pointers to the shipped AC-31xxx band per Dave ruling 4 (2026-09-08 relay 582c2bca): do NOT resurrect the AC-5xxx stories, move the probes to the shipped band. Every one of the nine shipped kv ACs must appear as an anchor (primary or additional result) on at least one probe with a runtime observable; the two ACs no shipped probe currently covers (AC-31102-1 sole-reader grep, AC-31107-1 whitelist-only lifecycle event scan) are added as additional results on facade-round-trip and event-secrecy per the dispatch addendum. Anatomy-test assertions move with the re-anchor per dispatch addendum ruling 1. No capability change; 0.25.x patch scope; runtime surface unchanged.",
|
|
5
|
+
"category": "functional",
|
|
6
|
+
"domain": "functional",
|
|
7
|
+
"priority": "must",
|
|
8
|
+
"reqId": "REQ-150",
|
|
9
|
+
"prdId": "PRD-001",
|
|
10
|
+
"title": "H-2 kv re-anchor and observability: five kv probes and the README re-anchor from AC-5xxx to the shipped AC-31xxx band; every shipped kv AC gains a runtime observable",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"none"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T12:16:28.156Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T12:16:28.590Z",
|
|
3
|
+
"updatedAt": "2026-09-08T12:16:28.726Z",
|
|
4
|
+
"description": "The rcf-lite platform-cloudflare-durable-objects blueprint ships thirteen ACs (AC-33101-1..AC-33113-1); eight probes anchor AC-33101, 33102, 33103, 33104, 33105, 33107, 33112, 33113, leaving AC-33106-1, AC-33108-1, AC-33109-1, AC-33110-1, AC-33111-1 unbound. real-account-storage-smoke.mjs currently returns pass on credential readiness alone. This train replaces the credential-readiness pass-stub with a real storage round-trip driver: when CI_HAS_CLOUDFLARE_ACCOUNT is set with CF_ACCOUNT_ID, CF_DO_NAMESPACE_ID (or the binding config the driver needs) and CF_API_TOKEN, the probe drives an HTTP round trip against a deployed Worker route that opens the DO facade, writes a fixture key, reads it back, asserts the returned bytes equal the written value. Local proof against miniflare or wrangler dev via the existing wrangler-seam. Env-absent branch keeps the section 3.5 pass-with-skip shape; a pass must never again be reachable from credential presence alone. The five unbound ACs are bound as additional-result anchors on the existing wrangler-seam, storage-round-trip and concurrent-increment probes (or a new probe body inside existing capability if none carries the observable honestly).",
|
|
5
|
+
"category": "functional",
|
|
6
|
+
"domain": "functional",
|
|
7
|
+
"priority": "must",
|
|
8
|
+
"reqId": "REQ-151",
|
|
9
|
+
"prdId": "PRD-001",
|
|
10
|
+
"title": "H-2 DO storage round-trip driver and anchor coverage: real-account-storage-smoke drives a byte-equal put/get through a deployed Worker (or wrangler-dev locally); five previously-unbound DO ACs bound as anchors on existing probes",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"webUi",
|
|
16
|
+
"httpApi",
|
|
17
|
+
"auth",
|
|
18
|
+
"persistence"
|
|
19
|
+
],
|
|
20
|
+
"reason": "keyword-scan",
|
|
21
|
+
"classifiedAt": "2026-09-08T12:16:28.724Z",
|
|
22
|
+
"signals": [
|
|
23
|
+
{
|
|
24
|
+
"source": "title",
|
|
25
|
+
"shape": "persistence",
|
|
26
|
+
"match": "storage"
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
"source": "title",
|
|
30
|
+
"shape": "persistence",
|
|
31
|
+
"match": "storage"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
"source": "title",
|
|
35
|
+
"shape": "httpApi",
|
|
36
|
+
"match": "put"
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"source": "title",
|
|
40
|
+
"shape": "httpApi",
|
|
41
|
+
"match": "get"
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
"source": "description",
|
|
45
|
+
"shape": "persistence",
|
|
46
|
+
"match": "durable"
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
"source": "description",
|
|
50
|
+
"shape": "persistence",
|
|
51
|
+
"match": "storage"
|
|
52
|
+
},
|
|
53
|
+
{
|
|
54
|
+
"source": "description",
|
|
55
|
+
"shape": "auth",
|
|
56
|
+
"match": "credential"
|
|
57
|
+
},
|
|
58
|
+
{
|
|
59
|
+
"source": "description",
|
|
60
|
+
"shape": "auth",
|
|
61
|
+
"match": "credential"
|
|
62
|
+
},
|
|
63
|
+
{
|
|
64
|
+
"source": "description",
|
|
65
|
+
"shape": "persistence",
|
|
66
|
+
"match": "storage"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"source": "description",
|
|
70
|
+
"shape": "webUi",
|
|
71
|
+
"match": "route"
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
"source": "description",
|
|
75
|
+
"shape": "auth",
|
|
76
|
+
"match": "credential"
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
"source": "description",
|
|
80
|
+
"shape": "persistence",
|
|
81
|
+
"match": "storage"
|
|
82
|
+
}
|
|
83
|
+
]
|
|
84
|
+
}
|
|
85
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T12:16:29.086Z",
|
|
3
|
+
"updatedAt": "2026-09-08T12:16:29.220Z",
|
|
4
|
+
"description": "The rcf-lite messaging-queue-cloudflare blueprint's real-account-concurrency-smoke.mjs returns verdict pass with accountBoundSkipped true on the account-set branch (the wrangler dev --remote path is unsupported for Queues, so a real-account run must ride a deployed Worker that binds the queue). This train replaces that pass-stub with a real concurrency driver: the account-set branch publishes 500 messages through the producer facade wired to a live Queues binding on a deployed Worker (queue name and binding parameterised via env; HQ supplies values at gate time, canonical queue rcf-lite-ci-queue-smoke) and asserts concurrent processing up to the documented push-invocation cap. Local proof against miniflare or wrangler dev (local queue simulation). The env-absent branch keeps pass-with-skip. The documented Cloudflare Queues limits URL is re-verified 200 at merge time and logged in the PR provenance.",
|
|
5
|
+
"category": "functional",
|
|
6
|
+
"domain": "functional",
|
|
7
|
+
"priority": "must",
|
|
8
|
+
"reqId": "REQ-152",
|
|
9
|
+
"prdId": "PRD-001",
|
|
10
|
+
"title": "H-2 queue real concurrency driver: real-account-concurrency-smoke publishes 500 messages through the producer facade against a live Queues binding on a deployed Worker; concurrent processing asserted against the documented push-invocation cap",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"none"
|
|
16
|
+
],
|
|
17
|
+
"reason": "keyword-scan",
|
|
18
|
+
"classifiedAt": "2026-09-08T12:16:29.218Z"
|
|
19
|
+
}
|
|
20
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
{
|
|
2
|
+
"createdAt": "2026-09-08T12:16:29.584Z",
|
|
3
|
+
"updatedAt": "2026-09-08T12:16:29.719Z",
|
|
4
|
+
"description": "The rcf-lite edge-cloudflare-tunnel blueprint's two real-account probes return warn when the env vars ARE set (account-bound path present but not exercised) and manifest-schema-validate warns on a missing credentials placeholder. This train replaces both warn-on-env stubs with real drivers and converts the placeholder to a fail. real-account-connector-healthy: with both CI_HAS_CLOUDFLARE_ACCOUNT and CI_HAS_HETZNER_ACCOUNT set, provision the throwaway server through the T-1 hetzner fixture surface, run cloudflared tunnel info <name> through a cloudflared control shim, assert healthy connector count, capture the tunnelConnectorUp event. Consume the hetzner fixture as-is; its defects are H-1 scope at HQ; if the fixture path fails locally the driver fails with a pointer naming the fixture step, never warn. real-account-tunnel-hostname-routes: undici fetch driver for the public-hostname sub-case activated on CI_HAS_CLOUDFLARE_ACCOUNT; two-identity JWT driver for the access-gated sub-case activated only when CI_HAS_CLOUDFLARE_ACCESS is ALSO set (HQ note: Access is not enabled on the HQ account, so the AUD sub-case stays pass-with-skip until HQ enables Access). Env-absent branch keeps pass-with-skip; a pass must never again be reachable from account-flag presence alone. manifest-schema-validate.mjs missing-credentials-placeholder becomes FAIL with a fixture-setup pointer.",
|
|
5
|
+
"category": "functional",
|
|
6
|
+
"domain": "functional",
|
|
7
|
+
"priority": "must",
|
|
8
|
+
"reqId": "REQ-153",
|
|
9
|
+
"prdId": "PRD-001",
|
|
10
|
+
"title": "H-2 tunnel real drivers: connector-healthy runs cloudflared tunnel info against the throwaway hetzner server; hostname-routes drives undici and (when Access is enabled) a two-identity JWT probe; manifest-schema-validate placeholder becomes a fail-with-pointer",
|
|
11
|
+
"version": "0.1.0",
|
|
12
|
+
"status": "draft",
|
|
13
|
+
"shapeClassification": {
|
|
14
|
+
"shapes": [
|
|
15
|
+
"webUi",
|
|
16
|
+
"auth",
|
|
17
|
+
"persistence"
|
|
18
|
+
],
|
|
19
|
+
"reason": "keyword-scan",
|
|
20
|
+
"classifiedAt": "2026-09-08T12:16:29.717Z",
|
|
21
|
+
"signals": [
|
|
22
|
+
{
|
|
23
|
+
"source": "title",
|
|
24
|
+
"shape": "webUi",
|
|
25
|
+
"match": "route"
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"source": "title",
|
|
29
|
+
"shape": "persistence",
|
|
30
|
+
"match": "schema"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"source": "description",
|
|
34
|
+
"shape": "persistence",
|
|
35
|
+
"match": "schema"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
"source": "description",
|
|
39
|
+
"shape": "auth",
|
|
40
|
+
"match": "credential"
|
|
41
|
+
},
|
|
42
|
+
{
|
|
43
|
+
"source": "description",
|
|
44
|
+
"shape": "webUi",
|
|
45
|
+
"match": "route"
|
|
46
|
+
},
|
|
47
|
+
{
|
|
48
|
+
"source": "description",
|
|
49
|
+
"shape": "persistence",
|
|
50
|
+
"match": "schema"
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
"source": "description",
|
|
54
|
+
"shape": "auth",
|
|
55
|
+
"match": "credential"
|
|
56
|
+
}
|
|
57
|
+
]
|
|
58
|
+
}
|
|
59
|
+
}
|