STATUS

June 12, 2026 · View on GitHub

Living "where things stand + what's left" view — this file is the dated build log (the Round notes below) and tracks current state. For onboarding + install see README.md; for the design (orchestrator + skills + workers) see architecture.md.

Last updated: 2026-06-12

Round-10 — Founder-clean "Your Growth Tactics" report (2026-06-12, plugin v2.7.0). The medmastery run's deliverable audit (Marcus Chen) found the main report page rendering raw synthesis.md — "a pipeline working paper dressed up as a deliverable" (Pass 1 Disposition, per-tactic Source vector lines, Pool-B pair audits, Traceability Summary, self-review grades, unexplained Scores — all founder-visible). synthesis.md's structure is load-bearing (the demand-gen-synthesis rubric, start.md's must_include closing check, and codex/checks.py all parse it), so it stays untouched; the fix is a new post-gate packaging stage:

  1. Skill 13 — founder-report (skills 12 → 13): after the synthesis build gate, synthesis-worker (sonnet) re-packages synthesis.md per writing-style.md into growth-tactics.md — plain tactic cards (what this is / why competitors can't copy it / how to start this week / time to first signal / what you need / kill it if…), plus Start-this-week, What-to-avoid, How-to-sequence, and Where-these-came-from sections. Strict re-packaging: zero new claims; numeric scores dropped from the founder view (Top-5 kept with one-line plain reasons). Deterministic structural check (card count == tactic count, banned-pattern grep: vector IDs / Pass labels / pools / scores / self- grading); one re-dispatch, then informational founder-report-skipped — the stage never blocks a run.
  2. Renderer fallback — both renderers point the "Your Growth Tactics" hero at growth-tactics.md and fall back to synthesis.md when it's absent (old runs, Codex runs, skipped packaging → exactly the old behavior, never a broken report). When the packaged report IS the hero, synthesis.md still ships as a new working-paper page, "Tactic Engineering Notes".
  3. Validated cheaply on the medmastery synthesis.md (extracted from the rendered report): packaging stage run headlessly, banned-grep empty, card count preserved, both renderer paths exercised. Full-pipeline re-validation rides the next quality round.

Deferred / follow-ups: a native Codex founder-report stage port (the Codex driver gets the renderer fallback for free = old behavior; its skill symlink is already in place); tightening synthesis-build's own prose-ID leak ((per lever-004) in timeline lines violated writing-style in the medmastery run — the packaging layer now guarantees the founder never sees it, revisit at the next synthesis quality round).

Round-9 — Simple launch surface (2026-06-11, plugin v2.6.0). The launch UX collapsed to ONE founder-typeable line. Four changes, all in the launch layer — no synthesis-chain changes (full theona re-validation rides the next quality round):

  1. Command renameplugin/commands/run-growth-tactics.mdstart.md; the command is now /diffmode-growth-tactics:start. File rename only (the plugin name is unchanged, so installs + the marketplace are unaffected); there is NO alias mechanism, so the old :run-growth-tactics name died instantly with the rename.
  2. Positional + ask-if-empty launch:start your-product.com (URL/domain token → URL mode, scheme optional), :start <name> (bare word → no-website Q&A workspace), or bare :start → asks "What's your product's website?" (with an "I don't have a site yet" path) AFTER the welcome block.
  3. Auto-resume — a new pre-flight step scans cwd for */.run-state.json; an unfinished run (ledger present, no APPROVED synthesis row, on-disk outputs trusted over the ledger) triggers "Found an unfinished run for <slug> (stopped at: …)"[Continue / Start fresh]. Continue internalizes the old --from derivation (ledger + completeness checks); Start fresh = full re-run INCLUDING re-mining (discards the growth-factors.json cache — the old --remine; the mining brief key is now remine: true). The Stage-4 constraints-stale precheck stays as backstop and now self-heals by re-running lite-constraints instead of aborting.
  4. Flags 7 → 1 — only --fast (renamed from --fast-intake) survives; --from/--only/--remine/--scratch are cut (legacy tolerance: --url X/ --product X map to their positional equivalents, --fast-intake means --fast, the cut flags get one polite "this version resumes automatically" line). run-enrichment is hidden — description now prefixed "(advanced — pipeline testing)", removed from README command menus; its own args are untouched.

Deferred / follow-ups: Codex driver parity (orchestrate.py keeps its argparse incl. --fast-intake as a dev-facing surface — positional+--fast port deferred); ai-cmo repo sync REQUIRED after ship — the diffmode.app /free-plugin page + kantent_podjehal/plugin-promo-2026/ copy still show the old command, which no longer resolves; grep that repo for run-growth-tactics and update (install commands are unaffected). Parity tests that used --scratch now use manual workspace copies.

Round-8 — Friendly UX for the marketer persona (2026-06-11, plugin v2.5.0). A Windows end-to-end run by a marketer (medmastery.com — pipeline fine, experience built for devs) drove four UX workstreams:

  1. Welcome / onboardingrun-growth-tactics now prints a Step-0a welcome before any tool call (what happens, ~1.5–2 h, the 4 deliverable groups, "you only need to be here for the questions"); run-enrichment gets a lighter variant; codex/orchestrate.py preflight() prints a plain-text mirror.
  2. Quiet progress + deliverables-first ending — a new User-facing voice section: one plain start line with an ETA + one done line with a human metric per stage; NEVER narrate structural-check internals, ledger JSON, reviewer scores, or pool/ID plumbing (the .run-state.json ledger itself is unchanged); a gate retry = exactly one line. The final message leads with the deliverables list, offers to open the report in the browser, and demotes the run-ledger table to on-failure / on-request. New informational failure row report-render-skipped.
  3. HTML report layer (new plugin/scripts/) — render_html.py (stdlib-only) renders the 9 user-valuable files to self-contained pages in WS/report/ with human-friendly names (Your Growth Tactics.html …) + an index.html with best-effort stats; markdown is escaped into a hidden <pre> and rendered client-side by a vendored, version-pinned marked.js v15.0.12 (MIT notice vendored; no literal </script in the bundle; raw HTML in the markdown is escaped to literal text via a renderer override — quoted scraped content can't inject live DOM); <noscript> un-hides the readable raw markdown. render_html.sh is a dumb POSIX mirror (sed-escape + cat-splice over the SAME assets/{page,index}.html templates; no stats) for machines with no Python — the command probes python3 / python / py -3 with -c (defeats the Windows Store stub) and falls back to sh. assets/report.css is a trimmed extraction of the diffmode.app design system (#f0eae0 chassis, #fffdf8 cards, #ff611a accent) plus a .dm-prose element layer for marked's bare elements + @media print. Codex report() renders via render_workspace() (try/except, also on the StageFailed path) and lists deliverables before the ledger. .gitignore adds **/report/.
  4. Plain-language style layer — new central plugin/reference/writing-style.md (grade 6–8 voice, banned-jargon table, no internal plumbing in prose, the smart-friend tactic naming rule, required **In plain English:** per-tactic line), distilled from the paid report's copy style guide. synthesis-build gets an Output language section, the In-plain-English template field + checklist item, and reconciled naming examples (mechanism stays, vocabulary simplifies — the old "Anti-Enterprise Citation Rebellion" GOOD example is now a BAD codename example). The 3 enrichment + 3 think-tank skills get a 3–4-line pointer; growth-reviewer notes readability as non-blocking feedback only (no new scored lens — avoids gate churn). The Codex driver passes writing-style.md as an input alongside the channel menu.

Prompt-trim question: deliberately DEFERRED. June-2026 consensus: frontier models don't degrade on 150–350-line structured skills; the failure mode is duplicated/conflicting rules, not length. Hence: no bulk trim; the style layer is ONE central file + short pointers precisely to avoid prompt bloat; conflicting lines were deleted where pointers landed (synthesis-build naming examples). A future trim should use the established theona.ai A/B method (v2.2/v2.3 precedent) — measure, then cut.

Local verification: py + sh renderers produce structurally equal output on a fixture workspace (9 pages + index, URL-encoded space-in-name links, stats line correct); adversarial markdown (</script>, <div onclick>, raw <pre>) renders as literal text — 0 live injected elements (headless-Chrome DOM check); JS-off falls back to readable raw markdown.

✅ Full-DAG re-validation PASSED (theona.ai, dev tree via --plugin-dir + --strict-mcp-config, Perplexity OFF, headless, 2026-06-11, ~1h23m, ~$27 API): 8 tactics · 88 % unconventional · 0 phantom vectors · build reviewer APPROVED 9 first-pass · 28-vector clean-room LIGHT DB; competitors approved on iteration 2 (mix rule — a second indie_direct was found). New UX bars: welcome printed before any tool call ✓; per-stage narration stayed at 1–2 plain lines with ETAs, the competitors gate retry printed exactly one line ("Quality check asked for one fix…") while the ledger still recorded the full REJECTED row ✓; report/ rendered 9 pages + index with a correct stats line (8 tactics · 8 competitors · 28 mechanisms) ✓; **In plain English:** on 8/8 tactics ✓; names pass the smart-friend read ✓ (e.g. "Call the SMB Teams Your Funded Rivals Just Walked Away From"). One partial bar, fixed in-round: the orchestrator folded the itemized deliverables list into the post-open-question reply instead of printing it first — step-2 wording hardened ("print BEFORE the open-question"). Known follow-up (pre-existing, NOT a v2.5.0 defect): codex/checks.py must_include matching is exact-string, so a run whose lite-constraints emits short-form ids (struct-004) against full-id growth-factors false-positives as "missing" — this run's deliverable validly co-located all Pool-B pairs; normalize short↔full ids in a future checks.py pass. The Windows no-Python sh-fallback re-test is handed back to Anton's test machine.

Addendum — Claude Cowork compatibility (2026-06-11, research-verified; in-app test pending). Cowork supports plugins natively (Help Center "Use plugins in Claude"): Cowork tab → Customize → Plugins → Add from repository syncs a marketplace straight from a GitHub repo — the same marketplace.json schema Claude Code reads, so acogood/diffmode_free should work as-is — and UI-installed plugins are saved locally and persist across relaunches; slash commands + sub-agents (our component set) are Cowork-supported. Root cause of the earlier failed install attempt: asking the in-session agent to install lands in the session's sandboxed VM (ephemeral working dirs, no host ~/.claude/), so the install is wiped on relaunch — the Customize UI is the only durable path. Both READMEs + the orchestrator's report-open step now say so. In-app checks handed to Anton: repo sync accepts the marketplace; a ~1.5–2 h run survives a Cowork session; python3 present in the VM for render_html.py (sh fallback otherwise); browser-open degrades to the files-panel path. (Run that in-app test with the Round-9 command — /diffmode-growth-tactics:start your-product.com; the old :run-growth-tactics name no longer resolves.) Codex needs no equivalent round — it has first-class persistent Agent Skills ($CODEX_HOME/skills/, repo-level .agents/skills/ — the convention this repo already uses), and the shipped Codex path (clone + python3 codex/orchestrate.py) is already durable.

Round-7 — Full Codex orchestrator built + Stage 0 URL intake + A/B-validated (2026-06-04). The Codex runtime is no longer a scaffold. A stdlib-only Python driver — codex/orchestrate.py (the DAG) + codex/checks.py (deterministic structural gates) + codex/codex_dispatch.py (the single codex exec boundary) — runs the full DAG, Stage 0 → 4, exactly as run-growth-tactics.mdAGENTS.md specify: reviewer→retry on the two gated stages (competitors, synthesis build), structural checks on the rest, the Stage-1.5 growth-factors hoist with background overlap, the Stage-4 constraints-stale precheck, and block-level must_include enforcement. This round also closed the last MVP scope cut — Stage 0 URL intake: --url now researches the site headlessly through the diagnostics-intake skill, asking the founder the must-ask fields up front (each worker is a non-interactive codex exec batch call, so the driver asks before the run rather than pausing mid-run); --fast-intake — and any non-TTY / backgrounded run, by an isatty fallback — skips the Q&A and accepts the researched prefill with [NEEDS FOUNDER INPUT] placeholders.

✅ Full-DAG A/B-validated (theona.ai, gpt-5.5, Perplexity OFF, 2026-06-04). Matched the Claude v2.3.0 baseline: 9 tactics · 78% unconventional · 0 phantom vectors · build reviewer APPROVED 8.0 first-pass · 25-vector clean-room LIGHT DB · 18/18 cited URLs live · ~51 min. Calibration note: gpt-5.5 writes markedly more compactly than the Claude/theona-lite3 fixtures (a complete 4-segment audience analysis came in at ~39 non-blank lines), so the per-stage min-line floors in codex/checks.py were recalibrated downward — low enough never to false-positive on a complete-but-terse output, with the LAST-required-section anchor staying the primary non-truncation signal.

No plugin.json bump, no tagcodex/ does not ship to Claude users (marketplace source: ./plugin) and plugin/ is byte-unchanged; consistent with the Round-6 codex-parity commit. Changed: codex/orchestrate.py (Stage 0), codex/checks.py, codex/codex_dispatch.py, .gitignore, codex/AGENTS.md, codex/CODEX.md, README.md, docs/STATUS.md. The dispatch flags + .toml schema notes are verified against codex-cli 0.136 (Round-6's worker smoke was 0.130).

Round-6 — Codex parity: Perplexity-optional on the Codex runtime too (2026-06-02). Brought the Codex research-worker to the same Perplexity-optional posture the Claude plugin reached in Round-5 / v2.4.0: it now prefers the Perplexity MCP when registered and otherwise falls back to Codex's native web_search tool, gated by the same universal citation-source rule + a citation-integrity re-fetch (re-fetch every cited URL on the fallback path, drop/re-ground NXDOMAIN/404, report citationsVerified/citationsDropped). No plugin.json bump, no new tagcodex/ does not ship to Claude users (marketplace source: ./plugin) and plugin/ is byte-unchanged; this completes the v2.4.0 "Codex follow-up."

Grounding facts (verified against codex-cli 0.130 + codex --help): native web search is per-invocation via the top-level web_search config key — disabled / cached (default) / live; on codex exec it is enabled with -c web_search="live" (the bare --search flag is interactive-only: codex exec --search errors; codex --search exec … works). Because the default cached still serves web-cache results, the no-web workers (analysis / synthesis / reviewer) are dispatched with an explicit web_search="disabled" baseline — "no mcp_servers" alone is insufficient. Custom agents live at ~/.codex/agents/*.toml and are silently ignored if malformed; the scaffold's mcp_servers = ["perplexity"] (an array) is rejected (invalid type: sequence, expected a map — the field is a map keyed by server name with a transport), so the worker now declares no mcp_servers and inherits a globally-registered Perplexity MCP instead, with native web_search as the keyless default.

✅ Live smoke validated (theona.ai competitors stage, native web_search, Perplexity OFF). A headless codex exec (-c web_search="live", no Perplexity, --sandbox workspace-write + sandbox_workspace_write.network_access=true) ran enrichment-competitors end-to-end: 30 web_search calls · 0 Perplexity · 4 curl citation re-fetches; output had both required sections (## Competitor Overview, ## Competitive Channel Matrix) + 6 competitors with a correct tier mix (4 market_leader + 2 indie_direct); worker reported citationsVerified=24, citationsDropped=0; independent sweep of 26 cited URLs / 15 hosts → 0 NXDOMAIN, 0 hard-404 (the 5 non-200s are 403/WAF/anti-bot on real hosts — g2, make.com, producthunt, linkedin-999 — correctly kept). The agent file loaded with no warning (schema-valid). Honesty note: a first pass without shell network exposed that a domain-only re-fetch misses deep-path 404s (2 stale deep links slipped through on real domains, citationsDropped=0); the fix was to tighten citation_integrity_check to verify full URLs and to grant the research dispatch shell network for the curl re-fetch — the re-run was clean. Changed: codex/agents/*.toml, codex/CODEX.md, codex/AGENTS.md, docs/architecture.md, README.md. Skills byte-identical; 12 symlinks intact. Smoke installs ~/.codex/agents/research-worker.toml (additive, reversible) and removes it after.

Round-5 — Perplexity-optional / WebSearch fallback (2026-06-02, plugin v2.4.0). Made the Perplexity MCP optional: the research-worker now prefers Perplexity when present and falls back to the built-in WebSearch (zero setup, no API key) across all 5 research stages, removing the single biggest adoption barrier — a new user can run the full pipeline with no MCP at all. The one degradation the measure-first experiment found (the WebSearch path fabricated 1 source domain — digitalailiens.com, NXDOMAIN — where Perplexity fabricated 0, and the no-web reviewer structurally can't catch a hallucinated URL) is gated by a citation-integrity mitigation in agents/research-worker.md: (a) a universal citation-source rule ("cite only URLs you actually retrieved this run; never reconstruct, recall, or invent a domain"), and (b) a new Step-6 citation-integrity re-fetch that WebFetch-verifies every distinct cited domain on the fallback path and drops/re-grounds any NXDOMAIN / hard-404 before returning (reporting citationsVerified / citationsDropped); the Perplexity path skips the re-fetch (its URLs are already grounded → no added latency). Both orchestrators print a one-line WebSearch-fallback-mode banner when no Perplexity MCP is detected (no hard gate — there never was one). The 5 research skills, both READMEs, CLAUDE.md, architecture.md, and eval-methodology.md §4c were softened/updated to backend-neutral; plugin.json 2.3.0 → 2.4.0. Codex side was unchanged in this round — its research-worker still required Perplexity; mirrored in Round-6 below (Codex parity).

✅ Targeted re-validation PASSED (theona.ai competitors stage, 2026-06-02; --plugin-dir on the edited tree, no reinstall):

  • (a) Citation gate, Perplexity-OFF (--strict-mcp-config '{"mcpServers":{}}'): ran fully on the fallback — 75 WebSearch + 28 WebFetch, 0 Perplexity; the worker ran Step 6 and reported citationsVerified=8, citationsDropped=0 (correctly treating a G2 403/WAF block as real, not a fabrication); independent sweep 81/81 cited hosts resolve (0 NXDOMAIN) + 62/62 clickable URLs reachable (0 hard-404) — the old digitalailiens.com fabrication is gone; reviewer APPROVED score 8.
  • (b) Regression smoke, Perplexity-ON (perplexity-only MCP): the worker still prefers Perplexity exclusively — 21 perplexity_* calls, 0 WebSearch, no citation re-fetch (correct); reviewer APPROVED score 9.
  • (c) claude plugin validate → green.

Round-4 speed + simplicity pass (2026-06-01, plugin v2.3.0). Faster + cheaper + simpler, quality held: (1) synthesis 5→3 calls — fused step1+step2 → synthesis-explore (sonnet, structural-check-only) and pass1+pass2 → synthesis-build (opus, reviewer-gated); the hard phase walls (blind-draw ordering, Stripped-Core-Action / Reframing tests, verb-group dedup, Preserve-the-Unconventional-Core, purity + deception vetoes, the exact final output template) carry over verbatim. (2) Reviewers 7→2 — only enrichment competitors and the final synthesis-build stay gated; audience + acquisition-tactics + the 3 think-tanks are structural-check-only. (3) Reliable think-tank parallelism — one message, exactly three Agent calls, platform-arbitrage launched first; removes the ~18-min serialization. (4) Stage-1.5 retry-in-place (resume_partial) — a socket-death respawn resumes mining instead of re-running the deep-research passes (≈8 duplicate Perplexity calls saved). (5) Perplexity caps — search-first, ≤~1-2 deep perplexity_research calls/stage. (6) Channel-Menu-2026 bundled (replaces 2025). Counts: skills 14→12, reviewer gates 7→2 (the 7 rubric files are retained, just unused for the dropped stages).

✅ Re-test PASSED (theona.ai, 2026-06-02) — SHIPPED. All ship bars held; the moat-risky synthesis collapse improved quality. 8 tactics · 88% unconventional (vs v2.2.0 67%, bar ≥60%) · 100% white-space retention (4/4 Phase-1 carried) · 0 phantom vectors (18 unique IDs, all traceable) · verb groups 9, ≤2/group · 0 purity / 0 deception failures · synthesis-build reviewer APPROVED score 9, first pass. Wins measured: wall-clock 85 min (vs ~112 min) even with one explore socket-death respawn (auto-recovered, att2 OK); think-tanks 0s started_at spread (true parallel); 5 deep perplexity_research calls (down from 6) + search-first rebalance, growth-factors mining 10 min (vs ~38 min), no respawn duplication. No revert triggered — commit kept.

Round-3 speed pass (2026-06-01, plugin v2.2.0). Cut the 2.5–3h run without changing output quality: (1) per-stage timing instrumented in the run-ledger (started_at + duration_s) and printed in the final report; (2) growth-factors-mining hoisted to a Stage 1.5 that starts right after the competitors gate and overlaps enrichment + the think-tanks (~40 min off the critical path — it strictly needs only founder-input.md); (3) purchase-objections dropped — a verified dead-leaf enrichment dim nothing downstream consumed (same pattern as demographics), removing a whole reviewer-gated stage (~25 min); (4) synthesis chain model-tiered — the mechanical steps (lite-constraints, step1, step2) run on sonnet via per-dispatch override, pass1/pass2 stay on opus. Counts: enrichment 4→3 dims, skills 15→14, reviewer rubrics 8→7.

Round-2 remediation (2026-05-29). Independent-review fixes landed: Edit tool added to the writing workers (operable format-only retry); the demand-gen-synthesis rubric rewritten clean-room-native and aligned to pass2's actual output; design/ relocated out of the shipped plugin to ../docs/pipeline-skills-design/ + residual IP scrubbed; gate hardening (constraints-stale precheck, block-level must_include, truncation completeness check); an orchestrator run-ledger; and the moat framing reconciled.

TL;DR (plain language)

We grew the enrichment pilot into the full free Diffmode growth-ideation pipeline, packaged as one installable Claude Code plugin: diffmode-growth-tactics. It takes a founder from a 2-minute intake (research a URL, or answer ~8 questions) all the way to a final synthesis.md of 7-9 novel demand-gen tactic IDEAS — and stops at synthesis.

The free moat substitute is the key new idea: because a public plugin ships every file to the user's disk, it can't bundle the proprietary 576-vector database or the Python script that reads it. So each run builds a clean-room LIGHT vector DB fresh from public case studies (growth-factors-mininggrowth-factors.json) and a skill replaces the Python constraints generator (lite-constraints). The 4-step synthesis was ported and IP-scrubbed to read that LIGHT DB. Paid Diffmode keeps prioritization, implementation guides, and the real DB.

This work is written, validated (all 12 skills pass quick_validate.py), and the v2.3.0 theona.ai re-test PASSED every ship bar (2026-06-02) — SHIPPED at v2.3.0 (see the Round-4 note).

Status at a glance

ComponentState
2 manifests (plugin.json v2.6.0 + repo-root marketplace.json)✅ done
diagnostics-intake skill (URL prefill / minimal Q&A)✅ done
3 enrichment dimension skills✅ done (carried from v1; demographics removed 2026-05-28, purchase-objections removed 2026-06-01)
3 think-tank research skills (competitor-gaps, cross-industry, platform-arbitrage)✅ done
growth-factors-mining (per-run clean-room LIGHT DB)✅ done — ⚠ moat-critical
lite-constraints (no-Python synthesis-constraints)✅ done
2 synthesis skills (synthesis-exploresynthesis-build)✅ done — fused from 4 (v2.3.0), IP-scrubbed
growth-reviewer (parameterized, 7 rubrics)✅ done
4 worker sub-agents (research / analysis / synthesis / reviewer)✅ done
Orchestrator (start.md, renamed from run-growth-tactics.md in Round-9) + standalone run-enrichment.md (hidden/dev)✅ done
All 12 skills pass quick_validate.py✅ done
Clean-room verified (nothing reads tactics_DB/)✅ done (grep + skill prohibitions)
End-to-end live run✅ v2.3.0 theona.ai re-test PASSED (2026-06-02): 8 tactics, 88% unconv, 100% white-space, 0 phantom, build reviewer 9, 85 min, think-tanks 0s-parallel
Git commit on main✅ v2.4.0 — Perplexity-optional (2026-06-02)
Per-run cost/latency measured✅ v2.3.0 theona (2026-06-02): ~85 min wall-clock (~75–80 clean); ~5 deep + ~51 search Perplexity calls ≈ $2–3
Light-DB vs proprietary-DB moat comparison⬜ not started
Reviewer-model calibration (Gemini→Sonnet)⬜ open (carried)
Codex / OpenClaw ports✅ Codex full-DAG orchestrator built + A/B-validated (Round-7, codex/orchestrate.py + checks.py + codex_dispatch.py, codex-cli 0.136); OpenClaw port still deferred

Legend: ✅ done · 🟡 built not verified · ⬜ not started.

Measured cost & runtime (per-stage)

Point-in-time, measured end-to-end on theona.ai (v2.3.0, --fast-intake, 2026-06-02). Aggregate: ~75–85 min wall-clock (~75–80 clean; one synthesis socket-death respawn added ~8 min) and ~5 deep perplexity_research + ~51 perplexity_search ≈ $2–3 — or free on the built-in WebSearch fallback. Overlapping stages share a start time:

Stage~TimeNotes
diagnostics intake8 minURL research + prefill
enrichment: competitors (gate)15 minthe one reviewer-gated enrichment dim
enrichment: audience ‖ acquisition-tactics4 / 17 minconcurrent (Wave 2)
growth-factors mining10 minconcurrent — hidden under the critical path
think-tanks ×312 minparallel, not 3×
lite-constraints4 min
synthesis: explore → build12 + 7 min+~8 min if a synthesis socket death respawns

Treat as rough — one product, one run. growth-factors.json is cached (re-mined only on a Start-fresh relaunch), so an auto-resume Continue near synthesis is minutes, not the full hour.

What's in the package

2 orchestrator commands (commands/):

  • start.md — the main entry; runs the full DAG in the main thread (intake → enrichment → think-tanks ‖ LIGHT-DB mining → lite-constraints → synthesis (explore → build) → best-effort founder-report packaging → STOP).
  • run-enrichment.md — standalone enrichment-only entry (hidden/dev — "(advanced — pipeline testing)" in its description), under the new namespace.

13 skills (skills/) — passive instruction docs:

StageSkillsProduces
Diagnosticsdiagnostics-intake01-diagnostics/founder-input.md
Enrichmentenrichment-{competitors,audience,acquisition-tactics}02-enrichment/*.md
Think-tankcompetitor-gaps, cross-industry, platform-arbitrage03-think-tanks/demand-generation/<name>.md
LIGHT DBgrowth-factors-mining…/growth-factors.json (20-40 clean-room vectors)
Constraintslite-constraints…/synthesis-constraints.json
Synthesissynthesis-explore (blind combinations → emergent mechanisms) → synthesis-build (white-space → founder-fit → merge)…/synthesis.md (7-9 tactics, STOP)
Packagingfounder-report (post-gate, best-effort — re-packages synthesis.md as plain tactic cards)…/growth-tactics.md (the founder-facing report)
Reviewgrowth-reviewer (+ 7 rubrics in references/)JSON verdict

4 worker sub-agents (agents/) — thin runners:

  • research-worker — web research (Perplexity + WebFetch): diagnostics URL mode, the enrichment research dims (competitors, acquisition-tactics), platform-arbitrage, growth-factors mining.
  • analysis-workerno research MCP: audience, competitor-gaps, cross-industry.
  • synthesis-workerno MCP, clean-room; default opus but model-tiered per dispatch (lite-constraints + explore → sonnet, build → opus): lite-constraints + the 2 synthesis stages.
  • reviewer — read-only; runs growth-reviewer and returns the verdict.

2 manifests: plugin/.claude-plugin/plugin.json (name: diffmode-growth-tactics) and the repo-root .claude-plugin/marketplace.json (marketplace diffmode-free, source: ./plugin).

How it gates

Filesystem state is the contract between stages. Each generating stage runs: dispatch worker → existence/structural check → (where it has a rubric) reviewer loop, score ≥ 7, max 3 retries with blocking issues injected. Reviewer-gated (v2.3.0): only enrichment competitors and the final synthesis-build. Structural check only: enrichment audience

  • acquisition-tactics, the 3 think-tanks, growth-factors.json (JSON + schema + counts + clean-room; mined at Stage 1.5, collected at the Stage-3 boundary), synthesis-constraints.json (schema + every ID exists in the LIGHT DB), and synthesis explore (required sections + blind-draw ordering + verb-group validity). Wave 1 (competitors) and the LIGHT DB are blocking gates for everything downstream.

Key decisions

  • Plugin diffmode-growth-tactics, marketplace diffmode-free. Command surface /diffmode-growth-tactics:start (Round-9; formerly :run-growth-tactics); skills/workers namespaced diffmode-growth-tactics:*.
  • The moat is DB breadth + paid downstream — not the method. The synthesis method is what this plugin demonstrates (free); the moat is the proprietary 576-vector DB (breadth) + intelligence layer + the paid prioritization + implementation stages. Free runs the method on a weaker per-run LIGHT DB and stops at synthesis.
  • Per-run clean-room LIGHT DB. growth-factors-mining never reads tactics_DB/; it mines public case studies fresh each run (mechanism-over-tactic), caches growth-factors.json, and re-mines only on a Start-fresh relaunch (remine: true in the mining brief). lite-constraints reasons in-context to emit the same synthesis-constraints.json shape the proprietary Python generator produced (white-space pairs, synergy / founder-fit pools, prohibited conventional patterns, category diversity, anti_patterns) — dropping the proprietary intelligence layer's internal pair-scoring (scaffolding, not a consumed field).
  • Synthesis: 4 IP-scrubbed steps, fused to 2 stages (v2.3.0). synthesis-explore (Phase 1 blind vector-first combinations → Phase 2 emergent mechanism derivation) → synthesis-build (Phase 1 white-space exploration → Phases 2-3 founder-fit merge → final). Proprietary vector IDs/examples were genericized to category-level patterns + the {prefix}-NNN-slug format; vector definitions come from growth-factors.json. The proprietary anti-vector-tracking read was dropped (uses the lite anti_patterns); no proprietary vector-validation post-step. The blind-draw → mechanism wall inside explore is the novelty engine and is independent of the removed intelligence layer.
  • Generalized workers (3→4). Stage-neutral research/analysis/synthesis/reviewer; synthesis-worker is opus + no-MCP for reasoning-heavy clean-room synthesis.
  • One parameterized reviewer, 7 rubric files (2 used in v2.3.0). 3 enrichment (SR-ENR) + 3 think-tank + the demand-gen-synthesis rubric, bundled in growth-reviewer/references/, reached via ${CLAUDE_PLUGIN_ROOT}. v2.3.0 dispatches only the competitors + demand-gen-synthesis rubrics; the other five are retained but unused (no churn). The synthesis rubric carries a clean-room note: score against the per-run LIGHT DB, and synthesis is the final stage (no Week-1 depth required).
  • Reviewer threshold ≥ 7, max 3 retries — faithful to the pipeline's enrichment config.

Open items / next steps

  1. Live end-to-end run/diffmode-growth-tactics:start <site> on a known workspace (e.g. theona.ai, in a scratch copy — --scratch was cut in Round-9); confirm synthesis.md has 7-9 tactics, ≥50% unconventional, each traceable to a growth-factors.json vector.
  2. Per-run cost/latency measured (v2.3.0 theona, 2026-06-02): ~85 min wall-clock (~75–80 clean; one synthesis socket-death respawn added ~8 min) and ~5 deep perplexity_research + ~51 perplexity_search ≈ $2–3 (deep-research-dominated; growth-factors-mining ran ~10 min concurrent, off the critical path). Caching + --remine behaved (the explore respawn did NOT re-mine growth-factors). See Measured cost & runtime above for the per-stage table.
  3. Moat comparison — diff a light-DB synthesis vs a proprietary-DB run for the same workspace; confirm the free output is useful but visibly weaker.
  4. Reviewer-model calibration — Gemini→Sonnet, same as the enrichment pilot; confirm Sonnet's scores land in range during the smoke-test.
  5. Commit on a branch — everything under pipeline-skills/ + repo-root .claude-plugin/ is untracked on main.
  6. OpenClaw port — still deferred. (The Codex full-DAG orchestrator is built + A/B-validated as of Round-7 — codex/orchestrate.py; OpenClaw is the remaining runtime port.)
  7. Cross-repo bundling (optional) — bundle the channel menu + spec prompts so the plugin can run outside the ai-cmo tree.

Where to read more

DocWhat it covers
README.mdOnboarding: what it is, quickstart + install, what you get, how it works
../docs/pipeline-skills-design/architecture.mdOrchestration model, one-level-deep constraint, state contract (internal; not shipped in the plugin)
../docs/pipeline-skills-design/full-pipeline-map.mdOriginal mapping of think-tank / prioritization / implementation stages (internal; not shipped)
../docs/MODULES.mdThe pipeline-skills module entry in the repo module map
../docs/CHANGELOG.mdThe entry for this expansion

The design notes (now in ../docs/pipeline-skills-design/, not shipped in the plugin) were written for the original enrichment pilot; README.md + STATUS.md are the current source of truth for the expanded diffmode-growth-tactics pipeline.