Tom Horn Gaming Β· Internal

Crash Game β€” C-Level Status Report

Evidence-based project review: what was built, what works, what's broken, and a realistic path to production. Compiled from live GitLab data, staging inspection, and full project history β€” not self-reported status.

πŸ“… Compiled 2026-09-18 πŸ” Research: Opus 5 🎨 Design: Fable 5.1 πŸ”’ Cloudflare Zero Trust
Bottom line

Engineering substance is genuinely strong β€” every architectural finding from the original audit is closed with live, verifiable code. The failures are in the connective tissue: an app went silently undeployed for six months, the project's own tracker has claimed "done" since April, and yesterday's celebrated fixes are sitting on an untracked branch one deletion away from regressing.

1What Was Built

A THG InAPI-compatible multiplayer crash betting game. Players bet on a climbing multiplier and cash out before it crashes, with shared real-time rounds and provably-fair verification.

32
Tags shipped
33
MRs merged
129
Commits ahead of main
90,252
Audit chain entries, verified
LayerTechnology
BackendFastify 5.x (TypeScript), Node 22
ORM / DBDrizzle ORM 0.45 β†’ PostgreSQL
Cache / PubSubRedis 5.x
FrontendReact + Vite + Zustand
AdminSeparate React/Vite SPA, served at /admin/
Money mathdecimal.js β€” no float errors
Auth@fastify/jwt + httpOnly cookies
ObservabilityPrometheus + Grafana + node-exporter (Tailscale-only)
Framing correction

This project did not start at v3.0.0. Versions v1.0–v2.0 shipped Feb–Apr 2026, before this engagement began. The v3.x line (32 tags, current work) is the second phase of a pre-existing product β€” presenting v3.0.0 as "day one" would overstate what was built from scratch here.

Feature chronology β€” v3.x line

2026-05-06 β€” v3.0.0
First release under this engagement. CI/CD + full deploy established on th-nexus.
2026-06-05 β€” v3.2.1
DB unique constraint + cookie security hardening (P0-3, P0-5).
~2026-06-10 β€” v3.2.7
Multiplier display freeze bug fixed β€” the number now snaps to the real crash value.
2026-07-13 β€” v3.2.8
P0 hardening set complete.
2026-07-15 β†’ 08-06 β€” v3.3–v3.7.1
P1 scale batch: table partitioning, bigint IDs, Redis-backed rate limiting.
2026-09-02 β€” v3.10.0
P2 certification-readiness merge β€” provably-fair rotation, audit chain, observability.
2026-09-15 β€” v3.14.0
Latest tagged release β€” BetPanel UX refinements.
2026-09-16 β†’ 18
Test-player bot pool built; three real bugs found and fixed on staging.

2How It Was Built

Verified live from GitLab contributor and member records.

PersonRoleEvidence
TicoBuilder / orchestrator agent36 + 6 commits (two identities)
Ondrej LapidesOwner17 commits, Access 50
Ondrej Gregor (gregor2, "ondrog")Operational stakeholder β€” merges, directionMerged MR !33, !34; Access 40 (Maintainer)
Vera (agent)Repo Maintainer accessNo commits, no memory evidence of involvement
Vicky / Vikaβ€”Zero evidence of any crash-game involvement found

Working pattern

GSD-style planning β€” structured .planning/ docs per phase (predates this engagement).

Claude Code as the dev harness, with subagent delegation for focused tasks.

GitLab REST API as the default commit path β€” the local sandbox git remote broke repeatedly (3+ times), so direct API commits are now standard practice, not a fallback.

Deploy-verify loop β€” commit β†’ poll pipeline β†’ trigger manual deploy job β†’ poll + read the deploy script's own health-check trace. Used successfully 7 times across Sept 17–18.

3What Went Well

Evidence-backed wins only β€” independently re-verified, not self-reported.

Root-cause discipline over symptom-patching

A performance bug (bet-placement latency 1.3s idle β†’ 13.3s at 500 concurrent users) was root-caused to synchronous per-bet broadcasting, not guessed at. Fixed via per-tick batching: 13.3s β†’ 1.6s, an 8.1Γ— improvement, re-confirmed on the next release.

A money-safety bug caught before it mattered

Database partitioning had silently disabled a unique constraint, reopening a duplicate-bet race condition. Fixed with advisory locks and proven via real concurrent-request tests β€” not mocked assertions.

CI hardening closed a real incident class

End-to-end tests only ran on tagged builds β€” exactly how a breaking bug once reached the main branch undetected. Now: full build + tests on every push, with branch protection requiring a green pipeline before merge.

Audit chain verified working at scale, live, right now

Health check pulled today: 90,252 entries, verified: true. This is a certification-relevant control functioning in production-like conditions, not a design doc.

Honest failure reporting under pressure

Multiple recorded instances of surfacing bad news (a process not running, a caveat volunteered unprompted, infra failures reported rather than silently retried) instead of reporting plausible-sounding success.

4What Went Badly

Named plainly β€” the point of this report is to be useful, not flattering.

The admin app went silently undeployed for ~6 months

The deploy script had no step at all for the admin application. It was separated out in March; the gap wasn't caught until September β€” and only because a new UI element failed to appear. Nothing ever compared what was deployed to what was actually built.

The original security audit was never formally closed

5 Critical / 11 High / 7 Medium findings were delivered once, in chat. No document anywhere records a formal re-audit. Most items were genuinely fixed β€” but nobody ever re-ran the audit and declared it closed, and 7 of the 11 High findings are now unrecoverable from any available source.

A credibility failure at project start

Multiple "deployed, try it now" claims were made while the old UI was still live β€” the root cause was checking server files instead of what the browser actually rendered. This drove a lasting "verify before reporting" discipline, but it cost trust early.

Recurring tooling breakage, never root-caused

The local git sandbox has broken 3+ times. The workaround (GitLab's API directly) is now standard practice β€” pragmatic, but an unexplained defect has effectively been normalized rather than fixed.

A UX iteration loop that cost more than it should have

Four separate rounds of UI polish, each requiring a manual one-off deploy because automatic preview deploys for untagged work were never built, despite being requested.

The dependency security scan can't actually stop anything

It's currently failing in the pipeline β€” but marked non-blocking, so the overall pipeline still reports green. The one automated control meant to catch security regressions cannot block a merge.

5Current State as of 2026-09-18, ~09:50 UTC

πŸ”΄ Most urgent finding

Seven commits β€” including all three fixes celebrated yesterday β€” are sitting on an untracked feature branch with no merge request. This includes the fix for the six-month admin-deploy gap. They are live on staging, but not in the main development branch. If that branch is deleted, or staging is ever redeployed cleanly, the admin deploy gap silently returns.

ClaimVerificationResult
Admin app now actually deploysLive bundle inspected directlyβœ“ Confirmed
"Test Players" feature visibleString search in live bundleβœ“ Confirmed
Version label added to admin UIConfirmed in live bundleβœ“ Confirmed
Start-button error fixed (code)Live fetch code inspected directlyβœ“ Confirmed
Start-button fix confirmed by stakeholderAwaiting browser re-check⏳ Outstanding
Backend healthLive health endpointβœ“ Healthy

Also found β€” work that happened today, undocumented anywhere until now

Four more commits and three successful deploys occurred this morning (07:09–07:31 UTC) β€” none of it recorded in any status file before this report. Root cause: the new test-bot pool was tripping the game's own rate limiter, now fixed with proper backoff.

6Remaining Scope for Production Readiness

Original 2026-05-06 audit findings, checked against live code today β€” not assumed.

FindingStatus
Vulnerable dependenciesResolved
Wallet timing / cashout race conditionResolved
Input validation gapsUnknown β€” never verified
Missing DB constraintsResolved (twice β€” regressed once, re-fixed)
Cookie / JWT securityResolved
Rate limitingResolved β€” proven today when test bots tripped it
Multi-tenant / operator modelResolved
Single-process engine (leader election)Resolved
Third-party RNG/fairness certificationNot started
Production environmentDoes not exist β€” staging only, by design
Alerting on monitoring metricsMetrics collected, nothing pages anyone
The genuinely good news

Every architectural finding rated highest-effort in the original review β€” multi-tenancy, single-point-of-failure engine design β€” is closed, with live code evidence, not just claimed. Real-money readiness was assessed at ~15% in June on the architecture axis; that has substantially inverted.

7Documentation Health

Worse than no documentation

A structured project tracker does exist, in-repo, and it's genuinely well-designed. But its own status file has said "v2.0 complete, ready for next milestone" since April β€” five months ago. Since then: 32 tags, 33 merged changes, and an entire security-hardening program shipped, recorded nowhere in the project's own documentation.

A newcomer opening this project's own tracker today would be confidently told it finished five months ago. That's a worse failure mode than having no documentation at all β€” an empty page invites questions; a wrong one invites false confidence.

8Milestone Estimates

Ranges reflect elapsed calendar time under the observed intermittent working pattern β€” not continuous-effort hours. All estimates are inferences, stated with explicit confidence.

A Β· Merge the 7 orphan commits + resync documentation

Under 1 session (hours) Β· Confidence: high

Pure hygiene, pipeline already green. Highest-value, lowest-effort action available β€” protects work already paid for.

B Β· Close remaining known security/architecture gaps

2–4 weeks elapsed Β· Confidence: medium

Individually small, well-understood items. Schedule risk is stakeholder availability and a couple of human decisions, not engineering effort.

C Β· Formal security re-audit with a closeable baseline

1–2 weeks after B Β· Confidence: medium

This has to be a fresh audit β€” the original findings list is lost, so there's nothing left to "re-check" against.

D Β· Technically production-ready

6–10 weeks from today Β· Confidence: low–medium

Dominated by a decision that hasn't been made yet: provisioning an actual production environment. The engineering is largely done; this is an infrastructure and business decision gap.

E Β· Real-money launch-ready

4–9 months from today Β· Confidence: low

Not gated on engineering at all. Third-party certification is a procurement and calendar process β€” engaging a lab, queueing, evidence rounds. Industry norm is 3–6 months after code freeze. No amount of engineering speed compresses this. Treat any shorter estimate with suspicion.

Sequencing recommendation

Do A and documentation resync first β€” hours of work that protects everything already built. Then B β†’ C as one push to close the security story. D and E need business decisions before they need more engineering β€” specifically: will a production environment actually be provisioned, and is real-money launch actually the goal?

9Corrections to Prior Assumptions

Flagged explicitly because several widely-held assumptions turned out to be stale once checked against live evidence.

MR believed open is actually merged

Live check found it merged two days prior, along with a follow-up MR the same day. Current open-MR count: zero.

...but the actual fixes aren't where anyone thinks they are

Seven commits, including all three celebrated fixes, sit on an untracked branch with no merge request β€” the real risk was masked by everyone assuming a since-merged MR was still the active tracker for that work.

Status version string was one deploy stale

The live running version differs from what's recorded in the most recent status notes β€” a deploy happened after the last update was written.

Project scope framing was inflated

Two earlier major versions shipped before this engagement began. Treating the current phase as "day one" overstates what was built from scratch here.

Two named collaborators have no verifiable involvement

One has repo access but zero commits; the other has zero evidence of any involvement at all across every available source.

10Three-Sentence Verdict

The engineering substance here is genuinely strong: every architecture finding from the original audit is closed with live, verifiable code β€” including the two hardest items β€” and the audit chain is running clean at scale on staging right now. The failures are not in the code but in the connective tissue: an app silently went undeployed for six months because nothing compared running artifacts to source, the project's own tracker has claimed "done" since April, the original security findings list has been lost, and yesterday's celebrated fixes are one branch-deletion away from regressing. The cheapest, highest-value action available today takes under an hour β€” merge those seven commits and refresh the tracker β€” after which the path to a defensible production claim is weeks of well-understood cleanup, while real-money launch stays gated on third-party certification that nobody has started and that no engineering speed can compress.