Skip to content

bnerd mission

Read-only and rotation-style operations on the mission control repository — the markdown + YAML knowledge base that :pa consumes. These commands don't require AI; they're plain CLI utilities suitable for cron jobs and scripting.

Discovery

Every bnerd mission subcommand uses the standard config + auto-detect precedence:

  1. --mission-repo /path/to/cloud/mission
  2. BNERD_MISSION_REPO (or unprefixed MISSION_REPO) env var
  3. mission-repo: in ~/.bnerd.yaml
  4. Auto-detect: walk up from cwd looking for .bnerd/context.md

If none resolve, the command exits with a clear error.

bnerd mission validate

Walks the repo and verifies every cross-reference resolves to an existing entity:

  • team[*].owns → tool slug exists
  • tool.also_in_catalog → catalog tool exists
  • tool.backed_by[*] → operated tool exists
  • client.services[*] → tool slug exists
  • deployment.tool → tool slug exists
  • deployment.client_id → client exists
bnerd mission validate
# OK — mission repo at /home/bernd/projects/src/.../mission is consistent.

If issues are found, exits non-zero and prints one line per issue:

Mission repo has 2 unresolved cross-reference(s):
  .bnerd/pa/clients/external/acme.md [services=ghost-tool] service refers to unknown tool slug
  tools/operated/gitlab.md [also_in_catalog=missing-catalog] also_in_catalog refers to unknown catalog tool

Cron-friendly: pipe stderr into your alerting channel:

0 6 * * * /usr/local/bin/bnerd mission validate 2>&1 | logger -t bnerd-mission

bnerd mission rotate week

Archives .bnerd/pa/scheduling/current.md to archive/<week>.md (where <week> is the YAML week: field, e.g. 2026-W18.md) and clears current.md. Refuses to overwrite an existing archive — pick a different name or delete the existing archive yourself.

bnerd mission rotate week
# Archived current.md to /home/bernd/.../mission/.bnerd/pa/scheduling/archive/2026-W18.md

Idempotent: if current.md is missing, prints "Nothing to archive" and exits 0.

bnerd mission rotate day

Archives .bnerd/pa/scheduling/today.md to archive/YYYY-MM-DD.md (using the YAML date: field) and clears today.md.

bnerd mission rotate day
# Archived today.md to /home/bernd/.../mission/.bnerd/pa/scheduling/archive/2026-05-04.md

You typically don't need to run this manually — mission_propose_today (called by the AI in :pa mode) auto-archives the prior day when the date changes. The CLI command exists for cron-driven cutover or manual maintenance.

When to run what

Frequency Command Why
Daily (cron) bnerd mission validate Catch broken slug references before they bite the AI
Per-edit bnerd mission validate After hand-editing the mission repo, before committing
Monday morning bnerd mission rotate week (optional — mission_propose_week auto-archives) Manual week cutover if you skipped the weekly orchestrator
End of day bnerd mission rotate day (optional — auto on next standup) Manual day cutover for record-keeping