shipped gives a plan no second opinion: the checker and the review each cite the other #171

Closed
opened 2026-08-15 15:47:41 +00:00 by john · 1 comment
Owner

At the shipped stakes level - the default for every project that never sets
stakes - a plan gets NO second opinion at all, and the two decisions that
produced that each cite the other as the remaining net.

The circle

  • e0b5448 (2026-08-11) moved shipped plan from adjudicated to advisory.
    Its stated reason: "A plan at shipped has already passed cad-plan-checker,
    a blocking gate that forces a revision on any BLOCKER and is on by default."
  • b20fd14 (2026-08-12) retuned shipped further; route-table.json now reads
    "shipped": { "plan": "off", ... }.
  • 70007f7 (2026-08-12) flipped workflow.plan_check to default: false. Its
    schema purpose string, still shipping today: "Gate plans through the checker
    before code - opt-in; the plan review trigger remains the default second
    opinion
    "
    (config.schema.json:27).

The checker is off because the review covers it. The review is off because the
checker covers it. Both cuts landed inside the same cycle, one day apart, and
neither re-read the other's justification. Every one of these is a v3.2.0
cost-cut decision - nothing in v3.3.0 revisited it.

Second, smaller half: the schema disagrees with routing

config.schema.json:70 gives review.triggers.plan.gate "default": "adjudicated", while the route table executes off at shipped. So
config.mjs get review.triggers.plan.gate on an unconfigured project reports
adjudicated for a gate that never fires. This is #129's class exactly, and
#134's for a different trigger - plan is the third member of that cluster and
should be fixed with them.

Only a global config layer hides this locally: this machine sets
review.triggers.plan.gate: adjudicated in ~/.claude/cadence/config.json, so
every dogfood run has been reviewing plans while the shipped default does not.
A user installing Cadence gets neither pass.

What the fix has to decide

One of these, not both:

  1. shipped.plan returns to advisory in route-table.json - the plan is
    reviewed and reported, nothing waits, which is what advisory was chosen
    for in e0b5448 before the later retune took it to off.
  2. workflow.plan_check returns to default: true and the schema's purpose
    string is rewritten to stop claiming a net that does not exist.

Option 1 is the cheaper of the two on the measured figures in e0b5448
(checker 8.8 min, reviewer 12.5 min) and keeps the second opinion cross-model.
Whichever lands, the losing justification's prose comes out with it.

At the `shipped` stakes level - the default for every project that never sets `stakes` - a plan gets NO second opinion at all, and the two decisions that produced that each cite the other as the remaining net. ## The circle - `e0b5448` (2026-08-11) moved shipped `plan` from `adjudicated` to `advisory`. Its stated reason: *"A plan at `shipped` has already passed cad-plan-checker, a blocking gate that forces a revision on any BLOCKER and is on by default."* - `b20fd14` (2026-08-12) retuned shipped further; `route-table.json` now reads `"shipped": { "plan": "off", ... }`. - `70007f7` (2026-08-12) flipped `workflow.plan_check` to `default: false`. Its schema purpose string, still shipping today: *"Gate plans through the checker before code - opt-in; **the plan review trigger remains the default second opinion**"* (`config.schema.json:27`). The checker is off because the review covers it. The review is off because the checker covers it. Both cuts landed inside the same cycle, one day apart, and neither re-read the other's justification. Every one of these is a v3.2.0 cost-cut decision - nothing in v3.3.0 revisited it. ## Second, smaller half: the schema disagrees with routing `config.schema.json:70` gives `review.triggers.plan.gate` `"default": "adjudicated"`, while the route table executes `off` at shipped. So `config.mjs get review.triggers.plan.gate` on an unconfigured project reports `adjudicated` for a gate that never fires. This is #129's class exactly, and #134's for a different trigger - `plan` is the third member of that cluster and should be fixed with them. Only a global config layer hides this locally: this machine sets `review.triggers.plan.gate: adjudicated` in `~/.claude/cadence/config.json`, so every dogfood run has been reviewing plans while the shipped default does not. A user installing Cadence gets neither pass. ## What the fix has to decide One of these, not both: 1. `shipped.plan` returns to `advisory` in `route-table.json` - the plan is reviewed and reported, nothing waits, which is what `advisory` was chosen for in `e0b5448` before the later retune took it to `off`. 2. `workflow.plan_check` returns to `default: true` and the schema's purpose string is rewritten to stop claiming a net that does not exist. Option 1 is the cheaper of the two on the measured figures in `e0b5448` (checker 8.8 min, reviewer 12.5 min) and keeps the second opinion cross-model. Whichever lands, the losing justification's prose comes out with it.
john added this to the v3.4.1 milestone 2026-08-15 15:47:41 +00:00
Author
Owner

Shipped in v3.4.0. ade091c set the shipped level's plan gate to blocking; cadence-core/route-table.json:52 now reads "shipped": { "plan": "blocking", "diff": "off", "risk_surface": "blocking", "phase_diff": "off" }, and config.schema.json's purpose string for workflow.plan_check stopped claiming a second opinion that was not running. Merged to main in #172 and tagged v3.4.0.

Shipped in v3.4.0. ade091c set the shipped level's plan gate to blocking; cadence-core/route-table.json:52 now reads `"shipped": { "plan": "blocking", "diff": "off", "risk_surface": "blocking", "phase_diff": "off" }`, and config.schema.json's purpose string for workflow.plan_check stopped claiming a second opinion that was not running. Merged to main in #172 and tagged v3.4.0.
john closed this issue 2026-08-15 17:25:33 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: crenshawdev/cadence-archived#171
No description provided.