First contact, 2026-09-05: v5.6.1 on the demo, Brought To You By installed (30 briefs, all enabled), AutoApprove off. Two worker ticks, zero usable spots. Both failures are the app's, not the model's.
π 1. The prompt's abstract "TAG: <line>" is copied literally
AdScriptPromptBuilder.BuildSystemPrompt says: in this EXACT wire format β¦ "TAG: <line>". llama3.2:3b (the reference station's model, HARDWARE.md) copies it β the first draft of BOTH ticks opened with a line whose tag was "TAG (leading quote included), refused by AdScriptParser's tag rule:
Ad script failed (brand: Pruett's Left-Handed Hardware): voice tag ""TAG" is not uppercase-alphanumeric, starting with a letter
Ad script failed (brand: Lumbago Larry's Discount Mattress Barn): voice tag ""TAG" is not uppercase-alphanumeric, starting with a letter
The crosstalk prompt never has this problem because it spells its example with the REAL tags β "HOST: <line>" or "NEIGHBOR: <line>" β so a verbatim copy is a valid line. The ad prompt must do the same: name real tags (ANNOUNCER, CUSTOMER, VOICE1), state the tag grammar in words (one word, capitals and digits, no quotes, no parentheses), and drop the abstract placeholder. Bench on the demo's exact model to follow in the fix PR.
The second tick's re-ask then produced LARRY (YELLING) β a stage direction inside the tag β and landed as the visible failed row, exactly as designed (STORY-390 AC3). The tag grammar sentence covers that one too.
π 2. The re-ask shares one Llm:TimeoutSeconds budget with the first attempt
AdScriptWriter.WriteAsync: ONE timeoutCts spans both attempts ("mirrors LlmCopyWriter's re-ask callers"). That mirror is the wrong shape here: the on-air writers share a budget because the break is imminent; the ad writer runs entirely off the air clock (SPEC F161.1, the class's own remark for why it carries no single-flight gate). On the demo's CPU-bound 3B model a first completion took 49 s of the 90 s budget, so the re-ask timed out and the tick produced nothing:
Ad script failed (brand: Pruett's Left-Handed Hardware): Llm:TimeoutSeconds exceeded
Ad script generation skipped for brand Pruett's Left-Handed Hardware: Llm:TimeoutSeconds exceeded
Fix: each attempt gets its own Llm:TimeoutSeconds budget in the ad writer (the worker's 10-minute tick is the only clock that matters). One spec: a first attempt that spends most of the budget on a refused draft, then a re-ask that itself fits the budget, succeeds.
π Why it matters now
At the current shape the demo's stock pass yields ~0 spots per tick, so T409's ear gate never starts. Related: #693 (the structure hint never reaches the prompt β the same builder). Epic: #380.
First contact, 2026-09-05: v5.6.1 on the demo, Brought To You By installed (30 briefs, all enabled),
AutoApproveoff. Two worker ticks, zero usable spots. Both failures are the app's, not the model's.π 1. The prompt's abstract
"TAG: <line>"is copied literallyAdScriptPromptBuilder.BuildSystemPromptsays:in this EXACT wire format β¦ "TAG: <line>".llama3.2:3b(the reference station's model, HARDWARE.md) copies it β the first draft of BOTH ticks opened with a line whose tag was"TAG(leading quote included), refused byAdScriptParser's tag rule:The crosstalk prompt never has this problem because it spells its example with the REAL tags β
"HOST: <line>" or "NEIGHBOR: <line>"β so a verbatim copy is a valid line. The ad prompt must do the same: name real tags (ANNOUNCER,CUSTOMER,VOICE1), state the tag grammar in words (one word, capitals and digits, no quotes, no parentheses), and drop the abstract placeholder. Bench on the demo's exact model to follow in the fix PR.The second tick's re-ask then produced
LARRY (YELLING)β a stage direction inside the tag β and landed as the visiblefailedrow, exactly as designed (STORY-390 AC3). The tag grammar sentence covers that one too.π 2. The re-ask shares one
Llm:TimeoutSecondsbudget with the first attemptAdScriptWriter.WriteAsync: ONEtimeoutCtsspans both attempts ("mirrors LlmCopyWriter's re-ask callers"). That mirror is the wrong shape here: the on-air writers share a budget because the break is imminent; the ad writer runs entirely off the air clock (SPEC F161.1, the class's own remark for why it carries no single-flight gate). On the demo's CPU-bound 3B model a first completion took 49 s of the 90 s budget, so the re-ask timed out and the tick produced nothing:Fix: each attempt gets its own
Llm:TimeoutSecondsbudget in the ad writer (the worker's 10-minute tick is the only clock that matters). One spec: a first attempt that spends most of the budget on a refused draft, then a re-ask that itself fits the budget, succeeds.π Why it matters now
At the current shape the demo's stock pass yields ~0 spots per tick, so T409's ear gate never starts. Related: #693 (the
structurehint never reaches the prompt β the same builder). Epic: #380.