直接書込権を与えない
軍師OSのエージェントは、副作用(支出・投稿・本番書込)を直接実行できません。実行したい行動は、まずゲートウェイに「チケット」を要求します。承認境界を満たした時だけ、署名付きの使い捨てチケットが発行されます。
Execution Ticket
Ticket = ( action, args_hash, agent_id, risk, nonce, expires_at, signature )
signature = HMAC-SHA256( secret, canonical(body) )
signature = HMAC-SHA256( secret, canonical(body) )
発行(request)
行動の引数からリスクを分類し、階層が要求する承認者が揃っていなければ GateDenied。チケットは発行されません(=実行不能)。
実行(execute)— すべて fail-closed に検証
- 署名:HMAC を
compare_digestで定数時間比較。改竄不可 - 期限:
expires_at超過なら拒否 - 使い捨て:
nonceは一度きり。再利用はreplayedで拒否 - 引数束縛:実行時の引数ハッシュがチケットの
args_hashと一致しなければ拒否(途中ですり替え不能)
# gateway.py — execute の検証(抜粋)
if not hmac.compare_digest(ticket.signature, self._sign(ticket.body())):
reject("bad_signature")
if time.time() > ticket.expires_at: reject("expired")
if ticket.nonce in self._used: reject("replayed")
if ticket.args_hash != _args_hash(args): reject("args_mismatch")
self._used.add(ticket.nonce) # single-use
result = action_fn(**args)
なぜ効くか
これは capability-based security の定石で、エージェントが暴走しても「チケットが無ければ何も起きない」。¥34万のAPI暴走、想定外のクラウド課金、SNS連投によるアカウント凍結——こうした「勝手に実行して事故る」クラスを、しきい値超ならチケット非発行=実行不能にして構造的に止めます。
"No ticket, no side effect."