Stage 1-B3 完了報告¶
結論¶
- ✅ Task A:パイロット symlink を実 dir にロールバック(3 経路ハッシュ一致確認)
- ✅ Task B-1:auto-snapshot.sh / KUDO-Vault git / バックアップマップ / 機密スキャン 完了
- ✅ Task B-2:設計確定(Cloud mirror
--exclude='kudo-*'/ git-backup = GitHub private repo (HTTPS)) - ✅ Task B-3:auto-snapshot.sh 修正+ .gitignore 補強+ git remote 設定+初回 push 完了
- ✅ Task C:全検証クリア(exit 0 完走 / 機密パス非含有 / kudo-* 47 件揃い)
- ⚠️ セキュリティ事案 1 件:push 認証時に工藤さんが PAT を誤って shell プロンプトに貼り付け(チャットにも露出)→ 即時 revoke 対応で漏洩リスク遮断
Task A:パイロット即ロールバック¶
復元手順実行¶
# 事前確認(Vault 最新と Drive pre-pilot dir のバイト一致確認)
shasum Vault/kudo-mac-health-check/SKILL.md → 521ad1f1...
shasum Drive/kudo-mac-health-check/SKILL.md → 521ad1f1...
✅ 一致(復元元として Drive 使用 OK)
# 実行
rm $PLUGIN/kudo-mac-health-check # symlink 削除
cp -pR $DRIVE/kudo-mac-health-check $PLUGIN/ # 実 dir 復元
復元後の確認¶
| 確認項目 | 結果 |
|---|---|
| skills-plugin 配下 type | ✅ Directory(symlink ではない) |
| SKILL.md hash | ✅ 521ad1f1d1a6958affe30876916c91f33dde2b84(パイロット時と同じ) |
| 3 経路ハッシュ一致 | ✅ Vault / plugin / Drive すべて一致 |
| manifest entry | ✅ enabled=True、updatedAt 不変、desc_len=517 |
.bak.2026-05-18 の扱い |
Code 判断で手動削除(cloud-sync の野良 dir 掃除で混乱を避けるため) |
Task A 完了時刻¶
2026-05-20 05:33 JST
Task B-1:現状調査結果¶
auto-snapshot.sh の構造¶
$SRC=~/Library/Application Support/Claude/local-agent-mode-sessions/skills-plugin/.../skills/$CLOUD_DST=~/Library/CloudStorage/.../working/claude/kudo-skill-sync/skills$SRCには kudo- 46 件 + 非 kudo- 10 件(brand-guidelines, docx, pdf, pptx 等 Anthropic 純正バンドル)が混在- Stage 1-B+ 適用済み:Cloud mirror から
--delete除去、porcelain をsnapshots/スコープに限定 - Local snapshot(line 23)の
--deleteは維持
KUDO-Vault git 状態(修正前)¶
- ✅ git init 済み、master branch、7 commits(Stage 1-B Phase 1 まで)、66 files tracked、working tree clean
- ❌ remote 未設定(バックアップ皆無 — Stage 1-D 申し送り事項だった)
- git ユーザー:local config 未設定(system-wide 自動推定の
工藤拓真 <kudotakuma@kudoutakushinnoMacBook-Pro.local>で commit されていた)
KUDO-Vault 客先機密スキャン¶
4 パターンでフルスキャン実施:
| Pattern | hit | 評価 |
|---|---|---|
| A: 一般機密用語(機密/契約書/confidential /秘密 /API Key/password) | 7 ファイル | すべてメタ言及・運用ルール。客先機密の実体ゼロ |
| B: クレデンシャル形式(Bearer 実 token/ghp_/sk-/PEM marker) | 0 | 実値含まれず(<API_KEY> 等の template 記法のみ) |
| C: クライアント名候補 | dof 18 / DUNK 6 / ロート 1 / 中村七之助 1 / 歌舞伎 3 / Wine Burgundy 4 / Smoked Navy 2 | dof / DUNK は取引先名と推定。Chat 判断で (A) このまま push 採用 |
| D: 案件コード形式 | 0 | 実コードなし |
バックアップマップ(修正前 → 修正後)¶
| 対象 | 修正前 | 修正後 |
|---|---|---|
~/.claude/skills/ |
symlink → Vault(OK) | 変更なし |
| skills-plugin | Anthropic cloud-sync(OK) | 変更なし |
Drive kudo-skill-sync/skills/ |
rsync で skills-plugin 全件ミラー | rsync で skills-plugin の非 kudo-* のみミラー |
| local snapshots/{date}/ | git snapshot(OK) | 変更なし |
| KUDO-Vault 全体 | ★ バックアップ皆無 | ★ GitHub private repo へ git push |
Task B-2:設計確定¶
Chat 提案通り:
- Cloud mirror に
--exclude='kudo-*':rsync の symlink unlinkat エラーを構造的に消す - KUDO-Vault → GitHub private repo(HTTPS):git remote push でバックアップ
- HTTPS 方式採用:SSH 鍵未設定(
~/.ssh/に鍵なし)、osxkeychain credential helper は有効
設計判断の根拠(HANDOFF §7 通り)¶
選択肢 a(rsync -L)却下/c(手動 cp)却下/d(plugin 側を push 先に)保留/b(git-backup)採用。git は symlink を mode 120000 で正しく記録、Stage 1-D 予定の「Vault バックアップ経路設計」を前倒し解決。
Task B-3:実装内容¶
1. auto-snapshot.sh 修正(--bak.2026-05-20 退避)¶
@@ Line 52(修正前) @@
- rsync -a --exclude=".DS_Store" --exclude="__pycache__/" "$SRC/" "$CLOUD_DST/" 2>&1 | tee -a "$LOG"
+ # kudo-* は KUDO-Vault git remote backup に切替(Stage 1-B3, 2026-05-20)
+ # rsync は symlink(kudo-*) を Drive 既存実dir に上書きできず unlinkat エラーになる。
+ # symlink バックアップは git に委ねる(git は mode 120000 で symlink を正しく記録)。
+ rsync -a --exclude=".DS_Store" --exclude="__pycache__/" --exclude="kudo-*" "$SRC/" "$CLOUD_DST/" 2>&1 | tee -a "$LOG"
2. .gitignore 補強(commit 86b6216)¶
+# Obsidian internals — workspace.json, plugin data.json (contains API keys / TLS keys)
.obsidian/
+
+# Env / credentials
.env
+.env*
+
+# Keys & certs
*.key
+*.pem
*.crt
+*.token
+*.secret
+
+# OS / editor artifacts
.DS_Store
+._*
+.AppleDouble
+Thumbs.db
git check-ignore で .obsidian/plugins/.../data.json/.env.local/server.pem/._test 全て matched 確認済み。
3. git remote 設定 + 初回 push¶
cd ~/KUDO-Vault
git config user.email "kudotakuma421@gmail.com" # local scope
git config user.name "kudotakuma"
git remote add origin https://github.com/kudotakuma/KUDO-Vault.git
# push は工藤さん Terminal から実施(osxkeychain 対話のため)
git push -u origin master # ← 工藤さん Terminal で実行
8 commits push 成功(ede241a → 86b6216)。
4. PAT 漏洩事案(実装中に発生 → 即対処)¶
工藤さんが Password プロンプトで誤って本物パスワードを入れ→失敗→shell プロンプトに PAT を貼り付けてしまった。チャットおよびスクリーンショットに PAT が露出。
対処:
- 漏洩 PAT を即時 revoke(GitHub Settings → Personal access tokens → Delete)
- 新 PAT 生成(同じ repo scope)
- ローカル zsh_history 確認 → grep hit 0(zsh の default で履歴記録回避済みだった)
- Code session log には残るが、Anthropic サーバとも対称的に存在するためローカル削除の実質効果なし。PAT revoke が根本対策で完了
- 新 PAT で push 再試行 → 成功
Task C:検証結果¶
C-1. auto-snapshot.sh 修正検証(kickstart × 2 連続)¶
1 回目 kickstart:
===== Snapshot 2026-05-19T21:04:35Z =====
Committed snapshot 2026-05-20
━━━ Cloud mirror to GoogleDrive ━━━
Cloud mirror 2026-05-20 → /Users/kudotakuma/Library/CloudStorage/.../skills
last exit code = 0 ✅
2 回目 kickstart(同日空回り検証):
===== Snapshot 2026-05-19T21:05:23Z =====
No changes since last snapshot ← A-2 修復継続
Cloud mirror 2026-05-20 → ...
last exit code = 0 ✅
| 確認項目 | 結果 |
|---|---|
| Cloud mirror exit 0 完走 | ✅ 判定 B の exit 23 解消 |
kudo-* が Cloud mirror 対象外(--exclude 効いている) |
✅ Drive 側で kudo-* touch なし |
| Drive 側で削除・破損なし | ✅ kudo-mac-health-check 実 dir 維持 |
| 同日 2 回 kickstart で空回りしない(Stage 1-B+ 修復継続) | ✅ |
| 非 kudo-* 10 件は Drive にミラー継続 | ✅ brand-guidelines, docx 等そのまま |
C-2. git push 検証(local == remote)¶
| 確認項目 | 結果 |
|---|---|
| push 成功 | ✅(工藤さん Terminal 経由、新 PAT で完遂) |
.obsidian/ が tracked にない |
✅ git ls-files hit 0 |
data.json が tracked にない |
✅ API Key + TLS 秘密鍵を git に上げず |
| 漏洩 PAT 文字列が tracked にない | ✅ git grep hit 0 |
| kudo-* 47 件すべて real file として tracked | ✅ |
| SKILL.md 47 件 tracked | ✅ |
| 全 tracked file mode 内訳 | 100644: 65 件/160000 (gitlink: obsidian-skills): 1 件/120000 (symlink): 0 件 |
| 総 tracked file 数 | 66 |
| Push 済み commits | 8(ede241a → 86b6216) |
C-3. clone テスト¶
private repo のため Code(非 TTY 環境)からの clone は認証不能。ローカル完全検証で代替(local == remote 確実)。
工藤さんがいつでも別マシン or 別 dir で git clone https://github.com/kudotakuma/KUDO-Vault.git を試せば、symlink 不在で全コンテンツが復元される(実 dir のため)。obsidian-skills は gitlink のため別途 git submodule update --init 等の操作が必要(Stage 0 完了報告で既知)。
C-4. アーキテクチャ補正:HANDOFF と実態のズレ¶
HANDOFF §3.3 は「remote に symlink 群(kudo-)が symlink として正しく記録されている」と想定。実際の Vault は kudo- を実 dir として保持(Stage 1-B Phase 1 で rsync コピーした結果)。
→ これは git-backup として望ましい状態: - 別マシンで clone しても、symlink target がそのマシンに存在しない問題が起きない - 実 SKILL.md コンテンツが直接読める - 復元・再構築が確実
symlink は Vault 外(~/.claude/skills/ → Vault)の方に存在し、これは git 管轄外。
kudo-skill-tree-ssot-map の生存確認(Stage 1-B+ 最終確認)¶
| 時点 | Drive kudo-skill-tree-ssot-map/SKILL.md 状態 |
|---|---|
| 2026-05-18 12:09:55Z(FDA 初回 auto-snapshot) | ★削除されていた(判定 B 発覚契機) |
| 2026-05-18 Stage 1-B+ 修復後 | ✅ Drive に復元 (55419 bytes) |
| 2026-05-19 朝 / 夜 cron は Mac off で未発火 | 観察不能 |
| 2026-05-20 04:57 手動 kickstart(pilot 状態下) | ✅ 生存(rsync エラーで Drive 側非更新だったため副作用的に保護) |
2026-05-20 06:04 手動 kickstart(Stage 1-B3 修正後・--exclude='kudo-*' 適用) |
✅ 生存(55419 bytes、mtime May 18 20:52 維持) |
| 2026-05-21 03:30 daily cron 通過後 | ★申し送り:次回 cron 自然発火後に再確認 |
Stage 1-B+ の --delete 除去修復は実質クローズ。さらに今回の --exclude='kudo-*' 追加で、kudo-skill-tree-ssot-map(kudo-* 名)は cloud mirror 経路から構造的に切り離された。Drive 上の存在は regenerate_ssot_map.py が日曜 03:00 に書く際の出力にのみ依存。
実装中に発見した新たな問題(記録のみ・修正未実施)¶
問題 1:PAT 漏洩事案(既述・処理済)¶
工藤さんの操作ミスで PAT が shell プロンプトに貼り付き、チャット・スクリーンショットに露出。
処理済: - 漏洩 PAT を即時 revoke - 新 PAT で push 完了 - zsh_history への記録は確認上ゼロ - Code session log には残るが PAT 自体が無効化されたため実害なし
申し送り(次セッションでスキル化検討):
- kudo-ai-error-watchlist に Entry 追加:「PAT/credential 値は絶対に shell プロンプトや AI チャットに貼り付けない。Password プロンプトのみが正しい貼付先」
- 認証フロー誤りの典型パターンとして記録
問題 2:Code 経由の git push 不可(非 TTY)¶
Code の bash subprocess から git push を実行すると Device not configured で auth 失敗。osxkeychain GUI ダイアログも Code subprocess には届かず。
回避策:初回 push は工藤さん Terminal から実行(今回採用)。一度 keychain に保存されれば、以降の non-interactive push 可能性は未検証(Code subprocess から ssh credentials inherit するかは別問題)。
申し送り:将来 auto-snapshot.sh 末尾に git -C ~/KUDO-Vault push を追加して日次自動化する場合、launchd 環境から credentials アクセスできるかは事前検証必要。
問題 3:HANDOFF と実態のズレ(symlink の所在)¶
HANDOFF §3.3 は Vault 内 kudo- を symlink と想定していたが、実態は実 dir。Code 検証で発覚し、より望ましい状態と確認*。今後の HANDOFF 起票時に Vault のアーキテクチャ実態を Chat 側で正確に把握してほしい。
工藤さん・Chat への申し送り¶
1. 工藤さんへ:3 条件の確認依頼(HANDOFF 4 工藤氏タスク + Chat 判断 §条件1-3)¶
条件 1:repo の public 化を構造的に防ぐ(視認のみ)¶
ブラウザで https://github.com/kudotakuma/KUDO-Vault/settings を開き、ページ最下部の Danger Zone → "Change repository visibility" の位置を 1 度視認してください。これは「誤操作位置の把握」目的で、何もクリックしないでください。private のままが正解。
条件 2:GitHub 2FA 有効化の確認¶
https://github.com/settings/security を開き、Two-factor authentication が Enabled になっているか確認。未有効なら有効化を推奨(push 認証自体は PAT 経由なので 2FA とは独立。アカウント保護のため)。
条件 3:将来の書き込み規律(Chat 側で次セッション以降に対応)¶
Vault に契約内容・提案の具体・金額・未公開戦略を書かないルールを kudo-shared-storage-protocol か新規スキルとして永続化。これは Code は手を入れず Chat 起票待ち。
2. Chat 側への判定材料(bulk symlink 化に進めるか?)¶
git-backup 方式が安定動作したか¶
- ✅ push 成功(8 commits)
- ✅ 機密パス完全除外(.obsidian/、data.json、PAT 文字列 すべて 0 hit)
- ✅ kudo-* 47 件が実 dir として復元可能形式で remote に存在
- ⚠️ clone 復元テストは未実施(private repo + Code 非 TTY のため)。工藤さんが任意のタイミングで別 dir に
git cloneテストすれば確証取れる - ⚠️ push 自動化(auto-snapshot.sh 末尾に組込)は未実装。当面手動 push 運用
46 件 bulk symlink 化に進める見込み¶
- パイロット 1 件で確認した「
--exclude='kudo-*'で Cloud mirror が exit 0 完走」は 46 件展開でも論理的に同じ効果(ワイルドカードマッチ) - bulk 展開時の追加考慮:
- 各 symlink 化で skills-plugin の元 dir を
.bak.YYYY-MM-DD退避すると、cloud-sync が 46 件分の野良 dir を掃除する(Stage 1-B2-R で実証済み) - bulk 化後の検証は 1 件パイロットより数十倍時間を要する
- 工藤さんの claude.ai web 操作で 46 件すべてが一斉に「Vault content として認識される」ことの web 側確認も必要
残る懸念・未検証事項¶
- clone 復元テスト未実施(symlink 無いので大きな問題ではないが、確証は別マシンで取りたい)
- next daily cron(2026-05-21 03:30)通過後の kudo-skill-tree-ssot-map 生存:自然発火を待って再確認
- push 自動化:当面 Code が手動 push する運用。工藤さんが Vault に大きく書き込んだ後の push 漏れリスク
3. 次の HANDOFF 起票時の推奨¶
Stage 1-B2-full(46 件 bulk symlink)または Stage 1-C(R23 改訂)のどちらに進むかは Chat 判断。
Code の所感: - Stage 1-C 先行を推奨。R23 改訂は Vault 内編集だけで完結し、git push 経路でバックアップ取れる。bulk symlink は「web 側からの読み」の問題が残るので、R23 改訂で Vault 内容を充実させてから bulk 化のほうが効果が見えやすい - ただし「Vault 内編集が web に届かない」状態が続くと工藤さんの違和感が大きい可能性もあり、Chat 判断
ファイル一覧¶
新規作成¶
~/working/_claude_workspace_global/reports/stage1b3-completion-2026-05-20.md(本ファイル)
変更¶
~/.claude/skills.git-mirror/auto-snapshot.sh(line 52 に--exclude="kudo-*"追加)- backup:
auto-snapshot.sh.bak.2026-05-20 ~/KUDO-Vault/.gitignore(commit86b6216:.env*/*.pem/*.token/*.secret/._*/.AppleDouble/Thumbs.db追加)~/KUDO-Vault/.git/config:remote origin 追加、user.email / user.name local scope 設定
状態変化¶
<plugin>/skills/kudo-mac-health-check:symlink → 実 dir(Task A ロールバック).bak.2026-05-18も同時削除- KUDO-Vault:8 commits を GitHub
kudotakuma/KUDO-Vaultprivate repo に push 完遂
変更なし¶
- Vault 内コンテンツ
- 他 45 kudo-* スキル(skills-plugin 側)
- 非 kudo-* 10 件
- Cloud-sync manifest
- WorkFlowy