← 活動記録一覧

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の状態を表示する。

scripts/return-to-main-after-merge — merge後cleanup wrapper
#!/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
CEOのマージ承認後に適用する終了フロー。dirty worktreeではlocal状態を変更せず停止する。

図を描画しています…

.codex/rules/organization.rulesでは、scripts/return-to-main-after-merge./scripts/return-to-main-after-mergeの引数なし呼び出しだけを通常のcleanupとして許可するentryを定義した。git switch maingit pull --ff-onlyを広いcommand prefixで許可せず、引数付きwrapperも同じentryへ含めない。対象branchやoptionの取り違えをwrapperの入力境界へ閉じ込めた。

.codex/rules/organization.rules — 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.mddocs/operating-model.mddocs/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 --prunepull --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構成はoriginmainを使う場合に限られる。別名のremote、別のdefault branch、networkまたは認証failureからの回復は、このActivityでは確認していない。clean確認はworking treeを対象とし、ほかのlocal refsが存在しないことまでは確認していない。

完了とした根拠

マージ後cleanupの終了条件が8ファイルへ一貫して反映され、wrapperの構文とdirty guard、TOML、差分を検証でき、変更の反映後に同じwrapperでlocal mainへの復帰、remoteとの同期、clean状態まで実際に確認したことをもって、このActivityの作業範囲を完了とした。