Repository navigation
S13: The journal - #378
Merged
Merged
S13: The journal#378
Conversation
The server writes what reaches the player into S2's journal: a fact a resident tells them, a lie as its cover with no leads, and a clue picked up at its cell with E. With the infrared eye a lie is flushed and the truth isn't. Leads open and close by S2's rules, and the journal is sent on connect and on each change. J opens the client's journal panel. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The side walk presses E at every door, and the door frame's clue is the cell beside the maker space's door. The server takes a pick_up within a tile of a clue, past the half tile the client offers it from. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Merged
E now takes one thing per press on both sides. The clue is a claim on pick_up (claimers_of), so the server takes the nearer of a clue and a pile, the pile on a tie, never both; the client orders them the same way. The server's clue reach is the client's half tile, so they agree. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This was referenced Oct 22, 2026
Contributor
Author
|
Changes requested. Two items. Everything else holds up. Changes
Checked
Notes (not blockers)
|
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A LIE entry waits until the resident's lines in the conversation, joined, hold the cover word for word (simile.story.says, which ignores case, quotes, apostrophes, punctuation and spacing), so an alibi-only reply writes only the alibi and a refusal only the cover it gave. TELL stays on the stance. E at a clue opens the journal in place of the controls, as J does, and the journal hint moves below where S4's lamp gauge and its line go. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Both sides kept in the README's controls, help.ts, dialogue-scene.ts and player/lifespan.py. The lamp gauge is made before the journal panel, so an open journal covers it, and the journal hint sits below the gauge and its line. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Contributor
Author
|
Approved. I re-reviewed the diff since
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The journal: the server writes what reaches the player about Aris into S2's
Investigation.journal, sends it asjournalon connect and on every change, and J opens it in the client.What makes an entry (
server/simile/story/journal.py,recording.py, started by the story module's newrunninghook)PlayerTalk.tellings), their next line spoken to the player writes each fact they TELL: itswhat, with its leads. TELL goes by the stance alone. A check on the words would miss a paraphrase, and would never pass on the fake LLM that S15 runs on.says(insimile.story,saying.py) ignores case, curly or straight quotes and apostrophes, punctuation and spacing. The lines are joined because a two-sentence cover arrives as two lines. A cover they were set up with but never gave isn't written. That includes S11's refusals, which set up only lies. KEEP writes nothing.pick_up(E) on a clue's cell (load_story().clues,clue_reach, half a tile) writes each fact whosefound_inis that clue.pick_up(claimers_ofinsimile.player.pickups). The server takes the nearer of a clue and a pile, never both, and the pile on a tie. The client orders them the same way, and the server's clue reach is the client's, so the hint and the press agree.Body: with the infrared eye a lie istrueand the truthfalse. Without it, and always for a clue, it'snull.Client
JournalPanel(client/src/ui/journal-panel.ts) opens and closes with J, or closes with Esc. It shows the open leads first, then what was learned, newest first. Each entry has who said it or the clue it came from, the sim time, and a red flushed mark where the eye caught one.top: 40px, below S4's lamp gauge (top: 16px) and its line (top: 28px). The journal and the controls close each other.pick_upand opens the journal in place of the controls (lookAtClue), as J does. The client offers it only on the cell itself, so the maker space's door, beside the door frame, keeps E. The side walk presses E at every door, and all its legs pass locally.Please look at
The open journal in the real client, against a copy of
server/data/simile.db. I found the notes and asked Desmond before fitting the eye, then asked Marguerite with the eye and her trust lowered so she'd lie, and found the door frame:I took it before the review's change, while a lie was still written from the stance: on the canned fake LLM, Marguerite never actually says her cover. The panel itself hasn't changed since. The preview is on the orphan branch
previews/360-journal. Delete it after review.Notes for review
telling.py.conversation/is unchanged. The recorder hearsLineSpokenand reads the player'stalk.tellings, which the conversation README already offers to other modules.says(line_or_lines, cover)when it setsline.flushed, so the face flush and the journal's mark agree. The fake replies in S15's playthrough need to say an attacker's cover word for word to catch the lie.pick_up. No message changed. Follow-up:docs/protocol.md'spick_upsection should say it finds a clue too. That's left for S8's contract, because S7's contract PR is changing that file.client/src/world/reach.tsgains acluereachable, and there's a newclient/src/world/clues.ts. E has to see the clue, or the side scene takes the workshop's door beside the door frame.server/simile/player/(S6's, now merged):pickups.pygainsClaimandclaimers_of, andpick_up(others)arbitrates between a claim and the nearest pile.lifespan.pypasses the claimers in.smol-toml, to read the clue cells fromcontent/story/story.toml.server/tests/protocol/test_lifespan.pyexpects the newjournalgreeting afterplayer_state.origin/mainis merged in: S6 (S6: Salvage, and selling it #373), S10 (S10: The player, visibly bionic #374), S11 (S11: The village reacts #376), S4a (S4a: Contract: the lamp switch #377) and S4 (S4: Darkness and the lamp #379). Both sides ofreach.ts,dialogue-scene.ts,help.ts,player/lifespan.pyand the READMEs are kept, with S6'sreachables.piles.simile behaviour simulate --hours 24 --seed 0matches main except for the wall-clock seconds.server/data/simile.db, saved before the player and the investigation existed, loads. It makes its incident from templates (SIMILE_LLM=fake), and keeps the journal across two restarts.Closes #360
🤖 Generated with Claude Code