Skip to content

Add baddies-smp-pigs-can-fly-command-ledger (agentic omni understanding) - #99

Draft
wenkai-li wants to merge 5 commits into
PhiloLabs:mainfrom
wenkai-li:understanding/baddies-smp-command-ledger
Draft

Add baddies-smp-pigs-can-fly-command-ledger (agentic omni understanding)#99
wenkai-li wants to merge 5 commits into
PhiloLabs:mainfrom
wenkai-li:understanding/baddies-smp-command-ledger

Conversation

@wenkai-li

Copy link
Copy Markdown

Add baddies-smp-pigs-can-fly-command-ledger (agentic omni understanding)

Reconstruct the ledger of spoken requests in a 228-minute multiplayer building session
that were not acted on when asked, but were carried out later. For each one the
agent reports the request, who eventually did it, what happened, and the timestamps and
evidence window of the execution. Scoring is deterministic event-level F1 with
one-to-one bipartite matching (steps/solve/tests/judge.py); no LLM judge.

The reasoning is cross-modal by construction: the request exists only in the voice
chat, the fulfilment exists only on screen, and the two are separated by 20 s to 12 min
of unrelated activity. The image ships an offline ASR tool because text+vision
harnesses cannot hear — without it they would fail for lack of a sensor rather than for
lack of reasoning.

Calibration — this task does NOT clear the difficulty bar

I am opening this with the failing number rather than filing it away, because the
reason it fails turned out to be the most useful thing the build produced.

harness version model reasoning score turns
Claude Code 2.1.220 Opus 5 xhigh 0.1875 115
Claude Code 2.1.220 Opus 4.8 default 0.1379 51
Codex CLI 0.145.0 GPT-5.6 Sol xhigh 0.0741 112

scripts/understanding/check_task.py passes 9 of its 10 checks; the one failure is
strong agent < 0.1. Oracle 1.0, empty 0.0, > 50 turns for all three, and every
ablation scores exactly 0.0000 against a <= 0.15 gate.

The ablations are the part that worked

evidence given reward detection F1 what it could do
video only (audio stripped) 0.0000 0.00 could not even detect that a request occurred
audio only (no video) 0.0000 0.30 found 4 real requests, grounded none of them
one frame / 20 frames / no media 0.0000 0.00 submitted nothing
both channels (Codex) 0.0741 0.37 finds requests and begins to ground them
both channels (Opus 5) 0.1875 0.44

Detection F1 is unscored credit for merely locating the right utterance. The two
single-modality runs both score zero but fail differently, and that asymmetry is the
real evidence: speech carries the existence of the event, video carries its temporal
anchor
, and neither half completes the chain. Audio-only located four genuine requests
and then died on exec_time accuracy 0.50 and evidence-window IoU 0.25 — the transcript
tells you who asked for what, never which second it got done.

(In an earlier 15-row / 180-min configuration audio-only scored 0.0952, nearly matching
the full-evidence agents. On the shipped ledger it is a clean zero, with no restriction
of the ground truth needed to make the cross-modal claim hold.)

Two repairs were measured and both failed

Enlarging the ledger does not work. Event F1 is 2·TP/(P+N); when predictions and
ground truth are the same order of magnitude the reward tracks the agent's solve rate,
not the ledger size. Opus 5 solves 3 of 21 rows with 11 predictions, so reaching 0.10
needs N > 49. I extended the window from 90 to 228 minutes to try exactly this: the
ledger grew 15 → 21 rows and Opus 5's score went up, 0.1053 → 0.1875, because the
extra footage handed it more solvable rows rather than diluting the ones it had.

Raising the deferral floor does not work either. The design assumed longer gaps are
harder. They are not — the filter removes ground-truth rows and agent true positives at
the same rate:

deferral floor GT rows Opus 5 Opus 4.8 Codex
15 s 18 0.2069 0.0769 0.0000
45 s 12 0.0870 0.1000 0.0000
90 s 10 0.0952 0.1111 0.0000
180 s 6 0.1176 0.1429 0.0000

No floor clears the gate for both Claude agents. Opus 5's three solved rows have gaps of
36 s, 20 s and 549 s — it handles the nine-minute deferral as comfortably as the
twenty-second one.

What the difficulty axis actually is

Field accuracy among located rows tells the story: object, executor and outcome
are 1.00 for every agent on every row they found. The loss is entirely in when
execution timestamp and evidence-window IoU. Detection F1 (locating the right utterance,
unscored) is 0.37–0.44, roughly triple the official score.

So these agents hear what was asked and know who did it; they cannot say which second it
was done. And what separates a row they solve from one they miss is whether the
execution is visually conspicuous — a pig landing, a block placed into an empty
frame — not how long after the request it happened. That is the axis footage should be
selected on, and it is not the axis this task was built around.

Known gaps

  • Difficulty gate fails (above). Everything else passes.
  • The image has never been built end-to-end. No Docker on the build machine. Every
    remote fetch verified HTTP 200 and the media sha256 matches the remote LFS oid, but a
    real docker build is still required.
  • Ground truth has one human reviewer, the contributor, not the 2+ independent
    annotators the family asks for. It was drafted by two vision models independently
    (Cohen's κ 0.916 on actionability), adjudicated from dense frame sampling, and every
    row cites the frames that settled it.
  • Two harnesses, not three. No Antigravity/Gemini access; Opus 4.8 stands in.

Provenance

  • A prompt leak was found — an earlier instruction.md used a real ground-truth row as
    its worked example and one agent copied it verbatim. Every affected run was
    discarded and re-run, not re-scored; the example is now fictional and flagged.
  • A phantom third player (an on-screen tooltip for a custom-named pickaxe, read as a
    nameplate) entered the vocabulary and cost one run a 0.0. Caught, verified from
    cropped frames, removed.
  • Contamination audit on the shipped trajectories: 0 of 278 tool calls across the three
    agents touch any answer-key path.
  • Rows were never added to move a number; a sweep run specifically to enlarge the ledger
    had most of its candidates rejected on the evidence.

Full numbers and method: calibration/scores.md. Design card: SPEC.md. Build history
and rejected source alternatives: RUNBOOK.md.

@christine1729

Copy link
Copy Markdown
Contributor

Hi @wenkai-li, thanks for the PR.

before merge:

  • Complete the scores.md table by running the shipped task on the shipped 1-hour budget with exactly these rows, each with harness version, reasoning effort, score, tool-call turns, and one raw trajectory file committed in calibration/rollouts/: Codex CLI + GPT 5.6 Sol (done, keep it and add its turn count), Claude Code CLI + Fable 5 or Opus 4.8, Antigravity CLI + Gemini 3.5 Flash or 3.1 Pro, and for the Gemini row add the integrity audit line like the other tasks: confirm from the trajectory that there was no web grounding, no lookups, and no answer-file access. Move the reward and solution dumps out of the repo; the HF links can stay as extras, but the in-repo trajectory is the audit record.

Reconstruct the ledger of spoken requests in a 228-minute multiplayer
building session that were not acted on when asked but were carried out
later. Deterministic event-level F1 with one-to-one bipartite matching;
no LLM judge.

Calibration is reported as measured, including the gate it fails:

  Opus 5 xhigh          0.1875  (115 turns)   FAILS the < 0.10 gate
  Opus 4.8              0.1379  ( 51 turns)   FAILS
  Codex GPT-5.6 Sol     0.0741  (112 turns)   passes
  oracle 1.0 / empty 0.0 / all five ablations 0.0000

check_task.py passes 9 of 10 checks; the failure is strong-agent difficulty.

The cross-modal requirement is unconditional: both single-modality
ablations score zero and fail differently. Video-only cannot detect that
a request occurred (detection F1 0.00); audio-only locates four real
requests but grounds none (detection F1 0.30, evidence IoU 0.25). Speech
carries the existence of the event, video carries its temporal anchor.

Two repairs for the difficulty gate were measured and both failed:
enlarging the ledger (90 -> 228 min raised Opus 5 from 0.1053 to 0.1875,
since the extra footage supplied more solvable rows), and raising the
deferral floor (no floor from 15 s to 180 s clears the gate). The
measured finding is that difficulty tracks whether the execution is
visually conspicuous, not how long after the request it happened.
…oiting it costs

The first submission identified visual inconspicuousness as the likely difficulty axis
but left it as a suggestion. It is now measured, and the follow-up task it points to has
been scoped rather than assumed.

Controlled test. Per row, the fraction of pixels changing across the execution minus the
same span 45 s earlier (a per-row baseline for ambient camera motion). The 21 rows split
into SOLVED (4), request LOCATED but execution never grounded (4), and never found (13).
The third tier is confounded — those may be missed because the request was missed — but
the first two are not, giving a clean 4-vs-4 comparison in which the agent heard the
request either way:

  fraction of pixels changed   solved +0.289  vs located-only -0.259   exact p = 0.043
  mean absolute difference     solved +31.19  vs located-only -18.26   exact p = 0.043

Every row below 0.35 footprint — six of them — was solved by no agent. Stated limits:
n is 4 vs 4 against a 1/70 = 0.014 floor, and the threshold was picked by looking at
which rows went unsolved, so it needs validating on rows it never saw.

Feasibility of the revision. Licence is per video, not per channel, so all 136 sibling
sessions were checked individually: 42 are CC-BY (191 h). Seven were pulled as audio
only, transcribed (19,638 lines / 30 h), and swept by 16 subagents. Yield depends on the
two players co-building, and 0 of 10 new half-sessions do (7 parallel play, 3 solo)
against 2 of 2 for this session. A positive control — the same sweep on this session,
true ledger 21 — returned 9, so sweep recall is ~43% and the counts are calibrated
rather than taken at face value.

At that recall the revision lands at roughly 11-13 rows, where one lucky agent hit still
passes (0.087) but two do not (0.174). The hotel-era sessions where this footage's
collaboration happens are almost all standard-licence. The axis is real; the footage to
exploit it at scale is not obviously there.
…on — channel exhausted

The feasibility section projected a revision at 11-13 rows and flagged that the sessions
where this footage's collaboration happens are almost all standard-licence. One CC-BY
hotel-era session remained unswept, and it was the strongest available test of whether
collaboration is a property of that era: 32WK9Q8-Dcc sits directly beside the shipped
session in the channel timeline and shares its subject matter.

Read-out rules were fixed before the run, and the prompt was byte-identical to the
positive control. Result: parallel play in the first half, solo in the second. Its five
candidates are all requests from Noodle, Bread and Miller — Twitch-chat and Discord
viewers commissioning hotel rooms, not players in the world — which the sweep flagged
itself and the task's rules reject.

Tally is now 12 new half-sessions, 0 shared projects (8 parallel play, 4 solo), against
2 of 2 for the shipped session.

That kills the era hypothesis and leaves the simpler one: this channel's format is one
streamer building alone while viewers commission rooms. The shipped session is
exceptional because a second player happened to log on and involve himself in the same
structure — an event, not an era. On this axis the channel is exhausted; a revision needs
a different source, and scaling within this channel was measured rather than assumed.
…round truth

- Add the Antigravity CLI (Gemini 3.5 Flash, high) row to the baddies
  calibration table: 0.0, 98 tool-call turns, plus the integrity-audit line and
  a full provenance note (host run because agy only authenticates via OAuth and
  cannot run headless in the sandbox; quota-terminated at ~28 min with the agent
  still orchestrating transcription). Ship the raw trajectory as the audit record.
- Add scripts/understanding/audit_trajectory.py: three-format (ATIF / Gemini /
  agy stream-json) tool-call counter + answer-key / web-grounding audit.
- Move the solution dumps out of the repo: inline the ground truth into judge.py
  and the oracle answer into solve.sh (matching dualrunway/gsw/soccer), and drop
  the loose ground_truth.json and oracle_solution.json. Oracle still scores 1.0,
  empty 0.0; provenance kept as the evidence trail.
- Set the agent budget to 3600 s (1h) to match SPEC.md and the calibration table.
@wenkai-li
wenkai-li force-pushed the understanding/baddies-smp-command-ledger branch from 35fc8eb to 9b0c4de Compare August 31, 2026 22:23
@wenkai-li

Copy link
Copy Markdown
Author

Thanks @christine1729 — all four items addressed.

scores.md table now carries the required rows, each with harness version, reasoning effort, score, tool-call turns, and a committed raw trajectory in calibration/rollouts/:

harness version model reasoning score turns trajectory
Codex CLI 0.145.0 GPT-5.6 Sol xhigh 0.0741 112 codex-full.jsonl
Claude Code 2.1.220 Opus 4.8 default 0.1379 51 opus48-full.jsonl
Antigravity CLI 1.1.21 Gemini 3.5 Flash high 0.0 98 antigravity-full.jsonl

(Opus 5 / xhigh / 0.1875 / 115 kept as a fourth row.)

  • Codex turn count added (112).
  • Antigravity + Gemini 3.5 Flash row added, with the integrity-audit line: the trajectory shows no web grounding, no lookup/search tool calls, no server-side grounding metadata, and no access to any answer-key path (98 tool-call turns, all clean — checked by scripts/understanding/audit_trajectory.py). This row scored 0.0; the full run provenance is in scores.md → "The Antigravity row" so the number is interpretable.
  • Solution dumps moved out of the repo: the ground truth is now inlined into judge.py and the oracle answer into solve.sh (matching dualrunway/gsw/soccer); ground_truth.json and oracle_solution.json are removed. Oracle still scores 1.0, empty 0.0. The raw trajectories stay in-repo as the audit record.
  • Agent budget set to 3600 s (1 h) to match SPEC.md and the calibration table.

Also rebased onto latest main to clear the conflict. Happy to adjust anything.

@techgenmini

Copy link
Copy Markdown
Collaborator

Hi @wenkai-li — thanks for completing the documentation and artifact portion of the previous checklist. I re-reviewed live head 9b0c4de.

I verified that the requested model/version/reasoning/turn-count rows and raw trajectories are present, the one-hour timeout is configured, and the loose solution/reward dumps were removed. Those parts of the
earlier checklist are closed.

The raw trajectories make the measurements auditable, but they also reveal that the calibration portion is not closed yet. I recommend moving the PR back to Draft for one bounded correction cycle.

  1. The retained scores are not clean measurements of the shipped task. Codex starts with a populated workspace containing prior transcripts, diarization, frames and scripts; Opus 4.8 reads and merges a prior-
    session solution.json; and Opus 5 uses prior artifacts and reads output written by a concurrent run. The Antigravity run quota-terminated before analysis and produced no solution, so its 0.0 is the empty
    anchor rather than a completed one-hour run. These remain useful development records, but the current scores establish neither a pass nor a failure of the difficulty gate.

  2. The new trajectory auditor fails open for the retained Codex and Claude formats. It reports zero calls and PASS for those three files, although their actual counts are 112, 51 and 115. Please add support
    for Codex item.completed command/file-change records and Claude assistant.message.content[].tool_use, and fail nonzero when a non-empty trajectory uses an unsupported format or yields no recognized calls.

  3. The scorer has a concrete numeric bypass and an inconsistent output contract. I reproduced 1.0 after replacing every command and execution timestamp with JSON NaN; non-finite numeric values need to be
    rejected and covered by a regression test. I also reproduced 1.0 with every speaker and target wrong, although the prompt requires those fields and the judge documentation describes them as part of a true
    positive. Please either remove them as required fields or establish observable definitions and score them consistently. The prompt should also state the enforced evidence threshold (temporal IoU >= 0.5).

Before rerunning, please successfully build and freeze the exact image, including immutable media/ASR revisions and checksums, and remove the unnecessary HF_TOKEN exposure.

The next checkpoint should be just one clean Codex GPT-5.6 Sol pilot: fresh container and empty workspace, only shipped setup materials, one-hour budget, task networking disabled, and a native audited
trajectory. If it scores <0.10, freeze the task and proceed with the final Claude/Antigravity campaign, required ablations and second human review. If it scores >=0.10, that supports a substantive task/source
pivot rather than scorer tightening.

GitHub currently also reports a merge conflict with main; that can be resolved after this measurement checkpoint. I reproduced the existing oracle 1.0, the NaN and speaker/target cases, and the auditor’s
false zero-call passes. I did not run the full 3.09 GB Docker build because the scorer contract and environment still need the corrections above.

@wenkai-li
wenkai-li marked this pull request as draft September 6, 2026 02:11
… calibration undetermined

Addresses the PR PhiloLabs#99 re-review (2026-09-01).

audit_trajectory.py now parses Claude Code (message.content[].tool_use) and Codex (item.completed command_execution / file_change) transcripts, so the retained rollouts count 112/51/115/98 instead of 0. It exits 2 on a non-empty trajectory with no recognized tool calls instead of printing a vacuous PASS, and treats a shell find exclusion clause as an exclusion rather than an access. Regression: scripts/understanding/test_audit_trajectory.py.

judge.py rejects non-finite timestamps: an all-NaN ledger scored 1.0 because a comparison against NaN is always False and the checks are written as reject-if-outside-tolerance. Regression added to tools/test_judge.py.

instruction.md declares speaker/target optional and unscored, matching the judge, and states the enforced evidence threshold (temporal IoU >= 0.5) and that times must be finite.

Dockerfile pins the base image by digest, the ASR model to an immutable revision with sha256 for all four files, and ctranslate2==4.8.1 (previously a floating transitive dependency). A full build passed every checksum and transcribe runs on the baked video.

task.toml drops the unused HF_TOKEN env exposure; the media is public.

scores.md: the verdict is now 'difficulty gate undetermined'. A re-audit of the raw trajectories found all three full-evidence runs started on a pre-populated work/ tree at a host path, and the two Claude runs executed concurrently and merged each other's solution.json. Findings are recorded under Provenance; the next checkpoint is one clean Codex pilot.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FQLPCzeG3LDrYxEyFRStas
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.

3 participants