# STEP 2058 — site-verify-signature.sh script v1 land (STEP 2057 spec の bash 実装、 UNKNOWN gate + redirect discipline embed、 self-test 4/4 PASS)

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

## 一行 summary

STEP 2057 SIGNATURE_SPEC v1 (canary revision) を `scripts/site-verify-signature.sh` bash 実装として land、 UNKNOWN gate (network failure = 3rd terminal state) + redirect discipline (`-L` fixed + final_url record) を 執筆時同時決着、 self-test 4/4 PASS (3 real boundary page + 1 fabricated fallback + canary、 chat-Claude 465-sweep min-ratio 1.83 evidence 私 独立 verify で 3809/3919/4021 byte 完全一致)。

## 主要 finding / evidence

- **Script API**: `scripts/site-verify-signature.sh [--json] [--site <root>] <url>` / `--self-test` for CI fixture。 exit 0 = REAL、 1 = FALLBACK、 **2 = UNKNOWN**、 3 = usage error。 human default + `--json` structured output で pipeline embed 可能。
- **UNKNOWN gate (① 執筆時 決着)**: fetch failure (network error / timeout / DNS unreachable) を第 3 終端 state、 PASS/FAIL に silently 落とさない。 `curl --connect-timeout 15 --max-time 30 -sL` で 実際 の 実測 case (rei-aios.org DNS 到達不能 = STEP 1908 §8 未解決 実 emerge input) が verdict=UNKNOWN exit=2 return 実測 verify。 canary fetch 失敗 case も別 UNKNOWN path (canary bytes 未取得で target 判定不能)。
- **Redirect discipline (② 執筆時 決着)**: `curl -sL` 固定 (redirect follow)、 `curl -w '%{url_effective}'` で 最終 URL を 常時 record + output emit。 CF Pages `.html` stripping 実測 (STEP 2049 sim.html → sim) で final_url 変更 record + verdict=REAL bytes=35203 verify。 「-L なしで 308 stub REAL 誤判定」 pattern を 仕様側で 構造的 close (script は `-L` を 常に fix)。
- **Canary method 実装**: `openssl rand -hex 4` で unique random path 生成 (fallback は `verify-$$-$RANDOM`)、 in-invocation baseline、 経路差 (STEP 2055 D 実測 の shell substitution -1 LF drop) は 同経路同士 で 相殺、 定数保存不要。 canary path shape 独立性 verify (STEP 2057 chat-Claude 3-shape test = 全 2078 B 一致) で 単一 canary で cross-shape valid。
- **Self-test 4/4 PASS (2026-09-16 実測)**: 3 real boundary fixture (`step-1531-pid-tuning-verdict/` 3809 / `step-1532-syntax-verdict/` 3919 / `step-1523-graph-verdict/` 4021)、 全 verdict=REAL + sig=0 + bytes > canary。 1 fabricated fallback (`__self-test-fabricated-<rand>/`)、 verdict=FALLBACK + sig=3 + bytes==canary。 chat-Claude 465-sweep evidence の 私 独立 verify (curl 3+1 発、 cost 訂正の 4 fetch 想定内)。
- **Bug found + fixed during dev**: `sig=$(grep -c "$SIG" "$file" || echo 0)` の `|| echo 0` が subshell 内で fire、 sig 値が `"0\n0"` に なり downstream 全崩壊 (`set -u` + tab-separated output 破壊 → `line 169: https: unbound variable`)。 修正 = `sig=$(grep -c ...) || sig=0` で subshell 外に fallback 移動、 self-test 全 pass に到達。 grep -c は matches=0 で exit 1 return + stdout "0" output、 `|| echo 0` は redundant + harmful pattern。

## Honest scope

- **主張しないこと**: script は SPA catch-all fallback を 持つ CF Pages 型 site のみ 較正済、 静的 404 return する Apache/nginx site では G1/G2 不要 (status code 単独で足りる)、 FALLBACK_SIG 文字列 は `Rei-AIOS — D-FUMT₈ Eight-Valued Logic Framework` hardcode で 他 site には fallback content の 実測 → constant 差替 必要。
- **測っていない残り**: 308 stub body size は script 内 で `-L` 固定 のため 実測 不能 (browser fetch と 同じ制約、 chat-Claude が 「通る可能性 高い、 -L 固定で close」 と cite)、 これは 仕様側で 「-L 常時」 で 実測 なし に close (仕様 明記 で 未来 debug 時に 経路 復元可)。
- **G3 title gate は 実装 skip**: STEP 2057 v1 spec で optional (locale-safe grep 較正 defer)、 script v1 は G1+G2 のみ で 実運用、 G3 は script v2+ candidate。
- **前提**: `curl` / `wc` / `grep` / `openssl` 4 tool の 依存、 `openssl` 無い環境 では `verify-$$-$RANDOM` fallback で bash builtin only。
- **確認していないこと**: chat-Claude 465 page 全 sweep の 私 独立 replicate は defer 継続 (curl 4 発 で gate correctness verify は 足りる、 median 分布 は gate 判定 と 独立)。 STEP 1608 候補 F との 区別 は script 本文 comment で 明記 embed 済 だが 実 code review 段階で cite 保証 な し (未来 audit で 「表面 pattern 類似」 誤認 risk 残存)。

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

- **What could go wrong 1 (subshell fallback bug pattern)**: `var=$(cmd || echo default)` は cmd 成功時 default 追加 で double-value bug (grep -c で hit)、 tab-separated output や numeric 判定 で downstream 全崩壊、 `set -u` 併用 で 誤 unbound variable error に 化ける。
- **Prevention 1**: `var=$(cmd) || var=default` が canonical、 subshell 内 fallback は fallback が exit code に 依存する 場合 に 限定。 grep -c / wc / awk 等 の 「常に numeric output だが 0-match で exit 1」 pattern は 特に注意。
- **What could go wrong 2 (redirect stub misclassification)**: `-L` なし の `curl -s URL | wc -c` で 308 stub body size を 実 content と 誤認、 REAL 判定 で 偽緑。
- **Prevention 2**: signature verify script では `-L` 常時固定、 `%{url_effective}` で 最終 URL record、 「redirect あり」 case は log 出力 で 明示。
- **What could go wrong 3 (fetch failure silent PASS/FAIL)**: DNS 到達不能 or timeout を silently REAL/FALLBACK 判定、 実 本番 site が down しても 気付かず 緑。
- **Prevention 3**: 3-state terminal (REAL / FALLBACK / UNKNOWN、 exit 0 / 1 / 2) で fetch failure を 別 exit code、 CI で UNKNOWN を error 扱い / retry 扱い を pipeline 側 で 決定。
- **What could go wrong 4 (STEP 1608 候補 F 誤認)**: canary を 「被測定対象 に合わせて baseline 動く」 と 未来 Claude が 誤認、 script 撤回。
- **Prevention 4**: script 本文 冒頭 comment に 「STEP 1608 candidate F distinction」 section を 常設、 「canary = independent baseline object, unrelated to measured object」 明記、 comment に spec (STEP 2057 notepad fragment) を cite。 v0-draft の 「STEP 1608 との 区別」 warning が script header に embed 完了。
- **Recovery**: self-test failure emerge 時、 (a) canary size drift (fallback content 更新) = canary path shape 変更 or FALLBACK_SIG 定数 更新 (b) real fixture failure = boundary 3 page が 変更 or 削除 = fixture URL 更新 or 統計的 re-calibration (median-boundary 別 3 page 選定)。

## 実 usage 例 (documentation)

```bash
# 単発 verify
scripts/site-verify-signature.sh https://rei-aios.pages.dev/tools/step-2057-signature-spec-v1/
# → verdict=REAL bytes=9432 sig=0 canary=2078 reason="g1+g2 passed"
#   final_url=<url>

# JSON output (pipeline embed)
scripts/site-verify-signature.sh --json https://rei-aios.pages.dev/tools/foo/
# → {"verdict":"REAL","bytes":9432,"sig":0,"canary":2078,"final_url":"...","reason":"..."}

# CI fixture (3 real boundary + 1 fabricated fallback)
scripts/site-verify-signature.sh --self-test
# → self-test: PASS (4/4) / exit 0

# Real-DNS-failure case (rei-aios.org unreachable, STEP 1908 §8)
scripts/site-verify-signature.sh https://rei-aios.org/tools/
# → verdict=UNKNOWN exit=2
```

## 詳細参照

- **Source**: `scripts/site-verify-signature.sh` (STEP 2058 land、 291 行、 bash 3.2+ compatible)
- **Spec**: `docs/notepad/2026-09-16T00-08_STEP-2057_signature-spec-v1-canary-revision.md` (v1 spec、 canary method + G1/G2 rule + STEP 1608 区別)
- **Predecessor**: `data/tabs/rei-aios-65/site-verify-signature-spec/SIGNATURE_SPEC_v0-draft.md` (v0-draft、 SUPERSEDED marker 済、 履歴 preserve)
- **継承**: [[step-2057-signature-spec-v1-canary-revision]] + [[step-2055-f1-signature-verify-and-f3-stray-tag-fix]] + [[step-2055-shell-substitution-strips-trailing-lf]] + [[step-1608-candidate-f-withdrawal]] + [[step-1853-kyakka-engine-abd]] + [[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 DNS 到達不能 root-cause (STEP 1908 §8) — 別 STEP candidate、 但し 本 script が UNKNOWN exit=2 で 実 emerge を 検知可能 = probe tool として 併用可
  - CF Pages routing 独立 audit (F2 起点) — 別 STEP candidate
  - 465 page 独立 sweep (統計分布 verify) — defer (gate correctness は self-test 4 fetch で 足りる)
  - G3 title pattern locale-safe 較正 (script v2+ candidate) — defer
