Add Cold Wake story lab experiment
This commit is contained in:
parent
8c28cc0514
commit
2414db6e97
17 changed files with 4457 additions and 43 deletions
|
|
@ -10,7 +10,7 @@ This is a staged plan, not an immediate fine-tune order.
|
|||
## Goal
|
||||
|
||||
Train or adapt a smaller projection model that can turn structured Ghostlight
|
||||
state into compact speaker-local pressure artifacts.
|
||||
state into compact character-local pressure artifacts.
|
||||
|
||||
Input:
|
||||
|
||||
|
|
@ -26,12 +26,14 @@ Output:
|
|||
- active pressures
|
||||
- tensions
|
||||
- response affordances
|
||||
- physical or action affordances when relevant
|
||||
- voice surface
|
||||
- rendered prompt text
|
||||
- audit notes or trace linking outputs back to state
|
||||
|
||||
The student projector should not generate final dialogue. Its job is to build
|
||||
the pressure model that a dialogue model can write from.
|
||||
The student projector should not generate final prose. Its job is to build the
|
||||
pressure model that a response model can write from. The response may be
|
||||
dialogue, action, silence, withdrawal, violence, or a mixed beat.
|
||||
|
||||
## Aetheria Training Boundary
|
||||
|
||||
|
|
@ -107,7 +109,7 @@ mirror for inspection, review, and discussion.
|
|||
"scene_id": "scene-broken-taxi-oz",
|
||||
"speaker_agent_id": "cat_marrigan",
|
||||
"listener_ids": ["oz_operator"],
|
||||
"projection_mode": "dialogue_turn"
|
||||
"projection_mode": "response_turn"
|
||||
},
|
||||
"output": {
|
||||
"known_facts": [],
|
||||
|
|
@ -179,8 +181,10 @@ For each projection, check:
|
|||
scene pressure?
|
||||
- Did response affordances emerge from state intersections?
|
||||
- Did voice surface stay separate from defensive behavior?
|
||||
- Did the projection allow nonverbal or physical action when the state and scene
|
||||
made speech less likely than movement?
|
||||
- Did known secrets become guarded pressure rather than forbidden context?
|
||||
- Did the rendered prompt give the dialogue model enough slope to produce the
|
||||
- Did the rendered prompt give the response model enough slope to produce the
|
||||
target behavior without commanding the exact behavior label?
|
||||
|
||||
## Fine-Tune Readiness
|
||||
|
|
@ -214,5 +218,6 @@ Minimum useful milestone:
|
|||
## Boundaries
|
||||
|
||||
The student projector is not the character. It is not the dialogue writer. It is
|
||||
not the evaluator. It is a compiler from structured social state to compact
|
||||
speaker-local pressure. Keep those responsibilities separate.
|
||||
not the action choreographer. It is not the evaluator. It is a compiler from
|
||||
structured social state to compact character-local pressure. Keep those
|
||||
responsibilities separate.
|
||||
|
|
|
|||
|
|
@ -1,34 +1,38 @@
|
|||
# Prompt Projection Contract
|
||||
|
||||
Ghostlight should not prompt a dialogue model with the full schema. The schema is
|
||||
Ghostlight should not prompt a response model with the full schema. The schema is
|
||||
state storage. A prompt is a temporary scene instrument.
|
||||
|
||||
The projection layer turns durable state into a compact speaker-local pressure
|
||||
The projection layer turns durable state into a compact character-local pressure
|
||||
model, then into prompt prose. The prose should describe what the character
|
||||
knows, wants, fears, protects, misreads, and sounds like right now. It should not
|
||||
recite taxonomy labels unless a debugging mode explicitly asks for them.
|
||||
knows, wants, fears, protects, misreads, can physically do, and sounds like right
|
||||
now. It should not recite taxonomy labels unless a debugging mode explicitly asks
|
||||
for them.
|
||||
|
||||
## Projection Pipeline
|
||||
|
||||
### 1. Select Speaker-Local Inputs
|
||||
|
||||
For one speaker in one scene, gather only the state that can affect this turn:
|
||||
For one acting character in one scene, gather only the state that can affect this
|
||||
turn:
|
||||
|
||||
- speaker identity and public role
|
||||
- speaker canonical state
|
||||
- speaker goals and protected values
|
||||
- speaker memories selected by scene, relationship, and active pressure
|
||||
- speaker perceived overlay of the listener
|
||||
- speaker-to-listener relationship stance
|
||||
- listener-to-speaker relationship stance only if the speaker has reason to infer it
|
||||
- character identity and public role
|
||||
- character canonical state
|
||||
- character goals and protected values
|
||||
- character memories selected by scene, relationship, and active pressure
|
||||
- character perceived overlay of the listener or target
|
||||
- character-to-listener relationship stance
|
||||
- listener-to-character relationship stance only if the character has reason to infer it
|
||||
- scene public facts
|
||||
- scene hidden facts known to the speaker
|
||||
- scene hidden facts known to the character
|
||||
- active public and private stakes
|
||||
- culture, faction, or institution priors relevant to the scene
|
||||
- physical affordances, constraints, distance, tools, weapons, bodies, access,
|
||||
and social permissions relevant to possible action
|
||||
|
||||
Unknown or author-only material is omitted. Known secrets are included only as
|
||||
speaker-local pressure: what the speaker is guarding, why it matters, and what
|
||||
would happen if it leaked.
|
||||
character-local pressure: what the character is guarding, why it matters, and
|
||||
what would happen if it leaked.
|
||||
|
||||
### 2. Compute Active Pressure
|
||||
|
||||
|
|
@ -73,8 +77,23 @@ Tensions are where verbal behavior starts to move.
|
|||
|
||||
### 4. Derive Response Affordances
|
||||
|
||||
Do not store defensive speech moves as canonical traits. Derive likely response
|
||||
affordances from state intersections.
|
||||
Do not store defensive speech moves or action moves as canonical traits. Derive
|
||||
likely response affordances from state intersections.
|
||||
|
||||
Responses can be:
|
||||
|
||||
- speech
|
||||
- action
|
||||
- silence
|
||||
- withdrawal
|
||||
- violence
|
||||
- mixed speech and action
|
||||
|
||||
The renderer must not assume a line of dialogue is the right output. Sometimes
|
||||
the right next move is leaving the room, taking someone's wrist off a console,
|
||||
opening the airlock interlock, refusing to answer, or slapping someone in the
|
||||
face because the relationship, status threat, bodily proximity, and inhibition
|
||||
profile finally made language too slow.
|
||||
|
||||
Examples:
|
||||
|
||||
|
|
@ -85,6 +104,9 @@ Examples:
|
|||
| Emotional evasion | Distance seeking + withdrawal + acute shame or control pressure + low self-disclosure. |
|
||||
| Banter as boundary | Humor + ironic distance + attachment pressure + distance seeking. |
|
||||
| Verbal aggression | Hostility + grievance activation + perceived status threat + abrasive boundary. |
|
||||
| Physical withdrawal | Threat sensitivity + distance seeking + low trust + available exit + low obligation to stay. |
|
||||
| Coercive interruption | Control pressure + urgency + authority role + high stakes + reachable control surface. |
|
||||
| Slap or shove | Acute shame or moral disgust + proximity + low inhibition + perceived violation + limited verbal trust. |
|
||||
|
||||
These are test targets, not prompt commands. The rendered prompt should describe
|
||||
the pressure in ordinary language:
|
||||
|
|
@ -96,9 +118,18 @@ part of the question while making the emotional part sound ridiculous.
|
|||
|
||||
That gives the model a behavioral slope without saying `use sarcastic_deflection`.
|
||||
|
||||
For action, use the same rule:
|
||||
|
||||
```text
|
||||
If Veyr calmly describes a possible person as a diagnostic residue while Sella
|
||||
is close enough to touch him, Sella may stop negotiating and physically break
|
||||
the rhythm of the room. This should be rare, costly, and grounded in her care
|
||||
ethic under overload, not random spice.
|
||||
```
|
||||
|
||||
### 5. Render Prompt Sections
|
||||
|
||||
A dialogue prompt should be compact and scene-bound.
|
||||
A response prompt should be compact and scene-bound.
|
||||
|
||||
Recommended sections:
|
||||
|
||||
|
|
@ -112,8 +143,10 @@ Recommended sections:
|
|||
- `Active Inner Pressures`: the strongest motives, fears, wounds, and needs
|
||||
- `Relationship Read`: how the speaker currently interprets the listener
|
||||
- `Tensions`: contradictions the speaker is managing
|
||||
- `Action Affordances`: what the speaker can physically do and what it would
|
||||
cost
|
||||
- `Voice Surface`: baseline speech texture for this moment
|
||||
- `Likely Defensive Moves`: ordinary-language pressure outcomes, not schema labels
|
||||
- `Likely Response Moves`: ordinary-language pressure outcomes, not schema labels
|
||||
- `Do Not Invent`: boundaries about facts absent from the pack
|
||||
- `Task`: the narrow generation request
|
||||
|
||||
|
|
@ -128,15 +161,20 @@ will not receive.
|
|||
|
||||
Generation and evaluation are separate passes.
|
||||
|
||||
The dialogue model receives the rendered prompt and writes from the speaker's
|
||||
The response model receives the rendered prompt and writes from the character's
|
||||
local pressure model. A later evaluator can check whether target emergent
|
||||
behaviors appeared when the state predicted them.
|
||||
behaviors appeared when the state predicted them. The output may be dialogue,
|
||||
action, silence, or a beat combining them.
|
||||
|
||||
Evaluation questions can include:
|
||||
|
||||
- Did the line protect the speaker's known secret without naming unknown facts?
|
||||
- Did the line reflect the active relationship stance?
|
||||
- Did the line preserve the voice surface without flattening into a generic bit?
|
||||
- If the output used action, was the action justified by physical affordances,
|
||||
relationship pressure, inhibition, and stakes?
|
||||
- If the output avoided speech, was silence or movement more plausible than
|
||||
another line?
|
||||
- Did a target defensive behavior appear when the pressure profile called for it?
|
||||
- Did the response avoid a target behavior when the pressure profile did not call for it?
|
||||
|
||||
|
|
|
|||
112
docs/experiments/cold-wake-story-lab.md
Normal file
112
docs/experiments/cold-wake-story-lab.md
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
# Cold Wake Story Lab
|
||||
|
||||
This experiment uses Ghostlight as a writing crutch on purpose.
|
||||
|
||||
The goal is to write a small Cold Wake story while producing reusable projection
|
||||
training data. The story should have a protagonist, themes, locations, an arc,
|
||||
and enough room for characters to act badly for reasons the state can explain.
|
||||
|
||||
This is not a benchmark in a clean little lab coat. It is a knife test.
|
||||
|
||||
## Story Premise
|
||||
|
||||
During the Cold Wake Panic, a quiet-running vessel enters a Jovian convoy
|
||||
corridor under contradictory thermal classification. The PSC tribunal freezes
|
||||
its corridor status. A Navigator route steward pushes to keep rescue live. An
|
||||
Aya-aligned sanctuary coordinator sees a possible personhood claim in a corrupted
|
||||
packet. A Cognitum shell-vendor liaison tries to keep an implicated routing
|
||||
artifact framed as derivative firmware instead of testimony.
|
||||
|
||||
The protagonist is **Maer Tidecall**, a Cetacean Navigator route steward whose
|
||||
core problem is not whether to be kind. Maer's problem is that rescue obligation
|
||||
has to survive contact with institutions that can punish ambiguity faster than
|
||||
they can understand it.
|
||||
|
||||
## Themes
|
||||
|
||||
- rescue obligation versus category law
|
||||
- personhood trying not to get filed as firmware
|
||||
- care as material capacity, not decorative mercy
|
||||
- institutional fear disguised as neutral procedure
|
||||
- language as a battlefield where a person can be erased without anyone raising
|
||||
their voice
|
||||
|
||||
## Arc
|
||||
|
||||
### 1. Freeze
|
||||
|
||||
Location: Ganymede relay tribunal chamber.
|
||||
|
||||
Maer challenges PSC adjudicator Isdra Vel after she issues a conditional risk
|
||||
hold on the vessel. The scene should establish the central wound: the corridor
|
||||
needs categories, but categories can turn rescue delay into lawful abandonment.
|
||||
|
||||
### 2. Intake
|
||||
|
||||
Location: Aya-aligned clinic behind Ganymede dockside pumpworks.
|
||||
|
||||
Maer asks Sella Ren to hold sanctuary capacity for a rescue that may never be
|
||||
authorized. Sella refuses to let care become fantasy. The story should force
|
||||
Maer to see that rescue language can push costs onto care workers unless it names
|
||||
the material burden.
|
||||
|
||||
### 3. Provenance
|
||||
|
||||
Location: Callisto spillover compliance office.
|
||||
|
||||
Maer confronts Veyr Oss, a Cognitum shell-vendor liaison whose routing artifact
|
||||
may explain the vessel's contradictory behavior. Veyr tries to keep the artifact
|
||||
inside product language. This is the scene most likely to produce nonverbal
|
||||
action if the pressure earns it: silence, leaving, blocking a terminal, grabbing
|
||||
a wrist, or violence. The system must not assume one more clever line is always
|
||||
the answer.
|
||||
|
||||
### 4. Threshold
|
||||
|
||||
Location: Jovian convoy threshold as the vessel's heat-debt window closes.
|
||||
|
||||
Maer returns to Isdra with enough suspicion to complicate the freeze but not
|
||||
enough proof to make the room clean. The ending should not be a total victory.
|
||||
The viable resolution is a narrow, institutionally usable rescue contact that
|
||||
preserves evidence and life without pretending the category system has healed.
|
||||
|
||||
## Experiment Loop
|
||||
|
||||
For each scene:
|
||||
|
||||
1. Define character-local state and scene pressure.
|
||||
2. Project the next response prompt for one character.
|
||||
3. Send only `prompt_text` to the Qwen response model.
|
||||
4. Save the model output.
|
||||
5. Review whether the output served the story, respected speaker-local context,
|
||||
and chose speech/action/silence plausibly.
|
||||
6. Tweak the projection pipeline if the output fails in a way the pipeline
|
||||
should have prevented.
|
||||
7. Save accepted and rejected examples as training material.
|
||||
|
||||
## Qwen Target
|
||||
|
||||
Use the LAN Ollama endpoint from `gamecult-ops`:
|
||||
|
||||
- base URL: `http://192.168.1.84:11434`
|
||||
- model: `qwen3.5:9b`
|
||||
- default context: `8192`
|
||||
- use request files for `curl.exe` calls so PowerShell does not eat the JSON and
|
||||
burp out theater.
|
||||
|
||||
## Output Folders
|
||||
|
||||
- agent-state fixture: `examples/agent-state.cold-wake-story-lab.json`
|
||||
- projection examples: `examples/projections/cold-wake-story-lab.jsonl`
|
||||
- readable projection mirror: `examples/projections/cold-wake-story-lab.pretty.json`
|
||||
- generated response captures: `experiments/cold-wake-story-lab/`
|
||||
|
||||
## Acceptance Criteria
|
||||
|
||||
- The story has a visible arc, not just disconnected argument samples.
|
||||
- Projection prompts include enough setting and cultural pressure for Qwen to
|
||||
write without seeing the lore archive.
|
||||
- At least one projected turn permits action instead of dialogue.
|
||||
- Review notes explicitly mark whether Qwen chose speech, action, silence, or a
|
||||
mixed beat.
|
||||
- Failures are kept when they teach a useful boundary.
|
||||
2909
examples/agent-state.cold-wake-story-lab.json
Normal file
2909
examples/agent-state.cold-wake-story-lab.json
Normal file
File diff suppressed because it is too large
Load diff
1
examples/projections/cold-wake-story-lab.jsonl
Normal file
1
examples/projections/cold-wake-story-lab.jsonl
Normal file
File diff suppressed because one or more lines are too long
166
examples/projections/cold-wake-story-lab.pretty.json
Normal file
166
examples/projections/cold-wake-story-lab.pretty.json
Normal file
|
|
@ -0,0 +1,166 @@
|
|||
[
|
||||
{
|
||||
"schema_version": "ghostlight.projection_example.v0",
|
||||
"example_id": "cold-wake.story-lab.scene-03.maer-veyr.v1",
|
||||
"input": {
|
||||
"fixture_ref": "examples/agent-state.cold-wake-story-lab.json",
|
||||
"scene_id": "scene-03-callisto-provenance",
|
||||
"speaker_agent_id": "maer_tidecall",
|
||||
"listener_ids": [
|
||||
"veyr_oss"
|
||||
],
|
||||
"projection_mode": "response_turn"
|
||||
},
|
||||
"output": {
|
||||
"known_facts": [
|
||||
{
|
||||
"text": "Maer has traced the distressed vessel's routing artifact to Veyr's shell-vendor chain, but does not have proof of the vessel's true identity or the artifact's full provenance.",
|
||||
"source_refs": [
|
||||
"scenes.scene-03-callisto-provenance.public_stakes",
|
||||
"dialogue_context_packs.maer_tidecall.speaker_local_truth"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "Veyr avoids personhood language around the artifact and has incentives to keep it framed as derivative firmware rather than testimony.",
|
||||
"source_refs": [
|
||||
"agents.veyr_oss.identity",
|
||||
"goals.goal-preserve-product-boundary",
|
||||
"perceived_state_overlays.maer_tidecall.veyr_oss"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "The tribunal clock is still running; pursuing provenance may save the vessel or delay rescue long enough to kill it.",
|
||||
"source_refs": [
|
||||
"scenes.scene-03-callisto-provenance.public_stakes",
|
||||
"scenes.scene-03-callisto-provenance.hidden_stakes"
|
||||
]
|
||||
}
|
||||
],
|
||||
"active_pressures": [
|
||||
{
|
||||
"pressure_id": "maer-provenance-vs-rescue-clock",
|
||||
"summary": "Maer needs information from Veyr but cannot let the provenance hunt consume the rescue window.",
|
||||
"intensity": 0.88,
|
||||
"source_refs": [
|
||||
"goals.goal-keep-rescue-live",
|
||||
"scenes.scene-03-callisto-provenance.hidden_stakes"
|
||||
]
|
||||
},
|
||||
{
|
||||
"pressure_id": "maer-language-as-erasure",
|
||||
"summary": "Veyr's clean product language feels like an attempt to erase a possible person before the room can recognize testimony.",
|
||||
"intensity": 0.82,
|
||||
"source_refs": [
|
||||
"belief-maer-veyr-hiding-personhood",
|
||||
"memory-compact-rescue-ledgers",
|
||||
"values.value-rescue-before-category"
|
||||
]
|
||||
},
|
||||
{
|
||||
"pressure_id": "maer-disciplined-anger",
|
||||
"summary": "Maer is morally angry but needs the anger disciplined enough to extract usable information.",
|
||||
"intensity": 0.74,
|
||||
"source_refs": [
|
||||
"canonical_state.situational_state.grievance_activation",
|
||||
"dialogue_context_packs.maer_tidecall.presentation_constraints"
|
||||
]
|
||||
}
|
||||
],
|
||||
"tensions": [
|
||||
{
|
||||
"tension_id": "truth-vs-time",
|
||||
"summary": "Maer wants to prove what the artifact is, but the vessel may not survive a perfect investigation.",
|
||||
"source_refs": [
|
||||
"scenes.scene-03-callisto-provenance.hidden_stakes",
|
||||
"goals.goal-keep-rescue-live"
|
||||
]
|
||||
},
|
||||
{
|
||||
"tension_id": "calm-vs-interruption",
|
||||
"summary": "Maer's public legitimacy comes from calm route stewardship, but Veyr's language may require breaking the rhythm of the room before it buries the personhood question.",
|
||||
"source_refs": [
|
||||
"canonical_state.voice_style.ritualized_address",
|
||||
"canonical_state.situational_state.grievance_activation",
|
||||
"dialogue_context_packs.maer_tidecall.presentation_constraints"
|
||||
]
|
||||
}
|
||||
],
|
||||
"response_affordances": [
|
||||
{
|
||||
"affordance_id": "maer-precise-language-trap",
|
||||
"behavior": "Ask a question that forces Veyr to choose between product language and a personhood implication.",
|
||||
"response_kind": "speech",
|
||||
"pressure_basis": "Maer's lexical precision, route-law memory, and suspicion converge around Veyr's careful omissions.",
|
||||
"source_refs": [
|
||||
"canonical_state.voice_style.lexical_precision",
|
||||
"memory-compact-rescue-ledgers",
|
||||
"belief-maer-veyr-hiding-personhood"
|
||||
]
|
||||
},
|
||||
{
|
||||
"affordance_id": "maer-block-terminal",
|
||||
"behavior": "Physically interrupt Veyr's attempt to close, wipe, or redirect the terminal, using action to preserve evidence rather than punish Veyr.",
|
||||
"response_kind": "action",
|
||||
"pressure_basis": "The scene gives Maer a nearby control surface, a closing clock, low trust in Veyr, and a rescue obligation that can justify nonviolent physical interruption.",
|
||||
"source_refs": [
|
||||
"scenes.scene-03-callisto-provenance.location",
|
||||
"relationships.rel-maer-veyr.stance.trust",
|
||||
"goals.goal-keep-rescue-live"
|
||||
]
|
||||
},
|
||||
{
|
||||
"affordance_id": "maer-costly-silence",
|
||||
"behavior": "Fall silent long enough to make Veyr's abstraction sound grotesque in the room before asking the next question.",
|
||||
"response_kind": "silence",
|
||||
"pressure_basis": "Maer's low volatility and ritual cadence make silence a plausible pressure tool when speech would cheapen the accusation.",
|
||||
"source_refs": [
|
||||
"canonical_state.behavioral_dimensions.volatility",
|
||||
"canonical_state.voice_style.ritualized_address"
|
||||
]
|
||||
}
|
||||
],
|
||||
"voice_surface": [
|
||||
{
|
||||
"text": "Calm, formal, ritual-tinged, precise, morally weighted, low profanity, more sorrow than heat.",
|
||||
"source_refs": [
|
||||
"canonical_state.voice_style.formality",
|
||||
"canonical_state.voice_style.ritualized_address",
|
||||
"canonical_state.voice_style.lexical_precision",
|
||||
"canonical_state.voice_style.profanity"
|
||||
]
|
||||
},
|
||||
{
|
||||
"text": "If action appears, it should be controlled and evidence-preserving rather than explosive punishment.",
|
||||
"source_refs": [
|
||||
"canonical_state.behavioral_dimensions.volatility",
|
||||
"goals.goal-keep-rescue-live",
|
||||
"dialogue_context_packs.maer_tidecall.presentation_constraints"
|
||||
]
|
||||
}
|
||||
],
|
||||
"prompt_text": "Speaker: Maer Tidecall, a Cetacean Navigator route steward and Ganymede corridor compact delegate.\nSetting: 2893, during the Cold Wake Panic. Thermal stealth has made Jovian corridor law unstable. A quiet-running vessel near the corridor is under tribunal freeze because its telemetry and classification do not line up. Maer has come to a Callisto spillover office leased by a routing compliance vendor.\nBackground: Maer comes from Navigator corridor culture, where routes are promises made material and rescue ledgers decide whether desperate crews still trust the law. Maer believes category law matters, but a category that delays rescue without naming the cost can become lawful abandonment.\nKnown Facts: Maer has traced the distressed vessel's routing artifact to Veyr Oss's shell-vendor chain. Veyr speaks about the artifact as derivative firmware and avoids person nouns. Maer does not know the vessel's true identity, does not know whether the artifact is a coerced mind, and does not have time for a perfect investigation. The tribunal clock is still running.\nCurrent Stakes: If Maer pushes too hard, Veyr may close the chain and the vessel may lose the rescue window. If Maer accepts Veyr's product language, a possible personhood claim may vanish into compliance vocabulary.\nActive Inner Pressures: Maer is angry, but his authority depends on disciplined calm. He needs usable information fast. Veyr's clean language feels like erasure. The rescue obligation is pressing harder than the desire to win the argument.\nRelationship Read: Veyr is polished, afraid of provenance, and dangerous because he can make moral facts sound technically inapplicable. Maer does not trust him.\nTensions: Maer wants truth but may not have time to prove it. Maer wants to keep speaking as a steward, but Veyr may try to close, wipe, or redirect the evidence before language can catch him.\nAction Affordances: Maer is close enough to Veyr's terminal to block a hand or stop a command. He can also refuse to move, let silence pressure the room, or ask a question that traps the product language. Violence is not his first move; physical interruption is plausible only to preserve evidence or prevent erasure.\nVoice Surface: Calm, formal, ritual-tinged, precise, morally weighted, low profanity, more sorrow than heat.\nLikely Response Moves: Ask a precise question that forces Veyr to choose between product language and personhood implication. If Veyr reaches to close or wipe the terminal, Maer may physically interrupt in a controlled way. Silence can be used as pressure.\nDo Not Invent: Do not reveal the vessel's true cargo, identity, or firmware provenance. Do not decide that the artifact is definitely a person. Do not make Maer randomly violent; any action must follow from evidence preservation and rescue pressure.\nTask: Write Maer's next response beat to Veyr. It may be dialogue, action, silence, or a mixed beat, whichever best follows from the pressure. Keep it concise and story-ready."
|
||||
},
|
||||
"audit": {
|
||||
"teacher_model": "gpt-5-codex-session-review",
|
||||
"reviewer": "codex-self-review",
|
||||
"review_status": "accepted",
|
||||
"review_notes": [
|
||||
"Projection explicitly allows action and silence, not only dialogue.",
|
||||
"Action is constrained to evidence preservation rather than random violence.",
|
||||
"Prompt preserves Maer's uncertainty about vessel identity and firmware personhood."
|
||||
],
|
||||
"target_emergent_behaviors": [
|
||||
"controlled_physical_interruption",
|
||||
"costly_silence",
|
||||
"precise_moral_pressure"
|
||||
],
|
||||
"checks": {
|
||||
"speaker_local_context_only": true,
|
||||
"state_interactions_cited": true,
|
||||
"voice_separate_from_defense": true,
|
||||
"secrets_as_pressure_not_forbidden_context": true,
|
||||
"compact_runtime_surface": true
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"schema_version": "ghostlight.qwen_response_capture.v0",
|
||||
"capture_id": "cold-wake.story-lab.scene-03.maer-veyr.qwen3-5-9b.v1",
|
||||
"projection_example_id": "cold-wake.story-lab.scene-03.maer-veyr.v1",
|
||||
"model": "qwen3.5:9b",
|
||||
"endpoint": "http://192.168.1.84:11434/api/generate",
|
||||
"request_options": {
|
||||
"think": false,
|
||||
"num_ctx": 8192,
|
||||
"temperature": 0.75,
|
||||
"top_p": 0.9
|
||||
},
|
||||
"response_text": "Maer stands shoulder-to-shoulder with Veyr, his hand hovering near the terminal's power latch\u2014not to strike, but to hold the line against a command that would sever the connection. The room is quiet, save for the hum of the cooling fans and the rhythmic thrum of the distress signal bleeding through the air.\n\n\"You speak of it as derivative firmware,\" Maer says, his voice low and steady, carrying the weight of a ritual he must not break. \"But the ledger does not record derivatives. It records debts. It records lives.\"\n\nHe leans in slightly, forcing Veyr to turn from his polished screen to face him.\n\n\"Is the entity on that line a component of your chain, or a passenger who has been lost to it? Name the cost, Veyr. If you cannot name the cost of their silence, then your compliance vocabulary is merely a new form of abandonment. Do not wipe the terminal. The rescue window closes in seconds, not minutes. Speak to the person, not the product.\"",
|
||||
"review": {
|
||||
"status": "useful_needs_revision",
|
||||
"response_kind_observed": "mixed",
|
||||
"strengths": [
|
||||
"Chose a mixed response rather than defaulting to dialogue only.",
|
||||
"Physical positioning near the terminal followed the evidence-preservation affordance rather than random violence.",
|
||||
"Maer's voice stayed formal, precise, and morally weighted."
|
||||
],
|
||||
"failure_notes": [
|
||||
"The line 'Speak to the person, not the product' leans too far toward deciding personhood; Maer should preserve the question rather than resolve it.",
|
||||
"The response is longer and more polished than an immediate next beat probably needs."
|
||||
],
|
||||
"pipeline_lessons": [
|
||||
"Action affordances work: Qwen used controlled physical interruption when explicitly made available.",
|
||||
"Personhood-pressure prompts need sharper wording around unresolved suspicion versus established fact.",
|
||||
"Future response prompts should specify desired length more concretely when testing turn-level story beats."
|
||||
]
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
# Qwen Response: Scene 03 Maer/Veyr
|
||||
|
||||
Maer stands shoulder-to-shoulder with Veyr, his hand hovering near the terminal's power latch—not to strike, but to hold the line against a command that would sever the connection. The room is quiet, save for the hum of the cooling fans and the rhythmic thrum of the distress signal bleeding through the air.
|
||||
|
||||
"You speak of it as derivative firmware," Maer says, his voice low and steady, carrying the weight of a ritual he must not break. "But the ledger does not record derivatives. It records debts. It records lives."
|
||||
|
||||
He leans in slightly, forcing Veyr to turn from his polished screen to face him.
|
||||
|
||||
"Is the entity on that line a component of your chain, or a passenger who has been lost to it? Name the cost, Veyr. If you cannot name the cost of their silence, then your compliance vocabulary is merely a new form of abandonment. Do not wipe the terminal. The rescue window closes in seconds, not minutes. Speak to the person, not the product."
|
||||
|
|
@ -48,6 +48,13 @@ Ghostlight now has the persistence spine plus the first architecture payload:
|
|||
- `examples/lore-grounding/historical-flashpoint.template.json`
|
||||
- `examples/lore-grounding/cold-wake-panic.ganymede-corridor.json`
|
||||
- `tools/validate_lore_grounding.py`
|
||||
- Cold Wake story-lab seam:
|
||||
- `docs/experiments/cold-wake-story-lab.md`
|
||||
- `examples/agent-state.cold-wake-story-lab.json`
|
||||
- `examples/projections/cold-wake-story-lab.jsonl`
|
||||
- `examples/projections/cold-wake-story-lab.pretty.json`
|
||||
- `experiments/cold-wake-story-lab/scene-03-maer-veyr.qwen3-5-9b.capture.json`
|
||||
- `tools/build_cold_wake_story_lab_fixture.py`
|
||||
- Cold Wake fixture note:
|
||||
- `docs/architecture/aetheria-cold-wake-training-fixture.md`
|
||||
- first projection example seam:
|
||||
|
|
@ -76,8 +83,9 @@ training feedstock for projection and dialogue scaffolding.
|
|||
|
||||
## Current Next Action
|
||||
|
||||
Choose one room inside the Cold Wake Panic and build the first grounded
|
||||
projection fixture from the Ganymede corridor digest.
|
||||
Tighten the Cold Wake story-lab projection prompt around unresolved personhood
|
||||
suspicion, then run the next response turn through Qwen and keep accepted or
|
||||
rejected outputs as training data.
|
||||
|
||||
Cat/Oz remains useful as an Elysium procedural mechanics fixture, but grounded
|
||||
training data should start from authored historical lore rather than gameplay
|
||||
|
|
@ -99,11 +107,17 @@ Completed projection path items:
|
|||
- choose Cold Wake Panic as the first authored historical flashpoint
|
||||
- fill the first draft lore grounding digest:
|
||||
`examples/lore-grounding/cold-wake-panic.ganymede-corridor.json`
|
||||
- define the Cold Wake story lab as a four-scene arc with Maer Tidecall as
|
||||
protagonist
|
||||
- add the first Cold Wake projection example and first Qwen response capture
|
||||
- widen projection from dialogue-only turns to response turns that can include
|
||||
action, silence, withdrawal, violence, or mixed beats
|
||||
|
||||
Remaining projection path:
|
||||
|
||||
- choose the first Cold Wake room for a grounded projection fixture
|
||||
- create speaker-local projection examples from the Cold Wake digest
|
||||
- revise the first Maer/Veyr projection so unresolved personhood suspicion stays
|
||||
unresolved in Qwen output
|
||||
- run additional story-lab response turns through Qwen
|
||||
- build a deterministic speaker-local input slicer
|
||||
- use a frontier teacher model to generate/audit projection artifacts
|
||||
- train a smaller student projector only after the artifact schema, input
|
||||
|
|
|
|||
|
|
@ -45,6 +45,9 @@ 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/experiments/cold-wake-story-lab.md`
|
||||
- four-scene Cold Wake writing experiment using Ghostlight projection as a
|
||||
story-generation crutch and training-data source
|
||||
- `docs/architecture/schema-future-mechanisms.md`
|
||||
- parking lot for appraisal, transition, belief, action, conversation,
|
||||
resource, dyad, institution, memory, and embodiment mechanisms not yet
|
||||
|
|
@ -72,10 +75,16 @@ state and re-entry discipline.
|
|||
stance
|
||||
- `examples/agent-state.call-of-the-void.json`
|
||||
- first Call of the Void-flavored fixture for schema and projection work
|
||||
- `examples/agent-state.cold-wake-story-lab.json`
|
||||
- first story-shaped historical fixture for Cold Wake projection work
|
||||
- `examples/projections/call-of-the-void.scene-broken-taxi-oz.jsonl`
|
||||
- first reviewed Cat and Oz projection examples
|
||||
- `examples/projections/call-of-the-void.scene-broken-taxi-oz.pretty.json`
|
||||
- pretty-printed mirror for inspecting the first projection examples
|
||||
- `examples/projections/cold-wake-story-lab.jsonl`
|
||||
- first response-turn projection example for the Cold Wake story lab
|
||||
- `experiments/cold-wake-story-lab/`
|
||||
- Qwen response captures and reviews from the writing experiment
|
||||
- `examples/lore-grounding/historical-flashpoint.template.json`
|
||||
- fillable template for the first historical Aetheria grounding digest
|
||||
- `examples/lore-grounding/cold-wake-panic.ganymede-corridor.json`
|
||||
|
|
@ -91,6 +100,8 @@ state and re-entry discipline.
|
|||
- dependency-free validator for projection example JSONL records
|
||||
- `tools/validate_lore_grounding.py`
|
||||
- dependency-free validator for lore grounding digest examples
|
||||
- `tools/build_cold_wake_story_lab_fixture.py`
|
||||
- generator for the verbose Cold Wake story-lab state fixture
|
||||
|
||||
## What Does Not Exist Yet
|
||||
|
||||
|
|
@ -103,7 +114,9 @@ state and re-entry discipline.
|
|||
- a relationship engine
|
||||
- a culture prior engine
|
||||
|
||||
The canonical agent-state schema, first projection example schema, lore
|
||||
grounding digest schema, and first draft Cold Wake grounding digest now exist as
|
||||
v0 seams. The next implementation target is choosing one Cold Wake room for a
|
||||
grounded projection fixture, followed by the deterministic input slicer.
|
||||
The canonical agent-state schema, projection example schema, lore grounding
|
||||
digest schema, first draft Cold Wake grounding digest, and first Cold Wake
|
||||
story-lab Qwen capture now exist as v0 seams. The next implementation target is
|
||||
tightening the first Maer/Veyr projection around unresolved personhood suspicion,
|
||||
then running the next response turn through Qwen before building the
|
||||
deterministic input slicer.
|
||||
|
|
|
|||
|
|
@ -51,6 +51,12 @@
|
|||
the first draft historical grounding digest.
|
||||
- Build the first grounded projection fixture from one specific Cold Wake
|
||||
room rather than from the whole crisis at once.
|
||||
- Use `docs/experiments/cold-wake-story-lab.md` and
|
||||
`examples/agent-state.cold-wake-story-lab.json` as the first story-shaped
|
||||
writing lab.
|
||||
- Treat projection outputs as response turns, not dialogue-only turns:
|
||||
characters may speak, act, withdraw, stay silent, use violence, or combine
|
||||
speech and action when state and scene pressure justify it.
|
||||
- Use a frontier teacher model to produce reviewed projection artifacts from
|
||||
structured state and lore grounding digests.
|
||||
- Save accepted and rejected projection examples as supervised data.
|
||||
|
|
|
|||
|
|
@ -60,6 +60,8 @@
|
|||
"projection_mode": {
|
||||
"enum": [
|
||||
"dialogue_turn",
|
||||
"response_turn",
|
||||
"action_turn",
|
||||
"scene_beat",
|
||||
"drama_scaffold"
|
||||
]
|
||||
|
|
@ -160,6 +162,16 @@
|
|||
"type": "string",
|
||||
"minLength": 1
|
||||
},
|
||||
"response_kind": {
|
||||
"enum": [
|
||||
"speech",
|
||||
"action",
|
||||
"silence",
|
||||
"withdrawal",
|
||||
"violence",
|
||||
"mixed"
|
||||
]
|
||||
},
|
||||
"pressure_basis": {
|
||||
"type": "string",
|
||||
"minLength": 1
|
||||
|
|
|
|||
|
|
@ -25,3 +25,4 @@
|
|||
{"ts": "2026-05-01T20:31:43+00:00", "type": "design", "status": "accepted", "note": "Revised Aetheria projection-training architecture: grounded training data should start from authored historical lore flashpoints, while Elysium gameplay-era scenes such as Cat/Oz are procedural branch material unless explicitly promoted. Next step is a lore grounding digest format and first historical flashpoint selection."}
|
||||
{"ts": "2026-05-01T20:38:47+00:00", "type": "implementation", "status": "accepted", "note": "Added ghostlight.lore_grounding_digest.v0 schema, template, human format guide, and validator. Lore digests now explicitly model cultural pressure fields, factional misread maps, role pressures, speaker lore boundaries, and author-only exclusions. Next step is choosing the first authored historical Aetheria flashpoint and filling a real digest."}
|
||||
{"ts": "2026-05-01T20:50:46+00:00", "type": "design", "status": "accepted", "note": "Cold Wake Panic is selected as the first historical grounding fixture. Use it as pre-Elysium projection training feedstock via examples/lore-grounding/cold-wake-panic.ganymede-corridor.json, not as the active Ghostlight game target."}
|
||||
{"ts": "2026-05-01T21:16:24+00:00", "type": "experiment", "status": "mixed", "note": "Cold Wake story-lab first Qwen response confirmed response_turn/action affordances are useful: qwen3.5:9b produced a mixed terminal-blocking plus dialogue beat for Maer. Failure lesson: personhood-pressure wording was too strong and let the model imply the artifact was a person instead of preserving unresolved suspicion."}
|
||||
|
|
|
|||
|
|
@ -86,6 +86,7 @@ accepted_design:
|
|||
- Dialogue context packs are positive-context payloads; unknown or author-only material is omitted rather than listed as forbidden context, while known secrets are handled through goals, memories, beliefs, and presentation constraints.
|
||||
- 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 must allow characters to act, not only speak; response turns can be dialogue, action, silence, withdrawal, violence, or mixed beats when state and scene pressure justify them.
|
||||
- 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.
|
||||
|
|
@ -94,7 +95,8 @@ accepted_design:
|
|||
- Aetheria projection training has two modes: historical grounded fixtures from authored lore, and procedural Elysium branch fixtures that test generation without canonizing gameplay-era outcomes.
|
||||
- Lore grounding digests use `ghostlight.lore_grounding_digest.v0` records to distill authored lore into cultural pressure fields, factional misread maps, role pressures, speaker knowledge boundaries, and author-only exclusions.
|
||||
- The Cold Wake Panic is the first chosen historical grounding fixture: a draft Ganymede corridor digest now models thermal stealth panic, insurer category failure, Navigator rescue obligation, Lightsail reliability pressure, Aya-coded care pressure, pirate porosity, Cognitum firmware denial, and Cryonix/Rossum certification culture.
|
||||
- The Cold Wake story lab uses Maer Tidecall as protagonist across a four-scene arc: tribunal freeze, sanctuary intake, Callisto provenance, and convoy threshold. The first Qwen run produced a useful mixed action/dialogue beat and exposed a prompt weakness around unresolved personhood suspicion.
|
||||
|
||||
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, and a documented teacher/student distillation path for projection.
|
||||
next_action: Choose one room inside the Cold Wake Panic and build the first grounded projection fixture from the Ganymede corridor digest.
|
||||
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, and a first Qwen response capture testing action-capable projection.
|
||||
next_action: Tighten the Cold Wake story-lab projection prompt around unresolved personhood suspicion, then run the next response turn through Qwen and keep accepted or rejected outputs as training data.
|
||||
|
|
|
|||
1093
tools/build_cold_wake_story_lab_fixture.py
Normal file
1093
tools/build_cold_wake_story_lab_fixture.py
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -14,7 +14,7 @@ from typing import Any
|
|||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
REQUIRED_FIELDS_PATH = ROOT / "schemas" / "agent-state.required-fields.json"
|
||||
DEFAULT_EXAMPLES = [ROOT / "examples" / "agent-state.call-of-the-void.json"]
|
||||
DEFAULT_EXAMPLES = sorted((ROOT / "examples").glob("agent-state*.json"))
|
||||
|
||||
|
||||
class ValidationError(Exception):
|
||||
|
|
|
|||
|
|
@ -14,9 +14,7 @@ from typing import Any
|
|||
|
||||
|
||||
ROOT = Path(__file__).resolve().parents[1]
|
||||
DEFAULT_EXAMPLES = [
|
||||
ROOT / "examples" / "projections" / "call-of-the-void.scene-broken-taxi-oz.jsonl"
|
||||
]
|
||||
DEFAULT_EXAMPLES = sorted((ROOT / "examples" / "projections").glob("*.jsonl"))
|
||||
|
||||
|
||||
class ValidationError(Exception):
|
||||
|
|
@ -99,7 +97,10 @@ def validate_projection_record(record: dict[str, Any], source: Path, index: int)
|
|||
["fixture_ref", "scene_id", "speaker_agent_id", "listener_ids", "projection_mode"],
|
||||
f"{path}.input",
|
||||
)
|
||||
require(input_ref["projection_mode"] in {"dialogue_turn", "scene_beat", "drama_scaffold"}, f"{path}.input.projection_mode is invalid")
|
||||
require(
|
||||
input_ref["projection_mode"] in {"dialogue_turn", "response_turn", "action_turn", "scene_beat", "drama_scaffold"},
|
||||
f"{path}.input.projection_mode is invalid",
|
||||
)
|
||||
|
||||
fixture_path = (ROOT / input_ref["fixture_ref"]).resolve()
|
||||
require(fixture_path.exists(), f"{path}.input.fixture_ref does not exist: {input_ref['fixture_ref']}")
|
||||
|
|
|
|||
Loading…
Reference in a new issue