# lang-review round 1 所見 (2026-07-12)

レビュアー 4 体 (writability / semantics / type-soundness / concurrency) の
全所見。スコアは [../scores/2026-07-12-r1.json](../scores/2026-07-12-r1.json)。
major は issue 化済み (#807–#816)。

## 総評

- **型のコア規律は強固** (4/5): ill-typed 38 プローブ中 36 を位置付き診断で
  reject。抜けた 2 件はどちらも ADR 記載済みの既知残穴 (generic struct field
  instantiation、direct-return builtin 経由の未注釈 lambda param)。
- **最大の弱点クラスは「compile が通って実行時に静かに壊れる」**: String
  for-in の silent no-op (#807)、loop+match の無限ループ (#808)、guard 全
  miss の unlocated trap (#809)、struct literal field 名の silent 誤束縛
  (#810)、OOB index の garbage (#811)、effect op シグネチャ未検査 (#813)。
  writability レビュアーが 10/10 タスクを compile error 計 1 回で完了できた
  一方、この故障クラスに 2 回当たったのが対照的。
- **effect の transitive 強制は import 境界で破れる** (#812) — #626 の
  「保証済み」総括と実装が乖離。
- **診断 (2/5)**: checker の常用エラーは位置付きで良質だが、parse error の
  位置が文頭固定 + lexer 内部 leak (#816)、checker エラーの多くが位置なし、
  実行時故障が全て素の wasm trap。
- **並行適合性 (3/5)**: ADR-0068 の方向に対しランタイム骨格は意外に適合的
  (可変状態が per-instance wasm global に集約済み、tagged repr + header は
  per-process heap + copy-on-send の素材)。後から直しにくいのは (a) replay
  ベース effect handler の観測可能な意味論 (send と非両立)、(b) sendability
  規律の不在 (時間経過で悪化)。

## Major (issue 化済み)

| # | 発見者 | 内容 |
| --- | --- | --- |
| #807 | writability + semantics | String for-in が型検査を通り silent に 0 回イテレーション |
| #808 | writability | loop 内 match arm の break/continue が無限ループ化 (compile-clean hang) |
| #809 | semantics | guard-only match が網羅性を通過、実行時 guard 全 miss が位置なし trap |
| #810 | semantics | struct literal の未知 field 名が別 slot に silent 束縛 |
| #811 | semantics | String/Array OOB index が silent garbage (trap しない) |
| #812 | type-soundness + semantics | effect row が import 境界で落ちる (transitive 強制の module 境界穴) |
| #813 | type-soundness | effect op シグネチャ未検査 — perform 引数 / arm payload / resume 値の 3 経路で silent garbage |
| #814 | semantics | cheatsheet の非 tail continuation `k` 規約が build path で compile しない (docs-mismatch) |
| #815 | semantics | Bool の interpolation 表示が true/false と 0/1 に分裂 (`is` / 構造的 == の型 leak) |
| #816 | semantics | parse error の位置が文頭固定 + lexer 内部 leak、checker エラーの位置欠落 |

## Major (issue 化せず — 設計 tracking へ)

concurrency レビューの major 3 件は ADR-0068 の制約・#806 tracking に反映済み:

1. **replay ベース effect handler** — handle body 再実行 = 非可逆 send と
   非両立、~16K perform bound、per-effect 単一 region。continuation-based
   への置換が並行化の前提工事。**hard to fix later** (replay の観測可能挙動
   への依存が蓄積する前に凍結が必要)。
2. **sendability 規律の不在** — escape する `let mut` 共有セル + 捕捉制約
   ゼロの `Task::spawn`。send 境界 = deep-copy の仮決めと捕捉規則の spec 化
   を 0.3 系で行う (ADR-0060 と接続)。**hard to fix later**。
3. **untagged raw i64 表現** — generic deep-copy (channel send の前提) が
   原理的に不可能。RC/tagged repr cutover (#493 系) を並行化の前提工事として
   優先。untagged 前提の静的形状回避策 (#672 方式) をこれ以上増やさない。

## Minor (次ラウンド以降の改善候補、issue 化見送り)

- 文字列補間の二重構文 `\(x)` / `\{x}` — 0.3.0「冗長な文法の削除」(#805) の
  具体候補。cheatsheet 自体が両方使っており自己不整合
- `derive(Eq)` が no-op マーカーなのに struct `==` は無条件で構造的 —
  注釈の意味が不明瞭 (削除候補)
- 宣言セパレータ `;` vs match arm `,` の非対称、handle arm も `;`
- cheatsheet の Key Builtins が名前のみでシグネチャ欠落 (String::join の
  引数順は推測、String::to_chars は存在しない)
- trait はマーカーのみ + `let Type::fn` 慣習が docs で明示されていない
- Int の実挙動が docs の ±2^61 と不一致 (max+1 が表現可能、max*2 は wrap)
- String が UTF-8 byte 単位 (length/index/substring) であることが docs 未記載
- or-pattern の binding が内部エラーで落ちる (`undefined variable (ident): x`)
- multi-op effect で未処理 op を perform すると素の unreachable trap
  (どの op か表示なし。既知残務: handle arm 網羅性)
- module-level let の lazy thunk memo (非 atomic global pair) — 0.3.0 ③
  トップレベル副作用制限とセットで eager 化 (ADR-0068)
- Task 内 throw の行き先 (join 転送 / kill / link) が未定義 — Task 実
  codegen 前に ADR で確定
- RC word の非 atomic read-modify-write — per-process heap 前提なら無問題。
  「共有 heap + atomic RC は採らない」の明文化を ADR-0068 に追記候補

## writability タスク結果 (golden 化済み)

10/10 pass、コンパイルエラー計 1 回 (`String::to_chars` 存在せず)。
解答は `../golden/` に収録、`run_golden.sh` 10/10 green。
特筆: effects/handler/resume、railway `?`、pipe、package import は
cheatsheet だけで初回成功 — 中核機能の docs 品質は高い。
