Skip to content

chore(plan): pending specs for the crosstalk stretch (STORY-326–329, F127) - #534

Open
genwave-radio wants to merge 3 commits into
mainfrom
plan/f127-crosstalk-specs
Open

chore(plan): pending specs for the crosstalk stretch (STORY-326–329, F127)#534
genwave-radio wants to merge 3 commits into
mainfrom
plan/f127-crosstalk-specs

Conversation

@genwave-radio

Copy link
Copy Markdown
Collaborator

The /plan output for the voice epic's expressiveness stretch (gh-#385 → SPEC F127, PLAN phase VQ-i, T281–T289 — planned 2026-08-14, same-day follow-through on the design session).

📦 What

Four pending-spec scaffolds, 49 facts, all Skip = "Pending TXXX" per the Story253 idiom — /build-loop flips them green task by task:

File Story Task Facts
Tts.Tests/Specs/Story326_BoothWritesForTwo.cs STORY-326 (writer) T282 15
Tts.Tests/Specs/Story327_TwoVoicesOneClip.cs STORY-327 (assembly) T284 10
Orchestration.Tests/Specs/Story328_StockedAheadAiredOnce.cs STORY-328 (stock/casting) T285–T286 11
Orchestration.Tests/Specs/Story329_BanterOnTheAir.cs STORY-329 (vend/config) T281+T287 13

STORY-330 (the showcase gate) is manual close-out — no specs by design. The T288 wire acceptance is a production-binary check, deliberately not represented (house posture).

⛔ Gates encoded in the plan

  • Start gate: no VQ-i task begins until T280 lands (the editor-lane train).
  • T283 paper audition (HARD checkpoint): after the writer lands, Dean reads ~5 real generated scripts — go/no-go recorded on the plan before assembler/planner/vend work is spent. A 3B model that can't write two voices kills the train at the cost of one task.

✅ Verified

dotnet build GenWave.sln — 0 warnings, 0 errors. Both suites green with the new skips registered (Tts 564 passed/58 skipped · Orchestration 325 passed/27 skipped).

Four spec scaffolds for the voice epic's expressiveness stretch (SPEC F127,
PLAN VQ-i, T281–T289): the two-voice script writer, per-line rendering +
single-asset assembly, the single-use ahead-of-air stock, and the on-air
vend with its fail-closed config. All 49 facts pending (Skip = 'Pending
TXXX') per the Story253 idiom — /build-loop turns them green task by task,
gated behind T280 (the start gate) and T283 (Dean's paper-audition
checkpoint). STORY-330 is manual close-out, no specs. Solution builds
clean; both suites green with the new skips registered.

Refs #385
The eighth kind (F127.1), appended last — value sequence [0..7] pinned by
the flipped Story329 fact. One load-bearing arm: PatterTemplateRenderer
gains a Crosstalk placeholder ('Two voices, one moment.') because the
preview endpoint reflection-parses kinds and would have 500'd; the arm
carries the T287 airable-filler hazard note (the TtsSegmentSource drop
guard does not list Crosstalk — the wiring task must decide). Ripples:
piper-only EngineByKind seed gains the kind (this branch's baseline;
superseded when the VQ-d branch's seed removal merges), Story005 count
7→8.

Review rounds: mechanical sweep PASSED round 1; rounds 1-2 caught and
fixed falsified closed-set documentation — the published Abstractions
XML docs (IPersonaPreviewWriter/PersonaPreviewResult now defer to the
IsLlmAuthored predicate instead of enumerating) and the routing SSOT
comments (LlmCopyWriter class summary + IsLlmAuthored doc + echoes,
LlmPromptBuilder, LlmCopyStatusHolder) all now name or defer correctly;
Crosstalk is template-class on this seam BY DESIGN — its real copy
arrives via the T282 script writer. Final one-clause fix applied by the
orchestrator verbatim from the reviewer's prescription (recorded
deviation: no builder round for a prescribed comment clause).

Air-inert: no producer emits the kind until T287. Suites: 0 failed.
Release note: additive enum member = minor Abstractions bump at the next
tagged release (no in-repo version file to edit — tag-driven).
One completion per exchange (F127.3 — reactions must react to what was
actually said): CrosstalkScriptWriter + a two-card prompt built BESIDE
LlmPromptBuilder (F116 goldens byte-identical, verified), speaker-tagged
HOST:/NEIGHBOR: wire format with an (interjects) overlap marker — plain
prefixes over JSON because the production 3B emits them reliably. The
F123 machinery is shared, not copied (ApplyCopyHygiene extracted;
DeriveMaxTokens/ClassifyForRing widened internal — extraction proven
byte-identical by the pre-existing F123/gh-#186 facts redding under
helper mutations).

Validation is fail-closed, skip-only (F127.4): 3–8 lines, both speakers
(incl. the all-interjection one-voice hole), strict alternation outside
interjections, per-line hygiene + budget with NO trimming, a live
Crosstalk:DurationTargetSeconds estimate (default 25s, allowlist 5–120),
and — review round 1's catch — finish_reason=='length' discards a
token-capped reply whose chopped final line would otherwise validate
clean (the gh-#424 class, ruled into F127.4's scope). Operator hooks
(ShowName/Daypart) truncate at the MaxSoulChars precedent; discard
reasons echo at most 120 chars of model text.

Every attempt is visible: LlmCallKind (Copy|Crosstalk) rides the ring
through /api/llm-calls to a new Kind chip, and Rejected renders brass
with its own label — a content-quality decision, never the danger tone
of an outage (the gh-#277 red-tile lesson, honored this time).

17 facts live (15 planned + 2 the review forced against vacuous pins);
every fact mutation-verified — six deletion/inversion mutations re-run
by the reviewer, each redding exactly its fact. Review: FAIL(6)→FAIL(1
word)→PASS across 3 gates; final one-word comment fix applied by the
orchestrator from the reviewer's prescription (recorded deviation).
Suites: dotnet 3,733 passed / 0 failed; admin-ui 1,054 passed; goldens
17/17. Recorded for T286: start-time gating is insufficient — shared
completion gate or cancel-in-flight required (the #277 fence).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant