flex-auth/workplans/FLEX-WP-0011-railiance-staged-promotion-overlay.md
tegwick 3dc6223cc2
All checks were successful
CI Smoke / host-smoke (push) Successful in 0s
CI Smoke / container-smoke (push) Successful in 2s
Roll flex-auth-tenant-engine onto the FLEX-WP-0010 policy image
CI-built image from e9911eb, digest
sha256:9320df394a642eff24da8af4a0ee8886a7bb78b0f14d8ee1deeb30ea8eeeaba7,
verified in a throwaway container before pinning and then probed again
against the live Service after rollout:

  tenant.retire    allow write_api_policy_matched  decision:491bbef2db999c02
  tenant.create    allow write_api_policy_matched  decision:fa3ba90e9cccb5aa
  tenant.retired   deny  unknown_action            decision:c5ee185de439ffe5
  unknown subject  deny  unknown_subject           decision:a98c59c6a34f84ad

tenant.retire has flipped from deny unknown_action to allow in
production, which is what TEN-WP-0005-T05 was waiting on.

Only flex-auth-tenant-engine was rolled. flex-auth-user-engine stays
pinned to a31961c4 -- its policy is unchanged and there is no reason to
move it. Previous tenant-engine digest kept in the runbook as the
rollback target.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-11 10:41:25 +02:00

4.7 KiB

id type title domain repo status owner topic_slug planning_priority planning_order depends_on_workplans related_workplans created updated state_hub_workstream_id
FLEX-WP-0011 workplan Bring flex-auth under the railiance staged-promotion contract infotech flex-auth proposed codex netkingdom P2 110
FLEX-WP-0009
RAIL-BS-WP-0006
2026-08-11 2026-08-11 b17c3296-f8ae-4f61-bcf7-41ac80bacd47

FLEX-WP-0011 - Bring flex-auth under the railiance staged-promotion contract

flex-auth runs two production Deployments on railiance01 (flex-auth-tenant-engine, flex-auth-user-engine) but has never been brought under the staged-promotion contract (RAIL-BS-WP-0006) that defines what counts as production on that host. This is pre-existing debt discovered during the FLEX-WP-0010 rollout, not a regression introduced by it.

What is missing

The contract's gate table requires:

Gate Requirement flex-auth today
Overlay repo railiance/<app>/ with app.toml and stage manifests missing — manifests live in deploy/*.yaml, a parallel convention
Stage commands stage deploy, stage observe, stage promote, stage rollback proven missing
Evidence Backup/restore drill, canary observation, operator approval recorded partial — probe evidence exists in workplans, no canary or approval record
Registry Image in forge OCI registry with immutable tag met — Deployments pin by digest

Two related facts found at the same time:

  • The Deployments were originally created by kubectl-client-side-apply from a file that existed in no repository. FLEX-WP-0010 recovered them into deploy/ from the live objects' last-applied-configuration so that rollback no longer depends on a cluster annotation. That directory is a rescue, not the sanctioned shape, and this workplan should absorb it.
  • CI image publishing was added in FLEX-WP-0010 (.forgejo/workflows/image.yaml, modelled on activity-core). Before that, images were hand-built on a workstation with no forge-verifiable provenance. The registry gate is now met by construction.

Not a blocker for existing traffic

flex-auth is already serving production decisions and its failure mode is fail-closed: consumers receive deny/403 rather than an unauthorized allow. This workplan closes a governance and recoverability gap, not an active safety incident. It should not be used as a reason to hold routine policy rollouts.

T01 - Author the railiance overlay

id: FLEX-WP-0011-T01
status: todo
priority: medium
state_hub_task_id: "edc7fee5-b78d-4a5c-a773-42c5b39d0019"

Write railiance/app.toml against schema railiance.app.v1, using qonto-assistant/railiance/app.toml as the reference. Declare [app] with an honest criticality (flex-auth is an authorization PDP whose outage blocks consumer writes fail-closed), [source] with digest_policy = "required", [rollback] naming the concrete rollback command, and observability.health_endpoints for both Services' /healthz.

Model stage1/stage2/stage3 on the two-Deployment reality: the two consumers are independently pinned and must be independently rollable. Do not collapse them into one release.

Reshape deploy/*.yaml into the overlay layout (compare activity-core/k8s/railiance/) and keep deploy/README.md's rollout and rollback runbook content rather than discarding it.

Done when the overlay renders and a server-side dry run of the full manifest set is accepted.

T02 - Prove the stage commands

id: FLEX-WP-0011-T02
status: todo
priority: medium
state_hub_task_id: "5283bc1f-88c3-431b-a9ea-4a900a3e5885"

Prove stage deploy, stage observe, stage promote, and stage rollback against a real candidate image, with a canary observation window and a recorded operator approval. Record the previous stable digest as the rollback target before promoting.

Done when a full promote-then-rollback cycle has been demonstrated and the evidence ids are recorded here.

T03 - Correct the stale drain-plan row

id: FLEX-WP-0011-T03
status: todo
priority: low
state_hub_task_id: "bebd6ed9-9145-4fc0-bdc8-cac669643c62"

the-custodian/docs/coulombcore-drain-placement-plan.md row 23 lists flex-auth as living on coulombcore, drain wave 7, status grandfathered, target railiance01. flex-auth in fact already runs on railiance01 (92.205.62.239); the row is stale and understates progress.

This is custodian canon, not a flex-auth file — raise it with the custodian owner rather than editing it from this repo. Confirm at the same time whether a coulombcore flex-auth deployment still exists and needs retiring, or whether wave 7 can be closed.

Done when the row reflects reality or a custodian decision id explains why it stands.