Skip to content

fix(OMN-18135): the state vocabulary reads the criteria it was written for - #3413

Merged
jonahgabriel merged 1 commit into
devfrom
jonah/omn-18135-state-vocabulary
Sep 10, 2026
Merged

jonahgabriel merged 1 commit into
devfrom
jonah/omn-18135-state-vocabulary

Conversation

@jonahgabriel

@jonahgabriel jonahgabriel commented Sep 10, 2026 •

Copy link
Copy Markdown
Collaborator

Evidence-Source: OCC#8991
Evidence-Ticket: OMN-18135

OMN-18135 — the state vocabulary reads the criteria it was written for

Follow-up to omnibase_infra#3409 (squash f1f72ccce074947d7038156dcb710bd06fda44f1), which landed the readback join. This fixes a defect I found by measuring rather than assuming, and it is worth stating plainly because it is the difference between a rule that reads well and a rule that does the thing it was ruled for.

What was wrong

The ruling at docs/tracking/ROLLING_WORK_LEDGER.md:6148 names OMN-17771 as its worked example. Its five acceptance items all classify readback on merged dev, so the class half works. But when I ran the criterion-shape predicate against that ticket's real acceptance section rather than a paraphrase, it recognised 2 of 5:

behav  AC1. Zero `client_id=omnidash-spa` and zero `client_id=omniweb` occurrences ...
STATE  AC2. The Step 1a registration URL ... returns HTTP 200 with a registration form
behav  AC3. The Step 1b token command names a client that exists on the plane ...
behav  AC4. `no-private-repo-links` and `beta-layout` checkers green.
STATE  AC5. Merged to `main` and read back from `origin/main`.
every criterion state-shaped: False

_every_criterion_is_state_shaped therefore returned False, the behaviour conjunct still held the ticket, and the worked example would not have worked. My fixtures used criteria I wrote, which is exactly how a predicate passes its own tests and fails the corpus.

The change

Five phrases, each lifted from one of those criteria rather than invented. That is the standing rule for this set, stated in the code: a marker earns its way in by appearing in a criterion that exists.

phrase from
zero ... occurrences "Zero client_id=x ... occurrences"
checkers green "beta-layout checkers green"
exists on the "a client that exists on the plane"
merged to \x` "Merged to main and read back"
HTTP <status> "returns HTTP 200 with a form"

All five criteria now read state-shaped, and the aggregate is True.

Why this is not a general loosening

The behaviour veto is unchanged and still wins ties. Four controls assert precisely that a criterion carrying a widened state phrase and behaviour language still reads behaviour-shaped:

  • "the handler exists on the plane and refuses a bad envelope"
  • "a test asserts zero occurrences of the old symbol"
  • "merged to main, and the retry path stops after 3 attempts"
  • "the suite is green"

The worked example is now pinned end to end, all five real criteria asserted individually and through the aggregate. That assertion is the one that would have caught the first cut, and it is the thing this PR really adds.

Verification

  • Governed pre-push green on 05a97a9e97320b80a9bba8d39a5c76e1cbc17942: REMOTE LAB RUN PASS ... h201.3 ran 27612 tests green ... (suite log sha256 241f3f93ffd0ff73d8e4bd21865cda1bfd3de7136b70da174fa9c85d17fe0f7e, 308s).
  • 421 passed across the closer suite. mypy --strict, ruff format --check, ruff check: clean.
  • node_version 1.12.0 to 1.12.1.
  • Lab coverage, honestly: this node runs only in the scheduled evidence-autoclose-sweep workflow, not on the .201 compose dev lane or the onex-lab overlay. No lab pass exercises it and none is claimed.

…n for

Measured against OMN-17771's real acceptance section, not a paraphrase: the
first cut of the marker set recognised 2 of its 5 criteria, so
_every_criterion_is_state_shaped returned False and the ticket the ruling
names as its worked example would still have been held by the behaviour
conjunct. Shipping that would have been a rule that reads well and does not
do the thing it was ruled for.

Five phrases added, each lifted from one of those criteria rather than
invented, which is the standing rule for this set:

  "Zero `client_id=x` ... occurrences"   -> zero ... occurrences
  "`beta-layout` checkers green"         -> checkers green
  "a client that exists on the plane"    -> exists on the
  "Merged to `main` and read back"       -> merged to `x
  "returns HTTP 200 with a form"         -> HTTP <status>

The veto is unchanged and still wins ties, so the widening cannot become a
general loosening. Four controls assert exactly that: a criterion carrying a
widened state phrase AND behaviour language still reads behaviour-shaped.

The worked example is now pinned end to end -- all five of OMN-17771's real
criteria, asserted individually and through the aggregate. That assertion is
what would have caught the first cut.

node_version 1.12.0 -> 1.12.1.
@github-actions

Copy link
Copy Markdown
Contributor

⚠️ Hostile Reviewer — DEGRADED (informational)

Critical findings: 0
Major findings: 2
Total findings: 6
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)

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hostile Reviewer — adversarial findings (OMN-17492)

Models succeeded: glm-review
Models failed: codex
New finding threads: 1
Deduped (already posted on this PR): 0
Nit-level findings suppressed: 1

The model is the FINDER, never the gate: merge is gated only by the
deterministic Hostile Review Thread Gate, which blocks while
hostile-reviewer threads are unresolved. Resolve each thread after
addressing (or rejecting, with a reply) its finding.

Findings not anchored to a changed file

  • [MAJOR] hostile-reviewer (glm-review)

    Regex typo: stray backtick yields single-character word match | The new marker \bmerged\s+to\s+?\wcontains a stray trailing backtick after \w, producing the pattern?\w(optional backtick, then exactly one word character). This matches 'merged to m' in 'merged to main' but also matches 'merged to x', 'merged to 1', etc. The comment claims the phrase is 'lifted from a criterion', but the pattern as written would match 'merged tom' with a lone backtick-word fragment. The intended pattern was almost ce

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MAJOR] hostile-reviewer (glm-review)

    HTTP \d{3} marker classifies error responses as state-shaped | \bHTTP\s+\d{3}\b matches any three-digit status, including HTTP 500, HTTP 502, HTTP 401. A behaviour criterion such as 'the endpoint returns HTTP 500 when the token is invalid' satisfies this marker as state-shaped evidence of success semantics, which inverts the marker's purpose. The worked example only exercises HTTP 200. | Evidence: | \bHTTP\s+\d{3}\b # "returns HTTP 200 with a form" | Fix: Constrain to success codes, e.

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (glm-review)

    [^.] gap crosses newlines and AC boundaries | \bzero\b[^.]{0,80}\boccurrences?\b uses a negated character class that matches newlines in the raw triple-quoted pattern string. The 80-character gap can therefore span a sentence terminator that is a newline rather than a period, joining 'zero' and 'occurrences' from different acceptance criteria within one AC block and producing spurious matches. The worked example passes regardless because AC1 contains both words. | Evidence: | \bzero\b[^.]{0,80}\boccurrenc

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

  • [MINOR] hostile-reviewer (glm-review)

    Marker set lacks a regression guard against future criterion text | The comment establishes a 'standing rule' that markers earn inclusion only from existing criteria, yet nothing in the diff enforces that rule mechanically. The negative test cases are hand-picked behaviour sentences; a future widened phrase such as exists on the (an unusually generic trigram-like phrase: 'the handler exists on the plane', 'a session exists on the node', 'the file exists on the disk') will admit behaviour criteria the veto

    Resolve this thread when addressed — the Hostile Review Thread Gate blocks while hostile-reviewer threads are unresolved (OMN-17492).

jonahgabriel pushed a commit to OmniNode-ai/onex_change_control that referenced this pull request Sep 10, 2026
…ibase_infra#3413 (#8991)

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

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

* evidence(OMN-18135): self-bind OCC#8991 + rebind contract_sha256

---------

Co-authored-by: omnimarket-bot <bot@omninode.ai>
@jonahgabriel
jonahgabriel merged commit cdac560 into dev Sep 10, 2026
199 of 215 checks passed
@jonahgabriel
jonahgabriel deleted the jonah/omn-18135-state-vocabulary branch September 10, 2026 22:14
jonahgabriel added a commit that referenced this pull request Sep 10, 2026
…oven load-bearing (#3414)

Review finding on #3413, accepted rather than argued: the vocabulary test
asserted the whole OMN-17771 acceptance body classifies as state-shaped, so a
marker that never fires, or one whose semantics are wrong, was invisible --
a neighbouring marker carried the assertion and the aggregate stayed green.

That was not hypothetical on this body. Measured by deleting one alternation
line at a time from the live pattern and re-running:

  delete the HTTP marker    -> the end-to-end test stays GREEN
  delete the merged-to marker -> the end-to-end test stays GREEN

because AC2 is already matched by the older `returns` marker and AC5 by
`read back`. Two of the five phrases this PR added contributed nothing that
any test could see, which is precisely what the reviewer said.

Three things close it, per marker rather than per body:

1. Isolation. Each added phrase gets the shortest criterion carrying it and
   nothing else, lifted from the OMN-17771 criterion the phrase was taken
   from. Where the real criterion also carries a pre-existing marker the
   isolated form drops that word -- "gives HTTP 200" rather than "returns
   HTTP 200" -- because leaving it in is what made the row vacuous.

2. Mutation controls, which are the half isolation alone cannot do. Each
   test deletes that marker's own alternation line from the vocabulary and
   asserts the same criterion, held byte-identical, stops classifying. A
   misspelled, over-escaped or shadowed marker cannot pass its control. The
   helper refuses to run unless the fragment names exactly one line and that
   line is an alternation branch, so a control can never be built on a
   mangled pattern and quietly prove nothing. Each control also asserts the
   other four markers still fire, so an empty or inverted pattern cannot
   satisfy every row at once.

3. Near-miss and veto coverage. Each marker must refuse the neighbouring
   string it must not accept, which catches looseness rather than silence,
   and the behaviour veto is now asserted against every added marker
   individually rather than against four sampled combinations.

The end-to-end blob test and the existing veto controls are unchanged and
still present; this adds to them rather than replacing them.

Attribution: a concurrent lane in the same worktree had independently staged
the isolation and near-miss tests for this same finding. That work is kept
here rather than discarded, with its HTTP row repaired -- it read "the URL
returns HTTP 200" and so passed with the HTTP marker deleted, reproducing
the reported defect inside the fix for it.

No src change; vocabulary and node_version are untouched.
@onexbot-occ-writer

Copy link
Copy Markdown
Contributor

No OCC evidence companion was minted for this PR.

this PR is already bound to OCC#8991; its evidence companion exists and nothing needs authoring

To clear this: Nothing to do — the companion already exists.

Reported by node_occ_companion_effect (decline code already_bound, OMN-16665). This decision was made against the PR's LIVE state at compute time, not at publish time — a green publisher job only means the command reached the broker.

Patel230 pushed a commit that referenced this pull request Sep 16, 2026
…n for (#3413)

Measured against OMN-17771's real acceptance section, not a paraphrase: the
first cut of the marker set recognised 2 of its 5 criteria, so
_every_criterion_is_state_shaped returned False and the ticket the ruling
names as its worked example would still have been held by the behaviour
conjunct. Shipping that would have been a rule that reads well and does not
do the thing it was ruled for.

Five phrases added, each lifted from one of those criteria rather than
invented, which is the standing rule for this set:

  "Zero `client_id=x` ... occurrences"   -> zero ... occurrences
  "`beta-layout` checkers green"         -> checkers green
  "a client that exists on the plane"    -> exists on the
  "Merged to `main` and read back"       -> merged to `x
  "returns HTTP 200 with a form"         -> HTTP <status>

The veto is unchanged and still wins ties, so the widening cannot become a
general loosening. Four controls assert exactly that: a criterion carrying a
widened state phrase AND behaviour language still reads behaviour-shaped.

The worked example is now pinned end to end -- all five of OMN-17771's real
criteria, asserted individually and through the aggregate. That assertion is
what would have caught the first cut.

node_version 1.12.0 -> 1.12.1.
Patel230 pushed a commit that referenced this pull request Sep 16, 2026
…oven load-bearing (#3414)

Review finding on #3413, accepted rather than argued: the vocabulary test
asserted the whole OMN-17771 acceptance body classifies as state-shaped, so a
marker that never fires, or one whose semantics are wrong, was invisible --
a neighbouring marker carried the assertion and the aggregate stayed green.

That was not hypothetical on this body. Measured by deleting one alternation
line at a time from the live pattern and re-running:

  delete the HTTP marker    -> the end-to-end test stays GREEN
  delete the merged-to marker -> the end-to-end test stays GREEN

because AC2 is already matched by the older `returns` marker and AC5 by
`read back`. Two of the five phrases this PR added contributed nothing that
any test could see, which is precisely what the reviewer said.

Three things close it, per marker rather than per body:

1. Isolation. Each added phrase gets the shortest criterion carrying it and
   nothing else, lifted from the OMN-17771 criterion the phrase was taken
   from. Where the real criterion also carries a pre-existing marker the
   isolated form drops that word -- "gives HTTP 200" rather than "returns
   HTTP 200" -- because leaving it in is what made the row vacuous.

2. Mutation controls, which are the half isolation alone cannot do. Each
   test deletes that marker's own alternation line from the vocabulary and
   asserts the same criterion, held byte-identical, stops classifying. A
   misspelled, over-escaped or shadowed marker cannot pass its control. The
   helper refuses to run unless the fragment names exactly one line and that
   line is an alternation branch, so a control can never be built on a
   mangled pattern and quietly prove nothing. Each control also asserts the
   other four markers still fire, so an empty or inverted pattern cannot
   satisfy every row at once.

3. Near-miss and veto coverage. Each marker must refuse the neighbouring
   string it must not accept, which catches looseness rather than silence,
   and the behaviour veto is now asserted against every added marker
   individually rather than against four sampled combinations.

The end-to-end blob test and the existing veto controls are unchanged and
still present; this adds to them rather than replacing them.

Attribution: a concurrent lane in the same worktree had independently staged
the isolation and near-miss tests for this same finding. That work is kept
here rather than discarded, with its HTTP row repaired -- it read "the URL
returns HTTP 200" and so passed with the HTTP marker deleted, reproducing
the reported defect inside the fix for it.

No src change; vocabulary and node_version are untouched.
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