swayfx-mosaic/tooling/probes/step20c-mutation-coverage/README.md

3.9 KiB
Raw Permalink Blame History

STEP20C mutation coverage fixture — EXPERIMENTAL

The protocol and findings apply only to a disposable private headless laboratory. This fixture reuses the frozen applied-state, SceneFX clip, XDG client and pointer fixtures. It adds one private client patch for a fixed-size recolor and a toplevel input-region toggle. The runner is generated from the preceding trace-only runner inside /tmp; this repository contains no duplicate compositor or runner source. Neither private patch is a production dependency.

Rebuild and targeted replay

prep=$(sh tooling/probes/step20c-mutation-coverage/prepare.sh)
printf '%s\n' "$prep"
LAB=$(printf '%s\n' "$prep" | sed -n 's/^LAB=//p')
PYTHONDONTWRITEBYTECODE=1 python tooling/probes/step20c-applied-state-input/run.py \
  "$LAB" private_mosaic cycles --cycles 1 --asi-mode 0 \
  --max-seconds 120 --max-captures 40
for mode in control private_standard; do
  PYTHONDONTWRITEBYTECODE=1 python tooling/probes/step20c-applied-state-input/run.py \
    "$LAB" "$mode" cycles --cycles 1 --asi-mode 0 \
    --max-seconds 120 --max-captures 40
done
for mode in control private_standard private_mosaic; do
  for scenario in content input_region; do
    PYTHONDONTWRITEBYTECODE=1 python tooling/probes/step20c-mutation-coverage/run.py \
      "$LAB" "$mode" "$scenario"
  done
done
PYTHONDONTWRITEBYTECODE=1 python tooling/probes/step20c-mutation-coverage/run.py \
  "$LAB" private_mosaic hold_exit
cc -std=c17 -Wall -Wextra -Werror -pedantic \
  tooling/probes/step20c-mutation-coverage/lifetime-model.c \
  -o "$LAB/lifetime-model"
"$LAB/lifetime-model"
PYTHONDONTWRITEBYTECODE=1 python tooling/probes/step20c-mutation-coverage/analyze.py "$LAB"
sha256sum --quiet -c "$LAB/mutation-results/source-sha256.txt"
sha256sum --quiet -c "$LAB/mutation-results/artifact-sha256.txt"

Run each case once in a newly prepared lab; the analyzer rejects missing or ambiguous runs. It writes structured inventory.json, scenario-matrix.json, lifetime.json and SHA-256 manifests under LAB/mutation-results/. Raw client/compositor logs, exact exit statuses, IPC states and targeted captures remain under LAB/runs/. Only the compositor receives the private SceneFX library path. Every run has its own mode-0700 runtime and explicit IPC socket; the previous runner removes it and terminates its process groups.

hold_exit is the only B case that takes one extra output-buffer lock and read. It intentionally retains that lock after a real headless present, then lets normal private compositor shutdown destroy the output. This tests the actual output-destroy callback once. lifetime-model.c is a synthetic C17 state-machine check of the direct rejected-commit unlock and idempotent destroy release; it does not test a wlroots/backend rejected commit. The latter remains NOT TESTED. Normal T1–T5 runs are trace-only.

The fixed output geometry is HEADLESS-1 (-800,0) and HEADLESS-2 (0,0), both 800×600, scale 1, normal transform. The standard controls receive no Mosaic camera. grim captures establish sampled visible pixels, never the identity of a committed output buffer. Native (output, commit_seq) and headless present are correlated separately from actual client input.

Pinned source-audit input

prepare.sh clones wlroots from https://gitlab.freedesktop.org/wlroots/wlroots.git into the new lab, checks out 0.20.2 commit d783533489e1f75d6886c2ab5c5960090ef268f8, and archives it to LAB/wlroots/. It verifies SHA-256 b8c83f292006bc44d349891b1d460245db9dae891e986e6dc2006572f99a7f97 for types/scene/surface.c and e73655cc589321f18a824ed4b153c9b1973f9c41a0f8d52b1d380e28a42671cc for types/scene/subsurface_tree.c. The analyzer hashes these lab-owned files. The earlier /tmp/mosaic-wlroots-0202-source/ is not a replay input. The full wlroots checkout, build products and manifests remain outside Git.