docs(tickets): reportの運用・Workflowのディレクトリ位置修正

This commit is contained in:
Keisuke Hirata 2026-05-07 23:34:00 +09:00
parent 1ed45032be
commit 40cde699a8
6 changed files with 301 additions and 0 deletions

View File

@ -51,3 +51,7 @@ TODO.mdのリンクは完了後に切れるが、そのリンクを元にgitで
`.review.md` にはレビューの指摘事項と判断結果を記載する。
レビューはdiffの確認だけでなく、チケットはどのような前提・要件であり、それが達成されたかの確認まで含めて行う。
常に、提出された実装で良いのか、コードベースを歪めていないか、不必要な実装ではないかを確認すること。
---
insomniaでinsomniaを開発している際、AI自身のフィードバックを元に改善を回すために `docs/report/`ディレクトリに感じた障壁や改善案等を書き残す形にした。 明確に力不足な点/ツールの問題があった場合や、ユーザーからの指示があった際に作ること。

View File

@ -51,3 +51,7 @@ TODO.mdのリンクは完了後に切れるが、そのリンクを元にgitで
`.review.md` にはレビューの指摘事項と判断結果を記載する。
レビューはdiffの確認だけでなく、チケットはどのような前提・要件であり、それが達成されたかの確認まで含めて行う。
常に、提出された実装で良いのか、コードベースを歪めていないか、不必要な実装ではないかを確認すること。
---
insomniaでinsomniaを開発している際、AI自身のフィードバックを元に改善を回すために `docs/report/`ディレクトリに感じた障壁や改善案等を書き残す形にした。 明確に力不足な点/ツールの問題があった場合や、ユーザーからの指示があった際に作ること。

View File

@ -1,5 +1,7 @@
- Workflow / Skills
- 内部 Worker / 内部 Pod の Workflow 化 → [tickets/internal-worker-workflow.md](tickets/internal-worker-workflow.md)
- 半自動開発運用 Workflow → [tickets/auto-maintain-workflow.md](tickets/auto-maintain-workflow.md)
- Workflow の物理配置を `.insomnia/workflow` に分離 → [tickets/workflow-directory-layout.md](tickets/workflow-directory-layout.md)
- パーミッション: パターンベースのツール実行制御 → [tickets/permission-extension-point.md](tickets/permission-extension-point.md)
- Pod CLI: マニフェスト関連フラグの整理 → [tickets/pod-cli-manifest-flags.md](tickets/pod-cli-manifest-flags.md)
- Pod: 空応答ターン (Submit 後 AI 応答ゼロで Pause/Cancel) を自動巻き戻し → [tickets/pod-empty-turn-rollback.md](tickets/pod-empty-turn-rollback.md)

View File

@ -0,0 +1,94 @@
# ファイルベース Ticket と Scope 委譲の相性
日付: 2026-05-05
## 要旨
insomnia を使って insomnia を開発する運用では、ファイルベースの ticket / review lifecycle と、Pod の write scope 委譲が衝突しやすい。特に「実装 Pod が worktree を書く」直後に「親 Pod または reviewer が同じ worktree の ticket review artifact を書く」流れでは、同じファイルツリーに複数主体が順番に書きたい一方、Scope は write 権限を排他的に委譲するため、自然なレビュー操作が詰まる。
## 今回起きたこと
`tickets/permission-extension-point.md` の実装で、worktree workflow に従って `.worktree/permission-extension-point` を作り、実装用 Pod を Spawn した。
実装 Pod には worktree への write scope を渡したため、親 Pod から見るとその worktree は委譲中の領域になった。その後、同じ worktree に対して ticket review workflow を行い、`tickets/permission-extension-point.review.md` の作成と `tickets/permission-extension-point.md` の Review section 追記をしようとしたところ、親 Pod の `Write` tool は次のように拒否された。
```text
path is read-only in this scope: <repo>/.worktree/permission-extension-point/tickets/permission-extension-point.review.md
```
実装 Pod を `StopPod` して scope を回収した後に review artifact を書く必要があった。
また、最初に SpawnPod した際、write scope を worktree のみに絞ると spawned Pod の cwd である `<repo>` が readable scope 外になり、起動に失敗した。実装用 Pod には worktree write に加えて親 project root の read scope も渡す必要があった。
## 障壁
### 1. Ticket lifecycle は同じファイルツリーへの複数主体の逐次書き込みを要求する
このプロジェクトの ticket lifecycle は、実装後に以下のようなファイル操作を行う。
- `tickets/<ticket>.md` を読む
- `tickets/<ticket>.review.md` を作る
- `tickets/<ticket>.md` に Review section を追記する
- 完了時には ticket / review file を削除する
つまり ticket は単なる入力仕様ではなく、実装・レビュー・完了状態を表す共有ファイルでもある。実装者 Pod、親 Pod、reviewer Pod のいずれも、同じ worktree 内の `tickets/` を書きたくなる。
### 2. Scope は write ownership を安全側に排他的にする
SpawnPod の scope 委譲は、子 Pod に渡した write 領域を親から切り離す安全モデルになっている。このモデル自体は正しい。子が作業中の worktree を親が同時に書けないため、意図しない競合や横取りを防げる。
ただし file-based ticket workflow では、レビューを書く段階でも同じ worktree を書く必要がある。実装 Pod がまだ alive で write scope を保持していると、親が review artifact を書けない。reviewer Pod を別に Spawn する場合も、同じ write scope を同時に渡せない。
### 3. Review のために実装 Pod を止めると対話継続性が落ちる
今回の回避策は実装 Pod を停止して scope を回収することだった。これは review artifact を書くには有効だが、実装者 Pod に追加質問したり、レビュー指摘をそのまま反映させたりする流れとは相性が悪い。
本来欲しい流れは以下に近い。
1. 実装 Pod が worktree に実装する
2. reviewer が同じ diff を見て review artifact を書く
3. 実装 Pod に修正を依頼する
4. reviewer が再レビューする
現在の排他的 write scope では、2 と 3 の間で scope owner を何度も移す必要がある。
## 影響
- Ticket review が「実装 Pod を停止してからでないと書けない」運用になりやすい
- 実装者 Pod と reviewer Pod の並行・往復がしにくい
- file-based ticket が作業対象 worktree 内にあるため、コード変更と管理メタデータ変更が同じ scope boundary に巻き込まれる
- 親 Pod が orchestration をしているのに、review artifact のような管理操作まで child scope に阻まれる
## 暫定運用
当面は次の運用が現実的。
- 実装 Pod に worktree write scope を渡したら、レビュー artifact を親が書く前に実装 Pod を停止して scope を回収する
- 実装 Pod に追加修正を依頼したい場合は、レビュー作成後に再 Spawn する
- Spawn 時は worktree write scope だけでなく、Pod 起動 cwd や参照元 ticket を読める read scope も明示する
この運用は安全だが、レビュー往復の体験は重い。
## 改善案
### A. Review artifact の書き込み場所を親側に逃がす
review を worktree 内の `tickets/*.review.md` ではなく、親 session 側の report / review storage に書く案。Scope 衝突は避けられるが、現行の ticket lifecycle と git 上の履歴管理から外れるため、採用するなら ticket lifecycle 自体の再設計が必要。
### B. Scope に「管理ファイルの親書き込み例外」を作る
親 Pod が delegated worktree のうち `tickets/*.review.md``tickets/*.md` の Review section だけを書ける例外を作る案。実装はできるが、Scope の安全モデルに穴を開けるため慎重に扱う必要がある。パターンベース permission と似た問題になり、どのファイルを管理操作とみなすかの境界も曖昧になる。
### C. Scope owner の handoff を明示操作にする
`StopPod` より軽い「write scope を一時返却する / 再取得する」操作を protocol に作る案。実装 Pod の会話状態を保ったまま、reviewer / parent が短時間だけ同じ worktree に書ける。ただし停止していない Pod が後で再開した時の整合性、同時実行防止、失効した tool call の扱いを設計する必要がある。
### D. Reviewer を同じ Pod に依頼する
実装 Pod 自身に review artifact まで書かせる案。Scope 衝突は起きないが、実装者と reviewer の分離が弱くなる。ticket-reviewer の目的である独立レビューには向かない。
## 現時点の判断
短期的には「実装完了 → 実装 Pod 停止 → 親または reviewer が review artifact 作成」を標準手順として明記するのが良い。中期的には、Scope owner の handoff か、ticket/review artifact の置き場所を再検討する必要がある。
今回の障壁はバグというより、insomnia の安全な scope 委譲モデルと、ファイルを状態機械として使う ticket lifecycle の設計上の摩擦である。

View File

@ -0,0 +1,69 @@
# 半自動開発運用 Workflow
## 背景
insomnia では insomnia 自身の開発を、ユーザーがタスクを投げ、設計相談をし、実装 Pod / reviewer Pod に分担させる形で進めている。既に Workflow / Skills、SpawnPod、Pod 間通信、scope 委譲、ticket / review lifecycle は揃っており、局所的な実装判断は AI に移譲できる余地が大きい。
一方で、完全な unattended 自動開発にするには、永続ジョブキュー、git 書き込み権限、設計判断のエスカレーション基準など未整理の領域がある。初期段階では、常駐 scheduler ではなく、ユーザーが明示的に起動する「maintainer workflow」として、TODO / tickets を俯瞰し、実装・レビュー・修正依頼を orchestration し、設計境界や完了判断だけを人間に戻す運用を整備する。
## 要件
### Workflow の役割
`/auto-maintain` 相当の Workflow を用意し、親 Pod が以下を実行できるようにする。
- `TODO.md``tickets/` から着手候補を把握する
- 既存方針・既存 ticket から実装方針が十分に導ける作業を選ぶ
- 要件が曖昧、または設計判断が必要な場合は実装前に人間へ質問する
- 実装 Pod を spawn し、適切な read / write scope を委譲する
- 実装 Pod の完了報告と diff / build / test 結果を確認する
- 必要に応じて reviewer Pod、または親 Pod 自身でレビューする
- レビュー指摘があれば修正を依頼する
- 最終的に「完了候補」として人間に報告する
### エスカレーション基準
Workflow は、少なくとも以下の場合に作業を止めて人間へ確認する。
- ticket の要件から複数の設計方針が自然に導け、選択が将来の構造に影響する
- scope / permission / history 永続化 / prompt context 加工原則など、システムの安全モデルに触れる
- 新しい ticket の追加、既存 ticket の大幅な要件変更、ticket 完了削除を行う
- git の commit / merge / push など書き込み操作が必要になる
- テスト不能、再現不能、または作業範囲外の不具合に遭遇する
### Pod orchestration 規約
- 実装 Pod と reviewer Pod は原則分ける。ただし scope 衝突や作業粒度により、親 Pod がレビューしてもよい。
- 実装 Pod に worktree write scope を渡す場合、review artifact を親または reviewer が書く前に実装 Pod を停止して scope を回収する。
- spawn 時は、作業対象 worktree の write scope だけでなく、必要な参照元 ticket / project root の read scope も明示する。
- 子 Pod の出力は `ReadPodOutput` で確認し、必要なら `SendToPod` で追加依頼する。
- orphan 化した Pod や不要になった Pod は `StopPod` する。
### 成果物
- Workflow 本文、またはそれに準じる運用手順が workspace から呼び出せる形で追加される
- Workflow が resident workflow として広告可能かどうかを判断し、必要なら `model_invokation` 設定を含める
- 実際の insomnia 開発 ticket を 1 件以上試走し、実装 Pod / review / 人間確認の境界が機能することを確認する
- 試走で見つかった不足永続ジョブキュー、scope handoff、review artifact の置き場所等)は、本チケット内で解決せず、必要なら別 ticket として切り出す
## 範囲外
- 常駐 scheduler / daemon による unattended 実行
- git commit / merge / push の自動化
- ticket 完了削除の自動化
- Workflow の状態機械化、永続ジョブキュー化、トランザクション管理
- scope owner handoff など、Pod 権限モデル自体の変更
## 完了条件
- `/auto-maintain` 相当の半自動開発運用 Workflow が利用可能になっている
- Workflow は TODO / tickets から作業を選び、実装 Pod / reviewer / 人間確認を使い分ける手順を明示している
- エスカレーション基準により、設計判断・git 書き込み・ticket 完了判断が人間に戻る
- 少なくとも 1 件の小さな実開発作業で試走し、結果と不足点が記録されている
- 既存の Workflow / Skill / memory の設計方針、特に Workflow 自動生成禁止と history に commit されない context input 禁止に反していない
## 参照
- `docs/plan/workflow.md`
- `docs/report/2026-05-05-file-ticket-scope.md`
- `tickets/internal-worker-workflow.md`

View File

@ -0,0 +1,128 @@
# Workflow の物理配置を `.insomnia/workflow` に分離する
## 背景
現行の Workflow は `<workspace>/.insomnia/memory/workflow/<slug>.md` に配置される。これは実装上 memory subsystem の loader / linter に載せていた名残だが、概念上は不自然になっている。
Workflow は session-derived な記憶ではなく、人間が管理する手順・操作ポリシーである。一方で `.insomnia/memory/summary.md`、`decisions/`、`requests/`、`_staging/` は自動抽出・統合される memory state であり、ignore や書き込み禁止の扱いも異なる。
この混在により、`.insomnia/.gitignore` で `memory` を ignore すると project-authored Workflow まで Git 管理から外れる。また、memory write tool が Workflow 書き込みを禁止するなど、「memory 配下にあるが memory ではない」ものとして扱う歪みが出ている。
Knowledge は既に `.insomnia/knowledge/<slug>.md` として `memory/` の外にある。Workflow も同様に `.insomnia/workflow/<slug>.md` を canonical path とし、memory state から分離する。
## 要件
### canonical path の変更
Workflow の標準配置を以下に変更する。
```text
<workspace>/.insomnia/workflow/<slug>.md
```
旧配置は以下。
```text
<workspace>/.insomnia/memory/workflow/<slug>.md
```
新規作成・ドキュメント・補完・resolver の説明は新配置を使う。
### 互換読み取り
移行期間のため、loader は当面旧配置も読む。
- 新配置 `.insomnia/workflow/<slug>.md` を優先する
- 旧配置 `.insomnia/memory/workflow/<slug>.md` も fallback として読む
- 同じ slug が両方にある場合は新配置を採用する
- 旧配置を読んだ場合、可能なら warning / notification / log のいずれかで migration hint を出す
旧配置の完全廃止は本チケットでは行わない。廃止が必要になったら別 ticket とする。
### linter / registry / completion
- Workflow linter は新配置を検査できる
- `requires` の Knowledge 参照検査は従来通り維持する
- `WorkflowRegistry` は source path として新旧どちらも保持できる
- `/<slug>` completion / invocation は新配置・旧配置の双方から読める
- resident workflow (`model_invokation: true`) の広告も新配置を対象にする
### memory state との分離
`.insomnia/memory/` は generated / session-derived state として扱い、Workflow は含めない。
推奨される layout:
```text
.insomnia/
manifest.toml
workflow/
auto-maintain.md
worktree-workflow.md
knowledge/
<slug>.md
memory/
summary.md
decisions/
requests/
_staging/
```
`.insomnia/.gitignore``memory` 丸ごと ignore ではなく、generated memory state のみを ignore する形にする。
例:
```gitignore
/memory/_staging/
/memory/summary.md
/memory/decisions/
/memory/requests/
```
### 既存ファイルの移行
workspace に既存 Workflow がある場合、新配置へ移す。
対象例:
```text
.insomnia/memory/workflow/auto-maintain.md
.insomnia/memory/workflow/worktree-workflow.md
```
移行後:
```text
.insomnia/workflow/auto-maintain.md
.insomnia/workflow/worktree-workflow.md
```
移行は Git 管理対象として扱えるようにする。
## 範囲外
- Workflow の自動生成ポリシー変更
- Workflow frontmatter schema の大幅変更
- Workflow DSL 化
- 旧配置の即時廃止
- memory tool で Workflow を書けるようにする変更
- 内部 Worker Workflow 化そのもの(`tickets/internal-worker-workflow.md` の対象)
## 完了条件
- Workflow の canonical path が `.insomnia/workflow/<slug>.md` として実装・文書化されている
- 既存の `.insomnia/memory/workflow/<slug>.md` も互換読み取りできる
- 新旧両方に同じ slug がある場合、新配置が優先される
- Workflow linter / loader / completion / invocation のテストが新配置をカバーしている
- `.insomnia/.gitignore` が generated memory state のみを ignore し、`.insomnia/workflow/*.md` を Git 管理できる
- この workspace の既存 Workflow が `.insomnia/workflow/` に移されている
- `docs/plan/workflow.md` や関連コメントが新配置に更新されている
## 参照
- `docs/plan/workflow.md`
- `crates/memory/src/workspace.rs`
- `crates/memory/src/workflow.rs`
- `crates/pod/src/workflow/mod.rs`
- `tickets/auto-maintain-workflow.md`
- `tickets/internal-worker-workflow.md`