1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ソロ運用 9ヶ月で構築した「8層 Validator」と、AI 自動化を構造的に事故ゼロにした話

1
Posted at

はじめに

20歳の大学生が、Claude Code を使って AI 自動化システムを 9 ヶ月運用してきた中で構築した「8層 Validator」の話を書きます。

最初に断っておくと、ここで紹介するパターンの大半は新規研究ではありません。形式検証 / コードレビュー / TDD など、既知の原則を AI 出力に適用しただけです。

新しいのは「個人が AI 自動化を本番運用する時、これくらいの層を持っていないと事故る」という体感値の方です。9 ヶ月の運用で実際に踏んだ事故 4 件と、それを構造的に防ぐ層別設計を共有します。

結論(先に出す)

名称 主検査
0 Typography 誤字脱字・末尾形
1 地雷ワード NG ワード正規表現
2 プレースホルダ {{xxx}} 残留検出
3 重複送信 append-only ログとの照合
4 brand_guard マッチョ煽り検出
5 sanity 文字数・無償オファー禁止
6 reflection_preamble 過去失敗教訓注入
8 secrets_leak API key / 個人情報検出
9 sender_pattern_audit 副作用前 Inbox/Atomic ガード(静的検査)

各層は単一責務で fail-closed。1 層でも error なら送信/公開を停止します。

4 件の事故と、それぞれが生んだ層

事故 1:同じメッセージを 4 回送ってしまった(→ Layer 3 + 9 が誕生)

ある日、取引先に同じ提案メッセージが 4 通送信されました。原因は wrapper script の auto-restart loop。crash 復帰時に副作用前のガードが無く、同一メッセージで再送が発火しました。

構造解

  • append-only proposals_log で「送信済 messageId」を記録
  • send 直前に has(messageId) チェック → skip if seen
  • file ベースの Inbox Pattern(DB 不要・crash 安全)
const inbox = require('./inbox');
if (inbox.has(messageId)) return;  // skip
await sendMessage(...);
inbox.commit(messageId);

これが Layer 3(重複送信検査)の起点です。さらに、新規 sender 追加時に Inbox 統合を機械検査する Layer 9 sender_pattern_audit を追加しました。

事故 2:プレースホルダ {{client_name}} がそのまま送信された(→ Layer 2)

テンプレベース提案文の {{client_name}} を埋め忘れて submit。クライアント体験として最悪。

構造解

  • 送信前に {{[a-z_]+}} regex 検出
  • XXX TODO [ここ埋める] 等の典型プレースホルダも対象
  • 検出時は draft を failed/ 退避 + LINE 通知

事故 3:「劇的に効果!」「絶対成功!」が混じった(→ Layer 4 brand_guard)

LLM が「響きの良いコピー」として煽り訴求を生成 → 自分のブランド方針(等身大・透明性)に反する。

構造解

  • NG 語辞書("劇的" / "圧倒_的" / "No.1" / "絶対" / "完全自動" / "革命" / "必ず..." 等の煽り表現)を separate file 化
  • 検出時 error severity → 送信停止
  • 辞書は editable な txt/json で運用(prompt に埋めない)

事故 4:API トークンがエラー output に丸出し(→ Layer 8 拡張)

健全性チェックスクリプト v1 で curl エラー時に command line に含まれた API トークン全文が console に表示されました。幸い外部公開には到達せず。

構造解

  • secrets_leak_validator (Layer 8) に regex 追加:API token / OAuth secret / Webhook secret 全種
  • 全エラーログに sanitize 処理:[REDACTED]
  • 過去公開コンテンツの後追い scan も実施

設計原則 3 点

1. Cheap regex first → LLM judge last

Layer 0-3 と 8 の Stage A は正規表現・速い・コスト低。Layer 4-6 と 8 Stage B が LLM 呼出し。実測で Layer 0+4 chain は 0.6ms 以内。LLM judge は 100ms 〜 数秒。順序が重要。

2. Fail-closed

1 層でも error なら停止。warn-only 化は禁止(自己評価盛りで漏洩許容に緩和されるリスク)。

3. Generator と Validator は別エージェント

同モデル self-check は agreement bias の論文証明あり。Generator が Sonnet なら Validator は Haiku、もしくは別 prompt persona で動かす。

全体の参照

このパターン群は「Arena Blueprint」に Module 4(Validator)+ Module 8(Generator+Validator 原則)として整理しました。

終わりに

書いてある内容の大半は新規ではなく、9 ヶ月の運用で「これがないと事故る」と分かった層を整理しただけです。導入には初期設定・調整・運用が必要で、簡単ではありません。

ただ、4 件の事故を踏まずに済む可能性があるなら、それだけで価値があるはずです。

参考にしていただければ嬉しいです。

— pikuto / AI Hack Lab

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?