story-133: A run whose tracker commands moved under it says so in its own post-story record - #224
Merged
Conversation
…n its own post-story record
… own post-story record Implemented by the l5 harness story workflow.
Four conflicts, none a disagreement. The three append-only history logs each gained one record on either side - story-132's on main, story-133's on the branch - and both are kept, ordered by their own timestamps. ARCHITECTURE.md gained a new section from each documenter at the same position; both are kept, story-132's first, matching the order the document already runs in. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_01U1HiUf7CrMjZMj32TySdiH
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.
A run reads its target's configuration once, before the run directory exists, and threads that one dictionary through to the end. That is deliberate — the pre-flight that refuses an undeclared key does so exactly once from the loaded dictionary, so a run cannot quietly exercise something other than what it was launched under.
The consequence is that a story whose own work moves a tracker command spends the rest of its run acting on a path the tree no longer has. Its sync command files under a path it just removed; its item command sends ready-to-merge through a command that is gone; its dedupe query answers for a tracker the tree no longer points at. Each of those already reported something — an entry left pending, a "was not sent" line, an empty answer — and none of them said why, so all three read as the mechanism being broken rather than as the run holding a value the tree has moved on from.
What this adds is noticing, not re-reading
harness_config.moved_commandcompares the value the caller holds against the value the file now carries, and answers with both side by side or withNone. Nothing routes on the answer. The loaded dictionary stays the one every decision, check and status is made from; a caller reports a move and then does exactly what it would have done without it.A configuration file that is absent, unreadable or unparseable answers "nothing moved". This is a report about a run whose work is already committed, so it may not become the thing that fails — every path is guarded and every path returns.
Three callers, three consequences
Each writes its own sentence, because what a stale filed query means is not what a stale sync command means:
Planned from the brief filed under 209.
🤖 Generated with Claude Code
https://claude.ai/code/session_01U1HiUf7CrMjZMj32TySdiH