Where we are right now
Current epoch: E0008.3 (validation as fourth epistemic mode with context-break requirement). Canon merged. Covered in detail in klappy://docs/appendices/epoch-8-3 and klappy://canon/validation-as-epistemic-mode.
Next epoch (anticipated): E0009 — self-correction. Requires teams-over-swarms principle landing first. See O11 in the ledger.
What just shipped (this session):
klappy/klappy.dev#101— knowledge_base_url contract rename + tier strings (canon → knowledge_base, baseline → bundled)klappy/klappy.dev#106— forward-facing doc sweep for the renameklappy/klappy.dev#105— validation as fourth epistemic mode (E0008.3) + context-break requirement + session ledgerklappy/oddkit#105— governance anti-pattern audit doc (11-tool sweep)klappy/oddkit#108— telemetry_policy canary completion + rename + live smoke test templateklappy/oddkit#109— main → prod promotion of the canary arcklappy/klappy.dev#107— DOLCHEO ledger framing + 19 open items + 5 open questions (contains this handoff; merge after reading)
Verified production state: https://oddkit.klappy.dev/mcp responding with full envelope (action, result, server_time, assistant_text, debug); telemetry_policy returns governance_source: "knowledge_base" by default; strict-override via knowledge_base_url correctly falls through to minimal tier when file missing. 24/24 smoke assertions green in prod.
The governing arc that predates E0008.3 and still governs remaining work
Prompt-over-code refactor of all oddkit tools. This is where the session started and where the big remaining work still sits. E0008.3 was a detour that the canary incident forced us into — a good detour, but the canary was one tool out of eleven. The audit in docs/oddkit/audit/governance-anti-pattern-sweep-2026-04-17.md documents the full scope:
Every oddkit tool exhibits some form of the vodka anti-pattern: canon defines vocabulary (modes, challenge types, encoding types, DOLCHEO artifact types, stakes calibration, etc.), but tool code hardcodes interpretation. telemetry_policy was the first tool canary-refactored to fetch governance from the knowledge base at runtime with a bundled fallback and minimal last-resort. The same refactor is still needed for the other 10 tools.
The canary proved the pattern works. Now we scale it. The anti-pattern, the canary template, and the ship-blocker contract (live-smoke against deployed preview) are all documented in canon/constraints/core-governance-baseline.md.
Priority 1Pick up immediately
P1.1 — Internal oddkit rename (scope expanded per 2026-04-19 decision)
Original scope: rename internal canonUrl variables, ZipBaselineFetcher class, BASELINE_URL env. Expanded scope based on operator decision that there are zero external users, so backward compatibility is not a constraint:
- Strip the
a.canon_urllegacy fallback fromparseToolCallinworkers/src/telemetry.ts - Rename
canonUrl→knowledgeBaseUrlacrosstelemetry.ts(9 refs),orchestrate.ts(111 refs),zip-baseline-fetcher.ts(24 refs) - Rename
ZipBaselineFetcherclass →KnowledgeBaseFetcher - Rename
BASELINE_URLenv var →DEFAULT_KNOWLEDGE_BASE_URL(updatewrangler.tomland everyenv.BASELINE_URLreference) - Rename blob6 schema references from
canon_url→knowledge_base_urlintelemetry.tscomment block anddocs/oddkit/tools/telemetry_public.md - No aliasing, no dual-accept, no migration note — just rename and move on
- Run typecheck, deploy to preview, run
workers/test/canon-tool-envelope.smoke.mjsagainst preview, merge if 24/24 green, promote to prod
Expected size: ~150 refs across 4 files. Mechanical but real. Do this with fresh eyes — decision to defer to fresh session was explicit E0008.3 practice.
P1.2 — DOLCHE → DOLCHEO vocabulary canon
Write tier-2 canon doc (candidate path: canon/definitions/dolcheo-vocabulary.md) establishing DOLCHEO as canonical, replacing DOLCHE.
Operator's lean (from session, needs final decision): DOLCHEO replaces DOLCHE — DOLCHE was always incomplete because Open items had no home. Both Os remain O; rely on section context to distinguish.
Doc should cover:
- Why the extension (retrospective-only tracking loses forward-pointing threads)
- Each letter defined: Decision, Observation (closed), Learning, Constraint, Handoff, Encode, Open (forward-pointing)
- Guidance on when to use Open vs Handoff (Handoff = work transfer; Open = unresolved thread or question)
- Example ledger structure with Open Items sectioned by priority band (P1–P6)
Then update the oddkit_encode tool description to reference DOLCHEO and unblock that long-deferred tool description improvement. See O3 in the ledger.
P1.3 — Verify oddkit#56 and #57 are stale
Two old open PRs on oddkit from months ago, both titled "Add oddkit_write tool definition (stub)". Duplicates of each other. Check if either is still relevant given the current direction. If superseded, close with a note linking to canon. If still planned work, leave open and update the ledger with the reference.
Priority 2The prompt-over-code refactor of remaining oddkit tools
Per the audit doc (docs/oddkit/audit/governance-anti-pattern-sweep-2026-04-17.md), the canary pattern needs to be applied to each of these tools. Each one follows the same canary template: canon doc defines vocabulary → tool fetches canon at runtime → falls back to bundled tier → falls back to minimal hardcoded behavior → response envelope declares governance_source → Zod schema accepts knowledge_base_url optional override → ship-blocker live-smoke test added to the smoke suite.
Rough priority order (highest-impact anti-pattern first):
oddkit_encode— hardcoded four types (O/L/D/C/H), canon actually specifies DOLCHEO (seven letters). Biggest vocabulary mismatch in the system. Blocks tool description update until resolved. Pairs naturally with P1.2 (DOLCHEO canon doc) — do them together.oddkit_challenge— execution mode has hardcoded claim type detection via regex. Canon defines challenge types incanon/. Tool should read types from canon at runtime.oddkit_gate—problem_definedprerequisite uses hardcoded regex for transition detection. Cannot recognize writing-canon transitions without runtime canon read.oddkit_preflight— Definition of Done lookups are partially hardcoded. Should read full DoD spec from canon.oddkit_validate— Completion criteria matching is hardcoded. Canon has validation vocabulary (now including E0008.3 context-break requirement); tool should fetch.oddkit_orient— Mode classification uses hardcoded mode list. Now that validation is a fourth mode (E0008.3), tool must read modes from canon to keep pace with canon changes without code redeploys.oddkit_search— Ranking weights and tag boosts are hardcoded. Lower priority because search behavior is less load-bearing for epistemic correctness.oddkit_catalog—start_heresuggestions hardcoded. Should be canon-driven.oddkit_cleanup_storage— Probably fine as-is; mostly mechanical storage work with no canon-vocabulary dependency. Verify and mark complete.oddkit_version— Trivial tool, probably no vodka violation. Verify and mark complete.
Each refactor PR should:
- Include a canon doc update defining the vocabulary if not already canon-clean
- Pass
oddkit_preflightandoddkit_challengein canon-tier-1 or -2 mode - Extend
workers/test/canon-tool-envelope.smoke.mjswith assertions for the new tool's envelope and governance_source - Live-smoke against preview deploy before merge — ship-blocker per
canon/constraints/core-governance-baseline.md
Total scope: likely 8–10 separate PRs over several sessions. Do them in priority order; do them one at a time with full gauntlet each time.
Priority 3Canon principles queued from session
P3.1 — canon/principles/teams-over-swarms.md (tier 2)
Governing architectural preference. Cite three anchors:
- African proverb: "If you want to go fast, go alone. If you want to go far, go together." (tradeoff)
- 1 Corinthians 12: body of Christ, many members with differentiated roles (anatomy)
- Operator testimony: oddkit and klappy.dev built alone (fast), TruthKit needs a team (far) (witness)
Sections:
- Opening blockquote
- Summary (engineering argument)
- Derivation from the body metaphor (Paul's four moves: no self-disqualification, no role-elimination, no one-part-does-everything, shared fate)
- When swarms are fine (keep principle honest — batch processing, parallel independent work)
- Architectural implications pointing forward to E0009 and TruthKit harness design
See O4 in the ledger.
P3.2 — Solo-to-team transition canon record
Durable decision doc recording the operator's explicit shift. Candidate location: odd/decisions/solo-to-team-transition.md or docs/appendices/solo-to-team-transition.md.
Covers:
- oddkit + klappy.dev as complete solo arc (public field notebook / resume / book source)
- TruthKit as team-driven commercial successor
- Open-core positioning (oddkit MIT cornerstone → TruthKit proprietary harness)
- Book Nothing New, Even AI as the polished handoff document from solo to team arc
- Course (O19) as the separate teaching product derived from the same journey
Should follow P3.1 so it can reference the teams-over-swarms principle.
P3.3 — canon/patterns/bugbot-as-validator.md (tier 2, lower priority)
Codify the bugbot collaboration pattern as canonical team architecture. See O6 in the ledger. Could live inside teams-over-swarms instead; decide when P3.1 is drafted.
P3.4 — canon/principles/mechanical-work-belongs-in-code.md (tier 2, lower priority)
Principle: if a transformation is mechanical (string splitting, formatting, classification with deterministic rules), the server owns it — not the LLM. Surfaced tonight via the encode blob-vs-artifact issue. First concrete application is oddkit_encode batch-mode. See O7 in the ledger.
Priority 4Tool feature work
P4.1 — oddkit_encode batch-mode feature (O2 in ledger)
Encode currently collapses multi-artifact input into a single typed blob. Fix: server-side paragraph splitting, optional typed prefixes ([D]/[L]/[O]/[C]/[H]/[E]), returns per-artifact array with individual quality scores.
This is P2.1 (encode canon refactor) and P4.1 combined — one PR, canon doc first, then tool change. Probably the single highest-leverage remaining work after the internal rename.
Priority 5Writing thread (longer horizon, not-now-but-not-forgotten)
See O14, O15, O16, O19 in the ledger. Summary:
- Book Nothing New, Even AI — seven parts, polish/selection of public journal
- Essay: creator-cannot-be-own-critic — anchor tonight's bugbot story
- Essay: teams-over-swarms — general-audience version of P3.1 canon
- Course: chronological journey with forward-references — distinct product from the book (Q5 flags positioning decision)
Priority 6Infrastructure threads (non-urgent)
See O17, O18 in the ledger.
- Social Projector at post.klappy.dev
- klappy.dev doc-listing cache staleness under GitHub rate limits
Open questions carried forward
See Q1–Q5 in the ledger. The ones most likely to need a decision in the near term:
- Q1 — DOLCHEO replaces DOLCHE or coexists? (Decide when writing P1.2 canon doc; lean: replace)
- Q2 — Does the second O in DOLCHEO need a distinguishing letter? (Decide with Q1; lean: keep both as O)
- Q5 — Course (O19) a companion to the book (O14) or a separate product? (Decide before significant investment in either product's structure; lean: separate)
Operating notes for the fresh session
- Read the bootstrap first. Project instructions point at
klappy://canon/bootstrap/model-operating-contract. Fetch it at session start. Mode discipline, context-break requirement, and DOLCHEO-style continuous tracking all live there. - Declare mode out loud. "Exploring." "Moving to planning." "Executing." The operator should never guess.
- Search canon before asking.
oddkit_searchis essentially free. Most questions are already answered in canon. - During execution, produce artifacts. Not questions. Not check-ins. Questions belong in planning.
- Validate with fresh context. You (the fresh session) ARE the fresh context for everything listed above. That is the structural advantage. Use it.
- Run the gauntlet before declaring canon done.
oddkit_preflight→ edits →oddkit_challengein canon-tier-{1,2} mode → frontmatter audit → commit. - Live smoke before merging any MCP tool change. Ship-blocker per canon. Template lives at
workers/test/canon-tool-envelope.smoke.mjsin the oddkit repo. - Track DOLCHEO continuously. Don't wait to be asked. Add Open items to the session ledger as they surface.
Credentials and tooling reference
- GitHub PAT: see project instructions
- ANTHROPIC_API_KEY: see project instructions
- Working dirs used this session:
/home/claude/work/oddkit,/home/claude/work/klappy.dev-pr/klappy.dev - oddkit prod:
https://oddkit.klappy.dev/mcp - oddkit main preview:
https://main-oddkit.klappy.workers.dev - klappy.dev canon live on
mainbranch
Recommended first action for the fresh session
Orient. Search canon for prompt-over-code refactor oddkit tools and for vodka anti-pattern audit. Read the audit doc. Pick either P1.1 (internal rename, ~60–90 min, purely mechanical) or P1.2 + P4.1 bundled (DOLCHEO canon + encode batch-mode, ~2–3 hours, higher impact but more design work).
Either is a clean win. If operator is present, ask which they want to prioritize. If operating async from operator explicit instruction, default to P1.1 — lower-risk mechanical work is safer for an async session than design work.
Then open a new session ledger for that session's work and pick up the DOLCHEO tracking discipline from there.