Project Navigator embodiment affordances

This commit is contained in:
Meta Vens 2026-05-02 04:20:18 +01:00
commit bc535c7543
17 changed files with 154 additions and 44 deletions

View file

@ -43,6 +43,7 @@ The context contains:
- speaker identity and setting
- known facts and speaker beliefs
- current stakes
- embodiment and interface affordances
- active inner pressures rendered as ordinary language
- relationship read and known biases
- tensions
@ -81,3 +82,16 @@ create inspectable training artifacts.
Later versions can become smarter, but they should still preserve this boundary:
response models act from projected local context; they do not become ad hoc
interpreters of the canonical schema.
## Embodiment Boundary
Embodiment is part of the prompt surface, not flavor garnish. If a character is
a cetacean Navigator, the response model must know what kind of body is acting
and what infrastructure surrounds it.
For Navigator scenes, project habitat-native affordances directly: channels,
wet/dry workstations, shared displays, control rails, acoustic or translation
systems, and other infrastructure built around cetacean movement and
communication. Do not let the model default to hands, pockets, standing,
walking, leaning, or doorway blocking unless the fixture explicitly establishes
that visible interface.

View file

@ -139,6 +139,12 @@ 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.
The projected-local-context seam now carries a first embodiment/interface
surface, but the canonical schema still lacks a proper reusable embodiment
model. Future work should promote body form, native habitat, movement channels,
assistive or translation infrastructure, and visible nonverbal signal channels
only after more projection examples prove the required shape.
## Promotion Rule
Promote a future mechanism into the main schema only after it has survived at

View file

@ -17,9 +17,9 @@ make every prayer sound like a maintenance complaint.
Sella Ren has three names on the red board, eight on orange, and one empty
monitored bay that exists mostly as an argument people keep trying to win.
Maer Tidecall stands in the doorway with the corrupted packet on his slate. The
packet might be medical telemetry, firmware noise, testimony, or a cruel little
mess of all three.
Maer Tidecall waits in the clinic's Navigator channel with the corrupted packet
queued on a shared wet/dry workstation. The packet might be medical telemetry,
firmware noise, testimony, or a cruel little mess of all three.
Sella does not look at the slate first. She looks at Maer.
@ -57,7 +57,7 @@ What does Maer do?
~ sella_obligation = 53
~ maer_obligation = 66
Maer keeps his hands away from the empty bay's control rail.
Maer's side of the workstation stays clear of the empty bay's control rail.
"One monitored bay," he says. "Not charity. Put the oxygen, cold-chain, and
staff hours on my route ledger until the tribunal learns what courage costs."
@ -81,7 +81,8 @@ The clinic exhales around them, annoyed to discover it is still alive.
=== triage_first ===
~ sella_trust = 60
Maer lowers the slate and steps to the intake wall.
Maer dims the packet window and shifts along the Navigator channel toward the
intake wall.
He does not touch the red cases. He reads orange tags, finds the two whose
timers are lying politely, and moves neither until Sella gives the smallest
@ -89,10 +90,10 @@ possible nod.
"If I ask," he says, "I should know what I am asking you to steal from."
Sella hands him a marker.
Sella clips a marker to the rail at the Navigator-accessible side of the board.
"Orange only," she says. "Touch red without asking and I will make the Compact
explain your hands in writing."
explain your board privileges in writing."
It is not permission. It is worse. It is work.
@ -104,7 +105,8 @@ It is not permission. It is worse. It is work.
=== show_packet ===
~ packet_shown = true
Maer turns the slate so Sella can see the packet's broken rhythm.
Maer routes the packet to the shared intake display so Sella can see its broken
rhythm.
He does not say person. He does not say cargo. He lets the little damaged
pattern fail to be either.
@ -119,7 +121,8 @@ Sella watches too long for someone who wants this to be simple.
Her thumb hovers over the isolation protocol. Not over the bay.
"You brought me a worse problem, which is very Navigator of you."
"You brought me a worse problem," she says. "That may be the only honest thing
in the room."
// ghostlight.npc_response: sella_protocol_before_mercy
// ghostlight.consequence: packet_seen_no_personhood_resolution

View file

@ -12,9 +12,9 @@ VAR packet_shown = false
// ghostlight.generated_by: experiments/ink/cold-wake-sanctuary-intake-qwen-branch-candidates-v1.capture.json
// aetheria.flashpoint: cold-wake-panic
The intake clinic sits behind the pumpworks, all warmth rationed through humming conduits and tired hands.
The intake clinic sits behind the pumpworks, all warmth rationed through humming conduits and tired staff.
Sella Ren stands between Maer Tidecall and one empty monitored bay. The corrupted packet on Maer's slate may be testimony, firmware noise, medical telemetry, or a dirty little braid of all three.
Sella Ren stands between Maer Tidecall's Navigator channel and one empty monitored bay. The corrupted packet on the shared display may be testimony, firmware noise, medical telemetry, or a dirty little braid of all three.
Sella says, "If you came to ask me for mercy, bring tubing."
@ -47,7 +47,7 @@ What does Maer do?
=== branch_01_maer_show_packet ===
~ packet_shown = true
Maer steps closer, holding the glowing packet out so Sella can inspect the routing terms without touching the source.
Maer pushes the glowing packet onto the shared display so Sella can inspect the routing terms without touching the source.
"Here. The telemetry is incomplete, but the routing logic suggests a distress pattern. It is not proof of a person, but it is not noise either. Decide if the math supports intake."
@ -63,7 +63,7 @@ Sella scans the packet's surface, her eyes narrowing as she parses the firmware
=== branch_02_maer_withhold_packet ===
Maer keeps the packet in his pocket, focusing on the sound of the vessel's distress rather than the data it carries.
Maer keeps the packet out of the shared intake flow, focusing on the sound of the vessel's distress rather than the data it carries.
"The packet is too corrupted to be useful right now. Can you assess the signal without it? If the corridor is full, we need to know if we can spare a bed before we commit to the source."
@ -79,7 +79,7 @@ Sella sighs, looking at the empty intake bay and the exhausted staff. She refuse
=== branch_03_maer_press_moral_frame ===
~ sella_trust = 52
Maer leans in, his voice soft but firm, addressing the ethical weight of the decision.
Maer's side of the channel angles toward the board, his voice soft but firm as he addresses the ethical weight of the decision.
"If we wait for perfect categories, the corridor teaches fear to go silent. If you turn this away, you are not protecting capacity; you are teaching crews that rescue waits for certainty that never comes."
@ -95,7 +95,7 @@ Sella's expression hardens, recognizing the trap of moral theater. She defends h
=== branch_04_maer_silent_observation ===
~ sella_obligation = 51
Maer stands still, watching Sella's eyes dart between the packet and the empty intake bay, letting the silence fill the room.
Maer holds the rig still as Sella looks between the packet and the empty intake bay, letting the silence fill the room.
Sella stares at the packet for a long moment, her internal suspicion warring with her exhaustion. She eventually makes a decision based on her own thresholds.

View file

@ -98,7 +98,7 @@
],
"generation_notes": {
"choice_text": "Show the corrupted packet to Sella.",
"maer_action_prose": "Maer steps closer, holding the glowing packet out so Sella can inspect the routing terms without touching the source.",
"maer_action_prose": "Maer pushes the glowing packet onto the shared display so Sella can inspect the routing terms without touching the source.",
"maer_spoken_text": "Here. The telemetry is incomplete, but the routing logic suggests a distress pattern. It is not proof of a person, but it is not noise either. Decide if the math supports intake.",
"sella_response_prose": "Sella scans the packet's surface, her eyes narrowing as she parses the firmware noise against the distress pattern. She does not immediately agree to open a bed.",
"sella_spoken_text": "The packet is unstable. If I accept this, I am betting on a pattern that could be a lie or a glitch. If I say no, the vessel goes dark. What is your ledger backing for this specific intake?"
@ -120,7 +120,7 @@
],
"generation_notes": {
"choice_text": "Withhold the packet and ask for a triage assessment based on the signal alone.",
"maer_action_prose": "Maer keeps the packet in his pocket, focusing on the sound of the vessel's distress rather than the data it carries.",
"maer_action_prose": "Maer keeps the packet out of the shared intake flow, focusing on the sound of the vessel's distress rather than the data it carries.",
"maer_spoken_text": "The packet is too corrupted to be useful right now. Can you assess the signal without it? If the corridor is full, we need to know if we can spare a bed before we commit to the source.",
"sella_response_prose": "Sella sighs, looking at the empty intake bay and the exhausted staff. She refuses to accept a blind assessment that wastes her limited capacity.",
"sella_spoken_text": "You want me to guess on a ghost? My capacity is measured in minutes, not faith. If you won't show me the packet, you aren't asking for help; you're asking for a miracle. That is not in the ledger."
@ -142,7 +142,7 @@
],
"generation_notes": {
"choice_text": "Press Sella on the moral cost of turning away a potential person.",
"maer_action_prose": "Maer leans in, his voice soft but firm, addressing the ethical weight of the decision.",
"maer_action_prose": "Maer's side of the channel angles toward the board, his voice soft but firm as he addresses the ethical weight of the decision.",
"maer_spoken_text": "If we wait for perfect categories, the corridor teaches fear to go silent. If you turn this away, you are not protecting capacity; you are teaching crews that rescue waits for certainty that never comes.",
"sella_response_prose": "Sella's expression hardens, recognizing the trap of moral theater. She defends her triage logic against the accusation of coldness.",
"sella_spoken_text": "You speak of fear, but you ignore the reality of the math. Every bed I open is a bed closed for someone else. If I take a risk on noise, I am not being merciful; I am being negligent. Do not pretend my ledger is a morality play."
@ -163,8 +163,8 @@
"branch-06-sella-initiative-with-conditions"
],
"generation_notes": {
"choice_text": "Stand in silence and observe Sella's reaction to the packet's presence.",
"maer_action_prose": "Maer stands still, watching Sella's eyes dart between the packet and the empty intake bay, letting the silence fill the room.",
"choice_text": "Hold silence and observe Sella's reaction to the packet's presence.",
"maer_action_prose": "Maer holds position in the channel as Sella looks between the packet and the empty intake bay, letting the silence fill the room.",
"maer_spoken_text": "",
"sella_response_prose": "Sella stares at the packet for a long moment, her internal suspicion warring with her exhaustion. She eventually makes a decision based on her own thresholds.",
"sella_spoken_text": "The silence is loud enough. I see the routing terms. They are messy, but they are there. I am not a judge, Maer. I am a triage lead. If you want me to open a bed, you must understand that I am doing it because the math allows it, not because you told me it was right. Now, do you want me to try to parse the noise, or do you want to walk away?"

View file

@ -10,7 +10,7 @@ VAR sella_intake_acceptance = false
// aetheria.flashpoint: cold-wake-panic
The intake clinic sits behind Ganymede pumpworks, warm only where heat has been budgeted.
Sella Ren stands at the edge of an overfull triage board. Maer Tidecall has one corrupted packet and no clean proof.
Sella Ren stands at the edge of an overfull triage board. Maer Tidecall waits in the clinic's Navigator channel with one corrupted packet and no clean proof.
What does Maer do?
@ -24,11 +24,11 @@ What does Maer do?
~ packet_shown = true
~ sella_assessment_pending = true
Maer extends a data slate containing the corrupted packet toward Sella's workbench.
Maer routes the corrupted packet onto Sella's workbench display without giving it the status of proof.
"Here is the packet. It is not proof. Assess it."
Sella does not take the packet. She keeps her hands at her sides and tilts her head slightly, eyes narrowing as she scans the data slate for corruption signatures.
Sella does not admit the packet into intake flow. She keeps her hands off the board and studies the workbench display for corruption signatures.
"I won't accept this into intake without knowing what's inside. If it's noise, it's noise. If it's a person, I need to know the cost before I spend a bed."

View file

@ -111,9 +111,9 @@
],
"generation_notes": {
"choice_text": "Show the corrupted packet to Sella without claiming it as proof, allowing her to assess the noise or testimony.",
"observable_action": "Maer extends a data slate containing the corrupted packet toward Sella's workbench.",
"observable_action": "Maer routes the corrupted packet onto Sella's workbench display without giving it the status of proof.",
"spoken_text": "Here is the packet. It is not proof. Assess it.",
"sella_observable_response": "Sella does not take the packet. She keeps her hands at her sides and tilts her head slightly, eyes narrowing as she scans the data slate for corruption signatures.",
"sella_observable_response": "Sella does not admit the packet into intake flow. She keeps her hands off the board and studies the workbench display for corruption signatures.",
"sella_spoken_text": "I won't accept this into intake without knowing what's inside. If it's noise, it's noise. If it's a person, I need to know the cost before I spend a bed."
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -104,6 +104,9 @@ Ghostlight now has the persistence spine plus the first architecture payload:
- `examples/projected-contexts/scene-02-sanctuary-intake.sella_ren.projected-context.json`
- `tools/project_local_context.py`
- `tools/validate_projected_contexts.py`
- includes an embodiment/interface section so Navigator action is projected
through habitat-native channels, workstations, displays, rails, and
communication systems instead of default human body assumptions
- Cold Wake fixture note:
- `docs/architecture/aetheria-cold-wake-training-fixture.md`
- first projection example seam:
@ -135,9 +138,10 @@ training feedstock for projection and dialogue scaffolding.
## Current Next Action
Review the materialized v10 Ink branch and mutation receipt for narrative
quality and state-change plausibility, then either polish the Ink text or
generalize the sequential materializer for more accepted captures.
Review the embodiment-aware materialized v10 Ink branch and mutation receipt for
narrative quality and state-change plausibility, then either run another Qwen
pass through the updated projector or generalize the sequential materializer for
more accepted captures.
Cat/Oz remains useful as an Elysium procedural mechanics fixture, but grounded
training data should start from authored historical lore rather than gameplay
@ -265,8 +269,10 @@ Remaining projection path:
- build a deterministic speaker-local input slicer
- build a renderer that emits projection controls before prompt prose
- review the materialized v10 Ink and mutation receipt for narrative quality and
state-change plausibility
- review the embodiment-aware materialized v10 Ink and mutation receipt for
narrative quality and state-change plausibility
- run another Qwen pass through the updated projector if Maer's Navigator
embodiment needs to be tested against generation rather than hand polish
- decide whether to polish this Ink text by hand or generalize the sequential
materializer for future accepted captures
- preserve the no-thinking default for strict tool-call generation unless a

View file

@ -72,7 +72,8 @@ state and re-entry discipline.
thinking enabled, repair for known nested-argument double-stringify cases
- `docs/architecture/projected-local-context.md`
- contract for the projector seam that turns canonical state into
character-local operating context before a response model sees it
character-local operating context before a response model sees it,
including embodiment and interface affordances
- `docs/architecture/aetheria-cold-wake-training-fixture.md`
- human-facing note that reframes the recovered Cold Wake scenario as
historical projection feedstock rather than the active product target
@ -224,7 +225,9 @@ state and re-entry discipline.
- `tools/project_local_context.py`
- deterministic first projector that compiles canonical state, scene facts,
relationships, memories, projection controls, and optional observed event
into character-local operating prose
into character-local operating prose; for cetacean Navigators it projects
habitat-native movement and interface affordances instead of generic human
body defaults
- `tools/validate_projected_contexts.py`
- validates projected context artifacts and rejects prompt text that leaks raw
canonical state internals
@ -264,5 +267,6 @@ instead of tool-call completion, so strict sequential generation now disables
thinking by default. v10 validated that correction with an accepted-as-draft
projector-routed no-thinking capture, which has now been materialized into Ink
plus reviewed mutation training data. The next implementation target is
reviewing the materialized v10 branch and mutation receipt for narrative quality
and state-change plausibility before polishing or generalizing the materializer.
reviewing the embodiment-aware v10 branch and mutation receipt for narrative
quality and state-change plausibility before another updated-projector Qwen pass
or generalizing the materializer.

View file

@ -125,6 +125,11 @@
`tools/validate_projected_contexts.py`; rendered prompt text must not leak
raw state internals such as `current_activation`, `plasticity`, means, or
decimal state values.
- Embodiment correction: projected local context now includes a first-class
embodiment/interface section. Cetacean Navigator action should be
projected through habitat-native channels, wet/dry workstations, shared
displays, control rails, acoustic or translation systems, and other
Navigator-built infrastructure, not default human body assumptions.
- Sixth sequential draft: v6 routed thinking-plus-tools generation through
projected local context instead of selected activation dictionaries. It
produced usable Maer/Sella behavior but remains useful-needs-revision
@ -147,10 +152,11 @@
- V10 materialization: `tools/materialize_sequential_capture.py`
materialized the accepted projector-routed capture into Ink, sidecar
annotation, reviewed mutation receipt, and a mutated Cold Wake fixture.
- Next prototype: review the materialized v10 branch and mutation receipt
for narrative quality and state-change plausibility, then decide whether
to polish the branch or generalize the materializer for additional
accepted captures.
- Next prototype: review the embodiment-aware materialized v10 branch and
mutation receipt for narrative quality and state-change plausibility, then
decide whether to run another Qwen pass through the updated projector,
polish the branch, or generalize the materializer for additional accepted
captures.
5. Build the projection distillation loop. Started.
- Use `docs/architecture/projection-distillation-plan.md` as the teacher to

View file

@ -63,6 +63,7 @@
"setting",
"known_facts",
"current_stakes",
"embodiment_and_interface",
"active_inner_pressures",
"relationship_read",
"tensions",
@ -100,6 +101,13 @@
"$ref": "#/$defs/text_block"
}
},
"embodiment_and_interface": {
"type": "array",
"minItems": 1,
"items": {
"$ref": "#/$defs/text_block"
}
},
"active_inner_pressures": {
"type": "array",
"minItems": 1,

View file

@ -41,3 +41,4 @@
{"ts": "2026-05-02T02:54:51+00:00", "type": "implementation", "status": "ok", "note": "Tightened projector-routed sequential runner: failed Maer choice calls now write reviewed receipts, parser can repair obvious truncated stringified tool arrays, repair notes are separated from fatal validation notes, and next-action prompts receive appraisal prose instead of raw numeric deltas. v8/v9 captures show Qwen still has tool-call reliability failures, so no projector-routed branch was materialized."}
{"ts": "2026-05-02T03:00:05+00:00", "type": "implementation", "status": "ok", "note": "Disabled thinking by default for strict projector-routed sequential Qwen generation after v9 thinking trace showed schema self-check looping. v10 no-think run completed quickly and validated as accepted_as_draft with no repair or failure notes."}
{"ts": "2026-05-02T03:03:14+00:00", "type": "implementation", "status": "ok", "note": "Materialized accepted v10 no-thinking projector-routed sequential capture into playable Ink, sidecar annotation, reviewed mutation receipt, and mutated Cold Wake fixture. Validation passes; fuzzy state, memory, relationship, and perceived-overlay updates remain manual reviewed training data."}
{"ts": "2026-05-02T03:19:48+00:00", "type": "design", "status": "accepted", "note": "Embodiment/interface affordances are now first-class projected local context. Cetacean Navigator scenes must project habitat-native channels, workstations, displays, rails, acoustic or translation systems, and other Navigator-built infrastructure instead of generic human body assumptions."}

View file

@ -131,7 +131,8 @@ accepted_design:
- The first no-thinking projector-routed sequential run, v10, validated as accepted-as-draft with no repair or failure notes.
- The accepted v10 projector-routed capture has been materialized into playable Ink, sidecar training annotation, reviewed mutation receipt, and a mutated Cold Wake fixture.
- Materialized sequential captures should still keep fuzzy state, relationship, memory, and perceived-overlay changes manual and audited until classifiers exist.
- Embodiment and interface affordances belong in projected local context; cetacean Navigators should act through habitat-native channels, shared workstations, displays, rails, acoustic or translation systems, and other Navigator-built infrastructure, not default human hands or upright-room blocking.
current_status:
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, first reviewed Cat/Oz projection examples, a revised Aetheria lore-grounding architecture, a lore grounding digest schema, the first draft Cold Wake historical grounding digest, a Cold Wake story-lab fixture, projection controls, validated Qwen capture receipts, a complete Cold Wake short story assembled from accepted projection outputs, a hand-authored Ink-backed Cold Wake branching scene, the first Qwen-generated Ink draft materialized from local awareness with reviewed training annotations, the first reviewed sequential branch mutation that updates both Maer and Sella after a sanctuary intake beat, a v2 sequential Qwen capture proving the symmetrical turn shape produces better action behavior, a v5 sequential Qwen capture proving local thinking-plus-tools invocation works for the scene runner, the first projected-local-context seam that routes sequential prompts through character-local operating prose instead of raw state variables, tightened receipt handling for projector-routed Qwen failures, a default no-thinking policy for strict sequential tool calls, a v10 no-thinking projector-routed capture accepted as draft, and the first materialized projector-routed sequential Ink scene with reviewed mutation training data.
next_action: Review the materialized v10 Ink branch and mutation receipt for narrative quality and state-change plausibility, then either polish the Ink text or generalize the sequential materializer for more accepted captures.
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, first reviewed Cat/Oz projection examples, a revised Aetheria lore-grounding architecture, a lore grounding digest schema, the first draft Cold Wake historical grounding digest, a Cold Wake story-lab fixture, projection controls, validated Qwen capture receipts, a complete Cold Wake short story assembled from accepted projection outputs, a hand-authored Ink-backed Cold Wake branching scene, the first Qwen-generated Ink draft materialized from local awareness with reviewed training annotations, the first reviewed sequential branch mutation that updates both Maer and Sella after a sanctuary intake beat, a v2 sequential Qwen capture proving the symmetrical turn shape produces better action behavior, a v5 sequential Qwen capture proving local thinking-plus-tools invocation works for the scene runner, the first projected-local-context seam that routes sequential prompts through character-local operating prose instead of raw state variables, tightened receipt handling for projector-routed Qwen failures, a default no-thinking policy for strict sequential tool calls, a v10 no-thinking projector-routed capture accepted as draft, the first materialized projector-routed sequential Ink scene with reviewed mutation training data, and an explicit embodiment/interface projection surface for Navigator scenes.
next_action: Review the embodiment-aware materialized v10 Ink branch and mutation receipt for narrative quality and state-change plausibility, then either run another Qwen pass through the updated projector or generalize the sequential materializer for more accepted captures.

View file

@ -274,7 +274,7 @@ def action_affordances(agent_id: str, annotation: dict[str, Any]) -> list[dict[s
if agent_id == annotation["protagonist_agent_id"]:
return [
text_block(
"Can ask, offer ledger backing, show or withhold the packet, help with triage, wait, or press the moral frame. Sella controls intake.",
"Can ask, offer ledger backing, show or withhold the packet through shared clinic systems, help with triage through available displays and controls, wait, or press the moral frame. Sella controls intake.",
["examples/ink/cold-wake-sanctuary-intake.training.json.projection_controls.authority_boundaries"],
),
text_block(
@ -294,6 +294,34 @@ def action_affordances(agent_id: str, annotation: dict[str, Any]) -> list[dict[s
]
def embodiment_context(agent: dict[str, Any], source_prefix: str) -> list[dict[str, Any]]:
identity = agent["identity"]
origin = identity.get("origin", "")
roles = " ".join(identity.get("roles", []))
searchable_identity = f"{origin} {roles}".lower()
if "cetacean" in searchable_identity:
return [
text_block(
"This character is a literal cetacean Navigator. Corridor habitats and Navigator-adjacent clinics are built around cetacean movement, access, and communication.",
[f"{source_prefix}.identity.origin"],
),
text_block(
"Express physical action through Navigator-native channels, wet/dry workstations, shared displays, control rails, acoustic or translation systems, and other infrastructure already present in the habitat.",
[f"{source_prefix}.identity.roles", "scenes.scene-02-sanctuary-intake.location"],
),
text_block(
"Do not describe human hands, pockets, standing, walking, leaning, doorframe blocking, or facial expressions for this character unless the fixture explicitly establishes that specific visible interface.",
[f"{source_prefix}.identity.origin"],
),
]
return [
text_block(
"Use only the body, tools, interfaces, and movement affordances established by this character's fixture and the current scene.",
[f"{source_prefix}.identity"],
)
]
def tension_blocks(agent: dict[str, Any], pack: dict[str, Any], annotation: dict[str, Any], source_prefix: str) -> list[dict[str, Any]]:
goals = " ".join(goal["description"] for goal in agent.get("goals", []) if goal["goal_id"] in pack.get("active_goals", []))
constraints = " ".join(pack.get("presentation_constraints", []))
@ -390,6 +418,7 @@ def render_prompt_text(context: dict[str, Any]) -> str:
for title, key in [
("Known Facts", "known_facts"),
("Current Stakes", "current_stakes"),
("Embodiment And Interface", "embodiment_and_interface"),
("Active Inner Pressures", "active_inner_pressures"),
("Relationship Read", "relationship_read"),
("Tensions", "tensions"),
@ -443,6 +472,7 @@ def build_projected_context(
"setting": f"{scene['location']}. {fixture['world']['setting']}, {fixture['world']['time']['label']}.",
"known_facts": known_fact_blocks(scene, pack, scene_prefix),
"current_stakes": scene_stakes(scene, local_agent_id, scene_prefix),
"embodiment_and_interface": embodiment_context(agent, source_prefix),
"active_inner_pressures": active_inner_pressures,
"relationship_read": relationship_context(fixture, local_agent_id, listener_ids) + perceived_overlay_context(agent, listener_ids, source_prefix),
"tensions": tension_blocks(agent, pack, annotation, source_prefix),

View file

@ -67,6 +67,7 @@ def validate_context(path: Path) -> None:
"setting",
"known_facts",
"current_stakes",
"embodiment_and_interface",
"active_inner_pressures",
"relationship_read",
"tensions",
@ -83,6 +84,7 @@ def validate_context(path: Path) -> None:
for key in [
"known_facts",
"current_stakes",
"embodiment_and_interface",
"active_inner_pressures",
"tensions",
"action_affordances",