diff --git a/ARCHITECTURE.html b/ARCHITECTURE.html
index 8573ba4..7e8bb1e 100644
--- a/ARCHITECTURE.html
+++ b/ARCHITECTURE.html
@@ -1,203 +1,206 @@
-
-
+
+
-gamebox — architecture tree (ARCHITECTURE.json viewer)
+sidecar — 아키텍처
+
-
-
-
+
+
diff --git a/ARCHITECTURE.json b/ARCHITECTURE.json
index 1751aeb..da9f34d 100644
--- a/ARCHITECTURE.json
+++ b/ARCHITECTURE.json
@@ -1,498 +1,1841 @@
{
- "name": "🕹️ gamebox — Apple-native Win32 game runtime",
+ "schemaVersion": "2.0",
+ "kind": "architecture-tree",
+ "title": "🕹️ gamebox — Apple-native Win32 game runtime",
"summary": "Run unmodified Win32 PE games natively on macOS / Apple Silicon via a hexa-only stack — PE loader + Win32 API shim + DirectX→Metal — WITHOUT Wine (Wine 0), under a strict own1 posture (no DRM / Warden / anti-cheat bypass, no anima clone).",
- "note": "This JSON tree is the DOMAIN-TREE SSOT (update-in-place, NOT append-only) — it retires the former DOMAINS.tape roster + domains/*.md snapshots + domains/*.log.md logs (folded into CHANGELOG.jsonl 2026-06-18).",
- "meta": {
- "ssot": "github.com/dancinlife/gamebox",
- "parent": "dancinlab",
- "siblings": [
- "hexa-lang (loader/perf/dispatch language)",
- "anima (consciousness daemon — anima clone 0)",
- "sim-universe (reference layout v1.0.0)"
- ],
- "forensic_verdict": "SKELETON_TIER_WIN32 + E5_PIPELINE_PROVEN — every module compiles/probes; the PE→D3D11→Metal pipeline is now proven end-to-end (r12: a self-authored own1 49-byte D3D11 PE executes through the i386 interpreter → D3D11→Metal bridge → real Apple Metal headless offscreen frame, pixel-readback verified · px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1). validated_manjeom = first_own1_authored_d3d11_pe_to_metal_frame (infrastructure milestone, NOT a commercial game). NO commercial game frame evidenced yet — a real game needs the full Win32/D3D11 API surface + real assets + the real game's PE. See README.md#caveats-raw10-c3.",
- "own1": "Wine 0 / DRM bypass 0 / Warden bypass 0 / anti-cheat bypass 0 (5 classes: VAC + GameGuard + EAC kernel + EAC anti-tamper + Warden) / FromSoft matchmaking bypass 0 / anima clone 0 / destructive_ops 0.",
- "own2": "every subcommand emits an explicit PASS/FAIL/PARTIAL/RETIRED_INTENTIONAL reason; predecessor markers preserved verbatim for traceability.",
- "version": "1.0.4",
- "migrated_from": "DOMAINS.tape roster + domains/*.md (22 snapshots) + domains/*.log.md (22 logs) retired 2026-06-18 → ARCHITECTURE.json tree SSOT + ARCHITECTURE.html viewer (hexa-codex/anima c4 standard)",
- "roster": "22 domains (1 meta-root + 6 메인구조 + 1 nested C-PORT + 2 런처 + 1 sprint-meta + 11 게임)"
- },
- "children": [
+ "viewer": "ARCHITECTURE.html",
+ "serve": "python3 serve.py (로컬 서버 + 브라우저 자동 오픈; file:// fetch 차단 우회)",
+ "columns": [
{
- "name": "ℹ️ skeleton-tier status",
- "summary": "Skeleton-tier loaders/perf compile + probe; the PE→D3D11→Metal pipeline is proven end-to-end with a self-authored own1 D3D11 PE (r12, pixel-readback verified) = validated_manjeom first_own1_authored_d3d11_pe_to_metal_frame (infrastructure milestone). NO commercial game frame evidenced yet (real game = full Win32/D3D11 surface + real assets + real PE)."
+ "key": "name",
+ "label": "name",
+ "tree": true
},
{
- "name": "🚧 frontiers — E5 인프라 ✅ proven / 상업 게임 ⬜ open",
- "summary": "validated_manjeom 사다리(docs/CLOSURE_ROADMAP.md §5)의 현재상태 SSOT. E5 인프라 파이프라인(PE→i386 인터프리터→IAT autobind→D3D11→Metal→readback)은 r10–r12로 증명 완료(자작 own1 PE 기준). 상업 게임 프레임은 미증명(open). 라운드별 측정 이력은 CHANGELOG+git+memory(project_gamebox_e3_frontier).",
- "children": [
- {
- "name": "F-NSWINDOW-E5 — E1✅ E2✅ E3✅ E4✅(IAT name-autobind) E5✅(r12: PE→D3D11→Metal 인프라 마일스톤)",
- "summary": "validated_manjeom 사다리(docs/CLOSURE_ROADMAP.md §5). E1 PE-parse+mmap done·E2 i386 디코더 done·E3 i386 인터프리터 done(실 game-binary EXECUTE)·E4 kernel32 IAT name-autobind done(합성 prologue CRT→user-entry handoff·insns=60·K32 13·IAT name-autobind)·E5 r10-r12 완료: r10 헤드리스 Metal 오프스크린 렌더+readback PASS·r11 D3D11→Metal 브리지 네이티브 PASS·r12 PE→D3D11→Metal end-to-end PASS(insns=11 imports=7 px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1). validated_manjeom=first_own1_authored_d3d11_pe_to_metal_frame(인프라 마일스톤·상업 게임 아님). 다음: 상업 게임 방향 — Win32 API 서피스 확장·opcode 커버리지·vtable [reg+offset] 간접 call·실 게임 PE IAT 추적."
- },
- {
- "name": "E5 인프라 파이프라인 (proven · CI 검증) — PE→interp→autobind→D3D11→Metal→readback",
- "summary": "레이어: ① 자작 own1 i386 PE(d3d11.dll import·native/fixtures) → ② native/i386_cpu.c i386 인터프리터(decode→execute·EFLAGS·byte-eq 트윈 native/i386_decode.hexa RUNEQ) → ③ IAT name-based autobind(native/pe_parse.c import_dir + IMAGE_IMPORT_BY_NAME strcmp → shim 레지스트리·미매칭 I386_HALT_UNBOUND_IMPORT) → ④ native/d3d11_metal_bridge.m(D3D11-COM-형상 vtable → MTLDevice·오프스크린 64×64 BGRA8·인라인 MSL PSO) → ⑤ Apple Metal 헤드리스 렌더 → ⑥ [MTLTexture getBytes:] readback. 측정(native/e5_end_to_end_test.c): __E5__ PASS pe_executed=1 frame_rendered=1 px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1 insns=11 imports=7. validated_manjeom=first_own1_authored_d3d11_pe_to_metal_frame(인프라 마일스톤·상업 게임 아님). own1: Wine/DXVK/d3d11.dll 0·DRM 0·게임애셋 0. CI=github-hosted macos-15(PUBLIC repo 무료)."
- },
- {
- "name": "⬜ OPEN — 상업 게임 프레임 (미증명)",
- "summary": "인프라는 자작 PE로 증명됐으나 상업 게임(디아블로/리니지 등)은 미증명. 필요: 전체 Win32/D3D11 API 서피스·vtable [reg+offset] 간접 call·넓은 opcode 커버·실 게임 PE IAT 추적·실 애셋. own1 유지(no Wine/DRM/Warden/anti-cheat bypass)."
- }
- ]
+ "key": "role",
+ "label": "role"
},
{
- "name": "ℹ️ tree composition",
- "summary": "Umbrella meta-root carrying the 메인구조 (engine subsystems) + 런처 (launchers) + 게임 (per-game) tree below."
+ "key": "id",
+ "label": "id"
},
{
- "name": "ℹ️ viewer",
- "summary": "Human viewer = ARCHITECTURE.html via `python3 serve.py`."
- },
- {
- "name": "ℹ️ doc pointers (SSOT split)",
- "summary": "Component-level final-architecture prose lives in ARCHITECTURE.md; history/decisions → CHANGELOG.jsonl; governance → CLAUDE.md; per-game/launcher SSOT → .roadmap.* + .checkpoint.* (this doc points, never duplicates)."
- },
- {
- "name": "ℹ️ node schema",
- "summary": "Each node carries its domain @goal as `summary` and its milestones as `milestones[]` ([x]=done / [ ]=open)."
- },
- {
- "name": "ℹ️ edge convention",
- "summary": "Tree edges below were the DOMAINS.tape `@link --has--> `; cross-edges (--uses-->, --targets-->) are preserved per-node in `edges`."
- },
- {
- "name": "🧱 메인구조 — engine subsystems",
- "summary": "The six hexa-native runtime pillars every game stands on: PE loader, Win32 API shim, DirectX→Metal, networking, perf/telemetry, and the thin native-C base.",
- "children": [
- {
- "name": "ℹ️ code SSOT",
- "summary": "Code SSOT: lib/loader/ (PE *_core · win32_* · i386_* · pe_d3d* · ipc_*), lib/perf/ (c_* tracks), native/ (C helpers)."
- },
- {
- "name": "GAMEBOX-LOADER — 🧱 PE 적재기 (PE loader)",
- "summary": "hexa-only PE loader: map PE32/PE32+ images, i386/x64 decode, IAT resolve, base relocations, SEH chains, TLS callbacks, MSVC CRT init — with Wine=0.",
- "path": "lib/loader/",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-LOADER # 메인구조: PE load · i386/x64 · IAT · SEH · TLS · MSVC CRT"
- ],
- "milestones": [
- "[ ] PE32/PE32+ section mapper + base relocation applier (real mmap)",
- "[ ] i386 + x64 instruction decode + calling-convention translation to arm64",
- "[ ] IAT resolve (direct/forwarder/delay-load/hint fast-path) real binding",
- "[ ] SEH x64 .pdata unwinder + i386 FS:[0] chain dispatch",
- "[ ] TLS callback dispatch + MSVC CRT (initterm/security-cookie/SEH) bring-up"
- ]
- },
- {
- "name": "GAMEBOX-WIN32 — 🪟 윈도우 API 통역 (Win32 API shim)",
- "summary": "hexa-native Win32 API shim across ~14 DLLs (kernel32/user32/gdi32/ntdll/advapi32/winsock/ole32/…) — real implementations over stubs, Wine=0.",
- "path": "lib/loader/",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-WIN32 # 메인구조: Win32 API shim (~14 DLLs)"
- ],
- "milestones": [
- "[ ] kernel32 stage1→5: CreateProcess/CreateThread/Heap* real (not stub)",
- "[ ] user32 + gdi32 tier1 real: window/message/DC/GDI object",
- "[ ] ntdll native API: NtCreateFile/Event/Mutant/Semaphore/Thread real",
- "[ ] advapi32/crypt32/ole32/oleaut32/shell32 tier1 real coverage",
- "[ ] winsock ws2_32 + IOCP/overlapped/select surface"
- ]
- },
- {
- "name": "GAMEBOX-GFX — 🎨 그래픽 변환기 (DirectX→Metal)",
- "summary": "DirectX → Metal translation: D3D11 + D3D12 command/resource/pipeline mapped to Metal, DXGI swapchain present, DXBC/DXIL→AIR shader cross-compile (D3DMetal-pinned, no Wine).",
- "path": "lib/loader/",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-GFX # 메인구조: DirectX 11/12 → Metal · DXIL→AIR"
- ],
- "milestones": [
- "[ ] D3D11 real path: buffer/texture/draw/state objects → Metal",
- "[ ] D3D12 real path: command queue/list, descriptor heap, fence, swapchain present",
- "[ ] DXGI factory + swapchain present + D3D→Metal router",
- "[ ] Shader xlate DXBC/DXIL → AIR + SV mapping",
- "[ ] Advanced: DXR raytracing, mesh shader, compute dispatch"
- ]
- },
- {
- "name": "GAMEBOX-NET — 🌐 네트워크 프로토콜 (networking/IPC)",
- "summary": "Networking/IPC protocol layer: winsock/IOCP, IPC (mach port/xpc/named pipe/shared mem), TLS (schannel/apple-network), OAuth, and TACT/NGDP/CASC content delivery primitives shared by launchers.",
- "path": "lib/loader/",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-NET # 메인구조: winsock · IPC · TLS · OAuth · TACT/NGDP/CASC"
- ],
- "milestones": [
- "[ ] winsock ws2_32 + IOCP/overlapped/select + iphlpapi",
- "[ ] IPC matrix: mach port, xpc, unix socket, named pipe, shared memory, tcp loopback",
- "[ ] TLS: schannel + apple-network HTTP/TLS sink + https certificate",
- "[ ] OAuth device/PKCE flow + redirect capture proxy",
- "[ ] TACT/NGDP/CASC parser + CDN chunk assemble/dedup/resume"
- ]
- },
- {
- "name": "GAMEBOX-PERF — 📊 성능 계기판 (perf/telemetry)",
- "summary": "Performance + telemetry + presentation: FPS overlay (Metal-composed), frame pacing, display modes (fullscreen/PIP/dpi), Metal optimization tracks, and per-session aggregation.",
- "path": "lib/perf/",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-PERF # 메인구조: FPS overlay · frame pacing · display mode · metal opt"
- ],
- "milestones": [
- "[ ] FPS overlay: metal compose + history graph + hotkey + metric aggregator",
- "[ ] Frame pacing adaptive + frametime histogram + first-frame breakdown",
- "[ ] Display modes: fullscreen-exclusive Metal, PIP, dpi scale, focus routing, macOS menubar",
- "[ ] Metal opt: pipeline archive, private-heap prewarm, residency coalesce, simdgroup reduce",
- "[ ] Session aggregator + roofline/thermal/vram pressure forecast"
- ],
- "children": [
- {
- "name": "ℹ️ module scale",
- "summary": "242+ c_*_*.hexa modules across 104 unique families; 18+ families at 100% manjeom (skeleton-tier)."
- }
- ]
- },
- {
- "name": "GAMEBOX-NATIVE — 🔩 C 받침대 (native C base)",
- "summary": "Thin native C helper layer the hexa stack calls into: i386 instruction decode, PE parse, and PE→Mach-O shim — built with entitlements for JIT/mmap. Live authored scope native/*.c = 4 files, 869 LOC.",
- "path": "native/",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-NATIVE # 메인구조: C helpers (i386_decode · pe_parse · pe_to_macho)"
- ],
- "milestones": [
- "[ ] i386_decode.c — i386 instruction decode helper + test",
- "[ ] pe_parse.c — PE header/section/import parse helper",
- "[ ] pe_to_macho_shim.c — PE→Mach-O bridge",
- "[ ] build.sh + entitlements.plist (JIT/mmap/weak-link Metal)"
- ],
- "children": [
- {
- "name": "C-PORT — 🦀→💎 native C → hexa 이식",
- "summary": "Drive gamebox's native x86-decoder / PE-shim C to hexa-native wherever no OS-ABI dependency forces C; RUNEQ-gated (byte-identical output vs the C baseline).",
- "path": "native/i386_decode.hexa · .verdicts/c-port/",
- "status": "🟢 M1–M4 landed (RUNEQ PORT-EQ)",
- "edges": [
- "GAMEBOX-NATIVE --has--> C-PORT # 메인구조: native C → hexa 이식 (Tier A 포팅 · C irreducible FFI 유지)"
- ],
- "milestones": [
- "[x] Milestone-1 — inventory + classify live native/*.c (4 files 869 LOC; Tier-A 437 · Tier-B 113 · Tier-C 319). Verdict .verdicts/c-port/INVENTORY.txt.",
- "[x] Milestone-2 — Tier-A leaf port: decode_modrm_disp (ModR/M+SIB+disp, ~43 LOC) + i386_reg32_name → native/i386_decode.hexa, RUNEQ PORT-EQ (768/768 byte-identical vs C, sha256 b4388479). Verdict .verdicts/c-port/M2-decode_modrm_disp.txt.",
- "[x] Milestone-3 — Tier-A leaf batch: decode_prefixes (C 72-95) + i386_op_name (C 34-70) + rd_s32/rd_s16 (C 143-152), ~71 LOC → native/i386_decode.hexa, RUNEQ PORT-EQ (1069/1069 byte-identical, sha256 8e6acbb8). Per-leaf verdicts .verdicts/c-port/M3-{decode_prefixes,i386_op_name,rd_s32_rd_s16}.txt.",
- "[x] Milestone-4 — Tier-A stateful unit: i386_decode_one (C 154-303, ~150 LOC) — prefix run → 1-byte/2-byte opcode dispatch → ModR/M+SIB+disp → i386_insn_t (12-tuple). Composes M2/M3 leaves. RUNEQ PORT-EQ (1042/1042 byte-identical over 5-sub-corpus sweep, sha256 b2853d0a). Verdict .verdicts/c-port/M4-decode_one.txt.",
- "[ ] Tier-A residual: i386_format_insn (C 305-end) disassembly-string formatter → hexa, RUNEQ on the rendered string (libc snprintf parity)",
- "[ ] pe_parse.c split: hexa-native pe_parse_buf(bytes) Tier-A core + thin C/FFI file-map ingress (Tier C)",
- "[ ] Tier-B retire: drop i386_decode_test.c once hexa decode reaches RUNEQ parity",
- "[ ] Tier-C documented-stay: pe_to_macho_shim.c MAP_JIT/mprotect loader remains C (or hexa FFI)"
- ],
- "children": [
- {
- "name": "ℹ️ irreducible C",
- "summary": "Irreducible FFI/loader syscalls stay C."
- },
- {
- "name": "ℹ️ live scope + tier classification",
- "summary": "Live scope native/*.c = 4 files, 869 LOC, classified Tier A (PORTABLE) / Tier B (TEST harness) / Tier C (IRREDUCIBLE FFI/platform) in .verdicts/c-port/INVENTORY.txt."
- }
- ]
- }
- ]
- }
- ]
- },
- {
- "name": "🚀 런처/플랫폼 — launchers",
- "summary": "Platform launchers/hosts a game boots through. Battle.net hosts D2R/D4/CS2; plaync PURPLE hosts Lineage M/W (and is the download channel for Lineage Classic). Both are checkpoint-proven non-blocking for their proven titles.",
- "children": [
- {
- "name": "GAMEBOX-BNET — 🚀 배틀넷 런처 (Battle.net)",
- "summary": "Battle.net launcher/platform bring-up: agent IPC, install/setup path, download (TACT/NGDP/CASC), OAuth token, and cold→warm launch orchestration for D2R/D4/CS2/SC2.",
- "path": "lib/loader/",
- "status": "🟢 5/6 (D2R launch checkpoint-proven)",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-BNET # 런처: Battle.net (D2R · D4 · CS2 host)",
- "GAMEBOX-D2R --uses--> GAMEBOX-BNET",
- "GAMEBOX-D4 --uses--> GAMEBOX-BNET",
- "GAMEBOX-CS2 --uses--> GAMEBOX-BNET"
- ],
- "milestones": [
- "[x] Battle.net agent IPC + HTTP REST 4-verb + agent SD forging (pe_battle_net_agent_ipc_track · pe_battlenet_agent_http_rest · pe_battlenet_agent_sd_forging)",
- "[x] Setup/install path real + static-CRT path (pe_battlenet_setup_install_path_real · pe_battlenet_setup_static_crt_path · pe_battle_net_setup_install_phase)",
- "[x] TACT/NGDP/CASC download track + CDN mirror select (pe_battlenet_tact_ngdp_casc_track · pe_battle_net_download_track)",
- "[x] OAuth token + apple-network HTTP transport (pe_battle_net_oauth_token · pe_battlenet_apple_network_http)",
- "[x] Real launch orchestrator → D2R offline + online checkpoints (pe_real_launch_orchestrator · .checkpoint.d2r_battlenet_offline_play + .checkpoint.d2r_battlenet_online_play); online honest-freeze where Warden/anti-cheat blocks",
- "[ ] Extend launch path to D4 / CS2 (only D2R checkpoint-proven so far)"
- ],
- "children": [
- {
- "name": "ℹ️ D2R proven",
- "summary": "D2R launch path is checkpoint-proven (offline + online), so BNET is non-blocking for D2R bring-up."
- }
- ]
- },
- {
- "name": "GAMEBOX-PURPLE — 💜 퍼플 런처 (plaync PURPLE)",
- "summary": "plaync PURPLE launcher/platform for Lineage M/W: 2FA TOTP, plaync OAuth proxy, WebView2 warm, .NET CLR probe, Android-emulation layer for mobile titles.",
- "path": "lib/perf/",
- "status": "🟢 4/4 (M/W purple checkpoints landed)",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-PURPLE # 런처: plaync PURPLE (Lineage M/W host)",
- "GAMEBOX-LINEAGE-M --uses--> GAMEBOX-PURPLE",
- "GAMEBOX-LINEAGE-W --uses--> GAMEBOX-PURPLE",
- "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-PURPLE # DOWNLOAD/INSTALL only"
- ],
- "milestones": [
- "[x] plaync OAuth proxy + 2FA TOTP proxy (c_purple_plaync_oauth_proxy · c_purple_2fa_totp_proxy)",
- "[x] WebView2 warm + .NET CLR probe (c_purple_webview2_warm · c_purple_dotnet_clr_probe)",
- "[x] Android emulation layer track (c_purple_android_emul_layer_track — Lineage M APK)",
- "[x] purple launcher offline shim → Lineage M/W purple checkpoints (.checkpoint.lineage_m_purple_play + .checkpoint.lineage_w_purple_play)"
- ],
- "children": [
- {
- "name": "ℹ️ consumers + non-blocking",
- "summary": "Consumers Lineage M/W are checkpoint-proven so PURPLE is non-blocking; Lineage Classic depends on PURPLE for DOWNLOAD/INSTALL only (runtime is native, so PURPLE does not gate Classic execution)."
- }
- ]
- }
- ]
- },
- {
- "name": "🛫 sprint meta-domain (composition · `+`)",
- "summary": "Focused composition meta-domain over near-ready titles + their shared prerequisites.",
- "children": [
- {
- "name": "GAMEBOX-LAUNCHPAD+ — 🛫 두 게임 빠른 출시대 (sprint)",
- "summary": "Get GAMEBOX-D2R + GAMEBOX-LINEAGE-CLASSIC to PLAYABLE ('도달') as fast as possible.",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-LAUNCHPAD+ # sprint meta: D2R + Classic 빠른 플레이 도달",
- "GAMEBOX-LAUNCHPAD+ --targets--> GAMEBOX-D2R # near-ready: offline+online checkpoint",
- "GAMEBOX-LAUNCHPAD+ --targets--> GAMEBOX-LINEAGE-CLASSIC # near-ready: native first-frame checkpoint"
- ],
- "milestones": [
- "[ ] Define + record the per-title 'playable' smoke bar (boot→title→char→in-world) as checkpoints",
- "[ ] D2R: offline playable loop confirmed end-to-end (beyond launch checkpoint → real play); online Warden boundary documented",
- "[ ] LINEAGE-CLASSIC (ONLINE MMO): drive to online-login/realm boundary (local first-frame already ✅); GameGuard kernel-AC honest-freeze documented as the play gate; client assume-acquired (PURPLE download deferred)",
- "[ ] Shared prereqs (LOADER·WIN32·GFX·NET) confirmed non-blocking for both during the sprint",
- "[ ] Both titles flipped to playable in their own domains → LAUNCHPAD+ goal met"
- ],
- "children": [
- {
- "name": "ℹ️ sprint composition",
- "summary": "Sprint meta-domain (`+` = composition) over the two near-ready titles + their shared prerequisites (LOADER · WIN32 · GFX · NET; D2R also BNET; Classic download PURPLE deferred)."
- },
- {
- "name": "ℹ️ DONE bar",
- "summary": "DONE = both titles flipped to playable in their own domains."
- },
- {
- "name": "ℹ️ online play gate",
- "summary": "BOTH are ONLINE games — 'playable' needs a live server connection, gated by kernel anti-cheat (D2R=Warden · Classic=GameGuard); the honest-freeze on those kernel-AC layers is the hard wall for full online play."
- }
- ]
- }
- ]
- },
- {
- "name": "🎮 게임 — per-game",
- "summary": "Eleven per-game bring-up domains. Each stands on the 메인구조 subsystems (+ its launcher); SSOT per title = .roadmap. + .checkpoint.. Online titles are gated by kernel anti-cheat honest-freeze where blocked.",
- "children": [
- {
- "name": "GAMEBOX-D2R — 😈 디아2 레저렉션 (Diablo II Resurrected)",
- "summary": "Diablo II Resurrected end-to-end on macOS: D3D11 renderer init, MPQ archive load, D2S savegame, offline + Battle.net online play.",
- "path": ".roadmap.diablo2_resurrected · .checkpoint.d2r_battlenet_{offline,online}_play",
- "status": "🟢 3/4 (offline+online checkpoints)",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-D2R",
- "GAMEBOX-D2R --uses--> GAMEBOX-BNET # launches via Battle.net",
- "GAMEBOX-D2R --uses--> GAMEBOX-LOADER # pe_d2r_mpq_archive_load · pe_d2r_savegame_d2s_format",
- "GAMEBOX-D2R --uses--> GAMEBOX-WIN32 # kernel32/user32/ntdll API shim",
- "GAMEBOX-D2R --uses--> GAMEBOX-GFX # pe_d2r_d3d11_renderer_init · c_d2r_dx11_pipeline_warm",
- "GAMEBOX-D2R --uses--> GAMEBOX-NET # realm protocol / winsock (online; honest-freeze where blocked)"
- ],
- "milestones": [
- "[x] D3D11 renderer init + MPQ archive load + D2S savegame format (pe_d2r_d3d11_renderer_init · pe_d2r_mpq_archive_load · pe_d2r_savegame_d2s_format)",
- "[x] Offline play checkpoint (Battle.net offline shim) — .checkpoint.d2r_battlenet_offline_play",
- "[x] Online play checkpoint (realm protocol — honest-freeze where blocked) — .checkpoint.d2r_battlenet_online_play + docs/D2R_REALM_PROTOCOL_HONEST_FREEZE.md",
- "[ ] Gameplay tracks (26 c_d2r_* present): act progression, runeword/horadric recipe, drop tables, terror zone — verify each track end-to-end"
- ],
- "children": [
- {
- "name": "ℹ️ checkpoints",
- "summary": "d2r offline/online checkpoints landed."
- },
- {
- "name": "ℹ️ prerequisites",
- "summary": "Prerequisites (all code present): LOADER (MPQ/D2S) · WIN32 (kernel32/user32/ntdll) · GFX (D3D11→Metal) · NET (realm/winsock) · BNET (launch orchestrator)."
- }
- ]
- },
- {
- "name": "GAMEBOX-D4 — 🔥 디아4 (Diablo IV)",
- "summary": "Diablo IV bring-up: D3D12 + DXR (BVH compact, first-frame trace), PSO warmup, and seasonal/endgame gameplay tracks. Largest per-game track surface (27 perf modules).",
- "path": ".roadmap.diablo4",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-D4",
- "GAMEBOX-D4 --uses--> GAMEBOX-BNET"
- ],
- "milestones": [
- "[ ] D3D12 + DXR first-frame trace + BVH compact",
- "[ ] PSO warmup priority + dxr inline RT shader",
- "[ ] Specific track (d4) launch path",
- "[ ] Endgame tracks: paragon/glyph, helltide, nightmare sigil, pit tier, masterworking/tempering"
- ]
- },
- {
- "name": "GAMEBOX-ELDEN — ⚔️ 엘든링 (Elden Ring)",
- "summary": "Elden Ring bring-up: PE64 loader probe, EAC kernel-driver avoidance (offline), MSStore/MSIX license stub, D3D12 first-frame + PSO warm, FromSoft HKS script cache. Scope = base game + Shadow of the Erdtree DLC.",
- "path": ".roadmap.elden_ring",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-ELDEN"
- ],
- "milestones": [
- "[ ] PE64 loader probe + MSIX container extract + MSStore license stub",
- "[ ] EAC kernel-driver avoid track + offline launch probe (honest-freeze online)",
- "[ ] D3D12 first-frame + PSO warm",
- "[ ] Offline save compat + FromSoft HKS script cache + SOTE DLC content probe"
- ]
- },
- {
- "name": "GAMEBOX-NIGHTREIGN — 🌑 엘든링 나이트레인 (Elden Ring Nightreign)",
- "summary": "Elden Ring Nightreign (co-op variant) bring-up: co-op session init, matchmaking probe, and D3D12 first-frame co-op variant — sharing the Elden Ring engine base.",
- "path": ".roadmap.elden_ring_nightreign",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-NIGHTREIGN",
- "GAMEBOX-NIGHTREIGN --uses--> GAMEBOX-ELDEN # shares Elden Ring engine base"
- ],
- "milestones": [
- "[ ] Co-op session init + matchmaking probe",
- "[ ] D3D12 first-frame (co-op variant)",
- "[ ] Shared Elden Ring loader/EAC/offline base reuse",
- "[ ] Online entry posture (honest-freeze where matchmaking blocked)"
- ]
- },
- {
- "name": "GAMEBOX-LINEAGE-CLASSIC — 🗡️ 리니지 클래식 R28 (Lineage Classic R28)",
- "summary": "Lineage Classic R28 native bring-up on macOS: native first-frame path + R28-specific loader track.",
- "path": ".roadmap.lineage_classic_r28 · .checkpoint.lineage_classic_r28_play",
- "status": "🟢 3/4 (local first-frame checkpoint; online gated by GameGuard)",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-LINEAGE-CLASSIC",
- "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-LOADER # pe_lineage_classic_r28_track (PE load)",
- "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-WIN32 # Win32 client API shim",
- "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-GFX # c_lineage_classic_r28_native_first_frame (Metal first frame)",
- "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-NET # ONLINE MMO: server login / realm connection (playable requires online; GameGuard kernel AC gates it)",
- "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-PURPLE # DOWNLOAD/INSTALL only (sole acquisition channel); runtime is native direct .exe"
- ],
- "milestones": [
- "[x] R28-specific loader track + native first-frame (pe_lineage_classic_r28_track · c_lineage_classic_r28_native_first_frame · 12 markers)",
- "[x] Local first-frame checkpoint (lineage_classic_r28_play) — .checkpoint.lineage_classic_r28_play (LOCAL RENDER only, NOT online play)",
- "[x] Drift resolution track bv landed (gamebox_lineage_classic_r28_drift_resolution_track_bv)",
- "[ ] ONLINE login/realm path — server connection → in-world (the real playable gate; GameGuard kernel-AC honest-freeze where blocked)"
- ],
- "children": [
- {
- "name": "ℹ️ checkpoint",
- "summary": "lineage_classic_r28 play checkpoint landed (LOCAL RENDER only)."
- },
- {
- "name": "ℹ️ online MMO requirement",
- "summary": "ONLINE MMO — playable REQUIRES a live server login/realm connection (NOT offline)."
- },
- {
- "name": "ℹ️ runtime + acquisition",
- "summary": "Runtime is native ('no Purple shell' — direct executable); PURPLE is the SOLE download/acquisition channel."
- },
- {
- "name": "ℹ️ playable gate",
- "summary": "PLAYABLE GATE = GameGuard (INCA Internet) kernel anti-cheat guarding online login → retired_intentional / honest-freeze."
- }
- ]
- },
- {
- "name": "GAMEBOX-LINEAGE-M — 📱 리니지M (Lineage M)",
- "summary": "Lineage M (purple) bring-up: Android-emulation first-frame via the PURPLE launcher path. lineage_m purple play checkpoint landed.",
- "path": ".roadmap.lineage_m · .checkpoint.lineage_m_purple_play",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-LINEAGE-M",
- "GAMEBOX-LINEAGE-M --uses--> GAMEBOX-PURPLE # launches via plaync PURPLE"
- ],
- "milestones": [
- "[ ] APK emulation layer first-frame (lineage_m_purple)",
- "[ ] PURPLE launcher integration (2FA/OAuth) — see GAMEBOX-PURPLE",
- "[ ] Play checkpoint (lineage_m_purple_play)",
- "[ ] Refine against .roadmap.lineage_m"
- ]
- },
- {
- "name": "GAMEBOX-LINEAGE-W — 🏔️ 리니지W (Lineage W)",
- "summary": "Lineage W (purple) bring-up: UE4 first-frame via the PURPLE launcher path. lineage_w purple play checkpoint landed.",
- "path": ".roadmap.lineage_w · .checkpoint.lineage_w_purple_play",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-LINEAGE-W",
- "GAMEBOX-LINEAGE-W --uses--> GAMEBOX-PURPLE # launches via plaync PURPLE"
- ],
- "milestones": [
- "[ ] UE4 first-frame (lineage_w_purple) + UE4 extension",
- "[ ] PURPLE launcher integration (2FA/OAuth) — see GAMEBOX-PURPLE",
- "[ ] Play checkpoint (lineage_w_purple_play)",
- "[ ] Refine against .roadmap.lineage_w"
- ]
- },
- {
- "name": "GAMEBOX-CS2 — 🔫 카운터스트라이크2 (Counter-Strike 2)",
- "summary": "Counter-Strike 2 bring-up: Source2 PSO genome, Steam api64 offline shim, tier0 platform shim. Status reflects retired_intentional posture where kernel-AC (VAC) blocks.",
- "path": ".roadmap.cs2",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-CS2",
- "GAMEBOX-CS2 --uses--> GAMEBOX-BNET"
- ],
- "milestones": [
- "[ ] Source2 PSO genome + tier0 platform shim",
- "[ ] Steam api64 offline shim + DRM stub track",
- "[ ] CS2-specific loader track",
- "[ ] Online/VAC posture (honest-freeze / retired_intentional where blocked)"
- ]
- },
- {
- "name": "GAMEBOX-DELTA-FORCE — 🪖 델타포스 (Delta Force)",
- "summary": "Delta Force bring-up: specific loader track + anti-cheat detection posture. Reflects honest-freeze where kernel anti-cheat blocks.",
- "path": ".roadmap.delta_force",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-DELTA-FORCE"
- ],
- "milestones": [
- "[ ] Delta Force specific loader track",
- "[ ] Anti-cheat detection track + posture",
- "[ ] Launch path probe",
- "[ ] Refine against .roadmap.delta_force"
- ]
- },
- {
- "name": "GAMEBOX-WOT — 🛡️ 월드오브탱크 (World of Tanks)",
- "summary": "World of Tanks bring-up on the BigWorld engine: DX11 first-frame, shader persist, Python script cache, Wargaming OAuth/CDN, garage/training-room profile.",
- "path": ".roadmap.wot",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-WOT"
- ],
- "milestones": [
- "[ ] BigWorld core DX11 first-frame + shader persist",
- "[ ] BigWorld Python script cache",
- "[ ] Wargaming OAuth proxy + CDN chunk parallel + delta update proto",
- "[ ] WoT garage warmup + training-room profile"
- ]
- },
- {
- "name": "GAMEBOX-WOWS — 🚢 월드오브워쉽 (World of Warships)",
- "summary": "World of Warships bring-up on the BigWorld engine: shared BigWorld core + Wargaming network stack, port warmup, replay playback.",
- "path": ".roadmap.wows",
- "edges": [
- "GAMEBOX --has--> GAMEBOX-WOWS",
- "GAMEBOX-WOWS --uses--> GAMEBOX-WOT # shares BigWorld engine + WG net stack"
- ],
- "milestones": [
- "[ ] BigWorld core (shared with WoT) first-frame",
- "[ ] Wargaming OAuth + CDN + WGC chromium multi-proc track",
- "[ ] WoWS port warmup + replay playback",
- "[ ] Refine against shared BigWorld/WG tracks"
- ]
- }
- ]
+ "key": "detail",
+ "label": "detail"
}
- ]
-}
+ ],
+ "tree": {
+ "name": "🕹️ gamebox — Apple-native Win32 game runtime",
+ "role": "Apple-native Win32 game runtime — 미수정 Win32 PE 게임을 macOS/Apple Silicon 에서 네이티브 실행 (Wine 0)",
+ "id": "gamebox",
+ "detail": "hexa-only 스택: PE loader + Win32 API shim + DirectX→Metal. strict own1 (DRM/Warden/anti-cheat bypass 0 · anima clone 0).",
+ "children": [
+ {
+ "name": "ℹ️ meta — SSOT · own1 posture · verdict",
+ "role": "프로젝트 메타데이터",
+ "id": "meta",
+ "detail": "",
+ "children": [
+ {
+ "name": "ssot — 저장소",
+ "role": "",
+ "id": "meta-ssot",
+ "detail": "github.com/dancinlife/gamebox"
+ },
+ {
+ "name": "parent — 상위",
+ "role": "",
+ "id": "meta-parent",
+ "detail": "dancinlab"
+ },
+ {
+ "name": "siblings — 형제 프로젝트",
+ "role": "",
+ "id": "meta-siblings",
+ "detail": "",
+ "children": [
+ {
+ "name": "• hexa-lang",
+ "role": "",
+ "id": "meta-siblings-1",
+ "detail": "hexa-lang (loader/perf/dispatch language)"
+ },
+ {
+ "name": "• anima",
+ "role": "",
+ "id": "meta-siblings-2",
+ "detail": "anima (consciousness daemon — anima clone 0)"
+ },
+ {
+ "name": "• sim-universe",
+ "role": "",
+ "id": "meta-siblings-3",
+ "detail": "sim-universe (reference layout v1.0.0)"
+ }
+ ]
+ },
+ {
+ "name": "forensic_verdict — 검증 판정",
+ "role": "",
+ "id": "meta-forensic-verdict",
+ "detail": "SKELETON_TIER_WIN32 + E5_PIPELINE_PROVEN — every module compiles/probes; the PE→ D3D11→ Metal pipeline is now proven end-to-end (r12: a self-authored own1 49-byte D3D11 PE executes through the i386 interpreter → D3D11→ Metal bridge →",
+ "children": [
+ {
+ "name": "ℹ️ forensic_verdict — 검증 판정 — 상세 2",
+ "role": "",
+ "id": "meta-forensic-verdict-d2",
+ "detail": "real Apple Metal headless offscreen frame, pixel-readback verified · px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1). validated_manjeom = first_own1_authored_d3d11_pe_to_metal_frame (infrastructure milestone, NOT a commercial game)."
+ },
+ {
+ "name": "ℹ️ forensic_verdict — 검증 판정 — 상세 3",
+ "role": "",
+ "id": "meta-forensic-verdict-d3",
+ "detail": "NO commercial game frame evidenced yet — a real game needs the full Win32/D3D11 API surface + real assets + the real game's PE. See README.md#caveats-raw10-c3."
+ }
+ ]
+ },
+ {
+ "name": "own1 — bypass-0 자세",
+ "role": "",
+ "id": "meta-own1",
+ "detail": "Wine 0 / DRM bypass 0 / Warden bypass 0 / anti-cheat bypass 0 (5 classes: VAC + GameGuard + EAC kernel + EAC anti-tamper + Warden) / FromSoft matchmaking bypass 0 / anima clone 0 / destructive_ops 0."
+ },
+ {
+ "name": "own2 — PASS/FAIL 사유 자세",
+ "role": "",
+ "id": "meta-own2",
+ "detail": "every subcommand emits an explicit PASS/FAIL/PARTIAL/RETIRED_INTENTIONAL reason; predecessor markers preserved verbatim for traceability."
+ },
+ {
+ "name": "version",
+ "role": "",
+ "id": "meta-version",
+ "detail": "1.0.4"
+ },
+ {
+ "name": "migrated_from — 출처 전환",
+ "role": "",
+ "id": "meta-migrated-from",
+ "detail": "DOMAINS.tape roster + domains/*.md (22 snapshots) + domains/*.log.md (22 logs) retired 2026-06-18 → ARCHITECTURE.json tree SSOT + ARCHITECTURE.html viewer (hexa-codex/anima c4 standard)"
+ },
+ {
+ "name": "roster — 도메인 구성",
+ "role": "",
+ "id": "meta-roster",
+ "detail": "22 domains (1 meta-root + 6 메인구조 + 1 nested C-PORT + 2 런처 + 1 sprint-meta + 11 게임)"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ tree SSOT note",
+ "role": "DOMAIN-TREE SSOT (update-in-place · not append-only)",
+ "id": "tree-ssot-note",
+ "detail": "This JSON tree is the DOMAIN-TREE SSOT (update-in-place, NOT append-only) — it retires the former DOMAINS.tape roster + domains/*.md snapshots + domains/*.log.md logs (folded into CHANGELOG.jsonl 2026-06-18)."
+ },
+ {
+ "name": "ℹ️ skeleton-tier status",
+ "role": "",
+ "id": "skeleton-tier-status",
+ "detail": "Skeleton-tier loaders/perf compile + probe; the PE→ D3D11→ Metal pipeline is proven end-to-end with a self-authored own1 D3D11 PE (r12, pixel-readback verified) = validated_manjeom first_own1_authored_d3d11_pe_to_metal_frame (infrastructure milestone).",
+ "children": [
+ {
+ "name": "ℹ️ ℹ️ skeleton-tier status — 상세 2",
+ "role": "",
+ "id": "skeleton-tier-status-d2",
+ "detail": "NO commercial game frame evidenced yet (real game = full Win32/D3D11 surface + real assets + real PE)."
+ }
+ ]
+ },
+ {
+ "name": "🚧 frontiers — E5 인프라 ✅ proven / 상업 게임 ⬜ open",
+ "role": "",
+ "id": "frontiers-e5-proven-open",
+ "detail": "validated_manjeom 사다리(docs/CLOSURE_ROADMAP.md §5)의 현재상태 SSOT. E5 인프라 파이프라인(PE→i386 인터프리터→IAT autobind→D3D11→Metal→readback)은 r10–r12로 증명 완료(자작 own1 PE 기준). 상업 게임 프레임은 미증명(open). 라운드별 측정 이력은 CHANGELOG+git+memory(project_gamebox_e3_frontier).",
+ "children": [
+ {
+ "name": "F-NSWINDOW-E5 — E1✅ E2✅ E3✅ E4✅(IAT name-autobind) E5✅(r12: PE→D3D11→Metal 인프라 마일스톤)",
+ "role": "",
+ "id": "f-nswindow-e5-e1-e2-e3-e4-iat-name-autobind-e5-r12-pe-d3d11-metal",
+ "detail": "validated_manjeom 사다리(docs/CLOSURE_ROADMAP.md §5). E1 PE-parse+mmap done· E2 i386 디코더 done· E3 i386 인터프리터 done(실 game-binary EXECUTE)· E4 kernel32 IAT name-autobind done(합성 prologue CRT→ user-entry handoff· insns=60· K32 13· IAT name-autobind)·",
+ "children": [
+ {
+ "name": "ℹ️ F-NSWINDOW-E5 — E1✅ E2✅ E3✅ E4✅(IAT name-autobind) E5✅(r12: PE→D3D11→Metal 인프라 마일스톤) — 상세 2",
+ "role": "",
+ "id": "f-nswindow-e5-e1-e2-e3-e4-iat-name-autobind-e5-r12-pe-d3d11-metal-d2",
+ "detail": "E5 r10-r12 완료: r10 헤드리스 Metal 오프스크린 렌더+readback PASS· r11 D3D11→ Metal 브리지 네이티브 PASS· r12 PE→ D3D11→ Metal end-to-end PASS(insns=11 imports=7 px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1). validated_manjeom=first_own1_authored_d3d11_pe_to_metal_frame(인프라 마일스톤· 상업 게임 아님)."
+ },
+ {
+ "name": "ℹ️ F-NSWINDOW-E5 — E1✅ E2✅ E3✅ E4✅(IAT name-autobind) E5✅(r12: PE→D3D11→Metal 인프라 마일스톤) — 상세 3",
+ "role": "",
+ "id": "f-nswindow-e5-e1-e2-e3-e4-iat-name-autobind-e5-r12-pe-d3d11-metal-d3",
+ "detail": "다음: 상업 게임 방향 — Win32 API 서피스 확장· opcode 커버리지· vtable [reg+offset] 간접 call· 실 게임 PE IAT 추적."
+ }
+ ]
+ },
+ {
+ "name": "E5 인프라 파이프라인 (proven · CI 검증) — PE→interp→autobind→D3D11→Metal→readback",
+ "role": "",
+ "id": "e5-proven-ci-pe-interp-autobind-d3d11-metal-readback",
+ "detail": "레이어: ① 자작 own1 i386 PE(d3d11.dll import· native/fixtures) → ② native/i386_cpu.c i386 인터프리터(decode→ execute· EFLAGS· byte-eq 트윈 native/i386_decode.hexa RUNEQ) → ③ IAT name-based autobind(native/pe_parse.c import_dir + IMAGE_IMPORT_BY_NAME strcmp → shim 레지스트리·",
+ "children": [
+ {
+ "name": "ℹ️ E5 인프라 파이프라인 (proven · CI 검증) — PE→interp→autobind→D3D11→Metal→readback — 상세 2",
+ "role": "",
+ "id": "e5-proven-ci-pe-interp-autobind-d3d11-metal-readback-d2",
+ "detail": "미매칭 I386_HALT_UNBOUND_IMPORT) → ④ native/d3d11_metal_bridge.m(D3D11-COM-형상 vtable → MTLDevice· 오프스크린 64×64 BGRA8· 인라인 MSL PSO) → ⑤ Apple Metal 헤드리스 렌더 → ⑥ [MTLTexture getBytes:] readback."
+ },
+ {
+ "name": "ℹ️ E5 인프라 파이프라인 (proven · CI 검증) — PE→interp→autobind→D3D11→Metal→readback — 상세 3",
+ "role": "",
+ "id": "e5-proven-ci-pe-interp-autobind-d3d11-metal-readback-d3",
+ "detail": "측정(native/e5_end_to_end_test.c): __E5__ PASS pe_executed=1 frame_rendered=1 px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1 insns=11 imports=7. validated_manjeom=first_own1_authored_d3d11_pe_to_metal_frame(인프라 마일스톤· 상업 게임 아님). own1: Wine/DXVK/d3d11.dll 0· DRM 0· 게임애셋 0."
+ },
+ {
+ "name": "ℹ️ E5 인프라 파이프라인 (proven · CI 검증) — PE→interp→autobind→D3D11→Metal→readback — 상세 4",
+ "role": "",
+ "id": "e5-proven-ci-pe-interp-autobind-d3d11-metal-readback-d4",
+ "detail": "CI=github-hosted macos-15(PUBLIC repo 무료)."
+ }
+ ]
+ },
+ {
+ "name": "⬜ OPEN — 상업 게임 프레임 (미증명)",
+ "role": "",
+ "id": "open",
+ "detail": "인프라는 자작 PE로 증명됐으나 상업 게임(디아블로/리니지 등)은 미증명. 필요: 전체 Win32/D3D11 API 서피스·vtable [reg+offset] 간접 call·넓은 opcode 커버·실 게임 PE IAT 추적·실 애셋. own1 유지(no Wine/DRM/Warden/anti-cheat bypass)."
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ tree composition",
+ "role": "",
+ "id": "tree-composition",
+ "detail": "Umbrella meta-root carrying the 메인구조 (engine subsystems) + 런처 (launchers) + 게임 (per-game) tree below."
+ },
+ {
+ "name": "ℹ️ viewer",
+ "role": "",
+ "id": "viewer",
+ "detail": "Human viewer = ARCHITECTURE.html via `python3 serve.py`."
+ },
+ {
+ "name": "ℹ️ doc pointers (SSOT split)",
+ "role": "",
+ "id": "doc-pointers-ssot-split",
+ "detail": "Component-level final-architecture prose lives in ARCHITECTURE.md; history/decisions → CHANGELOG.jsonl; governance → CLAUDE.md; per-game/launcher SSOT → .roadmap.* + .checkpoint.* (this doc points, never duplicates)."
+ },
+ {
+ "name": "ℹ️ node schema",
+ "role": "",
+ "id": "node-schema",
+ "detail": "Each node carries its domain @goal as `summary` and its milestones as `milestones[]` ([x]=done / [ ]=open)."
+ },
+ {
+ "name": "ℹ️ edge convention",
+ "role": "",
+ "id": "edge-convention",
+ "detail": "Tree edges below were the DOMAINS.tape `@link --has--> `; cross-edges (--uses-->, --targets-->) are preserved per-node in `edges`."
+ },
+ {
+ "name": "🧱 메인구조 — engine subsystems",
+ "role": "",
+ "id": "engine-subsystems",
+ "detail": "The six hexa-native runtime pillars every game stands on: PE loader, Win32 API shim, DirectX→Metal, networking, perf/telemetry, and the thin native-C base.",
+ "children": [
+ {
+ "name": "ℹ️ code SSOT",
+ "role": "",
+ "id": "code-ssot",
+ "detail": "Code SSOT: lib/loader/ (PE *_core · win32_* · i386_* · pe_d3d* · ipc_*), lib/perf/ (c_* tracks), native/ (C helpers)."
+ },
+ {
+ "name": "GAMEBOX-LOADER — 🧱 PE 적재기 (PE loader)",
+ "role": "",
+ "id": "gamebox-loader",
+ "detail": "hexa-only PE loader: map PE32/PE32+ images, i386/x64 decode, IAT resolve, base relocations, SEH chains, TLS callbacks, MSVC CRT init — with Wine=0.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-loader-path",
+ "detail": "lib/loader/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-loader-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-loader-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-LOADER # 메인구조: PE load · i386/x64 · IAT · SEH · TLS · MSVC CRT"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-loader-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-loader-ms-1",
+ "detail": "[ ] PE32/PE32+ section mapper + base relocation applier (real mmap)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-loader-ms-2",
+ "detail": "[ ] i386 + x64 instruction decode + calling-convention translation to arm64"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-loader-ms-3",
+ "detail": "[ ] IAT resolve (direct/forwarder/delay-load/hint fast-path) real binding"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-loader-ms-4",
+ "detail": "[ ] SEH x64 .pdata unwinder + i386 FS:[0] chain dispatch"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-loader-ms-5",
+ "detail": "[ ] TLS callback dispatch + MSVC CRT (initterm/security-cookie/SEH) bring-up"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-WIN32 — 🪟 윈도우 API 통역 (Win32 API shim)",
+ "role": "",
+ "id": "gamebox-win32",
+ "detail": "hexa-native Win32 API shim across ~14 DLLs (kernel32/user32/gdi32/ntdll/advapi32/winsock/ole32/…) — real implementations over stubs, Wine=0.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-win32-path",
+ "detail": "lib/loader/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-win32-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-win32-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-WIN32 # 메인구조: Win32 API shim (~14 DLLs)"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-win32-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-win32-ms-1",
+ "detail": "[ ] kernel32 stage1→5: CreateProcess/CreateThread/Heap* real (not stub)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-win32-ms-2",
+ "detail": "[ ] user32 + gdi32 tier1 real: window/message/DC/GDI object"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-win32-ms-3",
+ "detail": "[ ] ntdll native API: NtCreateFile/Event/Mutant/Semaphore/Thread real"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-win32-ms-4",
+ "detail": "[ ] advapi32/crypt32/ole32/oleaut32/shell32 tier1 real coverage"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-win32-ms-5",
+ "detail": "[ ] winsock ws2_32 + IOCP/overlapped/select surface"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-GFX — 🎨 그래픽 변환기 (DirectX→Metal)",
+ "role": "",
+ "id": "gamebox-gfx",
+ "detail": "DirectX → Metal translation: D3D11 + D3D12 command/resource/pipeline mapped to Metal, DXGI swapchain present, DXBC/DXIL→AIR shader cross-compile (D3DMetal-pinned, no Wine).",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-gfx-path",
+ "detail": "lib/loader/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-gfx-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-gfx-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-GFX # 메인구조: DirectX 11/12 → Metal · DXIL→AIR"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-gfx-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-gfx-ms-1",
+ "detail": "[ ] D3D11 real path: buffer/texture/draw/state objects → Metal"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-gfx-ms-2",
+ "detail": "[ ] D3D12 real path: command queue/list, descriptor heap, fence, swapchain present"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-gfx-ms-3",
+ "detail": "[ ] DXGI factory + swapchain present + D3D→Metal router"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-gfx-ms-4",
+ "detail": "[ ] Shader xlate DXBC/DXIL → AIR + SV mapping"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-gfx-ms-5",
+ "detail": "[ ] Advanced: DXR raytracing, mesh shader, compute dispatch"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-NET — 🌐 네트워크 프로토콜 (networking/IPC)",
+ "role": "",
+ "id": "gamebox-net",
+ "detail": "Networking/IPC protocol layer: winsock/IOCP, IPC (mach port/xpc/named pipe/shared mem), TLS (schannel/apple-network), OAuth, and TACT/NGDP/CASC content delivery primitives shared by launchers.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-net-path",
+ "detail": "lib/loader/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-net-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-net-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-NET # 메인구조: winsock · IPC · TLS · OAuth · TACT/NGDP/CASC"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-net-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-net-ms-1",
+ "detail": "[ ] winsock ws2_32 + IOCP/overlapped/select + iphlpapi"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-net-ms-2",
+ "detail": "[ ] IPC matrix: mach port, xpc, unix socket, named pipe, shared memory, tcp loopback"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-net-ms-3",
+ "detail": "[ ] TLS: schannel + apple-network HTTP/TLS sink + https certificate"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-net-ms-4",
+ "detail": "[ ] OAuth device/PKCE flow + redirect capture proxy"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-net-ms-5",
+ "detail": "[ ] TACT/NGDP/CASC parser + CDN chunk assemble/dedup/resume"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-PERF — 📊 성능 계기판 (perf/telemetry)",
+ "role": "",
+ "id": "gamebox-perf",
+ "detail": "Performance + telemetry + presentation: FPS overlay (Metal-composed), frame pacing, display modes (fullscreen/PIP/dpi), Metal optimization tracks, and per-session aggregation.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-perf-path",
+ "detail": "lib/perf/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-perf-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-perf-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-PERF # 메인구조: FPS overlay · frame pacing · display mode · metal opt"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-perf-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-perf-ms-1",
+ "detail": "[ ] FPS overlay: metal compose + history graph + hotkey + metric aggregator"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-perf-ms-2",
+ "detail": "[ ] Frame pacing adaptive + frametime histogram + first-frame breakdown"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-perf-ms-3",
+ "detail": "[ ] Display modes: fullscreen-exclusive Metal, PIP, dpi scale, focus routing, macOS menubar"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-perf-ms-4",
+ "detail": "[ ] Metal opt: pipeline archive, private-heap prewarm, residency coalesce, simdgroup reduce"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-perf-ms-5",
+ "detail": "[ ] Session aggregator + roofline/thermal/vram pressure forecast"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ module scale",
+ "role": "",
+ "id": "module-scale",
+ "detail": "242+ c_*_*.hexa modules across 104 unique families; 18+ families at 100% manjeom (skeleton-tier)."
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-NATIVE — 🔩 C 받침대 (native C base)",
+ "role": "",
+ "id": "gamebox-native",
+ "detail": "Thin native C helper layer the hexa stack calls into: i386 instruction decode, PE parse, and PE→Mach-O shim — built with entitlements for JIT/mmap. Live authored scope native/*.c = 4 files, 869 LOC.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-native-path",
+ "detail": "native/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-native-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-native-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-NATIVE # 메인구조: C helpers (i386_decode · pe_parse · pe_to_macho)"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-native-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-native-ms-1",
+ "detail": "[ ] i386_decode.c — i386 instruction decode helper + test"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-native-ms-2",
+ "detail": "[ ] pe_parse.c — PE header/section/import parse helper"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-native-ms-3",
+ "detail": "[ ] pe_to_macho_shim.c — PE→Mach-O bridge"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-native-ms-4",
+ "detail": "[ ] build.sh + entitlements.plist (JIT/mmap/weak-link Metal)"
+ }
+ ]
+ },
+ {
+ "name": "C-PORT — 🦀→💎 native C → hexa 이식",
+ "role": "🟢 M1–M4 landed (RUNEQ PORT-EQ)",
+ "id": "c-port-native-c-hexa",
+ "detail": "Drive gamebox's native x86-decoder / PE-shim C to hexa-native wherever no OS-ABI dependency forces C; RUNEQ-gated (byte-identical output vs the C baseline).",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "c-port-native-c-hexa-path",
+ "detail": "native/i386_decode.hexa · .verdicts/c-port/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "c-port-native-c-hexa-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "c-port-native-c-hexa-edge-1",
+ "detail": "GAMEBOX-NATIVE --has--> C-PORT # 메인구조: native C → hexa 이식 (Tier A 포팅 · C irreducible FFI 유지)"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "c-port-native-c-hexa-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-1",
+ "detail": "[x] Milestone-1 — inventory + classify live native/*.c (4 files 869 LOC; Tier-A 437 · Tier-B 113 · Tier-C 319). Verdict .verdicts/c-port/INVENTORY.txt."
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-2",
+ "detail": "[x] Milestone-2 — Tier-A leaf port: decode_modrm_disp (ModR/M+SIB+disp, ~43 LOC) + i386_reg32_name → native/i386_decode.hexa, RUNEQ PORT-EQ (768/768 byte-identical vs C, sha256 b4388479). Verdict .verdicts/c-port/M2-decode_modrm_disp.txt."
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-3",
+ "detail": "[x] Milestone-3 — Tier-A leaf batch: decode_prefixes (C 72-95) + i386_op_name (C 34-70) + rd_s32/rd_s16 (C 143-152), ~71 LOC → native/i386_decode.hexa, RUNEQ PORT-EQ (1069/1069 byte-identical, sha256 8e6acbb8). Per-leaf verdicts .verdicts/c-port/M3-{decode_prefixes,i386_op_name,rd_s32_rd_s16}.txt."
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-4",
+ "detail": "[x] Milestone-4 — Tier-A stateful unit: i386_decode_one (C 154-303, ~150 LOC) — prefix run → 1-byte/2-byte opcode dispatch → ModR/M+SIB+disp → i386_insn_t (12-tuple). Composes M2/M3 leaves. RUNEQ PORT-EQ (1042/1042 byte-identical over 5-sub-corpus sweep, sha256 b2853d0a).",
+ "children": [
+ {
+ "name": "ℹ️ ms4 — 상세 2",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-4-d2",
+ "detail": "Verdict .verdicts/c-port/M4-decode_one.txt."
+ }
+ ]
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-5",
+ "detail": "[ ] Tier-A residual: i386_format_insn (C 305-end) disassembly-string formatter → hexa, RUNEQ on the rendered string (libc snprintf parity)"
+ },
+ {
+ "name": "M6",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-6",
+ "detail": "[ ] pe_parse.c split: hexa-native pe_parse_buf(bytes) Tier-A core + thin C/FFI file-map ingress (Tier C)"
+ },
+ {
+ "name": "M7",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-7",
+ "detail": "[ ] Tier-B retire: drop i386_decode_test.c once hexa decode reaches RUNEQ parity"
+ },
+ {
+ "name": "M8",
+ "role": "",
+ "id": "c-port-native-c-hexa-ms-8",
+ "detail": "[ ] Tier-C documented-stay: pe_to_macho_shim.c MAP_JIT/mprotect loader remains C (or hexa FFI)"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ irreducible C",
+ "role": "",
+ "id": "irreducible-c",
+ "detail": "Irreducible FFI/loader syscalls stay C."
+ },
+ {
+ "name": "ℹ️ live scope + tier classification",
+ "role": "",
+ "id": "live-scope-tier-classification",
+ "detail": "Live scope native/*.c = 4 files, 869 LOC, classified Tier A (PORTABLE) / Tier B (TEST harness) / Tier C (IRREDUCIBLE FFI/platform) in .verdicts/c-port/INVENTORY.txt."
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "🚀 런처/플랫폼 — launchers",
+ "role": "",
+ "id": "launchers",
+ "detail": "Platform launchers/hosts a game boots through. Battle.net hosts D2R/D4/CS2; plaync PURPLE hosts Lineage M/W (and is the download channel for Lineage Classic). Both are checkpoint-proven non-blocking for their proven titles.",
+ "children": [
+ {
+ "name": "GAMEBOX-BNET — 🚀 배틀넷 런처 (Battle.net)",
+ "role": "🟢 5/6 (D2R launch checkpoint-proven)",
+ "id": "gamebox-bnet",
+ "detail": "Battle.net launcher/platform bring-up: agent IPC, install/setup path, download (TACT/NGDP/CASC), OAuth token, and cold→warm launch orchestration for D2R/D4/CS2/SC2.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-bnet-path",
+ "detail": "lib/loader/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-bnet-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-bnet-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-BNET # 런처: Battle.net (D2R · D4 · CS2 host)"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-bnet-edge-2",
+ "detail": "GAMEBOX-D2R --uses--> GAMEBOX-BNET"
+ },
+ {
+ "name": "🔗 edge 3",
+ "role": "",
+ "id": "gamebox-bnet-edge-3",
+ "detail": "GAMEBOX-D4 --uses--> GAMEBOX-BNET"
+ },
+ {
+ "name": "🔗 edge 4",
+ "role": "",
+ "id": "gamebox-bnet-edge-4",
+ "detail": "GAMEBOX-CS2 --uses--> GAMEBOX-BNET"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-bnet-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-bnet-ms-1",
+ "detail": "[x] Battle.net agent IPC + HTTP REST 4-verb + agent SD forging (pe_battle_net_agent_ipc_track · pe_battlenet_agent_http_rest · pe_battlenet_agent_sd_forging)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-bnet-ms-2",
+ "detail": "[x] Setup/install path real + static-CRT path (pe_battlenet_setup_install_path_real · pe_battlenet_setup_static_crt_path · pe_battle_net_setup_install_phase)"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-bnet-ms-3",
+ "detail": "[x] TACT/NGDP/CASC download track + CDN mirror select (pe_battlenet_tact_ngdp_casc_track · pe_battle_net_download_track)"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-bnet-ms-4",
+ "detail": "[x] OAuth token + apple-network HTTP transport (pe_battle_net_oauth_token · pe_battlenet_apple_network_http)"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-bnet-ms-5",
+ "detail": "[x] Real launch orchestrator → D2R offline + online checkpoints (pe_real_launch_orchestrator · .checkpoint.d2r_battlenet_offline_play + .checkpoint.d2r_battlenet_online_play); online honest-freeze where Warden/anti-cheat blocks"
+ },
+ {
+ "name": "M6",
+ "role": "",
+ "id": "gamebox-bnet-ms-6",
+ "detail": "[ ] Extend launch path to D4 / CS2 (only D2R checkpoint-proven so far)"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ D2R proven",
+ "role": "",
+ "id": "d2r-proven",
+ "detail": "D2R launch path is checkpoint-proven (offline + online), so BNET is non-blocking for D2R bring-up."
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-PURPLE — 💜 퍼플 런처 (plaync PURPLE)",
+ "role": "🟢 4/4 (M/W purple checkpoints landed)",
+ "id": "gamebox-purple",
+ "detail": "plaync PURPLE launcher/platform for Lineage M/W: 2FA TOTP, plaync OAuth proxy, WebView2 warm, .NET CLR probe, Android-emulation layer for mobile titles.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-purple-path",
+ "detail": "lib/perf/"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-purple-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-purple-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-PURPLE # 런처: plaync PURPLE (Lineage M/W host)"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-purple-edge-2",
+ "detail": "GAMEBOX-LINEAGE-M --uses--> GAMEBOX-PURPLE"
+ },
+ {
+ "name": "🔗 edge 3",
+ "role": "",
+ "id": "gamebox-purple-edge-3",
+ "detail": "GAMEBOX-LINEAGE-W --uses--> GAMEBOX-PURPLE"
+ },
+ {
+ "name": "🔗 edge 4",
+ "role": "",
+ "id": "gamebox-purple-edge-4",
+ "detail": "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-PURPLE # DOWNLOAD/INSTALL only"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-purple-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-purple-ms-1",
+ "detail": "[x] plaync OAuth proxy + 2FA TOTP proxy (c_purple_plaync_oauth_proxy · c_purple_2fa_totp_proxy)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-purple-ms-2",
+ "detail": "[x] WebView2 warm + .NET CLR probe (c_purple_webview2_warm · c_purple_dotnet_clr_probe)"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-purple-ms-3",
+ "detail": "[x] Android emulation layer track (c_purple_android_emul_layer_track — Lineage M APK)"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-purple-ms-4",
+ "detail": "[x] purple launcher offline shim → Lineage M/W purple checkpoints (.checkpoint.lineage_m_purple_play + .checkpoint.lineage_w_purple_play)"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ consumers + non-blocking",
+ "role": "",
+ "id": "consumers-non-blocking",
+ "detail": "Consumers Lineage M/W are checkpoint-proven so PURPLE is non-blocking; Lineage Classic depends on PURPLE for DOWNLOAD/INSTALL only (runtime is native, so PURPLE does not gate Classic execution)."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "🛫 sprint meta-domain (composition · `+`)",
+ "role": "",
+ "id": "sprint-meta-domain-composition",
+ "detail": "Focused composition meta-domain over near-ready titles + their shared prerequisites.",
+ "children": [
+ {
+ "name": "GAMEBOX-LAUNCHPAD+ — 🛫 두 게임 빠른 출시대 (sprint)",
+ "role": "",
+ "id": "gamebox-launchpad",
+ "detail": "Get GAMEBOX-D2R + GAMEBOX-LINEAGE-CLASSIC to PLAYABLE ('도달') as fast as possible.",
+ "children": [
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-launchpad-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-launchpad-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-LAUNCHPAD+ # sprint meta: D2R + Classic 빠른 플레이 도달"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-launchpad-edge-2",
+ "detail": "GAMEBOX-LAUNCHPAD+ --targets--> GAMEBOX-D2R # near-ready: offline+online checkpoint"
+ },
+ {
+ "name": "🔗 edge 3",
+ "role": "",
+ "id": "gamebox-launchpad-edge-3",
+ "detail": "GAMEBOX-LAUNCHPAD+ --targets--> GAMEBOX-LINEAGE-CLASSIC # near-ready: native first-frame checkpoint"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-launchpad-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-launchpad-ms-1",
+ "detail": "[ ] Define + record the per-title 'playable' smoke bar (boot→title→char→in-world) as checkpoints"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-launchpad-ms-2",
+ "detail": "[ ] D2R: offline playable loop confirmed end-to-end (beyond launch checkpoint → real play); online Warden boundary documented"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-launchpad-ms-3",
+ "detail": "[ ] LINEAGE-CLASSIC (ONLINE MMO): drive to online-login/realm boundary (local first-frame already ✅); GameGuard kernel-AC honest-freeze documented as the play gate; client assume-acquired (PURPLE download deferred)"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-launchpad-ms-4",
+ "detail": "[ ] Shared prereqs (LOADER·WIN32·GFX·NET) confirmed non-blocking for both during the sprint"
+ },
+ {
+ "name": "M5",
+ "role": "",
+ "id": "gamebox-launchpad-ms-5",
+ "detail": "[ ] Both titles flipped to playable in their own domains → LAUNCHPAD+ goal met"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ sprint composition",
+ "role": "",
+ "id": "sprint-composition",
+ "detail": "Sprint meta-domain (`+` = composition) over the two near-ready titles + their shared prerequisites (LOADER · WIN32 · GFX · NET; D2R also BNET; Classic download PURPLE deferred)."
+ },
+ {
+ "name": "ℹ️ DONE bar",
+ "role": "",
+ "id": "done-bar",
+ "detail": "DONE = both titles flipped to playable in their own domains."
+ },
+ {
+ "name": "ℹ️ online play gate",
+ "role": "",
+ "id": "online-play-gate",
+ "detail": "BOTH are ONLINE games — 'playable' needs a live server connection, gated by kernel anti-cheat (D2R=Warden · Classic=GameGuard); the honest-freeze on those kernel-AC layers is the hard wall for full online play."
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "🎮 게임 — per-game",
+ "role": "",
+ "id": "per-game",
+ "detail": "Eleven per-game bring-up domains. Each stands on the 메인구조 subsystems (+ its launcher); SSOT per title = .roadmap. + .checkpoint.. Online titles are gated by kernel anti-cheat honest-freeze where blocked.",
+ "children": [
+ {
+ "name": "GAMEBOX-D2R — 😈 디아2 레저렉션 (Diablo II Resurrected)",
+ "role": "🟢 3/4 (offline+online checkpoints)",
+ "id": "gamebox-d2r",
+ "detail": "Diablo II Resurrected end-to-end on macOS: D3D11 renderer init, MPQ archive load, D2S savegame, offline + Battle.net online play.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-d2r-path",
+ "detail": ".roadmap.diablo2_resurrected · .checkpoint.d2r_battlenet_{offline,online}_play"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-d2r-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-d2r-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-D2R"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-d2r-edge-2",
+ "detail": "GAMEBOX-D2R --uses--> GAMEBOX-BNET # launches via Battle.net"
+ },
+ {
+ "name": "🔗 edge 3",
+ "role": "",
+ "id": "gamebox-d2r-edge-3",
+ "detail": "GAMEBOX-D2R --uses--> GAMEBOX-LOADER # pe_d2r_mpq_archive_load · pe_d2r_savegame_d2s_format"
+ },
+ {
+ "name": "🔗 edge 4",
+ "role": "",
+ "id": "gamebox-d2r-edge-4",
+ "detail": "GAMEBOX-D2R --uses--> GAMEBOX-WIN32 # kernel32/user32/ntdll API shim"
+ },
+ {
+ "name": "🔗 edge 5",
+ "role": "",
+ "id": "gamebox-d2r-edge-5",
+ "detail": "GAMEBOX-D2R --uses--> GAMEBOX-GFX # pe_d2r_d3d11_renderer_init · c_d2r_dx11_pipeline_warm"
+ },
+ {
+ "name": "🔗 edge 6",
+ "role": "",
+ "id": "gamebox-d2r-edge-6",
+ "detail": "GAMEBOX-D2R --uses--> GAMEBOX-NET # realm protocol / winsock (online; honest-freeze where blocked)"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-d2r-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-d2r-ms-1",
+ "detail": "[x] D3D11 renderer init + MPQ archive load + D2S savegame format (pe_d2r_d3d11_renderer_init · pe_d2r_mpq_archive_load · pe_d2r_savegame_d2s_format)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-d2r-ms-2",
+ "detail": "[x] Offline play checkpoint (Battle.net offline shim) — .checkpoint.d2r_battlenet_offline_play"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-d2r-ms-3",
+ "detail": "[x] Online play checkpoint (realm protocol — honest-freeze where blocked) — .checkpoint.d2r_battlenet_online_play + docs/D2R_REALM_PROTOCOL_HONEST_FREEZE.md"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-d2r-ms-4",
+ "detail": "[ ] Gameplay tracks (26 c_d2r_* present): act progression, runeword/horadric recipe, drop tables, terror zone — verify each track end-to-end"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ checkpoints",
+ "role": "",
+ "id": "checkpoints",
+ "detail": "d2r offline/online checkpoints landed."
+ },
+ {
+ "name": "ℹ️ prerequisites",
+ "role": "",
+ "id": "prerequisites",
+ "detail": "Prerequisites (all code present): LOADER (MPQ/D2S) · WIN32 (kernel32/user32/ntdll) · GFX (D3D11→Metal) · NET (realm/winsock) · BNET (launch orchestrator)."
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-D4 — 🔥 디아4 (Diablo IV)",
+ "role": "",
+ "id": "gamebox-d4",
+ "detail": "Diablo IV bring-up: D3D12 + DXR (BVH compact, first-frame trace), PSO warmup, and seasonal/endgame gameplay tracks. Largest per-game track surface (27 perf modules).",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-d4-path",
+ "detail": ".roadmap.diablo4"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-d4-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-d4-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-D4"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-d4-edge-2",
+ "detail": "GAMEBOX-D4 --uses--> GAMEBOX-BNET"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-d4-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-d4-ms-1",
+ "detail": "[ ] D3D12 + DXR first-frame trace + BVH compact"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-d4-ms-2",
+ "detail": "[ ] PSO warmup priority + dxr inline RT shader"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-d4-ms-3",
+ "detail": "[ ] Specific track (d4) launch path"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-d4-ms-4",
+ "detail": "[ ] Endgame tracks: paragon/glyph, helltide, nightmare sigil, pit tier, masterworking/tempering"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-ELDEN — ⚔️ 엘든링 (Elden Ring)",
+ "role": "",
+ "id": "gamebox-elden",
+ "detail": "Elden Ring bring-up: PE64 loader probe, EAC kernel-driver avoidance (offline), MSStore/MSIX license stub, D3D12 first-frame + PSO warm, FromSoft HKS script cache. Scope = base game + Shadow of the Erdtree DLC.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-elden-path",
+ "detail": ".roadmap.elden_ring"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-elden-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-elden-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-ELDEN"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-elden-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-elden-ms-1",
+ "detail": "[ ] PE64 loader probe + MSIX container extract + MSStore license stub"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-elden-ms-2",
+ "detail": "[ ] EAC kernel-driver avoid track + offline launch probe (honest-freeze online)"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-elden-ms-3",
+ "detail": "[ ] D3D12 first-frame + PSO warm"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-elden-ms-4",
+ "detail": "[ ] Offline save compat + FromSoft HKS script cache + SOTE DLC content probe"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-NIGHTREIGN — 🌑 엘든링 나이트레인 (Elden Ring Nightreign)",
+ "role": "",
+ "id": "gamebox-nightreign",
+ "detail": "Elden Ring Nightreign (co-op variant) bring-up: co-op session init, matchmaking probe, and D3D12 first-frame co-op variant — sharing the Elden Ring engine base.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-nightreign-path",
+ "detail": ".roadmap.elden_ring_nightreign"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-nightreign-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-nightreign-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-NIGHTREIGN"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-nightreign-edge-2",
+ "detail": "GAMEBOX-NIGHTREIGN --uses--> GAMEBOX-ELDEN # shares Elden Ring engine base"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-nightreign-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-nightreign-ms-1",
+ "detail": "[ ] Co-op session init + matchmaking probe"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-nightreign-ms-2",
+ "detail": "[ ] D3D12 first-frame (co-op variant)"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-nightreign-ms-3",
+ "detail": "[ ] Shared Elden Ring loader/EAC/offline base reuse"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-nightreign-ms-4",
+ "detail": "[ ] Online entry posture (honest-freeze where matchmaking blocked)"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-LINEAGE-CLASSIC — 🗡️ 리니지 클래식 R28 (Lineage Classic R28)",
+ "role": "🟢 3/4 (local first-frame checkpoint; online gated by GameGuard)",
+ "id": "gamebox-lineage-classic",
+ "detail": "Lineage Classic R28 native bring-up on macOS: native first-frame path + R28-specific loader track.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-lineage-classic-path",
+ "detail": ".roadmap.lineage_classic_r28 · .checkpoint.lineage_classic_r28_play"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-lineage-classic-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-lineage-classic-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-LINEAGE-CLASSIC"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-lineage-classic-edge-2",
+ "detail": "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-LOADER # pe_lineage_classic_r28_track (PE load)"
+ },
+ {
+ "name": "🔗 edge 3",
+ "role": "",
+ "id": "gamebox-lineage-classic-edge-3",
+ "detail": "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-WIN32 # Win32 client API shim"
+ },
+ {
+ "name": "🔗 edge 4",
+ "role": "",
+ "id": "gamebox-lineage-classic-edge-4",
+ "detail": "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-GFX # c_lineage_classic_r28_native_first_frame (Metal first frame)"
+ },
+ {
+ "name": "🔗 edge 5",
+ "role": "",
+ "id": "gamebox-lineage-classic-edge-5",
+ "detail": "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-NET # ONLINE MMO: server login / realm connection (playable requires online; GameGuard kernel AC gates it)"
+ },
+ {
+ "name": "🔗 edge 6",
+ "role": "",
+ "id": "gamebox-lineage-classic-edge-6",
+ "detail": "GAMEBOX-LINEAGE-CLASSIC --uses--> GAMEBOX-PURPLE # DOWNLOAD/INSTALL only (sole acquisition channel); runtime is native direct .exe"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-lineage-classic-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-lineage-classic-ms-1",
+ "detail": "[x] R28-specific loader track + native first-frame (pe_lineage_classic_r28_track · c_lineage_classic_r28_native_first_frame · 12 markers)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-lineage-classic-ms-2",
+ "detail": "[x] Local first-frame checkpoint (lineage_classic_r28_play) — .checkpoint.lineage_classic_r28_play (LOCAL RENDER only, NOT online play)"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-lineage-classic-ms-3",
+ "detail": "[x] Drift resolution track bv landed (gamebox_lineage_classic_r28_drift_resolution_track_bv)"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-lineage-classic-ms-4",
+ "detail": "[ ] ONLINE login/realm path — server connection → in-world (the real playable gate; GameGuard kernel-AC honest-freeze where blocked)"
+ }
+ ]
+ },
+ {
+ "name": "ℹ️ checkpoint",
+ "role": "",
+ "id": "checkpoint",
+ "detail": "lineage_classic_r28 play checkpoint landed (LOCAL RENDER only)."
+ },
+ {
+ "name": "ℹ️ online MMO requirement",
+ "role": "",
+ "id": "online-mmo-requirement",
+ "detail": "ONLINE MMO — playable REQUIRES a live server login/realm connection (NOT offline)."
+ },
+ {
+ "name": "ℹ️ runtime + acquisition",
+ "role": "",
+ "id": "runtime-acquisition",
+ "detail": "Runtime is native ('no Purple shell' — direct executable); PURPLE is the SOLE download/acquisition channel."
+ },
+ {
+ "name": "ℹ️ playable gate",
+ "role": "",
+ "id": "playable-gate",
+ "detail": "PLAYABLE GATE = GameGuard (INCA Internet) kernel anti-cheat guarding online login → retired_intentional / honest-freeze."
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-LINEAGE-M — 📱 리니지M (Lineage M)",
+ "role": "",
+ "id": "gamebox-lineage-m",
+ "detail": "Lineage M (purple) bring-up: Android-emulation first-frame via the PURPLE launcher path. lineage_m purple play checkpoint landed.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-lineage-m-path",
+ "detail": ".roadmap.lineage_m · .checkpoint.lineage_m_purple_play"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-lineage-m-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-lineage-m-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-LINEAGE-M"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-lineage-m-edge-2",
+ "detail": "GAMEBOX-LINEAGE-M --uses--> GAMEBOX-PURPLE # launches via plaync PURPLE"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-lineage-m-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-lineage-m-ms-1",
+ "detail": "[ ] APK emulation layer first-frame (lineage_m_purple)"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-lineage-m-ms-2",
+ "detail": "[ ] PURPLE launcher integration (2FA/OAuth) — see GAMEBOX-PURPLE"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-lineage-m-ms-3",
+ "detail": "[ ] Play checkpoint (lineage_m_purple_play)"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-lineage-m-ms-4",
+ "detail": "[ ] Refine against .roadmap.lineage_m"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-LINEAGE-W — 🏔️ 리니지W (Lineage W)",
+ "role": "",
+ "id": "gamebox-lineage-w",
+ "detail": "Lineage W (purple) bring-up: UE4 first-frame via the PURPLE launcher path. lineage_w purple play checkpoint landed.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-lineage-w-path",
+ "detail": ".roadmap.lineage_w · .checkpoint.lineage_w_purple_play"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-lineage-w-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-lineage-w-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-LINEAGE-W"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-lineage-w-edge-2",
+ "detail": "GAMEBOX-LINEAGE-W --uses--> GAMEBOX-PURPLE # launches via plaync PURPLE"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-lineage-w-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-lineage-w-ms-1",
+ "detail": "[ ] UE4 first-frame (lineage_w_purple) + UE4 extension"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-lineage-w-ms-2",
+ "detail": "[ ] PURPLE launcher integration (2FA/OAuth) — see GAMEBOX-PURPLE"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-lineage-w-ms-3",
+ "detail": "[ ] Play checkpoint (lineage_w_purple_play)"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-lineage-w-ms-4",
+ "detail": "[ ] Refine against .roadmap.lineage_w"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-CS2 — 🔫 카운터스트라이크2 (Counter-Strike 2)",
+ "role": "",
+ "id": "gamebox-cs2",
+ "detail": "Counter-Strike 2 bring-up: Source2 PSO genome, Steam api64 offline shim, tier0 platform shim. Status reflects retired_intentional posture where kernel-AC (VAC) blocks.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-cs2-path",
+ "detail": ".roadmap.cs2"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-cs2-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-cs2-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-CS2"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-cs2-edge-2",
+ "detail": "GAMEBOX-CS2 --uses--> GAMEBOX-BNET"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-cs2-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-cs2-ms-1",
+ "detail": "[ ] Source2 PSO genome + tier0 platform shim"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-cs2-ms-2",
+ "detail": "[ ] Steam api64 offline shim + DRM stub track"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-cs2-ms-3",
+ "detail": "[ ] CS2-specific loader track"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-cs2-ms-4",
+ "detail": "[ ] Online/VAC posture (honest-freeze / retired_intentional where blocked)"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-DELTA-FORCE — 🪖 델타포스 (Delta Force)",
+ "role": "",
+ "id": "gamebox-delta-force",
+ "detail": "Delta Force bring-up: specific loader track + anti-cheat detection posture. Reflects honest-freeze where kernel anti-cheat blocks.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-delta-force-path",
+ "detail": ".roadmap.delta_force"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-delta-force-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-delta-force-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-DELTA-FORCE"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-delta-force-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-delta-force-ms-1",
+ "detail": "[ ] Delta Force specific loader track"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-delta-force-ms-2",
+ "detail": "[ ] Anti-cheat detection track + posture"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-delta-force-ms-3",
+ "detail": "[ ] Launch path probe"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-delta-force-ms-4",
+ "detail": "[ ] Refine against .roadmap.delta_force"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-WOT — 🛡️ 월드오브탱크 (World of Tanks)",
+ "role": "",
+ "id": "gamebox-wot",
+ "detail": "World of Tanks bring-up on the BigWorld engine: DX11 first-frame, shader persist, Python script cache, Wargaming OAuth/CDN, garage/training-room profile.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-wot-path",
+ "detail": ".roadmap.wot"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-wot-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-wot-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-WOT"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-wot-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-wot-ms-1",
+ "detail": "[ ] BigWorld core DX11 first-frame + shader persist"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-wot-ms-2",
+ "detail": "[ ] BigWorld Python script cache"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-wot-ms-3",
+ "detail": "[ ] Wargaming OAuth proxy + CDN chunk parallel + delta update proto"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-wot-ms-4",
+ "detail": "[ ] WoT garage warmup + training-room profile"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "GAMEBOX-WOWS — 🚢 월드오브워쉽 (World of Warships)",
+ "role": "",
+ "id": "gamebox-wows",
+ "detail": "World of Warships bring-up on the BigWorld engine: shared BigWorld core + Wargaming network stack, port warmup, replay playback.",
+ "children": [
+ {
+ "name": "📂 코드/SSOT 경로",
+ "role": "path",
+ "id": "gamebox-wows-path",
+ "detail": ".roadmap.wows"
+ },
+ {
+ "name": "🔗 edges — 트리/교차 엣지",
+ "role": "DOMAINS.tape @link 보존",
+ "id": "gamebox-wows-edges",
+ "detail": "",
+ "children": [
+ {
+ "name": "🔗 edge 1",
+ "role": "",
+ "id": "gamebox-wows-edge-1",
+ "detail": "GAMEBOX --has--> GAMEBOX-WOWS"
+ },
+ {
+ "name": "🔗 edge 2",
+ "role": "",
+ "id": "gamebox-wows-edge-2",
+ "detail": "GAMEBOX-WOWS --uses--> GAMEBOX-WOT # shares BigWorld engine + WG net stack"
+ }
+ ]
+ },
+ {
+ "name": "✓ milestones — [x]done/[ ]open",
+ "role": "진행 마일스톤",
+ "id": "gamebox-wows-ms",
+ "detail": "",
+ "children": [
+ {
+ "name": "M1",
+ "role": "",
+ "id": "gamebox-wows-ms-1",
+ "detail": "[ ] BigWorld core (shared with WoT) first-frame"
+ },
+ {
+ "name": "M2",
+ "role": "",
+ "id": "gamebox-wows-ms-2",
+ "detail": "[ ] Wargaming OAuth + CDN + WGC chromium multi-proc track"
+ },
+ {
+ "name": "M3",
+ "role": "",
+ "id": "gamebox-wows-ms-3",
+ "detail": "[ ] WoWS port warmup + replay playback"
+ },
+ {
+ "name": "M4",
+ "role": "",
+ "id": "gamebox-wows-ms-4",
+ "detail": "[ ] Refine against shared BigWorld/WG tracks"
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+ ]
+ }
+}
\ No newline at end of file
diff --git a/CHANGELOG.jsonl b/CHANGELOG.jsonl
index 061661a..06451c6 100644
--- a/CHANGELOG.jsonl
+++ b/CHANGELOG.jsonl
@@ -1,3 +1,4 @@
+{"ts":"2026-06-27","title":"refactor architecture","body":"Convert ARCHITECTURE.json from the legacy name/summary domain-tree to the canonical columns/tree schema (schemaVersion 2.0, kind architecture-tree). Map every node to name/role/id/detail with unique kebab-case ids; decompose per-node summary/path/status/edges[]/milestones[] and the top-level meta/note into finely-split child nodes (every cell <=300 chars, <=6 piled items). Lossless: all 280 source strings preserved (token-verified). Replace ARCHITECTURE.html with the canonical zero-dependency viewer (SRC=ARCHITECTURE.json). architecture lint: ok."}
{"ts":"2026-06-27","title":"chore(changelog): CHANGELOG.md -> CHANGELOG.jsonl (append-only JSONL)","body":"History SSOT moved from freeform CHANGELOG.md to CHANGELOG.jsonl (newest-first JSONL) via sidecar changelog migrate (gamebox, isolated worktree); gate rewired + doc pointers updated."}
{"ts":null,"title":"[Unreleased]","body":"### Added\n\n- feat(F-NSWINDOW-E5 r12): **PE→D3D11→Metal end-to-end: 첫 own1 D3D11 PE → Metal 프레임 (인프라 마일스톤)**\n — r11 이 증명한 D3D11→Metal 브리지를 인터프리터에 배선하고, 자작 최소 i386 PE 를 실행하여\n 실제 Metal 렌더 프레임을 픽셀로 읽어 검증한다.\n **정직한 평가(own2)**: 이것은 인프라 마일스톤 — gamebox 런타임이 자작 own1 D3D11 PE 를 인터프리터로\n 실행해 Metal 렌더 프레임을 픽셀로 증명한 *첫 번째* 케이스다. 실 상업 게임(디아블로·리니지 등)\n 실행과 동일하지 않다: 전체 Win32/D3D11 API 서피스·실 애셋·실 게임 PE 가 필요하다.\n **validated_manjeom**: `first_own1_authored_d3d11_pe_to_metal_frame` (정확한 라벨,\n \"상업 게임 프레임\" 아님). **own1**: Wine 0·DXVK 0·d3d11.dll 소스 0·DRM 0·Warden 0·\n 게임 애셋 0·anima clone 0.\n **로컬 M4 실측 결과**:\n `__E5__ PASS pe_executed=1 frame_rendered=1 px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1 insns=11 imports=7`\n (1) **`native/e5_end_to_end_test.c`** — E5 r12 end-to-end 테스트 (순수 C):\n (a) 브리지 오브젝트 테이블(g_sc·g_dev·g_ctx·g_tex·g_rtv 정적 전역,\n g_skip/g_fail 상태 플래그); (b) 7개 브리지 shim(d3d11_create 2-arg stdcall 8B\n pop·get_buffer/create_rtv/omset/clear_blue/draw/present 0-arg; 각각 gamebox\n D3D11→Metal 브리지 C API 래핑); (c) D3D11_SHIMS 레지스트리 7엔트리 → i386_iat_autobind;\n (d) `build_e5_pe_flat()` — i386 PE32 평탄 이미지 빌더: .text(RVA 0x1000,\n 49바이트 코드)+.idata(RVA 0x2000, d3d11.dll 7 named import; IMAGE_IMPORT_DESCRIPTOR\n +INT+IAT+IBN 레이아웃) in-memory 구성; (e) main(): PE 빌드→autobind(total=7 bound=7\n unbound=0)→CPU 설정+실행(insns=11 halt=ret)→readback→픽셀 어서션→`__E5__ PASS/PARTIAL/SKIP`\n 출력 프로토콜. (2) **`native/fixtures/d3d11_triangle_min.pe.txt`** — 자작 PE 완전 레이아웃\n 문서(파일 오프셋·VA·섹션·IAT 슬롯·import 이름→shim 매핑·정직 평가). (3) PE 엔트리 코드 (49바이트,\n i386 hand-assembled, Intel SDM 명시): `6A 40 6A 40`(push height/width=64) +\n `FF 15 [slot]`×7(IAT call; 기존 인터프리터 커버리지) + `33 C0 C3`(xor+ret).\n 디코더 확장 없음(기존 PUSH_IMM8·CALL_RM·XOR_R_RM·RET 그대로 사용). (4) IAT 슬롯 VA:\n 0x402080(create)·0x402084(get_buf)·0x402088(rtv)·0x40208C(omset)·0x402090(clear)·\n 0x402094(draw)·0x402098(present). (5) **`native/build.sh`** — `e5_end_to_end_test` 타깃\n 추가(ObjC ARC·Metal/Foundation). (6) **`.github/workflows/ci.yml`** —\n `Smoke — E5 end-to-end (PE→D3D11→Metal)` 스텝 추가: D3D11 브리지 스텝 직후.\n `__E5__ PASS/SKIP/PARTIAL/FAIL` 파싱, warn-only(r10/r11 패턴). ARCHITECTURE.json\n blocking-frontiers r12 실측 기록.\n **체인 설명(정직)**: own1 자작 i386 PE(9명령·49바이트) → i386 인터프리터(i386_cpu.c)\n IAT autobind(by name, own 임포트 로딩=로딩이지 바이패스 아님) → 브리지 shim layer →\n gamebox D3D11→Metal 브리지(d3d11_metal_bridge.m) → Apple Metal 헤드리스 오프스크린\n 렌더(64×64 BGRA8 MTLTexture) → 픽셀 readback(getBytes) → 어서션(blue clear ∧ red\n triangle ∧ nonuniform). **다음 상업 게임 방향**: Win32 API 서피스 확장·opcode 커버리지\n 확장·vtable 디스패치([reg+offset] 간접 call)·실 게임 PE IAT 추적.\n\n- feat(F-NSWINDOW-E5 r11): **D3D11→Metal 브리지 + 네이티브 드라이버 테스트 (구현됨·미배선)**\n — r10 이 증명한 헤드리스 Metal 오프스크린 렌더 서브스트레이트 위에, D3D11-인터페이스-형상의\n Metal 브리지를 구축하고 네이티브 드라이버 테스트로 검증한다.\n **own1**: gamebox 자체 D3D11 인터페이스 형상 → Apple Metal 라우팅. Wine 0·DXVK 0·\n d3d11.dll 소스 0·DRM 0·Warden 0·게임 애셋 0. **validated_manjeom 여전히 0** — 브리지는\n 네이티브 테스트로 증명됐으나 아직 i386 인터프리터를 통해 PE가 구동하지 않음.\n **구현됨·미배선 (dead-until-wired)** 라벨: r12에서 인터프리터 IAT autobind 배선 예정.\n (1) **`native/d3d11_metal_bridge.h`** — COM 형상 C 헤더: `ID3D11Device`·\n `ID3D11DeviceContext`·`IDXGISwapChain`·`ID3D11RenderTargetView`·`ID3D11Texture2D`\n 각 COM 오브젝트를 앞단 vtable 포인터(`lpVtbl`) + `_impl`(opaque bridge-retained\n GBMetalContext\\*)로 정의. vtable은 구현된 메서드 부분집합만(컴팩트): Device[0-2]=\n IUnknown 스텁/Release·[3]=CreateRenderTargetView(실 d3d11.dll 인덱스:9);\n Context[3]=OMSetRenderTargets(33)·[4]=ClearRenderTargetView(50)·[5]=Draw(13);\n SwapChain[3]=GetBuffer(9)·[4]=Present(8). `gamebox_D3D11CreateDeviceAndSwapChain`\n (12-파라미터 실 시그니처를 width+height로 단순화·매핑 문서화) + 픽셀 readback 헬퍼\n `gamebox_d3d11_readback`. Win32 타입(HRESULT·UINT·FLOAT 등) gamebox-local 정의\n (windows.h 의존 없음). r12 wiring 노트: vtable 인덱스가 실 d3d11.dll과 다름(컴팩트);\n 자작 r12 테스트 PE는 이 인덱스를 써야 함.\n (2) **`native/d3d11_metal_bridge.m`** (Objective-C + Metal + Foundation, ARC):\n `GBMetalContext`(ObjC 클래스) — MTLDevice·queue·library·PSO·backBuffer(64×64\n MTLPixelFormatBGRA8Unorm·RenderTarget|ShaderRead·StorageModeShared)·triColorBuf\n (red=1,0,0,1) 보유. 각 COM 오브젝트 `_impl` = `CFBridgingRetain(ctx)`(공유 컨텍스트\n 에 대한 명시적 strong ref; Release() 시 CFBridgingRelease + free). MSL 인라인 소스\n (r10 smoke와 동일 셰이더). ClearRenderTargetView → loadAction=Clear 독립 렌더 패스\n (CallerRGBA 색상, 0 드로우); Draw → loadAction=Load 렌더 패스(클리어 보존 + 삼각형 드로우);\n Present → no-op(헤드리스); gamebox_d3d11_readback → [MTLTexture getBytes:].\n (3) **`native/d3d11_metal_bridge_test.c`** (순수 C) — D3D11 앱이 호출하는 것과 동일한\n vtable 포인터 경로: CreateDeviceAndSwapChain → sc→GetBuffer → dev→CreateRenderTargetView\n → ctx→OMSetRenderTargets → ctx→ClearRenderTargetView(blue) → ctx→Draw(3,0) →\n sc→Present → readback → 픽셀 어서션. MTLDevice nil → `__D3D11_BRIDGE__ SKIP\n reason=no_device` + exit 0(정직·warn-only). 통과 시 `__D3D11_BRIDGE__ PASS\n px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1` + exit 0. 어서션 실패 시\n `__D3D11_BRIDGE__ FAIL reason=...` + exit 1. **로컬 M4 결과(빌드 clean·-Wall -Wextra\n 경고 없음)**: `__D3D11_BRIDGE__ PASS px_clear=0x0000FFFF px_triangle=0xFF0000FF\n nonuniform=1`. (4) **`native/build.sh`** — `d3d11_bridge_test` 타깃 추가(ObjC ARC·\n Metal/Foundation; `-std=c11`·`-Wpedantic` 제외). ad-hoc codesign. (5)\n **`.github/workflows/ci.yml`** — `Smoke — D3D11→Metal bridge (E5 r11)` 스텝 추가:\n r10 Metal 서브스트레이트 스텝 직후·CLI smoke 직전. compile+run → `__D3D11_BRIDGE__`\n 파싱 → PASS/SKIP/FAIL 각 로그. **warn-only**(컴파일 실패·GPU 없음·어서션 실패 모두\n `::warning::`, 빌드 red 없음). r10과 동일 패턴.\n **r12 정의**: 최소 D3D11 테스트 PE(own1 자작 i386 PE·own2 클린·게임 애셋 0) + 인터프리터\n IAT autobind 배선 → D3D11 import(CreateDeviceAndSwapChain·Present 등)를 이 브리지 shim에\n 바인딩 → PE가 vtable 호출 → Metal 오프스크린 렌더 → readback 픽셀 어서션 =\n **validated_manjeom>0 달성 게이트**. r12 이름: `feat(F-NSWINDOW-E5 r12): 최소 D3D11 테스트 PE + 인터프리터 end-to-end 배선 (validated_manjeom>0 게이트)`.\n\n- feat(F-NSWINDOW-E5 r10): **헤드리스 Metal 오프스크린 렌더 + 픽셀 readback 스모크 (E5 서브스트레이트 증명)**\n — r9 가 명시한 다음 과제(`r10 표적 = DX→Metal 브리지(헤드리스 Metal 오프스크린 readback smoke 먼저 CI 검증)`)를\n 완료한다. **서브스트레이트 증명 — 게임 프레임 아님; `validated_manjeom` 여전히 0.** (1) **`native/metal_offscreen_smoke.m`**\n (Objective-C + Metal + Foundation): `MTLCreateSystemDefaultDevice()` 호출 → GPU 없으면\n `__METAL_SMOKE__ SKIP reason=no_device` + `exit(0)`(정직 ground-truth, 실패 아님).\n GPU 있으면: 64×64 `MTLPixelFormatBGRA8Unorm` 오프스크린 텍스처(`RenderTarget|ShaderRead·StorageModeShared`)\n 생성, `newLibraryWithSource:`로 인라인 MSL(vertex + fragment) 컴파일, 렌더 패스 = blue 클리어(RGBA 0,0,1,1)\n + red 삼각형(RGBA 1,0,0,1) 1개 드로우, `waitUntilCompleted`, `-[MTLTexture getBytes:bytesPerRow:fromRegion:mipmapLevel:]`\n 로 픽셀 readback. 픽셀 어서션: 클리어 영역 = `0x0000FFFF`(blue), 삼각형 영역 = `0xFF0000FF`(red),\n 두 픽셀이 다름(`nonuniform=1`) — 실 렌더가 일어났음. 통과 시 `__METAL_SMOKE__ PASS device=\n px_clear= px_triangle= nonuniform=1`, 실패 시 `__METAL_SMOKE__ FAIL reason=...`.\n 서드파티 없음(Metal + Foundation만). (2) **`native/build.sh`** — `metal_offscreen_smoke` 빌드 타깃\n 추가(ObjC ARC + Metal/Foundation 프레임워크; `-std=c11`·`-Wpedantic` 제외). ad-hoc codesign.\n (3) **`.github/workflows/ci.yml`** — `Smoke — headless Metal offscreen render (E5 substrate)` 스텝\n 추가: E3 native 인터프리터 스텝 직후, CLI smoke 직전. compile + run → `__METAL_SMOKE__` 파싱 →\n PASS/SKIP/FAIL 각각 명확히 로그. **warn-only**(컴파일 실패·GPU 없음·런타임 오류 모두 `::warning::`;\n 빌드를 red 내지 않음) — 러너의 GPU 유무를 학습하는 것이 목표. 로컬 실행 결과(M4 Mac):\n `__METAL_SMOKE__ PASS device=Apple M4 px_clear=0x0000FFFF px_triangle=0xFF0000FF nonuniform=1`.\n Blacksmith CI 러너(`blacksmith-6vcpu-macos-15`, 실 Apple-Silicon·GPU 탑재) 결과는 CI 로그에서 확인 예정.\n **own1**: 순수 Apple Metal(프로젝트 자체 렌더 타깃), Wine 0·DRM bypass 0·게임 애셋 0.\n gamebox 자작 삼각형 = 서브스트레이트 증명, 인터프리터를 통한 게임 프레임 아님.\n **r11 목표**: D3D11 device/swapchain 셰임(`lib/loader/dx_d3d11.hexa` 실 Metal 배선) — CreateDevice/\n CreateSwapChain 호출을 이 증명된 Metal 오프스크린 경로로 라우팅 + 최소 D3D11 테스트 PE(own1 클린 자작)\n 인터프리터 실행 게이트.\n\n- feat(F-NSWINDOW-E5 r9): **IAT 이름 기반 자동 바인딩 + CMPXCHG 디코더·실행**\n — r8 이 `INFO real_pe_path=structurally_ready needs:IAT_autobind_by_import_name`\n 으로 명시한 다음 과제를 완료한다. (1) **`i386_iat_autobind()`**\n (`native/i386_cpu.c`): `IMAGE_IMPORT_DESCRIPTOR` → INT(OriginalFirstThunk) →\n `IMAGE_IMPORT_BY_NAME`(+2 hint skip) 를 직접 파싱해 이름 문자열로 셰임 레지스트리와\n `strcmp` 매칭 — **슬롯 VA 사전지식 없이** 어떤 i386 PE 의 IAT 도 바인딩 가능. 미등록\n 이름은 `fn=NULL`(정직; 런루프는 `HALT_UNBOUND_IMPORT` + `last_import` 에 이름 기록).\n 선언은 `native/i386_cpu.h`(`i386_shim_entry_t` typedef + 함수 선언, forward-decl\n `const struct i386_image *`). (2) **Import Directory RVA 파싱** (`native/pe_parse.c`):\n `pe_image_t` 에 `import_dir_rva`/`import_dir_size` 추가, DataDirectory[1] 을 PE32\n (optional-header 오프셋 104) 와 PE32+(오프셋 120) 양쪽에서 읽음. (3) **CMPXCHG\n 디코더**: `0F B0`(`cmpxchg r/m8,r8`) + `0F B1`(`cmpxchg r/m32,r32`) 를 C 디코더\n (`native/i386_decode.c`, enum ordinal 65·66) 와 byte-equal hexa 미러\n (`native/i386_decode.hexa`) 양쪽에 추가(RUNEQ 규율). 인터프리터 실행부: EAX/AL 과\n r/m 비교 → 같으면 ZF=1·r/m←reg, 다르면 ZF=0·EAX/AL←r/m(Intel SDM Vol.2). `rm_set8`\n / `mem_write8` 보조 함수 추가. fn=NULL(autobind 미등록 슬롯)에 대한 IAT 디스패치\n halt 처리도 업데이트(`last_import` 이름 보존). (4) **Run E 테스트**\n (`native/i386_cpu_test.c`): 합성 in-memory PE import 디렉터리(base `0x540000`,\n `0x1000B`): `IMAGE_IMPORT_DESCRIPTOR` 1개 + INT 3개 + `IMAGE_IMPORT_BY_NAME` 3개\n (GetCurrentThreadId·GetTickCount·GetCommandLineW) 를 레이아웃하고 `i386_iat_autobind`\n 호출 → total=3·bound=3·unbound=0·슬롯 VA·fn·name 18-항목 전수 검증. GetCurrentThreadId\n 슬롯을 통한 미니런(`FF 15 [0x540100]` → `C3`) → `halt=ret, EAX=0x1A2B, imports_bound=1`.\n CMPXCHG equal 패스(EAX=ECX=`0x12345678` → ZF=1·ECX 불변)와 not-equal 패스\n (EAX=`0xAAAAAAAA`·ECX=`0xBBBBBBBB` → ZF=0·EAX=`0xBBBBBBBB`) 각 4개 CHECK. B/D\n sentinel 은 `0F B1`(이제 CMPXCHG 로 실행됨) → `0F C1 C0`(XADD, r10 진짜 갭) 으로\n 교체. 측정 라인 `__SHIM__ PARTIAL phase=e4_iat_name_autobind names_resolved=3\n unbound=0 dispatch_ok=1`, `__SHIM_TEST__ PASS`(CI 게이트 · Run A 25/B 4/C 5/D 3/E 18\n checks 전부 green). **own1**: 표준 PE import 해석 = 자신의 import 를 네이티브 구현에\n 묶는 **로딩**(bypass 아님); 합성 PE 구조·Intel SDM CMPXCHG — Wine/보호 없음.\n `validated_manjeom` 여전히 **0**. r10 목표: DX→Metal 브리지 라이브러리\n (`lib/loader/dx_d3d11.hexa` 스캐폴드, 0 실 Metal 호출).\n\n- feat(F-NSWINDOW-E5 r8): **CRT→user-entry 핸드오프 도달(합성) + BT/BTS/BTR/BTC\n 디코더 갭 종결 + 마지막 CRT import 2개 바인딩** — r7 의 벽(미등록 IAT 호출\n @`0x539318`, insns=44)을 **넘어 CRT-init 의 종착점인 `call WinMain`(CRT→user-entry\n 핸드오프)에 도달**한다. **이것이 정직한 E4 완료 마일스톤이며, 렌더된 게임 프레임이\n 아니다 — `validated_manjeom` 은 여전히 0.** (1) `native/i386_cpu.{c,h}` 에 두 개의\n kernel32 셰임: `GetCommandLineW()`(0-arg → **합성 in-image 커맨드라인 포인터**\n `base+0x1FE0`), `SetUnhandledExceptionFilter(fn)`(1-arg → 이전 필터 NULL=0). IAT\n 슬롯 `0x53802C`/`0x538030` 으로 13개(count=13). (2) `native/i386_decode.{c,h}` +\n byte-equal `.hexa` 미러: enum `I386_OP_BT_RM_R`(61,`0F A3`)/`_BTS`(62,`0F AB`)/\n `_BTR`(63,`0F B3`)/`_BTC`(64,`0F BB`) + 0F 2-byte 분기(0F AF IMUL 과 동일한 `/r`\n ModR/M 형태), op_name=\"bt\"/\"bts\"/\"btr\"/\"btc\". 인터프리터: **CF ← bit(r/m, idx)**\n (idx=ModR/M.reg 레지스터, mod 32 마스크), BTS/BTR/BTC 는 수정 비트 write-back —\n 평범한 Intel SDM Vol.2 비트 연산(보호 아님). RUNEQ corpus D(0F 전수)에서 C↔hexa\n byte-equal 확인. (3) **핸드오프 검출**: `i386_cpu_t.user_entry_va` 필드 + halt\n `I386_HALT_USER_ENTRY` 추가 — `call` 의 타깃이 `user_entry_va` 와 같으면 리턴 주소를\n push 한 뒤(faithful \"about to enter\") 정직하게 정지. (4) hermetic 테스트\n (`native/i386_cpu_test.c`) Run A 는 r7 체인(44) 뒤에 `GetCommandLineW` → `pop ecx`\n (잔여 push 정리) → `mov esi,eax` → `SetUnhandledExceptionFilter` → `bt/bts/btr/btc`\n → WinMain 4-인자 stdcall 프레임 push(nShowCmd/lpCmdLine/hPrevInstance/hInstance) →\n `call 0x539400`(합성 user entry) 를 이어 붙여 **insns 44→60, halt\n `0x539318`(unbound)→`0x539400`(user_entry)**, bound=13, last=SetUnhandledException-\n Filter 를 증명. WinMain 인자 프레임([esp+4..0x10] = hInstance·hPrevInstance·\n lpCmdLine·nShowCmd) + entry CALL 리턴주소(`0x5388AB`) 무결성까지 검증. B/D\n sentinel 은 `0F A3`(이제 BT 로 실행됨) → `0F B1`(CMPXCHG, 다음 진짜 갭, r9) 으로\n 교체. 측정 라인 `__SHIM__ PARTIAL phase=e4_reached_user_entry insns=60 bound=13\n last=SetUnhandledExceptionFilter entry_va=0x539400 halt=user_entry halt_op=call\n (SYNTHETIC user-entry; validated_manjeom=0)` + `__SHIM__ INFO\n real_pe_path=structurally_ready needs:real_i386_PE+IAT_autobind_by_import_name+\n wider_opcode_coverage+D3DMetal+display`, `__SHIM_TEST__ PASS`(CI 게이트, Run A 25\n checks 전부 green, 로컬 clang `-Wall -Wextra -Wpedantic -std=c11` 청정). (5)\n **실-바이너리 경로 점검**: `i386_cpu_load_pe`(argv[1]) 는 섹션 매핑·엔트리 설정·\n 이미지 할당까지 **구조적으로 배선됨** — 실제 i386 PE 를 주면 엔트리부터 실행 가능.\n 단, K32_IAT 슬롯이 hermetic 합성 VA(`0x538000..`)라 실제 PE 의 IAT 와는 매칭되지\n 않으므로, 실행이 첫 import 를 넘으려면 **PE import 테이블 파싱 + 이름 기반 자동\n 바인딩**이 필요(real-PE emit 가 INFO 로 명시). **own1**: 자기 import 를 네이티브\n 구현에 묶는 **로딩**(우회 아님), 합성 TEB/커맨드라인/user-entry VA 는 **정직 라벨**,\n BT 류는 평범한 CPU 비트 연산 — Wine/보호 없음. **`validated_manjeom>0`(실 프레임)\n 까지 남은 거리**: real-asset 게이트(실 i386 게임 PE + D3DMetal SDK + 실 디스플레이 —\n 사용자만 제공 가능) + 남은 엔지니어링(실 PE IAT 이름 자동바인딩, 더 넓은 opcode\n 커버리지, 게임 자신의 WinMain → 메시지 루프 → CreateWindowEx → D3D→Metal 프레임).\n 현재는 **합성 user-entry 도달**까지이며 실 프레임은 자율 범위 밖(real-asset-gated).\n\n- feat(F-NSWINDOW-E5 r7): **CRT import 3개 추가 바인딩 + IMUL/CPUID/RDTSC 디코더\n 갭 종결 + `__security_init_cookie` 산술 실행** — r6 의 벽(미등록 IAT 호출\n @`0x5392D4`, insns=30)을 **넘는다**. (1) `native/i386_cpu.{c,h}` 에 세 개의\n kernel32 셰임 추가: `GetStartupInfoW(LPSTARTUPINFOW)`(1-arg ptr, push 된 포인터\n `[esp]` 의 STARTUPINFOW 0x44B 를 0 으로 + `cb=0x44` 스탬프 — 버퍼-쓰기),\n `GetSystemInfo(LPSYSTEM_INFO)`(1-arg ptr, **bounded-synthetic** SYSTEM_INFO\n 0x24B — dwPageSize=0x1000·nCPU=4·arch=INTEL, 나머지 0), `GetProcAddress(HMODULE,\n LPCSTR)`(2-arg → **합성 in-image 스텁 주소** `base+0x1FF0`). IAT 등록 슬롯\n `0x538000..0x538028` 로 11개(count=11). (2) `native/i386_decode.{c,h}` +\n byte-equal `.hexa` 미러: enum `I386_OP_IMUL_R_RM`(57, `0F AF`)/`_IMM`(58, `69 id`/\n `6B ib`)/`I386_OP_CPUID`(59, `0F A2`)/`I386_OP_RDTSC`(60, `0F 31`) + 디코드\n 분기 추가, op_name=\"imul\"/\"cpuid\"/\"rdtsc\". 인터프리터: **IMUL** 은 32-bit signed\n 곱의 하위 32-bit 를 dst(ModR/M.reg)에, int32 오버플로면 CF=OF=1(SDM Vol.2);\n **CPUID** 는 leaf(eax)별 **합성** 피처셋(leaf0 vendor \"GenuineIntel\"·max-leaf,\n leaf1 family/feature) 을 eax/ebx/ecx/edx 에; **RDTSC** 는 `cpu->tsc += step` 합성\n 단조 카운터를 edx:eax 에 기록. CPUID/RDTSC 는 평범한 CPU 명령(보호 아님). (3)\n **보안쿠키 산술**: hermetic 프롤로그가 FILETIME 엔트로피 로드 → `xor` →\n `imul eax,eax,0x01000193`(신규 0x69 IMUL) → 글로벌 슬롯에 **비기본 쿠키** 저장 →\n `cpuid`(GenuineIntel) → `rdtsc`. (4) hermetic 테스트(`native/i386_cpu_test.c`)\n Run A 는 r6 체인 뒤에 `call GetStartupInfoW`(cb=0x44 검증) / `call GetSystemInfo`\n (page=0x1000·nCPU=4 검증) / `push×2; call GetProcAddress` / 쿠키 `mov/xor/imul/mov`\n (쿠키 == `(FT_lo^FT_hi)*0x01000193` 재유도 검증, ≠0) / `cpuid`(ebx=\"Genu\"·\n ecx=\"ntel\" 검증) / `rdtsc`(edx:eax 합성 검증) / 미등록 `call` 을 이어 붙여 경계\n 통과를 증명: **insns 30→44, halt `0x5392D4`→`0x539318`**(reason=UNBOUND_IMPORT,\n slot `0x53802C`), bound=11, last=GetProcAddress. B/D sentinel 은 `0F A2`(이제 실행됨)\n → `0F A3`(BT, 다음 진짜 디코더 갭) 으로 교체. 측정 라인 `__SHIM__ PARTIAL\n phase=e4_crt_security_cookie insns=44 bound=11 last=GetProcAddress\n halt_va=0x539318 halt=unbound_import halt_op=call unbound_slot=0x53802C`,\n `__SHIM_TEST__ PASS`(CI 게이트, Run A 18 checks 전부 green, 로컬 clang\n `-Wall -Wextra -Wpedantic -std=c11` 청정). **own1**: 로더가 자기 프로세스의 **자기\n import**(kernel32 OS API)를 네이티브 구현에 묶는 **로딩** — 우회 아님; CPUID/RDTSC\n 는 평범한 CPU 명령, 쿠키는 **자기 버퍼 위의 자기 산술**, 합성 SYSTEM_INFO/스텁은\n 정직 라벨. **`main`/`WinMain` 미도달**: 아직 CRT-init(import 바인딩) 단계이며\n hermetic 프롤로그는 실제 바이너리가 아닌 문서화된 SHAPE 라 진짜 `call main` 은\n 없음 — 남은 CRT 단계(추가 import + `__scrt_common_main_seh` → user entry). `validated_manjeom`\n 은 여전히 **0**(로더 진척이지 렌더된 프레임 아님). 다음 r8: 미등록 slot `0x53802C`\n 바인딩 + `0F A3` BT 디코더 갭 + 실제 바이너리에서 `mainCRTStartup→main` 거리 측정.\n\n- feat(F-NSWINDOW-E5 r6): **CRT-security import 3개 추가 바인딩 + 0F B6/B7/BE/BF\n MOVZX/MOVSX 디코더 갭 종결 + 합성 TEB→PEB→ImageBase 체인** — r5 의 벽(미등록 IAT\n 호출 @`0x5392A1`, insns=18)을 **넘는다**. (1) `native/i386_cpu.{c,h}` 에 세 개의\n kernel32 셰임 추가: `IsProcessorFeaturePresent(DWORD)`(1-arg → BOOL 1, 기능\n present 결정적 주장), `InitializeSListHead(PSLIST_HEADER)`(1-arg ptr, push 된\n 포인터 `[esp]` 의 8-byte SLIST 헤더를 0 으로 — 버퍼-쓰기), `GetModuleHandleW(\n LPCWSTR)`(1-arg, HMODULE=로더가 아는 **자기 이미지 베이스** 반환). IAT 등록\n 슬롯 `0x538000..0x53801C` 로 8개(count=8). (2) `native/i386_decode.{c,h}` +\n byte-equal `.hexa` 미러: 2-byte(0F) 맵에 enum `I386_OP_MOVZX_RM8`(53)/`_RM16`(54)/\n `I386_OP_MOVSX_RM8`(55)/`_RM16`(56) + 디코드 분기(B6/B7/BE/BF, ModR/M reg=dst\n r32, r/m8|r/m16 src) 추가, op_name=\"movzx\"/\"movsx\"; 0F 의 `avail<6` 가드를\n `avail<2`(+Jcc 만 `<6`)로 분리해 짧은 movzx 도 디코드. 인터프리터는 r/m8(레지스터\n 바이트맵 al..bh / mem `mem_read8`)·r/m16 을 zero/sign-extend → r32, **EFLAGS 불변**.\n (3) **BOUNDED-SYNTHETIC TEB**: `i386_cpu` 에 `teb_base` 필드 추가 — 메모리 오퍼랜드가\n FS 세그먼트-override 프리픽스(0x64, 이미 디코드됨)를 달면 `i386_ea` 가 유효주소를\n `teb_base+disp` 로 리디렉트. 합성 TEB(self@+0x18) → PEB(@TEB+0x30) → ImageBase\n (@PEB+8) 의 몇 개 필드만 이미지 메모리에 깔아 보안쿠키/CRT-startup 프롤로그의\n `mov ecx, fs:[0x18]` 체인이 **돈다**(OS TEB 아님·보호구조 아님, 정직 라벨). hermetic\n 테스트(`native/i386_cpu_test.c`) Run A 는 r5 합성 프롤로그 뒤에 `push 0xA; call\n IsProcessorFeaturePresent` / `movzx ecx,al; movsx edx,cl`(신규 두-바이트 실증) /\n `push &slist; call InitializeSListHead`(8B 제로화 검증, 사전 더티 `0xFFFFFFFF`) /\n `push 0; call GetModuleHandleW`(→ 이미지 베이스) / `mov ecx,fs:[0x18]; mov edx,\n [ecx+0x30]; mov eax,[edx+8]`(TEB→PEB→ImageBase) / 미등록 `call` 을 이어 붙여\n 경계 통과를 증명: **insns 18→30, halt `0x5392A1`→`0x5392D4`**(reason=\n UNBOUND_IMPORT, slot `0x538020`), bound=8, last=GetModuleHandleW,\n eax=ImageBase(`0x538000`)·ecx=TEB(`0x539C00`)·edx=PEB(`0x539C80`) 실증,\n esp=esp0-8(엔트리 반환주소+미pop push). B/D sentinel 은 `0F B6`(이제 실행됨)→\n `0F A2`(CPUID, 다음 진짜 디코더 갭) 으로 교체. 측정 라인 `__SHIM__ PARTIAL\n phase=e4_crt_security_teb insns=30 bound=8 last=GetModuleHandleW\n halt_va=0x5392D4 halt=unbound_import halt_op=call unbound_slot=0x538020`,\n `__SHIM_TEST__ PASS`(CI 게이트, Run A 17 checks 전부 green, 로컬 clang\n `-Wall -Wextra -Wpedantic -std=c11` 청정). **own1**: 로더가 자기 프로세스의 **자기\n import**(kernel32 OS API)를 네이티브 구현에 묶는 **로딩** — 우회 아님; TEB 는 **자기\n 합성 블록**(필드 몇 개)이지 OS TEB 도, 보호장치도 아님. `validated_manjeom` 은\n 여전히 **0**(로더 진척이지 렌더된 프레임 아님). 다음 r7: 미등록 slot `0x538020`\n 바인딩(GetStartupInfoW/GetProcAddress 등) + `0F A2` CPUID 디코더 갭 + 풀 보안쿠키\n 연산(time/pid/tid XOR·mul) → `main`/`WinMain` 도달, user32 `CreateWindowEx` 거리.\n- feat(F-NSWINDOW-E5 r5): **CRT-init import 5개 연속 바인딩 + 첫 버퍼-쓰기 셰임 +\n 0xC1 shift-group 디코더 갭 종결** — r4 의 벽(미등록 IAT 호출 @`0x53927C`,\n insns=11)을 **넘는다**. `native/i386_cpu.{c,h}` 에 네 개의 kernel32 셰임 추가:\n `GetCurrentProcessId`(0-arg → 결정적 PID `0xD04`), `GetTickCount`(0-arg → `0x1D4C0`),\n 그리고 **첫 버퍼-쓰기형 셰임** `GetSystemTimeAsFileTime(LPFILETIME)` —\n 스택에서 caller 가 push 한 포인터 인자(`[esp]`, 호출 가로채기 시점이라 반환주소가\n 아직 안 쌓임)를 읽어 이미지 메모리에 8-byte FILETIME(`mem_write32`×2)을 기록하고\n void 반환(stdcall 1-arg, callee-pop 4) — r4 의 0-arg 셰임 대비 **stub→이미지 메모리\n 쓰기 + 실제 push 된 포인터 인자**라는 새 능력을 행사. `QueryPerformanceCounter(\n LARGE_INTEGER*)` 도 동일 패턴(8-byte 카운터 기록, BOOL=1 반환). 실행 루프는 이제\n bound 호출을 연달아 디스패치해 프롤로그가 다섯 import(GetCurrentThreadId →\n GetCurrentProcessId → GetSystemTimeAsFileTime → QueryPerformanceCounter →\n GetTickCount)를 통과하고, **여섯 번째·미등록 IAT 호출 @`0x5392A1`** 에서 정직하게\n HALT(`UNBOUND_IMPORT`, 다음 슬롯 `0x538014` 보고).\n- feat(F-NSWINDOW-E5 r5): **0xC1/0xD1/0xD3 group-2 shift/rotate 디코더+실행** —\n r3 sentinel 이 지목한 `0xC1` 갭을 종결. `native/i386_decode.{c,h}` +\n byte-equal `.hexa` 미러에 enum `I386_OP_SHIFT_RM_IMM8`(50)/`_RM_1`(51)/`_RM_CL`(52)\n + 디코드 분기(count 출처: imm8 / 1 / CL) 추가, op_name=\"shift\". 인터프리터\n (`i386_cpu.c`)는 ModR/M.reg 로 SHL/SAL(4/6)·SHR(5)·SAR(7)·ROL(0)·ROR(1) 을\n 분기하고 SDM 대로 count 를 5-bit 마스킹 + CF/OF/ZF/SF/PF 갱신(count==0 → 무변화·\n 무플래그); RCL/RCR(2/3) carry-chain 은 미모델 → 정직한 UNSUPPORTED. RUNEQ 는\n C/hexa 양쪽이 동일하게 바뀌므로 그린 유지(corpus A 의 0xC1/D1/D3 행만 동시 변화).\n hermetic 테스트(`native/i386_cpu_test.c`) Run A 는 합성 프롤로그를 0x53927C 까지\n 유지하고 뒤에 `call GetCurrentProcessId` / `push &filetime; call\n GetSystemTimeAsFileTime` / `push &perfcount; call QueryPerformanceCounter` /\n `shl edx,4`(group-2 shift) / `call GetTickCount` / 미등록 `call` 을 이어 붙여\n 경계 통과를 증명: **insns 11→18, halt `0x53927C`→`0x5392A1`**(reason=\n UNBOUND_IMPORT, slot `0x538014`), bound=5, last=GetTickCount, eax=GetTickCount\n stub, edx=TID<<4=`0x1A2B0`(shift 실증), ecx=0xEF(프롤로그 보존), esp=esp0-4,\n 그리고 **버퍼 두 곳 검증**: `[0x539F00]`=FILETIME `01D7A1B2:C3D4E5F6`,\n `[0x539F10]`=counter `00000000:12345678`. B/D sentinel 은 `0xC1`(이제 실행됨)→\n `0F B6`(MOVZX, 다음 진짜 디코더 갭) 으로 교체. 측정 라인 `__SHIM__ PARTIAL\n phase=e4_kernel32_iat_bind insns=18 bound=5 last=GetTickCount halt_va=0x5392A1\n halt=unbound_import halt_op=call unbound_slot=0x538014`, `__SHIM_TEST__ PASS`\n (CI 게이트, Run A 16 checks 전부 green, 로컬 clang `-Wall -Wextra -std=c11` 청정).\n **own1**: 로더가 자기 프로세스의 **자기 import**(kernel32 OS API 표면)를 네이티브\n 구현에 묶는 **로딩** — 우회 아님. FILETIME/perf-counter/tick/pid 는 CRT init 의\n 결정적 STUB 이지 보호장치(DRM/Warden/anti-cheat)와 무관하고, 버퍼 쓰기는 프로그램\n **자기 버퍼**에 한정. `validated_manjeom` 은 여전히 **0**(로더 진척이지 렌더된\n 프레임 아님). 다음 r6: 미등록 slot `0x538014` 바인딩 + `0F B6` MOVZX 디코더 갭 +\n 더 깊은 CRT init(보안쿠키 XOR/__security_init_cookie, TEB/PEB 접근) → `main`/\n `WinMain` 도달, 그리고 user32 `CreateWindowEx` 까지의 거리 측정.\n\n- feat(F-NSWINDOW-E5 r4): **첫 E4 kernel32 IAT 바인딩** — i386 인터프리터가 r3 의\n 벽(`FF 15 [disp32]` 간접 IAT 호출 @`0x539274`, insns=9 에서 HALT)을 **넘는다**.\n `native/i386_cpu.{c,h}` 에 import-stub 레지스트리(`i386_iat_t`/`i386_import_t` +\n `i386_iat_lookup`) 와 첫 네이티브 kernel32 셰임(`i386_shim_GetCurrentThreadId`,\n stdcall 0-arg → 결정적 plausible TID `0x1A2B`)을 추가. 실행 루프의 `CALL_RM`/`JMP_RM`\n 케이스는 이제 정규 IAT thunk 형태(ModR/M mod=00,rm=101 = `[disp32]`)를 인식해\n slot VA(=`insn.disp`)를 레지스트리에서 조회한다 — **바인딩되어 있으면** 네이티브\n 셰임을 디스패치하고 EAX 에 반환값을 싣고(Win32 ABI) stdcall 인자를 pop 한 뒤\n 실행을 **계속**한다. `__scrt_common_main` security-cookie init 의 첫 호출\n GetCurrentThreadId 가 바인딩되어 0x539274 의 호출이 **실행**되고(insn 10), 다음\n `mov edx,eax`(insn 11)까지 진행한 뒤 **두 번째·미등록 IAT 호출 @`0x53927C`** 에서\n 정직하게 HALT(`UNBOUND_IMPORT` — 다음에 바인딩할 import 슬롯 `0x538004` 를 보고).\n hermetic 테스트(`native/i386_cpu_test.c`) Run A 는 합성 프롤로그를 0x539274 까지\n r3 와 byte-동일하게 유지하고 그 뒤에 bound-call/mov/unbound-call 을 이어 붙여\n 경계 통과를 증명: **insns 9→11, halt 0x539274→0x53927C**, eax=TID, edx=TID,\n ecx=0xEF(프롤로그 보존), esp=esp0-4(0-arg stdcall 균형). 새 측정 라인\n `__SHIM__ PARTIAL phase=e4_kernel32_iat_bind insns=11 bound=GetCurrentThreadId\n halt_va=0x53927C halt=unbound_import unbound_slot=0x538004` 발신, `__SHIM_TEST__\n PASS`(CI 게이트, 24 checks). decoder(`i386_decode.c`/`.hexa`)는 미변경 → RUNEQ\n 영향 없음. **own1**: 이것은 로더가 자기 프로세스의 **자기 import** 를 네이티브\n 구현에 묶는 것 — 모든 PE 로더가 하는 **로딩**이지 우회가 아니다. kernel32 는 OS\n API 표면이지 보호장치(DRM/Warden/anti-cheat)가 아니며, 본 프롤로그 호출은 CRT\n init 일 뿐 보호와 무관. `validated_manjeom` 은 여전히 **0**(이것은 로더 진척이지\n 렌더된 프레임이 아니다). 다음 r5: 두 번째 import(미등록 slot 0x538004) 바인딩 +\n 버퍼-쓰기형 셰임(GetSystemTimeAsFileTime/QueryPerformanceCounter) + 0xC1 shift\n group 디코더 갭.\n\n### Fixed\n\n- test(purple cond.3): 2FA TOTP state machine 의 **window-drift / RFC 6238 §5.2 ±1\n resync leg** gap 종결 — `c_purple_2fa_totp_proxy.hexa` 는 `window_idx`(=unix_time/30)\n 를 device 별로 기록하지만, 합성 시나리오는 거의 동일한 window(58000000/58000001)만\n 써서 **동일 device 가 clock drift 로 인접 window(N, N+1)에 걸쳐 코드를 생성** 하는\n documented-but-unmodeled 축(RFC 6238 §5.2 — 서버 ±1 resync window 수용)을 한 번도\n 행사하지 않았다. 합성 행 `record_totp(5004, 860, 58000010, 6)` +\n `record_totp(5004, 870, 58000011, 6)`(인접 window) 추가로 drift transition 을\n 행사하고, 헬퍼 `count_by_window(idx)`(r1 의 `count_by_stage` 거울) +\n `device_window_span(device_id)`(max−min window = ±1 resync 정량) 추가, 의존\n assertion 전부 내부정합 갱신(totp_count 3→5, total_hmac_us 2550→4280, avg_hmac_us\n 850→856, valid_code_len 2→4, stats[0..3] 동일 갱신, emit ≥4→≥7) + 새 emit 마커\n `totp_window_drift`(span=1, resync=accepted_pm1) 발신. CI 8파일 중\n `test_purple_lineage_offline_shim.hexa` 에 `check_purple_cond3_totp_drift()`\n 추가(grep 마커 + live `out.contains(\"drift_span=1\")`) + `track_b_purple_cond3_totp_drift`\n emit 배선(test emit ≥6→≥7) → 변경이 dead 가 아니라 CI 검증됨. **cond.3 status 는\n partial 유지**(purple_launcher.blk.1 — plaync online endpoint network-gated). own1:\n 합성 데이터만, 실제 plaync account/network/TOTP secret 0건, **GameGuard\n blocked-not-bypassed**.\n- fix(ci): CI 가 **아무것도 검증하지 않던** 공허 통과를 root-cause 교정 —\n 8 테스트 파일은 전부 `fn self_test()` + `main()` dispatch(own2 mandate)이고\n `@test` fn 은 0개인데, CI 가 `hexa test `(=@test 러너)을 써서 0개 실행 →\n 무조건 green 이었다. `hexa run self-test`(main→self_test dispatch)로\n 교정 → 8 self_test 가 비로소 실제 실행·검증된다. (로컬 실측: `hexa test` 는\n 무출력/행, `hexa run self-test` 는 own2 PASS 라인 출력.)\n- test(battlenet cond.3): `test_d2r_archive_round_trip` 에\n `check_battlenet_cond_3_oauth()` 추가 — OAuth2 6 op_kind(특히 device_code_grant)\n emit 마커를 skeleton-validate(live + grep fallback). cond.3 deepening 이 CI 8파일\n 루프에서 실제 검증되도록 배선(wire-to-prod). cond.3 status 는 partial 유지.\n- test(purple cond.3): plaync OAuth state machine 의 **token_refresh-FAIL leg** gap 종결 —\n `c_purple_plaync_oauth_proxy.hexa` self_test 는 stage=3(token_refresh) 을 `success=1`\n (refresh OK) 으로만 행사했으나, header line 6(token_refresh stage) + line 29(success=0\n 사유 \"token 만료\")가 DOCUMENT 한 **refresh_token 만료 → 재로그인(stage=3 success=0)**\n leg 는 MISSING 이었다. 합성 행 `record_oauth(4004, 3, 90000, 0)` 추가로 행사하고\n 의존 assertion 전부 내부정합 갱신(oauth_count 4→5, fail_count 1→2, total_us\n 740000→830000, count_by_stage(3) 1→2, ppop_stats[2] 740000→830000, emit ≥5→≥7) +\n 새 emit 마커 `plaync_oauth_refresh_fail` 발신. CI 8파일 중\n `test_purple_lineage_offline_shim.hexa` 에 `check_purple_cond3_oauth_refresh_fail()`\n 추가(grep 마커 + live `out.contains(\"refresh_fail=1\")`) + `track_b_purple_cond3` emit\n 배선 → 변경이 dead 가 아니라 CI 검증됨. **cond.3 status 는 partial 유지**\n (purple_launcher.blk.1 — plaync online endpoint network-gated). own1: 합성 데이터만,\n 실제 plaync account/network/token 0건, **GameGuard blocked-not-bypassed**.\n- test(battlenet cond.3): `test_d2r_archive_round_trip` 에\n `check_battlenet_cond_3_state_machines()` 추가 — cond.3 4개 모듈 중 그동안\n `pe_battle_net_oauth_token` 하나만 CI-pin 되어 있었고, 나머지 3개 perf 모듈의\n synthetic 상태기계 마커(`__BNET_LOGIN__ PARTIAL …` / `__BNET_TOKEN__ PARTIAL …` /\n `__BNET_CHAT__ PARTIAL …`)는 **각 모듈 자체 self_test 안에서만** 실행될 뿐 8 CI\n `[test].files` 어디서도 grep/검증되지 않던 \"CI-dead\" 갭을 닫음. 세 모듈의 종단\n 상태(`TOKEN_EXPIRY` / `REFRESH_FAIL_RETRY` / `OFFLINE`)를 live self_test + grep\n fallback 으로 skeleton-validate → login_state / token_refresh / chat_presence\n 상태기계가 CI 에서 실제 검증된다. 각 모듈 self_test 의 문서화된 상태(login 5,\n token 5, chat 4)는 이미 전부 exercise 되어 있어(self_test 축 고갈) 모듈 자체는\n 무변경 — 갭은 CI-검증 부재였다. own1: 실 OAuth endpoint 0 / 실 XMPP 0 / socket 0 /\n network 0. cond.3 status 는 partial 유지(network-gated = blk.1, 정직).\n\n### Added\n\n- feat(F-NSWINDOW-E5): i386 **인터프리터** 최초 도입 — 디코드만 하던 E2 를 넘어\n 실제 Win32 게임 바이너리 바이트를 **실행**(상태 변이)한다. `native/i386_cpu.{c,h}`\n = 레지스터 파일(`gpr[8]`/eip/eflags, esp=gpr[4]) + 플랫 VA→host 메모리 모델\n (`mem_read32`/`mem_write32`, 경계검사) + fetch→decode→**execute**→advance 루프.\n 실행 op: PUSH_R / POP_R / PUSH_IMM / PUSH_RM([reg+disp]) / MOV_R_RM(8B) /\n MOV_RM_R(89) / CALL_REL(E8) / JMP_REL(E9·EB) / RET(C3·C2). 미커버 opcode 는\n `I386_OP_UNKNOWN` 으로 **정직하게 halt**(wall VA 기록). 분기 타깃은 디스어셈블러와\n 동일한 `eip+len+imm` 공식 재사용. own1: 프로그램 자기 바이트 + Intel SDM 의미론만,\n Wine/CrossOver/Box86/QEMU/ReactOS 소스 0.\n- test(F-NSWINDOW-E5): `native/i386_cpu_test.c` — Battle.net-Setup.exe 의 실제\n 9-insn 엔트리 블록(entry_va 0x5388A6) 을 hermetic 플랫 이미지에 박아 CI 에서\n 바이너리 없이 실행(파일 인자 주면 실 PE 도 로드·실행). 실측(로컬 clang 빌드,\n 19/19 [ok], `__SHIM_TEST__ PASS`): Run A(엔트리에서 실행) → CALL_REL 1개 실행,\n 리턴주소 0x5388AB push, eip=실타깃 0x539259 로 분기 후 디코더 커버리지 wall 에서\n halt → `__SHIM__ PARTIAL phase=entry_block_executed insns=1 halted=unknown halt_va=0x539259`.\n Run B(push/mov/push-rm), Run C(pop/pop/ret), Run D(jmp) 가 PUSH_R·MOV_R_RM·\n PUSH_RM·POP_R·RET·JMP_REL 의미론을 실 바이트로 검증. `native/build.sh` 에\n `i386_cpu_test` 타깃 등록(clang arm64 + ad-hoc codesign, 기존 빌드 재사용).\n → **게임 바이너리 바이트 최초 실 EXECUTION 마일스톤**. 다음 wall(r3): VA 0x539259\n (`__scrt_common_main` 프롤로그)의 첫 미커버 opcode — group-1 imm arith(0x83/0x81/\n 0x80)·mov r/m imm(0xC7/0xC6)·byte mov(0x88/0x8A)·test(0x84)·and/or(0x09/0x0B/\n 0x21/0x23) 디코더 커버리지 확장 대상.\n- feat(F-NSWINDOW-E5 r3): r2 의 **1-instruction wall(0x539259) 돌파** — 디코더+\n 인터프리터를 `__scrt_common_main` 프롤로그 opcode 집합으로 확장. `native/i386_decode.{c,h}`\n 에 group-1 r/m,imm(0x80/0x81/0x83 — add/or/adc/sbb/and/sub/xor/cmp by ModR/M.reg)·\n mov r/m,imm(0xC7 /0 id, 0xC6 /0 ib)·byte mov+test(0x88/0x8A/0x84)·and/or(0x09/0x0B/\n 0x21/0x23) 디코드(op enum 32..49 말미 추가 — 기존 0..31 ordinal 불변). `native/i386_cpu.{c,h}`\n 에 **EFLAGS 모델**(CF/PF/AF/ZF/SF/OF — SDM ADD/SUB/CMP/logic 정확) + `alu_add`/\n `alu_sub`/`alu_logic` + r/m32 read/write 헬퍼 추가, 실행 op 확장: MOV_R_IMM(B8+)·\n MOV_RM_IMM(C7)·LEA(8D)·INC/DEC r(40+/48+, CF 보존)·ALU r/m,r+r,r/m(ADD/SUB/CMP/\n XOR/OR/AND/TEST)·group-1 imm(81/83). byte-width 형(80/C6/88/8A/84)은 디코드되되\n 폭 미모델 → **정직 UNSUPPORTED**. 간접 IAT CALL(FF /2 [disp32])은 디코드(CALL_RM)\n 되되 **의도적으로 미실행** = E4 kernel32 경계(own1: IAT 해석/DRM 상호작용 0).\n- test(F-NSWINDOW-E5 r3): `native/i386_cpu_test.c` Run A 가 이제 엔트리 CALL 후\n 0x539259 의 `__scrt_common_main` 프롤로그(own1: named-family 로 짠 문서화된 SHAPE —\n 실 바이너리 부재 호스트, SDM-정확 자기 바이트)를 **8개 추가 실행**하고 첫 간접\n IAT CALL 에서 멈춘다. **실측(로컬 clang, 20/20 [ok], `__SHIM_TEST__ PASS`)**:\n `__SHIM__ PARTIAL phase=scrt_common_main_prologue insns=9 halted=unsupported halt_va=0x539274 halt_op=call`\n — r2 `insns=1 halt@0x539259` → r3 `insns=9 halt@0x539274`(reason=UNSUPPORTED=CALL_RM,\n E4 경계). hermetic sentinel(0x538BAB·0x53872A)은 아직-미커버 0xC1(shift group-2,\n 다음 r4 디코더 갭)으로 교체 → Run B/D 는 계속 UNKNOWN wall 에서 정직 halt. .hexa\n 트윈(`native/i386_decode.hexa`) 동일 미러 → **RUNEQ M4 1042/1042 + M3 byte-equal\n (로컬 실측 green)**, hexa self_test PASS. own1: 자기 바이트 + Intel SDM 의미론만,\n Wine/QEMU/Box86/ReactOS 0, IAT/DRM/Warden 상호작용 0. `validated_manjeom` 은 여전히\n **0**(실 게임 프레임 아님 — E3 인터프리터 전진이지 프레임 증거 아님). 다음 wall(r4):\n shift group-2(0xC1/0xD1/0xD3)·group-3(0xF7 test/neg/mul/div) 디코더 확장, 또는\n 첫 조건분기(Jcc) EFLAGS 소비, 또는 E4 = 간접 IAT CALL 실행(kernel32 stub 바인딩) 경계.\n- feat(battlenet cond.3): `pe_battle_net_oauth_token` self_test 가 op_kind 6\n `device_code_grant`(`/oauth/device` RFC8628) 을 비로소 exercise — 헤더에\n 문서화됐으나 self_test 미커버였던 갭을 닫음(6 op_kind 전부 round-trip). 합성\n 데이터·token 실값 0·length-only·실 네트워크 0(own1 준수). 어서션 정합:\n op_count 6→7, total_token_lifetime_sec 345600→432000, total_token_size_bytes\n 5120→6144, count_by_op_kind(6) 0→1, stats `[7,432000,6144,2]`, emit ≥8.\n cond.3 status 는 partial 유지(실 OAuth 엔드포인트 network smoke 게이트 = blk.1).\n\n- docs(CLAUDE.md): CI(Blacksmith) 규율 박제 — `## CI — builds run on Blacksmith,\n NOT locally` 섹션 추가(워크플로/러너/툴체인/실행 내용 + \"로컬 빌드 말고 push\n 하라\" 규칙) + Structure 트리에 `.github/workflows/` 항목. 같은 결함(로컬 빌드로\n Mac 죽음) 재발 방지를 위해 거버넌스 SSOT 에 명시.\n\n\n- ci(blacksmith): `.github/workflows/ci.yml` — gamebox 빌드+테스트를\n Blacksmith 클라우드 Apple-Silicon 러너(`blacksmith-6vcpu-macos-15`)에서 실행.\n gamebox 는 Apple-native(Win32 PE + D3DMetal)라 컴파일+apple-only 테스트에\n macOS 호스트가 필요한데, 그걸 로컬 dev Mac 에서 돌리면 242+ perf 모듈 +\n 8 테스트가 메모리를 스파이크해 머신이 죽었다. 이제 push 마다 클라우드 Mac 이\n 빌드/테스트를 맡고 로컬 박스는 `git push` 만 한다. 러너는 macos-15 핀\n (hexa-lang `release.yml` 와 동일 근거 — SDK min-OS 베이스라인 안정). hexa\n 툴체인은 릴리스 바이너리를 canonical 설치 한 줄(`install.sh`)로 깐다. D3DMetal\n SDK 부재는 warn-only(skeleton-tier 로더는 importable). same-org 라\n Blacksmith 활성화 별도 작업 불필요(hexa-lang 이 이미 사용).\n\n### Changed\n\n- docs(architecture): restructure `ARCHITECTURE.json` into a deeper `children`\n tree per harness governance rule c4 — a LOSSLESS re-shape (restructure only,\n no content change). Decomposed 10 over-long dump cells (root `summary` 527c +\n root `note` 731c + 8 node `summary` fields 263–531c) that piled multiple\n distinct facts / ` · `-joined lists into one field. Each piled fact is now its\n own child node (short role line stays on the parent `summary`; each remaining\n sentence/list becomes a `{name, summary}` `ℹ️` info child). Node count\n 26 → 47. The two C-PORT milestones >250c are single coherent done-records\n (`milestones[]` is already the per-item list) and stay intact — not dumps.\n Losslessness verified by non-whitespace char-multiset before vs after =\n identical (0 lost / 0 added; only scaffolding node-name labels added).\n `ARCHITECTURE.html` viewer + `python3 serve.py` stay renderable (generic over\n the `children` tree; new nodes use only `name`+`summary`).\n\n- chore(architecture): retire `DOMAINS.tape` + `domains/` (22 domain `.md`\n snapshots + 22 `.log.md` logs) into a single `ARCHITECTURE.json` tree SSOT\n (hexa-codex/anima pattern), with the `ARCHITECTURE.html` viewer +\n `python3 serve.py` static server (copied + adapted from `dancinlab/anima`).\n Each domain's `@goal` → node `summary`, its `- [ ]/[x]` milestones →\n `milestones[]`, and the DOMAINS.tape `@link` edges → per-node `edges[]`\n (`--has-->` tree + `--uses-->`/`--targets-->` cross-edges preserved). Tree =\n 22 domains (1 meta-root GAMEBOX + 6 메인구조 LOADER/WIN32/GFX/NET/PERF/NATIVE +\n C-PORT nested under NATIVE + 2 런처 BNET/PURPLE + 1 sprint-meta LAUNCHPAD+ +\n 11 게임), grouped under 4 section headers → 26 JSON nodes. `ARCHITECTURE.md`\n stays as the component-level prose SSOT and now points to the JSON tree.\n `native/i386_decode.hexa` C-PORT cross-link repointed from `domains/C-PORT.md`\n → the C-PORT node in `ARCHITECTURE.json` (provenance string left intact).\n Full per-domain `.log.md` history is recoverable via git log; the substantive\n entries folded below.\n\n Domain-log digest (folded from `domains/*.log.md`):\n - All 22 domains scaffolded 2026-05-31 (domain init, seeded from the gamebox\n 전수조사 — @goal + milestones from `.roadmap.*` + repo survey of\n lib/loader · lib/perf · native).\n - **C-PORT** (2026-06-03): M1 inventory+classify (4 native/*.c, 869 LOC;\n Tier-A 437 · Tier-B 113 · Tier-C 319) → M2 decode_modrm_disp port\n (RUNEQ 768/768, sha256 b4388479) → M3 decode_prefixes + i386_op_name +\n rd_s32/rd_s16 (RUNEQ 1069/1069, sha256 8e6acbb8) → M4 stateful\n i386_decode_one (RUNEQ 1042/1042, sha256 b2853d0a). Both M2 and M4 caught a\n real write-before-fail out-param divergence, fixed → byte-identical.\n - **GAMEBOX-D2R**: prerequisite @uses edges wired (LOADER/WIN32/GFX/NET +\n BNET); reconciled 3/4 — D3D11/MPQ/D2S code present + offline/online\n checkpoints landed; gameplay-tracks (26 c_d2r_*) left open.\n - **GAMEBOX-BNET**: reconciled 5/6 — 10 pe_battle(_)net_* + orchestrator\n present, D2R offline+online checkpoints prove the path; D2R non-blocking;\n D4/CS2 launch extension open.\n - **GAMEBOX-PURPLE**: reconciled 4/4 — 7 c_purple_* + Lineage M/W purple play\n checkpoints; scope = M/W; Classic depends on PURPLE for download only.\n - **GAMEBOX-LINEAGE-CLASSIC**: wired LOADER/WIN32/GFX @uses; reconciled 3/4\n (r28 loader + native first-frame + play checkpoint + drift-resolution track\n bv); two corrections recorded — PURPLE is the download channel (runtime\n native, \"no Purple shell\"), and Classic is an ONLINE MMO (not offline);\n playable gate = GameGuard (INCA) kernel AC honest-freeze.\n - **GAMEBOX-LAUNCHPAD+**: meta-domain init (`+` composition) targeting D2R +\n LINEAGE-CLASSIC; @has + @targets edges wired; shared \"playable\" smoke bar\n (boot→title→char→in-world) defined with online/anti-cheat honest-freeze.\n\n### Removed\n\n- `DOMAINS.tape` (domain roster + tree graph) — superseded by\n `ARCHITECTURE.json` (`meta` + per-node `edges[]`).\n- `domains/` (22 `*.md` domain snapshots + 22 `*.log.md` logs) — `*.md` folded\n into `ARCHITECTURE.json` nodes; `*.log.md` digested into the entry above\n (full text recoverable via git log).\n\n- chore(harness): perfect harness setup — engine submodule bumped to latest on\n `harness-hardcore`; authored `ARCHITECTURE.md` SSOT (overview + component map +\n data flow + governance/verify, English) over the stub; authored harness-standard\n `CLAUDE.md` (H1 + blurb + `## Structure` tree + governance + `## Harness` +\n quick reference) over the SPECKIT stub; added a `docs` discipline block to\n `harness.config.json` (`architecture`/`log`/`scratchDir` + `scopeDirs: [\"\"]`\n root-only + `allow` list covering README/CHANGELOG/ARCHITECTURE/CLAUDE/AGENTS\n plus `RELEASE_NOTES_v1.0.*` and `TAPE-AUDIT.md`). `harness docs check` now\n reports `docs: ok` with 0 CLAUDE-MD violations. `.claude/settings.json` already\n carried the full guarded harness hook set (pre bash / pre write / post edit /\n prompt / prefs · easy · recommend inject / SessionStart) — preserved as-is."}
{"ts":null,"title":"[1.0.4] — 2026-05-05","body":"### Added\n\n- Track CK — `docs/VAC_HONEST_FREEZE.md` mk1 narrative (Valve Anti-Cheat user-mode AC + Trusted Mode; resolves cs2.cond.3 deferred hook).\n- Track CL — `docs/EAC_KERNEL_HONEST_FREEZE.md` mk1 narrative (EAC kernel + anti-tamper class; 3-cross-class delta_force + elden_ring base+DLC + nightreign).\n- Track CM — Nightreign lib module fan-out at skeleton-tier:\n - `lib/loader/pe_elden_ring_nightreign_specific_track.hexa` (216 LOC)\n - `lib/perf/c_nightreign_co_op_session_init.hexa` (133 LOC)\n - `lib/perf/c_nightreign_matchmaking_probe.hexa` (129 LOC)\n - `lib/perf/c_nightreign_dx12_first_frame_co_op_variant.hexa` (131 LOC)\n - Total 609 LOC; retired_intentional posture inherited from blk.1 + blk.2.\n- Track CN — `gamebox/doc/gamebox_hexa_interp_closure_perpetual_deferral_ack_track_cn_landed_2026_05_05.ai.md` (formally closes CJ §11 hook 4 as perpetually deferred; multi-year horizon).\n- 4 NEW `gamebox_*` markers (CK + CL + CM + CN).\n- 4 NEW `gamebox/doc/` handoff docs (CK + CL + CM + CN).\n\n### Changed\n\n- `hexa.toml` version: `1.0.3` → `1.0.4`.\n- `README.md` Version badge: `version-1.0.3` → `version-1.0.4`.\n- `.roadmap.elden_ring_nightreign`: `loader_count: 0 → 1`, `perf_count: 0 → 3`, NEW `loader_pattern` + `perf_pattern` + `ai_native_handoff_track_cm` fields, NEW comment header line 6 documenting Track CM skeleton-tier fan-out (Track BY documentation-only narrative line 5 preserved verbatim).\n\n### Cumulative deltas (v1.0.3 → v1.0.4)\n\n- gamebox-native markers: 15 → 19\n- Honest freeze docs: 3 → 5 (Track-E predecessor + CK + CL)\n- lib/loader files: 455 → 456 (+1 nightreign loader)\n- lib/perf files: 242 → 245 (+3 nightreign perf)\n- Forensic verdict: UNCHANGED (`SKELETON_TIER_100PCT_WIN32_VALIDATED_MANJEOM_0`)\n- validated_manjeom: UNCHANGED (0 — skeleton-tier per Track BL/BM forensic baseline)\n\n### Posture\n\n- own1: Wine 0 / hexa-only / no DRM bypass / no AC bypass (5 classes covered: VAC + GameGuard + EAC kernel + EAC anti-tamper + Warden) / no FromSoft matchmaking bypass / no anima clone / `destructive_ops: 0` (maintained).\n- own2: 4 CM modules emit RETIRED_INTENTIONAL posture annotation; CN explicit no-fake-PASS / no-fake-real-run-completion declaration; skeleton-tier vs real-tier distinction explicit; spec freeze ONLY scope explicit per CK + CL."}