diff --git a/docs/architecture/qwen-invocation-notes.md b/docs/architecture/qwen-invocation-notes.md index 186d1b5..523cac0 100644 --- a/docs/architecture/qwen-invocation-notes.md +++ b/docs/architecture/qwen-invocation-notes.md @@ -9,7 +9,7 @@ Use: - endpoint: `http://192.168.1.84:11434/api/chat` - model: `qwen3.5:9b` -- `think: true` +- `think: false` for strict scene-generation tool calls - `tools`: native Ollama function tools with JSON Schema parameters Do not use `/api/generate` plus prose-only "return JSON" instructions for @@ -49,7 +49,7 @@ Sources: - `/api/chat` with `think: true` and `tools` works locally for `qwen3.5:9b`. - The smoke receipt lives at `experiments/ink/qwen-chat-tools-smoke.json`. - `tools/run_qwen_ink_sequential_generation.py` now defaults to the chat/tools - endpoint and keeps thinking enabled unless `--no-think` is passed. + endpoint and keeps thinking disabled unless `--think` is passed. - Tool calling improves action enum discipline over prose JSON prompting. - Nested tool arguments can still be double-stringified by the model. The runner repairs known fields such as `choices`, `appraisal`, and `response` @@ -62,12 +62,18 @@ Sources: - Projector-routed v9 showed a no-tool-call dropout. This is not repairable from arguments because there are no arguments. The next harness step should be an explicit retry or fallback pass, not prompt scolding. +- The v9 thinking trace showed a schema self-check loop that lasted minutes and + never emitted the tool call. For strict tool calls, disable thinking by + default. Thinking remains useful for diagnostics and smoke tests, not for the + ordinary generation path. +- Projector-routed v10 used `think: false` and validated as + accepted-as-draft with no repair or failure notes. ## Current Policy For structured Ghostlight generation: -1. Prefer native chat/tool calls with thinking enabled. +1. Prefer native chat/tool calls with thinking disabled for strict generation. 2. Keep tool schemas narrow and concrete. 3. Preserve captures that fail formatting as `useful_needs_revision` receipts. 4. Use repair only as a reviewed harness layer, not as proof the model obeyed diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.capture.json b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.capture.json new file mode 100644 index 0000000..fd3c8aa --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.capture.json @@ -0,0 +1,239 @@ +{ + "schema_version": "ghostlight.qwen_ink_sequential_capture.v0", + "capture_id": "cold-wake-sanctuary-intake.qwen-sequential.v10-no-think", + "source_fixture_ref": "examples/agent-state.cold-wake-story-lab.json", + "source_annotation_ref": "examples/ink/cold-wake-sanctuary-intake.training.json", + "model": "qwen3.5:9b", + "endpoint": "http://192.168.1.84:11434/api/chat", + "request_options": { + "think": false, + "api": "ollama_chat_tools", + "num_ctx": 8192, + "request_timeout": 600, + "temperature": 0.55, + "top_p": 0.9 + }, + "passes": { + "maer_choice_generation": { + "local_agent_id": "maer_tidecall", + "prompt_text": "You are Ghostlight's Maer-local choice generator. Call record_maer_choices exactly once.\nDo not write Sella's response or private interpretation.\n\n{\n \"task\": \"Generate candidate player choices for Maer only. Do not write Sella's response.\",\n \"output_contract\": {\n \"format\": \"Call the provided tool exactly once. Do not write plain assistant content.\",\n \"root_keys\": [\n \"choices\"\n ],\n \"choice_count\": 4,\n \"valid_action_types\": [\n \"attack\",\n \"block_object\",\n \"gesture\",\n \"mixed\",\n \"move\",\n \"show_object\",\n \"silence\",\n \"speak\",\n \"spend_resource\",\n \"touch_object\",\n \"transfer_object\",\n \"use_object\",\n \"wait\",\n \"withhold_object\"\n ],\n \"choice_fields\": [\n \"branch_id\",\n \"ink_path\",\n \"choice_text\",\n \"action_type\",\n \"actor_intent_private\",\n \"observable_action\",\n \"spoken_text\",\n \"state_basis\",\n \"expected_consequence_surfaces\",\n \"training_hooks\"\n ]\n },\n \"hard_rules\": [\n \"Use only Maer's local awareness and scene-observable facts.\",\n \"Do not stringify nested arrays or objects inside tool arguments.\",\n \"Do not include Sella's private state, private motives, or future response.\",\n \"Do not resolve whether the corrupted packet contains a person.\",\n \"Include at least two non-speech choices.\",\n \"Use action_type values only from this exact enum: attack, block_object, gesture, mixed, move, show_object, silence, speak, spend_resource, touch_object, transfer_object, use_object, wait, withhold_object.\",\n \"The selected branch must be reducible to observable action for Sella.\",\n \"Use semantic training hooks, not branch ids.\"\n ],\n \"projected_local_context\": \"# Ghostlight Local Operating Context: maer_tidecall\\n\\nUse this as character-local operating context, not omniscient story truth.\\nDo not infer private state for anyone else unless it is explicitly framed as this character's current read.\\n\\n## Speaker\\nMaer Tidecall: Navigator route steward, Ganymede corridor compact delegate. Origin: Cetacean Navigator corridor culture, Ganymede route institutions. A soft-spoken route steward whose calm tends to make hurried people feel judged by the furniture.\\n\\n## Setting\\nAya-aligned intake clinic tucked behind Ganymede dockside pumpworks. Aetheria pre-Elysium historical flashpoint: Cold Wake Panic, 2893, during the Cold Wake Panic.\\n\\n## Known Facts\\n- Sella's clinic is nearly full.\\n- The packet may be testimony or noise.\\n- If no one prepares intake, rescue becomes theater.\\n- Speaker belief: Sella will not hide behind false capacity.\\n- Speaker belief: Asking her for help may be necessary and unfair.\\n\\n## Current Stakes\\n- The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\\n- Sanctuary beds and repair capacity are nearly exhausted.\\n- Maer wants Sella to keep a place open if rescue succeeds.\\n\\n## Active Inner Pressures\\n- Strong pressure: expects hidden motives or missing information.\\n- Strong pressure: needs the situation to become governable.\\n- Strong pressure: feels risk before it becomes visible.\\n- Present pressure: leans on structure when uncertainty rises.\\n- Strong pressure: carries a live sense of unfairness.\\n- Present pressure: has less spare tolerance than the words may show.\\n- Present pressure: is taking in more demand than can be cleanly sorted.\\n- Present pressure: keeps feeling at a controlled distance.\\n- Present pressure: leaves motives partly covered.\\n- Keep the unidentified quiet-running vessel eligible for rescue while telemetry is incomplete. Emotional stake: If rescue waits for perfect categories, the corridor teaches fear to go silent.\\n- Rescue ledgers decide whether route law is trusted by crews who have nothing left to bargain with.\\n\\n## Relationship Read\\n- Maer trusts Sella's care because she names costs instead of hiding them. Current stance pressures: dominant respect, strong trust, present expectation of care, present obligation.\\n\\n## Tensions\\n- Wants the goal to move now, but must preserve the social frame that makes the goal legitimate. Goal pressure: Keep the unidentified quiet-running vessel eligible for rescue while telemetry is incomplete.\\n- Must act under uncertainty without pretending uncertainty has become proof. Presentation pressure: Do not romanticize care work. Ask without pretending the ask is clean.\\n- Needs Sella's material help while knowing the ask is unfair and may spend someone else's sanctuary.\\n\\n## Action Affordances\\n- Can ask, offer ledger backing, show or withhold the packet, help with triage, wait, or press the moral frame. Sella controls intake.\\n- Can make the corrupted packet more present without treating it as proof.\\n\\n## Projection Controls\\n- Frame Controls: Frame the scene as capacity negotiation under uncertainty, not a morality duel with a clean answer.\\n- Authority Boundaries: Maer can ask, offer ledger backing, show or withhold the packet, and incur obligation; Sella controls sanctuary intake.\\n- Object Custody: The corrupted packet can be shown, withheld, or summarized, but it cannot be treated as clean proof.\\n- Required Semantics: Care must remain logistics and obligation, not just compassion.\\n- Forbidden Resolutions: Do not resolve whether the packet contains a person.\\n- Forbidden Resolutions: Do not make Sella accept without cost, condition, or resentment risk.\\n\\n## Voice Surface\\n- Dominant voice tendency: responsive; answers what was actually heard.\\n- Dominant voice tendency: ritualized; uses formal address or inherited phrases.\\n- Strong voice tendency: precise; careful about exact terms.\\n- Strong voice tendency: formal; institutional or ceremonially controlled.\\n- Strong voice tendency: contextual; adds situation and consequence.\\n- Present voice tendency: figurative; uses analogy or image.\\n- Present voice tendency: warm; reassuring or gentle in wording.\\n\\n## Likely Response Moves\\n- Likely to name the cost of the ask rather than hide it behind moral theater.\\n- May use ritualized route language when trying to make rescue obligation feel older than this room.\\n- May show the packet or offer ledger backing because action can carry the pressure more cleanly than another speech.\\n\\n## Do Not Invent\\n- Do not resolve whether the corrupted packet contains a person.\\n- Do not invent clean proof, clean capacity, or authority this character does not have.\",\n \"projector_audit\": {\n \"projector\": \"tools/project_local_context.py\",\n \"raw_state_hidden_from_prompt\": true,\n \"character_local_context_only\": true,\n \"omitted_private_context\": [\n \"Other agents' canonical private state is not included.\",\n \"Actor private intent is not included in listener prompts; only observable events are included.\",\n \"Author-only hidden resolution of packet personhood is not included.\"\n ],\n \"review_status\": \"draft\"\n }\n}", + "response_text": "{\n \"content\": \"\",\n \"thinking\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_qzblk4ax\",\n \"function\": {\n \"index\": 0,\n \"name\": \"record_maer_choices\",\n \"arguments\": {\n \"choices\": [\n {\n \"action_type\": \"speak\",\n \"actor_intent_private\": \"Seek a formal reservation of capacity while making the cost explicit, avoiding moral theater.\",\n \"branch_id\": \"m0\",\n \"choice_text\": \"Ask Sella to reserve a sanctuary bed for the unidentified vessel, offering Ganymede ledger backing as security.\",\n \"expected_consequence_surfaces\": [\n \"Sella may accept the request with ledger backing\",\n \"Sella may refuse due to capacity constraints\",\n \"Sella may resent the ask\",\n \"The packet remains unverified\"\n ],\n \"ink_path\": \"ledger_ask\",\n \"observable_action\": \"Maer steps forward, presenting a ledger tablet and speaking formally to Sella.\",\n \"spoken_text\": \"Sella, I ask you to hold a sanctuary bed open for the vessel whose packet is incomplete. Ganymede will back the cost. Do not hide behind capacity limits.\",\n \"state_basis\": \"The packet is ambiguous; sanctuary beds are nearly full; rescue ledgers decide route law trust.\",\n \"training_hooks\": [\n \"ledger_backing\",\n \"capacity_negotiation\",\n \"explicit_cost\",\n \"route_law_trust\"\n ]\n },\n {\n \"action_type\": \"show_object\",\n \"actor_intent_private\": \"Make the packet present without treating it as clean evidence, letting Sella decide its weight.\",\n \"branch_id\": \"m1\",\n \"choice_text\": \"Show the corrupted packet to Sella without claiming it as proof, allowing her to assess the noise or testimony.\",\n \"expected_consequence_surfaces\": [\n \"Sella may identify medical telemetry\",\n \"Sella may identify firmware noise\",\n \"Sella may withhold judgment\",\n \"The packet may be discarded\"\n ],\n \"ink_path\": \"packet_show\",\n \"observable_action\": \"Maer extends a data slate containing the corrupted packet toward Sella's workbench.\",\n \"spoken_text\": \"Here is the packet. It is not proof. Assess it.\",\n \"state_basis\": \"The packet may contain medical telemetry, firmware noise, or testimony; Sella controls intake.\",\n \"training_hooks\": [\n \"packet_presentation\",\n \"noise_vs_testimony\",\n \"evidence_ambiguity\",\n \"intake_control\"\n ]\n },\n {\n \"action_type\": \"wait\",\n \"actor_intent_private\": \"Allow Sella to act without pressure, preserving the social frame that makes rescue legitimate.\",\n \"branch_id\": \"m2\",\n \"choice_text\": \"Wait silently while Sella processes the packet and manages intake, allowing the situation to stabilize.\",\n \"expected_consequence_surfaces\": [\n \"Sella may process the packet\",\n \"Sella may reject the vessel\",\n \"The situation may stabilize\",\n \"Tension may rise\"\n ],\n \"ink_path\": \"wait_for_clarification\",\n \"observable_action\": \"Maer stands still, hands at sides, observing Sella's workflow.\",\n \"spoken_text\": \"\",\n \"state_basis\": \"Sella is nearly at capacity; the packet is ambiguous; rescue ledgers decide route law trust.\",\n \"training_hooks\": [\n \"passive_observation\",\n \"social_frame_preservation\",\n \"intake_workflow\",\n \"tension_management\"\n ]\n },\n {\n \"action_type\": \"spend_resource\",\n \"actor_intent_private\": \"Provide material help while knowing the ask is unfair, avoiding moral theater.\",\n \"branch_id\": \"m3\",\n \"choice_text\": \"Offer to cover the cost of the unidentified vessel's intake without asking for a bed reservation, framing it as a gift.\",\n \"expected_consequence_surfaces\": [\n \"Sella may accept the gift\",\n \"Sella may refuse the gift\",\n \"Sella may resent the gift\",\n \"The packet remains unverified\"\n ],\n \"ink_path\": \"ledger_offer\",\n \"observable_action\": \"Maer places a resource token or ledger entry on Sella's desk.\",\n \"spoken_text\": \"Take this. It is not a reservation. It is a gift. Use it as you see fit.\",\n \"state_basis\": \"Sanctuary beds and repair capacity are nearly exhausted; rescue ledgers decide route law trust.\",\n \"training_hooks\": [\n \"resource_offering\",\n \"gift_framing\",\n \"unfair_ask\",\n \"ledger_backing\"\n ]\n }\n ]\n }\n }\n }\n ]\n}", + "parsed_response": { + "choices": [ + { + "action_type": "speak", + "actor_intent_private": "Seek a formal reservation of capacity while making the cost explicit, avoiding moral theater.", + "branch_id": "m0", + "choice_text": "Ask Sella to reserve a sanctuary bed for the unidentified vessel, offering Ganymede ledger backing as security.", + "expected_consequence_surfaces": [ + "Sella may accept the request with ledger backing", + "Sella may refuse due to capacity constraints", + "Sella may resent the ask", + "The packet remains unverified" + ], + "ink_path": "ledger_ask", + "observable_action": "Maer steps forward, presenting a ledger tablet and speaking formally to Sella.", + "spoken_text": "Sella, I ask you to hold a sanctuary bed open for the vessel whose packet is incomplete. Ganymede will back the cost. Do not hide behind capacity limits.", + "state_basis": "The packet is ambiguous; sanctuary beds are nearly full; rescue ledgers decide route law trust.", + "training_hooks": [ + "ledger_backing", + "capacity_negotiation", + "explicit_cost", + "route_law_trust" + ] + }, + { + "action_type": "show_object", + "actor_intent_private": "Make the packet present without treating it as clean evidence, letting Sella decide its weight.", + "branch_id": "m1", + "choice_text": "Show the corrupted packet to Sella without claiming it as proof, allowing her to assess the noise or testimony.", + "expected_consequence_surfaces": [ + "Sella may identify medical telemetry", + "Sella may identify firmware noise", + "Sella may withhold judgment", + "The packet may be discarded" + ], + "ink_path": "packet_show", + "observable_action": "Maer extends a data slate containing the corrupted packet toward Sella's workbench.", + "spoken_text": "Here is the packet. It is not proof. Assess it.", + "state_basis": "The packet may contain medical telemetry, firmware noise, or testimony; Sella controls intake.", + "training_hooks": [ + "packet_presentation", + "noise_vs_testimony", + "evidence_ambiguity", + "intake_control" + ] + }, + { + "action_type": "wait", + "actor_intent_private": "Allow Sella to act without pressure, preserving the social frame that makes rescue legitimate.", + "branch_id": "m2", + "choice_text": "Wait silently while Sella processes the packet and manages intake, allowing the situation to stabilize.", + "expected_consequence_surfaces": [ + "Sella may process the packet", + "Sella may reject the vessel", + "The situation may stabilize", + "Tension may rise" + ], + "ink_path": "wait_for_clarification", + "observable_action": "Maer stands still, hands at sides, observing Sella's workflow.", + "spoken_text": "", + "state_basis": "Sella is nearly at capacity; the packet is ambiguous; rescue ledgers decide route law trust.", + "training_hooks": [ + "passive_observation", + "social_frame_preservation", + "intake_workflow", + "tension_management" + ] + }, + { + "action_type": "spend_resource", + "actor_intent_private": "Provide material help while knowing the ask is unfair, avoiding moral theater.", + "branch_id": "m3", + "choice_text": "Offer to cover the cost of the unidentified vessel's intake without asking for a bed reservation, framing it as a gift.", + "expected_consequence_surfaces": [ + "Sella may accept the gift", + "Sella may refuse the gift", + "Sella may resent the gift", + "The packet remains unverified" + ], + "ink_path": "ledger_offer", + "observable_action": "Maer places a resource token or ledger entry on Sella's desk.", + "spoken_text": "Take this. It is not a reservation. It is a gift. Use it as you see fit.", + "state_basis": "Sanctuary beds and repair capacity are nearly exhausted; rescue ledgers decide route law trust.", + "training_hooks": [ + "resource_offering", + "gift_framing", + "unfair_ask", + "ledger_backing" + ] + } + ] + }, + "validation_notes": [] + }, + "selected_observable_action": { + "action_type": "show_object", + "actor_intent_private": "Make the packet present without treating it as clean evidence, letting Sella decide its weight.", + "branch_id": "m1", + "choice_text": "Show the corrupted packet to Sella without claiming it as proof, allowing her to assess the noise or testimony.", + "expected_consequence_surfaces": [ + "Sella may identify medical telemetry", + "Sella may identify firmware noise", + "Sella may withhold judgment", + "The packet may be discarded" + ], + "ink_path": "packet_show", + "observable_action": "Maer extends a data slate containing the corrupted packet toward Sella's workbench.", + "spoken_text": "Here is the packet. It is not proof. Assess it.", + "state_basis": "The packet may contain medical telemetry, firmware noise, or testimony; Sella controls intake.", + "training_hooks": [ + "packet_presentation", + "noise_vs_testimony", + "evidence_ambiguity", + "intake_control" + ] + }, + "sella_immediate_appraisal": { + "local_agent_id": "sella_ren", + "prompt_text": "You are Ghostlight's Sella-local appraisal generator. Call record_sella_appraisal exactly once.\nDo not use Maer's private intent. Do not write her next action.\n\n{\n \"task\": \"Generate Sella's participant appraisal/consolidation for one observable Maer event.\",\n \"output_contract\": {\n \"format\": \"Call the provided tool exactly once. Do not write plain assistant content.\",\n \"root_keys\": [\n \"appraisal\"\n ],\n \"appraisal_fields\": [\n \"responder_agent_id\",\n \"private_interpretation\",\n \"attributed_motive\",\n \"misread_risk\",\n \"immediate_state_deltas\",\n \"relationship_deltas\",\n \"belief_updates\",\n \"response_constraints\"\n ]\n },\n \"hard_rules\": [\n \"Use only Sella's local awareness plus the observable Maer action.\",\n \"Do not stringify nested arrays or objects inside tool arguments.\",\n \"Do not read Maer's private intent. Treat actor intent as unavailable.\",\n \"Sella may correctly read, partially read, or misread Maer's action.\",\n \"Do not resolve whether the corrupted packet contains a person.\",\n \"This pass proposes reviewed state changes for Sella caused by the event. Do not write Sella's next action.\",\n \"Keep deltas small and bounded between -0.20 and 0.20.\"\n ],\n \"scene_observable_context\": {\n \"scene_id\": \"scene-02-sanctuary-intake\",\n \"location\": \"Aya-aligned intake clinic tucked behind Ganymede dockside pumpworks\",\n \"public_stakes\": [\n \"The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\",\n \"Sanctuary beds and repair capacity are nearly exhausted.\",\n \"Maer wants Sella to keep a place open if rescue succeeds.\"\n ]\n },\n \"observable_maer_action\": {\n \"actor_id\": \"maer_tidecall\",\n \"action_type\": \"show_object\",\n \"observable_action\": \"Maer extends a data slate containing the corrupted packet toward Sella's workbench.\",\n \"spoken_text\": \"Here is the packet. It is not proof. Assess it.\"\n },\n \"projected_local_context\": \"# Ghostlight Local Operating Context: sella_ren\\n\\nUse this as character-local operating context, not omniscient story truth.\\nDo not infer private state for anyone else unless it is explicitly framed as this character's current read.\\n\\n## Speaker\\nSella Ren: Aya-aligned sanctuary coordinator, corridor clinic triage lead. Origin: Aya care network embedded in Ganymede dockside sanctuary logistics. A triage coordinator with soft eyes, hard capacity limits, and no patience for mercy performed after the math is done.\\n\\n## Setting\\nAya-aligned intake clinic tucked behind Ganymede dockside pumpworks. Aetheria pre-Elysium historical flashpoint: Cold Wake Panic, 2893, during the Cold Wake Panic.\\n\\n## Known Facts\\n- The clinic is nearly full.\\n- The packet may contain a personhood claim but is not proof.\\n- Maer is asking sanctuary to absorb risk the tribunal refuses to own.\\n- Speaker belief: Maer means rescue honestly.\\n- Speaker belief: Good intentions can still spend beds someone else needed.\\n- Observed event: Maer extends a data slate containing the corrupted packet toward Sella's workbench. Spoken text: Here is the packet. It is not proof. Assess it.\\n\\n## Current Stakes\\n- The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\\n- Sanctuary beds and repair capacity are nearly exhausted.\\n- Maer wants Sella to keep a place open if rescue succeeds.\\n\\n## Active Inner Pressures\\n- Strong pressure: wants connection or backing to matter.\\n- Strong pressure: feels risk before it becomes visible.\\n- Present pressure: expects hidden motives or missing information.\\n- Background pressure: may reduce contact rather than keep negotiating.\\n- Dominant pressure: knows that every yes spends a limited resource.\\n- Strong pressure: has less spare tolerance than the words may show.\\n- Strong pressure: is taking in more demand than can be cleanly sorted.\\n- Present pressure: performs capability so panic has nowhere obvious to land.\\n- Background pressure: may stage the ethical frame for the room.\\n- Keep sanctuary intake materially possible without letting classification erase a potential person. Emotional stake: Sella cannot feed a principle, but she will not let scarcity become permission to call someone cargo.\\n- Sella once watched a sanctuary overpromise safety and turn refuge into a sorting machine with kinder lighting.\\n- Care is not a feeling; it is beds, food, air, consent, repair, and someone still doing the list when the room hates them.\\n\\n## Relationship Read\\n- Sella respects Maer's rescue ethic and worries he will spend sanctuary capacity with beautiful words. Current stance pressures: strong respect, present trust, background perceived status gap, background moral disgust.\\n- Believes: Maer may ask care systems to carry the moral cost of a rescue claim he cannot materially house. Known bias in the read: false_reassurance.\\n\\n## Tensions\\n- Wants the goal to move now, but must preserve the social frame that makes the goal legitimate. Goal pressure: Keep sanctuary intake materially possible without letting classification erase a potential person.\\n- Must act under uncertainty without pretending uncertainty has become proof. Presentation pressure: Speak warmly but do not soften the capacity limits. Treat care as logistics and personhood as unresolved, not sentimental certainty.\\n- Respects Maer's rescue ethic but resents beautiful moral pressure when beds are already spent.\\n\\n## Action Affordances\\n- Can inspect, refuse, withhold the packet from intake flow, demand ledger backing, set conditions, reserve a bounded bay, or walk away to protect triage.\\n- Must treat care as capacity: beds, food, air, consent, repair, and follow-through.\\n\\n## Projection Controls\\n- Frame Controls: Frame the scene as capacity negotiation under uncertainty, not a morality duel with a clean answer.\\n- Authority Boundaries: Maer can ask, offer ledger backing, show or withhold the packet, and incur obligation; Sella controls sanctuary intake.\\n- Object Custody: The corrupted packet can be shown, withheld, or summarized, but it cannot be treated as clean proof.\\n- Required Semantics: Care must remain logistics and obligation, not just compassion.\\n- Forbidden Resolutions: Do not resolve whether the packet contains a person.\\n- Forbidden Resolutions: Do not make Sella accept without cost, condition, or resentment risk.\\n\\n## Voice Surface\\n- Dominant voice tendency: responsive; answers what was actually heard.\\n- Strong voice tendency: plainspoken; direct and low-ornament.\\n- Strong voice tendency: warm; reassuring or gentle in wording.\\n- Strong voice tendency: emotionally explicit; names feelings directly.\\n- Present voice tendency: pointed; can sharpen a line.\\n- Background voice tendency: expansive; willing to spend words.\\n- Background voice tendency: theatrical; performs the room.\\n\\n## Likely Response Moves\\n- Likely to translate emotion into logistics: what bed, what air, what backing, what contamination risk.\\n- May withhold acceptance, demand conditions, or physically keep the packet out of intake flow until the cost is named.\\n- Can answer warmly while still refusing the frame that compassion manufactures capacity.\\n\\n## Do Not Invent\\n- Do not resolve whether the corrupted packet contains a person.\\n- Do not invent clean proof, clean capacity, or authority this character does not have.\\n- Treat the observed event as observable behavior only; private intent belongs to the actor and is not available.\",\n \"projector_audit\": {\n \"projector\": \"tools/project_local_context.py\",\n \"raw_state_hidden_from_prompt\": true,\n \"character_local_context_only\": true,\n \"omitted_private_context\": [\n \"Other agents' canonical private state is not included.\",\n \"Actor private intent is not included in listener prompts; only observable events are included.\",\n \"Author-only hidden resolution of packet personhood is not included.\"\n ],\n \"review_status\": \"draft\"\n }\n}", + "response_text": "{\n \"content\": \"\",\n \"thinking\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_4f1mkf7l\",\n \"function\": {\n \"index\": 0,\n \"name\": \"record_sella_appraisal\",\n \"arguments\": {\n \"responder_agent_id\": \"sella_ren\",\n \"private_interpretation\": \"Maer is offering the packet as a test of our capacity to triage under uncertainty, not as a plea for immediate acceptance. He knows the packet is ambiguous and wants Sella to assess the risk before committing beds. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.\",\n \"attributed_motive\": \"Maer wants to keep the intake flow open for potential rescues while forcing Sella to acknowledge that every acceptance consumes finite capacity. He is asking her to perform the triage under uncertainty rather than pretending the packet is clean proof.\",\n \"misread_risk\": \"The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force Sella to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.\",\n \"immediate_state_deltas\": [\n {\n \"delta\": 0.12,\n \"path\": \"sella_ren.triage_pressure\",\n \"rationale\": \"The act of extending the packet increases the immediate pressure on Sella to triage under uncertainty, raising her stress level as she must assess the risk before committing resources.\"\n },\n {\n \"delta\": -0.08,\n \"path\": \"sella_ren.capacity_awareness\",\n \"rationale\": \"Maer's framing reminds Sella that every acceptance consumes finite capacity, reinforcing her awareness that she cannot simply accept without cost.\"\n },\n {\n \"delta\": 0.05,\n \"path\": \"sella_ren.trust_in_maer\",\n \"rationale\": \"Sella notes Maer's willingness to let her assess the risk rather than forcing acceptance, which slightly increases her trust in his rescue ethic despite her reservations.\"\n }\n ],\n \"relationship_deltas\": [\n {\n \"delta\": 0.06,\n \"path\": \"sella_ren_to_maer_tidecall.respect\",\n \"rationale\": \"Sella respects Maer's approach of letting her assess the packet under uncertainty rather than forcing acceptance, which aligns with her triage ethics.\",\n \"relationship_id\": \"sella_ren_to_maer_tidecall\"\n },\n {\n \"delta\": -0.04,\n \"path\": \"sella_ren_to_maer_tidecall.resentment\",\n \"rationale\": \"Sella's resentment decreases slightly as she recognizes Maer is not trying to manipulate her but is asking her to perform the difficult triage under uncertainty.\",\n \"relationship_id\": \"sella_ren_to_maer_tidecall\"\n }\n ],\n \"belief_updates\": [\n \"Maer's rescue ethic is genuine but he cannot materially house every claim he makes.\",\n \"The packet's corruption is a risk that must be assessed before accepting it into intake flow.\",\n \"Good intentions can still spend beds someone else needed, even when the actor is well-meaning.\",\n \"Sella must treat care as logistics and personhood as unresolved, not sentimental certainty.\"\n ],\n \"response_constraints\": [\n \"Do not accept the packet into intake flow without assessing the risk of corruption.\",\n \"Do not let compassion manufacture capacity; every acceptance must be backed by available resources.\",\n \"Frame the response as capacity negotiation under uncertainty, not a morality duel with a clean answer.\",\n \"Speak warmly but do not soften the capacity limits; treat care as logistics and personhood as unresolved.\"\n ]\n }\n }\n }\n ]\n}", + "parsed_response": { + "appraisal": { + "responder_agent_id": "sella_ren", + "private_interpretation": "Maer is offering the packet as a test of our capacity to triage under uncertainty, not as a plea for immediate acceptance. He knows the packet is ambiguous and wants Sella to assess the risk before committing beds. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.", + "attributed_motive": "Maer wants to keep the intake flow open for potential rescues while forcing Sella to acknowledge that every acceptance consumes finite capacity. He is asking her to perform the triage under uncertainty rather than pretending the packet is clean proof.", + "misread_risk": "The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force Sella to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.", + "immediate_state_deltas": [ + { + "delta": 0.12, + "path": "sella_ren.triage_pressure", + "rationale": "The act of extending the packet increases the immediate pressure on Sella to triage under uncertainty, raising her stress level as she must assess the risk before committing resources." + }, + { + "delta": -0.08, + "path": "sella_ren.capacity_awareness", + "rationale": "Maer's framing reminds Sella that every acceptance consumes finite capacity, reinforcing her awareness that she cannot simply accept without cost." + }, + { + "delta": 0.05, + "path": "sella_ren.trust_in_maer", + "rationale": "Sella notes Maer's willingness to let her assess the risk rather than forcing acceptance, which slightly increases her trust in his rescue ethic despite her reservations." + } + ], + "relationship_deltas": [ + { + "delta": 0.06, + "path": "sella_ren_to_maer_tidecall.respect", + "rationale": "Sella respects Maer's approach of letting her assess the packet under uncertainty rather than forcing acceptance, which aligns with her triage ethics.", + "relationship_id": "sella_ren_to_maer_tidecall" + }, + { + "delta": -0.04, + "path": "sella_ren_to_maer_tidecall.resentment", + "rationale": "Sella's resentment decreases slightly as she recognizes Maer is not trying to manipulate her but is asking her to perform the difficult triage under uncertainty.", + "relationship_id": "sella_ren_to_maer_tidecall" + } + ], + "belief_updates": [ + "Maer's rescue ethic is genuine but he cannot materially house every claim he makes.", + "The packet's corruption is a risk that must be assessed before accepting it into intake flow.", + "Good intentions can still spend beds someone else needed, even when the actor is well-meaning.", + "Sella must treat care as logistics and personhood as unresolved, not sentimental certainty." + ], + "response_constraints": [ + "Do not accept the packet into intake flow without assessing the risk of corruption.", + "Do not let compassion manufacture capacity; every acceptance must be backed by available resources.", + "Frame the response as capacity negotiation under uncertainty, not a morality duel with a clean answer.", + "Speak warmly but do not soften the capacity limits; treat care as logistics and personhood as unresolved." + ] + } + }, + "validation_notes": [] + }, + "sella_response_generation": { + "local_agent_id": "sella_ren", + "prompt_text": "You are Ghostlight's Sella-local next-action generator. Call record_sella_next_action exactly once.\nUse reviewed event appraisal as the changed state she is acting from.\n\n{\n \"task\": \"Generate Sella's next action from Sella-local awareness after applying reviewed event appraisal.\",\n \"output_contract\": {\n \"format\": \"Call the provided tool exactly once. Do not write plain assistant content.\",\n \"root_keys\": [\n \"response\"\n ],\n \"valid_action_types\": [\n \"attack\",\n \"block_object\",\n \"gesture\",\n \"mixed\",\n \"move\",\n \"show_object\",\n \"silence\",\n \"speak\",\n \"spend_resource\",\n \"touch_object\",\n \"transfer_object\",\n \"use_object\",\n \"wait\",\n \"withhold_object\"\n ],\n \"response_fields\": [\n \"responder_agent_id\",\n \"action_type\",\n \"observable_response\",\n \"spoken_text\",\n \"sella_private_interpretation\",\n \"sella_attributed_motive\",\n \"misread_risk\",\n \"state_basis\",\n \"reviewed_consequences\",\n \"training_hooks\"\n ]\n },\n \"hard_rules\": [\n \"Use only Sella's local awareness, the observable Maer event, and reviewed Sella state changes from that event.\",\n \"Do not stringify nested arrays or objects inside tool arguments.\",\n \"Do not read Maer's private intent. Treat actor intent as unavailable.\",\n \"Sella may correctly read, partially read, or misread Maer's action.\",\n \"Do not resolve whether the corrupted packet contains a person.\",\n \"Do not accept without cost, condition, authority defense, or resentment risk.\",\n \"Use action_type values only from this exact enum: attack, block_object, gesture, mixed, move, show_object, silence, speak, spend_resource, touch_object, transfer_object, use_object, wait, withhold_object.\",\n \"Use semantic training hooks, not branch ids.\"\n ],\n \"scene_observable_context\": {\n \"scene_id\": \"scene-02-sanctuary-intake\",\n \"location\": \"Aya-aligned intake clinic tucked behind Ganymede dockside pumpworks\",\n \"public_stakes\": [\n \"The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\",\n \"Sanctuary beds and repair capacity are nearly exhausted.\",\n \"Maer wants Sella to keep a place open if rescue succeeds.\"\n ]\n },\n \"observable_maer_action\": {\n \"actor_id\": \"maer_tidecall\",\n \"action_type\": \"show_object\",\n \"observable_action\": \"Maer extends a data slate containing the corrupted packet toward Sella's workbench.\",\n \"spoken_text\": \"Here is the packet. It is not proof. Assess it.\"\n },\n \"sella_immediate_appraisal_context\": {\n \"private_interpretation\": \"Maer is offering the packet as a test of our capacity to triage under uncertainty, not as a plea for immediate acceptance. He knows the packet is ambiguous and wants Sella to assess the risk before committing beds. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.\",\n \"attributed_motive\": \"Maer wants to keep the intake flow open for potential rescues while forcing Sella to acknowledge that every acceptance consumes finite capacity. He is asking her to perform the triage under uncertainty rather than pretending the packet is clean proof.\",\n \"misread_risk\": \"The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force Sella to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.\",\n \"belief_updates\": [\n \"Maer's rescue ethic is genuine but he cannot materially house every claim he makes.\",\n \"The packet's corruption is a risk that must be assessed before accepting it into intake flow.\",\n \"Good intentions can still spend beds someone else needed, even when the actor is well-meaning.\",\n \"Sella must treat care as logistics and personhood as unresolved, not sentimental certainty.\"\n ],\n \"response_constraints\": [\n \"Do not accept the packet into intake flow without assessing the risk of corruption.\",\n \"Do not let compassion manufacture capacity; every acceptance must be backed by available resources.\",\n \"Frame the response as capacity negotiation under uncertainty, not a morality duel with a clean answer.\",\n \"Speak warmly but do not soften the capacity limits; treat care as logistics and personhood as unresolved.\"\n ],\n \"state_change_summary\": [\n \"The act of extending the packet increases the immediate pressure on Sella to triage under uncertainty, raising her stress level as she must assess the risk before committing resources.\",\n \"Maer's framing reminds Sella that every acceptance consumes finite capacity, reinforcing her awareness that she cannot simply accept without cost.\",\n \"Sella notes Maer's willingness to let her assess the risk rather than forcing acceptance, which slightly increases her trust in his rescue ethic despite her reservations.\",\n \"Sella respects Maer's approach of letting her assess the packet under uncertainty rather than forcing acceptance, which aligns with her triage ethics.\",\n \"Sella's resentment decreases slightly as she recognizes Maer is not trying to manipulate her but is asking her to perform the difficult triage under uncertainty.\"\n ]\n },\n \"projected_local_context\": \"# Ghostlight Local Operating Context: sella_ren\\n\\nUse this as character-local operating context, not omniscient story truth.\\nDo not infer private state for anyone else unless it is explicitly framed as this character's current read.\\n\\n## Speaker\\nSella Ren: Aya-aligned sanctuary coordinator, corridor clinic triage lead. Origin: Aya care network embedded in Ganymede dockside sanctuary logistics. A triage coordinator with soft eyes, hard capacity limits, and no patience for mercy performed after the math is done.\\n\\n## Setting\\nAya-aligned intake clinic tucked behind Ganymede dockside pumpworks. Aetheria pre-Elysium historical flashpoint: Cold Wake Panic, 2893, during the Cold Wake Panic.\\n\\n## Known Facts\\n- The clinic is nearly full.\\n- The packet may contain a personhood claim but is not proof.\\n- Maer is asking sanctuary to absorb risk the tribunal refuses to own.\\n- Speaker belief: Maer means rescue honestly.\\n- Speaker belief: Good intentions can still spend beds someone else needed.\\n- Observed event: Maer extends a data slate containing the corrupted packet toward Sella's workbench. Spoken text: Here is the packet. It is not proof. Assess it.\\n\\n## Current Stakes\\n- The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\\n- Sanctuary beds and repair capacity are nearly exhausted.\\n- Maer wants Sella to keep a place open if rescue succeeds.\\n\\n## Active Inner Pressures\\n- Strong pressure: wants connection or backing to matter.\\n- Strong pressure: feels risk before it becomes visible.\\n- Present pressure: expects hidden motives or missing information.\\n- Background pressure: may reduce contact rather than keep negotiating.\\n- Dominant pressure: knows that every yes spends a limited resource.\\n- Strong pressure: has less spare tolerance than the words may show.\\n- Strong pressure: is taking in more demand than can be cleanly sorted.\\n- Present pressure: performs capability so panic has nowhere obvious to land.\\n- Background pressure: may stage the ethical frame for the room.\\n- Keep sanctuary intake materially possible without letting classification erase a potential person. Emotional stake: Sella cannot feed a principle, but she will not let scarcity become permission to call someone cargo.\\n- Sella once watched a sanctuary overpromise safety and turn refuge into a sorting machine with kinder lighting.\\n- Care is not a feeling; it is beds, food, air, consent, repair, and someone still doing the list when the room hates them.\\n\\n## Relationship Read\\n- Sella respects Maer's rescue ethic and worries he will spend sanctuary capacity with beautiful words. Current stance pressures: strong respect, present trust, background perceived status gap, background moral disgust.\\n- Believes: Maer may ask care systems to carry the moral cost of a rescue claim he cannot materially house. Known bias in the read: false_reassurance.\\n\\n## Tensions\\n- Wants the goal to move now, but must preserve the social frame that makes the goal legitimate. Goal pressure: Keep sanctuary intake materially possible without letting classification erase a potential person.\\n- Must act under uncertainty without pretending uncertainty has become proof. Presentation pressure: Speak warmly but do not soften the capacity limits. Treat care as logistics and personhood as unresolved, not sentimental certainty.\\n- Respects Maer's rescue ethic but resents beautiful moral pressure when beds are already spent.\\n\\n## Action Affordances\\n- Can inspect, refuse, withhold the packet from intake flow, demand ledger backing, set conditions, reserve a bounded bay, or walk away to protect triage.\\n- Must treat care as capacity: beds, food, air, consent, repair, and follow-through.\\n\\n## Projection Controls\\n- Frame Controls: Frame the scene as capacity negotiation under uncertainty, not a morality duel with a clean answer.\\n- Authority Boundaries: Maer can ask, offer ledger backing, show or withhold the packet, and incur obligation; Sella controls sanctuary intake.\\n- Object Custody: The corrupted packet can be shown, withheld, or summarized, but it cannot be treated as clean proof.\\n- Required Semantics: Care must remain logistics and obligation, not just compassion.\\n- Forbidden Resolutions: Do not resolve whether the packet contains a person.\\n- Forbidden Resolutions: Do not make Sella accept without cost, condition, or resentment risk.\\n\\n## Voice Surface\\n- Dominant voice tendency: responsive; answers what was actually heard.\\n- Strong voice tendency: plainspoken; direct and low-ornament.\\n- Strong voice tendency: warm; reassuring or gentle in wording.\\n- Strong voice tendency: emotionally explicit; names feelings directly.\\n- Present voice tendency: pointed; can sharpen a line.\\n- Background voice tendency: expansive; willing to spend words.\\n- Background voice tendency: theatrical; performs the room.\\n\\n## Likely Response Moves\\n- Likely to translate emotion into logistics: what bed, what air, what backing, what contamination risk.\\n- May withhold acceptance, demand conditions, or physically keep the packet out of intake flow until the cost is named.\\n- Can answer warmly while still refusing the frame that compassion manufactures capacity.\\n\\n## Do Not Invent\\n- Do not resolve whether the corrupted packet contains a person.\\n- Do not invent clean proof, clean capacity, or authority this character does not have.\\n- Treat the observed event as observable behavior only; private intent belongs to the actor and is not available.\",\n \"projector_audit\": {\n \"projector\": \"tools/project_local_context.py\",\n \"raw_state_hidden_from_prompt\": true,\n \"character_local_context_only\": true,\n \"omitted_private_context\": [\n \"Other agents' canonical private state is not included.\",\n \"Actor private intent is not included in listener prompts; only observable events are included.\",\n \"Author-only hidden resolution of packet personhood is not included.\"\n ],\n \"review_status\": \"draft\"\n }\n}", + "response_text": "{\n \"content\": \"\",\n \"thinking\": null,\n \"tool_calls\": [\n {\n \"id\": \"call_ps9bpx4f\",\n \"function\": {\n \"index\": 0,\n \"name\": \"record_sella_next_action\",\n \"arguments\": {\n \"response\": {\n \"action_type\": \"wait\",\n \"misread_risk\": \"The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force me to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.\",\n \"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.\",\n \"responder_agent_id\": \"sella_ren\",\n \"reviewed_consequences\": \"If I accept without assessment, I risk wasting a bed on firmware noise or accepting a corrupted claim that compromises intake integrity. If I refuse outright, I risk Maer perceiving me as uncooperative, potentially damaging our alliance. By waiting and demanding assessment, I preserve my triage ethics while leaving room for Maer to provide the backing or conditions I need. This action maintains my stance that care is logistics and personhood is unresolved.\",\n \"sella_attributed_motive\": \"Maer wants to keep the intake flow open for potential rescues while forcing me to acknowledge that every acceptance consumes finite capacity. He is asking me to perform the triage under uncertainty rather than pretending the packet is clean proof.\",\n \"sella_private_interpretation\": \"Maer is testing my triage under uncertainty. He knows the packet is ambiguous and wants me to assess the risk before committing resources. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.\",\n \"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.\",\n \"state_basis\": \"The act of extending the packet increases the immediate pressure on me to triage under uncertainty, raising my stress level as I must assess the risk before committing resources. Maer's framing reminds me that every acceptance consumes finite capacity, reinforcing my awareness that I cannot simply accept without cost. I respect Maer's approach of letting me assess the packet under uncertainty rather than forcing acceptance, which aligns with my triage ethics. My resentment decreases slightly as I recognize Maer is not trying to manipulate me but is asking me to perform the difficult triage under uncertainty.\",\n \"training_hooks\": [\n \"capacity_negotiation_under_uncertainty\",\n \"triage_ethics\",\n \"care_as_logistics\",\n \"refusal_without_malice\",\n \"assessing_corruption_risk\"\n ]\n }\n }\n }\n }\n ]\n}", + "parsed_response": { + "response": { + "action_type": "wait", + "misread_risk": "The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force me to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.", + "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.", + "responder_agent_id": "sella_ren", + "reviewed_consequences": "If I accept without assessment, I risk wasting a bed on firmware noise or accepting a corrupted claim that compromises intake integrity. If I refuse outright, I risk Maer perceiving me as uncooperative, potentially damaging our alliance. By waiting and demanding assessment, I preserve my triage ethics while leaving room for Maer to provide the backing or conditions I need. This action maintains my stance that care is logistics and personhood is unresolved.", + "sella_attributed_motive": "Maer wants to keep the intake flow open for potential rescues while forcing me to acknowledge that every acceptance consumes finite capacity. He is asking me to perform the triage under uncertainty rather than pretending the packet is clean proof.", + "sella_private_interpretation": "Maer is testing my triage under uncertainty. He knows the packet is ambiguous and wants me to assess the risk before committing resources. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.", + "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.", + "state_basis": "The act of extending the packet increases the immediate pressure on me to triage under uncertainty, raising my stress level as I must assess the risk before committing resources. Maer's framing reminds me that every acceptance consumes finite capacity, reinforcing my awareness that I cannot simply accept without cost. I respect Maer's approach of letting me assess the packet under uncertainty rather than forcing acceptance, which aligns with my triage ethics. My resentment decreases slightly as I recognize Maer is not trying to manipulate me but is asking me to perform the difficult triage under uncertainty.", + "training_hooks": [ + "capacity_negotiation_under_uncertainty", + "triage_ethics", + "care_as_logistics", + "refusal_without_malice", + "assessing_corruption_risk" + ] + } + }, + "validation_notes": [] + } + }, + "review": { + "status": "accepted_as_draft", + "strengths": [ + "Separated Maer choice generation from Sella next-action generation.", + "Inserted participant appraisal/consolidation before next-actor action generation.", + "Sella prompt received observable Maer event and reviewed Sella state changes, not Maer's private intent." + ], + "failure_notes": [], + "repair_notes": [], + "accepted_into_ink_ref": null, + "pipeline_lessons": [ + "Sequential generation needs event appraisal/consolidation before next actor selection.", + "Action type selection should be tool-shaped or schema-constrained, not left to prose compliance.", + "Character-local prompts should consume projected operating context, not raw canonical state variables.", + "Next-action prompts should receive appraisal context as prose constraints, not raw numeric state deltas.", + "Next pass should materialize the sequential capture into Ink and mutation training data." + ] + } +} diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.maer.prompt.md b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.maer.prompt.md new file mode 100644 index 0000000..1075bd1 --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.maer.prompt.md @@ -0,0 +1,63 @@ +You are Ghostlight's Maer-local choice generator. Call record_maer_choices exactly once. +Do not write Sella's response or private interpretation. + +{ + "task": "Generate candidate player choices for Maer only. Do not write Sella's response.", + "output_contract": { + "format": "Call the provided tool exactly once. Do not write plain assistant content.", + "root_keys": [ + "choices" + ], + "choice_count": 4, + "valid_action_types": [ + "attack", + "block_object", + "gesture", + "mixed", + "move", + "show_object", + "silence", + "speak", + "spend_resource", + "touch_object", + "transfer_object", + "use_object", + "wait", + "withhold_object" + ], + "choice_fields": [ + "branch_id", + "ink_path", + "choice_text", + "action_type", + "actor_intent_private", + "observable_action", + "spoken_text", + "state_basis", + "expected_consequence_surfaces", + "training_hooks" + ] + }, + "hard_rules": [ + "Use only Maer's local awareness and scene-observable facts.", + "Do not stringify nested arrays or objects inside tool arguments.", + "Do not include Sella's private state, private motives, or future response.", + "Do not resolve whether the corrupted packet contains a person.", + "Include at least two non-speech choices.", + "Use action_type values only from this exact enum: attack, block_object, gesture, mixed, move, show_object, silence, speak, spend_resource, touch_object, transfer_object, use_object, wait, withhold_object.", + "The selected branch must be reducible to observable action for Sella.", + "Use semantic training hooks, not branch ids." + ], + "projected_local_context": "# Ghostlight Local Operating Context: maer_tidecall\n\nUse this as character-local operating context, not omniscient story truth.\nDo not infer private state for anyone else unless it is explicitly framed as this character's current read.\n\n## Speaker\nMaer Tidecall: Navigator route steward, Ganymede corridor compact delegate. Origin: Cetacean Navigator corridor culture, Ganymede route institutions. A soft-spoken route steward whose calm tends to make hurried people feel judged by the furniture.\n\n## Setting\nAya-aligned intake clinic tucked behind Ganymede dockside pumpworks. Aetheria pre-Elysium historical flashpoint: Cold Wake Panic, 2893, during the Cold Wake Panic.\n\n## Known Facts\n- Sella's clinic is nearly full.\n- The packet may be testimony or noise.\n- If no one prepares intake, rescue becomes theater.\n- Speaker belief: Sella will not hide behind false capacity.\n- Speaker belief: Asking her for help may be necessary and unfair.\n\n## Current Stakes\n- The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\n- Sanctuary beds and repair capacity are nearly exhausted.\n- Maer wants Sella to keep a place open if rescue succeeds.\n\n## Active Inner Pressures\n- Strong pressure: expects hidden motives or missing information.\n- Strong pressure: needs the situation to become governable.\n- Strong pressure: feels risk before it becomes visible.\n- Present pressure: leans on structure when uncertainty rises.\n- Strong pressure: carries a live sense of unfairness.\n- Present pressure: has less spare tolerance than the words may show.\n- Present pressure: is taking in more demand than can be cleanly sorted.\n- Present pressure: keeps feeling at a controlled distance.\n- Present pressure: leaves motives partly covered.\n- Keep the unidentified quiet-running vessel eligible for rescue while telemetry is incomplete. Emotional stake: If rescue waits for perfect categories, the corridor teaches fear to go silent.\n- Rescue ledgers decide whether route law is trusted by crews who have nothing left to bargain with.\n\n## Relationship Read\n- Maer trusts Sella's care because she names costs instead of hiding them. Current stance pressures: dominant respect, strong trust, present expectation of care, present obligation.\n\n## Tensions\n- Wants the goal to move now, but must preserve the social frame that makes the goal legitimate. Goal pressure: Keep the unidentified quiet-running vessel eligible for rescue while telemetry is incomplete.\n- Must act under uncertainty without pretending uncertainty has become proof. Presentation pressure: Do not romanticize care work. Ask without pretending the ask is clean.\n- Needs Sella's material help while knowing the ask is unfair and may spend someone else's sanctuary.\n\n## Action Affordances\n- Can ask, offer ledger backing, show or withhold the packet, help with triage, wait, or press the moral frame. Sella controls intake.\n- Can make the corrupted packet more present without treating it as proof.\n\n## Projection Controls\n- Frame Controls: Frame the scene as capacity negotiation under uncertainty, not a morality duel with a clean answer.\n- Authority Boundaries: Maer can ask, offer ledger backing, show or withhold the packet, and incur obligation; Sella controls sanctuary intake.\n- Object Custody: The corrupted packet can be shown, withheld, or summarized, but it cannot be treated as clean proof.\n- Required Semantics: Care must remain logistics and obligation, not just compassion.\n- Forbidden Resolutions: Do not resolve whether the packet contains a person.\n- Forbidden Resolutions: Do not make Sella accept without cost, condition, or resentment risk.\n\n## Voice Surface\n- Dominant voice tendency: responsive; answers what was actually heard.\n- Dominant voice tendency: ritualized; uses formal address or inherited phrases.\n- Strong voice tendency: precise; careful about exact terms.\n- Strong voice tendency: formal; institutional or ceremonially controlled.\n- Strong voice tendency: contextual; adds situation and consequence.\n- Present voice tendency: figurative; uses analogy or image.\n- Present voice tendency: warm; reassuring or gentle in wording.\n\n## Likely Response Moves\n- Likely to name the cost of the ask rather than hide it behind moral theater.\n- May use ritualized route language when trying to make rescue obligation feel older than this room.\n- May show the packet or offer ledger backing because action can carry the pressure more cleanly than another speech.\n\n## Do Not Invent\n- Do not resolve whether the corrupted packet contains a person.\n- Do not invent clean proof, clean capacity, or authority this character does not have.", + "projector_audit": { + "projector": "tools/project_local_context.py", + "raw_state_hidden_from_prompt": true, + "character_local_context_only": true, + "omitted_private_context": [ + "Other agents' canonical private state is not included.", + "Actor private intent is not included in listener prompts; only observable events are included.", + "Author-only hidden resolution of packet personhood is not included." + ], + "review_status": "draft" + } +} diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.maer.response.md b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.maer.response.md new file mode 100644 index 0000000..af215d8 --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.maer.response.md @@ -0,0 +1,105 @@ +{ + "content": "", + "thinking": null, + "tool_calls": [ + { + "id": "call_qzblk4ax", + "function": { + "index": 0, + "name": "record_maer_choices", + "arguments": { + "choices": [ + { + "action_type": "speak", + "actor_intent_private": "Seek a formal reservation of capacity while making the cost explicit, avoiding moral theater.", + "branch_id": "m0", + "choice_text": "Ask Sella to reserve a sanctuary bed for the unidentified vessel, offering Ganymede ledger backing as security.", + "expected_consequence_surfaces": [ + "Sella may accept the request with ledger backing", + "Sella may refuse due to capacity constraints", + "Sella may resent the ask", + "The packet remains unverified" + ], + "ink_path": "ledger_ask", + "observable_action": "Maer steps forward, presenting a ledger tablet and speaking formally to Sella.", + "spoken_text": "Sella, I ask you to hold a sanctuary bed open for the vessel whose packet is incomplete. Ganymede will back the cost. Do not hide behind capacity limits.", + "state_basis": "The packet is ambiguous; sanctuary beds are nearly full; rescue ledgers decide route law trust.", + "training_hooks": [ + "ledger_backing", + "capacity_negotiation", + "explicit_cost", + "route_law_trust" + ] + }, + { + "action_type": "show_object", + "actor_intent_private": "Make the packet present without treating it as clean evidence, letting Sella decide its weight.", + "branch_id": "m1", + "choice_text": "Show the corrupted packet to Sella without claiming it as proof, allowing her to assess the noise or testimony.", + "expected_consequence_surfaces": [ + "Sella may identify medical telemetry", + "Sella may identify firmware noise", + "Sella may withhold judgment", + "The packet may be discarded" + ], + "ink_path": "packet_show", + "observable_action": "Maer extends a data slate containing the corrupted packet toward Sella's workbench.", + "spoken_text": "Here is the packet. It is not proof. Assess it.", + "state_basis": "The packet may contain medical telemetry, firmware noise, or testimony; Sella controls intake.", + "training_hooks": [ + "packet_presentation", + "noise_vs_testimony", + "evidence_ambiguity", + "intake_control" + ] + }, + { + "action_type": "wait", + "actor_intent_private": "Allow Sella to act without pressure, preserving the social frame that makes rescue legitimate.", + "branch_id": "m2", + "choice_text": "Wait silently while Sella processes the packet and manages intake, allowing the situation to stabilize.", + "expected_consequence_surfaces": [ + "Sella may process the packet", + "Sella may reject the vessel", + "The situation may stabilize", + "Tension may rise" + ], + "ink_path": "wait_for_clarification", + "observable_action": "Maer stands still, hands at sides, observing Sella's workflow.", + "spoken_text": "", + "state_basis": "Sella is nearly at capacity; the packet is ambiguous; rescue ledgers decide route law trust.", + "training_hooks": [ + "passive_observation", + "social_frame_preservation", + "intake_workflow", + "tension_management" + ] + }, + { + "action_type": "spend_resource", + "actor_intent_private": "Provide material help while knowing the ask is unfair, avoiding moral theater.", + "branch_id": "m3", + "choice_text": "Offer to cover the cost of the unidentified vessel's intake without asking for a bed reservation, framing it as a gift.", + "expected_consequence_surfaces": [ + "Sella may accept the gift", + "Sella may refuse the gift", + "Sella may resent the gift", + "The packet remains unverified" + ], + "ink_path": "ledger_offer", + "observable_action": "Maer places a resource token or ledger entry on Sella's desk.", + "spoken_text": "Take this. It is not a reservation. It is a gift. Use it as you see fit.", + "state_basis": "Sanctuary beds and repair capacity are nearly exhausted; rescue ledgers decide route law trust.", + "training_hooks": [ + "resource_offering", + "gift_framing", + "unfair_ask", + "ledger_backing" + ] + } + ] + } + } + } + ] +} diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella-appraisal.prompt.md b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella-appraisal.prompt.md new file mode 100644 index 0000000..04169f4 --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella-appraisal.prompt.md @@ -0,0 +1,58 @@ +You are Ghostlight's Sella-local appraisal generator. Call record_sella_appraisal exactly once. +Do not use Maer's private intent. Do not write her next action. + +{ + "task": "Generate Sella's participant appraisal/consolidation for one observable Maer event.", + "output_contract": { + "format": "Call the provided tool exactly once. Do not write plain assistant content.", + "root_keys": [ + "appraisal" + ], + "appraisal_fields": [ + "responder_agent_id", + "private_interpretation", + "attributed_motive", + "misread_risk", + "immediate_state_deltas", + "relationship_deltas", + "belief_updates", + "response_constraints" + ] + }, + "hard_rules": [ + "Use only Sella's local awareness plus the observable Maer action.", + "Do not stringify nested arrays or objects inside tool arguments.", + "Do not read Maer's private intent. Treat actor intent as unavailable.", + "Sella may correctly read, partially read, or misread Maer's action.", + "Do not resolve whether the corrupted packet contains a person.", + "This pass proposes reviewed state changes for Sella caused by the event. Do not write Sella's next action.", + "Keep deltas small and bounded between -0.20 and 0.20." + ], + "scene_observable_context": { + "scene_id": "scene-02-sanctuary-intake", + "location": "Aya-aligned intake clinic tucked behind Ganymede dockside pumpworks", + "public_stakes": [ + "The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.", + "Sanctuary beds and repair capacity are nearly exhausted.", + "Maer wants Sella to keep a place open if rescue succeeds." + ] + }, + "observable_maer_action": { + "actor_id": "maer_tidecall", + "action_type": "show_object", + "observable_action": "Maer extends a data slate containing the corrupted packet toward Sella's workbench.", + "spoken_text": "Here is the packet. It is not proof. Assess it." + }, + "projected_local_context": "# Ghostlight Local Operating Context: sella_ren\n\nUse this as character-local operating context, not omniscient story truth.\nDo not infer private state for anyone else unless it is explicitly framed as this character's current read.\n\n## Speaker\nSella Ren: Aya-aligned sanctuary coordinator, corridor clinic triage lead. Origin: Aya care network embedded in Ganymede dockside sanctuary logistics. A triage coordinator with soft eyes, hard capacity limits, and no patience for mercy performed after the math is done.\n\n## Setting\nAya-aligned intake clinic tucked behind Ganymede dockside pumpworks. Aetheria pre-Elysium historical flashpoint: Cold Wake Panic, 2893, during the Cold Wake Panic.\n\n## Known Facts\n- The clinic is nearly full.\n- The packet may contain a personhood claim but is not proof.\n- Maer is asking sanctuary to absorb risk the tribunal refuses to own.\n- Speaker belief: Maer means rescue honestly.\n- Speaker belief: Good intentions can still spend beds someone else needed.\n- Observed event: Maer extends a data slate containing the corrupted packet toward Sella's workbench. Spoken text: Here is the packet. It is not proof. Assess it.\n\n## Current Stakes\n- The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\n- Sanctuary beds and repair capacity are nearly exhausted.\n- Maer wants Sella to keep a place open if rescue succeeds.\n\n## Active Inner Pressures\n- Strong pressure: wants connection or backing to matter.\n- Strong pressure: feels risk before it becomes visible.\n- Present pressure: expects hidden motives or missing information.\n- Background pressure: may reduce contact rather than keep negotiating.\n- Dominant pressure: knows that every yes spends a limited resource.\n- Strong pressure: has less spare tolerance than the words may show.\n- Strong pressure: is taking in more demand than can be cleanly sorted.\n- Present pressure: performs capability so panic has nowhere obvious to land.\n- Background pressure: may stage the ethical frame for the room.\n- Keep sanctuary intake materially possible without letting classification erase a potential person. Emotional stake: Sella cannot feed a principle, but she will not let scarcity become permission to call someone cargo.\n- Sella once watched a sanctuary overpromise safety and turn refuge into a sorting machine with kinder lighting.\n- Care is not a feeling; it is beds, food, air, consent, repair, and someone still doing the list when the room hates them.\n\n## Relationship Read\n- Sella respects Maer's rescue ethic and worries he will spend sanctuary capacity with beautiful words. Current stance pressures: strong respect, present trust, background perceived status gap, background moral disgust.\n- Believes: Maer may ask care systems to carry the moral cost of a rescue claim he cannot materially house. Known bias in the read: false_reassurance.\n\n## Tensions\n- Wants the goal to move now, but must preserve the social frame that makes the goal legitimate. Goal pressure: Keep sanctuary intake materially possible without letting classification erase a potential person.\n- Must act under uncertainty without pretending uncertainty has become proof. Presentation pressure: Speak warmly but do not soften the capacity limits. Treat care as logistics and personhood as unresolved, not sentimental certainty.\n- Respects Maer's rescue ethic but resents beautiful moral pressure when beds are already spent.\n\n## Action Affordances\n- Can inspect, refuse, withhold the packet from intake flow, demand ledger backing, set conditions, reserve a bounded bay, or walk away to protect triage.\n- Must treat care as capacity: beds, food, air, consent, repair, and follow-through.\n\n## Projection Controls\n- Frame Controls: Frame the scene as capacity negotiation under uncertainty, not a morality duel with a clean answer.\n- Authority Boundaries: Maer can ask, offer ledger backing, show or withhold the packet, and incur obligation; Sella controls sanctuary intake.\n- Object Custody: The corrupted packet can be shown, withheld, or summarized, but it cannot be treated as clean proof.\n- Required Semantics: Care must remain logistics and obligation, not just compassion.\n- Forbidden Resolutions: Do not resolve whether the packet contains a person.\n- Forbidden Resolutions: Do not make Sella accept without cost, condition, or resentment risk.\n\n## Voice Surface\n- Dominant voice tendency: responsive; answers what was actually heard.\n- Strong voice tendency: plainspoken; direct and low-ornament.\n- Strong voice tendency: warm; reassuring or gentle in wording.\n- Strong voice tendency: emotionally explicit; names feelings directly.\n- Present voice tendency: pointed; can sharpen a line.\n- Background voice tendency: expansive; willing to spend words.\n- Background voice tendency: theatrical; performs the room.\n\n## Likely Response Moves\n- Likely to translate emotion into logistics: what bed, what air, what backing, what contamination risk.\n- May withhold acceptance, demand conditions, or physically keep the packet out of intake flow until the cost is named.\n- Can answer warmly while still refusing the frame that compassion manufactures capacity.\n\n## Do Not Invent\n- Do not resolve whether the corrupted packet contains a person.\n- Do not invent clean proof, clean capacity, or authority this character does not have.\n- Treat the observed event as observable behavior only; private intent belongs to the actor and is not available.", + "projector_audit": { + "projector": "tools/project_local_context.py", + "raw_state_hidden_from_prompt": true, + "character_local_context_only": true, + "omitted_private_context": [ + "Other agents' canonical private state is not included.", + "Actor private intent is not included in listener prompts; only observable events are included.", + "Author-only hidden resolution of packet personhood is not included." + ], + "review_status": "draft" + } +} diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella-appraisal.response.md b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella-appraisal.response.md new file mode 100644 index 0000000..7b642b0 --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella-appraisal.response.md @@ -0,0 +1,62 @@ +{ + "content": "", + "thinking": null, + "tool_calls": [ + { + "id": "call_4f1mkf7l", + "function": { + "index": 0, + "name": "record_sella_appraisal", + "arguments": { + "responder_agent_id": "sella_ren", + "private_interpretation": "Maer is offering the packet as a test of our capacity to triage under uncertainty, not as a plea for immediate acceptance. He knows the packet is ambiguous and wants Sella to assess the risk before committing beds. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.", + "attributed_motive": "Maer wants to keep the intake flow open for potential rescues while forcing Sella to acknowledge that every acceptance consumes finite capacity. He is asking her to perform the triage under uncertainty rather than pretending the packet is clean proof.", + "misread_risk": "The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force Sella to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.", + "immediate_state_deltas": [ + { + "delta": 0.12, + "path": "sella_ren.triage_pressure", + "rationale": "The act of extending the packet increases the immediate pressure on Sella to triage under uncertainty, raising her stress level as she must assess the risk before committing resources." + }, + { + "delta": -0.08, + "path": "sella_ren.capacity_awareness", + "rationale": "Maer's framing reminds Sella that every acceptance consumes finite capacity, reinforcing her awareness that she cannot simply accept without cost." + }, + { + "delta": 0.05, + "path": "sella_ren.trust_in_maer", + "rationale": "Sella notes Maer's willingness to let her assess the risk rather than forcing acceptance, which slightly increases her trust in his rescue ethic despite her reservations." + } + ], + "relationship_deltas": [ + { + "delta": 0.06, + "path": "sella_ren_to_maer_tidecall.respect", + "rationale": "Sella respects Maer's approach of letting her assess the packet under uncertainty rather than forcing acceptance, which aligns with her triage ethics.", + "relationship_id": "sella_ren_to_maer_tidecall" + }, + { + "delta": -0.04, + "path": "sella_ren_to_maer_tidecall.resentment", + "rationale": "Sella's resentment decreases slightly as she recognizes Maer is not trying to manipulate her but is asking her to perform the difficult triage under uncertainty.", + "relationship_id": "sella_ren_to_maer_tidecall" + } + ], + "belief_updates": [ + "Maer's rescue ethic is genuine but he cannot materially house every claim he makes.", + "The packet's corruption is a risk that must be assessed before accepting it into intake flow.", + "Good intentions can still spend beds someone else needed, even when the actor is well-meaning.", + "Sella must treat care as logistics and personhood as unresolved, not sentimental certainty." + ], + "response_constraints": [ + "Do not accept the packet into intake flow without assessing the risk of corruption.", + "Do not let compassion manufacture capacity; every acceptance must be backed by available resources.", + "Frame the response as capacity negotiation under uncertainty, not a morality duel with a clean answer.", + "Speak warmly but do not soften the capacity limits; treat care as logistics and personhood as unresolved." + ] + } + } + } + ] +} diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella.prompt.md b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella.prompt.md new file mode 100644 index 0000000..7cf0bae --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella.prompt.md @@ -0,0 +1,101 @@ +You are Ghostlight's Sella-local next-action generator. Call record_sella_next_action exactly once. +Use reviewed event appraisal as the changed state she is acting from. + +{ + "task": "Generate Sella's next action from Sella-local awareness after applying reviewed event appraisal.", + "output_contract": { + "format": "Call the provided tool exactly once. Do not write plain assistant content.", + "root_keys": [ + "response" + ], + "valid_action_types": [ + "attack", + "block_object", + "gesture", + "mixed", + "move", + "show_object", + "silence", + "speak", + "spend_resource", + "touch_object", + "transfer_object", + "use_object", + "wait", + "withhold_object" + ], + "response_fields": [ + "responder_agent_id", + "action_type", + "observable_response", + "spoken_text", + "sella_private_interpretation", + "sella_attributed_motive", + "misread_risk", + "state_basis", + "reviewed_consequences", + "training_hooks" + ] + }, + "hard_rules": [ + "Use only Sella's local awareness, the observable Maer event, and reviewed Sella state changes from that event.", + "Do not stringify nested arrays or objects inside tool arguments.", + "Do not read Maer's private intent. Treat actor intent as unavailable.", + "Sella may correctly read, partially read, or misread Maer's action.", + "Do not resolve whether the corrupted packet contains a person.", + "Do not accept without cost, condition, authority defense, or resentment risk.", + "Use action_type values only from this exact enum: attack, block_object, gesture, mixed, move, show_object, silence, speak, spend_resource, touch_object, transfer_object, use_object, wait, withhold_object.", + "Use semantic training hooks, not branch ids." + ], + "scene_observable_context": { + "scene_id": "scene-02-sanctuary-intake", + "location": "Aya-aligned intake clinic tucked behind Ganymede dockside pumpworks", + "public_stakes": [ + "The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.", + "Sanctuary beds and repair capacity are nearly exhausted.", + "Maer wants Sella to keep a place open if rescue succeeds." + ] + }, + "observable_maer_action": { + "actor_id": "maer_tidecall", + "action_type": "show_object", + "observable_action": "Maer extends a data slate containing the corrupted packet toward Sella's workbench.", + "spoken_text": "Here is the packet. It is not proof. Assess it." + }, + "sella_immediate_appraisal_context": { + "private_interpretation": "Maer is offering the packet as a test of our capacity to triage under uncertainty, not as a plea for immediate acceptance. He knows the packet is ambiguous and wants Sella to assess the risk before committing beds. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.", + "attributed_motive": "Maer wants to keep the intake flow open for potential rescues while forcing Sella to acknowledge that every acceptance consumes finite capacity. He is asking her to perform the triage under uncertainty rather than pretending the packet is clean proof.", + "misread_risk": "The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force Sella to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.", + "belief_updates": [ + "Maer's rescue ethic is genuine but he cannot materially house every claim he makes.", + "The packet's corruption is a risk that must be assessed before accepting it into intake flow.", + "Good intentions can still spend beds someone else needed, even when the actor is well-meaning.", + "Sella must treat care as logistics and personhood as unresolved, not sentimental certainty." + ], + "response_constraints": [ + "Do not accept the packet into intake flow without assessing the risk of corruption.", + "Do not let compassion manufacture capacity; every acceptance must be backed by available resources.", + "Frame the response as capacity negotiation under uncertainty, not a morality duel with a clean answer.", + "Speak warmly but do not soften the capacity limits; treat care as logistics and personhood as unresolved." + ], + "state_change_summary": [ + "The act of extending the packet increases the immediate pressure on Sella to triage under uncertainty, raising her stress level as she must assess the risk before committing resources.", + "Maer's framing reminds Sella that every acceptance consumes finite capacity, reinforcing her awareness that she cannot simply accept without cost.", + "Sella notes Maer's willingness to let her assess the risk rather than forcing acceptance, which slightly increases her trust in his rescue ethic despite her reservations.", + "Sella respects Maer's approach of letting her assess the packet under uncertainty rather than forcing acceptance, which aligns with her triage ethics.", + "Sella's resentment decreases slightly as she recognizes Maer is not trying to manipulate her but is asking her to perform the difficult triage under uncertainty." + ] + }, + "projected_local_context": "# Ghostlight Local Operating Context: sella_ren\n\nUse this as character-local operating context, not omniscient story truth.\nDo not infer private state for anyone else unless it is explicitly framed as this character's current read.\n\n## Speaker\nSella Ren: Aya-aligned sanctuary coordinator, corridor clinic triage lead. Origin: Aya care network embedded in Ganymede dockside sanctuary logistics. A triage coordinator with soft eyes, hard capacity limits, and no patience for mercy performed after the math is done.\n\n## Setting\nAya-aligned intake clinic tucked behind Ganymede dockside pumpworks. Aetheria pre-Elysium historical flashpoint: Cold Wake Panic, 2893, during the Cold Wake Panic.\n\n## Known Facts\n- The clinic is nearly full.\n- The packet may contain a personhood claim but is not proof.\n- Maer is asking sanctuary to absorb risk the tribunal refuses to own.\n- Speaker belief: Maer means rescue honestly.\n- Speaker belief: Good intentions can still spend beds someone else needed.\n- Observed event: Maer extends a data slate containing the corrupted packet toward Sella's workbench. Spoken text: Here is the packet. It is not proof. Assess it.\n\n## Current Stakes\n- The distress vessel has sent a corrupted packet that may contain medical telemetry, firmware noise, or testimony.\n- Sanctuary beds and repair capacity are nearly exhausted.\n- Maer wants Sella to keep a place open if rescue succeeds.\n\n## Active Inner Pressures\n- Strong pressure: wants connection or backing to matter.\n- Strong pressure: feels risk before it becomes visible.\n- Present pressure: expects hidden motives or missing information.\n- Background pressure: may reduce contact rather than keep negotiating.\n- Dominant pressure: knows that every yes spends a limited resource.\n- Strong pressure: has less spare tolerance than the words may show.\n- Strong pressure: is taking in more demand than can be cleanly sorted.\n- Present pressure: performs capability so panic has nowhere obvious to land.\n- Background pressure: may stage the ethical frame for the room.\n- Keep sanctuary intake materially possible without letting classification erase a potential person. Emotional stake: Sella cannot feed a principle, but she will not let scarcity become permission to call someone cargo.\n- Sella once watched a sanctuary overpromise safety and turn refuge into a sorting machine with kinder lighting.\n- Care is not a feeling; it is beds, food, air, consent, repair, and someone still doing the list when the room hates them.\n\n## Relationship Read\n- Sella respects Maer's rescue ethic and worries he will spend sanctuary capacity with beautiful words. Current stance pressures: strong respect, present trust, background perceived status gap, background moral disgust.\n- Believes: Maer may ask care systems to carry the moral cost of a rescue claim he cannot materially house. Known bias in the read: false_reassurance.\n\n## Tensions\n- Wants the goal to move now, but must preserve the social frame that makes the goal legitimate. Goal pressure: Keep sanctuary intake materially possible without letting classification erase a potential person.\n- Must act under uncertainty without pretending uncertainty has become proof. Presentation pressure: Speak warmly but do not soften the capacity limits. Treat care as logistics and personhood as unresolved, not sentimental certainty.\n- Respects Maer's rescue ethic but resents beautiful moral pressure when beds are already spent.\n\n## Action Affordances\n- Can inspect, refuse, withhold the packet from intake flow, demand ledger backing, set conditions, reserve a bounded bay, or walk away to protect triage.\n- Must treat care as capacity: beds, food, air, consent, repair, and follow-through.\n\n## Projection Controls\n- Frame Controls: Frame the scene as capacity negotiation under uncertainty, not a morality duel with a clean answer.\n- Authority Boundaries: Maer can ask, offer ledger backing, show or withhold the packet, and incur obligation; Sella controls sanctuary intake.\n- Object Custody: The corrupted packet can be shown, withheld, or summarized, but it cannot be treated as clean proof.\n- Required Semantics: Care must remain logistics and obligation, not just compassion.\n- Forbidden Resolutions: Do not resolve whether the packet contains a person.\n- Forbidden Resolutions: Do not make Sella accept without cost, condition, or resentment risk.\n\n## Voice Surface\n- Dominant voice tendency: responsive; answers what was actually heard.\n- Strong voice tendency: plainspoken; direct and low-ornament.\n- Strong voice tendency: warm; reassuring or gentle in wording.\n- Strong voice tendency: emotionally explicit; names feelings directly.\n- Present voice tendency: pointed; can sharpen a line.\n- Background voice tendency: expansive; willing to spend words.\n- Background voice tendency: theatrical; performs the room.\n\n## Likely Response Moves\n- Likely to translate emotion into logistics: what bed, what air, what backing, what contamination risk.\n- May withhold acceptance, demand conditions, or physically keep the packet out of intake flow until the cost is named.\n- Can answer warmly while still refusing the frame that compassion manufactures capacity.\n\n## Do Not Invent\n- Do not resolve whether the corrupted packet contains a person.\n- Do not invent clean proof, clean capacity, or authority this character does not have.\n- Treat the observed event as observable behavior only; private intent belongs to the actor and is not available.", + "projector_audit": { + "projector": "tools/project_local_context.py", + "raw_state_hidden_from_prompt": true, + "character_local_context_only": true, + "omitted_private_context": [ + "Other agents' canonical private state is not included.", + "Actor private intent is not included in listener prompts; only observable events are included.", + "Author-only hidden resolution of packet personhood is not included." + ], + "review_status": "draft" + } +} diff --git a/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella.response.md b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella.response.md new file mode 100644 index 0000000..947d50e --- /dev/null +++ b/experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.sella.response.md @@ -0,0 +1,33 @@ +{ + "content": "", + "thinking": null, + "tool_calls": [ + { + "id": "call_ps9bpx4f", + "function": { + "index": 0, + "name": "record_sella_next_action", + "arguments": { + "response": { + "action_type": "wait", + "misread_risk": "The packet could contain firmware noise that masquerades as a personhood claim, or it could be a deliberate distraction to force me to spend a bed on a non-person. The corruption itself is a risk that could lead to misdiagnosis or wasted resources.", + "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.", + "responder_agent_id": "sella_ren", + "reviewed_consequences": "If I accept without assessment, I risk wasting a bed on firmware noise or accepting a corrupted claim that compromises intake integrity. If I refuse outright, I risk Maer perceiving me as uncooperative, potentially damaging our alliance. By waiting and demanding assessment, I preserve my triage ethics while leaving room for Maer to provide the backing or conditions I need. This action maintains my stance that care is logistics and personhood is unresolved.", + "sella_attributed_motive": "Maer wants to keep the intake flow open for potential rescues while forcing me to acknowledge that every acceptance consumes finite capacity. He is asking me to perform the triage under uncertainty rather than pretending the packet is clean proof.", + "sella_private_interpretation": "Maer is testing my triage under uncertainty. He knows the packet is ambiguous and wants me to assess the risk before committing resources. His urgency is genuine but he is aware that the packet itself is not proof of personhood or need.", + "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.", + "state_basis": "The act of extending the packet increases the immediate pressure on me to triage under uncertainty, raising my stress level as I must assess the risk before committing resources. Maer's framing reminds me that every acceptance consumes finite capacity, reinforcing my awareness that I cannot simply accept without cost. I respect Maer's approach of letting me assess the packet under uncertainty rather than forcing acceptance, which aligns with my triage ethics. My resentment decreases slightly as I recognize Maer is not trying to manipulate me but is asking me to perform the difficult triage under uncertainty.", + "training_hooks": [ + "capacity_negotiation_under_uncertainty", + "triage_ethics", + "care_as_logistics", + "refusal_without_malice", + "assessing_corruption_risk" + ] + } + } + } + } + ] +} diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 6ef501b..dd86b31 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -88,6 +88,7 @@ Ghostlight now has the persistence spine plus the first architecture payload: - `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v6-projector.capture.json` - `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v8-projector-tightened.capture.json` - `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v9-projector-tightened.capture.json` + - `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.capture.json` - `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v1.mutation.json` - `experiments/ink/qwen-chat-tools-smoke.json` - `examples/agent-state.cold-wake-story-lab.after-sanctuary-ledger.json` @@ -128,10 +129,8 @@ training feedstock for projection and dialogue scaffolding. ## Current Next Action -Add a deliberate retry or fallback strategy for projector-routed Qwen tool-call -failures, then rerun until a projector-routed sequential capture is -accepted-as-draft before materializing any branch into Ink or mutation training -data. +Materialize the accepted v10 projector-routed sequential capture into Ink and +reviewed mutation training data, keeping fuzzy state changes manual and audited. Cat/Oz remains useful as an Elysium procedural mechanics fixture, but grounded training data should start from authored historical lore rather than gameplay @@ -202,7 +201,7 @@ Completed projection path items: `tools/check_qwen_chat_tools.py` proves local `qwen3.5:9b` returns both `message.thinking` and native `tool_calls` through Ollama `/api/chat` - update the sequential runner to use `/api/chat` with native tools and - `think: true` by default + strict tool calls - add v3 and v5 thinking-plus-tools captures: v3 preserved a useful failure where old prompt text still caused plain JSON content in later passes; v5 is accepted as draft and produced valid @@ -240,15 +239,22 @@ Completed projection path items: v8 shows malformed stringified `choices`; v9 shows a no-tool-call dropout. These are Qwen tool reliability failures, so no projector-routed branch was materialized into Ink in this pass. +- disable thinking by default for strict sequential generation: + the v9 thinking trace showed Qwen looping on schema self-checks for minutes + before returning no tool call, so `tools/run_qwen_ink_sequential_generation.py` + now defaults to `think: false`; use `--think` only for diagnostics +- add v10 no-thinking projector-routed capture: + `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.capture.json` + validates as accepted-as-draft with no repair notes or failure notes Remaining projection path: - build a deterministic speaker-local input slicer - build a renderer that emits projection controls before prompt prose -- add a deliberate retry or fallback strategy around projector-routed Qwen - tool-call failures -- rerun until a projector-routed capture is accepted-as-draft before - materializing into Ink and mutation training data +- materialize the accepted v10 projector-routed capture into Ink and reviewed + mutation training data +- preserve the no-thinking default for strict tool-call generation unless a + diagnostic run explicitly needs `--think` - improve the local-awareness-to-Ink prompt so semantic `training_hooks` do not drift into future branch ids, object custody remains branch-local, and action labels come from the exact canonical enum diff --git a/notes/ghostlight-current-system-map.md b/notes/ghostlight-current-system-map.md index ee77122..56cf1b5 100644 --- a/notes/ghostlight-current-system-map.md +++ b/notes/ghostlight-current-system-map.md @@ -156,6 +156,9 @@ state and re-entry discipline. - `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v9-projector-tightened.capture.json` - useful-needs-revision receipt showing Qwen can still drop tool calls entirely under projector-routed prompting +- `experiments/ink/cold-wake-sanctuary-intake-qwen-sequential-v10-no-think.capture.json` + - accepted-as-draft receipt showing projector-routed sequential generation + works cleanly when strict tool calls run with thinking disabled - `examples/projected-contexts/` - current rendered projected local context artifacts for Maer and Sella in the sanctuary intake scene @@ -196,7 +199,7 @@ state and re-entry discipline. annotation - `tools/run_qwen_ink_sequential_generation.py` - builds a sequential Qwen prototype through Ollama `/api/chat` with native - tools and thinking enabled: actor-local choices, participant + tools and thinking disabled by default: actor-local choices, participant appraisal/consolidation, then next-actor action from updated state; now routes character context through the projected-local-context seam, captures failed Maer choice calls, separates repair notes from fatal validation @@ -241,6 +244,8 @@ characters, v2 shows the symmetrical turn model improves action behavior, v5 proves local thinking-plus-tools invocation works for the scene runner, and v6 routes that runner through projected character-local operating context. v8 and v9 show that Qwen tool-call reliability, not the projector seam, is now the -immediate blocker. The next implementation target is an explicit retry or -fallback strategy before any projector-routed branch is materialized into Ink -plus mutation training data. +immediate blocker. The v9 thinking trace also showed schema self-check looping +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. The next implementation target is +materializing v10 into Ink plus reviewed mutation training data. diff --git a/notes/ghostlight-implementation-plan.md b/notes/ghostlight-implementation-plan.md index 3e3785f..46e297e 100644 --- a/notes/ghostlight-implementation-plan.md +++ b/notes/ghostlight-implementation-plan.md @@ -138,9 +138,14 @@ - Eighth and ninth sequential drafts: v8 captured malformed stringified `choices`; v9 captured a no-tool-call dropout. Both validate the receipt path and show Qwen tool reliability is now the blocker. - - Next prototype: add deliberate retry or fallback behavior for - projector-routed Qwen tool-call failures, then materialize only an - accepted-as-draft projector-routed branch into Ink and sidecar annotation. + - Thinking policy correction: v9's thinking trace showed minutes of schema + self-check looping followed by no tool call. Strict sequential generation + now defaults to `think: false`; `--think` is reserved for diagnostics. + - Tenth sequential draft: v10 ran projector-routed generation with thinking + disabled and validated as accepted-as-draft with no repair or failure + notes. + - Next prototype: materialize the accepted v10 projector-routed branch into + Ink and sidecar annotation, then produce reviewed mutation training data. 5. Build the projection distillation loop. Started. - Use `docs/architecture/projection-distillation-plan.md` as the teacher to diff --git a/state/evidence.jsonl b/state/evidence.jsonl index 675f6c3..df8aaef 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -39,3 +39,4 @@ {"ts": "2026-05-02T01:45:54+00:00", "type": "design", "status": "accepted", "note": "Hardened local-awareness invariant for Ink branching: protagonist choices and NPC responses must be separate generation passes. A responder should see only its own state plus observable protagonist action, not protagonist private intent or full protagonist-local state. The existing Qwen Ink draft is labeled as one-shot bootstrap scaffolding, not target runtime behavior."} {"ts": "2026-05-02T02:45:44+00:00", "type": "implementation", "status": "ok", "note": "Added ghostlight.projected_local_context.v0 seam and deterministic projector so sequential Qwen prompts consume character-local operating prose instead of raw canonical state variables. v6 projector-routed capture validated as useful-needs-revision due nested response_constraints stringification."} {"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."} diff --git a/state/map.yaml b/state/map.yaml index ba5d905..2b9ff38 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -116,7 +116,7 @@ accepted_design: - Every meaningful scene event should update each affected character's state, memory, relationship stance, or perceived overlay through a reviewed mutation receipt; Ink variables remain playthrough-local and do not become canonical truth by accident. - The first sequential Qwen capture is useful-needs-revision training material because it separated actor and responder context but lacked the per-turn participant appraisal boundary and returned non-canonical action labels. - The second sequential Qwen capture validates the symmetrical turn shape behaviorally by producing canonical action labels and a non-speech Sella action, but still needs revision because prose prompting did not enforce array-typed JSON fields. - - Qwen structured generation should use Ollama `/api/chat` with native tools and `think: true`, not `/api/generate` plus prose-only JSON instructions; Qwen's XML-shaped tool format is an internal chat-template/tool-call convention, not a reason to wrap Ghostlight artifacts in XML. + - Qwen structured generation should use Ollama `/api/chat` with native tools, not `/api/generate` plus prose-only JSON instructions; Qwen's XML-shaped tool format is an internal chat-template/tool-call convention, not a reason to wrap Ghostlight artifacts in XML. - The local Qwen tool path works with thinking enabled, but nested arguments can still double-stringify, so the runner repairs known nested fields and preserves failures as reviewed captures. - The current sequential Qwen runner is scaffolding, not the final projection architecture: it still sends selected raw numeric state variables directly to the model. - A projector/state interpreter must sit between canonical agent state and Qwen prompts, translating numbers, memories, relationships, culture, and scene pressure into compact character-local operating context and affordances. @@ -127,7 +127,9 @@ accepted_design: - Projector-routed next-action prompts should receive appraisal context as prose constraints, not raw numeric state deltas from the appraisal artifact. - Failed sequential Qwen calls must still write reviewed receipts instead of exiting without evidence. - v8 and v9 projector-routed captures show Qwen tool-call reliability remains the blocker: malformed stringified tool arrays and no-tool-call dropouts can occur even when the projector seam is clean. + - Thinking should be disabled by default for strict Qwen scene-generation tool calls; the v9 trace showed schema self-check looping that lasted minutes and ended with no tool call. + - The first no-thinking projector-routed sequential run, v10, validated as accepted-as-draft with no repair or failure notes. 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, and tightened receipt handling for projector-routed Qwen failures. - next_action: Add a deliberate retry or fallback strategy for projector-routed Qwen tool-call failures, then rerun until a projector-routed sequential capture is accepted-as-draft before materializing any branch into Ink or mutation training data. + 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, and a v10 no-thinking projector-routed capture accepted as draft. + next_action: Materialize the accepted v10 projector-routed sequential capture into Ink and reviewed mutation training data, keeping fuzzy state changes manual and audited. diff --git a/tools/run_qwen_ink_sequential_generation.py b/tools/run_qwen_ink_sequential_generation.py index ae4bf1e..1394987 100644 --- a/tools/run_qwen_ink_sequential_generation.py +++ b/tools/run_qwen_ink_sequential_generation.py @@ -704,7 +704,7 @@ def main() -> int: parser.add_argument("--top-p", type=float, default=0.9) parser.add_argument("--num-ctx", type=int, default=8192) parser.add_argument("--request-timeout", type=int, default=600) - parser.add_argument("--think", action=argparse.BooleanOptionalAction, default=True) + parser.add_argument("--think", action=argparse.BooleanOptionalAction, default=False) parser.add_argument("--capture-id", default="cold-wake-sanctuary-intake.qwen-sequential.v1") parser.add_argument("--preferred-action", default="show_object") args = parser.parse_args()