# STEP 2060 — site-verify-signature.sh v1.2: G0 status gate + api.rei-aios.org 530 hole close + D pre-work findings

**Timestamp**: 2026-09-16T00:55 (JST)
**Tab worktree**: main (rei-aios-65)
**Commit**: (to be filled by build)

## 一行 summary

chat-Claude D pre-work 実測 で 発見 = v1.1 が `api.rei-aios.org` (CF Tunnel 死んだ origin、 HTTP 530) を verdict=REAL 誤判定 (curl transport 成功 で UNKNOWN 経路にも 落ちず、 G1/G2 は content ベース で status を見ない)、 G0 status gate 最前段追加 (2xx 以外 = UNKNOWN)、 offline fixture に 4 UNKNOWN case (530/404/502/301) 追加 で 12/12 PASS、 実 api.rei-aios.org verdict=UNKNOWN exit=2 emerge。 rei-aios.org は **独立 2 故障 (apex DNS record 無 + tunnel origin 不到達)** と chat-Claude 切り分け 完了、 D は 別々 の 2 タスク 化、 但し 修正 location (CF dashboard + Oracle Cloud) は 本 tab 手 届かず = 実 fix には fix-capable tab or 藤本さん judgment 待ち。

## 主要 finding / evidence

- **Script 穴 発見 (chat-Claude 独立指摘)**: `https://api.rei-aios.org/` = HTTP 530 (Cloudflare Tunnel error `Cloudflare Tunnel error \| api-origin.rei-aios.org` 到達不能) + bytes 7,661 + sig 0 + canary 2,078 = v1.1 で G1 pass (sig=0) + G2 pass (7661 != 2078) → verdict=REAL、 exit=0 = **wrong**。 curl transport 層 成功 (200-family でない が network / DNS は 成功) で UNKNOWN にも 落ちない、 content-based gate は 「原点 が 意図する content か」 を 見ない。 私 独立実測 で bytes/http_code 完全再現。
- **修正 = G0 status gate 追加**: `classify_verdict` signature 拡張 = 3 args → 4 args (http_code 先頭)、 `[[ "$http_code" =~ ^2[0-9][0-9]$ ]]` gate、 G1/G2 の 前段。 fetch_url output 4-field TSV (`bytes\tsig\tfinal_url\thttp_code`)、 verify_url が http_code parse + delegate。 canary UNKNOWN discipline 拡張 = canary が 非 2xx return したら baseline 不信頼 = UNKNOWN emit + return 2 (`"canary returned http N (baseline untrustworthy)"` reason)。
- **Offline fixture 12/12 PASS** (STEP 2059 8 → 12 に 拡張): +4 G0 UNKNOWN cases (530 CF Tunnel / 404 not-found / 502 bad gateway / 301 non-followed redirect)、 実 boundary evidence (api.rei-aios.org 530 = 7661 bytes) を 具体 fixture に。 offline は 決定的、 network 不要、 「script が status gate 忘れ」 pattern を CI で 検知。
- **実 verify (post-fix)**:
  - `api.rei-aios.org` → verdict=UNKNOWN exit=2 reason=`"g0 failed (http 530, not 2xx)"` ✓
  - `pages.dev/tools/step-1531-pid-tuning-verdict/` → verdict=REAL exit=0 reason=`"g0+g1+g2 passed"` ✓ (regression)
  - `pages.dev/tools/.../sim.html` → verdict=REAL exit=0 final_url `.../sim` (redirect follow preserve) ✓
  - `rei-aios.org/tools/` → verdict=UNKNOWN exit=2 reason=`"target fetch failed"` (fetch-layer UNKNOWN、 G0 到達前) ✓ = **UNKNOWN 2 origin (transport failure + semantic failure) 別 reason で 区別 emit**
- **Combined `--self-test`**: offline 12/12 PASS + live 4/4 PASS、 combined exit 0 (script logic OK + site healthy)。
- **Dogfooding 主張 の 私 overclaim 訂正 (chat-Claude 指摘)**: 私 の 前 turn 「v0 4,156 gate なら 8,654 B 級 REAL 誤判定」 = 誤り、 未 deploy fragment は 2,078 B (v0 threshold 未満) で v0/v1 両者 FALLBACK 一致、 差は 3 boundary page (3,809-4,021) のみ。 代替 恒久 argument = **「v0 = fail-open / v1 = fail-closed」** (chat-Claude 提示、 v0 上側保護なし で fallback size が 4,156 超えた瞬間 全 404 silent REAL = fail-open pattern、 v1 は 同一 run canary 実測 で 構造的に起きない = fail-closed)。 実例 不要 で v0 撤回 理由 恒久成立。

## D pre-work (chat-Claude 独立 実測、 記録のみ、 fix は 別 tab 判断 待ち)

**rei-aios.org は 独立 2 故障**:

**故障 A (apex)**:
- `rei-aios.org` NS = `cullen.ns.cloudflare.com` / `walk.ns.cloudflare.com` = 委任 正常
- SOA 存在 (serial 2414295866) = zone 生きている (CF で 正常稼働)
- A / AAAA / CNAME / TXT / MX / CAA = **全 NODATA** (NOERROR かつ 応答ゼロ) = apex record 無し
- `www.rei-aios.org` = NXDOMAIN
- 症状 = cloudflared 完璧でも apex 到達不能、 「1033 error」 は 文面推定 (実際 code は 未確認)
- Fix location = **Cloudflare dashboard DNS** = 本 tab 手 届かず

**故障 B (tunnel)**:
- `api.rei-aios.org` A = 172.67.171.188 / 104.21.71.211 (CF proxy IP) = DNS + proxy 生きている
- `https://api.rei-aios.org/` = **HTTP 530**、 body `Cloudflare Tunnel error \| api-origin.rei-aios.org` (tunnel origin 到達不能)
- 症状 = CF が request 受けた後、 tunnel origin `api-origin.rei-aios.org` に到達不能
- Fix location = **Oracle Cloud 側 cloudflared** = 本 tab 手 届かず

**Honest scope (D pre-work)**: public DNS (Google Public DNS) + public HTTP のみ 外部測定、 CF dashboard / Oracle box / tunnel config は **未見**、 apex record が 削除されたか 元から 無いかは 不明、 1033 error code は 文面推定 (page に 数字として 出ていない)。 STEP 1908 §8 「DNS/tunnel 層」 曖昧記述 は 「2 別 tasks」 に 置換。

## Honest scope (v1.2 script)

- **主張しないこと**: G0 gate は 2xx range のみ check、 3xx 未 follow (curl `-L` で follow されない edge case、 例: circular redirect / max redirect 超え) は UNKNOWN 分類 だが 実 emerge 未 verify。 offline fixture の 301 case は 「curl -L が follow せず script に そのまま 渡された」 想定 の synthetic case、 実際 は curl -L が 3xx を transparent に follow するため 3xx が verify_url に届く case は 稀。
- **G0 は content gate と 独立**: G0 pass しても G1/G2 で FALLBACK に落ちうる、 「HTTP 200 でも 内容が SPA fallback」 pattern は 変わらず 検知 (v1.1 挙動 preserve)、 G0 は 「原点 が 内容 と 主張する ものは 2xx で 返す」 前提 に 基づく 追加 gate。
- **確認していないこと**: G0 定義 の 2xx range が 全 site convention と 一致 する か 独立 verify なし、 特殊 origin で 「300 で content 意図」 或いは 「200 で error 意図 (`{"error": ...}` JSON API 等)」 は 想定外 = 本 script は SPA + HTML page site 前提。
- **Chat-Claude relay evidence 引き継ぎ**: api.rei-aios.org bytes 7661 / 530 と rei-aios.org apex/tunnel 2 故障 は chat-Claude 実測、 私 側 は api.rei-aios.org bytes/http_code 独立再現 済 + rei-aios.org fetch failure verify 済、 DNS query (SOA / NS / NODATA) の 独立実測 は 未 (chat-Claude relay evidence verbatim 引用)。
- **Fix-capable tab 未確認 (chat-Claude 指摘、 D 着手前 の 前提)**: 故障 A (CF dashboard) + 故障 B (Oracle Cloud) は 本 tab (rei-aios-65) から 修正不能、 D の 実 fix は 別 tab or 藤本さん 直接操作 必要、 D scope が 「記録 + 藤本さん judgment 提示」 か 「実 fix 執行 (別 tab)」 か 事前 confirm 必要 = **本 STEP 2060 では D pre-work findings 記録のみ、 fix は defer**。

## Failure mode (機械学習用 dataset)

- **What could go wrong 1 (transport success + semantic failure blindness)**: HTTP 200-family でない response (5xx from proxies、 4xx from origins) を curl transport success で fetch、 content-based gate (marker / bytes) は 「script が content と 意図した か」 を 見ない ため 誤 classify、 特に CF Tunnel / CDN / API gateway が return する error page (custom body 付き) が REAL/FALLBACK に silent 分岐。
- **Prevention 1**: HTTP fetch script は 必ず status code capture + gate、 UNKNOWN の 分類 は (a) transport failure + (b) semantic failure の 2 origin を 別 reason で emit、 verify pipeline の 最前段 G0 に。
- **What could go wrong 2 (canary blindness to G0)**: canary fetch も 上流 proxy の error page を return したら baseline 不信頼、 但し script が canary を 「常に 2xx」 と 前提 で bytes 抽出 したら baseline 誤設定 で 全 target 判定 に drift 波及。
- **Prevention 2**: canary も G0 gate 対象、 canary が 非 2xx なら UNKNOWN emit + baseline 保存しない (canary UNKNOWN discipline 拡張、 STEP 2059 に 追加分)。
- **What could go wrong 3 (dogfooding overclaim pattern)**: script v1.2 が v1.1 の bug を 具体例 で demonstrate する 際、 「差が出ない case」 を 「差が出た」 と 誤伝、 rhetoric 上 差別化 だが 実 evidence では 一致。
- **Prevention 3**: dogfooding claim は 「両 gate で 判定 が 一致 する case は 差別化 に 使わない」、 差別化 argument は 実 差分 case (今 STEP なら api.rei-aios.org 530) or 恒久 structural argument (fail-open vs fail-closed) に。 「narrow specific claim」 or 「wide structural claim」 の 2 stance、 「narrow rhetoric + wide implication」 は 不明瞭 = 誤伝 発生源。
- **Recovery**: v1.2 fixture が 実 boundary case (api.rei-aios.org 530 / DNS 到達不能 rei-aios.org) を 常設 fixture に、 未来 script drift 時 は 実 site の 2 known failure input で 挙動 diff verify。

## 詳細参照

- **Source**: `scripts/site-verify-signature.sh` (STEP 2060 update、 v1.2、 G0 status gate + 12 offline fixture)
- **Predecessor**: `docs/notepad/2026-09-16T00-40_STEP-2059_site-verify-signature-v11-two-layer-self-test.md` (v1.1、 2-layer self-test)
- **Spec (v1)**: `docs/notepad/2026-09-16T00-08_STEP-2057_signature-spec-v1-canary-revision.md` (canary method、 STEP 1608 区別)
- **継承**: [[step-2059-site-verify-signature-v11-two-layer-self-test]] + [[step-2058-site-verify-signature-script-v1-land]] + [[step-2057-signature-spec-v1-canary-revision]] + [[step-1908-dns-tunnel-unresolved]] (未 archive、 本 STEP 2 故障切り分けで 置換 candidate) + [[feedback_regex_review_by_actual_execution_not_visual_audit]]
- **Pending items 更新** (rei-aios-65 tab 実行不能):
  - STEP 2050 page F2 訂正 (rei-aios-19 帰還 or override 待ち) — 継続
  - **rei-aios.org 故障 A (CF DNS apex)** — 記録完了、 fix = CF dashboard、 fix-capable tab 未 確認 (別 STEP or 藤本さん judgment 待ち)
  - **rei-aios.org 故障 B (cloudflared tunnel)** — 記録完了、 fix = Oracle Cloud、 fix-capable tab 未 確認 (別 STEP or 藤本さん judgment 待ち)
  - CF Pages routing 独立 audit (F2 起点、 別 STEP candidate) — 継続
  - G3 title pattern locale-safe 較正 (v2+ candidate) — 継続 defer
  - 465 page 独立 sweep 統計分布 verify — 継続 defer (offline 12 fixture で 足りる)
