Skip to content

F111 + F112 completion: the straddle handoff (PR 4 of 4) - #420

Merged
genwave-radio merged 3 commits into
mainfrom
feat/f111-straddle
Aug 9, 2026
Merged

F111 + F112 completion: the straddle handoff (PR 4 of 4)#420
genwave-radio merged 3 commits into
mainfrom
feat/f111-straddle

Conversation

@genwave-radio

Copy link
Copy Markdown
Collaborator

📻 A station, not a playlist — PR 4 (T234–T236; stacked on #419)

gh-#320's middle rung, built — and the boundary ladder becomes one authority. Closes the build halves of gh-#320 and gh-#300; closes gh-#401's follow-through (the extraction carried the ladder as a policy outcome, exactly as ruled).

  • T234Fit | Straddle | CeremonyOnly as a policy outcome; the T218 logging delegate retired for IBoundaryFitLog; one floor authority (IsBelowFloor, exact-90s edge pinned both sides); F111.5 rung token additive (Loki queries survive); CeremonyOnly's real reachability documented + classifier-arm mutation-pinned.
  • T235 — the straddle: sign-off airs ahead of a track the policy PROVED crosses (CrossesBoundary — measured duration only, never inferred), SignOn held via drain hold-set to the seam after the track, back-announce captured at plan time. Review round 1 ground-truthed the naive version airing sign-offs 4–6 min early on short-track pools and forcing against moved boundaries — both gated, bidirectionally mutation-pinned, probe-matched to T234 baseline everywhere the premise doesn't hold.
  • T236 — simulated acceptance done (integration facts through the real Orchestrator/resolver chain: sign-off → crossing track → sign-on, never back-to-back; ceremony-now only below the floor).

⚠️ Live watch items for your deploy (with #416/#418/#419)

  1. A 2:00-boundary handoff with no fitting track: listen for sign-off → crossing track → sign-on (the incoming DJ may name the track and thank the outgoing).
  2. The crossing threshold is deliberately conservative (ignores queued-ahead) — if straddles seem rarer than they should be, that's the recorded follow-up threshold, not a bug.
  3. Ceremony-now (both pieces back-to-back, no music) should now be RARE — only genuine below-90s-floor squeezes.

Evidence

Full sln 0W/0E; 3,220 tests, 0 failures; every task failed review round one (false reachability docs, unspecced classifier arm, the early-sign-off traces) and was mutation-proven before PASS.

🤖 /build-loop (builder sonnet / reviewer opus), specs-first.

…eremonyOnly (T234, STORY-303)

MusicSelectionPolicy returns MusicSelectionResult (candidate + rung);
behavior-neutral this task — Straddle still airs the least-late pick
until T235 ceremonies around it. The T218-carried delegate becomes
IBoundaryFitLog (NoOp default; Orchestrator implements explicitly so
boundary-fit lines stay on its logger; the positional-null nit dies).
One floor authority: IsBelowFloor is the single comparison site for the
90s MusicFloor, shared by classifier and decline gate; the exact-90s
edge is pinned as Straddle-and-not-declined from both sides. F111.5:
the fit line gains an additive rung= template token (Loki queries
survive). CeremonyOnly's reachability documented truthfully (non-
declined StationId/TimeDate below floor = everyday; handoff decline
whose ceremony rendered nothing falls through) and the classifier arm
is mutation-pinned on the policy's own least-late line.

Carry to T235: strike the stale 'only ever enqueues due-NOW deferrals'
premise at Orchestrator.cs:489 (false since T230).
…g track (T235, STORY-303, closes the build half of gh-#320/gh-#300)

When the policy proves the pick genuinely crosses (CrossesBoundary —
measured duration, post-trim effective length vs the boundary; computed
IN the policy, the only component that saw the length; duration-less
never claims), the unit airs [SignOff, crossing track] with SignOn held
via the drain hold-set to the next seam — back-announcing the captured
track and thanking the outgoing DJ. Round-1 review ground-truthed the
naive version airing sign-offs 4-6 minutes early on short-track pools
(Straddle ≠ crossing) and forcing against moved boundaries — both now
gated and bidirectionally mutation-pinned; non-crossing picks take T234
baseline timing exactly (probe-matched). Reconciliation dance documented
both halves (moved ⇒ defer + re-classify next unit; retracted ⇒ ordinary
unit), F92.4 per-piece degrade intact, one EnqueuePatterAsync call site.

T236 watch: the crossing threshold ignores QueuedAhead/PreMusicPatter —
conservative (degrades to baseline, never mis-airs) but misses legit
straddles; candidate threshold recorded in review.
Base automatically changed from feat/f110-idents-time to main August 9, 2026 14:31
@genwave-radio
genwave-radio merged commit 28db14a into main Aug 9, 2026
11 checks passed
@genwave-radio
genwave-radio deleted the feat/f111-straddle branch August 9, 2026 14:35
@github-actions github-actions Bot locked and limited conversation to collaborators Aug 9, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant