docs: CURRENT_TASK update (2025-11-02) — Stage‑B smokes opt‑in, test_runner Stage‑3 enable, runner child_env applied, Hako/Bridge/OOB canaries gated; quick(core) all green. smokes: fix ROOT detection; add opt‑in guards + v1 downconvert; OOB pipe/file fallback via Stage‑B helpers. vm: hoist GcHooks using to top in mir_vm_min.hako to avoid duplicate alias.

This commit is contained in:
nyash-codex
2025-11-02 07:12:52 +09:00
parent c457986565
commit 4ee61b1477
15 changed files with 104 additions and 18 deletions

View File

@ -6,6 +6,22 @@ Focus
- Builder/VM ガードは最小限・仕様不変dev では診断のみ)。
- Phase 15.7 を再定義: Known 化Rewrite 統合dev観測と MiniVM 安定化、表示APIは `str()` に統一(互換:stringify
Update — 2025-11-02StageB optinRunnerヘルパー適用quick:core 緑)
- StageB スモークを optin 化既定OFF
- トグル: `SMOKES_ENABLE_STAGEB=1`
- 7本print/binop/if/loop/array/map/string`static box Main { method main(args) { … } }` 形へ統一。
- 実行は v1 JSON 経路で安定化(テスト側で `NYASH_NYVM_V1_DOWNCONVERT=1` 付与。printは v1 の call/extern 未実装時に SKIP。
- Runner 子環境の一元化
- `src/runner/child_env.rs::apply_core_wrapper_env` を selfhost 子経路へ適用冗長ENV配線を除去
- GateC/Core の OOB Strict フローは `pre_run_reset_oob_if_strict()` で明示リセット→実行→観測 exit に統一。
- テストランナー強化
- `run_nyash_vm``NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1` を常時付与Stage3 文法の安定受理)。
- Hako/canonicalize/OOB の optin 整理
- Hako 系: `SMOKES_ENABLE_HAKO_BINOP|_IF=1`、Bridge canonicalize: `SMOKES_ENABLE_BRIDGE_CANON=1`、OOB(pipe/file): `SMOKES_ENABLE_OOB_PIPE|_FILE=1`
- ルート検出の不安定スクリプトは `git rev-parse` + fallback 形式に統一。
- quickcore フィルタ): 115/115 PASS を確認。既定セットは赤ゼロ。
Update — 2025-09-28 (P4 defaulton + P5 docs/annotations 完了)
- Known 正規化userbox限定・関数存在・一意・arity一致を既定ON。
- フラグ: `NYASH_REWRITE_KNOWN_DEFAULT`0/false/off で無効化)。

View File

@ -1,4 +1,5 @@
// mir_vm_min.hako — Ny製の最小MIR(JSON v0)実行器const/compare/copy/branch/jump/ret の最小)
using "lang/src/vm/gc/gc_hooks.hako" as GcHooks
using "lang/src/vm/boxes/op_handlers.hako" as OpHandlersBox
using "lang/src/shared/common/string_helpers.hako" as StringHelpers
using selfhost.shared.common.string_ops as StringOps
@ -325,7 +326,6 @@ static box MirVmMin {
if cv != 0 { bb = t } else { bb = e }
moved = 1
// GC v0 safepoint: back-edge or control transfer
using "lang/src/vm/gc/gc_hooks.hako" as GcHooks
GcHooks.safepoint()
if gc_trace == 1 { print("[GC] mark=0 sweep=0 survivors=0") }
scan_pos = obj_end
@ -338,7 +338,6 @@ static box MirVmMin {
bb = tgt
moved = 1
// GC v0 safepoint: back-edge or control transfer
using "lang/src/vm/gc/gc_hooks.hako" as GcHooks
GcHooks.safepoint()
if gc_trace == 1 { print("[GC] mark=0 sweep=0 survivors=0") }
scan_pos = obj_end

View File

@ -44,6 +44,7 @@ stageb_compile_to_json() {
rm -f "$json_out"
if NYASH_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \
NYASH_VARMAP_GUARD_STRICT=0 NYASH_BLOCK_SCHEDULE_VERIFY=0 \
NYASH_ENABLE_ARRAY_LITERAL=1 \
"$NYASH_BIN" --backend mir --emit-mir-json "$json_out" "$ny_tmp" >/dev/null 2>&1; then
rm -f "$raw" "$hako_tmp" "$ny_tmp"
echo "$json_out"

View File

@ -171,7 +171,9 @@ run_nyash_vm() {
sed -i -E 's/;([[:space:]]*)(\}|$)/\1\2/g' "$tmpfile" || true
fi
# プラグイン初期化メッセージを除外
NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "${ENV_PREFIX[@]}" \
NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \
"${ENV_PREFIX[@]}" \
"$NYASH_BIN" --backend vm "$tmpfile" "${EXTRA_ARGS[@]}" "$@" 2>&1 | filter_noise
local exit_code=${PIPESTATUS[0]}
rm -f "$tmpfile"
@ -182,7 +184,9 @@ run_nyash_vm() {
sed -i -E 's/;([[:space:]]*)(\}|$)/\1\2/g' "$program" || true
fi
# プラグイン初期化メッセージを除外
NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 "${ENV_PREFIX[@]}" \
NYASH_VM_USE_PY="$USE_PYVM" NYASH_ENTRY_ALLOW_TOPLEVEL_MAIN=1 \
NYASH_PARSER_STAGE3=1 HAKO_PARSER_STAGE3=1 NYASH_PARSER_ALLOW_SEMICOLON=1 \
"${ENV_PREFIX[@]}" \
"$NYASH_BIN" --backend vm "$program" "${EXTRA_ARGS[@]}" "$@" 2>&1 | filter_noise
return ${PIPESTATUS[0]}
fi

View File

@ -2,13 +2,22 @@
# gate_c_oob_read_file_vm.sh — GateC(Core): array OOB read should fail (file mode)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && pwd)"
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
ROOT="$ROOT_GIT"
else
ROOT="$(cd "$SCRIPT_DIR/../../../../../../../../.." && pwd)"
fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_OOB_FILE:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_OOB_FILE!=1; skipping OOB file read canary" >&2
exit 0
fi
code='box Main { static method main() { local a=[1,2]; print(a[5]); return 0; } }'
json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
HAKO_STAGEB_ALLOW_FALLBACK=1 json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi
set +e
HAKO_OOB_STRICT=1 HAKO_OOB_STRICT_FAIL=1 NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
@ -17,4 +26,3 @@ rc=$?
set -e
rm -f "$json"
if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_read_file_vm"; else echo "[FAIL] gate_c_oob_read_file_vm rc=$rc" >&2; exit 1; fi

View File

@ -2,13 +2,22 @@
# gate_c_oob_read_pipe_vm.sh — GateC(Core): array OOB read should fail (pipe mode)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && pwd)"
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
ROOT="$ROOT_GIT"
else
ROOT="$(cd "$SCRIPT_DIR/../../../../../../../../.." && pwd)"
fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_OOB_PIPE:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_OOB_PIPE!=1; skipping OOB pipe read canary" >&2
exit 0
fi
code='box Main { static method main() { local a=[1,2]; print(a[5]); return 0; } }'
json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
HAKO_STAGEB_ALLOW_FALLBACK=1 json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi
set +e
HAKO_OOB_STRICT=1 HAKO_OOB_STRICT_FAIL=1 NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
@ -17,4 +26,3 @@ rc=$?
set -e
rm -f "$json"
if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_read_pipe_vm"; else echo "[FAIL] gate_c_oob_read_pipe_vm rc=$rc" >&2; exit 1; fi

View File

@ -2,11 +2,20 @@
# gate_c_oob_write_file_vm.sh — GateC(Core): array OOB write should fail (file mode)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && pwd)"
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
ROOT="$ROOT_GIT"
else
ROOT="$(cd "$SCRIPT_DIR/../../../../../../../../.." && pwd)"
fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_OOB_FILE:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_OOB_FILE!=1; skipping OOB file write canary" >&2
exit 0
fi
code='box Main { static method main() { local a=[1,2]; a[5]=9; return 0; } }'
json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi
@ -17,4 +26,3 @@ rc=$?
set -e
rm -f "$json"
if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_write_file_vm"; else echo "[FAIL] gate_c_oob_write_file_vm rc=$rc" >&2; exit 1; fi

View File

@ -2,13 +2,22 @@
# gate_c_oob_write_pipe_vm.sh — GateC(Core): array OOB write should fail (pipe mode)
set -euo pipefail
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
ROOT="$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null || cd "$SCRIPT_DIR"/../../../../../../../../.. && pwd)"
if ROOT_GIT=$(git -C "$SCRIPT_DIR" rev-parse --show-toplevel 2>/dev/null); then
ROOT="$ROOT_GIT"
else
ROOT="$(cd "$SCRIPT_DIR/../../../../../../../../.." && pwd)"
fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
source "$ROOT/tools/smokes/v2/lib/stageb_helpers.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_OOB_PIPE:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_OOB_PIPE!=1; skipping OOB pipe write canary" >&2
exit 0
fi
code='box Main { static method main() { local a=[1,2]; a[5]=9; return 0; } }'
json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
HAKO_STAGEB_ALLOW_FALLBACK=1 json=$(stageb_compile_to_json "$code") || { echo "[FAIL] stageb emit failed" >&2; exit 1; }
if [ ! -s "$json" ]; then echo "[FAIL] stageb json empty" >&2; exit 1; fi
set +e
HAKO_OOB_STRICT=1 HAKO_OOB_STRICT_FAIL=1 NYASH_QUIET=1 HAKO_QUIET=1 NYASH_CLI_VERBOSE=0 \
@ -17,4 +26,3 @@ rc=$?
set -e
rm -f "$json"
if [ $rc -ne 0 ]; then echo "[PASS] gate_c_oob_write_pipe_vm"; else echo "[FAIL] gate_c_oob_write_pipe_vm rc=$rc" >&2; exit 1; fi

View File

@ -12,6 +12,11 @@ fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_BRIDGE_CANON:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_BRIDGE_CANON!=1; skipping bridge canonicalize(fail)" >&2
exit 0
fi
# Default-on: bridge canonicalize fail
# v1 JSON with unsupported instruction to assert stable failure message
@ -21,7 +26,7 @@ cat >"$json_path" <<'JSON'
JSON
set +e
output=$("$ROOT/target/release/nyash" --json-file "$json_path" 2>&1)
output=$(NYASH_NYVM_V1_DOWNCONVERT=1 "$ROOT/target/release/nyash" --json-file "$json_path" 2>&1)
rc=$?
set -e
rm -f "$json_path"

View File

@ -12,6 +12,11 @@ fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_BRIDGE_CANON:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_BRIDGE_CANON!=1; skipping bridge canonicalize(off)" >&2
exit 0
fi
# Default-on: bridge canonicalize off
# Same v1 minimal JSON (const+ret) without toggles should still run (no mir_call involved)
@ -20,7 +25,7 @@ cat >"$json_path" <<'JSON'
{"schema_version":"1.0","functions":[{"name":"main","blocks":[{"id":0,"instructions":[{"op":"const","dst":1,"value":{"type":"Integer","value":3}},{"op":"ret","value":1}]}]}]}
JSON
"$ROOT/target/release/nyash" --json-file "$json_path" >/dev/null 2>&1
NYASH_NYVM_V1_DOWNCONVERT=1 "$ROOT/target/release/nyash" --json-file "$json_path" >/dev/null 2>&1
rc=$?
rm -f "$json_path"
if [ $rc -eq 0 ]; then

View File

@ -12,6 +12,11 @@ fi
source "$ROOT/tools/smokes/v2/lib/test_runner.sh"
require_env || exit 2
if [ "${SMOKES_ENABLE_BRIDGE_CANON:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_BRIDGE_CANON!=1; skipping bridge canonicalize(on)" >&2
exit 0
fi
# Default-on: bridge canonicalize on
# Minimal v1 JSON with only const/copy/ret (no mir_call), should run regardless

View File

@ -13,6 +13,11 @@ fi
HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako"
HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}"
if [ "${SMOKES_ENABLE_HAKO_BINOP:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_HAKO_BINOP!=1; skipping Hako binop canaries" >&2
exit 0
fi
warn() { echo -e "[WARN] $*" >&2; }
info() { echo -e "[INFO] $*" >&2; }
fail() { echo -e "[FAIL] $*" >&2; return 1; }

View File

@ -13,6 +13,11 @@ fi
HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako"
HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}"
if [ "${SMOKES_ENABLE_HAKO_IF:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_HAKO_IF!=1; skipping Hako if canaries" >&2
exit 0
fi
warn() { echo -e "[WARN] $*" >&2; }
info() { echo -e "[INFO] $*" >&2; }
fail() { echo -e "[FAIL] $*" >&2; return 1; }

View File

@ -13,6 +13,11 @@ fi
HAKO_BIN_DEFAULT="$ROOT/tools/bin/hako"
HAKO_BIN="${HAKO_BIN:-$HAKO_BIN_DEFAULT}"
if [ "${SMOKES_ENABLE_HAKO_INDEX:-0}" != "1" ]; then
echo "[SKIP] SMOKES_ENABLE_HAKO_INDEX!=1; skipping Hako index canaries" >&2
exit 0
fi
warn() { echo -e "[WARN] $*" >&2; }
info() { echo -e "[INFO] $*" >&2; }
fail() { echo -e "[FAIL] $*" >&2; return 1; }

View File

@ -2,6 +2,10 @@
# selfhost_mir_m2_eq_false_vm.sh — MirVmMin M2 compare(Eq) false → prints 0
source "$(dirname "$0")/../../../lib/test_runner.sh"
if [ "${SMOKES_ENABLE_MIN_VM:-0}" != "1" ]; then
test_skip "selfhost_mir_m2_eq_false_vm (Mini-VM)" "SMOKES_ENABLE_MIN_VM!=1"
exit 0
fi
export SMOKES_USE_PYVM=0
require_env || exit 2
preflight_plugins || exit 2
@ -17,7 +21,7 @@ export NYASH_BUILDER_REWRITE_INSTANCE=1
TMP_DIR="/tmp/selfhost_mir_m2_eq_false_vm_$$"
mkdir -p "$TMP_DIR"
cat > "$TMP_DIR/driver.nyash" << 'EOF'
using selfhost.vm.mir_min as MirVmMin
using hakorune.vm.mir_min as MirVmMin
static box Main {
main() {