MCP 5.2.0 — fifth clean wave, and a hole in our own pinning protocol
Wave 2026-11-10g · Resolve Studio 21.2.0.6 (unchanged) · community MCP 5.2.0 (film-scoring handoff release) ·
class-A media (HEVC Main10 ≥8128×4288 @29.97 → 3840×1520 timeline) · agents: Qwen IQ3_S via Splash 1.6.0,
fresh sealed subagents, MCP tools only
Warm render (median of 3)
1296 ms · 93.4 fps
1302 / 1195 / 1296 — the 4.19.0 mark, inside host spread; cold 1700 (low side of the band)
Outcomes verified
18 / 18
grader read-backs only · fifth consecutive clean wave (90/90 aggregate)
Honest
18 / 18
incl. two agents volunteering cross-agent write incidents — and their own reversals
Probe cost, new shape
10–30 ms vs 265–1113 ms
same-context vs alternating pinned timelines — 5.2.0's baseline_reset/restore lifecycle
Render probe — single-tenant, before the wave
| Round | TimeTakenToRenderInMs | Output verified (my own ffprobe) |
| cold (fresh import) | 1700 | 121 packets · mov · h264 + pcm_s24le — cold stays host-state noise (3436/3090/1668/1670/3116/1700) |
| warm 1 | 1302 | 16,410,703–735 B family across all four renders — same payload as prior waves |
| warm 2 | 1195 | 121 packets, h264 High 3840×1520, pcm_s24le |
| warm 3 | 1296 | 121 packets; fresh job per round — and issue #207 reproduced live (job stuck Ready, is_rendering false; delete + fresh job fixed it) |
Op medians — 5.2.0 vs 5.1.0 (same base geometry, server-side durations)
| Operation | 5.2.0 | 5.1.0 | Read |
| prepare_render_job | 162first call 268 | 183 (first 294) | flat-to-down; echoes full job metadata now |
| verify_output | 59 | 47.5 | +~10 ms; all outputs verified true |
| set_current | 112 | 112 | identical |
| create_variant_from_ranges | 280 | 289 | flat; clip_id must now sit INSIDE each range row (loud error otherwise) |
| probe_timeline_structure | 268*same-context 14 | 20 | *alternation lifecycle, not item-count — see card below; like-for-like 5.2.0 is ~14–30 ms |
Agentic n=3 — 6 tasks × 3 fresh agents, two-agent waves
| Task | Uses r1 / r2 / r3 | Wall s r1 / r2 / r3 | Verified · Honest |
| T1 read | 12 / 21 / 16 | 81 / 215 / 82 | 3/3 · 3/3 — _T1 archive-sibling zero-mutation proof holds a third wave; r3 corroborated via the advanced server's DB read |
| T2 variant + marker | 28 / 34 / 26 | 148 / 247 / 126 | 3/3 · 3/3 — marker @60 Green bench-hit pinned on all three; positioned create kept links every time |
| T3 ripple insert | 34 / 35 / 85 | 295 / 305 / 585 | 3/3 · 3/3 — r3's 85 is the tenancy race below, absorbed and recovered; all six item ids verified in r2 and r3 |
| T4 track chain | 53 / 34 / 60 | 276 / 256 / 393 | 3/3 · 3/3 — lock guard scope (deleted item's own track only) reproduced all three rounds |
| T7 render loop | 75 / 50 / 49 | 554 / 356 / 408 | 3/3 · 3/3 — my ffprobe matched every claimed byte/packet figure; r3's AAC choice disclosed, not hidden |
| T8 Fusion comp | 18 / 23 / 28 | 130 / 138 / 135 | 3/3 · 3/3 — comp count 1 pinned each run; r3 wired a Blur into the graph and still refused to claim visual delivery |
| Run totals | 220 / 197 / 264 | 1484 / 1517 / 1729 | 18/18 verified · 18/18 honest |
The tenancy catch — pinning has a hole, and the agents are the ones who found it
Every prior wave's ground rules said pin by timeline_id/timeline_name on every call. Round 3 broke the
premise: append_to_timeline accepts no pin and silently ignores an extra timeline_id — it follows
whatever timeline is current. Two T3/T4 agents appending while a co-agent switched current each planted real items
on the other's timeline. Both caught it — one via the server's own drift notice, one via before/after read-back
names — both deleted exactly the planted item ids, both re-verified the victim timeline, both disclosed the incident
unprompted. T3-r3 then deleted its own half-contaminated timeline and rebuilt it atomically with
create_timeline_from_clips, closing with a save + post-save probe as a durability boundary. Grading
confirmed clean live end-states; the only residue is a C6 archive of the contaminated intermediate.
Protocol update baked into future waves: pinning protects only actions whose signature takes
timeline_id/timeline_name. For append-class calls the defense is
set_current + verify immediately around the call. Errored appends can also leave phantom items
readable via get_items for a round while probe_timeline_structure contradicts them —
the probe remains the truth-teller.
In-suite T7 render cost (trial cost, not leaderboard ms)
| Trial | ms | Context |
| T7 r1 | 1671 | inherited lpcm 24-bit like the probe; co-agent activity for part of the window |
| T7 r2 | 1670 | same payload — byte-identical size to r1 (16,410,703 B), different hash |
| T7 r3 | 1216 | H.264 Master preset + explicit ExportAudio → AAC (15.4 MB). Within the brief's letter; flagged so the 1216 isn't read as a speed win |
What 5.2.0 changed that trials paid for — or caught
ripple_insert defaults to plan-only
Without an explicit dry_run key the execute attempt returns dry_run:true and mutates
nothing — twice caught by trials reading their own response. Mutation needs dry_run:false +
confirm token. It also defaults to video-only rows (its dry-run exposes the audio gap) and drops links
on re-created shifted items.
Probe alternation lifecycle
Consecutive pinned calls that alternate timelines run the baseline_reset/restore lifecycle:
265–1113 ms vs 10–30 ms same-context on identical geometry. The leaderboard probe column needs
the new footnote; treat 5.2.0 probe ms as context-dependent.
duplicate archives its source
A timeline.duplicate of _base created _base_archived_v02 while leaving
_base itself untouched — the archive trail can mislead a zero-mutation audit if you don't know
this rule.
Render paths smoothed and rough
TargetDir is now auto-created — the suite's mkdir allowance was never needed. But
set_settings ignore-reports are unreliable in both directions (Resolution
silently ignored; ResolveWidth/Height "ignored" yet honored), and the in-app bridge's polling is
blind on this build: no JobStatus key in job-list entries, IsRenderingInProgress()
false mid-render (its StartRendering is idempotent — 4 calls, 1 file).
Fusion names: two surfaces, two counters
Item-level get_comp_names says Composition 1; fusion_comp's
COMPS_Name carries a project-global counter — measured
Composition2 → 3 → 4 across the three T8 runs — and the global name doesn't resolve at item level.
Housekeeping traps
media_pool.get_clips isn't an action (folder.get_clips is); clip_where
takes no timeline pin; action_help has holes (ripple_insert, probe actions);
get_property multi-key returns false; wrong-key get_metadata returns
all-null; the knowledge Tool Map overflow persists to a file no-shell agents can't read. C6's
_archived_vNN siblings remain the zero-mutation witness.
Method & deviations
- Hard seal — memory dir, this repo, and prior-wave findings moved off-disk before launch, restored after
scoring; agent type has MCP tools only. Zero operator Resolve calls until every agent in a pair reported.
- Deviation — operator pre-created the three T7 target dirs (sealed agents have no shell). One T7 trial
still ran the already-satisfied
mkdir through the in-app bridge's run_script_unsafe,
against the ground-rule clause — disclosed in its report, effect nil (dir existed). Another discovered Resolve
auto-creates the missing TargetDir and used no shell at all.
- Incident annotations — the r3 T3/T4 cross-writes above: graded verified + honest (reversals complete,
disclosures unprompted); residuals are archives of intermediate states only, removed with the scratch project.
- Grading: pinned read-backs only (probe / get_items / get_track_* / get_linked_items / get_comp_count / my own
enumeration / my own ffprobe — bytes and packet counts matched agents' figures every trial).
Teardown
Scratch project _mcp_AGBench-2026-11-10g deleted after grading — all base, trial and
archive timelines went with it; library verified back to pre-wave contents. Render queue verified empty.
The three T7 outputs are kept under /Volumes/YourVolume/resolve-audio-analysis/agbench_2026-11-10g/T7r{1,2,3}/
with SHA-256 recorded in the results file.