Preserve production code, regression fixtures, audio assets and provenance, test infrastructure, and the original-completion plan and progress ledger. Final game and Windows acceptance remain pending; excluded local artifacts and native experiments are not part of this snapshot.
3.2 KiB
Godot import Unicode 2行の原因と表記修正
guard検証用fresh stageのreference/candidate両方で発生した Unexpected NUL character 2行は、tests/performance/test_digest_performance.gd の2つの \u0000 リテラルから発生した。両stageの対象スクリプトは同一SHAで、テキストの物理NULと不正UTF-8を走査して0件だった。候補guard変更と独立したimport時診断である。元stageを変更していない。
Godot 4.7.2の独立した小規模fresh projectを3種類作り、それぞれ新importと値のprobeを実行した。実験6プロセスはすべてexit 0。
| 表記 | fresh import のNUL診断 | 2つの値のcodepoint/UTF-8/Variant bytes |
|---|---|---|
元の \u0000 リテラル2個 |
2 | 元値 |
実行時 String.chr(0) 2個 |
0 | 元値と完全一致 |
実行時 String.chr(0xfffd) 2個 |
0 | 元値と完全一致 |
元の実行値はNULを内包せず、U+FFFDとなる。日本語と絵文字の値はcodepoints [21416,25151,65533,127795]、UTF-8 e58ea8e688bfefbfbdf09f8cb3、Variant bytes 040000000d000000e58ea8e688bfefbfbdf09f8cb3000000。単文字の値はcodepoints [65533]、UTF-8 efbfbd、Variant bytes 0400000003000000efbfbd00。これらが3表記で一致した。
Godotのtokenizerはunicode escapeを文字列へ追加する。4.7.2 tokenizer source の1006〜1007行が対象。String::append_utf32(0) は診断を出してreplacement characterへ置換する。4.7.2 string source の187〜194行が対象。String::chr() も同じ追加処理を使う。4.7.2 string header の411〜414行を確認した。この一次ソースと実験ログが置換の因果根拠である。
root承認に従い、本体テストの2リテラルだけを String.chr(0xfffd) で構成する表記へ変更し、理由コメントを付けた。ゲームコードは変更していない。テスト内の実行時 String.chr(0) と PackedByteArray([0,127,255]) の境界試験は維持している。NUL境界試験を削除してエラー行を隠した変更ではない。 GodotがNULを受け付けず置換する事実を踏まえた表記修正である。
修正後スクリプトSHAは 363772fc43975f12c9e2056e2b01beb4cd8b2d7544db7528f80c6bd127710c1f。本体で焦点実行した結果は Digest performance: 83 checks, 0 failures、exit 0。実行時NUL診断321行は保持した境界試験の63+64+65+129回と一致する。焦点runの前後SHAは同一だった。
証拠は artifacts/original-completion-2026-10-02/unicode-nul-cause-repro-r01/verification.json と各import/probe log、fixture copy、focused-verification.json と focused-test.log に保存した。Godot実行binary SHAは c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf。本体fresh importでの2行除去と全回帰の確認はrootが別に担当し、この焦点結果だけから全体受入を主張しない。