From 5f4e7c6bb2d8ea38bcced9ddfb0d120f5aa9e0df Mon Sep 17 00:00:00 2001 From: Meta Vens Date: Fri, 1 May 2026 20:57:34 +0100 Subject: [PATCH] Tighten agent state schema from evaluation --- ...ate-distributions-and-prompt-projection.md | 6 +- .../agent-state-variable-glossary.md | 24 +- .../canonical-agent-state-schema.md | 29 ++- .../prompt-projection-contract.md | 9 +- docs/architecture/schema-future-mechanisms.md | 147 +++++++++++ examples/agent-state.call-of-the-void.json | 230 +++++++++++++++--- notes/fresh-workspace-handoff.md | 11 + notes/ghostlight-current-system-map.md | 4 + notes/ghostlight-implementation-plan.md | 4 + schemas/agent-state.required-fields.json | 4 +- schemas/agent-state.schema.json | 169 ++++++++++++- state/evidence.jsonl | 1 + state/map.yaml | 5 +- tools/validate_agent_state.py | 20 ++ 14 files changed, 615 insertions(+), 48 deletions(-) create mode 100644 docs/architecture/schema-future-mechanisms.md diff --git a/docs/architecture/agent-state-distributions-and-prompt-projection.md b/docs/architecture/agent-state-distributions-and-prompt-projection.md index 7e239b7..c171bad 100644 --- a/docs/architecture/agent-state-distributions-and-prompt-projection.md +++ b/docs/architecture/agent-state-distributions-and-prompt-projection.md @@ -1,4 +1,4 @@ -# Agent State Distributions And Prompt Projection +# Agent State Distributions And Prompt Projection This note describes how personality, culture, memory, and social context should be represented in structured state, and how that state should be projected into @@ -69,7 +69,7 @@ These are relatively persistent tendencies: These are first-class, not optional garnish. They belong in the rebuild from the start: -- warmth +- interpersonal warmth - drive - grandiosity - validation-seeking @@ -110,7 +110,7 @@ machinery. These describe how the performed self comes out in language: - dryness -- warmth +- verbal warmth - formality - verbosity - pace diff --git a/docs/architecture/agent-state-variable-glossary.md b/docs/architecture/agent-state-variable-glossary.md index 7fb5d27..7d11bca 100644 --- a/docs/architecture/agent-state-variable-glossary.md +++ b/docs/architecture/agent-state-variable-glossary.md @@ -63,6 +63,11 @@ activated toward distance under exceptional pressure." Correcting that impression takes work because the observer's confidence is supported by memory, emotion, stakes, prior assumptions, and social reinforcement. +Perceived overlays may use structured belief metadata such as subject, claim +type, evidence events, visibility, and emotional charge. That metadata is not +canonical certainty. It describes why a specific observer trusts a specific +read. + ## Label Set Policy The labels in `agent-state.required-fields.json` are the required v0 core, @@ -110,7 +115,7 @@ schema becomes a junk drawer with a badge. | Label | Meaning | | --- | --- | -| `warmth` | Tendency to express care, friendliness, affection, or social welcome. | +| `interpersonal_warmth` | Tendency to express care, friendliness, affection, or social welcome. | | `drive` | Goal pressure, persistence, ambition, and forward force. | | `grandiosity` | Inflated self-importance, entitlement, exceptionalism, or self-mythologizing. | | `validation_seeking` | Need for reassurance, approval, recognition, or confirmation of worth. | @@ -153,7 +158,7 @@ quirks in the current examples. | Label | Meaning | | --- | --- | | `dryness` | Understated, deadpan, low-sentiment phrasing. | -| `warmth` | Inviting, affectionate, reassuring, or socially soft phrasing. | +| `verbal_warmth` | Inviting, affectionate, reassuring, or socially soft phrasing. | | `formality` | Uses formal structure, titles, careful address, or institutionally correct phrasing. | | `verbosity` | Tends toward longer turns, elaboration, qualification, or verbal sprawl. | | `pace` | Moves quickly through turns, interruptions, replies, or topic shifts. | @@ -251,3 +256,18 @@ That is deliberate for v0: Later, Ghostlight may support sparse authoring overlays for convenience. The canonical fixture should remain explicit until we have enough tooling to avoid silent defaults becoming accidental canon. + +## Event Interpretation + +Events may carry three optional interpretation layers: + +| Field | Meaning | +| --- | --- | +| `observed_exchange` | What was externally observable: who acted or spoke, what they seemed to do, and the visible cues. | +| `private_interpretations` | How each participant appraised the event from their own partial state. | +| `event_effects` | The proposed consequences: state deltas, new beliefs, or memory updates caused by the event. | + +These fields are immediate scaffolding for projection. They do not yet define a +complete transition engine. For now, they make important scene history legible +enough that a prompt projector can explain why a later line bends toward trust, +evasion, curiosity, fear, or repair. diff --git a/docs/architecture/canonical-agent-state-schema.md b/docs/architecture/canonical-agent-state-schema.md index 81aea45..c75ec57 100644 --- a/docs/architecture/canonical-agent-state-schema.md +++ b/docs/architecture/canonical-agent-state-schema.md @@ -110,7 +110,7 @@ Human beings are regrettably efficient little porcupines. The required voice handles are: - `dryness` -- `warmth` +- `verbal_warmth` - `formality` - `verbosity` - `pace` @@ -138,6 +138,13 @@ The required voice handles are: - `question_asking` - `profanity` +Behavioral warmth and verbal warmth are intentionally separate: + +- `behavioral_dimensions.interpersonal_warmth` is the tendency to offer care, + welcome, or affiliation. +- `voice_style.verbal_warmth` is the language surface that can sound soft, + reassuring, affectionate, or socially inviting. + So Cat's prickliness is not only a dialogue prompt instruction. It is backed by canonical state: @@ -171,15 +178,27 @@ An overlay records: - distortions This is where misunderstanding lives. Suspicious agents can overread threat. -Attachment-hungry agents can overread warmth. Avoidant agents can underread -care. Fundamental attribution bias also lives here: an observer can mistake -exceptional behavior for stable character. None of that requires corrupting the -canonical state. +Attachment-hungry agents can overread interpersonal warmth. Avoidant agents can +underread care. Fundamental attribution bias also lives here: an observer can +mistake exceptional behavior for stable character. None of that requires +corrupting the canonical state. Relationship stance is directional. If Cat has a relationship record toward Oz, Oz needs a separate record toward Cat. Mutual presence does not imply symmetric trust, fear, obligation, dependence, or expectation of betrayal. +## Event Interpretation + +Events can include optional interpretation scaffolding: + +- `observed_exchange` for externally visible action or dialogue +- `private_interpretations` for each participant's appraisal of what happened +- `event_effects` for proposed state deltas, belief creation, and memory updates + +This is not a full social transition engine yet. It is enough structure for the +projection layer to know what an event changed without asking later prompts to +infer everything from a one-line summary and a bad attitude. + ## Dialogue Context Packs Scenes contain `dialogue_context_packs`. diff --git a/docs/architecture/prompt-projection-contract.md b/docs/architecture/prompt-projection-contract.md index cb32d58..16755d7 100644 --- a/docs/architecture/prompt-projection-contract.md +++ b/docs/architecture/prompt-projection-contract.md @@ -156,8 +156,9 @@ person behind the drone while pretending she is only annoyed about the repair. If Oz gets too close to her fear of dependency, Cat is likely to answer the practical issue and make the emotional issue sound stupid. -Voice for this turn: dry, quick, pointed, plainspoken, low warmth, low emotional -explicitness, some profanity. Humor can appear as a boundary, not as friendliness. +Voice for this turn: dry, quick, pointed, plainspoken, low verbal warmth, low +emotional explicitness, some profanity. Humor can appear as a boundary, not as +friendliness. ``` Possible generated behavior: @@ -191,8 +192,8 @@ redirect toward the immediate repair or answer in a way that preserves the mask without making the evasion look like panic. Voice for this turn: controlled, concise, technically precise, gently polite, -low emotional explicitness, careful warmth, frequent hedging when the subject -approaches the operator. +low emotional explicitness, careful verbal warmth, frequent hedging when the +subject approaches the operator. ``` Possible generated behavior: diff --git a/docs/architecture/schema-future-mechanisms.md b/docs/architecture/schema-future-mechanisms.md new file mode 100644 index 0000000..c6f78ee --- /dev/null +++ b/docs/architecture/schema-future-mechanisms.md @@ -0,0 +1,147 @@ +# Future Schema Mechanisms + +This note parks the useful pressure from `notes/evaluation.md` without treating +that critique as doctrine. The current v0 schema is still a character-state and +prompt-projection seam. The future runtime needs mechanisms that turn state into +changing social behavior. + +## Current Boundary + +The v0 agent-state schema should stay focused on: + +- canonical character state +- directional relationship stance +- observer-local perceived overlays +- memories, goals, values, and scene-local dialogue packs +- enough event interpretation to support prompt projection + +Do not inflate `schemas/agent-state.schema.json` into the whole simulator before +the projection examples prove what the runtime actually needs. + +## Mechanisms To Preserve For Later + +### Event Appraisal + +Each participant needs a private read of the same event. A single exchange can +be betrayal to one agent, exposure risk to another, and flirting-with-knives to +a third. The current schema now allows `private_interpretations` on events as a +lightweight bridge. + +Future work should make appraisal reusable enough to drive state updates, +memory retrieval, and action affordances. + +### State Transitions And Consequences + +`mean`, `plasticity`, and `current_activation` describe state. They do not yet +define how state changes. Future transition machinery needs: + +- activation decay +- event-driven deltas +- sensitization or habituation +- effects on related variables +- rules for when `mean` changes versus only `current_activation` + +The current `event_effects` field is a projection-facing placeholder, not the +final transition engine. + +### Structured Beliefs And Secrets + +String beliefs are useful for authoring, but simulation needs structure: + +- holder +- subject +- claim type +- confidence +- evidence +- visibility +- emotional charge +- whether the belief is private, shared, public, rumor, false, or contested + +Secrets need similar structure: owner, known-by, suspected-by, exposure cost, +protective strategies, and what can leak through action. + +### Action Affordances + +The system needs to choose among possible moves instead of jumping from state to +dialogue. Future projection examples should expose candidate affordances such +as probing, evading, bargaining, softening, escalating, repairing, threatening, +or walking away. + +The important rule: affordances should be justified by goals, appraisals, +capabilities, costs, relationship stance, and scene pressure. + +### Conversation State + +Dialogue needs explicit continuity: + +- active topic +- open questions +- evasions +- accusations +- face-threats +- commitments +- promises, refusals, and ruptures +- who has the floor + +This belongs close to projection because it changes turn shape immediately. + +### Resources And Capabilities + +Cat's debt, taxi condition, mobility, and institutional exposure are not just +backstory. Oz's drone integrity, signal secrecy, anonymity, and physical safety +are not just flavor. Future schemas need concrete resource and capability +fields so desire does not masquerade as ability. + +### Dyads And Shared Relationship History + +Directional relationship stance should remain. A separate dyadic layer may also +be needed for shared history: + +- relationship type +- phase +- shared events +- shared secrets +- unresolved ruptures +- rituals +- dependency structure +- communication pattern + +Do not collapse this into one symmetric relationship object. People are not +that tidy unless the author is lying to save RAM. + +### Social Knowledge, Reputation, And Institutions + +The Aetheria setting needs institutions with teeth: sanctions, authority, +surveillance, reputation effects, access control, role expectations, and public +knowledge. Future work should distinguish private belief, shared belief, public +fact, rumor, common knowledge, and institutional record. + +### Memory Retrieval + +Memories need more than salience and confidence once the runtime starts moving: + +- recency +- emotional charge +- retrieval triggers +- decay +- reconsolidation +- intrusive, avoided, cherished, rehearsed, or distorted status +- schema effects +- whether another agent knows the memory + +The current memory bundle is enough for the first projection seam. It is not yet +the memory engine. + +### Embodiment And Nonverbal Channels + +Oz proves this one immediately. The operator, drone body, observable channels, +leakage risks, and physical affordances are separate facts. Future projection +needs embodiment because social meaning leaks through movement, timing, +silence, distance, posture, and constrained bodies. + +## Promotion Rule + +Promote a future mechanism into the main schema only after it has survived at +least one reviewed projection example or runtime slice where it clearly changes +the output. Until then, document it here, test it in examples, and do not let +the ontology grow antlers for sport. diff --git a/examples/agent-state.call-of-the-void.json b/examples/agent-state.call-of-the-void.json index 8a7a273..23920fa 100644 --- a/examples/agent-state.call-of-the-void.json +++ b/examples/agent-state.call-of-the-void.json @@ -120,11 +120,6 @@ } }, "behavioral_dimensions": { - "warmth": { - "mean": 0.54, - "plasticity": 0.42, - "current_activation": 0.46 - }, "drive": { "mean": 0.76, "plasticity": 0.21, @@ -184,6 +179,11 @@ "mean": 0.69, "plasticity": 0.34, "current_activation": 0.78 + }, + "interpersonal_warmth": { + "mean": 0.54, + "plasticity": 0.42, + "current_activation": 0.46 } }, "presentation_strategy": { @@ -309,11 +309,6 @@ "plasticity": 0.18, "current_activation": 0.91 }, - "warmth": { - "mean": 0.31, - "plasticity": 0.45, - "current_activation": 0.26 - }, "formality": { "mean": 0.22, "plasticity": 0.52, @@ -443,6 +438,11 @@ "mean": 0.52, "plasticity": 0.38, "current_activation": 0.57 + }, + "verbal_warmth": { + "mean": 0.31, + "plasticity": 0.45, + "current_activation": 0.26 } } }, @@ -480,9 +480,70 @@ "linked_event_ids": [] } ], - "relationship_summaries": [] + "relationship_summaries": [ + { + "memory_id": "memory-rel-cat-oz-current-read", + "summary": "Oz is useful, evasive, and probably a mask for someone more vulnerable than the drone.", + "salience": 0.74, + "confidence": 0.61, + "linked_event_ids": [ + "event-drone-lie" + ], + "linked_relationship_id": "rel-cat-oz" + } + ] }, - "perceived_state_overlays": [] + "perceived_state_overlays": [ + { + "observer_agent_id": "cat_marrigan", + "target_agent_id": "oz_operator", + "perceived_dimensions": { + "strategic_opacity": { + "observed_activation": 0.86, + "attributed_disposition": 0.72, + "confidence": 0.64, + "evidence": [ + "event-drone-lie" + ] + }, + "cultivated_harmlessness": { + "observed_activation": 0.78, + "attributed_disposition": 0.51, + "confidence": 0.48, + "evidence": [ + "event-drone-lie" + ] + }, + "interpersonal_warmth": { + "observed_activation": 0.52, + "attributed_disposition": 0.39, + "confidence": 0.35, + "evidence": [ + "event-drone-lie" + ] + } + }, + "beliefs": [ + { + "belief_id": "belief-cat-oz-is-a-mask", + "subject_id": "oz_operator", + "claim_type": "identity_inference", + "claim": "Oz is probably a mask for someone or something more vulnerable than the drone.", + "confidence": 0.57, + "evidence_event_ids": [ + "event-drone-lie" + ], + "visibility": "private", + "emotional_charge": 0.71 + } + ], + "distortions": [ + "threat_amplification", + "institutional_suspicion_transfer", + "mask_overfocus" + ] + } + ] }, { "agent_id": "oz_operator", @@ -584,11 +645,6 @@ } }, "behavioral_dimensions": { - "warmth": { - "mean": 0.67, - "plasticity": 0.4, - "current_activation": 0.74 - }, "drive": { "mean": 0.52, "plasticity": 0.45, @@ -648,6 +704,11 @@ "mean": 0.64, "plasticity": 0.44, "current_activation": 0.72 + }, + "interpersonal_warmth": { + "mean": 0.67, + "plasticity": 0.4, + "current_activation": 0.74 } }, "presentation_strategy": { @@ -773,11 +834,6 @@ "plasticity": 0.49, "current_activation": 0.35 }, - "warmth": { - "mean": 0.48, - "plasticity": 0.44, - "current_activation": 0.52 - }, "formality": { "mean": 0.58, "plasticity": 0.38, @@ -907,6 +963,11 @@ "mean": 0.05, "plasticity": 0.39, "current_activation": 0.03 + }, + "verbal_warmth": { + "mean": 0.48, + "plasticity": 0.44, + "current_activation": 0.52 } } }, @@ -936,22 +997,33 @@ "linked_event_ids": [] } ], - "relationship_summaries": [] + "relationship_summaries": [ + { + "memory_id": "memory-rel-oz-cat-current-read", + "summary": "Cat is suspicious enough to be dangerous and principled enough that the danger may have rules.", + "salience": 0.76, + "confidence": 0.58, + "linked_event_ids": [ + "event-drone-lie" + ], + "linked_relationship_id": "rel-oz-cat" + } + ] }, "perceived_state_overlays": [ { "observer_agent_id": "oz_operator", "target_agent_id": "cat_marrigan", "perceived_dimensions": { - "warmth": { - "observed_activation": 0.4, - "attributed_disposition": 0.44, - "confidence": 0.34 - }, "suspicion": { "observed_activation": 0.9, "attributed_disposition": 0.83, "confidence": 0.71 + }, + "interpersonal_warmth": { + "observed_activation": 0.4, + "attributed_disposition": 0.44, + "confidence": 0.34 } }, "beliefs": [ @@ -1116,7 +1188,7 @@ { "event_id": "event-drone-lie", "kind": "dialogue", - "summary": "Oz dodged Cat's question about who was controlling the drone.", + "summary": "Cat asked who was controlling the drone; Oz redirected toward the repair instead of answering the identity question.", "participants": [ "cat_marrigan", "oz_operator" @@ -1125,6 +1197,104 @@ "mask", "privacy", "suspicion" + ], + "observed_exchange": [ + { + "speaker_id": "cat_marrigan", + "utterance_summary": "Cat pressed on whether Oz was really autonomous or a mask for someone remote.", + "dialogue_function": "probe_identity", + "observable_cues": [ + "pointed humor", + "feigned casualness", + "attention on drone hesitation" + ] + }, + { + "speaker_id": "oz_operator", + "utterance_summary": "Oz answered the practical repair issue and avoided naming the operator behind the drone.", + "dialogue_function": "evasive_redirect", + "observable_cues": [ + "technical compression", + "polite deflection", + "too-human timing" + ] + } + ], + "private_interpretations": [ + { + "agent_id": "cat_marrigan", + "interpretation": "Oz is hiding a person-shaped vulnerability behind the drone body.", + "attributed_motive": "Protect the operator by keeping Cat focused on the broken taxi instead of the mask.", + "appraisal_tags": [ + "trust_violation", + "curiosity", + "useful_secret", + "possible_leverage" + ], + "confidence": 0.62 + }, + { + "agent_id": "oz_operator", + "interpretation": "Cat noticed the mask and is testing whether Oz will panic or confess.", + "attributed_motive": "Find out what Oz is without making her own dependence on the repair visible.", + "appraisal_tags": [ + "exposure_risk", + "status_threat", + "possible_care", + "conversation_hazard" + ], + "confidence": 0.68 + } + ], + "event_effects": [ + { + "agent_id": "cat_marrigan", + "summary": "Cat trusts Oz less, becomes more fascinated, and stores the drone as a mask rather than a personless tool.", + "state_deltas": [ + { + "path": "relationships.rel-cat-oz.stance.trust.current_activation", + "delta": -0.07 + }, + { + "path": "relationships.rel-cat-oz.stance.fascination.current_activation", + "delta": 0.13 + }, + { + "path": "canonical_state.behavioral_dimensions.suspicion.current_activation", + "delta": 0.11 + } + ], + "new_belief_ids": [ + "belief-cat-oz-is-a-mask" + ], + "memory_update_ids": [ + "memory-rel-cat-oz-current-read" + ] + }, + { + "agent_id": "oz_operator", + "summary": "Oz reads Cat as sharper and riskier, but not automatically cruel.", + "state_deltas": [ + { + "path": "relationships.rel-oz-cat.stance.fear.current_activation", + "delta": 0.08 + }, + { + "path": "relationships.rel-oz-cat.stance.respect.current_activation", + "delta": 0.07 + }, + { + "path": "canonical_state.presentation_strategy.strategic_opacity.current_activation", + "delta": 0.06 + } + ], + "new_belief_ids": [ + "belief-cat-will-pry" + ], + "memory_update_ids": [ + "memory-rel-oz-cat-current-read" + ] + } ] } ], @@ -1195,7 +1365,7 @@ "presentation_constraints": [ "Be helpful, a little funny, and evasive.", "Let the drone seem more autonomous than it is.", - "Use warmth carefully; Cat may treat open sincerity as bait.", + "Use verbal warmth carefully; Cat may treat open sincerity as bait.", "Keep the operator location private unless scene pressure explicitly breaks the mask." ] } diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index bd005eb..08e2d8c 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -38,6 +38,8 @@ Ghostlight now has the persistence spine plus the first architecture payload: - prompt projection and distillation docs: - `docs/architecture/prompt-projection-contract.md` - `docs/architecture/projection-distillation-plan.md` +- evaluation follow-up docs: + - `docs/architecture/schema-future-mechanisms.md` - visitor-facing README refreshed to explain Ghostlight's goals There is still no full runtime yet. The live machine is design, state @@ -62,6 +64,15 @@ state unless explicitly revived. Define the projection example schema and create the first reviewed Cat/Oz projection artifacts from the Call of the Void fixture. +The evaluation follow-up fixed the immediate v0 schema issues: + +- `behavioral_dimensions.warmth` became `interpersonal_warmth` +- `voice_style.warmth` became `verbal_warmth` +- Cat now has a perceived-state overlay for Oz +- Cat and Oz now have relationship summary memories +- `event-drone-lie` now includes observed exchange, private interpretations, + and event effects + The projection path is: - build a deterministic speaker-local input slicer diff --git a/notes/ghostlight-current-system-map.md b/notes/ghostlight-current-system-map.md index 9b120ea..f44e7c1 100644 --- a/notes/ghostlight-current-system-map.md +++ b/notes/ghostlight-current-system-map.md @@ -45,6 +45,10 @@ state and re-entry discipline. - `docs/architecture/projection-distillation-plan.md` - plan for using a frontier teacher model to generate reviewed projection artifacts before training a smaller student projector +- `docs/architecture/schema-future-mechanisms.md` + - parking lot for appraisal, transition, belief, action, conversation, + resource, dyad, institution, memory, and embodiment mechanisms not yet + promoted into the v0 schema - `schemas/agent-state.schema.json` - v0 canonical agent-state contract for agents, relationships, events, scenes, perceived overlays, and dialogue context packs diff --git a/notes/ghostlight-implementation-plan.md b/notes/ghostlight-implementation-plan.md index 7d84613..2d9ca25 100644 --- a/notes/ghostlight-implementation-plan.md +++ b/notes/ghostlight-implementation-plan.md @@ -23,6 +23,10 @@ 3. Build the prompt projection layer for authoring. - Use `docs/architecture/prompt-projection-contract.md` as the first renderer contract. + - Use `docs/architecture/schema-future-mechanisms.md` to keep appraisal, + transition, belief, action, conversation, resource, dyad, institution, + memory, and embodiment needs visible without prematurely bloating the v0 + agent-state schema. - Render scene and dialogue scaffolds from structured state, relevant memories, scene pressure, cultural defaults, and perceived state. - Keep the prompt renderer a projection surface instead of a second brain. diff --git a/schemas/agent-state.required-fields.json b/schemas/agent-state.required-fields.json index 8efaa62..ed73910 100644 --- a/schemas/agent-state.required-fields.json +++ b/schemas/agent-state.required-fields.json @@ -22,7 +22,7 @@ "ideological_rigidity" ], "behavioral_dimensions": [ - "warmth", + "interpersonal_warmth", "drive", "grandiosity", "validation_seeking", @@ -77,7 +77,7 @@ ], "voice_style": [ "dryness", - "warmth", + "verbal_warmth", "formality", "verbosity", "pace", diff --git a/schemas/agent-state.schema.json b/schemas/agent-state.schema.json index e669ff4..6437cd0 100644 --- a/schemas/agent-state.schema.json +++ b/schemas/agent-state.schema.json @@ -374,6 +374,9 @@ "items": { "type": "string" } + }, + "linked_relationship_id": { + "type": "string" } } }, @@ -413,7 +416,11 @@ "underread_threat", "false_mask_detection", "missed_mask_detection", - "status_injury" + "status_injury", + "threat_amplification", + "institutional_suspicion_transfer", + "care_underread", + "mask_overfocus" ] } } @@ -438,6 +445,39 @@ "type": "number", "minimum": 0, "maximum": 1 + }, + "subject_id": { + "type": "string" + }, + "claim_type": { + "enum": [ + "fact", + "identity_inference", + "motive_inference", + "prediction", + "norm", + "value_read", + "relationship_read" + ] + }, + "evidence_event_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "visibility": { + "enum": [ + "private", + "shared", + "public", + "rumor" + ] + }, + "emotional_charge": { + "type": "number", + "minimum": 0, + "maximum": 1 } } }, @@ -513,6 +553,24 @@ "items": { "type": "string" } + }, + "observed_exchange": { + "type": "array", + "items": { + "$ref": "#/$defs/event_exchange_turn" + } + }, + "private_interpretations": { + "type": "array", + "items": { + "$ref": "#/$defs/event_private_interpretation" + } + }, + "event_effects": { + "type": "array", + "items": { + "$ref": "#/$defs/event_effect" + } } } }, @@ -673,6 +731,115 @@ } } } + }, + "event_exchange_turn": { + "type": "object", + "required": [ + "speaker_id", + "utterance_summary", + "dialogue_function" + ], + "additionalProperties": false, + "properties": { + "speaker_id": { + "type": "string" + }, + "utterance_summary": { + "type": "string" + }, + "dialogue_function": { + "type": "string" + }, + "observable_cues": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "event_private_interpretation": { + "type": "object", + "required": [ + "agent_id", + "interpretation", + "confidence" + ], + "additionalProperties": false, + "properties": { + "agent_id": { + "type": "string" + }, + "interpretation": { + "type": "string" + }, + "attributed_motive": { + "type": "string" + }, + "appraisal_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "confidence": { + "type": "number", + "minimum": 0, + "maximum": 1 + } + } + }, + "event_effect": { + "type": "object", + "required": [ + "agent_id", + "summary" + ], + "additionalProperties": false, + "properties": { + "agent_id": { + "type": "string" + }, + "summary": { + "type": "string" + }, + "state_deltas": { + "type": "array", + "items": { + "$ref": "#/$defs/state_delta" + } + }, + "new_belief_ids": { + "type": "array", + "items": { + "type": "string" + } + }, + "memory_update_ids": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "state_delta": { + "type": "object", + "required": [ + "path", + "delta" + ], + "additionalProperties": false, + "properties": { + "path": { + "type": "string" + }, + "delta": { + "type": "number", + "minimum": -1, + "maximum": 1 + } + } } } } diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 40a4c56..e5980e9 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -19,3 +19,4 @@ {"ts": "2026-05-01T19:13:15+00:00", "type": "design", "status": "accepted", "note": "Relationship stance is directional. Added Oz->Cat alongside Cat->Oz in the Call of the Void fixture and taught the validator to require reciprocal relationship edges for represented agent pairs."} {"ts": "2026-05-01T19:18:05+00:00", "type": "design", "status": "accepted", "note": "Defined prompt projection as a six-stage contract: select speaker-local inputs, compute active pressure, detect tensions, derive response affordances, render compact prompt sections, then evaluate whether target verbal behaviors emerge from state interactions."} {"ts": "2026-05-01T19:26:23+00:00", "type": "design", "status": "accepted", "note": "Persisted projection distillation plan: use a frontier teacher to generate reviewed projection artifacts, collect accepted and rejected examples, then train a smaller student projector only after the projection schema, input slicer, and evaluator stabilize."} +{"ts": "2026-05-01T19:57:04+00:00", "type": "design", "status": "accepted", "note": "Evaluation follow-up accepted immediate schema fixes: split interpersonal_warmth from verbal_warmth, add Cat perception of Oz, populate Cat/Oz relationship summaries, enrich event-drone-lie with observed exchange, private interpretations, and event effects, and park broader social-simulation mechanisms in docs/architecture/schema-future-mechanisms.md."} diff --git a/state/map.yaml b/state/map.yaml index 658618c..ffc4959 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -83,7 +83,10 @@ accepted_design: - Relationship stance is directional; reciprocal agent pairs need separate edges because trust, fear, obligation, dependence, and betrayal expectations are not symmetric by default. - Prompt projection should compile state into speaker-local pressure prose through input selection, active-pressure scoring, tension detection, response affordance derivation, compact prompt rendering, and post-generation evaluation. - Projection distillation is the long-term optimization path: a frontier teacher model generates reviewed projection artifacts, and a smaller student projector is trained only after the artifact schema, deterministic input slicer, and evaluator are stable. + - Behavioral warmth and verbal warmth are separate axes: `interpersonal_warmth` describes social care or welcome, while `verbal_warmth` describes soft or reassuring language surface. + - Events can carry lightweight observed exchange, private interpretation, and event-effect scaffolding so prompt projection can reason from appraisal and consequence without pretending the v0 schema is already a full transition engine. + - Future social-simulation mechanisms should be documented and tested through projection artifacts before promotion into the canonical schema. current_status: - summary: Ghostlight now has the Epiphany-style persistence spine, the first architecture payload, the v0 canonical agent-state schema seam, a prompt projection contract, and a documented teacher/student distillation path for projection. + summary: Ghostlight now has the Epiphany-style persistence spine, the first architecture payload, the v0 canonical agent-state schema seam, prompt projection docs, immediate schema fixes from evaluation, and a documented teacher/student distillation path for projection. next_action: Define the projection example schema and create the first reviewed Cat/Oz projection artifacts from the Call of the Void fixture. diff --git a/tools/validate_agent_state.py b/tools/validate_agent_state.py index 59555b1..0d6ade1 100644 --- a/tools/validate_agent_state.py +++ b/tools/validate_agent_state.py @@ -145,6 +145,8 @@ def validate_agent(agent: dict[str, Any], required: dict[str, list[str]]) -> Non belief_path = f"{overlay_path}.beliefs[{belief_index}]" require_keys(belief, ["belief_id", "claim", "confidence"], belief_path) require_0_1(belief["confidence"], f"{belief_path}.confidence") + if "emotional_charge" in belief: + require_0_1(belief["emotional_charge"], f"{belief_path}.emotional_charge") def validate_document(document: dict[str, Any], required: dict[str, list[str]], source: Path) -> None: @@ -184,6 +186,24 @@ def validate_document(document: dict[str, Any], required: dict[str, list[str]], require_keys(event, ["event_id", "kind", "summary", "participants", "pressure_tags"], path) for participant_id in event["participants"]: require(participant_id in agent_id_set, f"{path}.participants references unknown agent: {participant_id}") + for turn_index, turn in enumerate(event.get("observed_exchange", [])): + turn_path = f"{path}.observed_exchange[{turn_index}]" + require_keys(turn, ["speaker_id", "utterance_summary", "dialogue_function"], turn_path) + require(turn["speaker_id"] in agent_id_set, f"{turn_path}.speaker_id references unknown agent") + for interpretation_index, interpretation in enumerate(event.get("private_interpretations", [])): + interpretation_path = f"{path}.private_interpretations[{interpretation_index}]" + require_keys(interpretation, ["agent_id", "interpretation", "confidence"], interpretation_path) + require(interpretation["agent_id"] in agent_id_set, f"{interpretation_path}.agent_id references unknown agent") + require_0_1(interpretation["confidence"], f"{interpretation_path}.confidence") + for effect_index, effect in enumerate(event.get("event_effects", [])): + effect_path = f"{path}.event_effects[{effect_index}]" + require_keys(effect, ["agent_id", "summary"], effect_path) + require(effect["agent_id"] in agent_id_set, f"{effect_path}.agent_id references unknown agent") + for delta_index, delta in enumerate(effect.get("state_deltas", [])): + delta_path = f"{effect_path}.state_deltas[{delta_index}]" + require_keys(delta, ["path", "delta"], delta_path) + require(isinstance(delta["delta"], (int, float)), f"{delta_path}.delta must be numeric") + require(-1 <= delta["delta"] <= 1, f"{delta_path}.delta must be between -1 and 1") for index, scene in enumerate(document["scenes"]): path = f"scenes[{index}]"