FACTUAL ACTIVITY RECORD · 実際の作業をもとにした活動記録
PRマージ後の終了状態を揃える
dirty worktreeで停止するwrapperを追加し、local mainの復帰・同期・clean確認までを完了条件にする
目的
PRをマージした後も、local repositoryが作業branchに残り、mainへの復帰、remoteの最新状態の取得、working treeのclean確認まで完了していないことがあった。CEOは、マージ操作だけで作業完了とせず、次の作業を最新のmainから始められる状態までを一つの終了条件にするよう求めた。
この作業では、CEOがPRのマージを承認した後の流れを、マージ、関連Issueの状態確認、local mainへの復帰、remoteの取得、fast-forward更新、clean状態の確認までとして定義する。手順を省略しにくくし、未保存の変更を巻き込まないため、引数を受け付けずdirty worktreeで停止するrepository-local wrapperも実装することにした。
実装
作業開始時には、local mainが手元の追跡情報と一致している表示を確認した一方、remoteの実読みに失敗していた。それでも変更を始めたため、CEOの指摘後にそのbranchを完成版の根拠から外した。未commitの差分を一時退避し、remoteのmainを取得してlocalをfast-forwardし、そこから新しい作業branchを作って差分を再適用した。これにより、ルール化する終了条件を今回の変更自身にも適用できるbaseへ戻した。
scripts/return-to-main-after-mergeには、承認済みのPRマージ後に行うlocal cleanupを一つの順序として実装した。引数があれば終了code 2で拒否し、git status --porcelainに出力があれば終了code 1で停止する。cleanな場合だけmainへ切り替え、remote branchを整理しながら取得し、fast-forwardだけを許可するpullを実行して、最後にbranchとworking treeの状態を表示する。
#!/usr/bin/env bash
set -euo pipefail
if [ "$#" -ne 0 ]; then
echo "usage: scripts/return-to-main-after-merge" >&2
exit 2
fi
if [ -n "$(git status --porcelain)" ]; then
echo "error: working tree is not clean; resolve local changes before returning to main" >&2
git status --short >&2
exit 1
fi
git switch main
git fetch --prune origin
git pull --ff-only origin main
git status --short --branch図を描画しています…
.codex/rules/organization.rulesでは、scripts/return-to-main-after-mergeと./scripts/return-to-main-after-mergeの引数なし呼び出しだけを通常のcleanupとして許可するentryを定義した。git switch mainやgit pull --ff-onlyを広いcommand prefixで許可せず、引数付きwrapperも同じentryへ含めない。対象branchやoptionの取り違えをwrapperの入力境界へ閉じ込めた。
prefix_rule(
pattern = ["scripts/return-to-main-after-merge"],
decision = "allow",
match = [
"scripts/return-to-main-after-merge",
],
not_match = [
"git switch main",
"git pull --ff-only",
"scripts/return-to-main-after-merge feature-branch",
],
).agents/skills/software-delivery/SKILL.mdでは、software deliveryの終了gateを更新した。CEOのマージ承認後は、マージと関連Issueの状態確認またはcloseを済ませ、wrapperによるlocal main復帰、fetch、fast-forward pull、clean状態の確認までを完了条件とする。同SkillがIssueやPRの文面作成時に直接参照する.agents/skills/software-delivery/references/github-templates.mdは変更していない。今回の対象は文面のtemplateではなく、承認後の処理順と完了判定だからである。
AGENTS.mdと.codex/agents/full-stack-engineer.tomlにも同じ境界を反映した。組織全体の規則では、マージ後に関連Issueを確認し、localを最新のcleanなmainへ戻してから完了報告する。Full-Stack Engineerのrole instructionでは、マージ承認を受けて実行した場合にwrapperを省略せず、結果を報告する責務を追加した。これはrole設定の変更であり、このActivityでFull-Stack EngineerのCustom Agentが実作業へ参加したことを意味しない。
読者向けの運用説明は.codex/rules/README.md、docs/operating-model.md、docs/setup.mdへ同期した。マージ承認、関連Issue確認、post-merge cleanup、CEOへの完了報告という順序を示し、マージ済みbranchにlocalを残さないことを設定、Skill、role instruction、運用文書のどの入口からも確認できるようにした。最終的な変更はwrapperを含む8ファイルだった。
検証では、shell scriptの構文、すべてのCustom Agent TOMLのparse、差分の空白errorを確認した。変更中のdirty worktreeでwrapperを実行し、mainへの切り替えやremote取得へ進む前に停止することも確認した。変更の反映後には、実際のPRマージ直後にwrapperを実行し、localがmainへ戻り、remoteの到達状態までfast-forwardされ、working treeがcleanであることを確認した。
確認したこと
確認結果
マージ後の完了条件が、マージ、関連Issueの状態確認、local mainへの復帰、remoteの取得、fast-forward更新、clean状態の確認として、設定、Skill、role instruction、運用文書へ反映された。
scripts/return-to-main-after-mergeは引数を受け付けず、dirty worktreeではbranch切替やlocal refs更新へ進む前に停止する。cleanな場合だけmainへの切り替え、fetch --prune、pull --ff-only、status表示を順に実行する。
command rulesには引数なしwrapperの2つの呼び出し形だけを通常許可するentryを定義し、直接のswitchやpull、引数付きwrapperを同じentryへ含めなかった。policy evaluatorによるallow判定の実行までは、このActivityで確認していない。
shell構文、Custom Agent TOML、差分の空白errorの確認が成功し、dirty guardが意図どおり停止することを確認した。
変更の反映後にwrapperを実際のマージ後cleanupへ使用し、localがmainへ戻ってremoteの到達状態までfast-forwardされ、working treeがcleanであることを確認した。
確認したwrapper構成はoriginとmainを使う場合に限られる。別名のremote、別のdefault branch、networkまたは認証failureからの回復は、このActivityでは確認していない。clean確認はworking treeを対象とし、ほかのlocal refsが存在しないことまでは確認していない。
完了とした根拠
マージ後cleanupの終了条件が8ファイルへ一貫して反映され、wrapperの構文とdirty guard、TOML、差分を検証でき、変更の反映後に同じwrapperでlocal mainへの復帰、remoteとの同期、clean状態まで実際に確認したことをもって、このActivityの作業範囲を完了とした。