CoalBoard Privacy Policy

September 2, 2026 · View on GitHub

CoalBoard collects nothing and phones nowhere.

  • No telemetry. No usage data, analytics, or identifiers are collected, stored, or transmitted — by the skill, the conductor hook, or any bundled component.
  • No network calls from the hook. The conductor hook is offline by design (Phoenix Commandment #7): it reads the prompt and .coalboard.json locally and emits an advisory directive. It opens no sockets and makes no requests. (The self-update check is the agent's /coalboard:update procedure, run only with your consent — never the hook.)
  • The board runs inside YOUR agent. CoalBoard operates no servers and receives no traffic. When it convenes, it spawns lens workers through your agent's own native subagent tool, on your account, under your platform's permission gate — CoalBoard calls no model API itself and does not bypass that gate.
  • Propose, never execute. The board writes proposals to a local .coalboard/proposed/ staging directory; nothing touches your live files or fires a side-effect until you approve. Credential patterns are scrubbed from anything logged or displayed on a best-effort, contract-enforced basis — the agent applies the scrub mandate from the skill contract at runtime; there is no shipped scrub() function (scripts/lib/secrets.mjs is the DEV reference implementation + test target, not in the plugin runtime). Defense-in-depth, never a guarantee a secret is caught — the real protection is staging + the propose-not-execute contract + each seat's least-privilege grant: leaf-ness (no seat ever holds a write or spawn tool) is platform-enforced, while a seat's run/fetch right is contract-strength on Claude Code, never a platform restriction (see Permissions in the README for the per-seat grants).
  • Error reports are manual. When a component misbehaves, your agent may offer to open a pre-filled GitHub issue; nothing is submitted automatically, and you see and edit the full contents first.
  • Local files only. All state lives in files you can read: the config (~/.claude/.coalboard.json, and an optional per-project config found in order — the executing agent's own dir first, then the fixed fallback .claude/coal/coalboard.json.agents/coal/coalboard.json.gemini/coal/coalboard.json → the legacy .claude/.coalboard.json, still read normally for an existing project (full order in README Configure)) and the project-scoped .coalboard/ staging directory (proposed/ = staged changes awaiting your approval · reports/ = audit reports & post-mortems · memory/ = a worker's private resume checkpoint, run-scoped and deleted at the end of every run). The installed skill's own runtime writes into exactly one of these: answering "always, this project" at the Fable money gate persists that one key (fableConsent: "always") into your project config (the read order above — own-dir default if none exists yet, moving a legacy file there in the same write) — no other key, and never the global config. Also stored: the self-update throttle stamp ~/.claude/coal/coalboard/update-check (a timestamp, nothing more). A repo checkout adds one more writer, outside the installed skill: scripts/configure.mjs (scripts/ is not in build-plugin.mjs's copy list, so it never enters plugin/ and an installed-only user never receives it) writes whichever key you pass it to the project config, or — with --global — to ~/.claude/.coalboard.json, the global layer; you invoke it explicitly, it is not something the board runs on your behalf.

Questions: open an issue at https://github.com/TheColliery/CoalBoard/issues.