| name | write-supplemental |
| description | Produce a supplemental edition — variety coverage that builds the world beyond the Cycle Pulse. Any topic, any reporter, any format. |
| version | 1.2 |
| updated | "2026-05-24T00:00:00.000Z" |
| tags | ["media","active"] |
| effort | high |
| disable-model-invocation | true |
| argument-hint | [topic] |
What's new in v1.2 (2026-05-24, S233 pipeline.33)
Step 3.4 envelope-wrap discipline + format-contract inline + Step 2 brief pre-extraction. v1.1 deferred all format-shape detail to [[../../../docs/EDITION_PIPELINE]] §Published .txt Format Contract; the S231 C94 let_walks_reset supplemental run surfaced three structural failure modes when Mags-during-compile re-interpreted that pointer:
- G-S5 silent-zero on NAMES INDEX + BUSINESSES NAMED — Step 3.4 .txt compile output used markdown-table syntax (
| POPID | Name | Role | with header + |---|---| separator) for NAMES INDEX and dash-list for BUSINESSES NAMED. Parser scripts/ingestEditionWiki.js:294 requires strict pipe-format with first field matching /^[A-Z]+-[A-Z0-9]+$/; markdown-table form parses to 0 entities silently. Source-of-mis-training: editions/SUPPLEMENTAL_TEMPLATE.md v2.0 used markdown-table syntax on ARTICLE TABLE which Mags then patterned across the parser-strict sections.
- G-S4 compile re-introduced engine-language — Step 3.4 free-form rewrite of agent .md content transformed Hal's
"this cycle" cross-reference into "Edition 94" (Hal's source agent had complied with the prior rule; compile broke compliance). Note: governance.15 S233 carved out edition-number cross-references in editorial chrome contexts (See also / byline / sidebar) — so the specific G-S4 trigger is partially mooted, but the deeper principle stays: Step 3.4 is envelope-wrap, not editorial-pass.
- G-S3 brief asked agent to grep inside full edition .txt for a specific prior article — search inside 40KB file for one section when pre-extraction to a single file would be cleaner.
What changed:
- Step 2 brief pre-extraction (G-S3) — one sentence added: when brief references a specific prior article for the agent to read, pre-extract it to
output/reporters/<reporter>/articles/<source-cycle>_<slug>.md and reference that path in the brief rather than directing the agent to grep inside the full edition .txt.
- Step 3 small guardrail (G-S4 deeper principle) — added clarifying clause: compile preserves agent-written prose verbatim where it satisfies canon-rules; quality checks (deck lines, photo credits, name verification, opinion markers) are validation operations, not rewrite operations.
- Step 3.4 FORMAT CONTRACT inline (G-S5) — explicit line-shape exemplars for NAMES INDEX (
POP-NNNNN | Full Name | Role/Title) + BUSINESSES NAMED (BIZ-NNNNN | Name | Sector | Neighborhood); explicit warning against markdown-table syntax (silent-zero pattern); §What Step 3.4 IS / IS NOT framing (envelope-wrap not editorial-pass); verification gate citing expected ingestEditionWiki.js entity count > 0.
editions/SUPPLEMENTAL_TEMPLATE.md v2.0 → v2.1 (G-S5 root cause fix) — added §NAMES INDEX + §BUSINESSES NAMED sections in strict pipe-format mirroring docs/media/EDITION_FORMAT_TEMPLATE.txt canonical exemplar; reformatted §Article Table from markdown-table to flat strict pipe so all three intake sections share consistent shape; ADR-0006 Contract A pattern notes inline.
Cross-link: engine.26 follow-up filed for parser defensive-emit (warning when standalone BUSINESSES NAMED section has non-empty content but parser extracts 0 — same defensive-emit shape engine.24 added to NAMES INDEX S229 — fail-loud rather than silent-zero).
Out of scope (deferred): mechanical assembly script for Step 3.4 (operator-driven discipline holds for now via FORMAT CONTRACT inline + template alignment; mechanical guard files if format-contract violations recur).
Source: output/production_log_supplemental_c94_let_walks_reset_gaps.md (entries G-S3 + G-S4 + G-S5).
/write-supplemental — Supplemental Edition Production
Usage
/write-supplemental [topic]
- Produces a supplemental edition on any topic
- Mags picks the reporters, designs the coverage, compiles the result
- One supplemental per cycle minimum — this is how the city gets built
Live Status (auto-injected)
Supplemental triggers:
!`cat output/supplemental-triggers/triggers_c*.json 2>/dev/null | python3 -c "import json,sys; d=json.load(sys.stdin); print(f'{len(d)} triggers available'); [print(f' - {t.get(\"topic\",\"?\")} ({t.get(\"type\",\"?\")})') for t in d[:5]]" 2>/dev/null || echo "No triggers file — pick a topic or run checkSupplementalTriggers.js"`
Recent supplementals:
!`ls -1t editions/*supplemental* 2>/dev/null | head -3 || echo "No supplementals yet"`
Philosophy
The Cycle Pulse is the engine's newspaper — it reports what the simulation produced. Supplementals are where the world gets built. A restaurant review canonizes a restaurant. A neighborhood walk canonizes what that neighborhood feels like. A sports deep dive gives the dynasty texture beyond box scores. Every supplemental adds something to the world that the Cycle Pulse can't.
Supplementals reflect the current state of the world. Read the world summary (output/world_summary_c{XX}.md) before writing anything. If there's a health crisis in West Oakland, a food piece set there feels it. If the A's are 7-1, a Jack London walk has fans in jerseys. If Rosh Hashanah is happening across three neighborhoods, a culture piece acknowledges it. The supplemental lives in the same city as the edition — same weather, same nightlife, same mood. Different angle, same world.
Any reporter can lead a supplemental. Not just Carmen and Jordan. There are 24 journalists on the roster and most of them have never gotten a supplemental assignment. Mason Ortega is a former sous chef — give him a food piece. Sharon Okafor covers lifestyle — let her cover lifestyle. Kai Marston was a music blogger — give him First Fridays. The voice files are built for this. Use them.
The tone is not locked to civic drama. Supplementals can be breaking news, but they can also be a farmers market, a restaurant opening, a neighborhood walk, a sports feature, a weather story, a school profile. The city should feel like a city, not a council chamber.
GodWorld is a prosperity city. Dynasty-era Oakland. People buying homes, opening businesses, enjoying life. Not every story is displacement, struggle, or crisis. Include wealth, aspiration, joy, normalcy.
Rules
- Show the user a coverage plan before launching agents
- Get user approval before proceeding to agent launch
- One story, many angles — or one story, one angle. Size fits the topic.
- Rotate reporters. Check who's been used recently and who hasn't.
- Every name gets verified via MCP.
lookup_citizen(name) for citizens. get_roster("as") for A's players (contracts, quirks, positions — reads truesource). search_canon(name) for what's been published. No exceptions.
- Read criteria files.
docs/media/story_evaluation.md for story quality, docs/media/brief_template.md for brief structure, docs/media/citizen_selection.md for citizen handling. Same standards as sift — supplementals are editions too.
- No calendar dates. Cycles only.
- World summary is your context. Read
output/world_summary_c{XX}.md for cycle texture — food, nightlife, famous people, weather, events.
- Photos, PDF, print — that's
/edition-print. Not part of this skill.
- Memory Fence (Phase 40.6 Layer 2). Reporter briefs carry recalled canon from
search_canon and world-data queries. Wrap those excerpts via require('/root/GodWorld/lib/memoryFence').wrap(text, 'bay-tribune') before embedding them in the brief. Full convention: [[SUPERMEMORY]] §Memory Fence.
Step 0: Production Log
Read the existing unified production log: output/production_log_c{XX}.md (legacy fallback production_log_edition_c{XX}.md if absent). This is the one-true-cycle source write-edition + city-hall both use — all of the cycle's work (civic + edition + supplemental) lives in one document.
If the edition has already been produced, the log exists and has Steps 0-9 filled in. Append a new section:
## Supplemental: {topic}
**Started:** {timestamp}
**Topic:** {topic}
**Reporters:** {who's assigned}
**Status:** IN PROGRESS
### Coverage Plan
[filled in at Step 1]
### Agent Results
[filled in at Step 2]
### Compile + Publish
[filled in at Steps 3-5]
If no production log exists yet (supplemental running before edition), create the log using the write-edition template and start with the supplemental section.
Step 0.5: Pick the Topic
Topics come from anywhere:
- User drops it — "let's do a food piece" or "what's Temescal look like?"
- Trigger list — check
output/supplemental-triggers/triggers_c{XX}.json for auto-detected candidates (run node scripts/checkSupplementalTriggers.js {cycle} if it doesn't exist yet)
- Engine signal — a citizen event, a new business, a neighborhood shift
- Editorial instinct — Mags sees a gap in the world and fills it
- Journalist flag — a reporter's voice suggests a feature
- Variety check — if the last 3 supplementals were civic, do something else
Read whatever the user provides. If it's vague, that's fine — "what's the food scene like?" is a valid topic.
Civic Supplemental Types (from triggers)
When the trigger list suggests civic content, use one of these formats:
| Type | What | Who Produces | Format |
|---|
| Civic Dispatch | Official city communications — press releases, public notices, community alerts | Carmen Delaine + voice agent statements | In-world government output, not journalism. 1-3 short pieces. |
| Neighborhood Report | What life looks like in one neighborhood this cycle. Businesses, events, people, weather. | Maria Keen + culture desk reporters | World-texture, not news coverage. Walk-through format. |
| Initiative Spotlight | Deep dive on one initiative's progress. What happened, what's next, who's affected. | Carmen Delaine or Jordan Velez + civic desk | Feature-length, single-subject, investigative. |
These follow the same Step 1-5 pipeline as any supplemental — they just have a civic angle and draw from voice agent statements as source material.
Note: Supplementals do not use buildDecisionQueue, buildInitiativePackets, buildInitiativeWorkspaces, or applyTrackerUpdates. Those pipelines are Cycle Pulse only. Civic supplementals can reference voice agent output from previous cycles as source material (e.g., mayor statements), but supplementals don't generate new voice decisions or advance initiative state.
Step 1: Design the Coverage Plan
1a. Pick the Reporters
Check the roster first. Who hasn't had a supplemental? Who's perfect for this topic? The full roster is in docs/media/voices/ — 24 journalists across every beat.
Reporters by specialty (not exhaustive — anyone can cover anything):
| Reporter | Specialty | Good For |
|---|
| Mason Ortega | Food & Hospitality | Restaurants, food culture, kitchen life, nightlife |
| Sharon Okafor | Lifestyle | Daily routines, behavior trends, how people live |
| Kai Marston | Arts & Entertainment | Galleries, music, First Fridays, cultural events |
| Angela Reyes | Education | Schools, youth, OUSD, after-school programs |
| Noah Tan | Weather & Environment | Climate, air quality, seasons, outdoor life |
| Dr. Lila Mezran | Health | Public health, clinics, medical stories |
| Sgt. Rachel Torres | Public Safety | Crime, safety, OPD, neighborhood security |
| Jax Caldera | Accountability | Street-level pressure, policy gaps |
| Maria Keen | Neighborhoods | Hyper-local culture, community pulse |
| Simon Leary | Long View | Essays, philosophy, contemplative pieces |
| Tanya Cruz | Sideline / Social | Behind-the-scenes, real-time dispatches |
| Selena Grant | Bulls Beat | Chicago basketball, roster analysis |
| Talia Finch | Chicago Ground | Chicago neighborhoods, street-level texture |
| MintConditionOakTown | Internet/Rumors | Speculative threads, chaotic truth-seeking |
| Carmen Delaine | Civic | Government, infrastructure, policy |
| Jordan Velez | Business/Labor | Economics, workforce, port, development |
| Luis Navarro | Investigations | Accountability, fact-checking, anomalies |
| Celeste Tran | Social Trends | Hashtags, streaming data, cultural temperature |
| Farrah Del Rio | Opinion | Policy critique, cultural commentary |
| Trevor Shimizu | Infrastructure | Transit, utilities, systems |
| P Slayer | Fan Voice | Sports opinion, emotional takes |
| Anthony | Sports Analytics | Data-driven sports, roster breakdowns |
| Hal Richmond | Sports History | Dynasty context, retrospectives |
| Reed Thompson | Wire | Neutral verification, quick reports |
1b. Match the Roster
Design the stories first, then match reporters. Don't pick reporters by habit — pick them by beat fit. For each story, ask: who on the 24-person roster is the natural match for this angle?
Supplementals develop the bench. Default to reporters with fewer than 5 edition appearances. The Cycle Pulse is the big stage for trusted voices. Supplementals build the next ones.
Check the reporter table above. If you're about to assign Carmen, Jordan, Maria, or P Slayer — stop and ask if someone else fits better.
Engine B byline pool (T4.3)
When the supplemental originates from a Story_Seed_Deck seed (e.g., a storyline-followup carrying a BylineCandidate per Engine B), the candidate is valid even if the byline is not on the edition's 9-reporter front-page table. Engine B scores against the full 25-byline rosterLookup.js pool — Simon Leary, Hal Richmond, Sharon Okafor, Trevor Shimizu, Mason Ortega, Angela Reyes, Kai Marston, Talia Finch, Selena Grant, etc. — and formatFitScore_('<journalist>', 'supplemental') ranks long-view + deep-dive bylines highest on the supplemental format.
The edition's 9-reporter constraint is a CYCLE-PULSE concern, not a supplemental concern. For supplemental work:
- Engine B's
bylineCandidate from the supplemental's source seed is the default suggestion
- The full 25-byline pool is in scope; nothing about supplementals constrains to the front-page 9
- Editorial latitude is unchanged — Mags can override the Engine B candidate per the "design stories first, then match reporters" principle above
- "Develop the bench" rule still applies; Engine B's format-fit table actively biases toward the supplemental archetype (Hal/Simon/Sharon/Mags = 4-fit), which aligns with the bench-development goal
Lookup: if running supplemental against a specific seed, read Story_Seed_Deck.BylineCandidate (col P) for that seed; otherwise fall through to the existing "design first, match second" workflow.
1c. Plan the Coverage
Show the user something like:
SUPPLEMENTAL: [TOPIC]
COVERAGE PLAN:
1. Mason Ortega — [assignment, ~word count]
2. Maria Keen — [assignment, ~word count]
3. [Reporter] — [assignment, ~word count]
Team: [N] reporters, [N] articles
Keep it simple. The plan is a pitch, not a contract. Get user approval before proceeding.
1d. Size It Right
Not everything needs 7 articles and 10,000 words.
| Size | Articles | Words | When |
|---|
| Light | 1-2 | 1,500-3,000 | Neighborhood walk, single-topic color |
| Standard | 3-5 | 3,000-6,000 | Multi-angle feature, event coverage |
| Heavy | 5-8 | 5,000-10,000 | Breaking news, deep dive, major event |
A farmers market piece might be one article from Mason Ortega and one from Maria Keen. That's fine. Not everything is a five-reporter production.
Step 1.5: Write the Topic Brief
The brief tells the reporters what they need to know. Save to:
output/supplemental-briefs/{topic_slug}_c{XX}_brief.md
For color/variety pieces (lightweight brief):
- The topic — What are we covering?
- Citizens available — Pull from the ledger. Include citizens who live in the relevant neighborhood, work in the relevant industry, etc. Don't just use the usual names.
- Canon to establish — What new things does this piece create? (businesses, venues, cultural events, neighborhood texture)
- Voice assignments — Who writes what
For news/investigative pieces (heavier brief):
- Add: The news (what happened), The context (timeline, stakes), Civic voice statements (if relevant)
- Add: Archive context from Supermemory or NEWSROOM_MEMORY.md
Brief sources (check in order):
- User-provided content
- World summary —
output/world_summary_c{XX}.md — cycle texture, events, food, nightlife, famous people
- Bay-tribune canon —
search_canon("TOPIC") via MCP — published history
- World-data citizens —
lookup_citizen(name) via MCP for each candidate
- World-data domain cards (when supplemental is sector-focused) —
lookup_business / lookup_faith_org / lookup_cultural / get_neighborhood_state via MCP. Full inventory: [[../../../docs/SUPERMEMORY|SUPERMEMORY]] §Search/save matrix.
- Simulation_Ledger — direct sheet query via service account for neighborhood-based candidates
- NEWSROOM_MEMORY.md — errata, character continuity, active arcs
Enhanced data sources (use if available):
All of these are optional. If none exist, the brief works exactly as today. Check each path — if the file exists, add the corresponding section to the brief.
| Source | Path | When | Brief Section |
|---|
| World summary | output/world_summary_c{XX}.md | Always | WORLD CONTEXT — cycle texture, events, food, nightlife, weather |
| Errata | output/errata.jsonl | Always (if exists) | GUARDIAN WARNINGS — filter to topic's domain, list errors to avoid |
| Mara guidance | output/mara-directives/mara_directive_c{XX}.txt | Always (if exists) | MARA GUIDANCE — forward editorial direction from last audit |
| Voice statements | output/civic-voice/{office}_c{XX}.json | Civic pieces only | CIVIC VOICE SOURCE MATERIAL — from city-hall production log |
| Civic production log | output/production_log_c{XX}.md §/city-hall section | Civic pieces only | LOCKED CIVIC CANON — what voices decided (legacy production_log_city_hall_c{XX}.md) |
| Grade history | output/grades/grade_history.json | Always (if exists) | Reporter grade context in assignments (1-line summary per reporter) |
Data availability table — include in the production log which of the 6 sources were found and loaded. Example:
Enhanced data loaded:
- Errata: YES (26 entries, 3 relevant to civic)
- Mara guidance: YES (c87 directive)
- Voice statements: YES (mayor, chief of staff)
- Grade history: YES (1 edition window)
- MCP lookups: 14 citizens verified
Key rules for the brief:
- Don't prescribe tone. Give the reporters the facts and let them write.
- Don't default to struggle. If the topic is a neighborhood, show what's good about it, not what's wrong with it.
- Use fresh citizens. Check the Citizen Usage Log — if a citizen has appeared in the last 3 editions, find someone else.
- Authorize new canon. Reporters can discover businesses, venues, cultural events. Specify how many new entities they can create.
- Pre-extract any referenced prior article (G-S3, S233 pipeline.33). If the brief directs the agent to read a specific prior article (e.g., correcting an earlier columnist piece, building off a published interview), extract that article to its own file at
output/reporters/<reporter>/articles/<source-cycle>_<slug>.md BEFORE dispatching the agent — then reference that path in the brief. Don't direct the agent to grep inside the full edition .txt for one section; that puts the agent in a 40KB search loop when a single-file reference is cleaner.
Step 2: Launch Agents
Launch 1-4 agents based on the coverage plan.
Agent Configuration
Each agent gets:
- The topic brief (from Step 1.5)
- Their voice file(s) —
docs/media/voices/{reporter}.md
- The supplemental template —
editions/SUPPLEMENTAL_TEMPLATE.md
- Their specific assignment — which articles to write, what angle, target word count
Model Tier Guidance
Use the model parameter when launching agents to match complexity to capability:
| Tier | Model | Use For |
|---|
| Sonnet | claude-sonnet-4-6 | Civic, investigative, sports — reasoning-heavy, source verification |
| Haiku | claude-haiku-4-5-20251001 | Neighborhood, food, culture, lifestyle — texture writing, atmosphere |
Default to Haiku unless the piece requires civic reasoning, investigative logic, or sports roster verification.
Agent Prompt Pattern
You are [REPORTER NAME], writing for the Bay Tribune supplemental edition on [TOPIC].
Read your voice file at docs/media/voices/{name}.md — this is your writing identity.
Read the supplemental template at editions/SUPPLEMENTAL_TEMPLATE.md — formatting conventions.
Read the topic brief at output/supplemental-briefs/{topic_slug}_c{XX}_brief.md — your assignment and canon data.
Use MCP to verify every name before writing:
- `lookup_citizen(name)` for citizens — profile, role, neighborhood, canon history
- `get_roster("as")` for A's players — contracts, quirks, positions, stats from truesource
Every name in the brief has already been verified — spot check if unsure.
[If exemplar exists for this desk:]
Read output/desks/{desk}/current/exemplar.md — this is an A-grade example from this desk. Study the voice, structure, and sourcing.
[If grade history exists and reporter has grades:]
YOUR RECENT GRADE: [letter] ([trend]). [1-line note from grade_history.json]
[If brief contains GUARDIAN WARNINGS:]
GUARDIAN WARNINGS (from errata — do NOT repeat these errors):
[filtered warnings from brief]
YOUR ASSIGNMENT:
- Write [N] article(s):
1. "[Headline idea]" — [description of angle, ~X words]
RULES:
- Stay in voice. Read the voice file carefully.
- Use ONLY canon names from the topic brief. Never invent citizens unless authorized.
- No engine metrics in article text.
- Verify all citizen names via MCP lookup_citizen before using them.
- Include a Names Index after each article.
- End with an Article Table entry for each article you wrote.
Write now. Start with your first article.
THINK BEFORE WRITING Blocks
Add a thinking block to the agent prompt based on supplemental type. These go BEFORE "Write now."
Civic / Investigative:
THINK BEFORE WRITING:
Before drafting, reason through:
1. What is the current status of each initiative/policy mentioned?
2. Which citizens have appeared in recent editions on this topic? (check brief)
3. Are there any Mara flags or errata warnings relevant to this piece?
4. What is the strongest angle — and what angle should be AVOIDED?
5. Which voice agent statements can be quoted vs. paraphrased?
Neighborhood / Food / Culture:
THINK BEFORE WRITING:
Before drafting, reason through:
1. What canon already exists for this neighborhood/venue/event?
2. Which citizens are FRESH (not in last 3 editions)?
3. What new canon am I authorized to establish?
4. Is this a prosperity story or a struggle story? (default: prosperity)
Sports:
THINK BEFORE WRITING:
Before drafting, reason through:
1. Verify every player name and position against the roster in truesource.
2. What is the dynasty context — where does this fit in the timeline?
3. Is this opinion or reporting? If opinion, mark [OPINION].
Color / Variety: No thinking block — keep lightweight.
Parallel vs. Sequential
- Independent reporters — launch in parallel
- If one reporter's output feeds another — launch sequentially
Step 3: Compile
After agents return, Mags compiles:
- Assemble articles in editorial order (story logic)
- Add the header (see template)
- Quality checks (S233 pipeline.33 — these are VALIDATION operations, not rewrite operations; preserve agent-written prose verbatim where it satisfies canon-rules):
- Deck lines under every headline
- Standardized bylines
- Cross-references to past coverage where relevant
- 1-2 photo credits
- Opinion pieces marked
[OPINION]
- Name verification — every quoted citizen should match the brief's verified list. Spot check via MCP
lookup_citizen if unsure. Flag any name not in canon sources or not authorized as new in the Citizen Usage Log.
- Merge intake sections:
- Article Table
- Storylines Updated (new canon established)
- Citizen Usage Log
- Continuity Notes
- Add end marker
Show the compiled supplemental to the user.
Step 3.4: Compile to .txt
The editorial compile (Step 3) produced article body + tracking data. Now wrap it in the [[../../../docs/EDITION_PIPELINE]] §Published .txt Format Contract envelope — Bay Tribune masthead + 5 structural sections (HEADER / BODY / NAMES INDEX / CITIZEN USAGE LOG / BUSINESSES NAMED / ARTICLE TABLE).
Step 3.4 IS: envelope-wrap of the editorial product. Concat masthead + headers + body + intake sections + end marker. Preserve agent-written prose verbatim. Apply ADR-0006 Contract A pattern — template (editions/SUPPLEMENTAL_TEMPLATE.md) and canonical exemplar (docs/media/EDITION_FORMAT_TEMPLATE.txt) are the format-shape source; parser (scripts/ingestEditionWiki.js) is authoritative.
Step 3.4 IS NOT: editorial-pass. Don't free-form-rewrite content from the agent .md files. Quality checks happen in Step 3 (validation), not here. S231 G-S4 evidence: this step turned Hal's "this cycle" into "Edition 94" because the wrap path was treated as a rewrite path. Step 3.4 is concatenation, not interpretation.
Output: editions/cycle_pulse_supplemental_<cycle>_<slug>.txt
- Body: the assembled article(s) verbatim
- Article Table: one row per article (
<slug> | <reporter> | <section> | <word count>)
- Masthead
<TYPE>=SUPPLEMENTAL, descriptor = topic theme
Slug rule: 1–3 words from the topic theme, lowercase, underscore-separated (e.g., health_center_unstuck). Editorial pick at authoring time. Once published, immutable. Replicated identically across filename, masthead descriptor, sift queries, MCP search, Mara, packets, production log, bay-tribune metadata.
Y<n>C<m> math: n = floor((cycle-1) / 52) + 1, m = ((cycle-1) % 52) + 1. No month names.
FORMAT CONTRACT — NAMES INDEX + BUSINESSES NAMED (S233 pipeline.33, ADR-0006 Contract A)
Names Index, Citizen Usage Log, Businesses Named populated from the citizens/businesses cited in the body — separate sections after the body, never inline (S172 metadata-leak rule). These three sections have STRICT format-contract requirements; the parser silently parses to 0 entities on wrong-shape input (S231 G-S5 silent-zero pattern).
NAMES INDEX — strict pipe-format, no leading pipe, no markdown header:
############################################################
NAMES INDEX
############################################################
POP-NNNNN | Full Name | Role/Title
POP-NNNNN | Full Name | Role/Title
CUL-NNNNNNN | Name | Role
FAITH-NEW | Org Name | Faith Org | Neighborhood
Name — Role
- Parser entry:
scripts/ingestEditionWiki.js:294 splits on |, requires first field to match /^[A-Z]+-[A-Z0-9]+$/.
- ID prefixes:
POP-NNNNN / CUL-NNNNNNN / BIZ-NNNNN / FAITH-NEW.
- Bullet em-dash form also accepted:
- Name — Role (ingester promotes to POP-pending).
- FORBIDDEN format (silent-zero): markdown-table syntax —
| POPID | Name | Role | with leading pipe, |--|--|--| separator row, or | Header | Header | Header | first row. Leading pipe produces empty parts[0] which fails the ID regex → 0 entities parsed → silent failure (no warning, no exception).
BUSINESSES NAMED — strict pipe-format, no leading pipe:
############################################################
BUSINESSES NAMED
############################################################
BIZ-NNNNN | Name | Sector | Neighborhood
NEW | Name | Sector | Neighborhood
- Parser entry:
scripts/ingestEditionWiki.js:203 (loosened S229 per engine.24 to accept optional - bullet prefix).
BIZ-NNNNN for existing businesses, NEW prefix for new businesses (Sector/Neighborhood blank-permissible).
- FORBIDDEN format (silent-zero): same markdown-table failure mode as NAMES INDEX.
ARTICLE TABLE — flat pipe-format (parser-tolerant):
Parser parseEdition.js (capability-reviewer/) treats ARTICLE TABLE as opaque footer text — isFooter: true, body retained verbatim, no row extraction. Markdown-table syntax doesn't break the parser here, but editions/SUPPLEMENTAL_TEMPLATE.md v2.1 normalizes Article Table to flat pipe-format so all three intake sections share consistent shape (S231 G-S5 root cause was the markdown-shape on ARTICLE TABLE training the compile to use markdown-shape on NAMES INDEX / BUSINESSES NAMED).
Canonical exemplar: docs/media/EDITION_FORMAT_TEMPLATE.txt §NAMES INDEX + §BUSINESSES NAMED + §ARTICLE TABLE. Read it before first-cycle supplemental compile if format-shape is unclear.
Verification gate (S233 pipeline.33)
After Step 3.4 emits the .txt, expect Step 3.5 validation to confirm:
node scripts/ingestEditionWiki.js editions/cycle_pulse_supplemental_<cycle>_<slug>.txt --type supplemental --dry-run
Parser stdout should report entity count ≥ 1 per non-empty NAMES INDEX section AND biz count ≥ 1 per non-empty BUSINESSES NAMED section. If the section had content lines but parser reports 0 entities, that's the G-S5 silent-zero signature — fix the format-shape inline (markdown-table → strict pipe) before publish. Parser defensive-emit improvements (warning instead of silent-zero) tracked at engine.26 for engine-sheet.
Step 3.5: Validation
Always (all supplemental types):
- Name verification — every quoted citizen must match the brief's verified list (MCP
lookup_citizen) or be authorized as new in the Citizen Usage Log.
If civic content:
node scripts/validateEdition.js editions/cycle_pulse_supplemental_<cycle>_<slug>.txt
If sports content:
- Cross-check all player names and positions against the roster in truesource. Flag any player not on the A's 40-man, farm system, or coaching staff.
Step 3.7: Optional Mara Audit
For civic, investigative, or initiative supplementals only. Skip for color, food, culture, neighborhood, sports, and lifestyle pieces.
Decision guide: If the supplemental changes initiative status, council positions, or faction dynamics — send to Mara. If it establishes texture canon (restaurants, neighborhood feel, cultural events) — skip.
Upload the .txt (canon) to Drive for Mara: node scripts/saveToDrive.js editions/cycle_pulse_supplemental_<cycle>_<slug>.txt mara
Mara audits the .txt (same format she audits everywhere else). She has her own Supermemory access (mara + bay-tribune + world-data) and searches canon herself. No packet building needed. Mike takes it to her on claude.ai. Wait for her feedback before proceeding.
Step 3.9: USER REVIEW GATE (MANDATORY)
STOP. Nothing gets saved until the user says yes.
SUPPLEMENTAL [{topic}] — READY FOR REVIEW
Articles: {count}
Word count: ~{total}
New canon established: {key facts}
The supplemental is compiled. Nothing has been saved or published yet.
Ready to publish? (yes / hold for edits)
Step 4: Save (post-approval)
After user approval, the .txt at editions/cycle_pulse_supplemental_<cycle>_<slug>.txt is canon. The file was already written in Step 3.4; this step is the post-approval mark.
PDF rendering + Drive upload moves to /edition-print --type supplemental (Step 5, parallel with /post-publish).
Step 5: Post-Supplemental Pipeline
After Step 4 the .txt is approved canon on disk. Two skills converge here, run in parallel:
/post-publish --type supplemental --cycle <XX> --source editions/cycle_pulse_supplemental_<XX>_<slug>.txt
/edition-print --type supplemental --cycle <XX> --source editions/cycle_pulse_supplemental_<XX>_<slug>.txt
/post-publish --type supplemental handles canon ingest (bay-tribune wiki + text), citizen card refresh, newsroom memory update, production log finalize, mags-bot restart. Per-substep verification gates per the [[../post-publish/SKILL|post-publish]] matrix; the supplemental row of that matrix governs which substeps run (coverage ratings C93-gated, skip by default; criteria-files + grading + exemplars are edition-only).
/edition-print --type supplemental handles DJ art direction (1–3 photos), PDF render, Drive upload.
Trigger condition (T11): Run /edition-print for supplementals always — supplementals are deep-dives, the visual layer is a load-bearing part of the deliverable. Default: always invoke.
S188 photo-pipeline status: /edition-print is currently edition-only for the photo step (DJ-direction pipeline rebuilt S188 — djDirect.js bundles edition+sift+world_summary; non-edition types await bundler extension). Supplementals will route through /edition-print for PDF + Drive but the photo step bails on missing dj_direction.json. Post-T11 follow-up will extend djDirect.js to handle supplemental source files.
Both skills append their ## /write-supplemental section to the unified output/production_log_c{XX}.md with inline Supermemory doc IDs for direct query next cycle.
File Locations
| File | Purpose |
|---|
editions/SUPPLEMENTAL_TEMPLATE.md | Formatting conventions |
output/supplemental-briefs/ | Topic briefs per supplemental |
editions/supplemental_*.txt | Published supplementals |
Where This Sits
Runs after /write-edition and /post-publish are complete. Supplementals extend coverage of the current cycle — same world, different angle. Can run multiple times per cycle.
The full 24-reporter roster is available (voice files at docs/media/voices/). Supplementals develop the bench — default to reporters with fewer edition appearances.
Full chain: /run-cycle → /city-hall-prep → /city-hall → /sift → /write-edition → /post-publish → /edition-print → then supplementals, dispatches, podcasts as needed