Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 71 additions & 0 deletions contracts/OMN-20415.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
---
schema_version: "1.0.0"
ticket_id: "OMN-20415"
title: "The landing decision node groups red PRs by shared cause and dispatches one bounded cause worker per cluster"
summary: "Red PRs in one repo failing one check with one normalized failure signature form a cluster, and the decision node dispatches one bounded cause worker per cause. A spent cause parks with one operator escalation, and its members fall back to per-PR dispatch so red PRs keep getting fixed."
is_seam_ticket: false
interface_change: false
interfaces_touched: []
requirements:
- id: "req-shared-cause-grouping"
statement: "The pure landing decision node groups red PRs by shared cause and dispatches one bounded cause worker per cause, with the fixer HOLD, the attempt budget, the park and the fallback of parked members to per-PR dispatch."
acceptance:
- id: "AC1"
statement: "The replay of controller tick 722 dispatches exactly one cause worker for omnimarket with at least 16 members, no per-PR worker for any member, and covers omnimarket#3321 by a cause."
- id: "AC2"
statement: "The same facts in any input order give a byte-identical decision."
- id: "AC3"
statement: "Scenarios S21 to S28 from the T1 model each have a test that fails on the pinned node and passes after the change."
- id: "AC4"
statement: "A cause is dispatched at most twice per park episode and then parked with one escalate_operator action, its members fall back to per-PR dispatch while it is parked, and a fixer HOLD on its repo yields no dispatch and a revoke for every live lease there."
- id: "AC5"
statement: "An escalated PR alone becomes a singleton cause on the next tick."
evidence_requirements:
- kind: "tests"
description: "Execute the shared-cause tests and the unchanged S1 to S20 scenario file against the decision node. S1 to S20 pass at the merge base by design, so they are evidence here and carry no must-fail bound check."
command: "uv run pytest tests/unit/nodes/node_pr_landing_decision_compute -q"
emergency_bypass:
enabled: false
justification: ""
follow_up_ticket_id: ""
dod_evidence:
- id: "dod-replay-tick722"
description: "The tick 722 replay forms one cause and dispatches no per-PR member worker."
source: "manual"
checks:
- check_type: "test_passes"
check_value: "uv run pytest tests/unit/nodes/node_pr_landing_decision_compute/test_landing_decision_causes.py -q -k replay_tick722"
cwd: "${OMNI_HOME}/omnimarket"
binds_ac: ["AC1"]
- id: "dod-cause-permutation"
description: "Input order does not change the decision."
source: "manual"
checks:
- check_type: "test_passes"
check_value: "uv run pytest tests/unit/nodes/node_pr_landing_decision_compute/test_landing_decision_causes.py -q -k cause_permutation"
cwd: "${OMNI_HOME}/omnimarket"
binds_ac: ["AC2"]
- id: "dod-cause-scenarios"
description: "Scenarios S21 to S28 hold."
source: "manual"
checks:
- check_type: "test_passes"
check_value: "uv run pytest tests/unit/nodes/node_pr_landing_decision_compute/test_landing_decision_causes.py -q -k cause_scenario"
cwd: "${OMNI_HOME}/omnimarket"
binds_ac: ["AC3"]
- id: "dod-budget-hold-fallback"
description: "The attempt budget, the fixer HOLD and the fallback of parked members hold."
source: "manual"
checks:
- check_type: "test_passes"
check_value: "uv run pytest tests/unit/nodes/node_pr_landing_decision_compute/test_landing_decision_causes.py -q -k 'budget or fixer_hold or fallback'"
cwd: "${OMNI_HOME}/omnimarket"
binds_ac: ["AC4"]
- id: "dod-escalated-singleton"
description: "An escalated PR becomes a singleton cause."
source: "manual"
checks:
- check_type: "test_passes"
check_value: "uv run pytest tests/unit/nodes/node_pr_landing_decision_compute/test_landing_decision_causes.py -q -k escalated_singleton"
cwd: "${OMNI_HOME}/omnimarket"
binds_ac: ["AC5"]
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "omnimarket"
version = "0.4.290"
version = "0.4.291"
description = "OmniMarket - Portable ONEX workflow package registry"
authors = [
{name = "OmniNode.ai", email = "contact@omninode.ai"}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,17 @@
# written ahead of delivery). The fixed worker briefs are typed models in the
# output. No clock (observed_at is the snapshot's time), no I/O, no model.
#
# 0.2.0 adds shared red causes: red PRs in one repo failing one check with one
# normalized failure signature form a cluster, and one bounded cause worker is
# dispatched per cause (cause caps inside the pool, a two-attempt budget per
# park episode, a 12-hour park with one operator escalation, a fixer HOLD that
# revokes and dispatches nothing), with per-PR dispatch suppressed for the
# members of a leased, fixing or owned cause; a cause parked with no owner
# releases its members to per-PR dispatch (the fallback).
# An exit with no result after the spawn window spends an attempt (LC-F2), and the
# park's operator MSG is deduped against the ledger row, not the state (LC-F3);
# both from the T1 model, omnibase_internal#144.
#
# The landing controller calls it in process, so it has no event_bus; it is
# addressable through runtime_dispatch like the other directly-invoked compute
# nodes. Experimental until the controller runs it (observe-only first).
Expand All @@ -25,21 +36,22 @@ lifecycle: experimental
node_type: "COMPUTE_GENERIC"
contract_version:
major: 0
minor: 1
minor: 2
patch: 0
node_version:
major: 0
minor: 1
minor: 2
patch: 0
description: >
Pure definition-B decision of one landing-controller tick. Reads one
consistent snapshot (GitHub truth, the process-table probe of every lease,
worker result files, producer acknowledgements and failures, and the
controller's last state) and returns the tick's actions (merge pinned to a
head, rerun, update-branch, eligibility rerun, companion rebuild or close,
dispatch of a fixed worker brief, kill, discard, observe-only), the outcomes
recorded, DEGRADED reasons, violations and the next state to write ahead of
acting. Deterministic in any input order.
dispatch of a fixed worker brief or of one cause brief per shared red cause,
kill, discard, observe-only, operator escalation of a parked cause), the
outcomes recorded, DEGRADED reasons, violations and the next state to write
ahead of acting. Deterministic in any input order.
input_model:
name: "ModelLandingFacts"
module: "omnimarket.nodes.node_pr_landing_decision_compute.models.model_landing_facts"
Expand Down
Loading
Loading