Defame1297 69119f4754 docs: reconcile the ADRs, gates and audit log with the shipped behaviour
Why

A six-agent review of the two preceding commits found their code sound -- the
differential claim holds, the published hook contract is byte-unchanged -- but
their prose drifted from it in three ways: statements of fact the code
contradicts, markers in a convention this repo does not use, and figures that
went stale when the merge changed what they counted.

Implementation Notes

ADR-0025's edge-path table is rewritten around one stated doctrine: exit 0 is
audited and clean, exit 1 is audited with findings or a target present but
unreadable, exit 2 is that nothing was audited. Its old row 1 promised "one
generic matches-neither message" for three different inputs; there are three
distinct messages, and the missing-path case exited 1 until the preceding commit
fixed it. Rows are added for the preflight and CDPATH changes, because a table
claiming to enumerate every entry-point behaviour change reproduces its own
"an earlier revision of this ADR said they were behaviour-neutral" failure if it
omits any.

ADR-0025 also gains a Consequences supersession record in ADR-0016's form:
partially-superseded entries for 0008, 0014, 0020 and 0021, and explicit
"is not superseded" entries with reasoning for the rest. Twelve ADRs are amended
and it previously listed none.

ADR-0008 moves from an amendment note to partially superseded. Its contract
genuinely narrowed -- an agent .md outside an agents/ directory was audited
before the merge and is refused now -- and ADR-0020 already recorded that the
merge "reopens ADR-0008". Its detector description said "a path under
.apm/agents/", the phrasing ADR-0025 rejects as wider than the script and
circular; the shipped rule is a .md whose immediate parent is named agents/, at
any scope.

ADR-0020's amendment claimed the boundary resolver is sourced by
validate-provenance.sh. It is not, and never was; only validate.sh sources it,
once per mode branch. Three Home-column entries pointed at reference filenames
the merge renamed, one of which now resolves to two files because its row covers
skills and agents.

Five ADRs opened with "Skill renamed per ADR-0025", a form this repo does not
use, in the same commit that used the conventional "Amended by ADR-0025" twice.
They are normalized. "Renamed" was also wrong: the BREAKING-CHANGE trailer says
the skills were removed and their flows merged.

SIMPLIFICATION-AUDIT.md had 2026-09-15 notes attached to headlines that were
never updated, against its own convention of correcting in place with
strikethrough. Every figure here was re-derived at HEAD by command, and several
differed from the review's own numbers, so the notes record the basis rather
than the result alone.

LESSONS.md asserted the two review-time suite failures were the SIGPIPE race.
The commit that fixed that race explicitly declined to claim it -- the suite was
running while agents edited live config files -- so the hedge is restored.

Impact

No code, test or configuration change; documentation only. Suites stay 20/20
strict with 0 skipped and 374/374 bats. No gate parses ADR or gates.md content,
so nothing here is load-bearing for a hook.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YR2CjVumUbEGWcMikcoXBD
2026-09-16 09:14:01 +00:00

holocron

The global AI development configuration repository — the authoritative source for agent definitions, skills, workflows, and prompts across all projects. Built as a homelab tool intended to scale to professional environments.

Content ships as six installable plugins, each an apm (Agent Package Manager) package. This repo consumes its own plugins through apm, so the working copy runs the same released content every other consumer gets.

Repo layout

Path What it holds
plugins/ Six apm packages — bin, core, git, gitea, kyberforge, lint — each carrying skills, and where relevant agents, hooks, and bundled assets
providers/claude-code/ Claude Code adapter, deployed to ~/.claude/ via scripts/install.sh
core/ Provider-agnostic always-on content — core/AGENTS.md and core/instructions/
docs/ Specs (docs/spec/), architectural decisions (docs/adr/), governance, research, and notes
scripts/ Install, sync, and check scripts used by the git hooks
tests/ run-tests.sh, run-bats.sh, the test-*.sh suites, and the bats submodules

The six plugins:

  • kyberforge — skills and agents for creating, maintaining, and managing a Claude Code / Copilot CLI plugin marketplace
  • git — conventional commits, branches, history, submodules, worktrees, remotes, pre-commit hook authoring and running (pc-author / pc-run), and an interactive router (git-workflow)
  • gitea — issues, pull requests, labels, milestones, releases, branches, files, and an interactive router (gitea-workflow)
  • core — authoring and auditing a repo's AGENTS.md and the provider adapter files that defer to it
  • lint — configuring and running linters
  • bin — cross-cutting workflow skills not yet split into a focused plugin: research, documentation, TDD, prototyping, triage, diagnosis, architecture review, requirement grilling, compressed output (caveman), and re-orienting mid-task (zoom-out)

Prerequisites

Install all of these before setting up. Each one is a hard dependency of a git hook or a script — several fail with an unhelpful "command not found" if missing.

Tool Why Install
apm CLI Two pre-push hooks shell out to it (apm-audit-ci and apm-pack-check-clean) The apm-install skill, or curl -sSL https://aka.ms/apm-unix | sh. Verify with apm --version
python3 + PyYAML Required by scripts/skill-size-check.sh (the skill-size-check pre-commit hook), which reads folded YAML frontmatter python3 is usually present — pre-commit is itself a Python application. pip install pyyaml if the hook reports PyYAML missing
vale Required by the vale-audit-prefilter-skill / -agent pre-commit hooks, and by the test-vale-wrap.sh / test-vale-hooks-consumer.sh suites that run-tests --strict runs at pre-push brew install vale (macOS), snap install vale (Linux), choco install vale (Windows), or https://vale.sh/docs/vale-cli/installation/
claude CLI Required by the validate-marketplace pre-push hook Claude Code

Two notes worth reading before you skip one:

  • PyYAML is a hard requirement, not an optional accelerator. The hand-rolled fallback frontmatter reader was removed deliberately: a reader that mis-parses an unfamiliar scalar shape reports a clean pass on a file it never measured.
  • No vale sync is needed. The Kyberforge styles are committed under plugins/kyberforge/.apm/skills/factory-audit/assets/vale/styles/, not downloaded packages (ADR-0014, ADR-0025).

Setup

Run these in order, from the repo root.

# 1. Deploy this repo's own skills and agents
apm install

# 2. Install the git hooks — all three stages
pre-commit install -t pre-commit -t commit-msg -t pre-push

apm install deploys the six plugins into .claude/skills/ and .claude/agents/. Both are gitignored install output, not authoring source — plugins/<name>/.apm/ remains the only place to edit. It needs the network and materializes apm_modules/ (which stays gitignored).

Git hooks must be wired for all three stages. This repo's .pre-commit-config.yaml has no default_install_hook_types, so a plain pre-commit install silently skips commit-msg (Conventional Commits) and pre-push (the full gate) — the -t flags above are not optional. The pc-run skill handles this and the troubleshooting around it, if you would rather not remember the flags.

Keeping the install current

The six dependencies in root apm.yml are unpinned against the default branch, so deployed skills go stale whenever anyone merges. kyberforge's SessionStart hook keeps the install current automatically on launch, rewriting apm.lock.yaml in the process — an unexplained modification to it after opening a session is expected, not a bug; commit or discard it deliberately. Mechanism and rationale: docs/adr/0019-session-start-hook-keeps-the-apm-install-current.md.

Note the difference between the two commands:

  • apm install deploys from apm.lock.yaml. It does not pick up remote changes.
  • apm update re-resolves refs. This is the command that pulls in a merged .apm/ edit.

Running tests

bash tests/run-tests.sh              # every test-*.sh script plus the bats suite
bash tests/run-tests.sh --bats-only  # just bats

The first run auto-initializes the bats submodules; no manual git submodule update needed.

A suite that exits 77 because a dependency is missing is reported as SKIPPED and does not fail an ad-hoc run. It does fail under --strict (equivalently RUN_TESTS_STRICT=1), which is how the pre-push hook invokes it — at pre-push, a skip means one of the prerequisites above is absent on this machine, and the gate would otherwise report success having run fewer suites than it appears to. The strict failure names each skipped suite and what to install.

Before pushing

Run the pre-push gate locally in one command:

pre-commit run --hook-stage pre-push --all-files

One caveat: check-release-needed is a silent no-op under this invocation. It exits 0 unless PRE_COMMIT_REMOTE_BRANCH is refs/heads/main, and pre-commit exports that only from the real pre-push git hook during an actual git push — so the hook reports Passed having checked nothing. Every other pre-push hook does run.

See docs/spec/gates.md for what each hook enforces and why.

Offline? No pre-push hook needs the network: root apm.yml's marketplace has no remote package entries (the last one, mattpocock-skills, was removed), so apm-pack-check-clean resolves everything from local sources. All pre-push hooks pass offline.

Editing plugin content

plugins/<name>/.apm/ is the only hand-edited source for plugin content — the root marketplace.json manifest is generated by apm pack, and a hand-edit there is reported as drift by apm-pack-check-clean. Hand-authored material that is not an .apm/ primitive (README.md, docs/, bin/, sources.md) lives at the plugin root instead.

Full model, including what's exempt and why: docs/spec/architecture.md.

For external consumers

Consume the packages through apm, the way this repo does — declare them as dependencies.apm git+path entries against the holocron remote and run apm install. apm is the only supported install path.

Where to go next

Description
AI development skills for Claude Code and GitHub Copilot CLI — factory, design, implement, review, and cross-cutting workflows.
Readme 14 MiB
Languages
Shell 89.7%
Python 6.3%
HTML 3.7%
JavaScript 0.3%