Skip to content

D-MCAL-2: remove PlannerContract::gate_check, deprecate MulProvider::gate_check - #1066

Merged
AdaWorldAPI merged 2 commits into
mainfrom
claude/d-mcal-2-trait-fate
Aug 27, 2026
Merged

D-MCAL-2: remove PlannerContract::gate_check, deprecate MulProvider::gate_check#1066
AdaWorldAPI merged 2 commits into
mainfrom
claude/d-mcal-2-trait-fate

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

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 — REMOVED

It was invalid at three points, where the plan's §2 recorded one:

  1. It returned mul::GateDecision — measured as the execution / commit gate (kanban phase moves, ActionState, tier-router dispatch), never a planner output.
  2. It took SituationInput, so a planner trait performed a MUL assessment — a layer it does not own.
  3. The planner's actual navigation output is 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:637 and lance-graph/src/lance_native_planner.rs:61 — bind the planner's inherent method returning Gate, not the trait, and are untouched. Source-breaking in principle, provably inert in practice.

MulProvider::gate_check — DEPRECATED, not removed

It 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 assess only and let the domain's own gate act on the assessment plus its own evidence; for a navigation-shaped output use the planner's existing Gate — never a fourth gate enum (D-MCAL-5).

The trait keeps assess (situation in, calibration state out — the legitimate direction) and compass.

Stale docs corrected

Both traits claimed lance-graph-planner implements them. Neither does — the planner's Planner is an inherent API. PlannerContract's doc also instructed crewai-rust and n8n-rs to 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 off MulAssessment, with no GateDecision constructed anywhere in the test. The depletion case asserts dk_position != MountStupid first, 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

cargo test -p lance-graph-contract   → 1224 lib + 47 integration, 0 failed
cargo clippy -p lance-graph-contract --all-targets → clean
cargo check -p lance-graph-planner   → clean

Board hygiene (same commit)

LATEST_STATE.md inventory delta with the measured breakage surface · STATUS_BOARD.md row · INTEGRATION_PLANS.md prepend · supersession index regenerated last.


Generated by Claude Code

…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
@coderabbitai

coderabbitai Bot commented Aug 27, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: 25239d63-8548-4a3e-a1b5-3feec0e4b806


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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@cursor

cursor Bot commented Aug 27, 2026

Copy link
Copy Markdown

Bugbot couldn't run - usage limit reached

Bugbot 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)

@AdaWorldAPI
AdaWorldAPI marked this pull request as ready for review August 27, 2026 15:53
…-fate

# Conflicts:
#	.claude/board/STATUS_BOARD.md
@AdaWorldAPI
AdaWorldAPI merged commit d9dccea into main Aug 27, 2026
7 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 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".

Comment on lines +289 to 296
#[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;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

P2 Badge 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 👍 / 👎.

AdaWorldAPI pushed a commit that referenced this pull request Aug 27, 2026
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
AdaWorldAPI pushed a commit that referenced this pull request Aug 27, 2026
… 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
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.

2 participants