Two related drift traps, both from hand-typed numbers/lists that no guard
watches:
1. CONTRIBUTING had no "how to add a tool" checklist, and its wording
("all output is gitignored") implied gitignoring was automatic — so
tool contributors kept committing generated integrations/<tool>/ output.
2. The division set and agent/division counts were hardcoded in prose in
several places and had already gone stale (CONTRIBUTING said "16" and
omitted healthcare; EXECUTIVE-BRIEF said "9 divisions").
Changes:
- Add an "Adding a Tool Integration" checklist to CONTRIBUTING (discuss-first,
reuse an existing `format`, the ~5-file touch list incl. the required
.gitignore rule, run check-tools.sh). Harmonize the "committed build
output" policy line to point at it.
- De-hardcode the division list in CONTRIBUTING — defer to divisions.json.
- Stop scattering roster counts: strategy/EXECUTIVE-BRIEF ("9 divisions") and
check-agent-originality.sh ("184-agent library") drop the number entirely;
README keeps a showcase stat but softens "232 across 16" to "230+ across
every division" so it never becomes a lie as the roster grows.
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The app can't reliably resolve runbook rosters from display names (catalog
slugs are inconsistently division-prefixed, and names drift). This adds a
machine-readable manifest so the app reads rosters as data and maps each
slug to a catalog agent for one-click team deploy.
- strategy/runbooks.json: the 4 NEXUS scenarios (startup-mvp,
enterprise-feature, marketing-campaign, incident-response), each with
mode, duration, summary, doc, and a grouped roster. Every agents[] entry
is a verified slug = the agent .md filename stem (the corpus id), resolved
against the live roster — not a slugified display name. (Notably
"Senior Project Manager" is project-manager-senior, NOT
project-management-senior-project-manager, which naive mapping assumes.)
- scripts/check-runbooks.sh + .github/workflows/check-runbooks.yml: guard
(mirrors check-divisions.sh) failing the build if any roster slug doesn't
resolve to a real agent file, a doc path is missing, or JSON is malformed —
so renaming/removing an agent can't silently break the app's deploy.
All 64 slug references verified; guard passes and fails correctly.
Claude-Session: https://claude.ai/code/session_01WKnDRWM4izsB8WAXKszhsq
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
The strategy documentation references a 'Data Analytics Reporter' agent
that does not exist. The actual agent is 'Analytics Reporter' defined in
support/support-analytics-reporter.md. This fixes all 6 occurrences
across 4 strategy files.
Fixes#291
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove all hardcoded "51" agent counts from README and strategy docs to
avoid future maintenance burden as new agents are contributed. Add Image
Prompt Engineer (Design), Sales Data Extraction Agent, Data Consolidation
Agent, and Report Distribution Agent (Specialized) to all roster listings.
Fix slug-style name on Image Prompt Engineer frontmatter.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>