release-audit
Intro
/pk-release-audit is the structural correctness sweep you run before
tagging a processkit release. It answers: "are all entity files, skill
definitions, MCP server tools, and cross-references internally consistent?"
without modifying any file.
The skill complements pk-doctor: doctor covers schema validation, drift
between context/ and src/context/, and pending migrations; release-audit
covers entity frontmatter correctness, SKILL.md structural requirements, MCP
tool annotation completeness, and uses: cross-reference resolution.
Exit code is 0 if there are no ERRORs (WARNs are permitted), 1 if any
ERROR is found. This makes it suitable as a blocking CI gate before git tag.
Overview
Invocation
/pk-release-audit # detect-only; all four checks; report to stdout
uv run --script context/skills/processkit/release-audit/scripts/release_audit.py
uv run --script .../release_audit.py --repo-root=/path/to/repo
uv run --script .../release_audit.py --tree=src-context
uv run --script .../release_audit.py --tree=both
Exit code 0 = clean (0 ERRORs). Exit code 1 = at least one ERROR found.
The default context tree is the live dogfood/project tree. src-context
audits the shipped release deliverable tree under src/context/ and does
not warn when dogfood-only entity directories such as workitems/ or
decisions/ are absent.
The four checks
entity_files — walks every selected tree's <dir>/*.md for the registered
entity directories (workitems, decisions, logs, artifacts, actors,
bindings, scopes, gates, roles, migrations, team, team-members,
notes, discussions). For each file verifies:
- YAML frontmatter is present and parseable (between
--- markers).
apiVersion: processkit.projectious.work/v2 is present.
kind: is present and is one of the 13 registered kinds.
metadata.id is present and matches the filename stem.
skill_structure — walks every selected tree's skills/**/SKILL.md. For each
file verifies:
- Frontmatter has
name, description,
metadata.processkit.apiVersion, metadata.processkit.id,
metadata.processkit.version, metadata.processkit.category, and
metadata.processkit.layer for processkit-category skills.
- Body contains the four required sections:
## Intro, ## Overview,
## Gotchas, ## Full reference.
mcp_annotations — walks every selected tree's skills/**/mcp/server.py.
For each file verifies that every @server.tool(...) decoration includes
an annotations=ToolAnnotations(...) argument containing all four required
hint keys: readOnlyHint, destructiveHint, idempotentHint,
openWorldHint.
cross_references — walks every selected tree's skills/**/SKILL.md and reads
metadata.processkit.uses[*].skill. For each named skill, checks that a
corresponding SKILL.md exists at context/skills/<category>/<name>/SKILL.md
(searches all category directories, not just processkit/). ERROR per
unresolvable reference.
What release-audit will NEVER do
- Modify any file under
context/ or src/context/.
- Validate YAML schemas against
src/context/schemas/ — that is pk-doctor's
schema_filename check.
- Write to
context/logs/ — this tool is a CLI script, not an MCP server.
- Block on missing
context/templates/ — the template mirror is not consulted.
Report shape
# pk-release-audit v1.0.0
repo_root: /path/to/repo
## entity_files — 0 ERROR / 0 WARN / 47 INFO
[i] BACK-20260409_1449-BoldVale-fts5-full-text-search (workitems) — OK
## skill_structure — 1 ERROR / 0 WARN / 36 INFO
[E] skill.missing-section — context/skills/foo/bar/SKILL.md missing section: ## Gotchas
## mcp_annotations — 0 ERROR / 0 WARN / 12 INFO
[i] skill-gate:acknowledge_contract — annotations present
## cross_references — 0 ERROR / 0 WARN / 14 INFO
[i] pk-doctor → event-log — resolved
## totals — 1 ERROR / 0 WARN / 109 INFO
Gotchas
Agent-specific failure modes — provider-neutral pause-and-self-check items:
- Running release-audit as a replacement for pk-doctor. The two tools
complement each other. Release-audit does NOT check schema conformance,
drift, or pending migrations. Always run both before tagging.
- Treating cross-reference ERRORs as false positives. The
uses: resolver
searches all context/skills/<category>/<name>/SKILL.md paths. If a skill
truly exists but is in an unexpected location, the fix is to correct the
uses: entry, not to suppress the check.
- Fixing ERRORs by editing files directly without understanding the cause.
A
metadata.id mismatch ERROR means either the file was renamed without
updating the frontmatter, or the frontmatter was edited without renaming the
file. The correct fix depends on which copy is canonical — check git history.
- Running release-audit against a partial tree. The script walks the live
context/ tree from the detected repo root. Running it in a worktree or
checkout missing some files will produce false ERRORs for every absent entity
directory. Use --tree=src-context when auditing only the shipped
release deliverable.
- Ignoring WARNs before a release. WARNs indicate structural drift that
does not prevent the release but will accumulate into ERRORs in future
versions. Address all WARNs before a minor or major release.
Full reference
CLI contract
release_audit.py [--repo-root=PATH] [--tree=context|src-context|both]
| Flag |
Meaning |
--repo-root |
Explicit repo root path. Defaults to git rev-parse --show-toplevel. |
--tree |
context audits the live tree, src-context audits the release deliverable tree, and both audits both. |
Registered entity kinds
| kind |
directory |
WorkItem |
workitems/ |
DecisionRecord |
decisions/ |
LogEntry |
logs/ |
Artifact |
artifacts/ |
Actor |
actors/ |
Binding |
bindings/ |
Scope |
scopes/ |
Gate |
gates/ |
Role |
roles/ |
Migration |
migrations/ |
TeamMember |
team-members/ |
Note |
notes/ |
Discussion |
discussions/ |
Required SKILL.md frontmatter fields
name (string)
description (string)
metadata.processkit.apiVersion (string)
metadata.processkit.id (string, must start with SKILL-)
metadata.processkit.version (string)
metadata.processkit.category (string)
metadata.processkit.layer (integer or null)
Required SKILL.md body sections
## Intro
## Overview
## Gotchas
## Full reference
Required MCP tool annotation keys
readOnlyHint
destructiveHint
idempotentHint
openWorldHint
Adding a check in future versions
- Add a new check function in
release_audit.py following the
run_<name>(repo_root) -> list[Finding] pattern.
- Register it in
CHECKS at the bottom of the file.
- Add a gotcha for that check in this SKILL.md.
- Mirror the updated script to
src/context/skills/processkit/release-audit/scripts/.
1---2name: release-audit3description: Detect-only pre-release validation sweep over the processkit content tree. Walks entity files, SKILL.md definitions, MCP server tools, and cross-references, then emits a single human-readable report with ERROR / WARN / INFO counts. Use when the user invokes `/pk-release-audit`, before tagging a release, or any time you need a comprehensive structural health check beyond what pk-doctor covers. Detect-only; never modifies any file under `context/`.4---56# release-audit78## Intro910`/pk-release-audit` is the structural correctness sweep you run before11tagging a processkit release. It answers: "are all entity files, skill12definitions, MCP server tools, and cross-references internally consistent?"13without modifying any file.1415The skill complements `pk-doctor`: doctor covers schema validation, drift16between `context/` and `src/context/`, and pending migrations; release-audit17covers entity frontmatter correctness, SKILL.md structural requirements, MCP18tool annotation completeness, and `uses:` cross-reference resolution.1920Exit code is `0` if there are no ERRORs (WARNs are permitted), `1` if any21ERROR is found. This makes it suitable as a blocking CI gate before `git tag`.2223## Overview2425### Invocation2627```28/pk-release-audit # detect-only; all four checks; report to stdout29uv run --script context/skills/processkit/release-audit/scripts/release_audit.py30uv run --script .../release_audit.py --repo-root=/path/to/repo31uv run --script .../release_audit.py --tree=src-context32uv run --script .../release_audit.py --tree=both33```3435Exit code `0` = clean (0 ERRORs). Exit code `1` = at least one ERROR found.36The default `context` tree is the live dogfood/project tree. `src-context`37audits the shipped release deliverable tree under `src/context/` and does38not warn when dogfood-only entity directories such as `workitems/` or39`decisions/` are absent.4041### The four checks42431. **`entity_files`** — walks every selected tree's `<dir>/*.md` for the registered44 entity directories (`workitems`, `decisions`, `logs`, `artifacts`, `actors`,45 `bindings`, `scopes`, `gates`, `roles`, `migrations`, `team`, `team-members`,46 `notes`, `discussions`). For each file verifies:47 - YAML frontmatter is present and parseable (between `---` markers).48 - `apiVersion: processkit.projectious.work/v2` is present.49 - `kind:` is present and is one of the 13 registered kinds.50 - `metadata.id` is present and matches the filename stem.51522. **`skill_structure`** — walks every selected tree's `skills/**/SKILL.md`. For each53 file verifies:54 - Frontmatter has `name`, `description`,55 `metadata.processkit.apiVersion`, `metadata.processkit.id`,56 `metadata.processkit.version`, `metadata.processkit.category`, and57 `metadata.processkit.layer` for processkit-category skills.58 - Body contains the four required sections: `## Intro`, `## Overview`,59 `## Gotchas`, `## Full reference`.60613. **`mcp_annotations`** — walks every selected tree's `skills/**/mcp/server.py`.62 For each file verifies that every `@server.tool(...)` decoration includes63 an `annotations=ToolAnnotations(...)` argument containing all four required64 hint keys: `readOnlyHint`, `destructiveHint`, `idempotentHint`,65 `openWorldHint`.66674. **`cross_references`** — walks every selected tree's `skills/**/SKILL.md` and reads68 `metadata.processkit.uses[*].skill`. For each named skill, checks that a69 corresponding `SKILL.md` exists at `context/skills/<category>/<name>/SKILL.md`70 (searches all category directories, not just `processkit/`). ERROR per71 unresolvable reference.7273### What release-audit will NEVER do7475- Modify any file under `context/` or `src/context/`.76- Validate YAML schemas against `src/context/schemas/` — that is pk-doctor's77 `schema_filename` check.78- Write to `context/logs/` — this tool is a CLI script, not an MCP server.79- Block on missing `context/templates/` — the template mirror is not consulted.8081### Report shape8283```84# pk-release-audit v1.0.085repo_root: /path/to/repo8687## entity_files — 0 ERROR / 0 WARN / 47 INFO88 [i] BACK-20260409_1449-BoldVale-fts5-full-text-search (workitems) — OK8990## skill_structure — 1 ERROR / 0 WARN / 36 INFO91 [E] skill.missing-section — context/skills/foo/bar/SKILL.md missing section: ## Gotchas9293## mcp_annotations — 0 ERROR / 0 WARN / 12 INFO94 [i] skill-gate:acknowledge_contract — annotations present9596## cross_references — 0 ERROR / 0 WARN / 14 INFO97 [i] pk-doctor → event-log — resolved9899## totals — 1 ERROR / 0 WARN / 109 INFO100```101102## Gotchas103104Agent-specific failure modes — provider-neutral pause-and-self-check items:105106- **Running release-audit as a replacement for pk-doctor.** The two tools107 complement each other. Release-audit does NOT check schema conformance,108 drift, or pending migrations. Always run both before tagging.109- **Treating cross-reference ERRORs as false positives.** The `uses:` resolver110 searches all `context/skills/<category>/<name>/SKILL.md` paths. If a skill111 truly exists but is in an unexpected location, the fix is to correct the112 `uses:` entry, not to suppress the check.113- **Fixing ERRORs by editing files directly without understanding the cause.**114 A `metadata.id` mismatch ERROR means either the file was renamed without115 updating the frontmatter, or the frontmatter was edited without renaming the116 file. The correct fix depends on which copy is canonical — check git history.117- **Running release-audit against a partial tree.** The script walks the live118 `context/` tree from the detected repo root. Running it in a worktree or119 checkout missing some files will produce false ERRORs for every absent entity120 directory. Use `--tree=src-context` when auditing only the shipped121 release deliverable.122- **Ignoring WARNs before a release.** WARNs indicate structural drift that123 does not prevent the release but will accumulate into ERRORs in future124 versions. Address all WARNs before a minor or major release.125126## Full reference127128### CLI contract129130```131release_audit.py [--repo-root=PATH] [--tree=context|src-context|both]132```133134| Flag | Meaning |135|------|---------|136| `--repo-root` | Explicit repo root path. Defaults to `git rev-parse --show-toplevel`. |137| `--tree` | `context` audits the live tree, `src-context` audits the release deliverable tree, and `both` audits both. |138139### Registered entity kinds140141| kind | directory |142|------|-----------|143| `WorkItem` | `workitems/` |144| `DecisionRecord` | `decisions/` |145| `LogEntry` | `logs/` |146| `Artifact` | `artifacts/` |147| `Actor` | `actors/` |148| `Binding` | `bindings/` |149| `Scope` | `scopes/` |150| `Gate` | `gates/` |151| `Role` | `roles/` |152| `Migration` | `migrations/` |153| `TeamMember` | `team-members/` |154| `Note` | `notes/` |155| `Discussion` | `discussions/` |156157### Required SKILL.md frontmatter fields158159- `name` (string)160- `description` (string)161- `metadata.processkit.apiVersion` (string)162- `metadata.processkit.id` (string, must start with `SKILL-`)163- `metadata.processkit.version` (string)164- `metadata.processkit.category` (string)165- `metadata.processkit.layer` (integer or null)166167### Required SKILL.md body sections168169- `## Intro`170- `## Overview`171- `## Gotchas`172- `## Full reference`173174### Required MCP tool annotation keys175176- `readOnlyHint`177- `destructiveHint`178- `idempotentHint`179- `openWorldHint`180181### Adding a check in future versions1821831. Add a new check function in `release_audit.py` following the184 `run_<name>(repo_root) -> list[Finding]` pattern.1852. Register it in `CHECKS` at the bottom of the file.1863. Add a gotcha for that check in this SKILL.md.1874. Mirror the updated script to `src/context/skills/processkit/release-audit/scripts/`.