docs(pm): two rendered manifests nothing applies — the keycloak one is a trap
gate / gate (push) Has been cancelled
gate / conformance (push) Has been cancelled

Co-Authored-By: Claude Opus 5 <[email protected]>
This commit is contained in:
jakman85andClaude Opus 5 committed 2026-09-13 17:18:28 -05:00
1 parent eb2510837c
commit 69a99e6ca6
1 file changed
+34
+34
View File
@@ -3298,3 +3298,37 @@ should say how to expose the spec repo to a clone without writing into it.
- **R-TLS-02 still needs the owner** (revocation is not implementable with cert-manager).
- **`path_requirements()` leaves 159 of 613 tracked paths (26%) unmapped** — 56 prose, 103 non-prose.
Measured today; smaller than the 255/476 an older branch claimed, still the larger fail-open.
---
## 2026-09-13 — two rendered manifests that NOTHING applies, and one is a trap
`apps/wave-1/keycloak.yaml` and `apps/wave-0/vm-demo.yaml` are produced by `catalog/render.py`,
committed, and kept honest by the `render-golden` gate stage — but **no kustomization references
either**, so Flux never applies them. Verified: `grep -rl <basename> --include=kustomization.yaml`
returns nothing for both.
**Why the keycloak one is worse than dead weight.** The real Keycloak is operator-managed through
`platform-config/kustomization.yaml` → `platform/keycloak/keycloak-instance.yaml`, with its own
ServiceMonitor and the live `KeycloakDown` rule. The rendered ServiceDefinition version is a FULL
second Deployment of the same service. Someone tidying up "an unreferenced file" by wiring it into
`apps/wave-1/kustomization.yaml` would stand up a conflicting second Keycloak against the same
database — and it would look like the obvious fix, because every other rendered app IS wired in.
It also carried a duplicate ServiceMonitor pointing at the wrong port (found 2026-09-13 during the
SLI audit), which is how its unreferenced state came to light at all.
**No harm today**: nothing applies them, and Keycloak's liveness is genuinely covered by the
operator-side ServiceMonitor plus `KeycloakDown`. This is latent risk plus a gate stage spending
effort on output that reaches no cluster.
**NOT ACTED ON — needs the owner's intent**, because the catalog is the declaration of record and
there may be a reason both entries exist. The three options, in the order I would pick them:
1. Keep the catalog entries as the service DECLARATION (ingress, auth, observability contract) but
teach the renderer not to emit a workload for a service whose workload is operator-managed —
a flag such as `source: operator-managed`. Keeps the contract, removes the trap.
2. Remove `catalog/keycloak.yaml`, moving its ingress/auth declaration to `platform/keycloak/`
alongside the instance it describes. Loses the uniform catalog view of the service.
3. Wire nothing, delete nothing, and add a prominent DO-NOT-WIRE header to both rendered files.
Cheapest, and relies on a comment — which is the mechanism this repo has already watched fail
(the bulk StorageClass sat as a REPLACE-ME stub behind four hand-written comments).
`vm-demo` is likely just an undeployed demo and may only need option 3.