Skip to content

Releases: JosephOIbrahim/Synapse

v5.49.0 — five tools take the stage, and the probe finally answers

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 15 Aug 12:43

v5.49.0 — five tools take the stage, and the probe finally answers

The Solaris compose trio and TOPS pause/resume graduate from WS-only handlers to first-class MCP tools, and the F5a render-offload probe — blocked twice by its own scene-build — now delivers all-PASS ground truth on 22.0.400/Indie. Two PRs (#77, #78), workflow-recon'd, adversarially verified, ultrareviewed.


What you get, plainly

Five tools that previously only existed on the live WebSocket path are now callable as MCP tools with full annotations: synapse_solaris_shotsetup_karma_xpu (scaffold a render-ready Karma shot), synapse_matlib_bind (bind USD materials), synapse_assess_render_ready (read-only readiness report), and tops_pause_cook / tops_resume_cook. Registry: 124 → 129 tools.

And three questions that gated any future render-offload design now have measured answers instead of contested memory.

The promotion (PR #77)

The compose trio's panel aliases were forward-staged in #76; this release makes them registry-live with every classification carried over intact: shotsetup keeps its R4 touches_disk → APPROVE elevation, assess_render_ready is read-only at BOTH the transport and bridge layers, and all five carry group DISPATCH_KEYS. Pinned by tests/test_parity_promotions.py so a registry edit cannot silently un-promote them.

The probe repair (PR #78)

The F5a probe's first run blanked on light.parm("intensity") — H22 Solaris lights punycode-encode inputs:* parm names (xn__inputsintensity_i0a). Fixing that surfaced a second trap: usdrender_rop is invalid in /out — the ROP-category husk driver on 22.0.400 is usdrender; usdrender_rop is the LOP-context name (identical parm truth). A third run, attacked by an adversarial workflow pass, caught the probe's hand-authored USDA lacking orderedVars (husk refused it before any delegate work) plus a phantom-class miss: hou.licenseCategoryType() is the enum TYPE and raises — hou.licenseCategory() is the query. All repaired; the per-variant USDA is now flatten-exported from the probe's own karmarendersettings-authored stage.

Ground truth established (F5a, all four items PASS)

Question Answer (22.0.400 / Indie, live) Producer
Does husk load the Karma delegate headless? YES, with AND without --indie — exit 0, pixels on disk, ~1.9s, empty stderr. The 2026-07-17 flag theory does not reproduce; NO SPLIT. harness/notes/probe_render_offload.results.20260815T123824Z.json, item (a)
What does node.render() do with soho_foreground=0? BLOCKS_UNTIL_PIXELS — 1.84s return ≈ husk wall time; background mode is NOT async dispatch on this build. same, item (b)
What signal marks "pixels on disk"? husk_postframe sentinel, +0.006s after the EXR lands — pixel-accurate; file-exists poll acceptable only while render() stays synchronous. same, item (c)

F5b design and the F1 flag decision remain human-gated — but they now gate on measurement, not contested memory.

Numbers, with producers

Figure Producer
129 MCP tools registered len(TOOL_DEFS), live-verified this release; banner bound by tests/test_phase0c_doc1_toolcount.py
41 transport read-only / 37 bridge read-only live set counts, pinned by tests/test_f6_hygiene.py + tests/test_parity_promotions.py
6,305 passed · 1 failed (pre-existing) · 170 skipped local python -m pytest tests/ -q @ 934eaba2; the test_backfill failure is pre-existing (Py 3.14 vendored ABI, disclosed since v5.48.0)

Known limitations

  • The CHANGELOG deep record still ends at v5.41.0 — v5.42.0 through v5.49.0 live in their release commits and docs/RELEASE_NOTES_* files; backfill is queued housekeeping.
  • Leg (b)'s synchrony verdict is one trivial frame on one build; a long-render control would make it airtight. The claim is scoped accordingly.

Post-release verification (2026-08-15T12:45Z)

The F5a ground truth was independently reproduced by hand minutes after release — Joe's own PowerShell run of the probe, all four items PASS, every delta vs the committed baseline within timing noise (husk 2.09/2.03s exit 0 + pixels both variants, render() blocks 2.19s, sentinel +0.005s). Receipt: harness/notes/probe_render_offload.results.20260815T124545Z.json (master 9680a69e).

v5.48.0 — work while it works

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 15 Aug 02:32

v5.48.0 — work in Houdini while Synapse works

Non-Synapse nodes no longer lock up while a Synapse operation is processing. The freeze was physical law — the main thread IS the UI thread, and Python cannot preempt running Python — so this release attacks the three places Synapse held that thread without a witness: unlabeled dispatch holds, blind retry loops, and an emergency halt that waited on the thread it was trying to free. 18 commits, PR #75, crucible-gated.


What you get, plainly

Mid-render or mid-tool-call, you can select nodes, edit parameters, and keep working. When a call goes long, the panel now tells you what is holding Houdini and since when — and the stop button reaches it.

If a tool call wedges twice in a row while a holder is registered, Synapse stops retrying it and tells you in plain words: which command, held how long, by what.

Synapse → Emergency Halt now works even while the main thread is frozen. It acts off the main thread — it never waits on the very thread it's freeing.

The four fixes

F4 — the in-flight register (main_thread.py). Every dispatch that takes the main thread now writes its name and start time into a register — on entry, cleared on exit, on both dispatch paths (114 previously anonymous sites now carry labels; AST-verified). Everything else in this release reads that register. collect_telemetry() freeze dumps include the holder section.

F2 — the retry breaker (panel/retry_breaker.py). The worker used to re-fire the same command after a timeout even while Houdini was visibly held. Now the breaker only fires when BOTH are true: the same command abandoned twice in a row AND the register says a holder is live. The artist sees the honest sentence; the model sees a is_error result and stops.

F3 — halt that reaches a frozen UI. The emergency net is constructed at transport startup (never mid-freeze), and the WS-path halt reads the register as evidence and sweeps PDG from off the main thread. A halt mid-freeze can no longer deadlock on its own wait.

F1 — update-mode sandwich (flag-gated). SYNAPSE_COOK_SANDWICH=1 opts into a per-operation snapshot → Manual → mutate → restore → hou.ui.triggerUpdate() envelope around cook-heavy mutations. Dev-default OFF until the live probe passes on 22.0.400: scripts\live_verify_freeze.ps1 then one line in the Houdini Python shell.

Numbers, with producers

Figure Producer
6,297 passed · 5 failed · 170 skipped local python -m pytest tests/ -q @ 86115ed5; 4 failures are statusline-worktree environmental, 1 pre-existing (test_backfill, Py 3.14 vendored ABI) — zero forge-authored
CI all-pass on the merge commit GH Actions run @ eb0a4433 (macOS+Ubuntu × Py3.11/3.14, CodeRabbit)
23 attacks, 2 FATALs caught pre-merge docs/reviews/crucible-full.json (F2 rerooted onto the register; F5 default-flip killed → F5a probe-only)
114 dispatch sites labeled AST scan in the forge report (docs/reviews/freeze-forge-report-2026-08-14.md)
PR #75, merge eb0a4433, 18 commits no squash, per-leg history preserved

Known limitations — what this release does not claim

  • Not yet live-verified. Everything above is harness-green; the on-screen proof is live on Joe's 22.0.400 seat — two probe gates (scripts\live_verify_freeze.ps1) and the 5-step session protocol in the forge report. F1 stays dark until its probe passes.
  • F5 was NOT flipped. Defaulting renders to background-mode was crucible-FATAL twice (the file-on-return contract in handlers_render.py and the GL flipbook fallback detonate). The render-offload design question is parked behind docs/reviews/render-offload-f5a-design-gate.md and the --indie husk probe matrix.
  • The websocket cancel gap is still open (websocket.py:471 serial read loop).
  • The SessionStart "connected" lie is still open — ping-first remains the cure.

Files Joe will run again

Thing Where
Live verification entry point scripts\live_verify_freeze.ps1
F1 sandwich probe (GUI Python shell) harness\notes\probe_update_mode_sandwich.py
F5a render probe (hython) harness\notes\probe_render_offload.py
Spec + crucible + forge record docs\reviews\ui-freeze-fix-spec-2026-08-14.md · freeze-forge-report-2026-08-14.md

v5.47.0 - The Memory Wave

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 13 Aug 21:13

v5.47.0 — The Memory Wave

The Moneta memory store goes real. Shipped through the AUTOREVISE harness as wave 3
(9 legs, crucible-gated, receipts in-tree), on top of the W1 store recovery and the
wave-2 latency work — everything since v5.46.0 in one lineage.

Headline: memory is production-honest

  • The one root cause, closed — the 384/256 embedding-dim mismatch that silently
    dropped the store to jsonl while claiming moneta. The vector index now takes its
    dim from the ACTIVE embedder; a persisted index that disagrees is treated as
    derived data and rebuilt from source payloads, loudly, with zero memory loss.
    The historical raise-on-mismatch behaviour is re-pinned in tests as fixed.
  • cortex_root.usda materialized — typed MonetaMemory root, write/query as typed
    prims keyed (kind, id), with dual-write to JSONL armed as the permanent safety net.
  • Typed kinds — note / context / reference / task / decision each carry their own
    schema; synapse_recall and synapse_search route on the typed prim, no full-store slurp.
  • Vector recall — a derived, rebuildable index over the store; ranked neighbors
    with real scores. Delete-and-rebuild reproduces results (derived-data proof).
  • Consolidation with consent — synapse_evolve_memory dry-runs a full prune audit
    (merges, prunes, before/after counts) and mutates nothing without an explicit
    approval token. Protected memories are structurally excluded from pruning.
  • Migration, copy-and-verify — JSONL memories become typed prims with ids
    preserved, behind a hard backup gate; count parity + field-fidelity spot checks;
    keep-both-never-delete on collisions; write-through fallback stays armed post-flip.
  • Hardening — crash-interrupted writes leave the root intact; two concurrent
    writers both survive (observed semantics receipted); write_plane now reports the
    STORE, not just the bridge.

Also in this release

  • W1 memory-store recovery merged — resolver guards against literal env-token
    path segments, canonical unsaved-scene base, WAL-poison-safe reopen, idempotent
    keep-both store consolidation, store_census probe kind in the autoresearch harness.
  • Wave-2 latency authority — doctor fully off-main (marshalled hou closure),
    the 2s context tick off Houdini-main, format_synapse_message on the worker with
    prerendered HTML insert, a busy/stalled indicator fed by real _set_busy edges,
    and the freeze discriminator probe with conditional bridge-lookup cache.
  • Seam compositions, receipted — W1 x W2-S1 in store.py (W1 path semantics under
    S1's _read_on_main marshal; 40 tests green) and the autoresearch probe-kind
    registry union (usd_schema_probe + store_census coexist). Resolvers committed
    under harness/autorevise/bus/_runs/.

Integrity notes

  • Crucible verdict on wave 3: substance CLEAR on all seven legs; the wave was
    blocked solely on durability (uncommitted worktree state, the standing wave-2
    lesson) and remedied with one named-file commit per leg before merge.
  • Both standing failure classes re-attacked and CLOSED: silent-fallback-claiming-
    moneta, and data-loss in migration/consolidation. The live 473-memory corpus was
    never touched during review; leg tests were re-executed tmp-dir-isolated.
  • Unobtainable renders UNKNOWN — never zero, never an estimate.
  • Live-seat conformance: the running bridge still executes pre-merge code; the
    doctor SHOWS the memory section honest-green after the next Houdini relaunch
    and reinstall (RELEASE_CARD step 8).

Held for ruling

  • W3-LOCK — cross-process owner-lock hardening on from_storage_dir.
  • MONETA-DIM-HYDRATE — vendor-side typed EmbeddingDimMismatchError / re-derive.

Paper trail

harness/notes/receipts/ (W3-DIM..W3-PAPER, W3-CRUX), W3-MIGRATE evidence file,
wave3.live.json (base ruling receipted), and the session capsule.


As shipped (post-release addendum, 2026-08-13)

  • Tag v5.47.0 → gate ran clean (six surfaces CONFORM, conformance suite 11/11
    pre + post). Master closed the day at 59a4ad6c (== origin) with the session
    capsule in-tree; the capsule commit trails the tag by design.
  • Verified on merged master: 138 wave-3 tests + 40 W1/S1 regression tests green;
    the dim root-cause test re-pinned to the fixed contract (init succeeds via loud
    derived-data rebuild — observed: 39 stale vectors re-embedded, zero loss).
  • Wave-3 durability remedy: crucible verdict was BLOCKED solely on uncommitted
    worktree state; remedied with one named-file commit per leg
    (store e8b691d · kind a82492a · evolve c2bedf3 · migrate 0c87a83 ·
    harden 1b8d1e8) before the merge train. Zero code conflicts across all nine legs.
  • Live-seat status: moneta_substrate=fail remains EXPECTED until the next
    Houdini relaunch + reinstall (RELEASE_CARD step 8) — the doctor line is the
    observation that completes the wave on the live seat.
  • Session record: harness/notes/CAPSULE_2026-08-13_v5.47.0-session-close.md ·
    receipts index harness/notes/W3_RECEIPTS_INDEX.md · held spawns awaiting word:
    W3-LOCK, MONETA-DIM-HYDRATE.

v5.46.0 - Wave 1: Production Readiness

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 13 Aug 14:39

v5.46.0 — Wave 1: Production Readiness

Shipped through the AUTOREVISE revision harness with full receipts in-tree. Crucible verdict: green with findings; both BLOCKs closed before merge.

Highlights

  • Karma progressive render presets — layout → lighting → quality → final stages, with background rendering (soho_foreground=0) as the default for quality+ passes. Every parameter name probe-verified against a live Houdini 22.0.400 build: three documented names proved to be phantoms and shipped corrected (reflectionlimit, refractionlimit, denoiser).
  • Panel health strip — always-visible, fact-sourced cells for connection, memory backend, project, and active job. A memory-backend fallback (moneta → jsonl, the 384/256 embedding-dim mismatch) now surfaces loud with the doctor's one-line reason instead of degrading silently. Unmeasured facts render UNKNOWN — never green, never zero. Zero added main-thread I/O.
  • Result-path hardening — off-main-safe changes to panel result telemetry. Doctor-off-main was built, adversarially reviewed, and deliberately reverted as a structural crash path (unmarshalled hou calls reachable on cold store construct); the real fix is queued as a scoped follow-up rather than shipped as a crash.
  • AUTOREVISE harness — a revision-execution harness composed from the existing autoresearch + orchestrator machinery: schema-validated revision missions, an append-only inter-agent bus, gated dynamic leg spawning, and crucible review as a merge precondition.
  • Measurement integrity — a live GUI probe on this build reads 0.63 ms max main-thread hold; the historical 648/780 ms stall magnitudes are recorded as unconfirmed (no producer path). Unobtainable renders UNKNOWN, never an estimate.

Paper trail

harness/notes/receipts/ (M2-CRUX, W1-KPRE, W1-HSTRIP, W1-MTFIX + correction) and harness/notes/CAPSULE_2026-08-12_autorevise-wave1.md.

v5.45.1

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 09 Aug 21:08

SYNAPSE v5.45.1 — CI-green patch on the cache-advisor release

Released 2026-08-09, minutes after v5.45.0. Product code unchanged.

Why a patch

v5.45.0's tag gate ran its own suite green locally, but the repo CI (ubuntu, no Houdini)
went red on one new test: test_decide_cache_handles_real_host_probe_unknown_shaped_machine_profile
hoped the environment would yield an unknown-shaped machine profile instead of forcing it.
On Linux, the probe's stdlib tier honestly reads real available RAM from /proc/meminfo
the probe was correct on every platform; the test was platform-naive.

The fix (e417c7a)

The test now forces BOTH ram-detection tiers off (psutil and the /proc/meminfo stdlib
path), constructing the unknown shape by design rather than by environmental accident.
Six lines, one test file. CI green at this tag.

Also rolled up

Wave-2 capsule documentation (in-flight W1 Moneta + insert-slice builds, autonomous
closer protocol). No runtime code changes since v5.45.0.

v5.45.0

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 09 Aug 20:09

SYNAPSE v5.45.0 — resource-aware cache advisor (Phase 0+1)

Released 2026-08-09. Wave R-CACHE-1: intake-adjudicated (16 ADOPT / 6 ADAPT / 16 CORRECT / 5 REJECT,
19/19 challenges sustained), CTO-ruled adopt-with-amendments, built by agent teams, live-assayed.

Highlights

  • Read-only cache advisor: synapse_assess_cache through the existing bridge registry
    (read-only class), advice card on the existing panel surface, feature-flagged OFF by default
    (SYNAPSE_CACHE_ADVISOR_ENABLED).
  • Pure policy package python/synapse/cache_policy/: typed models, deterministic verdicts,
    UNKNOWN discipline — no hou, no Qt, unit-testable anywhere.
  • Evidence-first host probe host/cache_host_probe.py: passive assessment, never forces a
    dirty cook (negative-control tested), ms→s conversion in exactly one place.
  • Live-observed H22.0.400 contract (SUPPORT_MATRIX row, receipts committed):
    lastCookTime() = accurate milliseconds in a GUI session; 0.0 unconditionally headless
    (perfMon irrelevant). Probe classifies non-positive readings with cook evidence as UNKNOWN
    (lastCookTime_unreported) — never a fabricated zero. Assay item 3 holds this as a declared delta.
  • Crucible catch shipped closed: an LLM-reachable policy_overrides lever found in review
    and welded shut before CLEAR (0688a16).

Verification

154/0 cache tests · live assay 7/7 (exit 0) on 22.0.400 · full suite 6001 pass / 2 known
pre-existing environment failures (W1 Moneta pending, Py3.14 vendored-ABI pending).

Explicitly not in this release

Phase 2 (cache insertion/baking) — REJECTed at adjudication pending SideFX response on
in-flight cook cancellation (H3a_SIDEFX_ASK.md). Phases 3–4 deferred.

v5.44.1

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 09 Aug 11:24

v5.44.1 — release truth

One canonical version, gated tags. Root VERSION is the single source;
scripts/sync_version.py observes and propagates six surfaces (UNKNOWN never
passes); scripts/tag_release.py stands between git tag and the claim —
refusing on tracked dirt, drift, an existing tag, or anything unobservable.
This is the first release to pass through its own gate.

Also in the tag: docs/RELEASE_CARD.md (the operator ritual) and an intake
fix (h22-intake args-as-JSON-string parsed loud instead of silently dropped —
the fix that enabled the SYN-NEXT-001 adjudication run).

Fixes the three-way version split (VERSION 5.44.0 / runtime 5.43.0 / README
5.42.0) and the two CI conformance reds it caused.

Known open, disclosed: abrupt-restart persistence (the PRST pair, xfail-tracked
on master) — the W1 memory-recovery program is next and un-xfails them.

Post-tag on master: Houdini 22.0.400 re-stamp (35,908 symbols, +5/-0) and
docs/SUPPORT_MATRIX.md as the standing claims surface.

v5.44.0

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 08 Aug 20:43

v5.44.0

Honesty and hardening

  • Honest-green CI. Master's inherited red is cured: two real-rot
    failures fixed (not skipped), environment-gated tests marked with
    visible reasons, needs_houdini marker introduced. A green check now
    means every test that could run, ran.
  • Fidelity indicator tells the truth. Unmeasured renders UNKNOWN -
    never a number, never a fabricated 1.0.
  • Scout warns about stale authority. An external / no-Houdini
    process grounding against the prior-major table now says so instead of
    reporting it fresh. (R-M5b-1)
  • Scene compose can no longer litter foreign folders. Unsaved-scene
    writes are refused at the write site; saved-state is the oracle.
    Live-probed on 22.0.368.
  • Freeze instrumentation shipped. Qt result-path timing + payload
    telemetry and a one-command live repro protocol (FRZ_REPRO.md).
    Attribution tooling; no behavior change.
  • Dispatcher hardening. Per-leg base refs and per-manifest model
    honored at dispatch; the wrong-base failure class is closed.

Known issue (disclosed, fix scheduled next release)

  • The Moneta memory store fails to open when the configured embedder
    dimension mismatches the persisted index (observed 384 vs 256), and
    in this build that failure is silent - memory persistence is
    unreliable until v5.44.x. Root cause and evidence:
    harness/notes/PRST_SEAM_A_REPORT.md. All non-memory features are
    unaffected.

v5.43.0 — BLOCKS: deterministic scene setups

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 06 Aug 23:43

SYNAPSE v5.43.0 — BLOCKS: deterministic scene setups

Ask twice, get the same scene

Asking a model to author a Solaris network is sampling, and a sampler is not a
function — the same request produced a different graph every time. BLOCKS moves
canonical setups out of generation entirely. A fixture is a scene setup stored
as data — node types, exact names, wires, positions, parm values. The operation is
reconcile to the definition, not create. Ask twice and the second call is a no-op;
delete it and ask again and you get the same scene, byte-for-byte.

What's proven

Fifteen checks green, headless on Houdini 22.0.368 — seven negative controls that
show each instrument can disagree, run before any invariant, then eight invariants:

claim
F-1 apply on a clean stage reproduces the committed baseline 762e3a85, byte-exact
F-2 apply → remove → apply gives the same hash
F-3 apply on an applied stage does nothing — 0 ops, hash unchanged
F-4 / F-4b an artist node outside the box keeps every authored property; a display transfer is reported by name, never silent
F-5 a name clash refuses with zero mutations, stage signature identical across the call
F-6 cross-machine portable — the same fixture hashes identically from two different $HIP values
F-7 a stray node dragged into the box is ejected and left alive, never deleted

Reproduce: hython harness/blocks/invariants_m5.py

Suite: 5765 passed, 9 failed, 147 skipped — the 9 failures pre-exist BLOCKS and
are unchanged in identity and count. +20 tests net from M5 to M5b, all new and passing.

The baseline is machine-portable

The composed USD stage carries expanded environment paths — $HIP arrives as an
absolute path on 242 of 643 lines, one of them buried mid-string in a query parameter.
The c3 canonicalizer rewrites absolute-path-valued environment variables back to their
token, so the same fixture produces the same hash on any machine. It rewrites only
absolute paths — $HIPNAME expands to the bare word untitled and $OS to the node
name, and substituting those by value would corrupt real scene content. Proven in both
directions: identical under c3 across two working directories, different under the old
c2. The prior c2 baseline (8bb05761) is recorded in the fixture with the reason it moved.

Four silent failures the harness caught

  • Node types are versioned. createNode('domelight') yields domelight::3.0
    comparing against the plain literal never converges, so every apply planned a
    delete-and-recreate. The stable identity is nameComponents()[2].
  • Create auto-renames silently. createNode, createNetworkBox and setName all
    rename on a clash and raise nothing — which is why the collision gate must run before
    creation, since afterwards the scene is already mutated.
  • NetworkBox.destroy() keeps its members by default. Removal would have orphaned every node.
  • A parm's authored value is unexpandedString(), not eval(). The camera's default
    primpath /cameras/$OS evaluates to exactly what the fixture declares — comparing on
    eval() reports "already correct" and never writes the literal.

Phantom-API gate, closed wider than expected

The committed Houdini symbol table was regenerated on 22.0.368 (35903 symbols; five
symbols stamped for 22.0.397 that do not exist on this build were removed) with a
load-time build check. Regenerating it surfaced a larger hole: an uninjected in-Houdini
process was silently serving H21 symbols as authority on an H22 host, with no
staleness signal. Closed by making the Houdini environment a host-agnostic source of the
running build.

The evidence harness underneath (AUTORESEARCH)

Three tiers: Claude orchestrates, a local model authors and triages questions through
ollama at zero API cost, hython executes probes deterministically. The model may author
questions; only probes produce answers, and proposed missions pass a literal
fence plus schema validation before they can run. First campaign: 55 answers, 0 failures.
It confirmed four dead H22 literals with live successors mapped, caught
karmarenderproperties deprecated one step before it entered the fixture, and found
Houdini stamping session node IDs into composed USD — the canonicalizer rule without
which cross-session determinism was impossible.

Not done

No phrase routing (M6) — both tools take a fixture name; typing "basic Solaris setup"
resolves to nothing yet. No panel surface for the verdict line. No USD customData
(RFC-gated). solaris.basic remains the only fixture.


Full changelog: https://github.com/JosephOIbrahim/Synapse/blob/master/CHANGELOG.md

v5.42.0 — the receipts release

Choose a tag to compare

@JosephOIbrahim JosephOIbrahim released this 02 Aug 22:10

v5.42.0 — the receipts release

The front door works, the receipts stopped lying, and won latency is now pinned.

The P0, closed on the live seat

  • memory_write no longer dies with WinError 5 on a fresh unsaved scene — scene
    memory resolves a writable address, discovery still reads the raw $JOB root
    (G1a + followup), verified over raw WS against the captured cold-boot baseline
    (scripts/live_probes/probe_g1_acceptance_ws.py).
  • doctor's permanently-red install-stamp false alarm fixed for repo-direct
    installs (G1c).

Four honest-receipt fixes — same family: a green light that couldn't say no

  • health now carries write_plane (and its probe can no longer hang ~43 hours
    on an ACL-denied dir — one non-retrying syscall, pinned by a real icacls test).
  • composition_valid carries a real verdict (it had ZERO assignment sites — an
    anchor that could never fail). Failed compositions now read fidelity 0.0.
  • Ops that fail BEFORE validation record composition_applicable=false instead
    of inheriting "ran and passed" (K4).
  • Reduced-mode hashing is now COUNTED: operation_stats() lifetime counters +
    the session tracker's unobservable_deltas (R306). Fidelity semantics
    deliberately untouched.

Latency: measured, fixed, and pinned

  • The agent loop stamps an incremental prompt-cache breakpoint each iteration
    (kills the O(K^2) re-prefill) and captures real usage via last_usage — the
    producer that can finally price it.
  • The stage-hash gate re-keyed on AUTHORED ARRAY VOLUME: a 4-prim/2M-instance
    stage that slipped a 16,677x miss past the prim gate now takes the reduced
    path (~55,000x cheaper, measured on two machines).
  • Non-saturating T4 phase timers (synapse_composition_ms,
    synapse_stage_touch_ms) — a 7 s event lands in a real bucket instead of
    vanishing at the old 4–5 s ceiling.
  • One stage walk per op instead of two (_stage_exceeds per-op cache),
    independently confirmed by the perf ratchet's own counters.
  • The perf ratchet is ARMED: counted-proxy floor, read at
    merge-base(origin/master) so a PR cannot gate against its own doctored floor,
    CI-runnable with zero pxr. Counts fall freely; rises need a human-promoted
    floor.
  • The scale bench sweeps the axis: prims held at 4, the gate flips on
    volume alone between 500k and 1M authored elements. Offline tier emits
    COUNTS ONLY — enforced in code, not prose.
  • Latency board: harness/latency/ — 8 PASS / 0 FAIL / 0 PENDING.

Suite hygiene

  • The module-planting class (synthetic packages in sys.modules without
    parent-attribute binding) fixed at 26 files; tests/pkgbootstrap.py is the
    one sanctioned way to plant.
  • Refuted and recorded so nobody re-litigates: extending declarative coverage
    (would ADD a round-trip), H1 topo-hash cost (cookCount never cooks), H2
    blast-radius cost (0.039 ms at N=500).

Suite at tag: 5540+ passed / 0 failed (main checkout). Producer paths for every
number: harness/latency/LEDGER.md + LOG.md.


Same-day additions (post-tag, on master)

The tag is fada390; the release day kept going. Three more merges, each
crucible-verified, all on master:

  • First live-tier bench rows ever (b7d2d14). Two wire-contract defects
    surfaced on the bench's first contact with a real bridge and were fixed
    client-side: the arm dialed the bare root (the WS handler mounts at
    /synapse), and live execute_python results arrive stringified (parse
    ast.literal_eval). The measurement: live-path cost is flat across
    100k -> 4M authored elements (ping ~0.4 ms, set_parm ~3.7 ms) — confirming
    the live envelope skips the stage term by construction, so only the audited
    path ever needed the volume gate.
  • The suite flake is dead, and it was a production bug (6daac63). A test
    built the process-wide FreezeChain at production thresholds and nothing
    could stop it — shutdown_freeze_chain() did not exist. Its 30-second
    escalation timer fired into whichever test was running, which is why the
    victim differed every time. The fix is production-shaped: the shutdown
    counterpart now exists and the panel's closeEvent calls it, so closing the
    panel no longer leaves a timer that force-opens the breaker against a live
    bridge 30 seconds later. Plus the module-planting sweep: 9 sys.modules /
    parent-attribute divergences -> 0, including the newly named
    restore-without-rebind shape.
  • README refresh (5e8973f): the volume-axis story, the receipts, the
    measured two-path cost asymmetry, and current figures — every number with
    its producer.

Suite at head of release day: 5,551 passed / 0 failed — the first
zero-failure full run with the flake mechanism removed rather than dodged.