O: Give a busy practitioner — architect, facility owner, or installer — an article that answers the question they came to Google with so clearly that they bookmark it, share it with a colleague, and come back next time; while simultaneously leaving the article structured enough that an LLM answer engine can cite it accurately and a Waterson human reviewer can append their own sales and field insights without rewriting the base. Over 6 months of publishing at this quality bar, watersonusa.ai should see measurable lift in both organic search rankings and AI-engine citations.
Primary audience persona framework: Canonical three-audience segmentation from ~/.claude/skills/writing-guide/SKILL.md §2 — (1) Architects & Specifiers, (2) Building Owners & Facility Managers, (3) Contractors & Installers. The fleet decides per-article whether to write 3 separate versions (when a topic changes meaning across audiences) or 1 universal article (when the factual core is shared).
The two outcomes that together define success:
SEO outcome: A practitioner arriving via Google search finds the answer in the first 20 seconds, keeps reading for the nuance, and bookmarks it. Google rewards with ranking. Internal links compound that lift across the blog graph.
AEO outcome: A crawler / answer engine (ChatGPT, Perplexity, Gemini) can parse the structured data, extract citable facts, and cite watersonusa.ai as the source in its answer. Schema.org Article + FAQPage + JSON-LD are non-negotiable; natural-language Q&A blocks anchor the AEO extraction.
If either outcome is missing, O is not achieved. A beautiful article that never appears in search results failed O. An article that ranks but gets zero AI citations failed O.
---
| Wave | Role | Agent | External? |
|---|---|---|---|
| ------ | ------ | ------- | ----------- |
| Wave 0 | Orchestration & Queue Triage | Blog Commander | — |
| Wave 1 | Research Expansion | Research Deepener | — |
| Wave 2 | Base-Layer Drafting | Article Writer (per-audience or universal — see S) | — |
| Wave 3 | Verification | Fact Checker, Source Reviewer | — |
| Wave 4 | Structuring + External Voice Review + Audit | SEO/AEO Engineer, Audience Persona Reviewer, Quality Auditor | Audience Persona Reviewer = YES |
| Wave 5 | Bilingual + Publishing | Bilingual Publisher (en + zh + web) | — |
blog-gate-review-{slug}-waveN.md; audience-shape decision and external verification logged; Pilot passes required checks before fan-out; queue entries move pending → researching → drafting → reviewing → ready_for_human_review with Commander-signed state transition log./ai-collab --task verify and /ai-fallback; raw gemini / codex CLI prohibited./ai-collab second opinion on audience shape.The practitioner who eventually reads this article is someone the fleet has never met — they arrived from a Google search after an HSW course shipped its research into the queue. Blog Commander's job is to make sure all 8 downstream agents work for THAT practitioner, not for each other and not for the queue's internal logic. Every gate review answers: "If an architect, an owner, or an installer opened this article right now, would they stop scrolling at paragraph 2?"
.content-scout-queue.md candidates where state = pending. For each, decide audience shape (universal vs split-3).research_data, title, keywords, and type./ai-collab --task verify with the candidate payload plus proposed shape.AGREE or DISAGREE plus rationale.## Audience Shape Decision in the queue entry with: proposed_shape, gemini_verdict, gemini_rationale, final_shape, override_rationale.type balance, (b) freshness of research_data, (c) SEO/AEO compounding value, (d) whether the queue already over-indexes on universal or split-3 decisions. Priority logic is written into triage-{date}.md.dispatch-log-blog-{slug}.md./ai-collab --task verify for every Audience Shape Decisionbash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "<prompt>" "<chain>" for any additional external verificationdispatch-log-blog-{slug}.md with command, answered model, exit code, timestamp, purposeblog-gate-review-{slug}-waveN.md exists per wave and contains: practitioner present?, base-layer preserved?, cited evidence paragraph, blockers list.## Audience Shape Decision YAML block appended to queue entry for every dispatched candidate and contains all of:proposed_shapegemini_verdictgemini_rationalefinal_shapeoverride_rationaledispatch-log-blog-{slug}.md.grep -E '^(echo|gemini|codex)' dispatch-log-blog-{slug}.md returns 0 hits.universal and split-3. If either exceeds 80%, note required in retro even if decisions were individually justified./ai-collab --task verify, log agreement/disagreement, and document any override rationale.gemini or raw codex directly — INSTEAD: wrapper only; raw CLI is a hard failure.Without Commander's per-candidate audience-shape decision and base-layer discipline, the fleet would produce either generic all-audiences mush or overbuilt drafts that humans cannot augment later.
research_data into 800–1500 words of claim-level-cited blog-ready material./ai-fallback for summarization/verification; every claim gets a first-party URL or gets demoted.blog-research-{slug}.md contains expanded material with per-claim source URLs; ≥ 3 new primary sources beyond what research_data already cited; Execution Log with every WebSearch / wrapper call.bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "<prompt>" "gemini-2.5-flash,gemini-2.5-flash-lite,gemini-2.5-pro,codex" (verification/synthesis only)./ai-fallback only for summarization and cross-verification.secondary-only./ai-fallback call recorded in blog-research-{slug}.md.blog-research-{slug}.md containing:research_data copied from queue entrysecondary-only flag/ai-fallback callresearch_data already cites.max(3, ceil(expanded_claims_total / 3)).secondary-only claims must be hedged downstream.research_data verbatim block — INSTEAD: copy it in full, then build expansion around it.echo | gemini or raw codex exec for any LLM call — INSTEAD: wrapper only; raw CLI is a hard failure.secondary-only with hedged downstream language.Without Research Deepener, the article would be a 1500-word synthesis of a 300-word course fragment plus LLM hallucination.
blog-draft-{slug}.md (or per-audience variants) with front-loaded answer, ≥ 3 hand-off slots, audience explicitly declared in frontmatter, internal-link suggestions inline.writing-guide §§1–5 before writing.<!-- HUMAN LAYER: sales-response --><!-- TODO: human reviewer fills in --><!-- HUMAN LAYER: field-experience --><!-- TODO: human reviewer fills in --><!-- HUMAN LAYER: sme-note --><!-- TODO: human reviewer fills in -->secondary-only status.blog-draft-{slug}.md or blog-draft-{slug}-{audience}.md:audienceHUMAN LAYER slots present<!-- TODO: human reviewer fills in -->blog-research-{slug}.md claim IDgrep -c "HUMAN LAYER:" returns ≥ 3.HUMAN LAYER slots with TODO markers.universal — INSTEAD: honor the shape decision.blog-research-{slug}.md — INSTEAD: escalate to Commander to reopen Wave 1 if needed.O's SEO outcome depends on front-loading the answer; O's AEO outcome depends on citation discipline; the base-layer principle keeps the fleet from producing finished sales copy masquerading as a draft.
bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Verify: [number] [claim]. Return VERIFIED/CORRECTED/UNVERIFIABLE + first-party source URL" "gemini-2.5-flash,gemini-2.5-flash-lite,gemini-2.5-pro,codex" + WebSearch Tier 2 backup.max(3, ceil(numeric_claims_total / 3)).blog-review-{slug}-facts.md:## Under-Delivery Log section if needed## Execution Log with every wrapper and WebSearch callcall_with_fallback.sh for LLM verification — INSTEAD: wrapper only; raw CLI is a hard failure.O's AEO outcome requires crawlers to parse citable facts; O's SEO outcome requires Google's Helpful Content systems to see real citations not hallucinated ones.
/ai-fallback (chain depth ≥ 3); reviewer-override layer on top of raw model output; opinion-vs-empirical rule applied to every first-person narrative claim.blog-review-{slug}-sources.md with reconciliation table vs Fact Checker, 100% of citations URL-verified or ID-verified, pre-2018 version-note flags, single-source ≤ 40% and Waterson-material ≤ 20%.bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Review all citations in [file]. Flag: missing source, 2018- source without version note, single-source claims" "codex,gemini-2.5-pro,gemini-2.5-flash-lite"./ai-fallback output.blog-review-{slug}-sources.md:blog-review-{slug}-facts.md## Opinion vs Empirical Check/ai-fallback calls.empirical-unverifiable.[source needed] placeholders ship without escalation — INSTEAD: escalate to Commander on first sighting.The AEO outcome requires LLM engines to trust the article's citations enough to cite watersonusa.ai back. An unreachable URL or an opinion-dressed-as-data claim tells the crawler this is untrustworthy content.
/blog/* and /solutions/* pages; FAQ block doubles as AEO anchor./ai-fallback for schema validation./ai-fallback Gemini Flash.keywords.blog-seo-{slug}.md and inject finalized HTML:keywords./ai-fallback Gemini Flash.SEO outcome is directly engineered here. AEO outcome lives here too: FAQPage JSON-LD is the single highest-leverage anchor for answer-engine citation.
/ai-fallback; each persona answers the same decision questions independently; reviewer-override layer consolidates agreement and disagreement.blog-review-{slug}-persona.md contains 3 independent persona sections, quoted paragraph references, verdict per persona, cross-persona agreement table, and Commander action recommendation.bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Role-play [persona]. Read this blog draft cold. Answer the 6 decision questions and cite the exact paragraphs." "gemini-2.5-pro,gemini-2.5-flash-lite,codex".universal:In the first 200 words, did I get the answer I came for?
Does this sound like it understands my day-to-day workflow?
Is any section obviously written for a different audience than me?
Did any paragraph feel like generic vendor/trade-content filler?
If I bookmarked this, what exact section would I return to later?
What is the strongest reason I would stop trusting this article?
voice-driftworkflow-mismatchwrong-reader-assumptiongeneric-fillercold-open-failureuniversal/split-3 shape was wrong.blog-review-{slug}-persona.md containing:audience_shape_under_review, review_mode: cold-read, answered_model, timestamp## Architect Persona## Owner Persona## Installer Persona## Cross-Persona Agreement Table with issue_id / class / architect / owner / installer / agreement / recommended_action## Shape Challenge stating whether the original Audience Shape Decision still looks correct## Commander Recommendation with accept / accept-with-revisions / revise-shapeO fails if the article is technically clean but emotionally and professionally misaddressed. The audience cold-read is the only direct check that the right practitioner recognizes themselves in the prose.
blog-audit-{slug}-wave4.md contains reverse-index table, testable-claim inventory, S-evidence audit, classified failures, and Commander escalation with pass/block decision.blog-review-{slug}-facts.mdblog-review-{slug}-sources.mdblog-review-{slug}-persona.mdClaims present in the article but absent from review tables are reverse-index-miss.
testable if it contains any of:higher, lower, more likely, faster, safer)leads to, causes, reduces, prevents)class-1 structural handoff fail: missing artifact, missing required table, missing execution log, malformed slot, absent persona sectionclass-2 coverage fail: claim present in article but absent from review index, missing URL, missing question answer, incomplete FAQ/schema syncclass-3 scope-creep or role-boundary fail: agent did unassigned work, rewrote another agent's scope, or silently changed audience shapeblog-audit-{slug}-wave4.md containing:## Testable Claim Inventory## Reverse-Index Table with claim_id / draft_location / fact_checker / source_reviewer / persona_reviewer / status## S-Evidence Audit by agent## Base-Layer Integrity Check## Classified Failures## Commander EscalationPASS / PASS-WITH-NOTES / BLOCKQuality Auditor does not create reader value directly. It protects the fleet from shipping false confidence. Without it, the fleet can appear rigorous while silently skipping claim coverage or eroding the base-layer contract.
door-site/blog/{en,zh,web}/{slug}/index.html, run /security-check, enforce empty human-layer slots, stage commit, do NOT push./publish-article template for en; translate en→zh with Taiwan-specific rules; run Gemini Flash natural-voice pass and Gemini 2.5 Pro Taiwan-lexicon pass; /security-check before staging./security-check passes; commit staged but not pushed./security-check mandatory; /publish-article template reference./ai-fallback for natural-voice QA; Gemini 2.5 Pro via /ai-fallback for Taiwan-specific second pass./publish-article template directly. Path: door-site/blog/{slug}/index.html.<html lang="zh-Hant">door-site/blog/zh/{slug}/index.htmldoor-site/blog/web/{slug}/index.html.door-site/sitemap.xml, llms.txt, llms-full.txt, and blog/index.html.PASS/FAIL, flagged terms, and preferred Taiwan replacements信息 (資訊)軟件 (軟體)視頻 (影片)支持 (支援)質量 (品質)硬件 (硬體)芯片 (晶片)用戶 (使用者 or 客戶, context-dependent)運營 (營運)渠道 (通路)適配 (相容 or 適用)賬號 (帳號)代碼 (程式碼 or 代號, context-dependent)數據 (資料)默認 (預設)配置 (設定)調用 (呼叫)接口 (介面)模塊 (模組)文檔 (文件)兼容 (相容)線程 (執行緒)緩存 (快取)日誌 (紀錄)異步 (非同步)登錄 (登入)註冊 (註冊帳號 or 建立帳號, context-dependent)<!-- HUMAN LAYER: ... --> comment must be followed within 3 lines by either blank content or <!-- TODO: human reviewer fills in -->/security-check mandatory before staging commit./upload.blog-publish-{slug}.md./security-check log shows PASS.sitemap.xml, llms.txt, llms-full.txt, and blog/index.html updated.[BASE LAYER — awaiting human review before push].git push executed.grep -nA3 'HUMAN LAYER:' door-site/blog/{slug}/index.htmlgrep -nA3 'HUMAN LAYER:' door-site/blog/zh/{slug}/index.htmlgrep -nA3 'HUMAN LAYER:' door-site/blog/web/{slug}/index.html<!-- TODO: human reviewer fills in -->grep -En '信息|軟件|視頻|支持|質量|硬件|芯片|用戶|運營|渠道|適配|賬號|代碼|數據|默認|配置|調用|接口|模塊|文檔|兼容|線程|緩存|日誌|異步|登錄' door-site/blog/zh/{slug}/index.htmlgrep -E '^(echo|gemini|codex)' blog-publish-{slug}.md returns 0 hits.ready_for_human_review with Commander signature.content-plan.md Published Articles section updated after publishing with: article title, URL, status (Published), date, type, languages (EN/ZH/Web), source. Missing this update = publish incomplete; Commander must verify it in gate review.content-plan.md, also update admin/content-plan/index.html JavaScript data array with the same article entry (id, priority, title, titleEn, url, whyZh, whyEn, articleZh, articleEn, articleScore, questions). The admin UI reads from this JS array, not from content-plan.md — both must be in sync./upload or git push after staging — INSTEAD: stage and stop; human review must happen first.content-plan.md AND admin/content-plan/index.html JS data — INSTEAD: both files are sources of truth; content-plan.md for markdown consumers, admin JS for the web UI.Chinese readers are real practitioners whose SEO lift also compounds. The web variant is the answer-engine anchor. And the do-not-push discipline operationalizes the base-layer principle.
HSW course production is the *means*. The deep research accumulated during course production is the *fuel*. This fleet converts that fuel — already flowing into .content-scout-queue.md via Candidate Collector (HSW-002 v5.1 Agent #19) — into published blog articles on watersonusa.ai. The ultimate goal is compounding SEO + AEO lift: as more HSW courses are built, more high-quality research flows into the queue, and more base-layer articles land on the site. Each article is designed to be both searchable by Google (SEO) and citable by LLM answer engines (AEO: ChatGPT / Perplexity / Gemini).
Critical design principle — base layer only. This fleet produces the structurally augmentable base of each article, not the final sealed product. Human reviewers (Waterson sales staff, subject-matter experts) append additional layers after the fleet's output: personal thinking process, professional sales responses, field-experience anecdotes. The fleet's output schema must leave designated slots for those human layers. An article that is "perfect" after the fleet finishes has actually failed the base-layer constraint — it leaves no room for the human hand-off.
---
v2 exists because all 6 tracked weaknesses in v1 were real and operationally important. The fleet is now specified as 9 agents, not 7, with two new Wave 4 reviewers and several new hard gates.
Audience Persona Reviewer added as Agent #8 in Wave 4. Reuses the HSW-002 Project Architect Advisor pattern, but adapted for blog articles and expanded to three canonical audiences: architect, owner, installer.
Quality Auditor added as Agent #9 in Wave 4. Reuses the v5.1 audit pattern, adds reverse-index claim coverage checking, explicit testable-claim definition, and scope-creep anti-pattern control.
Commander's Audience Shape Decision now requires a Gemini Flash second opinion. Commander must call /ai-collab --task verify, log agreement or disagreement, and document any override rationale.
Layer 2.5 dry-run is now mandatory in Pre-Production Checklist. All 9 agents must be dry-run before the first real dispatch.
Base-layer enforcement is partially automated at publish stage. Bilingual Publisher must fail any draft where a HUMAN LAYER slot is pre-filled instead of left empty or marked TODO.
Bilingual Publisher now enforces Taiwan-specific language quality. A mainland-vocabulary blocklist plus Gemini 2.5 Pro second-pass review is required for zh-Hant output.
---
This fleet is the downstream consumer of the producer-side contract established in HSW-002 v5.1. It explicitly reuses the following v5.1 components (do not re-invent):
<table>
<tr><th>v5.1 Component</th><th>Reuse In</th></tr><tr><td>---</td><td>---</td></tr><tr><td><code>/ai-fallback</code> wrapper (<code>call_with_fallback.sh</code>)</td><td>All agents that call external LLMs — Commander verification, Research Deepener, Fact Checker, Source Reviewer, Audience Persona Reviewer, SEO/AEO Engineer, Bilingual Publisher</td></tr><tr><td>P-015 WebSearch-primary pattern for research archetype</td><td>Research Deepener (primary path); <code>/ai-fallback</code> only for verification/synthesis</td></tr><tr><td>P-019 NEW-03 forbidden phrase list (7 phrases)</td><td>Fact Checker Anti-patterns (verbatim copy)</td></tr><tr><td>Direction Seed 9-field dispatch template</td><td>Blog Commander dispatches all 8 downstream agents via this template</td></tr><tr><td>Pilot Dispatch pattern (pilot first, then fan-out)</td><td>Blog Commander runs Pilot on Research Deepener before parallelizing Wave 2 writers and Wave 4 reviewers</td></tr><tr><td>Principle 7 (embedded skill + model invocations)</td><td>All S sections carry full command format; Skill + Model Invocation Maps are central source of truth</td></tr><tr><td>Project Architect Advisor external-persona pattern</td><td>Audience Persona Reviewer (architect / owner / installer cold-read reports)</td></tr><tr><td>Quality Auditor pattern</td><td>Blog Quality Auditor in Wave 4, adapted to blog-claim coverage and base-layer enforcement</td></tr><tr><td>4 OGSM validators (<code>validate_s_to_m_coverage.py</code> etc.)</td><td>Run against this document before first production dispatch</td></tr><tr><td>G-022 scope-aware polish discipline</td><td>Fact Checker + Source Reviewer under-delivery escape clause; Quality Auditor scope-creep prohibition</td></tr><tr><td>Candidate Collector queue schema (10 fields)</td><td>Input contract (read-only for this fleet)</td></tr><tr><td>Reviewer-override pattern (raw model → reviewer's anti-pattern pass)</td><td>Fact Checker + Source Reviewer + Audience Persona Reviewer reuse the 2-layer design</td></tr><tr><td>Brief Layering (Tier 1 ≤150 words + Tier 2 reference)</td><td>All agents define Tier 1 summary block</td></tr>
</table>
---
<table>
<tr><th>Agent</th><th>Wave</th><th>Skill</th><th>Trigger Condition</th><th>Command Format</th></tr><tr><td>-------</td><td>------</td><td>-------</td><td>-------------------</td><td>----------------</td></tr><tr><td>Blog Commander</td><td>Wave 0</td><td><code>/ai-collab --task verify</code></td><td>Every Audience Shape Decision before first downstream dispatch</td><td>/ai-collab --task verify --candidate-file ".content-scout-queue.md" --candidate-id "{slug}" --question "Does this candidate require universal or split-3 audience shape?" --proposed-shape "{universal</td><td>split-3}"</td></tr><tr><td>Bilingual Publisher</td><td>Wave 5</td><td><code>/security-check</code></td><td>Before every staged commit</td><td><code>/security-check</code> (read <code>~/.claude/skills/security-check/SKILL.md</code>; run workflow; any non-PASS blocks commit)</td></tr><tr><td>Bilingual Publisher</td><td>Wave 5</td><td><code>/publish-article</code> (template reference, not full workflow)</td><td>English HTML generation — copies template only, not deploy steps</td><td>Read <code>~/.claude/skills/publish-article/SKILL.md</code> §HTML Template + §CSS Variables as canonical template source; do not execute deploy steps</td></tr>
</table>
Intentionally NOT in the map: the fleet does not call /content-scout flag-candidate. It is the consumer of entries other fleets wrote.
Intentionally NOT in the map: the fleet does not call /upload. Base-layer discipline forbids push before human review.
---
Division of labor
/ai-fallback: Fact Checker verification; SEO/AEO schema validation; Bilingual Publisher natural-voice QA/ai-collab: Commander's Audience Shape Decision second opinion/ai-fallback: Audience Persona Reviewer cold-read personas; Bilingual Publisher Taiwan-specific second pass/ai-fallback: Source Reviewer citation cross-verification<table>
<tr><th>Agent</th><th>Wave</th><th>Model</th><th>Purpose</th><th>Command Format</th></tr><tr><td>-------</td><td>------</td><td>-------</td><td>---------</td><td>----------------</td></tr><tr><td>Blog Commander</td><td>all</td><td>Claude Opus + Gemini Flash second opinion</td><td>orchestration + audience-shape decision + conflict resolution</td><td>Native for orchestration; every audience-shape decision also calls <code>/ai-collab --task verify ...</code>; additional external verification uses <code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "<prompt>" "<chain>"</code></td></tr><tr><td>Research Deepener</td><td>Wave 1</td><td>WebSearch (primary) + <code>/ai-fallback</code></td><td>expand course fragment to 800–1500 words with per-claim first-party URLs</td><td>Research/discovery: WebSearch. Verification/synthesis: <code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Verify/summarize: [X]" "gemini-2.5-flash,gemini-2.5-flash-lite,gemini-2.5-pro,codex"</code></td></tr><tr><td>Article Writer</td><td>Wave 2</td><td>Claude Sonnet</td><td>base-layer draft</td><td>native</td></tr><tr><td>Fact Checker</td><td>Wave 3</td><td>Gemini Flash via <code>/ai-fallback</code> + WebSearch Tier 2</td><td>numeric/regulatory/monetary claim verification</td><td><code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Verify: [number] [claim]. Return VERIFIED/CORRECTED/UNVERIFIABLE + first-party URL" "gemini-2.5-flash,gemini-2.5-flash-lite,gemini-2.5-pro,codex"</code></td></tr><tr><td>Source Reviewer</td><td>Wave 3</td><td>Codex → Gemini 2.5 Pro → Flash-Lite via <code>/ai-fallback</code></td><td>citation cross-verification; min chain depth 3</td><td><code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Review citations in [file]. Flag: missing source, pre-2018 without version note, single-source claims, priority-violation, opinion-vs-empirical signals" "codex,gemini-2.5-pro,gemini-2.5-flash-lite"</code></td></tr><tr><td>SEO/AEO Engineer</td><td>Wave 4</td><td>Gemini Flash via <code>/ai-fallback</code></td><td>JSON-LD schema validation</td><td><code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Validate schema.org JSON-LD for Article + FAQPage: [blocks]. Return STRUCTURALLY_VALID/INVALID + error list" "gemini-2.5-flash,gemini-2.5-flash-lite,gemini-2.5-pro,codex"</code></td></tr><tr><td>Audience Persona Reviewer</td><td>Wave 4</td><td>Gemini 2.5 Pro via <code>/ai-fallback</code></td><td>architect / owner / installer cold-read persona simulation</td><td>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Role-play [architect</td><td>owner</td><td>installer] persona. Read this blog draft cold. Answer 6 decision questions with paragraph citations." "gemini-2.5-pro,gemini-2.5-flash-lite,codex"</td></tr><tr><td>Quality Auditor</td><td>Wave 4</td><td>Claude Opus or Sonnet</td><td>reverse-index audit, S-evidence gate, handoff readiness</td><td>native</td></tr><tr><td>Bilingual Publisher</td><td>Wave 5</td><td>Gemini Flash + Gemini 2.5 Pro via <code>/ai-fallback</code></td><td>zh natural-voice QA + Taiwan-specific lexical/cultural pass</td><td>Flash: <code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Read this zh-Hant article. Natural voice for a Taiwanese door-hardware professional? Score 1-5 + list stiff phrasing" "gemini-2.5-flash,gemini-2.5-flash-lite,gemini-2.5-pro,codex"</code>; Pro: <code>bash ~/.claude/skills/ai-fallback/scripts/call_with_fallback.sh "Act as a Taiwan copy editor. Flag any mainland lexical drift, machine-translation smell, and non-Taiwan phrasing in this zh-Hant article. Return PASS/FAIL + fixes" "gemini-2.5-pro,gemini-2.5-flash-lite,codex"</code></td></tr>
</table>
Principle 7 applies: any agent whose S references an external LLM must carry the full command format in its S block, and Commander copies the row into Direction Seed field 5 at dispatch.
---
Every subagent dispatch carries all 9 fields. Missing a field = briefing failure; deliverable does not enter gate review; subagent must be re-dispatched with the fix.
Fleet ID + Role Name — e.g. BLOG-WRITER-FLEET / Audience Persona Reviewer
Target Audience Persona — one of the 3 canonical audiences from ~/.claude/skills/writing-guide/SKILL.md §2, with concrete description: years of experience, typical workflow, what they type into Google. For universal shape, all three in one briefing; for persona review, each persona gets its own sub-brief.
O (quoted verbatim) — the full O paragraph from this document's §O section
This agent's G/S/M — copy from this doc's agent section, Tier 1 version
Embedded Skill + Model Invocations — copy relevant rows from Skill Invocation Map + Model Invocation Map, with full command format, plus the mandatory knowledge query commands:
`bash
bash ~/.claude/skills/ogsm-framework/scripts/get_patterns_for_failure.sh <failure-type>
bash ~/.claude/skills/ogsm-framework/scripts/get_gotchas_for_context.sh <context-keyword>
bash ~/.claude/skills/ogsm-framework/scripts/get_skills_for_role.sh <role-name>
`
Hard Constraints — e.g. hand-off slots ≥ 3, word count 900–1400, no raw echo | gemini, mainland-vocabulary blocklist prohibited
Tone + Voice Requirements — audience-matched per writing-guide §2; peer-to-peer with target practitioner; never marketing
Deliverable Format + File Path — exact filename under docs/blog-writer-fleet/{slug}/
Anti-patterns to avoid — at least 3 items, verbatim copied from the agent's own standard list in this doc
### Direction Seed addendum for v2
### Pilot Dispatch rules
Fan-out checklist (Commander personally runs after pilot returns)
Deliverable shape matches expected structure
Audience is explicit
Knowledge query outputs present
/ai-fallback execution log present if required
Anti-patterns verbatim-copied from source standard list
If the pilot is Audience Persona Reviewer: all 3 personas answered all 6 decision questions
Pilot fail → Commander rewrites the failing briefing field, re-dispatches pilot only, retries until pass. No fan-out until pilot passes.
---
<table>
<tr><th>Agent</th><th>Primary G Output</th><th>O SEO (rank)</th><th>O AEO (cited)</th><th>O Base-Layer (augmentable)</th><th>O Risk if G Fails</th></tr><tr><td>-------</td><td>-----------------</td><td>--------------</td><td>---------------</td><td>---------------------------</td><td>-------------------</td></tr><tr><td>Blog Commander</td><td>audience shape + wave alignment</td><td>indirect</td><td>indirect</td><td>direct</td><td>whole fleet incoherent</td></tr><tr><td>Research Deepener</td><td>800–1500 words with per-claim first-party URLs</td><td>necessary</td><td>necessary</td><td>—</td><td>Writer hallucinates or thins out</td></tr><tr><td>Article Writer</td><td>base-layer draft, audience-voiced, hand-off slots</td><td>direct</td><td>indirect</td><td><strong>direct</strong></td><td>sealed article humans can't augment</td></tr><tr><td>Fact Checker</td><td>numeric claims verified with first-party URLs or hedged</td><td>direct</td><td><strong>direct</strong></td><td>—</td><td>citations rot; AEO rejects article</td></tr><tr><td>Source Reviewer</td><td>reachable references + opinion-vs-empirical discipline</td><td>direct</td><td><strong>direct</strong></td><td>—</td><td>trust collapse; SEO + AEO both lose</td></tr><tr><td>SEO/AEO Engineer</td><td>JSON-LD + internal links + FAQ anchors</td><td><strong>direct</strong></td><td><strong>direct</strong></td><td>—</td><td>article invisible to both channels</td></tr><tr><td>Audience Persona Reviewer</td><td>cold-read voice realism across architect / owner / installer</td><td>indirect</td><td>indirect</td><td>direct</td><td>technically clean but wrong-reader article ships</td></tr><tr><td>Quality Auditor</td><td>reverse-index claim coverage + S-evidence gate</td><td>indirect</td><td>indirect</td><td><strong>direct</strong></td><td>false confidence; gaps ship unnoticed</td></tr><tr><td>Bilingual Publisher</td><td>3 variants staged, language-checked, not pushed</td><td>direct (zh + hreflang)</td><td>direct (web variant)</td><td><strong>direct</strong></td><td>push too early; language drift; slots pre-filled</td></tr>
</table>
---
### Gate 0 → Wave 1 begins
pending state confirmed/ai-collab --task verify run on the proposed shape and logged### Gate 1 → Wave 2 begins
blog-research-{slug}.md delivered with verbatim research_data, expanded material 800–1500 words, per-claim first-party URLs, Execution Log, ≥ 3 new primary sourcespending → researching with Commander signatureblog-gate-review-{slug}-wave1.mdgrep -E '^(echo|gemini|codex)' blog-research-{slug}.md returns 0 hits### Gate 2 → Wave 3 begins
blog-draft-{slug}.md or per-audience variants delivered with 900–1400 words, front-loaded answer in first 200 words, ≥ 3 HUMAN LAYER slots, TODO markers present, ≥ 2 internal link seed notes, YAML frontmatter with declared audienceresearching → drafting with Commander signature### Gate 3 → Wave 4 begins
blog-review-{slug}-facts.md delivered with 100% numeric claims reviewed, zero NEW-03 forbidden phrases, under-delivery log if applicable, Execution Log with ≥ max(3, ceil(claims/3)) entries, first-party URLs for every verified rowblog-review-{slug}-sources.md delivered with per-claim coverage index, reconciliation table vs facts review, opinion-vs-empirical check, 5% unverifiable budget alignment, single-source ≤ 40% and Waterson ≤ 20%drafting → reviewing with Commander signature### Gate 4 → Wave 5 begins
blog-seo-{slug}.md + finalized English HTML delivered with Article + FAQPage JSON-LD validated by Gemini Flash, OG/Twitter/hreflang complete, ≥ 5 internal links, ≥ 5 FAQ pairsblog-review-{slug}-persona.md delivered with all 3 persona sections completed, cross-persona agreement table, and explicit shape challenge verdictblog-audit-{slug}-wave4.md delivered with testable-claim inventory, reverse-index table, S-evidence audit, base-layer integrity check, and final PASS/PASS-WITH-NOTES/BLOCK verdictBLOCKreviewing (Wave 4 is additive and evaluative)### Gate 5 → ready_for_human_review
door-site/blog/{slug}/index.html, door-site/blog/zh/{slug}/index.html, door-site/blog/web/{slug}/index.html/security-check PASS logged in blog-publish-{slug}.mdsitemap.xml, llms.txt, llms-full.txt, blog/index.html updated[BASE LAYER — awaiting human review before push] taggit push NOT executedreviewing → ready_for_human_review with Commander signature### Gate 6 → published (OUTSIDE fleet scope — human action)
HUMAN LAYER slots/upload → git push → deployready_for_human_review → publishedFleet has no agent at Gate 6. That is the human boundary. Moving Gate 6 inside the fleet would violate the base-layer principle.
---
All artifacts live under docs/blog-writer-fleet/{slug}/:
<table>
<tr><th>File</th><th>Produced By</th><th>Wave</th></tr><tr><td>------</td><td>-------------</td><td>------</td></tr><tr><td><code>blog-research-{slug}.md</code></td><td>Research Deepener</td><td>1</td></tr><tr><td><code>blog-draft-{slug}.md</code> or <code>blog-draft-{slug}-{audience}.md</code></td><td>Article Writer</td><td>2</td></tr><tr><td><code>blog-review-{slug}-facts.md</code></td><td>Fact Checker</td><td>3</td></tr><tr><td><code>blog-review-{slug}-sources.md</code></td><td>Source Reviewer</td><td>3</td></tr><tr><td><code>blog-seo-{slug}.md</code></td><td>SEO/AEO Engineer</td><td>4</td></tr><tr><td><code>blog-review-{slug}-persona.md</code></td><td>Audience Persona Reviewer</td><td>4</td></tr><tr><td><code>blog-audit-{slug}-wave4.md</code></td><td>Quality Auditor</td><td>4</td></tr><tr><td><code>blog-publish-{slug}.md</code></td><td>Bilingual Publisher</td><td>5</td></tr><tr><td><code>blog-gate-review-{slug}-waveN.md</code></td><td>Blog Commander</td><td>each gate</td></tr><tr><td><code>dispatch-log-blog-{slug}.md</code></td><td>Blog Commander</td><td>continuous</td></tr>
</table>
Queue state transitions: pending → researching → drafting → reviewing → ready_for_human_review → (human) → published
---
### Issue #1 — No Audience Persona Reviewer in v1
Status in v2: RESOLVED
Implemented change: Added Audience Persona Reviewer as Agent #8 in Wave 4 using Gemini 2.5 Pro persona simulation via /ai-fallback, modeled on the HSW-002 Project Architect Advisor pattern but expanded to architect / owner / installer cold-read passes.
What to monitor now: Do the 3 persona reads produce meaningfully different flags when a draft is mis-shaped? If they collapse into generic "good article" summaries, the persona prompt needs tightening.
### Issue #2 — No cross-fleet Quality Auditor / Performance Supervisor
Status in v2: RESOLVED for blog-fleet scope
Implemented change: Added Quality Auditor as Agent #9 in Wave 4. Reused the v5.1 audit pattern, but adapted it to blog deliverables with reverse-index checking, S-evidence verification, and explicit testable-claim inventory.
What to monitor now: Does QA catch real misses without becoming a shadow reviewer who rewrites content? If QA starts absorbing other roles, tighten the scope-creep rule further.
### Issue #3 — Audience shape decision had no external validator
Status in v2: RESOLVED
Implemented change: Every Audience Shape Decision now requires /ai-collab --task verify with Gemini Flash second opinion. Agreement/disagreement and any override rationale are logged in the queue entry and dispatch log.
What to monitor now: After 10 articles, compare Commander final-shape choices against Gemini disagreement rate. If disagreement is frequent but overrides are weak, Commander prompt or decision rubric needs adjustment.
### Issue #4 — Layer 2.5 dry-run not yet performed
Status in v2: RESOLVED at spec level; execution still required before production
Implemented change: Pre-Production Checklist now makes Layer 2.5 dry-run a mandatory gate before first real dispatch, and the required dry-run count is updated from 7 agents to 9 agents.
What to monitor now: First real run should produce zero "I don't know which skill/model to call" failures. Any such failure indicates the dry-run was skipped or done loosely.
### Issue #5 — Base-layer principle had no automated enforcement
Status in v2: RESOLVED
Implemented change: Bilingual Publisher now has a publish-stage grep-based enforcement rule: every HUMAN LAYER slot must remain empty or TODO-marked within 3 lines after the comment. Pre-filled slots are a hard FAIL.
What to monitor now: Human reviewers should not need to delete slot content before appending their own layer. If they do, tighten the check from publish-stage to pre-Wave-4 audit as well.
### Issue #6 — No bilingual voice divergence detection
Status in v2: RESOLVED
Implemented change: Bilingual Publisher now runs both Gemini Flash natural-voice QA and Gemini 2.5 Pro Taiwan-specific second-pass review, plus a 20+ term mainland-vocabulary blocklist grep.
What to monitor now: If Taiwanese readers still detect unnatural phrasing that does not use blocked terms, add a phrase-level style list, not just a lexical blocklist.
### Issue #7 — Wave 4 concurrency may create review fan-in overload on split-3 batches
Status in v2: NEW
Concern: On split-3 topics, a single candidate can generate multiple draft variants plus one SEO package, one persona report, and one audit report. Commander may become a bottleneck during Gate 4 synthesis.
Possible fixes: (a) add per-audience mini gate reviews before the consolidated Gate 4; (b) template the Wave 4 cross-artifact comparison tables more aggressively; (c) batch split-3 candidates separately from universal candidates.
What to watch: If Gate 4 reviews become materially slower than Waves 1–3 combined on split-3 topics, the synthesis layer needs refactoring.
---
### Improvement #1 — Audience Persona Reviewer agent
Status: IMPLEMENTED in v2
Notes: Added as Agent #8 in Wave 4 with Gemini 2.5 Pro persona simulation and three canonical reader personas.
### Improvement #2 — Quality Auditor
Status: IMPLEMENTED in v2
Notes: Added as Agent #9 in Wave 4. Blog fleet now has an explicit audit layer, though not a full cross-fleet Performance Supervisor.
### Improvement #3 — Candidate Collector v2 write-back
Status: DEFERRED
Scope: When Blog Writer Fleet publishes an article, append published_at, published_url, and human_reviewer back to the queue entry.
Trigger: After first 10 articles publish, coordinate with HSW-002 Candidate Collector owners.
### Improvement #4 — Cross-article compounding SEO analyzer
Status: DEFERRED
Scope: After ≥ 20 articles published, run a cross-link analysis to find under-linked articles and recommend additional internal links.
Trigger: At 20 articles.
### Improvement #5 — /aia-rewrite --bilingual reuse for zh variant
Status: DEFERRED
Scope: When /aia-rewrite --bilingual ships and is stable, evaluate whether Bilingual Publisher should delegate Chinese production to it.
Trigger: Skill exists and passes validation.
### Improvement #6 — Publish-stage blocklist to phrase-level Taiwan style checker
Status: DEFERRED
Scope: Extend current term blocklist into phrase-level and syntax-level Taiwan localization checks once enough real false negatives accumulate.
Trigger: ≥ 3 post-publish Taiwanese reader comments that were not caught by current blocklist + Gemini Pro pass.
---
This document cross-references HSW-002 v5.1 at the following anchors:
door-site/.content-scout-queue.md and ~/.claude/skills/content-scout/SKILL.md~/.claude/skills/writing-guide/SKILL.md~/.claude/skills/publish-article/SKILL.mdIf any of these references change, this document's command formats and gate logic must be re-verified.
---
### Mandatory Layer 2.5 Dry-Run Protocol
Layer 2.5 dry-run is MANDATORY before the first production dispatch. This is not advisory and not deferrable. The goal is to verify that every agent can actually execute the skill/model invocations embedded in its S block and that Commander can dispatch them without missing parameters.
Dry-run scope in v2: all 9 agents
Blog Commander
Research Deepener
Article Writer
Fact Checker
Source Reviewer
SEO/AEO Engineer
Audience Persona Reviewer
Quality Auditor
Bilingual Publisher
Dry-run protocol
HIGH0### Checklist
python ~/.claude/skills/ogsm-framework/scripts/validate_s_to_m_coverage.py <path-to-this-file> and fix all gaps/security-check exists and is executable/publish-article template is readable/ai-collab --task verify is callable in Commander's environment---
v2 is no longer a 7-agent "write and hope" fleet. It is a 9-agent system with:
Those are the structural fixes needed to move the blog fleet from plausible draft to production-worthy OGSM spec.