Claude Code First, specification version 0.1.0. The plain-language guide
Version 0.1.0. Grade R2/S2.
F201 Agent sessions sharing one checkout commit each other's work unless each commit stages only its own paths
| Field | Value |
|---|---|
| Status | active |
| Topic | Commits and concurrent sessions |
| Grade | R2/S2 |
| Cases | roadkeep, Shio |
| Contrary | none |
| Harness facts | none |
Claim
When two or more agent sessions work in one checkout at once, a commit that stages more than its own task's paths carries the other session's uncommitted work under its own message; this happened three times in roadkeep, twice after a remedy for it had shipped, and Shio's sessions avoided it by staging by path, against their own written rule to use the stage-everything tool.
Mechanism
Sessions in one working tree share one index and one set of files. Whatever stages the whole tree, or a whole file, takes the other session's edits with it: the commit tool, a hook that stages a file to write a version into it, or a command that prints a stage line naming a file both sessions touched. Nothing fails: both commits are green, so the misattribution is found only when someone reads a diff. Staging a declared list of paths is the one step that separates the two sessions' work, and it fails where both sessions edit the same file.
Observations
- roadkeep. Three incidents, each filed as a task.
- 2026-08-04: two commits shipping RK244 and RK279 [roadkeep@a0c6f6ca] [roadkeep@767d3ebb]
each carried the other task's code. The rationale records it as "Observed, not imagined." [roadkeep@64195176:docs/IMPROVEMENTS.md#L126] and "sessions, two commits, each holding the other's work, both green" [roadkeep@64195176:docs/IMPROVEMENTS.md#L129], and names the gap: "nothing denies staging a file it does not" [roadkeep@64195176:docs/IMPROVEMENTS.md#L136] own. The ledger line is "Two sessions each ship a commit carrying the other's code" [roadkeep@91754240:docs/CHANGELOG.md#L121]. The remedy shipped the same day: "a claim carries the paths its commit owns" [roadkeep@3655014c].
- 2026-08-05, after that remedy: the version-bump hook staged a whole file another agent had
edited, "The version bump stages two whole files, so an unrelated edit to either rides into the next commit" [roadkeep@91754240:docs/CHANGELOG.md#L572]; the rationale says "another agent had edited" [roadkeep@b16ce40f:docs/IMPROVEMENTS.md#L187] the manifest and "the key removal landed under that commit's message" [roadkeep@b16ce40f:docs/IMPROVEMENTS.md#L190]. The fix: "It stages only what it wrote (RK320)." [roadkeep@91754240:.githooks/pre-commit#L15]
- 2026-08-13: while RK1112 shipped, a concurrent session filed RK1116, and "Another task's filing landed under this task's" [roadkeep@043da6c0:docs/IMPROVEMENTS.md#L99]
message, through the stage line the tool itself printed. The fixes make the stage line name what no claim accounts for [roadkeep@678e35d6] and the other ids that moved in a staged file [roadkeep@bf101979]. The file pointers at 64195176, b16ce40f and 043da6c0 are not the pin: shipping deletes a rationale section, so each is read at the commit that filed it. At the pin the skill holds the remedy. Of the commit tool it says "It stages everything." [roadkeep@91754240:.claude/skills/roadkeep-dev/SKILL.md#L69] Every write therefore prints a stage line: "Run that line, then commit." [roadkeep@91754240:.claude/skills/roadkeep-dev/SKILL.md#L73] Concurrent sessions are routine here: "docs: file RK1232 from a concurrent session" [roadkeep@0681df50], "docs: file RK1180-RK1182 from a parallel session" [roadkeep@a97a4bc9].
- Shio. The written rule is to commit through the stage-everything script and "Don't hand-author" [shio@821f18d74:agents.md#L244]
commits. Sessions broke it on purpose because another session was working in the same tree, and said so in the message. One gives the reason in full, that another session "has clone.mjs in flight and" [shio@d7a1181ff] the script's stage-all would have taken it. Others read "Hand-authored and staged by path: another session has seven Java files in flight." [shio@871410748]; "Committed by path rather than through run-commit.cmd: a concurrent session is" [shio@745823e62] working in the same tree. git log 821f18d74 -i -E --all-match --grep='another session|concurrent session' --grep='by path|path list' --format=%h lists 11 such commits, six on 2026-08-07 and five on 2026-08-12; the pattern misses messages that break the phrase across a line, as [shio@13e14a6bc] and [shio@6320a8e0c] do. No Shio commit at the pin was found recording that another session's work was actually committed.
Independence
roadkeep's three incidents are one project's failures (rule 1), separated in time and by an attempted fix, so they establish recurrence within roadkeep. Shio records the same condition, several sessions in one tree with a stage-all commit step, in its own commit messages, but it records the hazard avoided, not the failure; it corroborates the mechanism without adding a second origin of the failure. Whether Shio's staging by path was learned from roadkeep is not stated in either source, so it is not counted as an independent remedy either. The claim and path mechanism in roadkeep is a remedy of the tool, invented there (rule 2).
Counter-evidence
None found at the pins. Two limits: roadkeep's rationale for RK280 notes that staging by path does not separate two sessions editing the same file, which is what the RK1117 incident then showed, so staging by path is not a full remedy. And an incident nobody filed leaves no trace, so whether the remedies ended the incidents in roadkeep is not known.
Grade
R2: three separate incidents in roadkeep, two of them after the first remedy; Shio adds corroboration of the condition, not a second origin. S2: each incident is recorded by a ledger entry, a rationale section and a commit. roadkeep's RK280 rationale gives the line counts of the misplaced hunks, which describe the incident rather than measure how often it happens, so the grade stays at S2. Shio's count of 11 commits is repeatable at the pin with the command given, but it counts commits that avoided the effect by staging by path, not commits that carried another session's work, so under ../grading.md it does not measure the finding.