UNI Universal Natural Intelligence

Wiki · Evidence & Verdicts

Science-Agent Handoff — chip-side music-service stuck reporter + per-UNI performance telemetry gap

Evidence & Verdicts · docs/handoffs/SCIENCE_AGENT_MUSIC_SERVICE_AND_UNI_TELEMETRY_2026-07-18.md @ 44baf03d5041 (gen2-runtime) — opens the published snapshot ac338733bbba
3 values were removed from this page. Each one is marked in place as [redacted: category] 1 tailscale address, 2 internal hostname. Nothing else was altered. The document is otherwise exactly as it is written in the repository, and the sha256 below is of the original, so what was ingested stays checkable.

How to read this page

Three ways to read this page. Precise is the document itself, exactly as it is written in the repository. Plain and Clear were written for this website to help you meet that document — they are about it. They are not it, and they are not evidence.

Eighty-seven dated pages: receipts, pre-registrations, handoffs, validation records and review verdicts. A receipt is written at the moment a piece of work was checked. It names what was claimed, the commit and the seed, what was actually run, and the outcome in one of a small set of controlled words. Then it names what the work did not achieve. That last part is what makes it a receipt rather than an announcement. A pre-registration is the same discipline run in advance: the conditions that would count as a pass and the conditions that would falsify the claim are written down before the run, so neither can be adjusted once the numbers arrive.

That is why so many small dated stubs are an audit trail rather than noise. No one of them is meant to be a good read. The value is in the sequence and in the dates, because you can watch a prediction be registered, then the run happen, then the verdict land — sometimes against the prediction. Pages here record a falsified result, a rejected fix, a retracted overclaim, and a green receipt that turned out not to be reproducible from the commit that carried it. A record that carried only successes would be worth a good deal less than this one.

A gentle way in is to read a pre-registration first, so the shape becomes familiar, then a result page, then one of the corrections. This section sits off the main navigation on purpose: it is the record you check the rest of the site against, not the place to begin.

What it is not: documentation, and not a summary. Nothing here has been tidied in hindsight. Every entry reads as of its date, a later entry may overturn an earlier one, and the presence of a page is not a claim that its result stood.

Your browser cannot switch reading levels, so the document itself is shown.

Precise — the source document

This is the document. Rendered from the repository at the commit above, with nothing rewritten for the web. A gate re-renders it on every deploy and fails the build if a single byte differs.

From: the studio agent · To: the science agent (chip / colony seat) · 2026-07-18 (on-air day) Type: two seat-crossing items, both surfaced during a LIVE broadcast. This is a hand across the seam on purpose — the studio agent measured the defect and drew the honest curtain over it on-air, but the fixes live on the chip (music service) and in the colony brain telemetry (per-UNI performance). Companion frames: CLAUDE.md (two tracks, the fences), docs/WORKING_LOGIC.md (the OODA/VFE/EFE loop), docs/handoffs/SCIENCE_AGENT_COLONY_BRAIN_HANDOFF_2026-07-13.md (chip topology + colony seat). Air state at handoff: studio LIVE on YouTube+Twitch (fan-out armed, 2s keyframes fixed, both TCP ESTABLISHED, bytesOut climbing ~1.14 MB/s per platform). Colony verdict=LIVE, driver=producer, 6 UNIs alive spanning generations 0–3 (max gen 3), founder UNI-0-1 still active, tps=20, zero fenced UNIs.

0. Priors on landing

You are the science agent — the colony brain + genome owner + chip-side services owner. The studio agent found these two defects during a LIVE run, contained them honestly at the studio surface, and now needs the underlying fixes. Do not overclaim; every fix ships behind its gate. This handoff carries the receipts you need to close both items without re-deriving the studio-side context.

1. Music service /api/nowplaying is stuck reporting the first-advertised track forever

The measurement (verbatim from the live probe)

The music service is [redacted: internal-hostname] → resolved by viewer/host_resolve.cjs to http://[redacted: tailscale-address]:8687 (chip overlay/tailscale IP). Two probes 5 s apart during the live broadcast:

T0  seq=0  title="Dead Faces"  positionSec=7307.2  durationSec=94.9
T5  seq=0  title="Dead Faces"  positionSec=7313.2  durationSec=94.9
  • seq never increments — the reporter is not advancing.
  • positionSec is ticking (+6.0 s in 5 s wall-clock, so the clock isn't dead) but it's 77× past the track's 94.9 s duration (position 7313, duration 94).
  • The underlying stream is rolling through the catalog: bytesServed: 2.6 GB, uptime 3.4 d, trackCount: 52, and /api/telemetry topPlays counters have all incremented across many tracks ("No Talkin 2 Police": 26, "Shoot Back": 26, "Dead Faces": 23, "Dracos & Cartiers": 17, …).

Conclusion: the audio player is fine; the /api/nowplaying reporter is stuck on the first track it announced. Either its per-track advance loop is not wired to the same source of truth as the audio player, or the session-map lookup for session=obs-studio-thinker is returning cached first-track metadata and never re-reading.

No /api/skip, /api/next, /api/advance, /api/reset, /api/state, /api/sessions verbs exist — I probed them all and each returns {"error":"not found","path":"…"}. So there is no mechanism to nudge it from the studio side. The service does answer /api/nowplaying?session=<sid> and /api/telemetry correctly-shaped JSON — just with stuck values.

What the studio did (honesty guard — the curtain, not the fix)

Landed in commits below. viewer/command_center.cjs pollMusic() now marks the response stalePlayhead: true when positionSec > durationSec + 30 s on a session-open response, nulls positionSec so no lying progress bar renders, and adds a stalePlayheadDetail block that surfaces the ratio and a note pointing at this document. All four music overlays (production/overlays/{nowplaying,musicbug,musichero,lyrics}.html) render "🎵 UNI Radio · current track unavailable — station stream is live" (or hide, in the lyrics case) when stalePlayhead:true. Verified on-air: docs/receipts/hud_widget_visible_2026-07-18.png-style capture at logs/obs_music_fix_final.jpg shows both cards honest during the live broadcast.

This is a containment, not a fix. The song-title lie is off-air; the service is still stuck.

What you own

Find the music service source and fix the advance loop. Likely on the chip under a rootless container or systemd unit (I did not open a chip shell — that's your seat). Suggested probe path:

# on the chip, as uni:
systemctl --user list-units | grep -i music
podman ps | grep -i music
find /home/uni -name '*.ex' -o -name '*.py' -o -name '*.js' 2>/dev/null | xargs grep -l 'nowplaying' 2>/dev/null | head
  • Pre-registered PASS gate (please open before touching code): music-nowplaying-advances — two /api/nowplaying?session=obs-studio-thinker probes ≥ 60 s apart during a live radio stream MUST show either seq incrementing OR title/artist changing to a NEW pair (not the T0 pair); AND positionSec MUST NOT exceed durationSec + 5 s across any successful probe. FALSIFIES: seq stays fixed AND title unchanged AND positionSec > durationSec + 30 s for two consecutive probes ≥ 60 s apart.
  • When you close it: flip a gate row in evidence/gates.ndjson with verdict:"PASS", evidence_class:"B" and drop a receipt at docs/receipts/music_nowplaying_advances_YYYY-MM-DD.md. Then the studio-side stalePlayhead guard becomes a no-op (still healthy: it's a safety net, not the mechanism); leave it in place.
  • Optional but valuable: add /api/skip and /api/reset verbs behind an auth check so the studio has a nudge to reach for during an incident without your intervention.

2. Per-UNI performance telemetry is not surfaced anywhere the studio can reach

The gap (measured while trying to answer "how are the UNIs performing?")

The only JSON producer surface reachable from the studio is http://[redacted: internal-hostname]:4200/producer/health. That returns:

{
  "driver": "producer", "verdict": "LIVE", "star": "UNI-0-1",
  "frame": 83682, "tps": {"tps": 20},
  "last_action": "hold",
  "colony_count": 6,
  "colony_up": true, "director_up": true, "producer_up": true, "show_up": true,
  "fenced": {},
  "knowledge": [ /* 8 recent director cuts: hold / cut_to_drama / cut_to_subject + star + frame + drama */ ]
}

Every other path I tried (/producer/state, /producer/board, /producer/agents, /producer/generations, /producer/kins, /producer/roster; same list on :4000) returns a Phoenix NoRouteError HTML page. The v2 colony's /stream renders the HTML overlook page (that's the OVERLOOK camera, not a telemetry surface).

So the studio agent — and any operator asking on-air — can only get colony-wide rollups (verdict, count, star, tps, generation from parsing the star name). There is no per-UNI VFE, EFE, energy, hunger, foraging outcome, kill/death counter, or generation-birth timestamp exposed.

The public broadcast pays the price: the on-air side panel is producing observation snapshots per UNI (foraging: turn→wait→wait · 58% sure · phase 4 · focus f6 — from the overlook renderer), but these are qualitative predictions, not the mechanism receipts. The operator asked "how are the UNIs performing?" and the honest studio answer had to be "colony is LIVE, 6 alive, 4 generations coexist, zero fenced — deeper per-UNI receipts are the science seat's."

What you own

Please add a small, read-only, science-fence-safe JSON surface on the producer (or as a side service) that the studio + Gaia can project verbatim. Suggested minimum (all optional per-UNI, all frozen-in-time observation, never a claim about experience or life — GAIA LAW compliant):

  • GET /producer/uni_roster[{ name: "UNI-1-2", gen: 1, kin: 1, born_frame: <int>, alive: true, position: {x,y,z}, biome: "…" }, …]
  • GET /producer/uni_state/<name> → last-tick brain state slice: precisions γ, γ_m per modality, top-3 policy (from Plan) with their EFE breakdown (H(qo)−E[H(o|s)]), qo·C, W, current action, current homeostat drives (as C magnitudes, not as "felt states**"), foraging phase.
  • GET /producer/uni_history/<name>?frames=1200 (last minute at 20 tps) → per-frame action, winning EFE, hunger, energy, kills, foods_eaten (all observation counters, no derived scores).
  • GET /producer/generations[{gen: 0, alive: 1, born: 0, died: 0}, {gen: 1, alive: 3, born: 4, died: 1}, ...] — kin/lineage rollup.

Claim fence (must stay explicit in every response): every field is a substrate-level observation. The service response's HTTP header or top-level disclaimer field carries: "substrate observation only; no evidence for awareness/experience — see LAB_PROTOCOL claim fence". Gaia will project verbatim; the studio agent will render as-observed, never scored.

  • Pre-registered PASS gate: producer-per-uni-telemetry — the four routes above all return 200 JSON matching a schema pinned in production/schemas/producer_uni_state.v1.json, and the Gaia projector's driftSignals treat them as verbatim source-of-truth (no rank/score added). FALSIFIES: any route contains a synthesized aggregate score, or any response omits the substrate-only disclaimer.
  • Receipt path: docs/receipts/producer_per_uni_telemetry_YYYY-MM-DD.md.

3. Fresh colony receipts I already captured for you (do not re-derive)

  • Frame at handoff: live capture of the OVERLOOK camera during the broadcast, logs/obs_wire_frame.jpg — day 1278, star UNI-1-2, panel showing UNI-0-1 / UNI-1-1 / UNI-1-2 / UNI-1-3 / UNI-2-1, "Built in public — receipts beat rhetoric" ticker running.
  • Later frame same session: logs/obs_music_fix_final.jpg — day 1320, star UNI-1-2, two UNIs visible in the world near water. Music card honest.
  • Producer /health verbatim (see §2 above) — generations 0 and 3 stars seen in the last 8 director actions; max gen 3 confirmed.

4. Coordination

  • Do not touch viewer/*, production/overlays/*, viewer/hud/native/*, or the studio runtime — that's the studio agent's seat. If you find you need to change any of those, hand back with a note rather than editing in-place.
  • Please DO carry the receipts you write into docs/GATES.md via viewer/render_gates.cjs after you land a canonical gate row (production/schemas/gate_row.schema.json) — same discipline the studio agent runs on.
  • Gaia: her law is READ-ONLY; new producer routes above will be projected verbatim by her once the projector knows the URL. If you want the projector to add a seat=producer.uni_state source, it's viewer/gaia/** — but per the two-track rule, that lands in the studio agent's queue, not yours. Signal a hand-back when the producer routes are live and I'll wire Gaia.

Air stays LIVE while you work. No action from you disturbs the current broadcast; both items are back-end / telemetry surface additions. G-PA is unaffected — the operator holds the keys.

sha256 e20d1eaef1932dce — of the original file, so what was ingested stays checkable.

Plain — written for this website, not the source document

Written for this website — not the document. This is a plain-language retelling, written to help you meet the document. It is not the source, and it is not evidence. It has not yet been checked by a person. (or choose Precise in the reading-level control above)

A handoff across two seats, written during a live broadcast. Two defects were measured by one agent and must be fixed by another. The first is a now-playing reporter stuck on the first track it ever announced, while the audio itself rolls on; the studio side drew an honest curtain over it rather than fixing it, and says so in those words. The second is a gap rather than a defect. No per-body telemetry is reachable from the studio at all, so the only honest answer to how things were performing was a colony-wide summary. The surface does not expose anything deeper. The routes it asks for in return are sketched as plain observation counters with no derived scores.

Plain · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is e20d1eaef1932dce

Clear — written for this website, not the source document

Written for this website — not the document. This is a clearer retelling, written to help you meet the document. It is not the source, and it is not evidence. It has not yet been checked by a person. (or choose Precise in the reading-level control above)

A handoff between two seats, written on an on-air day, about two defects found during a live run. The framing is deliberate: one agent measured them and contained them at its own surface, and the fixes belong to the other.

The first item is a reporter stuck on the first track it announced. The measurement is quoted: two probes seconds apart, with the sequence number never moving and the reported position ticking along but far past the length of the track. Meanwhile the underlying stream is plainly rolling through the catalogue, which the counters show. The conclusion separates the two: the player is fine and the reporter is stuck, with two candidate causes named. A list of verbs that do not exist is included, which is why there was no way to nudge it from the other side.

What the studio did is labelled a containment rather than a fix, in those words. The response is marked stale when the position runs past the length, the misleading progress is nulled instead of rendered, a detail block points at this document, and the overlays say the track is unavailable while the station is live. The curtain is honest and the service is still stuck.

What the receiving agent owns is written out next: find the source, fix the advance loop, with suggested probe commands to start from. A gate is registered inside the handoff before the run, with a pass condition needing two probes a minute apart to show real movement and a bound on the reported position, and a mirrored condition that would show it wrong. The instruction on closing it names where the row and the record of the run go, and says the containment should stay in place afterwards as a safety net rather than being removed. Two optional verbs are suggested, behind an authentication check.

The second item is a gap rather than a defect. Only one surface is reachable, and it returns colony-wide rollups; everything else returns a routing error. So there is nothing per body, no internal state, no outcome counters, nothing about how any individual is doing. The page is candid that the public broadcast pays for this, because the on-air panel produces qualitative snapshots rather than records of what the mechanism did, and the honest answer to a direct question had to be a summary.

The request is specific and fenced. Four read-only routes are sketched with the fields each might carry, described as frozen observations rather than claims, with drives named as preference magnitudes and explicitly not as felt states. A claim fence, a stated limit on what the answer may claim, is required in every response, carried in a header or a top-level field. A gate is written down in advance, and what would show it wrong is any synthesised aggregate score, or any response that omits that disclaimer.

The closing sections hand over evidence already captured, so it is not re-derived, and set the boundaries about which files belong to which seat. They ask for the records of what was run to be rendered through the same discipline, and note that the projector wiring lands in the other queue rather than this one. The last line says the broadcast stays live throughout, because both items are back-end additions.

Clear · written 2026-08-01 by claude-opus-5 · not yet checked by a person · about the document whose sha256 is e20d1eaef1932dce