D-MCAL-2: remove PlannerContract::gate_check, deprecate MulProvider::gate_check - #1066
Conversation
…gate_check Fate decided on the D-MCAL-1 census rather than on argument. `PlannerContract::gate_check` is REMOVED. It was invalid at three points, not the one the plan recorded: it returned the execution-gate type; it took `SituationInput`, so a planner trait performed a MUL assessment it does not own; and it could not express the planner's own Proceed/Sandbox/Compass shape at all. Removal is source-breaking in principle and provably inert in practice — zero implementors org-wide, zero callers. The two in-tree `.gate_check(` call sites bind the planner's INHERENT method returning `Gate` and are untouched. `MulProvider::gate_check` is DEPRECATED, not removed. It has exactly one implementor anywhere (ada-rs), so the cut waits for D-MCAL-4 to express the domain fact as a domain fact and D-MCAL-6 to build it green — a source-breaking contract change is not verified until the known consumer builds. The attribute carries the migration: implement `assess` only and let the domain gate act on the assessment plus its own evidence; for a navigation-shaped output use the planner's existing `Gate`, never a fourth enum. The trait keeps `assess` (situation in, calibration state out — the legitimate direction) and `compass`. Both traits' doc-comments were stale in every clause and are corrected: neither was implemented by lance-graph-planner, and crewai-rust/n8n-rs were evicted as consumers 2026-06-21. F-MUL-5's MUL half is discharged by three new falsifiers: both genuine arms (Dunning-Kruger, allostatic depletion) are readable straight off `MulAssessment` with no verdict constructed anywhere; the mandatory can-stay-silent twin fires on a non-degenerate healthy input rather than an empty one; and an axis-independence check holds calibration fixed while the homeostatic axis moves, which is F-MUL-7's premise at the surface this deliverable keeps. 1224 contract lib tests green; clippy --all-targets clean; planner checks. Board hygiene in the same commit: LATEST_STATE inventory delta with the measured breakage surface, STATUS_BOARD row, INTEGRATION_PLANS prepend, supersession index regenerated last. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HKHLL6NTnRr1XGvKFA1j2L
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars. ⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Plus Run ID: Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
Bugbot couldn't run - usage limit reachedBugbot is counted against Cursor usage for this user or team, and this run hit a usage or spend limit. A user or team admin can review and increase usage limits in the Cursor dashboard. (requestId: serverGenReqId_f0907f86-12be-4e5a-9840-e0f6b5159ba3) |
…-fate # Conflicts: # .claude/board/STATUS_BOARD.md
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0f836a50e4
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
| #[deprecated( | ||
| since = "0.1.0", | ||
| note = "MUL calibrates, it does not adjudicate: `GateDecision` is the execution gate, \ | ||
| not a MUL output. Implement `assess` only and let the domain gate act on the \ | ||
| assessment plus its own evidence. See .claude/plans/mul-calibration-not-verdict-v1.md \ | ||
| (D-MCAL-2). Scheduled for removal after D-MCAL-4/D-MCAL-6." | ||
| )] | ||
| fn gate_check(&self, assessment: &MulAssessment) -> GateDecision; |
There was a problem hiding this comment.
Make the deprecated method optional for implementors
The migration guidance says to implement assess only and not implement gate_check in new code, but this remains a required trait item. Any implementor following that guidance fails with Rust error E0046, while defining the deprecated method does not itself emit a deprecation warning, so the known external implementor receives no signal to migrate merely by implementing the trait. Provide an optional/default compatibility path or keep the documentation explicit that implementations must retain this method until it is removed.
Useful? React with 👍 / 👎.
Discharges the second half of F-MUL-6 — the half a grep cannot reach. A classification tells you a symbol is mentioned; only a compiler tells you a change is source-compatible. ada-rs was COMPILED against the combined arc head (#1065 merged, plus #1066, #1067, #1068, #1069) using a temporary `paths` override, reverted afterwards. The override was VERIFIED to bind rather than assumed: a probe calling `KanbanColumn::veto()` — a method that exists only on the head under test — compiled without E0599. Without that check the entire gate could have run against `main` and reported a meaningless pass. Result: ada-rs does not compile, with exactly three errors, and all three are the pre-existing #1045 `reason:` break that predates every deliverable in this arc. Zero errors are attributable to the arc: - `PlannerContract::gate_check` removal -> ada-rs never implemented it - `MulProvider::gate_check` deprecation -> a warning by construction - `KanbanColumn::{advance, veto}` -> purely additive - D-MCAL-3 and D-MCAL-5 -> docs and tests only So the arc is source-compatible with its one live external implementor, and the single red consumer is red for a reason the arc exists to explain rather than one it caused. The stopgap stays unpushed. The three errors are trivially silenced by supplying a texture and a flow at each site, and that fix is refused: inventing two calibration coordinates ada-rs never measured would reproduce exactly the defect the census found in MedCare-rs. The honest fix is D-MCAL-4's route, which now exists on this head — a consent veto is domain evidence, so it calls `veto()` and constructs no `GateDecision` at all. Two of the adapter's three arms are genuine MUL and keep working through `assess()`; only the consent arm moves. MedCare-rs is covered at symbol level plus the in-tree pins rather than by a compile, and that asymmetry is recorded as a LIMITATION in the report rather than reported as a pass. The report's final section states what the gate does not certify at all, including the fifteen other dependent repos whose non-involvement rests on a grep — which, by this deliverable's own argument, is not a build. Board hygiene in the same commit: STATUS_BOARD row, INTEGRATION_PLANS prepend, supersession index regenerated last. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HKHLL6NTnRr1XGvKFA1j2L
… board claim The merge itself is the D-MCAL-6 branch catching up to #1068. Two board fixes ride with it because the conflict put me in the file and leaving them would be the same defect twice. 1. D-MCAL-2/3/4/5 still read "In PR" after all four merged. Flipped to Shipped with their PR numbers. 2. The D-MCAL-4 row still carried the WITHDRAWN red-state claim — "F-MUL-1/F-MUL-2 red-on-main (no compile) then green". That claim was retracted in the test file, in LATEST_STATE, in INTEGRATION_PLANS and in the veto rustdoc, and was still standing here. `next_phases()` already exposed `Prune`, so the capability existed unnamed; what D-MCAL-4 delivers is an ergonomics-and-naming fix with a measured behavioural consequence, not a new capability. The row now says so and marks the old wording withdrawn rather than deleting it. This is the third place the same retraction had to be chased. A claim withdrawn in four places and live in a fifth is still a live claim, and the board is the surface future sessions read first. D-MCAL-2's row also records that the deprecation alone left `gate_check` required, and that #1068 gave it a default — otherwise the row reads as though the migration worked from #1066 onward, which it did not. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01HKHLL6NTnRr1XGvKFA1j2L
Decides the fate of the two gate-returning trait methods, on the D-MCAL-1 census rather than on argument. Gate: F-MUL-5.
Stacked on #1065 (the census) conceptually; textually independent — both branch from
main.PlannerContract::gate_check— REMOVEDIt was invalid at three points, where the plan's §2 recorded one:
mul::GateDecision— measured as the execution / commit gate (kanban phase moves,ActionState, tier-router dispatch), never a planner output.SituationInput, so a planner trait performed a MUL assessment — a layer it does not own.Proceed / Sandbox / Compass, a shape this signature cannot express.Breakage surface, measured before the cut: zero implementors org-wide, zero callers. The two in-tree
.gate_check(call sites —lance-graph-planner/src/api.rs:637andlance-graph/src/lance_native_planner.rs:61— bind the planner's inherent method returningGate, not the trait, and are untouched. Source-breaking in principle, provably inert in practice.MulProvider::gate_check— DEPRECATED, not removedIt has exactly one implementor anywhere (
ada-rs::contract_impls::AdaMulAdapter). The plan's invariant is that a source-breaking contract change is not verified until the known consumer builds — so the cut waits for D-MCAL-4 (express the domain fact as a domain fact) and D-MCAL-6 (build it).#[deprecated]on a trait method warns at the impl site; it does not break ada-rs today.The attribute carries the migration inline: implement
assessonly and let the domain's own gate act on the assessment plus its own evidence; for a navigation-shaped output use the planner's existingGate— never a fourth gate enum (D-MCAL-5).The trait keeps
assess(situation in, calibration state out — the legitimate direction) andcompass.Stale docs corrected
Both traits claimed
lance-graph-plannerimplements them. Neither does — the planner'sPlanneris an inherent API.PlannerContract's doc also instructedcrewai-rustandn8n-rsto call it; both were evicted as consumers 2026-06-21 (E-CREWAI-N8N-EVICTED).Falsifiers (F-MUL-5, MUL half)
Three new tests in
mul.rs, none of them vacuous:f_mul_5_genuine_mul_arms_survive_without_a_verdict_method— both genuine arms of the measured external impl (Dunning-Kruger overconfidence, allostatic depletion) are readable straight offMulAssessment, with noGateDecisionconstructed anywhere in the test. The depletion case assertsdk_position != MountStupidfirst, so the signal provably is not coming from the other branch.f_mul_5_caution_can_stay_silent_on_a_non_trivial_input— the mandatory can-stay-silent twin (CLAUDE.md falsifiability rule). Fires on a competent, mildly loaded, well-calibrated situation, not an empty one, so it proves discrimination rather than emptiness-handling.f_mul_5_the_two_axes_are_independently_readable_from_the_assessment— holds calibration fixed while the homeostatic axis moves. That is F-MUL-7's premise checked at the surface this deliverable keeps.Verification
Board hygiene (same commit)
LATEST_STATE.mdinventory delta with the measured breakage surface ·STATUS_BOARD.mdrow ·INTEGRATION_PLANS.mdprepend · supersession index regenerated last.Generated by Claude Code