Beary Productive

Shadman's AI Operating System

4 personas · 25+ agents · Claude Max · Telegram delivery · Mac LaunchAgent stack

v3.2 · May 2026 pipeline gap fixed May 10 Agent Playbook →
Nabila
Nusaybah
Musa
Kit
System
Governance
Memory
01 · Data Sources
Granola
Meeting transcripts, summaries, action items
every 15 min
→ trace flow
Reads into
Obsidian vault via granola-obsidian-sync. Also fan-out to _scratch/granola/ staging by granola_ingest.sh
Confluence
Work wiki, team docs, project pages
hourly weekdays
→ trace flow
Reads into
Obsidian vault via confluence-obsidian-sync. Used as RAG source by ask/recall router intent.
M365
Outlook calendar, email, Teams messages
06:30 + pre-cache 3x
→ trace flow
Cache written to
_work/pm-workspace/.cache/calendar-YYYY-MM-DD.json. Read by morning digest + midday ping.
GitHub
PRs, CI status, work tickets, review requests
via Kit 16:00
→ trace flow
Fetched by
kit_github_pulse.sh via gh CLI. Work repos + SSO auth. Sonnet synthesis, terse Telegram output.
Jira / TWG
Work queue, sprint tickets, backlog items
08:25 pre-digest
→ trace flow
Cache written to
_work/pm-workspace/.cache/queue-YYYY-MM-DD.json. Read by morning digest + midday ping.
GA4: CCG
claudecodeguide.dev traffic, page stats
Sun 07:30
→ trace flow
Snapshot written to
_tools/ccg-analytics/snapshots/. Read by nusaybah_outbound_pulse.sh on Mon + Thu.
GA4: PrintPick
printpick.dev traffic + affiliate conversions
Sun 07:35
→ trace flow
Snapshot written to
_tools/printpick-analytics/snapshots/. Nusaybah reads for side project revenue tracking.
Ad Server
Ad flight performance, campaign visibility, CTR
08:00 daily
→ trace flow
Output
Ad server pulse.py queries API, writes JSON. Used for work context only.
Daily Inbox
_scratch/inbox/YYYY-MM-DD.md
Telegram messages from @ShadmansRootBot written here by inbox_listener.sh
every 1 min
→ trace flow
Written by
nabila_inbox_listener.sh (crontab). Polled by nabila_router LaunchAgent every 60s for new entries.
Work Wiki
Confluence clone for RAG and work corpus
23:00 nightly
→ trace flow
Written to
_reference/library/work-corpus/ via wiki_ingest.sh + work_corpus_sync.sh. Used as RAG by ask intent.
Telegram messages land in inbox file · cache fetches pre-loaded (calendar, queue)
01b · Real-Time Router (Nabila)
nabila_router.sh every 60s
Hashes new inbox entries, classifies intent via Haiku, routes to handler
capture
recall / ask
find_time
brief_feedback
diagnose_block ✨
meta
capture → _product-brain/
Routes to project file or ideas/ fallback. Appends with topic, title, tags.
Routed to
_product-brain/PROJECT.md when Haiku matches a known project. Otherwise _scratch/content/ideas/YYYY-MM-DD-slug.md
recall → ROOT search
Sonnet queries semantic index + memory shards. URL in message = instant redirect, no 180s burn.
Uses
ROOT MCP for semantic retrieval. Sonnet model. 180s alarm timeout. URL guard: if message contains https://, skips lookup immediately and tells Shadman to ask in a live session instead. Duration log clamped to 180s ceiling to filter machine-sleep inflation from wall-clock measurements.
diagnose_block ✨ NEW
Haiku classifies block as cognitive/emotional/capability. Returns 3-line diagnosis to Telegram.
Triggers on
"stuck on", "keep avoiding", "blocked on", "can't get started". 60s timeout. Haiku model.
Intents classified and dispatched to handlers · scheduled briefs pull pre-loaded cache
02 · Persona Agents
Nabila my wife
Chief of Staff · Work + PM ops
Morning DigestMon-Fri 08:30
Queue Fetch (pre-load)Mon-Fri 08:25
Calendar Fetch (cache)05:30 / 07:30 / 12:30
Midday Ping NEWMon-Fri 13:00
Meeting CoachMon-Fri 18:00
Nina Thursday NudgeThu 09:30
Nina Friday BriefFri 13:30
Nina Post-1:1 CaptureFri 16:00
Block Scan NEWMon 08:15
Reads: calendar cache · queue cache · Granola · MEMORY.md · last-1on1-outcomes
Full-day calendar synthesis with decisions and sharp questions. Midday re-rank of top closures. Monday block scan surfaces avoidance patterns before they compound. Friday 1:1 loop: Thursday gap-check surfaces open items before the brief, post-meeting capture extracts Nina's asks and commitments so next week starts with ground truth.
Nusaybah my daughter
Outbound · Revenue + Content
Outbound PulseMon 08:00 + Thu 17:00
PrintPick Drift CheckSun 09:00
Reads: GA4 (CCG + PrintPick) · GSC · Substack · LinkedIn
Moonlight traffic via GA4 + GSC, content performance across Substack and LinkedIn, affiliate revenue signal. PrintPick drift check surfaces price drops and broken links before they erode revenue. Repurposing cadence (Tincture-inspired): when a post lands well, surfaces a Day 0-3 cross-channel republishing plan in the Monday pulse.
Musa my son
Hobby · Property Mgmt App + Medical ERP
Hobby PulseWed 19:00 + Sun 19:00
Reads: _hobby/* · Property mgmt analytics · Medical ERP status
Low-pressure builder check-in. No deadlines enforced. Musa exists so hobby projects don't get swallowed by work noise.
Kit
GitHub · PR queue + CI
GitHub PulseMon-Fri 16:00
Reads: Work repos · open tickets · CI runs
End-of-day signal on PRs needing action before morning standup. Bug ticket freshness. Review requests from teammates.
Personas read MEMORY.md + ROOT index · capture handler writes to _product-brain/
03 · Memory and Knowledge Store
Hot: Always Loaded
MEMORY.md router
CLAUDE.md
session context
Under 200 lines combined. Routes to topic shards on demand.
Constraint
200-line hard limit. Anything past that is truncated by the harness. Keep the index lean.
Warm: Loaded on Demand
_index_work.md
_index_moonlight.md
_index_infra.md
_index_feedback.md
_index_people.md
267+ topic files
Load pattern
MEMORY.md router table decides which shard to load. Never load all shards. Token budget rule: max 2 files in main thread before subagent.
Semantic: ROOT Index
ROOT MCP
Obsidian vault (5min)
hourly indexer (Haiku)
vault topic index (18:15)
How it works
ROOT indexes the Obsidian vault. Vector lookup = zero LLM tokens. Used by recall intent + planned overnight block analysis.
_product-brain/
Living project files per moonlight project. Router appends captures. Morning digest reads for context.
Pattern
One .md file per project. Capture handler appends timestamped sections. Nabila morning digest reads first 6KB of each.
_context/handoffs/
Session continuity. Handoffs written after multi-step work. Last 5 surfaced in MEMORY.md router.
Aging
Full list at _context/handoffs/INDEX.md. Last 5 entries shown in MEMORY.md. Older ones searchable via ROOT.
_reference/library/
Work corpus (weekly sync), research, Confluence clone (nightly). 90-day idle sweep.
Lifecycle
Read-only. scratch_retention.sh sweeps after 90 days idle. Build artifacts stripped on clone.
Health checks validate workspace and memory · drift detected weekly · retention sweeps run
04 · Governance and Health
Workspace Health
Invariant check: git, structure, soak rules, paths.
09:00 daily
Checks
26 invariants including: git clean, nested repo isolation, runtime state gitignored, LaunchAgent exit codes, cron log freshness, Telegram reachability.
Cost Dashboard
Daily quota usage across all LLM crons. Posts to Telegram.
22:00 daily
Why it matters
All 25+ agents share one Claude Max subscription. One quota blowout breaks all downstream agents until reset. Circuit breaker.
Log Alerter
Scans cron logs for FAIL signatures. Fires Telegram on first match.
every 15 min
Pattern
Reads _tools/scripts/.logs/*.log for lines containing FAIL. One alert per failure window. Stops noise on repeat failures.
Semantic Lint
LLM pass over workspace for drift, stale rules, broken refs.
1st Sun/month
Scope
Checks MEMORY.md shards, CLAUDE.md, rule files, skill definitions for internal contradictions and rot.
Skill Audit
Reviews Claude skill definitions for staleness.
Sun 08:00
Checks
47 skills in _context/skills/. Flags trigger conditions that no longer match real usage patterns.
Memory Drift
Weekly MEMORY.md re-bloat check.
Sun 21:00
Rule
MEMORY.md hard limit: 200 lines. Drift check catches entries that should graduate to topic shards per aging policy.
Weekly Actions
Sunday action doc: open commitments, new items, auto-closures from completion signals.
Sun 10:00 CEST
→ trace flow
Pipeline
Scans Obsidian Keystone/ (incl. Captures/ from Telegram). Detects completion signals. Auto-closes matched open items. Output: _work/actions/YYYY-MM-DD-week-actions.md
Open Loops
Monthly count of unresolved TODOs across topic shards.
1st of month
Source
Scans all _index_*.md files for TODOs and "open:" markers. Reports count per shard.
Scratch Retention
Per-folder sweep of _scratch/. Marks delivered files.
Sun 23:00
TTL rules
ideas/: 30d. playground/: 14d. dogfood/: 7d after report. granola/: 90d. Default DRY_RUN=1, must flip to actually delete.
Auto-Sync
Nightly backup commit across all workspace repos.
22:00 daily
Safety
mkdir mutex to prevent race with SessionEnd hook. EDEADLK guard added May 5. Gitignores: .state/, .locks/.
Zombie Scripts
Quarterly scan for cron scripts untouched 90+ days.
quarterly
Action
Reports scripts to decommission. Does not delete. Requires manual confirmation before removal.
Single quota pool: All agents share one Claude Max subscription. Cost dashboard at 22:00 is the circuit breaker. One blowout blocks all downstream until reset.
Alerts fire on FAIL signatures · governance posts to Telegram · briefs routed to archive
05 · Delivery and Security
Telegram
Primary surface. All 4 personas deliver to one Root Bot chat. Persona header on every message.
Nabila · Nusaybah · Musa · Kit
Constraints
Plain text only. No markdown tables. 4000-char limit per message. Long replies split with notification suppression on continuations.
Brief Archive
Every persona delivery archived to
_work/pm-workspace/briefs/
Structure
briefs/nabila/, briefs/kit/, briefs/nusaybah/, briefs/musa/. One .md file per run. Searchable history via ROOT.
Obsidian Vault
Synced every 5 min. Human-readable view of all structured knowledge. Mobile via Obsidian app.
every 5 min
Bidirectional via ROOT
workspace → Obsidian (sync). Telegram captures also write TO Obsidian Keystone/Captures/ so ROOT indexes them. ROOT feeds the weekly action scanner. The vault is the single source of truth for all indexed knowledge.
Credential Architecture
1Password (canonical)
Telegram bot · GA4 SA · Atlassian · Anthropic API
bootstrap_secrets.sh
Portable restore on new Mac. Single command.
~/.config/shell/secrets.env
Cron runtime. No biometric. No network.
Remote sessions: read+draft only. Never action keys.
Security boundary
Remote Claude Code sessions (web, Codex CLI) see context-snapshot mirror. Never the secrets.env file. Deliberate isolation.
Operating Principles
Four personas, one pool
Every cron belongs to exactly one persona. No "general" agents. No shared ownership.
Why
Prevents overlapping briefs, unclear ownership, and duplicate LLM calls for the same data.
7-day soak rule
No new automation until the previous one runs unattended for 7 days.
Why
Stability over velocity. New agents frequently have silent failure modes that only surface under real conditions over time.
Subagent-first
3+ files = subagent. Parallel over sequential. Main thread stays lean.
Enforced by
UserPromptSubmit hook (subagent-nudge.sh) that warns when the pattern is about to be violated.
Repos stay clean
No secrets in any repo. Runtime state gitignored. Portability lives in 1Password.
Enforced by
git_guard.py pre-commit hook. .gitignore covers .state/, .locks/, secrets.env patterns.
Ship and verify
"Shipped" = live URL + HTTP 200 + fingerprint grepped. Not "merged." Not "pushed."
Why
"Push to main" and "live for users" are not the same event. Shadman ships solo and needs confirmation to move on.
Generated 2026-05-09 · 25+ active agents · 4 personas · Mac LaunchAgent stack · Claude Sonnet/Haiku via Max
Source of truth: _context/docs/agent-system.md · Secrets: 1Password tag vibecoding,cron