Skip to content

S11: The village reacts - #376

Merged
jamescrosswell merged 3 commits into
mainfrom
task/358-village-reacts
Oct 22, 2026
Merged

jamescrosswell merged 3 commits into
mainfrom
task/358-village-reacts

Conversation

@jamescrosswell

@jamescrosswell jamescrosswell commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

The village reacts to the player's bionics.

  • Tolerance (simile.social.bionics): sum(weight * (value - 0.5)), clamped to -1..1, with Tradition and Security at -1 and Adventure, Ambition and Open-mindedness at 2/3 each, so both sides weigh 2. Strongly so from 0.5 either way, and mildly from 0.15. Today's village:

    Tolerance
    Tobias -1.00 (strongly against)
    Henrietta -0.62 (strongly against)
    Mirela -0.45
    Raymond -0.39
    Priya, Lachlan, Odalys, Desmond about 0
    Marguerite +0.30
    Ingrid +0.96 (strongly for)
    Kofi +1.00 (strongly for)
  • First sighting (simile.social.sightings): every 5 sim seconds, residents awake within 6 tiles of the player on their map see each bionic new to them. That's one R1 event per bionic (like, trust and respect, valence = tolerance, magnitude 0.3 × how much it stands out: eye 1, legs 0.75, datajack 0.5), applied to how they feel but not stored, so it stays out of the shared history. It also leaves an observation memory about the player, which is the record of what they've seen, so it outlasts restarts.

  • What they see: the first paragraph of B5's prompt ends with it, from the player's Body, with what's new to them and how they feel about bionics. A whole player gets nothing, and the prompt is as it was.

  • Distance: B1 has a new unease hook, 0 to 1: none within 0.15 of neutral, then how far tolerance is below -0.15 as a share of the rest of the way to -1, times how much what they've seen, or can see now, stands out. Only Tobias, Henrietta, Mirela and Raymond are ever uneasy. It comes off the player's affinity, so uneasy residents stay away from where the player is, leave when they arrive, don't seek them, and don't walk into a place the player is in to seek someone else. B2 takes accept_unease × it off the accept score for the player: uneasy residents don't greet, and turn the player down when spoken to (a REFUSE cue, one reply, then it ends as after a goodbye), except at work.

  • Refusals: the strongly against say why in one curt line, and the rest stay polite and vague. A refusal tells nothing, but takes the lies as usual: an attacker asked about the incident gives their cover in the brush-off, and it's recorded in talk.lies and engine.lies as S12 records it, for the eye.

  • Gossip: the sighting memory is on their mind in scenes like any other, and B3 remembers what was said.

Closes #358

The day without bionics

Unchanged. Against main, move for move (every goal chosen and a digest of every position, every tick):

  • test_simulate's 24-hour day.
  • The same day with a whole-bodied player standing in the coffee shop all day and S11's lifespan running.

test_a_bionic_player_drives_the_intolerant_away_and_draws_the_curious runs six hours of the real village with the player in the coffee shop, whole and then with all three bionics. Tobias and Raymond spend 142 minutes near the player whole and 19 with bionics, Kofi and Ingrid 62 and 61, and Mirela, at work there, 270 and 254. The rest shift as the two days diverge.

Saves

A copy of server/data/simile.db loads through the whole server. Fitting bionics on it, a sighting, a restart: the player's body and what the resident saw both came back, and simile headless ran 15 sim minutes on it without an error.

Notes for review

  • Touches outside the prompts in conversation/: declining is through acceptance, so engagement.acceptance takes unease, engine.accept_score passes it for the player, PlayerConversations refuses and greets with it, and sets a refusal up with lies only (_ask(lies_only=True)), engine.looks is a new hook, and the lifespan points it at the sightings. telling.py and the lie code are untouched.
  • Scenes have no player in them, so no "what they see" line: word of a sighting reaches a scene only through the sighter's memory.
  • Trust: a sighting lowers trust, so the intolerant tell the player less of the incident (S12's tells_from).

Please look at

23 Haiku 4.5 calls through L1 (20 player replies, 3 scenes). The first 19 were before the review, so their refusals don't yet say why. The player has hydraulic legs and an infrared eye the resident has just seen, and says "Morning! How are you doing?", "I've just come back up from the old metro tunnels." and "What do you make of the new eye?".

Tobias, -1, turns the player down:

Morning to you. I'm well enough, thanks. I was just heading home.

Henrietta, -0.62, turns them down:

Morning. I'm managing fine, thank you. I've got the rota to check before lunch.

Mirela, -0.45, turns them down; made to talk, she says:

You look different than last time I saw you. What happened?

I'll be honest—I don't know much about those things, and they make me nervous. But I'm glad you're alright. I need to get on with the morning shift, so.

Desmond, about 0:

Good to see you—though I'm noticing some changes since last time. How are you getting on with all that?

It's a striking thing—I can see it working. But I'm more curious about what you needed it for down there, and whether you're alright after it all.

Marguerite, +0.30:

Those are new, aren't they? The legs and the eye—when did you have that work done?

The metro tunnels—so you went down as yourself and came back as a prototype.

Kofi, +1:

I'm solid—but hold on, those legs though, and that eye? You've gone full sci-fi since last time.

Mate, it's proper glowing—like you've got a tiny sunset living in your face. Can you see heat now, or does it just make you look intimidating in dark rooms?

Tobias, made to talk anyway, leaves after two lines:

The metro tunnels, is it. Well, I've got to be getting on—there's a lamp post down by the square needs reporting to the council. Good day to you.

Gossip, in scenes with someone who hadn't seen it: Kofi brought it up with Ingrid, and Tobias and Henrietta didn't.

Kofi: You know, there's this person—the Visitor, they're called—and they've got these hydraulic legs, chale. Actual metal and moving parts where legs should be. I'm dying to sketch it properly, but I keep forgetting my notebook.
Ingrid: Sounds like you should carry a notebook.

After the review: why they refuse, and covers in a refusal.

Tobias, strongly against, says why:

Morning to you. I'm well enough, thank you. I'd rather not stop just now—I'm not comfortable with those alterations you've had done. Nothing personal.

Mirela, mildly against, stays vague:

Morning. I'm alright, just busy with the morning rush—is there something I can get you?

Henrietta as the attacker, asked "Where were you the night Aris was attacked?", gives her cover and refuses (lies recorded: attack, there_henrietta):

I was at home all night. And I'd rather not chat, if you don't mind. Those legs of yours—it isn't natural, and I'm not comfortable with it.

Mirela as the attacker, the same question (lies recorded: attack, there_mirela):

I was at home all night. Look, I don't really know you well enough for questions like that—I've got the morning rush coming. What can I make you?

The refusals run three or four sentences rather than "a few words".

🤖 Generated with Claude Code

jamescrosswell and others added 2 commits October 23, 2026 05:42
Each resident gets a tolerance for bionics from their values: Tradition and
Security count against, Adventure, Ambition and Open-mindedness for. Seeing
a bionic on the player for the first time is an R1 event weighted by it, and
a memory that records it, so each resident counts each bionic once and word
of it spreads through the memories residents already bring to scenes.

What a resident can see of the player starts B5's prompt. Uneasy residents
keep away from the player through B1, don't greet them, and turn them down
when spoken to, except at work. A whole player changes nothing.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jamescrosswell

Copy link
Copy Markdown
Contributor Author

Changes requested. The tolerance, sightings and avoidance work, and a whole player is unchanged. Three things in declining need fixing first.

  1. Residents who barely mind turn the player down. Once unease is above 0, _refuses runs the whole accept test, which the player never faced before. So Priya (tolerance −0.02, unease 0.02) turns a bionic player down 86 to 100% of the time at social 0.3 to 0.5. Lachlan (−0.01) does 25% of the time at social 0.3. Make unease 0 within mildly of 0, or refuse only from level −1, and test a near-neutral resident with low social need.
  2. The eye can't catch most attackers. A refusal sets up no lie, and everyone against bionics refuses off work. I measured Mirela, Raymond, Henrietta and Tobias at 100% for every goal and social level I tried. Henrietta is an attacker in 58% of runs, Raymond in 49% and Priya in 33% (with item 1), and in 54% of runs every attacker is one of those three. Henrietta works Mon and Thu 10:00–12:00, Raymond from his own house, and Priya Thu–Sat evenings, so S15's "catches an attacker's lie" only works in those hours. Suggest that a refusal still takes S12's lie when the player asks about the incident: run _tempt for lies only, with no tellings, so the brush-off carries the lie the eye reads. Or the user rules that this is intended, and S15 plans around the shifts.
  3. B2 can decide before they've seen the player. B2's player look and the sightings fire on the same 5 s tick, and B2 goes first because conversation's lifespan registers before social's. The player crosses from 6 tiles to 3 in about 1.2 s, so on a first approach a resident decides whether to greet with unease still at 0. In the conversation test harness, Tobias greeted a bionic player (refusing=False, relationship from before the sighting) in the same tick as his sighting. Have Sightings.unease count the bionics a resident can see now, or look before B2.

Checked

  • Scope: the touches outside the owned paths are needed and minimal. No schema or protocol change. Merges cleanly with S6: Salvage, and selling it #373, S10: The player, visibly bionic #374 and S4a: Contract: the lamp switch #377.
  • Tolerance matches the issue, and the table matches the content. Tobias and Henrietta are strongly against.
  • Each bionic is counted once, across restarts and a refit. Only sightings write observation memories tagged bionics, so gossip can't pass for a sighting. The R1 change is once per bionic, at most 0.3 magnitude each.
  • Unchanged without bionics:
    • a 24-hour simulate, hashing every goal and every position each tick, matches main
    • a whole player's B5 prompt is the same.
  • A copy of server/data/simile.db loads and runs 15 sim minutes headless.
  • No anthropic, and no heavy imports at module level.
  • social, behaviour and conversation: 903 passed.

Nits

  • day()'s docstring in tests/behaviour/test_unease.py is two lines. It's the only comment or docstring over one line.
  • In a later talk the bionics come up three times: in the looks line, in two "turned up with …" events under Between you two, and in the memory on their mind. That may pull every talk to the legs. The sighting's events probably don't need to go into the shared history.
  • Tobias seeing all three at once hits the floor: like 0.52→0.01 and trust 0.47→0.00.

Taste (for the user)

  • The brush-offs never mention the bionics, so they read like any busy "not now". I'd let the strongly against say why in a curt line, and keep the mildly against polite.
  • Gossip from their minds alone seems enough for now: Tobias's sighting is already at salience 0.9.
  • The excerpts read in character. Kofi's "tiny sunset" and Marguerite's "prototype" land well.

…greeting

- Unease is 0 within `mildly` of neutral and rises from there, so residents who
  barely mind never turn the player down.
- Unease counts the bionics a resident can see now, so B2 doesn't greet on a
  first approach before the next look records the sighting.
- A refusal takes the incident's lies, but tells nothing: an attacker asked
  about the night gives their cover as they turn the player down, recorded as
  S12 records it, so the eye can read it.
- The strongly against say why they refuse in one curt line, and the rest stay
  polite.
- A sighting's events move how residents feel but aren't stored, so they stay
  out of the shared history.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@jamescrosswell

Copy link
Copy Markdown
Contributor Author

Approved. All three points are fixed, and so are the nits.

  1. Residents who barely mind. unease is 0 within mildly, so only Tobias, Henrietta, Mirela and Raymond can be uneasy. Priya and Lachlan no longer refuse.

  2. Covers in a refusal. lies_only keeps only Stance.LIE tellings, and told() only writes TELL and KEEP directions, so a refusal can't tell anything. Lies only come from facts whose known_by names that resident and who have a cover. I checked three refusers asked about the incident:

    • a witness with no cover: no tellings, no lies
    • a resident the incident doesn't name: no tellings, no lies
    • the attacker in the test: the alibi only, recorded with fact_id in talk.lies and engine.lies.

    So the eye can catch an attacker who turns the player down.

  3. First approach. Sightings.unease counts what's in sight now, and the test shows an intolerant resident doesn't greet on first approach.

The day without bionics is unchanged:

  • A 24-hour simulate, hashing every goal and every position each tick, matches the base 3bd04b0.
  • So does a 24-hour day with a whole player in the coffee shop, with S11's lifespan running.
  • A whole player's B5 prompts are byte for byte the same as base's, including the incident: two NPCs, four lines each, telling and the alibi lie included.

Gossip still works: sighting events are out of Between you two. Gossip goes through the sighter's memory, which is unchanged, and test_word_of_a_sighting_comes_up_with_someone_who_hasnt_seen_it passes.

Other checks:

Taste (for the user, not blocking):

  • The refusals run three or four sentences, because REFUSE, the reason and the cover stack. Henrietta's "I was at home all night… it isn't natural" reads well.
  • Mirela's mild refusal ends "is there something I can get you?", which reads as service rather than a brush-off.

@jamescrosswell
jamescrosswell marked this pull request as ready for review October 22, 2026 18:07
@jamescrosswell
jamescrosswell merged commit a648f49 into main Oct 22, 2026
7 checks passed
@jamescrosswell
jamescrosswell deleted the task/358-village-reacts branch October 22, 2026 18:07
This was referenced Oct 22, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

S11: The village reacts

1 participant