Repository navigation
What the station's ratings of its own breaks are for #7
Replies: 2 comments
|
Status check, 2026-09-22 (main at 23b983e) Done: the ratings table and repository, the rating control on Still open: reader 2 (a persona performance page), reader 3 (proposed sheet edits), rating a break from the on-air panel (it rates tracks only), and |
|
Status, 2026-10-23. The stories reader is built (#759). Still open: reader 2 (a persona performance read with ratings beside the decline rate by fault kind), reader 3 (proposed sheet edits), and rating a break from the on-air panel. Reader 3 also has a standing obstacle: |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Status (2026-10-10)
The place to hold an opinion is built, and so is the first thing that reads it.
deadair.script_ratings(migration 0022) is a table on the write ATTEMPT, not acolumn, with the catalog's
liked/neutral/dislikedspellings over1/0/-1.render/script.ratings.repository.tsreads and writes it, andGET /scriptscarries eachattempt's rating (
script.history.repository.ts)./scriptshas a rating control on every attempt that has words(
apps/web/src/components/scripts/script.rating.control.tsx), and the Android app's What it saidlist rates them too (2ed8bfc).
ScriptHistoryRepository.writtenByleaves out anattempt rated
-1(rated.rating is distinct from -1), so a note is never distilled from a breakthe operator thumbed down.
What is left is everything that reads the ratings after that, one more place to write them, and one
reader that was missed:
per persona.
persona.stories.repository.ts(saidFor, around line 222)still carries the comment saying the clause is one left join through
segment_idtodeadair.script_ratings, "once that table is read here". It is read everywhere else now, so thisis the same predicate as reader 1 at a second door.
Why the rubric is not enough, and why the readers below lean on the operator
deadair.script_historyis one row per write ATTEMPT with the writer, the model, the template, theneighbours, the token counts and the duration.
CharacterFault(persona.sheet.ts) is a closed vocabulary of
four ways a script is not the character speaking, and
BreakPromptShape.mustNameRecordadds a fifth.So "this persona fell to the floor 40% of the time and 31 of those were
out-of-character" isalready a query rather than a feature.
That is a rubric, not an opinion, and optimising against it is a trap the tree already documents
one level down.
overusedWordsasks and never refuses, on the stated grounds thatdictionMarkersare named in the prompt and counted in the answer, so the cheapest way to pass the character check is
to say the marker list again: a check that declined over it would be refusing the character for
being itself. Any pass that tuned a sheet to reduce declines would be steering toward exactly that:
the decline rate improves, and the station gets worse.
The other candidate signals do not exist and cannot be manufactured:
AudienceWatchpolls Icecast and follows/admin/eventfeed, andneither says anything about a sentence. A listener who leaves during a break and a listener whose
train went into a tunnel are the same number.
artists,albumsandtrackseachcarry a rating and
CandidatesRepository.effectiveRatingcollapses the three. Nothing anywhereholds an opinion about a break.
Where it is written
Two surfaces, both writing the same row. The first is built; the second is what is left:
/scriptsalready exists and paginates the whole history newest first(scripts.page.tsx, reached as the Scripts
tab of
/voicerather than a route of its own, andGET /scriptsinrender.ck). This is the review surface: an evening
spent reading back what the station said. The page already filters by kind, writer, outcome and
segment, and each row carries its rating. Built.
the one made while the break is still in the room. It needs the id of the attempt that produced
what is playing, which the segment already reaches through
ScriptHistoryPageQuery.segmentId.The route exists already,
PUT /scripts/{id}/ratingunderplatform.manage(render.ck), mirroring the three catalog ratingverbs including their override of the file's read floor: reading what the station wrote is a view,
having an opinion about it is an operator action.
What reads it, in the order the value arrives
1. The persona notebook's distil selection. The notebook pass
(personas §2) reads a character's own written scripts and distils notes it will
build on later. A note distilled from a break the operator thumbed down is the station reinforcing
exactly what did not work. The predicate is one clause,
and rating is distinct from -1. Built inScriptHistoryRepository.writtenBy; the stories repository still lacks it (see the status above).2. A persona performance read. The decline rate by fault kind beside the liked and disliked share,
per persona and per kind. This is where a sheet actually gets tuned by hand, and it needs no model:
it is a page over two tables. It also answers the question the rubric cannot: whether the breaks that
PASSED every check were any good.
3. The deferred half: proposed sheet edits. A rated corpus is what makes "this character would be
better if
dictionsaid X" a claim with evidence rather than a guess. Three rules, and each has aprecedent in the tree:
deadair.pronunciationsmakesrejecteda state rather than adeletion for exactly this reason, and
CONFIDENCE_BARis the line between saying a thing unaskedand offering it. A persona is the operator's voice; a station that quietly rewrote its own character
overnight is a change they can neither see nor undo.
deadair.facts' rule that a claim with no source mustnot be expressible: a proposed diction marker arrives attached to the rated rows that motivated it.
PersonaRehearsalServiceruns against a deliberatelyFIXED pair of invented records so two readings are comparable, which is precisely an A/B harness for
a candidate sheet against the current one. It exists and nothing uses it this way.
What this does not cover, deliberately
AUDIENCE_LINGER_MSis a lease, andnothing about a connection is an opinion. Do not build an inference from listener churn: a break is
seconds long and a departure has a dozen causes.
artists/albums/tracksand it is built. This isabout the words.
it, which is why
fact.model.ts's verification is a separate conversation that has never seen thearticle. There is no equivalent trick here, because "was that any good" has no quote to be entailed
by. The operator is the judge or there is no judge.
Related
personas for the notebook this feeds and for what is left after the character sheet.
dj-voice for the writers themselves.
fact-enrichment for the propose-with-evidence pattern in its original home.
All reactions