CheerLife

A cheer-squad career sim in a single 3,500-line HTML file: from a high-school dance club at 16 to retirement at 42, through open auditions, trainee contracts, in-squad ranking against a rival who keeps improving, side businesses, burnout — and how you choose to leave the stage.

6.0/10
weighted total
Technical Depth
5.5
Game Design
7.5
Backend & Security
6.5
Code Quality
5
Testing
3
Completeness
7
Originality
7
Dimension by dimension

The seven dimensions

memoryTechnical Depth 5.5/10

Competent rather than deep, and deliberately so: one HTML file, no build, no dependencies, everything in a single global scope. Inside it are a mulberry32 PRNG seeded from a hashed string, a d20 check system with difficulty scaled by league rank and stress, an inflation-indexed economy (2.8%/year applied to tax brackets, upkeep and every price), decaying revenue streams with crisis events, versioned localStorage saves with a documented migration path, a Canvas career card in team colours, and SVG radar and ring charts. The one piece of real technique is readable() — relative-luminance colour derivation so a dark team primary stays legible as text — which is the same approach found in yakyulife/src/ui/dom.js.

stadia_controllerGame Design 7.5/10

Densely systemic for its size, and the best ideas are inversions rather than additions. The 💀 hardest seed starts with the lowest ability ceilings but gets the most 'breakthrough' attempts and the cheapest thresholds, so the worst start ends with the highest ceiling — effort as a real alternative to talent, with achievements exclusive to that route. Burnout is not a health bar: stress ≥88 at season end triggers a three-strike sequence ending in a doctor forcing retirement. A same-cohort rival grows every year, blocks the centre spot, and retires at 34 to be replaced. Action points and offseason slots are scarce on two independent axes, focus and all-round training combos are mutually exclusive, and side businesses have diminishing returns — so there is no build that takes everything. What is missing is verification: thresholds are adjusted by observation ('measured as hard to reach') rather than by simulated distributions.

securityBackend & Security 6.5/10

No backend and, unusually for this audit, no privacy contradiction either: no accounts, no server, an explicit statement that nothing is uploaded, a documented table of exactly which localStorage keys exist and when each is cleared, and a cookieless GoatCounter for traffic instead of Google Analytics (index.html:3494). Output hygiene is the best of the two life-sims: an esc() helper (index.html:339) is applied consistently at every innerHTML interpolation, while narrative text goes through textContent. Saves are read defensively — JSON.parse wrapped in try/catch, version-gated, with missing fields backfilled on load after a previous release shipped saves that could hang the offseason.

codeCode Quality 5/10

The weakest dimension, and the direct cost of the single-file constraint: roughly 3,160 lines of JavaScript in one global scope, 131 top-level functions, 16 inline onclick attributes that force those functions to stay global, and aggressive abbreviation (S, T, H, DF, SEA, MB, TI) that makes call sites hard to read without a key. Comments carry numbered markers like 修正③ and that reference a review checklist which does not exist in the repository. What holds it together is a genuinely uniform data shape: every event is {id, where, w, cd, cond, title, desc, ch} and every choice returns {ok, calc, story, log} through a single fx() effect applier — so 104 events stay consistent even without modules.

experimentTesting 3/10

Still no automated tests and no CI, but this is the only project in the audit that ships a checker at all. validateEvents() (index.html:3471), run by loading the page with #dev, walks every event to catch duplicate ids, missing where/cd, fewer than two choices, and title()/ch() throwing at runtime — then asserts domain rules that only a human who knew the failure mode would write: audition and trainee events must be gated on the corresponding flags, dual-squad events on sideLg, and student-stage content must not contain professional content. It is a manual, opt-in integrity pass over data rather than a test suite over logic, and nothing enforces it before a release.

verifiedCompleteness 7/10

Playable end to end and well documented — live on GitHub Pages, a 1,681-line wiki, a changelog that explains save compatibility per release, an achievements hall persisting across careers, a shareable career card, mobile-first layout with safe-area handling, and real accessibility attributes (role="progressbar", aria-live, radiogroup, a focus-trapped dialog, noscript). The documentation is where it frays: the README still advertises 101 events and 48 achievements when the build has 104 and 49, its version badge says v1.1.0 while the page title says V1.1.1, and three of its links are broken — ./CHANGELOG.md (the file is Changelog.md), ./docs/WIKI.md (the wiki is at the root), and ./LICENSE, which is badged CC BY-NC but absent from the repository. Template placeholders survive too: a 你的帳號 clone URL and a '← replace with your actual choice' note next to the licence line.

emoji_objectsOriginality 7/10

The setting is the rarest in this audit. Sports-career sims are a crowded genre; a career sim about cheer-squad performers — auditions, in-squad ranking, moonlighting across two sports, the merchandise and livestream economy, the industry's real physical and emotional toll — is one this reviewer could not find a prior example of, and the writing is specific enough to be recognizably Taiwanese rather than generic. The chassis, though, is inherited: the README credits the original concept to 最先生 (@mr.themost), the same person credited on YaKyoLife's title screen and present in its git history, and the two games share a seeded-life structure, a settlement card, second-life endings and an all-but-identical farewell line. Original setting, borrowed frame.

trending_upHighlights

  • The worst seed gets the highest ceiling — 💀 seeds start with the lowest ability caps but get the most breakthrough attempts, the cheapest thresholds and exclusive achievements: effort modelled as a real alternative to talent
  • Burnout as a three-strike sequence — stress ≥88 at season end escalates from medical rest to permanent chronic stress to a doctor ending the career, with its own retirement title
  • A rival with a lifespan — a same-cohort competitor gains score every year, blocks the centre spot, then retires at 34 and is replaced by the next generation
  • A hand-written integrity checkervalidateEvents() asserts gating rules and executes every event's title()/ch() to catch runtime errors, run via #dev (index.html:3471)
  • Consistent output escaping — a single esc() helper applied at every innerHTML interpolation, with narrative text routed through textContent (index.html:339)

trending_downWeaknesses

  • Three broken README links./CHANGELOG.md (actual file Changelog.md), ./docs/WIKI.md (wiki is at the root) and ./LICENSE, which is badged CC BY-NC but does not exist in the repo
  • Version drift in three places — README badge v1.1.0, page title V1.1.1, and a header comment claiming VER 111 above const VER=110 (index.html:329-333); the constant is the correct one, since v1.1.1 is declared save-compatible
  • Everything in one global scope — ~3,160 lines of JS, 131 top-level functions and 16 inline onclick handlers that require them to stay global
  • Stale content counts — the README advertises 101 events and 48 achievements; the shipped build has 104 and 49
  • Balance tuned by observation, not measurement — thresholds are lowered because they were 'hard to reach in play', with no simulated distribution behind the new number

Two games, one lineage

CheerLife's README credits the original concept to 最先生 (@mr.themost). That is the same name on YaKyoLife's title screen, and mr.themost <ja42022@gmail.com> is a committer in YaKyoLife's git history — sharing an email address with the account that owns it. These are not two unrelated hobby projects that happen to look alike.

The shared chassis is visible in the code: a string-seeded PRNG whose seed is the shareable artifact, a year loop of plan → event → settle, hidden traits revealed at the end, second-life endings after retirement, a Canvas settlement card, and relative-luminance colour derivation so team primaries stay readable. Even the sign-offs rhyme — YaKyoLife's retire.js closes with 「離開球場的人生,也是人生」; CheerLife's README closes with 「離開舞台的人生,也是人生」.

That makes this pair a third species in this audit, alongside the solo-plus-AI sprint and the institutional project: a format handed to a second producer. One person's design template, re-skinned onto a completely different subject by someone else, with credit stated up front. The trade shows in the scores — CheerLife wins on output hygiene and ships the audit's only integrity checker, while inheriting a frame it did not have to invent, and skipping the measurement discipline that makes the original's balance defensible.

smart_toyAI-assisted development

No AI attribution anywhere — no co-authored commits, no tool config, no generated-with footer. The git history is equally uninformative in the other direction: all 17 commits come from the GitHub web UI ('Add files via upload', 'Update index.html'), so the entire development history happened off-platform and the commit count says nothing about effort. What the artifact itself suggests is a heavily iterated, checklist-driven process — numbered 修正 markers threaded through the code, a changelog that tracks save-schema compatibility release by release, and 104 events sharing one exact object shape.

summarizeFacts

StackSingle-file HTML · Vanilla JS · Canvas 2D · SVG · localStorage · GitHub Pages
GenreText career life-sim
Period2026-08-12 → 2026-08-19
Active dev days4 days
Commits17
Lines of code~3,497
Authorjarvanthevoyager

Verdict

A rare subject executed with more discipline than its 17-commit history suggests: dense interlocking systems, the audit's only shipped integrity checker, consistent escaping and an honest privacy posture. It is held back by the single-file architecture it chose, documentation that has drifted away from the build, and balance that is argued by feel where its sibling project argues by simulation.