Skip to content

fix(OMN-18414): the evidence closer reads the declared Gate: grammar instead of its own - #3605

Merged
jonahgabriel merged 4 commits into
devfrom
jonah/omn-18414-gate-binding-grammar-contract
Sep 16, 2026
Merged

jonahgabriel merged 4 commits into
devfrom
jonah/omn-18414-gate-binding-grammar-contract

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 15, 2026 •

Copy link
Copy Markdown
Collaborator

Closes OMN-18414. Parent OMN-18200.

One Gate: key in a Linear description was read by two parsers whose accepted vocabularies did not overlap at all. This is not a superset/subset mismatch; the two sets were disjoint.

Authority Accepted forms
Authoring omniclaude plugins/onex/hooks/lib/ticket_creation_guard.py:396 C<n>, INV-<nnn>, OMN-<n> AC-<n>, live-gate defect: <check>
Reading this repo's _gate_probe_declaration (was at handler_evidence_autoclose_sweep.py:1849) <owner>/<repo> <file>.yml and nothing else

So every ticket the guard admitted arrived at the closer as an unreadable declaration and was typed skipped_gate_probe_red, and the form the closer required would have been refused at creation.

Measured

Four Done-candidates were held on nothing else at the 2026-09-15T21:34Z dry-run tick (run 35026356112): OMN-18403 (live-gate defect: workspace-reconcile-status), OMN-18387 (C7), OMN-18368 and OMN-18365 (parent-criterion bindings).

A second, independent defect sat under the parent-criterion form: Linear rewrites a plain OMN-16990 into an issue-mention element, so the text the closer reads is not the text the author wrote. A pattern built against the authored spelling matches nothing on any live ticket. The contract declares the normalization that fixes this.

What this lands

  • src/omnibase_infra/contracts/gate_binding_grammar.json — the single declaration. Line patterns, normalizations, five forms, and the worked fixtures both consumers run.
  • src/omnibase_infra/gate_binding/ — the reader. It spells no form pattern of its own; test_the_resolver_spells_no_form_pattern_of_its_own reads the module source and fails if one reappears.
  • _gate_binding_probe_target replaces _gate_probe_declaration. No shim, no alias.
  • omniclaude#2182 (merged, squash a4dcb41c1c2562fab300c5c4f05c3b8a6ddddbcd) vendors the same contract byte-identically and makes the guard read it, with a byte-identity drift test.

Why exactly one form probes

workflow_run is a proof pointer and still holds on anything but success — the OMN-16106 behaviour, unchanged. The other four are traceability bindings, and resolving them to a live probe is refuted rather than merely unimplemented:

  • A board id cannot resolve to the beta board's live cell. That board is generated FROM Linear: omninode_infra tools/beta_board/beta_board_data.py:4, :760 and :1981 each say it re-reads Linear on every run. Holding a Linear flip on a cell derived from that ticket's Linear state is a cycle.
  • A live-gate-defect check name cannot resolve to a check run. It names a broken surface, so it is red by construction at filing time, and it is frequently not a CI context at all: workspace-reconcile-status matches no check run on this repo's dev HEAD and appears in no workflow in either repository. Positive control: the same endpoint returns check-run names for that commit.

A traceability binding therefore reaches the stage after the probe. That is the absence of a proof pointer, not a pass — every other conjunct of the sweep still applies.

Text matching no declared form is still held, and the hold now names the forms that would have been readable.

dod_evidence

  • uv run pytest tests/unit/nodes/node_evidence_autoclose_sweep_effect/ -q → 578 passed, including 28 new cases across the six acceptance criteria.
  • Red-first: the 19 contract cases failed on ImportError before the reader existed; the 9 closer cases failed on ImportError for _gate_binding_probe_target before the handler change.
  • uv run mypy src/omnibase_infra/gate_binding/ --strict → no issues, 11 source files. Same for the node package, 18 source files.
  • pre-commit run --all-files → exit 0.
  • Fixtures are read from the contract, so a form added there with no resolver support turns both repositories' suites red.

Evidence-Ticket: OMN-18414
Evidence-Source: OCC#9746

…instead of its own

One `Gate:` key in a Linear description was read by two parsers whose
accepted vocabularies did not overlap at all. The authoring authority is
omniclaude's ticket-creation admission guard, which mandates four forms.
This consumer accepted exactly one form that was not among them. So every
ticket the guard admitted arrived here as an unreadable declaration and was
held, and the form this consumer required would have been refused at
creation.

Four Done-candidates were held on nothing else at the 2026-09-15T21:34Z
dry-run tick: OMN-18403, OMN-18387, OMN-18368 and OMN-18365.

The grammar is now declared once, in
`src/omnibase_infra/contracts/gate_binding_grammar.json`, and both consumers
read it. This module spells no form pattern of its own; a test reads its
source and fails if one reappears.

Exactly one of the five forms is a proof pointer. A `workflow_run` binding
still resolves to its newest completed run's conclusion and still holds on
anything but success, unchanged from OMN-16106. The four traceability forms
reach the stage after the probe, which is the absence of a proof pointer
rather than a pass: every other conjunct of the sweep still applies. The
contract's `$comment` carries the live evidence for why resolving those four
to a probe is refuted rather than merely unimplemented.

Text matching no declared form is still held, and the hold now names the
forms that would have been readable.
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Critical findings: 0
Major findings: 0
Total findings: 0
Models succeeded: glm-review

Note: Fewer than 2 reviewer models succeeded. Degraded results are informational (OMN-8468/OMN-8524) and do not block merge. Error: cli_review exit 2 (fewer than 2 models succeeded — partial/total outage)


Semantics (OMN-17492 — the model finds, thread resolution gates)

Surface Meaning Blocks merge?
Review threads Per-finding, posted by the reviewer No (informational)
Hostile Review Thread Gate Deterministic: unresolved hostile-reviewer threads exist Fails until resolved (not yet a required context)
degraded verdict Fewer than 2 models succeeded (infra) No

Powered by omniintelligence.review_pairing.cli_review — multi-model adversarial review: qwen3-review, qwen3-review-b, glm-review (OMN-8468/OMN-8524/OMN-17492)

Drives `_gate_probe_verdict` end to end over every declared form, with only
the `gh` boundary stubbed: contract, resolver, handler wiring and the read
are exercised together rather than the pure decision alone.

Carries the cross-repo half from this side too. The transcription
omniclaude's admission guard reads must be byte-equal to the declaration
here, and omniclaude pins the same equality from its side. Two assertions
rather than one is deliberate: the failure this ticket closes was a grammar
that drifted while each repository's own suite stayed green. It skips with a
stated reason when no omniclaude clone is reachable, never silently.
jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 16, 2026
…ibase_infra#3605 (#9746)

* evidence(OMN-18414): author OCC companion for OmniNode-ai/omnibase_infra#3605

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head c341ef1ee434d8bfa9419d8ef0c878181e5f8bd9.

* evidence(OMN-18414): self-bind OCC#9746 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
…ontract

The contract-sync gate is right: the handler's rule changed, so the node's
own contract has to say so. Adds the OMN-18414 entry, bumps node_version to
1.15.0 and the contract version to 1.10.0, and moves the gap-comment
fingerprint's pinned version with it — the fingerprint carries the version
precisely so a gap comment cannot describe a rule the closer no longer
applies.
… adjacency map

A new top-level module under src has to declare which modules' tests a change
to it pulls in, or the governed selector cannot narrow safely and the loader
test refuses the tree. Its only consumer here is the evidence autoclose
sweep, so a change runs the node tests. The contract file it reads is also
transcribed into omniclaude, whose suite pins the byte-equality from the
other side.
@jonahgabriel
jonahgabriel merged commit 4853e0e into dev Sep 16, 2026
133 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-18414-gate-binding-grammar-contract branch September 16, 2026 01:05
Patel230 pushed a commit that referenced this pull request Sep 16, 2026
…instead of its own (#3605)

* fix(OMN-18414): the evidence closer reads the declared Gate: grammar instead of its own

One `Gate:` key in a Linear description was read by two parsers whose
accepted vocabularies did not overlap at all. The authoring authority is
omniclaude's ticket-creation admission guard, which mandates four forms.
This consumer accepted exactly one form that was not among them. So every
ticket the guard admitted arrived here as an unreadable declaration and was
held, and the form this consumer required would have been refused at
creation.

Four Done-candidates were held on nothing else at the 2026-09-15T21:34Z
dry-run tick: OMN-18403, OMN-18387, OMN-18368 and OMN-18365.

The grammar is now declared once, in
`src/omnibase_infra/contracts/gate_binding_grammar.json`, and both consumers
read it. This module spells no form pattern of its own; a test reads its
source and fails if one reappears.

Exactly one of the five forms is a proof pointer. A `workflow_run` binding
still resolves to its newest completed run's conclusion and still holds on
anything but success, unchanged from OMN-16106. The four traceability forms
reach the stage after the probe, which is the absence of a proof pointer
rather than a pass: every other conjunct of the sweep still applies. The
contract's `$comment` carries the live evidence for why resolving those four
to a probe is refuted rather than merely unimplemented.

Text matching no declared form is still held, and the hold now names the
forms that would have been readable.

* test(OMN-18414): integration coverage for the gate-binding conjunct

Drives `_gate_probe_verdict` end to end over every declared form, with only
the `gh` boundary stubbed: contract, resolver, handler wiring and the read
are exercised together rather than the pure decision alone.

Carries the cross-repo half from this side too. The transcription
omniclaude's admission guard reads must be byte-equal to the declaration
here, and omniclaude pins the same equality from its side. Two assertions
rather than one is deliberate: the failure this ticket closes was a grammar
that drifted while each repository's own suite stayed green. It skips with a
stated reason when no omniclaude clone is reachable, never silently.

* docs(OMN-18414): record the gate-binding grammar change in the node contract

The contract-sync gate is right: the handler's rule changed, so the node's
own contract has to say so. Adds the OMN-18414 entry, bumps node_version to
1.15.0 and the contract version to 1.10.0, and moves the gap-comment
fingerprint's pinned version with it — the fingerprint carries the version
precisely so a gap comment cannot describe a rule the closer no longer
applies.

* fix(OMN-18414): declare the gate_binding module in the test-selection adjacency map

A new top-level module under src has to declare which modules' tests a change
to it pulls in, or the governed selector cannot narrow safely and the loader
test refuses the tree. Its only consumer here is the evidence autoclose
sweep, so a change runs the node tests. The contract file it reads is also
transcribed into omniclaude, whose suite pins the byte-equality from the
other side.
Patel230 pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 16, 2026
…ibase_infra#3605 (#9746)

* evidence(OMN-18414): author OCC companion for OmniNode-ai/omnibase_infra#3605

OCC companion by node_pr_lifecycle_fix_effect (OMN-13317 F1 / OMN-13990 / OMN-14285). Product PR head c341ef1ee434d8bfa9419d8ef0c878181e5f8bd9.

* evidence(OMN-18414): self-bind OCC#9746 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
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