# The Fatal{UnmigratedPipeInput} pairs the dual-block lane ACTUALLY PRODUCES under
# MOBILEGL_IPC_ROLE_SPLIT_STATE=1 + MOBILEGL_IPC_STRICT_ERRORS=1, one `<field>@<verb>` per line.
#
# P5f (f1), P5F-WIRE-COMPLETENESS.md §4. This is the strict-expected-markers.txt shape turned
# around: the strict lane ratchets ADMITTED pulls (debts a phase has agreed to leave standing);
# this file ratchets the FATAL census of the dual-block rehearsal, which is the full list of
# "this read only ever worked because both roles shared one gPipeInputs". Every entry in the
# census lane aborts on its FIRST such read, so the pairs below are first-blockers, and retiring
# one advances the entry to its next one - the file shrinks package by package (fm/fs/fr/fv)
# and P5f's exit is this file empty with the lane green.
#
# TWO-SIDED, same rule as the strict file (ID-119): split_log_paths.py's `expect-fatal` mode
# fails when a pair appears that is not listed here AND when a pair listed here no longer
# appears. Remove a row in the commit that retires it.
#
# HOW TO REFRESH (never by hand from a guess):
#   ctest --test-dir build-split -L 'integration-split|integration-magma-split' \
#       --show-only=json-v1 > lane.json
#   # reset the private logs, then:
#   MOBILEGL_IPC_ROLE_SPLIT_STATE=1 MOBILEGL_IPC_STRICT_ERRORS=1 \
#       ctest --test-dir build-split -L 'integration-split|integration-magma-split' -j 4 \
#       --output-junit dualblock.xml
#   python3 MobileGL/MG_IntegrationTest/Harness/split_log_paths.py expect-fatal \
#       lane.json dualblock.xml this-file
# and put the census it prints here.
#
# ---------------------------------------------------------------------------------------------
# INITIAL CENSUS (f1, measured on the WSL gate tree ~/w7/p5f-f1 at cfcc12f7, 2026-09-19:
# 181 lane entries [-L 'integration-split|integration-magma-split'], 155 red, EVERY red entry
# carrying one of the pairs below in its private log - zero unnamed crashes; 22 green entries
# are the monolith-arm and the no-pulled-read scenarios, 4 skips are the two PersistentMapArm-
# and two StrictArming-only cases skipping outside their own lanes, all by design).
# Entry counts are first-blocker counts: an entry aborts on its FIRST pulled read, so retiring
# a row advances those entries to their next one. See docs/Disaggregated/notes/p5f/f1-report.md.
# ---------------------------------------------------------------------------------------------
#
# Espryt's readback path reads the framebuffer binding slot out of the block (the field's
# Espryt half retired at P5e for the UNBARRIERED path only; the barriered readback pull is the
# residual). The largest block of the census by far.
#   132 entries
GetFramebufferBindingSlot@ReadPixels
# The XFB program check at draw setup (FieldOwnership.def: "P3b/P4b (Espryt), P7 (Magma)").
#   11 entries (the TessellationXfbCapture / XfbCaptureBufferReuse family)
GetTransformFeedbackProgram@DrawArrays
# CopyImageSubData resolves both textures through the sticky forward (def: "P7").
#    6 entries
GetTextureObject@CopyImageSubData
# Magma's Clear path (the two DirectVulkan.Split.NamedBlit entries) - fm's first rows.
#    2 entries
GetFramebufferBindingSlot@Clear
# CopyTexImage2D's texture-unit read (def: "P5e (Espryt unbarriered), P7 (Magma)").
#    2 entries
GetTextureUnitObject@CopyTexImage2D
# The program-name validation sticky forward at ShaderStorageBlockBinding (def: "P9").
#    2 entries
ValidateProgramName@ShaderStorageBlockBinding
