|
| 1 | +# Export Tooling Audit |
| 2 | + |
| 3 | +**Date:** May 9, 2026 |
| 4 | + |
| 5 | +This audit now covers both capture-related tooling and the broader non-game files that were leaking into shipping exports. It reflects the current preset configuration in `export_presets.cfg`, fresh Windows and Web rebuilds performed on May 9, 2026, browser-based verification of the new Web capture split, and the still-stale Android APK currently checked into `android/build/nekodash.apk`. |
| 6 | + |
| 7 | +## Pre-Ship Checklist |
| 8 | + |
| 9 | +- Rebuild every shipping target that is part of the release: `Windows Desktop`, `Web`, and `Android` when Android is shipping. |
| 10 | +- Review each fresh exporter log for `savepack: end` and verify there are no `Storing File:` entries for `tests/**`, `addons/gut/**`, `addons/ui_design_tool/**`, `addons/gui_auto_layout/**`, or the excluded dev-only `tools/*.gd` helpers. |
| 11 | +- Serve the shipping Web export and confirm `capture_ui=1&screen=options` stays inert instead of routing away from the normal main-menu flow. |
| 12 | +- Serve the `Web Dev Capture` export and confirm the same URL opens the requested capture screen, which verifies the `dev_capture` split still works. |
| 13 | +- Run the full GUT suite. |
| 14 | +- Run `tools/ui_snapshot_capture.gd`; if headless Windows skips screenshots because of the dummy renderer, run `tools/web_ui_snapshot_capture.ps1` against a served `Web Dev Capture` export and inspect the generated options, pause, and level-complete images. |
| 15 | +- For Android, confirm the APK timestamp changed before trusting any APK string probe or packaging result. |
| 16 | + |
| 17 | +## Current Preset Configuration |
| 18 | + |
| 19 | +- `Android`, `Windows Desktop`, and `Web` still use `export_filter="all_resources"`. |
| 20 | +- All three shipping presets now have expanded `exclude_filter` values that remove: |
| 21 | + - `tests/**` |
| 22 | + - `addons/gut/**` |
| 23 | + - `addons/ui_design_tool/**` |
| 24 | + - `addons/gui_auto_layout/**` |
| 25 | + - dev-only capture and snapshot scripts under `tools/` |
| 26 | + - editor-only helpers |
| 27 | +- A dedicated `Web Dev Capture` preset now exists with `custom_features="dev_capture"` and export output at `export/web-dev/index.html`. |
| 28 | + |
| 29 | +## Runtime Rules After The Split |
| 30 | + |
| 31 | +- `tools/playtest_capture.gd` still exists in the repo, but it is not autoloaded in `project.godot`. |
| 32 | +- `src/ui/web_capture_router.gd` remains autoloaded and therefore remains present in exports that include project autoloads. |
| 33 | +- `WebCaptureRouter` now always applies the Web viewport fix on HTML5 builds, but it only routes capture flows when all of the following are true: |
| 34 | + - the build has the custom feature `dev_capture` |
| 35 | + - the URL includes `capture_ui=1` |
| 36 | + - the requested screen is one of the known capture routes |
| 37 | +- Result: the shipping Web preset ignores `capture_ui=1`, while the `Web Dev Capture` preset still supports browser-driven snapshot routing. |
| 38 | + |
| 39 | +## Runtime-Required Exceptions |
| 40 | + |
| 41 | +These files are under tooling-style paths, but they are intentionally still shipped because gameplay or the platform shell depends on them: |
| 42 | + |
| 43 | +- `src/ui/web_capture_router.gd` |
| 44 | +- `tools/level_solver.gd` |
| 45 | +- `tools/web_custom_shell.html` |
| 46 | +- `addons/godot_ui_animations/UIAnimationHandler.tscn` |
| 47 | + |
| 48 | +`tools/level_solver.gd` is loaded by gameplay code, `tools/web_custom_shell.html` is the configured Web shell, and `addons/godot_ui_animations` is required by the `UIAnimation` autoload. |
| 49 | + |
| 50 | +## Pre-Fix Leakage |
| 51 | + |
| 52 | +Before the preset cleanup in this session, direct payload probes showed all three platforms shipping some combination of: |
| 53 | + |
| 54 | +- `tests/**` |
| 55 | +- `addons/gut/**` |
| 56 | +- `addons/ui_design_tool/**` |
| 57 | +- `addons/gui_auto_layout/**` |
| 58 | +- `tools/playtest_capture.gd` |
| 59 | +- `tools/playtest_m2_runner.gd` |
| 60 | +- `tools/playtest_runner.gd` |
| 61 | +- `tools/shell_polish_capture.gd` |
| 62 | +- `tools/shell_polish_playtest_capture.gd` |
| 63 | +- `tools/shell_smoke_capture.gd` |
| 64 | +- `tools/ui_snapshot_capture.gd` |
| 65 | + |
| 66 | +The root cause was not autoload registration. It was `all_resources` plus narrow excludes. |
| 67 | + |
| 68 | +## Post-Cleanup Packaging Status |
| 69 | + |
| 70 | +| Platform | Artifact status | Dev-only capture/test/editor tooling | Runtime-required exceptions | Notes | |
| 71 | +| --------------- | ---------------------------------------------- | ------------------------------------ | ---------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
| 72 | +| Windows Desktop | Fresh rebuild completed on May 9 | Not present in `savepack` output | Present | Export finished with pre-existing project warnings, but no `Storing File:` matches remained for `tests/**`, `addons/gut/**`, `addons/ui_design_tool/**`, `addons/gui_auto_layout/**`, or the excluded `tools/*.gd` helpers | |
| 73 | +| Web | Fresh rebuild completed on May 9 | Not present in `savepack` output | Present | Same packaging result as Windows Desktop | |
| 74 | +| Web Dev Capture | Fresh rebuild completed on May 9 | Same exclusions as shipping Web | Present | Adds only the `dev_capture` custom feature, not the excluded dev-only scripts | |
| 75 | +| Android | No fresh post-fix APK produced in this session | Post-fix status unverified | Stale APK still contains pre-fix leakage | `android/build/nekodash.apk` still has an April 3, 2026 timestamp and still exposes old leaked paths, so it cannot be treated as a post-fix result | |
| 76 | + |
| 77 | +## Capture-Related Files Still Ending Up In Shipped Builds |
| 78 | + |
| 79 | +For the fresh May 9 shipping rebuilds that were actually produced in this session: |
| 80 | + |
| 81 | +- `src/ui/web_capture_router.gd` still ships in Windows and Web because it is an autoloaded project script. |
| 82 | + |
| 83 | +For the currently checked-in Android APK on disk: |
| 84 | + |
| 85 | +- `assets/tests/**` |
| 86 | +- `assets/tools/playtest_capture.gd` |
| 87 | +- `assets/tools/playtest_runner.gd` |
| 88 | +- other pre-fix tooling strings still appear in the stale APK payload |
| 89 | + |
| 90 | +That Android APK is not a valid post-cleanup verification artifact. |
| 91 | + |
| 92 | +## Browser Verification Of The New Web Split |
| 93 | + |
| 94 | +Two direct browser probes were run against local servers: |
| 95 | + |
| 96 | +- Shipping Web export with `capture_ui=1&screen=options&delay_ms=5000` |
| 97 | + - Result: remained on the main menu |
| 98 | + - Evidence screenshot: `screenshots/export_audit/web_shipping_options_probe.png` |
| 99 | +- `Web Dev Capture` export with the same query string |
| 100 | + - Result: opened the options overlay as expected |
| 101 | + - Evidence screenshot: `screenshots/export_audit/web_dev_options_probe.png` |
| 102 | + |
| 103 | +This confirms that the runtime capture behavior is now behind the dedicated `dev_capture` feature rather than being available to the normal Web export. |
| 104 | + |
| 105 | +## Validation Notes |
| 106 | + |
| 107 | +- Full GUT suite after the change: 691 / 691 passing. |
| 108 | +- `tools/ui_snapshot_capture.gd` still hits the known headless dummy-renderer limitation on Windows and reports null-image skips. |
| 109 | +- The documented fallback `tools/web_ui_snapshot_capture.ps1` was run against the served `Web Dev Capture` export. |
| 110 | +- Fresh desktop screenshots were inspected for: |
| 111 | + - `options_desktop_web.png` |
| 112 | + - `pause_desktop_web.png` |
| 113 | + - `level_complete_desktop_web.png` |
| 114 | + |
| 115 | +## Evidence Methodology |
| 116 | + |
| 117 | +- For fresh Windows and Web exports, the exporter `savepack` log is the authoritative source for whether a file was packaged. |
| 118 | +- Raw `rg -a` probes against `.pck` files can still surface excluded paths from metadata such as `project.binary` or script caches, so they are useful for spot checks but not authoritative on their own. |
| 119 | +- For Android, the stale artifact timestamp is the decisive reason the current APK probe cannot be used as post-fix evidence. |
0 commit comments