Self-Check Baseline
manifest.json is the single source of truth for how a ClaudeTools machine
should be wired. Every machine's /self-check grades itself against this file.
It is checked into the repo and syncs to all workstations via Gitea, so updating
it here updates the standard for the whole fleet.
Why a checked-in manifest (the "how do we set a baseline" answer)
The fleet has architectural differences — Windows/macOS/Linux, amd64/arm64, boxes with and without a local GPU for Ollama. We still want every machine to behave the same. A checked-in manifest gives us that:
- Required everywhere lives in
required_*keys. Missing = a real failure on any machine, regardless of OS. - Allowed-to-differ lives in
capability_tools+capability_rules. A capability being absent is never a failure — it selects a fallback ruleset so the machine knows how to behave without it (the canonical example: no local Ollama → use the remote endpoint; if that is down too, route Tier-0 work to haiku instead of blocking on it).
identity.json (per-machine, gitignored) carries the machine's actual coordinates
and capabilities. The manifest says what's required; identity says where things are
and what this box can do; the probe reconciles the two.
How the baseline gets built (V1 census → ratified baseline)
The current manifest.json is provisional — generated from one known-good
machine (GURU-5070, 2026-06-02). It has not been confirmed against the fleet.
The build sequence:
self-check.sh fanout— ask every active instance to report.- Each machine runs
self-check.sh --publish— publishes its census to coord as componentselfcheck_<host>. self-check.sh aggregate— reads them all back and proposes:- items present on all reporting machines → required everywhere candidates,
- items present on some machines → capability-gated candidates.
- Mike reviews the proposal and edits this
manifest.jsonto ratify it, then flips"status": "provisional"to"ratified"and commits.
Until ratified, treat "extra"/"missing" skill and command findings as candidates, not gospel.
Manifest structure
| Key | Meaning |
|---|---|
schema_version, status |
manifest version; provisional or ratified. |
required_tools[] |
tools every machine must have on PATH (name, why). Missing = FAIL. |
required_python.any_of[] |
acceptable python launchers (py/python3/python). |
capability_tools[] |
optional tools; presence is INFO and toggles a capability. |
required_identity_fields[] |
dotted identity.json paths that must be set. |
required_scripts[], required_hook_files[] |
repo files that must exist (+ executable). |
required_settings_hooks[] |
hooks that must be wired in settings.json (event, command_contains, why). |
git |
expected remote host, internal IP, post-commit-hook expectation. |
skills[], commands[] |
the canonical skill dirs / command files. |
connectivity[] |
endpoints to probe (required ones FAIL if unreachable). |
capability_rules{} |
per-capability fallback behavior (the "different rules" for different hardware). |
Editing rules
- Add a required item only when it should hold on every machine, every OS. If a Windows box legitimately can't have it, it's a capability, not a requirement.
- Every
capability_toolsentry needs a story for what to do without it — encode it incapability_rules(or reference an existing tier) so the probe can print the effective ruleset. - Keep paths repo-relative and forward-slashed.
- After editing: commit +
/sync. The fleet picks it up on next pull.