Keep the player boundary out of world cast
This commit is contained in:
parent
f678732b39
commit
31eae440bb
1 changed files with 26 additions and 1 deletions
|
|
@ -232,8 +232,14 @@ struct CompiledSeed {
|
|||
world_time: DateTime<Utc>,
|
||||
#[schemars(range(min = 1))]
|
||||
tick_hours: u32,
|
||||
#[schemars(
|
||||
description = "The single human-controlled player boundary. Never repeat this subject in actors or gestalt_members."
|
||||
)]
|
||||
player: CompiledActorState,
|
||||
locations: Vec<CompiledLocation>,
|
||||
#[schemars(
|
||||
description = "Autonomous nonplayer actors only. Never duplicate or proxy the singular player subject here."
|
||||
)]
|
||||
actors: Vec<CompiledActorState>,
|
||||
#[serde(default)]
|
||||
gestalts: Vec<GestaltPersonaState>,
|
||||
|
|
@ -954,7 +960,7 @@ impl WorldCompiler {
|
|||
.transpose()?
|
||||
.unwrap_or_default();
|
||||
let base_prompt = format!(
|
||||
"{shared_prefix}{approved_contract_context}{player_identity_context}{operational_playability_context}Compile a bounded playable region with stable topology, local actors, populations, clocks, and only those remote institutions that have a direct causal relationship to this requested start. SCOPED EVIDENCE contains direct_seed witnesses only. Setting-background and excluded witnesses remain visible in the approval coverage but are deliberately absent here: they cannot donate cast, incidents, clocks, location state, goals, or institutional posture to this branch. Use evidence as canon constraints, not as an exhaustive game map. A source marked with a `.gm_canon` authority lane may constrain hidden canonical state, but it must not be quoted or paraphrased into opening narration or granted as player or NPC knowledge merely because this compiler received it. When the Vault omits game-scale geometry, routes, local people, procedures, or daily texture, invent the smallest coherent playable elaboration, mark facts branch_local or provisional_local, and disclose consequential choices in branch_assumptions. An unevidenced route needed to connect the bounded region is branch-local geometry, not an evidence gap. Intentionally unresolved identities or population detail remain unresolved branch assumptions, not material gaps. Safely omitted remote candidates are global coverage limits, not material gaps. The `gaps` array is legal only when no compatible elaboration can preserve an exact approved premise clause without choosing between contradictory canon baselines, inventing an unanchored baseline explicitly required by the premise, or exceeding an approved capability. Every gap must name that exact premise clause and the exact choice requiring table approval. `The Vault does not specify X` is never sufficient. Use an empty gaps array when branch-local invention preserves the premise. Never borrow a nearby story to fill a gap. Do not eagerly materialize remote settlements or people outside the bounded playable region. Private character history, secrets, relationships, and relationship subjects are deliberately absent and compile in a separate private stage; do not assume or reconstruct them. Emit only supported canon facts. A canon_baseline fact must cite one or more exact receipt_id values printed in SCOPED EVIDENCE whose witnesses directly support the whole statement. Never label an invented proper noun canon. Facts that an actor can uncover through an admitted local observation must exist before play and list the exact discoverable_at_location_ids where that observation is possible. Seed enough branch_local or provisional_local discoverable facts to make the requested opening pressure and immediate goal actionable; at least one such non-canon fact must be discoverable at the player's exact starting location. The later action assessor can reveal an existing fact but cannot invent one. Facts that are private history or not directly observable have an empty discovery-location set. The player location and every actor location must exist. Containment describes nested geometry; it never creates implicit movement. Every supplied location is a playable occupancy node. When the region contains more than one location, explicit route chains must let the player reach every supplied location from the starting location and return. Model inaccessible scenery as a persistent feature instead of an unreachable location. Every route record needs a stable route_id within its origin, an exact supplied destination_id, a distance, and positive travel_minutes. Every fact discovery location must exist, clocks need positive thresholds, and the player id must be unique. Actor relationship records must use subject_id values copied from exact actor, institution, gestalt, or named-member subject IDs declared in this candidate, never display names, roles, undeclared groups, or location IDs. A relationship to a collective population names its exact gestalt; it does not union that population's knowledge or turn the actor into its authority. Represent populations that can act collectively (villages, crews, crowds, departments, corporations) as gestalt Personas. Seed a small roster of plausible durable member identities for people the player may encounter; member deltas contain only departures from their gestalt baseline and begin dematerialized. Do not duplicate a gestalt member in actors. Keep named plot-critical people as ordinary actors. Every gestalt home location and member gestalt reference must exist. Do not emit agency profiles or relations; those are compiled from the exact validated subject roster in the next stage."
|
||||
"{shared_prefix}{approved_contract_context}{player_identity_context}{operational_playability_context}Compile a bounded playable region with stable topology, local actors, populations, clocks, and only those remote institutions that have a direct causal relationship to this requested start. SCOPED EVIDENCE contains direct_seed witnesses only. Setting-background and excluded witnesses remain visible in the approval coverage but are deliberately absent here: they cannot donate cast, incidents, clocks, location state, goals, or institutional posture to this branch. Use evidence as canon constraints, not as an exhaustive game map. A source marked with a `.gm_canon` authority lane may constrain hidden canonical state, but it must not be quoted or paraphrased into opening narration or granted as player or NPC knowledge merely because this compiler received it. When the Vault omits game-scale geometry, routes, local people, procedures, or daily texture, invent the smallest coherent playable elaboration, mark facts branch_local or provisional_local, and disclose consequential choices in branch_assumptions. An unevidenced route needed to connect the bounded region is branch-local geometry, not an evidence gap. Intentionally unresolved identities or population detail remain unresolved branch assumptions, not material gaps. Safely omitted remote candidates are global coverage limits, not material gaps. The `gaps` array is legal only when no compatible elaboration can preserve an exact approved premise clause without choosing between contradictory canon baselines, inventing an unanchored baseline explicitly required by the premise, or exceeding an approved capability. Every gap must name that exact premise clause and the exact choice requiring table approval. `The Vault does not specify X` is never sufficient. Use an empty gaps array when branch-local invention preserves the premise. Never borrow a nearby story to fill a gap. Do not eagerly materialize remote settlements or people outside the bounded playable region. Private character history, secrets, relationships, and relationship subjects are deliberately absent and compile in a separate private stage; do not assume or reconstruct them. Emit only supported canon facts. A canon_baseline fact must cite one or more exact receipt_id values printed in SCOPED EVIDENCE whose witnesses directly support the whole statement. Never label an invented proper noun canon. Facts that an actor can uncover through an admitted local observation must exist before play and list the exact discoverable_at_location_ids where that observation is possible. Seed enough branch_local or provisional_local discoverable facts to make the requested opening pressure and immediate goal actionable; at least one such non-canon fact must be discoverable at the player's exact starting location. The later action assessor can reveal an existing fact but cannot invent one. Facts that are private history or not directly observable have an empty discovery-location set. The singular player object is the sole human-controlled subject projection. Never repeat its id, name, role, representative, or proxy in actors or gestalt_members; actors contains autonomous nonplayer individuals only. The player location and every actor location must exist. Containment describes nested geometry; it never creates implicit movement. Every supplied location is a playable occupancy node. When the region contains more than one location, explicit route chains must let the player reach every supplied location from the starting location and return. Model inaccessible scenery as a persistent feature instead of an unreachable location. Every route record needs a stable route_id within its origin, an exact supplied destination_id, a distance, and positive travel_minutes. Every fact discovery location must exist, clocks need positive thresholds, and the player id must be unique. Actor relationship records must use subject_id values copied from exact actor, institution, gestalt, or named-member subject IDs declared in this candidate, never display names, roles, undeclared groups, or location IDs. A relationship to a collective population names its exact gestalt; it does not union that population's knowledge or turn the actor into its authority. Represent populations that can act collectively (villages, crews, crowds, departments, corporations) as gestalt Personas. Seed a small roster of plausible durable member identities for people the player may encounter; member deltas contain only departures from their gestalt baseline and begin dematerialized. Do not duplicate a gestalt member in actors. Keep named plot-critical people as ordinary actors. Every gestalt home location and member gestalt reference must exist. Do not emit agency profiles or relations; those are compiled from the exact validated subject roster in the next stage."
|
||||
);
|
||||
let schema = serde_json::to_value(schema_for!(CompiledSeed))?;
|
||||
let sources = receipt_ids_for_coverage(&receipts, &evidence_coverage);
|
||||
|
|
@ -4838,6 +4844,23 @@ fn seed_to_campaign(mut seed: CompiledSeed, receipts: &[VaultEvidenceReceipt]) -
|
|||
"gestalt member",
|
||||
seed.gestalt_members.iter().map(|item| item.id.as_str()),
|
||||
)?;
|
||||
let player_id_collisions = seed
|
||||
.actors
|
||||
.iter()
|
||||
.filter(|actor| actor.id == seed.player.id)
|
||||
.map(|actor| actor.id.clone())
|
||||
.chain(
|
||||
seed.gestalt_members
|
||||
.iter()
|
||||
.filter(|member| member.id == seed.player.id)
|
||||
.map(|member| member.id.clone()),
|
||||
)
|
||||
.collect::<BTreeSet<_>>();
|
||||
if !player_id_collisions.is_empty() {
|
||||
return Err(anyhow!(
|
||||
"the singular player subject must not appear in autonomous actors or gestalt_members; remove duplicate player IDs {player_id_collisions:?}"
|
||||
));
|
||||
}
|
||||
require_unique_ids(
|
||||
"canonical subject",
|
||||
std::iter::once(seed.player.id.as_str())
|
||||
|
|
@ -5611,6 +5634,8 @@ mod tests {
|
|||
let serialized = serde_json::to_string(&schema).unwrap();
|
||||
assert!(serialized.contains("\"route_id\""));
|
||||
assert!(serialized.contains("\"subject_id\""));
|
||||
assert!(serialized.contains("single human-controlled player boundary"));
|
||||
assert!(serialized.contains("Autonomous nonplayer actors only"));
|
||||
|
||||
let mut agency = serde_json::to_value(schema_for!(CompiledAgencySkeleton)).unwrap();
|
||||
crate::model_connector::project_strict_responses_schema(&mut agency).unwrap();
|
||||
|
|
|
|||
Loading…
Reference in a new issue