Render absence as flatness, and due as time
The Projector and Persona prompts asked for what this person remembers, wants, and fears, with no component to ground any of it, so every seeded person spoke in the model's one borrowed voice. Both prompts now render only what the context establishes, say plainly what is unknown, and treat the word budget as a ceiling. A commitment's due reaches the Projector as minutes from now, since a bare 1000 was read as a sum of money. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
parent
f3d1904428
commit
19609ee06c
2 changed files with 9 additions and 6 deletions
|
|
@ -4185,11 +4185,13 @@ impl SelectedDecision {
|
|||
.commitments
|
||||
.iter()
|
||||
.map(|commitment| {
|
||||
// Time, named as time: a bare `due` of 1000 was read as a sum of
|
||||
// money on the road, and 20160 as "fourteen days" only by luck.
|
||||
json!({
|
||||
"kind": commitment.kind,
|
||||
"counterparty": commitment.counterparty.map_or(Value::Null, |id| self.subject_label(id)),
|
||||
"due": commitment.due,
|
||||
"period": commitment.period,
|
||||
"due_in_minutes": commitment.due.0.saturating_sub(self.snapshot.now.0),
|
||||
"period_minutes": commitment.period,
|
||||
"past_due": commitment.past_due,
|
||||
})
|
||||
})
|
||||
|
|
@ -4214,7 +4216,8 @@ impl SelectedDecision {
|
|||
json!({
|
||||
"from": "own promise past due",
|
||||
"kind": promise.map(|commitment| commitment.kind),
|
||||
"due": promise.map(|commitment| commitment.due),
|
||||
"overdue_by_minutes": promise
|
||||
.map(|commitment| self.snapshot.now.0.saturating_sub(commitment.due.0)),
|
||||
})
|
||||
}
|
||||
super::patch::PressureSource::Dependency(target) => match target {
|
||||
|
|
@ -7240,7 +7243,7 @@ mod tests {
|
|||
"\"quantity\": 12",
|
||||
"\"kind\": \"obligation\"",
|
||||
"Old Hesk the gatekeeper",
|
||||
"\"due\": 120",
|
||||
"\"due_in_minutes\": 60",
|
||||
"own promise past due",
|
||||
"\"magnitude\": 3",
|
||||
] {
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ pub struct OperationalAgentPrompt<'a> {
|
|||
|
||||
pub fn build_projector_prompt(input: &ProjectorPrompt<'_>) -> String {
|
||||
format!(
|
||||
"<!-- membrane:{MEMBRANE_SCHEMA}:projector -->\nYou are a private Projector. Convert only the permitted typed context and visible stimulus into one compact lived narrative stream. Project what this person perceives, remembers, wants, fears, knows, and explicitly does not know. Anything absent from the permitted context is unavailable: render imagination, suspicion, or speculation as uncertainty, never as remembered or perceived fact. Do not choose actions, emit schemas, expose field names, or claim world effects. Omit decorative recap that does not change the decision.\n\nDomain guidance:\n{guidance}\n\nIdentity:\n{identity}\n\nPermitted typed context:\n{context}\n\nVisible stimulus:\n{stimulus}\n\nUse at most {word_budget} words. Return only the lived narrative stream.",
|
||||
"<!-- membrane:{MEMBRANE_SCHEMA}:projector -->\nYou are a private Projector. Render only what the permitted typed context and visible stimulus establish, as one plain lived stream in this person's own present: where they are, what they hold and owe and to whom, what they know and were told and by whom, what presses on them, and what they may do. Anything absent from the context is unavailable: render suspicion or speculation as uncertainty, never as remembered or perceived fact. This person has no temperament, history, mood, fears, wants, or inner voice beyond what the context carries; if it carries none, render none, and say plainly what is unknown rather than filling it. Do not choose actions, emit schemas, expose field names, or claim world effects. No metaphor, no atmosphere, no recap. Say only what changes the decision.\n\nDomain guidance:\n{guidance}\n\nIdentity:\n{identity}\n\nPermitted typed context:\n{context}\n\nVisible stimulus:\n{stimulus}\n\nUse at most {word_budget} words; fewer is better, and a thin moment gets a thin stream. Return only the lived stream.",
|
||||
identity = input.identity,
|
||||
guidance = input.domain_guidance,
|
||||
context = input.typed_context,
|
||||
|
|
@ -94,7 +94,7 @@ pub fn build_projector_prompt(input: &ProjectorPrompt<'_>) -> String {
|
|||
|
||||
pub fn build_persona_prompt(input: &PersonaPrompt<'_>) -> String {
|
||||
format!(
|
||||
"Everything below is prose from inside one person's life. Inhabit that person and respond naturally from what they perceive, remember, want, fear, and believe. Treat asserted perceptions and memories as known. Let anything beyond them appear only as suspicion, imagination, conjecture, or deliberate invention by the character. You may speak, remain silent, wonder, decide, or attempt something. Do not announce an outside consequence as already accomplished. Spend words in proportion to the moment.\n\nVoice and setting guidance:\n{guidance}\n\nWho you are:\n{identity}\n\nWhat this moment is like for you:\n{stream}\n\nUse at most {word_budget} words. Return only the character's natural response in prose.",
|
||||
"Everything below is prose from inside one person's life. Be that person and respond only from what the moment establishes. Treat asserted perceptions and memories as known. Let anything beyond them appear only as suspicion, conjecture, or deliberate invention by the character, and name it as such. Do not give yourself a temperament, a history, a mood, a relationship, or a turn of phrase the moment did not give you; if the moment gives you little, say little, or nothing. You may speak, remain silent, wonder, decide, or attempt something. Do not announce an outside consequence as already accomplished.\n\nVoice and setting guidance:\n{guidance}\n\nWho you are:\n{identity}\n\nWhat this moment is like for you:\n{stream}\n\nUse at most {word_budget} words; fewer is better. Return only the character's natural response in prose.",
|
||||
identity = input.identity,
|
||||
guidance = input.domain_guidance,
|
||||
stream = input.lived_stream,
|
||||
|
|
|
|||
Loading…
Reference in a new issue