docs(mosaic): record Gate 2 V5 allocator failure and publication policy
This commit is contained in:
parent
7216eb5518
commit
ccd534132d
4 changed files with 419 additions and 1 deletions
13
AGENTS.md
13
AGENTS.md
|
|
@ -97,6 +97,10 @@ Resolve contradictory canonical documents **before** implementing behavior.
|
||||||
3. Use existing C, Sway/wlroots/SceneFX conventions. Keep ownership/lifetimes,
|
3. Use existing C, Sway/wlroots/SceneFX conventions. Keep ownership/lifetimes,
|
||||||
container identity, popup hierarchy, pending/current state and output
|
container identity, popup hierarchy, pending/current state and output
|
||||||
coordinates explicit. Add regression tests for changed behavior.
|
coordinates explicit. Add regression tests for changed behavior.
|
||||||
|
For Python probe tools, use readable PEP 8 formatting, short functions and
|
||||||
|
docstrings explaining effects and refusals. Comment design/ownership
|
||||||
|
invariants and explicit error handling; keep offline tests reproducible and
|
||||||
|
independently reviewed without starting native workloads.
|
||||||
4. Build and test in isolated build directories; never install, reload,
|
4. Build and test in isolated build directories; never install, reload,
|
||||||
restart or replace the **running desktop session**. Never operate on the
|
restart or replace the **running desktop session**. Never operate on the
|
||||||
live Sway IPC socket. Headless tests must use their own `XDG_RUNTIME_DIR`,
|
live Sway IPC socket. Headless tests must use their own `XDG_RUNTIME_DIR`,
|
||||||
|
|
@ -146,7 +150,14 @@ Resolve contradictory canonical documents **before** implementing behavior.
|
||||||
checksum. The exporter validates before atomic replacement and must leave
|
checksum. The exporter validates before atomic replacement and must leave
|
||||||
the previous artifact intact on failure. Never force-apply hunks.
|
the previous artifact intact on failure. Never force-apply hunks.
|
||||||
- Do not modify git history, branches, remotes or package version/pins without
|
- Do not modify git history, branches, remotes or package version/pins without
|
||||||
an explicit scoped reason. **No commit or push unless the user requests it.**
|
an explicit scoped reason. For this repository, Codex must commit each
|
||||||
|
coherent batch after documentation, applicable tests and independent review,
|
||||||
|
then push origin followed by github and verify that both remote branch SHAs
|
||||||
|
match the intended commit. This permanent user instruction excludes force
|
||||||
|
pushes, upstream pushes, history rewriting, other repositories, private
|
||||||
|
evidence, personal identifiers, secrets/credentials, binaries, raw logs,
|
||||||
|
large files and unvalidated PASS claims. It grants no production change,
|
||||||
|
native execution or sandbox expansion beyond the current task's scope.
|
||||||
|
|
||||||
## Required handoff after each task
|
## Required handoff after each task
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,12 @@
|
||||||
# Documentation
|
# Documentation
|
||||||
|
|
||||||
|
[Gate 2 headless boot](design/STEP20C_HEADLESS_BOOT_GATE2.md) records the single
|
||||||
|
V5 native failure: EXPERIMENTAL / PRISTINE_ALLOCATOR_BLOCKED / CORE_NOT_RUN,
|
||||||
|
without private IPC or rendering proof. The [allocator triage](design/STEP20C_HEADLESS_ALLOCATOR_TRIAGE.md)
|
||||||
|
distinguishes source inference from observed failure; any new native experiment
|
||||||
|
requires separate approval. STEP20C remains NEXT; production multi-output
|
||||||
|
NOT_YET_SUPPORTED.
|
||||||
|
|
||||||
The [CORE-C V2 follow-up decision V4](design/STEP20C_COREC_V2_INTEGRATION_DECISION_V4.md)
|
The [CORE-C V2 follow-up decision V4](design/STEP20C_COREC_V2_INTEGRATION_DECISION_V4.md)
|
||||||
records PARTIALLY_ADVANCED private evidence: five consumed runs, 32 output
|
records PARTIALLY_ADVANCED private evidence: five consumed runs, 32 output
|
||||||
captures, migration/refocus and root/nested OOM SAMPLED_ONLY / PARTIALLY_FEASIBLE.
|
captures, migration/refocus and root/nested OOM SAMPLED_ONLY / PARTIALLY_FEASIBLE.
|
||||||
|
|
|
||||||
91
docs/design/STEP20C_HEADLESS_ALLOCATOR_TRIAGE.md
Normal file
91
docs/design/STEP20C_HEADLESS_ALLOCATOR_TRIAGE.md
Normal file
|
|
@ -0,0 +1,91 @@
|
||||||
|
# STEP20C — headless allocator triage
|
||||||
|
|
||||||
|
Status: **EXPERIMENTAL / PRISTINE_ALLOCATOR_BLOCKED / CORE_NOT_RUN**.
|
||||||
|
This is a source-based triage of the [V5 native failure](STEP20C_HEADLESS_BOOT_GATE2.md),
|
||||||
|
not a renderer repair or a new native authorization. STEP20C remains NEXT;
|
||||||
|
production multi-output NOT_YET_SUPPORTED. No compositor, build, IPC, device,
|
||||||
|
scope or production change is authorized by this note.
|
||||||
|
|
||||||
|
## Observed result and source boundary
|
||||||
|
|
||||||
|
The single approved V5 pristine run failed after 0.361879 seconds, before
|
||||||
|
private IPC, with oracle null. Its first allocator error was ENOENT opening
|
||||||
|
`/dev/udmabuf` in the private `/dev`; allocator creation then failed.
|
||||||
|
CORE has no ATTEMPT and is CORE_NOT_RUN. The preceding Mesa software-rendering
|
||||||
|
warning is not established as fatal. No effective renderer/backend capability
|
||||||
|
masks, EGL provider or selected native device identity were recorded.
|
||||||
|
|
||||||
|
Static inspection used pristine source archives without `.git`, at these
|
||||||
|
retained pins. Twelve inspected SceneFX/wlroots files match the corresponding
|
||||||
|
Git commit objects; this proves neither binary reproducibility nor live capabilities:
|
||||||
|
|
||||||
|
- [SwayFX fd71a6bdc061bd633b488ae7b83e8a6981d22f86](https://github.com/wlrfx/swayfx/blob/fd71a6bdc061bd633b488ae7b83e8a6981d22f86/sway/server.c#L283):
|
||||||
|
`server.c:283` directly calls `fx_renderer_create`; `:305` calls the allocator.
|
||||||
|
- [SceneFX 37ccd723bef49e6891156ffafce8f549f01446cc](https://github.com/wlrfx/scenefx/tree/37ccd723bef49e6891156ffafce8f549f01446cc):
|
||||||
|
`render/fx_renderer/{util.c,fx_renderer.c,fx_framebuffer.c,fx_offscreen_buffers.c}`
|
||||||
|
and `render/egl.c` govern the FX path described below.
|
||||||
|
- [wlroots d783533489e1f75d6886c2ab5c5960090ef268f8](https://gitlab.freedesktop.org/wlroots/wlroots/-/tree/d783533489e1f75d6886c2ab5c5960090ef268f8):
|
||||||
|
`render/allocator/{allocator.c,shm.c,udmabuf.c}`, `render/pixman/renderer.c`,
|
||||||
|
`util/shm.c` and `backend/{headless,multi}/backend.c` govern selection.
|
||||||
|
|
||||||
|
## Allocation contract inferred from those sources
|
||||||
|
|
||||||
|
`open_preferred_drm_fd` honors `WLR_RENDERER_FORCE_SOFTWARE=1` before render-node
|
||||||
|
selection, preserving FD -1 on this creation path. SceneFX then calls
|
||||||
|
`wlr_egl_create_with_drm_fd`; its negative-FD path selects an EGL device with
|
||||||
|
`EGL_MESA_device_software` and allows software. GBM fallback requires FD >= 0.
|
||||||
|
This explains the intended software route, not the effective V5 EGL identity.
|
||||||
|
|
||||||
|
`fx_renderer_create_egl` initializes `render_buffer_caps` to DMABUF only.
|
||||||
|
SHM/DATA_PTR texture import is a separate capability, not SHM render-target
|
||||||
|
support. `fx_framebuffer.c:138` rejects targets without `wlr_buffer_get_dmabuf`.
|
||||||
|
Headless advertises DMABUF, SHM and DATA_PTR; the multi backend intersects
|
||||||
|
capabilities of presenting backends. Actual V5 masks remain unmeasured.
|
||||||
|
|
||||||
|
Allocator predicates test **nonempty bit intersections**, not containment of
|
||||||
|
all bits in a combined mask. In source order, with B = backend caps,
|
||||||
|
R = renderer render-buffer caps, D = selected allocator DRM FD:
|
||||||
|
|
||||||
|
| Candidate | Eligibility predicate, before compiled-feature/create failures |
|
||||||
|
| --- | --- |
|
||||||
|
| GBM | `(B & DMABUF) && (R & DMABUF) && D >= 0` |
|
||||||
|
| SHM | `(B & (SHM \| DATA_PTR)) && (R & (SHM \| DATA_PTR))` |
|
||||||
|
| DRM dumb | `(B & (DMABUF \| DATA_PTR)) && (R & (DMABUF \| DATA_PTR)) && D >= 0 && drmIsMaster(D)` |
|
||||||
|
| UDMABUF | `(B & (DMABUF \| SHM)) && (R & (DMABUF \| SHM)) && D < 0` |
|
||||||
|
|
||||||
|
Thus headless + FX DMABUF-only + negative FD skips SHM and reaches UDMABUF
|
||||||
|
when compiled in. `udmabuf.c:146` opens `/dev/udmabuf` with `O_RDWR | O_CLOEXEC`.
|
||||||
|
That source path is consistent with the observed failure; it is not a runtime
|
||||||
|
capture of every predicate. Host metadata reports root:kvm mode0660 and the
|
||||||
|
user outside kvm. Metadata grants no authority to open or expose the device,
|
||||||
|
change permissions/group membership, or broaden the sandbox.
|
||||||
|
|
||||||
|
## Decision matrix
|
||||||
|
|
||||||
|
| Route | Evidence | Hypothesis / future test | Risk / disposition |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| Existing software FX | Negative-FD EGL route; DMABUF render targets; UDMABUF ENOENT observed | Measure provider, FD and format/capability sets in a separately approved FX-only helper | Software EGL alone does not supply a compatible allocator; BLOCKED |
|
||||||
|
| Pixman + SHM | Pixman advertises DATA_PTR; SHM allocator uses `shm_open`, unlink, `ftruncate`, `mmap` | A writable private `/dev/shm` could serve this distinct allocator route without a physical device | No FX compatibility proof; not a substitute pristine control |
|
||||||
|
| `WLR_RENDERER=pixman` alone | SwayFX directly creates SceneFX; `fx_get_renderer` asserts FX, including offscreen buffers | Any private renderer/compositor change needs a separate design and approval | Environment override cannot replace this FX contract |
|
||||||
|
| Host UDMABUF / DRM | Device-opening source requirement; no approved exposure | No device experiment proposed here | Sandbox expansion excluded; no workaround promised |
|
||||||
|
|
||||||
|
## Smallest next experiment to authorize
|
||||||
|
|
||||||
|
Offline validation passes eight cases executing the verbatim allocator-selection
|
||||||
|
function compiled as C17 with inert callees, plus six static FX/Pixman/call-site/
|
||||||
|
framebuffer assertions. No device was opened and no EGL was initialized. These
|
||||||
|
checks validate source selection, not effective EGL identity or target allocation.
|
||||||
|
|
||||||
|
The next runtime decision would require a **new explicit approval** for one
|
||||||
|
small EGL/FX-only helper, without compositor, IPC, systemd scope or host-device
|
||||||
|
exposure. Before execution, review exact pinned sources/library identities,
|
||||||
|
helper code, fixed deadline, output/resource bounds and cleanup. Use fresh
|
||||||
|
private temporary/runtime storage and private `/dev/shm`; never reuse a V5 LAB
|
||||||
|
or reservation. Record EGL provider/software-device identity, FD < 0,
|
||||||
|
backend/render/texture caps and render-target formats; refuse device fallback,
|
||||||
|
missing identity or incompatible allocation. No retries or automatic escalation.
|
||||||
|
|
||||||
|
This helper is a proposal, NOT_RUN: measuring EGL identity/caps/formats cannot
|
||||||
|
resolve an absent allocator and would not qualify boot, rendering or CORE. If it finds no compatible allocation under the existing containment,
|
||||||
|
retain PRISTINE_ALLOCATOR_BLOCKED / CORE_NOT_RUN and report the limitation;
|
||||||
|
any renderer or sandbox design change needs its own scoped decision.
|
||||||
309
docs/design/STEP20C_HEADLESS_BOOT_GATE2.md
Normal file
309
docs/design/STEP20C_HEADLESS_BOOT_GATE2.md
Normal file
|
|
@ -0,0 +1,309 @@
|
||||||
|
# STEP20C — Gate 2 headless boot preparation
|
||||||
|
|
||||||
|
Status: **EXPERIMENTAL**. V4 pristine: **FAIL before compositor**;
|
||||||
|
V4 CORE: **NOT_RUN**. V5 native: **PRISTINE_ALLOCATOR_BLOCKED / CORE_NOT_RUN**.
|
||||||
|
The separately approved single V5 sequence consumed its pristine reservation;
|
||||||
|
CORE was never attempted. No sequence PASS, private IPC or rendering proof was
|
||||||
|
obtained. Historical preparation verdicts below are pre-attempt evidence.
|
||||||
|
Any future native attempt requires a new LAB, budget and explicit approval.
|
||||||
|
|
||||||
|
## V5 first native outcome — 2026-10-17
|
||||||
|
|
||||||
|
The reviewed V5 fixture ran once from the approved app.slice launcher after
|
||||||
|
preflight of 12 fixture hashes, 92 manifested files and 98 ELF identities.
|
||||||
|
The supervisor returned `REFUSED: pristine failed: CORE NOT_RUN`.
|
||||||
|
The retained pristine receipt records verdict FAIL, elapsed 0.361879 seconds
|
||||||
|
and oracle null. The scope executed the Python child and native pristine
|
||||||
|
SwayFX binary: unlike V4, the failure occurred after compositor execution.
|
||||||
|
The mandatory `PWD=/tmp` correction passed that earlier environment guard.
|
||||||
|
|
||||||
|
The relevant diagnostic messages, in order, are:
|
||||||
|
|
||||||
|
```text
|
||||||
|
MESA-EGL: warning: Not allowed to force software rendering when API explicitly selects a hardware device.
|
||||||
|
[wlr] [render/allocator/udmabuf.c:148] Failed to open /dev/udmabuf: No such file or directory
|
||||||
|
[wlr] [render/allocator/allocator.c:168] Failed to create allocator
|
||||||
|
[sway/server.c:308] Failed to create allocator
|
||||||
|
CHILD REFUSED: compositor exited before private IPC
|
||||||
|
```
|
||||||
|
|
||||||
|
The immediate failure is allocator creation with the host device absent from
|
||||||
|
the private /dev. The Mesa warning is not established as fatal. Source analysis
|
||||||
|
must distinguish software EGL rendering from allocation of render targets;
|
||||||
|
no effective capability masks were logged. See the
|
||||||
|
[offline allocator triage](STEP20C_HEADLESS_ALLOCATOR_TRIAGE.md).
|
||||||
|
There is no private IPC, output oracle or rendering evidence. CORE is NOT_RUN,
|
||||||
|
with no ATTEMPT receipt; no result transfers to that binary.
|
||||||
|
|
||||||
|
Post-attempt independent observations found both V5 scopes not-found/inactive,
|
||||||
|
their cgroups absent and the pristine runtime empty. Stable SwayFX, QuickShell
|
||||||
|
and greetd remained active with their original process identities. These are
|
||||||
|
historical post-run observations, not authority to manipulate those services.
|
||||||
|
The V5 LAB, raw stdout/stderr, result, units and reservation ledger are sealed
|
||||||
|
historical evidence: never edit or reuse them and never retry pristine there.
|
||||||
|
Only this sanitized documentary summary is published; raw receipts stay private.
|
||||||
|
|
||||||
|
## V4 native failure and prospective V5 repair — 2026-10-17
|
||||||
|
|
||||||
|
The approved V4 pristine attempt at 06:09 CEST failed with
|
||||||
|
`REFUSED: pristine failed: CORE NOT_RUN`. Its raw
|
||||||
|
`logs/pristine.stderr.raw` contains
|
||||||
|
`CHILD REFUSED: unexpected sandbox environment`. The strict comparison
|
||||||
|
`dict(os.environ) == CHILD_ENV` rejected the Python child before its first
|
||||||
|
compositor Popen. No pristine or CORE compositor, native IPC/socket or rendering
|
||||||
|
was executed. The pristine reservation is consumed and must never be retried
|
||||||
|
in `/var/tmp/swayfx-mosaic-step20c-gate2-prep-qglkg45r`; CORE was not reserved.
|
||||||
|
The retained result records unit LoadState=not-found / ActiveState=inactive
|
||||||
|
and the cgroup was absent. Historical preparation verdicts below describe
|
||||||
|
pre-attempt evidence only; they do not requalify this failure.
|
||||||
|
|
||||||
|
The harmless post-failure Bubblewrap diagnostic at
|
||||||
|
`/var/tmp/swayfx-mosaic-step20c-gate2-env-diagnostic-uh25ciwe/RESULT.json`
|
||||||
|
returned 0 and measured only `extra_keys=["PWD"]`, `PWD="/tmp"`, no missing
|
||||||
|
keys or changed shared values, and strict_equal=false. The local bwrap(1)
|
||||||
|
contract preserves PWD through --clearenv. This is a reproduced environment
|
||||||
|
cause, not a second native attempt.
|
||||||
|
|
||||||
|
V5 will use a new exclusive mode0700 LAB, fresh scope identities and empty
|
||||||
|
reservation ledger. Its sole functional correction makes `PWD=/tmp` mandatory
|
||||||
|
in CHILD_ENV and explicitly emits `--setenv PWD /tmp` after --clearenv, keeping
|
||||||
|
--chdir /tmp and the complete dictionary equality guard. V4 and older LABs,
|
||||||
|
including raw failures, remain byte-for-byte unchanged. Offline tests and a
|
||||||
|
harmless Bubblewrap child must pass, as must the read-only plan from Desktop
|
||||||
|
Commander under app.slice and independent review. No compositor may run in
|
||||||
|
this correction mission; a new conversational approval is required for V5.
|
||||||
|
STEP20C remains NEXT; production multi-output NOT_YET_SUPPORTED.
|
||||||
|
|
||||||
|
## Scope and authority
|
||||||
|
|
||||||
|
Prepare a symmetric comparison of the retained pristine SwayFX 0.6 and private
|
||||||
|
Mosaic CORE-C V2. The supervisor stays outside the sandbox; its child enters an
|
||||||
|
ephemeral delegated systemd user scope under app.slice, then Bubblewrap, then
|
||||||
|
the fixed binary and private IPC checks. Reuse the combined benign proof at
|
||||||
|
`/var/tmp/swayfx-mosaic-step20c-combined-benign-z4wk7gog`: its 22/22 checks
|
||||||
|
qualify that benign child only. Do not reopen historical scientific ledgers.
|
||||||
|
|
||||||
|
The original preparation scope excluded changes to production source, C API/ABI,
|
||||||
|
SceneFX patches, packages, UX, Stable compositor, QuickShell, greetd and UWSM.
|
||||||
|
It prohibited installation, session switching, compositor execution (including
|
||||||
|
--version) and live Sway IPC.
|
||||||
|
The later single V5 native sequence had separate approval, now consumed.
|
||||||
|
The current documentation-only mission authorizes a reviewed commit and pushes
|
||||||
|
to origin then github; it authorizes no new compositor or sandbox expansion.
|
||||||
|
Architecture and UX contracts remain unchanged. STEP20A DONE; STEP20B
|
||||||
|
EXPERIMENTAL; STEP20C NEXT; STEP20D–G PLANNED; production multi-output
|
||||||
|
NOT_YET_SUPPORTED. Headless software evidence cannot qualify DRM/GPU, G4,
|
||||||
|
fullscreen, buffer lifetime, complete effects/damage or daily use.
|
||||||
|
|
||||||
|
## Exact identities and passive preflight
|
||||||
|
|
||||||
|
| Profile | Retained ELF under /var/tmp/swayfx-mosaic-corec-v2-i516p6po | SHA256 | Build ID |
|
||||||
|
| --- | --- | --- | --- |
|
||||||
|
| pristine | controls/pristine/sway | b7fa32116e3c42706b9b02da7df12f27e76d82dd253deb8bdec81519eed145f6 | ba9751c82e73d4043b7651354f20936d070c2227 |
|
||||||
|
| core | builds/core-mosaic/sway/swayfx-mosaic | 91f48aae2675331e0a2c60ec2fedf983745c521c75232c704a6516a4140801fb | d5d304533f2c8db9d738365e9bd7f2c96779ef8d |
|
||||||
|
|
||||||
|
Pristine dynamically needs libscenefx-0.5.so. CORE embeds private SceneFX and
|
||||||
|
must have no SceneFX DT_NEEDED. Both use system libwlroots-0.20.so with SHA256
|
||||||
|
`7edca9a7d65855addda68e29ba5db94d57c803eb5fa7d0f86db3136b90ca9837`.
|
||||||
|
The main build and diagnostic OOM/GPU variants are not substitutes.
|
||||||
|
|
||||||
|
Inspect UID, mode, link count, size, SHA, Build ID, ELF class/machine, interpreter,
|
||||||
|
DT_NEEDED, RPATH/RUNPATH and symbols with readelf, never ldd or the target loader.
|
||||||
|
Resolve the transitive library closure passively under /usr/lib, recording real
|
||||||
|
paths and hashes. Inspect EGL vendor JSON, swrast DRI module, XKB and font data
|
||||||
|
separately: DT_NEEDED is not the dlopen/data closure. Missing or drifted inputs
|
||||||
|
are refusals, not permission to rebuild, install or change the binary.
|
||||||
|
Local ABI evidence is exact-pair only; passive resolution does not prove live
|
||||||
|
relocation, renderer initialization or future update compatibility.
|
||||||
|
|
||||||
|
## Environment and containment contract
|
||||||
|
|
||||||
|
The manager control plane alone uses an explicitly reconstructed user bus
|
||||||
|
address. Desktop Commander must be measured under user@1000.service/app.slice;
|
||||||
|
a launcher under session-6.scope is rejected. No PID from a historical report
|
||||||
|
is an authority for the new run. Verify manager Delegate=yes, active app.slice,
|
||||||
|
writable common-ancestor cgroup.procs and memory/pids controllers before spawn.
|
||||||
|
|
||||||
|
Bubblewrap uses --unshare-user --unshare-all --disable-userns, --new-session,
|
||||||
|
--die-with-parent, --clearenv; /usr read-only, /bin /lib /lib64 links into /usr,
|
||||||
|
private /proc and /dev, private tmpfs /tmp and /run. Bind only the sealed LAB
|
||||||
|
input read-only and run-specific LAB output/runtime writable. No host HOME,
|
||||||
|
/run/user, /sys, display, seat, bus, configuration, network namespace,
|
||||||
|
/dev/dri or /dev/input is exposed. Close all inherited FDs other than explicit
|
||||||
|
stdio; stdio uses /dev/null and bounded pipes, never desktop sockets or a TTY.
|
||||||
|
The private runtime directory is UID1000 mode0700; all IPC paths belong there.
|
||||||
|
|
||||||
|
Do not bind host /etc wholesale. Candidate minimal data are exact EGL vendor
|
||||||
|
JSON (normally under /usr/share/glvnd/egl_vendor.d), /usr/share/X11/xkb and
|
||||||
|
/usr/share/fonts. Fontconfig may require a private minimal fonts.conf referring
|
||||||
|
only to /usr/share/fonts and LAB cache, supplied through FONTCONFIG_FILE.
|
||||||
|
No host NSS/password, machine-id, seat or ld.so cache is needed by assumption:
|
||||||
|
any missing requirement must be observed and reviewed, never silently exposed.
|
||||||
|
/proc/sys and same-UID hostile peers remain security limitations, not a claim
|
||||||
|
of a hardened general execution service.
|
||||||
|
|
||||||
|
SceneFX directly calls fx_renderer_create, not wlr_renderer_autocreate.
|
||||||
|
WLR_RENDERER=pixman is therefore not evidence of effective Pixman. The source
|
||||||
|
supports WLR_RENDERER_FORCE_SOFTWARE=1, passing DRM FD -1 into EGL software
|
||||||
|
device selection. Candidate environment: WLR_BACKENDS=headless,
|
||||||
|
WLR_HEADLESS_OUTPUTS=2, WLR_RENDERER_FORCE_SOFTWARE=1,
|
||||||
|
WLR_RENDERER_ALLOW_SOFTWARE=1, LIBGL_ALWAYS_SOFTWARE=1, XWAYLAND disabled by
|
||||||
|
configuration. Effective EGL/renderer/allocator success remains NOT TESTED.
|
||||||
|
No automatic GPU fallback or host device exposure is allowed.
|
||||||
|
|
||||||
|
## Proposed budget, supervisor and oracle
|
||||||
|
|
||||||
|
These are bounds to approve later, not consumed reservations: exactly one
|
||||||
|
pristine attempt, then exactly one core attempt only if pristine passes all
|
||||||
|
checks; no retry. At most two 800x600 headless outputs; 30 seconds per run,
|
||||||
|
TasksMax=64, MemoryMax=1GiB, MemorySwapMax=0, TimeoutStopSec=2s,
|
||||||
|
KillMode=control-group. Both stdout and stderr are drained concurrently with
|
||||||
|
16MiB maximum per channel; limit overflow or partial output fails the run.
|
||||||
|
Capture budget zero for the minimal IPC boot. Missing proof never means PASS.
|
||||||
|
|
||||||
|
Before spawn, journal exact argv, hashes, unit name, unique description, fresh
|
||||||
|
attempt identity and expected cgroup. Reject existing unit, directory, socket
|
||||||
|
or attempt receipt. Persist atomically with fsync before execution. Record
|
||||||
|
Popen-owned PID, startticks and pidfd; match manager InvocationID, description
|
||||||
|
and ControlGroup before any stop. Never kill by guessed/recycled PID, never
|
||||||
|
stop a foreign unit, and never adopt a pre-existing unit. Unknown ownership
|
||||||
|
fails cleanup rather than widening authority. All pidfds/pipes must close.
|
||||||
|
On timeout/cancellation stop only the proven invocation; verify collection,
|
||||||
|
empty cgroup, exited owned processes and absent LAB sockets. Do not rerun.
|
||||||
|
|
||||||
|
Inside the sandbox the minimal client is /usr/bin/swaymsg with an explicit
|
||||||
|
-s /runtime/sway-ipc.sock; get_version, get_outputs and get_tree are read-only.
|
||||||
|
The bootstrap must verify socket UID/type/path and the private Wayland socket;
|
||||||
|
no discovery via inherited SWAYSOCK is allowed. Require exactly two active
|
||||||
|
800x600 outputs and a valid tree/version for each binary; compare symmetric
|
||||||
|
fields without requiring equal Mosaic-specific metadata. Request exit only
|
||||||
|
on the proven private socket, distinguish an exit-IPC disconnect from the
|
||||||
|
compositor exit status, and independently verify cleanup. No popup, fullscreen,
|
||||||
|
G4 or graphics capture is required. An empty workspace does not qualify Mosaic
|
||||||
|
layout behavior, only the minimal native boot/IPC path.
|
||||||
|
|
||||||
|
## Refusals, tests and decision
|
||||||
|
|
||||||
|
The source-only fixture lives in the new private LAB until independent review
|
||||||
|
justifies publication. Its default is a read-only plan: no directory creation,
|
||||||
|
manager mutation, Bubblewrap, socket connection or native target execution.
|
||||||
|
A future launch requires its dedicated flag after separate conversational
|
||||||
|
approval; tests cannot grant that approval. Test production predicates with
|
||||||
|
fake manager/cgroup/procfs and private temporary files, including session scope,
|
||||||
|
wrong ELF/ABI/Build ID, inherited environment/socket, forbidden mounts, unit
|
||||||
|
collision, InvocationID mismatch, recycled PID/startticks, timeout and partial
|
||||||
|
output. No real scope or compositor in offline tests.
|
||||||
|
|
||||||
|
| Gate | Required evidence | Preparation status |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| Exact binaries and passive closure | ELF_DEPENDENCIES.json and raw inspection | PASS, passive only |
|
||||||
|
| Combined benign isolation | Prior immutable receipt and 22 checks | PASS, benign only |
|
||||||
|
| Current launcher and environment | Fresh observations and frozen sandbox spec | PASS for preparation |
|
||||||
|
| Fixture and refusal tests | Frozen source hashes, raw tests, independent review | PASS, V4 / 27 offline tests |
|
||||||
|
| V4 pristine native boot/IPC/cleanup | One reservation consumed; refused before compositor | FAIL before compositor |
|
||||||
|
| V4 CORE native boot/IPC/cleanup | Pristine failed; no reservation | NOT_RUN |
|
||||||
|
| V5 pristine native boot/IPC | One approved reservation consumed; allocator failure before IPC | PRISTINE_ALLOCATOR_BLOCKED |
|
||||||
|
| V5 CORE native boot/IPC | Pristine failed; no ATTEMPT | CORE_NOT_RUN |
|
||||||
|
| V5 post-attempt cleanup | Independent scope/cgroup/runtime observations | Absent / empty, sampled |
|
||||||
|
| Physical GPU, FS/G4 and full STEP20C | Outside this tranche | NOT TESTED |
|
||||||
|
|
||||||
|
The private LAB must contain GATE2_PREP_REPORT.md, ELF_DEPENDENCIES.json,
|
||||||
|
SANDBOX_SPEC.md, NATIVE_RUN_REVIEW.md, APPROVAL_GATE2.md, validation logs,
|
||||||
|
SHA manifest and before/after observations. Preserve raw failures. Record the
|
||||||
|
final offline verdict here after validation. Only all closed preparation gates
|
||||||
|
permit GATE2_NATIVE_BOOT_READY_FOR_APPROVAL; otherwise use
|
||||||
|
GATE2_BOOT_PREP_BLOCKED_WITH_EVIDENCE. Those labels describe preparation only; the later V5 native failure above
|
||||||
|
supersedes NOT_RUN for pristine, without qualifying boot/IPC.
|
||||||
|
|
||||||
|
## Historical preparation evidence — before the V4 attempt
|
||||||
|
|
||||||
|
The private source-only fixture is retained in
|
||||||
|
`/var/tmp/swayfx-mosaic-step20c-gate2-prep-qglkg45r/fixture`, not published as a
|
||||||
|
production tool. FIXTURE_SHA256SUMS_V3 binds eight files. Independent passive
|
||||||
|
review rechecked 96 main ELF entries, 46 supplemental tool entries (overlapping),
|
||||||
|
1409 data files and all 14 files bound by the prior combined benign receipt.
|
||||||
|
The current fixture inspects 98 unique ELF files, including its Python child.
|
||||||
|
Retained source manifests match 85 SceneFX and 417 Mosaic files. No rebuild
|
||||||
|
or new binary reproducibility claim follows.
|
||||||
|
|
||||||
|
The default V3 plan passes from Desktop Commander under app.slice (exit0,
|
||||||
|
launcher_error null) and refuses the Codex session-scope launch path. Both
|
||||||
|
remain PREPARATION_ONLY / native NOT_RUN. The planned native scope uses
|
||||||
|
RuntimeMax25s within the supervisor's 30s total bound, preserving cleanup time.
|
||||||
|
|
||||||
|
V2's independent review found an uncollected systemctl-stop auxiliary on its
|
||||||
|
timeout path. The bounded V3 repair reserves one second within the existing
|
||||||
|
deadline and finalizes only the exact owned Popen. Its delta review passes;
|
||||||
|
five independently executed mocked methods pass, and the separate tester
|
||||||
|
passes all 23 offline tests plus eight before/after fixture hashes and AST/local
|
||||||
|
style checks. Raw initial failures and V2 evidence remain retained. Ruff/Black
|
||||||
|
are unavailable and were not installed. Native boot, new sandbox mounts,
|
||||||
|
EGL/renderer/allocator and real cleanup remain NOT TESTED.
|
||||||
|
|
||||||
|
The LAB contains the sandbox specification, exact future approval commands,
|
||||||
|
passive inventories, raw logs, review records and final preparation report.
|
||||||
|
The frozen fixture README records its pre-review state; NATIVE_RUN_REVIEW.md
|
||||||
|
and GATE2_PREP_REPORT.md carry later review outcomes without rewriting that
|
||||||
|
sealed source set. The final preparation verdict is recorded below after the
|
||||||
|
pre-freeze audit. No native approval or reservation has been consumed.
|
||||||
|
|
||||||
|
### Historical V4 preparation outcome (superseded by native refusal)
|
||||||
|
|
||||||
|
**GATE2_NATIVE_BOOT_READY_FOR_APPROVAL**. Native Gate 2 **NOT_RUN**.
|
||||||
|
The unique deep audit on V3 found an additional passive-child finalization
|
||||||
|
defect in inspect_command on exceptions/cancellation. The single bounded final
|
||||||
|
repair V4 reserves 0.25s inside the existing deadline, finalizes only its owned
|
||||||
|
Popen and reports unproven collection explicitly. Four targeted methods were
|
||||||
|
independently exercised; bounded delta review passes and the separate tester
|
||||||
|
passes all 27 tests and eight V4 hashes before/after. The default V4 plan
|
||||||
|
passes through Desktop Commander with no native execution. Historical V2/V3
|
||||||
|
failures and the failed V3 audit remain intact; no second deep audit occurred.
|
||||||
|
|
||||||
|
Two NON_BLOCKING observations persist: internal IPC/exit auxiliaries rely on
|
||||||
|
the enclosing scope/PID namespace after exceptional local teardown, and the
|
||||||
|
full attempt chain is not simulated end-to-end. They are not runtime evidence.
|
||||||
|
The LAB's APPROVAL_GATE2.md binds the exact V4 fixture, future command and
|
||||||
|
unchanged two-profile identities. No native authorization follows from this
|
||||||
|
preparation verdict; the first native attempt still requires separate approval.
|
||||||
|
|
||||||
|
## Historical V5 correction evidence — before the native attempt
|
||||||
|
|
||||||
|
New exclusive mode0700 LAB:
|
||||||
|
`/var/tmp/swayfx-mosaic-step20c-gate2-v5-ge8wddpa`.
|
||||||
|
The imported V4 fixture passes all eight source hashes. The sole functional
|
||||||
|
change adds mandatory `PWD=/tmp` to CHILD_ENV, automatically emitted as an
|
||||||
|
explicit --setenv after --clearenv. child.py, its complete environment equality
|
||||||
|
and --chdir /tmp remain unchanged. The new LAB and scope identities are V5-only;
|
||||||
|
no historical ledger was imported or reopened.
|
||||||
|
|
||||||
|
The targeted suite passes 31 tests (27 inherited, four new). The harmless
|
||||||
|
Bubblewrap child returns 0, strict_equal=true, PWD=/tmp, cwd=/tmp, no extra or
|
||||||
|
missing keys and no changed shared values. It exercises child.main's guards
|
||||||
|
with every Popen replaced by a refusal at the native boundary. The sandbox
|
||||||
|
argv/environment prefix is exact V5; only the final Python script/profile is
|
||||||
|
replaced with a harmless -c payload. All seven namespaces differ from host;
|
||||||
|
mount/device/FD/network checks pass. The owned child is reaped with pidfd
|
||||||
|
confirmation, transient directories removed and no remaining sockets.
|
||||||
|
This qualifies the environment correction only, not a native boot.
|
||||||
|
|
||||||
|
The read-only plan passes from Desktop Commander under app.slice (rc0,
|
||||||
|
launcher_error=null; 98 ELF inspected passively). The Codex session-scope
|
||||||
|
refusal is retained (rc1). No real scope or IPC was created by these checks.
|
||||||
|
HISTORICAL_COMPARISON.json confirms the five historical LAB trees unchanged.
|
||||||
|
Before the native attempt, V5 receipts ATTEMPT-pristine.json and
|
||||||
|
ATTEMPT-core.json were absent. The later pristine reservation is consumed.
|
||||||
|
|
||||||
|
REPORT_V5.md, APPROVAL_V5.md, ENV_DIFF_V5.json, BENIGN_ARGV_V5.json,
|
||||||
|
FIXTURE_SHA256SUMS_V5 and raw logs are retained in that LAB. The independent audit passes with no BLOCKING finding. Its NON_BLOCKING
|
||||||
|
harmless-helper pidfd acquisition cleanup observation received a bounded
|
||||||
|
repair and two mocked failure subcases; the targeted final suite now passes
|
||||||
|
32 test methods. A fresh harmless Bubblewrap run also passes on the repaired
|
||||||
|
helper. The independent repair-delta review passes (12 source hashes, one mocked
|
||||||
|
method/two failure subcases). The final source/evidence manifests and
|
||||||
|
FINAL_VALIDATION_V5.json retain the closed checks.
|
||||||
|
Verdict: **GATE2_V5_READY_FOR_NEW_NATIVE_APPROVAL**.
|
||||||
|
The read-only reviewer return is transcribed by the parent in
|
||||||
|
review/REPAIR_REVIEW_V5.md; the unique audit report remains intact. At that preparation stage no native V5 execution was authorized.
|
||||||
|
The separately approved V5 attempt is recorded above: pristine allocator FAIL,
|
||||||
|
CORE NOT_RUN. V4 pristine remains FAIL before compositor; V4 CORE NOT_RUN.
|
||||||
|
STEP20C remains NEXT; production multi-output NOT_YET_SUPPORTED.
|
||||||
Loading…
Reference in a new issue