安全設計
方針の機械可読版は policies/safety.yml。本書はその背景と運用を説明する。
大原則
- 通常の実行はテキスト成果物のみを生成する。write mode を明示したタスクでは、 人間の承認後に AI が working tree を直接変更できる。
- Git のチェックポイント、変更一覧、diff stat、巻き戻し方法を自動記録する。
- コミット、push、送信、公開、決済、本番反映など、変更の確定は人間が行う。
.env・鍵・認証情報は読ませず、保存する出力のシークレットをマスクする。
write mode の発火条件
次の全条件が揃った workflow step だけが書き込み可能になる。
- frontmatter の
write: true、CLI の--write、または Concierge のtask_draft.write: true - workflow step の
writes: true(makeworkflow の make step) - 実行前の y/n 承認。
--autoまたはproject.write_confirm: falseで省略可能 scope=public
scope が public でなければ確認画面で昇格を提案する。拒否された場合は write を無効化し、
従来のテキスト成果物モードで実行する。private / local-only では write より先に
外部 AI の利用を禁止する。
実装上のガード
| ガード | 実装 |
|---|---|
| 明示的な opt-in | タスク × step × 承認 × scope を純関数で合成 |
| Git 証跡 | 開始時の HEAD/status と終了時 status の差分を run-summary と decision-log に記録 |
| 巻き戻し | tracked file は git checkout -- <path>、untracked file は確認後に git clean |
| 読み込み拒否 | .env、鍵、credentials 等を forbidden_read で拒否 |
| 禁止対象の変更検知 | forbidden_write に一致した変更を事後検知し needs_human_review にする |
| シークレットマスク | redaction_patterns を保存前に適用 |
| 外部作用の禁止 | commit / push / publish / 送信 / 決済 / 本番反映は AI に行わせない |
runner ごとの信頼境界
- Codex: 通常は
read-only、write mode はworkspace-writeサンドボックス。 作業ディレクトリ外への書き込みを技術的に封じ込め、ネットワークは遮断したままにする。 - Claude: write mode では Bash / Edit / Write / NotebookEdit / KillShell を許可する。 Claude CLI の Bash は作業ディレクトリ外にも到達し得るため、技術的な完全封じ込めではない。 作業ディレクトリを守る指示への信頼と Git 証跡を境界とする。
- Antigravity / Ollama: write 非対応。write step の候補から除外して次候補へ進む。
- Mock: E2E 検証用に決定的なファイルを1つ作る。
Git 管理外でも警告して実行を続けるが、チェックポイントと Git による巻き戻しは使えない。
また forbidden_write は実行後の Git status に基づく事後検知であり、Claude を事前に
封じ込める仕組みではない。
人間が確定する操作
- AI が変更した working tree の確認とコミット
- メール送信、外部サービスへの投稿
- 決済、購入、契約
- 本番環境の変更、デプロイ、SSH
- git push、npm publish
- データやファイルの削除
- 個人情報・認証情報を含む処理の確定
write mode の approval-required.md には、git diff を確認し、問題なければ人間が
コミットする項目が必ず入る。
リスクとインシデント対応
write mode の risk は最低 medium に補正する。high、レビュー重大指摘、forbidden_write 検知時は needs_human_review にする。
問題が起きた場合は実行を中断し、decision-log.md のチェックポイントと変更一覧を確認する。
tracked file は git checkout -- <path> で戻す。untracked file は git clean -n で
対象を確認してから git clean -f を使う。原因が policy の穴なら safety.yml を更新する。