Repository navigation
S12: Aris and the incident - #368
Conversation
Each world makes its incident once, when it's created: one to three residents whose values and grievances fit attack Aris, Sonnet writes the motive and each attacker's side of it once, and the facts around the night go into residents' memories, with witnesses who saw parts of it and two clues in her workshop. Residents tell the player what they know as their trust allows: they tell it, lie with their cover story through #285's lies, or keep it back. R2's recall leaves the incident's memories out, so nobody brings it up otherwise. A save from before the incident gets one on its next start. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Changes requested. The incident is well made and the trail holds. But once the player asks, the truth can reach everyday prompts through B3, and one failure window loses the incident's memories for good. What I checked: every path is within Owns. In the persistence tests, only the four assertions the PR names (and those tests' names) change. Nothing touches the maps, the schema or the protocol, and every LLM call goes through L1. Changes:
Not blocking:
For the user (taste):
|
…ers to questions - An incident lie's direction holds only the cover, tied to the one question it answers, so neither B3 nor the liar's prompt sees the truth. Lie.fact_id tags B3's lie memories, so recall leaves them out. Residents are told never to volunteer a cover or add a denial. - KEEP is said once, however many facts are kept back. - The incident's memories are stored before it's saved, and memories left from an incident that was never saved are forgotten first. - The motive's writer may point covers only at the village's residents, or at nobody. - The log says only that an incident was made. A cast world uses its seed, and a world with no residents makes none. `seen` is about every attacker. The cues need Aris or the night. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Addressed in bae3f58:
Non-blocking, all done:
Sonnet calls: 10 in all. |
|
Changes requested (re-review of bae3f58). All five round-1 items are fixed, but tagging B3's lie memory with its fact brought a new bug, and one channel for the lie is still open. Checked:
Changes:
Not blocking:
For the user (taste):
|
…ague - A resident who lied and later trusts the player tells their first memory of the fact, not B3's newer memory of lying. - The liar's summary of a conversation with an incident lie carries the lie's fact_id, so recall leaves it out even when it admits the lie. - The motive's writer keeps every cover vague, pointing at nobody, resident or not. - The cues catch the smashed-up workshop and the break-in, and no longer fire on everyday maker space talk or "that night" alone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Addressed in bf4232f:
Sonnet calls: 11 in all. |
|
Approved. Both round-2 changes are in. I checked them, and the #369 merge, at bf4232f.
Not blocking:
|
Each world now makes its own incident once, when it's created: who attacked Aris and why, what witnesses saw of that night, who knows what, and two clues in her empty workshop. The facts live in S2's
Incident, written into residents' memories, and residents tell the player what they know as their trust allows. Attackers lie through #285's code-decided lies.server/simile/story/(new, with its README)The attackers.
content/story/story.tomlhas five grievances, each with the values that make it rankle:A resident's hostility is their best grievance's fit plus how far their Compassion is below 0.5. One to three residents at 0.2 or more attack her (40/35/25%), drawn by how hostile they are. With today's residents the suspects are Henrietta, Raymond, Marguerite and Priya.
The motive. One
structuredSonnet call (purpose="story-motive") writes it. For each attacker it also writes their grievance, their memory of the night, an alibi, a deflection and a denial in their own voice, and the line Aris wrote about them by their initial. It's told where several attackers met beforehand, so the motive and the facts agree. Every cover stays vague and points at nobody, neither a resident nor a stranger, since Dialogue: direction from low scores, a counterweight and bounds #283's bounds rule out making up facts about people. A failed or invalid reply, or the fake LLM, falls back to the content's templates, so a world always gets an incident.The facts, a week before the world starts:
gone, which everyone knows and tells anyoneAppearance) and the others leave, so it'saboutall of themthere_<id>)The leads always run from the clues to every attacker's
there_fact.Willingness.
Memories. Every knower gets one
observationmemory per fact, with itsfact_id. Residents hostile enough to be suspects remember her going as good riddance.Aris's notes and the clue are cells on the workshop's ground floor (
aris_noteson the workbench,door_frameby the door), incontent/story/. The map is unchanged.uv run simile story incident --seed N --factsmakes one without touching any world.Telling and lying (
server/simile/conversation/telling.py, small hooks inengine.py,player.py,prompt.py,temptation.py,lifespan.py, and one line inreflection/outcome.py)Kind.FACTtemptation, with no roll, since trust decided it. Its direction ties the cover to the one question it answers, without the truth: 'You won't say where you'd been the night Aris was attacked. Only if asked that, say exactly: "I was at home all night."' After the lies, once, they're told never to volunteer a cover or add a denial of their own. B3 gets it as any other lie, withLie.fact_id. The liar's memory of lying and their summary of that conversation both carry thatfact_id, sorecallleaves them outPlayerTalk.tellingsholds each fact'sTelling(fact, knower,Stance), andTemptation.fact_idandLie.fact_idmark an incident lie.Memory (
server/simile/memory/store.py):recallleaves out memories with afact_id,facts(owner)returns them, andforget_facts()drops them. So nobody brings the incident up in a scene, a reply or a work until the player asks. After that, B3 remembers what a resident told the player like any conversation, but never the truth behind a lie: neither B3's prompt nor the liar's holds it.Choices
Old saves get an incident once, on their next start. Without one an old village has no story, short of
simile reset, which throws away its memories and relationships. Adding one is safe:recall, so residents only bring it up when asked, as in a new worldfact_id, which only a start that died in between can leave.Tested on a copy of
server/data/simile.dbin a temp dir, with the fake LLM:Residents don't tell each other. Telling is to whoever asks, which is the player. Gossip about the incident between residents would change everyday chatter, so
learned_byis left for S11's gossip.The incident is made in the story lifespan, after persistence has restored the save. It blocks startup for the one Sonnet call, once per world: 7 to 23 s in the real run. A cast world (P9) draws it from the cast's seed, a world with no residents makes none, and the log says only that it was made.
Notes for review
tests/persistence/test_story.py: an old save, a fresh start and:memory:now start with an empty journal and a new incidenttests/persistence/test_lifespan.py: the restart comparison now includes the investigationreflection/outcome.pysetsfact_idon the memories B3 writes for an incident lie, and on the liar's summary of that conversationtest_simulate's 24-hour day (8:00,talk=3, seed 0) prints the same report on main, on this branch, and on this branch with a made incident's memories seeded into the store. The simulation runs no conversations, the seeded memories are observations, which don't inspire, andrecallleaves them out.Please look at
Example motives (Sonnet, today's residents):
Their notes, alibis and deflections, for example:
Aris's notes:
Alibis:
Deflections now stay vague and point at nobody. Seed 2's three attackers, after the rule:
Before the rules, the same seed's deflections invented people ("some people from out of town") or framed real neighbours ("I'd look at Desmond").
Asked in the real game (Haiku 4.5, a template incident with seed 3):
Before the review Raymond added "I barely knew the woman", a denial nobody asked for. With each cover tied to its question, he gives only his alibi.
Taste, left as it is:
seenlead names the attacker outright ("that sounds like Henrietta"), which makes that witness close to decisive.recall, so it doesn't show the incident's memories. A list offactsthere would help S13.For S8, S11 and S13
PlayerTalk.tellings[fact_id].stance is Stance.LIE,talk.lies["fact/<id>"]withTemptation.fact_id, andengine.liesall say so.found_inisaris_notesordoor_frame, andload_story().clue(id)gives the cell and the journal's name.cover, as told, with no leads.goneis told by anyone at trust 0, so the first time the player asks anyone about Aris, its leads to her notes and the shouting witness start the trail.Closes #359
🤖 Generated with Claude Code