diff --git a/CLAUDE.md b/CLAUDE.md index 4a28aba..1f3ff21 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -2,14 +2,22 @@ 舌診研究のデータ(舌画像・ラベル・派生データ等)を研究室 PC で一元管理する共有データ基盤.舌診研究の各リポジトリ(TIASJudgeModel・TIASjudge・DeepTIAS 等)はこのリポジトリをサブモジュール/パッケージとして参照し,データセット名を指定してデータを取り出す. +- 技術スタック: Python 3.12・uv,目録は SQLite(標準 `sqlite3`)+ファイルのストア(SHA-256 名),実行時の依存は pydantic のみ.CLI `tiasdata`(argparse) +- 運用: 原本と目録は研究室 PC,学習は計算サーバ(Newton・Archimedes)へ版ごとのバンドルで渡す.開発は手元 PC(ダミーデータのみ) + ## 開発進捗 -最新: GUIDE_01 に従いプロジェクト立ち上げ中 +最新: プロジェクト立ち上げ完了.次は PLAN_02 Step 1(設定と目録の土台) ※ 本欄は**最新ステップ 1 行のみ上書き更新**.詳細な進捗履歴(動機・設計判断・失敗パターン)は [docs/PROGRESS.md](docs/PROGRESS.md) に追記する.運用ルールは `.claude/rules/progress-log.md` を参照(該当ファイル編集時に自動ロードされる). ## 必須ルール(コード実装時) - +### 臨床データの扱い(最重要) + +- データ本体・実際の患者 ID ↔ 研究用 ID の対応表をリポジトリに入れない.手元 PC に臨床データを置かない.リポジトリに置くのはスキーマ・ライブラリ・CLI・手順書・ダミーデータだけ(PLAN_01「制約」) +- Claude はデータの中身を読まない.研究室 PC は手元 PC から `ssh labpc` で操作し,SSH の先でデータの中身・ファイル一覧を表示しない(`.claude/rules/lab-pc-operation.md`.常時ロードされる) +- CLI の出力・ログ・例外メッセージには件数・研究用 ID・SHA-256・種類名・所見の値だけを出す(SPEC_03「出力の規則」) +- データの場所をコードに書かない.凍結した版・所見の行を書き換えない(`.claude/rules/coding-style.md`) ### Git 運用 @@ -67,7 +75,7 @@ - プロジェクト立ち上げフロー: docs/01_GUIDE/GUIDE_01_プロジェクト立ち上げフロー.md - エージェント運用ルール: docs/01_GUIDE/GUIDE_02_エージェント運用ルール.md - ※ Git 規約・ドキュメント書式・命名規則・進捗記録・テンプレート改変記録は `.claude/rules/`(git-conventions / markdown-style / docs-naming / progress-log / template-customization)に定義されている(git-conventions は常時,他は該当ファイル編集時に自動ロード) -- ※ コーディング規約,テスト方針等はプロジェクト立ち上げ時に path-scoped rules(`.claude/rules/`)として作成する(GUIDE_01 参照) +- ※ プロジェクト固有の規約は `.claude/rules/` の coding-style / project-structure / testing / error-handling(該当ファイル編集時に自動ロード)と lab-pc-operation(常時ロード) ### 02_ENV(環境) @@ -76,23 +84,17 @@ - 管理者用環境構築手順: docs/02_ENV/ENV_03_管理者用環境構築手順.md - 開発コマンド: docs/02_ENV/ENV_04_開発コマンド.md - - ### 03_PLAN(計画) - 要件定義書: docs/03_PLAN/PLAN_01_要件定義書.md - 開発ステップ: docs/03_PLAN/PLAN_02_開発ステップ.md - - ### 04_SPEC(仕様・設計) - アーキテクチャ設計: docs/04_SPEC/SPEC_01_アーキテクチャ設計.md - データモデル: docs/04_SPEC/SPEC_02_データモデル.md - データセットと受け渡し: docs/04_SPEC/SPEC_03_データセットと受け渡し.md - - ### 05_TECH(技術設計) diff --git "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index 4b944f9..ea2ab7f 100644 --- "a/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_02_\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -26,7 +26,6 @@ ```bash git clone https://github.com/rintoHasegawa/TIASDataHub.git cd TIASDataHub -git remote add nakaguchi https://git.nakaguchi.org/git/hasegawa/TIASDataHub.git uv sync uv run pytest ``` @@ -46,10 +45,10 @@ ## 研究室 PC のセットアップ (Lab PC Setup) -GitHub の認証情報は置かず,研究室の GitBucket から取得する.手元 PC から次のように実行する(uv は非対話の SSH では PATH に入らないため絶対パスで呼ぶ). +GitHub から取得する.研究室 PC には個人のアカウントの認証情報を置かず,このリポジトリ専用の**読み取り専用のデプロイキー**(SSH の別名 `github-tiasdatahub`)で取得する(設定は [ENV_03「研究室 PC のデプロイキー」](ENV_03_管理者用環境構築手順.md)).手元 PC から次のように実行する(uv は非対話の SSH では PATH に入らないため絶対パスで呼ぶ). ```bash -ssh -n labpc "cd C:\Users\Papin\source && git clone https://git.nakaguchi.org/git/hasegawa/TIASDataHub.git" +ssh -n labpc "cd C:\Users\Papin\source && git clone git@github-tiasdatahub:rintoHasegawa/TIASDataHub.git" ssh -n labpc "cd C:\Users\Papin\source\TIASDataHub && C:\Users\Papin\.local\bin\uv.exe sync --no-dev" ``` @@ -59,7 +58,8 @@ ssh -n labpc "cd C:\Users\Papin\source\TIASDataHub && git pull && C:\Users\Papin\.local\bin\uv.exe sync --no-dev" ``` -- ※ 未検証(GitBucket の `main` がまだ空のため.立ち上げの成果物を `main` に取り込み,`git push nakaguchi main` で反映した後に実行する) +- ※ clone・`uv sync` は未検証(立ち上げの成果物を `main` に取り込んだ後に実行する).デプロイキーでの接続(`git ls-remote`)は 2026-10-02 に確認済み +- 研究室 PC からは取得しかできない(デプロイキーは読み取り専用).研究室 PC では編集・push しない(上記「操作方針」) - 置き場所は `C:\Users\Papin\source\`(OneDrive の同期対象外).**ドキュメント・デスクトップ配下には置かない**(研究室 PC ではドキュメントフォルダが OneDrive にリダイレクトされている) - 目録・ストア・対応表は `C:\Users\Papin\clinical-data\tiasdata\`・`tiasdata-identity\` に置き,場所は設定ファイル `C:\Users\Papin\.config\tiasdata\config.toml` に書く(配置と設定のキーは [SPEC_01「配置」「設定ファイル」](../04_SPEC/SPEC_01_アーキテクチャ設計.md)).設定ファイルの作成と `tiasdata init` は実装後に行う ※ 未検証 diff --git "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" index c89bbe8..fb8a1be 100644 --- "a/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" +++ "b/docs/02_ENV/ENV_03_\347\256\241\347\220\206\350\200\205\347\224\250\347\222\260\345\242\203\346\247\213\347\257\211\346\211\213\351\240\206.md" @@ -29,17 +29,6 @@ ※ 依存バージョンの定期更新は `.github/dependabot.yml` で設定する(`uv`・`github-actions`.リポジトリ設定とは独立に動く). -## 研究室の GitBucket (Lab GitBucket) - -研究室の GitBucket に**コピー**を置く(メインは GitHub).リポジトリ `hasegawa/TIASDataHub` は作成済み. - -```bash -git remote add nakaguchi https://git.nakaguchi.org/git/hasegawa/TIASDataHub.git -``` - -- `main` にマージしたら `git push nakaguchi main` で反映する -- 研究室 PC は GitBucket から clone・pull する(GitHub の認証情報を研究室 PC に置かないため).研究室 PC から認証なしで `git ls-remote` できることを 2026-10-02 に確認した - ## 研究室 PC のツール導入 (Lab PC Tools) 2026-10-02 に手元 PC から SSH(`ssh labpc`)で実施.研究室 PC には `git` はあったが,`uv`・`gh` は無く,`python` は Microsoft Store の案内用スタブだけだった. @@ -52,11 +41,48 @@ - uv 0.12.22・Python 3.12.15 がユーザー領域(`C:\Users\Papin\.local\bin`・`C:\Users\Papin\AppData\Roaming\uv\python\`)に入った.管理者権限は不要 - `gh` は入れない(研究室 PC では編集・コミットしない) +## 研究室 PC のデプロイキー (Lab PC Deploy Key) + +研究室 PC が GitHub(Private)から取得するため,このリポジトリ専用の**読み取り専用のデプロイキー**を使う(個人のアカウントの認証情報を研究室 PC に置かないため).2026-10-02 に手元 PC から SSH で実施. + +1. 研究室 PC で鍵を作る(パスフレーズなし) + + ```bash + ssh -n labpc 'ssh-keygen -q -t ed25519 -f C:\Users\Papin\.ssh\id_ed25519_tiasdatahub -N "" -C papin-DESKTOP-1QLOO91-TIASDataHub-deploy' + ``` + +2. 公開鍵をデプロイキーとして登録する(手元 PC の `gh`.既定で読み取り専用) + + ```bash + ssh -n labpc 'type C:\Users\Papin\.ssh\id_ed25519_tiasdatahub.pub' > labpc_deploy.pub + gh repo deploy-key add labpc_deploy.pub --repo rintoHasegawa/TIASDataHub --title "labpc DESKTOP-1QLOO91 (read-only)" + ``` + +3. 研究室 PC の `C:\Users\Papin\.ssh\config` に別名を追加する + + ```text + Host github-tiasdatahub + HostName github.com + User git + IdentityFile C:/Users/Papin/.ssh/id_ed25519_tiasdatahub + IdentitiesOnly yes + ``` + +4. 接続を確かめる.初回は GitHub のホスト鍵を受け入れる(指紋が GitHub の公開値 `SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU`(ED25519)と一致することを `ssh-keygen -lF github.com` で確認した) + + ```bash + ssh -n labpc "ssh -o StrictHostKeyChecking=accept-new -T github-tiasdatahub" + ssh -n labpc "git ls-remote git@github-tiasdatahub:rintoHasegawa/TIASDataHub.git" + ``` + +- 別名を鍵ごとに分けているのは,GitHub のデプロイキーが 1 つのリポジトリにしか登録できないため(他のリポジトリを研究室 PC に置く場合は,そのリポジトリ用の鍵と別名を同様に作る) +- 鍵を作り直したら,GitHub の Settings → Deploy keys から古い鍵を削除する + ## 研究室 PC への配置 (Lab PC Deployment) -立ち上げの成果物を `main` に取り込み,`git push nakaguchi main` で GitBucket に反映した後に行う.手順は [ENV_02「研究室 PC のセットアップ」](ENV_02_環境構築手順.md). +立ち上げの成果物を `main` に取り込んだ後に行う.手順は [ENV_02「研究室 PC のセットアップ」](ENV_02_環境構築手順.md). -- ※ 未検証(2026-10-02 時点で GitBucket の `main` が空のため) +- ※ 未検証(2026-10-02 時点で `main` は初期コミットのみ) ## Claude のアクセス制限 (Claude Access Restriction) diff --git "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" index d939fe0..d15b896 100644 --- "a/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" +++ "b/docs/03_PLAN/PLAN_01_\350\246\201\344\273\266\345\256\232\347\276\251\346\233\270.md" @@ -115,7 +115,7 @@ | 計算サーバ(Newton・Archimedes) | 学習・解析.研究室 PC から作業用コピーを受け取る | あり(作業用コピー) | | 手元 PC | 開発.ダミーデータのみ | なし | -- リモート: `origin` = GitHub(`rintoHasegawa/TIASDataHub`,Private.メイン),`nakaguchi` = 研究室の GitBucket(コピー.`main` にマージしたら `git push nakaguchi main` で反映する) +- リモート: `origin` = GitHub(`rintoHasegawa/TIASDataHub`,Private.メイン),`nakaguchi` = 研究室の GitBucket(コピー) ## 成功基準 (Success Criteria) diff --git "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" index 91e544e..0f58262 100644 --- "a/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" +++ "b/docs/03_PLAN/PLAN_02_\351\226\213\347\231\272\343\202\271\343\203\206\343\203\203\343\203\227.md" @@ -17,7 +17,7 @@ | 3 | **取り込みと点検**: `kinds/`(`tongue_color` の値の型),`importers/tongue_color_folders`(9 フォルダ → 症例・撮影・ファイル・所見・由来),`tiasdata import`・`stats`・`check` | ダミーの 9 フォルダを取り込め,2 回実行しても同じ結果になる.想定外の構成で停止する.出力に元のファイル名が出ない | | 4 | **データセットと版**: `datasets/tongue_color.toml`,`datasets.py`(定義の評価・版の作成),`tiasdata dataset freeze`・`list`・`show` | 所見を足す・訂正しても過去の版の構成が変わらない.構成が同じなら版を作らない.ダミーの所見の種類を 1 つ足しても既存の表を変えずに済む | | 5 | **バンドル**: `bundle.py`(書き出し・読み込み・検証),`tiasdata export`,公開 API(`load`・`open_bundle`・`Bundle.fingerprint`) | 書き出したバンドルを目録なしで読める.改変・欠けを検出する.同じ版から同じ `manifest.csv` が得られる | -| 6 | **研究室 PC での運用開始**: 立ち上げの成果物と Step 1〜5 を `main` に取り込み GitBucket に反映 → 研究室 PC に clone・設定ファイル作成・`init` → 舌色データ(1085 枚)を取り込み → `check`・`stats` → 版 1 を作成 → `tiasdata backup` | すべて手元 PC から SSH で行える.件数が 1085 枚・9 グループで TIASJudgeModel の TEST_01 と一致する.`check` が問題 0 件 | +| 6 | **研究室 PC での運用開始**: 立ち上げの成果物と Step 1〜5 を `main` に取り込む → 研究室 PC に GitHub から clone・設定ファイル作成・`init` → 舌色データ(1085 枚)を取り込み → `check`・`stats` → 版 1 を作成 → `tiasdata backup` | すべて手元 PC から SSH で行える.件数が 1085 枚・9 グループで TIASJudgeModel の TEST_01 と一致する.`check` が問題 0 件 | | 7 | **計算サーバへの受け渡し**: `deliver.py`(tar・scp・展開・`sha256sum -c`・記録),`tiasdata deliver` | 版 1 を Newton・Archimedes に渡し,両方で照合が通り,`deliveries` に記録される.データが手元 PC を通らない | | 8 | **TIASJudgeModel の切り替え**: TIASJudgeModel にサブモジュールを追加し,`tiasdata.load("tongue_color", version=1)` から現行の manifest の形に変換して学習・評価に使う(TIASJudgeModel 側の作業ブランチで行う) | 変換した manifest が現行の manifest と同じ構成(件数・`label`・`severity` の内訳・1 患者 1 枚)になる.実験記録にバンドルの指紋が残る.研究室 PC の固定パスを書かずに済む | diff --git a/docs/PROGRESS.md b/docs/PROGRESS.md index 68e9e62..cd6fb7a 100644 --- a/docs/PROGRESS.md +++ b/docs/PROGRESS.md @@ -9,3 +9,9 @@ - 書式・運用ルールは .claude/rules/progress-log.md を参照 (本ファイルの編集時に自動ロードされる) --> + +- [x] **プロジェクト立ち上げ(GUIDE_01)**: 要件定義・技術選定・環境構築・仕様設計・規約整備・開発計画を `chore/project-setup` で完了(2026-10-02).solo モード + - 動機: 舌診研究の各リポジトリが研究室 PC のフォルダを個別に読む形をやめ,データセット名と版で取り出せる共通の入口を作る + - 設計判断: 目録は SQLite + SHA-256 名のストア(取り込み時にコピー.原本参照より版の再現が確実).計算サーバへは版ごとのバンドル(`SHA256SUMS` 付き)を直送.所見は種類の定義+ JSON 値で持ち,種類の追加で表を作り直さない + - 運用: 研究室 PC は手元 PC から `ssh labpc` で操作し,研究室 PC では編集しない.研究室 PC に uv 0.12.22・Python 3.12.15 を導入済み.検証プロファイルは作らない(CLI はテストと `tiasdata check` で確認する) + - 未実装・後段: `main` がまだ存在しない(GitHub・GitBucket とも空).取り込み後に研究室 PC へ clone する(ENV_02).次は PLAN_02 Step 1