Output検証をSSOT化して保守性を向上 **新規追加**: - tools/smokes/v2/lib/output_validator.sh - extract_numeric_lines N: 数値行をN行抽出(パターンマッチング) - assert_equals_multiline EXPECTED ACTUAL: 複数行期待値と比較 - validate_numeric_output N EXPECTED OUTPUT: extract + assert の合成Box **リファクタリング対象** (5ファイル): - phase103_if_only_vm.sh - phase103_if_only_early_return_vm.sh - phase113_if_only_partial_assign_vm.sh - phase114_if_only_return_then_post_vm.sh - phase115_if_only_call_merge_vm.sh **変更内容**: - 重複パターン `grep -E '^-?[0-9]+$' | head -n N` → `extract_numeric_lines N` - 比較ロジック → `validate_numeric_output` に統一 - 各smokeは `source output_validator.sh` で共通機能を利用 **検証結果**: - phase103_if_only_vm: PASS ✅ - phase103_if_only_early_return_vm: PASS ✅ - phase113_if_only_partial_assign_vm: PASS ✅ - phase114_if_only_return_then_post_vm: PASS ✅ - phase115_if_only_call_merge_vm: PASS ✅ **箱化モジュール化の成果**: - 単一責任: extract_numeric_lines(抽出のみ)、assert_equals_multiline(比較のみ) - 分離: 各機能が独立したBox(テスト容易性向上) - 合成: validate_numeric_output が extract + assert を組み合わせ - Fail-Fast: 全関数でパラメータチェック(明示的エラー) - 保守性: 検証パターン変更時は output_validator.sh の1箇所のみ修正 **設計原則**: - Box-First: 機能を箱に切り出して境界を明確化 - SSOT: 数値行抽出と検証ロジックを1箇所に集約 - Fail-Fast: パラメータ不正時は即座にエラー(フォールバックなし) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Smokes v2 — Minimal Runner and Policy
Policy
- Use [SKIP:] prefix for environment/host dependent skips.
- Examples: [SKIP] hakorune not built, [SKIP:env] plugin path missing
- Keep reasons short and stable to allow grep-based canaries.
- Prefer JSON-only output in CI: set
NYASH_JSON_ONLY=1to avoid noisy logs. - Diagnostics lines like
[provider/select:*]are filtered by default inlib/test_runner.sh.- Toggle: set
HAKO_SILENT_TAGS=0to disable filtering and show raw logs.HAKO_SHOW_CALL_LOGS=1also bypasses filtering.
- Toggle: set
Helpers
tools/smokes/v2/lib/mir_canary.shprovides:extract_mir_from_output— between [MIR_BEGIN]/[MIR_END]assert_has_tokens,assert_skip_tag,assert_order,assert_token_count
tools/lib/canary.shprovides minimal, harness-agnostic aliases:extract_mir_between_tags— same asextract_mir_from_outputrequire_tokens token...— fail if any token missing
Notes
- Avoid running heavy integration smokes in CI by default. Use
--profile quick. - When a test depends on external tools (e.g., LLVM), prefer
[SKIP:<reason>]over failure. - Stage‑B/selfhost canaries(
stage1_launcher_*,phase251*など)は Stage‑3 デフォルト環境で安定しないため、quick プロファイルでは[SKIP:stageb]として扱い、必要に応じて別プロファイル(integration/full)で個別に実行する。 - Selfhost quick カバレッジは最小 1 本(
core/selfhost_minimal.sh)に絞り、Stage‑3 + JoinIR 前提で Stage‑B→VM を通るかだけを確認する。 - S3 backend 向けの長尺テスト群も quick 向きではないため、timeout を短く保ちたい場合は
[SKIP:slow]にして別途ローカルで回すことを推奨する。
Quick tips
- EXE-heavy cases (e.g.,
phase2100/*) may take longer. When running quick with these tests, pass a larger timeout like--timeout 120. - Smokes v2 auto-cleans temporary crate EXE objects created under
/tmp(pattern:ny_crate_backend_exe_*.o) after the run.
Developer Notes
- JoinIR If/Select (Phase 33): A/B test with
NYASH_FEATURES=stage3 HAKO_JOINIR_IF_SELECT=1 ./target/release/hakorune apps/tests/joinir_if_select_simple.hako(dev-only、CI対象外。NYASH_JOINIR_CORE は deprecated/無視)