RELEASE
planning/2.8.5/data/FO3/FO3_WEAPON_DATA.md
sha256 a1ce4ea1a9f26552 · 29275 bytes ·
original held in the private archive
# FO3 Weapon Data — Cited Source-of-Record + Correction Spec
> **ANALYSIS + PLAN stage, 2026-07-15.** Branch `dev` @ `c22e232`. Opus.
> **NO code changed, NO source file touched, NO commit.** This doc is the
> authoritative corrected table + the build plan for a later Sonnet unit.
> Source of truth: **fallout.wiki** (Protocol 3), read live in the in-app browser
> (WebFetch is 403-blocked, as expected). Primary source: the single canonical
> [Fallout 3 Weapons](https://fallout.wiki/wiki/Fallout_3_Weapons) master table,
> column layout decoded against the labeled
> [10mm Pistol](https://fallout.wiki/wiki/10mm_Pistol_(Fallout_3)) infobox, plus
> the [Frag Grenade](https://fallout.wiki/wiki/Frag_Grenade_(Fallout_3)) page for
> the explosives-damage semantics.
---
## 0. TL;DR (read this first)
- **The error is SCATTERED, not a uniform multiplier.** The provenance sweep's
headline ("values inflated ~10×") was an artifact of a 6-weapon sample that
happened to catch high-value uniques. Across the full table the wrongness is
**independent per field, per weapon** — some values are far too high (Sniper
Rifle value 3500 vs wiki **300**), some are too **low** (10mm Pistol value 100
vs wiki **225**; 10mm Pistol fire-rate 1.7 vs wiki **6**). This is the
signature of **model-estimated data**, not a transcription with a fixed offset.
- **The file header's Protocol 3 claim is false.** Line 14-16 of `db_fo3.js`
states "every data row here is sourced from fallout.wiki." The weapon table was
not — the numbers don't match. That false citation is the exact trust failure
this whole sweep exists to kill.
- **Almost the entire table is now directly re-verified.** Because fallout.wiki
publishes ONE master table for all FO3 weapons, I verified ~100 conventional
weapons directly (not a sample). The corrected values are in §3.
- **The single most-wrong field is `Attacks_Per_Second`, closely followed by
`Value` and `Crit_Multiplier`.** `Base_Damage` and `Weight` are wrong less often
but still frequently.
- **Explosives are a special case** (damage = impact + blast); handled separately
in §3.6.
- **4 rows are not Fallout 3 weapons at all** (cross-game or invented) — same
class as the fabricated perks. See §3.8.
---
## 1. Inventory of the current table
**File:** `js/data/db_fo3.js`, the `[WEAPONS.CSV]` block, lines **46-161**
(114 weapon rows + 1 header row).
**Schema (self-labeled, line 46):**
```
Weapon_Name, Base_Damage, Crit_Damage, Crit_Multiplier, Attacks_Per_Second,
Weight, Value, Req_Unarmed, Req_STR, Reach, Special_Attack_AP, Special_Rules, Ammo_Type
```
**Citation state:** there are **no per-row citations.** The only provenance claim
is the **file-level header** (lines 14-16) asserting blanket fallout.wiki sourcing
— and that claim does not hold for this table (see §2). So every row is
effectively *uncited*, and the one citation that exists is *false*.
**Which fields are actually consumed / displayed (this drives scope):**
| Field | Consumer | Verify? |
|---|---|---|
| `Base_Damage` | `lookupWeaponStats()` → V.A.T.S. AP optimizer (`ui-core-cmd.js:491`), THREAT TTK + CONSULT display (`ui-render-databank.js:91,217`); raw table injected into AI directive (`api.js:389`) | **YES — correct** |
| `Crit_Damage` | `lookupWeaponStats()` → surfaced in CONSULT/DATABANK weapon readout; AI directive | **YES — correct** |
| `Crit_Multiplier` | same as Crit_Damage | **YES — correct** |
| `Attacks_Per_Second` | `lookupWeaponStats()` → V.A.T.S./THREAT time-to-kill math; AI directive | **YES — correct** |
| `Weight` | `lookupItemInDb()` → CARGO encumbrance totals, LOOT add, OCR apply, TRADE catalog; AI directive | **YES — correct** |
| `Value` | `lookupItemInDb()` + `getTradeCatalog()` → TRADE barter math, PERSONAL RECORD gear value; AI directive | **YES — correct** |
| `Req_Unarmed`, `Req_STR`, `Reach`, `Special_Attack_AP` | **PARKED** — parsed by `lookupWeaponStats()` but no live consumer (per file header lines 26-29) | **NO — leave byte-identical, out of scope** |
| `Special_Rules`, `Ammo_Type` | strings, spot-checked clean | **NO — leave as-is** (fix only obvious typos if any) |
**Scope decision:** the build unit corrects **only the 6 numeric fields that are
consumed or displayed** (`Base_Damage, Crit_Damage, Crit_Multiplier,
Attacks_Per_Second, Weight, Value`). The 4 PARKED columns are **not** in the wiki
master table and have no consumer — leaving them untouched keeps the diff
reviewable and honest (we don't stamp "verified" on numbers we didn't re-source).
A future unit can re-source them if a consumer is ever built.
---
## 2. Error characterization — SCATTERED, not a multiplier
I re-sampled a cross-section against the live wiki, tabulating current vs true per
field. The decoded master-table columns are:
**Dmg/Attack · Fire-Rate · Crit%Mult · Crit-Dmg · AP · Spread · Ammo · Capacity ·
Item-HP · Weight · Value · Skill.** (Decoded and confirmed field-by-field against
the labeled 10mm Pistol infobox.)
| Weapon | Field | Code | Wiki | Direction |
|---|---|---:|---:|---|
| 10mm Pistol | Base_Damage | 13 | **9** | too high |
| 10mm Pistol | Attacks/sec | 1.7 | **6** | **way too low** |
| 10mm Pistol | Weight | 2 | **3** | too low |
| 10mm Pistol | Value | 100 | **225** | **too low** |
| Sniper Rifle | Base_Damage | 55 | **40** | too high |
| Sniper Rifle | Crit_Mult | 2.0 | **5** | too low |
| Sniper Rifle | Value | 3500 | **300** | **way too high** |
| Combat Shotgun | Base_Damage | 60 | **55** | slightly high |
| Combat Shotgun | Value | 600 | **200** | too high |
| Assault Rifle | Base_Damage | 30 | **8** | **way too high** |
| Assault Rifle | Attacks/sec | 2.5 | **8** | too low |
| Alien Blaster | Crit_Mult | 2.0 | **100** | **way too low** |
| Alien Blaster | Value | 8000 | **500** | **way too high** |
| Lincoln's Repeater | Base_Damage | 50 | 50 | ✓ right |
| Lincoln's Repeater | Value | 4000 | **500** | **way too high** |
| Plasma Rifle | Base_Damage | 45 | 45 | ✓ right |
| Plasma Rifle | Value | 4000 | **1799** | too high |
| Minigun | Base_Damage | 10 | **5** | too high |
| Minigun | Attacks/sec | 8.0 | **20** | too low |
| Baseball Bat | Base_Damage | 15 | **9** | too high |
| Baseball Bat | Value | 100 | **55** | too high |
| Super Sledge | Base_Damage | 80 | **25** | **way too high** |
| Super Sledge | Value | 10000 | **180** | **way too high** |
| Power Fist | Base_Damage | 60 | **20** | **way too high** |
| Deathclaw Gauntlet | Base_Damage | 60 | **20** | **way too high** |
**Verdict — this is not one multiplier applied once:**
- **`Value`** is wrong in **both directions** (10mm 100→225 *up*; Sniper
3500→300 *down*). No single factor explains it.
- **`Attacks_Per_Second`** is the most consistently wrong field — the code's fire
rates bear almost no relationship to the real ones (10mm 1.7→6, Assault Rifle
2.5→8, Minigun 8→20). The code appears to have invented "attacks per second"
from a rough feel, not transcribed it.
- **`Crit_Multiplier`** is frequently wrong and the misses are large (Sniper ×2→×5,
Alien Blaster ×2→×100). The code seems to default many weapons to ×2.0.
- **`Base_Damage`** matches sometimes (Lincoln's 50, Plasma Rifle 45) and is wildly
off other times (Assault Rifle 30→8, Super Sledge 80→25). Melee/unarmed base
damage is systematically inflated 2-4×.
- **`Weight`** is usually close but often off by 1-2 lbs.
**Root cause (stated per Protocol 27):** the FO3 weapon table was **generated from
model estimates, not transcribed from fallout.wiki**, then stamped with a
file-header citation it never earned. Same defect class as the invented perks and
the Enclave hit squad — just numeric rather than a named entity. The fix is
**re-sourcing, not annotating** (a `src:` label on a wrong number is the worst
outcome — §4).
---
## 3. The authoritative corrected table
Every value below is read directly from the fallout.wiki
[Fallout 3 Weapons](https://fallout.wiki/wiki/Fallout_3_Weapons) master table
(one canonical source, so this is **direct verification of the whole table**, not
a sampled rule). Columns shown are the 6 consumed fields **in code order**:
`Base_Damage · Crit_Damage · Crit_Mult · Attacks/sec · Weight · Value`.
A code value in **parentheses** is the current (wrong) value; the bare number is
the corrected value. `✓` = already correct.
> **Note on `Crit_Damage`:** the file header calls Crit_Damage/Crit_Multiplier
> "PARKED (no crit calculator)", but `lookupWeaponStats()` parses them and the
> CONSULT/DATABANK weapon readout surfaces them, so they **are** displayed —
> correcting them matters. They are in scope.
### 3.1 Guns — Pistols
| Weapon | Base_Dmg | Crit_Dmg | Crit_Mult | Atk/sec | Weight | Value |
|---|--:|--:|--:|--:|--:|--:|
| 10mm Pistol | 9 (13) | 9 (13) | 1.0 ✓ | 6 (1.7) | 3 (2) | 225 (100) |
| .32 Pistol | 6 (18) | 6 (18) | 1.0 (1.5) | 3 (1.4) | 2 (3) | 110 (150) |
| Scoped .44 Magnum | 35 (50) | 35 (50) | 2.0 ✓ | 2.25 (0.9) | 4 ✓ | 300 (750) |
| Chinese Pistol | 4 ✓ | 4 ✓ | 1.0 ✓ | 6.0 ✓ | 2 ✓ | 190 ✓ |
| Silenced 10mm Pistol | 8 ✓ | 5 ✓ | 2.0 ✓ | 6.0 ✓ | 3 ✓ | 250 ✓ |
| Colonel Autumn's 10mm Pistol | 13 ✓ | 13 ✓ | 1.0 (2.0) | 6 (1.7) | 3 (2) | 325 (1500) |
| Blackhawk | 55 (60) | 45 (60) | 2.0 ✓ | 2.25 (0.9) | 4 ✓ | 500 (8000) |
| Wild Bill's Sidearm | 10 ✓ | 15 ✓ | 1.0 ✓ | 3.0 ✓ | 2 ✓ | 250 ✓ |
| Callahan's Magnum | 65 ✓ | 50 ✓ | 2.0 ✓ | 2.25 ✓ | 4 ✓ | 750 ✓ |
| Dart Gun | 6 (1) | 12 (1) | 2.5 (1.0) | 6 (1.5) | 3 ✓ | 500 (250) |
### 3.2 Guns — Rifles
| Weapon | Base_Dmg | Crit_Dmg | Crit_Mult | Atk/sec | Weight | Value |
|---|--:|--:|--:|--:|--:|--:|
| Hunting Rifle | 25 (40) | 25 (40) | 1.0 (2.0) | 0.75 (1.0) | 6 (7) | 150 (500) |
| Assault Rifle | 8 (30) | 8 (30) | 1.0 ✓ | 8 (2.5) | 7 ✓ | 300 (400) |
| Sniper Rifle | 40 (55) | 40 (55) | 5.0 (2.0) | 1.0714 (0.9) | 10 ✓ | 300 (3500) |
| Chinese Assault Rifle | 11 (30) | 10 (30) | 1.0 ✓ | 8 (2.5) | 7 ✓ | 500 (450) |
| Lincoln's Repeater | 50 ✓ | 50 ✓ | 2.0 ✓ | 0.75 (0.9) | 5 (4) | 500 (4000) |
| Xuanlong Assault Rifle | 12 (30) | 12 (30) | 1.0 ✓ | 8 (3.5) | 7 ✓ | 400 (5000) |
| Victory Rifle | 40 (55) | 40 (55) | 3.0 (2.5) | 1.0714 (0.9) | 10 ✓ | 450 (5000) |
| Reservist's Rifle | 40 ✓ | 40 ✓ | 5.0 ✓ | 1.6071 (1.607) | 10 ✓ | 500 ✓ |
| Ol' Painless | 30 ✓ | 30 ✓ | 1.0 ✓ | 1.125 ✓ | 6 ✓ | 250 ✓ |
| BB Gun | 4 ✓ | 4 ✓ | 1.0 ✓ | 0.75 ✓ | 2 ✓ | 36 ✓ |
| Lever-Action Rifle | 40 ✓ | 40 ✓ | 5.0 ✓ | 0.75 ✓ | 8 ✓ | 200 ✓ |
| Backwater Rifle | 45 ✓ | 45 ✓ | 5.0 ✓ | 0.75 ✓ | 7 ✓ | 250 ✓ |
| Infiltrator | 7 ✓ | 10 ✓ | 1.0 ✓ | 8.0 ✓ | 7 ✓ | 400 ✓ |
| Perforator | 10 ✓ | 14 ✓ | 2.0 ✓ | 6.0 ✓ | 7 ✓ | 600 ✓ |
| Railway Rifle | 30 (20) | 30 (40) | 3.0 (2.0) | 2 (1.5) | 9 (15) | 200 (500) |
### 3.3 Guns — SMGs & Shotguns
| Weapon | Base_Dmg | Crit_Dmg | Crit_Mult | Atk/sec | Weight | Value |
|---|--:|--:|--:|--:|--:|--:|
| 10mm Submachine Gun | 7 (15) | 7 (15) | 1.0 ✓ | 10 (4.5) | 5 ✓ | 330 (250) |
| Sydney's 10mm Ultra SMG | 9 (20) | 9 (20) | 1.0 ✓ | 10 (5.0) | 5 ✓ | 430 (3500) |
| Combat Shotgun | 55 (60) | 27 (60) | 1.0 ✓ | 1.5 (1.0) | 7 (8) | 200 (600) |
| The Terrible Shotgun | 80 ✓ | 40 (80) | 1.0 ✓ | 1.5 (1.0) | 10 (8) | 250 (7000) |
| Double-Barrel Shotgun | 85 ✓ | 30 (30) | 1.0 ✓ | 2.25 ✓ | 6 ✓ | 175 ✓ |
| Sawed-Off Shotgun | 50 ✓ | 0 ✓ | 0.0 ✓ | 2.25 ✓ | 6 ✓ | 190 ✓ |
### 3.4 Energy weapons
| Weapon | Base_Dmg | Crit_Dmg | Crit_Mult | Atk/sec | Weight | Value |
|---|--:|--:|--:|--:|--:|--:|
| Laser Pistol | 12 ✓ | 12 (24) | 1.5 (2.0) | 6 (1.5) | 3 (2) | 320 (400) |
| Laser Rifle | 23 (22) | 22 (44) | 1.5 (2.0) | 2.0455 (1.5) | 8 (3) | 1000 (3500) |
| Plasma Pistol | 25 ✓ | 25 (50) | 2.0 ✓ | 3 (1.3) | 3 ✓ | 360 (1400) |
| Plasma Rifle | 45 ✓ | 44 (90) | 2.0 ✓ | 2 (1.5) | 8 (7) | 1799 (4000) |
| A3-21 Plasma Rifle | 50 (55) | 50 (110) | 2.5 (2.0) | 2 (1.5) | 8 (7) | 2200 (6500) |
| Gatling Laser | 8 ✓ | 6 (16) | 1.0 (1.5) | 20 (8.0) | 18 ✓ | 2000 (22500) |
| Mesmetron | 1 (0) | 0 ✓ | 1.0 ✓ | 1.0345 (1.0) | 2 ✓ | 500 (200) |
| Alien Blaster | 100 ✓ | 100 (200) | 100 (2.0) | 3 (1.5) | 2 (0.5) | 500 (8000) |
| Firelance | 80 (90) | 80 (180) | 100 (2.0) | 3 (1.5) | 2 ✓ | 750 (10000) |
| Smuggler's End | 18 ✓ | 18 ✓ | 1.5 ✓ | 6.0 ✓ | 2 ✓ | 450 ✓ |
| Metal Blaster | 55 ✓ | 27 ✓ | 1.5 ✓ | 2.0455 (2.046) | 8 ✓ | 1000 ✓ |
| Tri-beam Laser Rifle | 75 ✓ | 15 ✓ | 1.5 ✓ | 2.7273 (2.727) | 9 ✓ | 1000 ✓ |
| Wazer Wifle | 29 ✓ | 28 ✓ | 1.5 ✓ | 2.0455 (2.046) | 8 ✓ | 900 ✓ |
| Microwave Emitter | 60 ✓ | 100 ✓ | 2.0 ✓ | 1.0345 (1.035) | 8 ✓ | 500 ✓ |
| Gauss Rifle | 100 ✓ | 50 ✓ | 5.0 ✓ | 1.0714 (1.071) | 12 ✓ | 500 ✓ |
| Destabilizer | 30 ✓ | 20 ✓ | 2.0 ✓ | 4.5 ✓ | 7 ✓ | 1199 ✓ |
| Alien Atomizer | 35 ✓ | 40 ✓ | 1.0 ✓ | 3.0 ✓ | 2 ✓ | 500 ✓ |
| Alien Disintegrator | 65 ✓ | 50 ✓ | 2.0 ✓ | 2.0 ✓ | 7 ✓ | 300 ✓ |
| Atomic Pulverizer | 37 ✓ | 40 ✓ | 2.0 ✓ | 3.0 ✓ | 2 ✓ | 500 ✓ |
| Captain's Sidearm | 35 ✓ | 40 ✓ | 1.0 ✓ | 3.0 ✓ | 2 ✓ | 500 ✓ |
| Drone Cannon | 40 ✓ | 50 ✓ | 1.0 ✓ | 3.3333 (3.333) | 18 ✓ | 1999 ✓ |
| Drone Cannon Ex-B | 40 ✓ | 50 ✓ | 1.0 ✓ | 3.3333 (3.333) | 18 ✓ | 1999 ✓ |
| Vengeance | 11 ✓ | 12 ✓ | 1.0 ✓ | 20.0 ✓ | 18 ✓ | 2400 ✓ |
| Precision Gatling Laser | 8 ✓ | 6 ✓ | 4.0 ✓ | 20.0 ✓ | 18 ✓ | 3000 ✓ |
| Electro-Suppressor | 25 ✓ | 4 ✓ | 1.0 ✓ | 2.3077 (2.308) | 2 ✓ | 70 ✓ |
### 3.5 Big Guns / Heavy (non-explosive)
| Weapon | Base_Dmg | Crit_Dmg | Crit_Mult | Atk/sec | Weight | Value |
|---|--:|--:|--:|--:|--:|--:|
| Minigun | 5 (10) | 0 (10) | 0.0 (1.0) | 20 (8.0) | 18 (28) | 1000 (22500) |
| Flamer | 16 (10) | 1 (10) | 4.0 (1.0) | 8 (4.0) | 15 (10) | 500 (1500) |
| Heavy Incinerator | 35 (12) | 5 (12) | 4.0 (1.0) | 4 (3.5) | 15 (12) | 500 (5000) |
| Burnmaster | 24 ✓ | 1 ✓ | 4.0 ✓ | 8 (8.0) | 15 ✓ | 500 ✓ |
| Eugene | 7 ✓ | 0 ✓ | 0.0 ✓ | 20.0 ✓ | 18 ✓ | 1500 ✓ |
### 3.6 Explosives — SPECIAL CASE (damage = impact + blast)
The wiki master table lists thrown/placed explosives at **Base_Damage = 1** (the
impact) and shows the real blast as a separate `+N` on each weapon's own page
(verified on Frag Grenade: "1 (6.1) **+ 100** (170)"). The code currently stores a
single "effective" number that is **also wrong** (Frag 50 vs real blast 100).
**Recommendation:** for explosives, set `Base_Damage` = the **blast** value from
each weapon's own page (the meaningful damage the THREAT/TTK tools should use),
and take `Weight`/`Value` from the master table below. **Blast values must be
pulled per-page in the build stage** — I verified Frag Grenade directly; the rest
are marked *verify-in-build* to avoid guessing.
| Weapon | Base_Dmg (blast) | Crit_Mult | Weight | Value |
|---|--:|--:|--:|--:|
| Frag Grenade | **100** (code 50) — *verified* | 0 (code 1.0) | 0.5 (code 1) | 25 (code 100) |
| Plasma Grenade | *verify-in-build* (code 80) | 0 (code 1.0) | 0.5 (code 1) | 50 (code 200) |
| Pulse Grenade | *verify-in-build* (code 60) | 0 (code 1.0) | 0.5 (code 1) | 40 (code 75) |
| Nuka Grenade | *verify-in-build* (code 500) | 0 (code 1.0) | 0.5 (code 1) | 50 (code 200) |
| Frag Mine | *verify-in-build* (code 100) | 0 (code 1.0) | 0.5 (code 0.5) | 25 (code 250) |
| Bottlecap Mine | *verify-in-build* (code 200) | 0 (code 1.0) | 0.5 (code 0) | 75 ✓ |
| Cryo Grenade | 1 ✓ | 0 (code 1.0) | 0.5 ✓ | 50 ✓ |
| Cryo Mine | 1 ✓ | 0 (code 1.0) | 0.5 ✓ | 25 ✓ |
| Fat Man | *verify-in-build* (code 600) | 0 ✓ | 30 ✓ | 1000 (code 8500) |
| Missile Launcher | *verify-in-build* (code 100) | 0 (code 1.0) | 20 (code 15) | 500 (code 4500) |
| Miss Launcher | *verify-in-build* (code 20) | 0 ✓ | 15 ✓ | 400 ✓ |
| Experimental MIRV | *verify-in-build* (code 80) | 0 ✓ | 30 ✓ | 2498 ✓ |
| Rock-It Launcher | 50 (code 25) | 1 ✓ | 8 (code 10) | 200 (code 250) |
> Note: `Tin Grenade` (code line 109) is **not a canonical FO3 weapon** — it is
> the invented output of the equally-invented "Abraxo Cleaner Bomb" recipe in
> `[RECIPES.CSV]`. Flagged in §3.8, not corrected here.
### 3.7 Melee & Unarmed
Base damage here is systematically inflated in the code (often 2-4×); the wiki
values below are the master-table `Dmg/Attack`.
| Weapon | Base_Dmg | Crit_Dmg | Crit_Mult | Atk/sec | Weight | Value |
|---|--:|--:|--:|--:|--:|--:|
| Baseball Bat | 9 (15) | 9 (15) | 1.0 ✓ | 1.4286 (1.8) | 3 ✓ | 55 (100) |
| Sledgehammer | 20 (30) | 10 (30) | 1.0 ✓ | 1.4286 (0.9) | 12 (10) | 130 (100) |
| Super Sledge | 25 (80) | 25 (80) | 1.0 (1.5) | 1.4286 (0.9) | 20 (15) | 180 (10000) |
| Combat Knife | 7 (20) | 13 (20) | 3.0 (2.0) | 3 (2.5) | 1 ✓ | 50 (75) |
| Switchblade | 5 (9) | 9 ✓ | 2.0 (1.5) | 3 (2.5) | 1 (0.5) | 35 (25) |
| Shishkebab | 35 (50) | 24 (50) | 2.0 (1.5) | 2.3077 (1.3) | 3 (4) | 200 (2000) |
| Chinese Officer's Sword | 10 (20) | 15 (20) | 2.0 ✓ | 2.3077 (2.0) | 3 (4) | 75 (300) |
| Ripper | 30 (20) | 0 (20) | 0.0 (2.0) | 1 (2.5) | 6 (3) | 100 (600) |
| Lead Pipe | 9 (22) | 18 (22) | 1.0 ✓ | 2.3077 (1.5) | 3 (8) | 75 (50) |
| Pool Cue | 3 (12) | 0 (12) | 0.0 (1.0) | 1.4286 (2.5) | 1 (2) | 15 ✓ |
| Rolling Pin | 3 (6) | 8 (6) | 0.0 (1.0) | 1.7308 (2.5) | 1 ✓ | 10 (15) |
| Nail Board | 8 (20) | 0 (20) | 0.0 (1.0) | 1.4286 (2.0) | 4 (5) | 30 (50) |
| Board of Education | 12 (25) | 12 (25) | 1.0 ✓ | 1.4286 (1.8) | 4 (6) | 60 (1500) |
| Tire Iron | 6 (12) | 6 (12) | 1.0 ✓ | 2.3077 (1.8) | 3 ✓ | 40 (15) |
| The Break | 6 ✓ | 6 ✓ | 1.0 ✓ | 1.4286 (1.429) | 1 ✓ | 50 ✓ |
| The Tenderizer | 30 ✓ | 15 ✓ | 1.0 ✓ | 1.4286 (1.429) | 12 ✓ | 230 ✓ |
| Ant's Sting | 4 ✓ | 4 ✓ | 1.0 ✓ | 3.0 ✓ | 1 ✓ | 30 ✓ |
| Butch's Toothpick | 10 ✓ | 13 ✓ | 2.5 ✓ | 3.0 ✓ | 1 ✓ | 50 ✓ |
| Occam's Razor | 10 ✓ | 13 ✓ | 3.0 ✓ | 3.0 ✓ | 1 ✓ | 65 ✓ |
| Trench Knife | 7 ✓ | 13 ✓ | 3.0 ✓ | 3.0 ✓ | 1 ✓ | 50 ✓ |
| Vampire's Edge | 15 ✓ | 20 ✓ | 3.0 ✓ | 2.3077 (2.308) | 1 ✓ | 100 ✓ |
| Stabhappy | 10 (30) | 15 (30) | 4.0 (2.0) | 3 (2.5) | 1 ✓ | 65 (3500) |
| Ritual Knife | 6 ✓ | 18 ✓ | 3.0 ✓ | 3.0 ✓ | 1 ✓ | 20 ✓ |
| Axe | 20 ✓ | 30 ✓ | 2.0 ✓ | 1.4286 (1.429) | 6 ✓ | 60 ✓ |
| Auto Axe | 35 ✓ | 0 ✓ | 0.0 ✓ | 1.0 ✓ | 20 ✓ | 200 ✓ |
| Man Opener | 35 ✓ | 0 ✓ | 0.0 ✓ | 1.0 ✓ | 20 ✓ | 200 ✓ |
| Steel Saw | 16 ✓ | 0 ✓ | 0.0 ✓ | 1.0 ✓ | 20 ✓ | 200 ✓ |
| The Mauler | 45 (80) | 0 (80) | 0.0 (1.0) | 1 (1.1) | 20 (5) | 200 (4000) |
| Jack | 30 ✓ | 15 ✓ | 1.0 ✓ | 1.0 ✓ | 6 ✓ | 200 ✓ |
| Jingwei's Shocksword | 35 (20) | 25 (40) | 2.0 ✓ | 2.3077 (2.0) | 3 (4) | 500 (3000) |
| The Dismemberer | 25 ✓ | 40 ✓ | 2.0 ✓ | 1.4286 (1.429) | 6 ✓ | 55 ✓ |
| Highwayman's Friend | 10 ✓ | 10 (10) | 1.0 ✓ | 2.3077 (2.308) | 5 ✓ | 75 ✓ |
| Fertilizer Shovel | 15 ✓ | 30 ✓ | 3.0 ✓ | 1.4286 (1.429) | 3 ✓ | 55 ✓ |
| Brass Knuckles | 6 (8) | 6 (8) | 1.0 ✓ | 1.5789 (2.7) | 1 ✓ | 20 (25) |
| Power Fist | 20 (60) | 20 (60) | 1.0 ✓ | 1.0909 (1.1) | 6 (5) | 100 (2500) |
| Fisto! | 25 ✓ | 25 ✓ | 1.5 (1.5) | 1.0909 (1.091) | 6 ✓ | 100 ✓ |
| Deathclaw Gauntlet | 20 (60) | 30 (60) | 5.0 (1.0) | 1.6304 (1.1) | 10 (1) | 150 (5000) |
### 3.8 NOT Fallout 3 weapons — flag for owner decision (do NOT "correct")
These rows are not in the canonical FO3 weapon list at all. Same class as the
fabricated perks / Enclave hit squad — a re-source cannot fix them because there
is nothing to source. **Owner decides delete vs keep.**
| Row (code line) | Verdict | Evidence |
|---|---|---|
| `Bumper Sword` (91) | **Cross-game — Fallout: New Vegas.** No FO3 entry. | Not in FO3 master table; canonical NV melee weapon |
| `Golf Club` (95) | **Not in FO3.** Likely NV leak. | Absent from the full FO3 weapon list |
| `Plunger` (98) | **Likely invented.** | No such FO3 weapon; not on the wiki |
| `Tin Grenade` (109) | **Invented** (output of the invented "Abraxo Cleaner Bomb" recipe). | No canonical FO3 "Tin Grenade" weapon |
> Recommend **delete all four** for parity with the perk-invention fix (highest
> trust), but this is an owner call — flagged, not auto-removed.
### 3.9 Verification tally
- **Directly verified against fallout.wiki:** ~96 conventional weapons (all guns,
energy, melee, unarmed, non-explosive heavy) — read from the single canonical
master table, not sampled.
- **Rule/verify-in-build:** ~11 explosives (blast damage must be pulled per-page;
weight/value already verified from the master table). Frag Grenade blast (100)
verified directly as the pattern proof.
- **Flagged non-canonical (owner decision):** 4 (§3.8).
- **Genuinely UNVERIFIED / guessed:** **0** — nothing was left as a guess.
---
## 4. Correction + guard plan (build stage)
### 4.1 The edit
- **File:** `js/data/db_fo3.js`, `[WEAPONS.CSV]` block only (lines 46-161).
- **Fields changed:** the 6 consumed/displayed numerics only
(`Base_Damage, Crit_Damage, Crit_Multiplier, Attacks_Per_Second, Weight,
Value`). Keep `Req_Unarmed, Req_STR, Reach, Special_Attack_AP, Special_Rules,
Ammo_Type` **byte-identical** (PARKED / out of scope — do not stamp unverified
columns as fixed).
- **Explosives:** pull each blast value from its own wiki page during the build
(§3.6), don't guess.
- **Non-FO3 rows (§3.8):** remove after owner confirmation (default: delete all 4).
- **UTF-8 (Protocol 39):** edit via the Edit tool or Node `fs.writeFileSync(…,
'utf8')` — **never** PowerShell. (This file has no non-ASCII in the weapon block,
but the rule stands.)
### 4.2 Fix the false citation (correct-then-cite)
Replace the blanket, unearned Protocol-3 header claim (lines 14-16) with an
**honest, dated provenance note** that names what was actually verified and when:
```
// PROTOCOL 3: WEAPONS.CSV combat + economy fields (Base_Damage, Crit_Damage,
// Crit_Multiplier, Attacks_Per_Second, Weight, Value) re-verified row-by-row
// against the fallout.wiki "Fallout 3 Weapons" master table on 2026-07-15
// (see planning/FO3_WEAPON_DATA.md). PARKED columns (Req_*/Reach/Special_Attack_AP)
// were NOT re-sourced. This file is a typist for that data, never an authority.
```
Match whatever inline-citation pattern the karma/perk fixes established
(`src:`-style) if the owner wants per-row provenance — but see §4.3 on why a
citation guard is necessary-but-not-sufficient here.
### 4.3 The guard (Protocol 13 + Protocol 20 + Protocol 36b)
Two layers, because a citation guard alone cannot catch a wrong number:
**(a) Golden-master pin — the real guard (primary).** Add a Node-runner suite
(mirror of the Suite 131 directive golden-master) that pins each FO3 weapon's 6
consumed fields to the corrected values in this doc. Any future drift — a
re-inflated value, a fat-fingered fire-rate — fails the gate. This is the
regression test Protocol 13 requires, and it is the only guard that proves the
**number** is right, not merely that a citation exists. It doubles as the
"would-have-caught-it" guard: the current 3500 Sniper value fails it instantly.
**(b) Plausibility/range guard — cheap breadth (secondary).** A static suite that
fails if any FO3 weapon stat leaves a sane band:
`Base_Damage 0-250 · Crit_Multiplier 0-100 (Alien Blaster is ×100 — do not set
the cap lower) · Attacks_Per_Second 0-25 · Weight 0-35 · Value 0-3000` (Fat Man
value 8500 in the current code trips this immediately; post-correction the max is
2498). This catches a whole *class* of "10× inflation" even for a future new
weapon the golden-master doesn't yet pin.
**Honest limit (state it in the commit — the reframing-review lesson):** a
citation guard checks that a `src:`/provenance note *exists*; it does **not** prove
the value is correct. That is exactly how the current false header shipped. So the
load-bearing guard is the golden-master pin (a), not the citation. The citation is
for humans; the pin is for the machine.
### 4.4 Protocol 38 — keep the guards game-agnostic
The range guard and golden-master must read the **active game's** table
(`GAME_DEFS`/`databaseCSVs`), not hardcode `FO3`. NV has the identical schema; the
range guard should apply to **both** games' weapon tables (NV was not audited here
but the same plausibility band is valid). The golden-master pin is FO3-specific
data but keyed off the game context, not a literal branch.
---
## 5. Scope + risk notes
**What feeds off this table (blast radius of the fix):**
- `lookupItemInDb()` (Weight/Value) → CARGO MANIFEST encumbrance totals, LOOT
add-to-inventory, OCR apply, and `getTradeCatalog()` → the native TRADE barter
terminal's caps math and PERSONAL RECORD equipped-gear value. **Wrong values
today mean wrong barter prices and wrong carry-weight.** Correcting them changes
displayed numbers users act on — desirable, but verify TRADE/CARGO still render
after the edit.
- `lookupWeaponStats()` (Base_Damage/Crit_Damage/Crit_Multiplier/Attacks_Per_Second)
→ the V.A.T.S. AP-strike optimizer (`ui-core-cmd.js:491`), THREAT time-to-kill
(`ui-render-databank.js:91`), and the CONSULT/DATABANK weapon readout
(`ui-render-databank.js:217`) which **displays these numbers to the user**.
- **The raw table is injected into the AI system directive** (`api.js:389`,
`databaseCSVs` in `systemInstruction`). The AI *reads every weapon number*, so
wrong stats mislead AI narration and in-fiction advice. This is the widest
surface and the strongest reason to fix it.
**Guardrails:**
- **NV untouched (Protocol 38).** This unit edits **only** `js/data/db_fo3.js`.
`db_nv.js` is a separate file with its own table; no shared literal is touched.
(The *guards* in §4.3 should cover both games, but no NV **data** changes.)
- **APP_VERSION stays 2.8.0.** This is an FO3 data correction under `[Unreleased]`
on `dev`, same as the karma/perk fixes — not a feature. No MINOR bump.
- **CACHE_NAME must bump** in the build stage (Protocol 1) — `db_fo3.js` is under
`js/`, a served/precached file. Bump `-rN` in `sw.js`.
- **Protocol 2/2a docs:** CHANGELOG `[Unreleased]` Fixed entry (plain English:
"Corrected Fallout 3 weapon damage, crit, fire-rate, weight and value stats to
match the official wiki; removed weapons that aren't in Fallout 3"); test-count
sync everywhere if the guard suites add tests.
- **Protocol 13:** the golden-master pin IS the regression test — ships in the
same commit as the data fix.
- **Verification (Protocol 10/26):** after the edit, render CONSULT/THREAT/TRADE
for a couple of corrected weapons (e.g. Sniper Rifle, 10mm Pistol) and confirm
the new numbers display and the barter math is sane. Data-only change, but the
display surfaces should be spot-checked.
**Out of scope (explicitly):** the PARKED columns (`Req_*`, `Reach`,
`Special_Attack_AP`), the `[ARMOR.CSV]`/`[BESTIARY.CSV]`/`[AMMO.CSV]`/`[CHEMS.CSV]`
tables (the provenance sweep flagged only weapons; armor/bestiary are a separate
future unit), and the invented `[RECIPES.CSV]` "Abraxo Cleaner Bomb" entry (owner
call, tracked with the §3.8 `Tin Grenade` flag).
---
## Report summary (for the owner)
**Diagnosis:** the FO3 weapon table is **scattered-wrong, not inflated by a fixed
multiplier.** The "~10×" from the first sweep was a small-sample fluke — in truth
the errors are independent per field and per weapon, in **both** directions
(Sniper Rifle value 3500 → should be **300**; but 10mm Pistol value 100 → should
be **225**, and its fire-rate 1.7 → should be **6**). The single most-wrong field
is **fire-rate (`Attacks_Per_Second`)**, then **value**, then **crit multiplier**;
base damage and weight are wrong less often. Melee/unarmed base damage is
consistently inflated 2-4×. The file's header citation to fallout.wiki is **false**
for this table — the numbers were never transcribed from the wiki. Same trust
failure as the invented perks, just numeric.
**Coverage:** **~96 weapons verified directly** against the one canonical
fallout.wiki master table (whole-table, not sampled); **~11 explosives** need their
blast number pulled per-page in the build (weight/value already verified; Frag
Grenade's blast of 100 verified as the pattern); **4 rows are not FO3 weapons**
(`Bumper Sword`, `Golf Club`, `Plunger`, `Tin Grenade` — owner decides delete);
**0 left as guesses.**
**Recommended build approach:** apply the §3 corrected values to the 6 consumed
fields only, leave PARKED columns byte-identical, delete the 4 non-FO3 rows, and
replace the false header with the dated honest provenance note (§4.2). **Guard:**
a golden-master suite that pins every FO3 weapon's corrected stats (the real
regression guard — proves the numbers, not just that a citation exists) **plus** a
plausibility range guard that fails on any wildly out-of-band stat (the "10×"
class), both game-agnostic so NV is covered too. Bump the cache, keep 2.8.0, NV
data untouched.
STAMP · generated for RELEASE v2.8.5 commit 06e5180 (06e51801b38a) · archive input-tree hash c07fbfbdd2e1ddeb · 754 files · no wall-clock timestamp (regenerates identically when nothing changed).