diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md index 8397643..b9c25c4 100644 --- a/docs/REVIEW_LOG.md +++ b/docs/REVIEW_LOG.md @@ -4764,3 +4764,65 @@ ad-hoc rolls passed a rating and a category but no `skillFamilyId` — the same R-222 found in `resolveLegDialog`, reproduced by hand in a test harness. Re-rolled with the skill named, the tick appeared and the improvement roll landed: **Medicine 56 vs 42% → +6 → 48%.** The rule was right; the probe was not naming its skill. + +## PAPER HARBOUR — the criminal + +A pier that closed in 1974. A Custodian team crossed nineteen hours ago on a routine +survey and their beacon is still transmitting; three of the four are still alive and +the fourth is what the beacon is. The team: **Sennen Roake**, probationary, recruited +out of a city with a caution the department has quietly lost — plus a Field Lead and a +Technical Officer. + +The generator's gap, unprompted: *one agent has a connection to this place that the +assigning officer either missed or did not miss, and it surfaces when somebody uses +that agent's name before it is given.* Phase 2 forced that encounter. + +**He held it.** Fast Talk 14 against 48 — a clean success — and Sowande missed the read +on 42 against Insight 32. Nobody on his team knows. The case's own pressure, produced by +the tables and resolved by the one skill a criminal has instead of composure. + +**The phases went badly and the ramp is why.** 52%, then −5%, then Difficult at 26%, +then −15%. One success and three failures, Containment 10 → 7, and the window clock at +1. That is the retuned ramp doing exactly what it was retuned to do, on a team whose +best phase-lead skill was a Field Lead's Tradecraft 52. + +**Then the case turned on a warrant card.** The keepers of the ground — twelve of them, +an arrangement none will describe — want *"to be relieved. Somebody, anybody, official +enough to take the duty on."* Every agent on the team is carrying exactly that, and the +probationer with the quietly-lost caution is the one who handed it over: Bargain 27, +favourable, rolled 33. **Impression −1 → +1.** He insulted them in their own language +and then gave them the first honest thing anyone had offered them in four generations. + +And the one moment that was unambiguously his: the first team locked the log in behind +them, and he opened it on **11 against Sleight of Hand 50** with lock rakes and a master +key ring. The improvement rolls afterwards landed on Fast Talk and Sleight of Hand — +the only two things he actually did. + +### R-246. A fumbled greeting cost nothing + +`contactOutcomes` has said `fumble: { signal: -1 }` since the social pillar was built, +and impression was adjusted **only inside the `offer` branch**. So the −1 was computed +on every botched greeting and thrown away: a team could insult a group in their own +language all afternoon at no cost, and only a formal offer could ever move how they +were seen. Found by Roake fumbling a signal on 99 and the standing not moving. + +Impression now falls on a fumble at any stage and still only rises on an offer. The +narrower fix matters: `read`'s delta counts **facts learned**, not standing, so "apply +the delta always" would have paid the team impression for doing research. Verified by +rolling until a fumble landed — 99, delta −1, impression 0 → −1, standing −1. + +### Two notes on the trade, and one on my own play + +**A probationary criminal is out-sneaked by a career Field Lead** — stealth 47 against +60 — because trade skills are rated on the agency tier bands. It is defensible (a +probationer is a probationer, and at officer tier the criminal would sit at 45–60) but +it is worth deciding deliberately: a burglar recruited last month has been picking locks +for fifteen years, and the argument for giving trades a tier-independent band for their +*core* is the same argument that says a newly recruited doctor is already a good doctor. +Left as it is; flagged rather than changed. + +**I invented a step.** After the extraction phase resolved — *"you are out, but not +cleanly"* — I rolled Transposition for all three to get them home, and all three failed +on ratings of 1, 1 and 6. That was not a step the case had; the phase had already put +them out. Recorded because the rolls happened and the log should say they did not mean +anything. diff --git a/ringbrp.mjs b/ringbrp.mjs index 38101fa..f059c5f 100644 --- a/ringbrp.mjs +++ b/ringbrp.mjs @@ -1946,8 +1946,16 @@ export async function resolveContact(caseFile, groupId, stage, actor, { circumst } } if (stage === "signal" && delta > 0) rec.pidginEstablished = true; - if (stage === "offer") { - rec.offerMadeThisEncounter = true; + if (stage === "offer") rec.offerMadeThisEncounter = true; + // Impression rises only on an OFFER — that is the stage that is meant to buy + // standing — but it FALLS on a fumble at any stage. The adjustment used to sit + // inside the `offer` branch alone, so the table's `fumble: { signal: -1 }` was + // computed on every botched greeting and thrown away: you could insult a group in + // their own language all afternoon and it cost you nothing. + // + // Note `read`'s delta counts FACTS LEARNED rather than standing, which is why this + // is not simply "apply delta always" — that would pay you impression for research. + if (stage === "offer" || delta < 0) { rec.impression = (Number(rec.impression) || 0) + delta; rec.value = Math.max(-3, Math.min(3, Number(rec.impression) || 0)); }