name: takt-issue description: >- takt の workflow で GitHub issue を実装する(worktree 作成 → background 実行 + poll で完了検知 → PR 化 → クリーンアップ)。「takt で issue 対応」「takt で #N を進めて」「takt 回して」など、takt 経由で issue を実装する意図が読み取れる発話で発動。
takt-issue
Overview
takt の workflow で GitHub issue を実装する一連の手順を自動化するスキル。worktree 作成・長時間 workflow 監視・PR 化(takt CLI の postExecutionFlow に委譲)・積み上げ・クリーンアップを抜け漏れなく実行する。takt の自動コミットメッセージ(takt: <slug> 形式)はそのまま採用する。
workflow は issue の性質に応じて使い分ける(いずれも builtin。dotfiles 側のカスタムは持たない):
default(plan → write_tests → draft → peer-review の 4 ステップ。draft / peer-review は subworkflow で内包): 新規 feature かつテスト先行が価値を持つ場合のみdefault-mini(plan → draft → peer-review の 3 ステップ。テスト実装をスキップ): それ以外すべて — bugfix / chore / docs / refactor / 既存テストで担保できる変更。迷ったらこちら(トークン節約優先)
選択ロジックは Step 1「起動前確認」で扱う。
When to Use
- ユーザーが「takt で issue #N 進めて」「takt で対応して」「takt 回して」と依頼したとき
- takt の workflow で issue を実装する意図が読み取れたとき
- 既に takt が導入されたリポジトリで issue を実行する場合(未導入なら本 skill は対象外)
前提知識(必読)
takt の仕様で陥りやすい落とし穴。本 skill は以下を踏まえた手順を強制する。
| 項目 | 仕様 | 対処 |
|---|---|---|
| 起動コマンド | takt は直接実行できる。npx takt は不要 |
常に takt ... を使う。npx は使わない |
対話モード takt -i <issue> |
worktree を作らない(実装ハードコード)。現ブランチで作業する | worktree が欲しい場合は takt add → takt run 経路を使う |
非 TTY の takt add |
workflow 選択 UI に応答できず、先頭の default が選ばれやすい |
実行前に .takt/tasks.yaml の workflow を必ず確認・補正。TTY で選びたい場合はローカルターミナルで直接叩く |
| 自動コミットメッセージ | takt: <slug> 形式で生成される |
そのまま採用する。書き換えない |
takt list --non-interactive --action delete |
--branch <name> 必須 |
クリーンアップ時に明示的に渡す |
| workflow 実行時間 | 中規模タスクで 20〜40 分 | takt -q run を background + log redirect で起動し、.takt/tasks.yaml の status だけを 30s 間隔で poll する |
| Codex / ChatGPT 側の token 消費 | takt run の stdout / JSONL / trace を前景で読むと、完了時に数十万 token のツール出力になる |
前景で takt run を監視しない。stdout は /tmp/takt-*.log に逃がし、必要時だけ tail -80 する |
Token budget guard
この skill の最重要ルール。takt の workflow 自体より、呼び出し元エージェントが takt の長い標準出力を読むことが token 消費の主因になる。
takt runは原則としてtakt -q run > /tmp/takt_<slug>.log 2>&1 &で起動するwrite_stdin/tail -fで全文ログを読まない- 読んでよいのは
tasks.yamlの該当 task、tail -80 /tmp/takt_<slug>.log、必要な report markdown の該当セクションだけ .takt/runs/**/logs/*.jsonlとtrace.mdは全文表示しない。調査時はwc -c/du -sh/jqで集計してから必要行だけ読む- 完了後のユーザー報告は
status、PR URL、テスト結果、review verdict に絞る
Context を収集
gh issue view <N> --json title,body,labels,state # issue 内容
gh repo view --json nameWithOwner # リポジトリ
git branch --show-current # 現在のブランチ(base 候補)
cat .takt/config.yaml # takt 設定(draft_pr など)
Task
1. 起動前確認
ユーザーに以下を確認する(ユーザー指定があればそれを優先):
- base branch:
mainから新規 PR を作るか / 既存 feature ブランチに積み上げるか。takt addの Step 4「Base branch」で選んだ branch がそのまま PR の base になる - issue 分割: issue が大きすぎるなら別 skill
issueで sub issue を先に起票 - workflow:
default/default-miniのどちらで回すか(下表で判定)
PR 作成は takt CLI 本体の postExecutionFlow が workflow 完了後に自動実行する(auto-commit → push → gh pr create、既存 PR があれば gh pr comment で追記)。takt add の Auto-create PR? [Y/n] プロンプトは Y を選ぶ(PR を自動で作るため)。workflow 側の品質チェックは builtin の peer-review subworkflow に含まれる reviewers(arch / ai-antipattern / supervise)の並列レビューが担当する。
ワンセンテンスで方針を提案し、ユーザーの判断を仰ぐ(auto モードでも方針判断は確認する)。
workflow 判断基準
gh issue view <N> --json title,body,labels の結果から推奨を 1 文で提案する。
| issue の特徴 | 推奨 workflow |
|---|---|
| 新規 feature かつテスト先行が価値を持つ(新しい振る舞いの追加で、テストを先に書くことで設計が改善する) | default |
| 上記以外すべて — bugfix / chore / docs / refactor / 既存テストで担保できる変更 | default-mini |
| 判断に迷う場合 | default-mini(write_tests 1 ステップ分 + 後続レビュー対象の縮小で 1 run あたり約 20-25% 軽い。トークン節約を優先) |
builtin の default / default-mini はいずれも スコープ外発見の自動 issue 起票機能を持たない。スコープ外を見つけたときは Step 7 の人手手順(issue スキルへの引き渡し)で対応する旨をユーザーに伝える。
provider 構成 (参考)
coder persona のみ Codex、その他(planner / supervisor / reviewer 系 4 persona)は Claude。実装で最も動く coder を Codex に振り、Claude Code Max のトークン枠を温存する構成。詳細と rate limit リカバリ手順は ~/.claude/skills/takt/SKILL.md の persona_providers セクションを参照。
2. takt add(タスク登録)
デフォルト経路: 非 TTY で直叩き → tasks.yaml 補正
takt add '#<N>' を直接実行する。非 TTY なので workflow 選択 UI に応答できず、先頭の default が自動選択される。その後 .takt/tasks.yaml を読み、今回追加された status: pending の task の workflow を意図したものに補正する。
takt add '#<N>'
sed -n '1,220p' .takt/tasks.yaml
default-mini で回す判断なら、該当 task の workflow: default を workflow: default-mini に変更してから takt run する。既存 completed task の workflow は触らず、今回追加した status: pending の task だけを対象にする。
確認ポイント:
issue: <N>status: pendingworkflow: default/default-miniauto_pr: truedraft_prは repo 設定に従う
補正後に再確認する:
sed -n '1,220p' .takt/tasks.yaml
Auto-create PR? [Y/n] の対話には応答できないが、非 TTY 時は auto_pr: true がデフォルトで yaml に書き込まれる前提(要確認なら直後の tasks.yaml で auto_pr フィールドを見る)。false になっていたら手で true に補正する。
複数 issue を同時に回す場合
takt add を直列で N 回叩いて、N 個の task を tasks.yaml に status: pending で並べる。実行は Step 3 の 単一 takt -q run が担当する。グローバル設定(~/.takt/config.yaml)に concurrency: 3 を宣言済みなので、1 回の takt -q run が pending を 最大 3 task 並列で消化する(ワーカーが空くたびに task_poll_interval_ms 間隔で次の pending を取得)。takt run を N 個多重起動しない。
takt add '#<N1>'
# tasks.yaml で N1 の workflow を補正
takt add '#<N2>'
# tasks.yaml で N2 の workflow を補正
# ...
各 task の worktree_path / branch / run_slug は tasks.yaml に出る。name prefix が共通になるので、完了検知は Step 4 の prefix poll で一括で待てる。並列実行の仕様詳細(concurrency / task_poll_interval_ms の範囲・graceful shutdown)は ~/.claude/skills/takt/SKILL.md の「並列実行」節を参照。
TTY で対話的に選びたい場合(オプション)
workflow 選択 UI(カテゴリ → workflow の 2 段選択)を矢印キーで選びたい場合は、ローカルターミナルで takt add '#<N>' を直接叩く。Claude Code の Bash ツールからは TTY が無いので使えない経路。
カテゴリ全体の構造は ~/.bun/install/global/node_modules/takt/builtins/ja/workflow-categories.yaml を参照。仕様の詳細は ~/.claude/skills/takt/SKILL.md を参照。
3. takt run(workflow 起動)
原則: background + quiet + log redirect
呼び出し元エージェントの token 消費を抑えるため、takt run は前景で流さない。-q はトップレベル option なので takt -q run の順で指定する。
SLUG=<task-slug>
LOG=/tmp/takt_${SLUG}.log
PIDFILE=/tmp/takt_${SLUG}.pid
nohup takt -q run >"$LOG" 2>&1 &
echo $! >"$PIDFILE"
echo "takt pid=$(cat "$PIDFILE") log=$LOG"
worktree path とブランチ名は tasks.yaml と log に出る。全文ログは読まず、必要時だけ末尾を見る:
tail -80 "$LOG"
控える情報:
.takt/tasks.yamlのworktree_path.takt/tasks.yamlのbranch.takt/tasks.yamlのrun_slug.takt/tasks.yamlのpr_url(完了後)
複数 task pending の場合
複数 issue を Step 2 で追加しても、起動は単一の takt -q run 1 回だけでよい。takt CLI の worker pool(runAllTasks → claimNextTasks(concurrency) → runWithWorkerPool)が pending を並列実行する。
- グローバル設定(
~/.takt/config.yaml、dotfiles 実体はconfig/.takt/config.yaml)でconcurrency: 3/task_poll_interval_ms: 500を宣言済み。よって 1 回のtakt -q runが pending を最大 3 task 並列で消化し、ワーカーが空くたびに 500ms 間隔で次の pending を取得する concurrencyは1〜10、task_poll_interval_msは100〜5000(zod 検証)。並列度を一時的に変えたいときはグローバル設定のconcurrencyを編集する(CLI flag は無い)takt -q runをrun_in_backgroundで N 個投げる旧手順は使わない。多重起動すると各プロセスが個別にclaimNextTasksするため実効並列度がconcurrency × 起動数に膨らみ、worktree 競合やトークン消費の暴走を招く- ログは単一プロセスなので
/tmp/takt_<slug>.logも 1 本にまとまる。concurrency > 1のときは takt が task ごとに色分けラベルを付けるので、tail -80でもどの行がどの task か判別できる - 完了検知は Step 4 の
nameprefix poll で全 task をまとめて待つ(単一プロセスでもtasks.yamlの各 task のstatusは独立に更新される)
4. 長時間監視
.takt/tasks.yaml の status フィールド(running → completed / failed / aborted)を 30s 間隔で poll し、完了時に 1 通知だけ受ける。短い sleep ループを呼び出し元エージェントの前景でポーリングしない。
監視コストの比較
| 手段 | 起動回数 | 1 起動あたりのコスト | 向き不向き |
|---|---|---|---|
ScheduleWakeup |
25 分ごとに 1 回(固定) | cache TTL (5 分) を超えるので毎回 cache miss → フルコンテキスト読み直し | 完了タイミングが完全に読めない時の保険。30 分仕事なら 1〜2 回、1h なら 3 回起動 |
Monitor(素の tail -f) |
stdout 行ごとに 1 通知 | 通知ごとに起動+cache miss | 通知数が膨らんで一番高い |
Monitor(selective filter) |
完了/失敗 行だけ emit | 1〜2 起動 | takt のように完了行が決まっている場合に有効 |
background shell + until ループ |
完了時に 1 起動 | 1 起動だけ | tasks.yaml の status を poll できる takt ではこれが最安。本 skill のデフォルト |
起動方法
<task-name-prefix> は takt add のログまたは tasks.yaml の name フィールドに出る slug 部分。複数 issue を同時に回すときは task で共通 prefix(例: pr-127-https-github-com-daiki)になるので、prefix で全件をまとめて待てる。
cat > /tmp/wait_takt_<slug>.sh <<'EOF'
#!/usr/bin/env bash
set -u
cd <repo path>
echo "[wait_takt] start $(date '+%H:%M:%S')"
until ruby -ryaml -e '
data = YAML.load_file(".takt/tasks.yaml")
tasks = data["tasks"].select { |t| t["name"].start_with?("<task-name-prefix>") }
exit(tasks.length >= <expected_count> && tasks.all? { |t| %w[completed failed aborted].include?(t["status"]) } ? 0 : 1)
'; do sleep 30; done
echo "[wait_takt] DONE $(date '+%H:%M:%S')"
ruby -ryaml -e '
data = YAML.load_file(".takt/tasks.yaml")
tasks = data["tasks"].select { |t| t["name"].start_with?("<task-name-prefix>") }
tasks.each { |t| puts "[#{t["status"]}] #{t["name"]} workflow=#{t["workflow"]} run_slug=#{t["run_slug"]}" }
'
EOF
chmod +x /tmp/wait_takt_<slug>.sh
Claude Code ではこれを Bash の run_in_background: true で投げる。Codex では nohup /tmp/wait_takt_<slug>.sh >/tmp/wait_takt_<slug>.log 2>&1 & で投げ、必要時だけ wait log の末尾を見る。timeout は workflow の最長想定(1〜2h)を考慮して 3600000ms 程度。
完了通知が来たら
tasks.yaml で各 task の最終 status を確認:
completed→tail -80 /tmp/takt_<slug>.logで末尾を読み、Auto-committed: <SHA>/Workflow completed (<n> iterations, <m>s)を控えるfailed/aborted→tail -80 /tmp/takt_<slug>.logで原因を読み、.takt/tasks/<run_slug>/reports/のレポートを確認
参照する 3 点のみ:
sed -n '1,220p' .takt/tasks.yaml # 各 task の最終 status / pr_url
tail -80 /tmp/takt_<slug>.log # 末尾出力(必要時のみ)
ls .takt/runs/<run_slug>/reports/ # peer-review のレポート一覧
ポーリング中は他作業に context を使ってよい(前景で sleep 待ちしない)。
5. 完了後処理
PR 作成(auto-commit / push / gh pr create または既存 PR への gh pr comment 追記)は takt CLI 本体の postExecutionFlow が workflow 完了直後に自動実行する。skill 側で手動の gh pr create / gh pr edit は基本不要。品質チェックは builtin の peer-review subworkflow(arch-review / ai-antipattern-review / supervise の並列レビュー)が担当する。
5-A. 新規 PR(base = main / master)
takt add で Auto-create PR? [Y/n] に Y を選んでいれば、postExecutionFlow が gh pr create で新規 PR を作る。PR 本文は固定テンプレート(## Summary + ## Execution Report + Closes #<N> + <!-- takt:managed --> マーカー)。
skill 側ですべきことは:
tasks.yamlの status がcompletedになったらtasks.yamlのpr_urlフィールドを読む。空のときはgh pr list --head takt/<N>/<slug> --json url -q '.[0].url'で取得- PR URL と
.takt/runs/<run_slug>/reports/配下のレビューレポート(builtin の peer-review が出力するarchitecture-review.md/ai-antipattern-review.md/supervisor-validation.mdなど)を Read で読んでレビュー結果をユーザーに表示 status: failedで workflow 自体が落ちている場合は失敗ログを確認し、fixstep でリカバリ済みか、人手介入が必要かを判断- PR 作成自体が失敗(auth エラー等)した場合は
tasks.yamlのprFailed: trueで検出できる。その時は手動でgh pr createするか、/commit-commands:commit-push-prを親 repo で叩いてリカバリ
5-B. 既存 PR への積み上げ(base = feature ブランチ等)
postExecutionFlow は既存 PR を検出すると新規作成せず gh pr comment <N> --body <prBody> でコメント追記するだけ。worktree ブランチを base ブランチに merge する処理は builtin に無い ため、必要なら以下を人手で実行する:
# 親 repo に戻る
cd <main repo path>
# 既存 PR の base ブランチに切り替えて worktree ブランチを merge
git checkout <BASE_BRANCH>
git pull --ff-only origin <BASE_BRANCH>
git merge --no-ff takt/<N>/<slug> -m "Merge takt/<N>/<slug> into <BASE_BRANCH>"
git push origin <BASE_BRANCH>
# 既存 PR 本文に Closes #<N> を追記
EXISTING_PR=$(gh pr list --head <BASE_BRANCH> --state open --json number -q '.[0].number')
gh pr edit "$EXISTING_PR" --body "$(gh pr view "$EXISTING_PR" --json body -q '.body')
Closes #<N>"
skill 側ですべきことは、merge 実行可否(人手承認)の確認、上記コマンドの実行、結果(既存 PR URL)のユーザー報告。
5-C. CI チェック監視
postExecutionFlow が PR を作成または積み上げた直後に GitHub Actions の完了まで待つ。tasks.yaml の poll と同じ「background 実行 + 完了時 1 通知」パターンで投げ、前景 sleep ループは使わない。
PR 番号は 5-A の URL 末尾、または gh pr list --head takt/<N>/<slug> --json number -q '.[0].number' で取得する。
PR_NUMBER=<PR#> # 5-A は postExecutionFlow が出力した URL 末尾、5-B は積み上げ先の既存 PR 番号
cat > /tmp/wait_ci_<slug>.sh <<EOF
#!/usr/bin/env bash
set -u
cd <repo path>
echo "[wait_ci] start \$(date '+%H:%M:%S') PR=#${PR_NUMBER}"
gh pr checks ${PR_NUMBER} --watch --interval 30
EXIT=\$?
echo "[wait_ci] DONE \$(date '+%H:%M:%S') exit=\$EXIT"
gh pr checks ${PR_NUMBER}
exit \$EXIT
EOF
chmod +x /tmp/wait_ci_<slug>.sh
Claude Code ではこれを Bash の run_in_background: true で投げる。Codex では nohup /tmp/wait_ci_<slug>.sh >/tmp/wait_ci_<slug>.log 2>&1 & で投げ、必要時だけ末尾を見る。timeout は CI 最長想定 + α で 2400000ms(40 分)程度。
完了通知が来たら:
- exit 0 → 全 check pass。レビュー依頼へ進める
- exit ≠ 0 → 失敗 check の job を
gh pr checks ${PR_NUMBER}の出力で特定し、gh run view <run-id> --log-failedで失敗ログを取得して原因判断。修正は worktree(5-A)または積み上げ先ブランチ(5-B)で行い、push 後に再度 5-C を回す
CI fail が takt スコープ外(flaky test など)と判断した場合は Step 7 に従って別 issue に切り出す。
6. クリーンアップ
# tasks.yaml と worktree 削除(--branch 必須)
takt list --non-interactive --action delete --branch takt/<N>/<slug> --yes
ローカルブランチ takt/<N>/<slug> は PR が merge されたあとに clean-branch スキルで一括削除する(merge 前に削除すると PR の差分元が失われる)。
7. スコープ外の発見は別 issue 化
builtin の default / default-mini workflow には スコープ外発見の自動 issue 起票機能はない(スコープ外を自動で gh issue create する step は builtin に含まれない)。スコープ外を見つけたら本セクションの人手手順(issue スキルへの引き渡し)で必ず別 issue に切り出す。
takt の実行中・完了後にスコープ外の問題に気付いたら、worktree 内で直接修正してはならない。スコープを膨らませると PR レビューが肥大化し、takt builtin の「タスク指示書の文言を拡大解釈しない」スコープ規律にも反する。
代わりに次の手順で別 issue として起票する:
- 呼び出し元のセッションで作業を続ける(worktree 内では編集しない)
issueスキルを起動して、発見した問題を新規 issue として登録- 必要なら原 issue の PR 本文や takt の summary に「関連: #<新 issue>」を追記
- 新 issue は次回の takt サイクルで処理する(その場で連続着手しない)
具体例:
| 発見 | 対応 |
|---|---|
| 無関係なテストの flakiness | 別 issue(バグ報告) |
| 触ったファイルの古いコメント / 型注釈不足 | 別 issue(chore) |
| 依存ライブラリの軽微な脆弱性 | 別 issue(security / chore) |
| 設計上の重複・抽象化したくなる箇所 | 別 issue(refactor)、ただし improve の監査で検出される類なら起票前に重複確認 |
| 同じ PR の他 issue 領域への波及 | takt のスコープ内なので worktree で直す(積み上げ運用なら base ブランチに merge してから次 takt) |
判断に迷うときの基準: 「この修正を入れたら PR タイトルが変わるか?」。変わるならスコープ外 → 別 issue。
Gotchas
npx taktは不要:taktを直接使う。npxは package resolution と余計なログの原因になるため、この skill では使わない- takt -i は worktree を作らない: 「対話モードで」と言われても worktree が必要なら
takt add経路を使う - 非 TTY の
takt addは workflow を誤選択しやすい: UI に応答できずdefaultが選ばれることがある。非 TTY で追加したらtakt run前に.takt/tasks.yamlを読み、今回のstatus: pendingtask のworkflowを確認・補正する - 前景の
takt run監視は禁止: 完了時に stdout / trace / JSONL が大量に返り、呼び出し元の会話コンテキストを数十万 token 消費しうる。takt -q run > /tmp/takt_<slug>.log 2>&1 &で起動し、tasks.yamlだけ poll する - 全文ログを読まない:
.takt/runs/**/logs/*.jsonl、trace.md、長い log 出力は全文表示しない。du/wc/jqで集計し、必要ならtail -80または該当 report だけ読む --branch省略不可:takt list --non-interactive --action deleteは branch 名を明示しないとエラー- 完了検知の選択:
Monitor(素のtail -f)は通知ごとに cache miss が走るため selective filter を組まないと割高。ScheduleWakeupは完了タイミングが全く読めない場合の保険でしか正当化できない。tasks.yamlの status フィールドを poll できる takt では background shell +untilループ(30s 間隔)が最安で、これを 本 skill のデフォルトとする tasks.yamlの name prefix:Task created: <slug>の slug は task 説明文先頭から自動生成される(記号は除去、80 文字程度で truncate)。複数 issue を同時に回すときは複数 task で同じ prefix になりがちなので、prefix での絞り込みが効く- skill のスコープ判定: 編集対象が グローバル user skill(dotfiles 管理のもの。例: takt-issue / cmux など)なら
~/01-dev/dotfiles/config/.claude/skills/を編集する(~/.claude/はシンボリックリンク)。一方、project-scoped skill(リポジトリの.claude/skills/に commit され、yt-skills syncなどで downstream に配布されるもの)はそのリポジトリ内で編集する。両者を取り違えると配布経路が壊れる - builtin にスコープ外自動起票は無い: builtin の
default/default-miniはいずれも spillover step を持たない。スコープ外発見は必ず Step 7 の人手手順でissueスキルに引き渡す - PR 作成で終わらない: takt CLI の postExecutionFlow が
gh pr createした後に GitHub Actions が走る。workflow 内のレビューはコード読みだけで CI を回さないため、必ず Step 5-C のgh pr checks --watchで GitHub Actions の完了まで待つ Auto-create PR? [Y/n]は Y を選ぶ: takt CLI 本体の postExecutionFlow が PR を作る経路を有効化するため。workflow 側に PR 作成 step は存在しないので二重起動の懸念はない- 既存 PR 積み上げは人手: postExecutionFlow は既存 PR を検出すると
gh pr commentでコメント追記するだけで base ブランチへの merge は行わない。積み上げ運用なら Step 5-B の手動 merge 手順を実行する - Codex review の厳しさ: dotfiles の
persona_providers.coder.provider: codexはcoderpersona だけを Codex に振っており、reviewer 系は Claude(デフォルト)。Codex でレビューを回しているわけではないため、過剰指摘ループが起きるなら原因は reviewer instruction 側(builtin のfacets/instructions/review-*.mdやai-antipattern-review.md)の判定基準にある。必要なら eject して「軽微 APPROVE / 重大のみ ABORT」を明記する
Rules
- 起動前に方針(base branch / 分割 / workflow)をユーザーに確認する。auto モードでも判断確認は省かない
- workflow(builtin の
default/default-mini)を起動前に判断・確認する。判断軸は label / 影響範囲 / テスト先行の要否。bugfix / chore / docs / 小規模 refactor はdefault-mini、feature / 中〜大規模はdefault、迷ったらdefault。いずれを選んでも builtin には spillover 自動起票がないので Step 7 の人手チェックは必須 npxは使わず、taktを直接実行する- 非 TTY で
takt addした場合は、takt run前に.takt/tasks.yamlを確認し、今回追加されたstatus: pendingtask のworkflowが意図通りか必ず補正する Auto-create PR? [Y/n]プロンプトは Y を選ぶ。PR 作成は takt CLI 本体のpostExecutionFlowが担当する- worktree が必要な場合は
takt add→takt run経路を強制する - 自動コミットメッセージ(
takt: <slug>)は書き換えず、そのまま採用する takt runはtakt -q run > /tmp/takt_<slug>.log 2>&1 &で起動し、前景で stdout を読まない- 長時間監視は background shell +
untilループで.takt/tasks.yamlの status を 30s 間隔で poll する。ScheduleWakeupは完了タイミングが完全に読めない場合の保険。前景 sleep ループは禁止 .takt/runs/**/logs/*.jsonlとtrace.mdは全文表示しない。必要時はwc/du/jq/tail -80で絞る- レビュー結果は
.takt/runs/<run_slug>/reports/配下のレポート(builtin の peer-review が出力するarchitecture-review.md/ai-antipattern-review.md/supervisor-validation.md等)に出力される。完了後はこれを Read で読んでユーザーに表示する。PR URL はtasks.yamlのpr_urlまたはgh pr list --head takt/<N>/<slug>で取得する - 既存 PR 積み上げ(5-B)は builtin に無いため skill 側で手動 merge →
gh pr editを実行する。新規 PR 作成(5-A)は postExecutionFlow に任せ、gh pr createを手動実行しない - PR 作成・積み上げ後は必ず Step 5-C で
gh pr checks --watchを background 実行で投げて GitHub Actions の完了を待つ(tasks.yamlpoll と同じ「完了時 1 通知」パターン)。CI fail ならgh run view <run-id> --log-failedで原因を確認し、修正 push → 5-C 再実行までを skill 内で完結させる - 現 issue のスコープ外の問題を見つけても worktree 内で直接修正しない。builtin の
default/default-miniには spillover 自動起票がないので、スコープ外発見は必ずissueスキルで別 issue として起票し、次回の takt サイクルに回す(判断基準: 「PR タイトルが変わるか?」変わるならスコープ外) - ローカルブランチ削除は PR merge 後に
clean-branchスキルへ委譲(merge 前に消さない) - 複数 issue を同時に回すときは
takt addを直列で N 回叩いてtasks.yamlに並べ、takt -q runを 1 回だけ background 起動する。グローバル設定のconcurrency: 3により単一プロセスが pending を最大 3 並列で消化するので、takt runを多重起動してはならない(実効並列度が膨らみ worktree 競合・トークン暴走を招く)。完了検知はnameprefix の単一 poll で全件まとめて待つ