Files
MobileGL/scripts/ci/fatal_census_baseline.json
T
swung0x48 e1ec69341a [MG_Pipe, MG_Backend, MG_Remote, MG_Test, scripts] (P7): the Magma wire fatals and the two Staged aborts go through Session::Fail
Five deaths in the split server image raised their own std::abort(). Three of them are
funnels - MagmaWireFatal (Renderer/WireFramebuffer.inc), WireDescriptorFatal
(Renderer/UniformManager.cpp) and WireBufferLegacyFatal (Renderer/WireDraw.inc) - and the
fifteen `@P7` refusals on the tree (8 in UniformManager.cpp, 4 in WireFramebuffer.inc, 2 in
WireDraw.inc, 1 in VulkanRenderer.cpp; plan section 1.3's count confirmed) all die through
two of them. Every one of those deaths published NO SessionFault frame, so the peer read a
bare EOF; bumped NO SessionFaultCount(), so exit gate S8 could neither confirm nor falsify
it; and carried a hand-typed family word with no path to FatalFamilies.def's projection.

MG_Backend may not name an MG_Remote symbol on its own account, so the route is a seam in
MG_Pipe with MGP_TRIP_WIRE_REPORT's shape (PipeApply.cpp:66, and the new code sits beside
it): MG_Pipe/PipeSessionFail.h declares MGPipeSessionFail, PipeApply.cpp defines it inside
`#if MOBILEGL_BUILD_DISAGGREGATED`, the DEFAULT behaviour is byte-identical to what the
three funnels did on their own, and MG_Remote::InstallPipeSessionFailHook() points it at
SessionFail. The install is in InitServerRoleCommon (MG_Backend/Init.cpp), step 0, because
that is the one function BOTH server roles run - the inproc role and the spawn/TCP session
child - so there is no per-transport install to get wrong.

MGPipeFatalFamily is a two-value boundary enum, NOT MGFatalFamily cast to an integer: the
.def's enumerators are positional and a row inserted in its middle would silently re-point
every hook call at a different family. FatalFunnel.cpp's adapter is the one place the two
vocabularies meet, as a switch with a named default.

The family word stays UnmigratedVerb rather than becoming a new MagmaWireRefusal. Three
reasons: the message strings are required to stay byte-identical (5.2), and the retrace
refusal censuses recorded since P5b count these deaths by that word - a rename invalidates
every `@P7` measurement taken against them; `Magma:` in the detail already separates the
Magma arm from the GLES UnmigratedVerb deaths, so a new word adds no discrimination a grep
does not have; and its wire projection would be ProtocolCorruption, exactly UnmigratedVerb's.
Recorded for the integrator.

Ph slice (2) in the same commit: Server/StagedShadow.h's RequireCovered and
Server/StagedTextureStore.h's RequireLevelBytes were MGLOG_F + bare abort. Both are inside
MG_Remote already, so they call SessionFail directly, message verbatim;
check_include_closure.py's four probes do not reach either header and the gate is green.

Census: 83 abort sites -> 79 over 20 files (five sites retired, one gained for the seam's
no-hook default, which is argued into FUNNEL_SITES), baseline rewritten in this commit - the
downward ratchet's notice is what asked for it. Two gate bugs the widening exposed and this
commit fixes: the SessionFail call regex also matched `MGPipeSessionFail(` (a lookbehind
now), and a funnel's anchor needed a wider window than a marker's (kFunnelAnchorWindow).

Red-once, three ways. Pointing MagmaWireFatal back at its own abort reds the census naming
WireFramebuffer.inc 0 -> 1. Making the seam skip the hook reds both new death cases -
`TheMagmaWireVerbDeathReachesSessionFailAndBumpsTheFaultCount` on the exit code, because it
reads SessionFaultCount() out of a SIGABRT handler and gets 0 instead of 1, and
`TheSeamHandsTheInstalledHookItsFamilyAndItsLineVerbatim` on the line the hook echoed.
2026-09-22 14:01:06 -04:00

71 lines
2.2 KiB
JSON

{
"abort_sites": 79,
"abort_sites_by_file": {
"MobileGL/MG_Backend/DirectGLES/DirectGLES.cpp": 15,
"MobileGL/MG_Backend/DirectGLES/Managers.cpp": 12,
"MobileGL/MG_Backend/DirectGLES/MultiDraw.cpp": 2,
"MobileGL/MG_Backend/DirectGLES/Utils.cpp": 1,
"MobileGL/MG_Backend/DirectVulkan/DirectVulkan.cpp": 2,
"MobileGL/MG_Backend/DirectVulkan/Renderer/MagmaPipeArms.h": 1,
"MobileGL/MG_Backend/DirectVulkan/Renderer/VkBufferManager.cpp": 11,
"MobileGL/MG_Backend/Init.cpp": 2,
"MobileGL/MG_Backend/MGPipe/PipeInputs.cpp": 3,
"MobileGL/MG_Impl/Pipe/PipeFill.cpp": 5,
"MobileGL/MG_Impl/Pipe/ResourceTracker.h": 5,
"MobileGL/MG_Impl/Pipe/SlotAllocator.cpp": 2,
"MobileGL/MG_Pipe/PipeApply.cpp": 4,
"MobileGL/MG_Pipe/PipeRoute.cpp": 7,
"MobileGL/MG_Pipe/generated/PipeFilled.inc": 1,
"MobileGL/MG_Pipe/generated/PipeWire.inc": 1,
"MobileGL/MG_Remote/FatalFunnel.cpp": 1,
"MobileGL/MG_Remote/Transport/WireLog.cpp": 1,
"MobileGL/MG_State/GLState/BufferState/BufferObject.cpp": 2,
"MobileGL/MG_State/GLState/TextureState/MipmapStorage.cpp": 1
},
"families": [
"ApplyThreadJoinTimeout",
"ApplyThreadNotRunning",
"ArchiveEmpty",
"ArtefactsMissing",
"BarrierTimeout",
"BarrierViolation",
"BlobMissing",
"ClientTablesUninstalled",
"ConsumerMaskLie",
"EventRingOverflow",
"NoClientSession",
"PipeLegacyMemosDisabled",
"PipeVerifyBadKnob",
"PipeVerifyDiffer",
"PresentCreditTimeout",
"ProtocolCorruption",
"ReadbackDeclined",
"ReadbackReplyShort",
"ReplyError",
"ReplyMismatched",
"ReplyMissing",
"ReplyOverrun",
"ReplyStatusInvalid",
"ReplyToNoSlot",
"ReplyTooLarge",
"ResidualBlockSize",
"ResourceUnavailable",
"RetirementWaitFailed",
"RingOverrun",
"RoleViolation",
"StageSnapshotTooNarrow",
"UncarriedInitialBytes",
"UnexpectedMapAccept",
"UnimplementedAdoptTier",
"UnimplementedClientSession",
"UnimplementedWritebackWait",
"UnmigratedEmulation",
"UnmigratedPipeInput",
"UnmigratedSurface",
"UnmigratedVerb",
"UnnamedIdentity",
"UnsetCallMask",
"UnsizedReadback"
]
}