Files
EscapistsReintroduced/docs/development-source-bundle.md
T
jakub cab998fb64 Combine Workshop addon and fix prison startup
Merge owned systems into one addon while preserving resource identities. Gate player admission on the replicated prison scene, restore the original framed door, and hold enemy AI until escape. Correct scenario branding and author metadata, include publishing assets, and retain regression and native verification evidence.
2026-09-20 16:42:52 +02:00

42 lines
5.0 KiB
Markdown

# Development source handoff
`tools/source_bundle.py` assembles the single combined successor project into a deterministic **DEVELOPMENT SOURCE BUNDLE**. This is an editable ZIP, not a native `.pak`, an engine build, a qualified release or a Workshop publication. It does not launch tools, load accounts or change acceptance records.
Preview is the default and writes no archive:
```sh
python3 tools/source_bundle.py
```
The JSON preview lists project identities/dependencies, payload count, byte size and SHA-256 of the exact ZIP it would write. An explicit destination creates a new archive, outside the source checkout, in an existing directory:
```sh
python3 tools/source_bundle.py --output /tmp/escapistsrereintroduced-development-source.zip
```
Existing destinations, symlinks, traversal and missing parent directories are refused. The complete payload is validated and assembled in memory first, then written to a temporary sibling and published with a no-overwrite atomic link. Validation/publication failures leave no new destination or temporary sibling. The command does not create output directories. Do not change the source tree while collecting a handoff; hashes are checked during collection, but this is not continuous filesystem surveillance.
## Included content and validation
The archive contains the exact authored bytes under `addons/core`, plus generated `BUNDLE-README.md`, `BUNDLE-MANIFEST.json` and `EXTERNAL-ADDONS.json`. The README explains opening the combined project, its vanilla and RHS/WCS dependencies, scenario identifiers, extraction into a new development folder and current validation limits. The manifest records all payload SHA-256 hashes (excluding its own self-reference), pinned project IDs/GUIDs and their complete dependency lists. No absolute source path, machine/user name or timestamp is embedded.
Project identities must match the maintained successor catalog and the single fixed identity in the tool. Dependencies are exactly vanilla plus the authorized RHS/WCS direct dependencies. Metadata GUIDs must be unique, refer to an included matching resource, and differ from vanilla identities. Referenced successor resources must be visible through the declared dependencies; vanilla and external resource references must match `docs/vanilla-resources.json` or the authorized `docs/external-addons.json` catalog. Original ecosystem symbols are rejected. These checks protect the known source structure; they cannot establish authorship or license rights for arbitrarily renamed/copied code. The repository's provenance review remains necessary.
The tool reuses the authored addon manifest helper, with a narrower packaging schema covering current text scripts, prefabs, configurations, world/layer, UI/material and resource metadata formats. An unknown asset format or unreviewed directory fails instead of silently dropping a newly required asset. Extend the reviewed schema when intentionally adding another asset kind. Vanilla assets are referenced, never copied from their installation.
Generated resource databases, `.pak`/`.log` files, `.git`, caches, profiles, runtime state, evidence, vendor/vanilla/original directories and other listed generated/private paths are excluded. Symlinks and nonregular source entries are refused. Repository documentation, original reference workspaces, accounts, engine installations, logs and evidence archives are not part of this payload. WORKBENCH-only native probes are included as authored addon source; their presence does not assert that they passed.
Sorted ZIP_STORED entries, fixed 1980 timestamps and fixed regular-file permissions make identical payloads produce identical bytes independent of source mtimes/permissions or output name. The manifest and external archive digest identify bytes, not publisher authenticity.
## Release requests remain gated
```sh
python3 tools/source_bundle.py --mode release --output /tmp/escapistsrereintroduced-qualified-source.zip
```
This invokes the existing `release_check.audit` before and after collection and refuses any outstanding gate. Current release acceptance is pending, so the command returns 1 without writing an archive. It cannot substitute development tests for the fixed release cases, modify the ledger or ignore native errors. Even a future fully passing audit still produces the same clearly labelled development source handoff, not an engine package or publication. Native build and distribution remain separate work.
## Tests
`python3 tests/test_source_bundle.py` exercises the real single-project tree in disposable copies: deterministic bytes and member hashes, timestamp/permission independence, exclusions, changed source, identity/dependency failures, resource visibility and metadata, unknown assets, symlinks/FIFOs, unsafe/case-colliding names, no-overwrite publication, publication cleanup, validation refusal with an output argument, concurrent collection mutation, preview and actual pending-release refusal. The tests create only temporary archives; no engine or network is used. This test is included in `tools/check.py`.