Linked repository document
Gododin developer experience and integration completion plan
docs/plans/2026-09-26-devx-and-integration.md
This document retains its design, example or evidence context. References outside this guide show their repository paths.
The 2026-10-19 Godot-first decision extends DX-1/DX-5/DX-10: setup, normal opening, Play and authored-preset Export are available through Godot, backed by the same CLI. The active workflow record owns its implementation and evidence; the earlier delivery notes below retain their recorded publication scope.
Status: in execution. Delivered through the gododin-devx-2026-09-26.3
CLI/SDK reseat (macOS recording host, 2026-09-26): DX-1's public gododin run
launcher contract and installer gates, DX-10's store listing material, DX-2's
engine-owner cleanup (generic owned_ref_release, the verified PREDELETE
release authority with Host notification routing, named adapter result
vocabularies, explicit by-name scene bindings), and DX-3's MultiMesh_Stream
submission owner with the Boid Flock (3D) and Bunny Mark (2D) migration. The
follow-up gododin-devx-2026-09-26.4 reseat (same host and day) fixed the
facade's colors-layout allocation defect and migrated Rewind Lab's three
streams and the MultiMesh fixture onto MultiMesh_Stream; the final
gododin-devx-2026-09-26.5 reseat added the Windows/Linux notification
adapters and re-attached and rebuilt the installed consumers. The per-package
rows below carry the delivered bounds and evidence.
What is left, in order. Everything below is blocked on one or more engine runs except where noted; the recording host's engine window is the gate.
- Engine-run evidence for delivered work is current through the
gododin-devx-2026-09-26.10closure (2026-09-27): the Cavern and setup-dock evidence refreezes, the slime zero-owner runs, the multimesh installed/readback/qualification/baseline campaigns, the editor-agent conformance probe, and both tiers are green against.9. - DX-3 is engine-qualified (2026-09-27) and closed: the qualification
falsified the template's scene-side RID-invalidation claim, the corrected
facade reseated the SDK as
.6, and resize/rebind, invalid layout, resource replacement, failure rollback, scene removal and reload proofs, the distinct readback run, the measurement and the interpolation check all executed against that closure; re-executed green on.10. - DX-0 residuals that are not engine-gated in full: end-to-end timing
comparisons beyond the recorded multimesh baseline (their editor legs
share the engine window). The Windows notification adapter's runtime
proof landed on the owner's host (2026-09-28,
mode=notificationarriving through the reload gate after two kernel-contract fixes); the Linux proof still rides that platform's real-host gates. - DX-4 is delivered as ADR 0069 through the
.10reseat (2026-09-27) with fixtures/authored_values (repository:fixtures/authored_values/) as its fixture. DX-5 is delivered (2026-09-28, examples/ripple_pond (repository:examples/ripple_pond/), Windows journey). DX-6 is in progress: CL-1, Cavern Lab's playable slice, CL-2, the integration loop (explicit accepted-grid identity, native classification of scene-authored candidates into pickup/exit placement, Shape-mode mask refinement, baked-grid classification), and CL-3, durable authoring (saved masks and markers, undoable authoring, deliberate Resource sharing, applied settings, the responsive supervised bake panel, and the exported bake-play consumer), and CL-4 (the integrated close: visible mask/candidate editing, focus-safe HUD, explicit scenario restart, the native editor reload journey with unsaved Godot work preserved, and executed debug/release exports), are delivered (2026-09-28/29, Windows journeys), and EX-BOID is implemented (2026-09-29, Windows host; its gameplay execution evidence awaits the SDK reseat that carries the Windows call-inventory discovery fix -- see the platform record's fourteenth entry), EX-BUNNY is implemented (2026-09-29, Windows host; same reseat bound for its three-arm execution evidence), and EX-SLIME is implemented (2026-09-29, Windows host; the kernel, its four new Odin tests, and the masked named workload executed here, with the engine-side control riding the same reseat), and EX-VOXEL is implemented (2026-09-29; its regeneration and evidence additionally wait for the voxel subsystem's Windows threading port — platform record, fourteenth entry), and DX-7 and DX-8 are delivered (2026-09-29, Windows host). DX-9 is delivered too (2026-09-29, Windows host), closing the queue. The named execution bounds then executed the same day (fifteenth platform entry): the Windows call-inventory discovery fix landed in both scans and reseated machine-locally, the voxel worker ported to core:thread with its contracts intact, and every facade project's engine gates ran through the public CLI — boid integration, voxel eval/probe and offline eval, bunny preset, slime 120k-agent headless eval, and the DX-9 GPU comparison bitwise-validated on Forward+ (16 steps, 0 mismatched cells, zero leaked RIDs). Recording-host refreeze state (2026-10-03, macOS, againstgododin-dev7-2026-10-03.1): four of the five named harness legs executed and passed — bunny preset, boid integration, slime gpu, voxel eval+probe (details in the DX-6 row). The Cavern harness passes every non-export stage on the official dev7 editor; its two bake-export legs and the freeze/contract/tier chain that follows them are blocked on the dev7 export-template authority in the sealed SDK lock, and the real SDK reseat window remains owner-side.
This plan covers the improvements identified while building the external clock consumer, unfinished editor/data efficiency work, the existing example integration plan, and the additional examples needed to demonstrate Gododin's practical value. The live continuation prompt is 2026-09-26-devx-continuation-handoff.md; its original execution prompt is archived at archive/2026-09-26-devx-and-integration-handoff.md.
Authority and boundaries
The implementation plan retains product phases and C1–C5 verification policy. This document owns the order and completion ledger for the work below; it does not replace the requirements of the linked plans.
| Authority | What remains authoritative there |
|---|---|
| Editor and data efficiency | Protocol, observation, cache, readback, failure and measurement requirements |
| Receipt/lock evaluation | Measured decision on verification scope and any subsequent policy change |
| Example integration | CL-1–CL-4 and EX-BOID/BUNNY/SLIME/VOXEL scope and acceptance |
| Rewind Lab design and README | RL package scope; implemented behavior and deviations |
| Desktop workstream | Remaining platform implementation, cross-builds and real-host gates |
| Native PRD | Current authored-value admission; generated engine calls are a separate surface |
| Version policy and qualification audit | Active identities, support status and release evidence |
Godot keeps scenes, Resources, editor, renderer and shaders, ordinary gameplay orchestration, and export. Pure subsystems remain ordinary Odin. Helpers may own recurring foreign lifetime and batching work; this is not authorization for a Gododin ECS, renderer, job system, scripting language, or benchmark framework. Keep manual/raw escape hatches and idiomatic records, procedures and explicit allocators. Record focused ADRs when implementation changes an accepted contract.
Product priority: a solid core, then an excellent developer experience
The owner's direction, clarified on 2026-09-26, is the governing priority: once the core is correct, efficient and covers the engine API, Gododin's main investment is developer experience. A developer should write idiomatic Odin that feels useful inside Godot, with little installation, setup, integration, build or deployment administration. Native performance is a foundation; compelling everyday use is the product.
Establish core readiness from the generated coverage/resolution reports, real bulk/lifetime behavior and affected qualifications. Complete metadata-determined engine API coverage must remain complete, with explicit resolutions for actual metadata gaps. The narrower authored-value matrix is separate and grows with real consumers. Do not turn “solid core” into an indefinite rewrite or postpone all consumer improvements until every optional helper exists.
Apply these acceptance questions to every package:
- Does normal game code stay ordinary Odin, with readable data flow and explicit ownership, rather than acquiring a Gododin object model or registration layer?
- Can a consumer install, adopt, edit, test, update and export through public tools without copying locks/manifests, setting private runtime variables, maintaining duplicate declarations, or understanding contributor release choreography?
- Is repeated setup or lifetime ceremony eliminated at its owning layer, with meaningful costs and failure modes still visible? Removing boilerplate must not merely hide an allocation, copy, synchronization point or lifetime hazard.
- Do Godot scenes, Inspector/Resources, native diagnostics, navigation, reload and export form one understandable workflow? Can a normal failure be repaired from the diagnostic and the short guide rather than a tour of the ADR history?
- Does a runnable example demonstrate why the combination is enjoyable and useful, while leaving GDScript welcome for the work it suits?
Record a before/after consumer journey in DX-5/DX-10: required commands and hand-edited configuration, duplicated facts, handwritten bridge/cleanup code, first-success time, edit-to-result time, and recovery from a broken edit or relocated/upgraded SDK. Use these observations to remove actual friction; do not optimize an arbitrary line-count target or add infrastructure merely to measure it. After the foundation gate, prioritize the public workflow and compelling examples over speculative low-level features or marginal microbenchmark improvements.
Reconciled starting state
“Implemented,” “available in the selected immutable SDK,” and “qualified on this artifact and host” are separate facts. Existing receipts keep the identities and measurements they actually recorded.
| Area | Present at this audit | Still owed |
|---|---|---|
| Native editor reload and ordinary authoring | Implemented, with recording-host macOS evidence | New changes need matching regression evidence; launched games still restart for code changes |
| Dev6 / receipt and catalog format migration | Checkout, SDK and example reseat completed on 2026-09-19 | This migration is not an open task; later source changes require their own publication |
| Efficiency packages 1–5 | Binary control protocol, one editor-lifetime child, child-side observation, GDI compatibility/diff, independent Host/image caches; local checks recorded on 2026-09-20 | Integrated publication, locked-tier rerun and complete workload comparison; native notification adapters |
| Efficiency package 6 | MultiMesh readback consumer and campaign harness implemented | Recorded source-rebuild inventory failure needs reconciliation, then the real campaign and matching evidence |
| Efficiency package 7 | Structural after-record and one quick-tier breakdown | Installed SDK, integrated failure/recovery coverage, end-to-end timings and applicable platform checks |
| Receipt/lock evaluation | One broad quick-tier timing breakdown | Isolated verification costs and an explicit retain-or-change decision |
| Cavern and supporting integrations | Existing demos, kernels, worker/baking machinery and earlier interaction receipts; CL-1 through CL-4 delivered (2026-09-28/29, Windows journeys); all four EX packages implemented (engine-side evidence rides the SDK reseat; voxel also needs its Windows threading port) | DX-6's remaining work is the execution evidence named in each entry |
| Rewind Lab | RL-0–RL-3 implemented with recorded evidence | RL-4 contact/gameplay feedback and RL-5 integration/reload completion; RL-6 remains optional stretch |
| Desktop work | Owner confirms Windows and Linux verification on 2026-09-26. This checkout directly records macOS and Linux quick/native CLI build/run; its older platform inventory is incomplete relative to that report | Recover and reconcile the actual Windows/Linux artifacts and gate coverage before assigning remaining implementation or reruns; retain genuinely missing current-artifact and clean-machine qualification |
The editor after-record is
2026-09-20-macos-arm64-after-note.json (repository: fixtures/efficiency/evidence/2026-09-20-macos-arm64-after-note.json).
It demonstrates structural reductions and explicitly does not establish a
whole-product speedup. The readback failure below is a recorded observation,
not a defect reproduced during this documentation audit.
Platform follow-up from the owner: the Windows/Linux verification was performed the previous weekend on the owner's Windows PC and its Linux WSL installation; the results or source may still be uncommitted there. Recover those records first, preserve WSL/display/backend scope and reuse valid evidence. This record recovery must not stall independent DevX packages.
Execution order and progress
Use coherent batches, with focused checks while editing and publication at useful consumer boundaries. Package owners below are existing source areas, not new services or teams. Update each row with implementation, publication and evidence links as work proceeds; a checked box alone is not a completion record.
| ID | Package | Dependency | Status |
|---|---|---|---|
| DX-0 | Finish efficiency and reconcile the current baseline | First | In progress (2026-09-26, macOS recording host). Desktop reconciliation delivered by the recovered-evidence commits. MultiMesh inventory failure resolved — two darwin stage-tool regressions from the Linux batch (check_stage passed -minimum-os-version to odin check; the installer scan compared Mach-O underscore-prefixed symbols unprefixed), not a generation drift — and the readback campaign measured (evidence (repository: fixtures/efficiency/evidence/2026-09-26-macos-arm64-readback.json)); fixture oracle/driver bugs fixed. macOS kqueue notification adapter landed with mode=notification proven live; quick tier green from the checkout CLI (also fixed the pre-existing darwin update-test canonicality failure from the temp-dir change in d60ed9d). Receipt/lock policy retained on measurement (evidence (repository: fixtures/efficiency/evidence/2026-09-26-macos-arm64-verification-cost.json)); that plan is closed. Release reseat: gododin-devx-2026-09-26.1 sealed CLI + SDK packed (double-pack byte-identical), root and configured fixture locks synced, pack_sdk.sh closure extended with controlprotocol/+watcher/, installed-consumer gate green. Failure 188 resolved as a format-migration transient, not a live defect: the sealed failure evidence is stamped 2026-09-19 15:06 while the commit that introduced the TOML receipt format (5e036d6, "Migrate receipts to TOML") landed 15:55 the same day — the run executed a mid-migration working tree whose generation worker and packaging parser cannot be assumed consistent (the "same inputs, different outcome" premise never held because the toolchain changed between the failed run and the accepted rerun). The suspected stale-cache adoption is positively ruled out: generation_cache_key folds the stage tool's own self_sha256, so no cross-toolchain entry is adoptable. Current-code soundness is measured: the accepted build's receipt round-trips byte-identically through receipt_unparse→receipt_try_parse across fresh processes (10,000 parses, zero failures). Cavern refreeze complete: the full harness reran green through gododin-devx-2026-09-26.1 (GODODIN_CAVERN_INSTALLED_PASS ... reload=true exports=2 lifecycle_owners=0, including the reload stage where 188 had failed) and the freeze was re-cut as cavern-evidence-2026-09-26.json (repository: examples/cavern_lab/cavern-evidence-2026-09-26.json) bound to the resealed lock/CLI/SDK identities; contract.sh passes (GODODIN_CAVERN_HARNESS_CONTRACT_PASS), which reopens the quick tier for any CLI and the locked-tier rerun. Both tiers green (2026-09-26): the quick tier passes from the checkout CLI and the full locked tier passes with the exact evidence compiler (GODODIN_TEST_PASS tier=locked, phases 1–8 + public init/prebuilt/external first-CLI + Cavern contract), after the runner's cache-scenario assertions were updated to a997725's per-object compile-cache log format — the locked tier had not executed since that split, so its old single-line substrings could no longer match. Residuals: (1) Package 6/7 failure-matrix and end-to-end timing residuals. (2) Windows/Linux notification adapters: implemented 2026-09-26 (Linux inotify in watcher/notify_linux.odin, Windows ReadDirectoryChangesW in watcher/notify_windows.odin, both through the same seam the macOS kqueue adapter uses — events are hints, the census stays ground truth, and bounded registration, overflow, and failed-wait all degrade to the honestly reported polling mode). Runtime mode=notification proof stays under each platform's real-host gates; odin check -target:linux_amd64/-target:windows_amd64 type-check the package clean and the host seam test passes on macOS. .4 reseat (2026-09-26): the DX-3 colors-layout fix and remaining consumer migrations reseated the SDK (manifest 6c203034…, prebuilt CLI unchanged). .5 reseat (2026-09-26, final closure): adds the notification adapters (249 members, manifest 51e099a6…, prebuilt CLI unchanged from .2, distribution 8dbafb78… double pack byte-identical); seven installed projects re-attached, five rebuilt accepted; quick-tier phases 1–5 pass from the checkout CLI against that closure. The engine window then executed (2026-09-27, same host): the slime zero-owner runs (headless and windowed, HOST_PASS references=0 instances=0, leak greps clean) pass against .5 and re-executed green against .6; the setup-dock gate's .5 rerun caught a second real add-on defect — _setup_sdk_release read the FIRST release_identity in the lock, which since the .2 prebuilt repack is [first_cli.prebuilt_gododin]'s sealing release (.2), not [authority_sdk]'s, so the dock reported a false release mismatch and prescribed an unnecessary adopt-lock — fixed to parse the authority section, gate green (GODODIN_SETUP_DOCK_PASS, checked-in evidence re-cut per reseat); the DX-3 engine qualification executed against .6 (its own ledger entry), which included the qualification finding that corrected the facade through the .6 reseat. Executed on .6 after the reseat: the setup-dock gate passes re-cut per reseat (GODODIN_SETUP_DOCK_PASS ... release=gododin-devx-2026-09-26.6, checked-in evidence updated); the quick tier passes phases 1–5 (41 cases, re-pinned render sentinel) and stops only at the Cavern contract stage, which refuses the stale .5-bound evidence — the tier working as designed; the locked tier's non-Cavern phases run to the same expected stop. Remaining engine-gated: the Cavern refreeze bound to .6 (blocked on the reload defect below, which also blocks the tier-completing reruns), and the package 6/7 live-editor failure legs (failed-build recovery, child crash/restart, addon toggle, watcher loss; the protocol cells are covered by controlprotocol/tests.odin and tests/fixtures/language-protocol-core). Reload-starvation defect (found by the .6/.7 harness runs, root-caused and FIXED 2026-09-27): the addon's _drive_reload state gate treated "the status snapshot has not observed the accepted build yet" as supersession and permanently cleared _synced_build_id on a single empty observation — one unlucky tick during the probe's bake churn killed the reload silently even though good snapshots (proven by instrumented-agent reproduction: 434/434 snapshots carry all three sections) arrived a second later. Fixed to wait on an empty observation and clear only on a genuinely different accepted id, plus two hardenings the diagnosis proved necessary-shaped: a bounded watchdog re-requests a sync/compat whose response is lost, and FRAME_ERROR frames now clear their matching pending gate instead of starving the drive. Second pre-existing defect fixed: the locked tier's cataloggen check passed generation_symbol_tool() in the probe's bridge_root slot (argument shift from c25801d), invoking odin build /usr/bin/nm …; reordered, green. Third pre-existing defect fixed: the locked tier's BLD-DEV-007 adopted-game build failed because 9bd220d's godot_project_root = "." template reached the build staging unnormalized — the snapshot concatenated ./project.godot, which validate_relative_path refuses; buildcoord/source.odin now stages an adopted "." workspace at the top level (reproduced, fixed, verified disposition=accepted). All three shipped through the .8 reseat (addon + buildcoord + tools/cataloggen; the prebuilt CLI repacked as its own gododin-devx-2026-09-26.3 release — new CLI sha ce1df5c3…, distribution 781250a2…; SDK manifest 57b00e67…, lock edddbf08…, distribution 81daf97f…). Everything re-executed green on .8: the full Cavern harness including the reload stage (GODODIN_CAVERN_INSTALLED_PASS … reload=true exports=2), the evidence re-cut + GODODIN_CAVERN_HARNESS_CONTRACT_PASS, GODODIN_TEST_PASS for both the quick and the locked tier, slime pipeline/headless/windowed zero-owner runs, the multimesh installed run + both exports + readback campaign (engine-copy p50 1818 µs vs native verify p50 255 µs) + all five qualification legs + the baseline comparison (staged 41.1 µs @1000 / 155.5 µs @10000 vs per-instance 202.9 µs / 1407.8 µs), and the setup-dock gate (GODODIN_SETUP_DOCK_PASS … release=gododin-devx-2026-09-26.8; checked-in receipts re-cut). The .9/.10 reseats (2026-09-27, DX-4): the DX-4 work first reseated the SDK as .9 (prebuilt CLI gododin-devx-2026-09-26.4, manifest 32249406…, 249 members, lock e5de2961…). The owner's three Windows commits then landed on main and were rebased: the merged tree's CLI/buildcoord changes forced the final gododin-devx-2026-09-26.10 reseat — prebuilt CLI gododin-devx-2026-09-26.5 (sha e00c2534…), SDK manifest 3cfad0be… (250 members), lock e79879c8…, distribution 733b660b… — with seven installed projects re-attached, five render consumers rebuilt accepted, native_basic/native_basic_manual/compositor/cavern regenerated at schema 16, and the whole evidence queue re-executed green on .10: both tiers (GODODIN_TEST_PASS tier=quick and tier=locked), the full Cavern harness including reload (GODODIN_CAVERN_INSTALLED_PASS … reload=true exports=2) with the evidence re-cut and contract pass, slime headless and windowed eval runs (unfocused=0, zero owners), the multimesh installed run + both exports + readback/qualification/baseline campaigns (staged 57.0 µs @1000 / 393.9 µs @10000 vs the per-instance baseline's 328.5 µs / 1625.4 µs; the readback campaign's p50s move with host load and stay a validation oracle, not a headline), the setup-dock gate, and the editor-agent probe. The rebase also reconciled two macOS-red facts in the owner's commits: the new escaped-pair production test now compiles only on Windows (its grammar is Windows-only), and the Cavern contract's frozen background-owner import list now names the post-split boundary (core:mem, core:sync, core:time; the platform plumbing lives behind #+build in background_thread_*.odin). Package 6/7 conformance extension delivered (2026-09-27): fixtures/editor_agent/run.sh now walks the full request surface against a disposable project — hello, status, build+event, compat refusal, sync, ping, unknown-op/no-op/malformed-compat refusals, a job-failure leg (a broken authored declaration whose failed build still answers and leaves the stream healthy), a repair build, stdin-EOF terminal, and a second child proving the request-before-hello refusal and the shutdown op (GODODIN_EDITOR_AGENT_PROBE_PASS in both the --godot and no-Godot shapes; every request op asserted to terminate in a response or an error frame). The extension earned its keep immediately by exposing two real child defects: the watcher census never pruned deleted paths, so one file removal left every later pass reporting the tree unsettled and the settle loop spinning past every shutdown check — the child hung forever in teardown (fixed: adoption prunes removals, and the settle loop checks shutdown); and the sync job's Godot-resolution refusal posted to request id 0 instead of the requesting job, so a sync with no configured Godot executable never terminated for its caller (fixed: the error carries the job's request id). The leftover unconditional AGENT_POST_DEBUG stderr prints also left (post_frame noise no longer eats the addon's 64 KiB diagnostic tail), and the terminal frame's reason now names the shutdown rather than always "stdin closed". All of it shipped through the .9/.10 reseats. Remaining: the Linux real-host notification proof; the Windows proof landed on the |
owner's host (2026-09-28, mode=notification arriving through the reload gate |
|||
| after the two kernel-contract fixes in the platform record). | |||
| DX-1 | Simple install/integrate/deploy workflow and public application launcher | DX-0 baseline; can develop before its final reseat | In progress — store entry and public launcher delivered (2026-09-26, macOS recording host). ADR 0068 accepted (one .gododin-owner.json inventory across store and CLI delivery channels, inventory release_identity, static add-on file set, inert-mode setup entry); the add-on source gained LICENSE/README.md and editor_install_workspace installs the five-file static set with the release identity recorded (tests green (repository: cmd/gododin/editor_workspace_test.odin)); tools/release/pack_store_zip.sh packs the maintained source into a deterministic, inventory-verified store ZIP (GODODIN_STORE_ADDON_INVENTORY_VERIFIED, byte-identical double pack); the plugin's inert mode now shows a passive setup dock in an ordinarily opened editor — no launcher env, no CLI child — that reads its release, selects an installed SDK explicitly, connects through public init/sdk validate, and reports add-on/SDK version mismatch, while --headless/--import/--export sessions stay fully inert. Verified live: the packed ZIP installed into a clean ordinary Godot 4.8-dev6 editor reaches setup (GODODIN_SETUP_DOCK_READY release=gododin-devx-2026-09-26.1). Launcher delivered: gododin run now accepts --profile <debug|release> (the accepted publication of the requested profile; --last-known-good refuses a mismatching profile with BUILD_PROFILE_MISMATCH), --script alongside --scene (same project-relative/res:// discipline), --headless, the engine's --quit-after, repeatable --env NAME=VALUE forwarding that refuses the launcher-owned PATH/HOME/TMPDIR/LC_ALL and GODODIN_*/GODOT_* names (RUN_ENV_NAME_RESERVED), and application arguments after --, which the engine itself classifies as user args so they can never replace the authenticated executable, project path, publication, or identity checks. Every run prints GODODIN_RUN_IDENTITY engine_target/engine_sha256/native_profile/build_id/source_revision/publication/sdk_release before launch, forwards child stdout/stderr, propagates the child's exit status, and names it in the GODOT_RUN_FAILED detail; GODODIN_RUN_PASS keeps its byte-identical compositor-harness format. Verified end to end on a real adopted project against the seated 4.8-dev6 engine: env and -- args observed by the game (GAME_SEED=7, GAME_USER_ARGS=["--players","2","--demo"]), script run exiting 7 propagated, --quit-after 10 bounding a non-quitting MainLoop, scene/headless/windowed/stale runs, and all ten refusal diagnostics; new validator unit tests and the quick tier green. This closes the measured traversal findings — the readback and multimesh drivers' direct launches were working around exactly the missing application env/arg path (the GODODIN_IMAGE_* identity env the drivers set is the launcher's own curated set, which run now supplies itself). Remaining: Godot-executable discovery/local-config guidance and export-template setup guidance (a discovery-policy change needs its focused ADR). Dock interaction gate delivered: fixtures/setup_dock (repository: fixtures/setup_dock/run.py) packs the store ZIP, installs it into a clean ordinary project, opens the raw Godot editor with no Gododin environment, and presses the setup dock's real Connect/Check buttons through a probe add-on — GODODIN_SETUP_DOCK_PASS connect=1 repeat_guard=1 validate=1 release=gododin-devx-2026-09-26.1 (evidence (repository: fixtures/setup_dock/evidence-2026-09-26.json), bound to the devx CLI/engine/lock identities). Its first run caught two real add-on defects invisible to shell checks — the trailing-slash globalize_path("res://") root the CLI's canonical admission refuses (Connect could never succeed), and the release/mismatch reporting that depended on parsing OS.execute stdout, which this engine/host does not reliably return; the addon now trims the root for every invocation and reads the SDK release and lock-mismatch relation from the SDK's own files. Relocation and upgrade recovery paths are delivered: gododin attach is the relocation flow, and the new attach --adopt-lock adopts a new same-engine SDK release — SDK validated first, engine-target changes refused with AUTHORITY_SDK_TARGET_CHANGE, previous lock preserved at .gododin/previous-lock.toml, atomic replacement, adopted=%v on the pass line, unit tests covering adoption/re-adoption/target-change/CLI-level stale-lock recovery — with the dock's Check-connection mismatch guidance naming both commands and getting-started documenting both flows. DX-10 listing material is delivered in docs/store |
| DX-2 | Engine-owner cleanup and adapter diagnostics | DX-0 baseline | In progress — release path and PREDELETE lifecycle authority delivered (2026-09-26, macOS recording host). The lifecycle-authority verification ran first, against the pinned engine source: extension_api.json declares no Object virtuals, so _notification reaches extensions only through the creation-info notification callback, and Object::_predelete at 8898c2b3d sends NOTIFICATION_PREDELETE through it before free_instance — the supported last point where an authored instance holds valid Main authority to release engine-owned references. The typed runtime preamble gains godot.owned_ref_release, the one generic Owned_Ref release path (generated ref_counted_unreference reuse, last-reference object_destroy, idempotent on an already-released owner, refusal leaves the live owner byte-identical for retry); Slime and voxel_stream dropped their hand-rolled choreography for it. The engine facts admit _notification with its docs signature (what: int, void) with the evidence citation, the project-catalog test covers the admission and the i64 refusal, and the Host resolves each class's hook once at admission and routes the notification callback into the ordinary virtual dispatch (the stub is gone; notification_calls counter added). Slime_Colony releases its Image/ImageTexture in its PREDELETE branch, so ordinary teardown no longer needs the scene's exit-time shutdown; the explicit method stays the eager path reconfigure and the teardown probe exercise. Delivered through a full SDK reseat: gododin-devx-2026-09-26.2 (prebuilt CLI repacked — which exposed and fixed a real packaging defect, a test-only helper living in a production-packaged file the staged closure could not compile), root-lock records reseated (docs receipt, prebuilt, authority manifest), all seven installed projects attached. The .2 pipeline projects the hook end to end: catalog record, generated bridge dispatch (dispatch_index=19 kind=Virtual thread=Main), and an accepted native build (build_id=4b6044d9…). Quick-tier phases 1–5 pass; the typed-surface demand sentinel and live-evidence receipt were re-executed against the pinned engine. DX-2.d delivered (2026-09-26, same host): Slime's adapters now return a named result vocabulary — 0, a positive godot.Call_Error pass-through for authority/surface refusals (the already-admitted enum, no remap), or a negative Slime_Error constant naming exactly one cause — and project/main.gd decodes both halves through _result_text, so a failure log names the cause instead of a method-scoped integer. Incidental child-index dependencies are gone: Slime ("Display"), Boid Flock and Bunny Mark ("MMI"), Rewind Lab ("Boxes"/"Circles"/"Statics"), and the MultiMesh stream fixture ("MMI") bind their workload nodes by the scene's declared name through a local child_by_name helper (the interface's Latin-1 StringName constructor, the generated String and NodePath constructors, get_node_or_null, every intermediate released), with missing-child and wrong-class as distinct failures. All five projects generate/check/build accepted through the sealed .2 CLI. Remaining: the engine-run evidence — slime headless/windowed zero-owner runs proving the PREDELETE path, the Cavern and other example evidence refreezes the quick tier pins (blocked while the owner's Godot editor session is open). A shared SDK-side helper (authored-text → NodePath, or a generated named-child lookup) is a candidate for the next typed-surface reseat window rather than a second consumer-side copy source of truth; the four local helpers are deliberately identical and interim. |
| DX-3 | Retained MultiMesh helper and consumer migration | DX-2; readback reconciliation in DX-0 | **Engine-qualified (2026-09-27, macOS recording host) against the final .6 closure — see its section. The qualification falsified one template claim (a scene-freed RID is not pre-call observable) and the correction reseated the SDK; resize/rebind, invalid-layout refusal, replacement, rollback, removal/reload, readback, measurement and interpolation proofs all executed. |
| DX-4 | Consumer-driven authored values | DX-2 lifetime rules; agree consumer signatures before generation | Delivered (2026-09-27, macOS recording host) as ADR 0069 through the gododin-devx-2026-09-26.10 reseat. The agreed signatures shipped exactly as agreed, nothing further: (1) Vector2 — the authored two-field f32 struct match, admitted in method parameters and results, tagged property fields, and signal payload fields, carried as one inline wire word (ABI 4.4 wire kind 14, ownership None, both directions, Variant and ptrcall paths, zero allocation, the engine's own no-destructor truth observed); (2) Packed_I64 — []i64 query parameters as callback-scoped element views and []i64 results the Host copies into a fresh engine PackedInt64Array (wire kind 15, methods only, mirroring the byte-result ownership shape); (3) String signal payload fields — ADR 0050 decision 10's refusal lifted with these consumers as the fixtures, borrowed for the emit, retained by no one, the emission kit binding the string constructor pair only when a payload needs it (the Vector2 kit is likewise demand-driven). CATALOG_SCHEMA 15→16; abi_minor 3→4 with the regenerated artifacts and fingerprint. Position rules hold everywhere else: Vector3/Packed_Float32/Packed_Vector3 stay method-parameter inputs, String method parameters, Color/transform/RID forms, and the remaining packed rows stay rejected with source-located diagnostics (matrix). Evidence: the new fixtures/authored_values (repository: fixtures/authored_values/) fixture exercises every admitted cell in one authored class against the exact pinned engine — property write/read, Vector2 method round trip, packed query with empty and buffer-bounded results, and the String+Vector2 signal payload — GODODIN_AUTHORED_VALUES_FIXTURE_PASS with HOST_PASS instances=0 owned_foreign_values=0 at shutdown; cataloggen unit/bridge tests extended, the former String-payload generation negative flipped positive, and both tiers re-pinned and green on the .10 closure (quick GODODIN_TEST_PASS tier=quick, locked GODODIN_TEST_PASS tier=locked compiler_authority=exact-evidence). |
| DX-5 | Compact existing-game adoption example | DX-1–DX-4 as required by its real API | Delivered (2026-09-28) as examples/ripple_pond (repository: examples/ripple_pond/) — the adoption tutorial, executed end to end on the Windows x86-64 development host. The example is an adopted game directory (game/ beside it holds the pristine before-state, kept runnable): a complete tiny GDScript game (click-to-splash ripple pond) whose one substantial batch operation — the per-frame wave-equation step — moved to the pure subsystem/pond.odin kernel (no Godot/Gododin imports, fixed capacity, deterministic f64 evaluation order) behind the authored Ripple_Pond Node2D (declarations/ripple_pond.odin: one saved damping property, the typed splashed Vector2+f64 signal, configure/splash/step/frame_bytes with the coarse one-copy []u8 result, and the gd.Main_Call capability only where emission needs it). The preserved optimized GDScript baseline stays a runnable arm in the same scene (keys 1/2); adoption's total game delta is one scene node plus the native arm in main.gd, and game/ diffs prove the project settings and baseline byte-identical. The tutorial begins from the store-shaped add-on installation (setup dock → connect, or one gododin init) per the onboarding follow-up, then walks generate/check/build, run, the application test, broken-edit/fail-closed/repair, native editor reload with explicit game restart, and debug/release export. Evidence (Windows journey, checkout authority over an adopted twin — the installed attach flow rides the SDK-distribution decision): gododin init reported mode=adopted with the game's three files byte-identical; doctor/generate/check green (1 class, 11 operations, 1 property, 1 signal); accepted debug and release builds; the oracle passed through the public launcher — GODODIN_RIPPLE_ORACLE_PASS frames=600 cells=9216 checkpoints=6 signals=6 with GODODIN_RUN_PASS owners=0 — proving the native and GDScript arms byte-identical; run refused while the source was broken and recovered after repair; both exports executed as applications with their identity environment and zero-owner shutdowns (GODODIN_EXPORT_PASS debug b4ce9512…, release dbd2d025…); and the example's own editor-reload journey passed — GODODIN_DX5_RIPPLE_RELOAD_PASS … new_build_id=d199cb42… old_release=observed_clean per_cycle_teardown=zero_owners with GODODIN_EDITOR_EXIT owners=0. The journey landed two Windows fixes in the generate/check lifecycle path (mixed-separator managed-Odin publication paths; the generate stage's symbol-tool resolution from the recorded linker) and recorded one cold-first-import addon reader crash (once, not reproduced; the settled session reloads clean) — all in platform-migration.md pending the next reseat. Residuals: the committed generated/ is the init skeleton until one recording-host generate publishes the bundle the committed toml binds; init's .dylib/macOS-target template on Windows/Linux hosts is recorded friction, not yet fixed; test.sh (subsystem/game/pipeline/oracle/play) carries the installed-consumer flow and ran its subsystem and game-diff legs here. |
| DX-6 | Complete existing example integration and Rewind | DX-1–DX-4; CL packages retain their internal order | In progress — CL-1 delivered (2026-09-28, Windows x86-64 development host). Cavern Lab's playable slice is live/project/expedition.tscn, the project's main scene: the scene-owned native generator retains an authored CaveGenerationSettings Resource (the committed .tres; seed 31415926 is the editor-authored preset), background seeded generation reports through the new generation_completed/generation_failed scalar terminal signals via pump_completion, and bytes stay reachable only through request-checked published_cells outside the emission frame. The controller fills a disabled pending TileMapLayer in bounded batches and swaps terrain+collision at a safe physics boundary with one shared cave identity; failures and deliberate cancellations keep the last cave playable. Evidence: the headless GODODIN_CAVERN_EXPEDITION_PASS campaign (debug and release, through the public launcher) proves published bytes oracle-equal against the GDScript kernel, a blocked-and-free walk through real tile collision, same-frame supersession, cancellation, and the injected failure signal, with GODODIN_RUN_PASS owners=0; the windowed session shows the Inspector-edited seed driving the running game and a real close-button exit with zero owners (GODODIN_HOST_PASS). test.sh gained the expedition mode for the next recording-host refreeze. Bounds and the honest input-tooling note are in the integration plan CL-1 entry. CL-2 is delivered too (2026-09-29, Windows x86-64 development host). The kernel gained accept_grid (validate-before-mutate admission of displayed bytes as the classification grid) and the native surface grew to 55 operations with a monotonic accepted-grid id and content hash. The expedition scene authors five candidate markers; every install commit accepts exactly the displayed bytes and classify_positions decides the scene content — exit scene at the first placeable candidate, up to three collectable marker pickups after it. Shape mode paints a mask seeded from the displayed cave and process_mask refines it into a new accepted grid; Load baked grid installs the committed baked asset under its own 256×192 identity. Evidence: the campaign grew to caves=4 with classified_oracle_equal=true markers_collected=true exit_reached=true candidate_move_replaced=true refined_grid_replaced=true baked_grid_classified=true (debug and release through the public launcher, owners=0), all other engine modes and the standalone classify evidence re-passed, and the windowed session drove Shape → paint → Refine → Load baked with real mouse clicks into a clean close-button exit. The full delivery paragraph and bounds are in the integration plan CL-2 entry; CL-3 is next in the internal order. CL-3 is delivered too (2026-09-29, Windows x86-64 development host), with no native-surface change. The durable authoring layer is Godot-side work over CL-2's 55 operations: the settings Resource's changed notification refreshes the HUD deliberately and Apply settings re-reads the assigned Resource into a new request; Save inputs persists the Shape-mode mask and candidate marker positions and a reopened expedition restores them before its first request; mask strokes, candidate moves, and grid installs are undoable through a bounded snapshot stack (Ctrl+Z or HUD); two scene instances share the assigned Resource and observe each other's writes while resource_local_to_scene gives a deliberate per-instance copy; and the bake panel supervises the committed bake shell out of frame — the cave stays playable while the child runs — publishing the displayed bytes to a machine-local session asset that installs through the same playable consumer, with cancel and kernel-rejected failure each keeping the last valid baked asset and the committed designer asset untouched. Evidence: the campaign grew to caves=9 with apply_resubmitted=true inputs_reopened=true undo_restored=true share_obeyed=true unique_obeyed=true bake_responsive=true bake_published_played=true bake_cancelled_kept=true bake_failed_kept=true committed_asset_untouched=true (debug and release through the public launcher, owners=0), all other engine modes re-passed, and the exported debug application ran GODODIN_CAVERN_BAKE_CONSUME_PASS freshness=FRESH … lifecycle_owners=0 plus the new GODODIN_CAVERN_BAKE_PLAY_PASS baked_markers=3 exit_reached=true consume_oracle_equal=true gameplay=expedition_loop — exported play consumes the baked asset and runs the expedition's own loop. The full delivery paragraph and bounds are in the integration plan CL-3 entry. CL-4 is delivered too (2026-09-29, Windows x86-64 development host), closing the Cavern Lab packages with no native-surface change. Shape mode shows a translucent overlay over exactly the authored mask's difference from the displayed cave, and a candidates view draws every scene-authored marker in-game (green placeable, red blocked); HUD buttons take no keyboard focus; Open Lab keeps the byte-compare/classification surfaces and benchmark access reachable in-game; saving inputs records the chosen scenario and a restarted expedition reconstructs it explicitly (a saved baked scenario reloads the committed asset — request #0 · grid #1 baked — proven byte-exact in the campaign); and the focused qualification over this source/artifact ran the campaign (scenario_reconstructed=true overlay_drawn=true candidates_drawn=true, debug and release through the launcher, owners=0), all engine modes, executed debug and release exports each passing GODODIN_EXPORT_PASS plus the exported GODODIN_CAVERN_BAKE_CONSUME_PASS and GODODIN_CAVERN_BAKE_PLAY_PASS gates, the native editor reload journey (GODODIN_CAVERN_RELOAD_STAGE_PASS … scene_hold=unsaved_marker_and_settings old_release=observed_clean per_cycle_teardown=zero_owners: background generation armed, the expedition scene held open with one unsaved marker edit and assigned settings, benign revision → rebuild → sync → reload in the same editor, unsaved work and compatible settings preserved, a supervised bake crossing the reload, post-reload bake published, GODODIN_EDITOR_EXIT owners=0), and a windowed session driving the whole loop without code edits — Shape, overlay-marked paints, Refine (cave 2 / grid #2 refined), Bake (published, auto-loaded as grid #3 baked session), Save inputs, real close into owners=0 — with the relaunch visibly reconstructing the saved baked scenario. The full delivery paragraph and bounds are in the integration plan CL-4 entry; EX-BOID is implemented too (2026-09-29, Windows host) -- the visible saved predator actor (mouse and deterministic-patrol modes) feeding both simulation arms from one transform, the native FlockSettings Resource initializing the controls, and the headless integration harness mode proving save/reopen, identical actor positions, and the flock's response; its gameplay execution evidence and the recording-host refreeze await the SDK reseat carrying the Windows call-inventory discovery fix (platform record, fourteenth entry). EX-BUNNY is implemented too (2026-09-29, Windows host, no native-surface change) -- the authored BunnyMarkPreset Resource (count/motion/seed plus the scene-owned texture and draw scale) initializing the controls, explicit Apply re-reading the assigned Resource into a full three-arm reinitialization, Reset restoring the last-applied values, seed and presentation threaded through every arm, canonical evaluation untouched, and the headless preset harness mode defining the acceptance gate; its execution awaits the same reseat (the probe passed every leg through the GDScript arm on this host and reached the recorded defect at the per-node cast). EX-SLIME is implemented too (2026-09-29, Windows host) — the kernel's Odin-owned nutrient input with proportional toroidal mapping and a default-zero attraction parameter, 25/25 Odin tests including the masked oracle case, the named offline workload (GODODIN_SLIME_MASKED_WORKLOAD_PASS separated=true replay_identical=true, canonical eval unchanged), four new declaration operations regenerated into the committed bundle, and the scene's two checked-in masks with the switch/clear control; the engine-side control run rides the same reseat. EX-VOXEL is implemented too (2026-09-29) — the authored VoxelWorldSettings Resource, the scalar edit_committed signal correlated to begin_edit identities, per-chunk tags counting distinct dirtied chunks once, commit-time emission only when every visible affected chunk has landed, silent retirement on eviction and reconfiguration, and the scene's settings-seeded controls with dig-stroke feedback after the geometry changes; its regeneration and evidence wait for the voxel subsystem's Windows threading port plus the reseat (platform record, fourteenth entry). DX-7 is implemented too (2026-09-29, Windows host) — Bunny's maintained optimized GDScript bulk arm (packed state, one MultiMesh buffer assignment, same oracle, local bulk-vs-per-sprite pin) and Boid's GDScript baseline switched to the same bulk submission shape, with the fairness contract stated in both READMEs and the windowed re-measurement riding the refreeze. DX-8 is delivered too (2026-09-29, Windows host) — the compact logistics loop above, with its executed Odin tests, headless probe, and zero-owner windowed run. DX-9 is implemented too (2026-09-29, Windows host; execution rides the reseat) — the scoped GPU field-update variant above, bitwise-validated by contract, canonical workloads untouched. With it, every DX item is implemented; the named execution bounds then executed (2026-09-29, fifteenth platform entry): the discovery fix landed in both call scans and reseated machine-locally, the voxel worker ported to core:thread, and the facade projects' engine gates ran through the public CLI — boid integration, voxel eval/probe, bunny preset, slime eval, and the DX-9 GPU validation on Forward+. The real SDK reseat window remains owner-side. Recording-host refreezes executed (2026-10-03, macOS arm64, against the reseated gododin-dev7-2026-10-03.1 closure and the official 4.8.dev7.official.c971f93e7 editor): bunny preset (all five flags true, zero owners), boid integration (the dispatcher had never routed the mode and its leg fell through to the eval-run assertions — both fixed; settings/actor/patrol/response/save-reopen all true), slime gpu (a new harness leg: a windowed SceneTree probe over Forward+/Metal — bitwise validation 16 steps, 0 mismatched cells, tolerance 0, plus ten measured upload/dispatch frames; the launcher gained the windowed script kind headless can never provide), and voxel eval + probe (deterministic worker digests, verify=169, zero owners). All seven examples' committed generated/ trees were regenerated to the dev7 image-root naming with the stale dev6 bundles retired, and ripple_pond's recorded init-skeleton residual closed through the public attach + generate flow (observation named there: the publication drops the skeleton's .gdignore under the . project root). The Cavern full harness then executed on the official dev7 editor and passes every non-export stage — expedition caves=9 with every flag, after a real race fix: an install's settle tail (two physics frames, then the unconditional play help text) could stomp a terminal report publishing inside that window, which at uncapped fps swallowed the injected-failure leg about one run in three (Windows pacing had hidden it); the tail now preserves a status text a terminal report has since written, and five direct reproductions pass. Visual BYTE-IDENTICAL, bake editor legs, background (40 generations, ack median 3 µs), bg lifecycle, the complete reload journey, and the release benchmark (byte-identical, 108x/114x) all pass. The two bake-export legs refuse with GODOT_EXPORT_TEMPLATE_AUTHORITY_MISSING: the sealed SDK lock records no dev7 macos_arm64_template_sha256, and its recorded tpz identity (657273362 bytes, 9b14db0b…) disagrees with the release-authenticated archive (sha512 12864a07…, 1436879719 bytes) this host verified and installed. Completing that authority is a reseat transaction — amending a consumer lock refuses with AUTHORITY_SDK_LOCK_MISMATCH, as it should — and the freeze, the contract pass, and the quick tier's Cavern stage follow it. |
| DX-7 | Maintained fair GDScript/native comparisons | DX-3; shares settings and integration work with DX-6 | Implemented (2026-09-29, Windows host). Bunny gained the maintained optimized GDScript bulk arm (gd_bunnies_bulk.gd, mode GDScript bulk, eval mode gd-bulk): packed 5-float state, one MultiMesh buffer assignment per frame, the shared identity stream/step/arithmetic/texture/scale/drawable, verified through the same verify_buffer oracle plus a local verify_bulk.gd check pinning bulk state to the per-sprite arm after ten steps (GODODIN_BUNNY_MARK_BULK_PASS bunnies=400 frames=10 bulk_matches_per_sprite=true). Boid's GDScript baseline now submits through one MultiMesh buffer assignment too (12 floats per instance, the same data set_instance_transform wrote, readback check retained) — the remaining difference from the native staged arm is the language and the submission call. Both READMEs state the fairness contract. The windowed re-measurement of every arm (uncapped and capped runs, fresh receipts) rides the recording-host refreeze like the other harness tiers; historical receipts stay historical. |
| DX-8 | Small logistics/tactical simulation example | DX-1, DX-2, DX-4; finish existing integrations first | Delivered (2026-09-29, Windows x86-64 development host) as examples/logistics_post (repository: examples/logistics_post/). A compact complete loop: Godot owns the authored ASCII map, click selection, pacing (pause/step/reset), and presentation; the native LogisticsPost owns job assignment (nearest-pending by BFS road distance, index-ordered ties), routing, inventory, and fixed ticks, with stable job ids, one bounded batch snapshot per frame, and the single coarse job_completed signal per delivery. A LogisticsSettings Resource is the saved authoring input; Reset re-runs the same seed identically. Evidence: 6/6 Odin tests (validation, delivery lifecycle + same-seed replay digest, seed spread, distinct claims, snapshot under a tracking allocator with zero outstanding bytes), and the headless scene probe GODODIN_LOGISTICS_PROBE_PASS submission_validated=true delivered_and_signalled=true replay_identical=true oracle_route_length=20 pause_step_reset=true (debug and release through the public launcher, GODODIN_RUN_PASS owners=0; the windowed smoke run also closed zero-owner). Start single-threaded by design; editor reload and exported-play journeys ride the example's own future qualification like the other examples'. |
| DX-9 | CPU/GPU Slime comparison | EX-SLIME and DX-7 measurement contract | Implemented (2026-09-29, Windows host); engine-side execution rides the reseat (platform record, fourteenth entry). The slime kernel gained colony_step_agents — phases 1–2 only, identical math and order — and the declarations grew advance_agents, grid_bytes/set_grid_bytes (boid's state_bytes borrow shape), and render_frame (29 operations), regenerated into the committed bundle with the facade intact. The scene gained the explicitly selected GPU field update toggle, the compute shader slime_field_gpu.glsl (one invocation per cell mirroring the CPU's exact arithmetic order: horizontal 3-tap blur, vertical, decay, toroidal wrap), and slime_gpu_field.gd (RD buffers, dispatch, per-boundary upload/dispatch/readback measurement). Enabling the toggle first validates: 16 steps each way from the live state, bitwise comparison, tolerance 0 — GODODIN_SLIME_GPU_VALIDATION_PASS same_model=true on pass; any mismatch labels the variant a different model whose FPS is never a language speedup claim. The interactive frame under the variant is advance_agents (CPU) → upload → dispatch → readback → render_frame — the readback is the explicit CPU-results contract, and eval/canonical workloads are untouched. The validation probe (verify_gpu.gd) records the renderer and the measured frame boundaries. Delivered and executed (2026-09-29, fifteenth platform entry). The validation protocol became agent-free — a new field_update operation runs only the field phase, because the old flow reset only the field and the replay's agents deposited at different cells than the reference's — and the shader marks its accumulation precise so the driver's FMA contraction cannot round differently from the CPU's strict IEEE sequence (without it every smoothed cell differed by one ULP); the compute source also lost its import-only #[compute] marker, its per-stage 4.8 error property was adopted, and its params block became the storage buffer the caller supplies. Executed on this host through the public CLI: GODODIN_SLIME_GPU_VALIDATION_PASS steps=16 mismatched_cells=0 tolerance=0 same_model=true and GODODIN_SLIME_GPU_PROBE_PASS on Forward+ (Vulkan 1.4.351, RTX 2080 SUPER, the project's rendering method flipped locally for the run — the committed default stays gl_compatibility where the variant refuses by design) with zero leaked RIDs, and the headless eval re-passed with the identical workload digest. |
| DX-10 | Integrated publication, documentation and qualification | All applicable packages; platform gates retain their owners | In progress — listing material delivered (2026-09-26, macOS recording host). docs/store/listing.md holds the paste-ready listing fields (name/category/version/engine 4.8-dev6 exactly/macOS-arm64-only host claims), short and long descriptions with the external-toolchain requirement explicit, prerequisites, version history, and the required disclosures (AI assistance including the AI-generated icon; no network, no downloads; no native code or dangling descriptors in the ZIP; early-stage scope) plus the open pre-submission items (live-rules recheck against the named precedents, account submission, screenshots from real sessions, per-platform claims only after their gates). The verified artifact is pinned: release gododin-devx-2026-09-26.1, store ZIP 14,653 bytes, sha256 f80aeb89e9cd0f606f1f739b9849c874dc4f57980b3d1da7c4c34ab282ae39f8, deterministic double pack, inventory-verified. docs/store/adoption-journey.md records the executed commands, manual steps and first-success experience with the honest friction list against gdext/Rust Tools (separate SDK download, dev-snapshot engine pin, connect buttons not yet click-verified, single qualified host). Icon candidates at icon-512.png (repository: docs/store/icon-512.png)/icon-128.png (repository: docs/store/icon-128.png). Remaining: actual submission and acceptance as separately recorded events; screenshots from real editor sessions; final store-form field mapping; the rest of this package's publication/qualification loop follows the other packages |
DX-0's macOS publication must close before claiming its efficiency work delivered. Do not hold all locally executable work for unavailable Windows/Linux machines. Record their precise remaining commands and prerequisites in the desktop workstream; do not mark their gates passed or the full product complete.
DX-0 — Finish efficiency and establish the actual baseline
Owners: controlprotocol/, watcher/,
editor_agent.odin (repository: cmd/gododin/editor_agent.odin),
editor/addons/gododin/, existing build/cache and release owners,
fixtures/efficiency/ (repository: fixtures/efficiency/),
fixtures/multimesh_stream/ (repository: fixtures/multimesh_stream/).
Requirements: BLD-001–009, BLD-ITER, BLD-RLD, NAT-BULK; detailed acceptance remains
in the efficiency plan.
- Read current source, accepted publication and SDK identities. Reconcile the owner's Windows/Linux verification with the desktop inventory: recover logs, receipts and any unmerged source, map each executed gate to its artifact, and update status before scheduling work. A missing checkout record is not evidence that verification never occurred. Revalidate macOS after the shared Linux build-path edits if no matching run is already recorded. Do not rerun an obsolete engine to reproduce historical receipts.
- Reproduce and resolve, or record an already-landed resolution of, the readback
fixture's recorded
BUILD_IMAGE_CALL_INVENTORY_UNKNOWNfor itsMultiMeshInstance3Dcast installer. Fix the owning generation/inventory path, not generated output or an allowlist bypass. Run the existing readback harness with the active compiler/engine; retain all-float oracle checks, engine-copy and native-verify timings, allocations and foreign-call counts separately. - Finish native source-notification adapters on available hosts, with reported polling fallback. Prove overflow/loss recovery by a full reconciliation, atomic saves, deletion/rename, coalescing and shutdown. Windows/Linux adapter and runtime work follows the desktop plan rather than disappearing from this ledger when macOS passes.
- Measure the remaining verification costs under the linked receipt/lock plan. The existing 59.9 s / 29.1 s phase totals include generation, tests and other work; they do not isolate hashing or prove a proposed redesign will help. Record a measured decision to retain the policy, or an ADR and implementation with before/after evidence. Preserve trust-boundary authentication, generated output checks, fail-closed run/export and historical provenance either way.
- Publish a coherent new source closure and immutable SDK through the existing release process. The 2026-09-20 record says the sealed CLI predates the added source closure; do not “fix” this by weakening authentication or overwriting an accepted SDK. Rerun quick/locked and the affected installed-consumer gates.
- Complete the original failure matrix: partial/saturated pipes, child exit and restart, queued cancellation, rapid/superseded edits, failed edit and repair, corrupt cache/catalog, addon disable/re-enable, watcher loss, retained unsaved scene/Resource edits, property restoration, and teardown with work outstanding.
- Retain reproducible idle-editor, save-to-observed and game-restart comparisons for small and large projects. Report p50/p95, repetitions, noise, CPU and process launches; distinguish codec/census microbenchmarks from complete workflow timings. Preserve or explain any regression.
Local closure: packages 6 and 7 have matching measured and installed evidence for the available host, and packages 1–5 have not been redone unnecessarily. Record each unexecuted notification/platform residual under its real-host gate. Keep the efficiency plan in progress until those required residuals also close; assigning a pending gate elsewhere does not make it complete.
DX-1 — Make installation, integration, runs and deployment ordinary workflows
Owners: runtime commands (repository: cmd/gododin/runtime_commands.odin),
lifecycle commands (repository: cmd/gododin/lifecycle_commands.odin), command parsing,
initialization/attachment, runtime selection, export/package delivery,
installed-consumer fixtures, getting-started and CLI help.
Requirements: NAT-INT, BLD-CFG, BLD-DEV, BLD-VAL, EXP and
ADR 0063.
Make the supported consumer journey short and repeatable. Finish the existing delivery/CLI work with its platform owner, rather than designing a second installer. Generate owned directories and ignored local configuration from explicit tool/SDK selection; stop requiring users to hand-copy canonical paths, lock facts or release metadata. Keep machine-local facts separate from portable game configuration. A fresh install, existing-game adoption, SDK relocation and upgrade should each have one documented public flow with actionable diagnostics.
Keep inspection and advanced controls available, but make authenticated defaults do the routine work. Export should use the accepted profile/target and existing Godot packaging path, with clear template/toolchain discovery or setup guidance. The normal game developer should not perform a contributor SDK reseat to update their game. Any change to discovery/authority policy requires its focused ADR; do not bypass validation to shorten the instructions.
Current gododin run accepts a scene and the explicit last-known-good override;
its normal path builds debug unconditionally. gododin test runs repository
qualification tiers and refuses installed-authority projects. The clock consumer
therefore wrote its own publication copying, manifest inspection and image
identity environment setup to run application tests.
Extend the existing launcher, with one reviewed CLI contract, to support:
- explicit native build profile, selected scene or project script, and headless application runs;
- a clear separation between admitted engine launch options and application arguments; do not allow forwarded options to replace the authenticated executable, project path, selected publication or required identity checks;
- observable exit status and stdout/stderr suitable for a consumer's own tests;
- an inspectable identity report covering engine, native profile, publication and SDK, without making callers parse private manifests or set Host variables.
Decide exact syntax in implementation; these are requirements, not commands already accepted by the CLI. A native release profile does not turn the editor executable into an exported release engine: identify both in measurements. Keep repository qualification distinct from application testing; a public launch path is enough if it composes cleanly with ordinary test scripts.
The launcher contract above is implemented and verified (2026-09-26, macOS
recording host): gododin run --project-root <root> [--profile <debug|release>] [--scene <path> | --script <path>] [--headless] [--quit-after <frames>] [--env NAME=VALUE]... [--last-known-good] [-- application-args...],
with the identity line, exit-status propagation, and reserved-name env
refusals described in the status table. The engine's own -- user-argument
classification is the separation guarantee, so no Gododin-side parser has to
admit or reject engine options.
Store onboarding entry (incorporated follow-up)
The Asset Store onboarding findings are
incorporated into DX-1 (primary owner), DX-5 and DX-10; its detailed
requirements and acceptance criteria remain authoritative there. The
incremental DX-1 scope: one add-on/SDK installation contract that makes the
existing SDK installation path the store add-on's supported connect route
(resolve file ownership, version matching and migration in the existing
owners — editor_verify_addon/editor_install_workspace and the SDK's add-on
publication — with no second updater; record a focused ADR if accepted
ownership, discovery or update contracts change); an editor entry journey that
is useful in an ordinarily opened editor before any SDK is connected
(preserving the GODODIN_EDITOR_MODE guard so import/export subprocesses never
become interactive build sessions), validates a selected SDK and engine through
shared public tooling, and adopts the project through the existing owners; and
a repeatable store-ZIP packaging path over maintained source with the required
addons/ layout, license, guide, and no dangling .gdextension references.
Store discovery/installation precedes the DX-5 tutorial's first step. Actual
store submission and acceptance are recorded separately and never claimed from
packaging success.
Done: an unrelated installed consumer installs/adopts with tool-generated local setup, survives SDK relocation/upgrade through public commands, exports both profiles, builds/runs both profiles and executes a script test through public commands, propagates a deliberate failure, forwards arguments correctly, and preserves profile isolation, stale-build refusal and explicit last-known-good semantics. Scene/script paths are captured and validated. The adoption example uses it; the external clock's private launcher can be removed when that consumer adopts the new SDK. No sibling checkout is a test dependency.
DX-2 — Centralize engine-owner cleanup and useful diagnostics
Owners: authored lifecycle/catalog/bridge and Host owners, handwritten typed runtime/helper sources, Slime adapter, native components and lifecycle fixtures. Requirements: NAT-HOST, NAT-KIT, NAT-THR.
The generated godot.Owned_Ref(T) and older core/render owners currently lead
consumers to repeat release choreography. Authored deinit has no Godot call
capability; current examples arrange an explicit capability-bearing shutdown
before CPU cleanup. Preserve that authority boundary.
- Provide one appropriate generic owned-reference release path, with explicit last-reference destruction, null/repeated release behavior, failure retention and owner clearing. Reuse the metadata-derived typed operations; avoid adding another parallel handle hierarchy.
- Establish a reusable lifecycle path for engine-owned resources on normal close, scene removal, editor reconstruction/reload and partial initialization. First verify which supported Godot callback has valid authority at each point; add generated lifecycle support only where existing callbacks cannot fulfill the contract. Keep CPU-only deinit partial-safe and do not invent engine authority in a destructor or retain a callback capability.
- Migrate at least Slime and one staged-rendering consumer. Eliminate mandatory ad hoc GDScript cleanup where the supported lifecycle can own it; document any unavoidable explicit shutdown and make omission diagnosable.
- Replace opaque adapter integer failures with named errors and operation context while keeping hot paths cheap. Use already-admitted enums where sufficient; String signal work belongs to DX-4. Replace incidental child-index dependencies with explicit validated bindings where the scene requires them. These last two issues include consumer design choices, not only SDK defects.
Done: success, partial failure, repeated shutdown, scene removal and native editor reload have zero-owner evidence. A refused release retains an identifiable owner for safe recovery; it never silently loses ownership or calls Godot after its authority/lifetime ends. Document the short normal pattern and its failure rules.
DX-3 — A deep helper for retained MultiMesh submission
Owners: handwritten rendering helper layer and its generation/policy integration, current staging owner, Bunny, Boid, Rewind and the MultiMesh fixture. Requirements: NAT-KIT, NAT-BULK.
Factor the repeated acquire/configure/capacity/write/publish/submit/replace/retire sequence into one owner. Support the 2D and 3D layouts and optional instance data actually used by these consumers; validate stride, length, capacity and renderer conditions against the exact engine. Keep scene-owned mesh/RID borrowing distinct from resources the helper owns. A write view has an explicit validity interval.
Safety is the central acceptance condition: returning from
multimesh_set_buffer does not prove the engine released submitted storage.
The currently documented retained-write path needs direct render-thread
submission, disabled physics interpolation and a non-retaining renderer path;
per-instance access can introduce a CPU cache. Publication sequence numbers do
not drain a server queue or wait for GPU completion.
Make that supported fast-path contract explicit and checked where observable. For other configurations provide an explicitly selected safe copying path or a clear refusal; qualify the engine's retention/completion rules before reuse. Rotating a fixed number of buffers alone is not a lifetime proof. Keep copies, allocations, synchronization and thread transitions visible in names/docs.
Done: migrate at least two existing consumers, including 2D and 3D, without changing their algorithm or render workload. Prove resize/rebind, invalid layout, resource replacement, failure rollback, scene removal and reload. Use a distinct validation run for readback/getters so instrumentation does not silently enable a retaining CPU cache in the timed fast path. Measure API calls, allocation/copy costs and output correctness; retain direct generated/raw access.
Delivered (2026-09-26, macOS recording host). The facade template gains
MultiMesh_Stream — open/write/publish/submit/resize/
retire_pending/close/owned plus the MultiMesh_Layout pair (2D and 3D
transform, optional colors; custom data is refused as an unexercised layout).
The RID stays a scene-owned borrow the kit never frees; submit refuses a
submit with no new publication and names a scene-side RID invalidation
(rid_valid) before the engine call; resize runs create-first and keeps a
refusing retirement reachable; close retires pending and active stores and
touches nothing else. The staged store's retention constraints stay caller
constraints, per the existing staging contract. Eight facade unit tests cover
the cycle, the open refusals, and the resize adoption through the fake API,
which now records the allocate call's transform format and color/custom-data
flags.
Migrated consumers: Boid Flock (3D transform-only, setup/submit/set_count/
shutdown/verify) and Bunny Mark (2D transform-only, same set) — no algorithm
or workload change.
Completed with the gododin-devx-2026-09-26.4 reseat (2026-09-26, same host):
the migration exposed a real facade defect — open and resize passed
layout.colors into the engine allocate call's custom_data_format slot
while hardwiring color_format to false, so a colors layout would have
allocated an 8-float server buffer under a 12-float staged stride (harmless
for the transform-only flock/bunny, invisible to the original unit tests,
caught by the vendored 4.8-dev6 extension_api.json argument order). The
template now passes layout.colors to color_format and never custom data;
the fake API records the format and both flags, and the open/resize/cycle
tests assert them. Rewind Lab's three streams (Boxes, Circles, Statics — all
2D transform+color) and the MultiMesh fixture's Stream_Field (3D
transform-only) migrated onto MultiMesh_Stream with their algorithm,
workload, and observable behavior unchanged: setup/submit/submit_statics/
verify/shutdown/set_capacity go through the stream owner, the per-mesh
retiring staging slots collapse into the stream's own pending retirement, and
the GDScript drivers' pass sentinels are untouched. All five render consumers
(flock, bunny, slime, rewind_lab, multimesh fixture) generate, check, and
build accepted through the .5 CLI; rewind_lab's offline subsystem and eval
harnesses pass. Delivered through the gododin-devx-2026-09-26.4 reseat
(facade fix and migrations, 247 members) and superseded as the final closure
by the .5 reseat (adapters added, 249 members, manifest 51e099a6…); seven
installed projects re-attached and five rebuilt accepted at .5.
Engine-qualified (2026-09-27, same host, re-executed against the final
gododin-devx-2026-09-26.8 closure). The qualification's first engine run
caught a real facade-contract error: the template claimed submit names a
scene-side RID invalidation (rid_valid) before the engine call, but the
engine's RID.is_valid() is only a non-zero id check — a resource the scene
frees keeps its non-zero RID, so the resource-replacement scenario's submit
reached the server, which rejected it with its own Multimesh not found
diagnostic and no-oped the write while the staged store stayed intact. The
template now states the engine truth: the pre-call refusal covers zero or
unset RID handles, scene RID liveness stays a caller constraint like the
staged store's retention constraints, and close plus a fresh open is the
named recovery. The facade was regenerated
(GODODIN_RENDER_POLICY_WRITE_PASS, receipt 9483aa66…), the locked-tier
sentinel re-pinned, and the SDK reseated (the addon reload fix and the adopted-staging fix later
joined it as .8: prebuilt CLI gododin-devx-2026-09-26.3, sha
ce1df5c3…; SDK manifest 57b00e67…, lock edddbf08…, distribution
81daf97f…); seven installed projects re-attached and five render consumers
rebuilt accepted at every step. Executed on .6: the
installed current run and both executed exports pass
(GODODIN_MULTIMESH_INSTALLED_PASS current_run=installed exports=2; resize
1000→10000 adopted at 194 µs with both windows verifying bitwise), which also
qualifies the retention rule observably — 600+ submissions rewrite the same
staged store every frame and the post-window getter verify still matches the
last frame, so the engine's consumption is a copy and no render-thread
retention aliased the caller's store. The distinct readback campaign
(validated in its own process so no instrumentation can enable a retaining
CPU cache in the timed path) measured engine-copy p50 1818 µs against native
borrowed-view verify p50 255 µs over 200 rounds at 4000 instances with a
stable digest and zero owners at .8. The observable qualification legs all pass in
one dedicated run: staged_submit_verify; failure_rollback (the out-of-range
resize refuses −2, the live pair is untouched, the next submit and verify
succeed); resource_replacement (the stale RID is the engine's logged no-op,
close+reopen binds the replacement and recovers);
scene_removal_reload (cooperative shutdown retires the owner, the node is
destroyed, the class re-instantiates through ClassDB and a fresh setup
submits and verifies); physics_interpolation (the staged path verifies
bitwise with interpolation enabled, then the mode is restored for the
fast-path contract) — final zero-owner shutdown. Measurement at .8: staged submit
41.1 µs at capacity 1000 and 155.5 µs at 10000 against the per-instance
GDScript baseline's 202.9 µs and 1407.8 µs on the same host and run shape
(debug profile, windowed Forward+/Metal, one host, uncapped; the bracket
includes the producer fill, which dominates at 10000). No DX-3-specific
residual remains; the package 6/7 failure matrix and the Windows/Linux
real-host proofs stay recorded under DX-0.
DX-4 — Expand authored values where normal consumers need them
Owners: authored resolver, catalog/bridge/Host wire conversions, existing value fixtures, Native PRD and generated documentation. Requirements: NAT-DEV-002/003, property/signal ownership and precision requirements.
Generated engine-call coverage is already broad. The gap is types admitted in authored methods, properties and signals, not a need for another binding layer.
Signatures agreed (2026-09-27, macOS recording host), from the surveyed
admission surface: the authored resolver (tools/cataloggen/project_authoring.odin)
today admits bool/i64/f64/String plus admitted enums and bit-sets in property
fields, the same scalars/enums/flags plus borrowed class pointers in signal
payloads, and the method surface adds object borrows, owned references,
engine-object borrows, Packed_Bytes, Vector3, Packed_Float32, and
Packed_Vector3 (Type_Kind in tools/cataloggen/contracts.odin). The next
consumers establish four admissions, in this order: (1) Vector2 in method
parameters and returns, signal payload fields, and property fields — DX-8's
map positions and RL-4's contact events; (2) Packed_I64 result and query
forms — DX-8's stable identifiers returned in batch results, mirroring the
existing Packed_Float32 ownership shape (engine allocation, owned result,
borrowed query); (3) String signal payload fields — the coarse
completion/failure events RL-4, EX-VOXEL, and DX-8 need, lifting ADR 0050
decision 10's refusal with those consumers as the fixtures (borrowed for the
emit, retained by no one); (4) nothing further — Color/transform/RID
authored-member forms stay refused until a consumer establishes the need, and
generated API access already covers them where that suffices. The
implementation belongs to the next SDK reseat window; this paragraph is the
agreement it generates against, and each admitted cell still records type,
member position, direction, precision/range, nullability, owner, borrow
duration, copying and release with its fixture evidence.
Agree the next consumers' signatures first, then implement a coherent matrix:
- Common 2D values, starting with
Vector2, in the method/configuration/event positions the adoption and logistics examples need. - Packed numeric query/results, starting with float and vector buffers and integer identifiers where the batch query uses them. Account for engine allocation/copying; result ownership is not an input callback borrow.
- String event payloads for useful coarse completion/failure feedback.
- Color/transform and engine resource/RID binding forms only where those consumers establish a concrete need. Preserve safe generated API access where an authored-member form is not needed; do not promise every built-in in every position.
For each admitted cell record type, member position, direction, precision/range, nullability, owner, borrow duration, copying and release. Property persistence, reload restoration and signal payload lifetimes need their own evidence. Rejected forms keep source-located diagnostics. Workers own snapshots, never engine borrows.
Done: the matrix, implementation, docs and actual consumers agree; tests exercise empty/large data, invalid inputs, mutation/detachment, callback exit, property save/reopen, signal delivery and cleanup. Pure algorithms still accept plain Odin records/slices. Flat GPU data remains a good representation for bulk hot loops.
DX-5 — A small existing-game adoption example
Owners: a new compact project under examples/, existing initializer/installed
consumer harness, getting-started and example index. Requirements: BLD-DEV,
NAT-DOC, NAT-INT.
Use the clock experiment, or an equally small scene, to teach one complete incremental adoption: start with a working Godot game, keep its scene/rendering and optimized GDScript baseline, move one substantial batch operation to a pure Odin package, and bind it through a small native class. A procedural source/bake asset path should retain its attribution and reproducible settings if imported from the clock. Do not require machine-local sibling folders or duplicate the whole six-implementation comparison inside this SDK.
DX-5 begins from store-shaped installation per the onboarding follow-up: the tutorial's first step is installing and enabling the add-on in an ordinarily opened editor, not a manual setup guide.
Show saved native settings, useful errors, one intentionally broken edit and repair, native editor reload, explicit game restart, public application tests and debug/release exports. Document file responsibilities and the remaining adapter cost. Reuse DX-1–DX-4 where their mechanisms fit; do not add artificial APIs to show every feature.
Done: an unrelated directory and immutable SDK reproduce the tutorial without private image variables, publication copying or contributor fixtures. Code samples are the actual runnable sources. The before/after comparison holds scene, algorithm, shaders and rendering constant and makes no unmeasured speedup claim.
DX-6 — Finish the already-planned examples
The original integration plan owns all detailed acceptance, ownership and responsiveness conditions. Implement its packages; existing worker, baking and demo receipts do not close these new behaviors.
| Package | Remaining visible result |
|---|---|
| CL-1 ✅ | Saved native settings and a small generated cave that a Godot player can explore; background/cancel, completion and safe scene/collision installation — delivered 2026-09-28 (Windows journey) |
| CL-2 ✅ | Classification of the actually accepted grid, candidate identity preservation, Godot clearance/reachability, pickups/exit, and painted refinement — delivered 2026-09-29 (Windows journey) |
| CL-3 ✅ | Shared/unique settings Resources, saved masks and markers with undoable authoring, applied settings, responsive supervised baking, and the same playable consumer for baked content, including exported play — delivered 2026-09-29 (Windows journey) |
| CL-4 ✅ | Finished author→generate→explore→refine→bake journey (windowed, no code edits), visible mask/candidate editing, focus-safe HUD, editor reload with unsaved work preserved, explicit scenario restart, and matching debug/release exports — delivered 2026-09-29 (Windows journey) |
| EX-BOID | A saved visible Godot predator actor plus authored settings driving native steering |
| EX-BUNNY | Shared saved settings/presets for every comparison arm |
| EX-SLIME | Godot-authored nutrient masks, checked-in inputs and explicit native ownership/reset behavior |
| EX-VOXEL | Native world settings and one coarse committed-edit event only after all affected visible chunks are committed |
| RL-4 | Contacts drive an impacted signal and Godot audio/shake; run-twice HUD and the documented GDScript baseline |
| RL-5 | Complete Rewind reload/journey/receipt/documentation work and clean teardown |
Preserve bounded requests/results, latest-result publication, grid/collision consistency, safe physics-frame commit, and the original 128² playable preset. Retain large computational workloads in the Lab rather than creating a giant playable physics world. The original latency/frame budgets are acceptance targets, not existing measurements. Rewind's interleaving and determinism limits remain explicit; RL-6 is optional, and this plan does not promote it to required.
Done: each package has its original acceptance evidence and updated example README. The suite demonstrates results affecting ordinary Godot gameplay and authoring, not just a native benchmark with a display.
DX-7 — Maintain fair GDScript/native performance comparisons
Owners: Bunny/Boid/adoption baselines, existing eval harnesses and READMEs.
Bunny's canonical GDScript path uses sprites; Boid's uses per-instance transform updates. They are useful architecture comparisons but cannot alone isolate the benefit of Odin with the same rendering path. Preserve their lessons and add maintained optimized GDScript bulk baselines.
- Bunny should expose GDScript per-node, native per-node, GDScript bulk and native bulk with shared assets/settings. Boid and the adoption example need matched GDScript/native bulk arms with equivalent algorithms and data flow.
- Match population, seed, fixed step, algorithm, precision contract, buffer layout, shader/triangle work, culling, draw path and render settings. If Godot representation imposes a cost, count it rather than inventing a workaround on only one arm. Validate results against a stated exact or tolerance-based oracle.
- Keep kernel, language boundary, staging/submission, engine rendering and presentation waits separate. Count foreign calls, allocations and copied bytes. Recheck retained-storage constraints when adding diagnostic readback.
- Record actual framebuffer dimensions, renderer/backend, AA, VSync/FPS cap, window focus, engine executable, native profile, SDK/artifact, hardware and warm-up. Run repeated uncapped capacity tests and useful capped 60/120 Hz efficiency tests; report frame-time distributions, CPU and GPU data where available. Do not equate CPU process time with latency or infer energy from FPS.
Done: committed harnesses reproduce the maintained comparisons, correctness checks precede timing, and documentation distinguishes language/FFI gains from algorithm/rendering gains. Historical receipts remain historical; measure new arms before ranking them. No assumption that a larger game necessarily widens Gododin's advantage.
DX-8 — A compact logistics or tactical simulation
Owners: a new example and its pure subsystem, with existing tools/helpers.
Build one small complete loop: a Godot map with selectable workers, job sources and delivery destinations; Odin owns routing, job assignment, inventory and fixed simulation ticks. Godot owns map authoring, input, selection, UI, animation and presentation. Use explicit stable IDs, batches/snapshots and coarse events; avoid an engine call or signal per agent per tick.
Start single-threaded. Add cancellable background routing only if measured responsiveness warrants it, through existing ownership rules. A modest playable preset, pause/step/reset, saved settings and inspectable queues are enough. Include a GDScript oracle or matched small reference workload for algorithm correctness, not an arbitrarily weak performance strawman.
Done: native decisions visibly affect the Godot game, deterministic replay for the stated environment or a precise numerical contract is tested, queues/capacity and cleanup are bounded, and native editor reload plus exported play work. This demonstrates CPU-authoritative gameplay that cannot be replaced by merely moving the display transform to a shader; it introduces no reusable game framework.
DX-9 — Extend Slime with a CPU/GPU comparison
Owners: existing Slime example, Godot shader/RenderingDevice resources and its measurement harness. This is a separate increment after EX-SLIME. The older integration plan correctly excludes a GPU rewrite from its bounded mask lesson.
Add an explicitly selected GPU simulation variant alongside the native CPU variant. Share nutrient input, population, seed policy, step rate, grid size and presentation. Keep shader source in Godot's shader language/resources; Odin may own measured preparation or dispatch choreography without becoming a renderer.
State numerical/algorithm differences before comparing: parallel deposits, reduction order or races may change the model. Use a deterministic or tolerance-bounded validation workload with a defensible contract. If equivalence cannot be maintained, label the variant a different model and do not call its FPS a language speedup.
Measure simulation, upload, dispatch, presentation and any CPU query/readback. Show a GPU-resident visual mode and, if gameplay needs CPU results, its explicit readback cadence/cost. Keep that cost visible rather than timing only the asynchronous dispatch. Declare the renderer/capability requirement and handle unsupported configurations; qualify each claimed path with actual rendering.
Done: the example answers when CPU ownership is useful, when GPU residency wins, and what transfers cost, with inspected output and reproducible capped/uncapped measurements. It promises no cross-platform bitwise GPU determinism.
DX-10 — Close the integrated product and documentation loop
Owners: current release, installed-consumer, editor/render/export fixtures, standing docs/skills and the qualification audit.
- Publish coherent immutable SDKs at the consumer milestones using current release tooling. Qualify affected installed workflows and matching exports under C1–C5; do not create a second gate system or repack for every small edit.
- Verify the store deliverable with its selected SDK per the onboarding follow-up: the exact add-on ZIP exercised through a clean editor, listing material and disclosures prepared from the implemented artifact, and actual submission/acceptance recorded as separate events.
- Keep the short user path, CLI help, Native PRD admission table, helper lifetime reference, example READMEs, API design and the Gododin skills aligned with implemented behavior. Add runnable snippet coverage where it prevents actual consumer drift; do not mirror prose in low-value tests.
- Execute the compact usage documentation plan for the public guide, consolidating overlapping instructions as each chapter is written. That plan owns chapter structure and explanatory diagram work; this package retains publication and qualification ownership.
- Repeat the DX-5 installation-to-export journey from a clean consumer directory and report the DevX observations defined above. Remove remaining avoidable setup/administrative code at its proper owner; do not declare success merely because a maintainer who knows the private artifacts can make the demo run.
- Link evidence from this ledger and the old plans. Close completed packages individually; retain precise real-host residuals under the desktop plan. Native, editor, reload, renderer, installed SDK and export qualifications are separate. C5 still requires clean-machine release evidence.
- Preserve historical measurements and actual artifact provenance. New source, renderer or SDK identity needs the applicable fresh proof; a lock reseat is not itself a rerun of every old measurement.
Full completion requires DX-0–DX-9 delivered with their named evidence, standing docs and installed consumer experience consistent, and all required qualification gates passed. “Locally complete with platform work remaining” is an honest interim status, not full plan/product completion; list each open gate explicitly. The final report must list measured gains and limits, commands run, publication identity, remaining host-specific work and where to resume.
Documentation reconciliation delivered with this plan
The 2026-09-26 documentation pass corrects stale claims about deferred editor reload, pending dev6 integration, completed phase coverage and the example count. It distinguishes generated engine API coverage from authored value admission, and pure worker ownership from callback authority. The original efficiency, example and Rewind plans keep their requirements and historical observations; their current status and next-session routing point here.
These changes provide no new runtime, performance or support evidence. The next implementation session must establish its own current baseline and update this ledger as each work package actually closes.