5.0 KiB
Development source handoff
tools/source_bundle.py assembles the five independently identified successor projects 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:
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:
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, addons/ai, addons/intel, addons/chat and addons/map, plus generated BUNDLE-README.md and BUNDLE-MANIFEST.json. The README explains opening the base/companion projects, the installed vanilla dependency, 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 five fixed identities in the tool. Dependencies are exactly vanilla plus the project's current successor dependency set. 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; external resource references must match docs/vanilla-resources.json. 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
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 five-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. Add this test to the existing tools/check.py test list when integrating.