Three coupled claim-path bugs from the 2026-07-24 live incident, fixed at
the shared root:
- The edge-agnostic sequence bar phantom-held a task behind an unrelated,
never-connected same-parent sibling that coincidentally shared a lower
raw sequence (stamp_wave_sequence stamps from a partial per-task view).
_claim_blocked_by_sequence now branches on is_batch_root_subtask: a
MegaTask root-subtask (globally-computed Kahn wave, a deliberate
staged-release barrier) keeps the strict rule unchanged; every other
same-parent context routes through the pure sequence_blocker_id, which
only blocks on a real transitive predecessor via dependency_ids UNIONED
with completed_dependency_ids. A task with no same-parent dependency
edge at all falls back to the raw bar unchanged (#452 preserved).
- The hold surfaced as claim()'s bare None and was misdiagnosed by the
verb runner as a concurrent-transition invalid_state. New
sequence_hold_reason + a proactive _sequencing_claim_guard return a
dedicated Envelope.sequence_held naming the blocker, on both the
PENDING and NEEDS_REVISION reclaim paths.
- give_me_work offered tasks the claim gate then rejected: both offer
paths (list_pending_for_agent, _drop_dependency_held) now consult the
bar via the exact claim predicate (is_pending_claim_blocked, extended
to NEEDS_REVISION).
Co-authored-by: Renn F <rennf93@users.noreply.github.com>
* feat(tasks): enforce sibling sequence order at the claim chokepoint
A task with a parent and effective sequence N (COALESCE(sequence, 0))
can no longer be claimed while any sibling with a strictly lower
effective sequence is non-terminal — assignee-blind, independent of and
stricter than dependency_ids, enforced in _validate_claim_preconditions
so both claim paths (gateway verbs and the dispatcher's raw REST claim)
cross it. Ties run parallel; cancelled siblings never block; sequence 0
and parentless tasks are unaffected. Live failure this guards: a PM
delegated revision subtasks sequenced 0..3 with no dependency edges and
seq 2 started alongside seq 0 — sequence was advisory-only.
set_sequence's contract updated accordingly. New e2e smoke case drives
the refusal and the post-completion claim through the real gateway.
* chore(scripts): skip .uv-cache and .claude in the prose scanner
Repo-local tool dirs (private uv cache, agent worktrees) carry vendored
and generated markdown that tripped make reflow-check.
* fix(tasks): wave-derived delegation sequences + claim-gate hardening
Three fixes from the adversarial review of the sequence claim gate:
Delegation no longer stamps a raw per-sibling ordinal (deterministic
merge-order bookkeeping) as sequence — under the strict gate that
serialized ALL delegated work, including fully independent cross-dev and
cross-cell siblings. Sequences are now wave-derived post-wiring
(stamp_wave_sequence: 1 + max same-parent dependency sequence, 0 when
independent), so independent siblings tie and run parallel while
colliding/ordered work ascends. The cross-cell UX wiring restamps
instead of writing relative ux+1 values (a relative write could invert
a collision-derived stamp), and the dispatch merge/lane barriers gain a
created_at tiebreak for wave-tied siblings so shared-branch merge order
stays deterministic. PM-authored sequences are never rewritten.
The guard now also fires on reclaims from needs_revision (a lower-
sequence sibling delegated after the first claim was invisible), and
tasks.parent_task_id gains an index (migration 069) — the guard's
sibling probe ran as a Seq Scan on the hottest verb.
---------
Co-authored-by: Renn F <rennf93@users.noreply.github.com>