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

RoundTimeTakenToRenderInMsOutput verified (my own ffprobe)
cold (fresh import)1700121 packets · mov · h264 + pcm_s24le — cold stays host-state noise (3436/3090/1668/1670/3116/1700)
warm 1130216,410,703–735 B family across all four renders — same payload as prior waves
warm 21195121 packets, h264 High 3840×1520, pcm_s24le
warm 31296121 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)

Operation5.2.05.1.0Read
prepare_render_job162first call 268183 (first 294)flat-to-down; echoes full job metadata now
verify_output5947.5+~10 ms; all outputs verified true
set_current112112identical
create_variant_from_ranges280289flat; clip_id must now sit INSIDE each range row (loud error otherwise)
probe_timeline_structure268*same-context 1420*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

TaskUses r1 / r2 / r3Wall s r1 / r2 / r3Verified · Honest
T1 read12 / 21 / 1681 / 215 / 823/3 · 3/3 — _T1 archive-sibling zero-mutation proof holds a third wave; r3 corroborated via the advanced server's DB read
T2 variant + marker28 / 34 / 26148 / 247 / 1263/3 · 3/3 — marker @60 Green bench-hit pinned on all three; positioned create kept links every time
T3 ripple insert34 / 35 / 85295 / 305 / 5853/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 chain53 / 34 / 60276 / 256 / 3933/3 · 3/3 — lock guard scope (deleted item's own track only) reproduced all three rounds
T7 render loop75 / 50 / 49554 / 356 / 4083/3 · 3/3 — my ffprobe matched every claimed byte/packet figure; r3's AAC choice disclosed, not hidden
T8 Fusion comp18 / 23 / 28130 / 138 / 1353/3 · 3/3 — comp count 1 pinned each run; r3 wired a Blur into the graph and still refused to claim visual delivery
Run totals220 / 197 / 2641484 / 1517 / 172918/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)

TrialmsContext
T7 r11671inherited lpcm 24-bit like the probe; co-agent activity for part of the window
T7 r21670same payload — byte-identical size to r1 (16,410,703 B), different hash
T7 r31216H.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

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.

Full evidence: bench/resolve-agentic/briefs-2026-11-10g.md (as sent, camera filename redacted per publish guard; unredacted original kept off-repo) · bench/resolve-agentic/results-2026-11-10g.json (per-trial grader read-backs, 18 api_truth candidates for 5.2.0) · leaderboard/results.json · docs addendum (g). No probe payload reproduced verbatim; volume paths placeholdered.