A real report, written by 12 · AI Opportunity Scan, run against this repo — dogfood output, committed unedited. This is the artifact every brief ends in: findings that cite their evidence, ranked by severity, with a fix sketch each.
Date: 2026-07-09 Auditor: ai-opportunity brief, read-only pass Prior run: none — no previous AI-IDEAS.md existed; this is the first AI scan. Companion evidence: FUNNEL.md (instrumentation & flows), COMPETITIVE.md (moat & do-not-copy), REVENUE.md (Teams/sponsorship rails) — all written today; cited rather than re-derived.
This product has a hard architectural stance: static site, no backend, no accounts, "nothing leaves your machine" (template.html:502, vercel.json — no functions, no storage). Any AI feature that requires a runtime model call from the product needs either a backend or a user-supplied API key — both violate the stance that COMPETITIVE.md §9 identifies as the differentiation.
But the product is not AI-poor — it is AI-shaped in an unusual way: its runtime LLM is the user's own coding agent. Three AI features already ship in this form and prove the pattern:
prompts/act/46-audit-triage.md) — natural-language "which audit do I need?" answered by the agent, with repo access, where the question is actually decidable.studio.html:307, buildFixer) — checked findings compiled into a targeted prompt; the model work happens in the agent.makeConductor in js/catalog-core.js:94, make_conductor in mcp/server.cjs) — multi-brief orchestration as a composed prompt.So the viable AI surfaces here are exactly three shapes, and every idea below fits one: (A) composed prompts delegated to the user's agent (zero cost, zero latency, zero privacy risk to the product), (B) offline/build-time AI producing committed static artifacts (maintainer's key, runs never per-visitor), and (C) CI-time AI (maintainer's key, runs per-PR). Runtime in-browser AI is on the gimmick list wholesale.
Data the product holds:
| Data | Where it accumulates | Notes |
|---|---|---|
| 141 brief bodies, heavily structured (4-phase skeleton, front matter, <4k chars) | prompts/<family>/*.md, mirrored to raw/, catalog.json | The corpus. Machine-linted (build.py:102 lint(), lint_catalog) — the moat per COMPETITIVE.md §6.1 |
| Curated sequences + merchandising fields | playbooks.json | 35 playbooks |
| Sample outputs (real Day-1 run) + FIXLOG | examples/, FIXLOG.md | Proof corpus, currently underused |
| Per-user state — Operator context, run marks, custom sequence, Studio checks | browser localStorage only (gp-ctx, gp-runs, gp-seq, gp-studio-checks) | Device-bound, thin, and gp-runs is currently falsified by copy-time auto-marking (FUNNEL.md §2) |
| User audit reports (transient) | dropped into Report Studio, parsed client-side (js/report-parser.js) | May contain private code — must never leave the browser |
Analytics events incl. search_zero{q} (template.html:1264) | Vercel Web Analytics, landing + Studio only | The one signal of unmet search intent; /raw/* fetch counting designed but not live (docs/usage-metrics.md) |
Tedious multi-step tasks, traced:
related: ids → scripts/check. Many linter rules to satisfy by hand; 141 exemplars exist to imitate.FUNNEL.md §1 Choose row) — the site-side answer is rules; the good answer already exists as brief 46.template.html:600–608): four free-text fields the user types from memory about their own repo, while an agent that knows the repo sits one window away.search_zero queries have no closing loop — nobody turns misses into synonyms.Judgment calls the product could draft: which brief next (46 covers it), severity/priority of findings (deterministic parser covers it — deliberately), what a new brief should say (nothing covers it — the biggest gap).
CONTRIBUTING.md / "Add a prompt" (README.md:198) and faces a blank file with ~10 house rules; a Teams customer needs org-specific briefs (REVENUE.md §2 — "custom briefs passing the linter" is the paid deliverable). Today both start from zero.build.py:102–171), the family list, the 4-phase skeleton. Nothing to collect.scripts/check is a hard gate for structure, and a human PR review is the gate for content — the copilot's output is a draft PR, never a published brief. Wrong answers cost review time, not catalog quality.prompts/<family>/NN-slug.md, run python3 build.py, and iterate until green. Ships as a doc page + a copyable prompt; optionally as a repo .claude/commands/ file.COMPETITIVE.md §3.5 table stake — and is the production line for the Teams offer). Feasibility: High (one markdown file; no site code).build.py catches structure; the human alone catches "this brief isn't actually read-only in spirit", "tagline oversells", "this duplicates brief 27".CLAUDE.md + CONTRIBUTING.md; writing them down is half the work).ANTHROPIC_API_KEY in Actions — the repo already models exactly this pattern in .github/run-brief.example.yml. Cents per PR, latency irrelevant (async CI).COMPETITIVE.md §6.1) and makes "every brief passes a published linter + a semantic review" a true marketing sentence.studio.html). Today the selection bar offers exactly one exit: "Copy Fixer prompt" (implement now). The other legitimate exit — "merge these into a sequenced plan" — requires knowing brief 28 exists and leaving the Studio.buildFixer); the model work happens later in the user's agent under brief 28's own rules, which end by asking. Fallback if the user's agent produces a poor roadmap: the reports are untouched — read-only by construction.buildSynthesis(findings) sibling of buildFixer plus one button in the selbar. This is "AI feature" in the product's native sense: the AI is delegated, the product contributes the targeting./b/28 — worth having, but it loses the targeting (severity counts, which reports, which findings the user prioritized), which is the same value-add the Fixer button already proved.COMPETITIVE.md §6.2). Feasibility: High (mirrors an existing, tested pattern).template.html:600) — four blank inputs (stack / product / stage / watch-out-for) the user must compose from memory. This context rides on every subsequent copy (withContext, gp-detail.js:17), so its quality compounds; today most users plausibly skip it.catalog-core.js:157–193) already infers stack from package.json — but it's JS-centric (Go/Python/Rust match no briefs, lines 181–183) and can never infer product, stage, or fragility notes from a file listing. Those three fields genuinely need judgment over the repo's contents.search_zerotemplate.html:615). The scorer (closestScored) is stemmed-keyword only: "auth" finds nothing labeled "authentication-adjacent trust briefs", "memory leak" doesn't reach 04. The search_zero{q} event (template.html:1264) already logs exactly these misses.{alias: [brief-relevant terms]}.og/ assets; not in build.py (which must stay stdlib-only per CLAUDE.md), so the Vercel build is untouched.catalog-core.js and mcp/server.cjs (keeping the parity guard in scripts/mcp-smoke.cjs in mind).FUNNEL.md says instrumentation first). Feasibility: High.| # | Idea | Value | Feasibility | Shape | Why this order |
|---|---|---|---|---|---|
| 1 | Brief Forge authoring copilot | High | High | A (user's agent) | Serves contributors (table stake), the Teams offer (revenue), and the maintainer; pure content, zero site risk |
| 2 | Semantic linter tier in CI | Med-High | High | C (CI, maintainer key) | Deepens the stated moat; pattern already modeled by run-brief.example.yml |
| 3 | Studio "Copy Synthesis prompt" | Medium | High | A | Completes the uniquely-owned act loop; clones a proven code path |
| 4 | Agent-filled Operator context | Medium | High | A | Compounds into every future copy; smallest build of all |
| 5 | Offline search alias table | Med-Low | High | B (offline artifact) | Real but should wait for search_zero data to size the problem |
report-parser.js header comment: "must never change"). The boring alternative is structural: the briefs author the report format — tighten the house style at the source, and the deterministic parser stays right.suggest_briefs is consumed by an LLM client that does the semantic reasoning itself; the server's job is fast, deterministic retrieval. Adding a model adds a key requirement, latency, and nondeterminism to a zero-dep server whose whole virtue is having none.COMPETITIVE.md §9 already rules against the item arms race; the linter's value is that a human + gate stands behind every entry. Idea 1 is the opposite of this: AI drafts, gates decide.gp-runs — thin (id + timestamp), device-bound, and currently falsified by copy-time auto-marking (FUNNEL.md §2). A template sentence ("5 runs across 3 families") needs no model; any model version launders fake data into confident prose. Revisit never — or only after mark-run is un-faked, as a template.repoRecommend's rules. The browser sees only a file listing and package.json via the GitHub API; the agent sees the whole repo. Brief 46 already is this feature, running where the data lives. Extending the rule table (Go/Python/Rust brief mappings) is the correct boring fix.Idea 1 — Brief Forge, scoped to one day:
docs/author-a-brief.md (or a /b/-style page later): a single copyable meta-prompt embedding (a) the 4-phase skeleton and ask-first gate, (b) the linter's rules restated in prose (id format, family list, tagline constraints, <4k body, related: validity — from build.py:66–171), (c) two contrasting exemplar briefs (one code-facing like 01, one web-research like 62), and (d) the loop: write prompts/<family>/NN-slug.md → run python3 build.py → fix → repeat until green → stop and show the diff.CONTRIBUTING.md and the README's "Add a prompt" section.Day-sized because it is pure markdown — no site code, no build change — and it is the one idea that simultaneously advances distribution (contributions), revenue (the Teams production line), and the moat (drafts that arrive pre-shaped for the gate).
Read-only audit — no code, content, or config was changed. Which idea should I prototype: the Brief Forge authoring copilot, the CI semantic-linter pass, the Studio Synthesis button, the agent-filled Operator context, the offline search alias table — or a specific combination?