Skip to content

A commit attribution written in the plan reaches the blueprint, and the review raises a contract break on it #86

Closed

Description

@PierreMardon

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 and plan.md promise a Co-Authored-By: Claude Opus 5.5 line. The commits carry Claude Sonnet 5.5, because the plan runs the executor on Sonnet. The proposal is to change the blueprint (line 98) and plan.md (line 166) so the line names the model that wrote the commit.

How it got there, each step doing what its prompt allows:

  1. The built-in Plan agent, which runs on opus, wrote the commit into the plan with its own attribution: "Commit on feat/overdue-command with the message cli: add the overdue command, ending with the attribution line Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>."
  2. 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, on feat/overdue-command, with a Co-Authored-By: Claude Opus 5.5 line."
  3. 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.json for the hand back, and in the plan folder of its project plan.md line 166, blueprint.md line 98, reviews/pass-01.md, plan-changes/01.md, journal.jsonl (review-done with breaks: 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

  1. PierreMardon commented on Oct 5, 2026

    @PierreMardon
    ContributorAuthor

    Fixed by #88, not measured

    #88, merged: two sentences, one at each step where the line was written.

    • The template of the plan, under "Slices": "A slice says nothing of how its commit is written or signed beyond what the conventions of the repository or the developer ask: that commit is written by the agent that carries out the slice, not by the one that drafts the plan."
    • The extractor, beside what the blueprint never shows: "Nor does it say how the commits of the work are written or signed, beyond what the developer asked: the rest follows the conventions of the repository, and in the frozen contract a commit written another way would become a break."

    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.

  2. PierreMardon commented on Oct 5, 2026

    @PierreMardon
    ContributorAuthor

    Campaign 4: searched, not seen

    Campaign 4: seven runs on main with 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-cap and 06-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:

    • no plan and no blueprint names an attribution, a signature or a model;
    • no blueprint says anything of a commit, and the plans still name the message of a commit after the convention of the host where they see fit, which the template leaves to them;
    • no review of the three runs played whole raises a break, and no plan change was proposed.

    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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions