From f98ec2a9084329593781a06b7683e674b9c13418 Mon Sep 17 00:00:00 2001 From: Kyle Isom Date: Sat, 26 Sep 2026 00:10:00 -0700 Subject: [PATCH] Local-model commits carry Co-Authored-By: Owner's rule. The implementer often cannot know which model it is, so run-plan.sh derives the name from OPENCODE_MODEL (the part after the provider), gives the exact trailer and the Model column's value in the session prompt, and stops the run when a task's commit lacks that exact line. AGENTS.md replaces the old Implemented-By trailer and the "owner fills in the model" rule. Co-Authored-By: Claude Opus 5.5 (1M context) --- AGENTS.md | 8 +++++--- tools/run-plan.sh | 16 ++++++++++++---- 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 6a50044..b7e8e07 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -97,8 +97,10 @@ Useful while working: `cargo test -p --test ` runs one test file, - Work on the branch the task names. One task is one commit. - Stage only the paths the task lists: `git add ...`. Never `git add -A` or `git add .`. - Never push, amend, rebase, reset, or switch to another branch. -- Commit message: the subject line the task gives, a blank line, then this trailer: - `Implemented-By: OpenCode session (model recorded in docs/implementer-log.md)` +- Commit message: the subject line the task gives, a blank line, then the `Co-Authored-By` line + your session prompt gives, exactly, for example + `Co-Authored-By: ornith-1.5-35b-a3b `. If the prompt gives none, stop and + report. ## The implementer log @@ -115,4 +117,4 @@ bad one. | First gate | `pass` or `fail` for the first run | | Deviations | Anything you did that the task did not say, or `none` | | Notes | Problems you hit and how you solved them, in one or two sentences | -| Model | Write `?`. The owner fills this in. | +| Model | The model name your session prompt gives (as in the `Co-Authored-By` line), or `?` if it gives none. | diff --git a/tools/run-plan.sh b/tools/run-plan.sh index 2738bbe..03d161d 100755 --- a/tools/run-plan.sh +++ b/tools/run-plan.sh @@ -5,7 +5,9 @@ # # Usage: tools/run-plan.sh docs/plans/M2a [FIRST] FIRST is a task number such as 04 # Options (environment): -# OPENCODE_MODEL model to use (default straylight/laguna-s-2.1; OpenCode's own default differs) +# OPENCODE_MODEL model to use (default straylight/laguna-s-2.1; OpenCode's own default differs). +# The part after the provider (`ornith-1.5-35b-a3b`) names the model in each +# commit's `Co-Authored-By: ` trailer and in the log. # OPENCODE_FLAGS extra flags for `opencode run`, for example "--pure" or "--auto" # DRY_RUN=1 print what would be run and stop set -eu @@ -13,6 +15,8 @@ set -eu plan="${1:?usage: tools/run-plan.sh docs/plans/ [FIRST]}" first="${2:-00}" model="${OPENCODE_MODEL:-straylight/laguna-s-2.1}" +agent="${model##*/}" +trailer="Co-Authored-By: $agent " log=docs/implementer-log.md milestone=$(basename "$plan") runs=".state/runs/$milestone" @@ -25,7 +29,7 @@ for task in "$plan"/[0-9][0-9]-*.md; do name=$(basename "$task" .md) number=$(echo "$name" | cut -c1-2) [ "$number" -ge "$first" ] || continue - prompt="Read \`$task\` and do exactly that task." + prompt="Read \`$task\` and do exactly that task. You are $agent: write $agent in the log row's Model column, and end the commit message with this line, exactly: $trailer" if [ "${DRY_RUN:-0}" = 1 ]; then echo "opencode run -m $model ${OPENCODE_FLAGS:-} --title $milestone/$name \"$prompt\"" @@ -47,8 +51,8 @@ for task in "$plan"/[0-9][0-9]-*.md; do fi echo "=== $milestone/$name: session ended $(date '+%H:%M:%S')" - # The task must have left exactly what AGENTS.md asks for: a commit, a clean tree, and a - # `done` row in the log. Anything else needs a person, so stop. + # The task must have left exactly what AGENTS.md asks for: a commit carrying the trailer, a + # clean tree, and a `done` row in the log. Anything else needs a person, so stop. if [ "$(git rev-parse HEAD)" = "$before" ]; then echo "run-plan: $name made no commit; stopping" >&2 exit 1 @@ -57,6 +61,10 @@ for task in "$plan"/[0-9][0-9]-*.md; do echo "run-plan: $name left uncommitted changes; stopping" >&2 exit 1 fi + if ! git log -1 --format=%B | grep -qxF "$trailer"; then + echo "run-plan: $name's commit lacks the line '$trailer'; stopping" >&2 + exit 1 + fi if ! grep -Eq "^\| *$milestone/$name *\|[^|]*\| *done *\|" "$log"; then echo "run-plan: no 'done' row for $milestone/$name in $log; stopping" >&2 grep -E "^\| *$milestone/$name *\|" "$log" >&2 || true