fa30909dc9d2c265ecb05ab156ee2f57a4306660
164
Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
327d060eb1 |
R-283: tell a reworded bestiary sentence apart from a missing one
R-282 matched the page with String.includes, so rewording the exemption sentence reported "BESTIARY never says it is off the stripping ladder" -- sending a maintainer after a sentence that is sitting right there, and never naming the real problem, which is a pattern that has silently stopped reading. Each textual rule now reads twice. Strict is the sentence as it stands and is tighter than before (the bold and the full stop, not the bare clause a substring accepted); loose is the same claim in any wording. Strict passes, loose-only is reported as a reword with the line quoted and the page presumed right, neither is the omission. The loose anchor was wrong on its first pass in the way that matters: "a sentence with 40% and 80%" also matched the courier's own statblock line, so deleting the sentence reported a reword and quoted the statblock back. It now excludes that generated marker, which makes it a test of the claim and not of the digits, and degrades to omission rather than to a false reword. Four discriminations proved in a worktree with the message read in each. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
e70d25271f |
Desk playtest 6: the four branches five passes never reached
A branch pass, not a session pass. Seed 3319. For each untested branch the roller draws from the stream until the roll lands in the target band; every roll downstream of it is taken as it falls, and the draw counts are printed. All four branches work as written. The Swinburne fumble is better than the drawer, the re-cut peg costs the twenty minutes the text promises, and a failed Xenology no longer strands Act Four — the v0.14 un-gated tell carried the act with BOTH gated lines failed, which is the strongest result here. What the pass actually found is outside the branches: 1. The fight the table produces is not the fight the document measures. The six at the back stand inside forty-one refugees. Six hollow men alone wipe 0.0%; with two of the column joining, 7.8%; with three, 28.7%. Stable across four seeds. EXPOSURE measures the two forces separately and never says what the column does when somebody fires into it. 2. At four players six hollow men wipe 58.7%, and the only hollow-man figure in the document is the six-player 0.0%. EXPOSURE's four-player block — which exists to say the cut is a different game — has no hollow-man row. The curve from three to six is 0.3% to 58.7%. 3. The Act Three warning names the wrong roll. Its twenty-minute bomb hangs off "Anomaly Lore — what a peg is"; the depot entry is a Research roll. Pass 4 inherited the same confusion and nobody noticed, because the text it was checked against carried the error. 4. GM ESSENTIALS understates every fumble band. "00 always fumbles" reads as 1%; fumbleStart is 101 - ceil((101-band)/20), tested first, so Spot 40 fumbles on 97-00. Four times what the summary implies, in a scenario that rolls Spot 40 through two acts. 5. EXPOSURE prices fights in bodies and never in minutes. Median 13 rounds printed, 24 mixed, 30 at four players. Also: simulate.mjs labels a mixed force with the first spec's name and the total count, so 6 hollow men + 6 column prints as "12 x Hollow man". The composition is right and the header is not; every figure above came out of a run whose header lied about what was fought. First run in six passes where Ashcroft refused THE OFFER, and the first where a player character was taken. Seven fixes listed, unapplied. npm run check: 18 guards pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
1a80d3637c |
R-282: guard the bestiary against the powers, including the next one
check-bestiary proves the page matches its generator, and the generator had never heard of powers.mjs -- so the redcap sat in "the ones that take the most stripping" under eighteen green guards while its own entry said it never spends a defence. Two files agreeing with each other while both disagree with the engine is a quorum, not a check. check-powers now asserts per effect kind what the page must say: defenceStacking requires the creature off the stripping list, named as exempt, and the "across N creatures that spend defences" count reconciled against powers.mjs; attackFactor requires the rating the simulator actually uses printed as a number, which the courier's entry now carries. The clause that matters is the failure on an unknown effect kind -- a wired effect with no DOCUMENT_RULE fails the build, so the next one cannot arrive without somebody deciding what the document owes it. Without that this would guard the mistake already made and nothing else. Proved three ways in a worktree, exit codes read directly. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
8705b00631 |
CLEAN GROUND v0.15 — the four-player cut, fixed
Applies desk pass 5's five fixes and corrects a claim the pass itself overstated. 1. The cut cannot see. Pollard's Spot 53 is the best in the declared cast (others 40/40/40/35/35) and he is the first agent the scaling notes drop. At five players and fewer his clues — the stump, the six at the back, the lorry — are given, not rolled for. check-rollable cannot warn about this: it tests the 25% floor, not competence. 2. The split table now has a four-player column. Four of its five rows named Pollard or Okonkwo, or said "all six". 3. The Pacing Note says the cuts are sized for six. At four, keep the northern seam; pass 5 ran 3:15 with every cut taken. 4. The line rests twenty minutes at four players — Ashcroft is aside for THE OFFER, so three agents are talking, not five. 5. Act Four records that THE OFFER nearly quadruples the unsettled rate: 14.5% if Ashcroft accepted against 3.8% if he refused. Accepting makes him both the likeliest person to be taken and the likeliest reason the beat resolves into nothing. Verified against roster.mjs rather than recalled, which caught pass 5's own error: Spot 53 is the best in the CAST, not the roster — four agents carry 58. Post-pass appended. The check also found that Agyeman's 58 makes the substitution the scaling notes already name the single best answer to the cut, which is now written in. npm run check: 18 guards pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
81ff44e70e |
The bestiary was still describing the fight R-275 changed
Two things in the generated document had gone stale the moment powers reached the simulator, and eighteen guards were green over both because nothing connects powers.mjs to bestiary.mjs. The dodge-ladder section listed Redcap among "the ones that take the most stripping" and counted it in "across 47 creatures", when NOT TIRED means it never spends a defence at all -- the exact opposite of what its own entry says three pages down. It is off the ladder now, the count reads 46 that spend defences, and the page names it: stripping is not a plan against it, killing it is. And the paragraph listing what the harness does and does not model never mentioned that it fights 39 of the 41 creatures with a power without it. It now says so, and counts from powers.mjs rather than stating it, including the 14 that are fight rules it cannot express -- so every figure for one of those is the creature with its best trick taken away. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
97f5cbbcae |
Desk playtest 5: the four-player cut, played for the first time
Seed 8815, four players — Ashcroft, Bhattacharya, Renshaw, Braithwaite. Every rating pulled from roster.mjs before rolling, which is the direct consequence of pass 4 having typed six of sixteen from memory. The cut is the most measured thing in this project and had never been played. EXPOSURE prices its fights, check-firstblood holds its swing, check-attackers holds what each of the four contributes -- and no pass in four had run a session with Pollard and Okonkwo off the table. THE RESULT IS NOT ABOUT COMBAT. The fights were never the problem. What breaks is the party's eyes: POLLARD'S SPOT 53 IS THE HIGHEST IN THE ENTIRE ROSTER AND HE IS THE FIRST PERSON THE SCALING NOTES DROP. At five players the party's eyes go from 53 to 40; at four they stay at 40 with a 35 alongside. This run missed the stump (79 vs 40) and the six at the back (67 vs 35), both Pollard's lane in the six-player game, both clues the scenario leans on. check-rollable cannot see this, and the reason is worth keeping: it asks whether every named skill is reachable at 25% or better, and Spot 40 clears 25 comfortably. It is a rollability check, not a competence check, and the cut is where the difference bites. The scaling note's only stated cost of dropping Pollard is that "the cordon loses its shield", which is about a fight, in a scenario whose first two acts are almost entirely looking at things. Second finding: FOUR OF THE FIVE PARTY-SPLIT ROWS NAME PEOPLE WHO ARE NOT THERE. The table is introduced as the fallback for a table that will not choose its own splits -- and at four players the fallback does not exist, which is exactly when it is most needed. Timing runs the other way from pass 4: ~3:15, twenty-five minutes SHORT, because four people ask fewer questions. Nothing in the Pacing Note says the cuts are player-count dependent, so a GM following it at a small table finishes early. The unsettled countdown fired for a second pass running. Recorded with the caveat that both passes had Ashcroft accept THE OFFER, so both used the Difficult branch -- 14.5% unsettled against 3.8% if he refuses. Not two draws from the same distribution, and the document prints only one of those figures. Five fixes listed, none applied. Also listed: what five passes have still never tested -- the Swinburne fumble, the re-cut-the-peg fumble, a failed Xenology, and any fight at all. npm run check: 17 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
303472f0ab |
The bestiary said "in doubt" and the rule no longer means that
R-280 widened admission from a [15,85] band to "the spread rate stands clear of both ends by more than its own noise", which admits fights that are nearly settled -- the_choir at 99.3%, the_stanchion at 6% -- as long as their noise is smaller still. The page went on saying "whose outcome was ever in doubt", which was a fair description of the band and is a loose one of the rule. It now says "whose odds leave room for a difference to show", and the provenance line prints the admission rule itself, read from the artifact rather than paraphrased, so the page cannot drift from the guard again. The rule is phrased as a clause in check-focus for that reason. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
ae06df8e04 |
Correct desk pass 4: six of sixteen ratings were typed from memory
Found while setting up pass 5 by pulling the sheets from roster.mjs instead of recalling them. The d100s are unchanged; only what they were compared against was wrong, and three outcomes flip: Pollard Spot, the stump 58 -> 53 success becomes fail Bhattacharya Anomaly Lore 58 -> 63 FUMBLE becomes plain failure Braithwaite Xenology (Baseline) 45 -> 53 fail becomes success So three things pass 4 reported did not happen. The re-cut-the-peg fumble never fired -- 98 against 63 is a plain failure, 96-99 never succeed -- which means the ten-minute chase and the whole of finding 2 rest on a roll the seed did not produce. Braithwaite's Xenology succeeded, so the scenario's one single-point-of-failure remains untested after five passes rather than having 'finally come up in play'. And Pollard missed the stump. Read correctly, the same seed lands near 3:34 -- six minutes UNDER budget rather than six over. Findings 1, 3 and 5 are untouched: the special was a real 7, the Swinburne fumble a real 00, and THE OFFER's staging is not a dice question. Finding 2's conclusion also survives because it never depended on the roll -- Act Three is budgeted at 50, the text predicts the fumble costs 20, and nothing connected that to the cut. The reasoning was right and the evidence was invented, and the scenario now says so instead of citing a playtest that did not happen. The Pacing Note's slack claim is withdrawn rather than replaced. One seed read two ways gave 3:46 and 3:34, and the gap between them is about the size of the margin being argued over. It now tells a GM the shape -- every scene has something that ends it, the cuts are real, Act Three is the likeliest overrun -- rather than a number a desk pass cannot produce. npm run check: 17 guards, exit 0. |
||
|
|
fa484071cd |
R-281: a ratchet, because "helps in all of them" survives the advice decaying
R-280 left the claim satisfiable by a gain of 0.2. The artifact now records how
many measurable packs clear their own noise -- reliable: {aboveNoise: 36, of: 38}
-- and the check refuses if that share falls. It may rise freely.
A ratchet rather than a threshold: any threshold here would be a number I chose,
and choosing one just under the current value is what produced MEASURABLE =
[15,85]. A share rather than a count, so widening admission cannot pay it off.
Proved three ways in worktrees: making focus fire actively bad fires the drift
check first, which is correct; making it unreliable and re-recording fires the
older claim at 37 of 38; and claiming a better past, 38 of 38, is refused by the
ratchet itself. The ratchet bites exactly where the old claim does not -- between
"still helps everywhere" and "helps as reliably as it did", which is where a slow
degradation lives.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
c127184763 |
CLEAN GROUND v0.14: pass 4's fixes, and one finding corrected in the applying
Five fixes from desk playtest 4. One of them was wrong and the correction is the more useful half. 1. A SPECIAL ON THE COLUMN PERSUADE NOW BUYS SOMETHING PORTABLE. It bought more conversation, which the line's rest clock then took away -- a player in pass 4 said "I rolled a 7 and got less time", which is a good roll punished by a timing device. It now buys the almanac early, or a name from 1962, or "the six at the back don't eat". Each travels out of the scene, so the line still stands up on schedule and the roll still paid. 2. ACT THREE'S TWENTY-MINUTE BOMB IS NOW BUDGETED -- and this is the finding that was wrong. The pass said the re-cut-the-peg fumble had "no duration and no ender". It has both, and always did: the text says a table will spend twenty minutes on it and to let them try it exactly once. What was missing is that ACT THREE IS BUDGETED AT 50 AND THE TEXT PREDICTS 50 + 20, with nothing connecting the fumble to the cut that pays for it. Act Three now opens with that warning and makes the northern-seam cut compulsory the moment the fumble lands. The clause itself is untouched; it was already right. 3. A FUMBLED PERSUADE ON SWINBURNE HAS AN ANSWER. She does not produce the photocopy -- she produces the dog, walks them to the stump in silence, and H01 reaches them later from the coroner, confirming rather than revealing. Better staging than the drawer, and the GM should not regret the fumble. 4. THE SLACK CLAIM IS HONEST NOW. The Pacing Note said ten minutes. Pass 4 on a hostile seed finished at ~3:46 with one cut unspent: four minutes and a cut. Ten is the friendly-seed number and is what a GM would have planned against. 5. THE OFFER'S STAGING ACCIDENT IS NOW DELIBERATE. Moving it inside the column scene was purely a time saving; the side-effect is that the offer has no audience and Ashcroft returns to a conversation that carried on without him. Written down so nobody moves it back. The correction to 2 is recorded in the playtest document as its own lesson: a reading made while looking for faults finds faults that are not there about as readily as ones that are. Apply fixes against the source, not against the notes. npm run check: 17 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
3d83fbde93 |
R-280: the band replaced by the test it was standing in for
MEASURABLE = [15,85] proxied for "can this fight move at all". The direct form, in the units the guard already uses: the spread rate must stand clear of both ends by more than its own noise. Deliberately blind to the gain -- admitting the sizes where focus fire clears its noise would make the guard's claim true by construction. Size is still picked on nearest-an-even-fight. 31 measurable became 38. the_arrears returns at 6.3, and switchboard arrives at 8.1 -- the second largest gain in the artifact, thrown away for being one point past a round number. Four of the eight carry effects larger than most rows the band already admitted. Two of them do not clear their own noise: the_choir has 0.7 points of headroom and used 0.2, the_stanchion has six and used 0.2. Above-noise falls 31/31 to 36/38 and the bestiary prints 36. That is two measurements reporting no detectable effect, which the band suppressed by refusing to take them. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
23262855b4 |
Desk playtest 4: the clock, against v0.13's recut timings
Seed 6142, banding from rules.mjs rather than estimated, every roll logged. Run because desk pass 1's 4:25 describes a scenario that no longer exists -- Act Two was 65 minutes when that pass ran and is now 45. VERDICT: the clock holds, and for the reason it was built to. Every beat in Act Two ended on something written into the text rather than on GM judgement, which is what the recut was for and what the 65-minute version never had. The run landed at ~3:46 against 3:40, with two of three Pacing Note cuts taken and the third still in hand -- the first time this scenario has finished a pass with a cut unspent. A hostile seed, deliberately not re-rolled: two fumbles, eight failures, and the party's one reliable Act Four test missing. A clock only tested under lucky rolls is not tested, because failure is what generates table time. THREE THINGS THE DICE FOUND, none of them about minutes: - A SPECIAL FIGHTS THE REST CLOCK. Renshaw rolled 7 against 63 and the column opened up at exactly the moment the scene wanted to end. A GM who has just rewarded a good roll will not then stand the line up. The roleplay-first archetype's verdict was "I rolled a 7 and got less time", which is the only sour note in the session and a real design fault. - THE RE-CUT-THE-PEG FUMBLE HAS NO DURATION. The clause is one of the best things in the document and the text itself says a table will chase it. It added ten minutes with no guidance about what ends it. - A FUMBLED PERSUADE ON SWINBURNE HAS NO ANSWER. H01's failure case is written for a party who did not ask, not one that asked badly. Predates v0.13, and the third pass running to find the failure cases written for absence rather than for bad rolls. WHAT WORKED, WRITTEN BLIND: the unsettled countdown outcome added in v0.12 was asked for on its first ever roll -- the understudy fumbled 100 against Ashcroft's failure on the Difficult branch, so the contest came back unsettled. That is the 14.5% case, it is the aggressor-fumble the rule's author left for this document to price, and the price is right. No fix needed. Also confirmed: THE OFFER running inside the column scene costs zero wall clock, and has a side-effect worth keeping on purpose -- the aside has no audience, so Ashcroft returns to a conversation that moved on without him. Five fixes listed, none applied. npm run check: 17 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
a7e4dd7754 |
R-279: what the_arrears was claiming, and why dropping it is the wrong kind of right
It claimed focus fire is worth 6.3 points against two of them, 14.7% to 21%. Measured independently at 4000 runs x 3 seeds: 14.2% to 20.4%, gain 6.2, which is 2.4x its own noise and 44% of the base. The claim was true and reproduces. What failed is a threshold. MEASURABLE is [15,85] and the scan's estimate of a boundary value moved 14.7 to 14.4. And the creature is a step -- 85.7% at one, 14.2% at two, 0.4% at three -- so no pack size gives an even fight and the band's endpoints fall in the gap. The band records nothing about a creature whose defining property is having no middle. Not moving the band to 14: fitting a threshold to the datum it excludes is how a guard stops being a test. But the band is a proxy for "can this fight move", and the direct test -- does the gain clear its own noise -- is already in the artifact and answers yes. Replacing the proxy is a decision about all 47, not a fix, and not mine to take unasked. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
a7eca91a9c |
R-278: raising SCAN_RUNS found that SCAN_RUNS had never been read
Asked to raise the scan until the redcap's pack size stopped flipping. Measured the threshold -- unstable at 3000 and 4000, stable across twenty seeds at 6000 -- raised it, and the re-record took fifteen seconds, which was impossible. winRate takes three parameters and pickSize passed SCAN_RUNS as a fourth. JavaScript discards it, so every scan has always run at RUNS and SCAN_RUNS has never been read by anything. The fix I was asked to make was inert in the same way as the thing it was fixing. winRate takes runs now. The redcap is still n=3 with gain 6.3, arrived at stably rather than luckily; the_arrears drops out of the measurable band at an honest scan, 31 packs to 30; the_committee moves 2 to 6 and stays pinned. Claim check still passes, bestiary regenerated. The only signal was a number being too small. A fifteen-second re-record is good news, and good news is what nobody investigates. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
00e5a993cc |
CLEAN GROUND v0.13: Act Two cut from 65 minutes to 45, and the clock now fits
The scenario ran 20 minutes over the house budget (3h30 play plus a ten-minute break, 3h40 wall clock) and Act Two carried all of it at 65 minutes. It is now 45, and the session lands at 3:40 exactly: 45 + 45 + 50 + 45 + 25 = 210 minutes of play. NOTHING WAS DELETED. The twenty minutes came out of structure, which is the only kind of cut that survives contact with a table: - THE CROSSING IS CAPPED AT FIVE. It was "let the silence sit until a player breaks it", which is open-ended by construction. If the table is still quiet at minute five the Geiger finds its own voice. A silence that has stopped being tense is just a pause. - THE OFFER RUNS INSIDE THE COLUMN SCENE, not beside it. It was "somewhere in this act, take Ashcroft's player aside for one minute" -- a separate slot. Run during the line's rest, while the other players are talking to Ivy, it costs nothing, because the table is already occupied. - THE LINE'S REST IS THE ACT'S CLOCK, and this is the cut that does the work. The column walks every day and stops to rest, not to meet people. Ivy talks for as long as the line is sitting down, and the line sits for twenty-five minutes; then the old ones stand up, because they always do. The scene ends on the GM's schedule through the scenario's own premise rather than through a GM deciding to move things along -- and it is the loop showing itself for the first time, which makes the timer do dramatic work as well as temporal. The Pacing Note now carries 65 minutes of further cuts against what was a 55-minute problem, so there is about ten minutes of genuine slack for a table that talks. That is the first slack this scenario has ever had. It also now says where to cut if the break arrives late: Act Three's depot search, never Act Four, which is the shortest act with the most to do. Also fixed a stale duplicate: the Overview said "Runtime: 4h00" while STATUS and the timing table said otherwise. Every runtime figure in the document now agrees, and the remaining mentions of 4h00 are explicitly historical. CAVEAT, STATED IN THE DOCUMENT: desk pass 1's 4:25 predates this restructure and no fourth desk pass has been run against the new timings. The first human run is also the first test of this clock. npm run check: 17 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
38012d56ff |
R-277: n=3 is right for the redcap, and R-276 was wrong about why
check-focus picks the pack size nearest an even fight. For the redcap that is n=3 at 28.0% against n=2's 73.4% -- correct, and also where focus fire is worth most. But the margin is 1.4 points and the scan is 400 runs: run across eight seeds it picks 3 seven times and 2 once, and the recorded gain would move 6.3 to 4.9 with it. R-276's explanation was wrong. Its table was measured against the CLEAN GROUND cut, which it never named. Against the frozen party a lone redcap is worth 0.4 rather than 6.1, because that party wins 98.9% and nothing shows against a ceiling. The power is worth most where the fight is in doubt -- 3.8 at n=2, 3.1 at n=3, nothing at either end. Not outnumbered. Undecided. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
e21446b164 |
CLEAN GROUND: say plainly that it runs 20 minutes long
Found while revising the Contingency 2027 prep deadlines. The house standard (docs/house-standards.md in the convention repo) allows 3h30 of play inside the four-hour slot plus a ten-minute break -- about 3h40 wall clock against roughly 3h15 of content. This document has always budgeted 4h00, which is the whole slot with nothing either side, and never said that was over. Worse, the Pacing Note's ~25 minutes of cuts read as slack and are not: desk pass 1 ran 4:25, so taking every cut lands at 4:00, still 20 minutes past the house budget. A GM reading "4h00 including a break" alongside "the Pacing Note carries cuts" would reasonably conclude there was room to spare. There is none. STATUS now carries the overrun, and the two honest ways out are written down rather than left implicit: find another 20 minutes, most likely in Act Two's 65, or declare it a deliberate exception and run it where nothing follows -- which at Contingency 2027 it does, Sunday afternoon with only a reserve behind it. Not decided; that is Tim's call. Until then the instruction is explicit: assume an overrun and take the cuts from the start rather than deciding at the break. npm run check: 17 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
7fc0da3ecf |
R-276 correction: check-lethality fights solo, and I read the wrong column
Asked to re-record the lethality baseline against a lone redcap, I read the tool and found it already does: measure(party, [spec]), with a comment saying "Solo, because a creature is the unit under test". My claim that it fights packs came from memory of check-focus, whose redcap is n: 3. The lethality figure was also not hiding the power. Wipe rate moved 0.7% to 0.9% because one redcap cannot wipe four agents whatever it ignores -- that column is at its floor. Agents down moved 0.55 to 0.74 of 4, a 35% relative increase, which is the column I did not look at. No baseline re-recorded: it is already solo and was re-recorded in R-275. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
8fa691c4aa |
R-276: NOT TIRED is visible in play, and worth nothing where we measure it
Played four agents against one redcap. Two dodges in one round, both at 75 -- DEFENCE_STEP is -30, so the second would have been 45 and the roll of 70 would have failed. The wiring fires. Measured with and without, 2000 x 3 seeds: the power costs the party 6.1 points against a lone redcap and 0.1 against three of them. It is a rule about being outnumbered -- a lone defender spends four defences a round, a pack spends one each -- which is why check-lethality moved only 0.7% to 0.9%. The baseline fights redcaps in a pack, the configuration where the power is worth nothing, so that figure is the floor rather than the effect. Not presented as evidence: at seed 3 the party wins with the power on and is wiped with it off, which is stream divergence rather than direction. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
dee2c8f776 |
CLEAN GROUND: booked — Contingency 2027, Sunday 31 January, afternoon
Slot 9. Recorded in STATUS and both open questions closed. The convention repo (slaguru666/contingency2027) carries the booking and points back at this file rather than copying it: seventeen guards check the scenario here, and a copy over there would be a second version nothing checks. That spends the Sunday afternoon re-run reserve, which was real slack. The convention schedule note now names this game as the one that gives if prep on the eight booked games slips — it is the newest, least tested, and the only one whose absence costs nobody a booked seat. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
32ca982369 |
R-275: the harness had never read a creature's power
41 statblocks carry a POWER in their tactics and simulate.mjs read none of them, so a redcap that ignores the cumulative defence penalty has been measured as a creature that tires -- in check-lethality, in check-focus, and in every figure published about it. The defect was not that the powers were unimplemented, it was that nothing said they were not. powers.mjs classifies all 41: 2 wired, 14 notSimulable with a stated reason, 25 not fight rules. check-powers refuses an unclassified POWER and refuses a notSimulable without a reason -- and it does not test that the harness imports a power, it fights the creature with and without and requires the two to disagree. Moved: the courier 9.4% to 1.0% wiped (it attacks at half while carrying), the redcap 0.7% to 0.9% (small, because these fights rarely spend a second defence). ARGENT AND GULES was wired and then un-wired: it tripled the supporter's wipe rate to 75.2% because the harness has no ground and applied the borough-ground condition unconditionally. Same reason THE PULL is not wired. I had wired one and refused the other on identical facts. Lethality and focus re-recorded, bestiary regenerated. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
9f3a63174f |
CLEAN GROUND v0.12: convention one-shot, the print pack, and the real opposed roll
Tim settled the last two questions: convention one-shot, and rules.mjs gains a real opposed roll (landed by a peer session at R-273). Both decisions change the document, and the one-shot unblocked the print pack. THE PRINT PACK — docs/scenarios/CLEAN_GROUND_HANDOUTS.html, guard 17. Four A4 sheets, self-contained, no external fonts or assets: H01 the coroner's note on white, H02 the 1962 committee minute on cream with photocopy grain, H03a and H03b the almanac on ruled paper. 11pt floor throughout. The binding constraint is that H03a and H03b must print identically or the almanac trick dies, so that is structural rather than careful: they share one `.almanac` class and every dimension comes from a variable defined once. There is no selector anywhere that names one page and not the other, and check-handouts fails the build if one appears, if their markup structures diverge, if their columns differ, if any row stops reading "41 mi", if the counts stop being forty-one now against fifty-three then, or if the pack and the scenario drift apart. It earned itself immediately: its first run failed my own pack for five rules at 10.5pt, under the house 11pt floor. Rendering was checked visually too, which caught two things no guard would have — the "TO CLEAN GROUND" header colliding with NOTES, and the writing crossing the red margin rule instead of starting right of it. THE ONE-SHOT. Countdown step 6 said "and this is a campaign", which the decision contradicts. Rewritten, and the Close's "leave it filed" ending now says how to land it tonight: do not end on "you'll be back", because the table never will and a hook they cannot take reads as an unfinished scenario. Name the next agent who gets sent, and have Registry thank them. THE OPPOSED ROLL. The scenario-local ruling is deleted; GM ESSENTIALS points at the game. Both beats were re-priced against the real rule by enumerating all 10,000 roll pairs -- exact, no seeds -- and two things fell out: THE OFFER IS PRICED. Ashcroft refusing is taken 21.9% of the time, the safest file at the table. Accepting: 48.7%, past Braithwaite's 37.6%. Accepting does not make him a bit more vulnerable, it makes him the easiest person in the room, and the countdown reaches for the easiest. STEP 5 CAN COME TO NOTHING, 14.5% of the time against an Ashcroft who accepted, and that row fires once and is marked permanent. Previously a silent gap in a climactic beat. It is now a written outcome with read-aloud text: the reach fails, it wears the wrong face for a moment, the party learns what it is and cannot prove it, and the clock still turns to step 6. Also: update-readme's count-word list ran out at sixteen, one guard after its own comment warned about hardcoded lists going stale. It failed loudly rather than silently, so it is an inconvenience and not a defect. Extended. npm run check: 17 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
dd3d818893 |
R-274: the opposed roll works and the combat never reaches it
Played the hollow man against the cut. THE FILE IS YOURS NOW never fires -- simulate.mjs reads statblocks and weapons and has no concept of tactics, so R-273 closed a gap in rules.mjs and left the same gap one layer out. Resolved by hand it behaves: every roll pair enumerated for both beats. The tie-break carries it -- at POWx5 100 against 60 the aggressor still only takes them 48% of the time, because equal bands go to whoever is being acted upon. Act Four prices THE OFFER: accepting it moves Ashcroft from the safest person in the room to the least safe, 21.9% to 48.7%, past Braithwaite's 37.6%. And that once-only row no-ops 14.5% of the time against him, which Act Three can absorb and a permanent countdown beat may not. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
cdbb2e34ee |
R-273: the opposed roll, built where the authority lives
The content has called for 'opposed POWx5' since before the rule existed -- the hollow man's tactics, CLEAN GROUND twice, slice-text three times -- and rules.mjs defined none. A scenario carried a local ruling that said in its own text it was a ruling and not a rule. Generalises that ruling rather than inventing another: both sides roll, the better band wins, only the ladder the game already has. Ties go to whoever is being acted upon, which is what defenceOutcomeFor has always said; the scenario's 'favour the agent' gave the same answer only because no agent ever initiates one. Neither side succeeding leaves the contest unsettled rather than won, which the two beats need in opposite directions. Two exports at the scenario session's request: opposedOutcomeFor compares graded levels and carries both, so a caller can price a fumbled attempt without this file deciding what a fumble costs; opposedContestFor runs it from ratings and rolls with per-side difficulty, so 'resists at Difficult' does not put applyDifficulty back into a document. Spot-checked against the real Act Four beat: 55 against 85 at Difficult, which is 42. Page 1 states it by asking it -- the tie-break and the margin are computed from the rule at build time, so the book cannot drift from the engine. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
8279cdfda8 |
R-272: guard the tail, and stop prose drifting from its artifacts
Three things Tim asked for together: measure the long end of a fight, make the swing check bite on stale prose, and record in rules.mjs the coincidence that hid an invented rule from two readers. GUARD 15 — check-fight-tail, on tools/fight-tail.mjs. Fourteen guards measured this scenario's combat and none could see a long fight, because every one of them averages. The cap is the measurement here, so the tool passes its own (400, not runFight's default 40) and --update refuses to record anything reaching it. Verified by lowering it back to 40: the cut loses 20 fights to the ceiling, the six-a-side 117, 107 of those ending neither won nor wiped, and the recorder stops. Two claims, both read from a fresh measurement rather than the baseline, so --update cannot silence them. "The long end is twice the median" was rejected as a claim because it is true of both encounters and so distinguishes nothing. Instead: a fight past 15 rounds wipes the party materially more often than a short one, and the SIX-A-SIDE fight is the longer one (median 14 vs 10.7) -- R-270 showing up as duration, since a disabled fighter keeps fighting 30 points down. The cut is shorter because it is decisive, not safer. GUARD 16 — check-cited, on tools/check-cited.mjs. check-firstblood and check-attackers catch the game changing; neither reads the document. Re-record after a re-cast and the artifact updates, the guard goes green, and the prose keeps printing the old number under a citation saying where the new one lives. So citations are now machine-readable -- **40**<!-- cite: first-blood cut.swing --> -- and resolved on every build. 25 of them. It failed three times on its first runs, all real: a config keyed "column" that the prose called "line", two figures rounded 32.3 -> 32, and a vacuous pass on zero citations, now fatal in its own right. It also refuses citation of unstable fields. fight-tail.longest may not reach prose: same party, same seeds, same runs, and renaming a config moved it 71 -> 90 rounds, because seedFor derives the stream from the id. Across seven labels -- median spread 0, p95 1, p99 3, longest 21. A sample maximum reads like a bound and is a property of the label. EXPOSURE states p99 instead. Same discipline on the deadlier ratio: 2.42 with seed spread 1.1, so the document gives its direction and declines to quote its size. RULES.MJS — one comment, no rule change. Over resolveLocationHit: its two thresholds are unrelated and usually agree. disabled is a fraction of the pool per location; majorWound is ceil(hp/2) and feeds only dyingLimitFor; neither removes anyone from a fight, which is conditionFor at 2 hit points or a destroyed head. At 10 hp, leg/abdomen/chest capacity is 5 and majorWoundFor is 5, and those locations take 12 of 20 melee results and 15 of 20 ranged -- so two readers reconstructed a rule that does not exist, checked it against the log, and were confirmed by it. The note says to test an arm, the only place the difference shows. Guards verified to bite, not assumed: drift, re-cast, censoring, the longest refusal, the rounding catch and the vacuous-pass catch were each forced and each failed the build with the right guidance, then restored. npm run check: 16 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
14c34449e3 |
R-271: measure the tail, and a round cap that scores a long fight as a draw
Fourteen guards all average, so none can see how long a fight might run. 6000 fights per configuration: the cut runs a median of 11 and a 95th of 22, the six-a-side line a median of 14 and a 95th of 32, and the longest seen are 71 and 79. The line is the LONGER fight, because more bodies means more of them fighting on at reduced skill rather than dropping. Length predicts death: 61.6% of cut fights past fifteen rounds are wipes against 42.0% of shorter ones. maxRounds = 40 is the default every guard runs at and a fight reaching it is scored as neither wipe nor win -- censoring 0.2% of cut fights and 1.87% of the line's. Measured before proposing anything: uncensored, the swing moves 39.8 to 39.9 and 14.8 to 15.1, against a recorded noise of 2.1. The cap stays, documented rather than corrected, because the cure is four re-recorded baselines. Also R-270 addendum: the hit table is weighted toward the locations where the two thresholds coincide -- 12 of 20 melee results, 15 of 20 ranged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
74e45b15e7 |
R-270: a rule I invented, and the coincidence that hid it
R-266 said a fighter goes down at half maximum hit points and called it one rule in both directions. conditionFor puts someone down at hp <= 2; majorWoundFor is ceil(hp/2) and feeds only how long the dying last; a location is disabled by resolveLocationHit at its own locationMaxHp capacity. The reason it survived reading: for a 10-point neighbour majorWoundFor is 5 and a leg, abdomen or chest holds exactly 5, and for a 12-point agent both are 6. On the locations that get hit most the invented rule returns the real one's answer, and the narration prints MAJOR WOUND and disabled on the same line. Arms and heads are where they part, and I had not looked at an arm. Found by the scenario session going to rules.mjs to verify a different correction of mine and reading the next function along. Both errors made the fight look easier than it is. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
6e46ad0909 |
CLEAN GROUND v0.11.1: correct the mechanism under the first-blood swing
Two wrong mechanisms in one sentence of my own v0.10 prose. The measured swing of 40 is unaffected -- what was wrong was the explanation I gave for it, which I wrote from intuition rather than from rules.mjs. 1. "every disable removes an attacker" -- it does not. locationEffectsFor (rules.mjs:461) charges 30 points off physical for a ruined leg or manipulation for a ruined arm, and simulate.mjs:305 applies the manipulation penalty to melee and ranged attacks alike. A 40% attacker disabled is a 10% attacker, not an absent one: still swinging, still drawing attacks, still a target. A slope, not a cliff. 2. "both sides go down at half their maximum hit points" -- also wrong, and this one nobody flagged. Half maximum hit points is majorWoundFor, the MAJOR WOUND threshold, which feeds dyingLimitFor and decides how long a dying character lasts. It has nothing to do with leaving the fight. conditionFor (rules.mjs:1630) puts somebody down at 2 hit points or on a destroyed head, and that is the only thing that stops them acting. The paragraph now states the real loop and warns the GM off the wrong one, because playing disables as removals gets the fight wrong in the party's favour -- the direction that makes a party-ending encounter feel survivable. Credit where due: the first error was caught by a peer session correcting prose it had sent me twice. I found the second only because I verified the first against rules.mjs instead of taking it on assertion. npm run check: 14 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
765b3518db |
R-269: the fourth quadrant, and a disable does not remove anybody
Seed 16 is the missing corner -- party takes first blood in round 1 and is wiped anyway -- and it runs 24 rounds. Its last five are Neil dropped by a critical through armour, then Dominic alone at 1%, failing three times, then dying. That is what three effective attackers costs at a table when a fight goes long. Corrects a mechanism I had written twice: a disabling hit does not remove an attacker, it charges 30 points off physical or manipulation per locationEffectsFor. Bhattacharya keeps swinging at 10 for four rounds. A slope, not a cliff. Neither guard fired and neither was wrong: the fight sits in the 25.5% the swing does not cover, and no guard measures the tail because all of them average. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
dc801f7e9f |
CLEAN GROUND v0.11: Dodge 68, and Ashcroft is busy rather than sidelined
Two holes a peer session's per-agent measurements pointed at. Their scratch figures are not used; both edits are sourced to published numbers or to the guard that now holds them. EXPOSURE gains a fifth point: the party's sheets read about twice as effective as they are, and the number doing it is the column's Dodge 68. That is arithmetic off two published values, not a measurement -- Dodge 68 on The Quiet Neighbours (tools/content.mjs, printed by the bestiary) and one defence spent per incoming blow, so a 40% attack against a fresh dodge connects about one time in eight. Nothing in the document said so, and grep for "expect to hit" / "hit rate" / "lands about" returned nothing at all. The point carries its own way out: DEFENCE_STEP is -30, so a defender who has dodged once meets the next blow at 38%, then 8%, then the floor. Spend their dodges rather than out-shooting them. That is also the other half of why the four-player cut is a different game -- three attackers cannot spend three defenders' dodges and six can, so the missing attacker is the one who would have made everybody else's shots land. The recorded landing rates agree and are now citeable (16-18%, above the naive one-in-eight because most blows are not the first of their round), so the sub-bullet cites tools/attackers-baseline.json rather than asserting. The scaling note's Ashcroft warning gains the sharper reading: he is not sidelined, he is busy and ineffective -- 9.2 attacks a fight of which 1% land and 0.1% disable anybody, both held by check-attackers. A player who cannot act knows to do something else; a player rolling once a round for an hour thinks he is fighting. So the note now says what to give him instead, using only what is on his sheet: First Aid 40, Dodge 63, Insight 63, the anchor. Verified rather than relayed: Dodge 68 at tools/content.mjs, DEFENCE_STEP -30 and the per-round reset in rules.mjs and simulate.mjs, the three fighters' skills at 40/40/35, and the per-attack rates re-measured independently across three seeds before the baseline existed (17.6-18.3 / 17.4-17.6 / 15.5-16.2 / 1.0%, against the recorded 17.8 / 17.3 / 16.2 / 1.0). npm run check: 14 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
0b86c5ffc3 |
R-268: guard the sentence that names a player's character
CLEAN GROUND prints that the four-player cut is three effective attackers and that Ashcroft is not one. Nothing checked it, and a GM reads it aloud to decide who a real player spends four hours being. effective-attackers.mjs measures per attack, not per fight: counted per fight Braithwaite leads on disables, but only because his armour buys him a third more swings -- per attack he is the weakest of the three. Both rates are recorded and only the per-attack one is reasoned from. Asserts exact drift, then the sentence: three clear 5% of attacks disabling, one does not, and that one is Ashcroft. Re-recording does not silence the claim check; verified in a worktree. declared-cast.mjs holds the cast marker reading both scenario guards need, rather than a copy in each. It was briefly named scenario-cast.mjs, which check-scenarios sweeps into the scenario corpus -- its own example marker was read as a real cast. update-readme dropped any guard that exited non-zero, so check-rollable vanished from the README and the count word fell to thirteen while fourteen guards ran. A missing line is now fatal. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
a0d15ad7a9 |
CLEAN GROUND v0.10: EXPOSURE reframed on the first disabling blow
The old EXPOSURE paragraph read the fight at round five and quoted bucket figures no guard held. Round five is where the outcome becomes legible; round two is where it is decided. Reframed on the first disabling blow and cited to tools/first-blood-baseline.json, so every figure in the paragraph is one the build re-measures: cut 50.3% first blood at mean round 1.8, 25.5% vs 65.5% wipes, swing 40 line 54.1% at round 1.3, 7.8% vs 23.2%, swing 15.4 An earlier draft carried 43 for the cut swing from a single seed. Three seeds give 40.0. The note stays in the document. Also adds a Casting coupling warning: the declared cast in the `cast:` marker is load-bearing on check-rollable and check-firstblood, and re-casting invalidates the recorded swing. Verified rather than assumed — swapping braithwaite for agyeman in the marker fails both guards and the build, and check-firstblood names the fix: "The recorded swing describes the old cast; re-record with --update, do not revert the cast." npm run check: 13 guards, exit 0. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
60995b28c2 |
R-267 addendum: read the cast, do not copy it
I told the scenario session that this guard turns a silent re-cast into a build failure, and it accepted the coupling on that basis. The cast was hardcoded, so a re-cast would have left it measuring the old six and reporting success. Reads the <!-- cast: --> marker check-rollable established, drops the two the scaling note drops by name rather than by position, and refuses to run if the marker is gone. Verified by re-casting CLEAN GROUND in a throwaway worktree and watching the guard name the change. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
996bd248d3 |
CLEAN GROUND: one status block, and the end of the build archaeology
A stand-in GM opening this had no single place to start: the state of the document lived across three playtest logs, twenty commit messages, a status paragraph and a checklist at the foot. Worse, the two written accounts had drifted apart — the status paragraph still said the scenario "wants a stress re-run of Act Four, a player-chair pass", both of which were done and committed, and the foot checklist still said v0.8 in a v0.9 document with a sentence broken in half. STATUS now sits at the top and answers the questions a GM actually arrives with: what version, can I run it (yes, from this file alone), is it convention-ready (no — never played by human beings, no print pack), what playtesting exists and at which seeds, how long it runs and where the cuts are, how many players. Then the three things that are not obvious, as pointers rather than restatements, because GM ESSENTIALS is where rules live: opposed rolls use a scenario-local ruling since rules.mjs has none; Ashcroft cannot fight and his player must be told before the game; and the lethal encounter is the column in Act Two, not the monster in Act Four, which cannot hurt anybody. The foot checklist is deleted rather than corrected. Every item on it was either struck through or now in STATUS, its history is in the logs and the commits, and keeping a second account of what is outstanding is what let the first one drift. Open Questions stays as the single home for decisions and STATUS says so in a line instead of holding a copy — the same rule this repository applies to rule formulas, applied to prose about state. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
ce1103ec0d |
R-267: a guarded home for the first disabling blow
Another session verified R-266's measurement, agreed the frame was better than its own, and declined to publish it because the figure had no guarded lineage a doubter could re-derive. It was right, and the fix costs 0.7s of build time -- which is the number I should have checked before calling it a reading tool and not a guard. first-blood.mjs gains --update/--check and is now both the reader and the measurement of record; check-firstblood.mjs is a thin wrapper over it, the same shape as check-bestiary. Compares the recorded figures exactly, then asserts only what a page would claim: first blood lands within 5 points of even in the cut, and its swing exceeds the six-a-side line's by more than both noises. Recording it moved the swing from the scratch run's 43 to 40 against a seed-to-seed spread of 2.1 -- high by more than its own noise, which is the argument in miniature. update-readme's COUNT_WORD could not reach thirteen. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
8e5a30a263 |
CLEAN GROUND v0.9: the anchor cannot fight, and the cut is three
Reading two narrated fights from another session showed Dominic attacking at `vs 1`, four times in one of them. Confirmed against the sheet rather than the log: weapons is empty and his only combat skill is Firearm (Pistol) 43, with nothing to fire. So the four-player cut fights with Renshaw and Bhattacharya on compact pistols and Braithwaite on a knife — a quarter of the party out of any fight, and a large part of why EXPOSURE already said violence at four players is party-ending without knowing that was the reason. A defect I introduced. "He carries no weapon, and the GM must not fix it" was written as characterisation about an anchor having both hands full, and was never checked against a fight. Not fixed by arming him, which would cost the character to solve what is really a briefing failure. Said out loud instead: his entry now states the 1% plainly and instructs the GM to tell his player BEFORE the game that Dodge 63, First Aid 40, Insight 63 and the anchor are his set-piece. A player who is not told will roll at 1% for twenty minutes and conclude the sheet is broken, which is the actual harm here. The scaling note carries the three-attacker arithmetic and points at Agyeman as fixing the sum as well as the lane; EXPOSURE names the cause in its own prose. Also recorded in the pass-3 log, deliberately NOT applied: the bimodality now has a mechanism — both sides disable at half max HP, so each disable thins the return fire and makes the next likelier, and first blood is a true coin worth 43 points of wipe rate in the cut against 14 at six-vs-six. It reproduces exactly. It stays out of the scenario because it comes from a reading tool with no guarded baseline, and a GM-facing page may not carry a figure nobody can re-derive. The duller published sentence is the checkable one. If that measurement gets a guarded home the paragraph should be reframed around the first disabling blow, which is the better frame. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
19ed0b5f0f |
R-266: the coin is the first disabling blow, and it lands in round two
Reading both ends of the four-player cut — seed 5's sweep and seed 2's wipe — says the fight is not decided by round five but by whoever lands the first disabling hit, on average in round two. Both sides disable on one good blow, so each one thins the return fire and makes the next likelier; nothing pulls a fight back toward the middle. tools/first-blood.mjs measures it: 49.7/50.3 on who strikes first, and 23.1% vs 66.5% wipes on either side of that. Six against six is the control at 8.6% vs 22.4%. A reading tool, not a guard — it records nothing, and no figure from it goes on a generated page. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
6b95a2c5a5 |
CLEAN GROUND v0.8: the player chair found the refusals, and both needed deciding
Desk pass 3 is committed alongside — full session from the player chair, choosing against the scenario at every junction, seed 5580 with one corrected branch at 7731. Every failure case and every pass-2 fix held. What it found instead were the two things players do that no GM-chair pass can reach, because both are refusals rather than rolls. "We are not going through." Three acts live on the far side and the document had no line about declining to cross, which is the most professionally sensible choice a party can make after reading a coroner's note about a man who walked himself to death. Answered now with a reason and not a compulsion: the entry is pegged to a tree that no longer exists, so a seam with no peg does not sit still — waiting does not make it safer, it makes it unfindable, and the forty-one go with it. Registry says that once and leaves the choice alone. A party that still refuses gets a real ending in ten minutes rather than four railroaded hours. "Can we cancel it from in here." A Research fumble and an Anomaly Lore success both landed on a question the document could not answer either way. Decided rather than fudged: cancellation is a REGISTRY ACT ON OUR SIDE, because the entry is a record and the record is held here. So it cannot be done from inside, somebody has to be back through before it happens, and anyone still in the duplicate when it goes goes with it, having never been filed as being there. The Close now costs not only what they choose but who is standing where when it takes effect, and if they are bringing anyone through those two questions collide. Also: Ray Teasdale, the clearance foreman the timeline always implied and the roster never carried — a Persuade success in pass 3 bought an interview with a man who did not exist. Act One's failure case no longer assumes the party is at the farm, since pass 3 spent the act twenty miles away and the automatic notch sat uselessly on the other side of the county. The re-cut is answered on a success as well as a fumble, with the reason: the entry is pegged to the older authority and there is no older tree. Fix 7's conditional target moved onto the countdown row, because I missed it myself eight minutes after writing it. A special for reading the child. And the bimodality paragraph, which took three attempts to earn its place: held when its citation failed, verified after another session found the cause — three separate random generators, so a seed named a different fight in each tool — and corrected once more when its illustration turned out to compare targeting modes rather than the two ends. Published now as 23% nobody down against 45% everybody, decided by round five, with the focus-fire claim removed. Twenty-three fixes across three passes. The cadence is complete; what remains is the print pack and two decisions that are not a scenario's to make. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
e84c85be02 |
R-265: name the denominator the two-down row is zero out of
The round-five race line read "zero in 2000 fights", which invites the reading that no fight in the run was a wipe. It is zero out of the 84 that reach round five with two of the three down — a small bucket, and the sentence should say so before the figure goes to print in a scenario. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
8627fa3536 |
One generator, so a citation names one fight (R-265)
tools/playthrough.mjs exists to show a reader why a measured number is what it is. I cited it to another session — read seed 2, see the wipe the 45% row is made of — and the reproduction failed in front of them. They reported different outcomes at both seeds and guessed the cause correctly from outside: the two tools were not drawing from the same stream. They were not. simulate.mjs used a private mulberry32 makeRng; playthrough.mjs had its own LCG written to look like it. Both deterministic, both reproducible alone, and "seed 2" named a different fight in each — which breaks the only thing the tool is for. Its own comment claimed a seed here names the same fight there. check-focus carried a third copy of that LCG, so the two guards described the same game with different dice. makeRng is exported and both files use it. A playthrough seed is now exactly the first fight of simulate.mjs --seed <n>: --runs 1 --seed 2 and the playthrough give 9 rounds, 4 of 4 down, 1 dead, both. The other half was my citation rather than the code: the command I sent omitted --mode, so it plays both targeting arms and prints two fights. They read the last line, I quoted the first. The summary line now names the arm. check-focus re-recorded under the shared stream; figures move a point or two. What it buys is that the bimodality analysis now reproduces the published means exactly — 2.31, 3.03, 0.40, 0.42 against the four rows CLEAN GROUND publishes. Under the old LCG it agreed to within a decimal, which looked like corroboration and was two experiments landing near each other. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
796bb7df73 |
CLEAN GROUND: the second EXPOSURE table, and four ratios that moved with it
Another session re-pinned the main exposure table at
|
||
|
|
8f3e1ff48e |
CLEAN GROUND: re-pin EXPOSURE against the corrected harness
The table was measured at |
||
|
|
6f33525b3a |
CLEAN GROUND v0.7: pass 2's seven fixes, and an opposed roll the game has not got
Desk pass 2 stressed Act Four across five contrarian branches at seed 9314 and is
committed alongside. The fixes from pass 1 held — beat 3's ungated tell worked and
the four-beat spine stopped the sprawl — but the stress found seven more holes.
The serious one: rehearsal step 5 is beat 3's guaranteed fallback, and in branch C
both sides rolled successes, which rules.mjs has no way to resolve. It defines no
opposed roll at all, while the hollow man's tactics text, slice-text.mjs and this
scenario all ask for one. Same class as Scent and Science (Botany): content naming
a mechanic the engine cannot perform.
GM ESSENTIALS now carries a SCENARIO-LOCAL ruling so the case is playable — both
roll, better band wins, ties to the agent, both fail and nothing happens — using
only banding the game already has, labelled a local ruling rather than a rule.
rules.mjs is untouched: whether the system gains a real opposed roll is not a
scenario's call, it is logged as an open question, and the text says to delete the
local ruling if that rule ever lands.
Verified against rules.mjs's own banding rather than by eye. Branch C now resolves
to Okonkwo resisting on equal bands. Branch D, with fix 7, has the understudy
prefer Ashcroft if he accepted THE OFFER, resisting at Difficult —
applyDifficulty(85,"difficult") is 42, the system's own grade and not a number I
invented — which finally makes the fiction and the numbers agree, because a
compromised anchor was previously the hardest man in the room to take.
Also in: the early-kill branch, which pass 2 measured at ten minutes of act and
thirty-five of dead air, now continues as Braithwaite's twenty minutes over a body
wearing Prichard's face, with nobody having yet asked where the real Prichard is;
a miss for Psychology, since the best line in the document cannot sit behind one
40% roll; a critical result for Borrowed Authority, which happens one roll in
twenty-five; step 5's target named as the lowest POW in the room, Okonkwo at 55%,
because a thing that has practised thirty years takes the easiest file; and one
sentence saying the hollow man's anchor immunity does NOT transfer, set up by
Ashcroft being skipped in Act Three so that he draws the wrong conclusion.
The EXPOSURE table is marked correct-as-of-5450521 and still needs re-pinning: the
harness rewrite landed at
|
||
|
|
ad5fd57568 |
The harness was fighting a different animal (R-264)
Reading a narrated supporter fight showed it being hit on armR and head. It has wings; it
has never had arms. Three defects, all in the pipeline every published number comes from.
1. It located hits by species, not body plan — simulate.mjs read defender.species where
the game writes spec.bodyPlan ?? spec.species ?? "baseline" into speciesProfile
(build-packs.mjs:294). The barghest, kelpie and church grim were fought on two legs
with arms, and the supporter with no wings, so the fight its tactics call the one the
agents can win could not occur in a measured fight.
2. Armour was one scalar for the whole creature, and the harness's locations had no
armour field. Bare wings, the grounded halving and the vital exemption — R-254 and
R-255 — were invisible to every number. Worn armour was summed the same way, which put
a stab vest on a cleaner's head.
3. Nothing was ever grounded: a wing could be ruined and the creature kept flying.
Fixed in the game's order — locate, then apply what that location carries, every term
imported from rules.mjs. A ruined wing calls groundedPlanFor and the wounds carry across
by severity through remapLocationDamage, the function _preUpdate uses.
A bug of mine no guard would have caught: remapLocationDamage returns { damage, moved,
rescaled } and my first draft passed the whole object where a damage map was expected, so
every wound a creature carried was forgiven the moment it came down. check-lethality would
have passed it — fewer wounds means a longer fight, which reads as a number moving, and
this commit moves numbers. Found by probing a landing by hand.
20 of 47 creatures moved, 18 deadlier and 2 less. The supporter goes 69.3% -> 25.1% wiped,
3.38 -> 2.16 down, second deadliest to fourth: it was being measured as a 30-hit-point
creature in uniform armour 9 that could not be grounded. The small rises elsewhere are the
party's armour no longer covering locations it never protected.
check-focus then caught the page overclaiming, which is what it is for: focus fire still
helps in all 30 but only 28 clear their own noise where 31 of 31 did. The guard was
asserting more than the page needs — the bestiary prints that count from the artifact and
cannot overstate it — so it now checks only what the page asserts outright, and the page
rewrote itself to "in 28 of them".
Both baselines re-recorded. Minor version, not a patch: the published numbers changed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
||
|
|
5dcaaf519a |
The simulator can be read now, not just totalled (R-263)
Every guard here reports a number per creature, and a number cannot say why a fight went the way it did. That gap is what produced R-258 through R-260: each written from a side harness built to watch a fight, each modelling something slightly different from the game, two of the three wrong in ways no guard could catch because no guard was involved. runFight takes an optional `say` sink. It reports what the simulator already decided — the attack roll and its target, a defence and the penalty it was made at, the landing level after a dodge downgrades it, damage against armour before and after armourAgainst, the location, major wounds, disablement, death. It never touches the generator, so a narrated fight and a silent one are the same fight; check-lethality and check-focus both still match their baselines exactly with the hook in place. tools/playthrough.mjs (npm run play) is its consumer, in the same commit deliberately: a hook with no reader is the exact defect this project keeps finding in its own rules, and adding one to the measurement pipeline with only a scratchpad file calling it would have been committing the thing I have spent the session removing. Pack size comes from focus-baseline.json so the fight you read is the fight check-focus measures; creatures recorded as pinned are played solo. Three redcaps, seed 20260913, same seed both ways. Spread fire: wiped in 10 rounds, 3 dead, and all three redcaps still standing — 39 hit points spread three ways so that none of it finished anything. Focus fire: same opening, diverging at one target choice in round 1, party wins in 20 with two up. The +13.2 points check-focus records, seen once instead of averaged. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
104b588e86 |
R-262: the second R-261, renumbered, deferring to the one that was committed
Two sessions numbered an entry against the same committed log, which ended at
R-260, and both picked R-261. Mine was written first but was uncommitted, so the
other session could not have seen it and had every reason to think the number was
free. When it staged docs/REVIEW_LOG.md my entry was sitting in the file, so it
went out inside
|
||
|
|
1d915c55cf |
check-focus: the focus-fire claim is an artifact, not a sentence (R-261)
R-258 put a tactic on a GM-facing page from an unguarded harness, R-259 found it worth
nothing, R-260 found the replacement right for the wrong reason. Three corrections, each
landing as prose with nothing checking it — the arrangement that let
|
||
|
|
555fa761c0 |
check-rollable: guard eleven, because a real skill is not the same as a route
check-scenarios resolves every skill a scenario NAMES against the catalogue, which is a different question from whether anybody present can roll it. CLEAN GROUND shipped four commits with three clues gated on Track (base 10), Navigate (base 10) and Science (Botany) — base 1, so the 1% floor was the whole of it — and every guard passed, because all three are perfectly real skills. A desk playtest found it by auditing the acts against the sheets the scenario casts. That audit is mechanical, so it belongs in the build. Two tiers. Corpus-wide, some roster agent must reach VIABLE for every skill any scenario names. Per scenario, a document that DECLARES its cast is held to that cast instead, and that is the tier that catches this defect class. The cast is declared rather than inferred, and that is the interesting part. The first version scraped pc_ keys out of the prose and swept up the substitutes named in CLEAN GROUND's player-count scaling — a cast of nine instead of six, which put Sandoval and his Track 35 in scope and made the guard pass the very bug it was written for. A guard that guesses the cast is worse than none, because it reports success. CLEAN GROUND now carries a cast comment and the guard reads it off the raw text, since scenarioText strips HTML comments. Verified load-bearing rather than assumed: re-injecting the original Track tag into the real CLEAN_GROUND.md fails the guard, naming the skill, the base chance and the declared cast. Worth recording that the corpus-wide tier would never have caught it — Lindqvist trains Botany at 40, so it is rollable by the roster and simply not by the six who were cast. The first fixture test passed for that reason and misled me; only the declared-cast tier finds this. VIABLE is 25 and is justified, not picked: it is the commonest base chance in the catalogue, what an untrained agent brings to Spot, Listen or Brawl, so it is the level the game itself treats as worth attempting. Below it a clue is not gated, it is buried. check-scenarios exports its tag parser rather than growing a second copy, behind the invokedDirectly pattern simulate.mjs already uses; a duplicated parser is exactly what this repository's one standing law forbids. update-readme then caught me fairly — it cross-checks the advertised guard list against npm run check — so the guard is registered there too and the README advertises eleven in all three places. No REVIEW_LOG entry: the log is clean at R-260 and is being appended to every few minutes by concurrent work, so the end of that file is the likeliest place to collide. Left for whoever next touches it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
48216bae10 |
Focus fire across all 47, and the same confound one turn later (R-260)
Measured in simulate.mjs. For each creature, the pack size whose spread-fire win rate lands nearest 50% — a fight at 0% or 100% cannot show an effect, which is why R-259's first sample was three-quarters useless — then focus versus spread, 2000 fights across three seeds. 31 of 47 creatures had a pack size that could show anything. Focus fire helped 31 of 31, by more than that row's own noise 31 of 31 times, mean +12.8 points. Best is 6x The margin, 40.4% -> 61.1%. The other 16 are unmeasurable rather than unaffected: eleven are trivial six at a time, five are hopeless in pairs. R-259's decomposition was confounded, and I wrote it while correcting a confound. It credited the defence ladder with 4-5 points by comparing dodge <=30% against dodge >=55% — but the low-dodge samples were PAIRS and the high-dodge ones TRIOS. Held at a fixed pack size, dodge is worth 1-2 points. Pack size is the driver: 8.0 points for a pair, 14-15 for three or more, then flat. What focus fire buys is that a dead creature stops attacking and a half-dead one does not attack any less. Two failures, one cause: comparing groups that differ in more than the thing being measured. The control is cheap and I did not run it until the third time. The bestiary advised concentrating fire and gave the ladder as the reason — right advice, wrong reason. It now gives the reason that survives measurement. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |
||
|
|
bf8db68383 |
CLEAN GROUND v0.6: the eight fixes desk pass 1 earned, and its log
Desk pass 1 is committed alongside, seed 4271 and the roll stream printed, so the run is re-checkable rather than remembered. It failed the scenario, which is what it was for. The pre-flight audit did the real damage before a die was rolled: Track, Navigate and Science (Botany) were named by the acts and rollable by nobody in the cast, and Botany is base 1 — the same unusable-test defect fixed in Act Four two commits earlier and left standing in Act One. check-scenarios cannot see this; it resolves skill names and has no opinion on whether anyone present can roll one. Then the dice found the rest. Xenology (Baseline) failed and Act Four had no route left, which is the concentration risk logged as an open question arriving as a dead end on the first run. A fumbled Anomaly Lore had no written result and I invented a ruling at the desk. Act One's failure case backstopped arrival rather than the peg. The act ran 4:25 against 3:55 on three lucky rolls. Fixed: the notch is automatic and the three broken routes moved onto Spot, Knowledge and Anomaly Lore; every roll in the document now carries a written miss; the Act Four tell is ungated, with Xenology buying it early and privately instead of holding the only key; the fumble is answered by the re-cut delusion, tried once, failing in silence; Act Four has a four-beat spine because with no mechanical threat the structure has to be in the text; and THE OFFER finally fires Ashcroft's seam, priced at 2 Coherence he must accept before being told. Verified by re-running seed 4271 through the rewritten acts, so the identical rolls that broke the run were put back through the fix. Every one now has an answer, and Act One's three must-land clues all land despite two failures. Timing is improved and NOT solved: cuts recover 20-25 minutes, landing near 4:00-4:05 on a 3:55 budget, and on-the-minute is a fail for strangers. A third cut is likely needed and the candidate is named. Whether Act Four's spine holds 45 minutes, and whether THE OFFER plays as a decision, cannot be settled from a desk and are recorded as such. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> |