Analyzer安定化完了: NYASH_DISABLE_PLUGINS=1復元 + plugin無効化根治

## 修正内容
1. **hako_check.sh/run_tests.sh**: NYASH_DISABLE_PLUGINS=1 + NYASH_BOX_FACTORY_POLICY=builtin_first追加
2. **src/box_factory/plugin.rs**: NYASH_DISABLE_PLUGINS=1チェック追加
3. **src/box_factory/mod.rs**: plugin shortcut pathでNYASH_DISABLE_PLUGINS尊重
4. **tools/hako_check/render/graphviz.hako**: smart quotes修正(parse error解消)

## 根本原因
- NYASH_USE_PLUGIN_BUILTINS=1が自動設定され、ArrayBox/MapBoxがplugin経由で生成を試行
- bid/registry.rsで"Plugin loading temporarily disabled"の状態でも試行されエラー
- mod.rs:272のshortcut pathがNYASH_DISABLE_PLUGINSを無視していた

## テスト結果
- 10/11 PASS(HC011,13-18,21-22,31)
- HC012: 既存issue(JSON安定化未完)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
nyash-codex
2025-11-08 15:49:25 +09:00
parent cef820596f
commit 772149c86d
26 changed files with 508 additions and 62 deletions

View File

@ -1,4 +1,4 @@
// tools/hako_check/cli.hako HakoAnalyzerBox (MVP)
// tools/hako_check/cli.hako - HakoAnalyzerBox (MVP)
using selfhost.shared.common.string_helpers as Str
using tools.hako_check.analysis_consumer as HakoAnalysisBuilderBox
using tools.hako_check.rules.rule_include_forbidden as RuleIncludeForbiddenBox
@ -65,7 +65,7 @@ static box HakoAnalyzerBox {
}
// keep a copy before sanitize for rules that must see original bytes (HC017, etc.)
local text_raw = text
// pre-sanitize (ASCII quotes, normalize newlines) minimal & reversible
// pre-sanitize (ASCII quotes, normalize newlines) - minimal & reversible
text = me._sanitize(text)
// analysis - only build IR if needed by active rules
local ir = null
@ -80,7 +80,7 @@ static box HakoAnalyzerBox {
ir.set("boxes", new ArrayBox())
ir.set("entrypoints", new ArrayBox())
}
// parse AST only when explicitly needed by active rulesinclude_forbiddenfallback可)
// parse AST only when explicitly needed by active rules (include_forbidden fallback allowed)
local ast = null
if no_ast == 0 && me._needs_ast(rules_only, rules_skip) == 1 { ast = HakoParserCoreBox.parse(text) }
if debug == 1 {
@ -287,7 +287,7 @@ static box HakoAnalyzerBox {
if me._is_hc011(s) == 1 {
local qual = me._extract_method_from_hc011(s)
if qual != null {
// method qual: Box.method/arity Box
// method qual: Box.method/arity -> Box
local dot = qual.lastIndexOf(".")
if dot > 0 {
local box_name = qual.substring(0, dot)