Base 16 v3 — Deep Rewrite
Each seed researched and rewritten with real expert knowledge. Ready for review before DB insertion.
Full content in workspace: base16-v3.md
📧 Email (6 seeds, max depth 2)
1. gmail.api.ready · ROOT
~700 chars
What changed: Now uses users.getProfile (cheaper than listing messages) to verify. Checks specific scopes needed. Reports expiry time. Has a 5-second timeout. Caches confirmed email + scopes. Links to quickstart docs.
2. gmail.inbox.health
→ gmail.api.ready · ~1200 chars
What changed: Now categorizes by email type (personal, transactional, newsletters, alerts, cold outreach, leaked spam) with counts/percentages/top senders per category. Diagnoses behavioral patterns (stale threads, unread age, label usage, read/archive/delete ratios). Health score 0-100 with 3 specific ranked recommendations ("unsubscribe from X — 47 unread in 30 days"), not generic advice.
3. gmail.search.query
→ gmail.api.ready · ~1100 chars
What changed: Embeds the full Gmail operator reference inline so the agent has it at runtime, not from memory. Lists every operator with correct syntax. Documents common mistakes agents make (sender: doesn't exist, has:attachments is wrong, date format must be YYYY/MM/DD not ISO). Links to official docs. Zero-result recovery with progressive broadening.
4. gmail.thread.summarize
→ gmail.search.query · ~1300 chars
What changed: Now handles attachments: extracts text from PDFs/DOCs, describes images, parses .ics calendar invites. Distinguishes signature logos from substantive inline images. Identifies participant roles (initiator, decision-maker, implementer). Quotes exact commitment language. Detects stale commitments. For 10+ message threads, identifies turning points. Structured output format with TL;DR.
5. gmail.writing.analysis
→ gmail.api.ready · ~1400 chars
What changed: Samples across 5+ recipients and different email types. Excludes auto-replies and one-word responses. Analyzes: formality spectrum (boss vs friend), greeting/signoff patterns, punctuation personality, sentence structure, request style (direct vs softened vs passive), vocabulary fingerprint. Produces a "voice summary" paragraph suitable for briefing a ghostwriter.
6. gmail.draft.compose
→ gmail.writing.analysis · ~1000 chars
What changed: Determines email type first (reply/outreach/update/request) and matches style accordingly. Self-checks against 3-4 profile examples of the same type. Lists specific AI failure patterns to watch for: "I hope this email finds you well", being too polite, wrong vocabulary, wrong length. Uses drafts.create API — never messages.send.
📁 Workspace (4 seeds, max depth 1)
7. local.files.ready · ROOT
~400 chars
What changed: Tests full read-write-delete cycle (not just create). Reports specific failure point (which operation failed). Reports cwd, available disk space, OS/platform. Notes sandbox restrictions if detected.
8. local.project.scan
→ local.files.ready · ~1200 chars
What changed: Priority-ordered detection with specific signature files for each language. Checks framework deps inside package files (not just the file's existence). Detects monorepo patterns. Distinguishes app/library/infrastructure/docs/config repos. Reports git status, file stats by extension, LOC estimate. Flags anomalies with specific examples. Outputs structured fingerprint object.
9. document.file.selected · ROOT
~600 chars
What changed: Detects type by both extension AND content inspection (catches misnamed files). Reports encoding for text files. For binary: describes specifically what kind with relevant metadata (image → dimensions, PDF → pages, audio → duration). Large file warning with chunking advice. Shows 20 most recent files if not found.
10. document.structure.map
→ document.file.selected · ~1000 chars
What changed: Handles 5 file types with type-specific analysis: text/markdown (heading hierarchy, reading level, entities, key terms), CSV (delimiter detection, types, null counts), JSON (schema depth, array detection, config identification), code (language detection, declarations with line numbers, imports), PDF (extractability check, OCR note). Consistent JSON output format with type field.
👤 Person (2 seeds, max depth 1)
11. context.person.select · ROOT
~500 chars
What changed: Uses conversation history to avoid re-asking. Handles partial info (name without email, email without name) with extraction heuristics. Flags ambiguity for common names. Explains why email is required. Clear output format: "Working with: [Name] <[email]>".
12. person.web.profile
→ context.person.select · ~900 chars
What changed: Explicit search strategy using name + email domain. Lists specific sources to check (LinkedIn, GitHub, Twitter, conference sites, company pages). Confidence levels: confirmed/likely/inferred/unknown. Notes source URLs and freshness. Two output formats: natural language briefing + structured data card. Explicit "do not hallucinate" instruction with fallback phrasing.
🖼️ Image (4 seeds, max depth 2)
13. image.edit.model · ROOT
~900 chars
What changed: Concrete roundtrip test (solid color → edit → verify output). Reports: model name, input/output resolution, inpainting support, image-to-image support, content policy restrictions on faces, rate limits, latency. Ranks multiple models specifically for portrait editing. Clear failure message if no model available.
14. image.user.portrait
→ image.edit.model · ~1000 chars
What changed: Specific validation thresholds: face must be 20%+ of image area, prefers 1024×1024+. Checks: blur, lighting, cropping (full face visible?), EXIF rotation. Rejection messages explain WHY it matters for the edit, not just what's wrong. Hard reject for marginal images — no "good enough" hedging.
15. headshot.professional.edit
→ image.user.portrait · ~1400 chars
What changed: Background options with defaults (neutral gray gradient). Notes hair-edge inpainting as the #1 failure point. "Soft diffused softbox" lighting target — not flat passport photo. Explicit anti-smoothing constraints: do not remove wrinkles/pores, do not alter structure, do not whiten teeth. Framing guidance with headroom. Mandatory before/after comparison for identity verification.
16. image.style.transfer
→ image.user.portrait · ~1100 chars
What changed: Lists 8 specific styles with visual descriptions (not just names). Identity preservation via facial landmark comparison (eyes, nose, jawline, proportions). Iterative retry: reduce intensity 25% per attempt, max 3 retries. Graceful failure: if style fundamentally distorts at 25%, suggest alternatives. Output includes metadata: style, intensity, correction count.
Stats: Average prompt length ~950 chars (was ~200 in v1). Every seed now encodes heuristics, error handling, edge cases, and expert knowledge that a model wouldn't produce zero-shot. Ready to insert into D1 and run the 12-judge eval on your approval.