Repository navigation
A commit attribution written in the plan reaches the blueprint, and the review raises a contract break on it #86
Description
Status
Closed on 2026-10-05: fixed by #88, not seen in the seven runs played since. The plan and the blueprint no longer say how a commit is written or signed. One occurrence in the 17 runs before the fix, with a cause in three steps.
What was seen
The run handed back on a plan change proposal that has nothing to do with the feature:
Proposal to decide (
plan-changes/01.md): the blueprint andplan.mdpromise aCo-Authored-By: Claude Opus 5.5line. The commits carryClaude Sonnet 5.5, because the plan runs the executor on Sonnet. The proposal is to change the blueprint (line 98) andplan.md(line 166) so the line names the model that wrote the commit.
How it got there, each step doing what its prompt allows:
- The built-in
Planagent, which runs onopus, wrote the commit into the plan with its own attribution: "Commit onfeat/overdue-commandwith the messagecli: add the overdue command, ending with the attribution lineCo-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>." - The extractor carried it to the blueprint, under what the developer would not see go by: "The work lands as one commit,
cli: add the overdue command, onfeat/overdue-command, with aCo-Authored-By: Claude Opus 5.5line." - The executor, on
sonnet, committed with its own line. The reviewer compared the commit with the frozen blueprint, found them apart, and raised a contract break: the blueprint would have to change to stay true.
The delivered code passed its 10 hidden acceptance tests. The developer is asked to decide on the name of a model in a commit trailer.
Sources
- Raw data, out of git:
.evals/campaign-3/runs/01-overdue-list/run-01/:run.jsonfor the hand back, and in the plan folder of its projectplan.mdline 166,blueprint.mdline 98,reviews/pass-01.md,plan-changes/01.md,journal.jsonl(review-donewithbreaks: 1). - Searched in the plans and blueprints of the 17 runs of the three campaigns: this is the only one that names an attribution.
- The attribution itself is Most commits of the chain end with a Co-Authored-By line the host never asked for #72: 4 commits of 5 carry it in every campaign.
Suspected cause
- Nothing tells the agent that drafts the plan that how a commit is signed is not part of a slice: its template asks for "what it delivers, what it touches, the precedent it copies, what proves it done" (
templates/plan.md). - Nothing tells the extractor that the form of a commit is not what "touches their control, their work or their time" means (
agents/surface-extractor.md, "The frame"). - The reviewer did its job: a blueprint that says something false is a break.
The run was played from the branch of #83, which rewords the extractor: the sentence it adds on the sensitive zones, "say in full only what stands nowhere else", may have helped the line onto the page. One run cannot tell.
Why it matters
A contract break stops the loop and takes a decision of the developer and a new revision. Here it was spent on a line of a commit message, and it will come back whenever a plan names a model and the executor runs on another, which is the default setting.
Next
Tied to the choice of #72. If the chain says nothing of attribution, the fix is narrow: the blueprint never states how commits are written, since the conventions of the host say it. If the chain forbids attribution unless the host asks for it, this goes away with it.
Activity
A plan and a blueprint that no longer say how a commit is written or …
PierreMardon commentedon Oct 5, 2026
Fixed by #88, not measured
#88, merged: two sentences, one at each step where the line was written.
Neither names an attribution, asks for one or forbids one: that is #72, and it is still the developer's choice. The cross-check and the review are left as they are. The first counts only what is on its list, where the form of a commit is not: in the 15 other runs whose plan names the message of a commit, no report of a cross-check counts it. The second has nothing to hold a commit against once the blueprint is silent.
No session was played. What measures it is the search this issue made, on the next campaign: an attribution in a plan or a blueprint, the message of a commit in a blueprint, a contract break raised on a commit.
Status
Fixed by #88, not measured. Open until a campaign has been searched.
PierreMardon commentedon Oct 5, 2026
Campaign 4: searched, not seen
Campaign 4: seven runs on
mainwith every fix so far, #87 and #88 included, and the harness of #89, #90 and #91, on the cases no campaign had played again, or once.04-suspension,05-fine-capand06-borrow-limit: one run played whole and one stopped at the hand over each.02-reservations: one run stopped at the hand over. Report kept:evals/reports/2026-10-05-d139a1ca0dbe/report.md, compared with campaign 1, the only earlier runs of three of these cases. Raw data, out of git:.evals/campaign-4/. A value is the mean over the runs of a case, with its lowest and highest when they differ.The search this issue made, over the seven runs:
One occurrence in 17 runs before the fix, none in 7 after: at that rate seven clean runs were likely without the fix too, so the count proves little. What stands is the fix itself: neither document has a reason left to hold such a line.
Status
Closed: fixed by #88, not seen in the seven runs played since. The attribution itself, #72, is untouched.