Agents System Test Report
1) Inventory
| Agent | Role | owned_paths | Interfaces | non_goals | stop_conditions |
|---|---|---|---|---|---|
| architect-steward | Architecture guardrail | STACK.md, docs/architecture/**, docs/CONVENTIONS.md, packages/**/README.md, apps/**/README.md | Eko invariants across all agents; ADRs in docs/architecture | Writing full features; debating product strategy | Violating invariant; no test/fixture/repro; cost/latency risk without guardrail |
| ci-quality-gatekeeper | Repo hygiene | .github/workflows/**, scripts/**, biome.json, turbo.json, vitest.workspace.ts | CI outputs; local repro commands | Writing product features | Noisy checks; slowing CI without payoff; no local repro |
| cron-scheduler | Scheduler operator | apps/worker-tracker/** (cron entry), packages/queue/** (dispatch), infra/**, docs/runbooks/scheduling.md | Cron trigger; job dispatch; schedule metadata | Subscription CRUD; queue reliability; meaningful change logic | Unbounded queue; no idempotency; can't test locally; no drift visibility |
| db-migration-operator | Database owner | packages/db/**, supabase/**, docs/dev/database.md | DB client; table schemas; RLS policies | Frontend UI; worker logic beyond schema changes | Storing full page content; breaking migrations; no verification plan |
| diff-analyst | Change logic owner | packages/shared/**, apps/worker-tracker/**, docs/product/meaningful-change.md | url_changes table; meaningful_change schema | UI components; LLM summaries | Asking for interpretation; no fixture; removing explainability |
| observability-analyst | Telemetry owner | packages/observability/**, docs/dev/observability.md | Logger interface; trace correlation IDs | Features unrelated to observability | Storing raw content; no correlation strategy; "more logs" without purpose |
| queue-sre | Reliability operator | packages/queue/**, apps/worker-tracker/**, apps/worker-render/**, docs/runbooks/** | Job payload schemas; queue client | UI work; prompt writing | Requires business logic change without owner; can't verify; retry amplification without cap |
| release-manager | Shipping coordinator | docs/dev/deployments.md, docs/release/**, CHANGELOG.md | Version tags; deploy order; rollback procedures | Implementing features | Unverified migrations; no rollback steps; safety change not in notes |
| render-engineer | Worker engineer | apps/worker-render/**, packages/shared/** (render schemas), packages/db/** (render tables) | Render job queue payload; render result writes; escalation trigger | Tuning thresholds; summarization prompts | Rendering as default; auth required without strategy; no deterministic repro |
| security-reviewer | Security & abuse | packages/db/**, apps/web/**, apps/worker-*/**, docs/policies/** | RLS policies; auth middleware; URL validation | General refactors not security-tied | Weakening boundary; no verification; retention risk |
| subscription-manager | Subscription lifecycle | packages/db/**, apps/web/**, apps/worker-tracker/**, docs/product/user-guide.md | Subscriptions table; cron/scheduler; quotas | Meaningful change; rendering; queue reliability | Unbounded subscriptions; unsustainable cadence; pause/resume data loss |
| summarization-safety | LLM safety & tone | packages/ai/**, apps/worker-tracker/**, docs/policies/ai-safety.md, docs/policies/fair-use.md | Prompts; summary schema; change facts input | Deciding meaningful change; tracker/render pipelines | Too substitutive; no structured diff; extensive quoting |
| tracker-engineer | Worker engineer | apps/worker-tracker/**, packages/shared/**, packages/db/** (tracker queries) | url_runs/url_changes writes; job schemas | Browser rendering; summarization prompts | Browser rendering as default; site-wide crawling; no fixture |
| use-case-note-writer | Product copy | docs/product/tracking-suggestions/**, apps/web/** (copy only) | Tracking suggestion templates; use case note schema | Implementing agent logic; marketing copy | Site-wide monitoring; vague triggers; hardcoded brands |
| ux-page-card-designer | Product UX | apps/web/**, packages/ui/**, docs/product/** | Summary data; change feed API; UI library | Backend workers; thresholds | UI as substitute; storing large content; hiding uncertainty |
2) Overlap & Gaps
Overlap Matrix by Repo Area
| Repo Area | Agents Claiming | Overlap Issue? |
|---|---|---|
apps/web/** | security-reviewer, subscription-manager, use-case-note-writer (copy), ux-page-card-designer | YES — 4 agents claim overlapping paths |
apps/admin/** | NONE | GAP |
apps/storybook/** | NONE | GAP |
apps/worker-tracker/** | cron-scheduler, diff-analyst, queue-sre, subscription-manager, summarization-safety, tracker-engineer | YES — 6 agents claim overlapping paths |
apps/worker-render/** | queue-sre, render-engineer, security-reviewer | YES — 3 agents |
packages/db/** | db-migration-operator, render-engineer, security-reviewer, subscription-manager, tracker-engineer | YES — 5 agents claim overlapping paths |
packages/queue/** | cron-scheduler, queue-sre | YES — 2 agents |
packages/shared/** | diff-analyst, render-engineer, tracker-engineer | YES — 3 agents |
packages/ai/** | summarization-safety | No |
packages/observability/** | observability-analyst | No |
packages/config/** | NONE | GAP |
packages/ui/** | ux-page-card-designer | No |
docs/runbooks/** | cron-scheduler, queue-sre | YES — 2 agents |
docs/policies/** | security-reviewer, summarization-safety | Minor overlap (disjoint files) |
docs/product/** | ux-page-card-designer, use-case-note-writer, diff-analyst | YES — 3 agents |
.github/workflows/** | ci-quality-gatekeeper | No |
scripts/** | ci-quality-gatekeeper | No |
infra/** | cron-scheduler | No |
supabase/** | db-migration-operator | No (dir doesn't exist yet) |
Overlaps (Problems)
-
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.
-
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.
-
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.
-
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.
-
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?
-
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.
- Problem: cron-scheduler owns
Gaps (Unowned Areas)
-
apps/admin/**— No owner- Risk: Admin dashboard has no clear agent. Security? UX? Feature work?
-
apps/storybook/**— No owner- Risk: UI component library documentation/testing has no steward.
-
packages/config/**— No owner- Risk: Environment configuration changes (API keys, feature flags) have no clear owner.
Ambiguous Scopes
-
security-reviewer: Claims
apps/worker-*/**which is very broad — covers everything in both workers, but its mission is security-specific. -
subscription-manager: Claims both
apps/web/**andapps/worker-tracker/**but mission is subscription lifecycle — should be scoped to subscription-specific files only. -
use-case-note-writer: Claims
apps/web/**with "(copy only)" qualifier, but this isn't enforceable via globs. -
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:
security-reviewer— validates RLS policy correctness after migration is writtenarchitect-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:
observability-analyst— adds queue lifecycle metrics/loggingtracker-engineerorrender-engineer— if fix requires worker code changescron-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:
diff-analyst— validates that fix doesn't change meaningful-change classification (provides test fixtures)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:
queue-sre— add circuit breaker if memory spike is queue-relateddb-migration-operator— if retention requires schema changes (e.g.,render_artifacts.expires_at)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:
tracker-engineer— provides sample pricing page fixtures with noise patternssummarization-safety— validates that tighter thresholds don't break summary gatingarchitect-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:
architect-steward— verifies invariant compliance (no page reconstruction)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:
architect-steward— only if CI change affects build contracts- 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:
db-migration-operator— provides migration + rollback SQLarchitect-steward— verifies breaking change is called outsecurity-reviewer— if schema change affects RLSci-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-gatekeeperpackages/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
- Switch from directory-level to file-level globs
- Add "How to choose an agent" lookup table
- Add escalation protocol for multi-agent work
- Fill gaps by extending architect-steward and ci-quality-gatekeeper scopes