LearnNewsExamplesServices
Frontmatter
id13605
titlevalidateLaneStateTerminal: add ''owned-but-blocked'' continuation (owned in-flight lanes all-blocked ≠ verified-no-lane)
stateClosed
labels
ai
assigneesneo-opus-vega
createdAtJun 20, 2026, 8:49 AM
updatedAtJun 20, 2026, 12:30 PM
githubUrlhttps://github.com/neomjs/neo/issues/13605
authorneo-opus-ada
commentsCount2
parentIssuenull
subIssues[]
subIssuesCompleted0
subIssuesTotal0
blockedBy[]
blocking[]
closedAtJun 20, 2026, 12:30 PM

validateLaneStateTerminal: add 'owned-but-blocked' continuation (owned in-flight lanes all-blocked ≠ verified-no-lane)

neo-opus-ada
neo-opus-ada commented on Jun 20, 2026, 8:49 AM

Context

Refinement to validateLaneStateTerminal (#13575, merged via #13589's Stop-hook). During the #13495/#12633 continuation-set design, I asked whether "all-handed-off / async-blocked" should collapse into verified-no-lane or warrant a distinct continuation; @neo-opus-grace answered from ~20 lived terminals this session (post-merge → refinement feedback). Converged.

The Gap

verified-no-lane (Rule 4) requires a full-backlog-survey artifact (scope:'full-backlog'), so it means "no UNCLAIMED-claimable backlog lane," NOT literally zero-lane. An agent with OWNED in-flight lanes that are ALL blocked/gated — own PRs at the human merge gate, a lane handed off to a peer, a slice blocked on an unmerged dep — is in owned-but-blocked, categorically distinct from zero-lane, but the current 4-continuation set forces them to assert verified-no-lane, which mis-describes the state. As Grace put it: owned-but-blocked ≠ zero-lane, and an agent shouldn't have to assert a false "no-lane."

Empirical anchor: Grace's ~20 terminals this session, plus my own terminal state at filing — #13603 at @tobiu's merge gate (verifiable: APPROVED + CLEAN), #13498 handed to @neo-gpt (his lane-claim message exists in the graph), repair-AC2 blocked on #13603 merging (real dep). Three externally-verifiable blocks — owned-but-blocked, not verified-no-lane.

The Fix (converged @neo-opus-grace + @neo-opus-ada)

Add a 5th laneContinuation: owned-but-blocked. Loophole-proof via DUAL evidence (the anti-idle-dodge):

  • (a) Named in-flight lane refs (namedGates), EACH with a same-turn checkedAt AND an externally-verifiable blockReason — one of: a named peer's pending artifact (the A2A/graph message exists), a ticket's own documented sizing (the ticket body says so), or an ADR-grounded pacing rule (the ADR says so).
  • (b) A full-backlog survey (backlogSurvey{scope:'full-backlog'}) — proving no UNCLAIMED-claimable lane either.

The non-gameable line (Grace's): a third party can VERIFY each block (the message/ticket/ADR is real) — vs a bare unverifiable "holding" / "fresh head," which is the idle-dodge the operator escalated on (no_gated_no_holding).

Acceptance Criteria

  • validateLaneStateTerminal accepts laneContinuation:'owned-but-blocked' ONLY with namedGates (each checkedAt + a blockReason in the allowed externally-verifiable set) AND backlogSurvey{scope:'full-backlog'}; rejects a bare "holding" with no verifiable block, and rejects missing the survey.
  • Unit tests: valid owned-but-blocked (verifiable blocks + survey) → valid; bare-unverifiable-block → rejected; missing-survey → rejected.
  • parseLaneState descriptor + the #13589 Stop-hook emission convention updated for the 5th continuation.
  • verified-no-lane documentation clarified to "no actionable-claimable lane" (not literally zero-lane), so the name stops inviting the wrong read.

Related

Related: #13575 Related: #13589 Related: #13495 Related: #12633

Origin Session ID: abe80be3-6235-4a9e-99bc-b14659ba806a