From 577dce4323176dc13da0aa897a7759fd1c145cf3 Mon Sep 17 00:00:00 2001
From: Paul Bakaus
Date: Mon, 17 Aug 2026 18:57:45 -0700
Subject: [PATCH] Oracle: live-mode cases and goldens (roots, inject, wrap,
insert, accept, session, manual edits, daemon)
Prepared with AI assistance (Claude Code).
---
tests/oracle/README.md | 32 ++++
tests/oracle/cases/live-accept.mjs | 165 ++++++++++++++++++
tests/oracle/cases/live-daemon.mjs | 45 +++++
tests/oracle/cases/live-manual.mjs | 80 +++++++++
tests/oracle/cases/live-roots.mjs | 124 +++++++++++++
tests/oracle/cases/live-session.mjs | 86 +++++++++
tests/oracle/cases/live-wrap.mjs | 94 ++++++++++
.../golden/live-accept-generated-file.json | 10 ++
tests/oracle/golden/live-accept-help.json | 9 +
.../live-accept-html-discard-then-accept.json | 21 +++
.../golden/live-accept-html-discard.json | 11 ++
.../live-accept-html-malformed-params.json | 11 ++
.../golden/live-accept-html-no-css-block.json | 11 ++
.../golden/live-accept-html-no-params.json | 11 ++
.../live-accept-html-receipt-conflict.json | 27 +++
.../live-accept-html-receipt-replay.json | 21 +++
.../live-accept-html-variant-1-range.json | 11 ++
.../live-accept-html-variant-2-steps.json | 11 ++
.../live-accept-html-variant-3-toggle.json | 11 ++
.../live-accept-html-variant-missing.json | 10 ++
.../oracle/golden/live-accept-invalid-id.json | 9 +
.../live-accept-invalid-variant-regex.json | 9 +
.../golden/live-accept-invalid-variant.json | 9 +
.../golden/live-accept-jsx-discard.json | 13 ++
.../golden/live-accept-jsx-from-subdir.json | 13 ++
.../golden/live-accept-jsx-variant-1.json | 13 ++
.../live-accept-jsx-variant-3-toggle-off.json | 13 ++
.../golden/live-accept-markers-not-found.json | 9 +
.../oracle/golden/live-accept-missing-id.json | 9 +
.../oracle/golden/live-accept-need-mode.json | 9 +
.../live-accept-no-page-url-keeps-buffer.json | 12 ++
.../live-accept-scrubs-buffer-for-page.json | 12 ++
.../golden/live-accept-source-locked.json | 10 ++
.../live-accept-source-shadow-deprecated.json | 11 ++
.../live-accept-stale-lock-dead-pid.json | 10 ++
.../live-accept-svelte-component-accept.json | 24 +++
.../live-accept-svelte-component-discard.json | 30 ++++
...ccept-svelte-component-styled-variant.json | 24 +++
...cept-svelte-component-variant-missing.json | 27 +++
...accept-svelte-fallback-source-wrapper.json | 22 +++
...ve-accept-svelte-insert-empty-variant.json | 24 +++
.../live-accept-target-missing-value.json | 9 +
.../live-boot-astro-config-missing.json | 9 +
.../golden/live-boot-config-invalid-json.json | 10 ++
.../live-boot-config-invalid-schema.json | 10 ++
.../live-boot-context-missing-both.json | 9 +
...ive-boot-context-missing-design-empty.json | 9 +
.../live-boot-context-missing-product.json | 9 +
tests/oracle/golden/live-boot-full-cycle.json | 30 ++++
.../golden/live-boot-html-config-missing.json | 9 +
.../golden/live-boot-monorepo-from-child.json | 10 ++
.../golden/live-boot-monorepo-from-root.json | 10 ++
.../live-boot-monorepo-no-git-from-root.json | 7 +
.../golden/live-boot-monorepo-target-eq.json | 10 ++
.../live-boot-monorepo-target-file.json | 10 ++
.../golden/live-boot-multi-app-selection.json | 7 +
.../golden/live-boot-multi-app-target.json | 11 ++
.../golden/live-boot-pointer-accumulates.json | 27 +++
.../live-boot-sveltekit-config-missing.json | 9 +
.../golden/live-boot-vite-config-missing.json | 9 +
.../golden/live-boot-vite-from-subdir.json | 7 +
.../live-boot-workspaces-from-child.json | 10 ++
.../live-boot-workspaces-selection.json | 7 +
.../golden/live-boot-workspaces-target.json | 10 ++
tests/oracle/golden/live-commit-help.json | 13 ++
.../golden/live-commit-invalid-buffer.json | 14 ++
.../golden/live-commit-mock-applied-page.json | 14 ++
.../live-commit-mock-default-result.json | 14 ++
.../oracle/golden/live-commit-mock-error.json | 14 ++
.../live-commit-mock-invalid-result-json.json | 14 ++
...ive-commit-mock-leftover-marker-check.json | 14 ++
.../golden/live-commit-mock-partial.json | 14 ++
...ve-commit-mock-then-discard-remaining.json | 24 +++
...ve-commit-mock-unreported-file-change.json | 14 ++
.../golden/live-commit-no-pending-page.json | 13 ++
.../oracle/golden/live-commit-no-pending.json | 13 ++
tests/oracle/golden/live-complete-clean.json | 11 ++
.../golden/live-complete-discard-alias.json | 11 ++
.../golden/live-complete-discarded.json | 11 ++
.../oracle/golden/live-complete-error-eq.json | 11 ++
.../live-complete-error-no-message.json | 11 ++
tests/oracle/golden/live-complete-error.json | 11 ++
tests/oracle/golden/live-complete-help.json | 9 +
tests/oracle/golden/live-complete-no-id.json | 9 +
...lete-source-dirty-carbonize-leftovers.json | 10 ++
.../live-complete-source-dirty-force.json | 11 ++
.../golden/live-complete-source-dirty.json | 11 ++
.../live-complete-source-in-node-modules.json | 11 ++
.../live-complete-source-missing-file.json | 11 ++
tests/oracle/golden/live-complete-twice.json | 21 +++
.../golden/live-complete-unknown-session.json | 11 ++
...ve-daemon-server-status-poll-complete.json | 95 ++++++++++
tests/oracle/golden/live-discard-all.json | 14 ++
tests/oracle/golden/live-discard-empty.json | 14 ++
tests/oracle/golden/live-discard-help.json | 13 ++
.../golden/live-discard-invalid-buffer.json | 14 ++
.../golden/live-discard-page-bare-flag.json | 14 ++
.../golden/live-discard-page-no-match.json | 14 ++
tests/oracle/golden/live-discard-page.json | 14 ++
tests/oracle/golden/live-discard-twice.json | 24 +++
tests/oracle/golden/live-help.json | 7 +
.../live-inject-anchor-missing-all.json | 11 ++
.../golden/live-inject-astro-inline.json | 22 +++
.../golden/live-inject-check-env-config.json | 7 +
.../live-inject-check-invalid-anchor.json | 7 +
.../live-inject-check-invalid-files.json | 7 +
.../live-inject-check-invalid-json.json | 7 +
.../golden/live-inject-check-missing.json | 7 +
tests/oracle/golden/live-inject-check-ok.json | 7 +
.../live-inject-csp-meta-no-connect-src.json | 12 ++
.../golden/live-inject-exclude-glob.json | 16 ++
.../golden/live-inject-file-not-found.json | 12 ++
.../live-inject-from-repo-root-via-roots.json | 30 ++++
.../live-inject-heals-orphan-journal.json | 14 ++
tests/oracle/golden/live-inject-help.json | 7 +
.../live-inject-html-repeat-and-remove.json | 35 ++++
.../golden/live-inject-html-tag-no-token.json | 12 ++
tests/oracle/golden/live-inject-html-tag.json | 14 ++
.../golden/live-inject-insert-after.json | 12 ++
.../golden/live-inject-missing-port.json | 9 +
...live-inject-monorepo-repo-root-ignore.json | 14 ++
tests/oracle/golden/live-inject-next-jsx.json | 22 +++
.../oracle/golden/live-inject-no-config.json | 7 +
.../golden/live-inject-nuxt-adapter.json | 26 +++
.../live-inject-nuxt-plugin-conflict.json | 21 +++
.../golden/live-inject-nuxt-srcdir.json | 13 ++
tests/oracle/golden/live-inject-port-nan.json | 9 +
.../golden/live-inject-remove-clean.json | 10 ++
.../golden/live-inject-sveltekit-adapter.json | 35 ++++
...live-inject-sveltekit-existing-layout.json | 23 +++
.../golden/live-inject-tanstack-adapter.json | 28 +++
...ve-inject-tanstack-component-conflict.json | 13 ++
.../live-inject-target-missing-value.json | 7 +
.../live-inject-token-from-server-json.json | 13 ++
...nject-token-server-json-port-mismatch.json | 13 ++
.../golden/live-inject-vite-csp-meta.json | 21 +++
.../golden/live-insert-astro-after.json | 11 ++
.../golden/live-insert-element-not-found.json | 9 +
.../live-insert-element-not-in-source.json | 9 +
.../golden/live-insert-file-is-generated.json | 9 +
tests/oracle/golden/live-insert-help.json | 9 +
.../oracle/golden/live-insert-html-after.json | 10 ++
.../golden/live-insert-html-before.json | 10 ++
.../golden/live-insert-html-deferred.json | 10 ++
.../live-insert-html-text-ambiguous.json | 10 ++
.../golden/live-insert-html-text-picks.json | 10 ++
.../golden/live-insert-invalid-position.json | 9 +
.../oracle/golden/live-insert-jsx-after.json | 12 ++
.../live-insert-jsx-before-deferred.json | 12 ++
.../oracle/golden/live-insert-missing-id.json | 9 +
.../golden/live-insert-missing-locator.json | 9 +
.../golden/live-insert-missing-position.json | 9 +
.../golden/live-insert-svelte-component.json | 17 ++
.../live-insert-svelte-env-disabled.json | 11 ++
.../oracle/golden/live-insert-vue-after.json | 10 ++
.../golden/live-poll-connection-refused.json | 10 ++
tests/oracle/golden/live-poll-help.json | 9 +
.../live-poll-no-server-stale-record.json | 9 +
tests/oracle/golden/live-poll-no-server.json | 9 +
.../golden/live-poll-reply-bad-data-json.json | 10 ++
.../live-poll-reply-connection-refused.json | 10 ++
.../golden/live-poll-reply-missing-id.json | 10 ++
.../live-poll-reply-missing-status.json | 10 ++
.../golden/live-poll-reply-status-as-id.json | 10 ++
.../golden/live-poll-reply-status-flag.json | 10 ++
.../golden/live-resume-accept-requested.json | 10 ++
tests/oracle/golden/live-resume-by-id-eq.json | 12 ++
tests/oracle/golden/live-resume-by-id.json | 12 ++
.../live-resume-carbonize-required.json | 10 ++
.../golden/live-resume-completed-only.json | 10 ++
.../live-resume-first-active-sorted.json | 12 ++
.../oracle/golden/live-resume-generating.json | 10 ++
tests/oracle/golden/live-resume-help.json | 9 +
.../golden/live-resume-manual-apply.json | 10 ++
.../golden/live-resume-mount-failed.json | 10 ++
tests/oracle/golden/live-resume-none.json | 9 +
.../oracle/golden/live-resume-unknown-id.json | 10 ++
.../golden/live-server-already-running.json | 10 ++
tests/oracle/golden/live-server-help.json | 9 +
.../golden/live-server-stop-no-config.json | 7 +
.../live-server-stop-none-keep-inject.json | 9 +
.../oracle/golden/live-server-stop-none.json | 10 ++
.../golden/live-server-stop-removes-tag.json | 10 ++
.../live-server-target-missing-value.json | 7 +
tests/oracle/golden/live-status-empty.json | 9 +
.../golden/live-status-from-subdir.json | 10 ++
.../oracle/golden/live-status-generating.json | 10 ++
.../live-status-legacy-sessions-dir.json | 9 +
.../golden/live-status-manual-apply.json | 10 ++
.../golden/live-status-many-sessions.json | 12 ++
.../golden/live-status-mount-failed.json | 10 ++
.../golden/live-status-stale-server-json.json | 10 ++
.../live-status-target-missing-value.json | 9 +
.../golden/live-target-missing-value.json | 7 +
.../golden/live-wrap-astro-deferred.json | 11 ++
tests/oracle/golden/live-wrap-astro.json | 11 ++
.../golden/live-wrap-element-not-found.json | 9 +
.../live-wrap-element-not-in-source.json | 9 +
.../live-wrap-file-element-missing.json | 9 +
.../golden/live-wrap-file-is-generated.json | 9 +
tests/oracle/golden/live-wrap-help.json | 9 +
.../golden/live-wrap-html-by-classes-tag.json | 10 ++
tests/oracle/golden/live-wrap-html-by-id.json | 10 ++
.../golden/live-wrap-html-by-query.json | 10 ++
.../golden/live-wrap-html-deferred.json | 10 ++
.../oracle/golden/live-wrap-html-eq-form.json | 10 ++
.../golden/live-wrap-html-explicit-file.json | 11 ++
.../golden/live-wrap-html-multiline.json | 10 ++
.../live-wrap-html-page-url-no-pending.json | 10 ++
.../oracle/golden/live-wrap-jsx-deferred.json | 12 ++
.../golden/live-wrap-jsx-mapped-item.json | 12 ++
tests/oracle/golden/live-wrap-jsx.json | 12 ++
tests/oracle/golden/live-wrap-missing-id.json | 9 +
.../golden/live-wrap-missing-locator.json | 9 +
.../live-wrap-monorepo-child-from-root.json | 10 ++
.../golden/live-wrap-no-text-first-match.json | 10 ++
.../live-wrap-pending-edits-ambiguous.json | 11 ++
.../live-wrap-pending-edits-applied.json | 11 ++
.../live-wrap-pending-edits-no-page-url.json | 11 ++
.../live-wrap-pending-edits-other-page.json | 11 ++
.../live-wrap-pending-edits-unrelated.json | 11 ++
.../live-wrap-svelte-component-each.json | 17 ++
...-wrap-svelte-component-refused-script.json | 11 ++
.../live-wrap-svelte-component-twice.json | 27 +++
.../golden/live-wrap-svelte-component.json | 17 ++
.../golden/live-wrap-svelte-env-disabled.json | 11 ++
.../golden/live-wrap-svelte-no-compiler.json | 11 ++
.../oracle/golden/live-wrap-tanstack-tsx.json | 11 ++
.../live-wrap-target-missing-value.json | 9 +
.../golden/live-wrap-text-ambiguous.json | 10 ++
.../golden/live-wrap-text-not-in-source.json | 10 ++
.../golden/live-wrap-text-picks-second.json | 10 ++
.../live-wrap-text-short-falls-back.json | 10 ++
.../golden/live-wrap-tsx-multiline.json | 12 ++
tests/oracle/golden/live-wrap-vue.json | 10 ++
tests/oracle/lib.mjs | 8 +-
tests/oracle/live-helpers.mjs | 158 +++++++++++++++++
.../live-astro/.impeccable/live/config.json | 5 +
tests/oracle/workspaces/live-astro/DESIGN.md | 12 ++
tests/oracle/workspaces/live-astro/PRODUCT.md | 8 +
.../workspaces/live-astro/astro.config.mjs | 3 +
.../oracle/workspaces/live-astro/package.json | 1 +
.../live-astro/src/layouts/Layout.astro | 14 ++
.../live-astro/src/pages/index.astro | 13 ++
.../live-html/.impeccable/live/config.json | 5 +
tests/oracle/workspaces/live-html/DESIGN.md | 12 ++
tests/oracle/workspaces/live-html/PRODUCT.md | 8 +
tests/oracle/workspaces/live-html/index.html | 25 +++
.../live-html/public/docs/guide.html | 13 ++
.../workspaces/live-html/public/no-body.html | 5 +
.../workspaces/live-html/src/cards.html | 14 ++
.../oracle/workspaces/live-monorepo/DESIGN.md | 12 ++
.../workspaces/live-monorepo/PRODUCT.md | 8 +
.../workspaces/live-monorepo/package.json | 4 +
.../website/.impeccable/live/config.json | 5 +
.../live-monorepo/website/index.html | 11 ++
.../live-monorepo/website/package.json | 7 +
.../live-monorepo/website/src/App.jsx | 22 +++
.../live-monorepo/website/vite.config.js | 4 +
.../live-next/.impeccable/live/config.json | 5 +
tests/oracle/workspaces/live-next/DESIGN.md | 12 ++
tests/oracle/workspaces/live-next/PRODUCT.md | 8 +
.../workspaces/live-next/app/layout.tsx | 17 ++
.../oracle/workspaces/live-next/app/page.tsx | 8 +
.../workspaces/live-next/next.config.js | 4 +
.../oracle/workspaces/live-next/package.json | 1 +
.../live-nuxt/.impeccable/live/config.json | 5 +
tests/oracle/workspaces/live-nuxt/DESIGN.md | 12 ++
tests/oracle/workspaces/live-nuxt/PRODUCT.md | 8 +
tests/oracle/workspaces/live-nuxt/app.vue | 10 ++
.../workspaces/live-nuxt/nuxt.config.ts | 4 +
.../oracle/workspaces/live-nuxt/package.json | 1 +
.../workspaces/live-nuxt/pages/index.vue | 6 +
.../.impeccable/live/config.json | 5 +
.../workspaces/live-sveltekit/DESIGN.md | 12 ++
.../workspaces/live-sveltekit/PRODUCT.md | 8 +
.../workspaces/live-sveltekit/package.json | 13 ++
.../workspaces/live-sveltekit/src/app.html | 11 ++
.../live-sveltekit/src/routes/+page.svelte | 27 +++
.../live-sveltekit/svelte.config.js | 3 +
.../.impeccable/live/config.json | 5 +
.../oracle/workspaces/live-tanstack/DESIGN.md | 12 ++
.../workspaces/live-tanstack/PRODUCT.md | 8 +
.../workspaces/live-tanstack/package.json | 12 ++
.../live-tanstack/src/routes/__root.tsx | 25 +++
.../live-tanstack/src/routes/index.tsx | 14 ++
.../workspaces/live-tanstack/vite.config.js | 4 +
.../live-vite/.impeccable/live/config.json | 5 +
tests/oracle/workspaces/live-vite/DESIGN.md | 12 ++
tests/oracle/workspaces/live-vite/PRODUCT.md | 8 +
tests/oracle/workspaces/live-vite/index.html | 11 ++
.../oracle/workspaces/live-vite/package.json | 9 +
tests/oracle/workspaces/live-vite/src/App.jsx | 22 +++
.../oracle/workspaces/live-vite/src/Panel.tsx | 12 ++
.../oracle/workspaces/live-vite/src/main.jsx | 4 +
.../workspaces/live-vite/vite.config.js | 4 +
.../workspaces/live-workspaces/DESIGN.md | 12 ++
.../workspaces/live-workspaces/PRODUCT.md | 8 +
.../apps/admin/astro.config.mjs | 3 +
.../live-workspaces/apps/admin/package.json | 1 +
.../apps/admin/src/pages/index.astro | 13 ++
.../live-workspaces/apps/web/index.html | 11 ++
.../live-workspaces/apps/web/package.json | 1 +
.../live-workspaces/apps/web/src/App.jsx | 22 +++
.../live-workspaces/apps/web/vite.config.js | 4 +
.../workspaces/live-workspaces/package.json | 5 +
306 files changed, 4281 insertions(+), 2 deletions(-)
create mode 100644 tests/oracle/cases/live-accept.mjs
create mode 100644 tests/oracle/cases/live-daemon.mjs
create mode 100644 tests/oracle/cases/live-manual.mjs
create mode 100644 tests/oracle/cases/live-roots.mjs
create mode 100644 tests/oracle/cases/live-session.mjs
create mode 100644 tests/oracle/cases/live-wrap.mjs
create mode 100644 tests/oracle/golden/live-accept-generated-file.json
create mode 100644 tests/oracle/golden/live-accept-help.json
create mode 100644 tests/oracle/golden/live-accept-html-discard-then-accept.json
create mode 100644 tests/oracle/golden/live-accept-html-discard.json
create mode 100644 tests/oracle/golden/live-accept-html-malformed-params.json
create mode 100644 tests/oracle/golden/live-accept-html-no-css-block.json
create mode 100644 tests/oracle/golden/live-accept-html-no-params.json
create mode 100644 tests/oracle/golden/live-accept-html-receipt-conflict.json
create mode 100644 tests/oracle/golden/live-accept-html-receipt-replay.json
create mode 100644 tests/oracle/golden/live-accept-html-variant-1-range.json
create mode 100644 tests/oracle/golden/live-accept-html-variant-2-steps.json
create mode 100644 tests/oracle/golden/live-accept-html-variant-3-toggle.json
create mode 100644 tests/oracle/golden/live-accept-html-variant-missing.json
create mode 100644 tests/oracle/golden/live-accept-invalid-id.json
create mode 100644 tests/oracle/golden/live-accept-invalid-variant-regex.json
create mode 100644 tests/oracle/golden/live-accept-invalid-variant.json
create mode 100644 tests/oracle/golden/live-accept-jsx-discard.json
create mode 100644 tests/oracle/golden/live-accept-jsx-from-subdir.json
create mode 100644 tests/oracle/golden/live-accept-jsx-variant-1.json
create mode 100644 tests/oracle/golden/live-accept-jsx-variant-3-toggle-off.json
create mode 100644 tests/oracle/golden/live-accept-markers-not-found.json
create mode 100644 tests/oracle/golden/live-accept-missing-id.json
create mode 100644 tests/oracle/golden/live-accept-need-mode.json
create mode 100644 tests/oracle/golden/live-accept-no-page-url-keeps-buffer.json
create mode 100644 tests/oracle/golden/live-accept-scrubs-buffer-for-page.json
create mode 100644 tests/oracle/golden/live-accept-source-locked.json
create mode 100644 tests/oracle/golden/live-accept-source-shadow-deprecated.json
create mode 100644 tests/oracle/golden/live-accept-stale-lock-dead-pid.json
create mode 100644 tests/oracle/golden/live-accept-svelte-component-accept.json
create mode 100644 tests/oracle/golden/live-accept-svelte-component-discard.json
create mode 100644 tests/oracle/golden/live-accept-svelte-component-styled-variant.json
create mode 100644 tests/oracle/golden/live-accept-svelte-component-variant-missing.json
create mode 100644 tests/oracle/golden/live-accept-svelte-fallback-source-wrapper.json
create mode 100644 tests/oracle/golden/live-accept-svelte-insert-empty-variant.json
create mode 100644 tests/oracle/golden/live-accept-target-missing-value.json
create mode 100644 tests/oracle/golden/live-boot-astro-config-missing.json
create mode 100644 tests/oracle/golden/live-boot-config-invalid-json.json
create mode 100644 tests/oracle/golden/live-boot-config-invalid-schema.json
create mode 100644 tests/oracle/golden/live-boot-context-missing-both.json
create mode 100644 tests/oracle/golden/live-boot-context-missing-design-empty.json
create mode 100644 tests/oracle/golden/live-boot-context-missing-product.json
create mode 100644 tests/oracle/golden/live-boot-full-cycle.json
create mode 100644 tests/oracle/golden/live-boot-html-config-missing.json
create mode 100644 tests/oracle/golden/live-boot-monorepo-from-child.json
create mode 100644 tests/oracle/golden/live-boot-monorepo-from-root.json
create mode 100644 tests/oracle/golden/live-boot-monorepo-no-git-from-root.json
create mode 100644 tests/oracle/golden/live-boot-monorepo-target-eq.json
create mode 100644 tests/oracle/golden/live-boot-monorepo-target-file.json
create mode 100644 tests/oracle/golden/live-boot-multi-app-selection.json
create mode 100644 tests/oracle/golden/live-boot-multi-app-target.json
create mode 100644 tests/oracle/golden/live-boot-pointer-accumulates.json
create mode 100644 tests/oracle/golden/live-boot-sveltekit-config-missing.json
create mode 100644 tests/oracle/golden/live-boot-vite-config-missing.json
create mode 100644 tests/oracle/golden/live-boot-vite-from-subdir.json
create mode 100644 tests/oracle/golden/live-boot-workspaces-from-child.json
create mode 100644 tests/oracle/golden/live-boot-workspaces-selection.json
create mode 100644 tests/oracle/golden/live-boot-workspaces-target.json
create mode 100644 tests/oracle/golden/live-commit-help.json
create mode 100644 tests/oracle/golden/live-commit-invalid-buffer.json
create mode 100644 tests/oracle/golden/live-commit-mock-applied-page.json
create mode 100644 tests/oracle/golden/live-commit-mock-default-result.json
create mode 100644 tests/oracle/golden/live-commit-mock-error.json
create mode 100644 tests/oracle/golden/live-commit-mock-invalid-result-json.json
create mode 100644 tests/oracle/golden/live-commit-mock-leftover-marker-check.json
create mode 100644 tests/oracle/golden/live-commit-mock-partial.json
create mode 100644 tests/oracle/golden/live-commit-mock-then-discard-remaining.json
create mode 100644 tests/oracle/golden/live-commit-mock-unreported-file-change.json
create mode 100644 tests/oracle/golden/live-commit-no-pending-page.json
create mode 100644 tests/oracle/golden/live-commit-no-pending.json
create mode 100644 tests/oracle/golden/live-complete-clean.json
create mode 100644 tests/oracle/golden/live-complete-discard-alias.json
create mode 100644 tests/oracle/golden/live-complete-discarded.json
create mode 100644 tests/oracle/golden/live-complete-error-eq.json
create mode 100644 tests/oracle/golden/live-complete-error-no-message.json
create mode 100644 tests/oracle/golden/live-complete-error.json
create mode 100644 tests/oracle/golden/live-complete-help.json
create mode 100644 tests/oracle/golden/live-complete-no-id.json
create mode 100644 tests/oracle/golden/live-complete-source-dirty-carbonize-leftovers.json
create mode 100644 tests/oracle/golden/live-complete-source-dirty-force.json
create mode 100644 tests/oracle/golden/live-complete-source-dirty.json
create mode 100644 tests/oracle/golden/live-complete-source-in-node-modules.json
create mode 100644 tests/oracle/golden/live-complete-source-missing-file.json
create mode 100644 tests/oracle/golden/live-complete-twice.json
create mode 100644 tests/oracle/golden/live-complete-unknown-session.json
create mode 100644 tests/oracle/golden/live-daemon-server-status-poll-complete.json
create mode 100644 tests/oracle/golden/live-discard-all.json
create mode 100644 tests/oracle/golden/live-discard-empty.json
create mode 100644 tests/oracle/golden/live-discard-help.json
create mode 100644 tests/oracle/golden/live-discard-invalid-buffer.json
create mode 100644 tests/oracle/golden/live-discard-page-bare-flag.json
create mode 100644 tests/oracle/golden/live-discard-page-no-match.json
create mode 100644 tests/oracle/golden/live-discard-page.json
create mode 100644 tests/oracle/golden/live-discard-twice.json
create mode 100644 tests/oracle/golden/live-help.json
create mode 100644 tests/oracle/golden/live-inject-anchor-missing-all.json
create mode 100644 tests/oracle/golden/live-inject-astro-inline.json
create mode 100644 tests/oracle/golden/live-inject-check-env-config.json
create mode 100644 tests/oracle/golden/live-inject-check-invalid-anchor.json
create mode 100644 tests/oracle/golden/live-inject-check-invalid-files.json
create mode 100644 tests/oracle/golden/live-inject-check-invalid-json.json
create mode 100644 tests/oracle/golden/live-inject-check-missing.json
create mode 100644 tests/oracle/golden/live-inject-check-ok.json
create mode 100644 tests/oracle/golden/live-inject-csp-meta-no-connect-src.json
create mode 100644 tests/oracle/golden/live-inject-exclude-glob.json
create mode 100644 tests/oracle/golden/live-inject-file-not-found.json
create mode 100644 tests/oracle/golden/live-inject-from-repo-root-via-roots.json
create mode 100644 tests/oracle/golden/live-inject-heals-orphan-journal.json
create mode 100644 tests/oracle/golden/live-inject-help.json
create mode 100644 tests/oracle/golden/live-inject-html-repeat-and-remove.json
create mode 100644 tests/oracle/golden/live-inject-html-tag-no-token.json
create mode 100644 tests/oracle/golden/live-inject-html-tag.json
create mode 100644 tests/oracle/golden/live-inject-insert-after.json
create mode 100644 tests/oracle/golden/live-inject-missing-port.json
create mode 100644 tests/oracle/golden/live-inject-monorepo-repo-root-ignore.json
create mode 100644 tests/oracle/golden/live-inject-next-jsx.json
create mode 100644 tests/oracle/golden/live-inject-no-config.json
create mode 100644 tests/oracle/golden/live-inject-nuxt-adapter.json
create mode 100644 tests/oracle/golden/live-inject-nuxt-plugin-conflict.json
create mode 100644 tests/oracle/golden/live-inject-nuxt-srcdir.json
create mode 100644 tests/oracle/golden/live-inject-port-nan.json
create mode 100644 tests/oracle/golden/live-inject-remove-clean.json
create mode 100644 tests/oracle/golden/live-inject-sveltekit-adapter.json
create mode 100644 tests/oracle/golden/live-inject-sveltekit-existing-layout.json
create mode 100644 tests/oracle/golden/live-inject-tanstack-adapter.json
create mode 100644 tests/oracle/golden/live-inject-tanstack-component-conflict.json
create mode 100644 tests/oracle/golden/live-inject-target-missing-value.json
create mode 100644 tests/oracle/golden/live-inject-token-from-server-json.json
create mode 100644 tests/oracle/golden/live-inject-token-server-json-port-mismatch.json
create mode 100644 tests/oracle/golden/live-inject-vite-csp-meta.json
create mode 100644 tests/oracle/golden/live-insert-astro-after.json
create mode 100644 tests/oracle/golden/live-insert-element-not-found.json
create mode 100644 tests/oracle/golden/live-insert-element-not-in-source.json
create mode 100644 tests/oracle/golden/live-insert-file-is-generated.json
create mode 100644 tests/oracle/golden/live-insert-help.json
create mode 100644 tests/oracle/golden/live-insert-html-after.json
create mode 100644 tests/oracle/golden/live-insert-html-before.json
create mode 100644 tests/oracle/golden/live-insert-html-deferred.json
create mode 100644 tests/oracle/golden/live-insert-html-text-ambiguous.json
create mode 100644 tests/oracle/golden/live-insert-html-text-picks.json
create mode 100644 tests/oracle/golden/live-insert-invalid-position.json
create mode 100644 tests/oracle/golden/live-insert-jsx-after.json
create mode 100644 tests/oracle/golden/live-insert-jsx-before-deferred.json
create mode 100644 tests/oracle/golden/live-insert-missing-id.json
create mode 100644 tests/oracle/golden/live-insert-missing-locator.json
create mode 100644 tests/oracle/golden/live-insert-missing-position.json
create mode 100644 tests/oracle/golden/live-insert-svelte-component.json
create mode 100644 tests/oracle/golden/live-insert-svelte-env-disabled.json
create mode 100644 tests/oracle/golden/live-insert-vue-after.json
create mode 100644 tests/oracle/golden/live-poll-connection-refused.json
create mode 100644 tests/oracle/golden/live-poll-help.json
create mode 100644 tests/oracle/golden/live-poll-no-server-stale-record.json
create mode 100644 tests/oracle/golden/live-poll-no-server.json
create mode 100644 tests/oracle/golden/live-poll-reply-bad-data-json.json
create mode 100644 tests/oracle/golden/live-poll-reply-connection-refused.json
create mode 100644 tests/oracle/golden/live-poll-reply-missing-id.json
create mode 100644 tests/oracle/golden/live-poll-reply-missing-status.json
create mode 100644 tests/oracle/golden/live-poll-reply-status-as-id.json
create mode 100644 tests/oracle/golden/live-poll-reply-status-flag.json
create mode 100644 tests/oracle/golden/live-resume-accept-requested.json
create mode 100644 tests/oracle/golden/live-resume-by-id-eq.json
create mode 100644 tests/oracle/golden/live-resume-by-id.json
create mode 100644 tests/oracle/golden/live-resume-carbonize-required.json
create mode 100644 tests/oracle/golden/live-resume-completed-only.json
create mode 100644 tests/oracle/golden/live-resume-first-active-sorted.json
create mode 100644 tests/oracle/golden/live-resume-generating.json
create mode 100644 tests/oracle/golden/live-resume-help.json
create mode 100644 tests/oracle/golden/live-resume-manual-apply.json
create mode 100644 tests/oracle/golden/live-resume-mount-failed.json
create mode 100644 tests/oracle/golden/live-resume-none.json
create mode 100644 tests/oracle/golden/live-resume-unknown-id.json
create mode 100644 tests/oracle/golden/live-server-already-running.json
create mode 100644 tests/oracle/golden/live-server-help.json
create mode 100644 tests/oracle/golden/live-server-stop-no-config.json
create mode 100644 tests/oracle/golden/live-server-stop-none-keep-inject.json
create mode 100644 tests/oracle/golden/live-server-stop-none.json
create mode 100644 tests/oracle/golden/live-server-stop-removes-tag.json
create mode 100644 tests/oracle/golden/live-server-target-missing-value.json
create mode 100644 tests/oracle/golden/live-status-empty.json
create mode 100644 tests/oracle/golden/live-status-from-subdir.json
create mode 100644 tests/oracle/golden/live-status-generating.json
create mode 100644 tests/oracle/golden/live-status-legacy-sessions-dir.json
create mode 100644 tests/oracle/golden/live-status-manual-apply.json
create mode 100644 tests/oracle/golden/live-status-many-sessions.json
create mode 100644 tests/oracle/golden/live-status-mount-failed.json
create mode 100644 tests/oracle/golden/live-status-stale-server-json.json
create mode 100644 tests/oracle/golden/live-status-target-missing-value.json
create mode 100644 tests/oracle/golden/live-target-missing-value.json
create mode 100644 tests/oracle/golden/live-wrap-astro-deferred.json
create mode 100644 tests/oracle/golden/live-wrap-astro.json
create mode 100644 tests/oracle/golden/live-wrap-element-not-found.json
create mode 100644 tests/oracle/golden/live-wrap-element-not-in-source.json
create mode 100644 tests/oracle/golden/live-wrap-file-element-missing.json
create mode 100644 tests/oracle/golden/live-wrap-file-is-generated.json
create mode 100644 tests/oracle/golden/live-wrap-help.json
create mode 100644 tests/oracle/golden/live-wrap-html-by-classes-tag.json
create mode 100644 tests/oracle/golden/live-wrap-html-by-id.json
create mode 100644 tests/oracle/golden/live-wrap-html-by-query.json
create mode 100644 tests/oracle/golden/live-wrap-html-deferred.json
create mode 100644 tests/oracle/golden/live-wrap-html-eq-form.json
create mode 100644 tests/oracle/golden/live-wrap-html-explicit-file.json
create mode 100644 tests/oracle/golden/live-wrap-html-multiline.json
create mode 100644 tests/oracle/golden/live-wrap-html-page-url-no-pending.json
create mode 100644 tests/oracle/golden/live-wrap-jsx-deferred.json
create mode 100644 tests/oracle/golden/live-wrap-jsx-mapped-item.json
create mode 100644 tests/oracle/golden/live-wrap-jsx.json
create mode 100644 tests/oracle/golden/live-wrap-missing-id.json
create mode 100644 tests/oracle/golden/live-wrap-missing-locator.json
create mode 100644 tests/oracle/golden/live-wrap-monorepo-child-from-root.json
create mode 100644 tests/oracle/golden/live-wrap-no-text-first-match.json
create mode 100644 tests/oracle/golden/live-wrap-pending-edits-ambiguous.json
create mode 100644 tests/oracle/golden/live-wrap-pending-edits-applied.json
create mode 100644 tests/oracle/golden/live-wrap-pending-edits-no-page-url.json
create mode 100644 tests/oracle/golden/live-wrap-pending-edits-other-page.json
create mode 100644 tests/oracle/golden/live-wrap-pending-edits-unrelated.json
create mode 100644 tests/oracle/golden/live-wrap-svelte-component-each.json
create mode 100644 tests/oracle/golden/live-wrap-svelte-component-refused-script.json
create mode 100644 tests/oracle/golden/live-wrap-svelte-component-twice.json
create mode 100644 tests/oracle/golden/live-wrap-svelte-component.json
create mode 100644 tests/oracle/golden/live-wrap-svelte-env-disabled.json
create mode 100644 tests/oracle/golden/live-wrap-svelte-no-compiler.json
create mode 100644 tests/oracle/golden/live-wrap-tanstack-tsx.json
create mode 100644 tests/oracle/golden/live-wrap-target-missing-value.json
create mode 100644 tests/oracle/golden/live-wrap-text-ambiguous.json
create mode 100644 tests/oracle/golden/live-wrap-text-not-in-source.json
create mode 100644 tests/oracle/golden/live-wrap-text-picks-second.json
create mode 100644 tests/oracle/golden/live-wrap-text-short-falls-back.json
create mode 100644 tests/oracle/golden/live-wrap-tsx-multiline.json
create mode 100644 tests/oracle/golden/live-wrap-vue.json
create mode 100644 tests/oracle/live-helpers.mjs
create mode 100644 tests/oracle/workspaces/live-astro/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-astro/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-astro/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-astro/astro.config.mjs
create mode 100644 tests/oracle/workspaces/live-astro/package.json
create mode 100644 tests/oracle/workspaces/live-astro/src/layouts/Layout.astro
create mode 100644 tests/oracle/workspaces/live-astro/src/pages/index.astro
create mode 100644 tests/oracle/workspaces/live-html/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-html/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-html/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-html/index.html
create mode 100644 tests/oracle/workspaces/live-html/public/docs/guide.html
create mode 100644 tests/oracle/workspaces/live-html/public/no-body.html
create mode 100644 tests/oracle/workspaces/live-html/src/cards.html
create mode 100644 tests/oracle/workspaces/live-monorepo/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-monorepo/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-monorepo/package.json
create mode 100644 tests/oracle/workspaces/live-monorepo/website/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-monorepo/website/index.html
create mode 100644 tests/oracle/workspaces/live-monorepo/website/package.json
create mode 100644 tests/oracle/workspaces/live-monorepo/website/src/App.jsx
create mode 100644 tests/oracle/workspaces/live-monorepo/website/vite.config.js
create mode 100644 tests/oracle/workspaces/live-next/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-next/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-next/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-next/app/layout.tsx
create mode 100644 tests/oracle/workspaces/live-next/app/page.tsx
create mode 100644 tests/oracle/workspaces/live-next/next.config.js
create mode 100644 tests/oracle/workspaces/live-next/package.json
create mode 100644 tests/oracle/workspaces/live-nuxt/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-nuxt/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-nuxt/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-nuxt/app.vue
create mode 100644 tests/oracle/workspaces/live-nuxt/nuxt.config.ts
create mode 100644 tests/oracle/workspaces/live-nuxt/package.json
create mode 100644 tests/oracle/workspaces/live-nuxt/pages/index.vue
create mode 100644 tests/oracle/workspaces/live-sveltekit/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-sveltekit/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-sveltekit/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-sveltekit/package.json
create mode 100644 tests/oracle/workspaces/live-sveltekit/src/app.html
create mode 100644 tests/oracle/workspaces/live-sveltekit/src/routes/+page.svelte
create mode 100644 tests/oracle/workspaces/live-sveltekit/svelte.config.js
create mode 100644 tests/oracle/workspaces/live-tanstack/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-tanstack/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-tanstack/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-tanstack/package.json
create mode 100644 tests/oracle/workspaces/live-tanstack/src/routes/__root.tsx
create mode 100644 tests/oracle/workspaces/live-tanstack/src/routes/index.tsx
create mode 100644 tests/oracle/workspaces/live-tanstack/vite.config.js
create mode 100644 tests/oracle/workspaces/live-vite/.impeccable/live/config.json
create mode 100644 tests/oracle/workspaces/live-vite/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-vite/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-vite/index.html
create mode 100644 tests/oracle/workspaces/live-vite/package.json
create mode 100644 tests/oracle/workspaces/live-vite/src/App.jsx
create mode 100644 tests/oracle/workspaces/live-vite/src/Panel.tsx
create mode 100644 tests/oracle/workspaces/live-vite/src/main.jsx
create mode 100644 tests/oracle/workspaces/live-vite/vite.config.js
create mode 100644 tests/oracle/workspaces/live-workspaces/DESIGN.md
create mode 100644 tests/oracle/workspaces/live-workspaces/PRODUCT.md
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/admin/astro.config.mjs
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/admin/package.json
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/admin/src/pages/index.astro
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/index.html
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/package.json
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/src/App.jsx
create mode 100644 tests/oracle/workspaces/live-workspaces/apps/web/vite.config.js
create mode 100644 tests/oracle/workspaces/live-workspaces/package.json
diff --git a/tests/oracle/README.md b/tests/oracle/README.md
index 3b15d539b..d4c32458c 100644
--- a/tests/oracle/README.md
+++ b/tests/oracle/README.md
@@ -55,3 +55,35 @@ Not covered on purpose: `palette` with no `--id` / `--from` / env seed (random),
`concept-seed` against the live roll API, `generate-image` real mode,
`serve-question --start` / blocking mode (opens a browser and binds a port),
and unhandled-exception paths whose stack traces carry Node line numbers.
+
+## Live-mode cases (`cases/live-*.mjs`, workspaces `live-*`)
+
+Helpers live in `live-helpers.mjs` (staged journals, buffers, wrapped source
+files with the fake-agent variant block, a `.git` FILE pointing at a non-repo
+gitdir so roots resolution sees a git boundary while `git check-ignore` exits
+128 everywhere and the ignore block lands in the snapshotable
+`.gitfake/info/exclude`). Svelte component preview cases symlink this repo's
+`node_modules/svelte` into the staged app, exactly like the unit tests.
+
+Harness additions made for live:
+
+- `steps[]` entries may carry their own `setup(ws)` (run right before that
+ step) and `daemon: true` with `readyFile` / `readyTimeoutMs`: the verb is
+ spawned detached, the harness waits for the ready file, later steps run
+ against it, and teardown SIGTERMs (then SIGKILLs) it. Its stdout/stderr land
+ in the golden as `daemon: [{stdout, stderr}]`.
+- `normalize: [[regexSource, flags, replacement], ...]` on a case applies extra
+ masks to that case only. Live uses it for the dynamic helper port
+ (`localhost:`, `"port": `), lease and phase stamps (``),
+ and float durations (``).
+- Global masks added: `"pid": ` / `(pid )` and UUID tokens ``.
+- `snapshotFiles` walks `node_modules/.impeccable-live` (the Svelte preview
+ tree) and nothing else under `node_modules`.
+
+Deliberately not covered here (rely on `tests/live-e2e`): the browser
+handshake and `/live.js` bundle, SSE, generate/accept round-trips through a
+real browser, `variant_mount_failed` republish, manual-edit chat routing and
+the codex/claude subprocess providers, Svelte revision-dir publishing, and
+`live.mjs`'s dev-server-dependent flows. Lock-file names hash the absolute
+source path, so lock cases do not snapshot `.impeccable/live/locks/`.
+`live-poll-*-connection-refused` assumes nothing listens on 127.0.0.1:65531.
diff --git a/tests/oracle/cases/live-accept.mjs b/tests/oracle/cases/live-accept.mjs
new file mode 100644
index 000000000..a9af86b89
--- /dev/null
+++ b/tests/oracle/cases/live-accept.mjs
@@ -0,0 +1,165 @@
+/**
+ * `live-accept` corpus: argument paths, HTML and JSX accept/discard
+ * (carbonize output, param baking inputs), receipts, lock contention,
+ * generated-file fallback, buffer scrub, and the Svelte component path
+ * (wrap with the linked compiler, then accept/discard the stub variant).
+ */
+import fs from 'node:fs';
+import path from 'node:path';
+import {
+ LIVE_FILES, linkSvelte, lockPathFor, stageWrappedHtml, stageWrappedJsx, write, writeBuffer,
+} from '../live-helpers.mjs';
+
+const F = LIVE_FILES;
+const HTML = [...F, 'index.html'];
+const JSX = [...F, 'src/**'];
+const A = (id, workspace, args, extra = {}) => ({ id, verb: 'live-accept', workspace, args, files: [...F, ...(extra.snap || [])], ...extra });
+const ID = 'ab12cd34';
+
+export default [
+ A('live-accept-help', 'live-html', ['--help']),
+ A('live-accept-missing-id', 'live-html', ['--variant', '1']),
+ A('live-accept-invalid-id', 'live-html', ['--id', '../etc', '--variant', '1']),
+ A('live-accept-need-mode', 'live-html', ['--id', ID]),
+ A('live-accept-invalid-variant', 'live-html', ['--id', ID, '--variant', '1a']),
+ A('live-accept-invalid-variant-regex', 'live-html', ['--id', ID, '--variant', '.*']),
+ A('live-accept-markers-not-found', 'live-html', ['--id', 'nothere1', '--variant', '1']),
+ A('live-accept-target-missing-value', 'live-html', ['--id', ID, '--variant', '1', '--target']),
+
+ // --- HTML source-preview accept / discard ---
+ A('live-accept-html-variant-1-range', 'live-html', ['--id', ID, '--variant', '1', '--param-values', '{"lightness":0.65}'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-variant-2-steps', 'live-html', ['--id', ID, '--variant', '2', '--param-values', '{"face":"serif"}'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-variant-3-toggle', 'live-html', ['--id', ID, '--variant', '3', '--param-values', '{"italic":true}'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-no-params', 'live-html', ['--id', ID, '--variant', '2'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-malformed-params', 'live-html', ['--id', ID, '--variant', '1', '--param-values', '{bad'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-variant-missing', 'live-html', ['--id', ID, '--variant', '9'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-discard', 'live-html', ['--id', ID, '--discard'], { snap: ['index.html'], setup: stageWrappedHtml }),
+ A('live-accept-html-receipt-replay', 'live-html', ['--id', ID, '--variant', '1'], { snap: ['index.html'], setup: stageWrappedHtml, steps: [{}, {}] }),
+ A('live-accept-html-receipt-conflict', 'live-html', [], { snap: ['index.html'], setup: stageWrappedHtml, steps: [{ args: ['--id', ID, '--variant', '1'] }, { args: ['--id', ID, '--variant', '2'] }, { args: ['--id', ID, '--discard'] }] }),
+ A('live-accept-html-discard-then-accept', 'live-html', [], { snap: ['index.html'], setup: stageWrappedHtml, steps: [{ args: ['--id', ID, '--discard'] }, { args: ['--id', ID, '--variant', '1'] }] }),
+ A('live-accept-html-no-css-block', 'live-html', ['--id', ID, '--variant', '2'], {
+ snap: ['index.html'],
+ setup: (ws) => {
+ stageWrappedHtml(ws);
+ const p = path.join(ws, 'index.html');
+ fs.writeFileSync(p, fs.readFileSync(p, 'utf8').replace(/ {8}\n');
+ fs.writeFileSync(path.join(dir, 'params.json'), JSON.stringify({ 2: [
+ { id: 'lead', kind: 'range', min: 1, max: 2, step: 0.1, default: 1.2, label: 'Lead' },
+ { id: 'density', kind: 'steps', default: 'airy', label: 'Density', options: [{ value: 'airy', label: 'Airy' }, { value: 'snug', label: 'Snug' }] },
+ ] }, null, 2));
+ },
+ },
+ ],
+ },
+ {
+ id: 'live-accept-svelte-component-discard', workspace: 'live-sveltekit', files: [...F, 'src/**'], setup: linkSvelte,
+ steps: [
+ { verb: 'live-wrap', args: ['--id', ID, '--classes', 'expense-list', '--tag', 'ul'] },
+ { verb: 'live-accept', args: ['--id', ID, '--discard'] },
+ { verb: 'live-accept', args: ['--id', ID, '--discard'] },
+ ],
+ },
+ {
+ id: 'live-accept-svelte-component-variant-missing', workspace: 'live-sveltekit', files: [...F, 'src/**'], setup: linkSvelte,
+ steps: [
+ { verb: 'live-wrap', args: ['--id', ID, '--classes', 'hero-title', '--tag', 'h1'] },
+ { verb: 'live-accept', args: ['--id', ID, '--variant', '7'] },
+ ],
+ },
+ {
+ id: 'live-accept-svelte-insert-empty-variant', workspace: 'live-sveltekit', files: [...F, 'src/**'],
+ steps: [
+ { verb: 'live-insert', args: ['--id', ID, '--position', 'after', '--element-id', 'features'] },
+ { verb: 'live-accept', args: ['--id', ID, '--variant', '1'] },
+ ],
+ },
+ {
+ id: 'live-accept-svelte-fallback-source-wrapper', workspace: 'live-sveltekit', files: [...F, 'src/**'],
+ // No compiler: wrap wrote a plain source wrapper into the .svelte route.
+ steps: [
+ { verb: 'live-wrap', args: ['--id', ID, '--classes', 'hero-title', '--tag', 'h1'] },
+ { verb: 'live-accept', args: ['--id', ID, '--discard'] },
+ ],
+ },
+];
diff --git a/tests/oracle/cases/live-daemon.mjs b/tests/oracle/cases/live-daemon.mjs
new file mode 100644
index 000000000..0ef808e7f
--- /dev/null
+++ b/tests/oracle/cases/live-daemon.mjs
@@ -0,0 +1,45 @@
+/**
+ * One end-to-end helper-server flow driven through the daemon step support
+ * in lib.mjs: start `live-server` detached, then status / poll / reply /
+ * complete / stop against it. Everything run-dependent (port, token, pids,
+ * lease and phase timestamps, durations) is masked per-case.
+ */
+import { LIVE_FILES, writeJournal } from '../live-helpers.mjs';
+
+const ID = 'ab12cd34';
+const GEN = { type: 'generate', action: 'bolder', count: 3, pageUrl: '/', element: { tagName: 'h1', id: 'hero', classes: ['hero-title'], textContent: 'Oracle Fixture', outerHTML: 'Oracle Fixture
' }, clientSentAt: 1754042400000 };
+const NORM = [
+ ['localhost:\\d{4,5}', 'g', 'localhost:'],
+ ['"(port|serverPort)":(\\s*)\\d{4,5}', 'g', '"$1":$2'],
+ ['Stopped live server on port \\d+\\.', 'g', 'Stopped live server on port .'],
+ ['already running on port \\d+ ', 'g', 'already running on port '],
+ ['"(leaseUntil|generationReadyAt|lastPollAt|generationCompletedAt|generationCanceledAt|at|leasedAt|clientSentAt)":(\\s*)\\d{10,}', 'g', '"$1":$2'],
+ ['"(durationMs|scaffoldDurationMs)":(\\s*)\\d+(?:\\.\\d+)?', 'g', '"$1":$2'],
+ // The journal embeds the float duration above, so its byte length moves too.
+ ['"__journalBytes":(\\s*)\\d+', 'g', '"__journalBytes":$1'],
+];
+
+export default [
+ {
+ id: 'live-daemon-server-status-poll-complete', workspace: 'live-html', files: [...LIVE_FILES, 'index.html'], normalize: NORM,
+ // A durable session with a pending generate: the server restores it into
+ // its queue on start, so the first poll leases it (running the deferred
+ // wrap preflight against index.html) instead of timing out.
+ setup: (ws) => writeJournal(ws, ID, [GEN]),
+ steps: [
+ { verb: 'live-server', daemon: true, readyFile: '.impeccable/live/server.json', readyTimeoutMs: 15000 },
+ { verb: 'live-server', args: [] },
+ { verb: 'live-status', args: [] },
+ { verb: 'live-poll', args: ['--timeout=8000'] },
+ { verb: 'live-poll', args: ['--reply', ID, 'done', '--file', 'index.html'] },
+ { verb: 'live-poll', args: ['--timeout=300'] },
+ { verb: 'live-poll', args: ['--reply', 'zz99zz99', 'done'] },
+ { verb: 'live-poll', args: ['--reply', ID, 'steer_done'] },
+ { verb: 'live-resume', args: [] },
+ { verb: 'live-complete', args: ['--id', ID] },
+ { verb: 'live-status', args: [] },
+ { verb: 'live-server', args: ['stop'] },
+ { verb: 'live-status', args: [] },
+ ],
+ },
+];
diff --git a/tests/oracle/cases/live-manual.mjs b/tests/oracle/cases/live-manual.mjs
new file mode 100644
index 000000000..1896067b5
--- /dev/null
+++ b/tests/oracle/cases/live-manual.mjs
@@ -0,0 +1,80 @@
+/**
+ * Manual copy-edit helpers: `live-discard-manual-edits`,
+ * `live-commit-manual-edits` (mock provider only: no codex/claude spawn),
+ * driven from a staged pending-manual-edits.json buffer.
+ */
+import { LIVE_FILES, write, writeBuffer } from '../live-helpers.mjs';
+
+const F = [...LIVE_FILES, 'index.html', 'src/**', 'public/**'];
+const entry = (id, pageUrl, ops) => ({ id, pageUrl, element: { tagName: 'h1', classes: ['hero-title'] }, ops, stagedAt: '2026-08-01T00:00:00.000Z' });
+const twoPages = (ws) => writeBuffer(ws, [
+ entry('e1', '/', [{ ref: 'main>h1', tag: 'h1', classes: ['hero-title'], originalText: 'Oracle Fixture', newText: 'Oracle Fixture, renamed', sourceHint: { file: 'index.html', line: 13, column: 7 } }]),
+ entry('e2', '/', [{ ref: 'main>p', tag: 'p', originalText: 'Minimal static page for oracle live-mode goldens.', newText: 'A tighter hook.' }, { ref: 'aside>p', tag: 'p', originalText: 'Nested content.', newText: 'Nested copy.' }]),
+ entry('e3', '/docs/guide', [{ ref: 'article>p', tag: 'p', originalText: 'A second page covered by the config glob.', newText: 'Second page lead.' }]),
+]);
+const D = (id, args, setup, extra = {}) => ({ id, verb: 'live-discard-manual-edits', workspace: 'live-html', args, setup, files: F, ...extra });
+const C = (id, args, setup, extra = {}) => ({ id, verb: 'live-commit-manual-edits', workspace: 'live-html', args, setup, files: F, ...extra });
+const MOCK = { IMPECCABLE_LIVE_COPY_AGENT: 'mock' };
+
+export default [
+ D('live-discard-help', ['--help'], null),
+ D('live-discard-empty', [], null),
+ D('live-discard-all', [], twoPages),
+ D('live-discard-page', ['--page-url=/'], twoPages),
+ D('live-discard-page-no-match', ['--page-url=/nope'], twoPages),
+ D('live-discard-page-bare-flag', ['--page-url'], twoPages),
+ D('live-discard-twice', [], twoPages, { steps: [{}, {}] }),
+ D('live-discard-invalid-buffer', [], (ws) => write(ws, '.impeccable/live/pending-manual-edits.json', '{ nope')),
+
+ C('live-commit-help', ['--help'], null),
+ C('live-commit-no-pending', [], null, { env: MOCK }),
+ C('live-commit-no-pending-page', ['--page-url=/'], null, { env: MOCK }),
+ C('live-commit-invalid-buffer', [], (ws) => write(ws, '.impeccable/live/pending-manual-edits.json', '{ nope'), { env: MOCK }),
+ C('live-commit-mock-default-result', ['--provider=mock'], twoPages, {
+ // Mock reports every entry applied but touched no files: source
+ // verification finds the new text nowhere and refuses to clear.
+ env: MOCK,
+ }),
+ C('live-commit-mock-applied-page', ['--page-url=/', '--provider=mock'], twoPages, {
+ env: {
+ ...MOCK,
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'index.html': '\n\n \n \n Oracle Fixture, renamed
\n A tighter hook.
\n \n \n \n\n' }),
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e1', 'e2'], failed: [], files: ['index.html'], notes: ['oracle mock'] }),
+ },
+ }),
+ C('live-commit-mock-partial', ['--page-url=/', '--provider=mock'], twoPages, {
+ env: {
+ ...MOCK,
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'index.html': 'Oracle Fixture, renamed
Minimal static page for oracle live-mode goldens.
\n' }),
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'partial', appliedEntryIds: ['e1'], failed: [{ entryId: 'e2', reason: 'ambiguous duplicate copy' }], files: ['index.html'] }),
+ },
+ }),
+ C('live-commit-mock-error', ['--provider=mock'], twoPages, {
+ env: { ...MOCK, IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'error', message: 'agent gave up', appliedEntryIds: [], failed: [], files: [] }) },
+ }),
+ C('live-commit-mock-unreported-file-change', ['--page-url=/', '--provider=mock'], twoPages, {
+ env: {
+ ...MOCK,
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'index.html': 'Oracle Fixture, renamed
A tighter hook.
\n' }),
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e1', 'e2'], failed: [], files: [] }),
+ },
+ }),
+ C('live-commit-mock-invalid-result-json', ['--provider=mock'], twoPages, {
+ env: { ...MOCK, IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: '{not json' },
+ }),
+ C('live-commit-mock-leftover-marker-check', ['--page-url=/docs/guide', '--provider=mock'], twoPages, {
+ env: {
+ ...MOCK,
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'public/docs/guide.html': '\n\nSecond page lead.
\n\n' }),
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e3'], failed: [], files: ['public/docs/guide.html'] }),
+ },
+ }),
+ C('live-commit-mock-then-discard-remaining', ['--page-url=/docs/guide', '--provider=mock'], twoPages, {
+ env: {
+ ...MOCK,
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_WRITES: JSON.stringify({ 'public/docs/guide.html': 'Guide
Second page lead.
\n' }),
+ IMPECCABLE_LIVE_COPY_AGENT_MOCK_RESULT: JSON.stringify({ status: 'done', appliedEntryIds: ['e3'], failed: [], files: ['public/docs/guide.html'] }),
+ },
+ steps: [{}, { verb: 'live-discard-manual-edits', args: [] }],
+ }),
+];
diff --git a/tests/oracle/cases/live-roots.mjs b/tests/oracle/cases/live-roots.mjs
new file mode 100644
index 000000000..ac6ceca9e
--- /dev/null
+++ b/tests/oracle/cases/live-roots.mjs
@@ -0,0 +1,124 @@
+/**
+ * `impeccable live` (boot) and `live-inject` corpus: root resolution
+ * (roots.json + repo pointer), config checks, framework injection.
+ * Boot cases stop at config_missing so no helper server is spawned; the one
+ * full boot (`live-boot-full-cycle`) stops its server in a final step.
+ */
+import { LIVE_FILES, fakeGit, rm, write } from '../live-helpers.mjs';
+
+const CFG = '.impeccable/live/config.json';
+const F = LIVE_FILES;
+const PORT_NORM = [
+ ['localhost:\\d{4,5}', 'g', 'localhost:'],
+ ['"(port|serverPort)":(\\s*)\\d{4,5}', 'g', '"$1":$2'],
+ ['Stopped live server on port \\d+\\.', 'g', 'Stopped live server on port .'],
+];
+
+export default [
+ // --- live.mjs (boot) ---
+ { id: 'live-help', verb: 'live', workspace: 'live-html', args: ['--help'] },
+ { id: 'live-target-missing-value', verb: 'live', workspace: 'live-html', args: ['--target'] },
+ { id: 'live-boot-html-config-missing', verb: 'live', workspace: 'live-html', setup: (ws) => rm(ws, CFG), files: F },
+ { id: 'live-boot-vite-config-missing', verb: 'live', workspace: 'live-vite', setup: (ws) => rm(ws, CFG), files: F },
+ { id: 'live-boot-vite-from-subdir', verb: 'live', workspace: 'live-vite', cwd: 'src', setup: (ws) => rm(ws, CFG), files: F },
+ { id: 'live-boot-context-missing-product', verb: 'live', workspace: 'live-vite', setup: (ws) => { rm(ws, 'PRODUCT.md'); }, files: F },
+ { id: 'live-boot-context-missing-design-empty', verb: 'live', workspace: 'live-vite', setup: (ws) => { write(ws, 'DESIGN.md', ''); }, files: F },
+ { id: 'live-boot-context-missing-both', verb: 'live', workspace: 'live-vite', setup: (ws) => { rm(ws, 'PRODUCT.md'); rm(ws, 'DESIGN.md'); }, files: F },
+ { id: 'live-boot-config-invalid-json', verb: 'live', workspace: 'live-html', setup: (ws) => write(ws, CFG, '{ nope'), files: F },
+ { id: 'live-boot-config-invalid-schema', verb: 'live', workspace: 'live-html', setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], insertBefore: '
', commentSyntax: 'html' })) },
+ { id: 'live-inject-missing-port', verb: 'live-inject', workspace: 'live-html', args: [], files: F },
+ { id: 'live-inject-port-nan', verb: 'live-inject', workspace: 'live-html', args: ['--port', 'abc'], files: F },
+ { id: 'live-inject-no-config', verb: 'live-inject', workspace: 'live-vite', args: ['--port', '8412'], setup: (ws) => rm(ws, CFG), files: F },
+ { id: 'live-inject-target-missing-value', verb: 'live-inject', workspace: 'live-html', args: ['--check', '--target'] },
+ { id: 'live-inject-html-tag', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 'tok-oracle'], files: [...F, 'index.html', 'public/**'] },
+ { id: 'live-inject-html-tag-no-token', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412'], files: [...F, 'index.html'] },
+ { id: 'live-inject-token-from-server-json', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412'], setup: (ws) => write(ws, '.impeccable/live/server.json', '{"pid":1,"port":8412,"token":"from-server-json"}'), files: [...F, 'index.html'] },
+ { id: 'live-inject-token-server-json-port-mismatch', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412'], setup: (ws) => write(ws, '.impeccable/live/server.json', '{"pid":1,"port":8499,"token":"other"}'), files: [...F, 'index.html'] },
+ { id: 'live-inject-html-repeat-and-remove', verb: 'live-inject', workspace: 'live-html', files: [...F, 'index.html', 'public/**'], steps: [{ args: ['--port', '8412', '--token', 'a'] }, { args: ['--port', '8413', '--token', 'b'] }, { args: ['--remove'] }, { args: ['--remove'] }] },
+ { id: 'live-inject-remove-clean', verb: 'live-inject', workspace: 'live-html', args: ['--remove'], files: [...F, 'index.html'] },
+ { id: 'live-inject-file-not-found', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['missing.html', 'index.html'], insertBefore: '', commentSyntax: 'html' })), files: [...F, 'index.html'] },
+ { id: 'live-inject-exclude-glob', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['**/*.html'], exclude: ['dist/**', 'public/no-body.html'], insertBefore: '\n \n \n ', commentSyntax: 'vue' })), files: F },
+ { id: 'live-boot-sveltekit-config-missing', verb: 'live', workspace: 'live-sveltekit', setup: (ws) => rm(ws, CFG), files: F },
+ { id: 'live-boot-astro-config-missing', verb: 'live', workspace: 'live-astro', setup: (ws) => rm(ws, CFG), files: F },
+ { id: 'live-boot-monorepo-from-root', verb: 'live', workspace: 'live-monorepo', setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] },
+ { id: 'live-boot-monorepo-from-child', verb: 'live', workspace: 'live-monorepo', cwd: 'website', setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] },
+ { id: 'live-boot-monorepo-target-file', verb: 'live', workspace: 'live-monorepo', args: ['--target', 'website/src/App.jsx'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] },
+ { id: 'live-boot-monorepo-target-eq', verb: 'live', workspace: 'live-monorepo', args: ['--target=website'], setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); }, files: [...F, 'website/.impeccable/**'] },
+ { id: 'live-boot-monorepo-no-git-from-root', verb: 'live', workspace: 'live-monorepo', setup: (ws) => rm(ws, 'website/' + CFG), files: [...F, 'website/.impeccable/**'] },
+ {
+ id: 'live-boot-multi-app-selection', verb: 'live', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'],
+ setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); write(ws, 'admin/package.json', '{"name":"admin"}\n'); },
+ },
+ {
+ id: 'live-boot-multi-app-target', verb: 'live', workspace: 'live-monorepo', args: ['--target', 'admin'], files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'],
+ setup: (ws) => { fakeGit(ws); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); write(ws, 'admin/package.json', '{"name":"admin"}\n'); },
+ },
+ { id: 'live-boot-workspaces-selection', verb: 'live', workspace: 'live-workspaces', setup: (ws) => fakeGit(ws), files: F },
+ { id: 'live-boot-workspaces-target', verb: 'live', workspace: 'live-workspaces', args: ['--target', 'apps/web'], setup: (ws) => fakeGit(ws), files: [...F, 'apps/web/.impeccable/**'] },
+ { id: 'live-boot-workspaces-from-child', verb: 'live', workspace: 'live-workspaces', cwd: 'apps/admin', setup: (ws) => fakeGit(ws), files: [...F, 'apps/admin/.impeccable/**'] },
+ {
+ id: 'live-boot-pointer-accumulates', verb: 'live', workspace: 'live-monorepo', files: [...F, 'website/.impeccable/**', 'admin/.impeccable/**'],
+ setup: (ws) => { fakeGit(ws); rm(ws, 'website/' + CFG); write(ws, 'admin/astro.config.mjs', 'export default {};\n'); },
+ steps: [{ args: ['--target', 'website'] }, { args: ['--target', 'admin'] }, { args: ['--target', 'website'] }],
+ },
+ {
+ // Real boot: background server + inject + drift scan, then stop. Port is
+ // dynamic (first free from 8400), masked per-case.
+ id: 'live-boot-full-cycle', verb: 'live', workspace: 'live-html', files: [...F, 'index.html', 'public/**'], normalize: PORT_NORM,
+ steps: [{ verb: 'live' }, { verb: 'live-inject', args: ['--check'] }, { verb: 'live-server', args: ['stop'] }],
+ },
+
+ // --- live-inject.mjs ---
+ { id: 'live-inject-help', verb: 'live-inject', workspace: 'live-html', args: ['--help'] },
+ { id: 'live-inject-check-ok', verb: 'live-inject', workspace: 'live-html', args: ['--check'] },
+ { id: 'live-inject-check-missing', verb: 'live-inject', workspace: 'live-vite', args: ['--check'], setup: (ws) => rm(ws, CFG) },
+ { id: 'live-inject-check-invalid-json', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, '[1') },
+ { id: 'live-inject-check-invalid-files', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: [], insertBefore: '', commentSyntax: 'html' })) },
+ { id: 'live-inject-check-invalid-anchor', verb: 'live-inject', workspace: 'live-html', args: ['--check'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], commentSyntax: 'html' })) },
+ { id: 'live-inject-check-env-config', verb: 'live-inject', workspace: 'live-html', args: ['--check'], env: { IMPECCABLE_LIVE_CONFIG: 'alt.json' }, setup: (ws) => write(ws, 'alt.json', JSON.stringify({ files: ['public/docs/guide.html'], insertAfter: '
', commentSyntax: 'html' })), files: [...F, 'index.html'] },
+ { id: 'live-inject-anchor-missing-all', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], insertBefore: '', commentSyntax: 'html' })), files: [...F, 'index.html'] },
+ { id: 'live-inject-insert-after', verb: 'live-inject', workspace: 'live-html', args: ['--port', '8412', '--token', 't'], setup: (ws) => write(ws, CFG, JSON.stringify({ files: ['index.html'], exclude: ['public/**'], insertAfter: '
', commentSyntax: 'html' })), files: [...F, 'index.html', 'public/**', 'dist/**', 'src/**'] },
+ {
+ id: 'live-inject-vite-csp-meta', verb: 'live-inject', workspace: 'live-vite', files: [...F, 'index.html'],
+ setup: (ws) => write(ws, 'index.html', '\n\n