Agents System Test Report

1) Inventory

AgentRoleowned_pathsInterfacesnon_goalsstop_conditions
architect-stewardArchitecture guardrailSTACK.md, docs/architecture/**, docs/CONVENTIONS.md, packages/**/README.md, apps/**/README.mdEko invariants across all agents; ADRs in docs/architectureWriting full features; debating product strategyViolating invariant; no test/fixture/repro; cost/latency risk without guardrail
ci-quality-gatekeeperRepo hygiene.github/workflows/**, scripts/**, biome.json, turbo.json, vitest.workspace.tsCI outputs; local repro commandsWriting product featuresNoisy checks; slowing CI without payoff; no local repro
cron-schedulerScheduler operatorapps/worker-tracker/** (cron entry), packages/queue/** (dispatch), infra/**, docs/runbooks/scheduling.mdCron trigger; job dispatch; schedule metadataSubscription CRUD; queue reliability; meaningful change logicUnbounded queue; no idempotency; can't test locally; no drift visibility
db-migration-operatorDatabase ownerpackages/db/**, supabase/**, docs/dev/database.mdDB client; table schemas; RLS policiesFrontend UI; worker logic beyond schema changesStoring full page content; breaking migrations; no verification plan
diff-analystChange logic ownerpackages/shared/**, apps/worker-tracker/**, docs/product/meaningful-change.mdurl_changes table; meaningful_change schemaUI components; LLM summariesAsking for interpretation; no fixture; removing explainability
observability-analystTelemetry ownerpackages/observability/**, docs/dev/observability.mdLogger interface; trace correlation IDsFeatures unrelated to observabilityStoring raw content; no correlation strategy; "more logs" without purpose
queue-sreReliability operatorpackages/queue/**, apps/worker-tracker/**, apps/worker-render/**, docs/runbooks/**Job payload schemas; queue clientUI work; prompt writingRequires business logic change without owner; can't verify; retry amplification without cap
release-managerShipping coordinatordocs/dev/deployments.md, docs/release/**, CHANGELOG.mdVersion tags; deploy order; rollback proceduresImplementing featuresUnverified migrations; no rollback steps; safety change not in notes
render-engineerWorker engineerapps/worker-render/**, packages/shared/** (render schemas), packages/db/** (render tables)Render job queue payload; render result writes; escalation triggerTuning thresholds; summarization promptsRendering as default; auth required without strategy; no deterministic repro
security-reviewerSecurity & abusepackages/db/**, apps/web/**, apps/worker-*/**, docs/policies/**RLS policies; auth middleware; URL validationGeneral refactors not security-tiedWeakening boundary; no verification; retention risk
subscription-managerSubscription lifecyclepackages/db/**, apps/web/**, apps/worker-tracker/**, docs/product/user-guide.mdSubscriptions table; cron/scheduler; quotasMeaningful change; rendering; queue reliabilityUnbounded subscriptions; unsustainable cadence; pause/resume data loss
summarization-safetyLLM safety & tonepackages/ai/**, apps/worker-tracker/**, docs/policies/ai-safety.md, docs/policies/fair-use.mdPrompts; summary schema; change facts inputDeciding meaningful change; tracker/render pipelinesToo substitutive; no structured diff; extensive quoting
tracker-engineerWorker engineerapps/worker-tracker/**, packages/shared/**, packages/db/** (tracker queries)url_runs/url_changes writes; job schemasBrowser rendering; summarization promptsBrowser rendering as default; site-wide crawling; no fixture
use-case-note-writerProduct copydocs/product/tracking-suggestions/**, apps/web/** (copy only)Tracking suggestion templates; use case note schemaImplementing agent logic; marketing copySite-wide monitoring; vague triggers; hardcoded brands
ux-page-card-designerProduct UXapps/web/**, packages/ui/**, docs/product/**Summary data; change feed API; UI libraryBackend workers; thresholdsUI as substitute; storing large content; hiding uncertainty

2) Overlap & Gaps

Overlap Matrix by Repo Area

Repo AreaAgents ClaimingOverlap Issue?
apps/web/**security-reviewer, subscription-manager, use-case-note-writer (copy), ux-page-card-designerYES — 4 agents claim overlapping paths
apps/admin/**NONEGAP
apps/storybook/**NONEGAP
apps/worker-tracker/**cron-scheduler, diff-analyst, queue-sre, subscription-manager, summarization-safety, tracker-engineerYES — 6 agents claim overlapping paths
apps/worker-render/**queue-sre, render-engineer, security-reviewerYES — 3 agents
packages/db/**db-migration-operator, render-engineer, security-reviewer, subscription-manager, tracker-engineerYES — 5 agents claim overlapping paths
packages/queue/**cron-scheduler, queue-sreYES — 2 agents
packages/shared/**diff-analyst, render-engineer, tracker-engineerYES — 3 agents
packages/ai/**summarization-safetyNo
packages/observability/**observability-analystNo
packages/config/**NONEGAP
packages/ui/**ux-page-card-designerNo
docs/runbooks/**cron-scheduler, queue-sreYES — 2 agents
docs/policies/**security-reviewer, summarization-safetyMinor overlap (disjoint files)
docs/product/**ux-page-card-designer, use-case-note-writer, diff-analystYES — 3 agents
.github/workflows/**ci-quality-gatekeeperNo
scripts/**ci-quality-gatekeeperNo
infra/**cron-schedulerNo
supabase/**db-migration-operatorNo (dir doesn't exist yet)

Overlaps (Problems)

  1. apps/worker-tracker/** — 6 agents claim it

    • Problem: tracker-engineer owns "all of it", but diff-analyst, cron-scheduler, subscription-manager, summarization-safety, and queue-sre all claim pieces. No clear file-level boundaries.
    • Risk: Conflicting advice, unclear who makes final decisions on code in this directory.
  2. packages/db/** — 5 agents claim it

    • Problem: db-migration-operator owns it, but render-engineer (render tables), security-reviewer (RLS), subscription-manager, and tracker-engineer (tracker queries) all claim partial ownership.
    • Risk: Schema changes require coordination across 5 agents without clear protocol.
  3. apps/web/** — 4 agents claim it

    • Problem: security-reviewer, subscription-manager, use-case-note-writer, and ux-page-card-designer all claim this app. No file-level partitioning.
    • Risk: API route changes need 3-4 agents to coordinate.
  4. packages/shared/** — 3 agents claim it

    • Problem: diff-analyst, render-engineer, and tracker-engineer all claim this. Contents are schemas and shared logic.
    • Risk: Schema changes require cross-agent coordination.
  5. packages/queue/** — 2 agents claim it

    • Problem: cron-scheduler claims "job dispatch" and queue-sre claims "queue client". These are conceptually overlapping.
    • Risk: Who owns queue configuration changes?
  6. docs/runbooks/** — 2 agents claim it

    • Problem: cron-scheduler owns scheduling.md, queue-sre owns the whole directory.
    • Risk: Minor — can be disambiguated with file-level globs.

Gaps (Unowned Areas)

  1. apps/admin/** — No owner

    • Risk: Admin dashboard has no clear agent. Security? UX? Feature work?
  2. apps/storybook/** — No owner

    • Risk: UI component library documentation/testing has no steward.
  3. packages/config/** — No owner

    • Risk: Environment configuration changes (API keys, feature flags) have no clear owner.

Ambiguous Scopes

  1. security-reviewer: Claims apps/worker-*/** which is very broad — covers everything in both workers, but its mission is security-specific.

  2. subscription-manager: Claims both apps/web/** and apps/worker-tracker/** but mission is subscription lifecycle — should be scoped to subscription-specific files only.

  3. use-case-note-writer: Claims apps/web/** with "(copy only)" qualifier, but this isn't enforceable via globs.

  4. observability-analyst: Claims only packages/observability/** but mission says "adds logging/tracing across all workers" — owned_paths doesn't match stated role.

Missing/Vague Stop Conditions

All agents have stop conditions, but some are too soft:

  • security-reviewer: "General refactors not tied to security" is vague — what counts as "tied to security"?
  • observability-analyst: Doesn't say what to do when logging touches business logic.

3) Routing Tests

Scenario A: DB change — add column + migration + update types + RLS adjustment

Primary agent: db-migration-operator

  • Owns schema, migrations, RLS, types in packages/db/**

Secondary agents + handoff order:

  1. security-reviewer — validates RLS policy correctness after migration is written
  2. architect-steward — verifies change respects Eko invariants (no storing full page content)

Stop conditions to enforce:

  • db-migration-operator stops if migration is non-idempotent
  • security-reviewer stops if RLS weakens existing boundaries
  • Don't proceed without rollback SQL

Paste-ready instruction:

@db-migration-operator: Add a `last_error_at` timestamp column to the `url_runs` table.
Deliverables:
1. SQL migration in supabase/migrations/
2. Type update in packages/db/types.ts
3. RLS policy review (ensure service role can write, user role can read own)
4. Rollback SQL snippet in migration comments
Verify: migration applies cleanly; types compile; RLS smoke test passes.

Scenario B: Queue reliability — stuck jobs + retries + idempotency hardening + metrics

Primary agent: queue-sre

  • Owns queue health, retries, idempotency, metrics

Secondary agents + handoff order:

  1. observability-analyst — adds queue lifecycle metrics/logging
  2. tracker-engineer or render-engineer — if fix requires worker code changes
  3. cron-scheduler — if backpressure logic needs dispatch-side changes

Stop conditions to enforce:

  • queue-sre stops if fix increases retry amplification without hard cap
  • observability-analyst stops if "more logs" has no specific question to answer
  • No infinite retry loops

Paste-ready instruction:

@queue-sre: Jobs are getting stuck in PROCESSING state after worker crashes.
Deliverables:
1. Add visibility timeout + requeue logic for stuck jobs
2. Implement idempotency key to prevent duplicate processing
3. Cap retries at 3 with exponential backoff (1s, 5s, 30s)
4. Add metrics: jobs_stuck, jobs_retried, jobs_dead_lettered
5. Runbook entry in docs/runbooks/queue-recovery.md
Verify: unit test for stuck job recovery; metrics visible in logs.

Scenario C: Tracker — normalization bug causes section hash churn; fix without false positives

Primary agent: tracker-engineer

  • Owns fetching, normalization, section extraction, hashing

Secondary agents + handoff order:

  1. diff-analyst — validates that fix doesn't change meaningful-change classification (provides test fixtures)
  2. observability-analyst — if hash change logging needed

Stop conditions to enforce:

  • tracker-engineer stops if no reproducible fixture/sample HTML
  • diff-analyst stops if there's no "before/after" diff example
  • Don't change hashing algorithm without regression suite

Paste-ready instruction:

@tracker-engineer: Section hashes are churning on pricing pages due to timestamp normalization bug.
Root cause: Date strings like "Last updated: Dec 15" not being normalized.
Deliverables:
1. Fix date normalization in packages/shared/src/normalize.ts
2. Add fixture: pricing-page-timestamp-churn.html showing before/after
3. Regression test ensuring hash stability
4. Log "normalization applied" with section ID for debugging
Verify: fixture produces stable hash across 2 fetches; existing tests pass.
Hand off to diff-analyst: confirm meaningful-change classification unchanged for this fixture.

Scenario D: Renderer — Playwright memory spike; add safeguards + retention logic

Primary agent: render-engineer

  • Owns Playwright rendering, render job lifecycle, artifacts

Secondary agents + handoff order:

  1. queue-sre — add circuit breaker if memory spike is queue-related
  2. db-migration-operator — if retention requires schema changes (e.g., render_artifacts.expires_at)
  3. observability-analyst — memory metrics

Stop conditions to enforce:

  • render-engineer stops if fix turns rendering into default path
  • Don't store large screenshots without TTL
  • Must have deterministic repro

Paste-ready instruction:

@render-engineer: Playwright render jobs are spiking memory on large pages.
Deliverables:
1. Add page.setViewportSize() cap (1920x1080 max)
2. Add navigation timeout of 30s with graceful abort
3. Limit screenshot size (webp, 80% quality, 1MB max)
4. Add `render_artifacts.expires_at` field (TTL: 7 days)
5. Memory metrics: peak_memory_mb per job
Verify: render job completes under 512MB; artifacts auto-expire.
Hand off to db-migration-operator: add expires_at column if needed.

Scenario E: Diff logic — tighten "meaningful change" for pricing pages without missing policy changes

Primary agent: diff-analyst

  • Owns meaningful change logic, thresholds, classifications

Secondary agents + handoff order:

  1. tracker-engineer — provides sample pricing page fixtures with noise patterns
  2. summarization-safety — validates that tighter thresholds don't break summary gating
  3. architect-steward — confirms invariants (no false negatives on policy changes)

Stop conditions to enforce:

  • diff-analyst stops if no example diff/fixture to tune against
  • Don't remove ability to explain why something was deemed meaningful
  • Policy changes (ToS, privacy) must remain meaningful

Paste-ready instruction:

@diff-analyst: Pricing pages trigger false positives from "price displayed X times" noise.
Goal: reduce noise while catching actual price changes and policy updates.
Deliverables:
1. Add URL-type classifier: "pricing" pages get stricter threshold
2. Filter repeated price mentions (dedupe by value, not position)
3. Preserve policy-section detection (ToS, privacy links must remain sensitive)
4. Add fixtures: pricing-noise-false-positive.html, pricing-real-change.html, pricing-policy-embedded.html
5. Document threshold rationale in docs/product/meaningful-change.md
Verify: all 3 fixtures classified correctly; existing test suite passes.

Scenario F: Summaries — fix over-quoting + tone drift; enforce non-substitutive behavior

Primary agent: summarization-safety

  • Owns prompts, formatting, non-substitutive constraints

Secondary agents + handoff order:

  1. architect-steward — verifies invariant compliance (no page reconstruction)
  2. diff-analyst — ensures input change facts are structured enough for prompt

Stop conditions to enforce:

  • summarization-safety stops if summary would let user skip visiting page
  • No quotes longer than 15 words
  • Must have structured diff input

Paste-ready instruction:

@summarization-safety: Summaries are over-quoting and drifting toward explanatory tone.
Goal: enforce delta-first, non-substitutive summaries.
Deliverables:
1. Update prompt to cap quotes at 15 words max
2. Add explicit instruction: "Never explain what the page is about; only what changed"
3. Add tone guardrail: no phrases like "This page describes..." or "The content shows..."
4. Update summary schema to reject outputs with >50 words of quoted text
5. Add test cases: over-quoted-input.json, tone-drift-input.json
Verify: test cases produce compliant summaries; no regression on existing fixtures.

Scenario G: CI — bun + turbo flaky; stabilize and add guardrails

Primary agent: ci-quality-gatekeeper

  • Owns CI workflows, scripts, turbo.json

Secondary agents + handoff order:

  1. architect-steward — only if CI change affects build contracts
  2. None typically — CI is self-contained

Stop conditions to enforce:

  • ci-quality-gatekeeper stops if change slows CI materially without payoff
  • Must have local reproduction path
  • No noisy checks that create alert fatigue

Paste-ready instruction:

@ci-quality-gatekeeper: CI is flaky — turbo cache misses + bun install race conditions.
Goal: make CI deterministic and fast.
Deliverables:
1. Pin turbo cache key to lockfile hash
2. Add bun install --frozen-lockfile to prevent drift
3. Add retry logic for transient network failures (max 2 retries)
4. Add CI timing metrics comment on PRs (build time, cache hit rate)
5. Document local repro: "How to simulate CI locally" in scripts/README.md
Verify: 10 consecutive CI runs pass; no cache misses on unchanged code.

Scenario H: Release — breaking schema change with rollback plan + changelog

Primary agent: release-manager

  • Owns versioning, changelogs, rollout/rollback plans

Secondary agents + handoff order:

  1. db-migration-operator — provides migration + rollback SQL
  2. architect-steward — verifies breaking change is called out
  3. security-reviewer — if schema change affects RLS
  4. ci-quality-gatekeeper — if CI needs version gate

Stop conditions to enforce:

  • release-manager stops if migrations are unverified
  • Must have rollback steps for schema AND workers
  • Safety/policy changes must be in release notes

Paste-ready instruction:

@release-manager: Shipping v2.0 with breaking schema change (url_runs.status enum expanded).
Deliverables:
1. CHANGELOG.md entry: what changed, who's affected, migration path
2. Rollout plan: migrations → workers (drain first) → web
3. Rollback plan: revert worker deploy → run down migration → redeploy old web
4. Release checklist in docs/release/v2.0-checklist.md
5. Internal comms draft: "What ops needs to know"
Verify: checklist covers all components; rollback tested in staging.
Hand off to db-migration-operator: confirm migration is reversible.
Hand off to architect-steward: confirm breaking change respects invariants.

4) Proposed Fixes

Fix 1: Disambiguate apps/worker-tracker/** ownership

Problem: 6 agents claim this directory.

Solution: Use file-level globs instead of directory-level.

# tracker-engineer.md
owned_paths:
-  - apps/worker-tracker/**
+  - apps/worker-tracker/src/**
+  - apps/worker-tracker/tests/**
   - packages/shared/**
   - packages/db/** (tracker queries/types only)

# diff-analyst.md
owned_paths:
-  - apps/worker-tracker/**
+  - apps/worker-tracker/src/diff/**
+  - apps/worker-tracker/src/meaningful-change/**
   - packages/shared/**
   - docs/product/meaningful-change.md

# cron-scheduler.md
owned_paths:
-  - apps/worker-tracker/** (cron entry points)
+  - apps/worker-tracker/src/cron/**
+  - apps/worker-tracker/src/scheduler/**
   - packages/queue/** (job dispatch)
   - infra/**

# subscription-manager.md
owned_paths:
-  - apps/worker-tracker/**
+  - apps/worker-tracker/src/subscription/**
   - packages/db/** (subscriptions table)
   - apps/web/src/api/subscriptions/**

# summarization-safety.md
owned_paths:
   - packages/ai/**
-  - apps/worker-tracker/**
+  - apps/worker-tracker/src/summarize/**
   - docs/policies/ai-safety.md
   - docs/policies/fair-use.md

# queue-sre.md (keep broad for reliability concerns)
owned_paths:
   - packages/queue/**
-  - apps/worker-tracker/**
-  - apps/worker-render/**
+  - apps/worker-tracker/src/queue/**
+  - apps/worker-render/src/queue/**
   - docs/runbooks/**

Fix 2: Disambiguate packages/db/** ownership

Problem: 5 agents claim this package.

Solution: db-migration-operator owns schema/migrations; others own specific queries.

# db-migration-operator.md
owned_paths:
-  - packages/db/**
+  - packages/db/src/schema/**
+  - packages/db/src/migrations/**
+  - packages/db/src/client.ts
+  - packages/db/src/types.ts
   - supabase/**
   - docs/dev/database.md

# render-engineer.md
owned_paths:
   - apps/worker-render/**
   - packages/shared/** (render job schemas)
-  - packages/db/** (render job tables/queries)
+  - packages/db/src/queries/render-*.ts

# security-reviewer.md
owned_paths:
-  - packages/db/**
+  - packages/db/src/rls/**
+  - packages/db/src/policies/**
   - apps/web/**
   - apps/worker-*/**

# subscription-manager.md
owned_paths:
-  - packages/db/**
+  - packages/db/src/queries/subscription-*.ts
   - apps/web/src/api/subscriptions/**

# tracker-engineer.md
owned_paths:
   - apps/worker-tracker/src/**
   - packages/shared/**
-  - packages/db/** (tracker queries/types only)
+  - packages/db/src/queries/tracker-*.ts
+  - packages/db/src/queries/url-*.ts

Fix 3: Disambiguate apps/web/** ownership

Problem: 4 agents claim this app.

Solution: Use path-based partitioning.

# ux-page-card-designer.md
owned_paths:
-  - apps/web/**
+  - apps/web/src/components/**
+  - apps/web/src/app/(dashboard)/**
   - packages/ui/**
   - docs/product/**

# subscription-manager.md
owned_paths:
   - packages/db/src/queries/subscription-*.ts
-  - apps/web/**
+  - apps/web/src/app/api/subscriptions/**
+  - apps/web/src/lib/subscriptions/**

# security-reviewer.md
owned_paths:
   - packages/db/src/rls/**
-  - apps/web/**
+  - apps/web/src/app/api/**
+  - apps/web/src/middleware.ts
+  - apps/web/src/lib/auth/**
   - apps/worker-*/**

# use-case-note-writer.md
owned_paths:
   - docs/product/tracking-suggestions/**
-  - apps/web/** (copy only)
+  - apps/web/src/content/**
+  - apps/web/src/copy/**

Fix 4: Fill gaps — add owners for unowned areas

# ci-quality-gatekeeper.md
owned_paths:
   - .github/workflows/**
   - scripts/**
   - biome.json
   - turbo.json
   - vitest.workspace.ts
+  - apps/storybook/**

# architect-steward.md
owned_paths:
   - STACK.md
   - docs/architecture/**
   - docs/CONVENTIONS.md
   - packages/**/README.md
   - apps/**/README.md
+  - packages/config/**
+  - apps/admin/**

Rationale:

  • apps/storybook/** is CI/docs tooling → ci-quality-gatekeeper
  • packages/config/** is cross-cutting configuration → architect-steward (or create dedicated agent)
  • apps/admin/** is cross-cutting admin tooling → architect-steward (or ux-page-card-designer if it's dashboard UI)

Fix 5: Tighten observability-analyst scope to match claimed paths

Problem: Mission says "adds logging across all workers" but owned_paths is narrow.

# observability-analyst.md
owned_paths:
   - packages/observability/**
   - docs/dev/observability.md
+  - apps/**/src/logging/**
+  - apps/**/src/metrics/**
interfaces:
   - Logger interface consumed by all apps/workers
   - Trace correlation IDs across tracker → render → summarize
+non_goals:
+  - Feature implementation not directly related to observability
+  - Modifying business logic to add logging (hand off to domain owner)

Fix 6: Add "How to choose an agent" rule to README

# .claude/agents/README.md (add after ## Usage section)

+## How to Choose an Agent
+
+1. **Identify the primary deliverable** — What artifact are you producing? (migration, prompt, UI component, runbook)
+2. **Match to owned_paths** — Which agent's `owned_paths` most specifically covers the files you'll change?
+3. **Check non_goals** — If your task is in an agent's `non_goals`, that agent is NOT the owner.
+4. **When in doubt, ask architect-steward** — It can route you to the right agent.
+
+### Quick lookup by file pattern
+
+| If you're changing... | Primary agent |
+|----------------------|---------------|
+| `packages/db/src/schema/**` | db-migration-operator |
+| `packages/db/src/queries/subscription-*` | subscription-manager |
+| `packages/db/src/queries/tracker-*` | tracker-engineer |
+| `packages/db/src/rls/**` | security-reviewer |
+| `packages/queue/**` | queue-sre |
+| `packages/ai/**` | summarization-safety |
+| `packages/observability/**` | observability-analyst |
+| `packages/shared/**` (diff logic) | diff-analyst |
+| `packages/shared/**` (schemas) | tracker-engineer or render-engineer |
+| `apps/web/src/components/**` | ux-page-card-designer |
+| `apps/web/src/app/api/**` | security-reviewer (auth), subscription-manager (subscriptions) |
+| `apps/worker-tracker/src/diff/**` | diff-analyst |
+| `apps/worker-tracker/src/summarize/**` | summarization-safety |
+| `apps/worker-tracker/src/cron/**` | cron-scheduler |
+| `apps/worker-render/**` | render-engineer |
+| `.github/workflows/**` | ci-quality-gatekeeper |
+| `CHANGELOG.md` | release-manager |

Fix 7: Add escalation protocol for multi-agent work

# .claude/agents/README.md (add after ## Ownership Boundaries)

+## Escalation Protocol
+
+When work spans multiple agents:
+
+### Step 1: Identify primary owner
+The agent whose `owned_paths` most specifically covers the **main deliverable** is primary.
+
+### Step 2: Sequence secondary agents
+Order by dependency:
+1. **Schema changes** → db-migration-operator first
+2. **Business logic** → domain agent (tracker/diff/summarization)
+3. **Security review** → security-reviewer
+4. **Observability** → observability-analyst
+5. **Release packaging** → release-manager last
+
+### Step 3: Handoff protocol
+Each agent produces their deliverable and explicitly hands off:
+```
+Hand off to [agent-name]: [specific task] with [artifacts provided].
+```
+
+### Step 4: Final verification
+Use `architect-steward` to verify:
+- All Eko invariants are preserved
+- No scope creep occurred
+- Integration points are tested
+
+### Example: Adding a new tracked field
+1. `db-migration-operator` → migration + types
+2. `tracker-engineer` → extraction + hashing
+3. `diff-analyst` → meaningful-change rule
+4. `summarization-safety` → prompt update
+5. `security-reviewer` → RLS check
+6. `release-manager` → changelog + rollout plan

Summary

Overlap Issues Found: 6

  • apps/worker-tracker/** (6 agents)
  • packages/db/** (5 agents)
  • apps/web/** (4 agents)
  • packages/shared/** (3 agents)
  • packages/queue/** (2 agents)
  • docs/runbooks/** (2 agents)

Gaps Found: 3

  • apps/admin/** (no owner)
  • apps/storybook/** (no owner)
  • packages/config/** (no owner)

New Agent Needed: No

All gaps can be covered by extending existing agents' owned_paths.

Key Improvements

  1. Switch from directory-level to file-level globs
  2. Add "How to choose an agent" lookup table
  3. Add escalation protocol for multi-agent work
  4. Fill gaps by extending architect-steward and ci-quality-gatekeeper scopes