From 851251671c756f3b4b78d8944ecb55748069381a Mon Sep 17 00:00:00 2001 From: Swung0x48 Date: Tue, 6 Oct 2026 13:13:39 -0400 Subject: [PATCH] [CI] (P13 W5 S4): an include-closure probe keeps the record core clear of MG_Remote and the wire serializer. --- .github/workflows/test.yml | 4 ++-- scripts/check_include_closure.py | 29 ++++++++++++++++++++++++++++- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index c1b7c0e5..92034645 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -2386,13 +2386,13 @@ jobs: run: sudo apt-get update && sudo apt-get install -y clang-20 libx11-dev - name: Include-closure check and self-test - # --expect-probes 4 (contract-v2.md 7.6): an exit code cannot tell four probes from none, + # --expect-probes 5 (contract-v2.md 7.6; P13 W5 adds record-core): an exit code cannot tell five probes from none, # so a --probe typo or a manifest edit that selected nothing would run zero probes and # exit 0 - the second half of the finding that added the flag. The count is the length of # scripts/check_include_closure.py's PROBES list and changing one means changing the other. # # Use the compiler selected for this runner's installed toolchain. - run: python3 scripts/check_include_closure.py --mode both --compiler "${MOBILEGL_CI_CXX}" --self-test --require-all --expect-probes 4 + run: python3 scripts/check_include_closure.py --mode both --compiler "${MOBILEGL_CI_CXX}" --self-test --require-all --expect-probes 5 benchmark: runs-on: ubuntu-latest diff --git a/scripts/check_include_closure.py b/scripts/check_include_closure.py index eea448d5..eb72b34f 100644 --- a/scripts/check_include_closure.py +++ b/scripts/check_include_closure.py @@ -23,6 +23,7 @@ and P7 have to be able to sever. So the arbiter here is the preprocessor's own Config.h, MG_Backend/, BufferState/, ProgramState/Shader* (+ <= 2 `glslang::`) wire-header MG_Remote/Transport/ITransport.h MobileGL/Includes.h + record-core MG_Impl/Pipe/Verb/VerbPort.h (+ the record core) MG_Remote/ 3rdparty/flatbuffers/ The forbidden sets deliberately say nothing about glslang, spirv-cross or vulkan: MobileGL/Includes.h pulls all three unconditionally (:53,:56,:59,:80-84,:130) and both @@ -53,7 +54,7 @@ four probes from none. The campaign gate spells `--compiler clang++`: there is n python3 scripts/check_include_closure.py --mode text --self-test python3 scripts/check_include_closure.py --mode both --compiler clang++ --self-test - python3 scripts/check_include_closure.py --mode both --self-test --require-all --expect-probes 4 + python3 scripts/check_include_closure.py --mode both --self-test --require-all --expect-probes 5 """ import argparse @@ -142,6 +143,32 @@ PROBES = [ "Why": "WireLog.h:9-24 states the rule: nothing about a byte pipe needs the GL " "frontend's umbrella header. Green today - it is the gate's own canary.", }, + { + "Name": "record-core", + "Header": "MobileGL/MG_Impl/Pipe/Verb/VerbPort.h", + "Tu": "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n" + "#include \n", + "Forbidden": [ + "MobileGL/MG_Remote/", + "3rdparty/flatbuffers/", + ], + "Allow": [], + "TextLimits": {}, + "Why": "P13 W5: the record arm runs in a library without a transport (the FCL-embedded " + "build), so the record core - the verb port, the record verb sink, the staged " + "stores, the persistent-map tracker and the MG_Pipe seams they die and latch " + "through - may not reach MG_Remote or the wire's serializer even under an #if; " + "the seams (PipeSessionFail.h, PipeClientSeam.h, ApplyRoleBackend.h) are the " + "only way across.", + }, ] # Deleting a probe must be red, not quietly green.