From b1ab4e29842bf9faf927dcaa78d2eaa0a1d837ee Mon Sep 17 00:00:00 2001 From: Masaharu Hayashi Date: Tue, 25 Aug 2026 08:31:35 +0000 Subject: [PATCH 1/3] =?UTF-8?q?fix(tools):=20remeasure.sh=20=E3=81=AE?= =?UTF-8?q?=E5=AF=BE=E8=B1=A1=E6=8A=BD=E5=87=BA=E3=82=92=E6=96=B0priority?= =?UTF-8?q?=E8=A1=A8=E8=A8=98=E3=81=AB=E8=BF=BD=E9=9A=8F=E3=81=95=E3=81=9B?= =?UTF-8?q?=E3=80=81=E6=97=A2=E5=AE=9A=E3=82=92=E8=AA=AD=E3=81=BF=E5=8F=96?= =?UTF-8?q?=E3=82=8A=E5=B0=82=E7=94=A8=E3=81=AB=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Claude PRレビューの指摘による修正。 1. 対象抽出が旧表記のままだった(実バグ) 優先度を P0(至急)/P0(最優先)/P1(高) から P1/P2 に改名した際、 remeasure.sh の $25 ~ /^P[01]/ を追随させ忘れていた。P0 はもう出力 されないため実質 P1(82件)しか拾えず、旧 P1(高) にあたる P2(150件、 IDOR疑い等)が既定実行の対象から漏れていた。/^P[12]$/ に修正。 2. 既定を読み取り専用にした 従来は WRITES=--allow-writes が既定で、オプション無しの実行でも 著者DB・サイト情報・ワークフロー状態が書き換わっていた。README に 注意は書いていたが、安全側が既定でないのは設計として不適切だった。 --read-only を廃し --allow-writes を明示指定に変更。 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01HXo9u6PoTf6VRKr3aiGvZ3 --- tools/api-inventory/scripts/README.md | 10 +++++----- tools/api-inventory/scripts/remeasure.sh | 23 +++++++++++++---------- 2 files changed, 18 insertions(+), 15 deletions(-) diff --git a/tools/api-inventory/scripts/README.md b/tools/api-inventory/scripts/README.md index cea5f95135..0f2ab33231 100644 --- a/tools/api-inventory/scripts/README.md +++ b/tools/api-inventory/scripts/README.md @@ -148,15 +148,15 @@ python3 tools/api-inventory/scripts/build_checklist.py export WEKO_API_INVENTORY_DIR=/path/to/weko-secret ./install.sh # スタックを起動しておく -tools/api-inventory/scripts/remeasure.sh # 未測定の P0/P1 を測る +tools/api-inventory/scripts/remeasure.sh # 未測定の P1/P2 を測る tools/api-inventory/scripts/remeasure.sh --all-unmeasured # 未測定を全件 tools/api-inventory/scripts/remeasure.sh --nos 607,618 # no を直接指定 -tools/api-inventory/scripts/remeasure.sh --read-only # GET/HEAD のみ(データを変えない) +tools/api-inventory/scripts/remeasure.sh --allow-writes # 書き込み系も測る(データが変わる) ``` -**既定では書き込み系も実測するため実機のデータが変わる。** 著者DB・サイト情報・ -ワークフローの状態などが書き換わるので、使い捨て環境で回すか、終了後に -`./install.sh` で作り直すこと。`--read-only` なら副作用はない。 +**既定は読み取り専用(GET/HEAD のみ)で副作用がない。** 書き込み系まで測るには +`--allow-writes` を明示する。実機のデータ(著者DB・サイト情報・ワークフローの状態)が +書き換わるため、使い捨て環境で回すか、終了後に `./install.sh` で作り直すこと。 反映は `apply_probe_results.py` が行い、**`dynamic_verified` が空の行だけ**を埋める。 既存の実測値(★実証など人手で精査した記述を含む)は残す。差し替えるときは diff --git a/tools/api-inventory/scripts/remeasure.sh b/tools/api-inventory/scripts/remeasure.sh index 7c19ea3db5..4a0c8c64f1 100755 --- a/tools/api-inventory/scripts/remeasure.sh +++ b/tools/api-inventory/scripts/remeasure.sh @@ -1,16 +1,17 @@ #!/usr/bin/env bash # 未測定/指定範囲のエンドポイントを実機で測り直し、台帳に反映する。 # -# ./remeasure.sh # dynamic_verified が空の P0/P1 を測る +# ./remeasure.sh # dynamic_verified が空の P1/P2 を測る # ./remeasure.sh --all-unmeasured # 未測定を全件 # ./remeasure.sh --nos 607,618 # no を直接指定 -# ./remeasure.sh --read-only # GET/HEAD だけ(データを変えない) +# ./remeasure.sh --allow-writes # 書き込み系も測る(実機データが変わる) # # 前提: $WEKO_API_INVENTORY_DIR(台帳) と WEKO スタックが起動していること。 # -# 【注意】既定では書き込み系も実測するため **実機のデータが変わります**。 -# 著者DB・サイト情報・ワークフローの状態などが書き換わるので、 -# 使い捨て環境で回すか、終了後に環境を作り直してください。 +# 既定は **読み取り専用**(GET/HEAD のみ)で副作用がない。 +# 書き込み系まで測るには --allow-writes を明示すること。実機のデータ +# (著者DB・サイト情報・ワークフローの状態など)が書き換わるため、 +# 使い捨て環境で回すか、終了後に環境を作り直すこと。 set -euo pipefail HERE="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" : "${WEKO_API_INVENTORY_DIR:?台帳の場所を指定してください (export WEKO_API_INVENTORY_DIR=...)}" @@ -20,12 +21,12 @@ WORK="${WORK:-$(mktemp -d)}" mkdir -p "$WORK" TSV="$WEKO_API_INVENTORY_DIR/weko3_api_list.tsv" -SCOPE=p01; WRITES=--allow-writes; NOS="" +SCOPE=p12; WRITES=""; NOS="" while [ $# -gt 0 ]; do case "$1" in --all-unmeasured) SCOPE=all ;; --nos) NOS="$2"; SCOPE=nos; shift ;; - --read-only) WRITES="" ;; + --allow-writes) WRITES=--allow-writes ;; *) echo "不明な引数: $1" >&2; exit 2 ;; esac; shift done @@ -35,7 +36,7 @@ python3 "$HERE/fixtures.py" --out "$WORK/fixtures.json" echo "== 2. 対象の抽出 ==" case "$SCOPE" in - p01) awk -F'\t' 'NR>1 && $25 ~ /^P[01]/ && $16=="-" {print $1}' "$TSV" > "$WORK/nos.txt" ;; + p12) awk -F'\t' 'NR>1 && $25 ~ /^P[12]$/ && $16=="-" {print $1}' "$TSV" > "$WORK/nos.txt" ;; all) awk -F'\t' 'NR>1 && $16=="-" {print $1}' "$TSV" > "$WORK/nos.txt" ;; nos) tr ',' '\n' <<< "$NOS" > "$WORK/nos.txt" ;; esac @@ -56,5 +57,7 @@ python3 "$HERE/reconcile.py" --gate > /dev/null && echo " reconcile: 差分な echo echo "成果物: $WORK/probe.json (明細)" -echo "※ 実機のデータが変わっています。継続利用する場合は fixtures.py が冪等なので" -echo " 再投入で復旧しますが、著者DB等の副作用は残ります。" +if [ -n "$WRITES" ]; then + echo "※ 書き込み系を実測したため実機のデータが変わっています。fixtures.py は冪等ですが" + echo " 著者DB等の副作用は残ります。クリーンな状態が要るなら ./install.sh で作り直してください。" +fi From b6004e8ea759fbb4786880170ca58acef169c0ea Mon Sep 17 00:00:00 2001 From: Masaharu Hayashi Date: Tue, 25 Aug 2026 08:32:31 +0000 Subject: [PATCH 2/3] =?UTF-8?q?chore(ci):=20PR=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=81=AE=20pull=5Frequest=20=E3=83=88=E3=83=AA?= =?UTF-8?q?=E3=82=AC=E3=82=92=E7=84=A1=E5=8A=B9=E5=8C=96=E3=81=97=20workfl?= =?UTF-8?q?ow=5Fdispatch=20=E3=81=AE=E3=81=BF=E3=81=AB=E6=88=BB=E3=81=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 動作確認が済んだので試行用の自動起動を外す。実測値(682行の差分で 137〜160秒 / $0.35〜0.47)をコメントに残し、自動実行を検討する際の 判断材料にする。 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01HXo9u6PoTf6VRKr3aiGvZ3 --- .github/workflows/claude-pr-review.yml | 7 ++++--- tools/api-inventory/ci/claude-pr-review.yml | 7 ++++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.github/workflows/claude-pr-review.yml b/.github/workflows/claude-pr-review.yml index 61e6099573..d183e2b4b5 100644 --- a/.github/workflows/claude-pr-review.yml +++ b/.github/workflows/claude-pr-review.yml @@ -25,9 +25,10 @@ on: pr_number: description: 'レビュー対象の PR 番号' required: true - # TODO(試行中): 動作確認のため有効化。確認後は workflow_dispatch のみに戻す。 - pull_request: - branches: ['**'] + # 自動実行にする場合は下を有効にする。試行では 682 行の差分で + # 137〜160秒 / $0.35〜0.47 だった。PR ごとに回すなら利用枠の見積もりが要る。 + # pull_request: + # branches: ['**'] env: POST_TO_PR: 'false' diff --git a/tools/api-inventory/ci/claude-pr-review.yml b/tools/api-inventory/ci/claude-pr-review.yml index 61e6099573..d183e2b4b5 100644 --- a/tools/api-inventory/ci/claude-pr-review.yml +++ b/tools/api-inventory/ci/claude-pr-review.yml @@ -25,9 +25,10 @@ on: pr_number: description: 'レビュー対象の PR 番号' required: true - # TODO(試行中): 動作確認のため有効化。確認後は workflow_dispatch のみに戻す。 - pull_request: - branches: ['**'] + # 自動実行にする場合は下を有効にする。試行では 682 行の差分で + # 137〜160秒 / $0.35〜0.47 だった。PR ごとに回すなら利用枠の見積もりが要る。 + # pull_request: + # branches: ['**'] env: POST_TO_PR: 'false' From 9a23155ca2822de2b33cb545ae07da83c3d79264 Mon Sep 17 00:00:00 2001 From: Masaharu Hayashi Date: Tue, 25 Aug 2026 08:35:46 +0000 Subject: [PATCH 3/3] =?UTF-8?q?chore(ci):=20PR=E3=83=AC=E3=83=93=E3=83=A5?= =?UTF-8?q?=E3=83=BC=E3=82=92=E8=87=AA=E5=8B=95=E5=AE=9F=E8=A1=8C=E3=81=AB?= =?UTF-8?q?=E3=81=97=E3=80=81=E7=B5=90=E6=9E=9C=E3=82=92PR=E3=81=AB?= =?UTF-8?q?=E6=8A=95=E7=A8=BF=E3=81=99=E3=82=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - pull_request(opened/synchronize/reopened/ready_for_review)で自動起動する。 draft PR はスキップして利用枠を節約する。 - POST_TO_PR=true にしてレビュー結果を PR コメントとして投稿する。 - 同じ PR に push するたびコメントが増えないよう、マーカー を持つ既存コメントを探して更新する。無ければ新規作成。 - コメント末尾に「差分のみを対象にした自動レビューで誤りが含まれることがある」旨を 添える。 【注意】このリポジトリは public のため投稿内容は誰でも読める。認可の欠落など 機微な指摘が出る可能性があるので、公開して差し支えない内容かを運用で見ること。 投稿を止める場合は POST_TO_PR を false にする(artifact には残る)。 Co-Authored-By: Claude Opus 5 (1M context) Claude-Session: https://claude.ai/code/session_01HXo9u6PoTf6VRKr3aiGvZ3 --- .github/workflows/claude-pr-review.yml | 41 +++++++++++++++------ tools/api-inventory/ci/claude-pr-review.yml | 41 +++++++++++++++------ 2 files changed, 60 insertions(+), 22 deletions(-) diff --git a/.github/workflows/claude-pr-review.yml b/.github/workflows/claude-pr-review.yml index d183e2b4b5..c0b29b6f2e 100644 --- a/.github/workflows/claude-pr-review.yml +++ b/.github/workflows/claude-pr-review.yml @@ -10,8 +10,10 @@ # 【このリポジトリは public】 # Secret 名は CLAUDE_CODE_AUTH_TOKEN、CLI が読む環境変数は CLAUDE_CODE_OAUTH_TOKEN。 # - Secret は fork からの PR には渡らない。下の if で同一リポジトリに限定する。 -# - レビュー結果を PR に投稿すると誰でも読める。既定では投稿せず artifact 止まり。 -# POST_TO_PR を true にすると投稿する。 +# - **レビュー結果を PR に投稿する設定にしている(POST_TO_PR=true)。このリポジトリは +# public なので投稿内容は誰でも読める。** 認可の欠落など機微な指摘が出る可能性が +# あるため、公開して差し支えない内容かを運用で見ておくこと。 +# 投稿を止めるには POST_TO_PR を false にする(artifact には残る)。 # # 注: cloud-hosted の `claude ultrareview` は 2026-08 時点でこのアカウントでは # 利用できなかった("Ultrareview is currently unavailable")。ここでは @@ -25,13 +27,12 @@ on: pr_number: description: 'レビュー対象の PR 番号' required: true - # 自動実行にする場合は下を有効にする。試行では 682 行の差分で - # 137〜160秒 / $0.35〜0.47 だった。PR ごとに回すなら利用枠の見積もりが要る。 - # pull_request: - # branches: ['**'] + pull_request: + branches: ['**'] + types: [opened, synchronize, reopened, ready_for_review] env: - POST_TO_PR: 'false' + POST_TO_PR: 'true' MODEL: 'sonnet' MAX_DIFF_BYTES: '200000' # これを超える差分はレビューしない(分割が必要) @@ -40,7 +41,8 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 if: github.event_name == 'workflow_dispatch' || - github.event.pull_request.head.repo.full_name == github.repository + (github.event.pull_request.head.repo.full_name == github.repository && + github.event.pull_request.draft == false) permissions: contents: read pull-requests: write @@ -186,9 +188,26 @@ jobs: with: script: | const fs = require('fs'); + const MARK = ''; let body = '(レビュー結果を生成できませんでした)'; try { body = fs.readFileSync('review.md', 'utf8'); } catch (e) {} - await github.rest.issues.createComment({ - issue_number: context.issue.number, owner: context.repo.owner, - repo: context.repo.repo, body: body.slice(0, 60000), + body = MARK + '\n' + body.slice(0, 60000) + + '\n\n差分のみを対象にした自動レビューです。' + + '誤りが含まれることがあります。'; + // 同じ PR に push するたびコメントが増えないよう、既存の1件を更新する + const { data: comments } = await github.rest.issues.listComments({ + issue_number: context.issue.number, + owner: context.repo.owner, repo: context.repo.repo, per_page: 100, }); + const mine = comments.find(c => c.body && c.body.includes(MARK)); + if (mine) { + await github.rest.issues.updateComment({ + comment_id: mine.id, owner: context.repo.owner, + repo: context.repo.repo, body, + }); + } else { + await github.rest.issues.createComment({ + issue_number: context.issue.number, owner: context.repo.owner, + repo: context.repo.repo, body, + }); + } diff --git a/tools/api-inventory/ci/claude-pr-review.yml b/tools/api-inventory/ci/claude-pr-review.yml index d183e2b4b5..c0b29b6f2e 100644 --- a/tools/api-inventory/ci/claude-pr-review.yml +++ b/tools/api-inventory/ci/claude-pr-review.yml @@ -10,8 +10,10 @@ # 【このリポジトリは public】 # Secret 名は CLAUDE_CODE_AUTH_TOKEN、CLI が読む環境変数は CLAUDE_CODE_OAUTH_TOKEN。 # - Secret は fork からの PR には渡らない。下の if で同一リポジトリに限定する。 -# - レビュー結果を PR に投稿すると誰でも読める。既定では投稿せず artifact 止まり。 -# POST_TO_PR を true にすると投稿する。 +# - **レビュー結果を PR に投稿する設定にしている(POST_TO_PR=true)。このリポジトリは +# public なので投稿内容は誰でも読める。** 認可の欠落など機微な指摘が出る可能性が +# あるため、公開して差し支えない内容かを運用で見ておくこと。 +# 投稿を止めるには POST_TO_PR を false にする(artifact には残る)。 # # 注: cloud-hosted の `claude ultrareview` は 2026-08 時点でこのアカウントでは # 利用できなかった("Ultrareview is currently unavailable")。ここでは @@ -25,13 +27,12 @@ on: pr_number: description: 'レビュー対象の PR 番号' required: true - # 自動実行にする場合は下を有効にする。試行では 682 行の差分で - # 137〜160秒 / $0.35〜0.47 だった。PR ごとに回すなら利用枠の見積もりが要る。 - # pull_request: - # branches: ['**'] + pull_request: + branches: ['**'] + types: [opened, synchronize, reopened, ready_for_review] env: - POST_TO_PR: 'false' + POST_TO_PR: 'true' MODEL: 'sonnet' MAX_DIFF_BYTES: '200000' # これを超える差分はレビューしない(分割が必要) @@ -40,7 +41,8 @@ jobs: runs-on: ubuntu-latest timeout-minutes: 30 if: github.event_name == 'workflow_dispatch' || - github.event.pull_request.head.repo.full_name == github.repository + (github.event.pull_request.head.repo.full_name == github.repository && + github.event.pull_request.draft == false) permissions: contents: read pull-requests: write @@ -186,9 +188,26 @@ jobs: with: script: | const fs = require('fs'); + const MARK = ''; let body = '(レビュー結果を生成できませんでした)'; try { body = fs.readFileSync('review.md', 'utf8'); } catch (e) {} - await github.rest.issues.createComment({ - issue_number: context.issue.number, owner: context.repo.owner, - repo: context.repo.repo, body: body.slice(0, 60000), + body = MARK + '\n' + body.slice(0, 60000) + + '\n\n差分のみを対象にした自動レビューです。' + + '誤りが含まれることがあります。'; + // 同じ PR に push するたびコメントが増えないよう、既存の1件を更新する + const { data: comments } = await github.rest.issues.listComments({ + issue_number: context.issue.number, + owner: context.repo.owner, repo: context.repo.repo, per_page: 100, }); + const mine = comments.find(c => c.body && c.body.includes(MARK)); + if (mine) { + await github.rest.issues.updateComment({ + comment_id: mine.id, owner: context.repo.owner, + repo: context.repo.repo, body, + }); + } else { + await github.rest.issues.createComment({ + issue_number: context.issue.number, owner: context.repo.owner, + repo: context.repo.repo, body, + }); + }