# v0.5 → v0.7 — Rolling Manual Test Plan

> **Scope**: a single rolling test plan covering the v0.5 → v0.7 strangler-fig
> arc (TS CLI → TS web server → TS ingestion pipeline). Originally
> "v0.5-manual-test-plan.md" for the v0.5.0 cut on 2026-05-27; renamed to
> "v0.7-manual-test-plan.md" to reflect that the same doc grows through each
> iteration's manual-verification surface and lives until v0.7.0 ships.
>
> **Update cadence**: iterations 24 (v0.6) and 25 (v0.7) each add a section
> covering their new surfaces (web server boot, ingestion-pipeline parity,
> Hono-vs-FastAPI response-shape checks, etc.) and re-tick the v0.5
> sections that still apply. Updating this doc is a tracked deliverable
> for both iterations — see plan.md.
>
> **Walked on every cut**. Each section's `Status` line is ticked when that
> section's checklist passes for the cut in question.
>
> **What this covers that the automated suite can't**:
>
> - Behaviour on a **clean macOS install** (no uv, no clone).
> - Interactive flows (`cerefox init`, prompts).
> - Cross-shell tab completion (bash, zsh, fish).
> - Per-MCP-client config writers against real client config files.
> - Three-way npm publish verification (mirrors the v0.4 first-publish
>   gauntlet checklist in Decision Log Q2 Part 3).
> - **v0.5.4+ round-trip verification**: spawn the target client and
>   confirm cerefox tools actually appear (the gap that let the v0.5.0–v0.5.3
>   configure-agent wrong-path bug ship).
>
> **Status as of v0.5.0 cut (2026-05-27)**: every Part landed; 105 TS tests +
> 587 Python tests green. v0.5.1–v0.5.4 patches added per-release sections
> covering bin-drop, soft-wrapper strip, paths precedence inversion, and
> configure-agent claude-code fix.

Each section has a `**Status**` line that gets ticked as the maintainer runs
through it before signing off a release. v0.5.x patches: only re-run the
sections that match what changed.

---

## 0. Environment matrix

The full surface lives on three matrices:

- **Runtime**: Bun ≥ 1.0, Node ≥ 20 (no LTS-of-LTS yet — Node 20 + 22 sampled).
- **OS**: macOS 14+ (primary), Ubuntu 22.04 (CI), Windows (not in scope for v0.5).
- **Install source**: `npm install -g`, `bun install -g`, `npx --package=` ad-hoc.

A "clean" run = freshly-imaged macOS VM (or `rm -rf ~/.bun ~/.npm-global ~/.cerefox` on the maintainer's machine).

---

## 1. Install paths

**Status**: TBD

- [ ] **install.sh one-liner** — `curl … | sh` on a clean macOS box. Bun not pre-installed.
- [ ] **install.sh** when Bun **is** pre-installed (skips Bun install step).
- [ ] **`bun install -g @cerefox/memory`** directly.
- [ ] **`npm install -g @cerefox/memory`** directly.
- [ ] **`npx -y --package=@cerefox/memory cerefox`** — ad-hoc run, no global install.
- [ ] Verify both bins on PATH after install: `cerefox --version`, `cerefox-mcp --version`.
- [ ] Verify both bins report the same version (literal-sync from `cut_release.ts`).

---

## 2. CLI surface — read commands (23B)

Each command tested with: happy path + at least one error path + `--json` mode.

**Status**: ✅ Automated coverage in `packages/memory/test/read-commands.test.ts` (12 live tests against Supabase). The boxes below are for manual verification — most are duplicates of the automated tests; check them off on the day-of-cut.

| Command | Happy path | `--json` | Error path |
|---|---|---|---|
| `cerefox search "…"` | [ ] returns results (automated: `--mode fts`) | [ ] valid JSON (automated) | [ ] empty query → exit 1 (automated) |
| `cerefox get-doc <id>` | [ ] returns doc | [ ] valid JSON | [ ] bogus UUID → exit 3 (automated) |
| `cerefox list-docs` | [ ] table output | [ ] valid JSON (automated) | [ ] bad `--project` → exit 1 (automated) |
| `cerefox list-versions <id>` | [ ] table | [ ] JSON array | [ ] bogus UUID → exit 3 |
| `cerefox list-projects` | [ ] table | [ ] JSON array (automated) | n/a |
| `cerefox list-metadata-keys` | [ ] table | [ ] JSON array (automated) | n/a |
| `cerefox metadata-search --metadata-filter '{…}'` | [ ] results | [ ] JSON shape | [ ] bad JSON / empty `{}` / missing flag → exit 1 (all 3 automated) |
| `cerefox get-audit-log` | [ ] table | [ ] JSON array (automated) | n/a |

**Manual-only checks** (not in the automated suite):
- [ ] `cerefox search "second brain" --match-count 2` against the maintainer's KB — verify the doc-mode output has bold titles, dim metadata lines, blank separators.
- [ ] `cerefox get-doc <id>` against a real doc — full content prints to stdout (not truncated).
- [ ] `cerefox metadata-search --metadata-filter '{"type":"decision-log"}' --include-content --limit 1` returns content body inline.
- [ ] `cerefox list-versions <id>` against a doc with multiple versions — version_number ordering correct.
- [ ] `CEREFOX_REQUESTOR_NAME=test cerefox list-projects` — usage log records the requestor (verify in `cerefox_usage_log`).

---

## 3. CLI surface — write commands (23C)

**Status**: TBD

| Command | Happy path | Error path |
|---|---|---|
| `cerefox ingest <file>` | [ ] creates doc | [ ] missing file → exit 1 |
| `printf … \| cerefox ingest --paste --title T` | [ ] creates doc | [ ] no title → exit 1 |
| `cerefox ingest-dir <dir>` | [ ] progress bar; all ingested | [ ] no md files → "0 files" summary |
| `cerefox delete-doc <id>` | [ ] soft-deletes | [ ] bogus UUID → exit 3 |

Identity flag propagation:

- [ ] `--author "Test" --author-type agent` reflected in audit log.
- [ ] `CEREFOX_AUTHOR_NAME=Test cerefox ingest …` works without flag.
- [ ] Neither flag nor env → audit log shows `unknown`, CLI emits ⚠ on stderr.

---

## 4. CLI surface — server + ops commands (23D)

**Status**: TBD

- [ ] `cerefox mcp` — boots in-process, completes MCP handshake (smoke).
- [ ] `cerefox web` — prints "use uv run for now" message; exit 0.
- [ ] `cerefox backup` — produces a snapshot dir; manually inspect contents.
- [ ] `cerefox restore <dir>` — restores from a backup against an empty KB.
- [ ] `cerefox restore --dry-run <dir>` — lists changes, writes nothing.
- [ ] `cerefox sync-docs` — re-ingests `docs/guides/*.md` into `_cerefox-self-docs`.
- [ ] `cerefox docs` — opens default browser to bundled markdown.
- [ ] `cerefox docs --print quickstart` — prints quickstart to stdout.
- [ ] `cerefox reindex` — prints "v0.7 will ship this" message; exit 0.
- [ ] `cerefox config-get usage_tracking_enabled` — returns the value.
- [ ] `cerefox config-set usage_tracking_enabled true` — flips the value.

---

## 5. Lifecycle commands (23E)

**Status**: TBD

- [ ] **`cerefox init`** on a brand-new install — 5-step interactive flow.
- [ ] **`cerefox init --config init-config.json`** — non-interactive equivalent.
- [ ] **`cerefox init`** rerun on an already-configured install — detects + offers to overwrite.
- [ ] **`cerefox doctor`** — all 8 checks green on a healthy install.
- [ ] **`cerefox doctor`** with `~/.cerefox/.env` permissions 0644 — flags warning.
- [ ] **`cerefox doctor`** with deliberately wrong Supabase URL — flags red, exit 2.
- [ ] **`cerefox status`** — completes in < 500ms on a healthy install.
- [ ] **`cerefox configure-agent --tool claude-code`** — writes `~/.claude/mcp.json` or merges; backup file present.
- [ ] **`cerefox configure-agent --tool claude-desktop`** — same for Claude Desktop config.
- [ ] **`cerefox self-update --check`** — shows current vs latest, doesn't write.
- [ ] **`cerefox self-update`** with a real upgrade — bumps version, calls sync-self-docs.
- [ ] **`cerefox upgrade`** — equivalent to `cerefox self-update`.

---

## 6. Self-doc ingest (23F)

**Status**: TBD

- [ ] **`cerefox sync-self-docs`** — ingests bundled docs under `_cerefox-self-docs`.
- [ ] Metadata on each ingested doc includes `type=agent-guide`, `source=cerefox-self-docs`, `version=<installed>`.
- [ ] Re-running is idempotent (no duplicate docs; same titles re-used via `update_if_exists`).
- [ ] Frontend `/app` hides `_cerefox-self-docs` from default project listings.
- [ ] Frontend `/app?include_system=1` (or equivalent toggle) reveals it.
- [ ] After `cerefox self-update`, the bundled docs ingest reflects the new version.

---

## 7. Tab completion (23G)

**Status**: TBD

- [ ] `cerefox completion bash > /tmp/cerefox-bash` — generates a script.
- [ ] Source it in a fresh shell; `cerefox <TAB>` lists subcommands.
- [ ] Subcommand `cerefox search --<TAB>` lists flags.
- [ ] Same on zsh.
- [ ] Same on fish.

---

## 8. CLI polish (23G)

**Status**: TBD

- [ ] `cerefox` (no args) on a fresh install (no config) — "Run cerefox init" suggestion.
- [ ] `cerefox` (no args) on a healthy install — friendly summary + suggestions.
- [ ] `cerefox --help` shows commands grouped: READS / WRITES / SERVERS / LIFECYCLE / OPS.
- [ ] Every error message ends with "Try `cerefox X`" or a doc URL.

---

## 9. Python CLI deprecation (23H)

**Status**: TBD

- [ ] `uv run cerefox search …` still works.
- [ ] On stderr: single ⚠ line about npm install + migration guide.
- [ ] `--json` mode suppresses the banner (no contamination of JSON output).
- [ ] `uv run cerefox --version` still works (no banner is fine on `--version`).

---

## 10. Three-way post-publish verification (23J.6)

After `bun scripts/cut_release.ts 0.5.0 --npm-publish`:

**Status**: TBD

Run from `/tmp` (not the cerefox checkout):

- [ ] `curl -sI "https://registry.npmjs.org/@cerefox%2Fmemory/0.5.0" | head -1` → `HTTP/2 200`.
- [ ] `curl -s "https://registry.npmjs.org/@cerefox%2Fmemory/0.5.0" | jq '{bin, version}'` → both bins present, version 0.5.0.
- [ ] `npx -y --package=@cerefox/memory@0.5.0 cerefox --version` → prints 0.5.0.
- [ ] `npx -y --package=@cerefox/memory@0.5.0 cerefox-mcp --version` → prints 0.5.0.
- [ ] On <https://www.npmjs.com/package/@cerefox/memory>: Provenance badge on v0.5.0, publisher = "GitHub Actions".
- [ ] Run `cerefox doctor` against a fresh install — all green.

---

## 11. Edge cases worth a manual eye

**Status**: TBD

- [ ] Install on a machine that already has `~/.cerefox/.env` from a previous v0.4.x install — config preserved.
- [ ] Install on a machine with **both** Bun and npm — `cerefox self-update` picks the right one.
- [ ] `cerefox init` against a Supabase project that already has the schema deployed — detects + skips re-deploy.
- [ ] `cerefox init` against an empty Supabase project — does the deploy.
- [ ] Run `cerefox` from inside a directory that has a `.env` (dev mode) — repo-local `.env` wins.

---

## 12. v0.6.0 — TS web server (iter-24)

**Status**: TBD — walked on the day of the v0.6.0 cut.

Covers the surfaces iter-24 adds: in-process Hono server, frontend
bundled into the npm package, configure-agent Phase 2, and the
ingestion 503 stubs.

### 12.1 `cerefox web` boot — three modes (24A acceptance)

- [ ] **Mode 1 (source)**: `bun packages/memory/src/bin/cerefox.ts web
      --port 18001` boots; `curl /api/v1/version` returns the version
      JSON; `http://127.0.0.1:18001/app/` loads the React SPA from the
      repo's `frontend/dist/`.
- [ ] **Mode 2 (built)**: `cd packages/memory && bun run build && node
      dist/bin/cerefox.js web --port 18002` boots; SPA served from
      `packages/memory/dist/frontend/`; `/api/v1/version` matches.
- [ ] **Mode 3 (mixed)**: from source bin, SPA falls back to repo's
      `frontend/dist/` when `packages/memory/dist/frontend/` doesn't
      exist; the maintainer can iterate on the Hono server without
      rebuilding the package.
- [ ] `curl /app/assets/index-*.js` returns `Content-Type:
      text/javascript`, NOT `text/html` (R5 — asset middleware wins
      over the SPA catch-all).

### 12.2 Hono routes — actual HTTP-boundary coverage

**Correction (2026-05-28, pre-cut)**: the original framing in this
section ("`uv run pytest -m e2e` covers parity at the `/api/v1/*` HTTP
boundary") was a misread of what `tests/e2e/test_api_e2e.py` does — it
talks to Supabase directly via `CerefoxClient` and never exercises
Hono routes over HTTP. The pre-cut v0.6 follow-up commit added real
HTTP-boundary coverage; pytest still has its place for DB-layer
regressions but doesn't validate the new TS routes. See design doc
§ 19 "Test migration policy" for the durable rule.

What to actually walk:

- [ ] **DB-layer baseline**: `uv run pytest -m e2e -x` (anywhere — the
      tests bypass the local web). Confirms nothing broke at the
      Supabase / RPC / EF / remote-MCP layers. Doesn't validate Hono.
- [ ] **TS HTTP-boundary tests**: `cd packages/memory && bun test
      web-integration` against the live Supabase via the running TS
      web (probe-and-skip when unreachable). Exercises the 5
      destructive endpoints + meta endpoints end-to-end.
- [ ] **Browser walk**: open `http://127.0.0.1:8000/app/` in a
      browser. Dashboard, search, audit log, projects, analytics
      pages all load and render real data. Click into a document,
      verify chunks + versions + review-status toggle work. This is
      the only layer that actually exercises the Hono read routes
      under React Query, since the Playwright UI suite (still
      Python through v0.8) doesn't yet have v0.6-specific
      assertions.
- [ ] **Side-by-side spot check** (optional, only if you suspect a
      shape divergence): start the Python web on :8001, the TS web
      on :8000, diff `curl /api/v1/dashboard` output between them
      (after normalising volatile fields).

### 12.3 Frontend bundle pipeline (24B)

- [ ] `cd packages/memory && npm pack --dry-run` lists
      `dist/frontend/index.html` + the hashed JS/CSS bundles.
- [ ] After `bun run prepublishOnly`, `dist/frontend/index.html`
      exists; `dist/frontend/assets/` contains the Vite output.

### 12.4 Ingestion 503 stubs (24H + 24J)

For each of the 3 paths, **trigger from the web UI** (not curl) so
the toast UX is exercised:

- [ ] **Paste**: Ingest page → Paste tab → paste 1KB of markdown →
      submit. Toast appears: yellow, "Ingestion lands in v0.7", with
      a hint pointing at `cerefox ingest <file>` from the CLI. No
      crash, no red error banner.
- [ ] **File upload**: Ingest page → Upload tab → choose a `.md`
      file → submit. Same toast. (Raw `fetch` path uses
      `detectV07FromResponse`.)
- [ ] **Replace**: Document Detail page → "Replace content" upload
      button → choose a file. Same toast.
- [ ] **Edit content (24E partial)**: Document Edit page → change
      the content body → Save. Toast appears (the SHA-256 hash
      diverges from `content_hash` → 503). Then: re-open the edit
      page, change ONLY the title (keep content identical) → Save.
      Success toast, no 503 (metadata-only path works).

### 12.5 CLI fallback for ingestion (working alternative during v0.6)

- [ ] `cerefox ingest <file>` from a clean machine (npm-installed
      `@cerefox/memory`) ingests a doc successfully. Verifies the
      Edge Function path is the v0.6 fallback the toast points at.

### 12.6 Configure-agent Phase 2 (24K)

For each writer, walk against a real client config file (the
`--config-path` flag writes to a temp file for safety; production
walks should use the default path and then check the actual client):

- [ ] **Cursor**: `cerefox configure-agent --tool cursor --dry-run
      --json` → `action: "created"` (or merged), serverEntry =
      `npx -y --package=@cerefox/memory cerefox mcp`. Then real run
      against `~/.cursor/mcp.json`. Cursor restart → MCP server
      "cerefox" appears.
- [ ] **Codex**: `cerefox configure-agent --tool codex` writes TOML
      to `~/.codex/config.toml`. Parse with smol-toml or `cat` →
      `[mcp_servers.cerefox]` table present, unrelated keys (e.g.
      `model = "..."`) preserved if the file already existed.
      Restart Codex CLI session → MCP server "cerefox" available.
- [ ] **Gemini**: `cerefox configure-agent --tool gemini` writes
      `~/.gemini/settings.json`. JSON shape matches Cursor. Restart
      Gemini CLI session → "cerefox" available.
- [ ] **R2 (`claude mcp add` round-trip)**: this is the deferred
      smoke test from 24K. Take a backup of `~/.claude.json`. Run
      `cerefox configure-agent --tool claude-code`. Then
      `claude mcp list` and assert `cerefox` is in the output.
      Restore the backup afterwards.

### 12.7 Schema-version banner across the cut

- [ ] `/api/v1/schema-version` returns `bundled=deployed`,
      `mismatch=false` on the TS web. Web UI shows no banner.

### 12.8 `cerefox web --watch` (locked decision; not wired in 24A)

- [ ] Confirmed not wired: `cerefox web --watch` prints "reserved;
      not yet implemented in Part 24A" and boots normally. (Locked
      for a v0.6.x patch.)

---

## 13. v0.7.0 — TS ingestion pipeline (iter-25)

**Status**: TBD — walked on the day of the v0.7.0 cut.

The big delta from v0.6.0: chunking + embedding + version snapshotting
move to TS, the 3 ingestion endpoints are unblocked, `cerefox reindex`
works, PDF/DOCX dropped, Python web shows a deprecation banner.

### 13.1 Chunker byte-parity (R1 closed in iter-25A)

- [ ] `bun test ingest-chunker` in `_shared/` → 13/13 parity tests
      pass against the 12 captured Python fixtures.
- [ ] Optionally re-capture fixtures via
      `uv run python scripts/capture_python_chunking_parity.py` and
      re-run tests — confirms the Python chunker still produces
      byte-identical output to today's captures.

### 13.2 Embedder cosine parity (R2 closed in iter-25B)

- [ ] `bun test embeddings-batching` in `_shared/` → 9/9 pass.
      Includes the live cosine-similarity check against the captured
      Python reference (probe-and-skip on `OPENAI_API_KEY`).

### 13.3 Pipeline + CLI end-to-end (Parts 25D + 25E + 25G)

- [ ] `cerefox ingest some-file.md` from a clean npm install creates
      a doc; `cerefox ingest some-file.md` again returns
      "Document already up-to-date" (dedup by content_hash).
- [ ] `cerefox ingest some-file.md --update-if-exists` after editing
      the file's content returns "Document updated" + a new version
      row in `cerefox_document_versions`.
- [ ] `cerefox ingest some-file.md --update-if-exists` with title
      change but no content change returns "Document already up-to-
      date" (the chunks get re-embedded with the new title context,
      but reindexed=false — content_hash unchanged).
- [ ] `cerefox ingest-dir <dir>` walks the tree, ingests `.md` /
      `.txt` files, prints a summary with `Summary: N ok · 0 errors`.
- [ ] `cerefox reindex --dry-run` prints "Reindexing N chunk(s)
      (stale only) — DRY RUN" or "(nothing to reindex)".

### 13.4 Web `/api/v1/ingest*` endpoints (Part 25F)

- [ ] Open the web UI; from the Ingest page, **Paste** mode → paste
      some markdown + give it a title → submit. Doc appears in the
      dashboard. **No yellow "v0.7" toast** (used to fire in v0.6).
- [ ] Same page, **Upload File** tab → upload an .md file → success.
- [ ] Document Detail page → upload-replace a doc with a new file.
      Version count goes up by 1 (visible in the versions accordion).
- [ ] Document Edit page → change content + save. Success toast.

### 13.5 PDF / DOCX drop (Part 25K)

- [ ] `uv run cerefox ingest some.pdf` from a checkout prints
      "PDF/DOCX support dropped in v0.7.0" and exits 1.
- [ ] `ls src/cerefox/chunking/converters.py` → file gone.
- [ ] `ls tests/chunking/test_converters.py` → file gone.

### 13.6 Python web deprecation banner (Part 25K)

- [ ] `uv run cerefox web` boots and prints the yellow ⚠ banner once
      at startup. Server starts normally afterwards.
- [ ] Same in a non-TTY pipe (`uv run cerefox web 2>&1 | cat`) →
      banner appears in plain text (no ANSI escapes).

### 13.7 Scripts ports (Parts 25H + 25I)

- [ ] `bun scripts/db_deploy.ts --help` prints usage and exits 0.
- [ ] `bun scripts/db_deploy.ts --dry-run` walks 4 steps against the
      live DB without writing.
- [ ] `bun scripts/db_migrate.ts --status` lists all migrations with
      their applied/pending state. Summary line: "N total | N applied
      | N pending".
- [ ] `bun scripts/reindex_all.ts --help` prints usage and exits 0.
- [ ] `python scripts/db_deploy.py` (the husk) prints "is a husk as
      of v0.7.0" pointer and exits 0.
- [ ] `python scripts/backup_create.py` (NOT ported, still Python)
      runs successfully against the live DB.

### 13.8 Tests baseline

- [ ] `cd _shared && bun test` → 126/126 pass.
- [ ] `cd packages/memory && bun test` → 98+ pass; 2 known state-
      dependent flakes in `write-commands.test.ts` (see CHANGELOG
      "Known limitations"). Acceptable for the cut.
- [ ] `uv run pytest tests/ -m 'not e2e and not ui'` → 555/555 pass
      (down 20 from v0.6 due to PDF/DOCX test deletion).
- [ ] `uv run pytest -m e2e` → still passes against the live DB
      (unrelated to the v0.7 TS additions; verifies no regressions
      at the DB layer).

### 13.9 Python MCP unchanged

- [ ] `uv run cerefox mcp` boots and responds to the JSON-RPC
      handshake (any MCP client check works — `claude mcp list` shows
      cerefox, or `mcp inspect` against the stdio process).

### 13.10 Cerefox-ingest EF (Deno) unchanged

- [ ] `curl -X POST <supabase-url>/functions/v1/cerefox-ingest …`
      with a body matching the EF's expected shape still works
      (GPT Actions path, remote MCP, npm CLI fallback all still
      route here for the `cerefox-mcp` MCP server). The v0.7 changes
      only added an in-process alternative; the EF stays alive.

---

## 14. v0.8.0 — production-ready install (iter-26)

Most of iter-26 is covered by automated tests (the EF/MCP/UI e2e suites
were ported to TS and run green against the live Supabase; `_shared` unit
suites cover the compat matrix, server-assets resolver, backup round-trip,
ef-meta helpers). This section is the **last-mile manual walk** — primarily
the things that need a real `npx supabase` + a (preferably fresh) Supabase
project, which automated tests can't safely exercise.

**Staging note**: run §14.1–14.3 against a **fresh side-by-side Supabase
project**, not your primary KB — `deploy-server --reset` drops tables.
Created docs in the e2e suites are `[E2E-*]`-prefixed and self-clean.

### 14.1 `cerefox deploy-server` (Part 26D) — the headline

- [ ] On a machine with **no repo clone**, fresh `npm install -g @cerefox/memory`.
- [ ] `cerefox deploy-server --dry-run` → pre-flight lists each check; plan shown; nothing deployed.
- [ ] Remove a prerequisite (e.g. unset `CEREFOX_DATABASE_URL`) → refuses with the exact remediation line; re-run after fixing works (idempotent).
- [ ] Against a fresh Supabase project: `cerefox deploy-server` → prompts, deploys schema + RPCs + 9 EFs; `cerefox doctor` then shows schema ✓ + edge-functions ✓.
- [ ] `cerefox deploy-server --functions-only` redeploys just the EFs (no schema touch).
- [ ] `cerefox deploy-server --reset` prompts twice (the destructive guard) before dropping.

### 14.2 EF `/version` + aggregator + compat (Parts 26B/26C)

- [ ] After deploying v0.8 EFs: `curl <url>/functions/v1/cerefox-search/version` → `{name, version}`.
- [ ] `curl <url>/functions/v1/cerefox-mcp/version?peers=true` → `{schema, efs, errors}` with all 8 peers.
- [ ] `cerefox doctor` edge-functions row shows ✓ (was "predate v0.8" before redeploy).
- [ ] Simulate incompatibility: bump `COMPATIBILITY.minEdgeFunctions` locally to a future version → `cerefox doctor` shows ✗; `cerefox web` refuses to bind with the redeploy message; the web `SchemaVersionBanner` shows red.

### 14.3 `cerefox init` deploy integration (Part 26E)

- [ ] Fresh Supabase (no schema): `cerefox init` → after credentials, prompts "Deploy the server now?" → yes → deploy-server runs → init continues.
- [ ] Existing compatible install: `cerefox init` → no deploy prompt (silent pass line).

### 14.4 Daemon mode (Part 26F) — no Supabase write needed

- [ ] `cerefox web start` → returns immediately; `cerefox web status` → "running on :8000 (pid N)".
- [ ] Browser: the tab favicon + header logo render; request log lines appear in `~/.cerefox/web.log`.
- [ ] Second `cerefox web start` → "already running" (exit 0); a different `--port` → conflict (exit 1).
- [ ] `cerefox web stop` → stops; `cerefox web status` → "stopped".
- [ ] Plain `cerefox web` still runs in the foreground.

### 14.5 Export script (Part 26M)

- [ ] `bun scripts/cerefox_export.ts /tmp/dump` → one folder per project, orphans at root; `find /tmp/dump -name '*.md' | wc -l` ≈ doc count (multi-project docs duplicated).
- [ ] `--project "<name>"` limits to that project; refuses a non-empty target without `--force`.

### 14.6 Backups (Part 26K)

- [ ] `bun scripts/backup_create.ts --dir /tmp/bk` → JSON file with doc + chunk counts.
- [ ] `bun scripts/backup_restore.ts <file> --dry-run` against the same KB → all skipped (idempotent).
- [ ] (Optional, fresh project) real restore → docs + chunks recreated, server fields stripped.
- [ ] Cross-runtime: a backup written by the old Python `backup_create.py` (version 1) restores via `backup_restore.ts`.

### 14.7 GPT Actions OpenAPI (Part 26L)

- [ ] Paste the updated `connect-agents.md` OpenAPI block (info.version 1.8.0) into a Custom GPT; the new fields (search `alpha`/`min_score`/`max_bytes`, ingest `project_names` + response fields, audit `until`, metadata-search `max_bytes`) are accepted and a sample search/ingest works.

### 14.8 Regression baseline

- [ ] `cd _shared && bun test` green; `cd packages/memory && bun run build && bun test` green (live suites run against the test project).
- [ ] `cd frontend && bun run test:e2e` green (13 UI tests).
- [ ] `uv run pytest` green (Python unit + the surviving `test_api_e2e.py`).

---

## Filling this in

As each Part lands during iter-23 execution, the corresponding section's
checklist items are concretized (specific test inputs, expected outputs). The
maintainer then walks through it once on the day of the cut to verify.

The TS unit tests + parity tests cover the deterministic parts (output
matches, exit code matches, JSON shape matches). This document covers the
last-mile manual + cross-platform verification.
