Tighten agent state schema from evaluation

This commit is contained in:
Meta Vens 2026-05-01 20:57:34 +01:00
commit 5f4e7c6bb2
14 changed files with 615 additions and 48 deletions

View file

@ -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

View file

@ -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.

View file

@ -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`.

View file

@ -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:

View file

@ -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.

View file

@ -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."
]
}

View file

@ -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

View file

@ -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

View file

@ -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.

View file

@ -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",

View file

@ -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
}
}
}
}
}

View file

@ -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."}

View file

@ -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.

View file

@ -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}]"