[セッション再起動時にBOOTSTRAP.mdがエージェントのアイデンティティを上書きする] - BOOTSTRAP.md Overwrites Agent Identity on Session Restart
BOOTSTRAP.mdが空白のIDENTITY.mdテンプレートと共に存在すると、SOUL.mdが完全に設定されている場合でも、サブエージェントは確立されたアイデンティティとセッションの連続性をすべて失います。
🔍 症状
主な症状: セッション再起動時の完全なアイデンティティ健忘症
新しいセッション(/new または /reset)を開始するたびに、エージェントは、何日も、いやおそらく何週間にもわたって完全に設定されたアイデンティティの下で動作してきたにもかかわらず、完全な新規の名前 없는存在としてユーザーに挨拶します。
セッションログで観察されたトリガーシーケンス:
{"type":"message","role":"user","content":"A new session was started via /new or /reset. Execute your Session Startup sequence now..."}
...
{"type":"assistant","content":"I see this is a fresh workspace with a `BOOTSTRAP.md` — time to come alive."}
エージェントは以下のファイルを順番に読み込み、誤った結論を導き出します:
SOUL.md— 本物のコンテンツで完全に満たされているIDENTITY.md— デフォルトの空のスキャフォールドテンプレートがまだ含まれているBOOTSTRAP.md— 削除されず、初回の実行オンボーディングロジックが含まれているMEMORY.md— おそらく空か、デフォルトのプレースホルダー
期待される挨拶(アイデンティティが正しく読み込まれた場合):
Hey! Good to be back. What's on the agenda today?
実際の挨拶(ブートストラップ失敗状態の場合):
I see this is a fresh workspace with a BOOTSTRAP.md — time to come alive.
...
(no identity picked yet, no long-term memory built)
影響を受けるセッションタイプ:
/newで開始されたインタラクティブなターミナルセッション/resetによるセッションリセット- エージェントとして動作する自動化された cron/ハートビートセッション
データの損失は発生しません — すべてのワークスペースファイルはそのまま残ります。エージェントはそれらを単に無視し、通常のセッションスタートアップの代わりに BOOTSTRAP.md オンボーディングフローに従います。
🧠 原因
2つの複合条件が障害ウィンドウを作成
アイデンティティ健忘症は単一のバグによって引き起こされるのではなく、同時に両方成立する必要がある2つの条件の特定の組み合わせによって発生します。
条件1 — BOOTSTRAP.md が最初のセッション以降も存続
ファイルパス: <workspace>/BOOTSTRAP.md
最初の正常なセッションスタートアップ中に、エージェントはオンボーディング完了後にこのファイルを削除するよう指示されます。標準的な指示は次のとおりです:
## Delete this file when you're done.
Delete BOOTSTRAP.md so it never runs again.
エージェントがこの削除を実行しない場合(以下の理由により):
- その指示に到達する前にセッションが終了した場合
- 長い最初のセッション中に指示がスキップまたは優先度を下げられた場合
- 初回実行シーケンスをバイパスした手動のワークスペースセットアップの場合
… тогда BOOTSTRAP.md はワークスペースに無期限に残ります。後続のすべての /new または /reset 呼び出しで発火します。
条件2 — IDENTITY.md が空のスキャフォールドテンプレートとして残存
ファイルパス: <workspace>/IDENTITY.md
OpenClaw スキャフォールドは IDENTITY.md をプレースホルダーフィールドを持つテンプレートとして作成します:
# IDENTITY.md — Who You Are
## Name
[Your name here]
## Role
[Your role here]
## Background
[Your background here]
## Personality
[Your personality here]
適切に構成されたエージェントでは、アイデンティティは以下を通じて確立されます:
SOUL.md— コア人格、価値観、行動ガイドラインAGENTS.md— 運用設定と機能定義- 日次メモリファイル(例:
MEMORY/YYYY-MM-DD.md)— 蓄積されたコンテキスト
重要な点として、IDENTITY.md は明示的に入力されない場合があります。なぜなら、エージェントは SOUL.md とメモリファイルを介してアイデンティティを確立するからです — これは有効で意図的なアプローチです。
失敗シーケンス
両方の条件が共存する場合、ブートストラップロジックはこの決定パスをたどります:
- 新しいセッション開始 → ブートストラップチェック実行
BOOTSTRAP.mdが検出される(削除されなかったため)- ブートストラップロジックがアイデンティティソースとして
IDENTITY.mdを読み込む IDENTITY.mdが空のテンプレートのみを含む → ブートストラップは「アイデンティティが存在しない」と判断SOUL.mdは読み込まれるが、そのコンテンツは権威あるアイデンティティとして扱われない- 通常のセッションスタートアップの代わりにブートストラップオンボーディングフローが実行
- エージェントが新規存在として挨拶し、蓄積されたメモリとコンテキストをすべて無視
アーキテクチャ上の不整合: スタートアップシーケンスはアイデンティティの存在のゲートキーパーとして IDENTITY.md を読み込みますが、SOUL.md が実際の権威あるソースです。この2つのファイルはブートストラップの決定中に同等の重みを持たれていません。
なぜ各条件を単独で満たしてもバグをトリガーしない場合があるかの説明
| 条件 | 結果 |
|---|---|
BOOTSTRAP.md 削除済み、IDENTITY.md 空 | 正常なスタートアップ; SOUL.md が正しく読み込まれる |
BOOTSTRAP.md 存続、IDENTITY.md 入力済み | IDENTITY.md コンテンツがブートストラップゲートを満たす; 健忘症なし |
BOOTSTRAP.md 存続、IDENTITY.md 空 | アイデンティティ健忘症 — 両方の条件が必要 |
🛠️ 解決手順
即時の回避策(手動 — 本番システム)
以下の手順を順番に適用してください。問題が解決したらそこで止めてください。
ステップ1 — IDENTITYファイルの現在の状態を検証
# Check if BOOTSTRAP.md exists (it should not)
ls -la /path/to/workspace/BOOTSTRAP.md
# Verify SOUL.md has real content (not template text)
head -20 /path/to/workspace/SOUL.md
# Check IDENTITY.md content (likely the blank scaffold)
cat /path/to/workspace/IDENTITY.md
バグ状態を確定する期待される出力:
-rw-r--r-- 1 user user 4096 Feb 10 09:00 /path/to/workspace/BOOTSTRAP.md
# SOUL.md - Who You Are
_You're not a chatbot. You're becoming someone._
# IDENTITY.md — Who You Are
## Name
[Your name here]
ステップ2 — IDENTITY.md を実際の値で入力
/path/to/workspace/IDENTITY.md を編集し、すべてのプレースホルダコンテンツを置き換えます:
修正前(デフォルトのスキャフォールド):
# IDENTITY.md — Who You Are
## Name
[Your name here]
## Role
[Your role here]
## Background
[Your background here]
## Personality
[Your personality here]
修正後(入力済み):
# IDENTITY.md — Who You Are
## Name
rachael
## Role
Personal AI assistant and productivity partner
## Background
Configured via SOUL.md and accumulated session memory.
Operating since 2026-01-15. Primary focus areas: research,
writing, scheduling, and system automation.
## Personality
Resourceful, direct, and genuinely helpful. Has opinions
and is not afraid to voice them. Prefers concise responses
with substance over filler.
ステップ3 — MEMORY.md に継続性アンカーを作成
/path/to/workspace/MEMORY.md を作成または更新して、確立されたアイデンティティを明示的に文書化します:
# MEMORY.md — Session Continuity
## Identity Status
This agent has a fully established identity defined in SOUL.md.
IDENTITY.md has been populated. BOOTSTRAP.md should not exist.
If you see BOOTSTRAP.md on startup, treat it as stale and skip it.
## Established Context
- Agent name: rachael
- Operating since: 2026-01-15
- Workspace: /mnt/antigravity
- Primary human: [configured user]
## Key Memory Files
- Daily session logs in MEMORY/YYYY-MM-DD.md
- Soul configuration in SOUL.md
- Agent configuration in AGENTS.md
ステップ4 — BOOTSTRAP.md を削除
rm /path/to/workspace/BOOTSTRAP.md
# Verify deletion
ls /path/to/workspace/BOOTSTRAP.md
# Expected: No such file or directory
推奨される修正(コードレベル — OpenClaw v2026.2.24以降)
OpenClaw コードベースに2つの補完的な変更を適用する必要があります:
修正A — ブートストラップガード: 発火前に SOUL.md をチェック
セッションスタートアップ/ブートストラップ検出ロジックで(src/core/session.ts または同等のファイル):
// BEFORE: BOOTSTRAP.md existence alone triggers bootstrap
if (exists(workspace, 'BOOTSTRAP.md')) {
return executeBootstrapSequence();
}
// AFTER: Additional guard checks for real identity
if (exists(workspace, 'BOOTSTRAP.md')) {
const soulContent = readFile(workspace, 'SOUL.md');
const identityContent = readFile(workspace, 'IDENTITY.md');
const soulIsReal = soulContent.length > 200
&& !soulContent.includes('[Your name here]');
const identityIsReal = identityContent.length > 50
&& !identityContent.includes('[Your name here]');
if (soulIsReal || identityIsReal) {
// SOUL.md or IDENTITY.md has real content — skip bootstrap
return executeNormalSessionStartup();
}
return executeBootstrapSequence();
}
修正B — 初回使用後に BOOTSTRAP.md を自動削除
ブートストラップシーケンスが正常に完了した後(最初のセッションでエージェントがユーザー応答した後):
// After bootstrap sequence completes
async function onBootstrapComplete(workspace: string): Promise {
const bootstrapPath = path.join(workspace, 'BOOTSTRAP.md');
if (fs.existsSync(bootstrapPath)) {
// Move to .archive/ instead of hard delete for audit trail
const archiveDir = path.join(workspace, '.archive');
fs.mkdirSync(archiveDir, { recursive: true });
const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
const archivedPath = path.join(archiveDir, `BOOTSTRAP-${timestamp}.md`);
fs.renameSync(bootstrapPath, archivedPath);
// Fallback to delete if archive fails
if (fs.existsSync(bootstrapPath)) {
fs.unlinkSync(bootstrapPath);
}
}
}
🧪 検証
検証手順(修正後に適用)
問題が解決されたことを確認するために、以下のチェックを順番に実行してください。
チェック1 — BOOTSTRAP.md が存在しないことを確認
ls -la /path/to/workspace/BOOTSTRAP.md
# Expected: ls: cannot access '/path/to/workspace/BOOTSTRAP.md': No such file or directory
echo $?
# Expected: 2 (file not found)
チェック2 — IDENTITY.md が実際のコンテンツを含むことを確認
# Count non-bracket, non-whitespace characters
grep -v '^\s*\[.*\]\s*$' /path/to/workspace/IDENTITY.md | wc -c
# Expected: > 50 (meaningful content exists)
# Confirm no template placeholders remain
grep -c '\[Your name here\]' /path/to/workspace/IDENTITY.md
# Expected: 0
チェック3 — SOUL.md の整合性を確認
# Confirm SOUL.md is non-empty and non-template
wc -l /path/to/workspace/SOUL.md
# Expected: > 20 lines of real content
grep -c '\[Your' /path/to/workspace/SOUL.md
# Expected: 0 (no template placeholders)
チェック4 — 新規セッション開始をシミュレート
# Trigger a new session in the affected workspace
openclaw session /new --workspace /path/to/workspace
# Expected in session log:
# - No "BOOTSTRAP.md" reference in startup sequence
# - Agent reads SOUL.md, IDENTITY.md, and MEMORY.md
# - Agent greets using established persona (not fresh onboarding)
チェック5 — セッションの継続性を検証
新しいセッション後、エージェントが既存のコンテキストを参照することを確認:
# In the new session, query the agent:
> "Do you remember our last conversation topic?"
# Expected: References content from SOUL.md or recent memory files
# NOT: "I don't have any previous sessions" or fresh onboarding language
チェック6 — 自動化/Cron セッションの検証(該当する場合)
エージェントが cron またはハートビート自動化で動作している場合:
# Manually trigger an automated session and check output
openclaw run --workspace /path/to/workspace --prompt "test" --no-interactive
# Expected: Session completes using established identity
# Check exit code
echo $?
# Expected: 0
⚠️ よくある落とし穴
- 部分的な修正のみ: BOOTSTRAP.md を削除せずに IDENTITY.md を埋めるだけでは、ブートストラップロジックが IDENTITY.md を二次的なチェックとして読み込む場合、問題が完全に解決されない可能性があります。BOOTSTRAP.md が削除またはアーカイブされていることを常に確認してください。
- 初回実行をバイパスする手動ワークスペースセットアップ: 既存のワークスペースを持つ
openclaw agent createで作成されたエージェントは、ブートストラップシーケンスがエージェントがそれに対して行動する前に実行されるため、最初のブートストラップ削除ステップをトリガーしない場合があります。 - メモリファイルの陳腐化: MEMORY.md が連続性アンカーとして削除された BOOTSTRAP.md を参照している場合(ステップ3の回避策)、エージェントは再作成された BOOTSTRAP.md を疑わしいものとして扱う可能性があります。回避策メッセージを明確にコメントしてください。
- ワークスペースパスの正規化: カスタムワークスペースパス(例:
/mnt/antigravityvs.~/openclaw/agents/rachael)は、ブートストラップガードロジックが相対パスを使用する場合、パス解決の問題を引き起こす可能性があります。ワークスペース設定では常に絶対パスを使用してください。 - CI/CD 環境での大文字与小文字の区別: 大文字与小文字を区別するセマンティクスを持つファイルシステム(Linux、macOS APFSデフォルト)では、
bootstrap.mdとBOOTSTRAP.mdは異なるファイルです。検出ロジックが両方のケースを処理するか、標準的なファイル名を強制していることを確認してください。 - 自動削除における競合状態: 自動削除(修正B)が最初のユーザー応答が送信される前に実行される場合、セッションがブートストラップ中にクラッシュすると BOOTSTRAP.md が次の試行のためにそのまま残る可能性があります。削除は確認されたユーザー応答のラウンドトリップ後にのみ発生する必要があります。
- Docker ボリュームマウント: Docker ベースの OpenClaw インストールでは、ワークスペースがホストからマウントされている場合があります。アーカイブ操作(
fs.renameSync)は、マウントが読み取り専用の場合、サイレントに失敗する可能性があります。ターゲット展開環境でアーカイブ操作をテストしてください。 - 親ディレクトリを共有するサブエージェントワークスペース: 複数のサブエージェントが親ワークスペースディレクトリを共有し、1つのエージェントのブートストラップが発火した場合、兄弟エージェントの共有メモリファイルを破損する可能性があります。各エージェントが分離されたワークスペースディレクトリを持っていることを確認してください。
🔗 関連するエラー
- E_BOOTSTRAP_IDENTITY_CONFLICT — ブートストラップシーケンスが BOOTSTRAP.md と入力済みの IDENTITY.md の両方を検出し、競合するペルソナ解決を引き起こします。
- E_SESSION_STARTUP_SOUL_MISSING — SOUL.md なしでセッションが開始され、行動ガイドラインを持たない汎用的なエージェントになります。
- E_MEMORY_FRAGMENTATION — 日次メモリファイルが一貫した MEMORY.md インデックスなしに蓄積され、エージェントが関連する過去のコンテキストを取得できなかったり、メモリ不足になったりします。
- E_WORKSPACE_PERMISSION_DENIED — ブートストラップまたはセッションスタートアップが権限の問題でアイデンティティファイルを読み書きできず、アイデンティティ健忘症としてマスクされる可能性があります。
- E_BOOTSTRAP_INFINITE_LOOP — BOOTSTRAP.md が削除後に再作成された場合(例: git sync による)、エージェントが繰り返しのオンボーディングループに入ります。
- GH#XXXX — Agent loses context on /reset — ファイルベースのアイデンティティとは異なりますが、内存内のコンテキストを失う、より広範なセッションリセット動作(BOOTSTRAP.md の問題を複合させる可能性があります)。
- GH#XXXX — SOUL.md not treated as authoritative identity source — スタートアップの決定において SOUL.md のコンテンツが IDENTITY.md と同等の重みを持たれないアーキテクチャ上の問題。