The execution seam and deviate (0.18.0) - #72
Conversation
Frame execution-seam-and-deviate: bundles issues #70 #69 #68 #67 #66 #62, the new deviate leg (plan-to-summary connective tissue), and the render-only devague summary verb (wrap-up skeleton + --pr mode). 27 claims, 17 honesty conditions, 7 scope entries with provenance, 6 resolved user decisions. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
11 confirmed tasks over 4 waves (5/3/2/1), covering all 34 targets of the execution-seam-and-deviate frame; 2 non-blocking risks. Same-wave tasks own disjoint files; every task carries acceptance criteria + a verbatim instruction for the workforce fan-out. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
Add the delivery-side execution-seam companion to the plan engine: a Delivery/DeviationRecord domain model (devague/delivery.py), its persistence peer (devague/delivery_store.py, mirroring plan_store including the 0.17.0 upgrade-on-write schema-version fix), and the `devague deviate` CLI move (record / --confirm / --reject / --list). The plan JSON is never touched by any deviate operation (test-asserted byte-identical before/after). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
…le (#69) [esd t5] A human reviewing a 13-task fan-out rewrote the split-plan table by hand as Wave, Task, Model, Task summary, and that rewrite is what got approved. Reshape the per-task table to exactly that 4-column shape (Model defaults to `sonnet`, presentation-only per issue #20; summaries truncate past 72 chars with an ellipsis, never a placeholder). Move the has-instruction/acceptance-count markers off the table and onto the wave-listing lines, and add a one-line note telling the operator to edit the Model cell to a real model token (haiku, sonnet, opus, fable), optionally qualified with the harness (colleague, codex) when it matters. Go/no-go prompt and fan-out steps are unchanged. tests/test_assign_to_workforce_script.py drives a fixture plan through the real devague CLI, then runs the script end to end via subprocess (through a PATH shim pinned to this worktree, so the test exercises this branch's code rather than whatever devague happens to be installed globally) and asserts the exact table shape, wave-then-task ordering, real summaries, ellipsis truncation, the sonnet default, the wave-listing markers, and the go/no-go text.
Adds two escape hatches to the plan engine so a wrong dependency edge or a stale task summary/acceptance criterion no longer costs a task-recreation cascade (issue #68): `Plan.remove_dep` backs `plan depend <tN> --on <tM> --remove`, and a new `Plan.amend_task` transition backs `plan amend <tN> [--summary] [--accept-replace <n> <text>] [--accept-remove <n>]` (1-indexed, validated atomically before any mutation so a bad index never leaves a partial edit). amend refuses outright on a rejected task rather than silently letting its declared work keep changing. Every demoting move on a confirmed task (instruct, amend, depend --remove) now names the confirmed -> proposed flip on the stdout result line itself, not just stderr and --json — hardening for harnesses that only read stdout (issue #67). No PLAN_SCHEMA_VERSION bump: neither move adds a persisted field, so the spec's speculative v2->v3 assumption for this slice doesn't apply.
Answers "what do we have in the end?" at the assign-to-workforce go/no-go: devague plan deliverables [--json] synthesizes, from live frame/plan state only, the frame's confirmed announcement/after_state/ success_signal claims verbatim, the plan's terminal tasks (new plan.terminal_tasks helper: active tasks no other active task depends on) with their acceptance criteria, and surviving open items (the frame's non-blocking parked vagueness plus the plan's non-blocking risks). Never mutates .devague/ and never gates on convergence -- an unconverged plan (or a plan whose source frame has regressed below its own convergence) still renders, with an explicit not-converged banner and converged: false in --json (issue #20).
Adds a read-only `devague summary [--pr] [--json] [--plan]` verb that renders the eight-section delivery-summary skeleton from plan/frame/ delivery state alone: Intent and Planned Work pre-fill verbatim from the frame and plan, Actual Delivery lists every task with explicit `<fill: ...>` placeholders, and Mid-work Decisions / Drift From Plan quote approved deviation records by id (a proposed deviation is never rendered as approved). Run status stays a `<complete | partial | failed>` placeholder — no section ever claims work as done. `--pr` emits a condensed PR-body skeleton (title, announcement, wave/task map, approved deviations, docs/deliveries pointer). No writes anywhere; degrades gracefully when the source frame is missing.
…ables (#70) [esd t6]
… skeleton [esd t8] Method step 1 now starts from the devague summary skeleton (falling back to hand-assembly via plan show / plan waves --json when the verb or store is absent, saying so in the baseline: line); Drift From Plan and Mid-work Decisions quote approved devague deviate records by dN id when a delivery store exists; the read-only moves table gains devague summary and devague deviate --list; the intro now names the six-leg flow with /deviate slotting between /assign-to-workforce and this skill.
Version bump (0.17.2 -> 0.18.0, minor) closing out the execution-seam-and-deviate plan (#53 esd t1-t11): the deliverables end-state view, the four-column assign-to-workforce split plan plus End state section, depend --remove plus amend plus stdout flip echo, the new deviate move/skill/delivery store, the summary verb plus --pr mode, the culture.yaml backend revert, and the two evidence-based issue closures. CLAUDE.md, README.md, and docs/skills.md now name the six-leg flow (scope, think, spec-to-plan, assign-to-workforce, deviate, summarize-delivery) and the two audiences it serves — operators driving the CLI and the humans who own the go/no-go and final-PR gates — and a couple of pre-existing stale spots (the "nothing consumes waves" gap note, the plan move list missing instruct/amend/deliverables) are corrected along the way. uv.lock re-locked to record 0.18.0 consistently. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
…store Dogfoods the release itself: baseline rendered by the new devague summary, deviation d1 recorded via devague deviate (proposed, awaiting user confirm), t9 honestly partial until the live agex verification at PR-open. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
|
/agentic_review |
Backend claude accepted end to end; unrelated agex warning-handling bug found and filed upstream (devex#92), stash workaround recorded. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
PR Summary by QodoClose execution seam: deliverables, deviate ledger, summary skeleton (0.18.0)
AI Description
Diagram
High-Level Assessment
Files changed (32)
|
Code Review by Qodo
Context used✅ Tickets:
🎫 no way to remove a task dependency — rejecting a task strands its dependents and forces recreation (devague 0.17.1) 🎫 assign-to-workforce: split-plan should render one table — wave, task, model, task summary — instead of placeholder rows✅ Compliance rules (platform):
66 rules✅ Skills:
cicd, communicate 1.
|
…ables/amend move contracts [PR #72] Documents the Delivery/DeviationRecord entity model, schema-version/persistence policy, and status-transition semantics; the deviate/summary move contracts (input/output/transition/error, matching the doc's existing per-move table format); and extends the previously undocumented Plan-engine move surface with deliverables, amend, depend --remove, and the confirmed->proposed re-confirm rule (including the stdout flip echo). Notes the delivery store as the plan's execution-side companion — the plan JSON stays byte-identical through every deviate operation. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
…slate delivery-store errors, sonar S3516/S1192 [PR #72] Six review findings on the execution-seam-and-deviate branch: - Q2 (bug): `devague deviate` now validates --task against the resolved plan's task ids and validates id-shaped --affects refs (^[a-z]\d+$) against plan task ids, plan coverage targets, and the plan's live source frame's claim/honesty-condition ids -- a frame claim need not be a coverage target to be accepted (regression-guarded against the committed d1/c14 evidence record). Free-form non-id-shaped --affects text stays allowed. summary_md's _drift_lines now escapes '|' and flattens newlines in interpolated refs/reasons so they cannot corrupt the markdown table. - Q3 (bug): --confirm/--reject/--list are now an argparse mutually exclusive group; combining --confirm/--reject with a positional record, or --list with one, is refused explicitly instead of resolved by if/elif precedence. - Q4 (bug): Delivery.set_status fails closed on an unknown status string before mutating anything; the CLI layer refuses to resolve an already-approved/rejected deviation, naming its current status in the hint. - Q5 (bug): new devague/cli/_deliveries.py (the delivery_store peer of _plans.py) translates a too-new schema_version or a malformed/mismatched delivery ledger into an actionable DevagueError instead of falling through _dispatch's generic "unexpected: ..." handler; wired into both `devague summary` and `devague deviate`. - S1 (SonarCloud S3516): cmd_summary folded its two `return 0` branches into a single return path; the CLI contract (exit 0 on success) is unchanged since `_dispatch` treats a `None` return the same way. - S2 (SonarCloud S1192): "(no tasks recorded on this plan)" is now a single NO_TASKS_PLACEHOLDER constant backing all three render paths. Extended tests/test_deviate.py and tests/test_summary.py with failing tests first, then fixed; one pre-existing test's fixture (test_deviate_affects_repeatable) referenced non-existent plan ids, which was exactly the bug being fixed, so it was updated to use real refs. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
…tening landed Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
…mmarize-delivery join the recipe [d2] `devague learn skills` (and skills:all / skills:<name>) only ever taught authoring the original three CLI-driving operator skills. The shipped flow is now six legs: scope -> think -> spec-to-plan -> assign-to-workforce -> deviate -> summarize-delivery. OPERATOR_SKILLS gains the three new entries (roles sourced verbatim from their SKILL.md files) plus a per-skill method_only marker, since scope/deviate/summarize-delivery ship only a SKILL.md with no scripts/<name>.sh resolver. _skill_source() omits script_raw for method-only skills instead of emitting a 404ing URL, and the rendered text labels them "(method-only)" rather than printing a fake script path. The layout/resolver sections of the recipe now describe both shapes explicitly. cmd_plan_learn's closing text in plan.py is updated to name the six operator skills instead of the stale three. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V
|
… review)
Qodo found a real silent no-op: cmd_lapse fell through to listing whenever
the positional `what` was absent, so
devague lapse --code provenance-missing --skipped "<check>" --origin llm
printed "no lapses filed yet" and exited 0 having filed nothing. For a ledger
whose entire premise is that filing is cheap enough to do mid-flight, that is
the worst failure available: the operator believes the degradation is on
record and it is not.
Fails closed now, naming the flags that were given, matching the
flag/positional-ambiguity precedent from #72. --origin's parser default moves
from "user" to None so an explicit --origin is distinguishable from the
default; _record resolves None back to "user", so filing behaviour is
unchanged.
7 new tests, including the confirm/reject and --list combinations and a
regression pinning that bare `lapse` and `lapse --list` still list.
Filed as lapse l4: I called the review clean after reading one comment, three
minutes before the Code Review carrying this bug arrived.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe
* spec+plan: reasoning-degradation ledger (devague#97) The /scope -> /think -> /challenge -> /spec-to-plan legs for issue #97, plus the renderer fix the challenge pass itself uncovered. The frame converged with 16 confirmed claims, 16 honesty conditions, three resolved hard questions, and 14 scope entries citing what was actually read. The plan converged into three waves (t1 -> t2/t3/t4 -> t5/t6) with three targets deliberately deferred to the post-ship dogfood milestone. The renderer change is dogfood fallout: a scope surface carrying its own code span was blind-wrapped in another, breaking the export under MD038. spec_md and frame_md now pass such a surface through untouched. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * t1: Lapse domain model on Frame (LapseRecord, lapse codes, schema v5) Adds the Reasoning Degradation Ledger's domain model (issue #97): Frame.lapses, LapseRecord (id, code, what, skipped_check, refs, origin, status), and Frame.add_lapse / find_lapse / set_lapse_status. Mirrors DeviationRecord's chassis (devague/delivery.py) -- prefix-generic _next id minting, origin-driven initial status, fail-closed __post_init__ validation, append-only with no amend/delete -- but deliberately refines it in one place (c21): `code` is validated at the filing path (add_lapse), not in __post_init__, so retiring a code after a dogfood cycle never bricks a frame that already filed it; `status`/`origin` still validate in __post_init__ since they never retire. Bumps SCHEMA_VERSION 4 -> 5 and moves the pin in tests/test_frame_schema_v2.py and tests/test_frame.py (the latter also pins the version; permitted single-line update per task scope). New tests in tests/test_frame_lapse.py cover id minting/origin-driven status/round-trip (AC1), filing-time-only code validation incl. a file-retire-reload regression test (AC2, h16), the v5 bump incl. fail-closed-before-parsing-malformed-data and v4-frame-loads-clean-and-resaves-as-v5 (AC3), and no amend/delete API plus unvalidated free-text refs (AC4, c20). Covers targets: c2, h2, c17, h12, c20, c21, h16. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * t4: pin gate inertness against the lapse ledger (issue #97) Both convergence gates (devague/convergence.py, devague/plan_convergence.py) iterate hand-written allowlists over named fields — frame.claims and frame.open_vagueness on the frame side, plan.tasks and plan.risks on the plan side — so Frame.lapses (the Reasoning Degradation Ledger, t1) is invisible to them by default, the same scope_entries precedent. These are pure test additions pinning that invisibility as a property: converge output is byte-identical before/after filing a lapse in every status (proposed, approved, rejected), and neither gate's blockers/warnings/parked_items/ required_next_moves ever names a lapse id, code, or filed text — checked on both converged and unconverged frames/plans, and on a plan derived from a lapse-carrying source frame via targets_from_frame. The property holds today; no production code changed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * t2: lapse CLI verb — file, list, adjudicate (devague#97) Clones deviate.py's argument surface and confirm/reject/list shape onto the Frame-level LapseRecord ledger from t1: `devague lapse "<what>" --code <code>` files against the current frame (--origin llm lands proposed; --skipped/--ref stored verbatim, refs never id-validated since a lapse's refs are deliberately free text); --list [--json] renders id/code/status; --confirm/--reject transition only proposed records. Drops --task (no plan link) and id-ref validation relative to deviate.py, per the plan instruction. Adds the lapse row to learn.py's MOVES dict so `devague explain lapse` and bare `devague learn` both surface it. New tests/test_cli_lapse.py (34 tests) pins the argument surface has no amend/delete/task/affects flags, the confirm/reject transition rules, JSON shapes, and deterministic no-subprocess recording. * t3: render the lapse ledger — show and summary consume, spec stays untouched frame_md.py gains a "## Lapse ledger" section (id, code, status, what), omitted entirely when Frame.lapses is empty — the working-state view, so every lapse renders regardless of status (unlike summary_md's discipline below). summary_md.py's Delivery Claims section now cites approved lapses as evidence via a small table (escaped through _escape_table_cell, same as _drift_lines), proposed lapses render as visibly pending, rejected lapses are omitted, and a lapse-free (or missing) frame keeps the existing hardcoded placeholder row untouched — no new failure mode. summary_data's JSON gains a parallel "lapse_evidence" key. spec_md.py is untouched (no code change) per the plan's load-bearing design point — a regression test pins render_spec's byte-identity across every lapse status. Covers targets c4, h3, c10, c19, h14, h13 (issue #97 t3). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * t6: docs, contract, changelog, version (0.22.0, issue #97) Document the shipped Reasoning Degradation Ledger (Frame.lapses / LapseRecord, devague lapse, schema v5) in docs/spec-contract.md — a new LapseRecord entity alongside ScopeEntry, a Moves contract row shaped identically to the deviate row, a v5 Versioning entry, a convergence-gate inertness note, and an anti-fabrication-guarantee extension. README.md names lapse in the flat-verb inventory and the agent-driving flow. CLAUDE.md's Status section leads with the new release and the stack expectations verb inventory gains lapse. CHANGELOG gets a 0.22.0 entry citing issue #97's embodiment evidence verbatim: a 21-task, 7-wave fan-out whose corrections record was reconstructed from memory, four failed graders (three inside one task) all found by reading data afterwards and none by a test failing, one near-miss on a false safety claim, and a recovery that worked only because raw data happened to be committed. Version bumped 0.21.0 -> 0.22.0 (minor, new feature) so CI's version-check passes. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * t5: skills sweep — producer, consumer, and the subagent boundary (devague#97) Wire the reasoning-degradation lapse ledger (t2-t4) into the three skills that touch it, without inventing a new gate or workflow owner: - challenge/SKILL.md: the routing table gains a seventh row — a reasoning degradation the pass itself made while sweeping routes to `devague lapse --origin llm`, not the six issue-73 spec-finding categories, since it is the agent's self-report about its own reasoning rather than proposed spec content. The "nothing else" hard rule now names `devague lapse` alongside the existing moves. - summarize-delivery/SKILL.md: the read-only moves table and hard rule gain `devague lapse --list`; the Delivery Claims method step and row-contract section now read the ledger (or the `Lapse ledger evidence:` block `devague summary` already renders) to ground each confidence level — approved lapses cap confidence honestly, proposed ones are not yet evidence. - assign-to-workforce/SKILL.md: the worktree prohibition generalizes from "never run `devague plan` inside a task worktree" to "no devague move runs inside a task worktree", naming `devague lapse` explicitly — a task agent reports a degradation in its transcript, the main agent files the record after reconciling the worktree, mirroring the `/scope` subagent boundary (#79/#91). - docs/skills.md: the operator-skills table and the challenge / summarize-delivery / assign-to-workforce per-skill sections are swept to match every table touched above. Adjudication is always named as `devague lapse --confirm`/`--reject`, exercised by the human who already owns the relevant gate — no new gate, no new role. deviate/SKILL.md is untouched: its only moves table is scoped to `devague deviate` itself, not a whole-method enumeration, so it needed no change. Covers: c5, h4, c6, h5, c9, h7. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * deviate(d1): split-plan --write escapes verbatim task text (devague#97) The committed gate-2 artifact failed the repo's own markdownlint: a task instruction naming cli/__init__.py rendered as strong-emphasis (MD050 x2, MD037 x1). The script's safe_body() claimed to mirror render/_md_safety.py "exactly" but had only ported autolink_urls plus its own angle-bracket helper — md_safe_text, the half that wraps underscore-bearing identifiers in code spans, was never carried across. Ports md_safe_text faithfully (identifier wrapping, stray control chars, stray backticks, leading hash, code-span and URL carve-outs) and composes it into safe_body/safe_heading. Verified idempotent: a second --write is byte-identical. Recorded as deviation d1 against t5; no plan task covered the split-plan script, and CI does not lint markdown, so nothing would have caught this before review. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * delivery: reasoning-degradation ledger (devague#97) The accountability artifact for the six-task, three-wave fan-out: all six tasks delivered, one approved deviation (d1), two lapses filed against this run's own reasoning and still awaiting adjudication. Two delivery claims stay unverified on purpose — h8 (filing costs under a minute) and c13/h11 (every shipped code has a reachable producer) both need the embodiment dogfood cycle, and four of the six codes have no filing yet. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * fix(lapse): refuse record flags given without a positional 'what' (#101 review) Qodo found a real silent no-op: cmd_lapse fell through to listing whenever the positional `what` was absent, so devague lapse --code provenance-missing --skipped "<check>" --origin llm printed "no lapses filed yet" and exited 0 having filed nothing. For a ledger whose entire premise is that filing is cheap enough to do mid-flight, that is the worst failure available: the operator believes the degradation is on record and it is not. Fails closed now, naming the flags that were given, matching the flag/positional-ambiguity precedent from #72. --origin's parser default moves from "user" to None so an explicit --origin is distinguishable from the default; _record resolves None back to "user", so filing behaviour is unchanged. 7 new tests, including the confirm/reject and --list combinations and a regression pinning that bare `lapse` and `lapse --list` still list. Filed as lapse l4: I called the review clean after reading one comment, three minutes before the Code Review carrying this bug arrived. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe * delivery: record the Qodo fix, l3/l4, and the real SonarCloud result The artifact claimed a clean review and said nothing about SonarCloud. Both were wrong: Qodo found a silent no-op in `devague lapse`, and the Sonar gate had run and passed all along (98.7% coverage on new code) behind a false negative in `agex pr read`. Adds the post-review fix under Mid-work Decisions, the two new lapses (l3, l4) to the ledger-evidence block, #102 and devex#96 to follow-ups, and the Sonar result to Evidence. Three of the four lapses now share one root cause: an instrument read once and its output treated as settled. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E6Zm7QrhKV4bzW2RikPGNe --------- Co-authored-by: Claude Fable 5 <noreply@anthropic.com>



Full devague arc, end to end:
/scope→/think(spec, 27 claims / 17 honesty conditions) →/spec-to-plan(11 tasks, 4 waves, 34 coverage targets) →/assign-to-workforce(one agent per task, isolated worktrees, TDD-gated merges) →/deviate(dogfooded live: recordd1) →/summarize-delivery(committed artifact). Spec:docs/specs/2026-07-14-execution-seam-and-deviate.md· Plan:docs/plans/2026-07-14-execution-seam-and-deviate.md· Review map:docs/deliveries/2026-07-14-execution-seam-and-deviate.md.What ships (0.18.0)
devague plan deliverables [--json](Add a 'what do we have in the end?' deliverables view at the plan/assign-to-workforce seam #70) — read-only end-state view: confirmed announcement / after-state / success-signal verbatim, terminal tasks + acceptance criteria, surviving open items; not-converged banner, never refuses.Wave | Task | Model | Task summary, real model tokens — model + harness when it matters — 72-char truncation), has-instruction/accept-count markers on the wave listing, and a trailing End state section quotingplan deliverablesverbatim (graceful hint on older devague).devague plan depend --remove+ newplan amendmove (no way to remove a task dependency — rejecting a task strands its dependents and forces recreation (devague 0.17.1) #68) — cut a single edge / edit a summary / replace-remove acceptance criteria by index; no more reject-and-recreate cascades.devague deviate— first-class, append-only deviation records in a new delivery store (.devague/deliveries/<plan-slug>.json, schema v1, fail-closed load, upgrade-on-write); llm-origin lands proposed, user-only confirm/reject./deviate— stop the run, get explicit human approval, record, adjust, resume; rides gate 2, not a fourth gate.devague summary [--pr] [--json]— render-only eight-section delivery-summary skeleton (this PR body's own skeleton came from--pr); no-overclaim placeholders throughout.dNid.culture.yamlbackend →claude(culture.yaml declares backend: claude-code, an orphan token no doctor/registry recognizes #66) — the mesh standard, unblocked by closed agex-cli#46. This PR is the live verification: it was opened viaagex pr openwithbackend: claudein place (plan risk r1 named the release PR as the test vehicle).Wave / Task Map
t1(escape hatches + flip echo) ·t3(delivery store + deviate) ·t5(4-column table) ·t9(culture.yaml) ·t10(issue closures)t2(deliverables view) ·t4(summary verb) ·t7(/deviate skill)t6(End state section) ·t8(summarize-delivery update)t11(release closure 0.18.0)Verification
uv run pytest -n auto— 577 passed; coverage 97.85 % (gate ≥ 95 %)flake8/black/isortclean per task and post-merge;markdownlint-cli2clean on all touched docsd1— noPLAN_SCHEMA_VERSIONbump was needed fordepend --remove/amend(frame assumption c14's antecedent didn't hold). Confirm or reject withdevague deviate --confirm d1/--reject d1.Closes #66. Closes #68. Closes #69. Closes #70.
🤖 Generated with Claude Code
https://claude.ai/code/session_01VexbPuzipZ6SUXtGWHKe3V