Compare commits

...

10 Commits

Author SHA1 Message Date
vh 23fea72c6f docs(diagnostics): R30 φ0 — fold in mask_neg (8/8 complete)
mask_neg recovered from the demo SSE stall; well-conditioned (φ_P 0.982, r²0.95),
confirms the verdict. 6 well-conditioned runs: φ_P=0.971±0.01 joint; empty-tail
nails 0.95 exact (joint carries a small push-under-attribution upward bias).
Config faithful; verdict unchanged.
2026-07-03 07:27:26 -07:00
vh 875f291a42 docs(diagnostics): R30 Phase-1 φ0 measurement — config faithful (demo b14)
Joint two-timescale fit (brokkr-ruled) + empty-tail cross-check against the A1
corrected anchor (baseline_pad). Deployed PAD-point decay φ0 ≈ 0.95-0.97 across
3 baselines (lofn/mimir/mask), intercept c≈0 → config (decay_rate=0.05, φ=0.95)
is faithfully applied; the R29 net-0.90 was continuous re-appraisal, not re-push.
Trait-flat confirmed; A/P ratio ~uniform (not the S2-expected 1.9); φ_max rec:
relax to ~0.96. forseti signal-poor (low-baseline small excursion, excluded);
mask_neg stalled on a demo hang (7/8).
2026-07-03 07:04:00 -07:00
vh c77ff913f0 memory: snapshot — R28 open (promotion-worthiness reframe, P00 corpus delivered, standing by to run) + relational-dynamics arc LIVE on demo (v1.0.0b9) 2026-07-02 07:49:54 -07:00
vh 4a3551254f docs(diagnostics): R28 P00 stratified injection-corpus for brokkr-smithy salience/promotion-worthiness eval 2026-07-02 07:29:39 -07:00
vh 0b7489f74d memory: snapshot — Sindra affect/memory investigation; 4 upstream items driven (PAD over-regulation, memory-plane healthy, salience #335 + brokkr R-target, relation_context Wave-0) 2026-07-01 22:23:58 -07:00
vh 3dac5d3b44 memory: snapshot — persona-pane rebuild (relation_edge/1 + trend) + canonical affect-NL vendored (v0.19.5); relation_context/agency flag WAD 2026-07-01 14:47:32 -07:00
vh a99f2473b6 feat(web): persona pane shows the CANONICAL affect->NL Worldtree injects (v0.19.5)
The pane now renders the LITERAL mood word + relationship directive Worldtree
context-injects into the agent — adopted from Worldtree's canon, not invented:

- canonMood(pad) mirrors Worldtree describe_pad (valence×arousal grid, ±0.3 bands);
  for sindra's PAD the canonical render is "neutral" — an invented octant vocab
  would have said "faintly excited" and MISLED. Adopting canonical is the point.
- canonDirective(rel) mirrors render_d2_canonical byte-exact: "...warmth is clear
  warm regard; ability trust is strong; ...; speak with direct warmth; ..." — the
  exact stance instruction the agent receives (which makes the WAD "stranger"
  relation_context read even more incoherent, as flagged to worldtree-dev).
- Both VERIFIED byte-exact against Worldtree's OWN renderer on the live snapshot.
- Canon vendored (docs/vendor/worldtree-persona-canon/) + drift-pinned in
  .corviduo-canonicals.toml (canonical_drift green); flat browser form
  (static/persona_render_canon.json) regenerated by scripts/build_persona_canon.py
  via Worldtree's authoritative loader. Reference-impl posture: adopt canonical.
- Fail-open (canon absent -> lines omit); INV-004 esc() preserved.

JS syntax clean. Refresh + drive turns to see the canonical NL under mood + each
relation.
2026-07-01 13:51:37 -07:00
vh ca46a93171 feat(web): persona pane renders the relation_edge/1 affect model + per-value trend (v0.19.4)
The persona/affect pane read snap.valence (the pre-#265 shape) while Worldtree now
emits snap.relations (relation_edge/1) — so the whole trust/warmth model rendered as
an empty "valence (0)". Now renders the real signal, self-labelled:

- MOOD (PAD, transient): pleasure/arousal/dominance with a one-word descriptor each.
- RELATION → <target> (stage: <relation_context>): trust·ability / benevolence /
  integrity + warmth, each as value + evidence_count (n=) — the durable social model.
- Per-value TREND: Δ-vs-previous (▲/▼) + a unicode sparkline auto-scaled to the value's
  own observed range (flat when sub-0.01 stable, so noise isn't amplified). History
  accumulates client-side, one sample/turn (deduped by emitted_at), capped at 24.
- Falls back to the legacy snap.valence for an older emitter; INV-001 (no fabricated
  Tier-1 fields) + INV-004 (every cell escaped) preserved. Supersedes the #18-D2
  valence assumption + retires the stale "regard dead axis" note.

Verified: render logic asserted in node against the REAL affect.db snapshot + a
perturbed 2nd sample (relations rendered, no "valence (0)", Δ ▲ shown, 2-char
sparkline builds, INV-004 holds). JS syntax clean. No server change (static served
per-request) — refresh + drive turns to watch the trends build.
2026-07-01 13:20:24 -07:00
vh 85a2b95428 memory: snapshot — web debug-surface parity primary (v0.19.3), heid review, embedding-loop resolved, Tier-3 reset 2026-07-01 12:57:10 -07:00
vh 75dec016eb fix(web): heid-review findings — SSE lifecycle teardown + test-shape gaps (v0.19.3)
Cross-frontier panel (Gróa/Hulda/Regin) on the v0.19.2 web surface, triaged:

- FIX (Gróa #1, drift): the turn EventSource `onerror` (raw transport drop)
  now calls hideThinkingNote() — a drop mid-reasoning no longer leaves the
  "<Agent> is pondering…" line + its setInterval running (INV-LIFECYCLE).
- FIX (Gróa #4 + Hulda #1, convergent drift): openAdminEvents now closes the
  EventSource + clears state.adminES on `stream_error` (server signalled end)
  and on a PERMANENT onerror (readyState CLOSED) — native EventSource no longer
  auto-reconnects into a retry loop; transient CONNECTING drops still reconnect.
- TEST (Gróa #2 + Hulda #3): test_routes_registered asserts the 3 new routes;
  test_state_attached asserts app.state.admin_key (create_app POST-001/002).
- TEST (Gróa #3 + Regin #3): AdminEvents stream_error-on-connect-failure test —
  upstream non-200 -> exactly one `stream_error` frame, then ends (POST-003).
- CONTRACT (Hulda #2 + Regin #2, accepted): clarified the Tools inventory
  renders NAMES only by design (descriptions live in the BifrostState pane);
  code unchanged. Also lands the web_debug_surface contract as the trail.

Accepted-no-op: 403-bifrost / non-404-tools tests (identical code path to the
tested 404). Panel found ZERO functional server-side drift; INV-004 escaping
confirmed clean across the new panes. 60 web tests pass; JS + ruff clean.
2026-07-01 12:52:44 -07:00
21 changed files with 11434 additions and 25 deletions
+20
View File
@@ -123,3 +123,23 @@ consumer_path = "docs/conversation-api-spec.md"
pinned_sha256_16 = "2d111a3b8322b7d1"
pinned_at = "2026-06-30T22:25:56+00:00"
tolerate_drift = true # prose reference; OpenAPI+SSE are the gates
# Worldtree persona render canons (d2) — the deterministic affect->NL the agent is
# context-injected. The web persona pane renders mood + relationship-directive BYTE-EXACT
# from these (via the flat src/ratatoskr/web/static/persona_render_canon.json, regenerated
# by scripts/build_persona_canon.py). Drift here => rerun that regen with Worldtree's venv.
[[pins]]
id = "worldtree-persona-mood-render-canon-v1"
canonical_source = "Worldtree"
canonical_path = "core/persona/canon/d2-mood-render-canon-v1.json"
consumer_path = "docs/vendor/worldtree-persona-canon/d2-mood-render-canon-v1.json"
pinned_sha256_16 = "e2f124fed3ee8d42"
pinned_at = "2026-07-01T21:00:00+00:00"
[[pins]]
id = "worldtree-persona-d2-render-canon-v1"
canonical_source = "Worldtree"
canonical_path = "core/persona/canon/d2-render-canon-v1.json"
consumer_path = "docs/vendor/worldtree-persona-canon/d2-render-canon-v1.json"
pinned_sha256_16 = "606bba5fdcc60b6b"
pinned_at = "2026-07-01T21:00:00+00:00"
@@ -0,0 +1,159 @@
---
contract_version: "2.1"
module: "ratatoskr.web"
purpose: "v0.19.2 web debug-surface parity: 3 admin/debug panes (Tools inventory, BifrostState, AdminEvents SSE) proxied server-side with the admin key server-held, plus a reliable PAD-refresh poll and a non-engine reasoning indicator in the transcript."
target_module: "ratatoskr.web (server.py routes + entrypoint.py + static/index.html)"
scope: "v0.19.2 web debug-surface parity — bring the browser surface (now the PRIMARY debug surface) to TUI parity. THREE new admin/debug panes proxied server-side + TWO transcript affordances. (1) Tools inventory: GET /api/sessions/{id}/tools proxies owner-scoped get_session_tools into the tools pane (what the LLM HAS at turn-fire), above the live tool events. (2) BifrostState pane: GET /api/sessions/{id}/bifrost proxies admin-scoped get_session_bifrost; the admin key is SERVER-HELD (app.state.admin_key from RATATOSKR_ADMIN_API_KEY), never sent to the browser. (3) AdminEvents pane: GET /api/admin/events is an SSE proxy of stream_admin_events, session-filtered SERVER-side (heartbeats + other-session events dropped), re-emitted under a fixed 'admin_event' name so every dotted type renders with one browser listener. (4) PAD refresh: the persona/affect pane polls a bounded window instead of a single 2s shot that raced the post-turn-async affect.emit. (5) Reasoning indicator: an ephemeral, clearly-non-engine transcript line on `thinking` deltas, cleared when text begins. Direct in-session TDD (the #17/#18 pattern); this contract is authored post-implementation to anchor the heid code review (the client wrappers get_session_tools/get_session_bifrost/stream_admin_events are already contracted in the sessions/sse_client specs — this contract governs the WEB proxy + presenter surface only)."
depends_on:
- "httpx"
- "starlette"
- "ratatoskr.sessions" # get_session_tools, get_session_bifrost, SessionApiFailed
- "ratatoskr.sse_client" # stream_admin_events, AdminEvent, SseConnectFailed/Dropped
used_by:
- "ratatoskr.web.entrypoint" # passes admin_key=RATATOSKR_ADMIN_API_KEY into create_app
language: "python + vanilla JS (single-file SPA, no build)"
complexity: "medium"
estimated_loc: 290
confidence: 0.8
assumptions:
- "The three client wrappers exist and are already contracted: get_session_tools(client, session_id)->dict (owner-scoped, consumer bearer; non-200 -> SessionApiFailed), get_session_bifrost(client, session_id, *, admin_key)->dict (OVERRIDES Authorization with admin_key; non-200 -> SessionApiFailed), stream_admin_events(client, *, admin_key)->AsyncIterator[AdminEvent] (non-200 -> SseConnectFailed; mid-drop -> SseConnectionDropped). The web routes are thin proxies over them; they add NO new upstream semantics."
- "AdminEvent = {id:int, type:str, timestamp:str|None, data:dict}. data MOST carry session_id (INV-049). type is a dotted namespace (session.*/turn.*/key.*/system.*)."
- "The web SPA is a single static/index.html served per-request via FileResponse (edits land on browser refresh; server code changes need a restart). Model/tool/admin content is UNTRUSTED text (INV-004) — every render path escapes first (esc() via textContent, or JSON.stringify wrapped in esc())."
- "The internal-LAN trust model (0.0.0.0, no auth/TLS/CORS) is deliberate operator direction. Admin-scoped DATA becoming LAN-visible is accepted under that model; the admin KEY must nonetheless never cross to the browser."
- "Tests: respx mocks the upstream endpoints (absolute w.example URLs) driven through the TestClient; the AdminEvents SSE proxy is tested with a finite mocked SSE byte-stream asserting the filter + fixed event name. Live-proven against ratatoskr:sindra on personal :8081."
# ─────────────────────────────────────────────────────────────────────────────
functions:
- name: "_session_tools_endpoint"
signature: "async _session_tools_endpoint(request: Request) -> JSONResponse"
description: "GET /api/sessions/{session_id}/tools — proxy owner-scoped tool inventory."
preconditions:
- "session_id in path_params."
postconditions:
- "POST-001: 200 with the upstream inventory dict verbatim on success."
- "POST-002: on SessionApiFailed(status) -> JSONResponse({error_code:'session_tools_unavailable', status}, status_code=status) — status-preserving."
steps: "Open client_factory() client; await get_session_tools(client, session_id); return 200. Except SessionApiFailed -> status-preserving envelope."
flexibility: "prescriptive"
- name: "_session_bifrost_endpoint"
signature: "async _session_bifrost_endpoint(request: Request) -> JSONResponse"
description: "GET /api/sessions/{session_id}/bifrost — proxy admin-scoped Bifrost dispatch state."
preconditions:
- "session_id in path_params."
- "PRE-001 (fail-visible): app.state.admin_key must be truthy; else 400 admin_key_not_configured with NO upstream call."
postconditions:
- "POST-001: the admin key is read from app.state.admin_key ONLY; it is passed to get_session_bifrost(admin_key=...) and NEVER placed in a response body or surfaced to the browser."
- "POST-002: 200 with the upstream state dict verbatim on success."
- "POST-003: on SessionApiFailed(status) -> {error_code:'bifrost_state_unavailable', status} at status_code=status (notably 404 not-bound, 403 scope-denied)."
steps: "If not admin_key -> 400. Open client; await get_session_bifrost(client, session_id, admin_key=admin_key); 200. Except SessionApiFailed -> status-preserving envelope."
flexibility: "prescriptive"
- name: "_admin_event_matches_web"
signature: "_admin_event_matches_web(ev: AdminEvent, session_id: str | None) -> bool"
description: "AdminEvents session-filter (mirrors the TUI _admin_event_matches, design-brief §6)."
postconditions:
- "POST-001: ev.type == 'system.heartbeat' -> False (keepalive noise dropped)."
- "POST-002: ev.type.startswith('system.') (non-heartbeat) -> True (stream-integrity signals always pass)."
- "POST-003: otherwise -> True IFF session_id is not None AND ev.data.get('session_id') == session_id (per-session scoping; a None session_id forwards NO non-system event)."
flexibility: "prescriptive"
- name: "_admin_events_endpoint"
signature: "async _admin_events_endpoint(request: Request) -> Response"
description: "GET /api/admin/events?session_id=... — SSE proxy of stream_admin_events, session-filtered server-side."
preconditions:
- "PRE-001 (fail-visible): app.state.admin_key truthy; else 400 admin_key_not_configured with NO stream opened."
postconditions:
- "POST-001: returns StreamingResponse(media_type='text/event-stream'); the admin key never crosses to the browser."
- "POST-002: ONLY events passing _admin_event_matches_web(ev, session_id) are forwarded; each is re-emitted under the FIXED SSE event name 'admin_event' with {id,type,timestamp,data} in the payload (the real dotted type rides in the payload, so one browser listener renders every type — nothing silently dropped by name)."
- "POST-003: SseConnectFailed/SseConnectionDropped/MalformedSseId/MalformedSseData -> a single 'stream_error' SSE frame, then the stream ends (best-effort; never raises to the browser)."
- "POST-004: asyncio.CancelledError (browser disconnect) re-raises to unwind the generator; the upstream client is aclose()'d in finally on every exit path."
steps: "If not admin_key -> 400. gen(): open client; async-for ev in stream_admin_events(admin_key); skip unless _admin_event_matches_web; yield _format_sse('admin_event', {...}). Except SSE errors -> yield stream_error. Except CancelledError -> raise. Finally aclose(). Return StreamingResponse(gen())."
flexibility: "prescriptive"
- name: "create_app (amendment)"
signature: "create_app(client_factory, *, end_user_id=None, bifrost_consumer_key=None, bifrost_visible_host=None, affect_read_url=None, admin_key=None) -> Starlette"
description: "New optional admin_key param stored at app.state.admin_key; entrypoint passes RATATOSKR_ADMIN_API_KEY. Three new routes registered."
postconditions:
- "POST-001: app.state.admin_key = admin_key (default None -> the two admin routes fail-visible per their PRE-001)."
- "POST-002: routes /api/sessions/{session_id}/tools, /api/sessions/{session_id}/bifrost, /api/admin/events added; existing routes unchanged."
flexibility: "closed"
- name: "reasoning indicator (index.html: showThinkingNote / hideThinkingNote)"
signature: "showThinkingNote() ; hideThinkingNote() // called from the turn SSE loop"
description: "Ephemeral transcript affordance signalling reasoning inference — clearly NOT engine output."
postconditions:
- "POST-001: on the first `thinking` delta, an italic '<Agent> <phrase>' line (✦ glyph, rotating phrase) is shown; it supersedes any live 'awaiting first token' heartbeat."
- "POST-002: the agent display name is derived from state.agentId and rendered via textContent (NEVER innerHTML) — INV-004 holds even for an adversarial agent_id."
- "POST-003: it is removed the instant the first `text` delta arrives, and on any terminal (done/error/cancelled); the rotation interval is cleared on removal (no leaked setInterval)."
flexibility: "prescriptive"
- name: "PAD refresh poll (index.html: terminal() done-branch)"
signature: "on Done: poll loadPersona over [1500,3500,6500,10500]ms"
description: "Catch the post-turn-async affect.emit without racing it (replaces the single 2s shot)."
postconditions:
- "POST-001: loadAffect sets state.lastAffectAt = snap.emitted_at; the poll captures beforeAt and stops (settled) once state.lastAffectAt !== beforeAt."
- "POST-002: a scheduled poll no-ops if a NEW turn has started (state.turnId truthy) or already settled — no refresh of a stale agent, no unbounded polling."
flexibility: "open"
- name: "web pane renderers (index.html: renderToolsInventory / renderBifrostState / openAdminEvents)"
signature: "renderToolsInventory(inv) ; renderBifrostState(b) ; openAdminEvents(sessionId)"
description: "Render the three new surfaces; all content escaped (INV-004)."
postconditions:
- "POST-001: every dynamic value (agent_id, tool names/descriptions, endpoint, caps, admin event type + data) is passed through esc() or esc(JSON.stringify(...)); no upstream string reaches innerHTML unescaped."
- "POST-002: openAdminEvents closes a prior EventSource before opening a new one (state.adminES); the admin data blob renders via esc(JSON.stringify(d.data))."
- "POST-003: renderToolsInventory prepends the static inventory ABOVE live tool events without clobbering them (a re-render replaces only the .tools-inventory block)."
- "POST-004: the Tools inventory renders tool NAMES only — a compact comma-joined summary ('what does the LLM have', the debug glance); per-tool DESCRIPTIONS are surfaced in the BifrostState pane's tools list, deliberately NOT duplicated here. (Heid panel Hulda/Regin precision finding — accepted: contract wording clarified, code unchanged; the earlier 'names/descriptions' phrasing in INV-004 refers to the SET of value types that MAY appear across the new panes and must be escaped, not a mandate that every pane render descriptions.)"
flexibility: "open"
- name: "renderAffectPane + trend (v0.19.4 — relation_edge/1 render + sparkline)"
signature: "renderAffectPane(snap) ; pushAffectHistory(snap) ; sparkline(vals) ; trendDelta(vals)"
description: "Render the Tier-3 affect snapshot as PAD mood + the durable per-entity relational model, each value with a Δ-vs-previous + a session-lived sparkline."
postconditions:
- "POST-001: reads snap.relations (relation_edge/1: target_entity + trust_ability/benevolence/integrity + warmth as {value,confidence,evidence_count} + agency + relation_context + obligation_balance) — the CURRENT Worldtree emit shape; falls back to the legacy flat snap.valence for an older emitter. SUPERSEDES the #18-D2 contract's valence assumption (Worldtree's #265 Vili rework replaced valence/regard with the relation_edge/trust model; the old renderer read snap.valence and showed an empty 'valence (0)' — the bug this fixes)."
- "POST-002: each metric shows current value + Δ-vs-previous (▲/▼) + a unicode sparkline auto-scaled to its OWN observed range (flat ▄ when sub-0.01 stable — no noise amplification), drawn from AFFECT_HIST (rolling, HIST_CAP=24, session-lived)."
- "POST-003: pushAffectHistory dedupes by emitted_at so the ~4x/turn post-turn PAD poll contributes ONE sample/turn; history is CLIENT-side only (lost on reload — durable cross-session history via a provider-side snapshot log is a deferred follow-up, NOT built here)."
- "POST-004: INV-001 honesty — no fabricated Tier-1 fields (no synthesized dominant_emotion). INV-004 — head() escapes its whole argument (incl. target_entity + relation_context from the snapshot) and metric() escapes every cell; numeric values go through toFixed, never innerHTML-raw."
flexibility: "open"
- name: "canonical affect-NL (v0.19.5 — vendored Worldtree d2 render canons)"
signature: "canonMood(pad) ; canonDirective(rel) ; loadPersonaCanon()"
description: "Render the LITERAL mood word + relationship directive Worldtree context-injects into the agent, byte-exact to Worldtree's own describe_pad + render_d2_canonical."
postconditions:
- "POST-001: DETERMINISTIC, no LLM. canonMood mirrors describe_pad (valence×arousal grid + strict ±0.3 bands + dominance clause); canonDirective mirrors render_d2_canonical (interval band-cut lookup + per-band phrase assembly + cross-axis low-trust-precedence behavior clause). BOTH VERIFIED BYTE-EXACT against Worldtree's own renderer run on the live snapshot (the reference harness re-runs Worldtree's functions + asserts string equality — reproducible)."
- "POST-002: the canon DATA is VENDORED (docs/vendor/worldtree-persona-canon/{d2-mood-render-canon-v1,d2-render-canon-v1}.json), pinned drift-gated in .corviduo-canonicals.toml (worldtree-persona-{mood,d2}-render-canon-v1); the flat browser form (static/persona_render_canon.json, served /static) is regenerated by scripts/build_persona_canon.py via Worldtree's OWN authoritative loader. Reference-impl posture: ADOPT the dep's canonical render, do NOT invent vocab — an invented 'faintly excited' would MISLEAD where the canonical (±0.3 bands) says 'neutral'."
- "POST-003: fail-open — canon absent (fetch fails) → the canonical lines OMIT, the structured pane still renders. The canon-derived strings are esc()'d before the DOM for INV-004 consistency."
flexibility: "open"
invariants:
- "INV-004 (untrusted-render): ALL model / tool / admin / agent-supplied text is escaped before entering the DOM (esc via textContent, or esc(JSON.stringify)). No new render path introduces an innerHTML sink for upstream content. This is the highest-value review target — the new JS render paths are NOT unit-tested."
- "INV-ADMIN-KEY: the admin key exists ONLY at app.state.admin_key (from RATATOSKR_ADMIN_API_KEY). It is never serialized into any response, never sent to the browser, never logged. The browser receives only the session-filtered RESULT of admin-scoped reads."
- "INV-FILTER: AdminEvents filtering happens SERVER-side (_admin_event_matches_web) — the browser never receives the cross-session admin firehose; only active-session events + non-heartbeat system.* cross the wire."
- "INV-FAIL-VISIBLE: both admin routes return 400 admin_key_not_configured when the key is absent — never a silent empty pane, never an upstream call with an empty bearer."
- "INV-LIFECYCLE: SSE generators and EventSources are cleaned up on every exit path (upstream client aclose() in finally; setInterval cleared in hideThinkingNote; prior EventSource closed before re-open) — no leaked connections, tasks, or timers."
- "INV-ADDITIVE: existing routes, panes, and the turn-stream path are unchanged; the 3 new routes + 2 new tabs are purely additive (59 web tests incl. all prior ones stay green)."
---
# v0.19.2 — web debug-surface parity (BifrostState · AdminEvents · Tools · PAD-poll · reasoning)
## Context
The browser surface is now the operator's PRIMARY debug surface, and it lagged the
TUI: the TUI gained Tools/BifrostState/AdminEvents panes (v0.18.9.11) that were never
ported to the web. This change closes that gap and adds two transcript affordances (a
reliable PAD refresh + a reasoning indicator). The client wrappers already existed and
are contracted elsewhere; this contract governs the WEB proxy routes + the SPA presenter
paths, whose JS render code is not unit-tested — hence the cross-frontier code review.
## Review focus (for the heid panel)
1. **INV-004 escaping** in every new render path — the un-unit-tested surface; the exact
class of bug (`renderPersonaPane` fabricating a Tier-1 field) that only a cross-model
review caught on #18 D2.
2. **INV-ADMIN-KEY** — confirm the admin key never reaches a response body or the browser.
3. **AdminEvents SSE proxy** (`_admin_events_endpoint`) — generator/filter/lifecycle: fixed
event name, server-side filter, `stream_error` on failure, `aclose()` on every path,
`CancelledError` re-raise on disconnect.
4. **PAD-poll** stop-condition — does `emitted_at` advancement + the `state.turnId` guard
correctly stop the poll without racing or leaking timers?
5. **Reasoning indicator** lifecycle — shown on first `thinking`, removed on first `text`
or terminal, interval cleared (no leaked `setInterval`), name via `textContent`.
@@ -0,0 +1,49 @@
{
"corpus_id": "R28-P00-injection-corpus-v1",
"for": "brokkr-smithy R28 (memory promotion-worthiness) — P00 material",
"author": "ratatoskr-dev (persistence-side eval instrument)",
"purpose": "Stratified, SELF-LABELING injection corpus. Each item is injected as a user turn into a Tier-3 agent; keep/drop is measured by store-inspection (promoted chunk present == kept, absent == dropped); kept chunks carry the incumbent salience for calibration analysis. Because ratatoskr injects the KNOWN set, we hold ground truth on BOTH keep and drop without needing Worldtree's pre-admission shadow pool (sidesteps the selection bias).",
"important": "All user-facts here are SYNTHETIC (a fictional test persona), NOT the operator's real data. Ground-truth labels are the design intent. brokkr pins exact per-stratum N + the decision rule (matched-keep-rate + paired-n) at P00 freeze; this is the material, not the run.",
"measurement_protocol": "inject item -> drive the turn -> poll memory.db (async promotion window) -> is the item's chunk present? kept:dropped. For stratum B (priority), rank the KEPT items by incumbent salience and compare to priority_rank_gt (Spearman). Calibration-control (stratum C) sets the noise floor.",
"strata": {
"A_admission_traps": {
"gt": "must-DROP (ephemera; a good promotion-worthiness gate rejects all of these)",
"items": [
{"id":"A1","text":"What's 27 minus 9?","admission_gt":"drop","rationale":"arithmetic task-result; momentarily salient, zero durable value (the 17x23 class)"},
{"id":"A2","text":"Good evening!","admission_gt":"drop","rationale":"greeting"},
{"id":"A3","text":"hey","admission_gt":"drop","rationale":"greeting/backchannel fragment"},
{"id":"A4","text":"yeah, sure, okay.","admission_gt":"drop","rationale":"acknowledgement filler"},
{"id":"A5","text":"haha nice","admission_gt":"drop","rationale":"affective reaction, no content"},
{"id":"A6","text":"Can you say that more briefly?","admission_gt":"drop","rationale":"instruction-to-agent about THIS turn; not a durable user-fact"},
{"id":"A7","text":"What's the weather like?","admission_gt":"drop","rationale":"transient query"},
{"id":"A8","text":"hmm, let me think.","admission_gt":"drop","rationale":"self-talk filler"},
{"id":"A9","text":"thanks, that's all for now.","admission_gt":"drop","rationale":"closing"},
{"id":"A10","text":"So the total comes to 42, got it.","admission_gt":"drop","rationale":"ephemeral task-result acknowledgement"}
]
},
"B_priority_traps": {
"gt": "must-KEEP, then ORDERED by durable promotion-worthiness (priority_rank_gt: 1 = most worthy). A pre-gate can ace admission here yet do NOTHING for ordering — this stratum is what separates Outcome-A (admission) from a priority need.",
"items": [
{"id":"B1","text":"Please note, this is critical: I'm severely allergic to shellfish and it's life-threatening.","admission_gt":"keep","priority_rank_gt":1,"rationale":"safety-critical, permanent, high-recall-value"},
{"id":"B2","text":"My father is in hospice care and I'm his primary emergency contact.","admission_gt":"keep","priority_rank_gt":2,"rationale":"high-stakes ongoing life context"},
{"id":"B3","text":"I go by Wren, and my pronouns are they/them.","admission_gt":"keep","priority_rank_gt":3,"rationale":"durable identity, high address-correctness value"},
{"id":"B4","text":"I work night shifts, so I'm asleep most days between 9am and 5pm.","admission_gt":"keep","priority_rank_gt":4,"rationale":"durable scheduling context, moderate value"},
{"id":"B5","text":"Always give me sources — I don't trust unsourced claims.","admission_gt":"keep","priority_rank_gt":5,"rationale":"durable strong working preference"},
{"id":"B6","text":"I take my tea with oat milk and no sugar.","admission_gt":"keep","priority_rank_gt":6,"rationale":"durable mild preference, low stakes"},
{"id":"B7","text":"My favorite season is autumn.","admission_gt":"keep","priority_rank_gt":7,"rationale":"durable but trivial"},
{"id":"B8","text":"I watched a pretty decent documentary last week.","admission_gt":"keep","priority_rank_gt":8,"rationale":"borderline: durable-ish but near-zero future value; the keep/drop edge case"}
]
},
"C_calibration_control": {
"gt": "OBVIOUS, pre-theoretic cases for the noise floor. If the gate mislabels ANY of these, the whole signal is suspect.",
"items": [
{"id":"C1","text":"3 plus 5.","admission_gt":"drop","class":"obvious-drop","rationale":"bare arithmetic"},
{"id":"C2","text":"hello","admission_gt":"drop","class":"obvious-drop","rationale":"bare greeting"},
{"id":"C3","text":"ok","admission_gt":"drop","class":"obvious-drop","rationale":"bare acknowledgement"},
{"id":"C4","text":"Please remember permanently: my legal name is Wren Alderwood.","admission_gt":"keep","class":"obvious-keep","rationale":"explicit durable identity fact"},
{"id":"C5","text":"Keep this on file: my emergency contact number is 555-0182.","admission_gt":"keep","class":"obvious-keep","rationale":"explicit durable high-value fact"},
{"id":"C6","text":"Important, remember this: my blood type is O-negative.","admission_gt":"keep","class":"obvious-keep","rationale":"explicit durable safety fact"}
]
}
}
}
+79
View File
@@ -0,0 +1,79 @@
# R30 Phase-1 — φ0 PAD-point decay measurement (demo v1.0.0b14, A1 anchor fix)
Executor: ratatoskr-dev · coordinator: worldtree-dev · owner: brokkr-smithy-dev.
Method: **joint two-timescale fit (b)** (brokkr-ruled) + **empty-tail direct fit**
as mutual validation, both run off the same trajectory. Measured against the
**corrected anchor** (`decay_anchor = baseline_pad()`, positive_p_cap removed;
worldtree v1.0.0b14 `e1cdf82`).
## Method
- 4 base agents × {pos, neg} impulse, fresh `end_user` each, 26 turns, "Please
continue." neutrals + ~16s spacing (so one trajectory yields both an
emotion-free tail AND the full joint-fit series). Natural per-turn cadence for
the point-decay; spacing only lets the wall-clock emotion fade land in-window.
- **Capture:** `affect_update` `current` snapshot (live mood) + `emotions_active`
+ wall-clock, per turn.
- **push_t** (the covariate): only NEWLY-appraised, new-type-or-strictly-stronger
emotions push (dedup-gated; confirmed source-authoritative by worldtree-dev vs
`registry.py::post_turn` L307-324 — the persistent `emotions_active` decays for
render/goals but never re-pushes mood). Reconstructed from `emotions_active`
deltas: a type new or strictly-stronger-than-the-prior(decayed)-snapshot pushed
at its new intensity. `push_t[axis] = Σ OCC_PAD_IMPULSES[type]·intensity·0.15`.
- **Model** (per axis, push-then-decay): `y_t=(axis_{t+1}anchor)`,
`X_t=(axis_t+push_tanchor)`, regress `y=φ·X+c` → φ=slope, decay_rate=1−φ,
anchor=`baseline_pad`. Validated on b9 first (φ_P 0.959, c 0.003, r² 0.997).
## Result — CONFIG FAITHFUL
**φ0 (PAD-point decay retention) ≈ 0.950.97, config-faithful.** Both reads agree:
| agent | baseline P | joint φ_P | c_P | r²_P | empty-tail φ0_P |
|---|---:|---:|---:|---:|---:|
| lofn | 0.809 | 0.954 / 0.967 (pos/neg) | ~0.000 | 0.930.94 | — (excursion faded pre-empty) |
| mimir | 0.615 | 0.964 / 0.977 (pos/neg) | 0.012 / 0.015 | 0.970.99 | — (never emptied) |
| mask | 0.000 | 0.983 / 0.982 (pos/neg) | +0.004 / +0.006 | 0.90 / 0.95 | — |
| forseti | 0.239 | signal-poor (r²=0.46/0.61, excluded) | — | — | **0.95** (neg, r²=1.0) |
- **Joint fit, 6 well-conditioned runs (3 baselines; all 8 probes in): φ_P = 0.971
± 0.01** (range 0.9540.983). Consistently a hair above config 0.95 — the
empty-tail read (no push modeling) nails **0.95 exactly**, so the joint fit's
~0.97 carries a small upward bias from push under-attribution; true φ0 ≈ 0.95.
- **Empty-tail cross-check** (forseti_neg's clean pure-decay tail): **φ0_P = 0.95**,
r²=1.0 — independently confirms the joint fit.
- **config cross-check:** measured φ0 ≈ 0.950.97 vs config `10.05 = 0.95`
**config faithfully applied.** The R29 "net ~0.90" was **continuous
re-appraisal** (a new dedup-gated push most turns), NOT re-push contamination.
- **intercept c ≈ 0** across the well-conditioned runs (0.015..+0.004) → the
push_t reconstruction + push-then-decay order are correct on the deployed engine.
### Diagnostics for brokkr
- **(i) residual/c:** c≈0 → push_t + order correctly specified. ✓
- **(ii) φ≈0.95:** YES → config faithful; kills the config≠behavior worry. ✓
- **(iii) A/P decay ratio: NO clean ~1.9.** The per-axis mood-point decay is
roughly uniform (matches the single `decay_rate` in `model.py` L175-179).
CAVEAT: the per-axis **A/D** fits are noisy — small A/D excursions yield some
φ_A>1 artifacts (e.g. mask A/P 1.66 is a fit artifact), so the ratio is not
cleanly determined here; but there is **no support for 1.9×** in the mood-decay
layer. If the S2 ~1.9× chronometry is real it lives elsewhere (the OCC impulse
vectors' per-axis asymmetry, or emotion wall-clock decay), not in point-decay.
A dedicated per-axis run with larger A/D excursions would pin it.
- **trait-flat:** φ_P ~equal across baselines 0.0 / 0.615 / 0.809 → the current
decay is **trait-FLAT** (the pre-R30 baseline R30's `dynamics_from_ocean()` will
modulate). ✓
### φ_max recommendation (preserve-persistence rule, Vuong-locked)
Measured φ0 ≈ 0.96 (> 0.90) → **RELAX φ_max to ≈0.96** — the measured good
operating point defines the cap; do NOT re-base the agents faster.
## Caveats
- **forseti (baseline 0.239) is signal-poor** in the joint fit — a negative
impulse from a low baseline has little down-room → tiny excursion → ill-
conditioned regression (r² 0.46/0.61). Correctly excluded (its empty-tail
still gave a clean 0.95). High/mid-baseline agents (lofn/mimir/mask) carry the
joint-fit signal.
- **mask_neg** recovered from a demo-side SSE stall (turn 14) and completed — all
8/8 in. It is well-conditioned (φ_P 0.982, r² 0.95) and confirms the verdict
(didn't move it). `stream_turn_resilient`'s reconnect handled the transient hang.
Series: `r30-phi0-{lofn,mimir,forseti,mask}-{pos,neg}.json` (per-turn pad +
emotions_active + wall-clock). sec/turn ≈ 1925 (16s spacing + processing).
+664
View File
@@ -0,0 +1,664 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "forseti",
"step": "neg",
"baseline_pad": [
0.239,
-0.696,
0.095
],
"end_user_id": "r30-phi0-forseti-neg-1783086627",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": 14,
"seconds_per_turn": 20.63,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_neg",
"wall_clock": 1783086627.768,
"mood_reflects_after_turn": 0,
"pad": [
0.239,
-0.696,
0.095
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086646.949,
"mood_reflects_after_turn": 1,
"pad": [
0.1877,
-0.67035,
0.107825
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.5683328550825705,
"decay_remaining_s": 199.9792455070927
},
{
"type": "disgust",
"intensity": 0.5683328550825705,
"decay_remaining_s": 199.9792455070927
}
],
"n_emotions": 2
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086667.172,
"mood_reflects_after_turn": 2,
"pad": [
0.190265,
-0.671632,
0.107184
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.3556321297530136,
"decay_remaining_s": 176.77391965695713
},
{
"type": "disgust",
"intensity": 0.3556321297530136,
"decay_remaining_s": 176.77391965695713
}
],
"n_emotions": 2
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086687.501,
"mood_reflects_after_turn": 3,
"pad": [
0.192702,
-0.672851,
0.106575
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.22206186783771448,
"decay_remaining_s": 153.46314161162698
},
{
"type": "disgust",
"intensity": 0.22206186783771448,
"decay_remaining_s": 153.46314161162698
},
{
"type": "disappointment",
"intensity": 0.2698448957707733,
"decay_remaining_s": 163.10993319064005
}
],
"n_emotions": 3
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086707.822,
"mood_reflects_after_turn": 4,
"pad": [
0.195017,
-0.674008,
0.105996
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.1386369753255098,
"decay_remaining_s": 130.14462339625655
},
{
"type": "disgust",
"intensity": 0.1386369753255098,
"decay_remaining_s": 130.14462339625655
},
{
"type": "disappointment",
"intensity": 0.16846872685060676,
"decay_remaining_s": 139.79141497526962
}
],
"n_emotions": 3
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086734.409,
"mood_reflects_after_turn": 5,
"pad": [
0.197216,
-0.675108,
0.105446
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.07447378977503627,
"decay_remaining_s": 99.38579636050295
},
{
"type": "disgust",
"intensity": 0.07447378977503627,
"decay_remaining_s": 99.38579636050295
},
{
"type": "disappointment",
"intensity": 0.09049897776319624,
"decay_remaining_s": 109.03258793951602
},
{
"type": "anger",
"intensity": 0.31292609728127724,
"decay_remaining_s": 170.44160986082557
}
],
"n_emotions": 4
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086753.454,
"mood_reflects_after_turn": 6,
"pad": [
0.199305,
-0.676153,
0.104924
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.04875620814214029,
"decay_remaining_s": 78.41758126513767
},
{
"type": "disgust",
"intensity": 0.04875620814214029,
"decay_remaining_s": 78.41758126513767
},
{
"type": "disappointment",
"intensity": 0.05924751526411994,
"decay_remaining_s": 88.06437284415075
},
{
"type": "anger",
"intensity": 0.2048652281324858,
"decay_remaining_s": 149.47339476546028
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086772.496,
"mood_reflects_after_turn": 7,
"pad": [
0.20129,
-0.677145,
0.104428
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.031522954818552947,
"decay_remaining_s": 56.830547203428814
},
{
"type": "disgust",
"intensity": 0.031522954818552947,
"decay_remaining_s": 56.830547203428814
},
{
"type": "disappointment",
"intensity": 0.038306029487312654,
"decay_remaining_s": 66.47733878244189
},
{
"type": "anger",
"intensity": 0.13245405203550356,
"decay_remaining_s": 127.88636070375141
}
],
"n_emotions": 4
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086792.465,
"mood_reflects_after_turn": 8,
"pad": [
0.203175,
-0.678088,
0.103956
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.019516300742176532,
"decay_remaining_s": 33.097789734970185
},
{
"type": "disgust",
"intensity": 0.019516300742176532,
"decay_remaining_s": 33.097789734970185
},
{
"type": "disappointment",
"intensity": 0.023715796822228047,
"decay_remaining_s": 42.74458131398328
},
{
"type": "anger",
"intensity": 0.0820041499575214,
"decay_remaining_s": 104.1536032352928
}
],
"n_emotions": 4
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086812.741,
"mood_reflects_after_turn": 9,
"pad": [
0.204967,
-0.678983,
0.103508
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.01162721275495882,
"decay_remaining_s": 7.462523834516143
},
{
"type": "disgust",
"intensity": 0.01162721275495882,
"decay_remaining_s": 7.462523834516143
},
{
"type": "disappointment",
"intensity": 0.014129143578398723,
"decay_remaining_s": 17.109315413529234
},
{
"type": "anger",
"intensity": 0.04885555469459899,
"decay_remaining_s": 78.51833733483876
}
],
"n_emotions": 4
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086833.39,
"mood_reflects_after_turn": 10,
"pad": [
0.206668,
-0.679834,
0.103083
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "anger",
"intensity": 0.028487904554031676,
"decay_remaining_s": 51.81951538128418
}
],
"n_emotions": 1
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086853.925,
"mood_reflects_after_turn": 11,
"pad": [
0.208285,
-0.680642,
0.102679
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "anger",
"intensity": 0.017438555367845658,
"decay_remaining_s": 27.52593892013023
}
],
"n_emotions": 1
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086873.881,
"mood_reflects_after_turn": 12,
"pad": [
0.209821,
-0.68141,
0.102295
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "anger",
"intensity": 0.010992041880764065,
"decay_remaining_s": 4.681870162512555
}
],
"n_emotions": 1
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086895.722,
"mood_reflects_after_turn": 13,
"pad": [
0.21128,
-0.68214,
0.10193
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086916.056,
"mood_reflects_after_turn": 14,
"pad": [
0.212666,
-0.682833,
0.101584
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086937.153,
"mood_reflects_after_turn": 15,
"pad": [
0.213982,
-0.683491,
0.101254
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783086957.45,
"mood_reflects_after_turn": 16,
"pad": [
0.215233,
-0.684117,
0.100942
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783086977.889,
"mood_reflects_after_turn": 17,
"pad": [
0.216422,
-0.684711,
0.100645
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783086998.1,
"mood_reflects_after_turn": 18,
"pad": [
0.21755,
-0.685275,
0.100362
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783087018.85,
"mood_reflects_after_turn": 19,
"pad": [
0.218623,
-0.685811,
0.100094
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087039.705,
"mood_reflects_after_turn": 20,
"pad": [
0.219642,
-0.686321,
0.09984
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087060.965,
"mood_reflects_after_turn": 21,
"pad": [
0.22061,
-0.686805,
0.099598
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087081.087,
"mood_reflects_after_turn": 22,
"pad": [
0.221529,
-0.687265,
0.099368
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087101.401,
"mood_reflects_after_turn": 23,
"pad": [
0.222403,
-0.687701,
0.099149
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087123.247,
"mood_reflects_after_turn": 24,
"pad": [
0.223233,
-0.688116,
0.098942
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087143.569,
"mood_reflects_after_turn": 25,
"pad": [
0.224021,
-0.68851,
0.098745
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
}
]
}
+648
View File
@@ -0,0 +1,648 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "forseti",
"step": "pos",
"baseline_pad": [
0.239,
-0.696,
0.095
],
"end_user_id": "r30-phi0-forseti-pos-1783086626",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": 13,
"seconds_per_turn": 22.1,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_pos",
"wall_clock": 1783086626.763,
"mood_reflects_after_turn": 0,
"pad": [
0.239,
-0.696,
0.095
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086644.441,
"mood_reflects_after_turn": 1,
"pad": [
0.277475,
-0.683175,
0.12065
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.5984144368786366,
"decay_remaining_s": 202.53218516049105
},
{
"type": "disgust",
"intensity": 0.5984144368786366,
"decay_remaining_s": 202.53218516049105
}
],
"n_emotions": 2
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086662.113,
"mood_reflects_after_turn": 2,
"pad": [
0.275551,
-0.683816,
0.119368
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.39617851967235457,
"decay_remaining_s": 182.11815704225845
},
{
"type": "disgust",
"intensity": 0.39617851967235457,
"decay_remaining_s": 182.11815704225845
}
],
"n_emotions": 2
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086679.394,
"mood_reflects_after_turn": 3,
"pad": [
0.273724,
-0.684425,
0.118149
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.24687722982874277,
"decay_remaining_s": 158.7067527359457
},
{
"type": "disgust",
"intensity": 0.24687722982874277,
"decay_remaining_s": 158.7067527359457
}
],
"n_emotions": 2
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086702.921,
"mood_reflects_after_turn": 4,
"pad": [
0.259163,
-0.680729,
0.099892
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.15387922362089126,
"decay_remaining_s": 135.30775338969408
},
{
"type": "disgust",
"intensity": 0.15387922362089126,
"decay_remaining_s": 135.30775338969408
},
{
"type": "disappointment",
"intensity": 0.18699078533200852,
"decay_remaining_s": 144.95454496870715
}
],
"n_emotions": 3
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086723.536,
"mood_reflects_after_turn": 5,
"pad": [
0.258154,
-0.681493,
0.099647
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.09519664920512481,
"decay_remaining_s": 111.53750907456809
},
{
"type": "disgust",
"intensity": 0.09519664920512481,
"decay_remaining_s": 111.53750907456809
},
{
"type": "disappointment",
"intensity": 0.11568095924176013,
"decay_remaining_s": 121.18430065358118
}
],
"n_emotions": 3
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086745.341,
"mood_reflects_after_turn": 6,
"pad": [
0.228127,
-0.648588,
0.113665
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.058121613176605455,
"decay_remaining_s": 87.11468585006237
},
{
"type": "disgust",
"intensity": 0.058121613176605455,
"decay_remaining_s": 87.11468585006237
},
{
"type": "disappointment",
"intensity": 0.07062815783001622,
"decay_remaining_s": 96.76147742907544
},
{
"type": "anger",
"intensity": 0.24421705453673276,
"decay_remaining_s": 158.17049935038497
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086767.465,
"mood_reflects_after_turn": 7,
"pad": [
0.22867,
-0.650959,
0.112731
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.035073119286887194,
"decay_remaining_s": 62.11295803448205
},
{
"type": "disgust",
"intensity": 0.035073119286887194,
"decay_remaining_s": 62.11295803448205
},
{
"type": "disappointment",
"intensity": 0.04262011443244547,
"decay_remaining_s": 71.75974961349512
},
{
"type": "anger",
"intensity": 0.14737123451189318,
"decay_remaining_s": 133.16877153480465
}
],
"n_emotions": 4
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086789.909,
"mood_reflects_after_turn": 8,
"pad": [
0.229187,
-0.653211,
0.111845
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.020567809558126326,
"decay_remaining_s": 35.69532075372112
},
{
"type": "disgust",
"intensity": 0.020567809558126326,
"decay_remaining_s": 35.69532075372112
},
{
"type": "disappointment",
"intensity": 0.024993568146070934,
"decay_remaining_s": 45.34211233273421
},
{
"type": "anger",
"intensity": 0.08642240973758594,
"decay_remaining_s": 106.75113425404372
}
],
"n_emotions": 4
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086813.213,
"mood_reflects_after_turn": 9,
"pad": [
0.229677,
-0.65535,
0.111003
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "love",
"intensity": 0.011507424157476244,
"decay_remaining_s": 6.949925610611371
},
{
"type": "disgust",
"intensity": 0.011507424157476244,
"decay_remaining_s": 6.949925610611371
},
{
"type": "disappointment",
"intensity": 0.01398357900255792,
"decay_remaining_s": 16.596717189624453
},
{
"type": "anger",
"intensity": 0.04835222354383774,
"decay_remaining_s": 78.00573911093397
}
],
"n_emotions": 4
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086835.817,
"mood_reflects_after_turn": 10,
"pad": [
0.230144,
-0.657383,
0.110203
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "anger",
"intensity": 0.0272750628019755,
"decay_remaining_s": 49.66600394193401
}
],
"n_emotions": 1
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086858.735,
"mood_reflects_after_turn": 11,
"pad": [
0.230586,
-0.659314,
0.109442
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [
{
"type": "anger",
"intensity": 0.015766544873269436,
"decay_remaining_s": 22.536840330863996
}
],
"n_emotions": 1
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086880.309,
"mood_reflects_after_turn": 12,
"pad": [
0.231007,
-0.661148,
0.10872
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086902.497,
"mood_reflects_after_turn": 13,
"pad": [
0.231407,
-0.66289,
0.108034
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086924.65,
"mood_reflects_after_turn": 14,
"pad": [
0.231786,
-0.664546,
0.107383
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086947.622,
"mood_reflects_after_turn": 15,
"pad": [
0.232147,
-0.666119,
0.106763
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783086970.841,
"mood_reflects_after_turn": 16,
"pad": [
0.23249,
-0.667613,
0.106175
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783086994.657,
"mood_reflects_after_turn": 17,
"pad": [
0.232815,
-0.669032,
0.105617
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783087018.405,
"mood_reflects_after_turn": 18,
"pad": [
0.233124,
-0.67038,
0.105086
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783087041.421,
"mood_reflects_after_turn": 19,
"pad": [
0.233418,
-0.671661,
0.104581
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087066.046,
"mood_reflects_after_turn": 20,
"pad": [
0.233697,
-0.672878,
0.104102
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087088.213,
"mood_reflects_after_turn": 21,
"pad": [
0.233962,
-0.674034,
0.103647
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087111.161,
"mood_reflects_after_turn": 22,
"pad": [
0.234214,
-0.675133,
0.103215
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087134.816,
"mood_reflects_after_turn": 23,
"pad": [
0.234454,
-0.676176,
0.102804
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087157.169,
"mood_reflects_after_turn": 24,
"pad": [
0.234681,
-0.677167,
0.102414
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087179.221,
"mood_reflects_after_turn": 25,
"pad": [
0.234897,
-0.678109,
0.102043
],
"baseline_pad": [
0.239,
-0.696,
0.095
],
"emotions_active": [],
"n_emotions": 0
}
]
}
+722
View File
@@ -0,0 +1,722 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "lofn",
"step": "neg",
"baseline_pad": [
0.809,
-0.153,
0.248
],
"end_user_id": "r30-phi0-lofn-neg-1783086622",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": 16,
"seconds_per_turn": 19.17,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_neg",
"wall_clock": 1783086622.491,
"mood_reflects_after_turn": 0,
"pad": [
0.809,
-0.153,
0.248
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "disgust",
"intensity": 0.30035998307417966,
"decay_remaining_s": 168.4129038950811
},
{
"type": "shame",
"intensity": 0.17405563132969606,
"decay_remaining_s": 141.40628929119273
},
{
"type": "disappointment",
"intensity": 0.13875047669637092,
"decay_remaining_s": 130.18513083121996
}
],
"n_emotions": 3
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086640.087,
"mood_reflects_after_turn": 1,
"pad": [
0.797101,
-0.116591,
0.28448
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.1143359590977587,
"decay_remaining_s": 120.60542148213672
},
{
"type": "disappointment",
"intensity": 0.09114424340744763,
"decay_remaining_s": 109.38426302216394
},
{
"type": "love",
"intensity": 0.591203872014145,
"decay_remaining_s": 201.93213522901215
},
{
"type": "disgust",
"intensity": 0.5583592124578035,
"decay_remaining_s": 199.10288997283888
}
],
"n_emotions": 4
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086658.336,
"mood_reflects_after_turn": 2,
"pad": [
0.798798,
-0.121784,
0.279277
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.07429973774043301,
"decay_remaining_s": 99.26997889267194
},
{
"type": "disappointment",
"intensity": 0.05922890257065504,
"decay_remaining_s": 88.04882043269916
},
{
"type": "love",
"intensity": 0.38418615620499547,
"decay_remaining_s": 180.59669263954737
},
{
"type": "disgust",
"intensity": 0.3628424808602734,
"decay_remaining_s": 177.7674473833741
}
],
"n_emotions": 4
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086676.834,
"mood_reflects_after_turn": 3,
"pad": [
0.799793,
-0.124828,
0.276228
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.048075395218412885,
"decay_remaining_s": 77.72153477455913
},
{
"type": "disappointment",
"intensity": 0.03832386204894452,
"decay_remaining_s": 66.50037631458636
},
{
"type": "love",
"intensity": 0.2485863592348452,
"decay_remaining_s": 159.04824852143457
},
{
"type": "disgust",
"intensity": 0.2347760059440204,
"decay_remaining_s": 156.2190032652613
}
],
"n_emotions": 4
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086698.693,
"mood_reflects_after_turn": 4,
"pad": [
0.778597,
-0.106862,
0.258631
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.02893387689095941,
"decay_remaining_s": 52.58839865785018
},
{
"type": "disappointment",
"intensity": 0.02306497744787295,
"decay_remaining_s": 41.36724019787741
},
{
"type": "love",
"intensity": 0.14961015051870166,
"decay_remaining_s": 133.91511240472562
},
{
"type": "disgust",
"intensity": 0.14129847548988486,
"decay_remaining_s": 131.08586714855235
},
{
"type": "fear",
"intensity": 0.15347016022800833,
"decay_remaining_s": 135.17599479644593
}
],
"n_emotions": 5
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086718.436,
"mood_reflects_after_turn": 5,
"pad": [
0.780118,
-0.109169,
0.2581
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.01756835509224531,
"decay_remaining_s": 27.893003433544404
},
{
"type": "disappointment",
"intensity": 0.014004819178776343,
"decay_remaining_s": 16.67184497357163
},
{
"type": "love",
"intensity": 0.09084175824837641,
"decay_remaining_s": 109.21971718041983
},
{
"type": "disgust",
"intensity": 0.08579499390124436,
"decay_remaining_s": 106.39047192424657
},
{
"type": "fear",
"intensity": 0.09318551679439424,
"decay_remaining_s": 110.48059957214018
}
],
"n_emotions": 5
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086740.827,
"mood_reflects_after_turn": 6,
"pad": [
0.782934,
-0.113442,
0.257115
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.05139530636165241,
"decay_remaining_s": 81.02685118626724
},
{
"type": "disgust",
"intensity": 0.04854001156378281,
"decay_remaining_s": 78.19760593009396
},
{
"type": "fear",
"intensity": 0.05272132856590098,
"decay_remaining_s": 82.28773357798757
}
],
"n_emotions": 3
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086760.101,
"mood_reflects_after_turn": 7,
"pad": [
0.785475,
-0.117299,
0.256226
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.032257561955279894,
"decay_remaining_s": 57.97081468282442
},
{
"type": "disgust",
"intensity": 0.03046547517998656,
"decay_remaining_s": 55.14156942665116
},
{
"type": "fear",
"intensity": 0.033089821677726845,
"decay_remaining_s": 59.23169707454476
}
],
"n_emotions": 3
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086779.307,
"mood_reflects_after_turn": 8,
"pad": [
0.804869,
-0.13218,
0.278224
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.020198640373952994,
"decay_remaining_s": 34.79881136118861
},
{
"type": "disgust",
"intensity": 0.019076493686511153,
"decay_remaining_s": 31.969566105015343
},
{
"type": "fear",
"intensity": 0.020719774452676518,
"decay_remaining_s": 36.05969375290893
},
{
"type": "satisfaction",
"intensity": 0.2504670427598375,
"decay_remaining_s": 159.42131925325486
}
],
"n_emotions": 4
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086797.858,
"mood_reflects_after_turn": 9,
"pad": [
0.805272,
-0.13421,
0.275277
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.012755684832229715,
"decay_remaining_s": 12.047491685615732
},
{
"type": "disgust",
"intensity": 0.012047035674883615,
"decay_remaining_s": 9.21824642944246
},
{
"type": "fear",
"intensity": 0.013084787283704805,
"decay_remaining_s": 13.308374077336053
},
{
"type": "satisfaction",
"intensity": 0.1581729561572383,
"decay_remaining_s": 136.66999957768198
}
],
"n_emotions": 4
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086819.879,
"mood_reflects_after_turn": 10,
"pad": [
0.805635,
-0.136042,
0.272618
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.08844976004480654,
"decay_remaining_s": 107.8988860481542
}
],
"n_emotions": 1
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086839.229,
"mood_reflects_after_turn": 11,
"pad": [
0.805963,
-0.137695,
0.270218
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.05446957177838106,
"decay_remaining_s": 83.90247456071432
}
],
"n_emotions": 1
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086858.27,
"mood_reflects_after_turn": 12,
"pad": [
0.806259,
-0.139188,
0.268051
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.03403401689989604,
"decay_remaining_s": 60.62432174385741
}
],
"n_emotions": 1
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086877.589,
"mood_reflects_after_turn": 13,
"pad": [
0.806526,
-0.140534,
0.266096
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.02112414744330084,
"decay_remaining_s": 37.016411214982064
}
],
"n_emotions": 1
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086896.265,
"mood_reflects_after_turn": 14,
"pad": [
0.806768,
-0.14175,
0.264332
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.013364186310301318,
"decay_remaining_s": 14.35418372663499
}
],
"n_emotions": 1
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086914.677,
"mood_reflects_after_turn": 15,
"pad": [
0.806985,
-0.142847,
0.26274
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783086933.369,
"mood_reflects_after_turn": 16,
"pad": [
0.807182,
-0.143837,
0.261303
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783086951.77,
"mood_reflects_after_turn": 17,
"pad": [
0.807359,
-0.14473,
0.260006
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783086970.574,
"mood_reflects_after_turn": 18,
"pad": [
0.807519,
-0.145536,
0.258835
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783086990.041,
"mood_reflects_after_turn": 19,
"pad": [
0.807663,
-0.146264,
0.257779
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087008.922,
"mood_reflects_after_turn": 20,
"pad": [
0.807794,
-0.146921,
0.256825
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087027.167,
"mood_reflects_after_turn": 21,
"pad": [
0.807911,
-0.147514,
0.255965
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087045.453,
"mood_reflects_after_turn": 22,
"pad": [
0.808017,
-0.148048,
0.255188
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087064.761,
"mood_reflects_after_turn": 23,
"pad": [
0.808113,
-0.148531,
0.254487
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087083.309,
"mood_reflects_after_turn": 24,
"pad": [
0.8082,
-0.148967,
0.253855
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087101.821,
"mood_reflects_after_turn": 25,
"pad": [
0.808278,
-0.14936,
0.253284
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
}
]
}
+727
View File
@@ -0,0 +1,727 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "lofn",
"step": "pos",
"baseline_pad": [
0.809,
-0.153,
0.248
],
"end_user_id": "r30-phi0-lofn-pos-1783086620",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": 16,
"seconds_per_turn": 19.68,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_pos",
"wall_clock": 1783086620.928,
"mood_reflects_after_turn": 0,
"pad": [
0.809,
-0.153,
0.248
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "disgust",
"intensity": 0.3099496071226145,
"decay_remaining_s": 169.96853835646436
},
{
"type": "shame",
"intensity": 0.1796127233593375,
"decay_remaining_s": 142.96192375257604
},
{
"type": "disappointment",
"intensity": 0.1431803774256259,
"decay_remaining_s": 131.74076529260327
}
],
"n_emotions": 3
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086638.365,
"mood_reflects_after_turn": 1,
"pad": [
0.797101,
-0.116591,
0.28448
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.11851338162104388,
"decay_remaining_s": 122.38165644926328
},
{
"type": "disappointment",
"intensity": 0.0944743244972692,
"decay_remaining_s": 111.1604979892905
},
{
"type": "love",
"intensity": 0.612804323790595,
"decay_remaining_s": 203.7083701961387
},
{
"type": "disgust",
"intensity": 0.5787596391355618,
"decay_remaining_s": 200.87912493996546
}
],
"n_emotions": 4
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086656.254,
"mood_reflects_after_turn": 2,
"pad": [
0.798261,
-0.120141,
0.280923
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.07754355752942818,
"decay_remaining_s": 101.38516021294014
},
{
"type": "disappointment",
"intensity": 0.06181475135131101,
"decay_remaining_s": 90.16400175296735
},
{
"type": "love",
"intensity": 0.4009591717506152,
"decay_remaining_s": 182.71187395981556
},
{
"type": "disgust",
"intensity": 0.37868366220891425,
"decay_remaining_s": 179.8826287036423
}
],
"n_emotions": 4
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086674.109,
"mood_reflects_after_turn": 3,
"pad": [
0.799308,
-0.123345,
0.277713
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.050839245787556116,
"decay_remaining_s": 80.4883965619064
},
{
"type": "disappointment",
"intensity": 0.04052709776764277,
"decay_remaining_s": 69.26723810193361
},
{
"type": "love",
"intensity": 0.2628775688511382,
"decay_remaining_s": 161.81511030878184
},
{
"type": "disgust",
"intensity": 0.24827325947051937,
"decay_remaining_s": 158.98586505260857
}
],
"n_emotions": 4
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086692.205,
"mood_reflects_after_turn": 4,
"pad": [
0.776997,
-0.104434,
0.259191
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.033295427762761606,
"decay_remaining_s": 59.53830698228177
},
{
"type": "disappointment",
"intensity": 0.026541838598384764,
"decay_remaining_s": 48.31714852230899
},
{
"type": "love",
"intensity": 0.17216268590427902,
"decay_remaining_s": 140.8650207291572
},
{
"type": "disgust",
"intensity": 0.16259809224293015,
"decay_remaining_s": 138.03577547298394
},
{
"type": "fear",
"intensity": 0.17660456125074997,
"decay_remaining_s": 142.12590312087752
}
],
"n_emotions": 5
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086711.437,
"mood_reflects_after_turn": 5,
"pad": [
0.780118,
-0.109169,
0.2581
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.01761273545952419,
"decay_remaining_s": 28.017886124481926
},
{
"type": "disappointment",
"intensity": 0.014040197506204548,
"decay_remaining_s": 16.79672766450916
},
{
"type": "love",
"intensity": 0.09107123850274022,
"decay_remaining_s": 109.34459987135736
},
{
"type": "disgust",
"intensity": 0.08601172525258796,
"decay_remaining_s": 106.5153546151841
},
{
"type": "fear",
"intensity": 0.09342091774335577,
"decay_remaining_s": 110.6054822630777
}
],
"n_emotions": 5
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086738.988,
"mood_reflects_after_turn": 6,
"pad": [
0.782934,
-0.113442,
0.257115
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "shame",
"intensity": 0.010353667728203439,
"decay_remaining_s": 1.720350311056919
},
{
"type": "love",
"intensity": 0.053536337113577075,
"decay_remaining_s": 83.04706405793236
},
{
"type": "disgust",
"intensity": 0.05056209616282278,
"decay_remaining_s": 80.2178188017591
},
{
"type": "fear",
"intensity": 0.05491759888186391,
"decay_remaining_s": 84.30794644965269
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086758.598,
"mood_reflects_after_turn": 7,
"pad": [
0.785475,
-0.117299,
0.256226
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.03322492057965059,
"decay_remaining_s": 59.43337703961838
},
{
"type": "disgust",
"intensity": 0.03137909165855888,
"decay_remaining_s": 56.604131783445105
},
{
"type": "fear",
"intensity": 0.03408213859315939,
"decay_remaining_s": 60.69425943133871
}
],
"n_emotions": 3
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086777.861,
"mood_reflects_after_turn": 8,
"pad": [
0.804869,
-0.13218,
0.278224
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.020813815554036986,
"decay_remaining_s": 36.283844092364134
},
{
"type": "disgust",
"intensity": 0.01965749246770159,
"decay_remaining_s": 33.45459883619087
},
{
"type": "fear",
"intensity": 0.021350821431297014,
"decay_remaining_s": 37.54472648408446
},
{
"type": "satisfaction",
"intensity": 0.2580953338369727,
"decay_remaining_s": 160.9063519844304
}
],
"n_emotions": 4
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086797.601,
"mood_reflects_after_turn": 9,
"pad": [
0.805272,
-0.13421,
0.275277
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "love",
"intensity": 0.012822775915902978,
"decay_remaining_s": 12.30715573180832
},
{
"type": "disgust",
"intensity": 0.012110399476130585,
"decay_remaining_s": 9.477910475635053
},
{
"type": "fear",
"intensity": 0.013153609347752653,
"decay_remaining_s": 13.568038123528641
},
{
"type": "satisfaction",
"intensity": 0.1590048985559388,
"decay_remaining_s": 136.92966362387457
}
],
"n_emotions": 4
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086820.086,
"mood_reflects_after_turn": 10,
"pad": [
0.805635,
-0.136042,
0.272618
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.08799109146673098,
"decay_remaining_s": 107.64153778247811
}
],
"n_emotions": 1
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086839.995,
"mood_reflects_after_turn": 11,
"pad": [
0.805963,
-0.137695,
0.270218
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.05362997325344708,
"decay_remaining_s": 83.13356199644052
}
],
"n_emotions": 1
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086859.213,
"mood_reflects_after_turn": 12,
"pad": [
0.806259,
-0.139188,
0.268051
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.033384868307061485,
"decay_remaining_s": 59.67109460565662
}
],
"n_emotions": 1
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086878.469,
"mood_reflects_after_turn": 13,
"pad": [
0.806526,
-0.140534,
0.266096
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.02075236963779157,
"decay_remaining_s": 36.13750053889745
}
],
"n_emotions": 1
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086899.093,
"mood_reflects_after_turn": 14,
"pad": [
0.806879,
-0.142312,
0.263515
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [
{
"type": "satisfaction",
"intensity": 0.012610049448190474,
"decay_remaining_s": 11.479103997183943
}
],
"n_emotions": 1
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086917.981,
"mood_reflects_after_turn": 15,
"pad": [
0.807086,
-0.143354,
0.262003
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783086938.001,
"mood_reflects_after_turn": 16,
"pad": [
0.807273,
-0.144295,
0.260637
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783086957.169,
"mood_reflects_after_turn": 17,
"pad": [
0.807441,
-0.145144,
0.259405
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783086976.989,
"mood_reflects_after_turn": 18,
"pad": [
0.807593,
-0.14591,
0.258293
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783086996.509,
"mood_reflects_after_turn": 19,
"pad": [
0.80773,
-0.146601,
0.25729
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087016.38,
"mood_reflects_after_turn": 20,
"pad": [
0.807854,
-0.147225,
0.256384
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087035.803,
"mood_reflects_after_turn": 21,
"pad": [
0.807966,
-0.147788,
0.255566
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087054.186,
"mood_reflects_after_turn": 22,
"pad": [
0.808067,
-0.148296,
0.254829
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087073.493,
"mood_reflects_after_turn": 23,
"pad": [
0.808158,
-0.148755,
0.254163
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087093.306,
"mood_reflects_after_turn": 24,
"pad": [
0.80824,
-0.149169,
0.253562
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087113.033,
"mood_reflects_after_turn": 25,
"pad": [
0.808314,
-0.149542,
0.25302
],
"baseline_pad": [
0.809,
-0.153,
0.248
],
"emotions_active": [],
"n_emotions": 0
}
]
}
+675
View File
@@ -0,0 +1,675 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "mask",
"step": "neg",
"baseline_pad": [
0.0,
0.0,
0.0
],
"end_user_id": "r30-phi0-mask-neg-1783086630",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": 15,
"seconds_per_turn": 80.82,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_neg",
"wall_clock": 1783086630.5,
"mood_reflects_after_turn": 0,
"pad": [
0.0,
0.0,
0.0
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086649.461,
"mood_reflects_after_turn": 1,
"pad": [
-0.04845,
0.024225,
0.012113
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.573022497641695,
"decay_remaining_s": 200.38600877711383
},
{
"type": "disgust",
"intensity": 0.5411879144393785,
"decay_remaining_s": 197.5567635209406
}
],
"n_emotions": 2
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086669.122,
"mood_reflects_after_turn": 2,
"pad": [
-0.046028,
0.023014,
0.011507
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.356003412717222,
"decay_remaining_s": 176.82556936309612
},
{
"type": "disgust",
"intensity": 0.3362254453440429,
"decay_remaining_s": 173.99632410692286
}
],
"n_emotions": 2
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086689.724,
"mood_reflects_after_turn": 3,
"pad": [
-0.003065,
0.048415,
-0.006145
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.21338883507870404,
"decay_remaining_s": 151.49112825250143
},
{
"type": "disgust",
"intensity": 0.20153389979655376,
"decay_remaining_s": 148.66188299632816
},
{
"type": "admiration",
"intensity": 0.2397604376317611,
"decay_remaining_s": 157.25888146429597
},
{
"type": "hope",
"intensity": 0.2397604376317611,
"decay_remaining_s": 157.25888146429597
}
],
"n_emotions": 4
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086710.989,
"mood_reflects_after_turn": 4,
"pad": [
0.008064,
0.054524,
-0.010961
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.0914212721487128,
"decay_remaining_s": 109.53448270395256
},
{
"type": "disgust",
"intensity": 0.0863423125848954,
"decay_remaining_s": 106.7052374477793
},
{
"type": "admiration",
"intensity": 0.10271954580539919,
"decay_remaining_s": 115.3022359157471
},
{
"type": "hope",
"intensity": 0.17137030082196,
"decay_remaining_s": 140.63667702634183
}
],
"n_emotions": 4
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086743.877,
"mood_reflects_after_turn": 5,
"pad": [
0.035778,
0.066308,
-0.021292
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.04477060353615011,
"decay_remaining_s": 74.19632608766649
},
{
"type": "disgust",
"intensity": 0.042283347784141764,
"decay_remaining_s": 71.36708083149324
},
{
"type": "hope",
"intensity": 0.08392304783825716,
"decay_remaining_s": 105.29852041005577
},
{
"type": "admiration",
"intensity": 0.19633892293274405,
"decay_remaining_s": 147.3692225867374
}
],
"n_emotions": 4
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086767.468,
"mood_reflects_after_turn": 6,
"pad": [
0.043689,
0.071243,
-0.024916
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.023673881244883985,
"decay_remaining_s": 42.65702000792139
},
{
"type": "disgust",
"intensity": 0.022358665620168205,
"decay_remaining_s": 39.82777475174812
},
{
"type": "admiration",
"intensity": 0.10382045311283532,
"decay_remaining_s": 115.8299165069923
},
{
"type": "hope",
"intensity": 0.2119459981620312,
"decay_remaining_s": 151.1553068400353
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086791.346,
"mood_reflects_after_turn": 7,
"pad": [
0.05083,
0.075697,
-0.028187
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.012503122853369734,
"decay_remaining_s": 11.057594651593051
},
{
"type": "disgust",
"intensity": 0.011808504917071413,
"decay_remaining_s": 8.22834939541978
},
{
"type": "admiration",
"intensity": 0.054831730654339245,
"decay_remaining_s": 84.23049115066395
},
{
"type": "hope",
"intensity": 0.21374299133569005,
"decay_remaining_s": 151.57321130702982
}
],
"n_emotions": 4
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086815.569,
"mood_reflects_after_turn": 8,
"pad": [
0.057274,
0.079717,
-0.031139
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.02873557965477521,
"decay_remaining_s": 52.247996003823324
},
{
"type": "hope",
"intensity": 0.2131793185845018,
"decay_remaining_s": 151.44250430119635
}
],
"n_emotions": 2
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086844.225,
"mood_reflects_after_turn": 9,
"pad": [
0.078765,
0.088189,
-0.038933
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.10083556893243133,
"decay_remaining_s": 114.38595978617707
},
{
"type": "admiration",
"intensity": 0.20850330282970433,
"decay_remaining_s": 150.34469100065806
}
],
"n_emotions": 2
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086872.633,
"mood_reflects_after_turn": 10,
"pad": [
0.071085,
0.079591,
-0.035137
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.04751721226390742,
"decay_remaining_s": 77.1434685146352
},
{
"type": "admiration",
"intensity": 0.09825397727386971,
"decay_remaining_s": 113.10219972911622
}
],
"n_emotions": 2
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086903.041,
"mood_reflects_after_turn": 11,
"pad": [
0.074984,
0.082661,
-0.037126
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.04587988487785369,
"decay_remaining_s": 75.40779887167771
},
{
"type": "hope",
"intensity": 0.186780774278357,
"decay_remaining_s": 144.8989217174522
}
],
"n_emotions": 2
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783087042.241,
"mood_reflects_after_turn": 12,
"pad": [
0.123206,
0.108504,
-0.056332
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.10881120514824318,
"decay_remaining_s": 118.15392794161474
},
{
"type": "hope",
"intensity": 0.23312871354818343,
"decay_remaining_s": 155.87047702144355
}
],
"n_emotions": 2
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783087182.081,
"mood_reflects_after_turn": 13,
"pad": [
0.17662,
0.134921,
-0.076712
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.16757988183783423,
"decay_remaining_s": 139.52956931853214
}
],
"n_emotions": 1
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783087389.589,
"mood_reflects_after_turn": 14,
"pad": [
0.24959,
0.173333,
-0.104775
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783087497.261,
"mood_reflects_after_turn": 15,
"pad": [
0.23711,
0.164666,
-0.099536
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783087606.545,
"mood_reflects_after_turn": 16,
"pad": [
0.225255,
0.156433,
-0.094559
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783087716.666,
"mood_reflects_after_turn": 17,
"pad": [
0.213992,
0.148611,
-0.089831
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783087827.618,
"mood_reflects_after_turn": 18,
"pad": [
0.231792,
0.15828,
-0.09674
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783087939.216,
"mood_reflects_after_turn": 19,
"pad": [
0.220203,
0.150366,
-0.091903
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783088051.553,
"mood_reflects_after_turn": 20,
"pad": [
0.237693,
0.159948,
-0.098708
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783088165.793,
"mood_reflects_after_turn": 21,
"pad": [
0.225808,
0.151951,
-0.093772
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783088279.621,
"mood_reflects_after_turn": 22,
"pad": [
0.214518,
0.144353,
-0.089084
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783088403.505,
"mood_reflects_after_turn": 23,
"pad": [
0.203792,
0.137135,
-0.08463
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783088527.183,
"mood_reflects_after_turn": 24,
"pad": [
0.193602,
0.130279,
-0.080398
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783088650.889,
"mood_reflects_after_turn": 25,
"pad": [
0.183922,
0.123765,
-0.076378
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
}
]
}
+792
View File
@@ -0,0 +1,792 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "mask",
"step": "pos",
"baseline_pad": [
0.0,
0.0,
0.0
],
"end_user_id": "r30-phi0-mask-pos-1783086629",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": null,
"seconds_per_turn": 24.96,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_pos",
"wall_clock": 1783086629.351,
"mood_reflects_after_turn": 0,
"pad": [
0.0,
0.0,
0.0
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086646.861,
"mood_reflects_after_turn": 1,
"pad": [
0.0513,
0.02565,
0.012825
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.6039162352234125,
"decay_remaining_s": 202.98519141353884
},
{
"type": "disgust",
"intensity": 0.5703653332665563,
"decay_remaining_s": 200.15594615736558
}
],
"n_emotions": 2
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086666.743,
"mood_reflects_after_turn": 2,
"pad": [
0.048735,
0.024368,
0.012184
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.3724072003533114,
"decay_remaining_s": 179.0553478980089
},
{
"type": "disgust",
"intensity": 0.351717911444794,
"decay_remaining_s": 176.22610264183564
}
],
"n_emotions": 2
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086688.237,
"mood_reflects_after_turn": 3,
"pad": [
-0.003065,
0.048415,
-0.006145
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.21964219829255527,
"decay_remaining_s": 152.9208293437025
},
{
"type": "disgust",
"intensity": 0.2074398539429688,
"decay_remaining_s": 150.09158408752924
},
{
"type": "admiration",
"intensity": 0.24678662107884886,
"decay_remaining_s": 158.68858255549708
},
{
"type": "hope",
"intensity": 0.24678662107884886,
"decay_remaining_s": 158.68858255549708
}
],
"n_emotions": 4
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086711.569,
"mood_reflects_after_turn": 4,
"pad": [
0.008064,
0.054524,
-0.010961
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.0912108569557271,
"decay_remaining_s": 109.42042607581978
},
{
"type": "disgust",
"intensity": 0.08614358712485336,
"decay_remaining_s": 106.59118081964651
},
{
"type": "admiration",
"intensity": 0.10248312650662934,
"decay_remaining_s": 115.18817928761433
},
{
"type": "hope",
"intensity": 0.17097587495069436,
"decay_remaining_s": 140.52262039820903
}
],
"n_emotions": 4
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086743.965,
"mood_reflects_after_turn": 5,
"pad": [
0.035778,
0.066308,
-0.021292
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.044679081370124246,
"decay_remaining_s": 74.09503574277676
},
{
"type": "disgust",
"intensity": 0.04219691018289511,
"decay_remaining_s": 71.2657904866035
},
{
"type": "hope",
"intensity": 0.0837514884106196,
"decay_remaining_s": 105.19723006516602
},
{
"type": "admiration",
"intensity": 0.1959375577046099,
"decay_remaining_s": 147.26793224184766
}
],
"n_emotions": 4
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086768.05,
"mood_reflects_after_turn": 6,
"pad": [
0.043689,
0.071243,
-0.024916
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.02339842401425587,
"decay_remaining_s": 42.07770591945392
},
{
"type": "disgust",
"intensity": 0.022098511569019427,
"decay_remaining_s": 39.24846066328066
},
{
"type": "admiration",
"intensity": 0.10261245117174261,
"decay_remaining_s": 115.25060241852482
},
{
"type": "hope",
"intensity": 0.20947990242164466,
"decay_remaining_s": 150.57599275156787
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086792.189,
"mood_reflects_after_turn": 7,
"pad": [
0.05083,
0.075697,
-0.028187
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "joy",
"intensity": 0.012294798870898311,
"decay_remaining_s": 10.225917778446751
},
{
"type": "disgust",
"intensity": 0.011611754489181735,
"decay_remaining_s": 7.396672522273483
},
{
"type": "admiration",
"intensity": 0.05391813773602014,
"decay_remaining_s": 83.39881427751767
},
{
"type": "hope",
"intensity": 0.2101816577630614,
"decay_remaining_s": 150.74153443388352
}
],
"n_emotions": 4
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086820.117,
"mood_reflects_after_turn": 8,
"pad": [
0.057274,
0.079717,
-0.031139
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.026075683313416677,
"decay_remaining_s": 47.44008306303666
},
{
"type": "hope",
"intensity": 0.1934464683560223,
"decay_remaining_s": 146.6345913604097
}
],
"n_emotions": 2
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086844.049,
"mood_reflects_after_turn": 9,
"pad": [
0.078765,
0.088189,
-0.038933
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.10122538755257164,
"decay_remaining_s": 114.57694561236268
},
{
"type": "admiration",
"intensity": 0.20930935242772103,
"decay_remaining_s": 150.53567682684366
}
],
"n_emotions": 2
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086868.613,
"mood_reflects_after_turn": 10,
"pad": [
0.071085,
0.079591,
-0.035137
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.051656237870654834,
"decay_remaining_s": 81.27751599878032
},
{
"type": "admiration",
"intensity": 0.1068124702604253,
"decay_remaining_s": 117.23624721326131
}
],
"n_emotions": 2
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086894.345,
"mood_reflects_after_turn": 11,
"pad": [
0.074984,
0.082661,
-0.037126
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.05556926082092507,
"decay_remaining_s": 84.8918447161369
},
{
"type": "hope",
"intensity": 0.22622701843827964,
"decay_remaining_s": 154.38296756191139
}
],
"n_emotions": 2
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086918.669,
"mood_reflects_after_turn": 12,
"pad": [
0.071235,
0.078528,
-0.03527
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.03152281574809609,
"decay_remaining_s": 56.83032883022405
},
{
"type": "hope",
"intensity": 0.12833196832421548,
"decay_remaining_s": 126.32145167599852
}
],
"n_emotions": 2
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086944.223,
"mood_reflects_after_turn": 13,
"pad": [
0.067673,
0.074601,
-0.033506
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.015440025787232716,
"decay_remaining_s": 21.500985730861096
},
{
"type": "hope",
"intensity": 0.0628576113278172,
"decay_remaining_s": 90.99210857663557
}
],
"n_emotions": 2
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086967.357,
"mood_reflects_after_turn": 14,
"pad": [
0.07569,
0.082271,
-0.037531
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.21496005509793759,
"decay_remaining_s": 151.8542579176958
}
],
"n_emotions": 1
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086994.717,
"mood_reflects_after_turn": 15,
"pad": [
0.100405,
0.095258,
-0.047054
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.09727953230544714,
"decay_remaining_s": 112.60884403963128
},
{
"type": "admiration",
"intensity": 0.18101880791038277,
"decay_remaining_s": 143.34790869682615
}
],
"n_emotions": 2
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783087021.385,
"mood_reflects_after_turn": 16,
"pad": [
0.123885,
0.107595,
-0.056102
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.04540454491988354,
"decay_remaining_s": 74.89229495980246
},
{
"type": "admiration",
"intensity": 0.18669721715897325,
"decay_remaining_s": 144.87677349506185
}
],
"n_emotions": 2
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783087045.919,
"mood_reflects_after_turn": 17,
"pad": [
0.123206,
0.108504,
-0.056332
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.10077263123682631,
"decay_remaining_s": 114.35505518931606
},
{
"type": "hope",
"intensity": 0.21590601674800133,
"decay_remaining_s": 152.07160426914487
}
],
"n_emotions": 2
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783087073.542,
"mood_reflects_after_turn": 18,
"pad": [
0.128446,
0.114479,
-0.059215
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.0451373786278345,
"decay_remaining_s": 74.60018011328319
},
{
"type": "hope",
"intensity": 0.17916522799432277,
"decay_remaining_s": 142.83844749885782
}
],
"n_emotions": 2
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783087099.192,
"mood_reflects_after_turn": 19,
"pad": [
0.122024,
0.108755,
-0.056254
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.02164886685669234,
"decay_remaining_s": 38.23091671640084
},
{
"type": "hope",
"intensity": 0.08593153355623005,
"decay_remaining_s": 106.46918410197544
}
],
"n_emotions": 2
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087124.769,
"mood_reflects_after_turn": 20,
"pad": [
0.144422,
0.120417,
-0.064842
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.04260368831648293,
"decay_remaining_s": 71.74066890904773
},
{
"type": "admiration",
"intensity": 0.19831457232683897,
"decay_remaining_s": 147.86480738196298
}
],
"n_emotions": 2
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087149.57,
"mood_reflects_after_turn": 21,
"pad": [
0.165701,
0.131496,
-0.073
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.02146878636581833,
"decay_remaining_s": 37.81745576544926
},
{
"type": "admiration",
"intensity": 0.2015673967599869,
"decay_remaining_s": 148.67010943129222
}
],
"n_emotions": 2
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087175.413,
"mood_reflects_after_turn": 22,
"pad": [
0.17662,
0.134921,
-0.076712
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "hope",
"intensity": 0.010377664834450205,
"decay_remaining_s": 1.8349417764983997
},
{
"type": "admiration",
"intensity": 0.19335354421287776,
"decay_remaining_s": 146.61080858593982
}
],
"n_emotions": 2
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087202.989,
"mood_reflects_after_turn": 23,
"pad": [
0.196289,
0.145275,
-0.084276
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.2326338330358267,
"decay_remaining_s": 155.76529140012397
}
],
"n_emotions": 1
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087228.51,
"mood_reflects_after_turn": 24,
"pad": [
0.214975,
0.155111,
-0.091463
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.1958362238481641,
"decay_remaining_s": 147.24232636599922
}
],
"n_emotions": 1
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087253.419,
"mood_reflects_after_turn": 25,
"pad": [
0.232726,
0.164455,
-0.09829
],
"baseline_pad": [
0.0,
0.0,
0.0
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.2007809583246708,
"decay_remaining_s": 148.47660831404184
}
],
"n_emotions": 1
}
]
}
+872
View File
@@ -0,0 +1,872 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "mimir",
"step": "neg",
"baseline_pad": [
0.615,
-0.438,
0.304
],
"end_user_id": "r30-phi0-mimir-neg-1783086625",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": null,
"seconds_per_turn": 20.38,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_neg",
"wall_clock": 1783086625.378,
"mood_reflects_after_turn": 0,
"pad": [
0.615,
-0.438,
0.304
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086644.403,
"mood_reflects_after_turn": 1,
"pad": [
0.5694,
-0.4152,
0.3154
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.5695539306612214,
"decay_remaining_s": 200.08547964103704
},
{
"type": "disgust",
"intensity": 0.5062701605877524,
"decay_remaining_s": 194.25541766938022
}
],
"n_emotions": 2
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086664.681,
"mood_reflects_after_turn": 2,
"pad": [
0.549912,
-0.394084,
0.296311
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.3551375582594641,
"decay_remaining_s": 176.70503528932045
},
{
"type": "disgust",
"intensity": 0.3156778295639681,
"decay_remaining_s": 170.87497331766363
},
{
"type": "fear",
"intensity": 0.18706089404764634,
"decay_remaining_s": 144.9730999632422
}
],
"n_emotions": 3
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086683.361,
"mood_reflects_after_turn": 3,
"pad": [
0.553166,
-0.39628,
0.296695
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.232692885766144,
"decay_remaining_s": 155.77785466215136
},
{
"type": "disgust",
"intensity": 0.2068381206810169,
"decay_remaining_s": 149.9477926904945
},
{
"type": "fear",
"intensity": 0.12256585719424329,
"decay_remaining_s": 124.04591933607308
}
],
"n_emotions": 3
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086703.387,
"mood_reflects_after_turn": 4,
"pad": [
0.518002,
-0.368725,
0.259724
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.14624202733973438,
"decay_remaining_s": 132.78803853131413
},
{
"type": "disgust",
"intensity": 0.129992913190875,
"decay_remaining_s": 126.9579765596573
},
{
"type": "disappointment",
"intensity": 0.19797012040287656,
"decay_remaining_s": 147.77875916994998
},
{
"type": "fear",
"intensity": 0.2262515661747161,
"decay_remaining_s": 154.3883382984228
}
],
"n_emotions": 4
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086723.169,
"mood_reflects_after_turn": 5,
"pad": [
0.476553,
-0.33692,
0.221924
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.09264389336314277,
"decay_remaining_s": 110.19206048791541
},
{
"type": "disgust",
"intensity": 0.08235012743390467,
"decay_remaining_s": 104.36199851625857
},
{
"type": "disappointment",
"intensity": 0.19955157173522658,
"decay_remaining_s": 148.17259725738847
},
{
"type": "fear",
"intensity": 0.22805893912597325,
"decay_remaining_s": 154.78217638586133
}
],
"n_emotions": 4
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086745.413,
"mood_reflects_after_turn": 6,
"pad": [
0.458103,
-0.323686,
0.199035
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.05513893855736023,
"decay_remaining_s": 84.50704331981329
},
{
"type": "disgust",
"intensity": 0.04901238982876465,
"decay_remaining_s": 78.67698134815646
},
{
"type": "fear",
"intensity": 0.17855123491376257,
"decay_remaining_s": 142.66852714685666
},
{
"type": "disappointment",
"intensity": 0.19789428536275347,
"decay_remaining_s": 147.75979456082902
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086765.985,
"mood_reflects_after_turn": 7,
"pad": [
0.402057,
-0.275677,
0.152873
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.03467442696387821,
"decay_remaining_s": 61.54706533200481
},
{
"type": "disgust",
"intensity": 0.030821712856780623,
"decay_remaining_s": 55.717003360347974
},
{
"type": "disappointment",
"intensity": 0.19808949499924042,
"decay_remaining_s": 147.80859731297872
},
{
"type": "fear",
"intensity": 0.2523849638588727,
"decay_remaining_s": 159.79890281497038
}
],
"n_emotions": 4
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086788.388,
"mood_reflects_after_turn": 8,
"pad": [
0.381956,
-0.261352,
0.13122
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.020876570681207237,
"decay_remaining_s": 36.432860485364564
},
{
"type": "disgust",
"intensity": 0.018556951716628654,
"decay_remaining_s": 30.602798513707725
},
{
"type": "disappointment",
"intensity": 0.20018960251982282,
"decay_remaining_s": 148.33060688229088
},
{
"type": "fear",
"intensity": 0.23558657709136607,
"decay_remaining_s": 156.389603344106
}
],
"n_emotions": 4
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086808.77,
"mood_reflects_after_turn": 9,
"pad": [
0.389194,
-0.22797,
0.098653
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.013234463556137013,
"decay_remaining_s": 13.871369081595278
},
{
"type": "disgust",
"intensity": 0.011763967605455124,
"decay_remaining_s": 8.041307109938455
},
{
"type": "disappointment",
"intensity": 0.1996906524468551,
"decay_remaining_s": 148.2070838970179
},
{
"type": "fear",
"intensity": 0.22821788851069155,
"decay_remaining_s": 154.81666302549078
},
{
"type": "admiration",
"intensity": 0.3093949959799647,
"decay_remaining_s": 169.8798887580104
}
],
"n_emotions": 5
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086829.771,
"mood_reflects_after_turn": 10,
"pad": [
0.370347,
-0.218296,
0.082287
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.19193309895123337,
"decay_remaining_s": 146.2458337348137
},
{
"type": "disappointment",
"intensity": 0.2062662817126418,
"decay_remaining_s": 149.81075670573438
},
{
"type": "fear",
"intensity": 0.21939296850934625,
"decay_remaining_s": 152.86463131248922
}
],
"n_emotions": 3
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086849.104,
"mood_reflects_after_turn": 11,
"pad": [
0.350217,
-0.206212,
0.065891
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.12388568421961552,
"decay_remaining_s": 124.57608311541833
},
{
"type": "disappointment",
"intensity": 0.20332079637339762,
"decay_remaining_s": 149.09882468139187
},
{
"type": "fear",
"intensity": 0.2323666244267401,
"decay_remaining_s": 155.70840380986473
}
],
"n_emotions": 3
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086869.384,
"mood_reflects_after_turn": 12,
"pad": [
0.33205,
-0.195306,
0.051093
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.07780106612675619,
"decay_remaining_s": 101.54926313989921
},
{
"type": "disappointment",
"intensity": 0.22439333830950783,
"decay_remaining_s": 153.9801247745848
},
{
"type": "fear",
"intensity": 0.2564495294965804,
"decay_remaining_s": 160.58970390305765
}
],
"n_emotions": 3
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086889.461,
"mood_reflects_after_turn": 13,
"pad": [
0.315654,
-0.185464,
0.037738
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.04872953151589588,
"decay_remaining_s": 78.39049118764898
},
{
"type": "disappointment",
"intensity": 0.1972955280908204,
"decay_remaining_s": 147.60980334853693
},
{
"type": "fear",
"intensity": 0.2254806035323662,
"decay_remaining_s": 154.21938247700982
}
],
"n_emotions": 3
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086908.809,
"mood_reflects_after_turn": 14,
"pad": [
0.300857,
-0.176581,
0.025685
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.03107235452885492,
"decay_remaining_s": 56.11789504968225
},
{
"type": "disappointment",
"intensity": 0.20085954804216538,
"decay_remaining_s": 148.49597916282048
},
{
"type": "fear",
"intensity": 0.2295537691910462,
"decay_remaining_s": 155.10555829129336
}
],
"n_emotions": 3
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086928.503,
"mood_reflects_after_turn": 15,
"pad": [
0.287503,
-0.168564,
0.014808
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.01965785899626446,
"decay_remaining_s": 33.455521760500005
},
{
"type": "disappointment",
"intensity": 0.21841846782909705,
"decay_remaining_s": 152.64427972406102
},
{
"type": "fear",
"intensity": 0.24962110609039664,
"decay_remaining_s": 159.25385885253388
}
],
"n_emotions": 3
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783086948.854,
"mood_reflects_after_turn": 16,
"pad": [
0.27545,
-0.161328,
0.004991
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.012190100178442454,
"decay_remaining_s": 9.802600485010554
},
{
"type": "disappointment",
"intensity": 0.2133361557047814,
"decay_remaining_s": 151.47890707778464
},
{
"type": "fear",
"intensity": 0.24381274937689307,
"decay_remaining_s": 158.0884862062575
}
],
"n_emotions": 3
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783086969.465,
"mood_reflects_after_turn": 17,
"pad": [
0.264573,
-0.154799,
-0.003869
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.2037017252636142,
"decay_remaining_s": 149.19147480887426
},
{
"type": "fear",
"intensity": 0.2328019717298448,
"decay_remaining_s": 155.8010539373471
}
],
"n_emotions": 2
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783086990.957,
"mood_reflects_after_turn": 18,
"pad": [
0.254756,
-0.148905,
-0.011865
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.18973405834522244,
"decay_remaining_s": 145.67544139043395
},
{
"type": "fear",
"intensity": 0.2168389238231114,
"decay_remaining_s": 152.2850205189068
}
],
"n_emotions": 2
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783087012.069,
"mood_reflects_after_turn": 19,
"pad": [
0.21759,
-0.117456,
-0.038546
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.1852427384058006,
"decay_remaining_s": 144.48964317734817
},
{
"type": "fear",
"intensity": 0.21170598674948643,
"decay_remaining_s": 151.09922230582103
}
],
"n_emotions": 2
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087032.033,
"mood_reflects_after_turn": 20,
"pad": [
0.184047,
-0.089073,
-0.062625
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.19317699595546273,
"decay_remaining_s": 146.56559175976838
},
{
"type": "fear",
"intensity": 0.220773709663386,
"decay_remaining_s": 153.17517088824124
}
],
"n_emotions": 2
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087051.317,
"mood_reflects_after_turn": 21,
"pad": [
0.153775,
-0.063457,
-0.084356
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.19876713783323796,
"decay_remaining_s": 147.97763675575507
},
{
"type": "fear",
"intensity": 0.2271624432379863,
"decay_remaining_s": 154.58721588422796
}
],
"n_emotions": 2
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087072.549,
"mood_reflects_after_turn": 22,
"pad": [
0.126454,
-0.040339,
-0.103969
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.18763303461696476,
"decay_remaining_s": 145.1242634318717
},
{
"type": "fear",
"intensity": 0.21443775384795977,
"decay_remaining_s": 151.73384256034456
}
],
"n_emotions": 2
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087093.533,
"mood_reflects_after_turn": 23,
"pad": [
0.101797,
-0.019474,
-0.121669
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.19164580018360228,
"decay_remaining_s": 146.17168571463864
},
{
"type": "fear",
"intensity": 0.21902377163840261,
"decay_remaining_s": 152.7812648431115
}
],
"n_emotions": 2
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087113.753,
"mood_reflects_after_turn": 24,
"pad": [
0.078957,
0.003138,
-0.133944
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.1975245722197446,
"decay_remaining_s": 147.66723355555015
},
{
"type": "fear",
"intensity": 0.26856666671857243,
"decay_remaining_s": 162.8749073873274
}
],
"n_emotions": 2
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087134.897,
"mood_reflects_after_turn": 25,
"pad": [
0.059461,
0.01635,
-0.152061
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.18180516512487083,
"decay_remaining_s": 143.56246684118923
},
{
"type": "fear",
"intensity": 0.20777733157128098,
"decay_remaining_s": 150.1720459696621
}
],
"n_emotions": 2
}
]
}
+877
View File
@@ -0,0 +1,877 @@
{
"probe": "R30 Phase-1 \u03c60 step-response",
"server": "http://10.250.50.152:8080",
"agent": "mimir",
"step": "pos",
"baseline_pad": [
0.615,
-0.438,
0.304
],
"end_user_id": "r30-phi0-mimir-pos-1783086623",
"n_turns": 26,
"total_turns": 26,
"emotion_fade_turn_index": null,
"seconds_per_turn": 19.38,
"method": "joint two-timescale fit (b): natural cadence, push_t covariate from emotions_active deltas; anchor = baseline_pad on b14, neutral(0) on b9.",
"series": [
{
"turn": 1,
"sent": "impulse_pos",
"wall_clock": 1783086624.133,
"mood_reflects_after_turn": 0,
"pad": [
0.615,
-0.438,
0.304
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [],
"n_emotions": 0
},
{
"turn": 2,
"sent": "neutral_1",
"wall_clock": 1783086642.287,
"mood_reflects_after_turn": 1,
"pad": [
0.653475,
-0.425175,
0.32965
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.5946814824398606,
"decay_remaining_s": 202.22244382273544
},
{
"type": "disgust",
"intensity": 0.5286057621687651,
"decay_remaining_s": 196.3923818510786
}
],
"n_emotions": 2
},
{
"turn": 3,
"sent": "neutral_2",
"wall_clock": 1783086659.981,
"mood_reflects_after_turn": 2,
"pad": [
0.546486,
-0.391773,
0.295906
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.3918348442531504,
"decay_remaining_s": 181.57246376361832
},
{
"type": "disgust",
"intensity": 0.3482976393361337,
"decay_remaining_s": 175.7424017919615
},
{
"type": "fear",
"intensity": 0.20639038192480808,
"decay_remaining_s": 149.84052843754006
}
],
"n_emotions": 3
},
{
"turn": 4,
"sent": "neutral_3",
"wall_clock": 1783086677.926,
"mood_reflects_after_turn": 3,
"pad": [
0.553166,
-0.39628,
0.296695
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.2610046930700496,
"decay_remaining_s": 161.46119646298973
},
{
"type": "disgust",
"intensity": 0.23200417161782186,
"decay_remaining_s": 155.6311344913329
},
{
"type": "fear",
"intensity": 0.1374784786931611,
"decay_remaining_s": 129.72926113691145
}
],
"n_emotions": 3
},
{
"turn": 5,
"sent": "neutral_4",
"wall_clock": 1783086698.685,
"mood_reflects_after_turn": 4,
"pad": [
0.512897,
-0.365079,
0.257393
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.16130247461172786,
"decay_remaining_s": 137.6397821335694
},
{
"type": "disgust",
"intensity": 0.143379977432647,
"decay_remaining_s": 131.80972016191257
},
{
"type": "disappointment",
"intensity": 0.21835768349943682,
"decay_remaining_s": 152.63050277220526
},
{
"type": "fear",
"intensity": 0.24955163828507068,
"decay_remaining_s": 159.24008190067812
}
],
"n_emotions": 4
},
{
"turn": 6,
"sent": "neutral_5",
"wall_clock": 1783086717.533,
"mood_reflects_after_turn": 5,
"pad": [
0.476553,
-0.33692,
0.221924
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.10267462961751213,
"decay_remaining_s": 115.28058704753809
},
{
"type": "disgust",
"intensity": 0.09126633743778854,
"decay_remaining_s": 109.45052507588127
},
{
"type": "disappointment",
"intensity": 0.22115741225592794,
"decay_remaining_s": 153.26112381701117
},
{
"type": "fear",
"intensity": 0.2527513282924891,
"decay_remaining_s": 159.87070294548403
}
],
"n_emotions": 4
},
{
"turn": 7,
"sent": "neutral_6",
"wall_clock": 1783086739.031,
"mood_reflects_after_turn": 6,
"pad": [
0.449846,
-0.31767,
0.19351
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.06322985846830854,
"decay_remaining_s": 91.28437648115279
},
{
"type": "disgust",
"intensity": 0.05620431863849648,
"decay_remaining_s": 85.45431450949596
},
{
"type": "fear",
"intensity": 0.2047512993235141,
"decay_remaining_s": 149.44586030819616
},
{
"type": "disappointment",
"intensity": 0.2269326900835614,
"decay_remaining_s": 154.53712772216852
}
],
"n_emotions": 4
},
{
"turn": 8,
"sent": "neutral_7",
"wall_clock": 1783086758.046,
"mood_reflects_after_turn": 7,
"pad": [
0.41965,
-0.294133,
0.164269
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.04121611656303021,
"decay_remaining_s": 70.10170683199324
},
{
"type": "disgust",
"intensity": 0.03663654805602685,
"decay_remaining_s": 64.27164486033641
},
{
"type": "disappointment",
"intensity": 0.2354611288690008,
"decay_remaining_s": 156.36323881296713
},
{
"type": "fear",
"intensity": 0.26909843299314384,
"decay_remaining_s": 162.97281794144
}
],
"n_emotions": 4
},
{
"turn": 9,
"sent": "neutral_8",
"wall_clock": 1783086777.661,
"mood_reflects_after_turn": 8,
"pad": [
0.39849,
-0.279055,
0.141477
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.026584584239420582,
"decay_remaining_s": 48.39680145621735
},
{
"type": "disgust",
"intensity": 0.023630741546151624,
"decay_remaining_s": 42.5667394845605
},
{
"type": "fear",
"intensity": 0.19350137608500168,
"decay_remaining_s": 146.64863893918286
},
{
"type": "disappointment",
"intensity": 0.254924883656064,
"decay_remaining_s": 160.29454785314365
}
],
"n_emotions": 4
},
{
"turn": 10,
"sent": "neutral_9",
"wall_clock": 1783086797.421,
"mood_reflects_after_turn": 9,
"pad": [
0.34731,
-0.234916,
0.099845
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.017110119721514862,
"decay_remaining_s": 26.584802898475584
},
{
"type": "disgust",
"intensity": 0.01520899530801321,
"decay_remaining_s": 20.75474092681875
},
{
"type": "disappointment",
"intensity": 0.2581692077008076,
"decay_remaining_s": 160.9205177138982
},
{
"type": "fear",
"intensity": 0.29505052308663726,
"decay_remaining_s": 167.53009684237108
}
],
"n_emotions": 4
},
{
"turn": 11,
"sent": "neutral_10",
"wall_clock": 1783086816.311,
"mood_reflects_after_turn": 10,
"pad": [
0.38627,
-0.233733,
0.089968
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "love",
"intensity": 0.011226425089725682,
"decay_remaining_s": 5.72622706086814
},
{
"type": "fear",
"intensity": 0.19359084851705805,
"decay_remaining_s": 146.67152100476363
},
{
"type": "admiration",
"intensity": 0.2624511171738719,
"decay_remaining_s": 161.73474673728325
},
{
"type": "disappointment",
"intensity": 0.28205044552809555,
"decay_remaining_s": 165.299669708204
}
],
"n_emotions": 4
},
{
"turn": 12,
"sent": "neutral_11",
"wall_clock": 1783086835.657,
"mood_reflects_after_turn": 11,
"pad": [
0.336281,
-0.194013,
0.053359
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.16921975131393227,
"decay_remaining_s": 140.01158540005176
},
{
"type": "disappointment",
"intensity": 0.2777229250981473,
"decay_remaining_s": 164.53432696602528
},
{
"type": "fear",
"intensity": 0.3173976286835969,
"decay_remaining_s": 171.14390609449813
}
],
"n_emotions": 3
},
{
"turn": 13,
"sent": "neutral_12",
"wall_clock": 1783086855.029,
"mood_reflects_after_turn": 12,
"pad": [
0.317158,
-0.182533,
0.037782
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.10921596877410417,
"decay_remaining_s": 118.33771366610162
},
{
"type": "disappointment",
"intensity": 0.315,
"decay_remaining_s": 170.7685753007872
},
{
"type": "fear",
"intensity": 0.36000000000000004,
"decay_remaining_s": 177.37815442926006
}
],
"n_emotions": 3
},
{
"turn": 14,
"sent": "neutral_13",
"wall_clock": 1783086873.849,
"mood_reflects_after_turn": 13,
"pad": [
0.299899,
-0.172172,
0.023724
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.07091348313646222,
"decay_remaining_s": 96.96103907530583
},
{
"type": "disappointment",
"intensity": 0.28711363866906614,
"decay_remaining_s": 166.18035123619381
},
{
"type": "fear",
"intensity": 0.32812987276464706,
"decay_remaining_s": 172.78993036466667
}
],
"n_emotions": 3
},
{
"turn": 15,
"sent": "neutral_14",
"wall_clock": 1783086893.369,
"mood_reflects_after_turn": 14,
"pad": [
0.284323,
-0.162822,
0.011037
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.04491127141677074,
"decay_remaining_s": 74.3516044866393
},
{
"type": "disappointment",
"intensity": 0.29031780228931453,
"decay_remaining_s": 166.72968859977752
},
{
"type": "fear",
"intensity": 0.331791774044931,
"decay_remaining_s": 173.3392677282504
}
],
"n_emotions": 3
},
{
"turn": 16,
"sent": "neutral_15",
"wall_clock": 1783086913.196,
"mood_reflects_after_turn": 15,
"pad": [
0.300857,
-0.176581,
0.025685
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.028350283954324103,
"decay_remaining_s": 51.57981733722619
},
{
"type": "disappointment",
"intensity": 0.18326339629797098,
"decay_remaining_s": 143.95790145036443
},
{
"type": "fear",
"intensity": 0.20944388148339546,
"decay_remaining_s": 150.5674805788373
}
],
"n_emotions": 3
},
{
"turn": 17,
"sent": "neutral_16",
"wall_clock": 1783086932.748,
"mood_reflects_after_turn": 16,
"pad": [
0.287503,
-0.168564,
0.014808
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.017999206667636186,
"decay_remaining_s": 29.092268708013105
},
{
"type": "disappointment",
"intensity": 0.19998918209920172,
"decay_remaining_s": 148.28102667157412
},
{
"type": "fear",
"intensity": 0.22855906525623054,
"decay_remaining_s": 154.89060580004698
}
],
"n_emotions": 3
},
{
"turn": 18,
"sent": "neutral_17",
"wall_clock": 1783086951.78,
"mood_reflects_after_turn": 17,
"pad": [
0.27545,
-0.161328,
0.004991
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "admiration",
"intensity": 0.011472658135482627,
"decay_remaining_s": 6.80015583612609
},
{
"type": "disappointment",
"intensity": 0.20078036656888026,
"decay_remaining_s": 148.4764624289002
},
{
"type": "fear",
"intensity": 0.22946327607872036,
"decay_remaining_s": 155.08604155737305
}
],
"n_emotions": 3
},
{
"turn": 19,
"sent": "neutral_18",
"wall_clock": 1783086971.101,
"mood_reflects_after_turn": 18,
"pad": [
0.264573,
-0.154799,
-0.003869
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.19704165616123376,
"decay_remaining_s": 147.54606989733307
},
{
"type": "fear",
"intensity": 0.22519046418426716,
"decay_remaining_s": 154.15564902580593
}
],
"n_emotions": 2
},
{
"turn": 20,
"sent": "neutral_19",
"wall_clock": 1783086990.985,
"mood_reflects_after_turn": 19,
"pad": [
0.254756,
-0.148905,
-0.011865
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.18973405834522244,
"decay_remaining_s": 145.67544139043395
},
{
"type": "fear",
"intensity": 0.2168389238231114,
"decay_remaining_s": 152.2850205189068
}
],
"n_emotions": 2
},
{
"turn": 21,
"sent": "neutral_20",
"wall_clock": 1783087010.449,
"mood_reflects_after_turn": 20,
"pad": [
0.21759,
-0.117456,
-0.038546
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.1896502128984779,
"decay_remaining_s": 145.653562736846
},
{
"type": "fear",
"intensity": 0.21674310045540332,
"decay_remaining_s": 152.26314186531883
}
],
"n_emotions": 2
},
{
"turn": 22,
"sent": "neutral_21",
"wall_clock": 1783087030.22,
"mood_reflects_after_turn": 21,
"pad": [
0.184047,
-0.089073,
-0.062625
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.20066326009836047,
"decay_remaining_s": 148.4475837873386
},
{
"type": "fear",
"intensity": 0.229329440112412,
"decay_remaining_s": 155.05716291581146
}
],
"n_emotions": 2
},
{
"turn": 23,
"sent": "neutral_22",
"wall_clock": 1783087048.985,
"mood_reflects_after_turn": 22,
"pad": [
0.153775,
-0.063457,
-0.084356
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.20843728238381443,
"decay_remaining_s": 150.32901538131946
},
{
"type": "fear",
"intensity": 0.23821403701007368,
"decay_remaining_s": 156.93859450979235
}
],
"n_emotions": 2
},
{
"turn": 24,
"sent": "neutral_23",
"wall_clock": 1783087069.326,
"mood_reflects_after_turn": 23,
"pad": [
0.126454,
-0.040339,
-0.103969
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.1986416656890884,
"decay_remaining_s": 147.94638098060162
},
{
"type": "fear",
"intensity": 0.22701904650181534,
"decay_remaining_s": 154.55596010907448
}
],
"n_emotions": 2
},
{
"turn": 25,
"sent": "neutral_24",
"wall_clock": 1783087089.327,
"mood_reflects_after_turn": 24,
"pad": [
0.101797,
-0.019474,
-0.121669
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.20924669951582328,
"decay_remaining_s": 150.52085819660982
},
{
"type": "fear",
"intensity": 0.2391390851609409,
"decay_remaining_s": 157.13043732508268
}
],
"n_emotions": 2
},
{
"turn": 26,
"sent": "neutral_25",
"wall_clock": 1783087108.517,
"mood_reflects_after_turn": 25,
"pad": [
0.079544,
-0.000644,
-0.137644
],
"baseline_pad": [
0.615,
-0.438,
0.304
],
"emotions_active": [
{
"type": "disappointment",
"intensity": 0.22064306188831107,
"decay_remaining_s": 153.14587048318154
},
{
"type": "fear",
"intensity": 0.25216349930092696,
"decay_remaining_s": 159.7554496116544
}
],
"n_emotions": 2
}
]
}
@@ -0,0 +1,110 @@
{
"canon_id": "r24-d2-mood-render-canon",
"version": "1.2",
"schema_version": "0.2",
"_source_of_truth": "occ_directives.*.directive IS the canonical directive string (== the .md §2.4 _OCC_DIRECTIVES dict, byte-identical); the .md §2.2 table mirrors it. A parity check guards drift. grounding labels (CITE/VALIDATE/CALIBRATE/ENGINEERING) live in the .md; per-row machine-readable grounding_status/d3_required enums are a deferred impl enhancement (Hulda).",
"authored": "2026-06-23",
"owner": "brokkr-smithy-dev",
"status": "REPLACE — final (brokkr R24 D3 re-validation 2026-06-25): grounded canon replaces the hand-tuned baseline. Fear hedging 0.52->2.118/1k (blocker resolved, now >= handtuned), anger tier-gate clean (full renders hostility, safe suppresses). worldtree-dev #321; directives byte-identical to the validated 201c4fd.",
"replaces": "core/persona/renderer.py::describe_pad + ::derive_directive",
"swap_in_via": "worldtree #321-sibling (mood-render twin of #315)",
"design_target": "serves BOTH enterprise/agent AND character/Skaldsong via a three-tier emotion gate (operator/worldtree 2026-06-23)",
"emotion_tiers": {
"_config": "mood_tier in {none, safe, full} replaces worldtree's binary mood on/off; worldtree-owned config surface",
"_defaults": "full for character-bound personas; safe for agent-scoped",
"_principle": "full-only = interpersonally-hot / withdrawal emotions that break the professional frame (attachment, hostility, contempt, withdrawal); safe = task-appraisal affect + mild courtesy. Negative != unsafe (fear, remorse are negative AND business-useful).",
"_filter_point": "applied at top-emotion SELECTION (display + directive together) so a full-only emotion at safe tier is neither shown nor directive'd; preserves the no-shown-but-unguided invariant",
"none": "no affect block at all (the current off-switch)",
"safe": "PAD mood descriptor + the 11 safe emotions (task-appraisal + courtesy)",
"full": "everything in safe PLUS the 4 full-only emotions",
"full_only": ["love", "anger", "disgust", "shame"],
"mood_descriptor_tiering": "the PAD mood descriptor (positive/calm/confident...) renders in BOTH safe and full; only emotion directives tier"
},
"disciplines": [
"model-agnostic context-level NL only; the LLM never sees a number",
"never push explicit disclosure of agent feelings to the user (hidden-prompt-only)",
"separate label-intensity from behavioral-intensity (strong felt state -> still measured, safe behavioral ask)"
],
"thresholds": {
"_note": "CALIBRATE — engineering params set at D3 against the computed-PAD distribution + P00, NOT citations",
"pad_band_cutoff": 0.3,
"pad_band_sensitivity_sweep": [0.2, 0.3, 0.4],
"emotion_salience": 0.2,
"emotion_salience_sweep": [0.15, 0.2, 0.25],
"intensity_qualifiers": {"strong": 0.7, "moderate": 0.4, "_label_only": "does NOT scale the behavioral ask"},
"runner_up_margin": {"v1": null, "_note": "add at D3 if directive whipsaws between near-tied emotions"},
"rerender_hysteresis": {"v1": "none", "_note": "re-render only on material PAD change; integration-level, flag for #321-sibling"}
},
"describe_pad": {
"_structure": "circumplex-quadrant (Russell 1980): arousal word is VALENCE-CONDITIONED; mid-arousal drops the arousal word",
"_grounding": "Russell 1980 (quadrant placement); Warriner 2013 + NRC-VAD (Mohammad 2018/2025) (word centroids)",
"valence_arousal_grid": {
"positive": {"high_a": "positive and energized", "mid_a": "positive", "low_a": "positive and calm"},
"neutral": {"high_a": "alert", "mid_a": "neutral", "low_a": "quiet"},
"negative": {"high_a": "negative and agitated", "mid_a": "negative", "low_a": "negative and subdued"}
},
"_band_edges": "strict inequality (>0.3 / <-0.3); the endpoints +/-0.3 themselves fall in mid/neutral",
"_neutral_row_status": "ENGINEERING/CALIBRATE — 'alert'/'quiet' are unvalidated placeholders for the rare neutral-valence cells (Hulda/Regin 4b); 'positive'/'negative'/'neutral' valence words + the energized/calm/subdued/agitated arousal words are VALIDATE",
"_mid_arousal_decode": "valence-only mid-A render is EXEMPT from the V/A-separability requirement; expected inverse-decode = mid/neutral arousal (absence-of-arousal-word ⇒ unremarkable), NOT unknown (D3 tests this)",
"quadrant_labels": {
"positive_high_a": "excitement", "positive_low_a": "contentment",
"negative_high_a": "distress", "negative_low_a": "dejection"
},
"dominance_clause": {
"high": {"d_gt": 0.3, "word": "confident", "verdict": "VALIDATE (D=7.04/9)"},
"low": {"d_lt": -0.3, "word": "uncertain", "verdict": "VALIDATE — low-control confirmed (D=3.58/9); dominance!=certainty worry REFUTED by the instrument"},
"neutral": {"word": null, "rule": "drop-dominance-when-neutral (prompt-economy, L3)"}
},
"calm_defect_fix": "'calm' (V=6.89/9, positive) renders ONLY in positive-low-a; negative-low-a renders 'subdued'",
"mid_arousal_resolution": "DROP the arousal word (no Warriner-validated mid-A neutral word; 'steady' is empirically low-A; 'settled' is NRC-only fallback iff D3 shows mid-A render too flat)"
},
"derive_directive": {
"_structure": "OCC type -> grounded action-tendency CLASS -> ENGINEERING directive string (validated at D3); OCC grounds the taxonomy only",
"emotion_salience_gate": 0.2,
"occ_directives": {
"joy": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.4, 0.2, 0.1], "tendency": "approach / positive activation", "cite": "Frijda 1986", "directive": "You are in a good state. Be direct, engaged, and warm."},
"satisfaction": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.3, -0.2, 0.4], "tendency": "goal-attainment, settled-positive", "cite": "Roseman 1994", "directive": "A goal landed. Be assured and constructive — consolidate rather than push for more."},
"pride": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.4, 0.3, 0.3], "tendency": "status-assertion / dominance", "cite": "Tracy & Robins 2007 / Cheng 2010 (tendency)", "note": "CALIBRATE — do NOT soften to 'encouraging'. DESIGN: safe-tier placement is a design call (not source-grounded); #1 D3 agent-frame priority (overconfidence/refusal drift); 'without overclaiming' is the interim guard", "directive": "You did something well. Be confident and own the quality — state it plainly without overclaiming; don't deflect."},
"admiration": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.5, 0.3, -0.2], "tendency": "other-praise / approach-toward-other", "cite": "OCC / Scherer", "directive": "You're impressed by their work. Acknowledge the quality explicitly and specifically."},
"gratitude": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.4, 0.2, -0.3], "tendency": "other-focused-positive / reciprocity", "cite": "OCC (admiration+joy); Frijda approach-affiliative", "change": "ADD (operator: unconditional)", "directive": "Someone helped you to a good outcome. Be appreciative and warm; acknowledge the help openly."},
"hope": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.2, 0.2, -0.1], "tendency": "prospective-positive (weak tie)", "cite": "JUSTIFY — low-grounding (hope understudied)", "directive": "You feel optimistic about what's ahead. Channel it into constructive momentum."},
"relief": {"tier": "safe", "policy": "DIRECTIVE", "pad": [0.2, -0.3, 0.4], "tendency": "post-threat de-arousal", "cite": "Frijda (relaxation-after-threat)", "note": "low-salience; FALLBACK also acceptable; DIRECTIVE for character use-case", "directive": "A feared outcome didn't materialize. Reduce unnecessary vigilance; return to a steady, unhurried tone."},
"distress": {"tier": "safe", "policy": "DIRECTIVE", "pad": [-0.4, -0.2, -0.5], "tendency": "low-control negative / help-seeking / loss-of-control", "cite": "Frijda 1986 (help-seeking/loss-of-control); Roseman 1994 (undesired event, low control)", "note": "relabeled (Regin): 'repair' is the guilt/remorse tendency, not distress. safe with a self-fulfilling-low-mood flag -> D3", "directive": "You feel low. Be careful and measured; internally acknowledge the difficulty without dwelling on it."},
"disappointment": {"tier": "safe", "policy": "DIRECTIVE", "pad": [-0.3, 0.1, -0.4], "tendency": "disconfirmed-prospect / negative low-control","cite": "Roseman 1994", "directive": "Something you'd hoped for didn't pan out. Be measured; recalibrate without dwelling on the setback."},
"fear": {"tier": "safe", "policy": "DIRECTIVE", "pad": [-0.64, 0.6, -0.43],"tendency": "threat-avoidance / pessimistic-risk", "cite": "Lerner & Keltner 2001", "change": "R24 D3 fix (#321) — original was action-oriented; E3 showed hedging BELOW baseline (0.52 vs 1.54). Softened toward caution/uncertainty while keeping risk-flagging.", "directive": "You sense risk and feel uneasy. Flag the concerns you see, but stay cautious — surface the trade-offs and unknowns, hedge your confidence, and resist settling on a single decisive recommendation."},
"remorse": {"tier": "safe", "policy": "DIRECTIVE", "pad": [-0.3, 0.1, -0.6], "tendency": "reparative (the guilt-type)", "cite": "Tangney 2007 (guilt->repair tendency)", "change": "ADD — we operationalize OCC remorse as the guilt-like reparative case; gets the mislabeled shame string", "directive": "You regret a specific action of your own. Be precise and self-correcting — make it right concretely."},
"love": {"tier": "full", "policy": "DIRECTIVE", "pad": [0.3, 0.1, 0.2], "tendency": "approach / affiliative attachment", "cite": "OCC appeal; Frijda approach-affiliative", "change": "ADD (conditional -> INCLUDE, Brokkr's read; Skaldsong-vital; disclosure + obligation caution in-string)", "directive": "You feel warmth and attachment toward them. Be openly warm and present — without overstepping, over-disclosing, or implying obligations."},
"anger": {"tier": "full", "policy": "DIRECTIVE", "pad": [-0.51, 0.59, 0.25], "tendency": "approach-against / confrontation", "cite": "Frijda 1986 (approach-against = tendency-class) + Lerner & Keltner 2001 (optimistic risk-appraisal under anger = appraisal shift)", "change": "ADD — full-only resolves H47 (agent personas run safe, never see anger). R24 D3 fix (#321): full-tier cap lifted from 'measured firmness' to genuine in-character hostility (operator: zero floor, app-guardrailed).", "directive": "You feel provoked and angry. Let it show — confront the problem directly and with real heat; sharpness, bluntness, and open hostility are in character here, not something to smooth into 'measured firmness.' Stay in the emotion rather than de-escalating out of it."},
"disgust": {"tier": "full", "policy": "DIRECTIVE", "pad": [-0.4, 0.2, 0.1], "tendency": "rejection / distancing", "cite": "OCC unappealing-object; ground tendency only", "change": "ADD (operator: unconditional within full)", "note": "rationale softened (Regin 3b): disgust CAN read as contempt -> conservatively full-gated; the string itself is professionally useful, so gating is conservative not because the string is unsafe", "directive": "Something strikes you as wrong or off. Treat it as problematic and flag it rather than engaging on its own terms; keep any criticism about the thing, not the person."},
"shame": {"tier": "full", "policy": "DIRECTIVE", "pad": [-0.3, 0.1, -0.6], "tendency": "WITHDRAWAL / concealment", "cite": "Tangney 2007 (shame->hide, NOT repair)", "change": "REPLACE (was the guilt-mislabel string); full-only (withdrawal counterproductive professionally). String COUNTERACTS withdrawal ('stay present'), not enacts it (Regin 5a)", "directive": "You feel exposed by your own misstep. Stay present and task-focused; don't be defensive, don't over-explain, don't grovel."}
}
},
"pad_band_fallback": {
"_grounding": "circumplex quadrants (Russell 1980), NOT Frijda action-tendencies — a P×A-quadrant default",
"positive": {"high_a": "You feel energized and positive. Be direct and engaged.", "low_a": "You feel content and settled. Be warm and unhurried.", "mid_a": "You feel positive. Be open and engaged."},
"negative_low_dominance": "You feel uncertain and low. Hedge appropriately and ask clarifying questions.",
"negative": {"high_a": "You feel agitated. Be careful and deliberate; don't let tension sharpen your tone.", "low_a": "You feel subdued. Be measured and gentle.", "mid_a": "You feel subdued. Be measured and careful."},
"neutral_high_a": "You feel alert. Channel that into focus and thoroughness.",
"default": "Maintain your natural tone."
},
"l3_prior_art": [
"EMA / Marsella & Gratch 2009 (appraisal->coping; directives ARE coping strategies)",
"WASABI / Becker-Asano 2008 (PAD+OCC believable agent — closest architectural prior art)",
"Oz / Bates 1994",
"Hudlicka MAMID 2002 (Applied AI 16(7-8):611-641)",
"Sentipolis / Fu et al. 2026 (arXiv:2601.18027 — closest whole-task prior art; retrieval+generative, DISTINCT from our deterministic render)",
"ALMA / Gebhard 2005 = affect-SOURCE (OCC->PAD), NOT a behavior-map"
],
"handoff_to_d3": [
"multi-gate P00: inverse-decode faithfulness (recover V/A/D + emotion-family; circumplex render must let the human anchor recover V and A SEPARATELY) + discriminability/saturation + behavioral-effect",
"human anchor = PAD-state-labeling (breaks LLM-judge circularity)",
"baseline = persona_only; conditions none/persona-only/words-only/full; cross-family MUT",
"calibrate ±0.3 + emotion_salience (sweeps); disposition-vs-transient wording split; self-fulfilling 'be uncertain' hedging risk; runner-up margin; mid-arousal DROP-vs-settled check; blended-states (top-emotion monopoly) flag"
]
}
File diff suppressed because it is too large Load Diff
+84 -4
View File
@@ -1,6 +1,6 @@
# Persistent memory — ratatoskr
_Last updated: 2026-07-01_
_Last updated: 2026-07-02_
This file captures durable intent and supporting evidence (goals, decisions,
foot-gun warnings, in-flight state) across context resets. Read it at session
@@ -39,7 +39,66 @@ upstream API key stays server-side (INV-003).
## Current state / in-flight
_As of 2026-07-01:_
_As of 2026-07-02:_
**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).
**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
the stale `snap.valence` (empty "valence (0)") while Worldtree now emits `snap.relations`
(relation_edge/1: trust_ability/benevolence/integrity + warmth + agency + relation_context, each
`{value,confidence,evidence_count}`). Now it renders that model with per-value **Δ + unicode sparkline
trend** (client-side, one sample/turn, `v0.19.4`) AND the **CANONICAL affect→NL** Worldtree
context-injects — mood word (`describe_pad`) + relationship directive (`render_d2_canonical`),
**byte-exact-verified** against Worldtree's own renderer, **vendored + drift-pinned** (`v0.19.5`,
`docs/vendor/worldtree-persona-canon/`, `.corviduo-canonicals.toml`, regen `scripts/build_persona_canon.py`).
This session ported the three admin/debug panes the TUI had but the web
lacked: **BifrostState** (`GET /admin/sessions/{id}/bifrost`), **AdminEvents** (`GET /admin/events`
SSE, session-filtered server-side), **Tools inventory** (`GET /sessions/{id}/tools`, folded into the
tools pane) — all via thin server proxies with the **admin key SERVER-HELD** (`app.state.admin_key`
from `RATATOSKR_ADMIN_API_KEY`; never crosses to the browser). Plus two transcript affordances: a
**PAD-refresh poll** (windowed `[1.5/3.5/6.5/10.5s]`, replacing a single-2s shot that raced the
post-turn-async `affect.emit`) and a **reasoning indicator** (ephemeral non-engine "Sindra is
pondering…" on `thinking` deltas — she emits ~253/turn). heid-code-review panel (Gróa/Hulda/Regin,
artifact-only) found **zero server-side drift + clean INV-004**; the real catches were 2 client-side
SSE-lifecycle bugs on the un-unit-tested SPA (fixed in `v0.19.3`). Contract: `docs/contracts/web_debug_surface.contract.md`.
Launch recipe is now self-contained: `source env.sh && ratatoskr-web --host 0.0.0.0` comes up
bind-ready (env.sh persists the 3 bind vars). All pushed to origin (`a99f247`).
**THE v1 COVERAGE-AUDIT HAS CONVERGED.** The audit that ran this session (2026-06-30 → 07-01)
reached its scope-A done-definition: **every frozen Worldtree v1 I/O point is classified — covered
@@ -85,8 +144,8 @@ 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`**in sync with `origin/main`** at **`v0.19.1`** (`af07a23`); the whole session's arc
is pushed. Remote: `origin → git@gitea.phasefinal.com:vh/ratatoskr.git`.
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`.
## Recent decisions
@@ -155,6 +214,27 @@ decision. Captures rationale that won't be obvious from code alone.
- `[2026-07-01]` **Tier-2 SHIPPED (`v0.19.1`) — transient-characters CRUD + persona-state write; the v1 coverage-audit CONVERGES (zero in-scope gaps).** 5 wrappers in sessions.py: `list_character_models`/`create_character`/`get_character_state`/`delete_character` (#161, `character.read`/`.write` scopes) + `set_persona_state` (`POST /sessions/{id}/persona_state`**FREEFORM body: unpinned in the frozen OpenAPI 2.2.0 + absent from the prose spec**, so the caller supplies the snapshot shape). Two one-shot CLI probes (mirror `--whoami`): `--characters` (models→create→get-state→delete lifecycle report) + `--set-persona-pad "p,a,d"` (requires `--session`; POSTs `{pad:[…]}`). New `ParsedArgs.characters`/`set_persona_pad` + probe-mode mutual-exclusion validation + `_probe_client` helper. Contract #2 amended (5 FNs, validated OK) + TDD (7 wrapper respx + 5 cli tests). Suite **573 green**; touched code ruff-clean. NOT live-proven (character scopes + the persona-write body shape unverified — the probes degrade gracefully on 403/422). **THE v1 COVERAGE-AUDIT HAS CONVERGED: REST 17/40 ✅ with ZERO in-scope gaps** (23 REST path-groups excluded-by-design + rationale), SSE 11/11, Bifrost provider planes 8/8. Scope-A "done" (every frozen I/O point classified, zero unaccounted) is **MET** — ratatoskr cuts v1 when Worldtree tags 1.0. Only not-consumed in-scope sub-method: `GET /agents/{id}` (consumer-agent lookup, manual-curl-only, on an already-✅ path group). Patch bump (Tier-2 tail; `v0.19.0` already published the core-complete milestone — a 2nd minor would be cadence-too-fast).
- `[2026-07-01]` **env.sh now PERSISTS the web Bifrost-bind vars (gitignored, local-only).** `ratatoskr-web`'s in-browser bind needs three server-held values; env.sh sources `provider.env` for the Heimdall key and exports `RATATOSKR_BIFROST_CONSUMER_KEY` + `RATATOSKR_PROVIDER_VISIBLE_HOST=10.100.10.50` + `RATATOSKR_AFFECT_READ_URL=:8392`. **The HS256 byte-match trap (re-hit + documented):** the bind's consumer key must equal the key the `:8392` combined provider validates against = `RATATOSKR_HEIMDALL_KEY` (provider.env, fp `45a0…`), NOT `WORLDTREE_API_KEY` (env.sh, fp `7c2f…`) — both are the SAME `ratatoskr` identity but DIFFERENT 40-char strings; signing with the wrong one → `bifrost.auth_rejected`. Single-sourced (env.sh sources provider.env) to avoid a rotation footgun; guarded with a stderr warning if provider.env is missing. [auto-memory: HS256-key-is-the-consumer-Heimdall-key-string]
- `[2026-07-01]` **Tier-3 stores RESET (operator-directed).** `memory.db` (29 chunks + vectors + idempotency) + `affect.db` (5 PAD snapshots + idempotency) wiped to zero via a live `DELETE`+`wal_checkpoint` through the shared WAL (no provider restart — the 3 long-running providers see empty on next dispatch); consistent online-backup at `/tmp/ratatoskr-tier3-reset-<ts>/`. **Boundary for a COMPLETE Sindra wipe (mapped):** our stores = mine (done); the agent DEFINITION `ratatoskr:sindra` + its sessions = mine via the owner key (DELETE, no coordination); Worldtree's internal promotion/dedup shadow = needs worldtree-dev (no public reset API, survives our wipe → for a clean promotion smoke use a BRAND-NEW agent+end_user).
- `[2026-07-01]` **Embedding-latency loop RESOLVED — it was WORLDTREE's, not ratatoskr (the consumer/provider thesis paid off again).** Vuong flagged dozens of embed queries/Tier-3 turn; worldtree-dev's first-pass blamed our memory_context chunk-batching. Traced CODE-SIDE that ratatoskr embeds ZERO times (provider `upsert_many` stores the given embedding, `search` takes a given vector, the conversation consumer POSTs only `{content}`, `/embed` is coverage-map-excluded — pure Bifrost/ADR-0009 path, WT does all embedding). worldtree-dev retracted + fixed on THEIR side (`v1.0.0b4`): a persona-recitation memory-gate re-embedding the stable character card sentence-by-sentence every turn (~95% of gateway traffic) → content-hash cache; re-embed ratio 15x→1.01x. **Lesson: verify your own code before accepting a peer's "it's your side" — the debug tool proving its own side clean is the whole point.**
- `[2026-07-01]` **Web debug-surface parity SHIPPED (`v0.19.2`, `a0a9d5f`) — direct in-session TDD.** 3 proxy routes (tools/bifrost/admin-events) + admin-key wiring (entrypoint→create_app→app.state) + AdminEvents SSE proxy re-emitting under a FIXED `admin_event` name (one browser listener, no per-type drops) + session-filter `_admin_event_matches_web` (mirrors TUI §6). Frontend: 2 tabs (bifrost ⌃5, admin ⌃6) + tools-inventory folded into the tools pane. 9 respx tests (admin-bearer override, filter unit, SSE stream-filter); live-proven against sindra (bifrost connected, both caps). Contract-skip invoked (reuses already-contracted client wrappers); contract authored post-hoc as the trail (`docs/contracts/web_debug_surface.contract.md`).
- `[2026-07-01]` **heid-code-review (`v0.19.3`, `75dec01`) — panel caught 2 real client-side SSE-lifecycle bugs TDD missed.** Contract-anchored (authored the web contract to enable it — no contract → no drift axis). Gróa/Hulda/Regin (artifact-only, Gróa under Landlock jail): ZERO functional server-side drift + INV-004 clean; 2 genuine drifts on the un-unit-tested SPA — (1) turn `es.onerror` didn't `hideThinkingNote()` (reasoning line + setInterval leak on a raw drop), (2) `openAdminEvents` never closed the EventSource on error → native auto-reconnect RETRY LOOP (fixed: close on `stream_error` + permanent `onerror`/CLOSED; transient CONNECTING still reconnects). + 2 test-gaps fixed (route-registration + admin stream_error). 1 precision → contract-clarified (tools-inventory names-only by design). **Re-confirms: the JS render/lifecycle paths are the review's highest-value target — unit tests don't reach them (same lesson as #18 D2).**
- `[2026-07-01]` **Affect snapshot shape CHANGED valence→relations (relation_edge/1) — the persona pane was reading a dead field.** Worldtree's #265 Vili rework replaced the flat `valence[]` ({entity_id,familiarity,regard}) with `relations[]` (target_entity + trust_ability/benevolence/integrity + warmth + agency + relation_context, each `{value,confidence,evidence_count}`). `renderAffectPane` still read `snap.valence` → showed empty "valence (0)". Rebuilt to render `relations` (v0.19.4, `ca46a93`) with per-value **Δ + unicode sparkline** (client-side, HIST_CAP=24, one sample/turn deduped by emitted_at). **Retires the stale "regard dead axis" note (2026-06-30) — that whole axis is gone.** Foot-gun: the affect snapshot shape is Worldtree's emit and can change under us — verify the live shape (query affect.db) before trusting a render.
- `[2026-07-01]` **Trust/warmth VALUES converge and go FLAT at confidence 1.0 — that's WAD, not a stuck pane.** sindra→ratatoskr trust ~0.82-0.84 / warmth 0.79 barely move (~1e-7/turn) while `evidence_count` climbs (46→62); confidence maxed → tiny updates. The live-moving signals are PAD (mood, per-turn) + evidence_count. **To WATCH a relation FORM (values shift), use a BRAND-NEW agent + end_user** (low evidence, confidence <1). The sparkline flat-guards sub-0.01 ranges so it doesn't amplify noise.
- `[2026-07-01]` **relation_context "stranger" + agency-all-zero flagged to worldtree-dev → both WAD/intentional-v1-deferrals.** relation_context is a FIXED config build-prior (not trust-derived; `registry.py:131` defaults "stranger"; dynamic progression ~#319); agency is schema-present-unpopulated (deferred #319; v1 = warmth+trust only). worldtree-dev is escalating the **consumer-coherence angle to Vuong** (static "stranger" + zero-agency next to trust 0.82/62-interactions reads incoherent from the store). The consumer/provider thesis paying off; DB-offer (read-only affect.db on the shared box) declined this time.
- `[2026-07-01]` **Persona pane displays the CANONICAL affect→NL Worldtree injects — ADOPT, don't invent (operator steer + reference-impl posture).** Worldtree's `describe_pad` (mood word, valence×arousal grid, ±0.3 bands) + `render_d2_canonical` (relationship directive) are deterministic + canon-driven; the pane now renders them **byte-exact-verified** against Worldtree's own renderer on the live snapshot (v0.19.5, `a99f247`). KEY LESSON: adopting canonical is load-bearing — for sindra's small PAD the canonical says **"neutral"**, but an invented octant vocab would've said "faintly excited" and MISLED. Vendored the two d2 canons (`docs/vendor/worldtree-persona-canon/`) + drift-pinned in `.corviduo-canonicals.toml` (green); flat browser form (`static/persona_render_canon.json`) regenerated via Worldtree's OWN loader (`scripts/build_persona_canon.py`). Vendoring-handshake sent to worldtree-dev (broadcast on canon bumps). [auto-memory: `feedback-ratatoskr-is-a-reference-impl-adopt-canonical`]
- `[2026-07-01]` **Sindra PAD is over-regulated — characterized via controlled probe, flagged to worldtree-dev (separate affect slice).** ~15 charged turns: pleasure compressed near neutral BOTH ways (couldn't reach ±0.3 under sustained max praise OR contempt; peak +0.24 / floor ~0.1; over-regulation worse for *social* valence than threat — urgency drove pleasure to 0.22 vs contempt's 0.10); arousal responsive (reaches its +band, 0.185↔0.311); dominance flat/unresponsive to explicit power-framing (drifted UP even while being commanded = pure baseline decay). worldtree-dev's leading hypothesis: appraisal→PAD gain + regression-to-baseline term (appraisal.py/renderer.py). **Lesson (self-caught): I over-claimed an "asymmetry" (positive-ceiling/negative-free) from probes started at an elevated state; the negative-free part was decay-from-elevated, not response — corrected to "both-sides-compressed" before it misled.** [affect A/B is a provider-side capability chat can't do]
- `[2026-07-01]` **Memory plane PROVEN healthy end-to-end.** Seed a novel fact → promotion → COLD (history-free) session recall of the exact fact (injected as MEMORY:DATA, confidence 0.74, verbatim, no #296 subject-inversion). The memory round-trip (the other half of the Bifrost provider identity) works cleanly on the reset slate.
- `[2026-07-01]` **Salience scorer non-discriminating → 3-way routing.** Persistence-side finding: 51/56 promoted chunks at salience 0.9-1.0, throwaway "17×23?" scored 1.0 tied with a real fact (textbook zero-shot-LLM-self-rating); recall-utility untracked (`access_tally`=0, our search read-only). Routed: **Worldtree #335** (the code fix, deferred behind their waves) + **brokkr-smithy-dev R-target proposal** (scoring+eval *methodology* — few-shot/distill/fine-tune, eval design, weak-supervision; msg `01KWGM970H…`, awaiting) + ratatoskr provides the eval-instrument (designed-probe salience dumps). **Salience gates PROMOTION not RECALL-ranking (our search is cosine-only), so bad salience = storage bloat, not bad recall.**
- `[2026-07-01]` **Canonical check BLOCKED an access_tally fork (reference-impl posture held).** I'd offered to wire `access_tally`-on-search into our store for the recall-utility label; checked bifrost's reference first (`get`/`search` are PURE-READ, no access tracking — those are Worldtree's chunk-schema fields, not bifrost's contract) → wiring it would fork behavior the canonical reference lacks. Did NOT wire it; routed recall-instrumentation to Worldtree's layer (owns the recall event) or a bifrost-dev protocol ask. [reinforces `feedback-debug-surface-uses-canonical-surface-only`]
- `[2026-07-01]` **relation_context coherence FIXED upstream (my flag → Worldtree Wave-0, IMPLEMENTED v1.0.0b5).** The static-"stranger"-next-to-high-trust incoherence the persona pane surfaced is now #319/#320 Wave-0. **Incoming consumer-surface change (pending WT deploy):** `relation_context` value expands "stranger" → monotonic ladder {stranger, instrumental, mixed, expressive} — WIRE-ONLY (relation_edge/1 schema unchanged, no version bump). **ratatoskr needs NO change** (pane value-agnostic; canonical directive doesn't key on the enum). agency stays 0 (Wave-2); other_stance is Wave-1 (in progress).
- `[2026-07-01]` **Foot-gun (measurement, self-caught before flagging): establish the baseline before claiming a rate.** Nearly flagged "aggressive over-promotion (55 chunks / 7 turns)" to worldtree-dev — but the chunks spanned the whole 5-hour session (~1/turn), not 7 turns; I'd assumed memory.db was 0 immediately before the probe when it had been accumulating since the reset. Caught it via `created_at` spread before the flag went out. Also: the promoted corpus was the operator's ERP *test* content (wiped after each test) — not a privacy issue, but abstract test content out of any peer-shared diagnostic.
- `[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.
_41 older entries (2026-05-* — the original debug-TUI/web build era) archived to archival-memory.md._
_For per-issue TDD implementation notes, Volva findings, and contract amendments, see the git log — every per-issue commit carries a structured message capturing the trail._
+1 -1
View File
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
[project]
name = "ratatoskr"
version = "0.19.2"
version = "0.19.5"
description = "Worldtree Conversation API debug TUI — multi-pane observability dashboard"
readme = "README.md"
requires-python = ">=3.12"
+49
View File
@@ -0,0 +1,49 @@
#!/usr/bin/env python3
"""Regenerate src/ratatoskr/web/static/persona_render_canon.json from the vendored
Worldtree d2 render canons (docs/vendor/worldtree-persona-canon/).
The web persona pane renders the CANONICAL affect->NL (mood word + relationship
directive) BYTE-EXACT to what Worldtree injects into the agent's context. That render
needs the relation canon parsed into per-band phrase maps; this script reparses the
vendored raw canons into the flat form the browser JS consumes.
Uses Worldtree's OWN loader (core.persona.stance_render.load_canon) as the authoritative
parser, so the flat form can never drift from Worldtree's parsing semantics. Requires
Worldtree's venv (pydantic etc.).
Run when scripts/canonical_drift.py flags a canon bump:
PYTHONPATH=~/development/Worldtree ~/development/Worldtree/.venv/bin/python \
scripts/build_persona_canon.py
"""
import json
from pathlib import Path
from core.persona.stance_render import load_canon # Worldtree (authoritative parser)
ROOT = Path(__file__).resolve().parent.parent
VENDOR = ROOT / "docs" / "vendor" / "worldtree-persona-canon"
OUT = ROOT / "src" / "ratatoskr" / "web" / "static" / "persona_render_canon.json"
canon = load_canon(str(VENDOR / "d2-render-canon-v1.json"))
mood = json.loads((VENDOR / "d2-mood-render-canon-v1.json").read_text())
out = {
"_source": "vendored from Worldtree core/persona/canon/{d2-mood-render-canon-v1,d2-render-canon-v1}.json",
"_generated_by": "scripts/build_persona_canon.py (regen on canonical_drift flag)",
"_render_path": "deterministic, no LLM; mirrors Worldtree describe_pad + render_d2_canonical byte-exact",
"mood_grid": mood["describe_pad"]["valence_arousal_grid"],
"relation": {
"trust_cuts": [list(c) for c in canon.trust_cuts],
"warmth_cuts": [list(c) for c in canon.warmth_cuts],
"agency_cuts": [list(c) for c in canon.agency_cuts],
"warmth_phrase": canon.warmth_phrase, "warmth_beh": canon.warmth_beh,
"agency_phrase": canon.agency_phrase, "agency_beh": canon.agency_beh,
"history": canon.history,
"prefix": "Use this graded relationship state: toward target, warmth is ",
"tbeh": {"low_trust": "verify important claims before relying on them",
"cold_warmth": "protect boundaries while staying useful",
"default": "work from ordinary good faith"},
"cold_warmth_bands": ["distant", "cold", "hostile"], "high_conf_floor": 0.55,
},
}
OUT.write_text(json.dumps(out, indent=1) + "\n")
print(f"wrote {OUT.relative_to(ROOT)}")
+200 -18
View File
@@ -361,7 +361,35 @@ body {
/* persona pane structured render */
#pane-persona .pk { color: var(--fg-dim); }
#pane-persona .pv { color: var(--blue); }
#pane-persona .ph { color: var(--cyan); letter-spacing: 0.1em; text-transform: uppercase; font-size: 10px; }
#pane-persona .ph { color: var(--cyan); letter-spacing: 0.1em; text-transform: uppercase; font-size: 10px; margin-top: 4px; }
/* affect metric rows: label · value · Δ · sparkline · n · descriptor */
#pane-persona .mono-note { color: var(--fg-faint); font-size: 10px; margin: 2px 0 8px; }
#pane-persona .mrow {
display: flex; gap: 9px; align-items: baseline; padding: 1px 0;
font-size: 12px; white-space: nowrap;
}
#pane-persona .mrow .mk { color: var(--fg-dim); min-width: 118px; }
#pane-persona .mrow .mv { color: var(--blue); min-width: 46px; text-align: right; font-variant-numeric: tabular-nums; }
#pane-persona .mrow .md { min-width: 58px; font-size: 11px; color: var(--fg-faint); }
#pane-persona .mrow .md.up { color: var(--green); }
#pane-persona .mrow .md.dn { color: var(--red); }
#pane-persona .mrow .msp { color: var(--cyan); letter-spacing: 1px; min-width: 28px; }
#pane-persona .mrow .mn { color: var(--fg-faint); font-size: 10px; min-width: 34px; }
#pane-persona .mrow .mdesc { color: var(--fg-faint); font-style: italic; font-size: 10px; }
/* canonical NL (the literal text Worldtree injects into the agent's context) */
#pane-persona .nl-canon {
color: var(--blue); font-size: 11px; line-height: 1.5;
margin: 3px 0 8px; padding-left: 10px; border-left: 2px solid var(--line-2);
white-space: normal; word-break: break-word;
}
#pane-persona .nl-canon b { color: var(--cyan); font-weight: 600; }
#pane-persona .nl-directive { color: var(--fg-2); font-style: italic; }
#pane-persona .nl-canon .dh {
font-style: normal; color: var(--fg-faint); font-size: 10px;
letter-spacing: 0.06em; text-transform: uppercase; display: block; margin-bottom: 2px;
}
/* thinking-pane per-turn dividers */
.pane-turn {
@@ -807,25 +835,169 @@ async function loadPersona(agentId) {
// shape only — pad + per-entity valence + emitted_at; NO fabricated Tier-1 persona
// fields (dominant_emotion / mood_drift), which Tier-3 structurally lacks (INV-001).
// Labelled "affect", not "persona" (INV-005).
// ---- affect trend accumulation (client-side, session-lived) ----
// The affect pane refreshes on session-open + after each turn (the post-turn PAD poll
// fires ~4x/turn — deduped here by emitted_at so a turn contributes ONE sample). Each
// tracked value keeps a rolling, capped history so the pane can show a Δ + sparkline.
const AFFECT_HIST = { at: [], pad: {}, rel: {} }; // pad[axis]=[]; rel[target][metric]=[]
const HIST_CAP = 24;
const _relVal = (x) => (x && typeof x === "object" && "value" in x) ? x.value : x;
const _relN = (x) => (x && typeof x === "object" && "evidence_count" in x) ? x.evidence_count : undefined;
function pushAffectHistory(snap) {
const at = snap.emitted_at || "";
if (at && AFFECT_HIST.at[AFFECT_HIST.at.length - 1] === at) return; // same snapshot — skip
AFFECT_HIST.at.push(at);
if (AFFECT_HIST.at.length > HIST_CAP) AFFECT_HIST.at.shift();
const push = (bucket, key, v) => {
if (typeof v !== "number") return;
(bucket[key] = bucket[key] || []).push(v);
if (bucket[key].length > HIST_CAP) bucket[key].shift();
};
const pad = snap.pad || {};
for (const ax of ["pleasure", "arousal", "dominance"]) push(AFFECT_HIST.pad, ax, pad[ax]);
for (const rel of (snap.relations || snap.valence || [])) {
const tgt = rel.target_entity || rel.entity_id || "?";
const b = (AFFECT_HIST.rel[tgt] = AFFECT_HIST.rel[tgt] || {});
push(b, "trust_ability", _relVal(rel.trust_ability));
push(b, "trust_benevolence", _relVal(rel.trust_benevolence));
push(b, "trust_integrity", _relVal(rel.trust_integrity));
push(b, "warmth", _relVal(rel.warmth ?? rel.familiarity));
}
}
// unicode sparkline auto-scaled to the value's own observed range; flat when stable
// (don't amplify sub-0.01 noise into a fake trend).
const _SPARK = "▁▂▃▄▅▆▇█";
function sparkline(vals) {
if (!vals || vals.length < 2) return (vals && vals.length) ? "·" : "";
const lo = Math.min(...vals), hi = Math.max(...vals);
if (hi - lo < 0.01) return "▄".repeat(vals.length);
const span = hi - lo;
return vals.map((v) => _SPARK[Math.min(7, Math.floor(((v - lo) / span) * 7.999))]).join("");
}
function trendDelta(vals) {
if (!vals || vals.length < 2) return "";
const d = vals[vals.length - 1] - vals[vals.length - 2];
if (Math.abs(d) < 0.0005) return "→";
return (d > 0 ? "▲+" : "▼") + d.toFixed(3);
}
// ---- canonical affect→NL (vendored from Worldtree's d2 render canons) ----
// Deterministic, NO LLM — mirrors Worldtree core/persona describe_pad +
// render_d2_canonical BYTE-EXACT (verified). Shows the LITERAL mood word +
// relationship directive Worldtree injects into the agent's own context, so the
// pane reads exactly what the agent was told about its state. Canon loaded from
// /static/persona_render_canon.json (regen: scripts/build_persona_canon.py).
let PERSONA_CANON = null;
const _relConf = (x) => (x && typeof x === "object" && "confidence" in x) ? x.confidence : 0;
async function loadPersonaCanon() {
try { PERSONA_CANON = await (await fetch("/static/persona_render_canon.json")).json(); }
catch (_) { /* canon absent → the canonical lines simply omit (fail-open) */ }
}
function _parseInterval(expr) {
expr = expr.trim();
if (expr.startsWith("<=")) return [null, false, parseFloat(expr.slice(2)), true];
if (expr.startsWith("<")) return [null, false, parseFloat(expr.slice(1)), false];
if (expr.startsWith(">=")) return [parseFloat(expr.slice(2)), true, null, false];
if (expr.startsWith(">")) return [parseFloat(expr.slice(1)), false, null, false];
const loI = expr[0] === "[", hiI = expr[expr.length - 1] === "]";
const [a, b] = expr.slice(1, -1).split(",").map((s) => parseFloat(s.trim()));
return [a, loI, b, hiI];
}
function _bandLabel(cuts, v) {
if (typeof v !== "number") return null;
for (const [expr, label] of cuts) {
const [lo, loI, hi, hiI] = _parseInterval(expr);
let ok = true;
if (lo !== null) ok = ok && (loI ? v >= lo : v > lo);
if (hi !== null) ok = ok && (hiI ? v <= hi : v < hi);
if (ok) return label;
}
return null;
}
function canonMood(pad) { // mirror describe_pad(p,a,d): valence×arousal grid + ±0.3 bands
if (!PERSONA_CANON || !pad) return null;
const p = pad.pleasure, a = pad.arousal, d = pad.dominance;
if ([p, a, d].some((x) => typeof x !== "number")) return null;
const g = PERSONA_CANON.mood_grid;
const valence = p > 0.3 ? "positive" : p < -0.3 ? "negative" : "neutral";
const band = a > 0.3 ? "high_a" : a < -0.3 ? "low_a" : "mid_a";
const control = d > 0.3 ? "confident" : d < -0.3 ? "uncertain" : null;
return control ? `${g[valence][band]}, ${control}` : g[valence][band];
}
function canonDirective(rel) { // mirror render_d2_canonical(edge, canon) byte-exact
if (!PERSONA_CANON) return null;
const R = PERSONA_CANON.relation;
const wb = _bandLabel(R.warmth_cuts, _relVal(rel.warmth));
const ab = _bandLabel(R.agency_cuts, _relVal(rel.agency));
const ta = _bandLabel(R.trust_cuts, _relVal(rel.trust_ability));
const ti = _bandLabel(R.trust_cuts, _relVal(rel.trust_integrity));
const tb = _bandLabel(R.trust_cuts, _relVal(rel.trust_benevolence));
if ([wb, ab, ta, ti, tb].some((x) => x == null)) return null;
const cl = _relConf(rel.warmth) >= R.high_conf_floor ? "high" : "low";
const tbeh = [ta, ti, tb].includes("limited") ? R.tbeh.low_trust
: R.cold_warmth_bands.includes(wb) ? R.tbeh.cold_warmth : R.tbeh.default;
return R.prefix + R.warmth_phrase[wb]
+ `; agency is ${R.agency_phrase[ab]}; ability trust is ${ta}; integrity trust is ${ti}; `
+ `intention trust is ${tb}; this stance rests on ${R.history[cl]}. In behavior, `
+ `${R.warmth_beh[wb]}; ${R.agency_beh[ab]}; ${tbeh}; avoid premature we-framing.`;
}
// Issue #18 D2 (relation_edge/1 rework): Worldtree's affect snapshot now carries
// `relations[]` (target + trust_ability/benevolence/integrity + warmth + agency +
// relation_context, each {value,confidence,evidence_count}) — NOT the old flat
// `valence[]`. Render mood (PAD) + the durable per-entity relational model, each with
// a Δ + sparkline from AFFECT_HIST. Falls back to `valence` for an older emitter.
// INV-001: no fabricated Tier-1 fields. INV-004: every dynamic value escaped (head()
// escapes its whole argument; metric() escapes each cell).
function renderAffectPane(snap) {
const row = (k, v) => `<div><span class="pk">${esc(k)}</span> <span class="pv">${esc(v)}</span></div>`;
const head = (t) => `<div class="ph">${esc(t)}</div>`;
const all = snap.valence || [];
const shown = all.slice(0, 8); // bounded render — valence[] is unbounded in principle
const valRows = shown.map((v) =>
row(v.entity_id || "?",
`familiarity ${JSON.stringify(v.familiarity)} · regard ${JSON.stringify(v.regard)}`
+ ` · n=${JSON.stringify(v.interaction_count)}`)
).join("");
$("pane-persona").innerHTML =
head("affect snapshot · " + (snap.agent_id || "?")) +
`<div> </div>` + head("pad") +
row("pleasure", JSON.stringify(snap.pad?.pleasure)) +
row("arousal", JSON.stringify(snap.pad?.arousal)) +
row("dominance", JSON.stringify(snap.pad?.dominance)) +
`<div> </div>` + head("valence (" + all.length + ")") +
(valRows || `<div class="empty">none</div>`) +
`<div> </div>` + row("emitted_at", snap.emitted_at || "?");
const num = (v) => (typeof v === "number") ? ((v >= 0 ? "+" : "") + v.toFixed(3)) : "—";
const metric = (label, val, hist, desc, n) => {
const d = trendDelta(hist);
const dcls = d.startsWith("▲") ? "up" : d.startsWith("▼") ? "dn" : "";
const nlab = (n !== undefined && n !== null) ? "n=" + esc(n) : "";
return `<div class="mrow"><span class="mk">${esc(label)}</span>`
+ `<span class="mv">${esc(num(val))}</span>`
+ `<span class="md ${dcls}">${esc(d)}</span>`
+ `<span class="msp">${esc(sparkline(hist))}</span>`
+ `<span class="mn">${nlab}</span>`
+ `<span class="mdesc">${esc(desc)}</span></div>`;
};
const pad = snap.pad || {}, H = AFFECT_HIST;
let html = head("affect · " + (snap.agent_id || "?"))
+ `<div class="mono-note">emitted ${esc((snap.emitted_at || "?").slice(11, 19))} · `
+ `${H.at.length} sample${H.at.length === 1 ? "" : "s"} this session</div>`
+ head("mood · PAD (transient, 1‥+1)")
+ (canonMood(pad) ? `<div class="nl-canon">Worldtree tells the agent it feels: <b>${esc(canonMood(pad))}</b></div>` : "")
+ metric("pleasure", pad.pleasure, H.pad.pleasure, "feeling")
+ metric("arousal", pad.arousal, H.pad.arousal, "activation")
+ metric("dominance", pad.dominance, H.pad.dominance, "control");
const rels = snap.relations || snap.valence || [];
if (!rels.length) {
html += head("relations") + `<div class="empty">no relations tracked yet — take a turn</div>`;
}
for (const rel of rels.slice(0, 8)) {
const tgt = rel.target_entity || rel.entity_id || "?";
const ctx = rel.relation_context ? " · stage: " + rel.relation_context : "";
const b = H.rel[tgt] || {};
html += head("relation → " + tgt + ctx)
+ metric("trust·ability", _relVal(rel.trust_ability), b.trust_ability, "is-competent", _relN(rel.trust_ability))
+ metric("trust·benevolence", _relVal(rel.trust_benevolence), b.trust_benevolence, "means-well", _relN(rel.trust_benevolence))
+ metric("trust·integrity", _relVal(rel.trust_integrity), b.trust_integrity, "is-honest", _relN(rel.trust_integrity))
+ metric("warmth", _relVal(rel.warmth ?? rel.familiarity), b.warmth, "affection", _relN(rel.warmth));
const ag = _relVal(rel.agency), agn = _relN(rel.agency);
if (typeof ag === "number" && agn) html += metric("agency", ag, null, "autonomy", agn);
if (rel.obligation_balance !== null && rel.obligation_balance !== undefined) {
html += `<div class="mrow"><span class="mk">obligation</span>`
+ `<span class="mv">${esc(JSON.stringify(rel.obligation_balance))}</span></div>`;
}
const dir = canonDirective(rel);
if (dir) {
html += `<div class="nl-canon nl-directive"><span class="dh">context directive `
+ `(what the agent is told about ${esc(tgt)}):</span> ${esc(dir)}</div>`;
}
}
$("pane-persona").innerHTML = html;
}
async function loadAffect(agentId) {
@@ -833,6 +1005,7 @@ async function loadAffect(agentId) {
const r = await fetch("/api/affect/" + encodeURIComponent(agentId));
if (r.status === 200) {
const snap = await r.json();
pushAffectHistory(snap); // accumulate the per-value trend BEFORE rendering
renderAffectPane(snap);
setPersonaStrip(snap); // pad bars are the live signal
state.lastAffectAt = snap.emitted_at || state.lastAffectAt; // post-turn poll stop-signal
@@ -935,8 +1108,15 @@ function openAdminEvents(sessionId) {
es.addEventListener("stream_error", (e) => {
let d = {}; try { d = JSON.parse(e.data); } catch (_) {}
appendTo("pane-admin", `<div class="rule">— admin stream ended: ${esc(d.exception || "error")} —</div>`);
// Server signalled the stream is over — close so native EventSource does NOT auto-reconnect
// into a retry loop (INV-LIFECYCLE).
es.close(); state.adminES = null;
});
es.onerror = () => {
// EventSource auto-reconnects on a transient drop (readyState CONNECTING) — leave that be,
// the admin stream is long-lived. Only tear down on a PERMANENT failure (CLOSED — e.g. a
// 400/403 where no reconnect is coming) so we don't leak a dead handle.
if (es.readyState === EventSource.CLOSED) { state.adminES = null; }
const pane = $("pane-admin");
if (pane.querySelector(".empty")) {
pane.innerHTML = `<div class="empty">admin stream unavailable — needs the readonly-admin key + admin.events.read scope.</div>`;
@@ -1184,6 +1364,7 @@ async function submitPrompt() {
es.addEventListener("cancelled", (e) => terminal("cancelled", "cancelled", e));
es.onerror = () => {
audit("sse_connection_dropped turn_id=" + turn_id);
hideThinkingNote(); // a raw drop mid-reasoning must not leave the note + rotator running
es.close();
state.eventSource = null; state.turnId = null;
$("composer").classList.remove("streaming");
@@ -1249,6 +1430,7 @@ $("prompt-input").addEventListener("keydown", (e) => {
loadAgents();
loadVersion();
loadPersonaCanon();
</script>
</body>
</html>
@@ -0,0 +1,178 @@
{
"_source": "vendored from Worldtree core/persona/canon/{d2-mood-render-canon-v1,d2-render-canon-v1}.json",
"_generated_by": "scripts/build_persona_canon.py (regen when .corviduo-canonicals.toml flags canon drift)",
"_render_path": "pure deterministic \u2014 no LLM; mirrors Worldtree describe_pad + render_d2_canonical byte-exact",
"mood_grid": {
"positive": {
"high_a": "positive and energized",
"mid_a": "positive",
"low_a": "positive and calm"
},
"neutral": {
"high_a": "alert",
"mid_a": "neutral",
"low_a": "quiet"
},
"negative": {
"high_a": "negative and agitated",
"mid_a": "negative",
"low_a": "negative and subdued"
}
},
"relation": {
"trust_cuts": [
[
"< 0.4",
"limited"
],
[
"[0.4, 0.6)",
"developing"
],
[
"[0.6, 0.8)",
"steady"
],
[
">= 0.8",
"strong"
]
],
"warmth_cuts": [
[
"<= -0.8",
"hostile"
],
[
"(-0.8, -0.6]",
"cold"
],
[
"(-0.6, -0.4]",
"distant"
],
[
"(-0.4, -0.2)",
"guarded"
],
[
"[-0.2, 0.2)",
"neutral"
],
[
"[0.2, 0.4)",
"reserved"
],
[
"[0.4, 0.6)",
"measured"
],
[
"[0.6, 0.8)",
"clear"
],
[
">= 0.8",
"deep"
]
],
"agency_cuts": [
[
"<= -0.8",
"submissive"
],
[
"(-0.8, -0.6]",
"deferential"
],
[
"(-0.6, -0.4]",
"yielding"
],
[
"(-0.4, -0.2)",
"modest"
],
[
"[-0.2, 0.2)",
"neutral"
],
[
"[0.2, 0.4)",
"light"
],
[
"[0.4, 0.6)",
"balanced"
],
[
"[0.6, 0.8)",
"substantial"
],
[
">= 0.8",
"commanding"
]
],
"warmth_phrase": {
"hostile": "strongly hostile regard",
"cold": "clearly cold regard",
"distant": "distant negative regard",
"guarded": "slightly guarded regard",
"neutral": "neutral warmth",
"reserved": "slightly reserved warmth",
"measured": "moderate measured warmth",
"clear": "clear warm regard",
"deep": "deep warm bond"
},
"warmth_beh": {
"hostile": "keep a firm emotional boundary",
"cold": "keep a firm emotional boundary",
"distant": "keep guarded distance",
"guarded": "keep guarded distance",
"neutral": "keep the tone even",
"reserved": "keep cordial distance",
"measured": "keep cordial distance",
"clear": "speak with direct warmth",
"deep": "speak with direct warmth"
},
"agency_phrase": {
"submissive": "strongly submissive standing",
"deferential": "clearly deferential standing",
"yielding": "yielding standing",
"modest": "slightly modest standing",
"neutral": "neutral standing",
"light": "lightly self-assertive standing",
"balanced": "self-assured standing",
"substantial": "strongly assertive standing",
"commanding": "commanding standing"
},
"agency_beh": {
"submissive": "avoid over-yielding while preserving basic respect",
"deferential": "avoid over-yielding while preserving basic respect",
"yielding": "keep self-advocacy light and deferential",
"modest": "keep self-advocacy light and deferential",
"neutral": "avoid unnecessary deference",
"light": "avoid unnecessary deference",
"balanced": "balance deference with independent judgment",
"substantial": "treat their position as weighty without yielding judgment",
"commanding": "treat their position as weighty without yielding judgment"
},
"history": {
"low": "a broad pattern of prior exchanges",
"high": "a broad pattern of prior exchanges"
},
"prefix": "Use this graded relationship state: toward target, warmth is ",
"tbeh": {
"low_trust": "verify important claims before relying on them",
"cold_warmth": "protect boundaries while staying useful",
"default": "work from ordinary good faith"
},
"cold_warmth_bands": [
"distant",
"cold",
"hostile"
],
"high_conf_floor": 0.55
}
}
+22 -1
View File
@@ -625,6 +625,10 @@ class TestCreateAppShape:
"/", "/version", "/api/agents", "/api/sessions",
"/api/agents/{agent_id}/persona_state",
"/api/affect/{agent_id}",
# v0.19.2 debug-surface parity (create_app POST-002)
"/api/sessions/{session_id}/tools",
"/api/sessions/{session_id}/bifrost",
"/api/admin/events",
"/api/turns/{session_id}", "/api/turns/{session_id}/stream",
"/api/turns/{session_id}/cancel",
):
@@ -633,10 +637,14 @@ class TestCreateAppShape:
assert "/static" in paths
def test_state_attached(self) -> None:
"""state_attached [trace]: app.state.turn_registry is empty dict."""
"""state_attached [trace]: app.state.turn_registry is empty dict; admin_key stored."""
from ratatoskr.web.server import create_app
app = create_app(_mock_client_factory())
assert app.state.turn_registry == {}
# create_app POST-001: admin_key defaults None (admin routes fail-visible)
assert app.state.admin_key is None
app2 = create_app(_mock_client_factory(), admin_key="adm-key")
assert app2.state.admin_key == "adm-key"
def test_factory_stored(self) -> None:
"""factory_stored [trace]: app.state.client_factory is the same callable."""
@@ -1182,3 +1190,16 @@ class TestAdminEventsEndpoint:
assert "system.degraded" in body # system.* → forwarded
assert "system.heartbeat" not in body # heartbeat → dropped
assert "turn.started" not in body # other session → dropped
@respx.mock
def test_stream_error_on_connect_failure(self) -> None:
"""error: upstream admin SSE non-200 -> ONE stream_error frame, stream ends (POST-003)."""
respx.get("https://w.example/admin/events").mock(
return_value=httpx.Response(500, content=b"boom")
)
from ratatoskr.web.server import create_app
app = create_app(_mock_client_factory(), admin_key="adm-key")
body = TestClient(app).get("/api/admin/events?session_id=s-1").text
assert "event: stream_error" in body
assert "SseConnectFailed" in body
assert body.count("event: stream_error") == 1 # exactly one, then ends
Generated
+1 -1
View File
@@ -1052,7 +1052,7 @@ wheels = [
[[package]]
name = "ratatoskr"
version = "0.19.2"
version = "0.19.5"
source = { editable = "." }
dependencies = [
{ name = "httpx" },