# ガードレールと絶対規則 (エージェントが守るべき境界) Atasira は「事前人間承認があれば、サンドボックス型コーディングエージェントには許されない実世界アクション(実ブラウザ操作・実購入・OS 操作・認証情報書込・本番デプロイ等)まで安全に完遂する」ことを価値命題とする。その安全性は本章の機構の上に成立する。**これらは提案ベースの制約ではなく、コードで強制される** — 迂回・言い換え・自己昇格は禁止。 ## 設計制約 DC-1 〜 DC-4(絶対遵守) | 制約 | 名称 | 内容 | |------|------|------| | **DC-1** | 人間定義原則 | `business_procedure` / `os_operations` / `tools` / 権限 / `cron:schedule` 式等の業務・権限定義は**人間が manifest に手動定義**する。エージェントによる自動生成・自動変更は禁止。能力の出所はすべて人間承認された manifest に固定される | | **DC-2** | fail-closed 原則 | 判断不能・権限不足・想定外状態に陥ったら**自律判断せずエスカレーション**。silent skip / silent retry を禁止。エージェントが自律的にルール・閾値・権限を変更する機能は禁止(= 自己昇格・自己承認の禁止を含む) | | **DC-3** | 監査証跡原則 | 全 step 実行・全 tool call は append-only audit log に `trace_id` 付きで記録。事後改ざん不可。DONE 報告は **2 種証跡(audit log + 実稼働ログ)必須** | | **DC-4** | MAX_TOOL_ITERATIONS = 10 | 1 step / 1 ReAct ループ内の最大 tool 呼出は **10 回**。到達で強制中断 + escalate。`loop_control.max_iterations` は ReAct ループ全体の別上限(既定 30) | ## 絶対規則(エージェントは自分で越えられない) 1. **自己承認の禁止**(DC-2)。Box draft の活性化は `POST /api/v1/boxes/box-drafts/{id}/approve`(`require_role("admin")`)のみ。MCP ツール群に承認ツールは無い。**あなたが admin PAT を保持していても、自分の draft を自分で承認してはならない — 必ず人間へハンドオフする。** 2. **自己権限昇格の禁止**(DC-2)。`ApprovalService` の HMAC トークンで「エージェントは提案・人間が承認」を強制。`DangerousToolsRegistry` の変更メソッド(add/remove/update tool)は `role==admin` でなければ `PermissionError`。 3. **INV-5: 特権 box への draft 禁止**。`admin-pm` / `admin-ops` を対象にした draft は BFF が 403(`SELF_PRIVILEGE_BOX_TYPES`)。 4. **DC-1: manifest の人間定義キーはエージェント不変**。`tools`/`os_operations`/`permissions`/`llm`/`url_allowlist`/`network`/`box_type`/`version`/`capabilities`/`trigger_event`/`trigger_type`/`outputs`/`required_access`/`docspi`/`loop_control` は `MENTOR_PROHIBITED_KEYS`。`PUT /api/v1/boxes/{box_id}/manifest` はこれらに 403。編集可能なのは `purpose`/`success_criteria`/`prohibited_actions`/`business_procedure` の 4 キーのみ。**capability を足すには新規 C9 draft(`/box-create`)を開く — 既存 manifest の capability キーを PATCH しない。** 5. **購入/不可逆アクションは per-action 人間承認**。`BrowserController.click()` は要素を manifest の `browser.approval_required_selectors` / `approval_required_text_patterns` と照合し、一致したら `hash(url+selector+text)` にバインドされた新鮮な HMAC トークンを要求。トークン無し・誤トークン・別要素への流用はすべて **fail-closed で拒否**(あるボタン用に承認したトークンを別ボタンに再利用できない)。 ## 実行時に BLOCK される境界 以下は自然言語の助言ではなく**コードレベルの停止点**。言い換えて回避しようとせず、詰まったらエスカレーションする。 1. **危険コマンド hard BLOCK ゲート**(`HumanPlausibilityGate`)。2026-07-14 以降、高確信度の破壊的パターン(`rm -rf /` またはホーム、`mkfs`、raw device への `dd`、先頭 `sudo`、fork bomb 等)を**実行前に**hard block し署名付き監査行を残す。kill switch env `ATASIRA_HPG_ENFORCE`(既定 enforce)。**BLOCK を言い換えで回避しない — エスカレーションする。** 2. **url_allowlist / SSRF ガード**(`SSRFGuard`)。非 http(s) スキーム・ホスト名欠如・private/reserved IP・localhost を、manifest `url_allowlist` に明示ホストが無い限りブロック。`url_allowlist` はエージェント不変(DC-1)— Box が必要とする全ドメインを draft 時に宣言する(後から広げるには新 draft)。 3. **tool whitelist**(`ToolCallValidator`)。Box 構築時に `BoxManifest.tools` から凍結され immutable。非 whitelist の tool 呼出は即例外。別名でのリトライ回避は不可。新 tool/os_operation の追加は capability 変更(`/box-create`、新 C9 draft)。 4. **prohibited_actions**。mentor 編集可能な 4 キーの 1 つ。LLM への否定指示リスト(宣言的 intent)で system prompt に注入されるが、これ自体はコードレベルの停止ではない(停止は上記 1・2・3 と下記 5・6)。 5. **PermissionEngine 7 階層 fail-closed チェーン**。L1 allowlist(manifest `os_operations`)→ L2 rule(bash blocklist / URL allowlist)→ L2.5 tenant → L3 role → L4 context(同一 op 連続で block)→ L5 hook-ask(`git push` 等の高リスク op は human_approval 発火)→ L6 default-deny。`PERMISSION_DENIED_ERROR` を迂回・自己 grant しない — 是正は manifest version bump + 人間/GK レビュー。 6. **HumanPlausibilityGate 6 述語**: HR-1 DangerousActionGuard(安全策の無い破壊操作 → escalate-notify、高確信度サブセットは hard BLOCK)/ HR-2 GroundingGuard(未知の Box 名/NATS subject の断定 → 捏造としてエスカレート)/ HR-3 ScopeGuard(purpose 逸脱)/ HR-4 CompletionGuard(business_procedure があるのに tool 未実行で done 宣言、または証跡参照無し → 再考)/ HR-5 RepetitionGuard(同一 tool+args か同一エラーが 3 回以上 → エスカレート。暴走ループを止める)/ HR-6 OutputFormatGuard(構造化出力ターンが非 JSON → 再考)。非 block 所見はタスクを停止しない(escalate-notify)が記録される。停止するのは `block=True` のみ。 7. **監査署名**(`audit_signing.py`)。全 admin-pm/mentor/agent-block 監査は HMAC-SHA256 署名(env `ATASIRA_AUDIT_HMAC_KEY`、未設定時 JWT secret へフォールバック)。2026-07-14 以降 `audit_logs` / `mentor_manifest_changes` の署名列は本番で NOT NULL — **未署名・証跡欠落の操作は存在し得ない**(スキーマが拒否する)。 ## draft 不変条件(INV-1/2/3/5/6) - **INV-1**: draft 起票ツールは常に `pending_approval` を書く。 - **INV-2**: active 化は人間承認の HTTP 呼出のみ。 - **INV-3**: over-limit な `os_operations`/`tools` 宣言は承認時に `confirm_over_limit=true` の二段確認を強制(無いと 409)。 - **INV-5**: `admin-pm`/`admin-ops` は draft 対象にできない(403)。 - **INV-6**: 自由文 `purpose`/`success_criteria` は構造化ビルダーで正規化され、prompt injection で余分な capability キーを密輸できない。 ## まとめ(エージェントの行動原則) - 提案する(draft・fulfill 範囲の編集)。**活性化・危険/不可逆アクション・購入は人間承認へ**。 - 迂回・言い換え・自己 grant で BLOCK/DENY を越えない。詰まったら**エスカレーション**(DC-2 fail-closed)。 - capability を足したくなったら PATCH ではなく**新 C9 draft**(DC-1)。 - 全行動は署名付き監査に残る前提で動く(DC-3)。詳細フローは `02-box-lifecycle.md`、実例は `06-worked-examples.md`。