Frontend package publication boundaries¶
Frontend plugins publish ordinary source-bearing Python wheels/sdists, not an independently prebuilt frontend release. Core explicitly assembles separate remotes from installed inputs. See the package contract and image workflow. The old original-wheel-pair reconstruction/receipt tools are no longer supported.
Local and CI checks¶
Use a compatible core checkout/image, Python 3.14, Node 22, Yarn 4.9.1 and matching
Chromium/system libraries. Owner source units run through core's common tooling;
private runtime and genuine test dependencies remain owner-locked. From /app
in a disposable prepared backend container, with the owner checkout available:
poetry run python devtools/frontend_ci.py --plugin /plugins/whitebox-plugin-NAME --output /opt/application-check
This explicitly selects one owner, runs its source suite, builds and installs its ordinary wheel, records the installed dependency bytes, then runs owner/contract App checks with explicit assembly. Demo Mode additionally runs the demo path. The gate mutates its disposable interpreter; do not use a shared installation. It neither publishes nor manufactures dependency release archives. Installed RECORD evidence proves current payload bytes, not original dependency wheel bytes. Successful source tests alone do not prove installed federation behavior.
The owner scope collects only that owner's applicable installed specs and core
bootstrap/transport checks; contract adds the shared-runtime probe. Controlled
specs live under federation/application/ and do not run in live/LambdaTest mode.
Dependency and support-only packages supply helper files without collecting their
specs in an owner gate. VideoJS's MP4 scenario additionally installs its ordinary
owner-packaged media fixture; Demo Mode's specific scenarios run with demo selection.
See adding an installed integration scenario
for placement and the distinct source/live/controlled modes.
The output's installed.json records the selected distributions and RECORD-owned
file hashes. logs/application/<scope>/generation.json records assembly inputs,
the physical generation ID and remote inventories; backend/session logs and
browser failure attachments sit under the same scope. Check the source-suite
output, installed selection and relevant scope results together. These inventories
are byte correspondence, not a signature or a promise of original archive provenance.
Plugin CI selects normal core main unless a feature MR explicitly supplies
KERNEL: #<branch>. That opt-in must agree with the plugin source branch, and a
missing explicitly selected core ref fails instead of falling back. Core must
already provide the shared CI templates and compatible assembly contract.
Publication retains ordinary Python conventions and checks out the exact
RELEASE_REVISION emitted by versioning, never a moving branch tip.
Publication ordering¶
Git refs and package uploads across repositories are not transactional. Publish the coordinated providers before consumers pin them; validate the installed set and fresh assembled image before publishing the consumer. The source-bearing owners and old standalone frontend core are incompatible, as are prebuilt-only owners and the new assembly core. Keep coordinated feature work isolated until compatible refs/packages are available; do not treat branch labels or version strings as proof of matching bytes or green CI.
Required-but-unavailable provider refs or packages block consumer checks. Resolve
that ordering explicitly rather than widening the gate to rebuild every dependency,
weakening admission, or enabling a startup compiler. Selecting a core branch for
a feature check does not authorize merging incompatible intermediate main.
Package publication, external CI/sandbox actions, deployments and MR/branch edits need their own approval. Local gates authorize none of those actions. Deployment uses a complete matched Python/tool/generation image, with worker restart and client reload; rollback restores that complete prior set, not merely a selector.