From 5c114601a9ea51fb0d64eec0dd0c0ed5caf29a1e Mon Sep 17 00:00:00 2001
From: slaguru666 <111923774+slaguru666@users.noreply.github.com>
Date: Mon, 10 Aug 2026 22:24:55 +0100
Subject: [PATCH] R-224: a body at zero absorbed damage for free
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Hit points clamp at zero, so further damage to somebody already there changed
nothing — and a STABILISED agent absorbed it forever, because the count was held
and there was nothing else left to move. You could empty a magazine into someone
bleeding out and the system would not notice.
Damage at zero now breaks the stabilisation and costs a round of the count, and
hitLocationRoll calls died() when that meets the limit.
Found by playing LOW VERGE until it killed somebody: two agents who were
medically stable died in the water on a failed tidal extraction.
Co-Authored-By: Claude Opus 5
---
docs/REVIEW_LOG.md | 37 ++++++++++++++++++++++++++++++++++++
packs/armour/LOG | 10 +++++-----
packs/armour/LOG.old | 2 +-
packs/expedition/LOG | 10 +++++-----
packs/expedition/LOG.old | 2 +-
packs/gear/LOG | 10 +++++-----
packs/gear/LOG.old | 2 +-
packs/npcs/LOG | 10 +++++-----
packs/npcs/LOG.old | 2 +-
packs/powers/LOG | 10 +++++-----
packs/powers/LOG.old | 2 +-
packs/pregens/LOG | 10 +++++-----
packs/pregens/LOG.old | 2 +-
packs/rules/000005.ldb | Bin 24552 -> 24724 bytes
packs/rules/000006.log | Bin 47237 -> 47562 bytes
packs/rules/LOG | 10 +++++-----
packs/rules/LOG.old | 2 +-
packs/rules/MANIFEST-000004 | Bin 147 -> 147 bytes
packs/skills/LOG | 10 +++++-----
packs/skills/LOG.old | 2 +-
packs/slice/LOG | 10 +++++-----
packs/slice/LOG.old | 2 +-
packs/tables/LOG | 10 +++++-----
packs/tables/LOG.old | 2 +-
packs/talents/LOG | 10 +++++-----
packs/talents/LOG.old | 2 +-
packs/vehicles/LOG | 10 +++++-----
packs/vehicles/LOG.old | 2 +-
packs/weapons/LOG | 10 +++++-----
packs/weapons/LOG.old | 2 +-
ringbrp.mjs | 23 ++++++++++++++++++++--
tools/rules-text.mjs | 4 ++++
32 files changed, 140 insertions(+), 80 deletions(-)
diff --git a/docs/REVIEW_LOG.md b/docs/REVIEW_LOG.md
index 4d25aa6..f238453 100644
--- a/docs/REVIEW_LOG.md
+++ b/docs/REVIEW_LOG.md
@@ -3860,3 +3860,40 @@ journal to answer "where are we and how long have we got".
Checked across 300 seeds for `[object Object]`, `undefined` and `NaN` in every
generated page: clean. One real leak found and fixed on the way — the group's taboo
and desire are objects with a `.text`, and the brief was printing the object.
+
+## LOW VERGE — played until it killed somebody
+
+Field Lead, Physician, Recording Officer, Translation Officer at a boarding school out
+of term. The brief did its new job: Where, When, the job, what to expect, and the way
+back, all before the prose. Four phases.
+
+The rival desk never became a fight — the Field Lead rolled a natural 1 on Status 15%
+and they stood down, which is the leverage the Opposition page names. The danger was
+never them. The Pressure page had already declared the price: *"There is a body that
+has to be carried, and it is one of ours."*
+
+Two phases failed, the Containment phase failed, and the other side's weather came
+through a gap at the true scale. Three of the four went to zero in a single exposure
+and the Physician — 48% First Aid, on four hit points herself — stabilised all three,
+one after another, and then did it again after the next wave.
+
+Then the extraction failed on a tidal causeway with the window already past. Marek
+Achterberg and Tomas Vance died in the water, both at Coherence 10, both **recorded
+properly — a death in service, a form, a pension, a name that stays where it was put.**
+Nkechi Quist came home stable at zero. Ambaro Vance walked off the causeway on four
+hit points having kept three people alive for six rounds and lost two of them anyway.
+
+**R-224 · a body at zero absorbed damage for free.** Found by this play-through and it
+is what killed them. Hit points clamp at zero, so further damage to somebody already
+there changed nothing — and a STABILISED agent absorbed it forever, because the count
+was held and there was nothing else left to move. You could empty a magazine into
+someone bleeding out on the floor and the system would not notice. Damage at zero now
+breaks the stabilisation and costs a round of the count, and `hitLocationRoll` calls
+`died()` directly when that meets the limit. That is precisely how the causeway killed
+two people who were medically stable four minutes earlier.
+
+**Worth noting for the Last Entry table:** both died at Coherence 10 and so got the
+dullest of the four entries. Coherence is normally spent on the way home, and these
+two never got there — an agent who dies mid-case is likely to be *well* filed. The
+interesting entries belong to people who die after a bad crossing, which is the right
+way round but means the table's bottom half will be rarer than its top.
diff --git a/packs/armour/LOG b/packs/armour/LOG
index d137772..2a95d39 100644
--- a/packs/armour/LOG
+++ b/packs/armour/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.167695 172fa3000 Recovering log #3
-2026/08/10-22:10:05.167719 172fa3000 Level-0 table #5: started
-2026/08/10-22:10:05.167831 172fa3000 Level-0 table #5: 1902 bytes OK
-2026/08/10-22:10:05.168131 172fa3000 Delete type=0 #3
-2026/08/10-22:10:05.168177 172fa3000 Delete type=3 #2
+2026/08/10-22:21:57.701683 1776e7000 Recovering log #3
+2026/08/10-22:21:57.701703 1776e7000 Level-0 table #5: started
+2026/08/10-22:21:57.701794 1776e7000 Level-0 table #5: 1902 bytes OK
+2026/08/10-22:21:57.701993 1776e7000 Delete type=0 #3
+2026/08/10-22:21:57.702019 1776e7000 Delete type=3 #2
diff --git a/packs/armour/LOG.old b/packs/armour/LOG.old
index 7a81f41..f39587b 100644
--- a/packs/armour/LOG.old
+++ b/packs/armour/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.857234 172fe3000 Delete type=3 #1
+2026/08/10-22:21:49.417954 172017000 Delete type=3 #1
diff --git a/packs/expedition/LOG b/packs/expedition/LOG
index 2ef6314..cf313ee 100644
--- a/packs/expedition/LOG
+++ b/packs/expedition/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.175210 172797000 Recovering log #3
-2026/08/10-22:10:05.175229 172797000 Level-0 table #5: started
-2026/08/10-22:10:05.175333 172797000 Level-0 table #5: 4129 bytes OK
-2026/08/10-22:10:05.175537 172797000 Delete type=0 #3
-2026/08/10-22:10:05.175564 172797000 Delete type=3 #2
+2026/08/10-22:21:57.709136 1776e7000 Recovering log #3
+2026/08/10-22:21:57.709155 1776e7000 Level-0 table #5: started
+2026/08/10-22:21:57.709295 1776e7000 Level-0 table #5: 4129 bytes OK
+2026/08/10-22:21:57.709506 1776e7000 Delete type=0 #3
+2026/08/10-22:21:57.709532 1776e7000 Delete type=3 #2
diff --git a/packs/expedition/LOG.old b/packs/expedition/LOG.old
index 9201cdc..e489392 100644
--- a/packs/expedition/LOG.old
+++ b/packs/expedition/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.883542 172fe3000 Delete type=3 #1
+2026/08/10-22:21:49.443274 17302f000 Delete type=3 #1
diff --git a/packs/gear/LOG b/packs/gear/LOG
index bf1383d..f3169ae 100644
--- a/packs/gear/LOG
+++ b/packs/gear/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.168741 172797000 Recovering log #3
-2026/08/10-22:10:05.168838 172797000 Level-0 table #5: started
-2026/08/10-22:10:05.169097 172797000 Level-0 table #5: 27954 bytes OK
-2026/08/10-22:10:05.169298 172797000 Delete type=0 #3
-2026/08/10-22:10:05.169329 172797000 Delete type=3 #2
+2026/08/10-22:21:57.702603 176edb000 Recovering log #3
+2026/08/10-22:21:57.702692 176edb000 Level-0 table #5: started
+2026/08/10-22:21:57.702943 176edb000 Level-0 table #5: 27954 bytes OK
+2026/08/10-22:21:57.703215 176edb000 Delete type=0 #3
+2026/08/10-22:21:57.703261 176edb000 Delete type=3 #2
diff --git a/packs/gear/LOG.old b/packs/gear/LOG.old
index fdb436c..f3b8b33 100644
--- a/packs/gear/LOG.old
+++ b/packs/gear/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.859443 1727d7000 Delete type=3 #1
+2026/08/10-22:21:49.419830 172017000 Delete type=3 #1
diff --git a/packs/npcs/LOG b/packs/npcs/LOG
index fd4b2a5..4b858aa 100644
--- a/packs/npcs/LOG
+++ b/packs/npcs/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.160943 173fbb000 Recovering log #3
-2026/08/10-22:10:05.161166 173fbb000 Level-0 table #5: started
-2026/08/10-22:10:05.161661 173fbb000 Level-0 table #5: 60660 bytes OK
-2026/08/10-22:10:05.161946 173fbb000 Delete type=0 #3
-2026/08/10-22:10:05.162005 173fbb000 Delete type=3 #2
+2026/08/10-22:21:57.694343 177ef3000 Recovering log #3
+2026/08/10-22:21:57.694579 177ef3000 Level-0 table #5: started
+2026/08/10-22:21:57.695401 177ef3000 Level-0 table #5: 60660 bytes OK
+2026/08/10-22:21:57.695734 177ef3000 Delete type=0 #3
+2026/08/10-22:21:57.695824 177ef3000 Delete type=3 #2
diff --git a/packs/npcs/LOG.old b/packs/npcs/LOG.old
index 342c4ce..659b77c 100644
--- a/packs/npcs/LOG.old
+++ b/packs/npcs/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.870862 172fe3000 Delete type=3 #1
+2026/08/10-22:21:49.430202 172823000 Delete type=3 #1
diff --git a/packs/powers/LOG b/packs/powers/LOG
index f720acc..a9b81ed 100644
--- a/packs/powers/LOG
+++ b/packs/powers/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.165461 172fa3000 Recovering log #3
-2026/08/10-22:10:05.165486 172fa3000 Level-0 table #5: started
-2026/08/10-22:10:05.165592 172fa3000 Level-0 table #5: 3295 bytes OK
-2026/08/10-22:10:05.165831 172fa3000 Delete type=0 #3
-2026/08/10-22:10:05.165879 172fa3000 Delete type=3 #2
+2026/08/10-22:21:57.699606 1776e7000 Recovering log #3
+2026/08/10-22:21:57.699632 1776e7000 Level-0 table #5: started
+2026/08/10-22:21:57.699749 1776e7000 Level-0 table #5: 3295 bytes OK
+2026/08/10-22:21:57.699987 1776e7000 Delete type=0 #3
+2026/08/10-22:21:57.700037 1776e7000 Delete type=3 #2
diff --git a/packs/powers/LOG.old b/packs/powers/LOG.old
index 856d7e6..ee49e46 100644
--- a/packs/powers/LOG.old
+++ b/packs/powers/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.877345 172fe3000 Delete type=3 #1
+2026/08/10-22:21:49.437043 172017000 Delete type=3 #1
diff --git a/packs/pregens/LOG b/packs/pregens/LOG
index 1bb2764..58b3000 100644
--- a/packs/pregens/LOG
+++ b/packs/pregens/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.158567 173fbb000 Recovering log #3
-2026/08/10-22:10:05.158795 173fbb000 Level-0 table #5: started
-2026/08/10-22:10:05.159257 173fbb000 Level-0 table #5: 54921 bytes OK
-2026/08/10-22:10:05.159544 173fbb000 Delete type=0 #3
-2026/08/10-22:10:05.159580 173fbb000 Delete type=3 #2
+2026/08/10-22:21:57.691875 177ef3000 Recovering log #3
+2026/08/10-22:21:57.692083 177ef3000 Level-0 table #5: started
+2026/08/10-22:21:57.692589 177ef3000 Level-0 table #5: 54921 bytes OK
+2026/08/10-22:21:57.692893 177ef3000 Delete type=0 #3
+2026/08/10-22:21:57.692928 177ef3000 Delete type=3 #2
diff --git a/packs/pregens/LOG.old b/packs/pregens/LOG.old
index b6b487a..47f0b84 100644
--- a/packs/pregens/LOG.old
+++ b/packs/pregens/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.866210 171fcb000 Delete type=3 #1
+2026/08/10-22:21:49.425591 172017000 Delete type=3 #1
diff --git a/packs/rules/000005.ldb b/packs/rules/000005.ldb
index d2d07c74670dc8117f28ee81aa28c7fe91d0d9d1..81959f548f88aa4ad112ea8de3e53616833f3a88 100644
GIT binary patch
delta 1485
zcmXw3du$X%7@sY>FxT7tZf`la*X^~;H6FATt^pJ)^6*eF5Fw-(Af{TUw{yLP?e4j|
z*IK2Vhdfdq1}Q#KNTWQeVvq_kf|P1%M8RiNASx+7LLh1lA_fz5`NK&jnS7a0%v2yeL1S*k23$CyyYcfLrj?+AZ8jdAL5d#~
zet@4N3pWpHXzJjQ`ihL1<-wPj&ra?A3Pz;rk;>Qvm*|Xo*;G=bBx4L;lF1`^=E7T;
zOe8HVP4g~Ouazn%R78}n8+;Tc=#kscd5g>RCpWfEGHbmJKGsO*sr>ZbOfaFuXrt-WcC8
zn4To?M>*E1rv$^&(cUNhu@cYBy%=j`t%mD4oyvJxJr+Y9>Yfm!RpR(?cuBIzX4gRo
zV`>%L_=oYsUpGr{f>^O_iv%_0k&Iz7(g7#S>25J?+Ab^zagWGu&bIW#Wf(IS8&+P$
zA(=Xk(GHOcp)XdN#lv6vj>T
z9BR24=J%pcEY$wS`_w&;Q%^;FUZ~?KcZK;h-TemkQG~N)h`_iitm_UGG@P*=_($8n
zG%*IX!M_#8g~8cLC|NWxCVr3DLUj{XMCrrv)A0p{6zH4&5$fAF?N!82aJgNP7L&C#
zSz3QIz8rbOR}TFpGt*@gW=u1~;}?h2o$;Y4d@3VW_Ys+PM#hVo(><7fA20E2;>2bfqUDFs5%&^`nzKMM7-uDv?x--&oN;`
zCH4XQd9|F*Ql~W)KwkW_-q(sx!$}O=MV$8$y?CW&cwSM{eu+erP1X`W3gG>*^eXS!
z@MD#5D@?=K@U^NX8%y}K(S4oIGDWYF347EJosX*uF`K0Qyz+#
zeT7I;hOS%)`kG^~Q^Xn8q2)B;^>qm@s!Ww5Nz&+hdG3hV&YVtdJVtu&1HQ`P#VWpy
zB~GJk^_{-C2@F(V-A)(3IB^CUTA)-kn5p-!5-fD*vJG_E37__c#D&clW*5^Kiz@?
fLUlO2_4vV_t<5)=R<4_0w|;<|d~~4aSaaQfl1|F{
delta 1342
zcmXw&ZEO@p7{_PpF3$CK=dOFl_U?LZ=NgX|Xpcy>Rzj-R7eE8Ww1`3~bb342Te`P<
z>~61?AV-mc6^qbozYtLyYz@{Iw8951m105sgvOWv31SruppYg7F_NIm2Pc_i@+32v
z=lA@7gHz14ub5+POW@DX&aME}qlMYcb$I;sC0Ah1rSkEP>Rv7bn=LZajGoRd{Ff&k
z)Ra6felt(U0nmH%
zeFlzGYAws#yQZHdR>c(1&Pd>ONN${Q
zA<@HX?Sj~V+%c6BgFC#&8Eny_csWhhNYnGZ^71A2sbo(9YLbwTkDi8@w4PtGiXdVWK1>Lj8?EF;Xa2l
zO>rWtYoR$e?xL#75I}|FpbPEvj2vbaE3ktHRQkcSX(`9n>CARiDcN`&Cyp*+Ggd-6
zQ$W@U`|PLCCjw&lEh{hkkoA*hJeE(=xin!!D`20CY(Np`!WN
zuyNRj_fwxHzS~T({Q8=HphAuEkMQ|LQDk9awIcd&Q
z^&VhLP39eMn@W={T0qMWy$GzSV?%$sscO>Fs#5m?Cz3W`n2&dTpDj-2aULXY&aJP?_ot%i^lK2ANLigO1Kg||+ZvWfn&&x|MfN-d>L=R-
zv{7)ZO!t60XN$%I7jN%+3p9Fj*jg3U266|K*Co{S=E1H_>yzUz)U6BV%}g-X|7B2@9huEeY?g!5
z3&28d$0@*SjBpB%^)go%0|!@nMyyLGnMV&yGDn!~*4BdT&Q>=2
HMl1Xeu$-a2
diff --git a/packs/rules/000006.log b/packs/rules/000006.log
index e969202ac8c8ac73b15d015337b60095f077d589..9ce8629506017d6809432812a1b8bf53e71c5868 100644
GIT binary patch
delta 360
zcmW-cF-yci5QQ-uSXqjN7Gp1Zji`rM2%
z2>uKed$F=}HZaZ3zIoq!*FV|&Z#Eb{ti3!9ZbsSHu)7^?uFQ|gdIMDx1kj-MfC85k
z_;4pmU~i5f4}|9t(6=#x3RGM|6RL>IRF3v
delta 50
zcmV-20L}l(^8$tO0t8OO*_^Qii#h_IF0+w3Aq}(lNC`Ky2Y^KZ2lFiJL4G&{lQDS}
Ivtfa0I3Ir#{Qv*}
diff --git a/packs/rules/LOG b/packs/rules/LOG
index 8d56ba2..c283fca 100644
--- a/packs/rules/LOG
+++ b/packs/rules/LOG
@@ -1,5 +1,5 @@
-2026/08/10-22:10:05.171339 172797000 Recovering log #3
-2026/08/10-22:10:05.171403 172797000 Level-0 table #5: started
-2026/08/10-22:10:05.171720 172797000 Level-0 table #5: 24552 bytes OK
-2026/08/10-22:10:05.172072 172797000 Delete type=0 #3
-2026/08/10-22:10:05.172108 172797000 Delete type=3 #2
+2026/08/10-22:21:57.705201 1776e7000 Recovering log #3
+2026/08/10-22:21:57.705262 1776e7000 Level-0 table #5: started
+2026/08/10-22:21:57.705576 1776e7000 Level-0 table #5: 24724 bytes OK
+2026/08/10-22:21:57.705849 1776e7000 Delete type=0 #3
+2026/08/10-22:21:57.705894 1776e7000 Delete type=3 #2
diff --git a/packs/rules/LOG.old b/packs/rules/LOG.old
index bc4ce69..3ab0284 100644
--- a/packs/rules/LOG.old
+++ b/packs/rules/LOG.old
@@ -1 +1 @@
-2026/08/10-22:09:56.881569 172fe3000 Delete type=3 #1
+2026/08/10-22:21:49.441356 17302f000 Delete type=3 #1
diff --git a/packs/rules/MANIFEST-000004 b/packs/rules/MANIFEST-000004
index 23212a130d7e1edb56dbd91c97129e7c9a56eec5..b044639e6563120186e454f7695b963a07da6ddc 100644
GIT binary patch
delta 30
mcmbQtIGJ&RvdD?{sb@187@62O8JO8wxY!w3ryQJU9s>Y@;0L(?
delta 30
mcmbQtIGJ&RvdA8TZ=RV9j7)5t49x5-T 0;
+ if (wasAtZero && hurtAgain && !sys.dying?.dead) {
+ upd["system.dying.stabilised"] = false;
+ upd["system.dying.rounds"] = (Number(sys.dying?.rounds) || 0) + 1;
+ }
+ await target.update(upd);
+
+ if (upd["system.dying.rounds"] !== undefined
+ && upd["system.dying.rounds"] >= dyingLimitFor(sys.majorWound?.value)) {
+ await died(target);
+ }
return { location: loc, ...res };
}
diff --git a/tools/rules-text.mjs b/tools/rules-text.mjs
index 82f53c4..c7dbf6a 100644
--- a/tools/rules-text.mjs
+++ b/tools/rules-text.mjs
@@ -321,6 +321,10 @@ ${table(["Hit points", "You are"], [
own Major Wound threshold you are dead — so the same
number that decides how much damage you can take standing up also decides how long you
have on the floor. A minimum of ${DYING.minCount} rounds applies however slight you are.
+Being hurt again at zero breaks any stabilisation and costs a
+round of the count. Hit points cannot go below zero, so this is what further damage to
+a body on the floor actually does — and it is why leaving somebody stable in a place
+that is still dangerous is not the same as getting them out.
Stabilising takes ${DYING.stabiliseWith.join(" or ")} and stops the
count. It does not put you back on your feet: you are still at zero and still
unconscious until somebody heals you above it. Healing above zero clears the count.