Claude Code at Stratum
Canonical reference for the Stratum operational toolchain in Claude Code — how
plugins, skills, and the stratum-cli fit together. Covers new-teammate
setup, plugin lifecycle (add / rename / edit / delete), the active SC and PL plugin
index, and conventions for working in the Notion workspace.
Overview
Claude Code is the primary interface for Stratum's operational intelligence. Skills
live in plugins, plugins live in marketplaces, and
marketplaces are configured per-user in ~/.claude/settings.json.
Stratum uses two namespaces:
claude-team-config repo. Edit-once, pull-everywhere.
The shared claude-team-config repo holds: SC-* plugin sources, the
workspace CLAUDE.md, shared agents, slash-command templates, and a
setup.sh bootstrapper.
First-time setup
Run these once when joining the team. After this, day-to-day updates are just
git pull in the team-config repo.
-
Create the workspace and clone the team repo
mkdir -p ~/REPOS/Stratum\ Collective cd ~/REPOS/Stratum\ Collective git clone https://github.com/stratum-collective/claude-team-config.git -
Run the setup script
bash claude-team-config/setup.shThe script handles workspace symlinks, the workspace
CLAUDE.md, plugin cache installation, slash-command symlinks, and shared agents. It prints the exact JSON to merge into your settings file in step 3. -
Merge the marketplace block into
~/.claude/settings.jsonOpen
~/.claude/settings.json(create it if missing) and merge in both blocks — do not replace the whole file if it already has content.# Shape of what to add (use the script output for real paths): { "extraKnownMarketplaces": { "stratum-team": { "source": { "source": "directory", "path": "/Users/YOUR-USERNAME/REPOS/Stratum Collective/claude-team-config/plugins" } } }, "enabledPlugins": { "SC-operations@stratum-team": true, "SC-messaging-quality@stratum-team": true, "SC-notion-ops@stratum-team": true } } -
Restart Claude Code
Skills and slash commands are now available. Test with
/SC-operations:daily-standupor ask Claude to "run ops-triage".
What the script does automatically
| Step | What | Type |
|---|---|---|
| Workspace symlinks | settings.local.json, launch.json → team config |
AUTO |
| CLAUDE.md | Workspace CLAUDE.md → stratum-claude.md in team config |
AUTO |
| Plugin cache | Copies SC-* plugin files to ~/.claude/plugins/cache/stratum-team/ and registers in installed_plugins.json |
AUTO |
| Slash commands | Symlinks SC-* commands to ~/REPOS/Stratum Collective/.claude/commands/ |
AUTO |
| Shared agents | Symlinks team agents into each Stratum repo's .claude/agents/ |
AUTO |
settings.json |
Marketplace + enabledPlugins entries |
MANUAL |
Keeping up to date
When skills are updated (new checks, changed logic, new skills added):
cd ~/REPOS/Stratum\ Collective/claude-team-config
git pull
bash setup.sh # refreshes cache copies with latest skill files
bash setup.sh — it will repopulate the cache and re-register
everything automatically.
Plugin lifecycle
Plugin source lives in one place; each user's Claude Code reads from a per-user cache copy. Any source edit must sync to cache or the change won't show up in the running session.
Health check
Run before any rename, install, or major refactor, and after any edit to plugin source:
bash ~/.claude/plugin-health.sh
Checks seven things:
- Every registry
installPathdirectory exists - PL source → cache is current (no newer source files)
- SC source → cache is current (no newer source files)
- No legacy
@localregistry entries - Every
SKILL.mdname:field matches{plugin-dir}:{skill-slug} - Every backtick-quoted skill reference in scheduled tasks resolves to a known plugin
- No orphaned cache dirs in either marketplace
Adding a new plugin
SC plugin (shared):
# 1. Create source dir in team config
mkdir -p ~/REPOS/Stratum\ Collective/claude-team-config/plugins/SC-{name}/skills/{skill-slug}
# 2. Write SKILL.md โ name field must be SC-{name}:{skill-slug}
# 3. Sync to cache
mkdir -p ~/.claude/plugins/cache/stratum-team/SC-{name}/unknown
rsync -a ~/REPOS/Stratum\ Collective/claude-team-config/plugins/SC-{name}/ \
~/.claude/plugins/cache/stratum-team/SC-{name}/unknown/
# 4. Register in installed_plugins.json
# Add: "SC-{name}@stratum-team" โ installPath: cache/stratum-team/SC-{name}/unknown
# 5. Commit so teammates get the new plugin
cd ~/REPOS/Stratum\ Collective/claude-team-config
git add plugins/SC-{name} && git commit
# 6. Health check, then restart Claude Code
bash ~/.claude/plugin-health.sh
PL plugin (personal):
# 1. Create source dir
mkdir -p ~/.claude/plugins/PL-{name}/skills/{skill-slug}
# 2. Write SKILL.md โ name field must be PL-{name}:{skill-slug}
# 3. Sync to cache
mkdir -p ~/.claude/plugins/cache/patrick-local/PL-{name}/unknown
rsync -a ~/.claude/plugins/PL-{name}/ ~/.claude/plugins/cache/patrick-local/PL-{name}/unknown/
# 4. Register in installed_plugins.json
# Add: "PL-{name}@patrick-local" โ installPath: cache/patrick-local/PL-{name}/unknown
# 5. Health check, then restart Claude Code
bash ~/.claude/plugin-health.sh
Renaming a plugin
Follow exactly — skipping steps causes the cache/registry split that broke the WS-venture-studio rename in 2026-04-24.
# PL example (substitute SC paths and stratum-team marketplace as needed)
# 1. Rename source dir
mv ~/.claude/plugins/OLD-name ~/.claude/plugins/NEW-name
# 2. Create new cache dir and sync
mkdir -p ~/.claude/plugins/cache/patrick-local/NEW-name/unknown
rsync -a ~/.claude/plugins/NEW-name/ ~/.claude/plugins/cache/patrick-local/NEW-name/unknown/
# 3. Delete old cache
rm -rf ~/.claude/plugins/cache/patrick-local/OLD-name
# 4. Update installed_plugins.json key + installPath
# 5. Update SKILL.md name: fields
find ~/.claude/plugins/NEW-name -name SKILL.md -exec \
sed -i '' 's/OLD-name:/NEW-name:/g' {} \;
# 6. Update internal references in plugin files
find ~/.claude/plugins/NEW-name -type f \( -name "*.md" -o -name "*.json" -o -name "*.sh" \) -exec \
sed -i '' 's/OLD-name/NEW-name/g' {} \;
# 7. Grep for stale references in scheduled tasks + config
grep -r "OLD-name" ~/.claude/scheduled-tasks/ ~/.claude/CLAUDE.md 2>/dev/null
# 8. Health check must pass before restarting
bash ~/.claude/plugin-health.sh
# 9. Restart Claude Code
Editing a plugin skill
Any source edit creates cache drift. Always sync after editing:
# SC
rsync -a ~/REPOS/Stratum\ Collective/claude-team-config/plugins/SC-{name}/ \
~/.claude/plugins/cache/stratum-team/SC-{name}/unknown/
# PL
rsync -a ~/.claude/plugins/PL-{name}/ ~/.claude/plugins/cache/patrick-local/PL-{name}/unknown/
The health check detects drift automatically — run it after edits to see which plugins need syncing.
Deleting a plugin
# 1. Remove source dir
rm -rf ~/.claude/plugins/PL-{name} # PL
rm -rf ~/REPOS/Stratum\ Collective/claude-team-config/plugins/SC-{name} # SC
# 2. Remove cache
rm -rf ~/.claude/plugins/cache/patrick-local/PL-{name} # PL
rm -rf ~/.claude/plugins/cache/stratum-team/SC-{name} # SC
# 3. Remove registry entry from installed_plugins.json
# 4. Check for stale references
grep -r "{name}" ~/.claude/scheduled-tasks/
# 5. Health check
bash ~/.claude/plugin-health.sh
Teammate sync (SC plugins)
Teammates pull claude-team-config and run:
cd ~/REPOS/Stratum\ Collective/claude-team-config
git pull
bash setup.sh
setup.sh syncs SC-* sources into the teammate's local cache and
registers them in their installed_plugins.json. Any rename committed to
team-config requires teammates to re-run setup.sh. PL-* plugins are not
synced — they remain personal to Patrick's machine.
What the health check does not cover
- claude-plugins-official — managed by Anthropic, treat as read-only
- Browser/service worker cache — stale HTML after a deploy; force-refresh or unregister the SW manually
- Scheduled task prompt correctness — validates plugin sources exist, not that skill logic is current
- Remote (CCR) triggers — managed at
claude.ai/code/scheduled/; health check has no visibility into remote trigger state
Active plugin index
As of April 2026. Three shared SC plugins (20 skills total) plus two personal PL plugins.
SC-operations SHARED
Operational intelligence — standup, triage, milestone gates, reporting, hygiene sweeps. Fifteen skills:
SC-messaging-quality SHARED
Phrase registry and copy-quality tooling. Three skills:
SC-notion-ops SHARED
Notion workspace quality and formatting. Two skills:
PL-venture-studio PERSONAL
Wherewithal venture incubation. Skills: build, craft.
Listed for completeness — not shared with Stratum teammates.
overnight-design-scan PERSONAL
Portfolio design quality monitoring across the Wherewithal ventures. Personal, not shared.
stratum-cli reference
The stratum-cli repo (separate from claude-team-config) is
the Node.js CLI that handles operational data flow — Notion read/write, lead
pipeline, outreach, dashboard data generation. Skills call it; you can also call it
directly.
cd ~/REPOS/Stratum\ Collective/stratum-cli
node bin/stratum.js --<command>
| Domain | Commands |
|---|---|
| Lead pipeline | --lead-import · --lead-triage · --lead-enrich · --facility-enrich |
| Outreach | --poi-batch · --compose-outreach · --sequence-advance |
| Engagement | --engagement-sync · --pipeline-status |
| Daily ops | --daily-run · --ops-tracker-hygiene · --ops-dashboard-data · --pipeline-dashboard-data |
--daily-run chains the full pipeline (lead-triage → ... →
UIS scan → ops-dashboard-data → pipeline-dashboard-data →
push-dashboard-data) and auto-commits the regenerated data.json files
to this repo. See Automation Schedule for
when each command runs in production.
Conventions & gotchas
Notion API
content_search_mode: "workspace_search"is required on everynotion-searchcall. The defaultai_searchfloods results with Google Calendar events instead of Notion pages.notion-update-pageAssignee requires theuser://UUIDprefix — bare UUIDs fail silently. Patrick:user://2dad872b-594c-817a-9a10-000221456611. Gennovva:user://2d9d872b-594c-8191-bf28-0002c2a3039e.- Never bulk move/archive Notion pages without explicit page-by-page confirmation. The 2026-03-20 incident trashed the entire workspace during a targeted cleanup.
Page naming
WF:prefix = workflow procedure (step-by-step execution an agent or human follows).OPS:prefix = operational/procedural (execution plans, deployment plans, dated reports).- No prefix = reference/guide (canonical definitions, system docs, indexes, registries).
- Decision test: "execute steps" →
WF:/OPS:. "How the system works" → no prefix.
Page icons
- Every new Notion page must have a page icon (emoji or custom).
- No emojis in page titles. Title is text-only; the icon carries the visual.
Branch & commit
- Imperative tense, concise, descriptive (e.g. "Add denial pattern classifier").
- Commit freely — tell Patrick what changed and why in the next message.
- Never skip hooks (
--no-verify) unless explicitly requested.
Troubleshooting
| Symptom | Likely cause | Fix |
|---|---|---|
| Skill not found / wrong skill fires | Plugin cache wiped or not installed | Rerun bash setup.sh, restart Claude Code |
| CLAUDE.md broken symlink | Stale symlink from a previous path | Rerun bash setup.sh — script recreates it |
| Slash command not in autocomplete | Workspace commands not symlinked | Rerun bash setup.sh, restart Claude Code |
| Plugins show in marketplace but no skills | Cache present but installed_plugins.json missing entry |
Rerun bash setup.sh |
| Cache drift after editing skill | Source updated but cache not synced | rsync source → cache (see Lifecycle » Editing) |
| git push fails with 403 | HTTPS auth not linked to gh CLI | Run gh auth setup-git |
| Notion search returns calendar events | Default ai_search mode |
Add content_search_mode: "workspace_search" |
Retired · archive only
20-agent Notion fleet
Retired 2026-03-21. The previous T1/T2 instruction architecture and all
operational intelligence have been migrated to Claude Code plugins under
claude-team-config/plugins/SC-*/skills/. The Agent Index page in
Notion is retained as a historical reference only — do not treat it as
live operational state.
T1/T2 instruction architecture
Retired with the agent fleet (2026-03-21). Skill files in
SC-*/skills/*/SKILL.md are now the canonical instruction surface for
operational behavior.