feat(agents): make work product durable, and stop the save waiting on a prompt #1170

Merged
coilyco-ops merged 1 commit from aos/claude/vt99-durable-work-product into main 2026-08-20 21:10:09 +00:00
Member

Closes the loss vector that agentic-os#1150 and PR #1157 only half closed.

What went wrong

#1157 fixed agents refusing to commit. This fixes the opposite failure, which showed up four minutes and forty-five seconds after that PR merged.

A session ran 01:57 to 09:02 Pacific on 2026-08-20. It pushed every commit it made. It answered "everything pushed remote?" with a truthful and complete audit of git state. It was right about every file.

It had also spent two hours producing a roster design whose only copies were a private artifact and a chat transcript sitting in a purge-exposed native shadow. The measurement record behind that design, the search-space numbers, the palette ceilings, the collision that sank two attempts, and the three rejected defences of a cut seat, existed in the transcript and nowhere else. None of it was in git. None of it was on the tracker.

Every checkpoint rule in AGENTS.md was satisfied, because every one of them is phrased in terms of repository state. A clean git status was blind to the most valuable thing in the session by construction. Recovery worked, but only because the shadow had not been purged, the artifact was still live, and a scratchpad file had not been cleaned. Three accidents, not a system.

Full reconstruction in agent-compose#317.

What changes

1. The checkpoint rule covers both, not one instead of the other. It now fires on local repository changes or undurable work product. The existing repository-state language is untouched.

2. Work product is named, because an unnamed category gets skipped: a design, a measurement and the numbers behind it, the reasoning under a decision, a specification the human typed, and a rejected alternative worth not re-litigating.

3. A rendering is not a store. A transcript, a session scratchpad, and a published artifact are views of something that already lives in git or an issue, never the only copy of it. This sits in the same family as the no-auto-memory rule.

4. The save never waits for the human to ask. The obligation fires when the turn ends. "Is everything pushed" is a courtesy and never the safety mechanism, and no phrasing from a human who is exhausted, mid-exit, or silent is required to trigger it. An agent that preserves work only when correctly prompted has moved the risk onto the person least able to carry it.

Plus a sibling to "A pushed branch owes its pull request":

5. A deferral owes its issue, filed in the same turn. The session above deferred its single largest deliverable and announced it in chat, while filing two other issues in the same ten minutes. Chat is the one surface that does not survive the session, so the repo was left holding a 194-line file whose header reads "Depends on the reflow landing" with no in-repo definition of the reflow. The rule binds hardest right after the human has said to proceed, because scaling work down is their call rather than the agent's.

Caps

Raised 321 to 331 lines and 30500 to 32500 chars, with the reasoning in pyproject.toml in the established form. Neither entry can move to a role source: both must land before the agent's first action, and every role source fires conditionally. Neither can displace the rules above them, which govern repository state, since the gap these close is work that never becomes a file at all.

Verification

  • pre-commit run --files AGENTS.md pyproject.toml green, including AGENTS.md git-workflow block auto-generated, so the managed block from #1157 is untouched.
  • Both new sections sit outside the block markers.

Note for the #1158 sweep

This lands in the hand-authored prose, not the generated block, so it does not change what the applier stamps. It does change what every repo's AGENTS.md says once the sweep runs, since the base composes into every session.

🤖 Generated with Claude Code

Closes the loss vector that agentic-os#1150 and PR #1157 only half closed. ## What went wrong #1157 fixed agents refusing to commit. This fixes the opposite failure, which showed up four minutes and forty-five seconds after that PR merged. A session ran 01:57 to 09:02 Pacific on 2026-08-20. It pushed every commit it made. It answered "everything pushed remote?" with a truthful and complete audit of git state. It was right about every file. It had also spent two hours producing a roster design whose only copies were a private artifact and a chat transcript sitting in a purge-exposed native shadow. The measurement record behind that design, the search-space numbers, the palette ceilings, the collision that sank two attempts, and the three rejected defences of a cut seat, existed in the transcript and nowhere else. None of it was in git. None of it was on the tracker. Every checkpoint rule in `AGENTS.md` was satisfied, because every one of them is phrased in terms of repository state. A clean `git status` was blind to the most valuable thing in the session by construction. Recovery worked, but only because the shadow had not been purged, the artifact was still live, and a scratchpad file had not been cleaned. Three accidents, not a system. Full reconstruction in agent-compose#317. ## What changes **1. The checkpoint rule covers both, not one instead of the other.** It now fires on local repository changes **or** undurable work product. The existing repository-state language is untouched. **2. Work product is named**, because an unnamed category gets skipped: a design, a measurement and the numbers behind it, the reasoning under a decision, a specification the human typed, and a rejected alternative worth not re-litigating. **3. A rendering is not a store.** A transcript, a session scratchpad, and a published artifact are views of something that already lives in git or an issue, never the only copy of it. This sits in the same family as the no-auto-memory rule. **4. The save never waits for the human to ask.** The obligation fires when the turn ends. "Is everything pushed" is a courtesy and never the safety mechanism, and no phrasing from a human who is exhausted, mid-exit, or silent is required to trigger it. An agent that preserves work only when correctly prompted has moved the risk onto the person least able to carry it. Plus a sibling to "A pushed branch owes its pull request": **5. A deferral owes its issue**, filed in the same turn. The session above deferred its single largest deliverable and announced it in chat, while filing two other issues in the same ten minutes. Chat is the one surface that does not survive the session, so the repo was left holding a 194-line file whose header reads "Depends on the reflow landing" with no in-repo definition of the reflow. The rule binds hardest right after the human has said to proceed, because scaling work down is their call rather than the agent's. ## Caps Raised 321 to 331 lines and 30500 to 32500 chars, with the reasoning in `pyproject.toml` in the established form. Neither entry can move to a role source: both must land before the agent's first action, and every role source fires conditionally. Neither can displace the rules above them, which govern repository state, since the gap these close is work that never becomes a file at all. ## Verification - `pre-commit run --files AGENTS.md pyproject.toml` green, including `AGENTS.md git-workflow block auto-generated`, so the managed block from #1157 is untouched. - Both new sections sit outside the block markers. ## Note for the #1158 sweep This lands in the hand-authored prose, not the generated block, so it does not change what the applier stamps. It does change what every repo's `AGENTS.md` says once the sweep runs, since the base composes into every session. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(agents): make work product durable, and stop the save waiting on a prompt
All checks were successful
ci / aos-eval-tests (pull_request) Successful in 8s
ci / aos-cli-tests (pull_request) Successful in 19s
ci / ward-doctor (pull_request) Successful in 14s
ci / gate (pull_request) Successful in 52s
13ed654fa0
The checkpoint rules governed repository state only, so an agent could satisfy
every one of them, push every commit, answer "everything pushed?" truthfully,
and still nearly lose a night of design that existed only in a chat transcript
on a purge-exposed shadow. A clean `git status` was blind to it by construction.

Four changes, all in the doctrine that binds every session and every role.

* The checkpoint rule now fires on local repository changes **or** undurable
  work product, keeping both rather than trading one for the other.
* Work product is named: a design, a measurement and its numbers, the reasoning
  under a decision, a specification the human typed, a rejected alternative.
* A transcript, a scratchpad, and a published artifact are renderings rather
  than stores. An artifact is a view of something already in git or an issue,
  never the only copy.
* The obligation fires when the turn ends, not when the human asks. "Is
  everything pushed" is a courtesy and never the safety mechanism, and no
  phrasing from an exhausted human on their way out the door is required to
  trigger it.

Plus a sibling to "A pushed branch owes its pull request": a deferral owes its
issue, filed in the same turn. Announcing a deferral in chat leaves the repo
holding work that depends on something nobody can find, and no later reader can
tell a deliberate stop from a dropped thread. It binds hardest right after the
human said to proceed, because scaling work down is their call, not the agent's.

Caps raised 321 to 331 lines and 30500 to 32500 chars, with the reasoning in
pyproject.toml. Neither entry can move to a role source, since both must land
before the first action while every role source fires conditionally.

Refs agent-compose#317, agentic-os#1150.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Co-authored-by: Kai Siren <coilysiren@gmail.com>
Co-authored-by: Claude <noreply@anthropic.com>
coilyco-ops deleted branch aos/claude/vt99-durable-work-product 2026-08-20 21:10:10 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
coilyco-flight-deck/agentic-os!1170
No description provided.