skills/batch-observing/SKILL.md
Parallel multi-user processing using Claude Code native teams. Leader spawns workers per user, each runs /ingest-dm, leader aggregates for cross-canvas patterns.
npx skillsauth add 0xhoneyjar/construct-observer batch-observingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Process multiple user DM exports in parallel using Claude Code native teams. A leader agent spawns one worker per user, each worker runs the /ingest-dm pipeline independently, then the leader aggregates results for cross-canvas pattern detection.
Parallel independence, centralized synthesis. Each worker processes one user independently. Cross-user patterns only emerge at the leader level after all workers complete.
/batch-observe <path1> <path2> ... # Multiple DM export files
/batch-observe grimoires/observer/imports/*.csv # Glob pattern
/batch-observe --dir grimoires/observer/imports/ # All files in directory
Collect the list of DM export files:
--dirValidate each file exists and is readable.
TeamCreate:
team_name: "observer-batch-{date}"
description: "Parallel DM ingestion for {N} users"
For each input file, create a task:
TaskCreate:
subject: "Ingest DM: {filename}"
description: "Run /ingest-dm pipeline for {filename}"
For each task, spawn a worker agent:
Task:
subagent_type: general-purpose
team_name: "observer-batch-{date}"
name: "worker-{username}"
prompt: |
You are an observer worker. Run the /ingest-dm pipeline for this file:
File: {filepath}
Steps:
1. Read the file and extract the username
2. Run: scripts/observer/wallet-resolve.sh {username}
3. Run: scripts/observer/score-api-query.sh profile {wallet} --format snapshot
4. Create the enriched canvas at grimoires/observer/canvas/{username}.md
5. Follow the /ingest-dm SKILL.md template exactly
6. When done, mark your task as completed and send a message to the leader
with the canvas path and a summary of what was extracted.
Stagger starts: Delay 2-3 seconds between worker spawns to avoid Supabase rate limiting.
Leader monitors via TaskList and incoming messages:
Once all workers complete (or timeout after reasonable period), the leader:
6a: Common Gaps
### GAP- sections6b: Archetype Clustering
6c: Signal Distribution
Display archetype map and pattern summary to operator:
Batch Observation Complete: {N} users processed
Canvases Created:
- grimoires/observer/canvas/user1.md (Rank #X, {tier})
- grimoires/observer/canvas/user2.md (Rank #X, {tier})
...
Cross-Canvas Patterns:
- Data staleness: 3/5 users reported (xabbu, elcapitan, ncs)
- Badge display: 2/5 users mentioned (xabbu, cory)
Archetype Clusters:
- Comparison-driven: user1, user3 (focus on earned vs possible)
- Completionist: user2, user5 (badge/collection focus)
Signal Distribution:
- FEEL: 40% | ACCURACY: 30% | WEIGHTINGS: 20% | UX: 10%
Next Steps:
1. Review canvases and refine hypotheses to Level 3
2. Run /gap-to-issues to file cross-user gaps
3. Run /shape when ready to synthesize journeys
SendMessage:
type: shutdown_request
recipient: each worker
Then: TeamDelete
Batch observing parallelizes canvas creation across multiple users via Claude Code teams. The failure modes are emergent — they arise from the interaction between concurrent workers, not from any single worker's logic.
The leader spawns one worker per user, each running /ingest-dm independently. Workers resolve wallets, call Score API, create canvases, and emit FeedbackEvents. The leader waits for all workers, collects results, detects cross-canvas patterns (shared pain points, common journey fragments), and produces an aggregate report. If a worker fails, the leader logs the failure and continues with successful results.
The critical invariant: the aggregate report accurately reflects which canvases were created, which failed, and what patterns were detected across only the successful canvases. Partial success is reported as partial — never inflated to full success.
The seductively wrong behavior: treating partial results as complete when calculating cross-canvas patterns.
Scenario: 5 users in batch. Workers for users A, B, C succeed. Workers for D and E fail (wallet resolution timeout). The leader detects a pattern: "3 out of 3 users mentioned score confusion" and reports it as a strong signal. But D and E might have had different experiences — the pattern confidence should be "3 out of 5 attempted" (60%), not "3 out of 3 successful" (100%).
The layer violation is reporting a denominator that excludes failures:
The correct behavior: always report patterns with both denominators — detected_in / successful_count and successful_count / total_attempted. A pattern found in 3/3 successes from 3/5 attempts is weaker evidence than 3/3 successes from 3/3 attempts. The aggregate report should include a "Coverage" metric showing what fraction of the intended batch completed.
The fundamentally wrong behavior: spawning team workers for users who already have canvases, then merging the new canvas with the existing one as if they were the same observation session.
Batch observing is designed for initial canvas creation from DM exports. If a user already has a canvas (from a prior /observe or /ingest-dm), spawning a worker for them creates a collision:
The semantic collapse: treating "create" and "update" as the same operation because the output is the same file format. A new canvas is a hypothesis scaffold (LOW confidence, everything provisional). An existing canvas may contain validated hypotheses (MEDIUM confidence, evidence-backed). Overwriting validated with provisional is data loss.
The correct behavior: before spawning a worker, check if grimoires/observer/canvas/{username}-canvas.md exists. If it does, either skip that user (report as "already observed") or run the worker in append-only mode (add new quotes to Quotes Library, do not overwrite User Profile or Level 3 Hypotheses). The leader should report skipped users separately from failed and successful users.
A concrete scenario demonstrating both failure modes together:
Batch of 8 users. Workers for users A, B, C succeed (new canvases). Worker for D fails (Score API timeout). Workers for E, F succeed (new canvases). Worker for G fails (wallet resolution error). Worker for H succeeds but H already had a canvas — the worker overwrites curated hypotheses with a raw scaffold.
The aggregate report says: "6 canvases created, pattern detected: 5/6 users mentioned score confusion." But the actual situation is:
The leader's report should categorize results into four buckets: created (new), updated (existing, append-only), failed (error), and skipped (existing, no new data). Each bucket affects pattern confidence differently.
Additionally, the team spawning itself can fail partially. If Claude Code's team infrastructure limits concurrent workers (e.g., max 5), a batch of 8 users requires sequencing. If the first 5 workers exhaust a rate limit (Score API, Supabase), workers 6-8 may all fail for infrastructure reasons, not data reasons. The leader should distinguish infrastructure failures (retry-worthy) from data failures (skip-worthy) in its error summary.
| Error | Resolution | |-------|------------| | Worker fails for one user | Log failure, continue with others. Report partial results. | | Wallet resolution fails | Worker creates canvas without Score API data | | Rate limiting on Supabase | Workers retry with backoff (built into supabase-query.sh caching) | | Team creation fails | Fall back to sequential processing | | All workers fail | Report error summary, no pattern detection | | Duplicate canvas (user already has one) | Worker appends new quotes to existing canvas |
/ingest-dm — Single-user pipeline (this skill parallelizes it)/daily-synthesis — Complementary pipeline for UI feedback/shape — Next step after batch observation (requires 3+ canvases)/gap-to-issues — File cross-user gaps detected in Step 6data-ai
Cognition orchestrator — analyze canvases, distill fears via /distill subagent, run gap analysis, optional cross-user synthesis.
development
Golden path /speak — generate RLM-isolated follow-ups with chronicle temporal context injection.
testing
# /snapshot — MiDi Experience Record (MER) Capture Capture a point-in-time MER for a wallet. Produces a 4-layer snapshot: data state, visual screenshot, user perception, and decision context. ## Usage ``` /snapshot <wallet-or-alias> /snapshot xabbu --trigger feedback /snapshot xabbu --data-only /snapshot --cohort /snapshot --cohort --diff MER-2026-001 ``` ## Arguments | Argument | Description | Required | |----------|-------------|----------| | `wallet-or-alias` | Wallet address or alias fr
development
Golden path /shape — consolidate journey patterns across canvases and file gap issues.