[docs] (P7): package C's note carries the gate matrix and the three things the integrator has to decide

The per-slice red-once records were written with each slice. This adds what only exists
once the four are together: the gate table (unit 2403, magma split/spawn/tcp 75/54/56 with
the two death-case skips now gone, integration-split 187, integration-spawn 103,
full-split 513 entries 0 red 55 skipped = 458 pass against the 453/57 bar, census
unchanged, parity green, @P7 15/4 -> 13/3, ratchet 186 monotone, G1 .text 0xa52203 with
every section +0 and the pull .so byte-identical), the ratchet bucket split with an honest
note that I did not re-measure the buckets at the branch point, and a numbered list of the
nine things this package changes that live outside its own files.

Three of those nine need an integrator decision rather than a note: §5.4's white-box case
is blocked by R-6 and not by this package; §5.3's g_programResourceCaches deletion is
achieved in the disaggregated build only, because the archive member has to be guarded for
G1; and buffer-window's family word is UnmigratedVerb where ProtocolCorruption is the
honest one, which costs a row in MG_Pipe and an adapter arm that §3.3 deliberately has not
spent.
This commit is contained in:
2026-09-22 16:07:59 -04:00
parent 0acfa9aab9
commit 074a072739
+68
View File
@@ -1,5 +1,46 @@
# P7 wave 2 package C — Magma object death, resident sub-data, the reflection archive, the vertex-layout split
## For the integrator, first
Nine things this package changes that live outside its own files or outside its own slices.
`CONTRACT-P7.md` is the integrator's file (§0 "怎么改"), so none of these edit it.
1. **§12's debt row is retired.** "Magma 两进程 client 在 `StateObjectDeathOps` 落地前
`ObjectDeaths=0`;`CtWireScenario` 的死亡用例在 Magma 臂按名 skip" — the table landed, both
skip guards are deleted, and the two cases are green on `DirectVulkan.{Split,Spawn,Tcp}`.
§2.3's "Magma 自己的 `StateObjectDeathOps` 表(wave 2-C)落地前…按名 skip" can go with it.
2. **§3.1's pinned census moves: 15 sites / 4 files → 13 / 3.** `Renderer/WireDraw.inc` leaves
the list entirely. `scripts/ci/fatal_census.py` is unchanged (79 / 43 / 3 / 0) — the funnels
were already converted in wave 0, so retiring a `MagmaWireFatal` CALL moves no abort count.
3. **§3.2 says "the other six" for `vertex-layout`; there are seven.** `offset-overflow`
post-dates the audit. It is masked with the rest; the reasoning is in slice 4 below.
4. **§5.4's white-box case (opcode 49 on the wire) is not achievable at this tree**, and the
blocker is R-6, not this package. The full chain is in slice 2. The capability is wired
ahead of its consumer on purpose; `rsd=` on the PipeStats line is what will show the records
the day P11 lands an adoption tier.
5. **§5.3's `g_programResourceCaches` deletion is achieved in the disaggregated build only.**
The archive member has to be `#if MOBILEGL_BUILD_DISAGGREGATED` for G1, so the pull build
keeps the cache. One-line change the day that pin is retired. P13.
6. **A family-word question.** `buffer-window` is now a permanent protocol error going through
`MagmaWireFatal`, whose family is `UnmigratedVerb`. The honest word is `ProtocolCorruption`;
`MG_Pipe::MGPipeFatalFamily` carries only two words and its own comment says a third is
where the choice gets argued. §3.3 keeps the funnels on `UnmigratedVerb` deliberately so the
refusal census stays comparable to P5b. Flagged, not decided.
7. **Gating lane counts grow** (grow-only, G14-legal): `integration-magma-split` 73 → 75,
`-spawn` 52 → 54, `-tcp` 54 → 56, `integration-split` 186 → 187, `integration-spawn`
102 → 103, `ctest -L unit` 2402 → 2403.
8. **One ratchet symbol changes bucket** without changing the total (186, monotone green):
`p3b-p4b-espryt` 14 → 13 and `both-backends` 60 → 61, because slice 3's monolith consumer
makes `DirectVulkan.cpp` reference a frontend symbol only `DirectGLES` referenced before.
`p7-magma` — P7's own target bucket — is unchanged at 101. Nothing in this package was
aimed at gate 4; the §4.2 path to 101 → 0 is package B's `(B')`.
9. **The worktree tool leaves `MOBILEGL_ITEST_VK_ICD` empty** and CMake warns about it; every
Magma entry then runs whatever ICD the loader finds first. This package reconfigured
`build-split` with `/usr/share/vulkan/icd.d/lvp_icd.json`, the pin `~/w7/pipe/build-split`
already carries. Worth adding to `p7_worktree.sh` so the next package does not have to
notice it.
Base: `p7/magma-c` off `feat/disaggregated @ a686131e` (pipe HEAD at branch time).
Build: `build-split` = `-DMOBILEGL_BUILD_DISAGGREGATED=ON -DMOBILEGL_BUILD_DISAGGREGATED_INPROC=ON
-DMOBILEGL_PIPE_PUSH=ON -DMOBILEGL_BUILD_INTEGRATION_TEST=ON`, ICD pinned to
@@ -10,6 +51,33 @@ Contract rows: CONTRACT-P7 §5.5 (`StateObjectDeathOps`), §5.4 (OQ-10), §5.3 (
(`vertex-layout`, `vertex-format-conversion`). Discipline: rule I (no `std::abort()` on a Magma
wire arm), rule J / R-16 (every fix red once on a two-process arm first).
## Gates, on the four slices together
| gate | base (`a686131e`) | after | |
|---|---|---|---|
| `ctest -L unit` | 2402 | **2403 / 2403** | +1 = the OQ-8 order case |
| `integration-magma-split` | 73 (71 P + 2 S) | **75 / 75, 0 skipped** | +2 vertex-layout; the 2 skips were the death cases |
| `integration-magma-spawn` | 52 (50 + 2) | **54 / 54, 0 skipped** | |
| `integration-magma-tcp` | 54 (52 + 2) | **56 / 56, 0 skipped** | |
| `integration-split` | 186 | **187 / 187** | +1 = the OQ-10 capability case |
| `integration-spawn` | 102 | **103 / 103** | |
| `integration-magma-full-split` | 453 P / 57 S / 0 red | **513 entries, 0 red, 55 skipped → 458 P / 55 S** | better on both counts |
| `scripts/ci/fatal_census.py` | 79 / 43 / 3 / 0 | **79 / 43 / 3 / 0** | unchanged, as expected |
| `scripts/ci/spawn_lane_parity.py` | green | **green** | all tiers equal after normalisation |
| `grep -rn "@P7"` | 15 sites / 4 files | **13 / 3** | `WireDraw.inc` leaves the list |
| `link_ratchet.py --assert-monotone` | 186 | **186, "unchanged"** | green |
| **G1** (`build-linux`, pull) | `.text` `0xa52203` | **`.text` `0xa52203` (10822147, +0)** | `.data`/`.bss`/`.rodata`/total all +0; 27837 → 27837 defined symbols, **0 added / 0 removed / 0 resized / 0 renamed**; the `.so` is byte-identical on disk (19143824) |
**Ratchet buckets.** AFTER: `p7-magma` **101**, `p3b-p4b-espryt` **13**, `both-backends` **61**,
`p6-core` **11**, total **186**. CONTRACT-P7 §4.1 records the `852e3c28` baseline as
101 / 14 / 60 / 11. So one symbol sits in `both-backends` that the baseline recorded under
`p3b-p4b-espryt`; the total, the monotone assertion and **P7's own target bucket (101)** are all
unchanged. HONESTY NOTE: I did not separately re-measure the buckets at `a686131e`, so I cannot
attribute that single move to this package rather than to the two commits between the baseline
and this branch point. Nothing here was aimed at gate 4 — §4.2's path from 101 to 0 is package
B's `(B')`. (An attempt to identify the mover by rebuilding one object at the base failed to
compile and was abandoned; the clean way is `--bucket --verbose-buckets` on a base build.)
---
## Slice 1 — Magma `StateObjectDeathOps` (§5.5)