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.
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.
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.
| Layer | Technology |
|---|---|
| Backend | Fastify 5.x (TypeScript), Node 22 |
| ORM / DB | Drizzle ORM 0.45 β PostgreSQL |
| Cache / PubSub | Redis 5.x |
| Frontend | React + Vite + Zustand |
| Admin | Separate React/Vite SPA, served at /admin/ |
| Money math | decimal.js β no float errors |
| Auth | @fastify/jwt + httpOnly cookies |
| Observability | Prometheus + Grafana + node-exporter (Tailscale-only) |
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.
Verified live from GitLab contributor and member records.
| Person | Role | Evidence |
|---|---|---|
| Tico | Builder / orchestrator agent | 36 + 6 commits (two identities) |
| Ondrej Lapides | Owner | 17 commits, Access 50 |
Ondrej Gregor (gregor2, "ondrog") | Operational stakeholder β merges, direction | Merged MR !33, !34; Access 40 (Maintainer) |
| Vera (agent) | Repo Maintainer access | No commits, no memory evidence of involvement |
| Vicky / Vika | β | Zero evidence of any crash-game involvement found |
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.
Evidence-backed wins only β independently re-verified, not self-reported.
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.
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.
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.
Health check pulled today: 90,252 entries, verified: true. This is a certification-relevant control functioning in production-like conditions, not a design doc.
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.
Named plainly β the point of this report is to be useful, not flattering.
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.
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.
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.
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.
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.
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.
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.
| Claim | Verification | Result |
|---|---|---|
| Admin app now actually deploys | Live bundle inspected directly | β Confirmed |
| "Test Players" feature visible | String search in live bundle | β Confirmed |
| Version label added to admin UI | Confirmed in live bundle | β Confirmed |
| Start-button error fixed (code) | Live fetch code inspected directly | β Confirmed |
| Start-button fix confirmed by stakeholder | Awaiting browser re-check | β³ Outstanding |
| Backend health | Live health endpoint | β Healthy |
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.
Original 2026-05-06 audit findings, checked against live code today β not assumed.
| Finding | Status |
|---|---|
| Vulnerable dependencies | Resolved |
| Wallet timing / cashout race condition | Resolved |
| Input validation gaps | Unknown β never verified |
| Missing DB constraints | Resolved (twice β regressed once, re-fixed) |
| Cookie / JWT security | Resolved |
| Rate limiting | Resolved β proven today when test bots tripped it |
| Multi-tenant / operator model | Resolved |
| Single-process engine (leader election) | Resolved |
| Third-party RNG/fairness certification | Not started |
| Production environment | Does not exist β staging only, by design |
| Alerting on monitoring metrics | Metrics collected, nothing pages anyone |
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.
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.
Ranges reflect elapsed calendar time under the observed intermittent working pattern β not continuous-effort hours. All estimates are inferences, stated with explicit confidence.
Under 1 session (hours) Β· Confidence: high
Pure hygiene, pipeline already green. Highest-value, lowest-effort action available β protects work already paid for.
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.
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.
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.
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.
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?
Flagged explicitly because several widely-held assumptions turned out to be stale once checked against live evidence.
Live check found it merged two days prior, along with a follow-up MR the same day. Current open-MR count: zero.
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.
The live running version differs from what's recorded in the most recent status notes β a deploy happened after the last update was written.
Two earlier major versions shipped before this engagement began. Treating the current phase as "day one" overstates what was built from scratch here.
One has repo access but zero commits; the other has zero evidence of any involvement at all across every available source.