# Spoon implementation handoff for Claude

## Objective

Continue and complete every task in the five plans indexed by
`docs/superpowers/plans/2026-07-10-spoon-implementation-plan-index.md`.
The plans contain 63 tasks and must be executed in phase order. Use the
project `AGENTS.md`, test-first implementation, a task-scoped review after
each task, and a whole-branch review at the end.

## Canonical workspace

- Integration worktree: `/home/gib/.codex/worktrees/Spoon/spoon-stabilize-unify-build`
- Integration branch: `codex/spoon-stabilize-unify-build`
- Current integration HEAD before this handoff commit: `8af33fc`
- Original checkout: `/home/gib/Documents/Code/Spoon`, still on `main` at
  `8aa9140`. Do not implement in the original checkout.
- `main` was already two commits ahead of `origin/main` when work began.
  Preserve it and the original checkout's untracked `.agents/` directory.

## Current state

Phase 1 Tasks 1-5 and 7-13 are implemented, independently reviewed, fixed
where required, integrated, and verified with focused static/unit checks.
The durable scratch ledger is
`/home/gib/.codex/worktrees/Spoon/spoon-stabilize-unify-build/.superpowers/sdd/progress.md`.

Integrated Phase 1 commits, newest first:

```text
8af33fc fix(worker): always release stopped workspaces
00f96a1 fix(agent-jobs): close maintenance jobs after decision
1e1435e fix(agent-jobs): recover failed claim decryption
cf45404 fix(agent-jobs): validate claims before claiming
926008f fix(workspace): skip queries for missing jobs
2beeeb1 fix(app): handle nullable detail consumers
ed21126 fix(app): add friendly not-found handling
c4d0f52 fix(terminal): use real TTY exec and resize
906f906 fix(backend): use generated import extension
bdb2964 fix(sync): honor per-spoon auto-sync settings
57c175a fix(worker): contain workspace paths against symlinks
2bc090c chore: remove terminal task scratch report
d4a3856 fix(workspace): key shell by job
020ffbf fix(worker-auth): unify token checks and bind job environment
feb3723 fix(terminal): preserve animation-frame first fit
75d0639 fix(terminal): refit after fonts load
0b5a2c0 fix(worker): ensure reconciled boxes before acquire
284f7ea fix(worker): serialize box failure and idle reaping
490c053 chore: remove implementation scratch report
0a4461e fix(agent-jobs): prevent terminal status resurrection
9e7a872 fix(worker): make user-box lifecycle concurrency-safe
daec4d6 fix(worker): make workspace cleanup layout-aware
```

## Immediate next action: finish Phase 1 Task 6

Task 6 is complete on its isolated branch/worktree but has not had its final
post-fix review and has not been integrated.

- Worktree: `/home/gib/.codex/worktrees/Spoon/phase1-task6`
- Branch: `codex/phase1-task6`
- Commits to review and integrate:
  - `bdebacc fix(agent-jobs): add heartbeat cancel and stale recovery`
  - `233032a fix(worker): make cancellation teardown failure-safe`
- Report: `/tmp/spoon-phase1-task6-report.md`
- Requirements brief:
  `/home/gib/.codex/worktrees/Spoon/spoon-stabilize-unify-build/.superpowers/sdd/task-6-brief.md`

The first review found that Codex was not actually killed on cancellation and
that fallible event/status operations could bypass timer and ownership cleanup.
Commit `233032a` addresses those findings with:

- a job-specific in-box Codex process session;
- PID plus `/proc/<pid>/environ` marker validation before isolated TERM/KILL;
- serialized heartbeat cancellation so ticks cannot overlap;
- failure-safe explicit stop, draft-PR, cancellation, and claim-failure cleanup;
- worker regressions for Codex kill, duplicate ticks, and teardown rejection;
- expanded backend stale-recovery matrix tests.

Reported checks on that exact branch: worker format/lint/typecheck and 51/51
unit tests pass; backend 47/47 unit tests pass; stale-recovery matrix 8/8.
The timeout-not-requeue policy is explicitly documented as the plan's deliberate
deferral. Live Docker/Podman isolation remains untested.

Resume sequence:

1. Dispatch a fresh read-only reviewer for Task 6 over both commits and the
   updated report. Recheck the two prior findings, job-specific kill safety,
   timer serialization, all teardown paths, recovery thresholds/statuses, and
   tests.
2. Fix and re-review any Critical/Important finding.
3. Cherry-pick `bdebacc` and `233032a` into the integration worktree. Expect
   possible conflicts in `worker.ts` and `agentJobs.ts` because Task 7 was
   integrated afterward. Preserve Task 7's `finally`-based workspace release
   semantics while retaining Task 6's heartbeat cleanup.
4. Run fresh integrated worker focused/full tests and typecheck; run backend
   focused tests using the generated-file workaround below.
5. Append Task 6 to `.superpowers/sdd/progress.md`, mark Phase 1 complete, and
   perform a broad Phase 1 review before starting Phase 2.

## Remaining work

After Task 6, implement all tasks in these plans in order:

1. `docs/superpowers/plans/2026-07-10-spoon-phase2-runtime-unification.md`
   — 12 tasks.
2. `docs/superpowers/plans/2026-07-10-spoon-phase3-dev-box-surface.md`
   — 11 tasks.
3. `docs/superpowers/plans/2026-07-10-spoon-phase4-sync-correctness.md`
   — 12 tasks.
4. `docs/superpowers/plans/2026-07-10-spoon-phase5-notifications-polish.md`
   — 15 tasks.

The Phase 2 plan has been preflight-read and no conflict with the implemented
Phase 1 APIs was identified. Do not overwrite Phase 1 task briefs in
`.superpowers/sdd/` until Task 6 is fully reviewed and integrated; the
`task-brief` helper uses generic task numbers.

## Required execution/review workflow

- Use a fresh implementer per task and a fresh task-scoped reviewer after each
  task. Fix all Critical and Important findings, then re-review.
- Isolate concurrent tasks in separate worktrees/branches. Never let agents
  commit concurrently in the same worktree.
- Before cherry-picking an isolated commit, inspect `git show --stat` and ensure
  it contains only project files. Two earlier agents accidentally committed
  `.superpowers/sdd/task-*-report.md`; those scratch reports were removed by
  `490c053` and `2bc090c`. Put future reports under `/tmp`.
- After review approval, cherry-pick into the canonical integration worktree,
  run fresh controller-side focused checks, and update the scratch ledger.
- Preserve unrelated changes and never edit
  `packages/backend/convex/_generated/**` or `packages/backend/convex/http.ts`.
- Commits must use a simple `git commit -m "message"` with no AI attribution.
- Use conventional commit messages and minimal comments.
- Run `bun typecheck`, not a production build, for routine validation.

## Environment and validation limitations

The local server, local database, Docker-backed worker, and Convex deployment
are unavailable. Continue implementation and static/unit checks as requested;
record live/manual checks for later.

Root `bun install --frozen-lockfile` fails on the untouched baseline because
Bun 1.3.10 wants to rewrite the lockfile. The integration worktree currently
uses a root `node_modules` symlink to the original checkout. Do not commit any
dependency artifacts or lockfile rewrite merely to work around this.

Convex codegen cannot run without `CONVEX_SELF_HOSTED_URL` plus admin key or
`CONVEX_DEPLOYMENT`. For backend unit tests/typecheck that do not require newly
generated API declarations, temporarily link the ignored generated snapshot:

```bash
cd packages/backend
ln -s /home/gib/Documents/Code/Spoon/packages/backend/convex/_generated convex/_generated
bun run test:unit -- <focused-test>
bun run typecheck
rm convex/_generated
```

Never commit that symlink and do not claim fresh codegen succeeded. New API
typing may remain unavailable until deployment credentials return.

For Next component tests in a worktree, temporarily make the Vitest workspace
package resolve inside that worktree:

```bash
mkdir -p apps/next/node_modules/@spoon
ln -s ../../../../tools/vitest apps/next/node_modules/@spoon/vitest-config
cd apps/next
bun run test:component
cd ../..
rm apps/next/node_modules/@spoon/vitest-config
rm -r apps/next/node_modules/.vite apps/next/node_modules/.vite-temp 2>/dev/null || true
rmdir apps/next/node_modules/@spoon apps/next/node_modules 2>/dev/null || true
```

## Known deferred/manual checks

- Inspect a live `spoon-box-*` and confirm Docker `HostConfig.Init` is true.
- Verify real terminal resize, glyph rendering, and tmux reconnect in a browser.
- Verify Task 6 cancellation kills only the selected job's Codex process group
  under real Docker and Podman.
- Run each phase's plan-specific live/manual checks when the local stack returns.
- Task 9 has one non-blocking review note: worker-auth tests assert
  `ConvexError` type but not both exact error strings. Consider covering this
  during final review.
- The realpath containment design has the documented validation-to-I/O TOCTOU
  window; descriptor-relative elimination was outside the approved plan.

## Final completion requirements

After all 63 tasks:

1. Run a broad whole-branch review against the design spec and all five plans.
2. Fix all Critical/Important findings in one coordinated pass and re-review.
3. When the environment is available, run `bun typecheck`,
   `SKIP_E2E=1 bun run ci:check`, `bun test:e2e`, container smoke, and the
   documented live runtime/manual checks. Until then, report them as deferred,
   not passing.
4. Use the finishing-development-branch workflow; do not merge, push, or open a
   PR unless the user explicitly requests it.

