84 lines
9.7 KiB
Markdown
84 lines
9.7 KiB
Markdown
# Native packaging: successor and empty-addon control
|
|
|
|
The empty-addon control reproduced the same native UI resource-leak errors as both successor Core packaging attempts. It demonstrates that these errors do not require successor scripts, mission resources or gameplay execution in this installed Workbench/Proton environment. It does not establish whether Workbench itself, Proton, the headless display, or their interaction causes the leaks. No error has been filtered or downgraded; all three archived attempts remain failed and unqualified.
|
|
|
|
## Archived runs
|
|
|
|
| Evidence directory under `docs/evidence/` | Input authored files | Silent flag | Native child exit | Native packer output | Runner result |
|
|
| --- | ---: | --- | ---: | --- | --- |
|
|
| [package-2026-09-19-104634](evidence/package-2026-09-19-104634/package-report.json) | 177 | absent | 0 | Result 1; project successful; 193,353-byte `data.pak` | `timeout` |
|
|
| [package-2026-09-19-105949-silent](evidence/package-2026-09-19-105949-silent/package-report.json) | 178 | `-wbSilent` | 0 | Result 1; project successful; 194,044-byte `data.pak` | `validation-failed` |
|
|
| [package-control-2026-09-19-110404](evidence/package-control-2026-09-19-110404/package-report.json) | 5 | `-wbSilent` | 0 | Result 1; project successful; no PAK for empty content | `validation-failed` |
|
|
|
|
The first runner waited for the outer Gamescope process despite the recorded native zero exit, then reached its timeout. The later runner recorded `completion_observed=native-child-exited`, verified that the private Wine prefix was idle, and cleaned up the remaining owned display process. Their `launcher_exit_code=null` means the display had not naturally exited when observed; it is not a native exit failure or proof of a clean shutdown. All three reports record successful owned cleanup. Every console contains native errors and every native `error.log` is nonempty.
|
|
|
|
These are not strictly identical-source A/B experiments: four authored paths differ between the first and silent snapshots (`ERR_NativeMortarSalvoProbe.c`, `ERR_NativeSmoke.c`, `ERR_NativePoweredFlightProbe.c`, and `ERR_Observer.c`). The command also uses the improved child-exit recorder on the latter runs. The useful result is reproduction with the successor payload removed, not a claim that silence alone was isolated or fixes shutdown.
|
|
|
|
## Control contents and loaded paths
|
|
|
|
The control's [authored-before.json](evidence/package-control-2026-09-19-110404/authored-before.json) contains exactly the five own `addons/{core,ai,chat,intel,map}/addon.gproj` descriptors. The [control-description.json](evidence/package-control-2026-09-19-110404/control-description.json) also inventories a `BUNDLE-README.md` in its preparatory bundle; that README is not in the native input's authored inventory. No successor `.c`, `.et`, `.conf`, world, composition or `.meta` payload was copied to the native control source. Own addon identities were retained solely for the private experiment.
|
|
|
|
All three console `Loaded addons` sections name exactly:
|
|
|
|
- Workbench's packed `./addons/core/core.gproj`, GUID `5614BBCCBB55ED1C`.
|
|
- Packed vanilla `profiles/core/addons/ArmaReforger/ArmaReforger.gproj`, GUID `58D0FB3206B6F859`, inside each private session's profile link.
|
|
- The private source `source/addons/core/addon.gproj`, GUID `2528466DE220D91C`.
|
|
|
|
The other four successor descriptors are listed as **available**, not loaded. The sessions are `/tmp/erri-native-package-core-20260919-1046`, `/tmp/erri-native-package-core-20260919-1100-silent`, and `/tmp/erri-empty-package-control-20260919-1104`. Their captured commands use only these copied source/output/profile/cache locations, `ResourceManager`, `-packAddon`, `-noBackend`, `-noSound`, and `-disableCrashReporter`; none starts a mission. The console mount paths contain no original Escapists project or actual successor source checkout.
|
|
|
|
The executable SHA-256 is identical in all three launch records: `7dd36ca1f662b0c13669a4f2f7f10e3c461c2906b021e742272d64b3ab7e9798`. The captured Proton launcher SHA-256 is `05116cb33e020b6ae6fd8578e7d59f082ffd5b4530d6ae7cdbe948ba96406332`. This pins the recorded executable/script, not every host library, Wine-prefix file or platform component.
|
|
|
|
## Exact error comparison
|
|
|
|
For each archived `console.log.txt`, select lines containing `(E):` or `(F):` and remove only the leading `HH:MM:SS.mmm` plus adjacent whitespace. Preserve severity, resource path case, counts and the remaining text. Each console has **25 error lines: one leak header plus 24 distinct resource entries**. The resulting sets and counts are identical across all three runs. The lexicographically sorted set joined with LF and a final LF has SHA-256 `0cb40e173c7a02f72123cfc568016556f05fe80457f06cabf6423cc6ce309c60`.
|
|
|
|
The same native lines are repeated in each `error.log`; the aggregate runner `errors` list includes both files and its additional `Nonempty native error.log` check. Those duplicate representations must not be misreported as 48 distinct leaked resources. No successor-specific error appears in the compared native error set:
|
|
|
|
```text
|
|
RESOURCES (E): ==== Resource leaks ====
|
|
RESOURCES (E): UI/Fonts/RobotoCondensed/RobotoCondensed_Regular.edds 1
|
|
RESOURCES (E): UI/Imagesets/Panels/Outline/panels_roundedOutline_atlas.edds 1
|
|
RESOURCES (E): UI/Imagesets/Panels/Shadow/panels_fadedBackground-16-100_atlas.edds 1
|
|
RESOURCES (E): UI/Imagesets/Panels/panels_roundedCorners_atlas.edds 1
|
|
RESOURCES (E): UI/Imagesets/WeaponInfo/panel_style_magazines.edds 1
|
|
RESOURCES (E): UI/Imagesets/debugUI.edds 1
|
|
RESOURCES (E): UI/Imagesets/default.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_move_camera_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_objective_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_place_geometry_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_place_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_raw_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_rotate_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_select_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_transform_disabled_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_transform_geometry_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_transform_snap_disabled_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_transform_snap_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_transform_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_wait_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/arrow_waypoint_uiuc.edds 1
|
|
RESOURCES (E): UI/Textures/Cursor/cursors_atlas.edds 1
|
|
RESOURCES (E): UI/Textures/WidgetLibrary/ScrollBarRectangles.edds 1
|
|
RESOURCES (E): ui/fonts/robotomono_msdf_28.edds 1
|
|
```
|
|
|
|
Normalization here serves comparison only. It does not alter any archived log, runner result, release check, or runtime acceptance rule.
|
|
|
|
## Source integrity and PAK inspection
|
|
|
|
For each run independently, the parsed maps in `authored-before.json`, `repository-after.json`, `evidence/core/authored-after.json`, and `evidence/core/launch.json`'s `authored` field are exactly equal. This verifies the recorded authored input and copied source at the measured boundaries; it does not prove that a transient mutation and restoration could never occur. All entries in each `archive-sha256.json` were rehashed successfully, and the corresponding archived files in STAGE and the actual successor repository were byte-identical when this comparison was prepared.
|
|
|
|
The first Core PAK was independently re-read using `tools/pak_inventory.py` without extracting payload files. Its SHA-256 is `a071b5a7298543734bb72c72bb87c0dbfc447b3a176870299abd0a3def4fe623`. All **107 entries** have paths and decompressed content hashes exactly matching `addons/core/<entry path>` in that run's archived launch source map. The source map's remaining Core paths are 22 `.meta` files and `addon.gproj`; the latter is a separate native package output with the matching SHA-256 `231274e6b62302f32c65f9ff31de2ce8a9e51e1c8d12c87deeec82ae1f40de46`. This is source-byte and archive-structure evidence, not proof that all required resources were compiled correctly or that the resource database resolves them in the game.
|
|
|
|
The silent PAK has a different recorded hash, `90b9be4f8799e6a60a0b12582f93634ceec3a1c01b816a8f4c7358d0a75e1ae9`, and is not interchangeable with the first source snapshot. No reproducible-build claim follows from these different inputs. The empty control produced only the project descriptor and an 81-byte resource database; its successful native packer marker is not evidence of a usable addon archive.
|
|
|
|
## Qualification remains blocked
|
|
|
|
The control narrows investigation to the common tool/environment shutdown path and removes the need to attribute these exact leaks to successor gameplay. It does not fix them, qualify either Core PAK, verify package resource semantics, prove native loading from packed-only addon dependencies, or validate multiplayer/performance acceptance. All three reports retain `candidate_created=false`, `native_consumption_verified=false`, and `release_qualified=false`. A subsequent clean build and explicit packed-only runtime consumption test are still required; this document introduces no exception to that gate.
|
|
|
|
## Raw console hashes
|
|
|
|
- [package-2026-09-19-104634 console](evidence/package-2026-09-19-104634/profiles/core/logs/logs_2026-09-19_10-46-34/console.log.txt): `544206ae74f74a508639a35990004082c075d369add867c0859f2c8397aecfdb`.
|
|
- [package-2026-09-19-105949-silent console](evidence/package-2026-09-19-105949-silent/profiles/core/logs/logs_2026-09-19_10-59-49/console.log.txt): `bc930e6874b0a6c055535c432c9ea1d22c70737813d31aa5fe31c167f9947036`.
|
|
- [package-control-2026-09-19-110404 console](evidence/package-control-2026-09-19-110404/profiles/core/logs/logs_2026-09-19_11-04-04/console.log.txt): `312aa588ce18762ac7ba8543f189e991094319181fa39633557088bdb772267f`.
|