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
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,42 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
|
|
|
6
6
|
|
|
7
7
|
## [Unreleased]
|
|
8
8
|
|
|
9
|
+
## [0.26.0] - 2026-09-09
|
|
10
|
+
|
|
11
|
+
rcf-lite 0.26.0 is a hardening and authoring release. The Cloudflare-platform blueprints on the shelf pick up real-account probe drivers with positive evidence and one shared account-token env matrix, the blueprint authoring standard gains three new sections (7c REQ-layer sufficiency, 7d positive-evidence verification, 7e single-definition ownership) plus RULE 16 for the managed agent block, and `rcf define blueprint` gains a `lint-consistency` verb, a per-slug disposition ledger, an apply-time disposition prompt and an identity-register field on the seeded profile. The schema floor moves to `@stravica-ai/rcf-schemas` 0.6.2. Nothing here is breaking.
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
|
|
15
|
+
- **Blueprint chain-consistency lint verb: `rcf define blueprint lint-consistency <source>` (PR #183).** Two passes over one blueprint's own JSON and markdown. Pass 1 checks single-definition ownership: HTTP-header and env-var casing drift between an owning TAC's interfaces, internal structure, responsibilities or purpose and any other artefact, plus an `undeclaredRestatement` finding when an AC restates a token owned by a TAC interface without an `ownerRef.tacId` reference. Pass 2 checks REQ delivery: `reqNoDelivery` when a REQ description carries a promise phrase (must, requires, guarantees, ceiling, never, invariant, on boot, at boot, event) without a `deliveredBy` link into a TAC or ADR, and `reqDeliveryNotCarried` when the named TAC or field is absent or does not appear in the TAC's responsibilities or interfaces. Exit 0 on clean, exit 3 on unsuppressed findings, exit 2 on usage error. `--json` emits the envelope `{ blueprint, findings[], verdict, passCounts }`. Pass-1 findings are suppressible via a `## Known chain-consistency-lint suppressions` section on the blueprint README (one row per finding id with a one-sentence reason); pass-2 findings are not suppressible. A soft-mode CI lint step runs the verb across the shelf so authoring drift surfaces on every PR without blocking the merge yet.
|
|
16
|
+
- **Per-slug disposition ledger and `rcf define blueprint dispositions <slug> [--json]` verb (PR #183).** A ledger file at `rcf/blueprints/<slug>.disposition.json` sits alongside the existing applied sidecar and carries one record per contributed AC with an `action` (`pending-disposition`, `pending-operator`, `accepted`, `adjusted`, `dropped`, `escalated-as-defect`), optional `reason`, `resolvedAt`, `resolvedBy`, `escalatedAt`, `escalatedToOperator`, `defectUrl`, and an optional `sourceDisposition` of `fixed` or `template`. Written on a fresh `rcf define blueprint add`; a re-apply leaves an existing ledger byte-identical so operator edits are never clobbered. The read-only `dispositions` verb prints one line per record with action, reason and resolution timestamp, or the raw ledger with `--json`. Exit 0 always; a missing ledger is a legitimate zero state. Schema follow-up: a `$defs/blueprintDispositionLedger` shape lands on `@stravica-ai/rcf-schemas` in a later release; for now the writer guards the record shape inline.
|
|
17
|
+
- **Apply-time disposition prompt (PR #183).** After a fresh `rcf define blueprint add` the CLI prints a canonical prompt naming the newly initialised ledger and the disposition vocabulary, so an operator lands on the ledger before the next verify. Suppressible with `--no-disposition-prompt`.
|
|
18
|
+
- **Identity register field on the seeded profile (PR #183).** The identity seed template gains a `## Register` section under `## Working preferences` with the three-value vocabulary (`productOwner`, `engineer`, `unstated`) seeded to `unstated`. Register capture stays a managed-block flow, so `cli/init.js` is unchanged; existing projects pick up the field on the next `rcf doctor --fix` sweep of the managed block.
|
|
19
|
+
- **Blueprint authoring standard sections 7c, 7d, 7e (PR #182).** Section 7c (REQ-layer sufficiency): every capability token declared on `blueprint.json:capabilities[]` and every option value on `elicits[]` is backed by at least one must-priority requirement; a blueprint without an `elicits` key is legal only when no apply-time answer is named anywhere in the requirements, guide or TAC records. Section 7d (positive-evidence verification): every verification artefact asserts positive evidence of the property it exists to protect (a request id, a response body excerpt, a created-then-deleted resource id in an inventory diff, or a real deploy record), never the absence of a previously seen bad signature; env vars are declared on the fixture, and `accountBoundSkipped: true` is legal only when the account env is unset and paired with an exact non-empty `reason`. Section 7e (single-definition ownership and authoring order): every named contract is defined exactly once in one owning artefact (TAC for wire shapes and interfaces, ADR for behaviour decisions, REQ for externally promised properties with a `deliveredBy` link into the delivering TAC or ADR); US, AC and guide reference the owner rather than restating it, and authoring order follows. RULE 16 lands in `guidance/managed/agent-instructions-block.md` so applying agents inherit both disciplines from the managed block on the next `rcf doctor --fix` sweep.
|
|
20
|
+
- **Ten new blueprint-authoring-checklist rows in section 6 (PR #182).** Three rows from section 7c, five from section 7d, two from section 7e; the block hash and the `harness-template.md` fragment regenerate via `scripts/gen-managed-artefacts.mjs`.
|
|
21
|
+
- **Positive-evidence remap at record composition (PR #182).** `packages/rcf-lite/src/browser-verify/manifest-writer.js:composeBrowserVerificationRecord` remaps a `checks[]` or `preChecks[]` record with `verdict: 'pass'` and neither an `evidence` field nor `accountBoundSkipped: true` (with a non-empty `reason`) to `verdict: 'fail'` with `detail: 'positive-evidence-missing'`. The remap fires at record composition so the composed record is what the manifest carries and the fail surfaces at the ship gate. `pack-runner.js` carries `evidence`, `accountBoundSkipped` and `reason` through from each check's and pre-check's `run` outcome so the composer sees the fields.
|
|
22
|
+
- **H-2 Cloudflare-platform probe integrity (PR #179).** The Cloudflare-platform blueprints on the shelf (`platform-cloudflare-kv`, `platform-cloudflare-durable-objects`, `messaging-queue-cloudflare`, `edge-cloudflare-tunnel`) pick up real-account probe drivers that assert positive evidence: KV re-anchor and observability on cache-aside miss/hit, DO storage round-trip with anchor coverage, queue real concurrency with dead-letter observation, tunnel connector health and hostname routing. The `packages/rcf-lite/test/fixtures/cf-platform/` fixture README gains a "Declared env vars" section naming the first-tier `CI_HAS_CLOUDFLARE_ACCOUNT` gate and the four second-tier variables the account-bound branches read (`CF_ACCOUNT_ID`, `CF_API_TOKEN`, `CF_KV_NAMESPACE_ID`, `CF_WORKER_NAME`), so a runner without those env vars sees clean `accountBoundSkipped: true` rows with a stated reason rather than a silent pass.
|
|
23
|
+
|
|
24
|
+
### Changed
|
|
25
|
+
|
|
26
|
+
- **Schema floor: `@stravica-ai/rcf-schemas` 0.6.1 to 0.6.2.** No new required fields on shipped artefacts; picks up the shape work that supports the disposition-ledger record and the identity-register field.
|
|
27
|
+
|
|
28
|
+
#### Also in this release
|
|
29
|
+
|
|
30
|
+
- **`object-storage-s3` v1.0.0 to v1.1.0 (PR #177).** The Hetzner Object Storage adapter lands as the follow-up sibling to the R2 first adapter shipped in 0.23.0, per the 0.25.0 headline. The blueprint bumps but the rcf-lite package version does not bump for this alone; it rides along in this release.
|
|
31
|
+
- **`deploy-hetzner-server` v1.0.0 to v1.0.1 (PR #178).** Real-path fix for the cloud-init render path resolution so an applied project on Node 24 finds the template through the resolved module directory rather than the workspace-relative path.
|
|
32
|
+
- **Blueprint authoring notes on AC sufficiency and fixed-vs-template dispositions (PRs #180, #181).** Two docs-only additions to `packages/rcf-lite/docs/blueprint-authoring.md` that pair with the section 7c and disposition-ledger work: how many ACs are enough for a given US, and how a contributed AC's `sourceDisposition` reads as `fixed` (delivered verbatim) or `template` (adjusted at apply time).
|
|
33
|
+
|
|
34
|
+
## [0.25.0] - 2026-09-08
|
|
35
|
+
|
|
36
|
+
rcf-lite 0.25.0 opens the Hetzner line with three blueprints in one round: a Hetzner Cloud server as the shipped Linux VM shape with the estate hardening baseline and a snapshot cadence, a docker-compose platform on top with healthchecks, secrets as file mounts and a first-class reverse-proxy artefact, and a Cloudflare Tunnel bridge that composes with Access when Zero Trust is applied and drops to public-hostname mode when it is not. Every real-account probe across the round ships accountBoundSkipped pending the Hetzner and Cloudflare token vault ruling; the local probes carry the ship-time verdicts. The follow-up Hetzner Object Storage adapter ships as a sequential PR under `object-storage-s3` v1.1.0 after this release; the rcf-lite package version does not bump for it.
|
|
37
|
+
|
|
38
|
+
### Added
|
|
39
|
+
|
|
40
|
+
- **Round 7 T-1: `deploy-hetzner-server` v1.0.0 on the shelf (PR #173).** Hetzner Cloud server provisioner with an `hcloud`-shaped adapter as the sole reader of the Hetzner API token through the applied `security-secrets-management` facade, a canonical server manifest under `hetzner/servers/name.json`, a cloud-init template landing the estate hardening baseline (SSH key-only, root disabled, UFW default-deny incoming, DOCKER-USER iptables chain, fail2ban SSH jail, unattended-upgrades, a `/live` probe on a private interface), a Hetzner Cloud Firewall contract, and a snapshots-and-backups posture (weekly snapshot default, daily and off alternatives, Hetzner-managed backups as the elicited paid option). Local probes cover cloud-init render, manifest schema and an hcloud dry-run; the three throwaway-server real-account probes (provision, cloud-init hardened, snapshot on demand) ship accountBoundSkipped pending the Hetzner token vault ruling. Ships the shared throwaway-server CI fixture reused by T-2 and T-3 (label-scoped provision, destroy and orphan sweep; hcloud pulled into a checksummed scratchpad, no system install). Declares `capabilities: ["cloudHost"]`. Mints the new global topics `linuxCloudHostContract` and `snapshotAndBackupCadence`.
|
|
41
|
+
- **Round 7 T-2: `platform-docker-compose-host` v1.0.0 on the shelf (PR #174).** Docker engine and compose plugin install invoked from the T-1 cloud-init playbook, a canonical compose layout (`compose.yaml` at repo root, service-per-container, named networks and volumes), a healthcheck-required contract, a restart discipline (`restart: unless-stopped` for long-running services, `on-failure` for jobs), a zero-downtime reload shape for the reverse proxy, secrets as compose file mounts referencing the applied secrets facade at 0o400, and log shipping to the elicited `observability-logging` sink (default `journald`, opt-in `loki`). Caddy is the shipped default reverse proxy with Traefik as the elicited alternative; Coolify is rejected. The reverse-proxy config is a first-class versioned artefact under `caddy/Caddyfile` or `traefik/traefik.yaml` with a smoke curl after every apply. Local probes drive real docker 29.6.2 and the `caddy:2` image (`docker compose config` lint, secrets-as-files scan, Caddyfile validate); the two real-account probes (minimal-stack-up, reload-burst) ship accountBoundSkipped. Extends the T-1 throwaway-server fixture in place with a two-service compose stack. Declares `capabilities: ["containerHost"]`. Mints the new global topic `containerHostContract`.
|
|
42
|
+
- **Round 7 T-3: `edge-cloudflare-tunnel` v1.0.0 on the shelf (PR #175).** `cloudflared` as a compose service (default when `containerHost` is applied) or a systemd unit (alternative for bare `cloudHost` per the vendor cloudflared as-a-service documentation), a tunnel manifest under `cloudflare/tunnels/<name>.yaml` (tunnel id, credentials reference into the applied secrets facade, ingress rules mapping public hostname to internal service URL with a mandatory catch-all `http_status:404`), and a hostname-management contract that creates the DNS route via the Cloudflare API. Composes with `edge-cloudflare-access` via `zeroTrustGate`: when Access is applied, the ingress rule attaches the Access AUD in `originRequest.access` and the connector-side JWT check refuses requests without a valid Access assertion; when Access is not applied, the tunnel ships in public-hostname mode. Local probes cover manifest schema, `cloudflared tunnel ingress validate` and an AUD-presence sidecar-read check; the two real-account probes (connector-healthy, tunnel-hostname-routes) ship accountBoundSkipped pending the Cloudflare token vault ruling. Declares `capabilities: ["tunnelBridge"]`. Mints the new global topic `edgeIngressBridge`.
|
|
43
|
+
- **Authoring standard capability table extended.** `packages/rcf-lite/docs/blueprint-authoring.md` section 6a gains three new rows: `cloudHost`, `containerHost`, `tunnelBridge`. Chunk-zero-style append, loader unchanged.
|
|
44
|
+
|
|
9
45
|
## [0.24.0] - 2026-09-08
|
|
10
46
|
|
|
11
47
|
rcf-lite 0.24.0 opens the Cloudflare line with six blueprints in one round: a Workers KV facade, cron triggers with an expression-router, durable objects covering strong-consistency and hibernatable WebSocket shapes, a Zero-Trust Access gate the admin console consumes, Turnstile with the pinned test keys running under a Playwright pack, and edge rate limiting with a committed manifest. Each blueprint verifies against the real Cloudflare engine through node-only probes, and the admin console reads the Access-gate capability to switch its sign-in surface.
|
|
@@ -26,7 +26,7 @@ The blueprint claims no new global topics at v1.0.0. Account-settings is a consu
|
|
|
26
26
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
27
27
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
28
28
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
29
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
29
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
30
30
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
31
31
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
32
32
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -35,6 +35,9 @@ The blueprint claims no new global topics at v1.0.0. Account-settings is a consu
|
|
|
35
35
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
36
36
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
37
37
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
38
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
39
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
40
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
38
41
|
|
|
39
42
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
40
43
|
|
|
@@ -26,7 +26,7 @@ The blueprint claims no new global topics at v1.0.0. The console is a consumer o
|
|
|
26
26
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
27
27
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
28
28
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
29
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
29
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
30
30
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
31
31
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
32
32
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -35,6 +35,9 @@ The blueprint claims no new global topics at v1.0.0. The console is a consumer o
|
|
|
35
35
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
36
36
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
37
37
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
38
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
39
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
40
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
38
41
|
|
|
39
42
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
40
43
|
|
|
@@ -49,7 +49,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
49
49
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
50
50
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
51
51
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
52
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
52
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
53
53
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
54
54
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
55
55
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -58,6 +58,9 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
58
58
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
59
59
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
60
60
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
61
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
62
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
63
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
61
64
|
|
|
62
65
|
Suffix-family ids (ADR, TAC): SPA numbers in the 2xx range, this package takes 3xx (ADR-301 to ADR-308, TAC-301 to TAC-306); the next blueprint should take 4xx.
|
|
63
66
|
|
|
@@ -25,7 +25,7 @@ The blueprint claims no new global topics at v1.0.0. The chart-component contrac
|
|
|
25
25
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
26
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
27
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
29
29
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
30
30
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
31
31
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -34,6 +34,9 @@ The blueprint claims no new global topics at v1.0.0. The chart-component contrac
|
|
|
34
34
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
35
35
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
36
36
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
37
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
38
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
39
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
37
40
|
|
|
38
41
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
39
42
|
|
|
@@ -25,7 +25,7 @@ The blueprint claims no new global topics at v1.0.0. The dashboard-shell contrac
|
|
|
25
25
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
26
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
27
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
29
29
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
30
30
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
31
31
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -34,6 +34,9 @@ The blueprint claims no new global topics at v1.0.0. The dashboard-shell contrac
|
|
|
34
34
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
35
35
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
36
36
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
37
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
38
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
39
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
37
40
|
|
|
38
41
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
39
42
|
|
|
@@ -24,7 +24,7 @@ The blueprint claims no new global topics at v1.0.0. The datatable shell is a ge
|
|
|
24
24
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
25
25
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
26
26
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
27
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
27
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
28
28
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
29
29
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
30
30
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -33,6 +33,9 @@ The blueprint claims no new global topics at v1.0.0. The datatable shell is a ge
|
|
|
33
33
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
34
34
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
35
35
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
36
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
37
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
38
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
36
39
|
|
|
37
40
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
38
41
|
|
|
@@ -25,7 +25,7 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (HTTP status cont
|
|
|
25
25
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
26
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
27
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
29
29
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
30
30
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
31
31
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -34,6 +34,9 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (HTTP status cont
|
|
|
34
34
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
35
35
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
36
36
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
37
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
38
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
39
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
37
40
|
|
|
38
41
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
39
42
|
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
32
32
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
33
33
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
34
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
34
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
35
35
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
36
36
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
37
37
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -40,5 +40,8 @@
|
|
|
40
40
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
41
41
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
42
42
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
43
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
44
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
45
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
43
46
|
|
|
44
47
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
@@ -26,7 +26,7 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (transport branch
|
|
|
26
26
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
27
27
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
28
28
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
29
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
29
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
30
30
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
31
31
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
32
32
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -35,6 +35,9 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (transport branch
|
|
|
35
35
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
36
36
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
37
37
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
38
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
39
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
40
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
38
41
|
|
|
39
42
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
40
43
|
|
|
@@ -25,7 +25,7 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (navigation postu
|
|
|
25
25
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
26
26
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
27
27
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
28
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
28
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorage` |
|
|
29
29
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
30
30
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
31
31
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -34,6 +34,9 @@ The blueprint claims no new global topics at v1.0.0. Every ADR (navigation postu
|
|
|
34
34
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
35
35
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
36
36
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
37
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
38
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
39
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
37
40
|
|
|
38
41
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
39
42
|
|
|
@@ -28,7 +28,7 @@ The `application-notifications-` prefix is reserved for the sibling channel blue
|
|
|
28
28
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
29
29
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
30
30
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
31
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
31
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
32
32
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
33
33
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
34
34
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -37,6 +37,9 @@ The `application-notifications-` prefix is reserved for the sibling channel blue
|
|
|
37
37
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
38
38
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
39
39
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
40
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
41
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
42
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
40
43
|
| application-notifications-email (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
|
|
41
44
|
| application-notifications-push (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
|
|
42
45
|
| application-notifications-webhook (reserved) | to be claimed at ship | to be claimed at ship | name-only doc reservation (not shipped) | tba |
|
|
@@ -24,7 +24,7 @@ The blueprint claims no new global topics at v1.0.0. Onboarding-tour is a consum
|
|
|
24
24
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
25
25
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
26
26
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
27
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
27
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
28
28
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
29
29
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
30
30
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -33,6 +33,9 @@ The blueprint claims no new global topics at v1.0.0. Onboarding-tour is a consum
|
|
|
33
33
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
34
34
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
35
35
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
36
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
37
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
38
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
36
39
|
|
|
37
40
|
The shelf-wide band registry lives in `packages/rcf-lite/docs/blueprint-authoring.md` section 5.
|
|
38
41
|
|
|
@@ -54,7 +54,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
54
54
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
55
55
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
56
56
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
57
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
57
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
58
58
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
59
59
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
60
60
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -63,6 +63,9 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
63
63
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
64
64
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
65
65
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
66
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
67
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
68
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
66
69
|
|
|
67
70
|
SPA v1.1.0 stays on the LOW end of its band: v1.0.0 occupied US-1101 through US-1128; v1.1.0 adds US-1129 and US-1130, leaving headroom above 1130 for future minor bumps and for project-side stories that mechanically derive to the 11xx numeric range.
|
|
68
71
|
|
|
@@ -60,7 +60,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
60
60
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
61
61
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
62
62
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
63
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
63
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
64
64
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
65
65
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
66
66
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -69,6 +69,9 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
69
69
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
70
70
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
71
71
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
72
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
73
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
74
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
72
75
|
|
|
73
76
|
US 6101-6110 sit at the LOW end of the 6101-6899 band on purpose. A project-side story that mechanically derives from `delivery-ci-workflows-REQ-011` into the number `6111` would collide against delivery-ci-workflows-US-6111 in this package; the band leaves headroom at the HIGH end (US 6181-6899) so a project's own stories anchored to delivery-ci-workflows REQs can allocate without conflict. The watchpost run4 lesson applies here too.
|
|
74
77
|
|
|
@@ -46,7 +46,7 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
46
46
|
| application-account-settings | 25101-25899 | 26xx | shipped v1.0.0 | none |
|
|
47
47
|
| application-onboarding-tour | 26101-26899 | 27xx | shipped v1.0.0 | none |
|
|
48
48
|
| persistence-data-postgres | 27101-27899 | 28xx | shipped v1.0.0 | `persistenceStore`, `migrationDiscipline` |
|
|
49
|
-
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.
|
|
49
|
+
| object-storage-s3 | 28101-28899 | 29xx | shipped v1.1.0 | `objectStorageContract` |
|
|
50
50
|
| messaging-queue-cloudflare | 29101-29899 | 30xx | shipped v1.0.0 | `deliverySemantics` |
|
|
51
51
|
| jobs-background | 30101-30899 | 31xx | shipped v1.0.0 | `backgroundJobModel` |
|
|
52
52
|
| platform-cloudflare-kv | 31101-31899 | 32xx | shipped v1.0.0 | `keyValueStoreContract` |
|
|
@@ -55,6 +55,9 @@ This table is maintained shelf-wide across every blueprint's `docs/topics.md`. R
|
|
|
55
55
|
| edge-cloudflare-access | 34101-34899 | 35xx | shipped v1.0.0 | `edgeAuthenticationGate` |
|
|
56
56
|
| edge-cloudflare-turnstile | 35101-35899 | 36xx | shipped v1.0.0 | `humanVerificationGate` |
|
|
57
57
|
| edge-cloudflare-rate-limiting | 36101-36899 | 37xx | shipped v1.0.0 | `edgeThrottleContract` |
|
|
58
|
+
| deploy-hetzner-server | 37101-37899 | 38xx | shipped v1.0.0 | `linuxCloudHostContract`, `snapshotAndBackupCadence` |
|
|
59
|
+
| platform-docker-compose-host | 38101-38899 | 39xx | shipped v1.0.0 | `containerHostContract` |
|
|
60
|
+
| edge-cloudflare-tunnel | 39101-39899 | 40xx | shipped v1.0.0 | `edgeIngressBridge` |
|
|
58
61
|
|
|
59
62
|
US 12101-12112 sit at the LOW end of the 12101-12899 band on purpose. A project-side story that mechanically derives from a deploy-cloudflare-workers REQ id into the number `12112` would collide against deploy-cloudflare-workers-US-12112 in this package; the band leaves headroom at the HIGH end (US 12181-12899) so a project's own stories anchored to deploy-cloudflare-workers REQs can allocate without conflict. The watchpost run4 lesson applies here too. Band spacing between the last shipped block (security-secrets-management, 8101-8899, 9xx) and this one (12101-12899, 13xx) leaves the 9xxx-11xxx US bands and the 10xx-12xx suffix blocks open for concurrent-lane authoring so a peer authoring another blueprint in the same PR window does not collide with this one.
|
|
60
63
|
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
## 1.0.1
|
|
2
|
+
|
|
3
|
+
H-1 hardening patch train (round-7 real-account gate d-2026-09-08-010 defect list). Fixes nine real-path defects in the shared throwaway-Hetzner-server fixture at packages/rcf-lite/test/fixtures/hetzner-throwaway-server/ so the three T-1 real-account probes return aggregateVerdict pass on a live Hetzner Cloud project unpatched, and destroy plus sweep-orphans never leak a server. Every existing v1.0.0 contribution id byte-identical apart from the cloud-init template bodies (baseline unchanged; adds a NOPASSWD sudoers.d fragment for the deploy user) and the three T-1 mocked probe bodies (mutation-purity clean plus a new rendered-file assertion).
|
|
4
|
+
|
|
5
|
+
Defect list fixed:
|
|
6
|
+
|
|
7
|
+
- (1) provision.mjs reads snake_case fields off the hcloud server create response (public_net.ipv4.ip, datacenter.location.name, server_type.name). v1.0.0 read camelCase and threw on every real-account provision, so destroy.mjs could not find the server to tear down.
|
|
8
|
+
- (2) provision.mjs renders the cloud-init user-data via src/cloud-init-renderer.mjs before hcloud server create fires and writes it to hetzner/servers/rendered/<name>.cloud-init.yaml. v1.0.0 expected a file that no shipped code wrote; every provision failed on missing user-data.
|
|
9
|
+
- (3) src/cloud-init-renderer.mjs resolves each ssh key name to its .publicKey via hcloud ssh-key describe --output json and inlines the material into ssh_authorized_keys under the deploy user. v1.0.0 inlined the key NAME and the deploy user had no working authorized_keys entry.
|
|
10
|
+
- (4) destroy.mjs and sweep-orphans.mjs never pass --output json to a hcloud <resource> delete verb (the delete verbs reject the flag with unknown flag: --output). The tolerant JSON parser accepts arrays, objects and the delete verbs short informational text output.
|
|
11
|
+
- (5) src/snapshot-verb.mjs shells hcloud server create-image --type snapshot --description <label> <server-id> and recovers the created snapshot id via hcloud image list --type=snapshot --output json by matching the serverName label. v1.0.0 called a non-existent hcloud image create-image verb.
|
|
12
|
+
- (6) src/ssh-baseline-check.mjs polls port 22 open and a trivial ssh true exec (bounded up to 6 minutes) before firing the six baseline checks. v1.0.0 spawned ssh immediately after provision and every check timed out on connection refused because cloud-init had not finished.
|
|
13
|
+
- (7) contributions/templates/cloud-init.yaml.tmpl adds a write_files sudoers.d fragment at /etc/sudoers.d/90-deploy-nopasswd (mode 0440) that grants NOPASSWD to the deploy user, so the sudoed baseline checks (cloud-init status --wait, ufw status, iptables -L, systemctl is-active fail2ban) never block on a tty prompt.
|
|
14
|
+
- (9) provision.mjs reads an env override RCF_LITE_CI_SSH_KEY_NAME (per-key comma-separated) for the manifest sshKeyIds, with the manifest value staying the default when the override is unset. Documented in the fixture README.
|
|
15
|
+
|
|
16
|
+
Also: the three T-1 mocked probe modules (cloud-init-render-lint, manifest-schema-validate, hcloud-dry-run-mock) no longer read any process.env.SIMULATE_ switch inside the probe body per the H-1 mutation-purity gate row. The switches live entirely inside fixture-side files (src/cloud-init-renderer.mjs, src/hcloud-mock.mjs, src/provisioner-facade.mjs and the fixture-side run-manifest-schema-validate.mjs shim) and alter INPUT only. The hcloud-dry-run-mock probe now consumes the SAME rendered cloud-init file the real path consumes (renderer writes it, both the mock and real path read it) and asserts an ssh public-key line under the deploy user plus a NOPASSWD directive naming that user (H-1 REQ-145 / AC-14501-1). Report envelopes under .rcf/reports/blueprints/deploy-hetzner-server/ regenerated from the real run.
|
|
17
|
+
|
|
18
|
+
Chain: HQ hardening block H-1 REQ-145..149 / TS-175..179 / FBS-165..169 / CN-510..519 per HQ chain-block ruling 2026-09-08. Real run under Baz one-off approval 2026-09-08: yes, one-off for round 7 gates; Ensure that after any testing etc the Hertner account leaves NO orphaned resources behind. Leave it in the state it started in.
|
|
19
|
+
|
|
20
|
+
Defect (8) T-2 and T-3 stub drivers are OUT of scope for H-1 (H-2 owns them).
|
|
21
|
+
|
|
22
|
+
# deploy-hetzner-server changelog
|
|
23
|
+
|
|
24
|
+
## 1.0.0
|
|
25
|
+
|
|
26
|
+
Initial shelf release. Ships an hcloud-shaped provisioner facade
|
|
27
|
+
(with a raw-api elicited alternative) as the sole reader of the
|
|
28
|
+
Hetzner API token; a manifest schema at `hetzner/servers/*.json`; a
|
|
29
|
+
cloud-init template landing the six-block hardening baseline (SSH
|
|
30
|
+
key-only, root disabled, UFW default-deny incoming, DOCKER-USER
|
|
31
|
+
iptables chain, fail2ban SSH jail, unattended-upgrades); a firewall
|
|
32
|
+
rule shape (22 from operator-nominated prefixes, 80/443 open, deny
|
|
33
|
+
all else); a snapshot cadence elicit (weekly default, daily and off
|
|
34
|
+
alternatives) plus a snapshot-on-demand verb; four metadata-only
|
|
35
|
+
lifecycle events (`provisionerReady`, `hetznerServerProvisioned`,
|
|
36
|
+
`hetznerSnapshotTaken`, `hetznerServerDestroyed`). Provides the
|
|
37
|
+
`cloudHost` capability. Mints two new global topics:
|
|
38
|
+
`linuxCloudHostContract` and `snapshotAndBackupCadence`. Suggests
|
|
39
|
+
companions `logging` and `errorHandling`.
|
|
40
|
+
|
|
41
|
+
Ships six Node-only probes: `cloud-init-render-lint`,
|
|
42
|
+
`manifest-schema-validate`, `hcloud-dry-run-mock` (three mocked; each
|
|
43
|
+
paired with a mutation switch that flips the probe to FAIL), plus
|
|
44
|
+
`real-account-throwaway-server-provision`,
|
|
45
|
+
`real-account-cloud-init-hardened`,
|
|
46
|
+
`real-account-snapshot-on-demand` (three account-bound; skipped
|
|
47
|
+
without `CI_HAS_HETZNER_ACCOUNT`).
|
|
48
|
+
|
|
49
|
+
Mints the shared `hetzner-throwaway-server` fixture under
|
|
50
|
+
`packages/rcf-lite/test/fixtures/` (round-7 T-2 and T-3 EXTEND it,
|
|
51
|
+
they do not ship a second copy).
|
|
52
|
+
|
|
53
|
+
Trace: hetzner-round-7-spec-2026-09-07.md section 5.1;
|
|
54
|
+
Baz ruling 2026-09-07 09:50Z (decisions 18 through 24 approved as
|
|
55
|
+
recommended, "round 7 - agreee to all").
|
|
@@ -0,0 +1,202 @@
|
|
|
1
|
+
# deploy-hetzner-server v1.0.0
|
|
2
|
+
|
|
3
|
+
Ship a Hetzner Cloud Linux VM as the project's `cloudHost`. A facade
|
|
4
|
+
over `hcloud` (or the raw Hetzner Cloud REST API) that provisions a
|
|
5
|
+
server from a git-managed manifest, lands a six-block hardening
|
|
6
|
+
baseline via cloud-init, applies a documented firewall shape, and
|
|
7
|
+
emits four metadata-only lifecycle events on the injected sink.
|
|
8
|
+
|
|
9
|
+
- Category: `deploy` (sibling of `deploy-cloudflare-workers`; the deploy
|
|
10
|
+
family enforces one target per project at apply time).
|
|
11
|
+
- Capabilities provided: `cloudHost`.
|
|
12
|
+
- Suggested companions: `logging`, `errorHandling`.
|
|
13
|
+
- New global topics minted: `linuxCloudHostContract`,
|
|
14
|
+
`snapshotAndBackupCadence`.
|
|
15
|
+
|
|
16
|
+
## What the blueprint contracts
|
|
17
|
+
|
|
18
|
+
Six REQs realise the shape:
|
|
19
|
+
|
|
20
|
+
| REQ | What it commits |
|
|
21
|
+
|---|---|
|
|
22
|
+
| REQ-001 | The provisioner facade is the sole reader of `HETZNER_ACCOUNT_API_KEY` and emits `provisionerReady` with `{tool, apiHost}` on boot. |
|
|
23
|
+
| REQ-002 | Server declarations live at `hetzner/servers/<name>.json` and validate against the shipped JSON Schema (nine required fields). |
|
|
24
|
+
| REQ-003 | The cloud-init template renders YAML that lands the six hardening baseline blocks on every provisioned server. |
|
|
25
|
+
| REQ-004 | Firewall rule shape: 22 from operator-nominated prefixes, 80 and 443 open, all other inbound denied. Applied at provision time. |
|
|
26
|
+
| REQ-005 | Snapshot cadence elicited (weekly default, daily and off alternatives). A snapshot-on-demand verb fires a tagged snapshot. |
|
|
27
|
+
| REQ-006 | Four lifecycle events fire with metadata-only payloads; no event body carries the token, an ssh private key, or the user-data body. |
|
|
28
|
+
|
|
29
|
+
Nine USs (37101 through 37109) split those REQs into one user story
|
|
30
|
+
per shape plus three cross-cutting cases: manifest-applies,
|
|
31
|
+
cloud-init-hardened, snapshot-on-demand.
|
|
32
|
+
|
|
33
|
+
Four TACs anchor the mechanism: `TAC-3801` provisioner, `TAC-3802`
|
|
34
|
+
manifest schema, `TAC-3803` cloud-init template, `TAC-3804` firewall
|
|
35
|
+
shape.
|
|
36
|
+
|
|
37
|
+
Four ADRs record the load-bearing decisions:
|
|
38
|
+
|
|
39
|
+
- `ADR-3801` cloud host contract (scope global, new topic
|
|
40
|
+
`linuxCloudHostContract`).
|
|
41
|
+
- `ADR-3802` snapshot cadence (scope global, new topic
|
|
42
|
+
`snapshotAndBackupCadence`); weekly default; Hetzner-managed backups
|
|
43
|
+
are an elicited paid opt-in at approximately 20 percent of monthly
|
|
44
|
+
server price per
|
|
45
|
+
https://docs.hetzner.com/cloud/servers/backups-snapshots/overview.
|
|
46
|
+
- `ADR-3803` provisioning tool: `hcloud` default, `raw-api`
|
|
47
|
+
alternative, Terraform rejected on second toolchain and state file
|
|
48
|
+
grounds per Baz ruling 2026-09-07.
|
|
49
|
+
- `ADR-3804` hardening baseline: the six blocks named below.
|
|
50
|
+
|
|
51
|
+
## Two provisioner paths: hcloud and raw-api
|
|
52
|
+
|
|
53
|
+
The `provisioningTool` elicit takes `hcloud` (default) or `raw-api`.
|
|
54
|
+
Both paths sit behind the same facade so consumer code never diverges.
|
|
55
|
+
|
|
56
|
+
- `hcloud` shells to the Hetzner Cloud CLI with `--output json` for
|
|
57
|
+
every verb. Small, self-documenting, dependency-free (the operator
|
|
58
|
+
installs the binary once). Vendor doc:
|
|
59
|
+
https://github.com/hetznercloud/cli.
|
|
60
|
+
- `raw-api` fetches the Hetzner Cloud REST API directly. Useful when
|
|
61
|
+
the target host or CI runner cannot install a binary. Vendor doc:
|
|
62
|
+
https://docs.hetzner.cloud/.
|
|
63
|
+
|
|
64
|
+
## Hardening baseline (per ADR-3804)
|
|
65
|
+
|
|
66
|
+
Every rendered cloud-init lands these six blocks. The render-lint
|
|
67
|
+
probe asserts each block appears in the YAML; the
|
|
68
|
+
`SIMULATE_HARDENING_DRIFT` mutation removes a block and the probe
|
|
69
|
+
FAILS naming the missing line.
|
|
70
|
+
|
|
71
|
+
1. SSH key-only. `PasswordAuthentication no` via
|
|
72
|
+
`/etc/ssh/sshd_config.d/hardening.conf`.
|
|
73
|
+
2. Root disabled. `PermitRootLogin no` in the same file.
|
|
74
|
+
3. UFW default-deny incoming with 22, 80, 443 permitted per the
|
|
75
|
+
manifest firewall shape.
|
|
76
|
+
4. DOCKER-USER iptables chain wired to drop non-conforming egress
|
|
77
|
+
(loaded on boot via `iptables-persistent`).
|
|
78
|
+
5. fail2ban SSH jail on port 22.
|
|
79
|
+
6. `unattended-upgrades` on for security updates per
|
|
80
|
+
https://wiki.debian.org/UnattendedUpgrades.
|
|
81
|
+
|
|
82
|
+
## Elicited parameters
|
|
83
|
+
|
|
84
|
+
| Elicit | Choices | Default |
|
|
85
|
+
|---|---|---|
|
|
86
|
+
| `provisioning-tool` | `hcloud`, `raw-api` | `hcloud` (ADR-3803) |
|
|
87
|
+
| `server-type` | `cx23`, `cx33`, `cx43`, `cpx11`..`cpx41`, `cax11`..`cax31` | `cx23` |
|
|
88
|
+
| `location` | `fsn1`, `nbg1`, `hel1`, `ash`, `hil` | `fsn1` (Baz ruling 2026-09-07 09:50Z) |
|
|
89
|
+
| `image` | any Hetzner image slug | `ubuntu-24.04` |
|
|
90
|
+
| `ssh-source-prefixes` | CSV of CIDR ranges | `203.0.113.0/24` (example only; supply the real prefix set) |
|
|
91
|
+
| `firewall-id` | existing firewall id or empty | empty (create from `firewallRules`) |
|
|
92
|
+
| `snapshot-cadence` | `weekly`, `daily`, `off` | `weekly` (ADR-3802) |
|
|
93
|
+
| `hetzner-managed-backups` | `true`, `false` | `false` (ADR-3802) |
|
|
94
|
+
|
|
95
|
+
ssh-key ids are delegated to `security-secrets-management`; the
|
|
96
|
+
manifest carries a nonempty array of key references (names) and the
|
|
97
|
+
facade never sees the private material.
|
|
98
|
+
|
|
99
|
+
## Companions
|
|
100
|
+
|
|
101
|
+
- `logging` supplies the sink factory for the four lifecycle events.
|
|
102
|
+
- `errorHandling` supplies the internal-error record factory and the
|
|
103
|
+
facade boundary that turns hcloud non-zero exits, rate-limited API
|
|
104
|
+
calls, firewall-apply failures and cloud-init timeouts into typed
|
|
105
|
+
records.
|
|
106
|
+
|
|
107
|
+
## The six probes and how to run them
|
|
108
|
+
|
|
109
|
+
Every probe lives at `contributions/probes/<name>.mjs` with a
|
|
110
|
+
`run-<name>.mjs` shim, and is exercised through a fixture-side
|
|
111
|
+
`run-<name>.mjs` under
|
|
112
|
+
`packages/rcf-lite/test/fixtures/hetzner-throwaway-server/`.
|
|
113
|
+
|
|
114
|
+
- Three mocked probes run in-process without an API call:
|
|
115
|
+
- `cloud-init-render-lint` (AC-37104-1): renders the template
|
|
116
|
+
against the fixture manifest and asserts the six baseline blocks
|
|
117
|
+
appear. Mutation switch: `SIMULATE_HARDENING_DRIFT=true`.
|
|
118
|
+
- `manifest-schema-validate` (AC-37102-1, also AC-37106-1 and
|
|
119
|
+
AC-37107-1): validates every fixture manifest. Mutation switch:
|
|
120
|
+
`SIMULATE_MANIFEST_INVALID=true`.
|
|
121
|
+
- `hcloud-dry-run-mock` (AC-37101-1 and AC-37109-1): drives the
|
|
122
|
+
facade lifecycle against a mocked hcloud shim and asserts every
|
|
123
|
+
lifecycle event fires with a metadata-only payload; runs an
|
|
124
|
+
event-secrecy scan across every event body. Mutation switches:
|
|
125
|
+
`SIMULATE_JSON_PARSE_STRIP=true` (parser failure) and
|
|
126
|
+
`SIMULATE_EVENT_SECRECY_LEAK=true` (defensive-fake token leak).
|
|
127
|
+
- Three account-bound probes gate on `CI_HAS_HETZNER_ACCOUNT`:
|
|
128
|
+
- `real-account-throwaway-server-provision` (AC-37103-1): applies
|
|
129
|
+
the ci-throwaway manifest, asserts the server appears in
|
|
130
|
+
`hcloud server list`, tears down in `always()`.
|
|
131
|
+
- `real-account-cloud-init-hardened` (AC-37105-1): waits for
|
|
132
|
+
`cloud-init status --wait`, runs six ssh baseline checks.
|
|
133
|
+
- `real-account-snapshot-on-demand` (AC-37108-1): fires the snapshot
|
|
134
|
+
verb, asserts a tagged snapshot appears in `hcloud image list`.
|
|
135
|
+
|
|
136
|
+
Without `CI_HAS_HETZNER_ACCOUNT=true` the three account-bound probes
|
|
137
|
+
record `accountBoundSkipped: true` and the aggregate flips to pass per
|
|
138
|
+
hetzner-round-7-spec-2026-09-07.md section 3.5.
|
|
139
|
+
|
|
140
|
+
Reviewer boot from the fixture directory (mocked path, no account):
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
cd packages/rcf-lite/test/fixtures/hetzner-throwaway-server
|
|
144
|
+
node ./run-cloud-init-render-lint.mjs && node ./run-manifest-schema-validate.mjs && node ./run-hcloud-dry-run-mock.mjs
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
Every probe writes its report envelope to
|
|
148
|
+
`.rcf/reports/blueprints/deploy-hetzner-server/<probe-name>.json`.
|
|
149
|
+
|
|
150
|
+
## Shared throwaway-server fixture
|
|
151
|
+
|
|
152
|
+
The one new pattern this round. Lives at
|
|
153
|
+
`packages/rcf-lite/test/fixtures/hetzner-throwaway-server/`; ships
|
|
154
|
+
`provision.mjs`, `destroy.mjs`, `sweep-orphans.mjs`, the mocked hcloud
|
|
155
|
+
shim and the manifest at `hetzner/servers/ci-throwaway.json`. T-2
|
|
156
|
+
(`platform-docker-compose-host`) and T-3 (`edge-cloudflare-tunnel`)
|
|
157
|
+
EXTEND the fixture rather than shipping a second copy. Cost ceiling:
|
|
158
|
+
one `cx23` at approximately EUR 0.006/hour per run; destroy runs in
|
|
159
|
+
`always()`; the nightly `sweep-orphans` cron collects any leak with a
|
|
160
|
+
60-minute label-age cutoff and emits a `throwawayServerSweptCount`
|
|
161
|
+
metric.
|
|
162
|
+
|
|
163
|
+
## When to reach for this blueprint
|
|
164
|
+
|
|
165
|
+
Reach for `deploy-hetzner-server` when the project needs a persistent
|
|
166
|
+
Linux runtime: something a Cloudflare Worker cannot host (a
|
|
167
|
+
long-running process, a container runtime, an outbound network
|
|
168
|
+
adapter that needs a stable egress). Sibling `deploy-cloudflare-workers`
|
|
169
|
+
still ships every V8-isolate workload the Workers runtime accepts;
|
|
170
|
+
this blueprint is the Hetzner-line answer for the workloads Workers
|
|
171
|
+
cannot host.
|
|
172
|
+
|
|
173
|
+
## Consumers
|
|
174
|
+
|
|
175
|
+
- ops-01 is the first HQ consumer (`w-2026-09-07-dave-004` migration).
|
|
176
|
+
- Round-7 T-2 `platform-docker-compose-host` composes on
|
|
177
|
+
`capabilities: [cloudHost]`.
|
|
178
|
+
- Round-7 T-3 `edge-cloudflare-tunnel` composes on `cloudHost` (via
|
|
179
|
+
the systemd unit shape) or on `containerHost` (via T-2).
|
|
180
|
+
|
|
181
|
+
Blueprint acceptance never depends on the ops-01 migration.
|
|
182
|
+
|
|
183
|
+
## Standards trace
|
|
184
|
+
|
|
185
|
+
- Hetzner Cloud API: https://docs.hetzner.cloud/
|
|
186
|
+
- Hetzner Cloud CLI: https://github.com/hetznercloud/cli
|
|
187
|
+
- Hetzner Cloud servers overview: https://docs.hetzner.com/cloud/servers/overview
|
|
188
|
+
- Hetzner Cloud firewalls overview: https://docs.hetzner.com/cloud/firewalls/overview/
|
|
189
|
+
- Hetzner Cloud backups-and-snapshots overview:
|
|
190
|
+
https://docs.hetzner.com/cloud/servers/backups-snapshots/overview
|
|
191
|
+
- Hetzner Cloud networks overview: https://docs.hetzner.com/cloud/networks/overview/
|
|
192
|
+
- Hetzner community basic cloud-config tutorial:
|
|
193
|
+
https://community.hetzner.com/tutorials/basic-cloud-config
|
|
194
|
+
- cloud-init documentation: https://cloudinit.readthedocs.io/en/latest/
|
|
195
|
+
- Debian unattended-upgrades wiki: https://wiki.debian.org/UnattendedUpgrades
|
|
196
|
+
|
|
197
|
+
## Rejected alternatives
|
|
198
|
+
|
|
199
|
+
- Terraform. Adds a second toolchain and a state file that nobody in
|
|
200
|
+
the estate needs. Baz ruling 2026-09-07 09:50Z on decision 18.
|
|
201
|
+
- A Load Balancer blueprint. Out of scope for round-7 T-1; may ship as
|
|
202
|
+
a follow-up if a second Hetzner consumer needs it.
|