Skip to content

feat(OMN-18601): stage the replacement prod-promotion manifest grant at ad45e2cc - #10454

Merged
jake-b-omni merged 3 commits into
mainfrom
hotfix/omn-18601-grant-at-ad45e2cc
Sep 19, 2026
Merged

jake-b-omni merged 3 commits into
mainfrom
hotfix/omn-18601-grant-at-ad45e2cc

Conversation

@jake-b-omni

Copy link
Copy Markdown
Contributor

Stages grant-aeae215d-d796-4141-a0a9-7b5fd0c22055, the replacement prod-promotion manifest grant, at a tree onex-prod can admit.

Jonah — this needs your approval. grants/prod_promotion_grants.yaml is owned by @OmniNode-ai/platform-leads, GitHub refuses an author's own approval, and approved_by names you. You are the only person who can land it, which is the property the registry exists to have.

What changed since the revoked grant

Two fields, and no others:

revoked grant-90f8e729 this entry
manifest_ref 8279e2ca ad45e2cc
rendered_digest sha256:33b54afe… sha256:976ef4de…

Both trace to one file — k8s/keycloak-seed/base/seed-keycloak-clients-job.yaml now declares allowPrivilegeEscalation: false, capabilities.drop: [ALL], runAsNonRoot: true, seccompProfile: RuntimeDefault. It reached main as omninode_infra#1580, a narrow hotfix carrying the two files of b4eac797 rather than a promotion of all of dev, because #1565 is red on a dev-only hook-topic mirror drift that has nothing to do with Keycloak. Path, subtree, lane and approver are unchanged.

The check whose absence cost the last dispatch

Run 35392020746 passed every identity premise, applied all three objects to onex-prod with a live readback, and then Job seed-keycloak-clients hit DeadlineExceeded with zero pods. So this time admissibility was measured, with a control:

at ad45e2cc   [OK] Job/seed-keycloak-clients admits under restricted        exit=0
at 8279e2ca   [X]  would be REFUSED by restricted:                          exit=1
                   - allowPrivilegeEscalation must be false (got ABSENT)
                   - capabilities.drop must include ALL (got ABSENT)

Same checker, both refs. One that was silently broken would have admitted both. The digest recomputed at ad45e2cc equals the rendered_digest this entry declares, so the tree proven admissible is the tree the grant authorizes.

manifest_subtree is declared wider than manifest_path because the overlay's kustomization names ../../base: the transitive tree is six files across base/ and overlays/prod/.

The stability premise is met, not assumed

deploy-onex-staging run 35458357503, dispatched at ref main after #1580 merged:

verdict=GREEN  cluster=dev-system  sha=ad45e2cc1a8bbd0c4524e62783ee8fd84532e00c
applied=['k8s/keycloak-seed/overlays/dev-system=k8s/keycloak-seed' ...]

GREEN, recorded at the promoted commit, and the mapping names the subtree — so resolve_staging_apply binds it instead of reading SUBTREE_UNBOUND. Fresh until 2026-09-20T17:38:11Z.

What is still not proven

Staging enforces no pod-security profile on any of its namespaces, so a GREEN apply establishes that the overlay APPLIED, not that the Job RAN — it went green for the revoked grant's manifest too. That is OMN-18764, it is open, and the admissibility item above covers the gap by hand, for this dispatch only. The gate still cannot ask that question itself.

Nothing in production is mutated by merging this

The merge adds an authorization, not a workload. No dispatch, deploy, rollback or restart happens, and onex-prod keeps running exactly what it runs now. The inert DeadlineExceeded Job left by the failed reconcile is untouched.

Prune it once consumed

It expires 2026-09-20T17:44:56Z, and the OMN-13424 at-rest invariant FAILS on any expired entry left in the file — reddening every subsequent PR to this repository, which is the trap that put a clock on OCC#10302. Remove it after the dispatch settles, whichever way it settles.

Verification before pushing

All 14 declared check_values execute; every contract_entry_sha256 equals the recomputed per-entry hash; the nine pre-existing entries still bind their already-merged receipts after yamlfmt; honesty rules clean; no corruption sentinel. The schema suite (44 tests) passes and earned its keep — it caught that reason is a required field the entry was drafted without.

hotfix-evidence: OCC-10440
backmerge: #1580

Evidence-Class: hotfix
Evidence-Ticket: OMN-18601

🤖 Generated with Claude Code

https://claude.ai/code/session_01P5jA4UseYGEptrKijm4X9g

…at ad45e2cc

grant-aeae215d-d796-4141-a0a9-7b5fd0c22055 authorizes k8s/keycloak-seed/overlays/prod at omninode_infra ad45e2cc into onex-prod, replacing the revoked grant-90f8e729 whose render production refused at admission. Two fields move and no others: manifest_ref 8279e2ca to ad45e2cc, rendered_digest sha256:33b54afe to sha256:976ef4de, both tracing to the one securityContext block omninode_infra#1580 put on main.

Five evidence items, each measured with a control. The admissibility item is the check whose absence cost the last dispatch: the render at the grant's own manifest_ref admits under restricted, while the same checker REFUSES the same Job at 8279e2ca naming both absent fields, and the recomputed digest equals the declared one so identity and admissibility were measured on the same bytes. The staging premise is met rather than assumed: run 35458357503 at ref main recorded verdict=GREEN at sha ad45e2cc with the applied mapping naming k8s/keycloak-seed, fresh until 2026-09-20T17:38:11Z. The schema suite caught a missing required reason field during authoring.

OMN-18764 stays open: the staging premise proves an overlay APPLIED, not that a Job RAN, and staging enforces no pod-security profile at all. The admissibility item covers that gap by hand, for this dispatch only.

Verified before pushing: all 14 declared check_values execute, every contract_entry_sha256 equals the recomputed per-entry hash, the nine pre-existing entries still bind their merged receipts after yamlfmt, honesty rules clean, no corruption sentinel.

Refs: OMN-18601, OMN-18566, OMN-18764

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P5jA4UseYGEptrKijm4X9g
@jake-b-omni
jake-b-omni requested a review from a team as a code owner September 19, 2026 18:59
jake-b-omni and others added 2 commits September 19, 2026 13:59
The eligibility gate binds a ticket's evidence to the PR under review by pr_number. No contract entry changes, so every per-entry hash stays valid.

Refs: OMN-18601

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P5jA4UseYGEptrKijm4X9g
… grant legitimately inverts it

Contract Compliance returned 13/14 with one BLOCK: dod-omn18601-grant-revoked asserts an empty entries list on the LIVE registry, and this PR stages the replacement grant, so the assertion stops holding. That is the registry working, not a regression.

This is the mirror image of the inversion OCC#10302 fixed in the other direction, and the two staged-state items on this contract already carry a warning about the class. The remedy is the same: the check reads the receipt that holds the measurement and its 6c54c74 control, and the description narrows the claim to what is true — the revocation WAS measured, not that the file is at rest now. The receipt records the pattern in both directions so the next author does not rediscover it.

Re-minted the receipt's contract_entry_sha256 for the changed entry, since a changed check_value changes the per-entry hash and that check is strict. The other thirteen entry hashes are untouched, which is what per-entry hashing is for.

Verified: all 14 entry hashes bind, every check_value executes, honesty rules clean, no corruption sentinel.

Refs: OMN-18601, OMN-13888

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P5jA4UseYGEptrKijm4X9g
@jake-b-omni
jake-b-omni enabled auto-merge (squash) September 19, 2026 19:23
@jake-b-omni
jake-b-omni merged commit 93f1c24 into main Sep 19, 2026
37 checks passed
@jake-b-omni
jake-b-omni deleted the hotfix/omn-18601-grant-at-ad45e2cc branch September 19, 2026 19:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants