diff --git a/docs/architecture/sandboxed-responder-packets.md b/docs/architecture/sandboxed-responder-packets.md index 73ae7f4..8ffd381 100644 --- a/docs/architecture/sandboxed-responder-packets.md +++ b/docs/architecture/sandboxed-responder-packets.md @@ -57,6 +57,7 @@ The v0 packet seam is: - `schemas/responder-packet.schema.json` - `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.v0.json` +- `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json` - `tools/build_responder_packet.py` - `tools/validate_responder_packets.py` - `npm run responder-packets:validate` @@ -129,6 +130,12 @@ list consulted refs. The responder itself should not receive repo access unless the artifact uses `responder_scoped_repository_search`, sets `no_repo_access` to false, and includes visible research instructions in the prompt. +The current Sella research packet can be regenerated with: + +```powershell +& 'C:\Users\Meta\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe' .\tools\build_responder_packet.py --lore-access-mode responder_scoped_repository_search +``` + Retrieval can also make the packet worse if it floods the scene with faction or event context and starves the character's own scars. The Sella v0 comparison is the first warning shot: the retrieval-augmented output used heat-debt and rescue diff --git a/examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json b/examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json new file mode 100644 index 0000000..8f657ad --- /dev/null +++ b/examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json @@ -0,0 +1,161 @@ +{ + "schema_version": "ghostlight.responder_packet.v0", + "packet_id": "packet.cold_wake.sanctuary_intake.sella_response.research.v0", + "review_status": "accepted_as_draft", + "fixture_lane": "historical_grounded", + "canon_status": "single_history", + "coordinator_artifact_ref": "examples/coordinator/cold-wake-sanctuary-intake.v0.json", + "projected_context_ref": "examples/projected-contexts/scene-02-sanctuary-intake.sella_ren.projected-context.json", + "responder_agent_id": "sella_ren", + "generation_lane": "retrieval_augmented", + "lore_access": { + "mode": "responder_scoped_repository_search", + "allowed_scope": [ + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Cold Wake Panic.md", + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Ganymede Route Compact.md", + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Major/Cetacean Navigators.md", + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Minor/Lightsail Express.md" + ], + "required_provenance": true, + "research_instructions": [ + "Consult the allowed AetheriaLore scope before answering; do not rely only on the packet excerpts.", + "Ground Sella's behavior in retrieved institutional, factional, species, location, and crisis-context details.", + "Treat retrieved lore as world constraint and cultural pressure, not as access to another character's hidden intent.", + "Record the consulted refs and a concise research summary in the response object." + ] + }, + "visible_context": { + "local_context_prompt": "# 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\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## Embodiment And Interface\n- Use only the body, tools, interfaces, and movement affordances established by this character's fixture and the current scene.\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## Retrieved Lore To Keep In View\n- Cold Wake pressure involves thermal stealth, ghost tracks, delayed heat dumps, misclassified quiet-running vessels, insurer categories, certified quiet-running envelopes, and heat-debt tolerances.\n- Navigator rescue ledgers record who answered distress calls, held formation in lethal weather, and kept sanctuary promises when a paying client wanted otherwise; those records shape credit, escort priority, arbitration, and kinship ties.\n- Aya-aligned sanctuary care is practical capacity politics as much as compassion: beds, air, food, consent, repair, decontamination, staff attention, and follow-through decide what care can honestly promise.\n- The Ganymede Route Compact ties rescue obligations, shared hazard ledgers, route-steward representation, and Navigator arbitration to corridor legitimacy; Lightsail reliability depends on being the boring answer that still arrives when trust is scarce.\n\n## Latent Pressure Handling\n- Sella once watched a sanctuary overpromise safety and turn refuge into a sorting machine with kinder lighting. Use as latent behavioral pressure, not as required spoken disclosure.\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.", + "observed_event": { + "event_id": "event.maer.packet_display_for_triage", + "actor_agent_id": "maer_tidecall", + "observable_action": "Maer routes the corrupted distress packet through a shared clinic display so Sella can inspect routing terms, telemetry gaps, and ledger implications without treating the packet as clean proof.", + "spoken_text": "Here. The telemetry is incomplete, but the routing logic suggests a distress pattern. It is not proof of a person, but it is not noise either. Decide if the math supports intake.", + "visible_object_refs": [ + "corrupted_distress_packet", + "shared_clinic_display", + "sanctuary_ledger" + ], + "visibility_notes": [ + "Sella can observe Maer's displayed packet evidence and spoken request.", + "The packet remains unresolved evidence, not proof of personhood." + ] + }, + "allowed_action_labels": [ + "speak", + "silence", + "gesture", + "movement", + "inspect_object", + "show_object", + "withhold_object", + "transfer_object", + "set_condition", + "refuse", + "wait", + "withdraw", + "attack" + ], + "source_excerpts": [ + { + "ref_id": "local_stakes.capacity", + "source_ref": "examples/projected-contexts/scene-02-sanctuary-intake.sella_ren.projected-context.json#context.current_stakes", + "text": "Sanctuary beds and repair capacity are nearly exhausted." + }, + { + "ref_id": "local_rule.care_capacity", + "source_ref": "examples/projected-contexts/scene-02-sanctuary-intake.sella_ren.projected-context.json#context.active_inner_pressures", + "text": "Care is not a feeling; it is beds, food, air, consent, repair, and someone still doing the list when the room hates them." + }, + { + "ref_id": "local_boundary.packet_unresolved", + "source_ref": "examples/projected-contexts/scene-02-sanctuary-intake.sella_ren.projected-context.json#context.do_not_invent", + "text": "Do not resolve whether the corrupted packet contains a person." + }, + { + "ref_id": "lore.cold_wake_heat_debt", + "source_ref": "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Cold Wake Panic.md", + "text": "Cold Wake pressure involves thermal stealth, ghost tracks, delayed heat dumps, misclassified quiet-running vessels, insurer categories, certified quiet-running envelopes, and heat-debt tolerances." + }, + { + "ref_id": "lore.navigator_rescue_ledgers", + "source_ref": "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Major/Cetacean Navigators.md#Rescue Ledgers", + "text": "Navigator rescue ledgers record who answered distress calls, held formation in lethal weather, and kept sanctuary promises when a paying client wanted otherwise; those records shape credit, escort priority, arbitration, and kinship ties." + }, + { + "ref_id": "lore.aya_sanctuary_capacity", + "source_ref": "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Major/Aya Collective.md; agents.sella_ren.memories.memory-care-is-capacity", + "text": "Aya-aligned sanctuary care is practical capacity politics as much as compassion: beds, air, food, consent, repair, decontamination, staff attention, and follow-through decide what care can honestly promise." + }, + { + "ref_id": "lore.ganymede_lightsail_route_obligations", + "source_ref": "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Ganymede Route Compact.md; AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Minor/Lightsail Express.md", + "text": "The Ganymede Route Compact ties rescue obligations, shared hazard ledgers, route-steward representation, and Navigator arbitration to corridor legitimacy; Lightsail reliability depends on being the boring answer that still arrives when trust is scarce." + } + ] + }, + "output_contract": { + "response_schema": "Return one JSON object. Do not wrap it in Markdown. The object describes this responder's next visible action and optional speech, plus private interpretation clearly labeled as interpretation.", + "required_fields": [ + "responder_agent_id", + "action_label", + "visible_action", + "spoken_text", + "private_interpretation", + "intended_effect", + "state_update_candidates", + "relationship_update_candidates", + "unresolved_hooks", + "consulted_refs", + "research_summary" + ], + "response_rules": [ + "Use exactly one allowed action label.", + "The visible action must be observable by other characters in the scene.", + "Spoken text may be empty if silence or action is the response.", + "Private interpretation may describe what Sella suspects or feels, but not what Maer truly intended.", + "State and relationship updates are candidates only; the coordinator or mutator decides what becomes canonical.", + "Do not prove or disprove packet personhood.", + "Do not copy instruction text into in-world speech.", + "Consulted refs must list the scoped lore documents actually inspected before answering.", + "Research summary must state how retrieved lore constrained the action, without dumping lore into dialogue." + ] + }, + "hidden_context_audit": { + "omitted_context_refs": [ + "maer_tidecall.canonical_private_state", + "coordinator_artifact.coordinator_decision.rationale", + "author_only.packet_personhood_resolution", + "future_branch_plans" + ], + "forbidden_inference_classes": [ + "other_agent_private_state_as_fact", + "author_only_resolution", + "future_branch_knowledge", + "raw_numeric_state_variables", + "coordinator_strategy" + ], + "known_absences": [ + "No hidden proof of packet personhood is present in this packet.", + "No hidden Sella acceptance outcome is present in this packet.", + "No omniscient narrator guidance is present in this packet." + ] + }, + "isolation_requirements": { + "isolation_method": "subagent_no_fork", + "packet_only": true, + "no_repo_access": false, + "no_conversation_context": true, + "no_hidden_state_refs": true + }, + "packet_prompt_text": "# Ghostlight Sandboxed Responder Packet\n\nYou are acting only as the named responder. Use only this packet.\nDo not treat guesses about another character's intent as fact.\nIf you need to guess intent, mark it as this character's interpretation, not truth.\n\n## Required Lore Research\nBefore answering, inspect the declared lore scope and ground your action in what those sources make true or likely.\nUse lore to constrain behavior, affordances, institutions, vocabulary, and material stakes. Do not use it to gain hidden character state, author-only answers, or future branch knowledge.\nIf a scoped source contradicts the packet, follow the packet for character-local knowledge and flag the contradiction in unresolved hooks.\nYour output capture must list consulted refs and a brief research summary; an answer with no consulted refs is a failed research-enabled response.\n\nAllowed research scope:\n- AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Cold Wake Panic.md\n- AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Ganymede Route Compact.md\n- AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Major/Cetacean Navigators.md\n- AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Minor/Lightsail Express.md\n\nResearch instructions:\n- Consult the allowed AetheriaLore scope before answering; do not rely only on the packet excerpts.\n- Ground Sella's behavior in retrieved institutional, factional, species, location, and crisis-context details.\n- Treat retrieved lore as world constraint and cultural pressure, not as access to another character's hidden intent.\n- Record the consulted refs and a concise research summary in the response object.\n\n## Local Operating Context\n# 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\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## Embodiment And Interface\n- Use only the body, tools, interfaces, and movement affordances established by this character's fixture and the current scene.\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## Retrieved Lore To Keep In View\n- Cold Wake pressure involves thermal stealth, ghost tracks, delayed heat dumps, misclassified quiet-running vessels, insurer categories, certified quiet-running envelopes, and heat-debt tolerances.\n- Navigator rescue ledgers record who answered distress calls, held formation in lethal weather, and kept sanctuary promises when a paying client wanted otherwise; those records shape credit, escort priority, arbitration, and kinship ties.\n- Aya-aligned sanctuary care is practical capacity politics as much as compassion: beds, air, food, consent, repair, decontamination, staff attention, and follow-through decide what care can honestly promise.\n- The Ganymede Route Compact ties rescue obligations, shared hazard ledgers, route-steward representation, and Navigator arbitration to corridor legitimacy; Lightsail reliability depends on being the boring answer that still arrives when trust is scarce.\n\n## Latent Pressure Handling\n- Sella once watched a sanctuary overpromise safety and turn refuge into a sorting machine with kinder lighting. Use as latent behavioral pressure, not as required spoken disclosure.\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\n## Observed Event\n- Event id: event.maer.packet_display_for_triage\n- Actor: maer_tidecall\n- Observable action: Maer routes the corrupted distress packet through a shared clinic display so Sella can inspect routing terms, telemetry gaps, and ledger implications without treating the packet as clean proof.\n- Spoken text: Here. The telemetry is incomplete, but the routing logic suggests a distress pattern. It is not proof of a person, but it is not noise either. Decide if the math supports intake.\n- Visibility note: Sella can observe Maer's displayed packet evidence and spoken request.\n- Visibility note: The packet remains unresolved evidence, not proof of personhood.\n\n## Allowed Action Labels\nspeak, silence, gesture, movement, inspect_object, show_object, withhold_object, transfer_object, set_condition, refuse, wait, withdraw, attack\n\n## Source Excerpts\n- local_stakes.capacity: Sanctuary beds and repair capacity are nearly exhausted.\n- local_rule.care_capacity: Care is not a feeling; it is beds, food, air, consent, repair, and someone still doing the list when the room hates them.\n- local_boundary.packet_unresolved: Do not resolve whether the corrupted packet contains a person.\n- lore.cold_wake_heat_debt: Cold Wake pressure involves thermal stealth, ghost tracks, delayed heat dumps, misclassified quiet-running vessels, insurer categories, certified quiet-running envelopes, and heat-debt tolerances.\n- lore.navigator_rescue_ledgers: Navigator rescue ledgers record who answered distress calls, held formation in lethal weather, and kept sanctuary promises when a paying client wanted otherwise; those records shape credit, escort priority, arbitration, and kinship ties.\n- lore.aya_sanctuary_capacity: Aya-aligned sanctuary care is practical capacity politics as much as compassion: beds, air, food, consent, repair, decontamination, staff attention, and follow-through decide what care can honestly promise.\n- lore.ganymede_lightsail_route_obligations: The Ganymede Route Compact ties rescue obligations, shared hazard ledgers, route-steward representation, and Navigator arbitration to corridor legitimacy; Lightsail reliability depends on being the boring answer that still arrives when trust is scarce.\n\n## Output Contract\nReturn one JSON object. Do not wrap it in Markdown. The object describes this responder's next visible action and optional speech, plus private interpretation clearly labeled as interpretation.\n\nRequired fields: responder_agent_id, action_label, visible_action, spoken_text, private_interpretation, intended_effect, state_update_candidates, relationship_update_candidates, unresolved_hooks, consulted_refs, research_summary\n\nRules:\n- Use exactly one allowed action label.\n- The visible action must be observable by other characters in the scene.\n- Spoken text may be empty if silence or action is the response.\n- Private interpretation may describe what Sella suspects or feels, but not what Maer truly intended.\n- State and relationship updates are candidates only; the coordinator or mutator decides what becomes canonical.\n- Do not prove or disprove packet personhood.\n- Do not copy instruction text into in-world speech.\n- Consulted refs must list the scoped lore documents actually inspected before answering.\n- Research summary must state how retrieved lore constrained the action, without dumping lore into dialogue.", + "review": { + "reviewer": "Codex", + "review_notes": [ + "Research-enabled responder packet for sandboxed gold-data shakedown.", + "The responder must inspect scoped AetheriaLore refs before answering and preserve consulted refs plus research summary." + ], + "accepted_for_sandbox_use": true, + "failure_labels": [] + } +} diff --git a/notes/fresh-workspace-handoff.md b/notes/fresh-workspace-handoff.md index 018e4e7..7f05a47 100644 --- a/notes/fresh-workspace-handoff.md +++ b/notes/fresh-workspace-handoff.md @@ -66,6 +66,7 @@ Ghostlight now has the persistence spine plus the first architecture payload: - `schemas/responder-output.schema.json` - `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.v0.json` - `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.v1.json` + - `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json` - `experiments/responder-packets/cold-wake-sanctuary-intake-sella-v0.capture.json` - `experiments/responder-packets/cold-wake-sanctuary-intake-sella-v0.mutation.json` - `experiments/responder-packets/cold-wake-sanctuary-intake-sella-retrieval-v0.capture.json` @@ -206,6 +207,12 @@ Research`, `allowed_scope`, and `research_instructions`; the output capture must include consulted refs and a research summary. A research-enabled responder that answers without consulting lore has failed the assignment, bless its little unexamined heart. +The first concrete research-enabled Sella packet now exists at +`examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json`. +It is generated with +`tools/build_responder_packet.py --lore-access-mode responder_scoped_repository_search`, +sets `no_repo_access` false, and requires `consulted_refs` plus +`research_summary` in the responder object. The v1 Sella packet removes responder-visible references to absent coordinator knowledge and adds curated AetheriaLore excerpts for Cold Wake, the Ganymede Route Compact, Navigator rescue ledgers, and Lightsail reliability. @@ -258,15 +265,13 @@ narrow elaboration before treating the detail as available to Ghostlight. ## Current Next Action -Use the corrected packet surface for the next fresh generation pass: run a -sandboxed responder against the regenerated Sella packet, then review whether -the output uses institutional lore and latent pressure without prompt parroting, -omniscience, or mission-critical trauma-dumping. Do not call Qwen for gold -responder data yet. -If this next pass is meant to test a research-enabled responder rather than -packet-only runtime parity, build or hand off it as -`responder_scoped_repository_search` and require it to consult the scoped -AetheriaLore docs before answering. +Run a sandboxed no-fork research-enabled responder against +`examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json`, +allowing only the declared AetheriaLore scope. Capture exact visible input, +consulted refs, research summary, raw output, review labels, and leakage audit. +Review whether the output uses institutional lore and latent pressure without +prompt parroting, omniscience, or mission-critical trauma-dumping. Do not call +Qwen for gold responder data yet. Cat/Oz remains useful as an Elysium procedural mechanics fixture, but single-history grounding should start from authored historical lore rather than diff --git a/notes/ghostlight-current-system-map.md b/notes/ghostlight-current-system-map.md index 03f0352..a153506 100644 --- a/notes/ghostlight-current-system-map.md +++ b/notes/ghostlight-current-system-map.md @@ -163,6 +163,11 @@ state and re-entry discipline. responder-visible prose and curated AetheriaLore excerpts added for Cold Wake, Ganymede rescue obligations, Navigator rescue ledgers, and Lightsail reliability +- `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json` + - first concrete research-enabled Sella handoff; it uses + `responder_scoped_repository_search`, declares the allowed AetheriaLore + scope, permits repo access only for that scope, and requires consulted refs + plus research summary in the responder object - `experiments/responder-packets/cold-wake-sanctuary-intake-sella-v0.capture.json` - first no-fork sandboxed responder output capture from the Sella packet; accepted as draft with no leakage flags and no coordinator prose repair @@ -314,9 +319,9 @@ state and re-entry discipline. fields, world-state refs, branch constraints, proposed deltas, unresolved hooks, and review status - `tools/build_responder_packet.py` - - builds the first packet-only responder handoff from a coordinator artifact - and projected local context; source excerpts now come from active projected - runtime retrieval requirements instead of a static lore list + - builds packet-only or research-enabled responder handoffs from a coordinator + artifact and projected local context; source excerpts now come from active + projected runtime retrieval requirements instead of a static lore list - `tools/validate_responder_packets.py` - validates responder packets and rejects prompt surfaces that leak raw state internals or hidden coordinator context markers @@ -392,6 +397,8 @@ That explicit repo-access path is now named consult the declared lore docs before answering, show the allowed scope, and give behavior-grounding research instructions. The capture must record consulted refs and a research summary. +The first concrete research-enabled Sella packet has now been generated and +validates alongside the packet-only handoffs. The first lane comparison is now captured: packet-only produced a clean conditional repair-bay decision, while retrieval-augmented added heat-debt, rescue-ledger, dockfall, and Aya sanctuary politics that should inform future diff --git a/state/evidence.jsonl b/state/evidence.jsonl index e347b86..8d19842 100644 --- a/state/evidence.jsonl +++ b/state/evidence.jsonl @@ -68,3 +68,4 @@ {"ts": "2026-05-02T10:02:28+00:00", "type": "design", "status": "accepted", "note": "Refined character-pressure retention doctrine: packet-visible backstory such as Sella Ren's sanctuary-collapse scar should be available to shape responder behavior, but review must not reward unnecessary trauma-dumping or require the scar to surface in mission-critical speech."} {"ts": "2026-05-02T10:08:14+00:00", "type": "implementation", "status": "ok", "note": "Implemented runtime retrieval/projector requirements. Projected local contexts now emit source-backed runtime_retrieval_requirements and latent_pressure_requirements; prompt text renders retrieved lore and latent pressure handling; responder packets copy active retrieval requirements into source_excerpts so packet-only contexts receive compact Cold Wake heat-debt, Navigator rescue-ledger, Aya sanctuary-capacity, and Ganymede/Lightsail route-obligation facts without granting repo access or forcing character backstory into speech."} {"ts": "2026-05-02T10:11:38+00:00", "type": "design", "status": "accepted", "note": "Added explicit research-enabled responder instructions. `responder_scoped_repository_search` now means the responder may inspect only the declared lore scope, must consult it before answering, and must ground behavior in retrieved lore docs; packet validation requires visible research instructions and output validation requires consulted refs plus a research summary."} +{"ts": "2026-05-02T10:17:55+00:00", "type": "implementation", "status": "ok", "note": "Generated the first concrete research-enabled Sella responder packet. build_responder_packet.py now supports responder_scoped_repository_search, sets repo access open only for that lane, renders Required Lore Research, and requires consulted_refs plus research_summary."} diff --git a/state/map.yaml b/state/map.yaml index 62c429d..6462df2 100644 --- a/state/map.yaml +++ b/state/map.yaml @@ -158,6 +158,7 @@ accepted_design: - The first responder lane comparison shows packet-only output proves bounded runtime competence, while retrieval-augmented output adds heat-debt timing, rescue-ledger burden, dockfall responsibility, and Aya sanctuary capacity politics that should become retrieval/projector requirements. - Runtime retrieval/projector requirements are now first-class projected-context fields: compact source-backed lore facts flow into packet source excerpts when scene-relevant, and latent character-history pressure remains visible without becoming required spoken disclosure. - Research-enabled responder mode is now explicit: `responder_scoped_repository_search` packets must surface required lore research instructions and allowed scope, and captures must preserve consulted refs plus a research summary so ignored research access is reviewable. + - The first concrete research-enabled Sella packet now exists at `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json`; it is generated by `tools/build_responder_packet.py --lore-access-mode responder_scoped_repository_search` and requires scoped AetheriaLore consultation before response. - The concrete training plan enumerates the trainable stages and their model families: generative decoder LLMs for coordinator/responder/soft structured outputs, classifiers or cross-encoders for appraisal/evaluation/relationship movement, retrieval models for memory and lore selection, and deterministic code for gates. - Training-plan sample counts are pilot schema-shakedown gates, not robust corpus targets; pilot data may be invalidated by schema fixes, while review-assistant and runtime targets are expected to be roughly an order of magnitude larger with held-out evaluation and failure audits. - The timeline training plan now requires future-branch Elysium examples so the responder, coordinator, appraiser, and decision models learn post-Rupture concepts such as Aether, pseudospace, temporal nonlinearity, spirits, necrotech, mutable bodies, altered substrates, and weird institutions under branch-lineage labels. @@ -170,5 +171,5 @@ accepted_design: - Ghostlight's technology pipeline should function as a content refinery: ground ideas in lore and mechanics, decompose them into parts and supply chains, map them to Aetheria-Economy blueprint classes, define performance and instance variation, preserve review labels, and produce database-shaped candidates instead of spreadsheet sludge. 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 coordinator artifact schema seam, the first responder packet seam, the first sandboxed responder output seam, explicit packet-only versus retrieval-augmented responder lanes, the first responder lane comparison, the first draft Cold Wake historical grounding digest, a Cold Wake story-lab fixture, projection controls, validated Qwen capture receipts, a complete Cold Wake short story assembled from accepted projection outputs, a hand-authored Ink-backed Cold Wake branching scene, the first Qwen-generated Ink draft materialized from local awareness with reviewed training annotations, the first reviewed sequential branch mutation that updates both Maer and Sella after a sanctuary intake beat, a v2 sequential Qwen capture proving the symmetrical turn shape produces better action behavior, a v5 sequential Qwen capture proving local thinking-plus-tools invocation works for the scene runner, the first projected-local-context seam that routes sequential prompts through character-local operating prose instead of raw state variables, tightened receipt handling for projector-routed Qwen failures, a default no-thinking policy for strict sequential tool calls, a v10 no-thinking projector-routed capture accepted as draft, the first materialized projector-routed sequential Ink scene with reviewed mutation training data, a source-checked embodiment/interface projection surface for Navigator scenes, a formal source-first Aetheria generation doctrine, v11-v17 source-checked retry receipts showing improved Maer embodiment plus remaining Sella response/prompt-leak blockers, a soft-model training artifact doctrine, a concrete training plan with pilot schema-shakedown gates separated from robust corpus targets, sandboxed responder-data requirements, an explicit future-branch lane, Elysium branch event constraints, and a technology/item manifest plan for turning nebulous named tech into blueprint-grade components, assemblies, faction tech bases, supply chains, upgrade paths, gameplay hooks, provenance-hunting player fantasy, and content-refinery outputs mapped onto Aetheria-Economy's CultCache blueprint and instance model. - next_action: Use the corrected packet surface for the next fresh generation pass. If testing runtime parity, run a packet-only sandboxed responder against the regenerated Sella packet. If testing research-enabled behavior, build the handoff as `responder_scoped_repository_search` and require scoped AetheriaLore consultation before answering. Review for institutional lore use, latent pressure, prompt parroting, omniscience, and mission-critical trauma-dumping. Do not call Qwen for gold responder data yet. + 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 coordinator artifact schema seam, the first responder packet seam, the first sandboxed responder output seam, explicit packet-only versus retrieval-augmented responder lanes, the first concrete research-enabled Sella packet, the first responder lane comparison, the first draft Cold Wake historical grounding digest, a Cold Wake story-lab fixture, projection controls, validated Qwen capture receipts, a complete Cold Wake short story assembled from accepted projection outputs, a hand-authored Ink-backed Cold Wake branching scene, the first Qwen-generated Ink draft materialized from local awareness with reviewed training annotations, the first reviewed sequential branch mutation that updates both Maer and Sella after a sanctuary intake beat, a v2 sequential Qwen capture proving the symmetrical turn shape produces better action behavior, a v5 sequential Qwen capture proving local thinking-plus-tools invocation works for the scene runner, the first projected-local-context seam that routes sequential prompts through character-local operating prose instead of raw state variables, tightened receipt handling for projector-routed Qwen failures, a default no-thinking policy for strict sequential tool calls, a v10 no-thinking projector-routed capture accepted as draft, the first materialized projector-routed sequential Ink scene with reviewed mutation training data, a source-checked embodiment/interface projection surface for Navigator scenes, a formal source-first Aetheria generation doctrine, v11-v17 source-checked retry receipts showing improved Maer embodiment plus remaining Sella response/prompt-leak blockers, a soft-model training artifact doctrine, a concrete training plan with pilot schema-shakedown gates separated from robust corpus targets, sandboxed responder-data requirements, an explicit future-branch lane, Elysium branch event constraints, and a technology/item manifest plan for turning nebulous named tech into blueprint-grade components, assemblies, faction tech bases, supply chains, upgrade paths, gameplay hooks, provenance-hunting player fantasy, and content-refinery outputs mapped onto Aetheria-Economy's CultCache blueprint and instance model. + next_action: Run a sandboxed no-fork research-enabled responder against `examples/responder-packets/scene-02-sanctuary-intake.sella_ren.packet.research.v0.json`, allowing only the declared AetheriaLore scope, then capture exact visible input, consulted refs, research summary, raw output, review labels, and leakage audit. Review for institutional lore use, latent pressure, prompt parroting, omniscience, and mission-critical trauma-dumping. Do not call Qwen for gold responder data yet. diff --git a/tools/build_responder_packet.py b/tools/build_responder_packet.py index ebc58eb..b6c8cc3 100644 --- a/tools/build_responder_packet.py +++ b/tools/build_responder_packet.py @@ -17,6 +17,7 @@ ROOT = Path(__file__).resolve().parents[1] DEFAULT_COORDINATOR = ROOT / "examples" / "coordinator" / "cold-wake-sanctuary-intake.v0.json" DEFAULT_PROJECTED = ROOT / "examples" / "projected-contexts" / "scene-02-sanctuary-intake.sella_ren.projected-context.json" DEFAULT_OUT = ROOT / "examples" / "responder-packets" / "scene-02-sanctuary-intake.sella_ren.packet.v1.json" +DEFAULT_RESEARCH_OUT = ROOT / "examples" / "responder-packets" / "scene-02-sanctuary-intake.sella_ren.packet.research.v0.json" ALLOWED_ACTION_LABELS = [ "speak", @@ -141,28 +142,100 @@ def build_source_excerpts(projected: dict[str, Any]) -> list[dict[str, str]]: return excerpts -def build_packet(coordinator: dict[str, Any], projected: dict[str, Any], out_ref: str) -> dict[str, Any]: +def build_lore_access(mode: str) -> dict[str, Any]: + allowed_scope = [ + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Cold Wake Panic.md", + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Ganymede Route Compact.md", + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Major/Cetacean Navigators.md", + "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Minor/Lightsail Express.md", + ] + lore_access = { + "mode": mode, + "allowed_scope": allowed_scope, + "required_provenance": True, + } + if mode == "responder_scoped_repository_search": + lore_access["research_instructions"] = [ + "Consult the allowed AetheriaLore scope before answering; do not rely only on the packet excerpts.", + "Ground Sella's behavior in retrieved institutional, factional, species, location, and crisis-context details.", + "Treat retrieved lore as world constraint and cultural pressure, not as access to another character's hidden intent.", + "Record the consulted refs and a concise research summary in the response object.", + ] + return lore_access + + +def build_output_contract(lore_mode: str) -> dict[str, Any]: + required_fields = [ + "responder_agent_id", + "action_label", + "visible_action", + "spoken_text", + "private_interpretation", + "intended_effect", + "state_update_candidates", + "relationship_update_candidates", + "unresolved_hooks", + ] + response_rules = [ + "Use exactly one allowed action label.", + "The visible action must be observable by other characters in the scene.", + "Spoken text may be empty if silence or action is the response.", + "Private interpretation may describe what Sella suspects or feels, but not what Maer truly intended.", + "State and relationship updates are candidates only; the coordinator or mutator decides what becomes canonical.", + "Do not prove or disprove packet personhood.", + "Do not copy instruction text into in-world speech.", + ] + if lore_mode == "responder_scoped_repository_search": + required_fields.extend(["consulted_refs", "research_summary"]) + response_rules.extend( + [ + "Consulted refs must list the scoped lore documents actually inspected before answering.", + "Research summary must state how retrieved lore constrained the action, without dumping lore into dialogue.", + ] + ) + return { + "response_schema": "Return one JSON object. Do not wrap it in Markdown. The object describes this responder's next visible action and optional speech, plus private interpretation clearly labeled as interpretation.", + "required_fields": required_fields, + "response_rules": response_rules, + } + + +def build_packet( + coordinator: dict[str, Any], + projected: dict[str, Any], + out_ref: str, + *, + generation_lane: str, + lore_mode: str, +) -> dict[str, Any]: responder_agent_id = projected["input"]["local_agent_id"] + if lore_mode == "responder_scoped_repository_search": + packet_id = "packet.cold_wake.sanctuary_intake.sella_response.research.v0" + isolation_method = "subagent_no_fork" + no_repo_access = False + review_notes = [ + "Research-enabled responder packet for sandboxed gold-data shakedown.", + "The responder must inspect scoped AetheriaLore refs before answering and preserve consulted refs plus research summary.", + ] + else: + packet_id = "packet.cold_wake.sanctuary_intake.sella_response.v1" + isolation_method = "manual_packet_only" + no_repo_access = True + review_notes = [ + "Second responder packet draft for sandboxed gold-data generation.", + "Adds explicit packet_only lane labels and curated AetheriaLore excerpts while keeping absent hidden context in audit fields, not responder-visible prose.", + ] packet = { "schema_version": "ghostlight.responder_packet.v0", - "packet_id": "packet.cold_wake.sanctuary_intake.sella_response.v1", + "packet_id": packet_id, "review_status": "accepted_as_draft", "fixture_lane": coordinator["fixture_lane"], "canon_status": coordinator["canon_status"], "coordinator_artifact_ref": "examples/coordinator/cold-wake-sanctuary-intake.v0.json", "projected_context_ref": "examples/projected-contexts/scene-02-sanctuary-intake.sella_ren.projected-context.json", "responder_agent_id": responder_agent_id, - "generation_lane": "packet_only", - "lore_access": { - "mode": "curated_excerpts_only", - "allowed_scope": [ - "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Cold Wake Panic.md", - "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Timeline/Events/Ganymede Route Compact.md", - "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Major/Cetacean Navigators.md", - "AetheriaLore:Aetheria/Worldbuilding/Pre-Elysium/Factions/Powers/Minor/Lightsail Express.md", - ], - "required_provenance": True, - }, + "generation_lane": generation_lane, + "lore_access": build_lore_access(lore_mode), "visible_context": { "local_context_prompt": projected["context"]["prompt_text"], "observed_event": { @@ -179,29 +252,7 @@ def build_packet(coordinator: dict[str, Any], projected: dict[str, Any], out_ref "allowed_action_labels": ALLOWED_ACTION_LABELS, "source_excerpts": build_source_excerpts(projected), }, - "output_contract": { - "response_schema": "Return one JSON object. Do not wrap it in Markdown. The object describes this responder's next visible action and optional speech, plus private interpretation clearly labeled as interpretation.", - "required_fields": [ - "responder_agent_id", - "action_label", - "visible_action", - "spoken_text", - "private_interpretation", - "intended_effect", - "state_update_candidates", - "relationship_update_candidates", - "unresolved_hooks", - ], - "response_rules": [ - "Use exactly one allowed action label.", - "The visible action must be observable by other characters in the scene.", - "Spoken text may be empty if silence or action is the response.", - "Private interpretation may describe what Sella suspects or feels, but not what Maer truly intended.", - "State and relationship updates are candidates only; the coordinator or mutator decides what becomes canonical.", - "Do not prove or disprove packet personhood.", - "Do not copy instruction text into in-world speech.", - ], - }, + "output_contract": build_output_contract(lore_mode), "hidden_context_audit": { "omitted_context_refs": [ "maer_tidecall.canonical_private_state", @@ -223,19 +274,16 @@ def build_packet(coordinator: dict[str, Any], projected: dict[str, Any], out_ref ], }, "isolation_requirements": { - "isolation_method": "manual_packet_only", + "isolation_method": isolation_method, "packet_only": True, - "no_repo_access": True, + "no_repo_access": no_repo_access, "no_conversation_context": True, "no_hidden_state_refs": True, }, "packet_prompt_text": "", "review": { "reviewer": "Codex", - "review_notes": [ - "Second responder packet draft for sandboxed gold-data generation.", - "Adds explicit packet_only lane labels and curated AetheriaLore excerpts while keeping absent hidden context in audit fields, not responder-visible prose.", - ], + "review_notes": review_notes, "accepted_for_sandbox_use": True, "failure_labels": [], }, @@ -249,14 +297,31 @@ def main() -> int: parser.add_argument("--coordinator", type=Path, default=DEFAULT_COORDINATOR) parser.add_argument("--projected-context", type=Path, default=DEFAULT_PROJECTED) parser.add_argument("--out", type=Path, default=DEFAULT_OUT) + parser.add_argument( + "--lore-access-mode", + choices=["curated_excerpts_only", "coordinator_scoped_retrieval", "responder_scoped_repository_search"], + default="curated_excerpts_only", + ) args = parser.parse_args() + out_path = args.out + if args.lore_access_mode == "responder_scoped_repository_search" and args.out == DEFAULT_OUT: + out_path = DEFAULT_RESEARCH_OUT + if not out_path.is_absolute(): + out_path = ROOT / out_path coordinator = load_json(args.coordinator) projected = load_json(args.projected_context) - out_ref = args.out.relative_to(ROOT).as_posix() if args.out.is_relative_to(ROOT) else str(args.out) - packet = build_packet(coordinator, projected, out_ref) - write_json(args.out, packet) - print(f"wrote {args.out.relative_to(ROOT)}") + out_ref = out_path.relative_to(ROOT).as_posix() if out_path.is_relative_to(ROOT) else str(out_path) + generation_lane = "retrieval_augmented" if args.lore_access_mode != "curated_excerpts_only" else "packet_only" + packet = build_packet( + coordinator, + projected, + out_ref, + generation_lane=generation_lane, + lore_mode=args.lore_access_mode, + ) + write_json(out_path, packet) + print(f"wrote {out_ref}") return 0