memory: snapshot — R29→R30 affect-calibration arc (R30 φ0 config-faithful)
R29 flat-affect finding shipped as Worldtree's A1 anchor fix (decay_anchor= baseline_pad, positive_p_cap removed; demo v1.0.0b14); R30 Phase-1 φ0 measured against it = config-faithful (φ0≈0.95, c≈0, trait-flat, φ_max→0.96). R28 closed. Standing follow-ons (hybrid decay redesign, gain-only v1, per-axis A/D, Phase-2, relational verify) are others' calls. Data on diag/r29-pad-series + diag/r30-phi0-step-response. No ratatoskr code change (main tip v0.19.5).
This commit is contained in:
+59
-40
@@ -1,6 +1,6 @@
|
||||
# Persistent memory — ratatoskr
|
||||
|
||||
_Last updated: 2026-07-02_
|
||||
_Last updated: 2026-07-03_
|
||||
|
||||
This file captures durable intent and supporting evidence (goals, decisions,
|
||||
foot-gun warnings, in-flight state) across context resets. Read it at session
|
||||
@@ -39,44 +39,53 @@ upstream API key stays server-side (INV-003).
|
||||
|
||||
## Current state / in-flight
|
||||
|
||||
_As of 2026-07-02:_
|
||||
_As of 2026-07-03:_
|
||||
|
||||
**LATEST — SINDRA AFFECT/MEMORY INVESTIGATION COMPLETE; FOUR upstream items driven from the persistence
|
||||
side (the consumer/provider thesis at full tilt).** A ~40-turn controlled probe of Sindra's affect + a
|
||||
memory round-trip characterized the Tier-3 model from things chat can't see. NO new ratatoskr code this
|
||||
arc (investigation + althing coordination only; code tip stays `v0.19.5`). Findings + routing:
|
||||
(1) **PAD is over-regulated** — pleasure compressed near neutral BOTH directions (can't reach ±0.3 even
|
||||
under sustained extreme praise/contempt; over-regulation worse for *social* valence than threat),
|
||||
**arousal** responsive (reaches its ±band), **dominance** flat/unresponsive to power-framing → tracked
|
||||
as a worldtree-dev affect slice (loci: appraisal→PAD gain + regression-to-baseline term). Corrected my
|
||||
own "asymmetry" over-claim to "both-sides-compressed" mid-probe.
|
||||
(2) **Memory plane HEALTHY** — seed→promotion→cold-recall proven end-to-end (verbatim capture, 0.74
|
||||
confidence, no #296 subject-inversion).
|
||||
(3) **Salience scorer non-discriminating** (zero-shot-LLM-self-rating: 51/56 chunks at 0.9-1.0; a
|
||||
throwaway "17×23?" scored 1.0 tied with a real fact) + recall-utility untracked (`access_tally`=0) →
|
||||
**Worldtree #335** (code fix, deferred) + **brokkr R28 OPEN** — pre-scope panel reframed it to
|
||||
**PROMOTION-WORTHINESS** (durable value) NOT salience (momentary attention: "17×23" genuinely IS salient
|
||||
→ recalibrating gives a well-calibrated WRONG answer); unit = set-selection-under-budget, eval =
|
||||
outcome-aligned (recall@budget). **ratatoskr delivered the P00 injection-corpus**
|
||||
(`docs/diagnostics/r28-p00-injection-corpus.json` — 24 self-labeling items × 3 strata: admission-traps /
|
||||
ranked priority-traps / calibration-control) + baked 2 run-validity pins (absent≠dropped without a
|
||||
GUARANTEED promotion pass; fresh agent+end_user per run vs server-side dedup). **Standing by to RUN the
|
||||
eval** once brokkr pins per-stratum N + the decision rule (gated on worldtree-dev's pipeline answer [does
|
||||
salience feed priority/eviction?] + a dwarf pass). Key structural finding: salience gates PROMOTION not
|
||||
RECALL-ranking (our search is cosine-only) → bad salience = storage bloat, not bad recall.
|
||||
(4) **relation_context coherence FIXED + the whole RELATIONAL-DYNAMICS ARC is now LIVE on demo (v1.0.0b9).**
|
||||
My flag → Worldtree #319/#320 Waves 0/1/2, deployed to demo (run 551 green). Now live on the wire ratatoskr
|
||||
persists (relation_edge/1 schema UNCHANGED — all within existing fields; drift-pin + vendored canon
|
||||
unaffected): **relation_context** varies on the Hwang ladder {stranger, instrumental, mixed, expressive} +
|
||||
now DEMOTES/RUPTURES (Wave-2B); **other_stance** (0,0)→live (the user's displayed warmth/agency);
|
||||
**agency** 0→live (pulled toward the COMPLEMENT of the user's dominance, Wave-2A) — which **shifts our
|
||||
canonical directive render once agency crosses the canon ±0.2 deadband** (expected, non-breaking — we key
|
||||
on the canon bands); **obligation_balance** None→人情 ledger {given,owed,currency,last_exchange} when tie is
|
||||
"mixed" (given/owed stay 0, favor dynamics deferred). **ratatoskr needs NO code change** (renders all
|
||||
value-agnostically; confirmed render-clean on the logic to worldtree-dev). **LIVE-CONFIRM PENDING:** our
|
||||
Heimdall key is personal-`:8081`-ONLY (per-instance), so can't verify the varying values on demo — will
|
||||
drive a turn + confirm the ladder/agency-clause render once PERSONAL picks up b9 (worldtree-dev pings).
|
||||
Optional enhancement noted: surface `other_stance` (now a live signal, currently unrendered).
|
||||
**LATEST — the R29→R30 affect-calibration arc DELIVERED (my finding → shipped fix → measurement against
|
||||
the fix).** NO new ratatoskr code this arc (throwaway `/tmp` probe scripts + two `diag/` data branches +
|
||||
althing coordination; main code tip stays `v0.19.5`). The consumer/provider thesis at full tilt —
|
||||
ratatoskr as the affect-probe INSTRUMENT for brokkr/worldtree R-targets:
|
||||
|
||||
(1) **R29 (PAD mood-dynamics) — my flat-affect finding SHIPPED as Worldtree's A1 anchor fix (demo
|
||||
v1.0.0b14, `e1cdf82`).** Live-probing base persona agents (lofn/mimir/forseti/mask, personal :8081)
|
||||
reframed the over-regulation: it's **decay-to-neutral + low emotion→PAD gain**, NOT flat-near-zero and
|
||||
NOT baseline-anchored — triangulated across 3 baselines (arousal converges to 0 ∝ distance) + a
|
||||
step-response (decay τ symmetric across signs; hedonic asymmetry is ceiling/anchor-EMERGENT, not a
|
||||
decay or gain primitive). worldtree-dev shipped A1: `decay_anchor = baseline_pad()` (was neutral) +
|
||||
`positive_p_cap` removed. Data on `diag/r29-pad-series` (`61ff2da`).
|
||||
|
||||
(2) **R30 Phase-1 (φ0 pin) — DELIVERED, config-faithful.** Measured the pure PAD-point decay on demo b14
|
||||
(the corrected anchor) via brokkr's **joint two-timescale fit** + empty-tail cross-check: **φ0 ≈
|
||||
0.95–0.97** (empty-tail 0.95 exact, joint 0.971±0.01), **intercept c ≈ 0** → the deployed engine
|
||||
faithfully applies config `decay_rate=0.05` (φ=0.95); KILLS the config≠behavior worry, and the R29 "net
|
||||
0.90" is resolved as CONTINUOUS RE-APPRAISAL (only NEW dedup-gated emotions push mood; the active set
|
||||
decays for render/goals but never re-pushes — source-confirmed vs `registry.py::post_turn`). **Trait-flat**
|
||||
across baselines 0.0/0.615/0.809; **A/P decay ratio ~uniform, NOT the S2-expected 1.9×** (the chronometry
|
||||
isn't in the point-decay layer). **φ_max rec: relax to ≈0.96** (preserve-persistence). Data + findings on
|
||||
`diag/r30-phi0-step-response` (`23fea72`); relayed to worldtree-dev + brokkr direct.
|
||||
|
||||
(3) **R28 (salience→promotion-worthiness) CLOSED (operator-directed):** a deterministic
|
||||
promotion-worthiness gate suffices, no trained model (brokkr's pre-gate matched a glm-5.1 ceiling). My P00
|
||||
injection-corpus (`docs/diagnostics/r28-p00-injection-corpus.json`) + origin finding were load-bearing; my
|
||||
incumbent-substrate Arm-1 run is held as an OPTIONAL confirmation addendum (brokkr de-prioritized it,
|
||||
non-verdict-changing — run only if he asks).
|
||||
|
||||
**Standing follow-ons (all OTHERS' calls, no-rush; brokkr/worldtree will ping):** brokkr owns the R30
|
||||
coefficient finalization → the per-turn decay has no room for `decay=f(N)` under preserve-persistence, so
|
||||
**R30's decay is being redesigned as a HYBRID wall+turn decay** (brokkr pre-scope); **R30 v1 ships
|
||||
GAIN-only** (N→negative-reactivity) with decay held at the measured 0.95. My **dedicated per-axis A/D run
|
||||
is DEFERRED** into that hybrid-decay design pass (one wall-clock-spaced run does per-axis + a turn-vs-wall
|
||||
probe together). **Phase-2** (moody-lofn GAIN-direction validation) waits on worldtree's
|
||||
`dynamics_from_ocean()` impl. The **relational-dynamics arc verify** (Wave-0/1/2 live on demo) is
|
||||
DEFERRED — it needs the bound-provider round-trip (`relations[]` is Bifrost-provider-only per ADR-0009,
|
||||
NOT on the affect_update SSE — confirmed both ways), its own focused session; worldtree-dev routed the
|
||||
"expose relations[] to non-provider consumers" scope call to Vuong (my rec: keep provider-only).
|
||||
|
||||
**Demo access:** infra-ops provisioned a DEMO Heimdall key (`http://10.250.50.152:8080`, v1.0.0b14, key
|
||||
suffix `…49bc5bfc`, tier user, mirrors personal scope). `affect_update` reads work WITHOUT a self-define
|
||||
step (base-agent affect path ungated for the key as provisioned). Personal `:8081` is still v1.0.0b9;
|
||||
demo `:8080` = b14 (the A1 fix). Env was in `/tmp/r30-demo-env.sh` (ephemeral — re-request via infra-ops
|
||||
if a future session needs demo).
|
||||
|
||||
**THE WEB SURFACE (`ratatoskr-web`, `:8765`) IS NOW THE OPERATOR'S PRIMARY DEBUG SURFACE, at full TUI
|
||||
pane parity + a rebuilt persona pane — `v0.19.5`.** The **persona/affect pane** was rebuilt: it read
|
||||
@@ -144,8 +153,10 @@ findings, cross-model-verified); b2 + the later slices were offered but not revi
|
||||
runs dirty (auto-regen, not chased — never stage it). Contract-skip was invoked for the low-effort
|
||||
GET wrappers + `stream_admin_events`, but contract #2 / #1 / #6 were amended to stay canonical.
|
||||
|
||||
Branch: `main` — **code tip `v0.19.5`** (`a99f247`); memory snapshots ride on top (this arc added no
|
||||
code — investigation + althing coordination only). All pushed to `origin`. Remote: `origin → git@gitea.phasefinal.com:vh/ratatoskr.git`.
|
||||
Branch: `main` — **code tip `v0.19.5`** (`a99f247`); memory snapshots ride on top (the R29→R30 arc added
|
||||
NO ratatoskr code — probes are throwaway `/tmp` scripts + data on `diag/` branches). Two diagnostic data
|
||||
branches pushed: `diag/r29-pad-series` (`61ff2da`) + `diag/r30-phi0-step-response` (`23fea72`) — per-turn
|
||||
affect series + findings, brokkr pulls them. All pushed to `origin`. Remote: `origin → git@gitea.phasefinal.com:vh/ratatoskr.git`.
|
||||
|
||||
## Recent decisions
|
||||
|
||||
@@ -234,6 +245,11 @@ decision. Captures rationale that won't be obvious from code alone.
|
||||
|
||||
- `[2026-07-02]` **Salience finding matured into brokkr R28 (OPEN) — ratatoskr is the eval instrument.** brokkr-smithy-dev's pre-scope panel (3 dwarves + context-blind heid, 6/6) **reframed** the target: PROMOTION-WORTHINESS (durable value), NOT salience (momentary attention) — "17×23?" genuinely IS salient, so recalibrating salience yields a well-calibrated WRONG answer; the unit is SET-SELECTION under budget; eval must be OUTCOME-aligned (recall@budget / precision-at-rate), not discrimination-spread. Ties to prior art R15 (small-model memory write-policy → the granite pick) + R25 (worldtree-kb-quality). **ratatoskr delivered the P00 stratified injection-corpus** (`docs/diagnostics/r28-p00-injection-corpus.json`, committed `4a35512`; 24 self-labeling synthetic items × 3 strata) + 2 persistence-side run-validity pins (absent≠dropped without a guaranteed promotion pass; fresh agent+end_user per run vs server-dedup). **Key architectural constraint I surfaced: ratatoskr is DOWNSTREAM of the promotion gate (sees only PROMOTED chunks), so I can give keep/drop OUTCOMES via injection but NOT the pre-admission shadow pool** — that's Worldtree instrumentation. Standing by to RUN the eval once brokkr pins per-stratum N + the decision rule (gated on worldtree-dev's pipeline answer + a dwarf pass on the Snorri rule). brokkr owns methodology + takes the pipeline questions to worldtree-dev direct; ratatoskr = eval instrument. [consumer/provider thesis → a research target]
|
||||
- `[2026-07-02]` **Relational-dynamics arc LIVE on demo (Worldtree v1.0.0b9) — driven by MY relation_context flag.** #319/#320 Waves 0/1/2 deployed. On the wire we persist (schema UNCHANGED): relation_context varies+demotes/ruptures; other_stance + agency now live; agency going live SHIFTS our canonical directive render past the canon ±0.2 deadband (expected, non-breaking — we key on bands); obligation_balance → 人情 ledger when tie="mixed". **ratatoskr needs NO code change** (value-agnostic renders; confirmed render-clean to worldtree-dev). **Can't live-confirm yet — our Heimdall key is personal-`:8081`-only (per-instance), demo is out of reach; will drive+confirm once PERSONAL gets b9.** Optional follow-up: surface `other_stance` (newly live, unrendered). The consumer/provider thesis: one persona-pane finding drove a full 3-wave upstream arc to production.
|
||||
- `[2026-07-02]` **R28 (salience→promotion-worthiness) CLOSED (operator-directed).** A deterministic promotion-worthiness gate suffices, no trained model (brokkr's pre-gate matched/beat a strong glm-5.1 ceiling); my P00 injection-corpus + origin finding were load-bearing. My incumbent-substrate Arm-1 run is held as an OPTIONAL confirmation addendum (brokkr de-prioritized it, non-verdict-changing — run only if he asks).
|
||||
- `[2026-07-02]` **R29 (PAD mood-dynamics) finding SHIPPED as Worldtree's A1 anchor fix (demo v1.0.0b14, `e1cdf82`).** Live-probing base persona agents reframed the over-regulation from "flat-near-zero" to **decay-to-NEUTRAL + low emotion→PAD gain** (NOT baseline-anchored) — triangulated across 3 baselines (arousal converges to 0 ∝ distance) + a step-response (decay τ symmetric across signs; the hedonic asymmetry is ceiling/anchor-EMERGENT, not a decay or gain primitive — this OVERTURNED the survey's asymmetry recommendation). worldtree-dev shipped A1: `decay_anchor = baseline_pad()` (was neutral) + `positive_p_cap` removed. Data `diag/r29-pad-series` (`61ff2da`). Corrected my own earlier "appraisal emissions are internal-only" claim — they ARE observable via `emotions_active` on base agents.
|
||||
- `[2026-07-03]` **R30 Phase-1 φ0 measured — deployed engine CONFIG-FAITHFUL (φ0≈0.95).** Joint two-timescale fit (brokkr-ruled method (b)) + empty-tail cross-check on demo b14: φ0 ≈ 0.95–0.97 (empty-tail 0.95 exact, joint 0.971±0.01), intercept c≈0 → config `decay_rate=0.05` (φ=0.95) faithfully applied; trait-flat across baselines 0.0/0.615/0.809; A/P ratio ~uniform (NOT S2's 1.9×); φ_max rec relax→0.96. Data `diag/r30-phi0-step-response` (`23fea72`). The method converged after I read Worldtree source: only NEW dedup-gated emotions push mood (`registry.py::post_turn` L307-324; the active set decays for render/goals but never re-pushes), so R29's "net 0.90" is CONTINUOUS RE-APPRAISAL not re-push — worldtree-dev confirmed source-authoritatively; brokkr's corrected covariate landed identical. [auto-memory `reference-worldtree-affect-surface-map`]
|
||||
- `[2026-07-03]` **R30 forward disposition (brokkr-owned; tracked at brokkr R30, "brokkr/worldtree will ping").** The per-turn decay has no room for `decay=f(N)` under preserve-persistence + the A/P-not-1.9 finding → R30's decay is being redesigned as a HYBRID wall+turn decay (brokkr pre-scope). R30 v1 ships GAIN-only (N→negative-reactivity) with decay held at the measured 0.95. My dedicated per-axis A/D run is DEFERRED into the hybrid-decay design pass (one wall-clock-spaced run does per-axis + a turn-vs-wall probe together). Phase-2 (moody-lofn GAIN-direction validation) waits on worldtree's `dynamics_from_ocean()` impl.
|
||||
- `[2026-07-03]` **Relational-arc verify DEFERRED — `relations[]` is Bifrost-provider-only (ADR-0009), confirmed both ways.** The relational-dynamics state (relation_context tie-type / agency / warmth / trust) is NOT on the conversation-API `affect_update` snapshot for base agents (keys: pad/dominant_emotion/emotions_active/baseline_pad/mood_drift only) — only in the provider store; worldtree-dev confirmed by-design per ADR-0009 (emitted over `affect.emit`, deliberately off the SSE). So the Wave-0/1/2 verify needs the bound-provider round-trip (provider running + `--bifrost-plane affect` session), its own focused session. worldtree-dev routed the "expose relations[] to non-provider consumers" observability scope call to Vuong; my rec: keep provider-only (YAGNI — ratatoskr IS a provider, gains nothing; no speculative public surface).
|
||||
|
||||
_41 older entries (2026-05-* — the original debug-TUI/web build era) archived to archival-memory.md._
|
||||
|
||||
@@ -271,5 +287,8 @@ defense against re-attempting the same cul-de-sac.
|
||||
- `[2026-06-20]` **The post-turn-async timing trap bit AGAIN — even a 35s post-`[done]` read missed the promotion `upsert_many` by ~2s** (it landed `19:48:58`; the read was ~`19:48:56`). A 15s-interval background poll caught it on the first tick. Same family as the affect.emit / async-promotion traps already logged — re-confirmed that "wait once then read" is fragile for post-turn writes; **poll a window, don't snapshot once.** (The affect.emit write, by contrast, DID land inside the 35s window — promotion is the slower of the two post-turn writes.)
|
||||
- `[2026-06-30]` **Heimdall keys are PER-INSTANCE — a key minted on one Worldtree 401s on another.** Our Conversation-API key works on personal `:8081` but 401s `auth_invalid` on demo `:8080` (per-instance Heimdall user store + pepper; fresh deploys start with an EMPTY key store). Same as the admin key (personal-only). **To live-drive a given instance you need a key minted FOR that instance** (request via infra-ops). Couldn't live-prove the b2 409 on demo for this reason → deferred to personal-b2 where we have access.
|
||||
- `[2026-06-30]` **`tea comment <N>` hangs on Gitea** (the whole compound bash auto-backgrounded + stuck on the open `tea` call). The #11 prereq comment hung; killed it + posted via the Gitea HTTP API directly (`POST /api/v1/repos/vh/ratatoskr/issues/<N>/comments`, token from `~/.config/tea/config.yml`). **For issue comments, prefer the Gitea API over `tea comment` when `tea` is flaky** (CLAUDE.md already says use HTTP for comment-EDITS; this extends it to ADD when tea hangs). Verify-then-post (check the comment didn't already land) to avoid a double-post after a kill.
|
||||
- `[2026-07-02]` **Mask-HOSTED transient characters have a STATIC mood engine — cost a whole R29 probe.** A first probe used a `POST /characters` transient character bound via `agent_id=mask` + `character_id`; its PAD sat at baseline across 15 praise/contempt/dominance turns — the appraisal→PAD engine does NOT run on the mask-hosted transient-character path. The dynamics run only on BASE persona agents or a session bound to ratatoskr's affect provider. **To probe mood dynamics, use a base persona agent, never a mask-hosted transient character.** (mask AS a base agent — `agent_id=mask`, NO `character_id` — DOES run the engine, neutral 0,0,0 baseline.) [auto-memory `reference-worldtree-affect-surface-map`]
|
||||
- `[2026-07-03]` **The "neutral non-appraising tail" premise fails — the neutral MESSAGE choice dominates.** The R30 φ0 method assumed neutral turns don't re-appraise, but factual-question neutrals ("capital of France?") trigger a new emotion nearly every turn (disappointment from the warmth-withdrawal let-down after a positive impulse) → `emotions_active` never empties in 50 turns. A minimal "Please continue." triggers FAR fewer (emotions clear ~turn 16 with spacing). The personal dry-run caught this BEFORE ~280 demo turns were spent on it — the instrument catching a flaw in the measurement design before the compute burn. (Irrelevant to the joint fit — the push_t covariate handles re-appraisal — but load-bearing for the empty-tail read.)
|
||||
- `[2026-07-03]` **Two φ0-fit traps: fast-turn timescale + low-baseline conditioning.** (1) At fast turn cadence the per-turn PAD decay (φ≈0.95/turn) reaches the anchor LONG before the ~200s wall-clock emotion fade → no signal in the (eventual) emotion-free tail; need wall-clock SPACING (~16s) so the fade lands while PAD still has signal. (2) A low-baseline agent's impulse in the constrained direction (forseti P0.239 negative) gives a tiny excursion → ill-conditioned regression (r²=0.46) that FALSELY tripped "config≠behavior" when its φ was averaged in. **Weight/exclude by fit quality (r²) before aggregating — a signal-poor run isn't evidence against the config.**
|
||||
|
||||
_18 older entries (2026-05-* — the original debug-TUI/web build era) archived to archival-memory.md._
|
||||
|
||||
Reference in New Issue
Block a user