Draft PR #49 is code-complete and merges conflict-free. All three automated gates were re-verified against current main on 2026-08-09 — cargo test 28 passed, npm test 133 passed (18 files), npm run check 0 errors / 0 warnings (352 files). The only thing blocking merge is the interactive smoke, which needs a watched GUI session and cannot be asserted headlessly.
Before you start
- Free port 8080. A
java process (pid 18576 at time of writing) holds it. The Audience app-plugin health-probes http://localhost:8080/health; with something else bound there an AUDIENCE failure is inconclusive, not a real fail.
- Start Docker. The Audience manifest is a managed-lifecycle plugin: it runs
docker compose -f docker-compose.prod.yml build against D:/MajorProjects/CURRENT/audience with a 20-minute timeout. Budget the time; a long wait is not a hang.
Checklist
Full version in spikes/SPIKE-RESULTS.md under "REMAINING HUMAN GATE", plus spikes/SPIKE-RESULTS-app-plugins.md for the P3 gates.
Dev run (npm run desktop, with CC_VIEW_PLUGINS_DEV, CC_PLUGIN_SDK, CC_APP_PLUGINS_DEV set):
- Switcher shows FLEET / PROJECTS / REFERENCE / AUDIENCE
- Fleet ops grid unchanged — this PR rewrites
App.svelte's content region; a regression here is the costliest outcome
- REFERENCE renders in a sandboxed iframe;
plugin-hello→ready completes
- A policed
launch round-trips; the command-ack rejection path fires; plugin makes no network requests
- AUDIENCE shows a native webview over the reserved rect
- Rect stays glued on resize / maximize / restore
- Park-on-overlay — stage a real launch; webview parks off-screen, overlay is unobstructed, webview restores alive (not reloaded)
- No orphaned webview switching AUDIENCE→FLEET→AUDIENCE; Fleet state preserved
- Gate 5 — quit the cockpit entirely, then
docker ps is clean. Also no orphaned fleetd-serve on :8787, no stray Vite on :5173
- Vite HMR still works under the new host CSP
Packaged run (npm run bundle, run the .exe directly): repeat 1, 3, 5, 7, 9. This is the only way to prove ccplugin:// resolves from packaged resources rather than dev roots.
Load-bearing
If 2, 7, 9, or the packaged run fail, keep #49 draft. Record PASS/FAIL in spikes/SPIKE-RESULTS.md, then mark ready.
Note item 9 (Gate 5) was never closed by the P3 spike and is tracked separately — see the P3 provenance note in #49.
Draft PR #49 is code-complete and merges conflict-free. All three automated gates were re-verified against current
mainon 2026-08-09 —cargo test28 passed,npm test133 passed (18 files),npm run check0 errors / 0 warnings (352 files). The only thing blocking merge is the interactive smoke, which needs a watched GUI session and cannot be asserted headlessly.Before you start
javaprocess (pid 18576 at time of writing) holds it. The Audience app-plugin health-probeshttp://localhost:8080/health; with something else bound there an AUDIENCE failure is inconclusive, not a real fail.docker compose -f docker-compose.prod.yml buildagainstD:/MajorProjects/CURRENT/audiencewith a 20-minute timeout. Budget the time; a long wait is not a hang.Checklist
Full version in
spikes/SPIKE-RESULTS.mdunder "REMAINING HUMAN GATE", plusspikes/SPIKE-RESULTS-app-plugins.mdfor the P3 gates.Dev run (
npm run desktop, withCC_VIEW_PLUGINS_DEV,CC_PLUGIN_SDK,CC_APP_PLUGINS_DEVset):App.svelte's content region; a regression here is the costliest outcomeplugin-hello→readycompleteslaunchround-trips; thecommand-ackrejection path fires; plugin makes no network requestsdocker psis clean. Also no orphanedfleetd-serveon:8787, no stray Vite on:5173Packaged run (
npm run bundle, run the.exedirectly): repeat 1, 3, 5, 7, 9. This is the only way to proveccplugin://resolves from packaged resources rather than dev roots.Load-bearing
If 2, 7, 9, or the packaged run fail, keep #49 draft. Record PASS/FAIL in
spikes/SPIKE-RESULTS.md, then mark ready.Note item 9 (Gate 5) was never closed by the P3 spike and is tracked separately — see the P3 provenance note in #49.