Repository navigation
fix(OMN-20327): fix projection API cursor walks and lane-health contract - #3208
Merged
Merged
Conversation
✅ Architectural Review — PASSEDErrors: 0 What this checks
No architectural violations found. Static architectural lint — no model inference (OMN-14176). |
Four bus-backed projection exposures failed on the .201 dev lane via the
table-backed projection API (OMN-20152).
- lab.lane-health.v1 returned 503 projection_column_missing. The contract
listed census_status, health_status, and receipt_status, but
omninode_internal.lab_lane_health stores only <fact>_original_status and
<fact>_observed_at. Decayed verdicts are deliberately not stored. Removed
those three columns from the exposure contract; the published snapshot
row still carries them.
- consumer-flow.v1, prod-promotion-gate.v1, and
runtime-error-fingerprints.v1 cursor walks returned partial key sets.
A read without since served the newest limit*4 rows.
consumer_flow_windows holds every window of a pair, so 2000 newest rows
named 597 of 976 pairs. The prod gate window was 200 of 470 rows.
Ranked fingerprints returned only the top 200 of 4476 with no cursor.
- Fixed in table_reader/read_page:
- A mutable-grain keyed read takes the newest row of each key by a skip
scan over the key index.
- A read without since is page one of the ascending cursor walk.
- A ranked page ranks the whole table and its truncated page advertises
the walk origin cursor (min cursor minus one) so following it reaches
every key.
- Added new optional contract field projection_api.latest_by.
consumer-flow declares window_start, the tail of its primary key.
- Tests:
- Two real-Postgres tests (walk reaches every key once; ranked walk
reaches every key) fail on main, pass here.
- Unit tests for the SQL shape, the contract field, and lane-health
columns being a subset of the table's columns.
jonahgabriel
force-pushed
the
jonah/omn-20327-bus-backed-exposures
branch
from
October 1, 2026 18:19
40c72eb to
033331a
Compare
✅ Hostile Reviewer — PASSEDBlocking findings (critical/error): 0 Gate semantics
Powered by omniintelligence.review_pairing.cli_review — node-based adversarial review via HandlerLlmCliSubprocess (OMN-8524) |
jonahgabriel
enabled auto-merge (squash)
October 1, 2026 18:21
Comment on lines
+652
to
+654
| (cfg,) = load_projection_exposures_from_contract( | ||
| contract, str(contract["name"]), path | ||
| ) |
|
|
||
| async def walk_origin( | ||
| self, cfg: ProjectionTableConfig, *, tenant_id: str | None | ||
| ) -> str | None: ... |
jonahgabriel
added a commit
to OmniNode-ai/onex_change_control
that referenced
this pull request
Oct 1, 2026
* evidence(OMN-20327): add hand-authored deploy probe for OmniNode-ai/omnimarket#3208 Added a falsifiable deploy probe to contracts/OMN-20327.yaml that verifies the presence of `def _latest_per_key_sql(` in src/omnimarket/projection/table_reader.py at commit b7cb51accc40cd272eb6e920b48415a993f41c9e. This resolves the deploy-gate failure by providing the required evidence companion and a corresponding PASS receipt under drift/dod_receipts/OMN-20327/. * evidence(OMN-18921): mint the owed OCC self-bind for PR #12234 --------- Co-authored-by: onexbot-occ-writer[bot] <onexbot-occ-writer[bot]@users.noreply.github.com>
jonahgabriel
added a commit
that referenced
this pull request
Oct 2, 2026
dev was excluded from the CI push triggers, and dev is not strict and has no merge queue. #3212 merged on CI graded against a base older than #3208, so dev head d471dcb broke typecheck and Tests (Split 14/20) with no check run on it until the release fast-forward to main. This adds dev to push.branches, matching omnibase_infra, omnibase_core and omniclaude; the push concurrency group is ref-scoped and never cancels.
jonahgabriel
added a commit
that referenced
this pull request
Oct 2, 2026
dev was excluded from the CI push triggers, and dev is not strict and has no merge queue. #3212 merged on CI graded against a base older than #3208, so dev head d471dcb broke typecheck and Tests (Split 14/20) with no check run on it until the release fast-forward to main. This adds dev to push.branches, matching omnibase_infra, omnibase_core and omniclaude; the push concurrency group is ref-scoped and never cancels.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
OMN-20327 (parent OMN-19971). Four exposures failed on the .201 dev lane through the table-backed projection API:
lab.lane-health.v1answered 503 and the cursor walks ofconsumer-flow.v1,prod-promotion-gate.v1andruntime-error-fingerprints.v1returned partial key sets. A walk is: GET withoutsince, follownext_cursoruntil null.Lab: head 033331a run on host h201 against the .201 dev lane database, readback below. The commit message was drafted by the lab (run b2b46235); the lab refused the PR-body run, so this text is hand-written.
Cause per exposure
projection_column_missing. The contract declaredcensus_status,health_status,receipt_status;omninode_internal.lab_lane_healthstores only each fact's pre-decay verdict and observed-at (a stored decayed verdict needs a timer to stay true, as the runner's docstring says). The writer is running: 1 row,compose-dev, projected 17:53Z.sinceserved the newestlimit*4= 2000 rows by cursor.consumer_flow_windowskeeps every window of a pair (23.8M rows), so the walk named 597 of 976 distinct (consumer_group, topic) pairs.next_cursornull, so a walk reached 200 of 4476 keys. The rank was also taken over a recency window rather than the whole table.Fix
projection_api.latest_by; consumer-flow declareswindow_start, the tail of its primary key (20 ms on the 23.8M-row table; without it the same query ran past 40 s).sinceis page one of the ascending cursor walk.Lab proof
Proof ran on the pre-rebase tree 40c72eb (identical source; the rebase onto dev only moved the base). Same image as the deployed
omnimarket-projection-api, branchsrcmounted, same env, side container on :3012, against the .201 dev lane database.Tests
test_projection_table_reader.py: two real-Postgres tests (every key reached once at its latest row; ranked walk reaches every key). On main they fail (4 keys of 12; top rowfp-29instead offp-00); they pass here. Plus SQL-shape and contract-field unit tests.test_omn20327_lane_health_exposure_columns.py: 3 tests, 2 fail on main.test_omn19841_ranked_page_selection.py: the ranked-cursor test updated for the new cursor.Evidence-Ticket: OMN-20327
Evidence-Source: OCC#12234