Skip to content
This repository was archived by the owner on Aug 26, 2026. It is now read-only.

docs: レビューフローの見直し(Draft先行 + CodeRabbit導入) - #35

Merged
reitojike merged 11 commits into
mainfrom
docs-review-flow-coderabbit
Aug 7, 2026
Merged

reitojike merged 11 commits into
mainfrom
docs-review-flow-coderabbit

Conversation

@reitojike

@reitojike reitojike commented Aug 6, 2026

Copy link
Copy Markdown
Owner

概要

PR #18〜#32のレビュー実績(Claude/Copilotの指摘重複率分析、Copilotのクレジット消費)を踏まえた運用変更。ドキュメント・設定ファイルのみの変更。

変更内容

  • CLAUDE.md — PRをDraftで作成し、Claude/Codex/CodeRabbit(無料)との反復後にReady化してCopilot(有料)の最終レビューを受ける運用を明記
  • .coderabbit.yaml(新規) — CodeRabbit導入。デフォルトのdraftスキップをdrafts: trueで無効化し、CLAUDE.mdの絶対ルール・RLS・test/dbの観点をpath_instructionsに明示
  • docs/roadmap.md — 「保留: 外部アカウント待ち」にCodeRabbit導入(完了)を追記
  • docs/permissions.md — Issue #26で見つかった「RETURNINGだけでは弾かれたことの証明にならない」罠を追記

このPR自体の位置づけ

新しいDraft先行フローの動作確認を兼ねる。Draft状態でClaude/Codex/CodeRabbitのレビューが走り、Copilotは走らないことを確認してからReady化する。

Test plan

  • Draft状態でClaudeは走ることを確認。CodexはOPENAI_API_KEY未設定のため意図通りスキップ、Copilotは走らないことを確認(Draft中の7回のpushでCopilotのレビューは一度も付かなかった)
  • CodeRabbitがDraft状態でもレビューすることを確認(Draft中に4回のレビュー往復で確認済み。7コミット目以降はFreeプランのレート制限と思われる状態になることも実地確認した。詳細はdocs/roadmap.md参照)
  • Ready化した時点でCopilotが走ることを確認(gh pr ready実行後にcopilot-pull-request-reviewerが起動。1回目はプレミアムリクエストのquota上限で失敗、quota追加後の再リクエストで2回成功。詳細はCLAUDE.md/docs/roadmap.md参照)

Summary by CodeRabbit

  • ドキュメント

    • 権限・RLS検証の手順を更新し、更新・削除・追加時の結果確認や注意点を明確化しました。
    • 開発ロードマップに、CodeRabbit導入と運用上の制限事項を追記しました。
  • 開発プロセス

    • Draft PRからReady移行までのレビュー手順を整理しました。
    • 各レビューサービスの実行条件、再レビュー方法、利用制限に関する説明を追加しました。

PR #18〜#32の実績分析(Claude/Copilotの指摘重複率、Copilotのクレジット
消費)を踏まえた運用変更。

- PRはまずDraftで作成し、Claude/Codex/CodeRabbit(無料)と反復してから
  Ready化してCopilot(有料)の最終レビューを受ける運用をCLAUDE.mdに明記
  (Copilotのrulesetは既にreview_draft_pull_requests: falseのため
  ruleset自体の変更は不要だった)
- .coderabbit.yamlを追加。デフォルトでdraftをスキップする設定を
  drafts: trueで上書きし、CLAUDE.mdの絶対ルール・RLS・test/dbの
  観点をpath_instructionsで明示
- docs/roadmap.mdの「保留: 外部アカウント待ち」にCodeRabbit導入を追記
- docs/permissions.mdに、INSERT/UPDATE/DELETEのRETURNINGがSELECTポリシー
  で空になるだけでは「弾かれた」証明にならない、という#26で見つかった
  罠を追記
@coderabbitai

coderabbitai Bot commented Aug 6, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Walkthrough

CodeRabbitの自動レビュー設定とPR運用を更新した。RLS検証では、RETURNINGだけに依存しない確認手順を追加した。CodeRabbit導入情報をロードマップに追加した。

Changes

レビュー運用とRLS検証

Layer / File(s) Summary
CodeRabbit設定と導入計画
.coderabbit.yaml, docs/roadmap.md
CodeRabbitの日本語ロケール、assertiveプロファイル、Draft PRレビュー、TypeScript・Supabase・データベーステスト向けの指示を追加した。導入状況とレート制限をロードマップに記載した。
PRレビュー運用
CLAUDE.md
Draft中のClaude・Codex・CodeRabbit、Ready後のCopilotとCodeRabbitの実行条件を記載した。シークレット未設定、レート制限、quota不足時の再レビュー手順を追加した。
RLS検証手順
docs/permissions.md
SELECT結果のエラーと件数を個別に確認する手順を追加した。UPDATEDELETEでは対象行の値と存続を確認し、INSERT ... RETURNINGのRLS条件と.select()の扱いを補足した。

Estimated code review effort: 3 (Moderate) | ~20 minutes

Suggested reviewers: copilot

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed タイトルはDraft先行のレビューフロー変更とCodeRabbit導入を明確に示しており、変更内容の主目的と一致します。
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch docs-review-flow-coderabbit

Comment @coderabbitai help to get the list of available commands.

Comment thread docs/permissions.md Outdated
@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

レビュー総評

コード変更はなく、.coderabbit.yaml(新規)・CLAUDE.mddocs/permissions.mddocs/roadmap.mdのみのdocs/config PRです。CLAUDE.mdの「絶対に守ること」(as/any/eslint-disableの黙殺、common/への集約、生成型・z.inferからの型導出)はコードに対する規約のため、今回は該当箇所なしと判断しました。

良い点

  • Draft先行フローの記述は、実際のワークフロー定義(claude-review.yml/codex-review.ymlopened,synchronize,reopenedでdraft問わず発火する)と整合しています。
  • .coderabbit.yamlのRLS自己参照サブクエリに関する注意書きは、既存のsupabase/migrations/20260806034559_rls_policies.sqlのsecurity definerコメントと一致しており、実際の落とし穴を正しく反映しています。
  • docs/roadmap.mdの新規行は「保留: 外部アカウント待ち」セクションの定義(アカウント側の準備待ち)に合致した内容・配置です。
  • INSERTのRETURNINGがSELECTポリシー違反時にエラーになる、という記述はPostgreSQL公式ドキュメントの記載と一致しています。

指摘(インラインコメント参照)

  • docs/permissions.mdに追加された「UPDATE/DELETEのRETURNINGが空であることだけで判定しない」の段落について、USING句が壊れているケースの挙動の説明がPostgreSQL公式ドキュメントの記載と食い違っているように見えます。詳細はインラインコメントに記載しました。今後のRLSテストの書き方を左右する記述なので、実際に検証してから確定させることを推奨します。推奨されているテストパターン自体(見える側の視点で値の不変を確認する)は妥当です。

見送った/機械的に指摘しなかった点

  • .coderabbit.yamldrafts: trueやCodeRabbitの無料枠数値(200ファイル/時・4レビュー/時)など、外部サービスの仕様に関する記載は今回のツールから検証できず、指摘は見送りました。導入後の実動作確認(PR本文のTest planに記載済み)で担保される想定です。

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.coderabbit.yaml:
- Around line 5-10: Update the auto-review policy in .coderabbit.yaml under
reviews.auto_review by adding auto_pause_after_reviewed_commits set to 0 if you
want CodeRabbit to keep reviewing every push after Ready, or otherwise align the
documented workflow in CLAUDE.md under the “Ready後はpushのたびに再レビューが走る” guidance so
it explicitly mentions the pause after 5 reviewed commits and the need to run
`@coderabbitai` review after that; use the existing auto_review and Ready後
workflow symbols as the place to make the policy consistent.
- Around line 30-32: Update the RLS negative-test guidance in the configuration
to require operation-specific assertions using an authenticated user client, not
service_role: verify UPDATE preserves the target row’s old values, DELETE leaves
the target row present, and INSERT does not create a new row, all from a role
that can view the target rows.
- Around line 23-25: RLSポリシー内の自己参照サブクエリをSECURITY
DEFINER関数でラップする場合の安全条件を指示に追加し、非公開スキーマへの配置、SET search_path =
''または安全な固定値の指定、すべての参照でのスキーマ修飾を必須にする。さらにPUBLICおよび不要なロールからEXECUTEをREVOKEし、必要なロールのみにGRANTするよう明記する。
- Around line 7-10: Align the CodeRabbit draft-review policy with the documented
workflow: update .coderabbit.yaml#7-10 to match the intended behavior for Draft
PRs, and update CLAUDE.md#52-56 so the “Ready化後にCodeRabbitが最終レビュー” guidance
matches that same setting. Use the existing draft-review configuration symbol
`drafts` as the source of truth, and keep both documents consistent about
whether Draft PRs are reviewed or only Ready PRs are reviewed.

In `@docs/permissions.md`:
- Line 92: Update the code fence at line 92 in the permissions documentation to
specify the TypeScript language identifier, changing the opening fence to
```typescript so the MD040 markdownlint warning is resolved.
- Around line 86-90: docs/permissions.md の `RETURNING` と RLS の説明を修正し、USING
句が壊れていても更新・削除できるという説明を削除してください。空の結果だけでは WHERE 条件不一致と SELECT または USING
ポリシーによる抑止を区別できないことを明記してください。対象行を閲覧できるユーザー視点で、更新後の値または削除後の存在を確認する手順は維持してください。

In `@docs/roadmap.md`:
- Line 89: CodeRabbit無料プランのレート制限の記載を実際の仕様に更新してください。docs/roadmap.md:89
のCodeRabbit導入項目はPRを1レビュー/時/開発者、IDE/CLIを3レビュー/時/開発者と記載し、.coderabbit.yaml:7-10
の「無料枠」コメントも同じ制限に修正してください。Draftレビューは契約プランのレート制限対象であることを反映してください。
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: db5af572-c7ad-4ad2-90cc-f07ccca6bd01

📥 Commits

Reviewing files that changed from the base of the PR and between c870c2a and 522d99d.

📒 Files selected for processing (4)
  • .coderabbit.yaml
  • CLAUDE.md
  • docs/permissions.md
  • docs/roadmap.md

Comment thread .coderabbit.yaml
Comment thread .coderabbit.yaml
Comment thread .coderabbit.yaml Outdated
Comment thread .coderabbit.yaml Outdated
Comment thread docs/permissions.md Outdated
Comment thread docs/permissions.md Outdated
Comment thread docs/roadmap.md Outdated
- auto_pause_after_reviewed_commits: 0 を追加(既定5コミットで自動レビューが
  止まる設定は反復push運用と相性が悪い)
- CLAUDE.mdの記述を.coderabbit.yaml(drafts: true)と一致させる。
  「Copilot(導入後はCodeRabbitも)の最終レビュー」という誤った表現を修正し、
  CodeRabbitもDraft中から反復レビューする旨を明記
- CodeRabbit Freeプランの実際のレート制限(GitHub連携PRレビューは1回/時/開発者)
  をCLAUDE.md・docs/roadmap.md・.coderabbit.yamlに反映。前回調査した
  「200ファイル/時・4レビュー/時」は誤りだった(CodeRabbit自身のレビュー
  コメントがPostgreSQL公式ドキュメントとCodeRabbit公式docsをその場で
  クロールして訂正)
- docs/permissions.mdのRETURNING説明をPostgreSQL公式ドキュメントに基づき
  修正。UPDATEはSELECTポリシー不一致だと実際はエラーになり(空配列ではない)、
  DELETEはSELECTポリシーを満たさない行がそもそも削除候補から除外される、
  というのが正確な挙動
- markdownlint MD040(コードフェンスの言語識別子)を修正
- .coderabbit.yamlのpath_instructionsを強化(security definerの安全条件、
  操作別のRLS否定側テスト観点)
@claude

claude Bot commented Aug 6, 2026

Copy link
Copy Markdown

レビュー結果(ドキュメント・設定ファイルのみの変更)

対象は .coderabbit.yaml(新規)・CLAUDE.mddocs/permissions.mddocs/roadmap.md で、コード変更は含まれない。CLAUDE.md の絶対ルール(as/any/eslint-disableの黙殺、common/ への判断ロジック集約、生成型/Zod由来の型)はいずれもTS/JSコードに対する規約であり、今回の差分には該当箇所がない。

確認した観点と結果

  • 技術的な正確性: docs/permissions.md に追加された「UPDATE ... RETURNING はSELECTポリシーを満たさない更新後の行に対してエラーを投げる」という記述を PostgreSQL公式ドキュメント(ddl-rowsecurity.html)で裏取りした。該当ページに以下の記載があり、PRの記述と一致している。

    If a newly inserted or updated row does not satisfy the relation's SELECT policies, an error will be thrown (inserted or updated rows to be returned are never silently ignored).

    一方で「USING句自体で候補行から除外された場合(=そもそも更新対象にすらならない)は0件で無エラー」という区別も、公式ドキュメントの一般原則(SELECTポリシーとコマンド固有ポリシーの両方が可視性を要求する)と整合している。test/db/expenses.test.ts の該当テスト(stranger視点でRETURNINGが空 → self視点で値が変化していないことを確認)は既にこの区別を踏まえた書き方になっており、今回のドキュメント修正はコードを追認する形になっている。

  • .coderabbit.yamlpath_instructions: **/*.{ts,tsx}supabase/migrations/**test/db/** の3パスに対して、CLAUDE.mdの絶対ルール・RLS自己参照サブクエリ/security definer関数の注意点・RLS否定側テストの必須要件を過不足なく反映しており、docs/permissions.mddocs/testing.md の内容と矛盾しない。

  • CLAUDE.mdとの整合性: Draft先行フロー(Claude/Codex/CodeRabbitはdraftでも走る、Copilotはdraft中は走らない)の記述は .coderabbit.yamldrafts: true 設定、および docs/roadmap.md「保留: 外部アカウント待ち」テーブルの記載と一致している。

  • 修正コミット(4af910b)の妥当性: CodeRabbitの初回レビュー指摘を受けて、RETURNING/USING句まわりの誤った説明(「RETURNINGが空 = USING句が効いているとは限らない」という当初の理由づけ)を、公式ドキュメントに基づくより正確な説明に修正している。併せて markdownlint MD040(コードフェンス言語識別子)も修正済み。方針としては妥当。

確認できなかった点(参考情報)

  • CodeRabbit Freeプランのレート制限の数値(GitHub連携PRレビュー1回/時/開発者、IDE/CLIは3回/時)は、このレビュー環境からは docs.coderabbit.ai への外部アクセスができず再検証できなかった。CodeRabbit自身のレビューコメントで訂正された経緯があるとのことなので恐らく問題ないが、外部サービスの仕様は変わりうる情報である旨だけ念のため共有する。
  • GitHub Copilotの copilot_code_review Ruleset(review_draft_pull_requests: false)は本リポジトリのRuleset設定(コード管理外)に依存する記述で、こちらもAPI参照権限がなく確認できなかった。既存のroadmap記載(Copilot自動レビュー有効化は既に完了)と矛盾はしていない。

総評

ブロッキングな指摘なし。ドキュメントの技術的主張は公式ドキュメントで裏取りが取れており、既存のテストコード(test/db/expenses.test.ts 等)の実装とも整合している。CLAUDE.mdの絶対ルールに抵触する箇所もない。

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 3

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.coderabbit.yaml (1)

26-26: 📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win

型の導出対象を限定してください。

型を手書きせず は、すべてのTypeScript型を supabase/types.ts または z.infer から作る指示です。これは CLAUDE.md の対象範囲より広く、ドメイン型やUI型まで生成型に結合させます。DB行型と外部入力型に限定してください。

修正例
-        - 型を手書きせず、生成型(supabase/types.ts)かZodスキーマの z.infer から導出しているか
+        - DBの行型は生成型(supabase/types.ts)から、外部入力型はZodスキーマの z.infer から導出しているか
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.coderabbit.yaml at line 26, Update the review rule in the type-derivation
entry to limit its scope to database row types and external input types. Require
Supabase generated types or z.infer only for those categories, rather than
implying that all TypeScript, domain, and UI types must be derived from them.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CLAUDE.md`:
- Around line 53-56:
CLAUDE.mdの該当するレビュー実行条件を、各ツールが常にpushごとに実行されるという断定から条件付きの記述へ更新してください。CodexはOPENAI_API_KEYなど必要なシークレットが設定されている場合のみ実行され、CodeRabbitはレート制限によりスキップされる可能性があることを明記し、ClaudeとCopilotの既存条件およびdraft時の挙動は維持してください。

In `@docs/permissions.md`:
- Around line 78-84: 標準の Supabase client の戻り値契約に合わせ、asUserA と asUserB の
expenses.select() 結果から data 配列を取り出して行数を検証するよう例を更新してください。両者が data-only wrapper
である場合は、戻り値が配列である契約を例内で明記し、応答オブジェクト自体に toHaveLength を適用しないでください。
- Around line 86-95: Revise the UPDATE/DELETE guidance in the documented policy
behavior to limit SELECT-policy requirements to operations that read from the
target table, specifically when WHERE or RETURNING references target-table
columns. Preserve the existing distinction between no matching rows and rows
filtered by USING/visibility, without implying that every UPDATE/DELETE
automatically requires SELECT visibility.

---

Outside diff comments:
In @.coderabbit.yaml:
- Line 26: Update the review rule in the type-derivation entry to limit its
scope to database row types and external input types. Require Supabase generated
types or z.infer only for those categories, rather than implying that all
TypeScript, domain, and UI types must be derived from them.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 5526f209-3ff7-4103-a90d-d7d2e539856e

📥 Commits

Reviewing files that changed from the base of the PR and between 522d99d and 4af910b.

📒 Files selected for processing (4)
  • .coderabbit.yaml
  • CLAUDE.md
  • docs/permissions.md
  • docs/roadmap.md

Comment thread CLAUDE.md Outdated
Comment thread docs/permissions.md
Comment thread docs/permissions.md
- CLAUDE.md: レビュー実行条件をツールごとに正確化(Codexはシークレット設定時、CodeRabbitはFreeプランのレート制限対象)
- docs/permissions.md: select()のコード例をdata/errorの分解に修正、UPDATE/DELETEのSELECTポリシー要求条件を限定
@reitojike

Copy link
Copy Markdown
Owner Author

CodeRabbit 2回目レビューの指摘分類 (commit fe445e8)

前回コミット(4af910b)の7件は全てCodeRabbitが✅自動確認済み。新たに3件の指摘があり、いずれも本物の修正として反映しました。

# 場所 分類 対応
1 CLAUDE.md:53-56 本物の修正 「Claude/Codex/CodeRabbitはdraftでもpushのたびに走る」という記述が、実際にはCodexはシークレット設定時のみ・CodeRabbitはレート制限対象という下部の記述と矛盾していた。ツールごとに条件を明記する形に修正
2 docs/permissions.md:84 妥当なnitpick コード例がselect()の戻り値{ data, error }をそのままtoHaveLengthしていて型として不正確だった。dataを分解する形に修正
3 docs/permissions.md:95 妥当なnitpick 「UPDATE/DELETEは常にSELECTポリシーの可視性も要求する」という一般化がPostgreSQL的にはWHERE/RETURNINGが対象テーブルの列を参照する場合に限られる、との指摘。このリポジトリのテストは常に.eq("id", id)を伴うため実害はないが、正確性のため条件を明記

3件ともPostgreSQL公式ドキュメントの参照込みで裏付けがあり、いずれも妥当と判断したため修正しました。

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@CLAUDE.md`:
- Around line 53-55:
CLAUDE_CODE_OAUTH_TOKENの設定が必要であることを明記し、claude-review.ymlのClaudeレビューはトークン設定時にdraftのpushごとに実行され、未設定時はスキップされる説明へ更新してください。CodexとCodeRabbitの既存説明は変更しないでください。
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 271ff108-878d-437d-9fc2-468ff767a53c

📥 Commits

Reviewing files that changed from the base of the PR and between 4af910b and fe445e8.

📒 Files selected for processing (2)
  • CLAUDE.md
  • docs/permissions.md

Comment thread CLAUDE.md Outdated
CLAUDE_CODE_OAUTH_TOKEN未設定時はClaudeレビューがスキップされる旨が
記述から抜けており、実際のワークフロー(claude-review.yml)の挙動と
矛盾していた。Codex/CodeRabbitと同様に条件を明記する。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@reitojike

Copy link
Copy Markdown
Owner Author

CodeRabbit 4回目レビューの指摘分類 (commit 36212ed)

# 場所 分類 対応
1 CLAUDE.md:53 本物の修正 ClaudeレビューがCLAUDE_CODE_OAUTH_TOKEN未設定時にスキップされる旨が記述から抜けていた(claude-review.ymlの実際の条件分岐と不整合)。Codex/CodeRabbitと同様にトークン条件を明記した

併せて、Claude自身の初回レビュー指摘(docs/permissions.mdのRETURNING/USING句の挙動に関する懸念)はcommit 4af910bで裏取り済みの正確な説明に修正済みだったため、スレッドをresolveした。

Comment thread docs/roadmap.md Outdated
Comment thread .coderabbit.yaml
@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー総評

このPRは CLAUDE.md / .coderabbit.yaml(新規) / docs/roadmap.md / docs/permissions.md のみを変更する、運用ドキュメント・レビュー設定の変更です。アプリケーションコード(app/ / common/ / mcp/ / lib/)や supabase/ の変更は含まれないため、以下の観点は該当なしでした。

  • as キャスト、any@ts-ignore / eslint-disable によるエラーの黙殺 → 対象コード変更なし
  • common/ に置くべき判断ロジックの app//mcp/ への複製・直書き → 対象コード変更なし
  • 型の手書き(生成型/Zod z.infer からの導出) → 対象コード変更なし
  • 権限判定・削除分岐・公開設定の既定値に対するテスト → 対象コード変更なし

良い点

  • docs/permissions.md に追加された「UPDATE/DELETE/INSERTのRETURNINGだけでは弾かれた証明にならない」という注意は、PostgreSQLのRLSの実際の挙動(RETURNING時にSELECTポリシーとの整合が要求される)に沿った内容で、test/db/ の既存テスト(expenses.test.ts、budgets.test.ts、event-participants.test.ts など)が実際にこのパターン(対象行を見られる側の視点で確認)で書かれていることも確認しました。ドキュメントが後追いで実装を正しく説明しています。
  • .coderabbit.yaml の path_instructions は、CLAUDE.mdの絶対ルール・docs/permissions.mdの権限マトリクス・docs/testing.mdのRLS検証要件をパスごとに明示的に紐付けており、レビューボットが見るべき観点を薄めずに引き継げる設計になっています。
  • docs/testing.md と docs/permissions.md の間で内容の重複や矛盾は見当たりませんでした(testing.mdは詳細をpermissions.mdに委譲する形を維持)。

指摘(インラインコメント参照)

  1. docs/roadmap.md のCodeRabbit導入行: 「Draft PRでも反復レビューされることをPR #35で確認済み」と断定していますが、このPR自身のTest planは3項目とも未チェックのままです。CodeRabbitがDraft中に走ったこと自体はこのブランチのコミット履歴(複数回の「CodeRabbitレビュー指摘を反映」コミット)から裏付けられますが、CLAUDE.md側に新規記載された「Copilotはdraft中は走らない」「Ready化で1回だけ走る」という主張はこのPRの時点では未検証です。Ready化後の実地確認を待つか、確認済み/未検証の範囲を書き分けることを提案します。
  2. .coderabbit.yaml の auto_pause_after_reviewed_commits: 0: コメントの意図通り「無制限化」として機能するかはスキーマ次第で、未確認に見えます(nitpick、実地確認を推奨)。

いずれも運用ドキュメントとしての正確性に関する指摘で、ブロッカーではありません。実地確認(Ready化後の挙動)を待ってから roadmap.md の記述を確定させることを推奨します。

roadmap.mdがCopilotのdraft/ready挙動を「確認済み」と断定していたが、
このPR自体のTest planは未検証のままだった。CodeRabbitのDraft動作の
確認と、Copilotの挙動(CLAUDE.mdの既存記載を踏襲・未検証)を書き分けた。
.coderabbit.yamlのauto_pause_after_reviewed_commits: 0も、5コミットを
超えた継続の実地確認がまだであることをコメントに追記した。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
.coderabbit.yaml (1)

38-46: 🔒 Security & Privacy | 🟠 Major | ⚡ Quick win

INSERTの否定テストに、対象行を参照できる認証済みテスト主体を指定してください。

否定側クライアントの空のRETURNINGSELECTだけでは、RLSによる拒否とSELECTポリシーによる非表示を区別できません。対象行を参照できる主体で、新しい行が存在しないことを確認してください。service_roleは使用しないでください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In @.coderabbit.yaml around lines 38 - 46, Update the INSERT negative-test
guidance under the test/db/** configuration to require an authenticated test
subject that can read the target rows, then verify from that subject that no new
row was created. Do not rely only on the rejecting client’s empty RETURNING or
SELECT result, and explicitly prohibit service_role credentials.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/roadmap.md`:
- Line 89: The CodeRabbit plan assumptions are inconsistent across the roadmap
and configuration. In docs/roadmap.md lines 89-89, replace “無料の3人目” with the
verified plan name and document behavior after the trial ends; in
.coderabbit.yaml lines 17-19, update the explanation for
auto_pause_after_reviewed_commits: 0 to reflect the actual plan that permits
GitHub PR reviews and its applicable limits.

---

Outside diff comments:
In @.coderabbit.yaml:
- Around line 38-46: Update the INSERT negative-test guidance under the
test/db/** configuration to require an authenticated test subject that can read
the target rows, then verify from that subject that no new row was created. Do
not rely only on the rejecting client’s empty RETURNING or SELECT result, and
explicitly prohibit service_role credentials.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: b896b716-50f0-48ae-a6c1-993e56f9d0a1

📥 Commits

Reviewing files that changed from the base of the PR and between 36212ed and 4ef0ec8.

📒 Files selected for processing (2)
  • .coderabbit.yaml
  • docs/roadmap.md

Comment thread docs/roadmap.md Outdated
@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー結果

このPRはコード変更を含まない、ドキュメント/レビューボット設定のみの変更(CLAUDE.md, .coderabbit.yaml, docs/permissions.md, docs/roadmap.md)でした。そのため観点として指定された以下はいずれも該当なしです。

  • asキャスト、any@ts-ignore/eslint-disableによるエラーの黙殺 → 対象コードなし
  • common/に置くべき判断ロジックのapp//mcp/への複製 → 対象コードなし
  • 権限判定・削除時の分岐・公開設定の既定値の変更とテストの有無 → 実装/テストの変更なし
  • 型の手書き禁止・生成型/z.inferからの導出 → 対象コードなし

重点的に検証した点

docs/permissions.mdに追加された、RLSのRETURNINGまわりの挙動説明が今後の否定側テストの書き方を左右する重要な内容だったため、PostgreSQL公式ドキュメント(Row Security Policies, CREATE POLICY)と突き合わせて事実確認しました。

  • WHERE/RETURNINGが列を参照するUPDATE/DELETEはSELECTポリシーの可視性も要求する」
  • 「更新後の行がSELECTポリシーを満たさないとUPDATEはエラーになる(new row violates row-level security policy。INSERTも同様)」
  • 「DELETEはSELECTポリシーを満たさない行が削除候補からフィルタされ、0件になる(エラーにはならない)」

これらはすべて公式ドキュメントの記述と一致しており、正確です。「RETURNINGやSELECTが空=弾かれた証明にはならない」という結論も妥当で、docs/testing.mddocs/permissions.mdの既存方針(否定側テストを本人視点の値変化で確認する)と整合しています。

軽微な所見(nitpick、対応不要判断でも問題なし)

PR本文のTest planのチェックボックスが3つとも未チェックですが、実際のレビュー履歴(gh pr view 35 --json reviews)を見るとClaudeは3回、CodeRabbitも3回ドラフト中にレビューを実行済みで、Copilotのレビューはまだ入っていません。つまり1個目・2個目の項目は実質確認済みのはずです。マージ前にチェックを更新するか、Ready化のタイミングでまとめて確認するとよさそうです(ブロッカーではありません)。

総評

ドキュメントの内容・技術的な正確性ともに問題なし。既に4回の自己修正ラウンドを経ており、記述の精度は高い状態です。Approve相当と判断します。

## CodeRabbit 5回目レビューの指摘分類 (commit 4ef0ec8)

- CodeRabbitのレビュー実行結果が毎回`Plan: Pro Plus`と表示されており、
  CLAUDE.md/roadmap.mdが前提としていた「Freeプラン・1回/時のレート制限」
  と矛盾していた。GitHub App導入直後のトライアル期間中の可能性が高いため、
  本物の修正として注記を追加した(トライアル終了後にFreeプランの制限が
  実際に効き始めたら更新する)。
- .coderabbit.yamlのtest/db/**向けpath_instructionsで、INSERTの否定側
  テストが「対象行を見られる側の視点で」新規行が作られていないことを
  確認する、という条件が抜けていた(UPDATE/DELETEは明記済み)。妥当な
  nitpickとして、docs/permissions.mdの既存記述と揃える形で修正した。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@reitojike

Copy link
Copy Markdown
Owner Author

CodeRabbit 5回目レビューの指摘分類 (commit c68ebb4)

# 場所 分類 対応
1 docs/roadmap.md:89 / .coderabbit.yaml 本物の修正 このPRのCodeRabbitレビュー実行結果は毎回Plan: Pro Plusと表示されており、docs側が前提としていた「Freeプラン・1回/時のレート制限」と矛盾していた。GitHub App導入直後のトライアル期間中の可能性が高いと判断し、その旨の注記をCLAUDE.md/roadmap.mdに追加した。トライアル終了後に実際のレート制限が確認できたら更新する
2 .coderabbit.yaml:38-46 妥当なnitpick INSERTの否定側テスト観点に「対象行を見られる側の視点で」が抜けていた(UPDATE/DELETEは明記済み)。docs/permissions.mdの既存記述と揃える形で追記した

Comment thread docs/permissions.md
Comment thread CLAUDE.md
@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー総評

ドキュメント/設定ファイルのみのPR(CLAUDE.md, .coderabbit.yaml, docs/roadmap.md, docs/permissions.md)。コード変更がないため、asキャスト・anyeslint-disable・common/への判断ロジック集約・生成型/Zod由来の型といった観点は今回は対象外。

全体として、CodeRabbitの5回の指摘往復を経て「未検証の事実には未検証と明記する」という自己規律が丁寧に守られている良いPRです。特に docs/permissions.md のRETURNING罠の説明は、PostgreSQL公式ドキュメントの一次情報に基づいて書かれている点が評価できます。

本物の修正(インラインコメント参照)

  • docs/permissions.md 88-99行目: UPDATE ... RETURNING が「更新後の行がSELECTポリシーを満たさないとエラーになる」という説明が、同じ段落内の「エラーも出ない」という記述および直後のコード例(try/catchなしで空配列を期待)と矛盾しています。PostgreSQL公式ドキュメントを確認したところ、UPDATE/DELETEのUSING句(既存行の候補選定)に失敗した行はエラーなしで静かに除外される一方、更新後の新しい行がSELECTポリシーを満たさない場合のみエラーになる、という別の仕組みです。このドキュメントが例示している「他人の行を更新しようとする」典型的な否定側テストは前者(expenses_update_ownusing (user_id = auth.uid()) で静かに弾かれる)に該当し、実際にはエラーになりません。RLSテストの書き方を規定する重要なドキュメントなので、修正を推奨します。DELETE/INSERTの説明は公式ドキュメントと整合しており問題ありません。

妥当なnitpick(インラインコメント参照)

  • CLAUDE.md 57-58行目: Copilotがdraft中は走らないという記述が新規追加されていますが、docs/roadmap.md の同PRでの追記はこれを「CLAUDE.mdの既存記載を踏襲したもの」として扱い、自身の記述だけを「未検証」と明記しています。実際にはこの主張自体が本PRで初めてCLAUDE.mdに持ち込まれたもの(base branch時点のCLAUDE.mdに"Copilot"の言及なし)なので、roadmap.md側の位置づけと軽い不整合があります。Rulesetの設定自体は確認可能な事実なので致命的ではありません。

確認できた点

  • .coderabbit.yamlpath_instructionsCLAUDE.mdの絶対ルール・docs/permissions.mdのRLS検証要件を的確に反映している
  • docs/permissions.md のDELETE/INSERTのRETURNINGに関する説明はPostgreSQL公式ドキュメント(sql-createpolicy.html)と整合している
  • claude-review.yml / codex-review.yml のトリガー条件(opened, synchronize, reopened)は、CLAUDE.mdが説明する「draftのpushごとに走る」という挙動と一致している
  • 未検証事項(CodeRabbitのauto_pause_after_reviewed_commits: 0が本当に無制限として機能するか、Copilotのdraft/ready挙動の実地確認など)が明示的にコメント/ドキュメントに残されている点は良い運用

🤖 Generated with Claude Code

## Claude 4回目レビューの指摘分類 (commit c68ebb4)

- docs/permissions.md:88-99が自己矛盾していた。「UPDATE...RETURNINGは
  SELECTポリシー不一致でエラーになる」と書きながら、直後で同じ状況を
  「エラーも出ない」と説明し、コード例もtry/catchなしでdata=[]を期待して
  いた。実際のexpenses_update_ownポリシー(using (user_id = auth.uid()))
  で検証すると、他人の行を更新しようとするケースはUSING句で静かに除外
  される(エラーなし・0件)。「更新後の行がSELECTポリシーを満たさない
  とエラー」は別の仕組みで、UPDATE/SELECTポリシーの条件が食い違う場合
  にのみ起こる、より狭いケース。本物の修正として2つの仕組みを分けて
  説明し直した
- docs/roadmap.mdの「Copilotのdraft/ready挙動はCLAUDE.mdの既存記載を
  踏襲」という記述が誤り(base branch時点のCLAUDE.mdにCopilotへの言及は
  なく、このPRで新規に持ち込んだ主張だった)。妥当な指摘として、
  Rulesetの設定自体は既知の事実である一方、挙動の実地確認はまだして
  いない、という位置づけに書き直した

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
@reitojike

Copy link
Copy Markdown
Owner Author

Claude 4回目レビューの指摘分類 (commit 2ec236b)

# 場所 分類 対応
1 docs/permissions.md:88-99 本物の修正 UPDATE...RETURNINGのRLS挙動説明が自己矛盾していた(「エラーになる」と書きながら直後で「エラーも出ない」と説明し、コード例もエラーなしを期待)。実際のexpenses_update_ownポリシーで検証し、USING句による静かな除外(エラーなし)と、更新後の行がSELECTポリシーを満たさない場合のエラー(別の狭いケース)を分けて説明し直した
2 docs/roadmap.md(Copilotのdraft/ready挙動の位置づけ) 妥当なnitpick 「CLAUDE.mdの既存記載を踏襲」という記述が誤りだった(base branch時点でCopilotへの言及なし、このPRで新規に持ち込んだ主張)。Rulesetの設定自体は既知の事実、挙動の実地確認はまだ、という位置づけに修正した

CodeRabbitの「Freeプラン前提の記述をPlan名に合わせて統一してほしい」という重複指摘は見送った。トライアル期間中の可能性が高いという判断で、既に注記を追加済み(commit c68ebb4)。実際のプラン契約状況はこちらでは確認できないため、確定的な書き換えはユーザー確認待ちとする。

@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー総評(独立検証)

コード変更なし。.coderabbit.yaml(新規)・CLAUDE.mddocs/permissions.mddocs/roadmap.mdのみのdocs/config PRです。このPRはすでにClaude/CodeRabbitで5往復のレビュー・修正を経ており、as/any/eslint-disableの黙殺・common/への判断ロジック集約・生成型/z.infer由来の型・権限判定や削除分岐のテストといった観点は対象コードがないため該当なしです。

過去の指摘を鵜呑みにせず、現在のHEAD(2ec236b)の内容を独立に検証しました。

技術的正確性(独立検証)

docs/permissions.mdに追加された、RLSのRETURNING挙動に関する説明をPostgreSQL公式ドキュメント(sql-createpolicy.html)と突き合わせました。

If a newly inserted or updated row does not satisfy the relation's SELECT policies, an error will be thrown (inserted or updated rows to be returned are never silently ignored).

この一次情報と、現在の記述(USING句による静かな除外とUPDATE/INSERTのRETURNINGがSELECTポリシー違反でエラーになるケースを分けて説明している箇所)は一致しており、以前指摘されていた自己矛盾(「エラーになる」と書きながら直後で「エラーも出ない」とするコード例が並んでいた版)はcommit 2ec236bで解消済みであることを確認しました。DELETEについては「SELECTポリシーを満たさない行は静かにフィルタされ0件・エラーなし」という記述に留まっており(RETURNINGエラーの主張はしていない)、これも公式ドキュメントの一般原則と矛盾しません。

また、test/db/expenses.test.ts / budgets.test.ts / events.test.ts / profiles.test.ts / event-participants.test.ts を確認したところ、ドキュメントが説明しているパターン(否定側テストは「対象行を見られる側の視点」で値の不変・行の存続を確認する)は既にコード側で実装済みでした。今回のドキュメント変更は実装を後追いで正確に説明する内容になっており、齟齬はありません。

気になった点(いずれもブロッカーではなく、過去レビューで既出)

  • docs/roadmap.mdの「CodeRabbitの導入」行にある「Draft PRでも反復レビューされることをPR #35で確認済み」という記述に対し、このPR自身のTest planの3チェックボックスは現時点でも未チェックのままです。実際のレビュー履歴(CodeRabbitがdraft中に複数回起動している)から記述内容自体は裏付けられるため実害はありませんが、マージ前にチェックボックスを実態に合わせて更新するか外すことを推奨します(過去のClaudeレビューでも同様の指摘済み)。
  • .coderabbit.yamlauto_pause_after_reviewed_commits: 0が実際に「無制限」として機能するかは、コメント内で「実地確認はまだ済んでいない」と正直に明記されており、この運用姿勢(未検証は未検証と書く)は好ましいと判断しました。

総評

ブロッキングな指摘なし。技術的主張はPostgreSQL公式ドキュメントで裏取りでき、既存のtest/db/実装とも整合しています。CLAUDE.mdの絶対ルールに抵触する箇所もありません。Test planのチェックボックス更新のみ、マージ前に検討してください。

@reitojike
reitojike marked this pull request as ready for review August 7, 2026 00:46
Copilot AI lite review requested due to automatic review settings August 7, 2026 00:46

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (2)

docs/permissions.md:112

  • UPDATEの例でも、data ?? []before?.amount の形だと、クエリがエラーで data: null / before: null になった場合に意図せずテストが成立しうるため、errornull であることと、取得できていることを明示的に確認する例の方が安全です。
const { data: before } = await asUserA.from("expenses").select("amount").eq("id", id).single();

// これだけでは何も検証していない(WHERE不一致で0件なのか、正しく弾かれて0件なのか区別できない)
const { data } = await asUserB.from("expenses").update({ amount: 1 }).eq("id", id).select();
expect(data ?? []).toHaveLength(0);

docs/permissions.md:85

  • 否定側の例で data ?? [] にフォールバックすると、クエリ自体がエラーで data: null になっても「0件」としてテストが通ってしまい、RLSではなく別の失敗(例: 権限/スキーマ/ネットワーク)を見逃します。errornull であることも併せて検証する例にした方が、意図(USING句で静かに0件になる)が伝わります。

This issue also appears on line 108 of the same file.

expect(dataA ?? []).toHaveLength(3);

// これが本体
const { data: dataB } = await asUserB.from("expenses").select();
expect(dataB ?? []).toHaveLength(0);

Comment thread docs/roadmap.md Outdated
@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー総評

このPRはコード変更なし(.coderabbit.yaml新規、CLAUDE.md/docs/permissions.md/docs/roadmap.mdのみ)。CLAUDE.mdの「絶対に守ること」(as/any/eslint-disable禁止、common/への判断ロジック集約、型の生成元)は対象コードが存在しないため該当なしです。

確認した内容

  • docs/permissions.md の技術的正確性: UPDATE/DELETEのUSING句による静かな除外と、RETURNINGがSELECTポリシー未充足でエラーになるケースを分けて説明しており、既に何度も指摘・修正されてきた自己矛盾(USING句とRETURNINGのエラー条件の混同)は解消されています。コード例もdata ?? []でnull安全になっており、CodeRabbit/Copilotの過去指摘が反映済みでした。
  • .coderabbit.yaml の path_instructions: docs/permissions.md「RLS検証の必須要件」・docs/testing.mdの内容と整合しており、UPDATE/DELETE/INSERTそれぞれの否定側テストで「対象行を見られる側の視点」を確認する観点が明記されています。service_role禁止の言及もあり。
  • CLAUDE.md の記述: 各レビューボット(Claude/Codex/CodeRabbit/Copilot)の発火条件・レート制限・quota失敗時の再リクエスト手順(gh api .../requested_reviewers)は、実際のworkflow定義(claude-review.yml/codex-review.yml)や本PR自身の実地確認結果(コミットメッセージ・Test plan記載)と矛盾していませんでした。
  • docs/roadmap.mdとの整合性: 「保留: 外部アカウント待ち」への相互参照は現存する見出しと一致しています。

指摘

  • nitpick(インラインコメント参照): docs/roadmap.md89行目の「CodeRabbitの導入」セルが、同じ表の他の行に比べて突出して長く、CodeRabbitとCopilot両方の実地確認結果が1セルに混在しています。ブロッキングではありませんが、表の一覧性という観点で分割を検討してもよさそうです。

権限判定・削除分岐・公開設定の既定値に関わるコード変更は今回なく、テストの要否について指摘する点はありませんでした。

## Copilot 2回目レビューの指摘分類 (commit 40bf55d)

- docs/permissions.md:81/85/108,112 | 本物の修正 | 前回追加した`data ?? []`
  というnull安全化が、実はerrorが発生してdata:nullになったケースを
  「0件」として静かに握りつぶしてしまう、というCopilotの指摘は的確だった。
  「否定側テストが何も検証していない」ことへの警戒を説くドキュメント自身が
  同じ落とし穴を持っていたことになる。`?? []`を外し、`error`がnullである
  ことを明示的に検証する形に修正した

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings August 7, 2026 01:11
@reitojike

Copy link
Copy Markdown
Owner Author

レビュー指摘分類 (commit 9447f05)

# 場所 分類 対応
1 docs/permissions.md(Copilot 2回目) 本物の修正 前回追加したdata ?? []が、実はerror発生時のdata:nullを「0件」として握りつぶす欠陥だった、という指摘は的確。「否定側テストが何も検証していない」ことを警戒する文書自身が同じ落とし穴を持っていた。errorを明示的に検証する形に修正した
2 docs/roadmap.md:89のセルが長い(Claude) 見送り ブロッキングではない旨明記されており、表構造を崩すリスクの方が大きいと判断し今回は見送り

前回のClaudeレビュー(commit 40bf55d)で挙がった、docs/roadmap.mdのCopilot挙動記述とCLAUDE.mdのquota失敗モード記述は、既にcommit 40bf55dで反映済みのため該当スレッドをresolveします。

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (2)

docs/permissions.md:119

  • 同様に、更新後の確認クエリでも single()error をチェックしていないため、取得に失敗して unchanged が null の場合でも、比較が成立してしまう可能性があります。意図通り「値が変化していない」ことを保証するため、error の検証を追加した方が安全です。
// これが本体。本人(対象行を見られる側)の視点で値が実際に変化していないことを確認する
const { data: unchanged } = await asUserA.from("expenses").select("amount").eq("id", id).single();
expect(unchanged?.amount).toBe(before?.amount);

docs/permissions.md:110

  • 後半の例(更新前の値を控える部分)だけ single()error を確認していないため、前段で強調している「errorがnullであることを確認する」方針と不整合になります。読者がそのままコピペすると、取得失敗時に before が null のままテストが意図せず通る可能性があります。

This issue also appears on line 117 of the same file.

```typescript
// 更新前に本人視点で元の値を控えておく
const { data: before } = await asUserA.from("expenses").select("amount").eq("id", id).single();

Comment thread docs/roadmap.md Outdated
@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー総評

このPRはdocs/設定ファイルのみの変更(CLAUDE.md, .coderabbit.yaml新規, docs/permissions.md, docs/roadmap.md)で、コード変更はありません。そのため以下は該当なし(コードが存在しないため検証不能/非適用)として確認しました。

  • asキャスト・any@ts-ignore/eslint-disableによるエラーの黙殺 → 対象コードなし
  • common/に置くべき判断ロジックのapp//mcp/への複製 → 対象コードなし
  • 生成型/Zod由来でない手書き型 → 対象コードなし

代わりに、今後のテストの書き方を左右するdocs/permissions.mdのRLS検証パターンの技術的な正確性を重点的に確認しました。

docs/permissions.md の技術的検証

追加された「UPDATE/DELETEの否定側テストは対象行を見られる側の視点まで確認する」「RETURNINGはSELECTポリシー不一致だとエラーになる(inserted or updated rows to be returned are never silently ignored)」という記述を、PostgreSQL公式ドキュメント(CREATE POLICY)と突き合わせて確認しました。

  • 標準的な単独UPDATE/DELETEでUSING句を満たさない行がエラーなく候補から除外されるという記述、およびRETURNINGで返す行がSELECTポリシーを満たさない場合はエラーになるという記述は、公式ドキュメントの文言と一致しており正確です。
  • 既存のtest/db/expenses.test.ts等を確認したところ、このPRが文書化した「本人視点で実際に変化していないことを確認する」パターンは既にPR #32で実装済みのテストで使われていました。つまりこのPRは既存の正しい実装を後追いで文書化したもので、既存テストとの矛盾はありません。
  • コード例も、以前のCopilotレビューで指摘された「data ?? []がエラーを隠す」問題を踏まえ、errorを明示的にtoBeNull()で検証してからdataを見る形になっており、ドキュメント自身が戒めている落とし穴を再現していません。

RETURNING/USING句の説明が過去のレビューラウンドで一度自己矛盾していた点(4回目のClaudeレビューで指摘・修正済み)も、最終状態では正しく書き分けられていることを確認しました。

コメントした点

  • docs/roadmap.mdのCodeRabbit導入行にある「プレミアムリクエスト13回相当」という数値に出典がなく、このPRの他の数値主張(公式docsへのリンク、実地確認の明記)と比べて厳密さのレベルが揃っていない、という妥当なnitpickをインラインで残しました。

その他確認した点

  • .coderabbit.yamlはYAML構造として問題なく、path_instructionsがCLAUDE.mdの絶対ルール・RLS検証要件と対応しています(CodeRabbit独自の設定キーの妥当性は外部サービス側の話のため未検証ですが、コミット履歴を見る限り実際のCodeRabbit実行結果でauto_pause_after_reviewed_commits: 0の挙動を実地確認済みです)。
  • CLAUDE.mdのDraft先行フローの説明と、docs/roadmap.md・PR本文のTest planの内容は整合しています。

全体として、過去のレビューラウンドで自己矛盾やnullフォールバックの問題が丁寧に潰されており、最終状態は正確です。ブロッキングな指摘はありません。

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
CLAUDE.md (1)

59-62: 🎯 Functional Correctness | 🟡 Minor | ⚡ Quick win

Copilotレビューの実行条件を条件付きで記載してください。

quotaに余裕がある場合に限り、Ready化時のCopilotレビューが実行されます。「1回受ける」ではなく「1回依頼する」と記載してください。Ready化後のpushごとの再レビューは、copilot_code_review Rulesetの設定により試行されます。設定確認の要求は削除してください。

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@CLAUDE.md` around lines 59 - 62,
CLAUDE.mdのCopilotレビュー運用記述を更新し、quotaに余裕がある場合に限ってReady化時にCopilotレビューを1回依頼する条件を明記してください。「1回受ける」ではなく「1回依頼する」とし、Ready化後のpushごとの再レビューはcopilot_code_review
Rulesetにより試行される旨を記載してください。設定確認を求める記述は削除してください。
♻️ Duplicate comments (1)
docs/permissions.md (1)

90-106: 🔒 Security & Privacy | 🟠 Major

SELECTポリシーによる空結果も説明してください。

Line 103-104 は、空の結果の原因を WHERE 不一致と USING 除外だけに限定しています。UPDATE または DELETEWHERE または RETURNING で対象列を読む場合、SELECT ポリシーも既存行を絞り込みます。そのため、data が空で errornull でも、SELECT ポリシーによる抑止を除外できません。

Line 96-101 は UPDATE ... RETURNING のエラーだけを説明しています。DELETE でも同じ条件で SELECT ポリシーが適用されます。空結果の判定にこの経路を追加してください。(postgresql.org)

修正例
-つまり「RETURNINGが空で、エラーも出ない」という結果だけでは、(a) `WHERE`条件に一致する行が
-最初から無かったのか、(b) USING句によって正しく弾かれたのか、を区別できない。
+つまり「RETURNINGが空で、エラーも出ない」という結果だけでは、(a) `WHERE`条件に一致する行が
+最初から無かったのか、(b) USING句によって弾かれたのか、(c) 対象列の読み取りに伴う
+SELECTポリシーによって既存行が絞り込まれたのか、を区別できない。
+
+DELETEでも、`WHERE`または`RETURNING`が対象列を読む場合はSELECTポリシーが適用される。
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/permissions.md` around lines 90 - 106, Update the documentation around
the empty-result explanation in the UPDATE/DELETE section to include
SELECT-policy filtering as an additional possible cause when data is empty and
error is null, including visibility needed by WHERE or RETURNING. Clarify that
DELETE is also subject to SELECT-policy behavior, while retaining the existing
UPDATE ... RETURNING error explanation and instructing tests to verify the
unchanged or remaining row from an authorized perspective.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@docs/permissions.md`:
- Around line 109-119: Update both asUserA single-row reads in the before and
unchanged checks to retain their error results and assert each error is null and
each data object is present before comparing amount; then compare the verified
amount values.

---

Outside diff comments:
In `@CLAUDE.md`:
- Around line 59-62:
CLAUDE.mdのCopilotレビュー運用記述を更新し、quotaに余裕がある場合に限ってReady化時にCopilotレビューを1回依頼する条件を明記してください。「1回受ける」ではなく「1回依頼する」とし、Ready化後のpushごとの再レビューはcopilot_code_review
Rulesetにより試行される旨を記載してください。設定確認を求める記述は削除してください。

---

Duplicate comments:
In `@docs/permissions.md`:
- Around line 90-106: Update the documentation around the empty-result
explanation in the UPDATE/DELETE section to include SELECT-policy filtering as
an additional possible cause when data is empty and error is null, including
visibility needed by WHERE or RETURNING. Clarify that DELETE is also subject to
SELECT-policy behavior, while retaining the existing UPDATE ... RETURNING error
explanation and instructing tests to verify the unchanged or remaining row from
an authorized perspective.
🪄 Autofix

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: d388b009-02b6-48cf-b995-5e2d61fd7816

📥 Commits

Reviewing files that changed from the base of the PR and between c68ebb4 and 9447f05.

📒 Files selected for processing (4)
  • .coderabbit.yaml
  • CLAUDE.md
  • docs/permissions.md
  • docs/roadmap.md

Comment thread docs/permissions.md
## レビュー指摘分類 (commit 9447f05)

- docs/permissions.md:110/119 | 本物の修正(Copilot) | 前回`error`検証を
  追加したUPDATE否定側テスト例で、同じブロック内の`before`/`unchanged`
  取得(`.single()`)にだけerror検証が抜けていた。一貫性のため全クエリに
  error検証を追加した
- docs/roadmap.md:89 | 妥当なnitpick(Claude) | 「プレミアムリクエスト13回
  相当」という数値に出典がなかった。公式の固定値ではなく実測値である旨を
  明記した

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Copilot AI review requested due to automatic review settings August 7, 2026 01:18
@reitojike

Copy link
Copy Markdown
Owner Author

レビュー指摘分類 (commit a9c1811)

# 場所 分類 対応
1 docs/permissions.md:110/119(Copilot) 本物の修正 前回error検証を追加したブロックで、同じブロック内のbefore/unchanged取得だけ検証が抜けていた一貫性の問題。全クエリにerror検証を追加した
2 docs/roadmap.md:89(Claude) 妥当なnitpick 「プレミアムリクエスト13回相当」に出典がなかった。公式の固定値ではなく実測値である旨を明記した

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 4 out of 4 changed files in this pull request and generated no new comments.

Suppressed comments (1)

CLAUDE.md:73

  • インラインコード(...)が改行をまたいでおり(72-73行)、Markdownとして正しくレンダリングされません。コマンドは箇条書き内の fenced code block にすると崩れずに読めます。
- Copilotの最終レビューは「プレミアムリクエストのquota上限に達したため実行できなかった」
  という形で失敗することがある(PR #35で発生)。この場合レビューコメントは投稿されるが
  中身のないもので、コードは実際にはレビューされていない。quotaを追加してから
  `gh api repos/{owner}/{repo}/pulls/{number}/requested_reviewers -X POST
  -f 'reviewers[]=copilot-pull-request-reviewer[bot]'` で再リクエストする

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

♻️ Duplicate comments (1)
docs/permissions.md (1)

90-106: ⚠️ Potential issue | 🟠 Major

SELECTポリシーによる除外を判定に追加してください。

Line 91 の「まずコマンド自身の USING 句で絞り込まれる」は、この例では不正確です。WHERE または RETURNING が対象テーブルの列を読む UPDATE/DELETE では、SELECT ポリシーも適用されます。USING 句は、読み取り可能な行のうち、更新または削除を許可する行を制限します。(postgresql.org)

そのため、Lines 103-104 の分類に SELECT ポリシーによる除外を追加してください。data=[] かつ error=null は、(a) WHERE 条件不一致、(b) SELECT ポリシーによる非可視化、(c) command-specific USING 句による除外のいずれでも発生します。Line 96-101 の UPDATE ... RETURNING のエラー説明は維持できます。

修正例
- PostgreSQLのRLSでは、UPDATE/DELETEの対象行はまずコマンド自身のUSING句で絞り込まれる。
+ 対象テーブルの列をWHERE、RETURNING、または更新式で読むUPDATE/DELETEでは、
+ SELECTポリシーとコマンド自身のUSING句の両方が対象行を制限する。

- (a) WHERE条件に一致する行が最初から無かったのか、(b) USING句によって正しく弾かれたのか
+ (a) WHERE条件に一致する行が最初から無かったのか、(b) SELECTポリシーで見えないのか、
+ (c) USING句によって正しく弾かれたのか
#!/usr/bin/env bash
set -euo pipefail

rg -n -C 4 \
  'expenses_update_own|CREATE POLICY|SELECT|UPDATE|DELETE|RETURNING|USING|\.update\(|\.delete\(' \
  docs/permissions.md supabase test 2>/dev/null || true
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@docs/permissions.md` around lines 90 - 106, Update the explanation around the
UPDATE/DELETE result classification in docs/permissions.md to include
SELECT-policy invisibility as a third cause of data=[] with error=null,
alongside WHERE mismatch and command-specific USING exclusion. Keep the existing
UPDATE ... RETURNING error explanation intact, and revise the USING description
so it accurately distinguishes SELECT visibility from command authorization.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Duplicate comments:
In `@docs/permissions.md`:
- Around line 90-106: Update the explanation around the UPDATE/DELETE result
classification in docs/permissions.md to include SELECT-policy invisibility as a
third cause of data=[] with error=null, alongside WHERE mismatch and
command-specific USING exclusion. Keep the existing UPDATE ... RETURNING error
explanation intact, and revise the USING description so it accurately
distinguishes SELECT visibility from command authorization.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 44c50e96-0cdf-49be-a364-c161ec980a77

📥 Commits

Reviewing files that changed from the base of the PR and between 9447f05 and a9c1811.

📒 Files selected for processing (2)
  • docs/permissions.md
  • docs/roadmap.md

Comment thread CLAUDE.md
Comment on lines +74 to +75
- Ready化後にCopilot/CodeRabbitの指摘で追加修正が発生した場合は、都度pushしてよい
(Ready後はpushのたびに再レビューが走る。ただしCodeRabbitは上記レート制限の対象)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

妥当なnitpick: このDraft先行フローの狙いは「Claude/Codex/CodeRabbitとの反復ではプレミアムリクエストを消費せず、Copilotの最終レビューだけ1回受ける」ことのはず(52-62行目)。しかしこの箇条書きは「Ready化後の追加修正は都度pushしてよい」としており、Ready後の再push1回ごとにCopilotのレビューが再度走ってプレミアムリクエストを消費する(すぐ上の行が明記している通り)。指摘が多く複数回の追加pushが必要になった場合、このPR自体がまさにその状態(Ready化後もレビュー往復が発生)であり、結局Copilotのクレジットを何度も消費してしまう可能性がある。「Ready後に指摘が複数回にわたりそうな場合はDraftに戻す」のような回避策や、そもそも許容している旨を一言添えておくと、この運用が解決しようとしている問題(Copilotのクレジット消費)を自ら再現してしまう抜けを塞げる。

@claude

claude Bot commented Aug 7, 2026

Copy link
Copy Markdown

レビュー総評

このPRは CLAUDE.md / .coderabbit.yaml(新規) / docs/roadmap.md / docs/permissions.md のみを変更するドキュメント・設定変更で、app/ common/ mcp/ lib/ test/ 配下のコードは変更していません。そのためレビュー観点のうち「as/any/eslint-disableの黙殺」「common/の判断ロジック複製」「生成型/z.inferからの型導出」は今回の変更範囲には該当しません。

良い点

  • 新設した .coderabbit.yamlpath_instructions は、CLAUDE.md「絶対に守ること」の各項目(as/any/@ts-ignore/eslint-disablecommon/複製、生成型/z.infer)を今後のts/tsx変更に対して機械的にチェックさせる形になっており、方針と一致しています。
  • docs/permissions.md に追加されたUPDATE/DELETE/INSERTのRETURNINGに関する記述を、実際のマイグレーション(supabase/migrations/20260806034559_rls_policies.sql)と突き合わせて確認しました。expenses_update_ownusing (user_id = auth.uid())event_participantsの招待時visibility='private'固定など、記述と実装が一致しており、RLSの挙動説明(USING句による静かな除外とSELECTポリシー起因のRETURNINGエラーの違い)もPostgreSQL公式ドキュメントの記述と整合しています。10回近いレビュー往復で「USING句が壊れていても同じ結果になりうる」という誤った初期記述が正確な説明に修正されており、自己矛盾も解消済みです。
  • docs/testing.mddocs/lint-policy.mdの既存方針(否定側テストが本体、dataのnullフォールバックでerror検証を隠さない等)とも矛盾していません。

指摘

インラインコメントを1件投稿しました(CLAUDE.md)。Draft先行フローの狙いである「Copilotのプレミアムリクエスト消費を1回に抑える」という目的に対し、「Ready化後の追加修正は都度pushしてよい(=都度Copilotの再レビューを消費する)」という運用が、指摘の多いPRではその目的を自ら損ないうる、という運用上の抜けです。妥当なnitpickとして分類しており、ブロッカーではありません。

その他、.coderabbit.yamlのYAML構文・auto_pause_after_reviewed_commits: 0の挙動・Copilotの再リクエストコマンド(gh api .../requested_reviewers)などは、PR本文のTest planと実PRでの実地確認結果と整合していることを確認しました。

@reitojike

Copy link
Copy Markdown
Owner Author

レビュー指摘分類 (commit a9c1811時点、最終)

# 場所 分類 対応
1 docs/roadmap.md:89「13回相当」出典なし 本物の修正 commit a9c1811で対応済み(実測値である旨を明記)
2 docs/permissions.md(CodeRabbit) 誤検知(stale) commit a9c1811のpush(01:18:20 UTC)の20秒前(01:18:00 UTC)にレビューが走ったもので、既に同じ内容をCopilotの指摘で対応済みだった版に対するもの。現在のコードはbeforeError/unchangedErrorともtoBeNull()で検証済み
3 CLAUDE.md(Claude, Ready後のpush運用) 妥当なnitpick、対応保留 「Ready化後の追加修正は都度pushしてよい」という運用が、指摘の多いPRではCopilotのプレミアムリクエストを繰り返し消費し、Draft先行フローの目的を自ら損ないうるという指摘。このPR自体がまさにその実例になっている。ブロッカーではないため、マージ判断と合わせてユーザーに確認する

@reitojike
reitojike merged commit beeefa1 into main Aug 7, 2026
9 checks passed
@reitojike
reitojike deleted the docs-review-flow-coderabbit branch August 7, 2026 01:38
reitojike added a commit that referenced this pull request Aug 7, 2026
* feat: markdownlintを導入し、静的解析強化の継続運用を確立する (#40)

CodeRabbitがPR #35〜#39で繰り返し指摘したMD040/MD031相当の指摘は、本来
静的解析で無料かつ即座に拾えるはずだった。markdownlint-cli2をyarn lintに
統合し、docs/**/*.md・.claude/skills/**/*.md・ルート直下*.mdをerrorで
ゲートする。既存の236件の違反(見出し/リスト/テーブル前後の空行、テーブル
のパイプ間隔など)は--fixで機械的に解消し、自動修正できなかった言語識別子
欠落(MD040)と引用ブロック内の空行(MD028)は手で直した。

併せて、レビュー指摘を起点に静的解析を強化していく運用をdocs/lint-policy.md
に明文化し、pr-review-flow skillの指摘分類に「静的解析で拾えたはずか」の
軸を追加した。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: yarn lintの説明をmarkdownlint統合後の実態に合わせる

CodeRabbitの指摘(PR #41): CLAUDE.md/docs/prd.mdの「yarn lint = ESLint」
という記述がpackage.jsonの実際のスクリプト(eslint && markdownlint-cli2)
と食い違っていた。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

* docs: yarn lint説明のツール名をmarkdownlint-cli2に統一

Copilotの指摘(PR #41): package.jsonの実際のパッケージ名(markdownlint-cli2)
と表記を揃える。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants