swayfx-mosaic/tooling/probes/step20c-targeted-diagnostic/README.md
fy59 ed9375797e test(mosaic): record targeted STEP20C partial closure
Record exact-SHA scale and extended G samples, same-source blur measurements
and retained negative saved/input results. Keep STEP20C NEXT and production
multi-output unsupported; no production integration.

Preserve immutable probe fixtures, offline regressions and compact artifact
provenance. Fourteen consumed runs / 125 output captures, independent final
audit accepted. Saved timeout/GPU lifetime, whole-H1 return, input after camera
mutation and all-frame damage remain open.
2026-10-14 07:00:33 +02:00

121 lines
7.6 KiB
Markdown

# Optional C3 saved diagnostic — EXPERIMENTAL
This fixture is a separate fixed `saved-diagnostic-A` experiment. Core
`step20c-targeted` final sources, plans, freeze and review are immutable.
A/G saved runs remain INCONCLUSIVE: their actual serial39 636x573→636x513
was held, but the old absent-IPC-`ws.gaps` predicate aborted before target
captures and natural timeout. No qualification transfers to the new binary.
STEP20C remains NEXT; production cross-output support is NOT YET SUPPORTED.
## Contract and source
`saved-passive.patch` applies only to the historical A private
`mosaic-source/sway/tree/view.c`; base/new/patch hashes are recorded under
same LAB `diagnostic/source-provenance.json`. The full source is private.
Sway view saved-copy creation/removal owns all normal references and scene
mutations. The patch observes existing lock counts before/after the existing
set-buffer call; it adds no buffer lock, unlock, copy retention, ACK, timeout,
scheduler, rendering, readback or timeline waiting. No public ABI changes.
One calloc sidecar per actual saved copy observes output_sample, node destroy,
source release and source destroy. It detaches sample on node destruction,
nulls whichever object dies first, and frees exactly after both die. A NULL
source needs only node destruction. Stable scalar addresses remain labels,
never dereferenced after destruction. Source buffer destruction may precede
node destruction because SceneFX retains its texture. Native release/destroy
and a release timeline pointer/point do **not** prove GPU completion.
Logging causes CPU timing overhead; instrumentation neutrality is NOT PROVEN.
Native saved tree logs bind owner/container ID, scene parent and content tree.
Creation logs distinguish saved-node, original scene-node and raw source-buffer
addresses, source crop, destination size and transform. output_sample logs the
actual saved node global geometry, viewport, enable state and each applied
ancestor clip at that sample (`sample_ns`). Existing unmodified SceneFX
OPT_BUFFER_DRAW records bind that same node/output to actual draw extents.
The validator measures the intersection of **that saved node**, its viewport
and observed clips; another node's rectangle cannot substitute for it.
## Gate and global budget extension
`diagnostic.py` adds exactly the fixed fourteenth spec **in memory only** during
this process's original `gate.locked`, `action_debit` and shared `Session` use.
Original `gate.verify` runs before registration and after unregistering.
`diagnostic-registration.json` persists the exact spec; `final_budget(lab)`
requires it for extended reconciliation. It never edits the frozen module,
original review or previous tokens/events. The original review does not accept
this extension. Independent preparation review and a separate runtime review
bind exact original freeze/review, diagnostic source/patch/tests, private source,
clients, wlroots, the original A SceneFX static archive and uninstalled pc.
The runtime freeze additionally binds the staged new binary.
Only the same LAB is accepted. All13 original tokens must precede diagnostic
build/stage/run. One build token and one stage token are O_EXCL/fsynced before
the action under a flock; diagnostic/budget.json is separate from runtime
captures. Failed actions still consume their token. No retries/refunds/reset.
Only one known `saved-diagnostic-A` runtime token is appended under the original
global flock/fsynced reconciliation. Limits remain global14 runs/174 PNG,
saved3 runs/30 PNG, per-run16 maximum; C3 itself uses at most10 PNG,2 clicks,
1 camera,150 seconds. `Session` supplies isolated sockets, maps and cleanup.
A final caller must use this extension's `final_budget`, since the frozen
original validator intentionally knows only its thirteen original specs.
## Review and execution protocol
1. `prepare.py --lab /home/fy59/swayfx-mosaic-targeted-7gge6h8b` runs offline
tests, persists registration and seals preparation bytes. It requires the
C17 syntax receipt. It does not accept its own result.
2. Independent review must write preparation-review.json with scope,
ACCEPTED status, independent=true, blockers=[], exact freeze_sha256/files,
report_file/report_sha256. No compositor build before that acceptance.
3. Parent reserves `reserve_build_stage(lab,'build')` before the ONE Mosaic
private build. Reuse **exactly** HIST/scene-build/libscenefx-0.5.a and
HIST/scene-build/meson-uninstalled/scenefx-0.5-uninstalled.pc. Zero SceneFX
builds or edits. Parent reserves stage before ONE DESTDIR stage and verifies
its manifest. No install, live IPC, second lab or system library change.
4. Parent seals runtime-freeze.json (scope/spec/files=bindings(lab,True)), then
independent runtime-review.json with analogous exact-byte acceptance.
5. Only then `run.py --lab SAME_LAB` may consume the optional token once.
H1=-800,H2=0, normal scale1; real SHM crossing and at most one camera;
beforehold applied state; gaps inner current set30; pending workspace
rectangle/owner identity and actual held wire dimensions; native saved
create/draw/sample before2500ms; held H1/H2 pair; natural2500ms timeout with
client alive and unACKed serial; requested live geometry/saved node gone;
stable H1/H2 pair; normal protocol close; final H1/H2 pair. Ten PNG total
including two H2 static references. No held-serial ACK during cleanup.
6. Postrun analysis uses the same pending_geometry, held_configure,
saved_identity, saved_removal and native_pairs predicates as offline/runtime. Final global
budget must use final_budget. Any missing required native evidence fails
closed; partial observations cannot become GPU-lifetime qualification.
Offline native trace fixture in test_diagnostic.py is explicitly synthetic;
wire/IPC positive and negative tests use actual saved-A/G consumed logs and
snapshots read-only. No synthetic native test is runtime evidence. Complete
intermediate damage, GPU/CPU completion, atomic generation, other output
geometries, and instrumentation neutrality remain NOT PROVEN/NOT TESTED.
## Refused preparation correction C3
The previous preparation was refused for C3-CREATE-WINDOW and
C3-REMOVE-WINDOW. Its exact source bytes, aliases, receipts and review are
preserved in LAB/diagnostic/superseded-preparation-review-refused-v3.
Creation must follow the requested command, precede unique owner/tree
activation, and identify an unreused actual saved node. Every sample must
follow activation and bind its exact node/source/output.
Natural removal uses the same saved_removal predicate in the wait, before
live captures and in final/postrun validation. It requires the unmodified
positive-waiter transaction timeout RAW line after activation, then the exact
SD_REMOVE owner/tree/content, then each measured saved-node/source destruction.
SD_REMOVE is emitted before synchronous node destruction in the unchanged
passive C patch. Destruction must follow creation and precede the first live
capture boundary and normal explicit-close request. The native timeout line
has no monotonic ns; destruction occurs before the runner observes timeout,
so runner observation is not a lower bound. The audited single queued
transaction gives this fixed experiment its raw-order association; it is not
a general transaction-generation or GPU-completion claim.
prepare.py copies current diagnostic sources into diagnostic/diagnostic-source,
reuses unchanged passive C and its existing C17 receipt, writes source-bound
offline results and creates a new O_EXCL preparation freeze after the refused
receipts have been archived. It never creates an accepted review. The C3 runner
journals named private runtime, run, log and socket paths after Session creation
and startup without changing the frozen core.