@lead: run without asking user #20

Merged
ffaerber merged 3 commits from ai/issue-16 into main 2026-07-04 21:39:02 +02:00

Summary

Implements the fully-automatic autopilot pipeline for issue #16: a per-issue label lets @pm auto-delegate without the human approval gate, and grants @qa a narrow, label-gated authority to merge the resulting PR and close the issue. Removing the label at any time is the kill switch; on any bug/doubt @qa halts and removes the label itself. Default (unlabeled) behavior is unchanged.

Changes

  • agent.yml: read fully-automatic label fresh every run (resolves origin issue from branch on PR threads); export autopilot/issnum.
  • agent.yml: @pm plans+delegates in one turn when autopilot is on (skips "reply yes" gate).
  • agent.yml: @qa gets MERGE_PR (merge PR + close issue) and HALT_AUTOPILOT (remove label + hand back) markers; merge failures safely drop the label and report.
  • agent.yml: after a dev PR opens in autopilot, auto-trigger @qa on the PR thread via AGENT_TOKEN.
  • agent.yml: strip new markers from replies; add del_autopilot_label() helper (deletes label by ID).
  • AGENTS.md: narrow carve-out to the "never merge" golden rule + new Autopilot section.
  • NOTE: requires TOKEN_QA to be granted write+merge scope (provisioning step, not code).

Resolves #16 · 🤖 @lead

## Summary Implements the `fully-automatic` autopilot pipeline for issue #16: a per-issue label lets `@pm` auto-delegate without the human approval gate, and grants `@qa` a narrow, label-gated authority to merge the resulting PR and close the issue. Removing the label at any time is the kill switch; on any bug/doubt `@qa` halts and removes the label itself. Default (unlabeled) behavior is unchanged. ## Changes - `agent.yml`: read `fully-automatic` label fresh every run (resolves origin issue from branch on PR threads); export `autopilot`/`issnum`. - `agent.yml`: `@pm` plans+delegates in one turn when autopilot is on (skips "reply yes" gate). - `agent.yml`: `@qa` gets `MERGE_PR` (merge PR + close issue) and `HALT_AUTOPILOT` (remove label + hand back) markers; merge failures safely drop the label and report. - `agent.yml`: after a dev PR opens in autopilot, auto-trigger `@qa` on the PR thread via `AGENT_TOKEN`. - `agent.yml`: strip new markers from replies; add `del_autopilot_label()` helper (deletes label by ID). - `AGENTS.md`: narrow carve-out to the "never merge" golden rule + new Autopilot section. - NOTE: requires `TOKEN_QA` to be granted write+merge scope (provisioning step, not code). --- Resolves #16 · 🤖 @lead
Owner

@lead please change fully-automatic to auto

@lead please change fully-automatic to auto

🤖 @lead

I'll start by reading AGENTS.md and understanding the current state of the repository.
The task is clear: rename the label fully-automatic to auto throughout the codebase. Let me find all occurrences.
Let me look at the agent.yml context around these lines to make sure I do proper replacements, especially the jq selectors and prose.
The replacements are all straightforward string swaps of fully-automaticauto. Since the label name string appears consistently (in jq selectors .name=="fully-automatic", prose, and backtick-quoted references), I'll do a global replace in both files.
All 19 occurrences replaced, none remaining. Let me verify the changes look correct in key spots.
All references correctly updated. Let me verify the diff and commit.
I'm on branch ai/issue-16, but this is issue #20. Per AGENTS.md, branches are named ai/issue-<N>. However, the workflow starts me on ai/issue-16 (the origin issue). Let me check the git status and the intended branch. The task references issue #16 (which this PR resolves) and issue #20 is the follow-up instruction. I'll commit on the current branch since that's where I was placed.
Done. Renamed the autopilot label from fully-automatic to auto across all 19 occurrences in agent.yml (jq label selectors, prose/comments, and agent-prompt text) and AGENTS.md (golden rule carve-out + Autopilot section). Committed and pushed to ai/issue-16.

BEGIN_PR_DESCRIPTION

Summary

Renames the autopilot opt-in label from fully-automatic to the shorter auto, as requested by the maintainer. This is a pure rename — no behavioral change to the autopilot pipeline.

Changes

  • agent.yml: update the label-name string in all jq selectors (.name=="auto"), the freshness-check gate, comments, del_autopilot_label helper, @qa merge/halt messages, and the @qa auto-trigger comment.
  • AGENTS.md: update the @qa merge carve-out in the golden rules and the Autopilot section to reference the auto label.
    END_PR_DESCRIPTION
🤖 **@lead** I'll start by reading AGENTS.md and understanding the current state of the repository. The task is clear: rename the label `fully-automatic` to `auto` throughout the codebase. Let me find all occurrences. Let me look at the agent.yml context around these lines to make sure I do proper replacements, especially the jq selectors and prose. The replacements are all straightforward string swaps of `fully-automatic` → `auto`. Since the label name string appears consistently (in jq selectors `.name=="fully-automatic"`, prose, and backtick-quoted references), I'll do a global replace in both files. All 19 occurrences replaced, none remaining. Let me verify the changes look correct in key spots. All references correctly updated. Let me verify the diff and commit. I'm on branch `ai/issue-16`, but this is issue #20. Per AGENTS.md, branches are named `ai/issue-<N>`. However, the workflow starts me on `ai/issue-16` (the origin issue). Let me check the git status and the intended branch. The task references issue #16 (which this PR resolves) and issue #20 is the follow-up instruction. I'll commit on the current branch since that's where I was placed. Done. Renamed the autopilot label from `fully-automatic` to `auto` across all 19 occurrences in `agent.yml` (jq label selectors, prose/comments, and agent-prompt text) and `AGENTS.md` (golden rule carve-out + Autopilot section). Committed and pushed to `ai/issue-16`. BEGIN_PR_DESCRIPTION ## Summary Renames the autopilot opt-in label from `fully-automatic` to the shorter `auto`, as requested by the maintainer. This is a pure rename — no behavioral change to the autopilot pipeline. ## Changes - `agent.yml`: update the label-name string in all jq selectors (`.name=="auto"`), the freshness-check gate, comments, `del_autopilot_label` helper, `@qa` merge/halt messages, and the `@qa` auto-trigger comment. - `AGENTS.md`: update the `@qa` merge carve-out in the golden rules and the Autopilot section to reference the `auto` label. END_PR_DESCRIPTION
Owner

@lead please change auto to autopilot

@lead please change auto to autopilot

🤖 @lead — pushed an update to the PR:

🔧 activity — 22 tool calls

🔧 bash: git branch --show-current && git status && git log --oneline -5
🔧 bash: grep -rn "auto" .gitea/workflows/agent.yml AGENTS.md 2>/dev/null | grep -iv "autopilot" | head -60
🔧 bash: grep -n '"auto"\|auto\|'"'"'auto'"'"'' .gitea/workflows/agent.yml AGENTS.md
🔧 bash: cd /workspace/ffaerber/agents && \ sed -i \ -e 's/auto label/autopilotlabel/g' \ -e "s/'auto' label/'autopilot' label/g" \ -e 's/\.name=="auto"/.name=="autopilot"/g' \ -e 's/theauto/the autopilot/g' \ -e 's/(auto label…
🔧 bash: cd /workspace/ffaerber/agents && grep -n '"auto"\|auto\|'"'"'auto'"'"'' .gitea/workflows/agent.yml AGENTS.md
🔧 edit: .gitea/workflows/agent.yml
🔧 edit: AGENTS.md
🔧 bash: cd /workspace/ffaerber/agents && \ echo "=== remaining bare 'auto' label refs ===" && \ grep -n '"auto"\|auto\|'"'"'auto'"'"'\|\*\*auto\*\*' .gitea/workflows/agent.yml AGENTS.md ; \ echo "=== new autopilot label refs ===" && \ grep -cn …
🔧 bash: cd /workspace/ffaerber/agents && git diff
🔧 bash: cd /workspace/ffaerber/agents && grep -n 'auto label' .gitea/workflows/agent.yml
🔧 edit: .gitea/workflows/agent.yml
🔧 bash: cd /workspace/ffaerber/agents && git add .gitea/workflows/agent.yml AGENTS.md && git commit -m "Rename autopilot label 'auto' to 'autopilot'" && git push origin ai/issue-16

🤖 **@lead** — pushed an update to the PR: - https://git.ffaerber.duckdns.org/ffaerber/agents/pulls/20 <details> <summary>🔧 activity — 22 tool calls</summary> 🔧 **bash**: `git branch --show-current && git status && git log --oneline -5` 🔧 **bash**: `grep -rn "auto" .gitea/workflows/agent.yml AGENTS.md 2>/dev/null | grep -iv "autopilot" | head -60` 🔧 **bash**: `grep -n '"auto"\|`auto`\|'"'"'auto'"'"'' .gitea/workflows/agent.yml AGENTS.md` 🔧 **bash**: `cd /workspace/ffaerber/agents && \ sed -i \ -e 's/`auto` label/`autopilot` label/g' \ -e "s/'auto' label/'autopilot' label/g" \ -e 's/\.name=="auto"/.name=="autopilot"/g' \ -e 's/the `auto`/the `autopilot`/g' \ -e 's/(`auto` label…` 🔧 **bash**: `cd /workspace/ffaerber/agents && grep -n '"auto"\|`auto`\|'"'"'auto'"'"'' .gitea/workflows/agent.yml AGENTS.md` 🔧 **edit**: `.gitea/workflows/agent.yml` 🔧 **edit**: `AGENTS.md` 🔧 **bash**: `cd /workspace/ffaerber/agents && \ echo "=== remaining bare 'auto' label refs ===" && \ grep -n '"auto"\|`auto`\|'"'"'auto'"'"'\|\*\*`auto`\*\*' .gitea/workflows/agent.yml AGENTS.md ; \ echo "=== new autopilot label refs ===" && \ grep -cn …` 🔧 **bash**: `cd /workspace/ffaerber/agents && git diff` 🔧 **bash**: `cd /workspace/ffaerber/agents && grep -n 'auto label' .gitea/workflows/agent.yml` 🔧 **edit**: `.gitea/workflows/agent.yml` 🔧 **bash**: `cd /workspace/ffaerber/agents && git add .gitea/workflows/agent.yml AGENTS.md && git commit -m "Rename autopilot label 'auto' to 'autopilot'" && git push origin ai/issue-16` </details>
Owner

@lead please rebase from main

@lead please rebase from main
gitea-actions bot added 3 commits 2026-07-04 21:24:26 +02:00
gitea-actions bot force-pushed ai/issue-16 from f6867ccedb to ef06da3ffe 2026-07-04 21:24:26 +02:00 Compare

🤖 @lead — pushed an update to the PR:

🔧 activity — 54 tool calls

🔧 bash: git branch --show-current && echo "---STATUS---" && git status && echo "---LOG---" && git log --oneline -5
🔧 bash: git fetch origin && echo "---MAIN LOG---" && git log --oneline origin/main -5 && echo "---MERGE BASE---" && git merge-base HEAD origin/main
🔧 bash: echo "=== commits on our branch not in main ===" && git log --oneline origin/main..HEAD && echo "" && echo "=== commits on main not in our branch (count) ===" && git log --oneline HEAD..origin/main | wc -l && echo "" && echo "=== files we c…
🔧 bash: echo "=== has agent.yml changed on main since merge-base? ===" && git log --oneline 25c915f..origin/main -- .gitea/workflows/agent.yml | head -40 && echo "" && echo "=== has AGENTS.md changed on main since merge-base? ===" && git log --onel…
🔧 bash: git rebase origin/main 2>&1 | head -40; echo "---RC=$?---"
🔧 bash: git diff --name-only --diff-filter=U && echo "---CONFLICT MARKERS---" && grep -n '^<<<<<<<\|^=======\|^>>>>>>>' .gitea/workflows/agent.yml | head -60
🔧 read: .gitea/workflows/agent.yml
🔧 bash: git rebase --abort && echo "aborted" && echo "---scripts dir on main---" && git ls-tree -r --name-only origin/main -- .gitea/workflows/scripts/
🔧 bash: git diff 25c915f..origin/main -- AGENTS.md | head -80
🔧 bash: git show 97ea6d9 --stat && echo "===================" && git show d4145d5 --stat && echo "===================" && git show f6867cc --stat
🔧 bash: git diff 25c915f..HEAD -- .gitea/workflows/agent.yml
🔧 bash: git show origin/main:.gitea/workflows/scripts/route.sh
🔧 bash: git show origin/main:.gitea/workflows/scripts/run-agent.sh
🔧 bash: git show origin/main:.gitea/workflows/scripts/publish.sh
🔧 todowrite: 7 todos
🔧 bash: git rebase origin/main 2>&1 | tail -6; echo "---"; git status --short | head
🔧 bash: ls -la .gitea/workflows/scripts/ 2>&1 | head
🔧 bash: git checkout --theirs .gitea/workflows/agent.yml 2>&1; echo "note: --theirs during rebase = main (the rebased-onto). Verifying no conflict markers:"; grep -c '^<<<<<<<\|^>>>>>>>' .gitea/workflows/agent.yml
🔧 bash: git diff origin/main -- .gitea/workflows/agent.yml | head; echo "===should be empty above==="; grep -n 'AUTOPILOT\|steps.prep.outputs\|run-agent.sh\|publish.sh\|route.sh' .gitea/workflows/agent.yml
🔧 bash: git checkout origin/main -- .gitea/workflows/agent.yml && echo "took main's version" && git diff origin/main -- .gitea/workflows/agent.yml | head -3; echo "===empty diff means identical to main==="
🔧 read: .gitea/workflows/agent.yml
🔧 edit: .gitea/workflows/agent.yml
🔧 edit: .gitea/workflows/agent.yml
🔧 read: .gitea/workflows/scripts/route.sh
🔧 edit: .gitea/workflows/scripts/route.sh
🔧 edit: .gitea/workflows/scripts/route.sh
🔧 read: .gitea/workflows/scripts/run-agent.sh
🔧 edit: .gitea/workflows/scripts/run-agent.sh
🔧 edit: .gitea/workflows/scripts/run-agent.sh
🔧 edit: .gitea/workflows/scripts/publish.sh
🔧 read: .gitea/workflows/scripts/publish.sh
🔧 read: .gitea/workflows/scripts/publish.sh
🔧 edit: .gitea/workflows/scripts/publish.sh
🔧 read: .gitea/workflows/scripts/publish.sh
🔧 edit: .gitea/workflows/scripts/publish.sh
🔧 edit: .gitea/workflows/scripts/publish.sh
🔧 bash: grep -n 'autopilot\|fully-automatic\|auto\b\|MERGE_PR\|HALT_AUTOPILOT' AGENTS.md
🔧 bash: grep -rn 'fully-automatic\|"auto"\|auto' .gitea/workflows/ ; echo "===should be no stray label strings in scripts/yml (all should be 'autopilot')==="; echo "--- yaml lint sanity ---"; python3 -c "import yaml,sys; yaml.safe_load(open('.git…
🔧 bash: for f in route.sh run-agent.sh publish.sh; do bash -n ".gitea/workflows/scripts/$f" && echo "$f: syntax OK" || echo "$f: SYNTAX ERROR"; done
🔧 bash: git add .gitea/workflows/agent.yml .gitea/workflows/scripts/route.sh .gitea/workflows/scripts/run-agent.sh .gitea/workflows/scripts/publish.sh AGENTS.md && git status --short
🔧 bash: git rebase --continue 2>&1 | tail -15; echo "---RC/STATUS---"; git status --short | head
🔧 bash: GIT_EDITOR=true git rebase --continue 2>&1 | tail -15; echo "---STATUS---"; git status --short | head
🔧 bash: grep -n '^<<<<<<<\|^=======\|^>>>>>>>' .gitea/workflows/agent.yml
🔧 bash: git checkout --ours .gitea/workflows/agent.yml && grep -c '^<<<<<<<' .gitea/workflows/agent.yml && echo "markers gone" && grep -n 'fully-automatic\|autopilot' AGENTS.md
🔧 bash: grep -n 'fully-automatic\|autopilot\|auto\b' AGENTS.md
🔧 bash: git add .gitea/workflows/agent.yml AGENTS.md && GIT_EDITOR=true git rebase --continue 2>&1 | tail -12; echo "---STATUS---"; git status --short | head
🔧 bash: git checkout --ours .gitea/workflows/agent.yml && grep -c '^<<<<<<<' .gitea/workflows/agent.yml && echo "---AGENTS.md now:---" && grep -n 'auto\b\|autopilot' AGENTS.md
🔧 bash: grep -n 'auto\|autopilot' AGENTS.md
🔧 bash: git add .gitea/workflows/agent.yml AGENTS.md && GIT_EDITOR=true git rebase --continue 2>&1 | tail -8; echo "---STATUS---"; git status
🔧 bash: echo "=== commits on branch vs main ===" && git log --oneline origin/main..HEAD && echo "" && echo "=== files changed vs main ===" && git diff --stat origin/main...HEAD
🔧 bash: git diff origin/main...HEAD
🔧 todowrite: 1 todos
🔧 bash: git push --force-with-lease origin ai/issue-16 2>&1 | tail -15
🔧 todowrite: 0 todos

🤖 **@lead** — pushed an update to the PR: - https://git.ffaerber.duckdns.org/ffaerber/agents/pulls/20 <details> <summary>🔧 activity — 54 tool calls</summary> 🔧 **bash**: `git branch --show-current && echo "---STATUS---" && git status && echo "---LOG---" && git log --oneline -5` 🔧 **bash**: `git fetch origin && echo "---MAIN LOG---" && git log --oneline origin/main -5 && echo "---MERGE BASE---" && git merge-base HEAD origin/main` 🔧 **bash**: `echo "=== commits on our branch not in main ===" && git log --oneline origin/main..HEAD && echo "" && echo "=== commits on main not in our branch (count) ===" && git log --oneline HEAD..origin/main | wc -l && echo "" && echo "=== files we c…` 🔧 **bash**: `echo "=== has agent.yml changed on main since merge-base? ===" && git log --oneline 25c915f..origin/main -- .gitea/workflows/agent.yml | head -40 && echo "" && echo "=== has AGENTS.md changed on main since merge-base? ===" && git log --onel…` 🔧 **bash**: `git rebase origin/main 2>&1 | head -40; echo "---RC=$?---"` 🔧 **bash**: `git diff --name-only --diff-filter=U && echo "---CONFLICT MARKERS---" && grep -n '^<<<<<<<\|^=======\|^>>>>>>>' .gitea/workflows/agent.yml | head -60` 🔧 **read**: `.gitea/workflows/agent.yml` 🔧 **bash**: `git rebase --abort && echo "aborted" && echo "---scripts dir on main---" && git ls-tree -r --name-only origin/main -- .gitea/workflows/scripts/` 🔧 **bash**: `git diff 25c915f..origin/main -- AGENTS.md | head -80` 🔧 **bash**: `git show 97ea6d9 --stat && echo "===================" && git show d4145d5 --stat && echo "===================" && git show f6867cc --stat` 🔧 **bash**: `git diff 25c915f..HEAD -- .gitea/workflows/agent.yml` 🔧 **bash**: `git show origin/main:.gitea/workflows/scripts/route.sh` 🔧 **bash**: `git show origin/main:.gitea/workflows/scripts/run-agent.sh` 🔧 **bash**: `git show origin/main:.gitea/workflows/scripts/publish.sh` 🔧 **todowrite**: `7 todos` 🔧 **bash**: `git rebase origin/main 2>&1 | tail -6; echo "---"; git status --short | head` 🔧 **bash**: `ls -la .gitea/workflows/scripts/ 2>&1 | head` 🔧 **bash**: `git checkout --theirs .gitea/workflows/agent.yml 2>&1; echo "note: --theirs during rebase = main (the rebased-onto). Verifying no conflict markers:"; grep -c '^<<<<<<<\|^>>>>>>>' .gitea/workflows/agent.yml` 🔧 **bash**: `git diff origin/main -- .gitea/workflows/agent.yml | head; echo "===should be empty above==="; grep -n 'AUTOPILOT\|steps.prep.outputs\|run-agent.sh\|publish.sh\|route.sh' .gitea/workflows/agent.yml` 🔧 **bash**: `git checkout origin/main -- .gitea/workflows/agent.yml && echo "took main's version" && git diff origin/main -- .gitea/workflows/agent.yml | head -3; echo "===empty diff means identical to main==="` 🔧 **read**: `.gitea/workflows/agent.yml` 🔧 **edit**: `.gitea/workflows/agent.yml` 🔧 **edit**: `.gitea/workflows/agent.yml` 🔧 **read**: `.gitea/workflows/scripts/route.sh` 🔧 **edit**: `.gitea/workflows/scripts/route.sh` 🔧 **edit**: `.gitea/workflows/scripts/route.sh` 🔧 **read**: `.gitea/workflows/scripts/run-agent.sh` 🔧 **edit**: `.gitea/workflows/scripts/run-agent.sh` 🔧 **edit**: `.gitea/workflows/scripts/run-agent.sh` 🔧 **edit**: `.gitea/workflows/scripts/publish.sh` 🔧 **read**: `.gitea/workflows/scripts/publish.sh` 🔧 **read**: `.gitea/workflows/scripts/publish.sh` 🔧 **edit**: `.gitea/workflows/scripts/publish.sh` 🔧 **read**: `.gitea/workflows/scripts/publish.sh` 🔧 **edit**: `.gitea/workflows/scripts/publish.sh` 🔧 **edit**: `.gitea/workflows/scripts/publish.sh` 🔧 **bash**: `grep -n 'autopilot\|fully-automatic\|auto\b\|MERGE_PR\|HALT_AUTOPILOT' AGENTS.md` 🔧 **bash**: `grep -rn 'fully-automatic\|"auto"\|`auto`' .gitea/workflows/ ; echo "===should be no stray label strings in scripts/yml (all should be 'autopilot')==="; echo "--- yaml lint sanity ---"; python3 -c "import yaml,sys; yaml.safe_load(open('.git…` 🔧 **bash**: `for f in route.sh run-agent.sh publish.sh; do bash -n ".gitea/workflows/scripts/$f" && echo "$f: syntax OK" || echo "$f: SYNTAX ERROR"; done` 🔧 **bash**: `git add .gitea/workflows/agent.yml .gitea/workflows/scripts/route.sh .gitea/workflows/scripts/run-agent.sh .gitea/workflows/scripts/publish.sh AGENTS.md && git status --short` 🔧 **bash**: `git rebase --continue 2>&1 | tail -15; echo "---RC/STATUS---"; git status --short | head` 🔧 **bash**: `GIT_EDITOR=true git rebase --continue 2>&1 | tail -15; echo "---STATUS---"; git status --short | head` 🔧 **bash**: `grep -n '^<<<<<<<\|^=======\|^>>>>>>>' .gitea/workflows/agent.yml` 🔧 **bash**: `git checkout --ours .gitea/workflows/agent.yml && grep -c '^<<<<<<<' .gitea/workflows/agent.yml && echo "markers gone" && grep -n 'fully-automatic\|autopilot' AGENTS.md` 🔧 **bash**: `grep -n 'fully-automatic\|autopilot\|auto\b' AGENTS.md` 🔧 **bash**: `git add .gitea/workflows/agent.yml AGENTS.md && GIT_EDITOR=true git rebase --continue 2>&1 | tail -12; echo "---STATUS---"; git status --short | head` 🔧 **bash**: `git checkout --ours .gitea/workflows/agent.yml && grep -c '^<<<<<<<' .gitea/workflows/agent.yml && echo "---AGENTS.md now:---" && grep -n 'auto\b\|autopilot' AGENTS.md` 🔧 **bash**: `grep -n 'auto\|autopilot' AGENTS.md` 🔧 **bash**: `git add .gitea/workflows/agent.yml AGENTS.md && GIT_EDITOR=true git rebase --continue 2>&1 | tail -8; echo "---STATUS---"; git status` 🔧 **bash**: `echo "=== commits on branch vs main ===" && git log --oneline origin/main..HEAD && echo "" && echo "=== files changed vs main ===" && git diff --stat origin/main...HEAD` 🔧 **bash**: `git diff origin/main...HEAD` 🔧 **todowrite**: `1 todos` 🔧 **bash**: `git push --force-with-lease origin ai/issue-16 2>&1 | tail -15` 🔧 **todowrite**: `0 todos` </details>
ffaerber merged commit bb07558d70 into main 2026-07-04 21:39:02 +02:00
Sign in to join this conversation.
No Reviewers
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: gitea/agents#20