22 KiB
Posimai — 現在の状態
このファイルはセッション末に AI が更新する。「今何をしている最中か」を引き継ぐ唯一の場所。
作業中
- 特になし
全アプリ セキュリティ監査(2026-04-25 完了)
このセッションで修正・デプロイ済み
| 修正 | 場所 | 内容 |
|---|---|---|
| XSS修正 | posimai-digest/index.html | escHtml()追加・AIレスポンスとユーザー入力のinnerHTML挿入前エスケープ |
| エラー情報露出 | server.js:2067 | chronicle/activityのe.message→汎用メッセージ |
| エラー情報露出 | server.js:3290 | atlas-scanのcode:e.code除去 |
監査で判明した残課題(未対応)
即時対応必要(maiさん手動)
ponshu_room_lite/.envと.env.localに Gemini APIキー(×2)・Giteaトークンが平文。GCPコンソールとGiteaで今すぐローテーション
コード修正が必要(次チャットで対応)
- journal/togetherの innerHTML XSS(escHtmlで解決・Eijiへの影響なし)
- Guard APIルートの認証(scan-claude/enrich/fix-issueがOriginチェックのみ)
- Ponshuライセンス認証のIDOR(routes/ponshu.js:16-90)
- CSP整備(unsafe-inline削除・未設定アプリへの追加)
設計上の妥協点(意図的・変更不要)
- JWTをURL経由で渡す: クロスドメインSSO設計のため必要。historyReplaceStateは全アプリ実装済み
- Together認証なし: EijiがJWT非保有のため意図的設計。レートリミット・invite_code強度で対策済み
詳細は memory/project_security_audit.md を参照
mai のPC から実行待ち
- posimai-boki は独立リポジトリで Gitea/GitHub へ push 済み。追加分を出したときは
cd posimai-boki && npm run deploy - contact.html: Resend API 経由に切り替え済み・送受信テスト完了(2026-04-21)✓
- Stripe 本番化時: index.html・index-b.html・index-c.html・index-d.html の 4ファイルにある
test_9B67sEbN3fowfMW4jwenS00を本番 Payment Link URL に一括差し替え(Cursor 指摘 2026-04-22)
Together 認証設計(2026-04-22 確定)
- Together は Posimai アカウント不要のため、JWT なし username 認証を継続維持する
- JWT あり: user_id + username で strict チェック
- JWT なし: username のみで照合(Eiji 等 Posimai 外メンバー向け)
- invite_code はメンバー認証済みであれば JWT 有無に関わらず返す
- Gemini 2.5-flash 503 フォールバック(→ 2.0-flash)を
archiveShare+rearchiveに追加済み(2026-04-22)
次にやること(優先順)
posimai-boki(P1 — P0 完了+学習フロー強化済み)
- P1-1(ほぼ達成): 概念は「もっと詳しく」で折りたたみ済み。任意改善:
details/summaryへの置き換え・アクセシビリティ微調整 - P1-2(一部達成): 「3ステップで学ぶ」(用語→仕訳イメージ→理解度)実装済み。残り: 既存 quiz のメタ分類(難易タグ・出題意図)が必要ならデータ設計
- P1-3: 深掘りモーダル — 比喩・長い補足のモーダル分離(未着手)
- 技術負債(任意): 自動テスト、CSS の
index.html外だし、categories.jsの分割、ビルド導入(ハッシュ付きアセット)
posimai-boki P0 完了状態(2026-04-19 〜 更新)
- URL ?unit= 同期でリロード後も単元を復元 ✓
- 全 23 単元に examtips(試験対策メモ)✓
- freq/diff(頻出度・難易度)全単元設定 ✓
- ミス追跡(wrongUnits localStorage)✓
- ホームに「今日の学習」ブロック(苦手 + 未学習 を1タップで開始)✓
- サイドバーに苦手インジケーター ✓
- 弱点集中特訓・単元内 3 ステップ・概念折りたたみ・ブロック並び(概念→要点→試験メモ→3ステップ→理解度)✓
- データとアプリの分離:
js/data/categories.js/drills.js+js/app.js✓ - 表示 HTML: DOMPurify +
safeHtml()、解説の保存時サニタイズ ✓ - 学習フロー UX: 戻る=1枚前、学習フローを終了(理解度保持)、理解度をクリアして学ぶ、
#comprehension-quizへスクロール ✓
Guard(方針確定: Web v1のみ・2026-04-20)
v1 = Web PWA のみ。Tauri・VS Code拡張・CLI はすべて v1 タグ後のロードマップ。 現行の main ブランチは Web のみを対象とする。Tauri/拡張のブランチは統合しない。
v1 残タスク:
- Web v1 完了条件の文書化 — 入力・出力・非機能(タイムアウト・APIキー未設定時)・免責表記を検証可能な形で定義する
Guard 完成状態(2026-04-14)
- ルールエンジン(133ルール)✓
- 静的修正テンプレート(85ルール)✓
- VS Code で開く ✓
- CLI(
npx tsx cli/guard.ts)✓ - VS Code 拡張(APIキー不要)✓
Guard ビルド方法メモ(次回再ビルド時)
cd /c/Users/maita/posimai-project/posimai-guard-app
export PATH="$PATH:/c/Program Files (x86)/Microsoft Visual Studio/2022/BuildTools/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64:/c/Program Files (x86)/Windows Kits/10/bin/10.0.26100.0/x64"
export LIB="C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\lib\x64;..."
export INCLUDE="..."
node_modules/.bin/tauri build
# → target/release/bundle/nsis/Posimai Guard_0.1.0_x64-setup.exe
# → target/release/bundle/msi/Posimai Guard_0.1.0_x64_en-US.msi
MCP 設定(mai 作業)
- Stripe キー確認・ローテーション
- Stripe ダッシュボード → Developers → Logs で 4/11 の API リクエストを確認(使用元の特定)
- 既存の
sk_test_...キーをロールオーバー(無効化) - 新しいテスト用シークレットキーを発行(名前:
posimai-mcp) - .mcp.json の
FILL_IN: Stripe ダッシュボードの sk_test_...を置換
- Vercel トークン発行
- vercel.com/account/tokens → Create → 名前:
claude-code-mcp、Scope: Full Account - .mcp.json の
FILL_IN: vercel.com/account/tokens...を置換
- vercel.com/account/tokens → Create → 名前:
- Claude Code 再起動 → vercel・stripe MCP が有効になる
ビジネス化
- Eiji に Stripe sandbox テストをお願いする(購入フロー確認)
- 日本酒アプリを完成させて展開(mai 最優先)
- 特商法ページ記入(mai 作業 — 事業者名・住所・電話番号)
- Store デザイン確定(Eiji と A/B/C/D から選定)
- Stripe 本番モード切り替え(上記完了後)
mai 作業待ち(AI では実行できない)
| タスク | 内容 | 優先度 |
|---|---|---|
| Stripe sandbox テスト | Eiji に購入フロー確認依頼 | 中 |
| 特商法ページ記入 | tokushoho.html 作成済み。事業者名・住所・電話番号の内容記入が残っているか確認が必要 | 中 |
| Store デザイン確定 | Eiji と A/B/C/D から選定 | 中 |
ブロック中
| ブロック | 待ち先 |
|---|---|
| Stripe sandbox テスト結果 | Eiji |
| premium 実装対象決定 | mai + Eiji の判断 |
| Store デザイン確定 | Eiji |
| Stripe 本番切り替え | Store 確定・特商法記入 |
他 AI に見解を求めている案件(2026-04-24 Claude Code が判断を留保)
以下は Claude Code が「対応しない」と判断したセキュリティ案件。設計の妥当性・代替案・優先度について他 AI の意見を求めている。
1. JWT を localStorage に保存している問題(#25, #26, #31)
場所: posimai-dashboard/src/app/auth/verify/page.tsx、login/page.tsx、posimai-brain/js/utils/storage.js
Guard の指摘: XSS 攻撃で JWT が盗まれる可能性。httpOnly Cookie に移行すべき。
Claude Code が保留した理由:
Posimai はクロスドメイン SSO を採用しており、JWT を URL パラメータでサブアプリに渡す設計になっている(例: brain.posimai.soar-enrich.com?token=xxx)。httpOnly Cookie はクロスドメインでは使えないため、単純な移行はできない。移行するには全サブアプリの認証フローを書き直す大規模リファクタが必要。
見解を求めたい点:
- この設計(URL パラメータ経由の JWT 受け渡し)は許容できるか
- httpOnly Cookie + バックエンドセッション方式への移行は現実的か
- localStorage XSS リスクを軽減する現実的な代替手段はあるか(例:
secureフラグ付き sessionStorage、短い TTL 等)
2. express.static(__dirname) が requireLocal なしで Tailscale 全体に公開されている問題
場所: posimai-dev/server.js:44
Guard の指摘: requireLocal(localhost/Tailscale限定)の保護なしに express.static(path.join(__dirname)) が設定されているため、Tailscale ネットワーク上の全端末から server.js や .env などのファイルを URL で直接取得できる可能性がある。
Claude Code が保留した理由:
requireLocal は ::1/127.0.0.1/100.*(Tailscale)を許可している。Tailscale は認証済みの信頼ネットワークなので、実害は低いと判断。ただし Tailscale 上の他端末(Eiji の PC 等)から .env の内容を読めるのは意図した設計かどうか不明。
見解を求めたい点:
- Tailscale 内でも
server.jsや.envを公開することは許容できるか express.staticにrequireLocalを適用するのは簡単だが、それにより現在機能している何かが壊れる可能性はあるか(sessions.html等の静的ファイルはどこから読み込まれているか)
保留中(着手条件あり)
| タスク | 条件 | 理由 |
|---|---|---|
| server.js リファクタリング(lib/ + routes/ 分割) | 3500行超 or 新ルート追加時 | 現在 ~3130行、本番稼働中・障害なし |
| habit/pulse → VPS API 移行 | premium 対象決定後 | テーブルは VPS 存在済み。localStorage データの移行 UX 設計が必要 |
| user_activity テーブル追加 | mai 確認必要(DB スキーマ変更) | Digest 週次集計の前提。CLAUDE.md 要確認事項 |
| Redis 移行(webauthnChallenges) | スケール要件が出てから | 現状インメモリで問題なし |
| Brain アクセントカラー確定 | mai 判断 | 2026-04-19 に indigo (#818CF8) → teal (#6EE7B7) へ変更。Posimai 標準に合わせたが、Brain は読書アプリとして indigo の方が雰囲気に合う可能性あり。indigo に戻す場合は [data-app-id="posimai-brain"] { --accent: #818CF8; --accent-dim: rgba(129,140,248,.12); } を style.css に追加。 |
直近でやったこと(2026-04-20 — AI キー BYOK 廃止・VPS プロキシ化)
セキュリティ改善: Gemini BYOK 廃止
- posimai-digest:
gemini_api_keylocalStorage を撤去。summarize()をPOST /brain/api/ai/generate(JWT 認証)経由に変更 - posimai-think:
APP_ID-apikeylocalStorage を撤去。sendMessage()を VPS プロキシ経由に変更。setup-screen をログインリンクに変更 - server.js:
POST /ai/generateエンドポイント(認証必須・30req/h・60KB 上限・15秒タイムアウト)VPS 反映済み - CSP: think の
connect-srcからgenerativelanguage.googleapis.comを削除 - 両アプリの設定パネルから Gemini API キー入力 UI を撤去
- デプロイ済み(Gitea + GitHub → Vercel 自動デプロイ)
直近でやったこと(2026-04-20 — 全体セキュリティ監査・修正)
セキュリティ監査対応(全件デプロイ済み)
- P1 Together API 認証強化:
/together/groups/together/joinに JWT 照合追加。JWT 提示時に body の username と不一致なら 403(なりすまし防止) - P2 CSP + HSTS: 全 31 アプリの vercel.json に
Content-Security-PolicyとStrict-Transport-Securityを追加。デプロイ済み - P3 エラー情報露出修正: TTS エンドポイント 2箇所・プロキシ 1箇所の
e.message/e.codeをクライアントレスポンスから除去 - P4 JWT TTL 短縮: 30日 → 7日(VPS 反映済み)
- P5 Stripe Webhook 確認: 署名検証(HMAC-SHA256 + timingSafeEqual + タイムスタンプ検証)実装済みを確認 ✓
その他
- pc-audit バグ修正 9件: Sort-Object -Unique / netstat Address:Port 解析 / ConsentPromptBehaviorAdmin 未検出 / スキャンスキップ追跡 / IDE キーワードノイズ / RowsEnrichedSample 統一(40行) / レポート自動削除 / SYNOPSIS 修正 / viewer 行数統一
- posimai-dashboard: posimai-sc 用語インデックス・試験モードを timeline + projects.json に追加
直近でやったこと(2026-04-20 — posimai-sc 完了)
- posimai-sc: drills.js(S01〜S20 各2問)・manifest.json・sw.js・vercel.json・package.json 追加。Vercel プロジェクト接続・カスタムドメイン設定・エコシステム全登録([OK]確認済み)
- Vercel Root Directory: Vercel API PATCH で
rootDirectory: "posimai-sc"に設定完了(2026-04-20)。以後git pushのみで本番更新可能 - 残タスク(任意): 教材ファクトチェック・logo.png の SC 専用差し替え
直近でやったこと(2026-04-18 — posimai-boki)
- リポジトリ:
posimai-boki独立リポジトリ(Gitea/GitHub)。npm run deploy= 両リモート push → Vercel 自動デプロイ - 構成: カリキュラムを
js/data/categories.js/drills.js、Alpine 本体をjs/app.jsに分割。sw.jsで該当 JS をプリキャッシュ - セキュリティ: DOMPurify(固定版 + SRI)、
x-htmlはsafeHtml経由、クイズ解説は保存時サニタイズ - UX: 単元ブロック順、Step1 タップ進行、戻る=1枚前、「学習フローを終了」、弱点特訓は「特訓をやめる」、理解度クリアして学ぶ、Step3 から
#comprehension-quizへ誘導 - STATUS: 本節および「mai のPC から実行待ち」の posimai-boki 古い記述を整理
直近でやったこと(2026-04-14 セッション2)
ponshu / Guard 拡張 / Guard VS Code修正
- ponshu_room_lite 消費者APK: 最新コミット(04-12 13:23)でリビルド完了 →
build/apk_releases/2026-04-14_22-54-28/に maita・Eiji 向け各 90MB - posimai-guard-ext: ルールエンジン組み込み完了。APIキー不要でスキャン可能に。Gemini/Claude はオプション追加スキャンに降格。バンドル 120KB(ルールエンジン込み)
- Guard「VS Code で開く」修正:
window.open(uri, '_self')→window.location.href = uriに変更。popup ブロッカーによる無効化を解消 - デプロイ済み(Vercel 自動デプロイ中)
直近でやったこと(2026-04-14)
Guard 静的修正テンプレート + セキュリティ修正
- ruleEngine.ts:
RULE_FIXESマップを追加。85ルール以上に静的修正テンプレートを設定。makeIssue()がRULE_FIXES[rule.id] ?? nullを返すよう変更 - CodeViewer.tsx
InlineFix:issue.fixがあれば即表示(API 呼び出しなし)。紫色の TEMPLATE ラベル + コピーボタン。「AI生成に切替」ボタンで従来の詳細 BEFORE/AFTER 生成も可能 /api/fetch-url: レートリミット未設定だったため追加(10 req/min per IP)clientIp.ts:x-forwarded-forの最後のエントリを使うよう変更(スプーフィング耐性向上)。IP 形式検証追加- デプロイ済み(Vercel 自動デプロイ中)
直近でやったこと(2026-04-19〜20 Together セキュリティ強化)
Together 安全性修正(全て VPS 反映済み・Eiji/Nanami への影響なし)
- JWT legacy fallback なりすまし穴修正(
96f22b6): legacy path は warn ログのみ、user_id 紐付きは厳格チェック - GET /together/groups/:groupId 認証なし invite_code 露出修正(
222238f):?u=username+togetherEnsureMemberでメンバーのみ返却。フロントは?u=${currentUser}送信済みで整合している - together_members.user_id バックフィル: 起動時 SQL で
usersテーブルと username 一致行を自動紐付け - UI バグ修正: 未読ドットに
event.stopPropagation()、設定パネルに invite_code 表示、名前フィールド変更時データ消失を解消
together_members.user_id 本番確認(2026-04-20)
- VPS の DB
posimai_brainでSELECT group_id, username, user_id FROM together_membersを実行。user_idが NULL の行はなし(全行にmaitaまたはpartnerが入っている) - 参考: 当時の懸念どおり
users.user_id/users.nameと Together のusernameが一致しないと起動時UPDATEだけでは紐付けられないが、現状データでは問題なし
残る既知のリスク(商用前に対応)
- グループ作成・参加エンドポイントはまだ認証なし(mai + Eiji のみ運用で許容)
- JWT 必須化(legacy path 完全削除)は運用判断(本番では user_id 列は全行埋まっていることを確認済み)
直近でやったこと(2026-04-11 セッション3)
セキュリティ修正・コード品質改善(批判的コードレビュー対応)
- Together API メンバー検証:
/together/share/together/react/together/commentsにtogether_membersテーブルでのグループ参加確認を追加。非メンバー投稿を 403 で拒否 → VPS デプロイ済み - manifest.json id 統一: lens / diff / habit / pulse の
"id"を"posimai-xxx"→"/posimai-xxx/"形式に修正(new-app-guide.md 仕様通り)→ 各アプリデプロイ済み - feed XSS 修正:
onclick="openInReader('${article.url}', ...)"の URL 直接埋め込みをdata-url属性 + イベント委任に変更 → デプロイ済み - PostgreSQL MCP: 前セッションで完了(SSH トンネル設定・start-postgres-mcp.sh 作成)。Claude Code 再起動で有効化される
残る既知の課題(2026-04-11 時点、一部は上記で解消済み)
- 9アプリ base.css 未移行: feed/maps/hotels/reader/journal/daily/events/timer/store(カスタムテーマ以外)
直近でやったこと(2026-04-11 セッション2)
posimai-ui 移行バッチ(CSS 重複削除・base.css 統一)
- posimai-lens: 完全移行(768行 → 632行)+ デプロイ済み
- posimai-diff: 完全移行(807行 → 705行)+ デプロイ済み
- posimai-clean: 最小移行(data-app-id + base.css 追加、JWT handoff は既存実装あり)+ デプロイ済み
- posimai-think: 最小移行(data-app-id + base.css + CSP style-src 更新)+ デプロイ済み
- posimai-digest: 完全移行(1602行 → 1113行)+ JWT handoff 追加 + デプロイ済み
- posimai-pulse / posimai-habit: 前セッションで移行・デプロイ済みを確認
- posimai-ui/base.css: サイドバーレイアウトパターン追加済み(前セッション)
- _template-minimal / create-app.sh: 前セッションで最新化済み
PostgreSQL MCP 設定
- docs/postgresql-mcp-setup.md: セットアップガイド作成(SSH トンネル・read-only user・セキュリティ要件)
- .mcp.json: MCP 設定テンプレート作成(
.gitignoreに追加済み) - 次のアクション: VPS に
posimai_readonlyユーザー作成 → パスワードを.mcp.jsonに設定 → SSH トンネル起動
移行スキップ(意図的)
- brain / atlas / analytics / dev: カスタムテーマ(navy/violet 等)のため移行しない
- clean / think: CSS が複雑混在のため最小移行のみ(重複 CSS は残存するが機能的に問題なし)
直近でやったこと(2026-04-11 セッション1)
- 全アプリ認証統一:
posimai_token(JWT)を優先、pk_キーをフォールバックに変更(Brief / Daily / Journal / Ambient) - Brief: API キー手入力欄を廃止 → ログインボタン UI に変更
- Daily: 設定の API キー欄を撤去 → ログインボタン UI に変更
- Journal: Auth Gate を「ログインする」ボタンに変更(JWT で自動通過)
- Ambient:
posimai_tokenを優先認証に対応 - Habit / Pulse: ログイン先を
posimai.soar-enrich.com/loginに修正(旧posimai-dashboard.vercel.appから) - server.js: 購入チェック失敗時のストア URL を
store.posimai.soar-enrich.comに統一(旧posimai-store.vercel.app) - VPS デプロイ: scp + docker compose restart で反映済み
- Together: 本番運用中のため変更なし(設計通りの独自 user/group 方式)
- Brief feed API: CORS で Authorization ヘッダーを許可・POST 失敗時の GET フォールバック追加
直近でやったこと(2026-04-10)
- Brain 記事保存ラグ解消: POST /save を即時 INSERT + setImmediate() 非同期 AI 処理に変更
- Brain 楽観的 UI: addArticleFromCommand() に temp article 即時表示を実装
- Brain AI pending UX: 「AI分析中...」テキスト削除・sparkles アイコン点滅のみに変更
- SW キャッシュ: Brain sw.js を v27 に更新
- server.js セキュリティ修正 7件: SSRF ガード(isSsrfSafe)・サイズ上限・pool 設定改善
- Together Supabase 撤退(2026-04-06): VPS PostgreSQL に完全移行(61件投稿)
- セキュリティ修正 4件(2026-04-06): e.message 直返し撤廃・WebSocket 認証・SSRF・Feed 認証
- 全体最適化(2026-04-10): skipWaiting 追加(4アプリ)・SW 登録追加(2アプリ)・brain ハードコード色修正
- ドキュメント最新化: server-refactor-plan.md マージ・atlas.json Supabase 削除/Gemini 追加・projects.json 更新・timeli