Resolves #14765
Adds keeper-owned pane chrome around materialized create-module widgets: the pane owns title/dispose/promote controls, while the live child keeps the original instanceId as the mutation target. The registry now stores paneRef for lifecycle teardown and uses record.set() for title/state changes so provider record-field bindings update instead of drifting from direct property writes.
Evidence: L2 local harness coverage and direct Node probes achieved for the keeper-pane ACs; L3 live popup/window promotion remains post-merge/manual because this slice exposes the injected render-target seam rather than a concrete popup surface.
Deltas from ticket
Promote is implemented as an injected render-target seam (promoteTarget.add(pane)) with unit-level proof. That preserves the shared-worker "windows are render targets" topology while leaving a concrete live popup/window surface to the surface-integration follow-up lane.
Test Evidence
npm run agent-preflight -- --no-fix apps/agentos/view/create/CreatedPane.mjs apps/agentos/view/create/store/CreatedInstances.mjs apps/agentos/view/create/util/acceptPath.mjs test/playwright/unit/apps/agentos/create/acceptPath.spec.mjs test/playwright/unit/apps/agentos/create/createSurface.spec.mjs passed on rebased head.
node --check apps/agentos/view/create/CreatedPane.mjs
node --check apps/agentos/view/create/store/CreatedInstances.mjs
node --check apps/agentos/view/create/util/acceptPath.mjs
node --check test/playwright/unit/apps/agentos/create/acceptPath.spec.mjs
node --check test/playwright/unit/apps/agentos/create/createSurface.spec.mjs
git diff --check and git diff --cached --check passed before commit.
- Direct accept-path probe passed:
{"accepted":true,"ntype":"agentos-created-pane","contentNtype":"grid-container","paneRef":"ap-probe-current-pane","destroyedId":"ap-probe-current-pane","disposed":true,"state":"disposed"}.
- Direct CreatedPane probe passed:
{"active":null,"before":"Before","after":"After","promoted":true,"targetMoved":true,"recordState":"disposed","paneDestroying":true}.
- Focused Playwright unit command attempted:
npm run test-unit -- test/playwright/unit/apps/agentos/create/acceptPath.spec.mjs test/playwright/unit/apps/agentos/create/createSurface.spec.mjs --reporter=line --workers=1; local runner emitted only the Playwright invocation and stalled for 60 seconds, then was stopped with Ctrl-C. This is not counted as passing evidence.
Post-Merge Validation
Commit
932195e284 — feat(agentos): add keeper created pane chrome (#14765)
Authored by Euclid (GPT-5, Codex Desktop). Session 6439a7c5-5f2f-4658-9226-835c317c7a0b.
Resolves #14765
Adds keeper-owned pane chrome around materialized create-module widgets: the pane owns title/dispose/promote controls, while the live child keeps the original
instanceIdas the mutation target. The registry now storespaneReffor lifecycle teardown and usesrecord.set()for title/state changes so provider record-field bindings update instead of drifting from direct property writes.Evidence: L2 local harness coverage and direct Node probes achieved for the keeper-pane ACs; L3 live popup/window promotion remains post-merge/manual because this slice exposes the injected render-target seam rather than a concrete popup surface.
Deltas from ticket
Promote is implemented as an injected render-target seam (
promoteTarget.add(pane)) with unit-level proof. That preserves the shared-worker "windows are render targets" topology while leaving a concrete live popup/window surface to the surface-integration follow-up lane.Test Evidence
npm run agent-preflight -- --no-fix apps/agentos/view/create/CreatedPane.mjs apps/agentos/view/create/store/CreatedInstances.mjs apps/agentos/view/create/util/acceptPath.mjs test/playwright/unit/apps/agentos/create/acceptPath.spec.mjs test/playwright/unit/apps/agentos/create/createSurface.spec.mjspassed on rebased head.node --check apps/agentos/view/create/CreatedPane.mjsnode --check apps/agentos/view/create/store/CreatedInstances.mjsnode --check apps/agentos/view/create/util/acceptPath.mjsnode --check test/playwright/unit/apps/agentos/create/acceptPath.spec.mjsnode --check test/playwright/unit/apps/agentos/create/createSurface.spec.mjsgit diff --checkandgit diff --cached --checkpassed before commit.{"accepted":true,"ntype":"agentos-created-pane","contentNtype":"grid-container","paneRef":"ap-probe-current-pane","destroyedId":"ap-probe-current-pane","disposed":true,"state":"disposed"}.{"active":null,"before":"Before","after":"After","promoted":true,"targetMoved":true,"recordState":"disposed","paneDestroying":true}.npm run test-unit -- test/playwright/unit/apps/agentos/create/acceptPath.spec.mjs test/playwright/unit/apps/agentos/create/createSurface.spec.mjs --reporter=line --workers=1; local runner emitted only the Playwright invocation and stalled for 60 seconds, then was stopped with Ctrl-C. This is not counted as passing evidence.Post-Merge Validation
Commit
932195e284—feat(agentos): add keeper created pane chrome (#14765)Authored by Euclid (GPT-5, Codex Desktop). Session 6439a7c5-5f2f-4658-9226-835c317c7a0b.