---
name: project-step1375-4repo-public-publish-arc-2026-08-23
description: STEP 1375 arc — 帰宅後 arc 続編 (Arc 3-5 合流): rei-checker-mcp v0.2.0a1 protocol utility 5 module landed (73 test PASS) + discovery-worker v0.3 merge_gate runtime enforcement (23 test PASS) + fc0web 下 4 repo (codetrail + rei-solver + rei-fpga + analog-forge) public 公開達成。 SAC-4 認諾 2 件 (nobukifujimoto owner 404 → fc0web pivot / rei-fpga phantom CRLF diff cross-session 分業 fill)。
metadata:
  type: project
---

# STEP 1375 — 4 repo public publish arc (2026-08-23 未明、 帰宅後 arc 続編)

## 経緯

[[project-step1370-pat-redact-license-arc-2026-08-22]] の 4 arc 連鎖の うち、 Arc 2 (STEP 1370 site 反映) までは 前 turn 記録済。 本 STEP は **残 Arc 3-5** の 合流記録:

- **Arc 3** = rei-checker-mcp v0.2 protocol impl (V02_PROTOCOL.md §2/§3/§4/§6)
- **Arc 4** = discovery-worker v0.3 merge_gate runtime enforcement
- **Arc 5** = publish-4repos.sh 実行 → 4 repo (codetrail + rei-solver + rei-fpga + analog-forge) fc0web 下 public 公開

STEP 1373 (別 session の REPRODUCING.md pilot) が Arc 3 の v0.2.0a1 を **土台として 参照** している ([[project-step1373-rei-checker-mcp-reproducing-pilot-2026-08-23]]) が、 Arc 3 自体は entry-level 未記録、 Arc 4/5 は 完全未記録。 本 STEP で 揃える。

## Arc 3 — rei-checker-mcp v0.2.0a1 protocol utility 5 module

### 実装

V02_PROTOCOL.md (STEP 1366 起草、 chat-Claude Gemini critique 13 findings A-E → 6 protocol distill) の うち 4 protocol を isolated + testable utility として wire-ready 化。 real LeanBackend 未 landing、 v0.2.0a1 は 「protocol utilities in place, not yet wired to running Lean」 位置付け明示。

| Protocol | Status | Location | Test coverage |
|---|---|---|---|
| §1 A1 Sandbox | doc only (env-level) | `docs/V02_PROTOCOL.md` §1 | n/a (env-level) |
| §2 A2 spawn error handling | **landed** | `rei_checker/subprocess_util.py::_run_lean_safely` | 4 case (`TestSubprocessUtil`) |
| §3 A3 process tree kill | **landed** | `rei_checker/subprocess_util.py::_kill_process_tree` | 1 case (cross-platform Windows taskkill / POSIX killpg) |
| §4 B4 axiom JSON parse | **landed** | `rei_checker/axiom_parser.py::parse_axioms_from_lean_json_output` + `all_axioms_authorized` | 10 case (fixture-based: `depends on axioms:` post-v4.5 + `uses axioms:` pre-v4.5 + structured MessageData + malformed JSON + mismatched bracket + sorryAx detect) |
| §5 C7 REPL server | Stage 1 plumbing (STEP 1367) | `lean_backend/` (v4.29.0 pin, `Main.lean` MockBackend) | 13 smoke pass (Stage 1) |
| §6 D11 UNCLASSIFIED | **landed** | `rei_checker/schema.py::ReasonCode.UNCLASSIFIED` | 3 case + 1 update (`test_reason_code_has_seven_values` was `_six_initial_values`) |

### 副次 discipline

`AxiomScanResult.saw_axiom_diagnostic` 独立 flag を 追加 = 「axiom list 空 → `all_axioms_authorized([])` 真空 True」 trap 予防 (V02_PROTOCOL.md §4 threat 直接 counter)。 caller は `saw_axiom_diagnostic` を check してから vacuous True を trust する discipline。

`_run_lean_safely` NEVER raises invariant = FileNotFoundError / OSError / TimeoutExpired 全て tuple 返却、 caller (LeanBackend.check) が Verdict/ReasonCode 変換責任を持つ。 [[feedback-super-naming-siren-family-pattern]] 「果たせない約束を 名乗らない」 の 実践 (subprocess wrapper が 例外を hide しない、 明示 tuple で 全 failure mode 表現)。

### verify

- **73/73 test PASS** (55 pre-existing + 18 new: `TestAxiomParser` 10 + `TestSubprocessUtil` 5 + `TestReasonCodeUnclassified` 3)
- ResourceWarning in `test_kill_process_tree_noop_on_dead_pid` は cosmetic (Popen pipe unclosed)、 assertion 影響なし
- tsc equivalent (Python 3.13 syntax check) clean
- version bump: `0.1.0a1` → `0.2.0a1`、 CHECKER_VERSION tag `spike-2026-08-22` → `utils-2026-08-22`

### commit

- `fc0web/rei-checker-mcp` commit **`ba45b3a`** push 済 (base `0a1f82f` STEP 1367 v0.2.1 Lean 4 REPL harness Stage 1)
- V02_PROTOCOL.md に implementation-status table 追加 (§2/§3/§4/§6 landed marker + §5 Stage 1 marker + §1 env-level marker)

### 副次: STEP 1373 との 継承関係

STEP 1373 rei-checker-mcp REPRODUCING.md pilot が **本 v0.2.0a1 を 土台に 書かれた**: 「stdlib only + Lean 4 v4.29.0 pin + 73 test 全 pass の 具体条件が 揃っており reproducibility guide 書きやすい」 = 私 draft 提案 が 別 session で 実装された cross-session collaboration pattern (10 例目)。

## Arc 4 — discovery-worker v0.3 merge_gate runtime enforcement

### 実装

v0.2-notes.md §80 の 「v0.3 で `requires_pipeline_pass` を 実行時 enforcement 化」 の 実行。 v0.2 は advisory (downstream consumer が ignore 可能)、 v0.3 で 促進境界 (pipeline output → `output/approved/`) で 実行時 enforcement。

**新規 file 3**:
- `worker/merge_gate.py` (~300 行) — promotion decision engine + CLI (--dry-run + --allow-partial + --approved-dir)
- `tests/test_merge_gate.py` (23 test) — pure unit tests (no external network, no Lean 4)
- `tests/__init__.py` — package marker

**docs 1**:
- `docs/v0.3-notes.md` — spec delta + smoke test result + 10 discipline invariants + honest scope

### 促進 decision matrix

| Origin | Verdict | Default | With `--allow-partial` |
|---|---|---|---|
| Generator (`requires_pipeline_pass: true`) | full pass | **PROMOTE** | 同 |
| Generator | partial pass | **REJECT** (`generator_output_needs_full_filter_pass`) | **REJECT** (asymmetric — override 効かない) |
| Human-authored | full pass | **PROMOTE** | 同 |
| Human-authored | partial pass | **HOLD** | **PROMOTE** (`partial_pass_human_override`) |
| Any | `dropped_at_stage` or `NEITHER` | **REJECT** | **REJECT** (常に) |

**非対称性の意義**: `--allow-partial` は **人間の 判断責任** で partial pass を promote する escape hatch。 **generator の partial pass は override 不能** = 生成 noise が operator ceremony 経由で approved/ に入る経路を 構造的に閉じる。

### verify

- **23/23 test PASS** (`TestEvaluateResult` 7 + `TestRequiresPipelinePassExtraction` 4 + `TestStructuralErrors` 3 + `TestApplyDecision` 5 + `TestRunGate` 3 + `TestIsolationContract` 1)
- **Smoke test** (v0.2 pipeline output に dry-run 適用): 3 Wolstenholme conjectures 全 `dropped_at_stage` (v0.2 で hunter_beta が arXiv prior art 検出) → merge_gate 3 REJECT ✅ 生成 noise が approved/ に 到達せず (v0.3 core value 実証)
- **Isolation contract** programmatic verify = `TestIsolationContract` が merge_gate.py の import 行 全て grep で `rei_aios` / `rei-aios` / `rei_pl` / `rei_automator` 0 hit 保証

### commit

- discovery-worker commit **`bb019e8`** local (repo 元々 remote なし = 隔離 by boundary 設計、 [[feedback-isolation-by-repo-boundary-2026-08-22]] 継承)

## Arc 5 — 4 repo public 公開 (fc0web 下)

### 実行内容

publish-4repos.sh (別 session 起草 + 私 修正 fc0web owner + `SKIP_MARKETPLACE_GATE` flag 追加) 経由で 4 repo を **一括 public 公開**。

| repo | URL | commit | license | 特記 |
|---|---|---|---|---|
| codetrail | https://github.com/fc0web/codetrail | `6d6a709` | MIT ✅ | package.json + README を fc0web に revert (nobukifujimoto → fc0web、 Marketplace publisher は `CHANGE-ME-publisher-id` に 復元 = defer 明示) |
| rei-solver | https://github.com/fc0web/rei-solver | `52e53c0` | MIT ✅ | Z3/SymPy/PySAT 統合層 (21 tracked files) |
| rei-fpga | https://github.com/fc0web/rei-fpga | `78e4f9e` | MIT ✅ | yosys/GOWIN + rei-solver で 回路等価証明 (21 tracked files) |
| analog-forge | https://github.com/fc0web/analog-forge | `3263073` | MIT ✅ | analog circuit dataset generator (53 tracked files、 out/*/trials.jsonl 3 個 80 MB 各 warning) |

### SAC-4 認諾 record (2 件)

**#1 (最大)**: cloud Claude session の 「GitHub owner = nobukifujimoto」 assertion が 未存在 account (404) だった。 実行直前に `gh api users/nobukifujimoto` で 404 検出、 stop → 藤本さん判断 (option 2 = fc0web) GO で pivot。 cloud Claude assertion は user intent (「これから 作る予定」) を 前提とした先読みだったが、 私 (Rei機 session) の 現状 verify で 「未存在」 判明、 [[feedback-verify-claim-must-cover-all-source-derived-numbers]] operational 実例 (「所有者」 数値 = account 存在の verify 主張の 部分性)。 pivot 影響: codetrail の 5 箇所 revert commit `6d6a709` (publisher = defer + repo url × 4 = fc0web) + publish-4repos.sh `OWNER="${OWNER:-fc0web}"` 化 + `SKIP_MARKETPLACE_GATE=1` flag 追加 (gate は marketplace publish 用、 git push とは 論理層別)。

**#2**: rei-fpga phantom CRLF diff (4 files) を cloud Claude が 「.gitattributes で 消えている」 と claim、 実測で 未消去 = Windows filesystem 側で `git add --renormalize` 未実行だった partial gap。 私 (Rei機 session) で renormalize 実行 → 0 dirty clean 復元 = cross-session 分業の 別 例 (「chat/cloud で 認知 + local で 実行」 pattern 実例)。

### 副次 finding (analog-forge 80 MB files 3 個)

analog-forge push 時 GitHub warning:
- `out/final/trials.jsonl` (80.25 MB)
- `out/demo3/trials.jsonl` (80.25 MB)
- `out/demo4/trials.jsonl` (80.25 MB)

**状態**: Push 成功 (GitHub hard limit 100 MB は 未達、 推奨 50 MB は 超過)。 藤本さん 「tracked のまま出す」 判断で 意図的公開 = 動作は 意図通り。 「生成物込み repo」 として 公開状態、 rei-open-problems 型 「作品」 pattern と 整合的。 clone / download 経験優先の 場合 Git LFS 移行が defer candidate、 今 action 不要。

### commit

- rei-aios (本 STEP site 反映 commit): 予定
- codetrail (fc0web owner revert): commit `6d6a709` push 済
- 4 repo publish action: cross-repo (gh repo create + git push × 4)
- publish-4repos.sh: `C:/Users/user/publish-4repos.sh` に 存在 (rei-aios 外、 local util)

## Honest scope 8 条

(i) rei-checker-mcp v0.2.0a1 は utility landed のみ、 real LeanBackend 未 wire = 「protocol prep 完了、 実 Lean judgment は Stage 2 defer」 明示、 「v0.2 完成」 主張 ではない。
(ii) discovery-worker v0.3 merge_gate は promotion 境界のみ enforce、 pipeline 側の 生成 → hunter_alpha → hunter_beta 経路自体は v0.2 と同一。 Lean 4 stage (TOTAL_FILTER_COUNT の 3rd) は 未 wire = full pass unreachable 状態、 これは 意図的設計 (generator noise が approved/ に 現状 到達不能 discipline)。
(iii) fc0web 下 4 repo 公開は 「初回 push」 のみ = README / issue template / CI / release 等 downstream ceremony は 未整備、 各 repo の 実運用可能性は 個別確認必要。
(iv) analog-forge 80 MB × 3 files は 意図的公開、 「作品」 pattern の 継承 だが GitHub 推奨 50 MB 超で clone 体験 悪化余地あり。
(v) codetrail Marketplace publisher は defer、 現状 `CHANGE-ME-publisher-id` = `vsce publish` は gate で 停止する状態、 GitHub 公開のみ 完了。
(vi) 「4 repo 公開で 世界初」 主張ゼロ ([[feedback-world-uniqueness-claim-controllable]] 適用) = 各 repo は 個別 tool、 4 repo 揃った公開行為 自体は publish action の 実行のみ、 novelty ゼロ。
(vii) cross-session collaboration (cloud Claude + Rei機 session) の 5 SAC-4 認諾 + fact verify 3 件 は 本 arc の 質保証 evidence だが、 「cross-session 分業で 世界初」 主張は しない ([[feedback-independent-verification-cross-agent-collaboration-2026-08-15]] 継承)、 10 例目 pattern。
(viii) PAT revoke (github.com/settings/tokens で `github_pat_11AMRNOTY0...` delete) は **私 API 不能、 藤本さん実行必要**、 未実行状態継続 = 万一 leak 経由の 使用不能化は 依然未確定。

## 関連 memory

- [[project-step1370-pat-redact-license-arc-2026-08-22]] — 本 arc 起点 (Arc 1-2 記録)
- [[project-step1373-rei-checker-mcp-reproducing-pilot-2026-08-23]] — 別 session、 本 arc の v0.2.0a1 を 土台に REPRODUCING.md pilot 実装、 「再現環境機械」 候補 第 1 例
- [[feedback-verify-claim-must-cover-all-source-derived-numbers]] — nobukifujimoto 404 検出の 適用 example
- [[feedback-independent-verification-cross-agent-collaboration-2026-08-15]] — cross-session 分業 10 例目
- [[feedback-isolation-by-repo-boundary-2026-08-22]] — discovery-worker remote 未設定 の 隔離設計
- [[feedback-super-naming-siren-family-pattern]] — subprocess wrapper NEVER raises invariant discipline + Marketplace publisher CHANGE-ME 復元 discipline
- [[feedback-one-reproduction-over-ten-unverified]] — v0.3 spike で pipeline + test 揃えてから 抽象化判断 の 順序原則
- [[feedback-no-rush-publication]] — 単日 close pattern (帰宅後 arc 5 arc 連鎖)
- [[feedback-all-research-site-reflection-default]] — 2026-08-06 protocol 適用継続
- [[feedback-world-uniqueness-claim-controllable]] — 「4 repo 公開 世界初」 主張ゼロ discipline

## Commit hash

- rei-aios: (本 STEP commit — site + memory + RECENT_UPDATES 一括、 hash 生成時 追記)
- rei-checker-mcp `ba45b3a` (v0.2.0a1 push 済 GitHub fc0web、 STEP 1373 で 参照)
- discovery-worker `bb019e8` (v0.3 local only、 隔離設計)
- codetrail `6d6a709` (fc0web revert、 push 済 GitHub fc0web)
- rei-solver `52e53c0` (LICENSE + .gitattributes、 push 済 GitHub fc0web)
- rei-fpga `78e4f9e` (LICENSE + .gitattributes、 push 済 GitHub fc0web)
- analog-forge `3263073` (LICENSE + .gitattributes、 push 済 GitHub fc0web、 80 MB × 3 warning)
