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

85 lines
4.9 KiB
Markdown

# SceneFX ABI/package audit fixture
**EXPERIMENTAL / PRESERVED EVIDENCE / no production integration.**
Read the [protocol](../../../docs/design/STEP20C_SCENEFX_ABI_PACKAGE_FEASIBILITY.md).
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.
```sh
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.