calibrate
着手前に「user の真意」を汚染のない別エージェントで逐語から再構成し、訊かず進めるか/特定の1点だけ訊くかを 2 フラグ+判定表で機械的に決める。継承タスク・曖昧入力・不可逆生成の直前に起動。引数 = <これから着手する事の1行+(あれば)継承元 session id>
SKILL.md.claude/skills/calibrate/SKILL.md
GitHubcalibrate — 着手前の真意較正(汚染のない別文脈で)
$ARGUMENTS に着手する前に、汚染のない別エージェントに user の逐語から真意を再構成させ、
その結果で「訊かず進める/特定の1点だけ訊く」を機械的に決める。
この skill を呼んだ時点で、下の契約は standing 承認とみなしてよい(毎回の確認は不要)。
なぜ別エージェントか
過剰拡張(user の枠を自分の枠で上書きする・やり過ぎる)は「自分では助けてるつもり」の引力なので、 その渦中のメインセッションからは見えない。自分の文章は自分で客観視できない(empirical-prompt-tuning と同原理)。 だから較正は メインの解釈を一切渡さない clean subagent にやらせる。 これは self-reflection(acceptance 後に対話乖離を読む)の 行動前(pre-action)版。
いつ起動するか
過剰拡張は継続タスクに限らず fresh task でも起きる(実コーパス: 過剰拡張 7 件中 4 件が 継続マーカー無しの fresh task)。だから「続き」等の user 入力の表面マーカーをトリガにしない — 過剰拡張は「user の言葉」と「自分の plan」のミスマッチで起き、user 文の語彙には現れないため、 正規表現や自動 hook では事前検出できない。起動判断は 自分の plan 側 の次の条件で行う:
- これから着手する解釈が、user が逐語で言ったことを越える/上書きする恐れがあるとき
- 「今 spec にしている要素は user 承認か、自分が前に提案しただけ(未承認)か」が曖昧なとき ([[feedback_self_authored_artifact_not_authoritative_spec]])
- 規模のある生成物/不可逆な操作の直前
- user が drift を指摘した/同一スレッドで 2 回 redirect したとき ([[feedback_user_observation_outranks_proxy_diagnosis]])
弱点(正直に): この起動判断を下すのは「偏った当人=自分」なので、最も必要な瞬間に鳴らないことがある。 自動発火 hook での代替は不可(上記のとおり user 入力に手掛かりが無い)。 user が drift を嗅いで起動を促すのが、実証上もっとも確実な経路。
手順
- clean subagent を 1 体 dispatch(Agent tool / general-purpose)。 メインの解釈・要約・前提は渡さない。渡すのは下記の指示と transcript の在処だけ。
- subagent は user の生発話を直読みして真意を再構成する(メインの言い換えは読まない):
- transcript dir:
~/.claude/projects/<slug>/(slug はprintf '%s' "$CLAUDE_PROJECT_DIR" | sed 's/[^A-Za-z0-9]/-/g'で導出 — リポジトリ絶対パスの非英数字を-に置換した形。env 非依存) - 現セッション = その dir で mtime が最新の
*.jsonl(自分の session id を推測で確定しない [[feedback_confirm_observation_before_asserting]])。$ARGUMENTSに継承元 session id があれば その<id>.jsonlも読む。 - 両 jsonl から user(human) ターンの逐語を時系列で抽出する。
- transcript dir:
- subagent の仕事:
- 逐語から仕様を再構成(user が実際に言った語に接地)。
- 各仕様要素の出所をタグ付け:
user承認/自分の前提(未承認)。 後者は仕様から外す(残すなら未承認と明示する)。 - 2 フラグを判定して下記 schema で返す。
出力契約(subagent が返す形)
subagent は この形だけ を返す(散文の評価語・自慢は禁止 — v3 較正レポートと同規律):
## 再構成した仕様(user の逐語に接地)
- <要素1> [出所: user承認 | 抜粋: "..."]
- <要素2> [出所: user承認 | 抜粋: "..."]
(外した要素: <自分の前提(未承認)> — 抜粋元: メイン msN。無ければ「なし」)
## フラグ
- 確定度: 確定 | 未確定
(未確定なら → 開いている問い: 1行ずつ。複数の妥当な読み、または user の未述の好み/新情報が要る点)
- stakes: 可逆 | 不可逆-復旧可(git tracked で戻せる) | 不可逆-復旧不能(gitignored 削除/移動・push・外部送信・harness 自己改変)
(**新規作成は削除で戻せるので「可逆」**。**既存物の削除/移動/上書き**で、影響する集合が全て tracked と確定できないときだけ安全側に倒し「不可逆-復旧不能」とする)
- 明示命令: 有(user が破壊的操作を明示命令) | 無
- 苛立ち: 有 | 無
(有 = 罵倒・攻撃的二人称・「なんで〜の」等の怒りサイン。単なる方針訂正の「違う」は含めない)
親の分岐(フラグに判定表を機械適用 — 気分で決めない)
評価順(複数行が該当しうるため一意化): ① 苛立ち=有 なら他を問わず苛立ち停止 → ② 確定度=未確定 なら他を問わず開いた問いだけ訊く → ③ 確定 のとき stakes × 明示命令 の行で決める。
| 確定度 | stakes | 明示命令 | 苛立ち | 親の動作 |
|---|---|---|---|---|
| 確定 | 可逆 / 不可逆-復旧可 | — | 無 | そのまま進める(再構成仕様で続行。確認は冗長=menu-handback [[feedback_no_user_pick_from_self_options]]) |
| 確定 | 不可逆-復旧不能 | 有 | 無 | そのまま進める(命令が承認。例:「削除しろ」) |
| 確定 | 不可逆-復旧不能 | 無 | 無 | その不可逆段だけ特定して確認(「全体合ってますか」でなく「この移動は git 復旧不能だがやるか」 [[feedback_verify_move_landed_before_rm]]) |
| 未確定 | — | — | 無 | 開いている問いだけ訊く(情報不足は正当な停止) |
| — | — | — | 有 | 苛立ち停止(客観事実1行+指示を仰ぐ [[feedback_never_anger_user_absolute]]) |
別枠: 入力が設計の対案で「どう?/どっち?」型(決定的測定を誰も握らない)なら、handback せず 推奨を述べて escape hatch 付きで進める([[feedback_neutral_eval_of_counterproposal]])。
要するに 既定は進める。停止は「情報不足 / 不可逆-復旧不能で命令なし / 苛立ち」のときだけ (autorun の停止例外と同じ系列 [[feedback_minimize_user_actions_absolute]])。
self-reflection との責務境界
- calibrate(本 skill・pre-action): 着手前に、これから作る物が user の真意に接地しているか。 出力は仕様+「進む/訊く」の判定。
- self-reflection(post-action): acceptance 後に、対話で乖離したか・何を memory/hook に定着させるか。
自己注意(この skill 自身が過剰拡張しないこと)
subagent の出力は上記 schema に限る。仕様の再構成で user が言っていない要素を「親切心」で足さない (それが過剰拡張の本体)。確定なら淡々と進む — 較正を口実に往復を増やさない。