Skip to content

evidence(OMN-18081): union-resolve — bind OMN-18081 to omniweb#364 - #8800

Merged
jonahgabriel merged 2 commits into
devfrom
jonah/omn-18081-occ-companion-pr-364
Sep 9, 2026
Merged

jonahgabriel merged 2 commits into
devfrom
jonah/omn-18081-occ-companion-pr-364

Conversation

@jonahgabriel

Copy link
Copy Markdown
Contributor

Hand-bound OCC companion (union-resolve) for OmniNode-ai/omniweb#364, ticket OMN-18081.
Binds AC1, AC2 and AC3.

Why this is hand-minted

The occ-companion-effect job on #364 did not merely fail to bind — it could not publish
at all. Run 34355977342 ended with:

the lane declares security_protocol=SASL_PLAINTEXT / sasl_mechanism=SCRAM-SHA-256, but
KAFKA_SASL_USERNAME and/or KAFKA_SASL_PASSWORD are not set in this job's environment

That is the autobind outage OMN-18073 records, and it reproduced on the second push
(run 34357009812). Without a companion, #364 has no receipt to cite. Same union-resolve
shape as OCC#8760 (omninode_infra#1266) and OCC#8787 (omninode_infra#1274).

What the product PR fixes, and the finding that matters

The operator reported from the dev dashboard that "users cannot actually add in a label
for the key anymore"
.

Nothing had been removed. Read-only at origin/dev acec8de — the sha deployed to
onex-dev — the label input still rendered, resolveKeyLabel still returned a typed label
verbatim, action-logic forwarded it, api-client POSTed it as { name }, and the
gateway's ApiKeyCreateBody requires and stores that name. No omninode_infra
change was needed and none was made.

The operator-visible outcome came from three compounding things, none of them a removal:

  1. Both mints write a name with no prompt at all — the gateway's at sign-up, and the
    panel's own first-visit backfill.
  2. The input sat behind a New API key toggle with nothing hinting it existed.
  3. The page header read "you never type one in" — true of the secret, but it reads as
    a statement about the whole panel.

#364 opens the create form permanently, scopes the header's claim to the credential while
stating the label is the customer's to give, and captions an auto-named key as auto-named.
The caption is the ticket's own stated alternative to a rename: the gateway exposes no
PATCH /v1/api-keys/{id} (post, get and delete only), so a rename is not buildable.

Both protections OMN-18011 bought are preserved and now pinned rather than left to
inspection — the submit control is never gated on an empty label (operator ruling
2026-09-06), and an onxk_-prefixed label is still refused.

Evidence carried here

item shape
dod-OmniNode-ai-omniweb-pr-364 PR state + the new test file present in the diff, with a positive control on the grep
dod-occ-diff-derived-behavior-proof 17/17 pass at the pushed commit (OMN-16434), against a RED control of 10-of-17 failing at acec8de
occ-self-bind-pr-<n> binds OMN-18081 to this companion

The behavior-proof receipt records the RED control taken in-lane, not asserted: 10 of 17
fail at acec8de, 17/17 pass at the pushed head, and the 7 that pass in both states are
the OMN-18011 protection pins — the correct result for a change that must preserve them.

Not bound here, deliberately

AC4 is the staging readback on dev.app after delivery. It cannot be proven before #364
merges and reaches onex-dev, so it is not claimed. Rule 24 is stated rather than implied in
the contract summary: the .201 compose dev lane runs no dashboard, so there is no lab
surface for this change and no lab pass is claimed.

Rule 22 respected: no credential was rotated, re-issued, revoked or minted; no secret value
was read, printed or decoded; no cluster object was mutated.

Hand-bound OCC companion for OmniNode-ai/omniweb#364, binding AC1, AC2
and AC3.

Hand-minted because the occ-companion-effect job could not publish. On
run 34355977342 it failed with "the lane declares
security_protocol=SASL_PLAINTEXT / sasl_mechanism=SCRAM-SHA-256, but
KAFKA_SASL_USERNAME and/or KAFKA_SASL_PASSWORD are not set in this job's
environment", which is the autobind outage OMN-18073 records. Without a
companion, #364 has no receipt to cite and fails the Receipt Gate on the
missing citation rather than on anything wrong with the change. Same
union-resolve shape as OCC#8760 (omninode_infra#1266) and OCC#8787
(omninode_infra#1274).

AC4 is deliberately NOT bound: it is the staging readback on dev.app
after delivery, and it cannot be proven before this merges and reaches
onex-dev. Rule 24 is stated rather than implied in the contract summary —
the .201 compose dev lane runs no dashboard, so there is no lab surface
for this change and no lab pass is claimed.

Receipts carry real probe output, not asserted output. The behavior-proof
receipt records the RED control taken in-lane: 10 of 17 fail at acec8de,
17/17 pass at the pushed head, and the 7 that pass in BOTH states are the
OMN-18011 protection pins, which is the correct result for a change that
must preserve them.

Rule 22 respected: no credential was rotated, re-issued, revoked or
minted; no secret value was read, printed or decoded; no cluster object
was mutated.
occ-preflight eligibility and verify/verify both failed on the same cause,
missing_occ_self_bind: the OMN-18081 evidence verified (receipts PASS, hashes
bound) but nothing bound a receipt to the OCC PR carrying the contract.

Appends `occ-self-bind-pr-8800` and its PASS receipt. The entry is APPENDED,
never edited into an existing one, so both existing entries keep their
contract_entry_sha256 byte-for-byte — recomputed and confirmed identical
(9ea64111... and 9c56e1ea...), which is the OMN-13888 property that makes a
later append non-destructive.

The whole-file hash does move on an append, so contract_sha256 is recomputed on
the three receipts from 48c7f629... to 79ef9bbf.... That is legal here and is
not the add-only violation the OMN-18056 lane recorded: those three receipts are
NEW in this same unmerged PR, not merged evidence being rewritten. The Receipt
Honesty Gate checks contract_sha256 against the CURRENT contract unconditionally
on pr_number, so leaving them stale would have traded one red gate for another.

No binds_ac on the self-bind entry: it is an infrastructure binding, not
evidence for an acceptance criterion, matching the landed precedents
(OMN-18048 #8783, OMN-18026 #8791).

Probe run for real, not asserted: `gh pr view 8800` returns state OPEN on
headRefName jonah/omn-18081-occ-companion-pr-364, exit 0. All four receipts
re-validated against the contract with the core hash functions, plus a negative
control proving two entries do not share an entry hash.

Companion for omniweb#364 (OMN-18081). Autobind is down this window (OMN-18073).
@jonahgabriel
jonahgabriel merged commit a2d4d4c into dev Sep 9, 2026
73 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-18081-occ-companion-pr-364 branch September 9, 2026 15:20
jonahgabriel added a commit that referenced this pull request Sep 9, 2026


The eligibility gate refused with reason=missing_occ_self_bind, and it was
right: it verified every receipt and every hash binding for OMN-18081, then
found no receipt binding to THIS evidence PR. A companion that cannot resolve a
PASS receipt for itself is not admissible, whatever it proves about the product
PR.

A SECOND self-bind exists because OCC#8800 merged before the server half of this
ticket was written, so OMN-18081's two halves arrive on two evidence PRs rather
than one. occ-self-bind-pr-8800 is left exactly as merged and keeps its own
per-entry hash.

Whole-file contract_sha256 is refreshed on the three receipts THIS branch owns.
The two inherited from #8800 keep their merged bytes untouched: their binding is
contract_entry_sha256, whole-file is only the fallback consulted when a receipt
carries no entry hash, and rewriting a merged receipt to chase a fallback field
would be editing evidence rather than adding it.

yamlfmt was run BEFORE the hashes were computed rather than after, so the
committed bytes are the formatted bytes and the whole-file hash cannot be stale
the moment it lands. All four pre-existing per-entry hashes were recomputed after
the reflow and are byte-identical, which is the property the per-entry hash is
defined over parsed YAML to have.

No credential was rotated, re-issued, revoked or minted; no secret value was
read or printed; no cluster object was mutated.
jonahgabriel added a commit that referenced this pull request Sep 9, 2026
…nfra#1280 (#8805)

* evidence(OMN-18081): union-resolve — bind the server half, omninode_infra#1280

The operator clarified the intent at ~14:27Z: "It seems like the input is fine
but it should be for the label for the API key so that people can mint more than
one API key." That reframes OMN-18081 from "the input is missing" (it was not)
to "can a customer actually hold several labelled keys", and the ticket's scope
item 3 asked the SERVER to be read rather than assumed.

Three suspects, one real. There is no per-tenant key cap — MAX_API_KEY_LIMIT is
a pagination bound enforced in list_api_keys, not in the mint. Nothing on the
create path revokes or replaces an incumbent. So a key with a DISTINCT label was
never blocked, which is the headline intent and already worked.

The third was real. uq_tenant_api_keys_tenant_id_name_active correctly refuses a
second ACTIVE key under the same name, but that refusal reached the customer as
a bare 500: it raised ApiKeyValidationError, the router caught nothing, and there
is no add_exception_handler for any ApiKeyError in the service, so omniweb
rendered its no-detail fallback. omninode_infra#1280 makes it a typed 409.

Appended, never edited — and verified empirically rather than asserted. The two
existing entries' contract_entry_sha256 values were recomputed after the append
AND after the yaml hook's reflow of the new entry, and both are byte-identical
to the values already carried by the receipts merged on this branch. That is the
append-stability OMN-13888 exists for, and the reflow is exactly the case the
per-entry hash is defined over parsed YAML to survive.

The new receipts' whole-file contract_sha256 is recomputed for the post-reflow
bytes. The older receipts' copies of that field are now stale, which is harmless
and expected: it is only ever the FALLBACK, consulted when a receipt carries no
entry hash, and both of those carry one.

Union-resolve on the same ticket, as OCC#8760 did for
omninode_infra#1266: autobind is not minting companions in this window
(OMN-18073), so both halves of OMN-18081 bind here rather than to two companions
that would collide on the same contract path.

Both receipts carry real probe output, run at c911a5d0. AC4c and the staging
readback are deliberately NOT bound — they cannot be proven before this merges
and reaches onex-dev.

No credential was rotated, re-issued, revoked or minted; no secret value was
read or printed; no cluster object was mutated.

* evidence(OMN-18081): self-bind the server-half companion to OCC PR #8805

The eligibility gate refused with reason=missing_occ_self_bind, and it was
right: it verified every receipt and every hash binding for OMN-18081, then
found no receipt binding to THIS evidence PR. A companion that cannot resolve a
PASS receipt for itself is not admissible, whatever it proves about the product
PR.

A SECOND self-bind exists because OCC#8800 merged before the server half of this
ticket was written, so OMN-18081's two halves arrive on two evidence PRs rather
than one. occ-self-bind-pr-8800 is left exactly as merged and keeps its own
per-entry hash.

Whole-file contract_sha256 is refreshed on the three receipts THIS branch owns.
The two inherited from #8800 keep their merged bytes untouched: their binding is
contract_entry_sha256, whole-file is only the fallback consulted when a receipt
carries no entry hash, and rewriting a merged receipt to chase a fallback field
would be editing evidence rather than adding it.

yamlfmt was run BEFORE the hashes were computed rather than after, so the
committed bytes are the formatted bytes and the whole-file hash cannot be stale
the moment it lands. All four pre-existing per-entry hashes were recomputed after
the reflow and are byte-identical, which is the property the per-entry hash is
defined over parsed YAML to have.

No credential was rotated, re-issued, revoked or minted; no secret value was
read or printed; no cluster object was mutated.
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.

1 participant