コンテンツにスキップ

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 提案通り:

  1. Cloud mirror に --exclude='kudo-*':rsync の symlink unlinkat エラーを構造的に消す
  2. KUDO-Vault → GitHub private repo(HTTPS):git remote push でバックアップ
  3. 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.localserver.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 アクセスできるかは事前検証必要。

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 authenticationEnabled になっているか確認。未有効なら有効化を推奨(push 認証自体は PAT 経由なので 2FA とは独立。アカウント保護のため)。

条件 3:将来の書き込み規律(Chat 側で次セッション以降に対応)

Vault に契約内容・提案の具体・金額・未公開戦略を書かないルールを kudo-shared-storage-protocol か新規スキルとして永続化。これは Code は手を入れず Chat 起票待ち。

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 運用
  • パイロット 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(commit 86b6216.env**.pem*.token*.secret._*.AppleDoubleThumbs.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-Vault private repo に push 完遂

変更なし

  • Vault 内コンテンツ
  • 他 45 kudo-* スキル(skills-plugin 側)
  • 非 kudo-* 10 件
  • Cloud-sync manifest
  • WorkFlowy