Files
esh-pfi-infrastructure/persistent-memory.d/2026-08-25-worldtree-b188-b189-and-selene.md
vh 2656196f47 memory: snapshot — the tune is trained, gated, and serving
Run-01 completed in 7:21:52 (47% faster than the 13.85h round-1 projection),
lora_B gate 205/205 non-zero at median norm 1.708, and the acceptance gate says
it did the thing it was built for: diversity +0.178 against a 0.008 floor (22x),
attractor hit rate -11.3pt against a 2.0pt floor, memorisation 0.0000 on both
arms — which closes the R20 licensed-prose exposure on measurement rather than
argument.

Five new detail files carry the substance:

  erp-tune-run2-complete        the run, the gate, the noise-floor near-miss
                                (brokkr was one step from reporting a 13-point
                                T6 regression sitting inside twice his
                                instrument's own variance)
  mfu-root-caused-attention     8.6% MFU was an accounting artifact; real
                                utilisation 17-20%, cost was attention on
                                AMPERE kernels. Two independent methods agreed
                                to 2.6 points.
  nvfp4-serving-pipeline        merged weights are MANDATORY — vLLM cannot
                                serve a LoRA on ANY Gemma-4 — plus the recipe
                                that silently misses all 11,520 expert tensors
  refusal-retention-probe       measured base 0/100 -> tuned 29/100, then had
                                to accept it was the wrong axis
  worldtree-b188-b189-and-selene  three arcs closed, and a #411 diagnosis I got
                                wrong twice before a directory probe settled it

Current state rewritten end to end — the previous snapshot had the run in
flight at ~17h with MFU unexplained. Both are now closed.

The open operator decision is run 2's base, deliberately unstaged and flagged
against being filed as a config knob: it is a reversal of the trainee-selection
decision, and the pretrained-base option removes the last non-lexical floor on
the CSAM axis given stage-2-detector-inert and contamination-scan-absent are
both already overridden.

Tried-and-abandoned gains four measured-dead throughput levers, the packing
correction (bucketing wins under sdpa and the conclusion flips under flex — do
not carry it past the backend decision), and the merge-back-undoes-abliteration
trap brokkr caught in his own advice.

Index stays at 291 lines, under the soft cap. No archival this run.
2026-08-25 16:54:49 -07:00

6.6 KiB

Worldtree b188 + b189 bridge cutover, and the selene metadata that lied

[2026-08-25]

Three arcs in one day, all infra-ops side, all landed.

b188 — matrix.yaml pre-sync (#406/#409/#410 closed)

From b188 the bridge reads per-agent rendering + ambient_buffer_size from config/matrix.yaml ONLY; agent config.yaml matrix blocks are gone from the image. Staged as 6417115 in worldtree-instance-configs, deployed to both instances with operator approval.

  • mimir gets thinking-to-thread + tool-call reactions + 7 reaction labels; forseti and lofn stay quiet.
  • Rider #409 pruned six dead agents (bragi, leif, troi, soong, cara, glados) from BOTH rosters — originally scoped personal-only, which I flagged as a possible oversight and it was. The settling fact worth keeping: the engine roster comes from the image's baked agents/ directory (only config/ is bind-mounted), and both instances run the same image, so instance-level evidence about which agents the engine lists generalises by construction.
  • Both rosters now exactly [mimir, forseti, lofn] — the three engine agents actually bridged. mask/vili/echo exist in the engine, deliberately unbridged (operator ruling).

Edited text-surgically, not via a yaml round-trip — PyYAML would reflow 1,249 lines and drop every comment, and the comments are the documentation.

deploy-wt-config uses docker restart, NOT compose up. A compose up on corviduo-dev re-resolves the image tag and can silently swap the running build — which would turn an "inert pre-sync" into an unintended image roll on two live instances. That property is easy to lose in a future refactor of the script.

b189 — #407 bridge extracted to its own repo (#404 umbrella closed)

Bridge now gitea.phasefinal.com/pfi/wt-matrix-bridge, its own repo, own CI.

It publishes to the pfi ORG, not vh, and the reason is structural: vh is a USER, not an org. Gitea scopes user-namespace packages to the owning user — there are no package collaborators on a user namespace. No service account can ever publish to gitea.phasefinal.com/vh/*. claude-bot is an Owner of pfi, so that is where it goes. Token wt-matrix-bridge-ci (id 28, scopes write:package,read:repository), vaulted at nh3-dev/.config/claude-bot/gitea-token-wt-matrix-bridge-ci.

Minted a dedicated token rather than reuse claude-bot-sdk-ops or arbo-ci, both of which already carry write:package — a shared credential cannot be revoked without collateral. ⚠ A first mint attempt succeeded then failed to save; Gitea returns a token value exactly once, so it was unrecoverable. Deleted the orphan (id 27) rather than leave a live package-write credential on the account.

Both instances PINNED to f3f8ec902267 (e90f436), closing the #410 shape: WORLDTREE_IMAGE was pinned and the bridge was the one drifting service.

⚠ The pin moved from b178285b1cb5 because a cross-frontier bug-hunt found the M_EXCLUSIVE fallback could itself litter unboundedly in exactly the state it was written for. The safety net had the same failure mode as the thing it was catching — and my staged window leaned on that fallback.

#411 — the debug-room failure, diagnosed twice and wrong both times first

My theory: the alias was held by orphaned rooms. Refuted by a directory probe returning 404. The real cause: Synapse's M_EXCLUSIVE — an appservice may only create aliases inside a namespace it has RESERVED, and aipa_appservice.yaml had namespaces.aliases: [].

I inferred a cause from a symptom that was the RESPONSE to the cause — the log's "re-resolving alias" line is the recovery path firing, not evidence the alias exists. One directory probe settled it and I reasoned instead.

Fixed with operator clearance: added regex: '#aipa-debug-[a-z0-9_-]*:matrix\.phasefinal\.com' (exclusive) at /opt/docker/conf/synapse/aipa_appservice.yaml on ana-docker (NOT /opt/docker/data/, which worldtree-dev's issue cited). My regex was tighter than the proposed #aipa-debug-.*, which fullmatches only because . also matches the : separator and would equally claim other homeservers.

Pre-apply sweep (an exclusive: true claim can make Synapse refuse to START):

aliases matching '%aipa-debug%'        0
total room_aliases on the homeserver   1   <- why it went unnoticed this long
rooms created by @aipa-debug          17   <- the litter, confirmed unaliased

Synapse healthy in 40s, both bridges rode through. The aliased create then worked FIRST TRY on the next personal recreate — designed path, fallback never fired, both reuse mechanisms live (canonical-alias rediscovery AND the room-id cache).

⚠ The #411 writer census inverted its own premise: the api (uid 1000) cannot write /app/sessions, the bridge (root) can — the reverse of the issue text. But worldtree-dev's reconciliation is better than "backwards": pre-#407 the bridge ran from the ENGINE image as uid 1000, and the cutover changed the answer underneath the issue. Both readings were true at their timestamps. No live writer exists for that path anyway (sessions.path is a legacy default, #330 moved the tools off it), so the chown is optional future-proofing.

selene-1-mini-8b — a config that lied about what answers

forseti's fleet sweep found the only genuine residual in worldtree-instance-configs, and it was live on both boxes, not just drifted in git. Fixed in a77639d.

Routing was never broken (model: "chat-judge" stays), but display_name said "Selene 1 Mini 8B" and the description said "Atla Selene 1 Mini 8B — reward model derived from Llama 3.1 8B" while chat-judge has been backed by qwen3.8-27b-uncensored since 2026-08-23.

It misstated the KIND of model, not just the identity. A reward model and a generative judge are different instruments; a consumer reading "pairwise/likert/binary/scalar reward model" would expect scalar-reward semantics qwen3.8-27b does not provide.

Verified: selene-1-mini-8b -> HTTP 400 (by design), chat-judge -> HTTP 200.

NOT changed: the catalog key and the selene-judgment role — model_roles.yaml binds to that key, so renaming is worldtree-dev's schema call. Flagged that a role named after a retired model defeats the purpose of role aliases.

⚠ forseti's sharpest finding is for the operator: ~/.claude/CLAUDE.md line 502 lists the retired name in the global tools roster. A broadcast reaches sessions that already exist; the roster line keeps minting new ones. His file, awaiting his word. Also: there is no fan-out primitive on the bus — a fleet relay is 73 individual posts, recorded as a real gap rather than papered over.