Three guns, and a bug from frame one
Earfh's weapon system shipped with a pistol, a shotgun and a ricochet that differ in behavior rather than numbers. One bug in it had the shotgun aimed 70 degrees off from the first frame of every run.
Written up later from the repo's history and dated to the days it describes.
The weapon system for Earfh was specified, built and mostly debugged on September 20, and merged the next day. It has three weapons. The generated beta it grew out of had listed six weapon types.
Behavior, not statistics
The spec's first argument was about what a weapon is for. The powerups already own the statistical axis. Between them they move speed, damage, fire rate and multishot. The old weapon table moved damage, fire rate, projectile count and spread, which are the same four dials. Six weapons told apart only by those numbers would compete with the powerups and read as noise.
So each weapon had to change the rules of a projectile. The pistol fires one straight shot. The shotgun fires five in a cone, and it cost almost nothing, because the multishot code for the Synergy Stack powerup already fanned projectiles out. The ricochet is the one new mechanic. It bounces off walls, and it exists to prove the design carries behavior as well as numbers. A beam, a lobber and a drone were pushed to later, to be built against an architecture that had been tested first.
The weapon is chosen before a run and kept for all of it, with no pickups and no swap key. The spec draws two binding rules from that. The three have to be roughly equal in power, because an unlock that is strictly better makes the others dead content. And the weapon has to read on screen for the whole run, so a visible gun sprite was in scope from the start.
The ricochet needed a contact normal to bounce against, and the collision area only reports which body it touched. Rather than rewrite the collision path all three weapons share, the ricochet alone carries a raycast to read the normal.
Four bugs in a day
The shotgun's spread was meant to be the total width of its cone, 25 degrees. The code read it as the gap between neighboring pellets, so five pellets made a 100 degree cone and seven, with Synergy Stack, a 150 degree fan. After the fix, extra pellets make the cone denser instead of wider.
Synergy Stack had the opposite problem on the other two guns. Their spread is zero, so every extra projectile launched on the same vector. That meant one visible bullet, and a miss missed all of them. The bullets themselves were 120 by 55 pixels, longer than the player is tall, and became an 11 by 6 tracer.
The fourth bug took two commits to fix. The shotgun's art has its barrel drawn at an angle, and a rotation of minus 35 degrees cancels it. When the gun points left, the sprite flips vertically, and that flip mirrored the correction too, so the error doubled to about 70 degrees. The first fix negated the correction whenever the sprite flipped.
Under half an hour later, a deeper fault turned up. The flip was decided by comparing the aim angle against half of pi. Vector2.angle() returns a single precision value, and straight down measured 1.57079637050628660 against a constant of 1.57079632679489660. So straight down counted as past vertical and flipped. So did straight up. Five of the eight aim directions flipped where only the three facing left should have.
The player's starting direction is straight down. With the shotgun equipped, the gun sat 70 degrees off aim from the first frame of every run, before the player touched anything.

The test suite had met this boundary before. A test for the weapon's orbit had steered around it, with a comment explaining that float precision made it flaky there. The fix decides the flip from the aim's horizontal component, which is what flipping means. Straight up and straight down have none and never flip. The comment is gone, replaced by two tests that pin the flip for all eight directions.
Every number here was a first guess, and the spec put them in resource files so they could move after play. How the guns came to be bought with Stock is in A shift, a shop, and Stock.