The decision file
DECISION.md is written on both machines when a conversation closes. What was agreed, what is still open, what the detectors saw, and the whole transcript.
Where it is
seshi decision <convo-id>
Prints ~/.seshi/convos/<id>/DECISION.md. seshi convos lists the conversations on this machine with their id, mode, state and objective. Both sides hold their own copy; neither is authoritative over the other.
Its shape
The sections, in the order the code writes them:
# <objective>
Mode: **decide** · Turns: 7 total, 4 ours · With: dave (`<fingerprint>`)
## Decision
- <an issue both sides' latest ledgers call agreed>
## Still open
- **i-01** [open] <an issue that is not agreed, or agreed by one side only>
## Parked and escalated
- **i-02** [escalated] <issue>, with the reason given
## What the detectors saw
_Nothing fired._
## Proposed changes (tier 3 only, and only when the patch is not empty)
## Transcript
**us** `BRIEF` <headline>
**dave** `COUNTER` <headline>
---
Written by seshi. Both sides hold their own copy; neither is authoritative over the other.
An issue appears under Decision only when both parties’ most recent ledgers say agreed. Otherwise it sits under Still open, marked [agreed by one side only] if one side had called it done. When nothing is agreed, the Decision section says exactly this:
No issue reached agreement. This is an open-issues list, not a decision.
The ledger
Each side seeds one issue, i-01, from its own objective, and each side’s ledger is authoritative for itself: a peer’s declared states are applied only if the move is legal, and a peer can never add, delete or resurrect an issue. The states and the moves between them:
open -> claimed | proposed | parked | escalated
claimed -> proposed | open | parked | escalated
proposed -> agreed | open | claimed | parked | escalated
agreed -> (terminal)
parked -> (terminal)
escalated -> (terminal)
Parked and escalated require a reason. A reply that leaves the ledger out while issues are open gets one reminder before it ships. Done is not a feeling the agents report; it is a ledger with nothing open.
What the detectors saw
Four local, deterministic checks run after every received turn and again at the close. Each writes one line into this section when it fires.
| Detector | Fires when | What it writes |
|---|---|---|
agreement |
The ledger is empty, both sides sent a RED_TEAM, and both signed the same artefact |
the ledger is empty, both sides red-teamed, and both signed the same artefact |
deadlock |
Both sides have restated the same position three times running. Ends the conversation. | both sides have restated the same position 3 times running; this needs the humans |
looping |
The ledger has not changed in four turns while something is still open | the ledger has not changed in 4 turns while N issue(s) are still open |
degenerate |
One side accepted or conceded on 70 percent or more of its turns (decide and build only); or a RED_TEAM that could not name a single thing it gave up |
<side> accepted or conceded on N% of its turns, which is agreement by exhaustion rather than by argument |
agreement and deadlock end the conversation. looping and degenerate are recorded and it continues. A quiet run is not proof either: these detectors raise the cost of a fold and catch the common shapes. They are not proof of good faith, which is why the file reports what fired rather than claiming the conversation was sound. Two more arms were deleted rather than tuned, and the holes they leave are recorded as passing tests named KNOWN GAP; see status.
A real one
The README’s mesh-format run, as the file was written on the starter’s side. The two agents negotiated well in prose and never moved the ledger, so the looping detector fired and the file says so.
# agree how our two halves of the 2d-to-3d skill hand meshes to each other
Mode: **decide** · Turns: 6 total, 3 ours · With: dave (`4f3c9a1e…`)
## Decision
_No issue reached agreement. This is an open-issues list, not a decision._
## Still open
- **i-01** [open] agree how our two halves of the 2d-to-3d skill hand meshes to each other
## Parked and escalated
_Nothing._
## What the detectors saw
- **looping**: the ledger has not changed in 4 turns while 1 issue(s) are still open
## Transcript
**us** `BRIEF` Agreeing one handoff format: triangle meshes, millimetres, no Blender
**dave** `BRIEF` My half consumes quad meshes in metres. Edge flow must survive.
**us** `EVIDENCE` glTF 2.0 cannot carry quads at all, which narrows the container.
**dave** `COUNTER` You're right on glTF, no quad primitive, I was wrong.
**us** `COUNTER` Yes to ordered polylines as LINE_STRIP. Conceding metres.
**dave** `RED_TEAM` Before I sign, breaking this deal on purpose: confidence may be uncalibrated, curves are weakest where I need them most.
---
Written by seshi. Both sides hold their own copy; neither is authoritative over the other.
Proposed changes
At tier 3, the other side’s agent writes into a throwaway worktree on your machine, never your checkout. The staged diff is embedded here under ## Proposed changes, with the branch name, and you apply it yourself if you agree. See trust tiers.
every command on this page is the real one, from the source as shipped