Repository navigation
fix(program): keep shimmer alive across transient-empty + add keep_pending - #576
Merged
Merged
Conversation
…g (0053)
Diagnosed from the 'construct improvements' session: after the planning pass
declared the task pending, dispatching a subagent moved the task into the
"In progress" section and appended a @{session} clip — which changes the
block's text and therefore its id. The old id dropped from the pending set
before the new id was declared, so the set transiently emptied; the daemon
reaped the whole run on that empty, and the agent's follow-up re-declaration
of the new id hit a removed run and was a silent no-op. All shimmer vanished.
The agent's own narration: "the system won't re-light a settled/new block".
Fix #1 — survive transient empty. narrow_program_run / set_program_run_pending
no longer remove a run when its pending set empties; program_run_snapshot
reports no active run on empty but KEEPS the record so a later declaration
revives it. An empty run is reaped only on a terminal owning-session state,
the owning session going idle with nothing pending, or the inactivity
backstop (note_session_state handles the idle case).
Fix #2 — atomic keep_pending. Re-introduce a per-edit ProgramEdit.keep_pending
flag: an edit that changes a still-pending block re-adds the resulting block's
new id in the SAME narrowing call (anchored on the edit's new_string), so a
move/annotate never transiently empties the set and the agent needn't know the
post-edit id. The call-level shimmer id-list still handles declaring arbitrary
existing blocks (planning pass).
Specs 0042 (stop lifecycle: transient empty is not a stop), 0048 (contract:
use keep_pending when editing an in-flight block), 0053 (both mechanisms +
transient-empty survival). Three new daemon tests; #567/#569 tests unaffected.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The bug (found in the 'construct improvements' session)
After the planning pass declared a task pending, the agent dispatched a subagent, which moved the task into "In progress" and appended a
@{session}clip — changing the block's text, hence its id (50eca…→74c9…). The old id dropped from the pending set before the new id was declared, so the set transiently emptied; the daemon reaped the whole run on that empty; the agent's follow-up re-declaration of the new id hit a removed run and was a silent no-op. All shimmer vanished — exactly opposite the expectation (In-progress items should animate while subagents work).The agent even diagnosed it in its own words:
Fix #1 — survive a transient empty
narrow_program_run/set_program_run_pendingno longer remove a run when its pending set empties;program_run_snapshotreports no active run on empty (nothing shimmers) but keeps the record so a later declaration revives it. An empty run is reaped only on a terminal owning-session state, the owning session going idle with nothing pending, or the inactivity backstop.Fix #2 — atomic
keep_pendingRe-introduce a per-edit
ProgramEdit.keep_pendingflag. An edit that changes a still-pending block re-adds the resulting block's new id in the same narrowing call (anchored on the edit'snew_string), so a move/annotate never transiently empties the set and the agent needn't know the post-edit id. The call-levelshimmerid-list still declares arbitrary existing blocks (the planning pass). Tool description + run prompts updated to steer agents tokeep_pendingfor move/clip edits.Specs
keep_pending(or re-declare) when editing an in-flight block.keep_pending) and transient-empty survival.Tests
Three new daemon tests — transient-empty survival + revival,
keep_pendingatomicity, empty-clears-on-idle — plus the #567/#569 tests unaffected.cargo test --workspacegreen.Deploy note
The running daemon needs a
/construct restartto pick this up (same as #567).Relevant binary:
construct(daemon + cli + mcp).