ci(nightly-next): a content key and a record namespace of its own for the nightly app
Leo, 2026-10-26: "And I thought we were incremental. You keep saying, yeah, we're gonna do the incremental building. Nobody has come back with the incremental building results." Earlier: "like how fast can we just have it, like hot and incrementally built?... reusing as much as you can".
What this does (1 of 2)
This PR adds the key and the record namespace for reusing the cmux NEXT Nightly app. It changes no workflow behaviour; the follow-up PR wires it into nightly.yml.
-
job_input_fingerprint.py nightly-release-product: the DEV product's closure (the whole tree minus docs, tests and other products), keyed bynightly.ymlinstead ofcmux-next.yml. It also keys everydecideoutput that reaches the nightly build (NIGHTLY_PRODUCT_FLAGS, '' allowed), plus Xcode, the SDK, the arch, the recipe and the cmux-tui tree. The job's name is part of the key, so a nightly key never equals a DEV key. -
dev_release_product_reuse.py: lookup and record now take aLane.DEVholds the existing names and is the default for every caller, so DEV behaviour is unchanged.NIGHTLY_NEXTis its own lane:- records
cmux-nightly-next-release-product-*and archivescmux-nightly-next-release-archive-*; - workflow
nightly.yml, branchnightly-next,pushevents only; - producer job
build-nightly-app.
A DEV record is never a nightly product, and the reverse never happens either.
- records
Risk
Low. Nothing calls the new job or lane yet. DEV keys and lookups are byte-for-byte the same; tests/test_dev_release_product_reuse.py, tests/test_dev_release_product_key.py and tests/test_job_input_fingerprint.py pass unchanged.
Tests
tests/test_nightly_release_product_key.py (new) covers:
- key coverage: each decide flag, each toolchain value,
nightly.yml, app sources; - docs and tests not changing the key;
- the same tree keying the same;
- nightly and DEV keys differing;
- namespace separation in both directions;
- only nightly.yml push runs on nightly-next whose build-nightly-app succeeded being trusted.
Signals: none at runtime. The follow-up PR measures it.
Stacked follow-up: #25731 wires this into nightly.yml.
Agent session: agent session
š¤ Generated with Claude Code
![View with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/view-with-codesmith-dark-v3-3x.png)
![Autofix with [code]smith](https://pr-comments-assets.blacksmith.sh/codesmith/autofix-with-codesmith-dark-3x.png)
Need help on this PR? Tag @codesmith-bot with what you need.