okf-principles · git:20260817.a2d7b4c · 2026-08-17 · sha256 b25d164900a7721c

okf-principles git:20260817.a2d7b4cA

Immutable. This exact content is served forever at /api/v1/blob/b25d164900a7721c.

---
name: okf-principles
description: Restructure agent instruction artifacts (Claude Agent Skills, rules files, CLAUDE.md, playbooks) by applying five structural principles derived from the Open Knowledge Format - bounding the worst-case context a question loads (the mean may rise; the win is the tail and answer accuracy) and making cross-references survive rewrites. Use this skill whenever the user wants to split a monolithic skill or reference file, reduce context loaded per question, add an index layer, make cross-references survive rewrites, or audit a skill's structure for efficiency. Also use it when the user mentions progressive disclosure, token-efficient skills, or restructuring instructions for agents.
---

# okf-principles

Restructures instruction artifacts so an agent loads only what a question
needs. The measured payoff is the tail, not the average: a split bounds
the worst-case context per question and removes the cheap confident
wrong answers blind scrolling produces - mean bytes may rise slightly,
and that is not a failure. This file is the index: read the one
principle file the task calls for, not all five.

## The five principles

* [Index first](references/index-first.md) - the reader decides what to
  load, so structure must be inspectable before it is consumed. Read when
  splitting a monolith, writing an index, or indexing a vendored or
  generated file you cannot edit.
* [Keyed identity](references/keyed-identity.md) - references are keyed,
  never positional, because agents rewrite. Read when adding rule IDs or
  fixing cross-references before a file move.
* [Permissive reading](references/permissive-reading.md) - partial
  structure must still work. Read when writing reader-side instructions
  or migrating incrementally.
* [No tooling required](references/no-tooling.md) - plain text that
  survives being read as prose. Read when tempted to add a format,
  schema, or parser.
* [Kind over location](references/kind-over-location.md) - a file
  declares what it is; folders are free to change. Read when organizing
  directories or labeling index entries.

## Procedure for restructuring an existing skill

1. Inventory: list every file, its line count, and what questions it
   answers. A file answering unrelated questions is a split candidate.
   Mark any file that is vendored, generated, or third-party: those are
   never split - they get an index beside them instead (see
   rule ss-index-beside-foreign).
2. Split along question boundaries, not size. Each resulting file should
   answer one family of questions (per verb, per workflow, per format).
3. Write the index per [index-first](references/index-first.md). Every
   entry needs a description an agent can route on, and coverage must
   match the index's claim - especially for an index promoted from
   inside a file, which inherits its old host's narrower scope silently
   (rule ss-coverage-matches-claim).
4. Key every rule worth citing per
   [keyed-identity](references/keyed-identity.md), then repoint existing
   cross-references at keys instead of paths and section names.
5. Add reader guidance per
   [permissive-reading](references/permissive-reading.md) so a half
   migrated state stays usable.
6. Verify against the anti-goal with a fixed question set, judging the
   worst question rather than the mean (rule ss-measure-worst-case): one
   that loads more files or bytes than before names the boundary to
   merge back. Where a topic moved between files, leave a pointer at the
   old seam (rule ss-seam-pointers).

## Anti-goals

Do not port machine-oriented metadata (trust tiers, provenance chains,
attestation, changelogs) into a skill. Those solve multi-agent corpus
problems; a skill has one author and lives in version control. Do not
add frontmatter keys beyond what the host harness defines unless a
machine must read them; prefer expressing structure in the index body,
which no harness parses. <!-- rule: ss-no-ceremony -->