Summary
This is Pass 1 of the klappy.dev bifurcation: a non-destructive audit that routes files to their future repos via frontmatter, so a later extraction is git grep target_repo + copy. It writes tags only; it moves nothing. The receiving session should be able to execute without the originating conversation — everything needed is here and in the DR.
Why a tag and not a move: the move is a separate, later pass, and combining a relocation with the editorial work of the universality pass risks corrupting the daily-driver knowledge base. One observation pass now; action passes later.
Locked decisions (do not re-litigate)
- Destinations:
"outcomes-driven-development"(core canon/governance),"oddkit"(engine docs/governance), klappy.dev (everything else, untagged)."undecided"for contested files. - Tag movers only (~232 md). Untagged = stays. This honors
meaning-must-not-depend-on-pathvia a single default rule, without 451 redundant edits. - Field name is
target_repo— notscope(overloaded in this canon: scoped-truth, scope-over-folders). - Branch
scope-audit, never a direct commit tomain(the Worker readsmainat runtime). - "Search and copy" =
git grep, notoddkit_search(the Worker indexes only a fixed field subset;target_repowon't be indexed unless that's separately extended — out of scope here). universality(the TruthKit-KB seed marker, universal vs software-clothing) is a second pass requiring a read of the ODD spine. Not in this PR.DEAD/archive (docs/archive, apocrypha PDF) is punted — leave in place, do not tag.
Scope
In scope:
- Add
target_repo(quoted-string enum) tocanon/meta/frontmatter-schema.md. - Allowlist
target_repoinscripts/validate-frontmatter.pyand update fixtures inscripts/tests/. - Write
target_repointo the ~232 markdown mover files (confident → repo; contested →"undecided"). - Create sidecar
canon/meta/scope-map.jsonfor the ~11 non-markdown movers (e.g.canon/meta/pack.json). - Open one PR on branch
scope-audit; do not merge.
Out of scope:
- Moving/copying any file to another repo.
- The
universalitypass (needs the ODD spine read). - Worker changes to index
target_repo. docs/archive, the apocrypha PDF, and any klappy.dev "stays" file (left untagged).
How to reproduce the file classification
The classification is deterministic from the live tree, not a stored list:
GET /repos/klappy/klappy.dev/git/trees/main?recursive=1→ 769 blobs (the catalog index is stale; use the tree).- Apply the bucket rules in the DR and the manifest below. Buckets map to
target_repo:- core →
"outcomes-driven-development"(~138 md) - tool →
"oddkit"(~94 md) - personal/archive → untagged (stays in klappy.dev)
- core →
- Movers = core + tool ≈ 232 markdown files + ~11 non-markdown (sidecar).
Confident routing (folder-level)
"outcomes-driven-development":canon/values/,canon/definitions/,canon/diagnostics/,canon/defaults/, mostcanon/constraints/andcanon/principles/andcanon/methods/(the universal subset — see manifest),canon/bootstrap/, all structuralodd/(manifesto, contract, maturity, terminology, prompt-architecture, gate/, challenge/, challenge-types/, encoding-types/, getting-started/, appendices/, constraint/)."oddkit":docs/oddkit/,interfaces/mcp|manifest|canon-frontmatter/,canon/meta/pack.json(sidecar),canon/constraints/{retrieval-disclosure-contract, oddkit-action-registration-completeness, release-validation-gate, telemetry-governance, telemetry-validation-gate, core-governance-baseline, canon-integration-audit, audit-gates-are-spawned-agent-sessions, frontmatter-validation-before-merge},canon/principles/{vodka-architecture (see fork), dry-canon-says-it-once, consistency-same-pattern-every-time, cache-fetches-and-parses, envelope-time-fields, partial-data-..., async-by-default, identity-resolved-by-protocol}, governance tooling inscripts/(exceptsurfacing-report.py, which is klappy.dev-only → untagged).- Untagged (stays):
writings/,about/,draft-zeros/,journal/,docs/(exceptdocs/oddkit/),canon/{apocrypha, resonance, observations, voice, case-studies, architecture, CHANGELOG.md},odd/{ledger, handoffs, decisions, backlog}, and the heavy R&D incanon/methods/{spawned-agent-session-*, persona-shaped-agent-runtime, trigger-source-taxonomy, quality-attribute-tension-survey}.
Contested → target_repo: "undecided" (do not guess)
~29 file-level calls plus three cross-cutting forks. The forks:
- Writing-vertical cluster —
canon/meta/{writing-canon, triangle-of-yaps},canon/constraints/{ai-voice-cliches, guide-posture, dual-context-writing, relational-sensitivity, author-identity-language, harness-disambiguation},canon/methods/{revision-lens-sequence, using-ease-and-resistance-as-signals, choosing-the-right-narrative-container, writing-apocrypha-fragments, writing-predocumentaries}. Lean: klappy.dev. Flips to core only if the core should ship a worked vertical. - vodka/oddkit-architecture principles —
canon/principles/{vodka-architecture, prompt-over-code, kiss-simplicity-is-the-ceiling, maintainability-one-person-indefinitely, doing-less-enables-more, antifragile-failures-grow-canon}. Split: most → oddkit;prompt-over-codeandantifragilelean core. AGENTS.md— must be split: creed+axioms half → core; oddkit-MCP-integration half → oddkit. Tag"undecided"until split.
Execution steps
- Branch
scope-auditoffmain. Fetch the recursive tree; compute movers per the rules above. Fetch each mover's blob SHA from the branch (not main) before committing. - Edit
canon/meta/frontmatter-schema.md: addtarget_repoas an optional quoted-string enum ("outcomes-driven-development" | "oddkit" | "undecided"); document "absent = klappy.dev." - Edit
scripts/validate-frontmatter.py: allowlisttarget_repo; add valid/invalid fixtures underscripts/tests/; confirmtest_validator.pypasses locally. - Insert the
target_repo:line into each mover's existing YAML block (quoted value; do not reorder other fields; do not touch body). Contested →"undecided". - Write
canon/meta/scope-map.jsonfor non-md movers:{ "<path>": "<target_repo>" }. - Commit via the Git Data API (create blobs → tree → commit → branch ref) to avoid 769 single-file calls. Open the PR; do not merge. Title: "scope-audit: tag movers with target_repo (bifurcation pass 1)".
- Verify (Reality Is Sovereign): the PR's CI (
canon-quality.yml) passes;git grep 'target_repo: "outcomes-driven-development"' | wc -l≈ 138;... "oddkit"≈ 94; no value outside the enum; renderer smoke (a tagged page still renders).
Verification / definition of done
- One PR open on
scope-audit;mainuntouched. frontmatter-validation-before-mergeandcanon-qualityCI green.- Mover counts match (~138 / ~94); contested files carry
"undecided". - Sidecar present for non-md movers.
- No file moved; no body content changed;
docs/archiveand the PDF untouched.
Open / next (DOLCHEO O, forward-pointing)
- P1 — Resolve the 3 forks + ~29
"undecided"files, then flip those tags. - P1 —
universalitypass: read the ODD spine, tag the ~138 core filesuniversalvssoftware; that set is the TruthKit-KB seed. - P2 — Decide whether to extend Worker frontmatter indexing to include
target_repo(enablesoddkit_searchrouting; otherwise grep-only). - P2 — Confirm the current epoch; bump if this thread warrants its own epoch declaration.
- P3 — Deferred: private-repo support in oddkit; apocrypha PDF → release asset;
docs/archivecleanup.
Handoff fields (DOLCHEO H)
- blocked_by: maintainer go-ahead to write to the public repo (branch + PR).
- owner: next session.