<!-- canonical: https://klappy.dev/page/odd/handoffs/2026-04-20-post-closeout -->
<!-- content: klappy/klappy.dev@b750d7d3aa85a3e5ed6d1e2b24d63471f3df4bac -->

# Handoff — Post-Closeout State

> **Superseded 2026-04-19 by `https://klappy.dev/page/odd/handoffs/2026-04-20-p1-3-challenge-canary`.** P1.2 landed (oddkit 0.18.0 in prod — encode envelope now declares `governance_source`, DOLCHEO batch prefixes work, letter dedup in place). Next session resumes on P1.3.1 (challenge canary retrofit). The ledger for the P1.2 arc is at `https://klappy.dev/page/odd/ledger/2026-04-19-p1-2-encode-dolcheo-landed`. The content below is preserved for provenance.

> The 2026-04-19 validator closeout arc is complete. klappy.dev #116 extended the frontmatter schema (closes the sole validator open item). oddkit #112 + #113 shipped 0.17.0 to prod (CHANGELOG backfill, version bump, main → prod promotion). Prod at `oddkit.klappy.dev` reports 0.17.0, envelope smoke 24 / 24. **Next work unit is P1.2** (`oddkit_encode` batch-mode + canary refactor). The P1.2-specific handoff at `https://klappy.dev/page/odd/handoffs/2026-04-20-p1-2-encode-canary` is still the authoritative scope spec. This doc is a thin pointer — read the P1.2 handoff and start there.

---

## What shipped since the prior handoff

| PR | Repo | Merged SHA | Purpose |
|----|------|-----------|---------|
| #116 | klappy/klappy.dev | `c855ddf` | Frontmatter schema: add `status` / `superseded_by` / `governs` / `session_span` / `complements` across `canon` / `docs` / `odd` audiences. Closes the validator's O-open P1. |
| #112 | klappy/oddkit | `035dc41` | Release 0.17.0 — backfill `[Unreleased]` (E0008 → E0008.3 arc) and bump version in both package.json + both lockfiles. |
| #113 | klappy/oddkit | `34e63fb` | main → prod promotion for 0.17.0. |

**Production state:** `https://oddkit.klappy.dev/health` returns `{"version":"0.17.0"}`. Envelope smoke 24 / 24 pass against `https://oddkit.klappy.dev/mcp`. No regressions.

## What is cleared from the prior handoff

- **O-open P1** (frontmatter schema gap for `status` / `superseded_by` / `governs` / `session_span`) — closed by #116.
- **P2.1** (backfill `[Unreleased]` and cut 0.17.0) — closed by #112 and #113.

## What remains open

- **P1.2** — `oddkit_encode` batch-mode input + prompt-over-code canary refactor. See `https://klappy.dev/page/odd/handoffs/2026-04-20-p1-2-encode-canary` for the full scope, gauntlet requirements, and smoke additions. Unblocked; prerequisites satisfied (DOLCHEO canon merged, schema covers the fields).
- **P1.3** — The post-canary-refactor sweep (challenge → gate → preflight → validate → orient → search → catalog → cleanup → version). Same canary template as telemetry_policy and the forthcoming encode refactor. One PR per tool. ~8–10 more PRs over several sessions.
- **P2.2** — Render `CHANGELOG.md` on klappy.dev at `/oddkit/changelog` and add `version_notes_url` to the MCP `initialize` response. Low priority; slot in when tool envelopes are being touched anyway.
- **P3** — Carried forward: `canon/principles/teams-over-swarms.md` (tier 2), `canon/patterns/bugbot-as-validator.md` (tier 2, lower priority, may be subsumed into teams-over-swarms), `canon/principles/mechanical-work-belongs-in-code.md` (tier 2, first concrete application is P1.2).

## Thin prompt for the next session

Paste this into a fresh session to boot cleanly:

```
Resume P1.2 per https://klappy.dev/page/odd/handoffs/2026-04-20-p1-2-encode-canary.

Current state: 0.17.0 in prod (oddkit.klappy.dev), frontmatter schema
extended (klappy.dev #116 merged), validator arc from the prior session
formally closed (odd/ledger/2026-04-19-validator-closeout-and-0.17.0).

Fetch the P1.2 handoff, run the gauntlet on the DOLCHEO canon reference
if not already done (check https://klappy.dev/page/canon/definitions/dolcheo-vocabulary),
then apply the encode refactor locally (orchestrator applies, Sonnet 4.6
validates — path 3, do not dispatch Opus 4.7 execution agents to oddkit).

Credentials are in project instructions. Don't over-scope — P1.2 alone is
one session's work.
```

## Operating notes (unchanged from prior handoff)

All the operating notes from the prior handoff still apply — read them in `odd/handoffs/2026-04-20-fresh-session-continuation.md` (now superseded but still the authoritative reference for rhythm, path 3 constraint, githook behavior, CF auto-deploy pattern, and managed-agent dispatch). This handoff does not repeat that content; it points forward.

Two additions worth carrying into the next session:

- **Smoke script URL contract:** `ODDKIT_URL` must include the `/mcp` suffix. Passing a bare origin hits the site 404 page and the smoke errors with "No data payload." The script's header comment documents this (`ODDKIT_URL=https://preview-xxx.oddkit.klappy.dev/mcp`).
- **Default to parallel PR execution.** When two PRs are independent (different repos, no shared gate), draft and push both before polling either. Serial polling is a bottleneck-respect violation. Lesson from this session: the initial instinct was to wait for Bugbot on #116 before starting #112 work; operator corrected it and the two ran concurrently.

## Provenance

- **Prior fresh-session-continuation handoff:** `odd/handoffs/2026-04-20-fresh-session-continuation.md` — superseded by this document.
- **Session ledger for the closeout:** `odd/ledger/2026-04-19-validator-closeout-and-0.17.0.md` — retrospective record, full timeline, decisions / observations / learnings / constraints / open items.
- **Validator report reference:** The Sonnet 4.6 validator session `sesn_011CaDUFMF2HZ95s4t74oMmj` under agent `agent_011CaDUFJYJ6W3ZPE9DrZ4Ha` produced the VERIFIED disposition that enabled the closeout. Event log persisted in the orchestrator's ephemeral filesystem at `/home/claude/work/validator-events.json` for this session's use; not committed to the repo as the report is now summarized in the ledger above.
