KB: correct the burstCount claim -- it is honoured by the CALLER, not cosmetic

The KB asserted as [T1] that "burstCount is cosmetic for zone damage".  Half of
that is byte-verified (DamageZone::TakeDamage @0041e4e0 really does ignore it);
the other half was an inference that inherited the [T1] tag and then justified
task #62's salvo-lead design -- which silently divided every missile salvo by its
missile count (gitea #95).

Corrected in both places it appeared (combat-damage.md:334 and :884): the CALLER,
Mech::TakeDamageMessageHandler @0x4a0423-0x4a04d8, applies TakeDamage burstCount
times and re-rolls the struck zone per burst.  burstCount = number of
applications; load-bearing for missile cluster count, splash falloff and the gyro
bounce.  Also records that the arcade Missile dispatches DIRECTLY at the victim
rather than through the message manager (whose consolidation drops burstCount).

New gotcha 24: a verified fact, over-generalised, becomes a wrong design premise.
Detection smell -- a "cosmetic/unused" claim about a field other code still
computes carefully.  Nobody spends instructions randomising a decorative value.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Joe DiPrima
2026-08-01 04:43:34 -05:00
co-authored by Claude Opus 5
parent 3b7c19c232
commit c23d06cbb5
2 changed files with 42 additions and 8 deletions
+19
View File
@@ -755,3 +755,22 @@ equally covers the ramp-baked-texture path and pure-emissive batches.
**Detection smell:** a colour change that logs perfectly at the source and produces zero visible
difference. Diff two runs pixel-wise against a control region before believing a colour path
works — "the log says 0.1x" is not evidence that anything reached the screen.
## §24 — A verified fact, OVER-GENERALISED, becomes a wrong design premise
**(2026-08-01, gitea #95 "missiles land 3 points instead of 50".)** The KB carried this, tagged
**[T1]**: *"`DamageZone::TakeDamage` is `damageLevel += amount*scale` and IGNORES `burstCount` — so
`burstCount` is cosmetic for zone damage."* The first clause is **true and byte-verified**
(`@0041e4e0`). The second is an **inference** that was written down beside it, inherited the [T1]
tag, and then justified a design decision (task #62's salvo-lead model) that silently divided every
missile salvo by its missile count for months.
**What was actually true:** `TakeDamage` ignores `burstCount`; the **CALLER**
(`Mech::TakeDamageMessageHandler` @0x4a0423-0x4a04d8) honours it by calling `TakeDamage` that many
times, re-rolling the zone per burst. The consumer was one stack frame up — the same blind spot
shape as §21 (export-gap blindness), but with the evidence *present* and simply not followed
outward.
**Detection smell:** a "cosmetic"/"unused"/"vestigial" claim about a field that other code still
computes carefully. Here the binary randomises `burstCount` at impact (`Random(n) + n/4`) and the
splash code derives it from a distance falloff — nobody spends instructions rolling a decorative
value. **If a field is called dead, ask who still writes it, and why.**
**Rule:** tag the VERIFIED clause, not the paragraph. An inference sitting next to a [T1] fact is
still [T4] — split them, or the next reader (including you) will build on the guess.