swayfx-mosaic/tooling/probes/step20c-scenefx-abi-package/README.md

4.9 KiB

SceneFX ABI/package audit fixture

EXPERIMENTAL / PRESERVED EVIDENCE / no production integration. Read the protocol. Private sources/builds/results must stay outside Git. No script may launch a compositor, use desktop IPC, install system files or change package contracts. Budgets: one stock reconstruction/stage, one private shared chain, optionally one static chain after source inspection. ELF checks are diagnostics only. Generated artifacts and manifests stay in LAB.

Build-only reproduction

Use a full Mosaic clone containing the fixed commits, installed stock build prerequisites and local Git object stores containing pinned SceneFX and wlroots. prepare.py does not fetch or install missing dependencies. It archives exact objects, applies retained private patches in new copies, and logs each bounded build command. Create a new LAB under your home directory, outside this clone. A LAB can be prepared only once; a failed preparation consumes that attempt. Do not bypass the ticket's build budget with another directory.

python tooling/probes/step20c-scenefx-abi-package/prepare.py LAB \
  --scenefx-git /path/to/scenefx-object-store \
  --wlroots-git /path/to/wlroots-object-store --static
python tooling/probes/step20c-scenefx-abi-package/audit.py LAB
python tooling/probes/step20c-scenefx-abi-package/summarize.py LAB

--static is optional and requires the source-audit decision documented in this ticket. --pristine-binary optionally accepts only the A campaign's SHA-256-qualified retained pristine executable; otherwise its ELF comparison is NOT TESTED. A newly reproduced baseline binary needs its own provenance qualification, not substitution under that historical identity. The retained completed LAB is /home/fy59/swayfx-mosaic-abi-package-tp22xfwm. Its optional static trial was exercised once; no new run/build is authorized by these instructions for this completed ticket.

audit.py checks complete stage entries including symlinks, recipe digests, ELF headers/symbols/version requirements, loader paths and relocations, public header differences, C17 struct-layout observers and compiler dependencies. It runs only diagnostic loader modes and small non-graphical layout/version observers. It never runs a compositor entry point. ldd -r diagnostics are checked even when its status is zero. Its stock-versus-private process library paths are temporary and recorded. Required tools: cc, Meson/Ninja, pkg-config, readelf, nm, objdump, the native x86-64 glibc loader, ldd and read-only Arch package metadata (pacman -Qi; no package installation). Other platforms are NOT TESTED, rather than silently inferred compatible.

summarize.py records measured S0/S1 results separately from inferred architectural options. Static loader success does not establish graphics, semantic ABI, future updates or licensing clearance. All generated JSON/logs/source archives/builds remain in LAB.

Completed result

Current package: CURRENT_PACKAGE_STAGE_PASS, exactly one regular ELF /usr/bin/swayfx-mosaic, stock dynamic dependencies, no clip references. Shared private binary with stock SceneFX: INCOMPATIBLE_WITH_STOCK_SCENEFX, two missing strong clip symbols despite the common SONAME. Shared private resolution and static embedding pass non-graphical build/model/loader checks. Seventeen layouts and six selected offsets match; 85 exports overlap wlroots. Stock/private/static wlroots scene bindings are retained, including the mix between SceneFX providers and wlroots helpers. Distinct private SONAME, future-version safety, GPU lifetimes and graphical behavior are NOT TESTED.

Overall PARTIALLY_FEASIBLE; architecture SCENEFX_ABI_PACKAGE_REQUIRES_ARCHITECTURAL_DECISION. No packaging option is adopted. The historical campaign is closed; STEP20C NEXT and production multi-output NOT YET SUPPORTED. seal.py LAB refuses existing manifests; seal.py LAB --verify verifies all entries without regenerating. Derive all evidence and finalize fixtures before sealing. Report and complete diff are captured outside the sealed inventory to avoid self-referential digest dependencies.

ABI evidence freeze

The October 2026 freeze verifies the original 1,463 source entries and 204 evidence entries without rerunning the campaign. Their manifest hashes remain a27fa33d57d3423e09f02430f04cfed643762d876099b7f88489229115c4a1e5 and 86f7654c8ad962053644ce2c4c13eb9f026d6618b171e0cc3a8fc3034eb380d5. This README's publication wording changed after verification. To verify the sealed historical source manifest subsequently, map only its README entry to the exact pre-freeze snapshot recorded in the report. Do not regenerate the manifest or substitute other source files. Python fixture bytes are unchanged. The old report's A/B labels refer to its earlier ticket, not the new static distribution-contract phase. That later phase must remain local.