Updating Boxes
A Scrollcase release is an immutable snapshot of one program for one target. Updating it is therefore simple: change the source, give the box a new version, build, verify, and publish the new release. The old release remains valid, which makes side-by-side installation and rollback straightforward.
This is the same for every runtime. A box may start a Python script or module, a Node script, or a native binary; the update model does not change.
The short version
- If something declared by the scroll changes, build a new box release.
- Re-run
lockonly when the dependency environment changes. - Large deferred assets stay outside the archive and can be reused by hash.
- Files intentionally managed by the consuming application can change without rebuilding the box.
- Promoting or rolling back an existing release changes lifecycle state, not the release itself.
Start with what changed
Build a new release when changing files or declarations that are part of the box, including:
- Python or JavaScript entry points;
- a native executable;
- local configuration shipped in
localFiles; - the signed environment, execution arguments, self-test, pruning, labels or compatibility rules.
The dependency lock can stay as it is when the environment did not change. If a changed local file has an explicit SHA-256 pin, run scrollcase refresh after reviewing the change. Then increment the box version and build each affected target.
The user downloads the new archive. Deferred assets whose hashes did not change can be reused by the consuming application.
Choose where large or frequently changing files belong
There are three useful choices. The right one depends on whether the release must guarantee the exact file, not on whether the file happens to be a model weight, dataset, ruleset, dictionary, media bundle or another kind of program data.
Embed a file when the box must contain everything it needs:
"assets": [
{
"url": "https://downloads.example.org/data/rules-v1.bin",
"relativePath": "data/rules.bin",
"sizeBytes": 845211,
"sha256": "9f2b…3f"
}
]This is the simplest installation: one archive, no asset download at install time, and full air-gapped operation. The trade-off is equally direct: a new box archive contains the embedded file again, even when a code-only change left its bytes untouched.
Choose this for modest files, offline installations, or anything that must never be separated from the executable payload. See Offline / Air-Gapped Installs.
A rebuild is not necessarily a large transfer
Changing a deferred asset descriptor still requires a new box release because the descriptor is repeated in box.json and the signed release. The rebuilt archive does not contain that asset. Rebuild cost, archive download and asset download are three separate things.
Examples for each runtime
- Edit an entry-point
.pyfile: build a new box; keep the existing lock. - Upgrade Python, NumPy or another dependency: update and review the lock, then build.
- Keep a large model or dataset deferred when the release must identify its exact bytes.
- Pass a user-selected document or independently managed model path as an external input.
One box or several?
Use separate boxes when the application is coordinating separate executable programs: for example, a native preprocessing tool and a Python analysis service. The application can run each verified box and pass data between them through normal files, arguments, standard input or its own IPC.
Scrollcase does not define box-to-box dependencies, discovery or communication. Each box remains an independent release that can be updated and rolled back on its own.
Do not create a second box merely to hold data for the first one. A box is an executable runtime, not a data archive. For shared files, use a deferred asset when Scrollcase should verify them, or an external input when the application intentionally owns their lifecycle.
A safe consumer update
The consuming application keeps updates uncomplicated by installing side by side:
- select a signed release according to its channel and compatibility policy;
- download the new archive and verify it before extraction;
- extract into a fresh destination — consumer APIs refuse to overwrite an existing one;
- materialize deferred assets, reusing cached hashes where possible;
- verify the completed installation and perform the application's readiness check;
- activate it, while keeping the previous verified installation available for rollback;
- remove old versions later according to the application's storage policy.
This exposes either the complete old installation or the complete new one, never a directory being modified underneath a running process. The Node, Python and Rust consumer APIs provide the common local verification and execution semantics; Distributing Boxes covers channel selection and transport responsibilities.
Why there is no “accept changed bytes” flag
The signed size and SHA-256 are what make both verification and safe cache reuse possible. A flag that accepted different bytes behind the same URL would make one release mean different things on different machines.
When bytes are intentionally part of the release, update their descriptor and build a new release. When they intentionally change outside the release, model them as external input and verify them in the consuming application. Both paths are simple; neither requires weakening the box's guarantees.
Update checklist
| Change | New lock? | New box release? | What the user needs |
|---|---|---|---|
| Entry point, local code or signed configuration | No | Yes | New archive |
| Python, Node or environment dependency | Yes | Yes | New archive |
| Native binary only | No | Yes | New archive |
| Add a target | For that target | Build that target | New target archive |
| Embedded asset bytes or descriptor | No | Yes | New archive including the asset |
| Deferred asset bytes or descriptor | No | Yes | New archive plus assets with new hashes |
| Code changes; deferred assets stay identical | No | Yes | New archive; cached assets can be reused |
| External application input | No | No | Application updates the input |
| Promote an existing release | No | No | Updated channel policy or pointer |
| Roll back to an installed release | No | No | Reactivate the previous verified installation |
| Rotate signing keys | No | Not by itself | Update trust anchors safely; see Signing & Key Custody |
For automated target builds, the official GitHub Action runs the same build and verification pipeline in CI without taking ownership of upload or rollout.