Files
holocron/CONTEXT.md
Claude Code AI - Gitea MCP 598a7c326a refactor(skills): retrofit the corpus to the ADR-0020 context contract (#129)
Retrofits all 39 skills to ADR-0020's description/body context contract, then fixes what six rounds of independent review found in that retrofit — including four ways the hot gate itself failed open.

Closes #99, #107, #108, #110, #111, #114, #115, #120.

## The retrofit (waves 1-5)

| | Start | Now |
|---|---|---|
| Description FAILs (>400 chars) | 26 | **0** |
| Body FAILs (>900 words, body-only) | 9 | **0** |
| Dangling routing targets | 2 | **0** |
| `Kyberforge.CompositionNote` | 10 | **0** |
| Preload tax | 21,005 chars | **~10,500** |

Under the 12,000-char success criterion. Per-wave detail is on #99.

## The review fixes

**The gate failed open four ways, three of them found after the retrofit shipped.** An unrecognised follower token made a dangling target vanish. A skill directory with no `SKILL.md` resolved as a valid target, so a commit could be green locally and red in a fresh clone — three existing fixtures were relying on that, one of which made the install-leak A/B pass vacuously. Then the free-standing `/name` sweep turned out to be gated on the sentence carrying a boundary marker, so route notation in any other sentence was invisible — not an ERROR, not a SUGGESTION, not an INFO — which left the documented "`/name` always blocks" promise false from a second direction. All four fixed and pinned.

**Two checks were silently not running.** `validate-provenance.sh` checks 7-8 were dead across nine skills. Waking them exposed a deeper problem: they assume `Research doc:` names a source index, but 30 of 121 entries point at topic content documents, so every new check-7 INFO was a false positive and check 8 was saved from a false-FAIL flood only by an *unannounced* skip. Checks 7/8 are now scoped to source indexes and every skip announces itself (#121).

**The retrofit's own anti-goal, four times.** ADR-0020 warns that a blunt gate gets satisfied by deleting content rather than relocating it. `diagnose` and `skill-audit` relocated prose and then read it unconditionally; `prototype` and `vale-config` deleted rules outright that survived nowhere. All four addressed.

## Verification

- `bash tests/run-tests.sh --strict` — 24 suites, 0 skipped, 0 failed
- `bash tests/run-bats.sh` — 325 tests, 0 failures
- `pre-commit run --all-files` — 17/17
- `pre-commit run --hook-stage pre-push --all-files` — 16/16, with `apm marketplace check` and `apm pack --check-clean` run against the remote, not skipped
- `scripts/skill-size-check.sh` over all 39 skills — rc 0, 0 ERROR/FAIL, SUGGESTION-only
- Preload tax measured at **10,498 chars**, max description 390 — both inside budget
- Every new test proven non-vacuous by a deliberate mutation of the behaviour it covers

**Per-commit sync, stated accurately:** the ten commits from the latest review round each pass `check-plugin-content-sync` in isolation, verified by checking each out in a detached worktree with a clean between. The earlier gitea window (`dfacf05..bedbd1d`, nine commits) does **not** — its mirror was regenerated in one batch at `bbc7300`. An earlier revision of this description claimed the property held for every commit; it does not, and a bisect through that window lands on a red commit. **Squash-merge** to collapse it, or accept that this range is not bisectable.

## Version bump

Six plugins and the catalog take a **patch**, not a minor. The branch is **89 commits — 40 `fix` / 30 `refactor` / 12 `docs` / 5 `chore` / 2 `test` — zero `feat`, zero `!`, zero `BREAKING CHANGE`** — and adds no skill, agent, command or hook. (Two earlier revisions of this section cited a stale histogram, most recently 78 commits; the figures above are measured at HEAD.) Both rules this repo ships (`forge/references/version-bump.md`, landing in this PR, and `git-commits/references/conventional-commits-spec.md`) make that a patch, and the catalog set is unchanged at 7 entries.

Not settled by that: four published files were removed from the installed tree, three moved, and `caveman` gained `disable-model-invocation`, retiring its old triggers. Under a strict reading those are major-class and currently ship under `refactor:` with no marker. Whether the deployed skill surface is a public contract is written down nowhere — worth deciding, but it outlives this PR.

## Deliberately not in scope

#112 (cherry-pick ownership, now resolved in favour of `git-commits`), #113 (`rtk git` normalisation), #116 (research fan-out), #101 (audit-skill merge), #122 (non-spec skill-root files), #123 (no PRD producer) stay open. #117 is the one worth reading: the contract's remedy is to move prose into `references/`, which is exactly where neither the size gate nor Vale looks — and the blind spot is wider than #117 currently records, since there is no root `.vale.ini` at all, so every ADR, `CONTEXT.md` and `README.md` is unlinted too.

That blind spot let this branch carry two `level: error` `Kyberforge.SentenceOpenerThereIs` violations into `references/` files it created — `provider-adapter-author/references/provider-matrix.md:31` and `agent-audit/references/finding-criteria.md:95`. Both are reworded in `afadaae`, confirmed by routing each file through the audit's own `vale-wrap.sh` (1 error each before, 0 after). Five further occurrences sit in `references/` files already on `main`; those are the pre-existing corpus and stay with #117, which is the real fix.

Also unfixed and not this PR's: `apm install` appends a duplicate `SessionStart` entry to `.claude/settings.json`, so a fresh clone cannot get pre-push green without an edit AGENTS.md warns against. Reproduces identically on `main`.

Co-authored-by: Defame1297 <gitea@rkdr.net>
Reviewed-on: https://git.dev.rkdr.net/Defame1297/holocron/pulls/129
Co-authored-by: Claude Code AI - Gitea MCP <claude@noreply.git.dev.rkdr.net>
Co-committed-by: Claude Code AI - Gitea MCP <claude@noreply.git.dev.rkdr.net>
2026-09-01 13:47:46 +00:00

12 KiB

name, description
name description
AI Development Repo The domain language of the global AI development config repository

AI Development Repo

The bounded context of this repo is how agent instructions are authored, packaged, distributed, and kept small. Terms here name concepts specific to that problem. Mechanics live elsewhere: docs/spec/architecture.md for structure, docs/spec/gates.md for enforcement, docs/adr/ for decisions.

Language

Context cost

Preload tax: The always-on context cost of every installed skill's name and description, charged from the first token of every session whether the skill is invoked or not. Measurement method: ADR-0020. Its 23,427 characters is the pre-retrofit baseline, not a current reading — measured at the decision commit, before #99. Across the same 39 skills it is 10,478 characters (~2,620 tokens) as of 2026-09-01. Both figures move with the corpus, so re-derive rather than quote either: sum len(name) + len(description) over the frontmatter of every plugins/*/.apm/skills/*/SKILL.md, folding block scalars as scripts/skill-size-check.sh does. Avoid: context cost, token overhead

Skill context contract: The ADR-0020 authoring rules that hold the preload tax and body size down — a description carries a trigger clause, at most one capability clause, and a boundary clause, and nothing else. Thresholds and the target-resolution walk: docs/spec/gates.md. Avoid: skill budget, size limit

Routing target: The skill or agent name a boundary clause sends work to. It resolves when a skill or agent of that name is reachable from the file being checked, and dangles when none is — a route the router cannot take. Dangling is a blocking ERROR in route notation (/name, → name) and a SUGGESTION for a bare name nothing else in the sentence corroborates. Verdicts and the resolution walk: docs/spec/gates.md. Avoid: route, pointer, cross-reference

Dispatch body: The body pattern a skill with two or more mutually exclusive flows must use — the body carries only the dispatch table and the gates common to every branch, and each flow lives in its own self-contained references/ file. Exemplar: apm-workflow. Avoid: router body, thin body

Hand-invoked skill: A skill reached only by typing its slash command, declared disable-model-invocation: true. The host withholds it from the model-visible listing entirely, so it pays no preload tax and its description becomes human-facing text. The flag also hard-blocks the Skill tool, so no other skill can route to a hand-invoked skill — a Call `x` step in another skill's body stops working the moment x takes the flag. Check inbound routes before declaring one. Exemplar: zoom-out. Avoid: manual skill, disabled skill

Delegation discipline: The agent-side counterpart to the dispatch body. A plugin-scope agent is a single .agent.md file with no sibling references/ directory, so it cannot disclose to itself — it can only delegate to skills. Its characteristic defect is therefore restatement, not length. Avoid: agent hygiene

Distribution

Skill: A reusable slash command defined as a SKILL.md file following the Agent Skills open standard, authored at plugins/<plugin>/.apm/skills/<skill>/SKILL.md. Avoid: command, prompt, macro

Plugin: The deployable unit — one or more skills, agents, hooks, commands, and MCP servers bundled into a single installable directory under plugins/<name>/, compiled from that plugin's .apm/ source. Avoid: package, bundle, module

apm package: The unit apm builds and installs — plugins/<name>/apm.yml plus the hand-authored plugins/<name>/.apm/ tree it compiles from (ADR-0015). Avoid: plugin directory, source tree

Content mirror: The generated flat skills/, agents/, commands/, instructions/, extensions/ directories and merged hooks/hooks.json at a plugin root — also called the flat mirror — compiled from that plugin's .apm/ tree so hosts that convention-scan those paths discover the content (ADR-0017). Avoid: generated copy, duplicate tree

Output profile: An apm pack target format for a generated marketplace manifest; apm has claude (.claude-plugin/marketplace.json) and codex (the differently-shaped .agents/plugins/marketplace.json), and none for .github/plugin/marketplace.json (Copilot CLI's legacy path), which a sync script mirrors instead. Mechanics: docs/spec/architecture.md. Avoid: build target, export format

Plugin marketplace: A Git repository carrying a marketplace.json manifest that lists installable plugins. There is no backend, registry, or SaaS — the Git repo is the marketplace. Avoid: registry, store, catalogue

holocron: This repository, in its role as a plugin marketplace and as the remote the six plugin dependencies resolve against. Avoid: the marketplace, upstream

apm-consumed install: How this repo installs its own plugins as of 2026-08-14 — six dependencies.apm entries in the root apm.yml deployed by apm install, rather than claude plugin install <name>@holocron. Its consequences: ADR-0018. Avoid: apm install, dependency install

Provenance chain: The three-stage traceability record linking a skill back to its research inputs: /research produces topic docs and a sources.md; the author skill records which sources informed which files in references/sources.md and source_keys frontmatter; skill-audit validates the chain is complete and internally consistent. Avoid: sources, citations, attribution

Governance

HITL (human-in-the-loop): The agent pauses before a consequential action and a human approves before execution. Required for irreversible or high-stakes actions — architecture changes, production deployments, security configuration. Avoid: manual approval, gated action

HOTL (human-on-the-loop): The agent acts and a human monitors, able to intervene after the fact. Acceptable only for low-stakes, bounded, reversible actions where the cost of pausing exceeds the blast radius of an error. Avoid: autonomous, unsupervised

Sycophancy: The failure mode where an RLHF-trained model prioritises approval over accuracy — changing a correct answer to a wrong one under user pressure, then persisting in the wrong answer. Treated here as a first-class reliability risk, not a quality-of-life concern. Avoid: agreeableness, people-pleasing

Documents

AGENTS.md: The provider-agnostic always-on instruction file, in plain markdown with no provider-specific syntax (ADR-0003). Two exist: repo-level, and the global core/AGENTS.md deployed to ~/.agents/AGENTS.md. Avoid: instructions file, system prompt

Thin adapter: A provider-specific instruction file (CLAUDE.md, .cursor/rules/*.mdc, copilot-instructions.md) that imports its AGENTS.md and adds only that provider's syntax, carrying no original always-on content of its own (ADR-0002, ADR-0003). Avoid: wrapper, shim, provider file

LESSONS.md: The long-loop feedback log for patterns observed across sessions, at the repo root. Avoid: changelog, retro, postmortem

Management Application: A separate product in a separate repo for browsing, editing, and configuring AI development configs through a product UI, with Git as an invisible persistence layer. Repo-agnostic; this repo is its canonical default content. Roadmap: docs/VISION.md. Avoid: the UI, the dashboard, the app

Quality

Skill composition: A skill calling another skill by name to delegate a sub-task — the caller owns the orchestration decision ("when to do X"), the callee owns the mechanics ("how to do X"). Avoid: chaining, nesting, sub-skill

Vale audit prefilter: The deterministic Vale pass that runs ahead of skill-audit/agent-audit's Description dimension, so LLM judgment is spent only on what a pattern cannot catch. Mechanics: docs/spec/gates.md. Avoid: linting, style check

Authoring root: The directory a gate resolves against — the nearest ancestor of the file being checked holding plugins/*/.apm/skills or plugins/*/.apm/agents, falling back to the nearest ancestor holding .git. The walk: docs/spec/gates.md. Avoid: repo root, project root

Near-miss: A query that shares keywords with this skill but needs a different one — and, by extension, the sibling that would wrongly answer it; boundary clauses exist to exclude genuine near-misses rather than to enumerate siblings. Detail: skill-audit/references/description-quality.md. Avoid: overlap, similar skill

Vacuous green: A check that reports success because it measured nothing — zero files scanned, an unparsed value read as empty, a conditional branch that never armed. Avoid: false pass, clean run

Issue: The cross-provider term for a tracked unit of work. Gitea is this repo's canonical tracker (ADR-0007), but skills say "linked issue" generically rather than naming a provider. Avoid: ticket, card, task

Relationships

  • A Plugin bundles one or more Skills and agents; a Plugin marketplace lists Plugins; holocron is this repo wearing that hat.
  • Every model-invocable Skill pays the Preload tax. A Hand-invoked skill does not — which is the first question to settle when authoring one.
  • The Skill context contract bounds both the Preload tax (description) and the body. A Dispatch body is how a skill stays inside it; Delegation discipline is how an agent does.
  • AGENTS.md is the source of always-on rules; a Thin adapter imports it and originates nothing.
  • Skill composition is the caller/callee split. forge routes a genuinely undecided artifact type to the matching author skill — an already-specified fix (file, line, and change known) calls that author skill directly, because each routing hop re-derives instructions from a shorter brief and has been observed to drop hard constraints handed down the chain.
  • HITL and HOTL are exclusive per action class, and the choice must be explicit and documented. Sycophancy is why HOTL is not the safe default.
  • A Skill built on research carries a Provenance chain; skill-audit fails it when broken.
  • LESSONS.md feeds the standing files: three or more entries on one pattern graduate the pattern into the relevant standing document.

Example dialogue

Dev: "This one only fires when someone types the slash command. Does its description still need trigger words?" Maintainer: "No — that's a hand-invoked skill. The host withholds it from the model-visible listing, so it pays no preload tax at all and the description is human-facing text." Dev: "Then the body can be as long as it needs to be?" Maintainer: "Different budget. The skill context contract gates the body whether or not the skill is model-invoked — the description competes with every other skill's description, the body competes with the caller's live conversation. Four mutually exclusive flows means a dispatch body: table in SKILL.md, one references/ file per flow." Dev: "And if I split it into an agent instead?" Maintainer: "Then you're in delegation discipline territory. An agent has no references/ to disclose to, so the failure mode flips — it stops being length and starts being restatement of a procedure some skill already owns."

Flagged ambiguities

  • "skill" was used for both the authored SKILL.md under plugins/<name>/.apm/skills/ and the deployed copy under .claude/skills/ — resolved: the authoring source is the Skill; the deployed copy is gitignored apm install output and is never edited.
  • Skills can answer to two names, bare (gitea-prs) and namespaced (gitea:gitea-prs), depending on whether a native install exists at user scope alongside the apm one (ADR-0018) — resolved: write the bare name, which is the only form apm install produces.
  • "context" means both the model's live token window (the Preload tax sense) and the bounded domain this file describes — resolved: unqualified "context" in this repo means the token window.
  • "audit" was used for both an author skill's inline closeout and forge's independent clean-context recheck — resolved: these are two distinct layers, kept separate precisely because an audit running in the same context as the work it checks shares that work's blind spots.