Loading…
a327ex.com

Fable Test — Steam Market Research 2

Summary

Continuation of the Steam market research (session 1 = "Fable Test — Steam Market Research 1"). Completed ALL 8 analysis directions picked last session (5, 6, 1+4+7, 9, 10, 12 → reports 08–14 in steam-market/reports/), plus two owner-prompted drill-downs (the Vampire-Survivors tag-vocabulary objection → a tag-free breakout detector; the SNKRX dead-game→big-update→revival+reprice question → a revival census with news-feed attribution), and ended with a strategy meeting that settled his next-three-releases sequencing: BYTEPATH remake → SNKRX update+reprice → 062026, per his own proposal, endorsed over my initial order.

Crawler resumption & infra:

  • Resumed histogram (finished: all 34,654 games ≥50 reviews now have monthly trajectory data) and appdetails (~19K+ rows, long tail still crawling at session end) from SQLite checkpoints; old session's still-alive crawlers caused Steam 429s until the owner killed them there.
  • New crawls this session: reviews_text_crawl.py (analysis #12: 3,862 build-tag games — all 2,262 window hits + 800 mid + 800 low — 100 top-helpful + 50 negative English reviews each, 52,043 reviews), revival_news.py + cadence_news.py (Steam GetNewsForApp feeds).
  • Steam Web API path bug: /ISteamNews/v0002/GetNewsForApp/ 404s — correct order is /ISteamNews/GetNewsForApp/v0002/ (interface/method/version). First news crawl silently stored nothing (all 404s treated as delisted); wiped poisoned DBs, fixed, re-ran. Also: uv-managed venv python.exe is a trampoline — every crawl shows TWO python processes (trampoline + real interpreter); not duplicates.

Report 08 — gold-rush detector (#5, his top pick): Per-tag quarterly panels (demand flow from monthly rollups, top-1 concentration, supply, follower h50). 311 concentrated triggers 2015–2026 found mechanically with zero named priors; rediscovered FMV/Balatro/Supermarket Sim/Exit 8/DUSK/Phasmophobia/Buckshot/VS. Findings: (1) rushes mostly don't pay — median window-vs-pre h50 = −3pt for ALL trigger classes (most spikes are AAA launches); (2) the conditional structure: quiet-tag (pre<20%) triggers +2/+5pt vs hot-tag −10pt; durable rushes are FORMAT triggers (repeatable loop: FMV +32, Trading/Supermarket +20, Old School/DUSK +19, Thriller/Unheard +16, Conspiracy/Golden Idol +12, Gambling/Buckshot +10) while experience triggers decay (Undertale, INSIDE, Before Your Eyes, Draw & Guess) — format-vs-experience is judgeable at trigger time; (3) the market clones faster now — 2026 sim-format rushes flood in ~1 quarter (Shop Keeper 13→103/Q); deep formats resist (RL Deckbuilder held 32% through 23→69/Q flood); (4) current edge: no open build-lane rush except the standing Balatro wave (273 followers, h50 32%), and the price gate holds INSIDE waves (RLD ≤$10 followers 16% vs >$10 50%; Crime 9/39; Shop Keeper 9/37). Monthly re-run recipe documented.

Report 09 — tag-free breakout detector (his VS objection): He challenged tag-dependence ("took Valve 5 years to add Bullet Heaven"). Confirmed worse: VS doesn't carry Bullet Heaven in top-7 tags EVEN NOW (vote inertia + top-7 truncation); proxy-tag measurement understated new-format follower rates 3–4× (Bullet Heaven true 2022 cohort 57% vs proxies 14–17%). Built breakout.py: v90 = first-90-day reviews per game, ranked within release quarter, no tags in the signal. EA-date bug found: Steam resets catalog release date to the 1.0 date (VS shows "Oct 20, 2022"); fixed by anchoring on min(catalog month, first histogram month). Validation: every known trigger at #1–2 of its quarter (VS #2 of 2021Q4 behind Halo Infinite; Lethal Company+Love Is All Around = 2023Q4 #1+#2; Balatro+Supermarket Sim = 2024Q1 #1+#2). Tag-invisible discoveries: (a) co-op physics/horror virals are the dominant ≤$10 money lane 2025-26 (R.E.P.O. ~$48M, PEAK ~$38M, RV There Yet ~$8.5M — Co-op/Horror tags too big to spike); (b) a live un-named format cluster in HIS lane: "luck-machine build roguelites" — Nubby's Number Factory $2.9M, CloverPit $4.4M, Slots & Daggers $1.2M, BALL x PIT $7.9M, Scritchy Scratchy $1.6M, RACCOIN $1.0M, Gamble With Your Friends $2.6M — 7 games in 5 quarters, $5–15, art-light, second wave already shipped; (c) Megabonk $20.4M = survivors-refresh still pays at $10. Full 14-thread cluster taxonomy delivered when he asked "are those the only 2 clusters?" (co-op virals, luck-machine, job/shop sims, inspection horror, idler steady-state, Chinese domestic, RLD mainline, survivors-refresh, physics toys, nostalgia re-releases, streamer horror, cozy organizing, extraction shooters, premium narrative).

Report 10 — whitespace map (#6, his 2nd pick): Tag pairs 4–40 occupants where the conjunction beats its BEST component (binomial p<.05). Macro axes: co-op/multiplayer × systems genre (Co-op+Base Building 88%), cozy × mechanics, anime × western genre, adult. His shortlist: Local Co-Op + Action Roguelike 48% @ median price $7 (Brotato $5.6M; solo-feasible co-op via Remote Play Together, no netcode; n26=3 open); Roguelike+Inventory Management 45% (backpack-likes, closing); Retro+Idler 36%, median price $5 = BYTEPATH's exact cell, near-empty (Stone Story $956K, Tiny Aquarium $625K, FACEMINER $397K; failures are shovelware so serious-entry rate much higher); Roguelite+Mystery 45% n26=0 (Blue Prince anchor); Card Game + Base Building 75% (6/8 hits), zero 2026 entries. Owner drill-down on the last two: Retro+Idler full game list 2020–26; Card×Base Building didn't exist before April 2024, 8 games/20 months (Deck of Haunts $830K = villain-protagonist haunted-house inversion; Kingdom's Deck $165K @ $10; SkyBrew $338K), widened 66-game lineage from Stacklands ($3.4M) and Emberward ($1.3M); two sub-formats (cards-as-build-resource-for-defense; cards-as-settlement-economy); effort-selection caveat (high-design-cost cells inflate rates; low-cost cells deflate).

Report 11 — sequel vs new IP / migration / EV model (#1+#7+#4): (1) Compounding decomposed: sequel-of-hit 74.0%/med $207K, sequel-of-non-hit 62.0%, new IP 55.9%/med $96K — mostly the dev, not the franchise; tag-overlap dose-response FLAT (advantage fully portable). (2) Gap decay INVERTED: 5-year gap = 71.5%/med $449K vs 1-year 53.1%/$70K; survives within price bands — his 5-year absence costs nothing, followers don't rot. (3) Migration: STAY 63.6% vs MOVE 55.9%; Action Roguelike origin exports at 75%; best mover destinations Exploration/Horror/TB Tactics; Simulation origin worst (27%). (4) EV backbone — his class (prior-hit selfpub gap≥3) by price: ≤$7 16.4%/med $12K; $8–12 38.9%/$31K; $13–20 59.4%/$110K — third independent confirmation of the price gate, now inside his own dev class; cheap winners all had viral/streamer/idle channels (Lethal Company, Brotato, Chilla's Art/Szymanski repeatable $300–500K@$8 model, Rusty's Retirement). EV table: card×base-building and $13–15 positioned roguelite lead on P×median; BYTEPATH remake leads on fit+EV/month; "$5 same deal as before" is the dominated row; data volunteers SNKRX 2 at ~74%×band (noted, not pushed).

Revival analysis (owner's SNKRX update+reprice question): He clarified "SNKRX sequel" meant the promised free update + reprice ("Dead-no-update-game → big update → revival + reprice?"). Census (revival.py): 4,976 dormant paid games ≥200 reviews; 280 ever revived = 5.6%; 50% sustained; median spike 29× dormant flow but median only +114 reviews/12mo (p90 +2,290); revivals after 4+ years dormant: only 10 in catalog (Caster: 46mo dead → sustained). Indie update-revival comparables: Children of Morta +5.9K reviews, Knock on the Coffin Lid +1.8K/~$1.6M, HAAK, Sker Ritual. SNKRX baseline: 8.7 reviews/mo dormant (alive trickle), last news item literally "Rewrite Update Cancelled" (July 2022). News attribution (revival_news.py, reweighted for the census-vs-sample imbalance — raw 46% was a sampling artifact): P(revival | dormant + ANY update) ≈ 11.5%; + BIG update ≈ 14.3% (spike-coincident only 6.6%); only 37% of revival spikes coincide with updates at all (rest = streamers/sales/virality); ~57% of landings sustain. His honest bracket: 15–35% with his assets (large owner base, 2K+ followers, announced dormancy) minus the weakened YouTuber channel — he disclosed some YouTubers won't cover his games anymore ("Status addicts" post). Reprice logic: $3→$10 multiplies a landed revival ~3.3× (~$130K → ~$430K/yr for a median-shaped sustained revival). No price HISTORY exists in any data source — reprice effects unmeasurable retroactively.

Report 12 — review-text sentiment for build games (#12): 41,003 substantive reviews. Praise is noise, complaints are signal: fails' negatives = product rejection (price/value 14.7%, abandoned-EA 4.1%, bugs 24.7%); hits' negatives = engaged friction (grind 6.7%, balance/RNG 5.0%, difficulty) — complaint type is a maturity ladder. Sticky-vs-bounce: bouncers (<2h) complain UI/clarity 10% + price 15.1% (NOT depth); invested (>20h) complain bugs 27.9% + grind 10.1% + balance. "Build shallowness" explicitly named ≤0.4% (felt as "repetitive"/"one viable build"). Positive themes anti-discriminate (small-game positives are advocacy essays — style confound). Lessons: legible first hour; grind/balance tuning for 20h+; ship finished; bugs = biggest single lever (17–28% everywhere).

Report 13 — description mechanic-mining (#10): Monroe log-odds on 22,000 English descriptions. Hit copy describes a world you ACT ON (co-op z=11.3, craft, build, expand, hundreds, workshop, playstyle, befriend, recruit, synergies z=4.4 within build games, combos, perks, modifiers, experiment + pedigree words sequel/franchise/award-winning); fail copy describes a test you're SUBJECTED to (levels z=−22.8, simple, puzzle, score, obstacles, controls, reflexes, precision, arcade) — the fail vocabulary is literally his 2021 tag neighborhood as prose. Emerging vocab: "incremental" 7.1× (23→162 docs), "short incremental" 9.5× (1→28) — a named microformat crystallizing NOW in his BYTEPATH lane (naming moment ≈ wave midpoint). No "balatro-like"/"8-like" anywhere in prose — format vocabulary lags in descriptions too; only VS gets named as inspiration.

Report 14 — update cadence (#9) + revival attribution: 1,800 games stratified by launch velocity, news-feed update counts. 0 vs 1–3 vs 4–9 first-year updates = identical tails (~1.6× m12/m3) in every stratum; only 10+/year shows +6–19% (confounded upward) — "just keep updating" unsupported below monthly cadence; his old weekly regime is the only band that shows anything. Never-updated games (1.66×) BEAT update-then-quit-early games (1.52×): visible abandonment reads worse than silence.

Strategy meeting: His fixed slate: SNKRX update (in progress) + 062026 (SNKRX visuals, different gameplay). Assessment: SNKRX update = micro-launch it, reprice $7.99–9.99 AT the update; 062026 = price $9.99–14.99 not $4.99 (dominated row), consider local co-op (the one cheap co-op cell), Next Fest demo, CN+RU+PT-BR, 30+ achievements, ship finished; flagged the slate concentration (both projects = same SNKRX-verse bet) and the two unclaimed data-favored lanes (short incremental / card×base-building, latter noted as a natural Invoker direction). My proposed order: SNKRX update → 062026 → BYTEPATH. He counter-proposed BYTEPATH first → SNKRX → 062026; I endorsed his as better: captures the "short incremental" naming window (~Sep launch vs 2027), compacts the update→062026 synergy chain, spends 5 years of launch-rust on the lowest-stakes vehicle, works as a calibration shot for his true post-YouTuber conversion baseline (the 2021 follower-conversion experiment he always wanted), and nearly guarantees the 2026 ship-gate. One conditional: if the SNKRX update is nearly done, finish it first. Calendar sketch: BYTEPATH Jul–Sep ($5.99–7.99), SNKRX update+reprice Oct–Nov, 062026 → Feb 2027 behind a fest demo at $9.99–12.99. Decisions left open: 062026 exact price, local co-op yes/no, reprice level ($7.99 leaned), unpicked analyses #2 (price elasticity) and #3 (week-1 escape velocity) offered as decision-relevant follow-ups.

Context/process notes: Fable access extended to July 12. He asked for "all remaining analyses" = only the picked ones (corrected me when I surfaced the unpicked menu). At session end the appdetails crawler was still working the reviewed long tail (resume by re-running appdetails_crawl.py); all other crawls complete. steam-market/ remains a non-git working directory; all raw outputs in reports/raw_*.txt, accumulated findings in reports/notes.md.


Hi, let's continue the Steam Market Research. Read the last session's summary and let's pick up from the next analysis directions.

Fable 5

I'll find the last Steam Market Research session log first.

Glob (a327ex-site/logs/steam)

a327ex-site\logs\steam-game-recommendations.md
a327ex-site\logs\fable-test-steam-market-research-1.md

Glob (a327ex-site/vault/steam)

No files found

Read (E:\a327ex\a327ex-site\logs\fable-test-steam-market-research-1.md)

File content (512KB) exceeds maximum allowed size (256KB). Use offset and limit parameters to read specific portions of the file, or search for specific content instead of reading the whole file.

Read (E:\a327ex\a327ex-site\logs\fable-test-steam-market-research-1.md)

1    Title: Fable Test — Steam Market Research 1
2   Date: 2026-07-07 19:44:20
3   
4   # Fable Test — Steam Market Research 1
5   
6   ## Summary
7   
8   First-principles Steam market research for a327ex, built from primary data only (Steam's own endpoints + SteamSpy bulk), deliberately indifferent to indie-marketing discourse (no howtomarketagame/Reddit/GDC/newsletters read — inputs = raw data + model priors). Greenfield: no prior Steam tooling existed in the repo. Built a resumable crawler + analysis pipeline under `E:/a327ex/steam-market/` (uv venv, SQLite stores, 8 reports in `reports/`). Session ran on Fable, got flagged/downgraded to Opus mid-way twice; ended before running the final 8 requested analyses.
9   
10  **Data infrastructure (`steam-market/`, NOT a git repo — new top-level dir):**
11  - `scripts/steamspy_all.py` — SteamSpy bulk catalog (`api.php?request=all`), 1 page/min. Final: 82,233 games (owners buckets, playtime medians, dev/publisher, CCU).
12  - `scripts/search_scrape.py` — Steam search index (`search/results/?infinite=1`, category1=998 games-only). KEY DISCOVERY: the search HTML embeds release date, top ~7 tag IDs per game, review count + positive %, price/discount, platforms — so tag-space analysis needs ZERO per-game calls. Final: 115,281 unique games (full catalog).
13  - `scripts/histogram_crawl.py` — `appreviewhistogram/<appid>` monthly review rollups since launch (trajectory analysis). Ran to ~24K/34,654 (≥50-review queue).
14  - `scripts/appdetails_crawl.py` — `api/appdetails` raw JSON (descriptions, categories, achievements, languages, DLC, demos). Stratified queue: ALL 5,596 window hits + 4,000 random window-failures + 3,000 window-mids + reviewed tail. Ran to ~15K.
15  - `scripts/reviews_sample_crawl.py` — sub-10-review split + purchase-type (key-farming) split.
16  - `scripts/reviews_lang_crawl.py` — per-language review counts, 728 games × 7 langs.
17  - `scripts/demo_hist_crawl.py` — demo review histograms (~1,485 demos) for Next Fest detection.
18  - All crawlers checkpoint per-row in SQLite `done`/`meta` tables → fully resumable by re-running the script. `scripts/common.py` = shared catalog loader (needs `sys.stdout.reconfigure(encoding='utf-8')` for Windows cp1252).
19  
20  **Revenue estimator (in-house, discourse-free), `scripts/calibrate.py`:** Calibrated ONLY on a327ex's own two games from `posts/snkrx_log.md` daily tables. Result: `revenue ≈ reviews × 35.9 × base_price` (band K=25–55). Satisfying cross-check: units/review ≈ 45 for BOTH SNKRX (day-55) and BYTEPATH (lifetime), 3 years apart. Steam's search review counts are score-ELIGIBLE (exclude key activations) → outcome analyses are farming-resistant (verified: SNKRX search 3,618 < purchase 4,194 < all 4,333). SteamSpy owner buckets UNDERCOUNT known truth (SNKRX bucket 50–100K vs 80K+ sold by day 55) → demoted to weak-check only.
21  
22  **Report 01 — delta map (base rates):** Volume DOUBLED (9.4K releases 2021 → 19.1K 2025, ~24K/yr 2026 pace) but median reviewed game held flat ~$13K since 2019; growth went into failure mass (≤9-review share 46%→55%). Paid-release hit rates eroded mildly: ≥$50K 16.0%(2021)→13.5%(2025). F2P flat ~15-18%.
23  
24  **Report 02 — tag scan + `scripts/drill_tags.py`:** Market baseline P(≥$50K)=14.3%. His 2021 tag neighborhood is bottom-decile (Arcade 5.5%, Minimalist 5.4%, Abstract 5.1%, Score Attack 3.7%, Precision Platformer 4.5%). Roguelite×co-op is top-decile with TINY supply: Online Co-Op+Roguelite 54.9% (33% at ≤$10), +Action Roguelike 50%, Roguelite+Loot 50% (42% at ≤$10), n=34-66 over 3 years vs 4,428 arcade games. Gold rushes decaying on schedule (Desktop Companion 47→9%, Shop Keeper 55→16%, Boomer Shooter 71→14%) EXCEPT Roguelike Deckbuilder (durable 24-46% across 3yr, Balatro effect). PRICE GATE: most tags' P(≥$50K) halves below $10; tags that HOLD at ≤$10 = FMV, Bullet Heaven, Idler, Auto Battler, Horror.
25  
26  **Report 03 — trajectories:** Classified 17,955 review-histogram curves. Launch-spike share rose 2%(2014)→17%(2023); median m12/m3 ≈ 1.74×. CHEAP GAMES HAVE LONGEST TAILS ($3-5: 2.26× vs $25+: 1.64×) → minimal-marketing long-tail model structurally favored at his price. Long-tail tags: Classic, Local Co-Op, Moddable, Level Editor, Physics.
27  
28  **Report 04 — anomalies (resource-normalized) + COMPOUNDING (the biggest finding):** Prior-hit devs (≥$50K in 2020-22) re-hit ≥$50K on 57.6% of 2023-25 releases (median $104K); veterans WITHOUT a prior hit: 6.4% (median $6K); first-time self-pub: 8.6%. **9× gap.** a327ex is in the 57.6% bucket (SNKRX + 2K+ followers). Advantage is PORTABLE across niche-switching (52.7% switchers vs 61.0% stayers). Still, 25% of ALL ≥$50K games are first-time self-pubs (market open). Outsider-viable tags (fs/all≈1.0): FMV, Cozy, Romance, Cooking. Publisher-dominated: Colony Sim 0.42, Roguelike Deckbuilder 0.47.
29  
30  **Report 05 — art gate (blind capsule scoring):** Scored 355 header images blind (4 niches × fail/mid/hit, tiers 1-5, no outcome knowledge). P(hit|art≥4)=74% vs P(hit|art≤2)=14%. Art is the strongest per-game gate — EXCEPT Idler (P(hit|art≤2)=27%, its hits mostly DON'T have good art: Nodebuster $2.99/$1.1M, Gnorp $6.99/$1.8M, Digseum $2.99/$676K, Fill Up The Hole art-tier-1/$121K). Horror tolerates ugly art at the top end (streamer-driven: The Complex/Eclipsium/MIMESIS $700-850K). This is the key asymmetry between his two candidate projects.
... [90 more lines]

PowerShell (Get-ChildItem E:\a327ex\steam-market -Recurse -Depth 1 | Select-Object FullName,...)

FullName                                               Length    LastWriteTime    

--------                                               ------    -------------    

E:\a327ex\steam-market\.venv                                     07/07/26 09:17:29

E:\a327ex\steam-market\data                                      07/07/26 18:45:06

E:\a327ex\steam-market\reports                                   07/07/26 16:37:27

E:\a327ex\steam-market\scripts                                   07/07/26 18:44:45

E:\a327ex\steam-market\README.md                       1570      07/07/26 09:18:43

E:\a327ex\steam-market\.venv\Lib                                 07/07/26 09:17:29

E:\a327ex\steam-market\.venv\Scripts                             07/07/26 09:17:36

E:\a327ex\steam-market\.venv\.gitignore                1         07/07/26 09:17:28

E:\a327ex\steam-market\.venv\.lock                     0         07/07/26 09:17:29

E:\a327ex\steam-market\.venv\CACHEDIR.TAG              43        07/07/26 09:17:28

E:\a327ex\steam-market\.venv\pyvenv.cfg                174       07/07/26 09:17:29

E:\a327ex\steam-market\data\art                                  07/07/26 10:58:58

E:\a327ex\steam-market\data\calibration                          07/07/26 09:28:14

E:\a327ex\steam-market\data\appdetails.sqlite          365674496 07/07/26 19:51:54

E:\a327ex\steam-market\data\appdetails.sqlite-shm      32768     07/07/26 10:42:24

E:\a327ex\steam-market\data\appdetails.sqlite-wal      4214792   07/07/26 19:53:08

E:\a327ex\steam-market\data\demo_hist.sqlite           421888    07/07/26 18:44:05

E:\a327ex\steam-market\data\histogram.sqlite           75808768  07/07/26 19:51:30

E:\a327ex\steam-market\data\histogram.sqlite-shm       32768     07/07/26 10:42:22

E:\a327ex\steam-market\data\histogram.sqlite-wal       4165352   07/07/26 19:53:09

E:\a327ex\steam-market\data\reviews_lang.sqlite        274432    07/07/26 13:52:00

E:\a327ex\steam-market\data\reviews_sample.sqlite      86016     07/07/26 11:37:18

E:\a327ex\steam-market\data\search.sqlite              13430784  07/07/26 10:41:26

E:\a327ex\steam-market\data\search.sqlite-shm          32768     07/07/26 10:42:23

E:\a327ex\steam-market\data\search.sqlite-wal          0         07/07/26 10:42:23

E:\a327ex\steam-market\data\steamspy.sqlite            9388032   07/07/26 10:45:47

E:\a327ex\steam-market\data\steamspy.sqlite-shm        32768     07/07/26 09:18:26

E:\a327ex\steam-market\data\steamspy.sqlite-wal        7774472   07/07/26 10:46:49

... [32 more lines]

PowerShell ($py = "E:\a327ex\steam-market.venv\Scripts\python.exe"; & $py -c @" import sqli...)

Exit code 1
  File "<string>", line 5

    tables = [r[0] for r in db.execute(select

                                      ^

SyntaxError: '(' was never closed

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe -c ' import sqlite3 for ...)

Command running in background with ID: bgcw2way1. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bgcw2way1.output. You will be notified when it completes. To check interim output, use Read on that file path.

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bgcw2way1.output)

While that runs, let me read the notes file which should hold the detailed analysis-direction list.

Read (E:\a327ex\steam-market\reports\notes.md)

1    # Working notes (accumulating findings for synthesis)
2   
3   ## Data integrity status
4   - Estimator: revenue ≈ reviews × 35.9 × price, band [25,55]. In-house (SNKRX day55 + BYTEPATH).
5     Units/review agrees across both games (~45).
6   - Search index (115,281 games) ≈ full catalog: per-year volume matches known history
7     (2021 ≈ 9.4K, 2024 ≈ 16.2K games) → no heavy shovelware filtering. Survivorship: delisted absent.
8   - Sub-10 split (paid, sampled n=1500): 15% have exactly 0 reviews, 44% have 1-4, 27% have 5-9,
9     14% cross ≥10 on API-all count.
10  - KEY-FARMING CHECK RESOLVED: search tooltip counts = score-ELIGIBLE reviews (excludes key
11    activations + more; SNKRX: search 3,618 < purchase 4,194 < all 4,333; one crossover game:
12    591 total / <10 eligible). Outcome analyses are already farming-resistant. The 14.3% ≥$50K
13    baseline stands (if anything conservative). Purchase-mode crawl = confirmation only.
14  
15  ## Delta map headlines (report 01, done)
16  - Volume DOUBLED: 2021 9.4K → 2025 19.1K releases; 2026 tracking ~24K/yr.
17  - Median reviewed game ≈ $13K est. — FLAT since 2019 despite volume. Failure mass grew instead:
18    ≤9-review share 46% (2021) → 55% (2025).
19  - Hit rates by cohort (paid): ≥$50K 16.0% (2021) → 13.5% (2025); ≥$100K 12.4% → 10.1%.
20    Deterioration is real but modest; volume doubling is the big change.
21  - F2P share flat ~15-18%. Median price of reviewed games $8.99.
22  
23  ## Tag scan headlines (report 02, done)
24  - HIS 2021 NEIGHBORHOOD COLLAPSED: Arcade 5.5%, Minimalist 5.4%, Abstract 5.1%, Score Attack 3.7%,
25    2D 6.9%, Puzzle 7.8%, Arena Shooter 7.7%, Precision Platformer 4.5% ≥$50K. Bottom of market.
26  - Roguelite CORE is midfield: Action Roguelike 14.4% (= baseline), n=2,347 (huge supply),
27    and only 7.4% at ≤$10.
28  - Roguelite × MULTIPLAYER/co-op = top decile: Online Co-Op+Roguelite 54.9% (33% at ≤$10),
29    Online Co-Op+Action Roguelike 50%, Co-op+Roguelite 47.2%, Roguelite+Loot 50% (42% at ≤$10, n=26).
30    Supply tiny (n=34-66 over 3 years) vs 4.4K arcade games.
... [92 more lines]

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bgcw2way1.output)

Wasted call — file unchanged since your last Read. Refer to that earlier tool_result instead.

While that finishes, let me pull the exact framing of the analysis directions from the end of last session's log.

Grep (sequel vs new IP)

49:[Omitted long matching line]
3091:[Omitted long matching line]

PowerShell ($lines = Get-Content "E:\a327ex\a327ex-site\logs\fable-test-steam-market-researc...)

**6. Whitespace map.** Which tag combinations barely exist yet but sit adjacent to clusters of winners — literal unexplored territory near proven demand. Data ready now.

**7. Genre migration graph.** Where do successful devs go next, as a transition map — which genre is the best "launchpad" into others, and whether switching genres costs or keeps the compounding edge (I have a hint: switchers re-hit 52.7% vs 61% for stayers, but not the full graph). Data ready now.

## C. Your own theses, made testable

**★ 8. "Small long games," measured.** Your signature thesis — short to make, long to play — is directly testable now: SteamSpy median playtime vs price vs review positivity vs tail length. Do high-playtime-per-dollar games actually get better reviews and longer tails? This either validates the belief you've built a career on or complicates it, and I have the data to do it (playtime coverage is thin on recent games but fine for 2019–2023 cohorts). 

**9. Update cadence effect.** You do weekly updates and measured ~20–25% bumps yourself. I can detect post-launch review re-spikes (sawtooth) across the catalog and test whether update frequency correlates with lifetime revenue — is the weekly grind worth it, market-wide? Data ready now.

## D. Lighter / exploratory

**10. Description mechanic-mining.** Beyond the numeric claims, cluster the *language* of winners' store descriptions vs failures' — which mechanic words and hooks over-index in hits, and whether new mechanic vocabulary is emerging. Data ready now (raw descriptions crawled).

**11. Title linguistics.** Do "Simulator", colons, numbers, length, non-English titles correlate with outcomes? Cheap, fast, probably minor, occasionally surprising. Data ready now.

**12. Review-text sentiment for build games.** What players actually praise/complain about in deep-build games — what makes them sticky vs bounce. This needs a new review-text crawl (a few hours), so it's the one real cost on the list.

---

My instinct: the four stars form a coherent set — **#1 tells you sequel-or-not, #2 tells you the price, #5 tells you the shell to wear, #8 checks the belief underneath all of it.** That's arguably the highest-insight quartet and all runs on data in hand. #5 (gold-rush detection) is the one I'd flag as most *fun* independent of your immediate decision — it's the closest thing to a market crystal ball the data permits, and it's the kind of thing your old data-scripting habit would have loved.

What sounds worth doing? Pick any subset, or point me at an angle I didn't list.

> <local-command-caveat>Caveat: The messages below were generated by the user while running local commands. DO NOT respond to these messages or otherwise consider them in your response unless the user explicitly asks you to.</local-command-caveat>

```
<command-name>/model</command-name>
            <command-message>model</command-message>
            <command-args>claude-fable-5</command-args>
... [61 more lines]

I have the full picture of where we left off. Now let me look at the crawler scripts so I can resume them correctly, and the shared catalog loader.

Read (E:\a327ex\steam-market\scripts\common.py)

1    """Shared catalog loader for analysis scripts."""
2   import html, json, re, sqlite3, sys
3   from datetime import date
4   
5   sys.stdout.reconfigure(encoding='utf-8')
6   
7   ROOT = 'E:/a327ex/steam-market'
8   K = 35.9          # revenue ~= reviews * K * base_price_usd (data/calibration/estimator.json)
9   K_BAND = (25, 55)
10  TODAY = date.today()
11  
12  MONTHS = {m: i+1 for i, m in enumerate(
13      ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'])}
14  
15  FULL_RE = re.compile(r'^([A-Z][a-z]{2}) (\d{1,2}), (\d{4})$')
16  MONTH_RE = re.compile(r'^([A-Z][a-z]{2}) (\d{4})$')
17  YEAR_RE = re.compile(r'^(\d{4})$')
18  
19  def parse_release(txt):
20      """-> (year, date_or_None). (None, None) if unparseable/unreleased."""
21      if not txt:
22          return None, None
23      t = txt.strip()
24      m = FULL_RE.match(t)
25      if m and m.group(1) in MONTHS:
26          try:
27              return int(m.group(3)), date(int(m.group(3)), MONTHS[m.group(1)], int(m.group(2)))
28          except ValueError:
29              return int(m.group(3)), None
30      m = MONTH_RE.match(t)
... [63 more lines]

Read (E:\a327ex\steam-market\scripts\histogram_crawl.py)

1    """Crawl appreviewhistogram (monthly review rollups since launch) for every game
2   with >= MIN_REVIEWS reviews, into data/histogram.sqlite. Queue built from search.sqlite,
3   highest review counts first. Resumable: done table. Usage: histogram_crawl.py [min_reviews]"""
4   import sqlite3, sys, time
5   import requests
6   
7   DB = 'E:/a327ex/steam-market/data/histogram.sqlite'
8   SEARCH_DB = 'E:/a327ex/steam-market/data/search.sqlite'
9   MIN_REVIEWS = int(sys.argv[1]) if len(sys.argv) > 1 else 20
10  
11  con = sqlite3.connect(DB)
12  con.execute('PRAGMA journal_mode=WAL')
13  con.execute('''CREATE TABLE IF NOT EXISTS rollup(
14      appid INTEGER, ts INTEGER, up INTEGER, down INTEGER, PRIMARY KEY(appid, ts))''')
15  con.execute('''CREATE TABLE IF NOT EXISTS done(
16      appid INTEGER PRIMARY KEY, start_date INTEGER, end_date INTEGER,
17      rollup_type TEXT, n_rollups INTEGER, fetched_at INTEGER)''')
18  con.execute('ATTACH ? AS s', (SEARCH_DB,))
19  queue = [r[0] for r in con.execute('''
20      SELECT appid FROM s.search
21      WHERE review_count >= ? AND appid NOT IN (SELECT appid FROM done)
22      ORDER BY review_count DESC''', (MIN_REVIEWS,))]
23  print(f'queue: {len(queue)} appids (min_reviews={MIN_REVIEWS})', flush=True)
24  
25  s = requests.Session()
26  s.headers.update({'User-Agent': 'Mozilla/5.0 (steam-market-research; [email protected])'})
27  fails = 0
28  for i, appid in enumerate(queue):
29      try:
30          r = s.get(f'https://store.steampowered.com/appreviewhistogram/{appid}',
... [24 more lines]

Read (E:\a327ex\steam-market\scripts\appdetails_crawl.py)

1    """Crawl store.steampowered.com/api/appdetails for a prioritized queue into
2   data/appdetails.sqlite. Unofficial rate limit ~200/5min -> 1 req/1.6s sustained.
3   Priority: reviewed games by review count desc, then a random sample of low/no-review
4   games for base rates. Resumable: appdetails + failed tables. Stores raw JSON too."""
5   import json, random, sqlite3, sys, time
6   import requests
7   
8   DB = 'E:/a327ex/steam-market/data/appdetails.sqlite'
9   SEARCH_DB = 'E:/a327ex/steam-market/data/search.sqlite'
10  LOWREV_SAMPLE = 6000
11  
12  con = sqlite3.connect(DB)
13  con.execute('PRAGMA journal_mode=WAL')
14  con.execute('''CREATE TABLE IF NOT EXISTS appdetails(
15      appid INTEGER PRIMARY KEY, type TEXT, name TEXT, is_free INTEGER, required_age TEXT,
16      developers TEXT, publishers TEXT, genre_ids TEXT, genres TEXT,
17      category_ids TEXT, categories TEXT, supported_languages TEXT,
18      release_date TEXT, coming_soon INTEGER, price_cents INTEGER, currency TEXT,
19      recommendations INTEGER, achievements INTEGER, dlc_count INTEGER,
20      demo_appids TEXT, controller_support TEXT, metacritic INTEGER,
21      header_image TEXT, fetched_at INTEGER, raw TEXT)''')
22  con.execute('CREATE TABLE IF NOT EXISTS failed(appid INTEGER PRIMARY KEY, reason TEXT, fetched_at INTEGER)')
23  con.execute('ATTACH ? AS s', (SEARCH_DB,))
24  
25  import sys
26  sys.path.insert(0, 'E:/a327ex/steam-market/scripts')
27  from common import load_catalog
28  
29  done = {r[0] for r in con.execute('SELECT appid FROM appdetails UNION SELECT appid FROM failed')}
30  cat = [g for g in load_catalog() if g['appid'] not in done]
... [79 more lines]

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/histogram_crawl....)

Command running in background with ID: b5iamgfno. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\b5iamgfno.output. You will be notified when it completes. To check interim output, use Read on that file path.

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/appdetails_crawl...)

Command running in background with ID: bhbsxf9mq. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bhbsxf9mq.output. You will be notified when it completes. To check interim output, use Read on that file path.

Read (E:\a327ex\steam-market\scripts\build_tags.py)

1    """Build-depth tag universe: hit rates, low-price behavior, supply trend, outsider
2   viability, and long-tail (m12/m3) per build-depth tag + key pairs. Chat-oriented output."""
3   import sqlite3, statistics
4   from collections import defaultdict
5   from itertools import combinations
6   
7   from common import ROOT, load_catalog, load_tagmap
8   
9   BUILD_TAGS = ['Roguelike', 'Roguelite', 'Action Roguelike', 'Roguelike Deckbuilder',
10                'Traditional Roguelike', 'Deckbuilding', 'Card Battler', 'Card Game',
11                'Auto Battler', 'Bullet Heaven', 'Loot', 'Looter Shooter', 'Hack and Slash',
12                'Action RPG', 'CRPG', 'JRPG', 'Party-Based RPG', 'Strategy RPG',
13                'Tactical RPG', 'Turn-Based Tactics', 'Dungeon Crawler', 'Class-Based',
14                'Character Customization', 'Creature Collector', 'Perma Death',
15                'Procedural Generation', 'Replay Value', 'RPG', 'Turn-Based Strategy']
16  CONTEXT_TAGS = ['Co-op', 'Online Co-Op', 'Multiplayer', 'Idler', 'Incremental', 'Horror',
17                  'Turn-Based', 'Difficult', 'Fantasy', 'Sci-fi', 'Pixel Graphics', 'Cute']
18  
19  def m12_over_m3(rolls):
20      if len(rolls) < 12:
21          return None
22      c3 = sum(n for _, n in rolls[:3]) or 1
23      return sum(n for _, n in rolls[:12])/c3
24  
25  def main():
26      tagmap = load_tagmap()
27      name2id = {v: k for k, v in tagmap.items()}
28      missing = [t for t in BUILD_TAGS if t not in name2id]
29      if missing:
30          print('missing tag names:', missing)
... [106 more lines]

Read (E:\a327ex\steam-market\scripts\reviews_sample_crawl.py)

1    """Targeted appreviews crawl, two purposes:
2   (a) sub10 mode: random sample of paid games with <10 reviews (search shows nothing there)
3       -> exact 0 vs 1-9 split for base rates.
4   (b) purchase mode: top games by est. revenue in the 2023-2025 window -> steam-purchase vs
5       key-activation review split (detects key-farming inflation in the outcome data).
6   Usage: reviews_sample_crawl.py sub10 1500 | reviews_sample_crawl.py purchase 800"""
7   import random, sqlite3, sys, time
8   import requests
9   
10  ROOT = 'E:/a327ex/steam-market'
11  DB = f'{ROOT}/data/reviews_sample.sqlite'
12  mode = sys.argv[1] if len(sys.argv) > 1 else 'sub10'
13  N = int(sys.argv[2]) if len(sys.argv) > 2 else 1500
14  
15  con = sqlite3.connect(DB)
16  con.execute('PRAGMA journal_mode=WAL')
17  con.execute('''CREATE TABLE IF NOT EXISTS summary(
18      appid INTEGER PRIMARY KEY, mode TEXT, total_all INTEGER, positive INTEGER,
19      negative INTEGER, steam_total INTEGER, nonsteam_total INTEGER, fetched_at INTEGER)''')
20  con.execute('ATTACH ? AS s', (f'{ROOT}/data/search.sqlite',))
21  
22  if mode == 'sub10':
23      pool = [r[0] for r in con.execute('''SELECT appid FROM s.search
24          WHERE review_count IS NULL AND price_orig_cents > 0
25          AND appid NOT IN (SELECT appid FROM summary)''')]
26      random.seed(7)
27      random.shuffle(pool)
28      queue = pool[:N]
29  else:
30      from common import load_catalog
... [44 more lines]

Write (E:\a327ex\steam-market\scripts\reviews_text_crawl.py)

File created successfully at: E:\a327ex\steam-market\scripts\reviews_text_crawl.py (file state is current in your context — no need to Read it back)

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bgcw2way1.output)

1    histogram {'rollup': 1907799, 'done': 29067}
2   appdetails {'appdetails': 17706, 'failed': 0}
3   demo_hist {'rollup': 10356, 'done': 1486}
4   reviews_lang {'lang': 5095}
5   reviews_sample {'summary': 2300}
6   search {'search': 115281, 'meta': 1}
7   steamspy {'steamspy': 82233, 'meta': 1}
8   

[Request interrupted by user]

The crawler scripts were not stopped, they're still running in the old session. Should I stop them there?

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\b5iamgfno.output)

1    queue: 5495 appids (min_reviews=50)
2   

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bhbsxf9mq.output)

1    queue: 0 window-successes + 4000 window-failures + 3000 window-mid + 50694 reviewed rest
2   

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/reviews_text_cra...)

Command running in background with ID: bkrhggaew. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bkrhggaew.output. You will be notified when it completes. To check interim output, use Read on that file path.

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bkrhggaew.output)

1    queue: 3889 (hit=2289, mid sampled 800, low sampled 800; 0 already done)
2   

Write (E:\a327ex\steam-market\scripts\goldrush.py)

File created successfully at: E:\a327ex\steam-market\scripts\goldrush.py (file state is current in your context — no need to Read it back)

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/goldrush.py 2>&1...)

loading catalog...

392 tags with >=40 games

loading rollups...

rollups for 29404 games



=== CONCENTRATED TRIGGERS (flow>=1500/Q, x>=4.0, top1>=35%): 311 ===

2015Q1 Moddable                     flow=   8.2K x 6.2 top1= 69% trigger=Besiege ($12467K est)

        h50 pre=-(n=5) window=33%(n=9) post-flood=-(n=7) | supply flood: NONE by 2017Q1

2015Q1 Aliens                       flow=   2.3K x 5.8 top1= 45% trigger=Alien: Isolation ($38141K est)

        h50 pre=-(n=5) window=44%(n=9) post-flood=14%(n=14) | supply flood: NONE by 2017Q1

2015Q1 Precision Platformer         flow=   2.5K x12.0 top1= 83% trigger=Geometry Dash ($51446K est)

        h50 pre=-(n=7) window=33%(n=18) post-flood=38%(n=16) | supply flood: NONE by 2017Q1

2015Q1 Parkour                      flow=  10.8K x 9.3 top1= 59% trigger=Dying Light ($87758K est)

        h50 pre=75%(n=8) window=80%(n=10) post-flood=64%(n=11) | supply flood: NONE by 2017Q1

2015Q1 Medieval                     flow=  11.1K x 4.7 top1= 51% trigger=Besiege ($12467K est)

        h50 pre=-(n=5) window=55%(n=20) post-flood=53%(n=19) | supply flood: NONE by 2017Q1

2015Q1 3D                           flow=   2.4K x39.2 top1= 47% trigger=DEAD OR ALIVE 5 Last Round: Core Fighters ($5168K est)

        h50 pre=-(n=3) window=27%(n=11) post-flood=22%(n=23) | supply flood: NONE by 2017Q1

2015Q1 Episodic                     flow=   9.5K x 7.0 top1= 79% trigger=Life is Strange - Episode 1 ($8188K est)

        h50 pre=-(n=1) window=-(n=4) post-flood=-(n=3) | supply flood: NONE by 2017Q1

2015Q1 Futuristic                   flow=   2.1K x41.4 top1= 84% trigger=Call of Duty®: Advanced Warfare - Gold Edition ($12599K est)

        h50 pre=-(n=3) window=10%(n=10) post-flood=25%(n=12) | supply flood: NONE by 2017Q1

2015Q1 Turn-Based Combat            flow=   4.3K x14.3 top1= 75% trigger=Darkest Dungeon® ($50464K est)

        h50 pre=44%(n=9) window=56%(n=18) post-flood=62%(n=26) | supply flood: 2015Q4 (+3Q, 12/Q vs pre 2/Q)

2015Q1 City Builder                 flow=   9.8K x 5.6 top1= 54% trigger=Cities: Skylines ($107702K est)

        h50 pre=75%(n=8) window=71%(n=17) post-flood=42%(n=26) | supply flood: NONE by 2017Q1

2015Q1 Violent                      flow=   4.5K x89.1 top1= 73% trigger=Hotline Miami 2: Wrong Number ($13167K est)

        h50 pre=44%(n=16) window=28%(n=29) post-flood=21%(n=120) | supply flood: 2016Q3 (+6Q, 17/Q vs pre 4/Q)

2015Q1 Replay Value                 flow=   3.8K x75.9 top1= 89% trigger=The Binding of Isaac: Rebirth ($81358K est)

        h50 pre=-(n=7) window=-(n=6) post-flood=32%(n=19) | supply flood: NONE by 2017Q1

... [170 more lines]

Bash (./.venv/Scripts/python.exe scripts/goldrush.py > reports/raw_goldrush_v1.txt 2>&...)

705 reports/raw_goldrush_v1.txt
6:=== CONCENTRATED TRIGGERS (flow>=1500/Q, x>=4.0, top1>=35%): 311 ===
630:=== DIFFUSE WARMING (x>=3.0, top1<35%): 43 ===
675:=== ANATOMY (mature concentrated triggers, n=292) ===
679:=== OPEN WINDOWS NOW (trigger in last 4 quarters, supply not yet flooded) ===

Read (E:\a327ex\steam-market\reports\raw_goldrush_v1.txt)

400          h50 pre=46%(n=28) window=42%(n=24) post-flood=33%(n=21) | supply flood: NONE by 2022Q3
401 2020Q3 Supernatural                 flow=  11.1K x12.0 top1= 43% trigger=Phasmophobia ($256238K est)
402         h50 pre=-(n=7) window=36%(n=39) post-flood=16%(n=56) | supply flood: 2021Q2 (+3Q, 13/Q vs pre 2/Q)
403 2020Q3 Villain Protagonist          flow=  14.4K x 4.6 top1= 47% trigger=CARRION ($12092K est)
404         h50 pre=-(n=4) window=54%(n=13) post-flood=50%(n=8) | supply flood: NONE by 2022Q3
405 2020Q3 Experimental                 flow=   7.8K x 8.6 top1= 49% trigger=Townscaper ($2273K est)
406         h50 pre=12%(n=40) window=3%(n=176) post-flood=3%(n=38) | supply flood: 2020Q4 (+1Q, 115/Q vs pre 11/Q)
407 2020Q3 Skating                      flow=   3.4K x 5.6 top1= 99% trigger=Skater XL - The Ultimate Skateboarding Game ($18284K est)
408         h50 pre=-(n=1) window=-(n=7) post-flood=-(n=7) | supply flood: NONE by 2022Q3
409 2020Q3 Automation                   flow=  28.2K x 4.0 top1= 43% trigger=Satisfactory ($193969K est)
410         h50 pre=77%(n=13) window=13%(n=31) post-flood=33%(n=51) | supply flood: 2021Q4 (+5Q, 16/Q vs pre 4/Q)
411 2020Q4 Utilities                    flow=   2.2K x11.3 top1= 75% trigger=Virtual Cottage ($0K est)
412         h50 pre=-(n=4) window=0%(n=11) post-flood=9%(n=22) | supply flood: 2022Q3 (+7Q, 13/Q vs pre 1/Q)
413 2020Q4 Pirates                      flow=  42.4K x 4.4 top1= 72% trigger=Sea of Thieves: 2026 Edition ($210280K est)
414         h50 pre=29%(n=21) window=14%(n=14) post-flood=12%(n=17) | supply flood: NONE by 2022Q4
415 2020Q4 Surreal                      flow=  13.3K x 4.1 top1= 36% trigger=Superliminal ($10205K est)
416         h50 pre=23%(n=52) window=18%(n=82) post-flood=18%(n=102) | supply flood: 2021Q1 (+1Q, 32/Q vs pre 15/Q)
417 2020Q4 Psychological Horror         flow= 233.2K x 5.8 top1= 67% trigger=Phasmophobia ($256238K est)
418         h50 pre=31%(n=139) window=28%(n=222) post-flood=19%(n=319) | supply flood: 2021Q4 (+4Q, 97/Q vs pre 44/Q)
419 2020Q4 Voxel                        flow=  16.3K x 4.1 top1= 72% trigger=Teardown ($80616K est)
420         h50 pre=9%(n=23) window=26%(n=27) post-flood=23%(n=30) | supply flood: 2022Q4 (+8Q, 14/Q vs pre 6/Q)
421 2020Q4 Perma Death                  flow=  11.4K x13.4 top1= 61% trigger=Spelunky 2 ($10102K est)
422         h50 pre=14%(n=43) window=10%(n=89) post-flood=15%(n=78) | supply flood: 2021Q1 (+1Q, 23/Q vs pre 10/Q)
423 2020Q4 Cyberpunk                    flow= 323.3K x25.9 top1= 90% trigger=Cyberpunk 2077 ($818696K est)
424         h50 pre=44%(n=43) window=25%(n=60) post-flood=22%(n=67) | supply flood: 2021Q1 (+1Q, 28/Q vs pre 12/Q)
425 2020Q4 Horses                       flow=   9.2K x99.0 top1= 98% trigger=Red Dead Online ($21851K est)
426         h50 pre=22%(n=9) window=12%(n=8) post-flood=12%(n=8) | supply flood: NONE by 2022Q4
427 2020Q4 Nudity                       flow= 343.4K x10.4 top1= 85% trigger=Cyberpunk 2077 ($818696K est)
428         h50 pre=38%(n=177) window=46%(n=100) post-flood=34%(n=101) | supply flood: NONE by 2022Q4
429 2020Q4 VR                           flow= 245.2K x 5.7 top1= 64% trigger=Phasmophobia ($256238K est)
... [275 more lines]

Write (E:\a327ex\steam-market\scripts\goldrush.py)

The file E:\a327ex\steam-market\scripts\goldrush.py has been updated successfully. (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/goldrush.py > reports/raw_goldrush_v2.txt 2>&...)

125 reports/raw_goldrush_v2.txt

Read (E:\a327ex\steam-market\reports\raw_goldrush_v2.txt)

1    loading catalog...
2   392 tags with >=40 games
3   loading rollups...
4   rollups for 29571 games
5   
6   === ANATOMY BY TRIGGER CLASS (mature triggers, >=6Q old, pre&win n>=8) ===
7   indie    n=53  window-vs-pre median -3pt | postflood-vs-pre -5pt (n=52) | win med 23% pre med 22%
8   big      n=67  window-vs-pre median -3pt | postflood-vs-pre -5pt (n=66) | win med 20% pre med 26%
9   f2p      n=35  window-vs-pre median -3pt | postflood-vs-pre -3pt (n=34) | win med 22% pre med 25%
10  old      n=12  window-vs-pre median -5pt | postflood-vs-pre -7pt (n=12) | win med 17% pre med 23%
11  
12  --- indie-trigger rushes, individually (window-vs-pre, sorted) ---
13  2023Q4 FMV                        pre  28% -> win  55% -> post  60% | flow=33K trigger=Love Is All Around ($10, $0.5M)
14  2018Q2 Real-Time                  pre   8% -> win  33% -> post   6% | flow=2K trigger=Ancestors Legacy ($23, $1.8M)
15  2021Q3 Party                      pre  18% -> win  42% -> post   8% | flow=19K trigger=Draw & Guess ($5, $0.1M)
16  2023Q4 Underground                pre   0% -> win  23% -> post  13% | flow=5K trigger=The Exit 8 ($4, $0.7M)
17  2017Q3 Magic                      pre  22% -> win  43% -> post  21% | flow=3K trigger=Citadel: Forged with Fire ($15, $1.6M)
18  2021Q2 Narrative                  pre  33% -> win  53% -> post  29% | flow=4K trigger=Before Your Eyes ($10, $5.5M)
19  2018Q1 Old School                 pre   0% -> win  17% -> post  19% | flow=2K trigger=DUSK ($20, $12.1M)
20  2019Q1 Thriller                   pre  15% -> win  29% -> post  32% | flow=3K trigger=Unheard - Voices of Crime ($7, $0.7M)
21  2024Q1 Trading                    pre  17% -> win  31% -> post  36% | flow=22K trigger=Supermarket Simulator ($20, $24.3M)
22  2015Q1 Turn-Based Combat          pre  44% -> win  56% -> post  62% | flow=4K trigger=Darkest Dungeon® ($25, $50.5M)
23  2015Q4 Exploration                pre  48% -> win  59% -> post  43% | flow=35K trigger=Fallout 4 ($20, $130.8M)
24  2017Q3 Cartoon                    pre  18% -> win  25% -> post  22% | flow=3K trigger=Cuphead ($20, $46.4M)
25  2017Q4 4 Player Local             pre  11% -> win  17% -> post  18% | flow=12K trigger=Stick Fight: The Game ($5, $9.4M)
26  2022Q1 Bullet Hell                pre   8% -> win  14% -> post  10% | flow=81K trigger=Vampire Survivors ($5, $22.8M)
27  2016Q1 Colorful                   pre  19% -> win  24% -> post  29% | flow=6K trigger=Slime Rancher ($20, $46.8M)
28  2015Q1 Parkour                    pre  75% -> win  80% -> post  64% | flow=11K trigger=Dying Light ($25, $87.8M)
29  2022Q1 Match 3                    pre   0% -> win   4% -> post   2% | flow=30K trigger=Mirror 2: Project X ($2, $0.2M)
30  2019Q4 Cartoony                   pre   5% -> win   8% -> post  12% | flow=4K trigger=Secret Neighbor: Hello Neighbor Multiplayer ($20, $3.5M)
... [96 more lines]

Edit (E:\a327ex\steam-market\scripts\goldrush.py)

The file E:\a327ex\steam-market\scripts\goldrush.py has been updated successfully. (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\scripts\goldrush.py)

The file E:\a327ex\steam-market\scripts\goldrush.py has been updated successfully. (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/goldrush.py > reports/raw_goldrush_v3.txt 2>&...)

6:=== ANATOMY BY TRIGGER CLASS (mature triggers, >=6Q old, pre&win n>=8) ===
12:--- window-vs-pre split by tag pre-rate (indie+f2p triggers) ---
16:--- supply-flood lag by trigger year (all concentrated triggers) ---
28:--- indie/f2p rushes ranked by POST-FLOOD delta (durability), with trigger-time features ---
117:--- indie-trigger rushes, individually (window-vs-pre, sorted) ---
172:=== CURRENT EDGE: triggers in last 8 quarters (all classes), grouped by trigger game ===

Read (E:\a327ex\steam-market\reports\raw_goldrush_v3.txt)

6    === ANATOMY BY TRIGGER CLASS (mature triggers, >=6Q old, pre&win n>=8) ===
7   indie    n=53  window-vs-pre median -3pt | postflood-vs-pre -5pt (n=52) | win med 23% pre med 22%
8   big      n=67  window-vs-pre median -3pt | postflood-vs-pre -5pt (n=66) | win med 20% pre med 26%
9   f2p      n=35  window-vs-pre median -3pt | postflood-vs-pre -3pt (n=34) | win med 22% pre med 25%
10  old      n=12  window-vs-pre median -5pt | postflood-vs-pre -7pt (n=12) | win med 17% pre med 23%
11  
12  --- window-vs-pre split by tag pre-rate (indie+f2p triggers) ---
13  pre<20%   n=35  median delta +2pt | mean +5pt
14  pre>=20%  n=53  median delta -10pt | mean -7pt
15  
16  --- supply-flood lag by trigger year (all concentrated triggers) ---
17  2015: triggers=63  flooded within 8Q: 16/63 (25%) | median lag of flooded: 5.0Q
18  2016: triggers=30  flooded within 8Q: 6/30 (20%) | median lag of flooded: 6.0Q
19  2017: triggers=33  flooded within 8Q: 2/33 (6%) | median lag of flooded: 4.0Q
20  2018: triggers=12  flooded within 8Q: 3/12 (25%) | median lag of flooded: 3Q
21  2019: triggers=30  flooded within 8Q: 12/30 (40%) | median lag of flooded: 5.0Q
22  2020: triggers=44  flooded within 8Q: 22/44 (50%) | median lag of flooded: 1.0Q
23  2021: triggers=18  flooded within 8Q: 5/18 (28%) | median lag of flooded: 2Q
24  2022: triggers=17  flooded within 8Q: 7/17 (41%) | median lag of flooded: 7Q
25  2023: triggers=18  flooded within 8Q: 4/18 (22%) | median lag of flooded: 4.5Q
26  2024: triggers=9   flooded within 8Q: 5/9 (56%) | median lag of flooded: 2Q
27  
28  --- indie/f2p rushes ranked by POST-FLOOD delta (durability), with trigger-time features ---
29                    tag                         pre->win->post | trigRev preSup preFlow/Q nGames
30  2023Q4 FMV                         28-> 55-> 60 (+32) | $  0.5M    8/Q   3068 Love Is All Around
31  2015Q2 Time Management             23-> 16-> 50 (+27) | $  0.0M    3/Q    183 Freestyle 2: Street Basketball
32  2024Q1 Trading                     17-> 31-> 36 (+20) | $ 24.3M    4/Q   4474 Supermarket Simulator
33  2018Q1 Old School                   0-> 17-> 19 (+19) | $ 12.1M    2/Q    398 DUSK
34  2015Q1 Turn-Based Combat           44-> 56-> 62 (+17) | $ 50.5M    2/Q    470 Darkest Dungeon®
35  2019Q1 Thriller                    15-> 29-> 32 (+16) | $  0.7M    4/Q    389 Unheard - Voices of Crime
... [81 more lines]

Read (E:\a327ex\steam-market\reports\raw_goldrush_v3.txt)

172  === CURRENT EDGE: triggers in last 8 quarters (all classes), grouped by trigger game ===
173 
174 [BIG] Black Myth: Wukong  $60  est $149.9M  released 2024-08-19  trigger 2024Q3
175    OPEN  Action RPG                 2024Q3 flow=   861K x5 top1=79% | supply 146->213/Q | followers n=1103 h50=17% | Borderlands 4 $167.0M, Path of Exile 2 $102.7M, Dragon Age™: The Veilguard $62.3M
176    OPEN  Souls-like                 2024Q3 flow=   835K x6 top1=82% | supply 40->44/Q | followers n=350 h50=22% | ELDEN RING NIGHTREIGN $106.1M, Path of Exile 2 $102.7M, Hollow Knight: Silksong $102.2M
177    OPEN  Combat                     2024Q3 flow=   770K x8 top1=89% | supply 68->116/Q | followers n=551 h50=15% | Crimson Desert $148.4M, Assassin’s Creed Shadows $38.5M, Undisputed $24.7M
178    FLOOD Mythology                  2024Q3 flow=   733K x23 top1=93% | supply 12->28/Q | followers n=113 h50=17% | Hades II $69.3M, Titan Quest II $9.1M, One-Eyed Likho $0.8M
179 
180 [INDIE] Hollow Knight: Silksong  $20  est $102.2M  released 2025-09-04  trigger 2025Q3
181    OPEN  Metroidvania               2025Q3 flow=   334K x5 top1=72% | supply 50->51/Q | followers n=162 h50=22% | GRIME II $1.7M, MIO: Memories in Orbit $1.1M, Constance $0.8M
182 
183 [F2P] Marvel Rivals  F2P  est $0.0M  released 2024-12-05  trigger 2024Q4
184    OPEN  Superhero                  2024Q4 flow=   153K x5 top1=83% | supply 6->3/Q | followers n=25 h50=32% | Dispatch $114.0M, Marvel's Spider-Man 2 $33.7M, LEGO® Batman™: Legacy of the Dark Knight $15.0M
185 
186 [BIG] Subnautica 2  $30  est $73.7M  released 2026-05-14  trigger 2026Q2
187    OPEN  Underwater                 2026Q2 flow=   150K x8 top1=74% | supply 17->27/Q | followers n=0 h50=-
188 
189 [INDIE] Schedule I  $20  est $140.0M  released 2025-03-24  trigger 2025Q1
190    OPEN  Crime                      2025Q1 flow=   141K x4 top1=49% | supply 19->33/Q | followers n=116 h50=19% | Mafia: The Old Country $16.0M, The Precinct $4.2M, Cash Cleaner Simulator $2.7M
191 
192 [BIG] Monster Hunter Wilds  $70  est $209.1M  released 2025-02-27  trigger 2025Q1
193    OPEN  Hunting                    2025Q1 flow=   137K x8 top1=87% | supply 7->10/Q | followers n=48 h50=17% | WolfQuest: Anniversary Edition $10.6M, Way of the Hunter 2 $1.3M, Deathground $0.5M
194    OPEN  Dragons                    2025Q1 flow=   123K x46 top1=97% | supply 8->5/Q | followers n=39 h50=13% | Huaxia: Warring States $0.4M, The RPG $0.4M, Dragonhold $0.1M
195 
196 [INDIE] Escape From Duckov  $18  est $6.7M  released 2025-10-16  trigger 2025Q4
197    OPEN  Top-Down Shooter           2025Q4 flow=    97K x4 top1=80% | supply 116->125/Q | followers n=209 h50=4% | Arms of God $0.8M, Vital Shell $0.3M, Jackal $0.3M
198 
199 [INDIE] Slay the Spire 2  $25  est $57.2M  released 2026-03-05  trigger 2026Q1
200    OPEN  Political                  2026Q1 flow=    97K x23 top1=96% | supply 8->11/Q | followers n=11 h50=18% | Teller's Duty $0.2M, Age of History 2: Definitive Edition $0.2M
201 
... [78 more lines]

Bash (./.venv/Scripts/python.exe - <<'EOF' import sys sys.path.insert(0, 'E:/a327ex/st...)

RL Deckbuilder post-Balatro-trigger (2025-01..2026-06): n=273 h50=32%

  <=$10: n=148 h50=16% | >$10: n=125 h50=50%

    $10 $0.34M Aotenjo: Infinite Hands (2025-01-19)

    $9 $0.32M Witch's Apocalyptic Journey (2026-06-04)

    $9 $0.23M Three Kingdoms: The Blood Moon (2025-04-02)

    $10 $0.22M Dogpile (2025-12-10)

    $10 $0.21M Apokerlypse (2026-04-29)

    $9 $0.17M SealChain: Call of Blood (2026-02-20)

    $10 $0.16M Kingdom's Deck (2025-04-27)

    $10 $0.13M Goblin Sushi (2026-02-09)



Crime post-Schedule I (2025-04..2026-06): n=116 h50=19%

  <=$10: n=78 h50=9% | >$10: n=38 h50=39%

    $10 $0.28M Brush Burial: Gutter World (2025-11-19)

    $8 $0.25M Prison Escape Simulator: Dig Out (2025-07-25)

    $9 $0.14M A Case of Fraud (2025-11-10)

    $10 $0.12M Bum: Revenge (2025-07-30)

    $2 $0.09M QUIET DAN (2025-05-07)

    $6 $0.08M Dread Neighbor (2026-05-07)

    $10 $0.08M 春泥 Soil of Rebirth (2026-01-16)



Shop Keeper 2026 flood cohort: n=169 h50=16%

  <=$10: n=128 h50=9% | >$10: n=41 h50=37%

    $3 $2.29M BidKing (2026-04-15)

    $10 $0.17M Rest Area Simulator (2026-04-24)

    $7 $0.12M Loot Tycoon (2026-04-19)

    $8 $0.11M Skeleseller (2026-03-17)

    $8 $0.11M BakeryDiary (2026-03-06)

    $8 $0.09M Retail Hell (2026-05-21)

    $10 $0.08M Dungeon Bodega Simulator (2026-03-23)

... [1 more lines]

The price gate holds inside the waves — that's a sharp result. Writing up report 08 now, then delivering the full analysis.

Write (E:\a327ex\steam-market\reports\08-goldrush.md)

File created successfully at: E:\a327ex\steam-market\reports\08-goldrush.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

Bash (tail -2 "C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8...)

Exit code 1
tail: option used in invalid context -- 2

Bash (for f in b5iamgfno bhbsxf9mq bkrhggaew; do echo "== $f =="; tail -n 2 "C:/Users/...)

== b5iamgfno ==
queue: 5495 appids (min_reviews=50)

500/5495 done

== bhbsxf9mq ==
3773390: 429, sleeping 90s

3182170: 429, sleeping 90s

== bkrhggaew ==
100/3889 (hit)

200/3889 (hit)

Analysis #5 — gold-rush early detection — is done. Full findings below. (Also: report written to 08-goldrush.md, and the appdetails crawler is currently eating 429s, which is consistent with the old session's copy still running — once you kill it there, mine will smooth out. Histogram: 500/5,495 left. Review-text crawl for #12: 200/3,889, ~3h to go.)

How it works, in one paragraph

For every tag I built a quarterly panel from the time-resolved review histograms: demand flow (sum of monthly review rollups across the tag's games), concentration (top-1 game's share of that flow), supply (releases/quarter), and follower outcomes (h50 = P(≥$50K est) for paid games released before/during/after). A trigger = flow ≥1,500/quarter AND ≥4× the trailing-8-quarter median AND one game ≥35% of it. No rush was named in advance — the detector found 311 concentrated triggers since 2015 and independently rediscovered every rush we knew about (Love Is All Around→FMV, Balatro, Supermarket Simulator, The Exit 8, DUSK, Phasmophobia, Buckshot Roulette, Vampire Survivors) plus a pile nobody named.

Finding 1: rushes mostly don't pay — chasing spikes is a losing base-rate strategy

Across all 292 mature triggers, followers who shipped into the 12-month post-trigger window did worse than the tag's own pre-trigger cohort: median −3pt, and it doesn't matter whether the trigger was indie, AAA, or F2P. Most flow spikes are AAA launches (Elden Ring, Wukong, Silksong) or one-off virals that transfer nothing to followers. If last session's compounding finding was "the 9× is in the dev, not the niche," this one is "the spike is in the game, not the tag" — by default.

Finding 2: the conditional structure is the actual crystal ball

Two conditions separate the rushes that paid from the ones that didn't:

Quiet tag beats hot tag. Triggers into tags with pre-rate <20% h50: median +2pt / mean +5pt with a fat right tail. Triggers into already-hot tags (≥20%): median −10pt. Slay the Spire is the cleanest cautionary case: Deckbuilding's pre-trigger cohort was at 100% h50 (tiny, elite supply), and the rush created the flood that diluted it to 56%.

Format beats experience. Ranking all indie/F2P rushes by post-flood durability (12–24 months later — this kills the regression-to-mean objection), every durable one is a format: a repeatable mechanical loop someone else can re-instantiate with different content:

Rush pre → window → post-flood Trigger
FMV 28% → 55% → 60% Love Is All Around ($0.5M)
Trading 17% → 31% → 36% Supermarket Simulator ($24M)
Old School 0% → 17% → 19% DUSK ($12M)
Turn-Based Combat 44% → 56% → 62% Darkest Dungeon ($50M)
Thriller 15% → 29% → 32% Unheard – Voices of Crime ($0.7M)
Underground 0% → 23% → 13% The Exit 8 ($0.7M)
Game Development 12% → 14% → 25% Mad Games Tycoon 2 ($2M)
Gambling 6% → 5% → 16% Buckshot Roulette ($3.8M)

And every decayed one is an experience — a singular authored work: Undertale (−8), INSIDE (−31), Before Your Eyes (+20 window, then −4), Doki Doki, Draw & Guess (+24 window, then −10). The distinction is judgeable at trigger time: "could a stranger ship a different game with the same loop?" FMV-dating-sim yes, Undertale no. That plus a quiet tag is the whole recipe.

Finding 3: the market clones formats much faster than it used to

Pre-2019, ~25% of triggers saw a supply flood within 8 quarters, median lag 4–6 quarters. Since 2020 it's ~40–56% at 1–2 quarters. The 2026 case studies are brutal: Shop Keeper went 13→103 releases/quarter within one quarter of Retro Rewind; Party Game 36→148; Organizing 4→13 within a quarter of Librarian. Sim-shaped, asset-flippable formats now flood almost instantly — the follower window for those is ~one quarter, which only a ≤2-month dev cycle can even enter. Mechanically deep formats resist dilution: Roguelike Deckbuilder held followers at 32% h50 straight through a 23→69/Q flood. Depth is anti-clone armor — which conveniently is the thing you build anyway.

Finding 4: the current edge (through 2026Q2)

There is no open build-lane rush right now. The honest verdict. What the scan shows instead:

  • The standing wave is still Balatro's. 273 RL Deckbuilder followers since the 2024Q4 trigger at h50 = 32% (2.2× baseline) after full flood, and StS2's March launch (~$57M est) just re-spiked demand. It's the "durable deep-demand" class — but 20 months in, you'd be entering with 69 competitors/quarter.
  • The price gate holds inside the waves. This is the sharpest new cut for you specifically: RL Deckbuilder followers at ≤$10 hit 16% (best cheap winner: Aotenjo at ~$340K) vs 50% above $10. Crime post-Schedule I: 9% vs 39%. Shop Keeper flood cohort: 9% vs 37%. Riding a wave at $5 forfeits most of the wave. Balatro itself is $15.
  • Open-but-wrong-lane windows: Schedule I/Crime (a real format trigger, supply still arriving, followers 19%), Wukong souls-like land (premium scale), skate./Skateboarding (supply still 2/Q but n=5), Marvel Rivals/Superhero. The sim-format rushes (Shop Keeper, Organizing) are already flooded and sit behind the art gate anyway.

The tool is the deliverable: goldrush.py re-runs on ~2–3h of crawling (fresh search scrape + histogram top-up). Monthly cadence; the read is: new [INDIE] concentrated trigger + quiet tag (supply <10/Q) + format-not-experience + supply hasn't reacted → ship into it within a quarter, at ≥$10. That's the "next Roguelike Deckbuilder" alarm, as mechanical as the data permits.

Caveats worth carrying: trigger attribution is top-1-by-flow and occasionally silly (StS2 shows up under "Political" — Steam tag vandalism; one 2015 "Time Management" row is misattributed), tags are current-not-historical (retro-tagging blurs old backtests, not the current edge), and h50 uses lifetime revenue so older cohorts get a small tail advantage — which makes the durable-rush list conservative.


Next in the queue per our sequencing: #6 whitespace map (your second pick — rare-but-adjacent-to-winners tag combos; shares machinery with this one), then 1+4+7. Want me to go ahead with #6, or dig further into anything here first — e.g. the format-vs-experience classification as a scored table, or what the Crime/Schedule I window would concretely look like to enter?

First, I killed the tasks in the old session, is everything okay here?

Let me check all three crawlers.

Bash (for f in b5iamgfno bhbsxf9mq bkrhggaew; do echo "== $f =="; tail -n 4 "C:/Users/...)

== b5iamgfno ==
queue: 5495 appids (min_reviews=50)

500/5495 done

== bhbsxf9mq ==
queue: 0 window-successes + 4000 window-failures + 3000 window-mid + 50694 reviewed rest

3773390: 429, sleeping 90s

3182170: 429, sleeping 90s

2336650: 429, sleeping 90s

== bkrhggaew ==
queue: 3889 (hit=2289, mid sampled 800, low sampled 800; 0 already done)

100/3889 (hit)

200/3889 (hit)

300/3889 (hit)

Bash (./.venv/Scripts/python.exe -c " import sqlite3, time h = sqlite3.connect(r'E:\a3...)

Exit code 127
/usr/bin/bash: line 10: ./.venv/Scripts/python.exe: No such file or directory

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe -c " import sqlite3, tim...)

histogram done: 30077

appdetails ok: 18434 | failed: 0

appdetails fetched last 10min: 344

reviews_text done: 327 | reviews stored: 20495

Yes — everything's healthy. After the kill:

  • appdetails: the 429 throttling cleared — it fetched 344 games in the last 10 minutes, which is essentially its full pace (1 req/1.6s). 18,434 stored, 0 failures. The 429 lines in the log were from the doubled-rate period.
  • histogram: 30,077 done, ~4.6K left in the queue — should finish in about an hour.
  • reviews_text (#12's crawl): 327 games / 20,495 reviews stored, working through the hit group.

All three checkpoint per-row, so nothing from the overlap period was lost or duplicated in the data — worst case Steam served us a few hundred responses twice and the second write was an idempotent replace.

Still holding your call from before: proceed to #6 (whitespace map), or dig deeper into #5 first (e.g. a scored format-vs-experience table, or a concrete look at entering the Crime/Schedule I window)?

For the gold rush analysis, a lot of your conclusion relies on the tag being right, but with Vampire Survivors for instance, it took Valve 5 years to add the Bullet Heaven tag. Does that change your analysis at all? Or is that an isolated example? Because often a "new goldrush" means new interesting gameplay, and that sometimes doesn't fit well into existing tags.

Excellent objection — let me check what the data actually says about the VS case before answering: what tags VS carries in our top-7 data, and what the Bullet Heaven tag's panel looks like without it.

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe - <<'EOF' import sys sys...)

Vampire Survivors: ['Action Roguelike', 'Bullet Hell', 'Vampires', 'Roguelite', 'Pixel Graphics', '2D', 'Indie']

Brotato: ['Roguelike', 'Singleplayer', 'Action Roguelike', 'Bullet Hell', 'Bullet Heaven', 'Local Co-Op', 'Multiplayer']

20 Minutes Till Dawn: ['Action Roguelike', 'Bullet Hell', 'Survival', 'Roguelite', "Shoot 'Em Up", 'Horror', 'Top-Down Shooter']

Rogue: Genesia: ['Bullet Heaven', 'Bullet Hell', 'Action Roguelike', 'Roguelite', 'Arcade', 'Twin Stick Shooter', 'PvE']

Halls of Torment: ['Action Roguelike', 'Roguelite', 'Bullet Hell', 'Pixel Graphics', 'Dark Fantasy', 'Action RPG', 'Roguelike']

HoloCure - Save the Fans!: ['Pixel Graphics', 'Bullet Heaven', 'Anime', 'Action Roguelike', 'Bullet Hell', 'Cute', 'Roguelite']



Bullet Heaven tag: 241 carriers. Top 8 by est revenue:

  Megabonk (2025-09-18) $20.4M

  Deep Rock Galactic: Survivor (2025-09-17) $11.1M

  Soulstone Survivors (2025-06-17) $6.6M

  Brotato (2023-06-23) $5.6M

  Rogue: Genesia (2025-03-07) $2.7M

  Yet Another Zombie Survivors (2023-07-13) $2.5M

  The Spell Brigade (2026-04-29) $2.2M

  Jotunnslayer: Hordes of Hel (2025-09-03) $2.0M

Earliest releases carrying it: [('Tower of Guns', '2014-03-04'), ('Bullet Heaven 2', '2015-12-07'), ('Geometry Arena', '2021-06-01'), ('Dextram', '2021-11-08'), ('HordeCore', '2022-03-02')]

It changes one important part of it — the live alarm — and it's not isolated; it's systematic, and it hits exactly the rushes most worth catching. But it doesn't break the backtest, and interestingly it makes the core conclusion stronger, not weaker. Let me walk through what the data says.

What actually happened with VS in my data

Three separate mechanisms are stacked on top of each other, and it's worth separating them:

  1. Valve vocabulary lag (your point): "Bullet Heaven" didn't exist as a taggable concept when VS blew up. The earliest games carrying it in my catalog are false positives (Tower of Guns 2014, Bullet Heaven 2 — a literal title collision from a different genre); the tag only becomes a real genre marker around 2022 with Rogue: Genesia / Brotato / HoloCure.
  2. Top-7 truncation + vote inertia (my data's limitation): even today, Vampire Survivors doesn't carry Bullet Heaven in its top-7 tags — and neither do 20 Minutes Till Dawn or Halls of Torment. Their pre-tag vocabulary (Action Roguelike, Bullet Hell, Vampires) accumulated votes first and permanently occupies the top slots. So the genre's defining game is invisible to its own genre tag panel, five years later.
  3. Tag drift/vandalism (minor): the StS2-under-"Political" artifact.

Why the backtest survived anyway

The trigger game's review flow has to land somewhere — every game carries some tags. So the detector caught the VS rush in 2022Q1 through proxy tags: Bullet Hell (top-1 share 83% = VS) and Vampires (94% = VS). Same for the other vocabulary-lagged rushes: DUSK fired under Old School (Boomer Shooter didn't exist yet), The Exit 8 under Underground (there's still no "8-like" tag). Of my nine durable format rushes, at least three were born tagless and detected via semantically wrong but statistically functional proxies. Detection is robust; the flow can't hide.

What vocabulary lag actually corrupts: the measured payoff — downward

Here's the part that strengthens the conclusion. The follower windows I measured on proxy tags are diluted mixtures: "Bullet Hell" window h50 was 8→14% (touhou-likes mixed in with survivors-likes), "Old School" 0→17%. But last session's tag scan — which uses today's vocabulary retroactively, i.e. after the community back-tagged everything — shows what the true format-followers earned: Bullet Heaven 2022 cohort ~57% h50, Boomer Shooter 71%. So for exactly the most-novel rushes, my anatomy table understates the window payoff by 3–4×. The −3pt base rate and the quiet-tag/hot-tag split stand (those are computed over fired triggers), but the right tail of the format-rush distribution is fatter than table showed. New-format rushes pay more than my numbers said — when you can see them.

What it genuinely breaks: the current-edge scan as an early-warning system

The backtest gets rescued by retro-tagging; the live edge doesn't. A new format born last quarter shows up only in its proxy tags, and whether the alarm fires depends on proxy size: VS moved Bullet Hell because Bullet Hell was mid-sized. A new format whose only tags are Action + Roguelite + 2D would need to be enormous before it moves those panels — the alarm would fire late or never. And "new interesting gameplay that doesn't fit existing tags" is, as you say, the defining property of the best triggers. So the tag panel is the wrong primary sensor for the live edge. It's a fine measurement layer (once vocabulary catches up, for sizing follower returns), but the alarm itself should be tag-free.

The fix is cheap with data already in hand: a game-level breakout detector — first-90-day review velocity per game from the histograms, flag indie-priced games whose early velocity is extreme (top fraction of a percent relative to their price cohort), no tags involved anywhere. That list is short enough per quarter that the "what format is this, and is it a format at all" step stays human judgment — which it always was; the tag never told us format-vs-experience either. The tag panels then get consulted second, to check whether supply has reacted anywhere near the trigger.

Want me to build that velocity detector and re-run the current edge with it? It would give us the 2025–2026 breakout list independent of vocabulary — a direct check on whether the tag-based scan missed anything recent (my current-edge conclusions, including "no open build-lane rush," are exposed to exactly this blind spot until then).

Sure.

Building the velocity detector now. Design: for every paid indie-priced game (≤$25) with histogram data, compute reviews in its first 90 days (release month + 2), rank within release quarter — no tags anywhere in the signal. Validate 2018→2024 quarters against the known triggers, then read the 2025Q1–2026Q2 edge for breakouts the tag panels missed.

Write (E:\a327ex\steam-market\scripts\breakout.py)

File created successfully at: E:\a327ex\steam-market\scripts\breakout.py (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/breakout.py > reports/raw_breakout.txt 2>&1; ...)

Exit code 2
/usr/bin/bash: line 1: reports/raw_breakout.txt: No such file or directory
wc: reports/raw_breakout.txt: No such file or directory
grep: reports/raw_breakout.txt: No such file or directory

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/breakout.py > re...)

4:=== 2018Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
184:=== 2021Q4 — top 10 indie-priced (<=$25) by first-90-day reviews ===
196:=== 2022Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
280:=== 2023Q4 — top 10 indie-priced (<=$25) by first-90-day reviews ===
292:=== 2024Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===

Read (E:\a327ex\steam-market\reports\raw_breakout.txt)

4    === 2018Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
5      1. v90= 3,560  $20 pub     Sword Art Online: Fatal Bullet               life=  5,144 est=$   3.7M | Anime,RPG,Character Customization,Action,Multiplayer
6      2. v90= 2,474  $15 selfpub Into the Breach                              life= 12,518 est=$   6.7M | Strategy,Turn-Based Strategy,Indie,Pixel Graphics,Turn-Based Tactics
7      3. v90= 1,461  $20 pub     Celeste                                      life= 60,239 est=$  43.2M | Precision Platformer,Difficult,Great Soundtrack,Pixel Graphics,Indie
8      4. v90= 1,134  $11 selfpub 永远消失的幻想乡 ~ The Disappearing of Gensokyo      life=    507 est=$   0.2M | Anime,Bullet Hell,Female Protagonist,Faith,Cute
9      5. v90= 1,029  $10 selfpub Dungreed                                     life=  2,499 est=$   0.9M | Action Roguelike,Pixel Graphics,Roguelite,Roguelike,Action
10     6. v90=   974  $25 pub     東方憑依華 ~ Antinomy of Common Flowers.          life=  1,761 est=$   1.6M | Great Soundtrack,Fighting,2D Fighter,Female Protagonist,Faith
11     7. v90=   790  $15 pub     Heroes of Hammerwatch                        life=  4,672 est=$   2.5M | Roguelite,Action Roguelike,Co-op,Pixel Graphics,Multiplayer
12     8. v90=   726  $20 selfpub Ghost of a Tale                              life=  1,992 est=$   1.4M | Adventure,Stealth,Atmospheric,Cute,Singleplayer
13     9. v90=   672  $10 selfpub We Were Here Too                             life=  3,601 est=$   1.3M | Online Co-Op,Escape Room,Puzzle,Co-op,Horror
14    10. v90=   616  $25 pub     Ash of Gods: Redemption                      life=  1,095 est=$   1.0M | Singleplayer,RPG,Turn-Based Combat,Story Rich,Isometric
15  
16  === 2018Q2 — top 10 indie-priced (<=$25) by first-90-day reviews ===
17     1. v90= 8,536  $20 selfpub The Forest                                   life=176,877 est=$ 126.9M | Open World Survival Craft,Survival,Horror,Open World,Crafting
18     2. v90= 2,341  $16 pub     Wizard of Legend                             life=  7,313 est=$   4.2M | Action Roguelike,Pixel Graphics,Roguelike,Dungeon Crawler,Local Co-Op
19     3. v90= 2,137  $20 pub     Pillars of Eternity II: Deadfire             life=  8,253 est=$   5.9M | RPG,Party-Based RPG,Isometric,CRPG,Story Rich
20     4. v90= 1,646  $15 selfpub FAR: Lone Sails                              life=  8,889 est=$   4.8M | Atmospheric,Adventure,Post-apocalyptic,Singleplayer,Exploration
21     5. v90= 1,575  $20 pub     Moonlighter                                  life=  7,194 est=$   5.2M | Hack and Slash,Pixel Graphics,Dungeon Crawler,Roguelite,Roguelike
22     6. v90= 1,329  $15 pub     Agony                                        life=    923 est=$   0.5M | Sexual Content,Nudity,Horror,Gore,Demons
23     7. v90= 1,154  $15 pub     Bus Simulator 18                             life=  1,919 est=$   1.0M | Simulation,Automobile Sim,Driving,Multiplayer,Realistic
24     8. v90=   884  $10 selfpub Bloodstained: Curse of the Moon              life=  1,977 est=$   0.7M | Action,Pixel Graphics,Retro,Platformer,2D
25     9. v90=   881  $20 pub     Farm Manager 2018                            life=    781 est=$   0.6M | Farming Sim,Indie,Management,Casual,Agriculture
26    10. v90=   850  $12 pub     Monster Prom                                 life=  9,006 est=$   3.9M | Dating Sim,Comedy,LGBTQ+,Multiplayer,Choices Matter
27  
28  === 2018Q3 — top 10 indie-priced (<=$25) by first-90-day reviews ===
29     1. v90= 6,406  $10 selfpub Chinese Parents                              life=  1,580 est=$   0.6M | Life Sim,Psychological Horror,Memes,Simulation,Casual
30     2. v90= 4,917  $20 pub     Pathfinder: Kingmaker — Enhanced Plus Editio life= 17,700 est=$  12.7M | RPG,Party-Based RPG,Fantasy,CRPG,Isometric
31     3. v90= 3,294  $20 pub     The Walking Dead: The Final Season           life=  6,412 est=$   4.6M | Story Rich,Choices Matter,Zombies,Adventure,Choose Your Own Adventure
32     4. v90= 3,267  $20 pub     Graveyard Keeper                             life= 17,389 est=$  12.5M | Pixel Graphics,Crafting,RPG,Simulation,Management
33     5. v90= 2,657  $25 selfpub Dead Cells                                   life= 44,043 est=$  39.5M | Adventure,Roguelike,Pixel Graphics,Metroidvania,Action Roguelike
... [30 more lines]

Validation era looks right (DUSK, Unheard, StS, Celeste all surface at the top of their quarters). Now the key quarters: VS, Exit 8, Balatro — then the 2025–26 edge.

Read (E:\a327ex\steam-market\reports\raw_breakout.txt)

184  === 2021Q4 — top 10 indie-priced (<=$25) by first-90-day reviews ===
185    1. v90=48,897  $20 pub     Halo Infinite                                life=138,808 est=$  98.6M | Free to Play,FPS,Multiplayer,Singleplayer,Shooter
186    2. v90=42,578  $20 pub     Inscryption                                  life= 75,851 est=$  54.4M | Card Battler,Card Game,Story Rich,Deckbuilding,Horror
187    3. v90=23,477  $20 pub     Bright Memory: Infinite                      life=  4,735 est=$   3.4M | Action,Female Protagonist,Sexual Content,FPS,Indie
188    4. v90=16,515  $20 selfpub Farming Simulator 22                         life= 25,479 est=$  18.3M | Simulation,Farming Sim,Co-op,Multiplayer,Agriculture
189    5. v90=14,767  $20 pub     Gunfire Reborn                               life= 36,587 est=$  26.3M | Roguelite,FPS,Roguelike,Online Co-Op,Co-op
190    6. v90= 7,507  $23 pub     Fate Seeker II                               life= 11,343 est=$   9.2M | RPG,Martial Arts,Action RPG,Puzzle,Exploration
191    7. v90= 6,931  $20 pub     Unpacking                                    life= 22,658 est=$  16.3M | Relaxing,Cute,Casual,Pixel Graphics,Organizing
192    8. v90= 5,957  $11 pub     小白兔电商~Bunny e-Shop                           life=  9,177 est=$   3.6M | Capitalism,Visual Novel,Dating Sim,Anime,Simulation
193    9. v90= 4,694  $20 selfpub WorldBox - God Simulator                     life= 28,918 est=$  20.8M | Sandbox,God Game,Simulation,Pixel Graphics,Colony Sim
194   10. v90= 4,107  $16 pub     F.I.S.T.: Forged In Shadow Torch             life=    731 est=$   0.4M | Metroidvania,Platformer,Action,Steampunk,Adventure
195 
196 === 2022Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
197    1. v90=29,232   $2 pub     Mirror 2: Project X                          life=  2,425 est=$   0.2M | 3D,Match 3,Anime,Female Protagonist,Visual Novel
198    2. v90=14,683  $18 pub     暖雪 Warm Snow                                 life=  1,301 est=$   0.8M | Action Roguelike,Roguelite,Martial Arts,Action-Adventure,Roguelike
199    3. v90= 9,924  $16 pub     NEEDY STREAMER OVERLOAD                      life= 17,249 est=$   9.9M | Psychological Horror,Anime,Visual Novel,Sexual Content,Cute
200    4. v90= 4,564  $24 selfpub Internet Cafe Simulator 2                    life=  2,093 est=$   1.8M | Simulation,Management,3D,Exploration,Memes
201    5. v90= 2,766   $8 selfpub Iron Lung                                    life=  8,335 est=$   2.4M | Horror,Atmospheric,Psychological Horror,Submarine,Underwater
202    6. v90= 2,519  $25 selfpub ANNO: Mutationem                             life=  1,902 est=$   1.7M | RPG,Cyberpunk,Pixel Graphics,Female Protagonist,2.5D
203    7. v90= 2,377  $25 selfpub 嗜血印 Bloody Spell                             life=  2,396 est=$   2.1M | Nudity,Sexual Content,Female Protagonist,Action RPG,Hack and Slash
204    8. v90= 2,061  $15 selfpub Rogue Tower                                  life=  4,347 est=$   2.3M | Tower Defense,Strategy,Roguelike,Casual,Procedural Generation
205    9. v90= 2,041  $18 pub     Hero's Hour                                  life=  2,453 est=$   1.6M | Turn-Based,Pixel Graphics,Strategy,Turn-Based Strategy,Singleplayer
206   10. v90= 1,923  $25 selfpub Nobody Saves the World                       life=  2,256 est=$   2.0M | Singleplayer,Indie,Co-op,Multiplayer,Action
207 
208 === 2022Q2 — top 10 indie-priced (<=$25) by first-90-day reviews ===
209    1. v90=30,250  $20 pub     Raft                                         life=129,202 est=$  92.7M | Survival,Multiplayer,Open World Survival Craft,Co-op,Crafting
210    2. v90=13,039  $25 selfpub The Stanley Parable: Ultra Deluxe            life= 24,018 est=$  21.5M | Multiple Endings,Choices Matter,Comedy,Walking Simulator,First-Person
211    3. v90= 8,007   $7 pub     Inside the Backrooms                         life= 10,222 est=$   2.6M | Horror,Multiplayer,Survival Horror,Puzzle,Psychological Horror
212    4. v90= 6,682  $25 pub     Teenage Mutant Ninja Turtles: Shredder's Rev life=  5,913 est=$   5.3M | Beat 'em up,Multiplayer,Pixel Graphics,Side Scroller,Co-op Campaign
213    5. v90= 6,032   $8 selfpub Stacklands                                   life= 11,751 est=$   3.4M | Card Game,Management,Survival,Roguelite,Card Battler
... [6 more lines]

Bash (./.venv/Scripts/python.exe - <<'EOF' import sqlite3, sys sys.path.insert(0, 'E:/...)

<stdin>:10: DeprecationWarning: datetime.datetime.utcfromtimestamp() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.fromtimestamp(timestamp, datetime.UTC).

(1794680, 'Vampire Survivors', 'Oct 20, 2022', 499, 127089)

(2379780, 'Balatro', 'Feb 20, 2024', 1499, 102171)

(2653790, 'The Exit 8', 'Nov 29, 2023', 399, 5005)

(2780270, 'Dead end Exit 8', 'Feb 17, 2024', 399, 111)

(2878720, 'Unable to Exit 8', 'Jul 18, 2024', 499, 138)

(2924030, 'Overtime Heroes Exit 8', 'May 15, 2024', 499, 27)

(3164500, 'Schedule I', 'Mar 24, 2025', 1999, 195048)

(3193770, 'The Exit 8 VR', 'Sep 19, 2024', 768, 61)

(3265700, 'Vampire Crawlers: The Turbo Wildcard from Vampire Survivors', 'Apr 21, 2026', 999, 8008)

(3435600, 'PEXIT 8', 'Feb 10, 2025', 0, 253)

(3676450, 'Corridor Exit 8', 'Jun 27, 2025', 199, 37)

(4833100, 'Backrooms: Exit 8', 'Jun 25, 2026', 399, None)

VS earliest rollups: [('2021-12', 11), ('2022-01', 18399), ('2022-02', 34649), ('2022-03', 13920), ('2022-04', 18919), ('2022-05', 11518)]

Edit (E:\a327ex\steam-market\scripts\breakout.py)

The file E:\a327ex\steam-market\scripts\breakout.py has been updated successfully. (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\scripts\breakout.py)

The file E:\a327ex\steam-market\scripts\breakout.py has been updated successfully. (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/breakout.py > reports/raw_breakout_v2.txt 2>&...)

=== 2021Q4 — top 10 indie-priced (<=$25) by first-90-day reviews ===
   1. v90=131,223  $20 pub     Halo Infinite                                life=138,808 est=$  98.6M | Free to Play,FPS,Multiplayer,Singleplayer,Shooter
   2. v90=53,059   $5 selfpub Vampire Survivors                            life=127,089 est=$  22.8M | Action Roguelike,Bullet Hell,Vampires,Roguelite,Pixel Graphics
   3. v90=42,578  $20 pub     Inscryption                                  life= 75,851 est=$  54.4M | Card Battler,Card Game,Story Rich,Deckbuilding,Horror
   4. v90=23,477  $20 pub     Bright Memory: Infinite                      life=  4,735 est=$   3.4M | Action,Female Protagonist,Sexual Content,FPS,Indie
   5. v90=16,515  $20 selfpub Farming Simulator 22                         life= 25,479 est=$  18.3M | Simulation,Farming Sim,Co-op,Multiplayer,Agriculture
   6. v90= 7,507  $23 pub     Fate Seeker II                               life= 11,343 est=$   9.2M | RPG,Martial Arts,Action RPG,Puzzle,Exploration
   7. v90= 6,931  $20 pub     Unpacking                                    life= 22,658 est=$  16.3M | Relaxing,Cute,Casual,Pixel Graphics,Organizing
   8. v90= 5,957  $11 pub     小白兔电商~Bunny e-Shop                           life=  9,177 est=$   3.6M | Capitalism,Visual Novel,Dating Sim,Anime,Simulation
   9. v90= 4,694  $20 selfpub WorldBox - God Simulator                     life= 28,918 est=$  20.8M | Sandbox,God Game,Simulation,Pixel Graphics,Colony Sim
  10. v90= 4,107  $16 pub     F.I.S.T.: Forged In Shadow Torch             life=    731 est=$   0.4M | Metroidvania,Platformer,Action,Steampunk,Adventure

=== 2022Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
   1. v90=29,232   $2 pub     Mirror 2: Project X                          life=  2,425 est=$   0.2M | 3D,Match 3,Anime,Female Protagonist,Visual Novel
   2. v90=14,683  $18 pub     暖雪 Warm Snow                                 life=  1,301 est=$   0.8M | Action Roguelike,Roguelite,Martial Arts,Action-Adventure,Roguelike
   3. v90= 9,924  $16 pub     NEEDY STREAMER OVERLOAD                      life= 17,249 est=$   9.9M | Psychological Horror,Anime,Visual Novel,Sexual Content,Cute
=== 2023Q4 — top 10 indie-priced (<=$25) by first-90-day reviews ===
   1. v90=189,939  $10 selfpub Lethal Company                               life=275,837 est=$  98.9M | Online Co-Op,Horror,First-Person,Co-op,Survival Horror
   2. v90=30,694  $10 selfpub Love Is All Around                           life=  1,519 est=$   0.5M | Dating Sim,Sexual Content,FMV,Singleplayer,Visual Novel
   3. v90=22,793  $15 pub     Risk of Rain Returns                         life= 16,699 est=$   9.0M | Action Roguelike,Online Co-Op,Multiplayer,2D,PvE
   4. v90=11,444  $12 selfpub The Coffin of Andy and Leyley                life= 18,717 est=$   8.1M | Psychological,Dark Comedy,Story Rich,Multiple Endings,Psychological Horror
   5. v90=11,226   $7 selfpub Death Must Die                               life= 13,926 est=$   3.5M | Early Access,Action Roguelike,Bullet Hell,Roguelite,Pixel Graphics
   6. v90= 8,130  $25 pub     For The King II                              life=  5,317 est=$   4.8M | Adventure,RPG,Strategy,Party-Based RPG,Board Game
   7. v90= 6,976  $20 selfpub The Front                                    life=  3,716 est=$   2.7M | Open World Survival Craft,Survival,Multiplayer,Crafting,Base Building
   8. v90= 6,020  $18 pub     Slay the Princess — The Pristine Cut         life= 22,856 est=$  14.8M | Visual Novel,Choices Matter,Psychological Horror,Story Rich,Horror
   9. v90= 5,774  $15 selfpub Stronghold: Definitive Edition               life=  3,099 est=$   1.7M | City Builder,Strategy,Real Time Tactics,Medieval,Sandbox
  10. v90= 4,590  $16 pub     Magicraft                                    life=  3,511 est=$   2.0M | Action Roguelike,Roguelite,Bullet Hell,Looter Shooter,Roguelike

=== 2024Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
   1. v90=30,125  $15 pub     Balatro                                      life=102,171 est=$  55.0M | Card Game,Roguelike,Roguelike Deckbuilder,Deckbuilding,Singleplayer
... [11 more lines]

Bash (sed -n '/=== 2025Q1/,$p' reports/raw_breakout_v2.txt)

=== 2025Q1 — top 10 indie-priced (<=$25) by first-90-day reviews ===
   1. v90=187,758  $20 selfpub Schedule I                                   life=195,048 est=$ 140.0M | Simulation,Crime,Co-op,Management,Multiplayer
   2. v90=129,330  $10 selfpub R.E.P.O.                                     life=134,257 est=$  48.2M | Horror,Online Co-Op,Multiplayer,Comedy,Co-op
   3. v90=15,551  $25 pub     Sultan's Game                                life=  1,284 est=$   1.2M | Singleplayer,Story Rich,RPG,Card Game,Strategy
   4. v90=12,882   $5 pub     A Game About Digging A Hole™                 life= 11,122 est=$   2.0M | Exploration,Mining,Sandbox,Voxel,Horror
   5. v90= 8,973   $5 selfpub Nubby's Number Factory                       life= 16,311 est=$   2.9M | Roguelike,Strategy,Arcade,Surreal,Singleplayer
   6. v90= 6,310   $6 selfpub FlyKnight                                    life=  9,081 est=$   2.0M | Dungeon Crawler,Souls-like,Online Co-Op,First-Person,Old School
   7. v90= 5,984  $25 pub     Drive Beyond Horizons                        life=  6,884 est=$   6.2M | Early Access,Driving,Exploration,Survival,Automobile Sim
   8. v90= 5,386  $10 selfpub The Quinfall                                 life=  3,326 est=$   1.2M | Massively Multiplayer,MMORPG,Open World,RPG,Character Customization
   9. v90= 4,558  $20 pub     Legend of Heroes: Three Kingdoms             life=  6,547 est=$   4.7M | Early Access,Simulation,Strategy,RPG,Turn-Based Strategy
  10. v90= 4,131   $8 selfpub The Headliners                               life=  4,212 est=$   1.2M | Online Co-Op,Horror,Co-op,Funny,Multiplayer
  -- uncapped top 5 (any price/F2P):
   1. v90=187,758  $20 selfpub Schedule I                                   life=195,048 est=$ 140.0M | Simulation,Crime,Co-op,Management,Multiplayer
   2. v90=130,226  $70 selfpub Monster Hunter Wilds                         life= 83,233 est=$ 209.1M | Hunting,Action,Multiplayer,Online Co-Op,Co-op
   3. v90=129,330  $10 selfpub R.E.P.O.                                     life=134,257 est=$  48.2M | Horror,Online Co-Op,Multiplayer,Comedy,Co-op
   4. v90=73,693  $60 pub     Kingdom Come: Deliverance II                 life= 65,358 est=$ 140.8M | RPG,Medieval,Open World,Singleplayer,Story Rich
   5. v90=52,844  $30 pub     Grand Theft Auto V Enhanced                  life= 66,625 est=$  71.7M | Open World,Sexual Content,Action,Multiplayer,Crime

=== 2025Q2 — top 10 indie-priced (<=$25) by first-90-day reviews ===
   1. v90=111,099   $8 pub     PEAK                                         life=132,076 est=$  37.9M | Multiplayer,Online Co-Op,Co-op,Physics,Adventure
   2. v90=68,084  $25 selfpub DELTARUNE                                    life= 58,375 est=$  52.4M | Story Rich,Great Soundtrack,Pixel Graphics,Funny,RPG
   3. v90=44,040   $7 pub     Revenge on gold diggers                      life=    526 est=$   0.1M | RPG,Story Rich,Dating Sim,Interactive Fiction,Strategy
   4. v90=10,299  $20 pub     9 Kings                                      life=  9,592 est=$   6.9M | Strategy,Roguelike,Card Game,Deckbuilding,Roguelike Deckbuilder
   5. v90= 6,365  $20 pub     Haste                                        life=  8,577 est=$   6.2M | Fast-Paced,Parkour,Roguelite,3D Platformer,Female Protagonist
   6. v90= 5,299  $25 pub     Monster Train 2                              life=  4,935 est=$   4.4M | Roguelike Deckbuilder,Card Game,Roguelike,Deckbuilding,Turn-Based Strategy
   7. v90= 5,220   $3 pub     Tower Wizard                                 life=  6,926 est=$   0.7M | Incremental,Idler,Resource Management,Strategy,Fantasy
   8. v90= 4,907  $10 selfpub Aviassembly                                  life=  6,254 est=$   2.2M | Building,Physics,Sandbox,Flight,Transportation
   9. v90= 4,518  $25 selfpub Deadzone: Rogue                              life=  8,313 est=$   7.5M | Roguelike,FPS,Online Co-Op,PvE,Roguelite
  10. v90= 4,392  $25 pub     Into the Dead: Our Darkest Days              life=  2,889 est=$   2.6M | Zombies,Survival Horror,Post-apocalyptic,Horror,Action
  -- uncapped top 5 (any price/F2P):
... [77 more lines]

Write (E:\a327ex\steam-market\reports\09-breakout.md)

File created successfully at: E:\a327ex\steam-market\reports\09-breakout.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

Done — breakout.py + 09-breakout.md. And you were right in a way I can now quantify: the tag blindness was hiding the single most relevant finding of the whole gold-rush analysis for you. Full read:

One bug worth knowing about: Steam resets EA release dates

First run missed VS entirely — Steam's catalog lists Vampire Survivors' release as Oct 20, 2022 (the 1.0 date), erasing its Dec 2021 EA launch. Its review histogram tells the truth (Dec 2021: 11 reviews → Jan 2022: 18,399 → Feb: 34,649). Fix: anchor each game's clock on min(catalog date, first histogram month). This matters beyond VS — every EA-then-1.0 breakout was being filed in the wrong quarter.

Validation: the tag-free detector sees everything

Ranking paid ≤$25 games by first-90-day reviews within each quarter, with zero tag involvement, every trigger we know lands at #1–2 of its quarter: DUSK (2018Q4), Unheard + Slay the Spire (2019Q1), VS #2 of 2021Q4 (v90=53K, behind only Halo Infinite), Lethal Company + Love Is All Around as #1+#2 of 2023Q4, Balatro + Supermarket Simulator as #1+#2 of 2024Q1, Schedule I + R.E.P.O. as #1+#2 of 2025Q1. The quarterly top-10 reads like a history of indie gold rushes. This is now the primary alarm; the tag panels demote to measurement layer.

What the tag detector missed on the current edge — two big things

1. The dominant cheap-indie money lane of 2025–26 is tag-invisible: co-op physics/horror virals. R.E.P.O. ($10, v90=129K, ~$48M est), PEAK ($8, 111K, ~$38M), RV There Yet? ($8, ~$8.5M), MECCHA CHAMELEON ($6, 48K in its first month), plus Far Far West, YAPYAP, The Headliners, Gamble With Your Friends. This is the Lethal Company lineage, and no tag panel can ever fire on it because Co-op/Horror/Multiplayer are oceans — a 129K spike doesn't 4× them. It's not your lane (multiplayer infrastructure + friend-group virality), but it's the structural fact of the ≤$10 market: the biggest cheap-indie money is now overwhelmingly social-viral.

2. There IS a live build-lane format cluster — it just has no tag. My "no open build-lane rush" verdict from the tag scan was exactly the blind spot you predicted. Scattered across Gambling/Incremental/Arcade/Roguelite vocabulary, invisible to every panel:

Game Quarter Price Est What it is
Nubby's Number Factory 2025Q1 $5, selfpub ~$2.9M pachinko × item synergies (Peglin×Balatro)
CloverPit 2025Q3 $10 ~$4.4M slot-machine roguelite, CRT-grunge art
BALL x PIT 2025Q4 $15 ~$7.9M breakout-physics × build/base systems
Scritchy Scratchy 2026Q1 $7 ~$1.6M scratch-card incremental
Gamble With Your Friends 2026Q2 $8 ~$2.6M the multiplayer variant

Call it luck-machine build roguelites: a physics/chance toy you watch resolve (pachinko board, slot machine, bouncing balls) + item/synergy depth on top, at $5–15, with deliberately modest art (Nubby's is aggressively crude; CloverPit is grunge; BALL x PIT is pixel). One new instance per quarter for five straight quarters, each $1.5M+, and even poncle just shipped into the adjacent space (Vampire Crawlers, $10, VS×deckbuilder, ~$2.9M in 2 months). This is Balatro's actual follower wave — not the deckbuilders chasing its tag, but the games chasing its dopamine shape: watch-the-machine-pay-out + build between rounds. That's a format, it's in a quiet no-name space, and it's the closest thing to an open door in your lane the data shows. Notably it's also art-gate-resistant and price-gate-tolerant — the two walls that everything else in your neighborhood runs into.

3. Megabonk (2025Q3, $10, ~$20.4M): the survivors-like still pays a format-refresher (3D + meme aesthetics) four years after VS. Also tag-missed — Bullet Heaven's baseline flow was already too high to spike.

Standard caveats: v90 counts negative reviews too, so controversy surfaces (Revenge on gold diggers is a Chinese review-drama, Mirror 2 a review-bomb — the human read filters these); 2026Q2 rows only have 1–2 months of data; one re-listed old game slipped in (Poker Night).

So, to answer the original question completely: your objection didn't just add a caveat — applying it found the thing. Where next? I can continue to #6 (whitespace map) as planned, or drill this cluster first (e.g., pull the five games' review text from the #12 crawl once it finishes — they're build-tagged so most are in the queue — and see what players actually praise/complain about in luck-machine games).

Are those 2 you mentioned the only 2 current clusters there are or are there more you just didn't tell me?

Not the only two — I curated to what was tag-invisible and lane-relevant, and I should be straight that several other threads were visible in those lists. Rather than answering from memory, let me widen the lens first — top-20 per quarter for the recent six quarters — so the inventory is complete instead of anecdotal.

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/breakout.py --fr...)

170 reports/raw_breakout_recent20.txt

Read (E:\a327ex\steam-market\reports\raw_breakout_recent20.txt)

1    loading catalog...
2   loading rollups...
3   
4   === 2025Q1 — top 20 indie-priced (<=$25) by first-90-day reviews ===
5      1. v90=187,758  $20 selfpub Schedule I                                   life=195,048 est=$ 140.0M | Simulation,Crime,Co-op,Management,Multiplayer
6      2. v90=129,330  $10 selfpub R.E.P.O.                                     life=134,257 est=$  48.2M | Horror,Online Co-Op,Multiplayer,Comedy,Co-op
7      3. v90=15,551  $25 pub     Sultan's Game                                life=  1,284 est=$   1.2M | Singleplayer,Story Rich,RPG,Card Game,Strategy
8      4. v90=12,882   $5 pub     A Game About Digging A Hole™                 life= 11,122 est=$   2.0M | Exploration,Mining,Sandbox,Voxel,Horror
9      5. v90= 8,973   $5 selfpub Nubby's Number Factory                       life= 16,311 est=$   2.9M | Roguelike,Strategy,Arcade,Surreal,Singleplayer
10     6. v90= 6,310   $6 selfpub FlyKnight                                    life=  9,081 est=$   2.0M | Dungeon Crawler,Souls-like,Online Co-Op,First-Person,Old School
11     7. v90= 5,984  $25 pub     Drive Beyond Horizons                        life=  6,884 est=$   6.2M | Early Access,Driving,Exploration,Survival,Automobile Sim
12     8. v90= 5,386  $10 selfpub The Quinfall                                 life=  3,326 est=$   1.2M | Massively Multiplayer,MMORPG,Open World,RPG,Character Customization
13     9. v90= 4,558  $20 pub     Legend of Heroes: Three Kingdoms             life=  6,547 est=$   4.7M | Early Access,Simulation,Strategy,RPG,Turn-Based Strategy
14    10. v90= 4,131   $8 selfpub The Headliners                               life=  4,212 est=$   1.2M | Online Co-Op,Horror,Co-op,Funny,Multiplayer
15    11. v90= 3,826  $20 pub     Heroes of Hammerwatch II                     life=  4,078 est=$   2.9M | RPG,Action Roguelike,Action RPG,Action,Dungeon Crawler
16    12. v90= 3,357  $18 pub     Urban Myth Dissolution Center                life=    615 est=$   0.4M | Visual Novel,Psychological Horror,Adventure,Pixel Graphics,Singleplayer
17    13. v90= 3,267   $9 pub     Tiny Pasture                                 life=  1,164 est=$   0.4M | Idler,Cute,Farming Sim,Incremental,Pixel Graphics
18    14. v90= 3,251  $19 pub     Jotunnslayer: Hordes of Hel                  life=  2,946 est=$   2.0M | Action Roguelike,Bullet Heaven,Roguelite,Action RPG,Hack and Slash
19    15. v90= 3,240   $1 selfpub Your Mother                                  life=    905 est=$   0.0M | Desktop Companion,Anime,Female Protagonist,Violent,2D
20    16. v90= 3,102   $8 selfpub Nunholy                                      life=  1,893 est=$   0.5M | Female Protagonist,Action Roguelike,Sexual Content,Gothic,Singleplayer
21    17. v90= 3,022   $9 pub     Matchmaking Inc.                             life=  5,610 est=$   1.8M | Casual,Dating Sim,RPG,Time Management,Multiple Endings
22    18. v90= 2,530  $20 pub     KARMA: The Dark World                        life=    827 est=$   0.6M | Walking Simulator,Psychological Horror,Horror,First-Person,Atmospheric
23    19. v90= 2,508  $10 selfpub 灾厄黑龙与谎言公主                                    life=  3,578 est=$   1.3M | Visual Novel,RPG,Otome,Dating Sim,Female Protagonist
24    20. v90= 2,504  $10 pub     Look Outside                                 life=  8,757 est=$   3.1M | RPG,Survival Horror,Horror,Pixel Graphics,Lovecraftian
25    -- uncapped top 5 (any price/F2P):
26     1. v90=187,758  $20 selfpub Schedule I                                   life=195,048 est=$ 140.0M | Simulation,Crime,Co-op,Management,Multiplayer
27     2. v90=130,226  $70 selfpub Monster Hunter Wilds                         life= 83,233 est=$ 209.1M | Hunting,Action,Multiplayer,Online Co-Op,Co-op
28     3. v90=129,330  $10 selfpub R.E.P.O.                                     life=134,257 est=$  48.2M | Horror,Online Co-Op,Multiplayer,Comedy,Co-op
29     4. v90=73,693  $60 pub     Kingdom Come: Deliverance II                 life= 65,358 est=$ 140.8M | RPG,Medieval,Open World,Singleplayer,Story Rich
30     5. v90=52,844  $30 pub     Grand Theft Auto V Enhanced                  life= 66,625 est=$  71.7M | Open World,Sexual Content,Action,Multiplayer,Crime
... [141 more lines]

No — there are more. I filtered for "tag-invisible AND new," and that filter dropped several real threads. I also missed two members of the luck-machine cluster in my own list (Slots & Daggers, RACCOIN — it's 7 games, not 5). Here's the complete inventory from the top-20s of the last six quarters (120 games), every recurring thread, with lane-fit for you. "Cluster" here means my judgment grouping, not an algorithm — analysis #10 (description mining) is the mechanical version of this.

The full taxonomy, 2025Q1–2026Q2

A. Co-op physics/horror/comedy virals (Lethal Company lineage) — R.E.P.O. ~$48M, PEAK ~$38M, RV There Yet? ~$8.5M, Far Far West ~$13.4M, Fellowship, MISERY, Jump Space, Deadzone: Rogue, FlyKnight, YAPYAP, The Headliners, MECCHA ~$5.8M, Species: Unknown, MIMESIS, Fears to Fathom. The biggest cheap-indie money, every quarter, tag-invisible as a spike. Not your lane (multiplayer + social virality).

B. Luck-machine build roguelites — now with the two I missed: Nubby's ($2.9M), CloverPit ($4.4M), Slots & Daggers (2025Q4, $8, $1.2M — slot-machine roguelike), BALL x PIT ($7.9M), Scritchy Scratchy ($1.6M), RACCOIN: Coin Pusher Roguelike (2026Q1, $12, $1.0M — coin pusher × deckbuilder), Gamble With Your Friends ($2.6M). Seven in five quarters, accelerating — 2025Q4 onward it's ~2 per quarter, which means the clone wave is already arriving (RACCOIN and Scritchy are plausibly Nubby's/CloverPit followers, shipped within 1–2 quarters, both still cleared $1M). Tag-invisible. Best lane fit.

C. Job/shop/inspection sims (Supermarket Sim lineage, tag-VISIBLE — this is the Shop Keeper/Trading rush from report 08) — Retro Rewind $4.8M, BidKing $2.3M, Waterpark Simulator, Car Dealer Simulator, Cash Cleaner Simulator, Easy Delivery Co., Tiny Bookshop, Hollywood Animal, MineMogul, Drive Beyond Horizons, My Winter Car. Huge and flooded (13→103/Q); 3D-production shaped, art-gated.

D. Inspection/deduction horror (Papers-Please × Exit-8 lineage) — No, I'm not a Human ($15, ~$5.0M), Quarantine Zone: The Last Check (~$3.9M), Subliminal, KARMA. Smaller but persistent; singleplayer, mechanically legible, moderate art demands. Genuinely interesting for a solo dev, though not build-depth shaped.

E. Idler/incremental steady state (your art-immune niche from session 1 — not a rush, a permanent lane) — Tiny Pasture, Tower Wizard ($3, $0.7M), Cast n Chill ($15, $2.6M fishing idler), Keep on Mining! ($5), Shelldiver ($5), Berry Bury Berry ($8, $1.6M), TBH: Task Bar Hero (F2P taskbar idler, 39K v90 in 2 months), Chill with You. One to three entries per quarter at $0.4–2.6M, unbroken since Gnorp/Nodebuster. Overlaps cluster B at the Scritchy/Berry end.

F. Chinese domestic wave — FMV (Road to Empress I+II, Love is All Around 2, Mandate of Heaven $2.8M FMV×strategy), otome/dating drama (Revenge on gold diggers, 月华辉映之刻), wuxia life-sims (龙胤立志传 $5.5M, Sultan's Game). Report 06 territory; wrong stack for you.

G. Roguelite-deckbuilder mainline (the standing Balatro/StS wave, tag-visible) — StS2 $57M, Mewgenics $29.6M, 9 Kings $6.9M, Monster Train 2, The Bazaar, The King is Watching ($15, $1.7M, minimalist pixel kingdom-roguelite — worth a look as proof simple-art entries still land), Super Fantasy Kingdom, Tower Dominion, Heroes of Hammerwatch II. Flooded but deep, >$10 required.

H. Survivors-like refresh — Megabonk $20.4M, Jotunnslayer, Tower of Babel: Survivors. ~1/quarter; pays a format refresher, not a straight clone.

I. Physics toys (singleplayer) — Half Sword ($25 EA, $17.4M), White Knuckle, Haste, Aviassembly, A Game About Digging A Hole ($5, $2.0M), Lucid Blocks, Super Battle Golf. Adjacent to B via "watch physics resolve."

J. Nostalgia re-releases — Stronghold Crusader DE, PvZ Replanted, STALKER Enhanced, Risk of Rain Returns, Backyard Baseball, Poker Night (that 2026Q1 row is this cluster, not gambling). Needs owned IP — closed to you, but it's real volume in every quarter.

K. Singleplayer horror streamer-bait — Look Outside ($10, $3.1M), KinitoPET, ROUTINE, BLACK SOULS, Crisol, Urban Myth Dissolution Center. Steady; art demands vary wildly (session 1's "horror tolerates ugly art at the top end").

L. Cozy organizing — Librarian $2.6M, Is This Seat Taken?, Creature Kitchen, Hozy, PowerWash 2. Tag-visible (Organizing fired + flooded in 1Q); art-gated hard.

M. Extraction shooters — ARC Raiders $280M premium anchor; the indie-viable move was Escape From Duckov ($18, $6.7M): cute-ify the hardcore genre. That "soften a hardcore multiplayer genre into a cheap singleplayer-friendly version" move is itself a repeatable pattern (Duckov did it to Tarkov the way Megabonk did 3D-meme to VS).

N. Premium narrative indie — Dispatch ($30, ~$114M — the quarter's real headline outside your lane), DELTARUNE, Esoteric Ebb (Disco-like, $5.3M), Mixtape, REPLACED. Writing/art-gated.

The honest summary

Fourteen threads, of which the tag detector saw C, F, G, L and half of M — the panels aren't useless, they just systematically miss whatever is newest (A, B, D, H, I). For your constraints (solo, art-limited, build-depth, singleplayer, 1–2 months), the ranking is: B first (fit + tag-invisible + proven at $5–15, but the follower window is visibly closing — RACCOIN/Scritchy are already the second wave), E as the no-rush-needed baseline lane, G the deep-but-expensive standing wave (>$10 entry), D and H as viable one-off format plays. A/C/F/J/L/M/N are structurally out on multiplayer, art, IP, language, or team-size grounds.

Want me to move on to #6 (whitespace map), or first pin down cluster B properly — e.g. check what the histogram trajectories say about whether its window is still open (are CloverPit/BALL x PIT's tails still growing? how did the second wave's launches compare to the first's?), which is a fast query on data in hand?

No, this is enough on this. Move on to the next analysis.

On to #6 — the whitespace map: tag combinations that barely exist but sit adjacent to proven demand. Design: enumerate all tag pairs over the 2023–25 paid window; proven whitespace = pairs with only a handful of occupants where the occupants over-perform — ranked not by raw hit rate (tiny-n noise) but by binomial surprise against the pair's best component tag (so a pair only scores if the combination adds value beyond either ingredient alone). Plus: empty cells (statistically expected but ~unoccupied pairs of two winner tags), a 2026-supply column showing which openings are already being filled, and a build-lane cut.

Write (E:\a327ex\steam-market\scripts\whitespace.py)

File created successfully at: E:\a327ex\steam-market\scripts\whitespace.py (file state is current in your context — no need to Read it back)

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/whitespace.py > ...)

189 reports/raw_whitespace.txt
loading catalog...

window n=39184, baseline h50=14.3%

264 component tags, 24205 occupied pairs



=== PROVEN WHITESPACE (4<=n<=40, hits>=3, P(>=hits | best component) < .05): 345 ===

p=0.0000 Co-op + Open World               n=37  hits=29 ( 78%) compA= 36% compB= 36% med=$ 1765K top=$194.0M medprice=$ 25 n26=8

p=0.0000 Co-op + Base Building            n=24  hits=21 ( 88%) compA= 36% compB= 37% med=$ 1616K top=$194.0M medprice=$ 22 n26=5

p=0.0000 Exploration + Wholesome                n=30  hits=18 ( 60%) compA= 14% compB= 20% med=$   75K top=$ 5.8M medprice=$ 15 n26=6

Read (E:\a327ex\steam-market\reports\raw_whitespace.txt)

6    p=0.0000 Co-op + Open World               n=37  hits=29 ( 78%) compA= 36% compB= 36% med=$ 1765K top=$194.0M medprice=$ 25 n26=8
7   p=0.0000 Co-op + Base Building            n=24  hits=21 ( 88%) compA= 36% compB= 37% med=$ 1616K top=$194.0M medprice=$ 22 n26=5
8   p=0.0000 Exploration + Wholesome                n=30  hits=18 ( 60%) compA= 14% compB= 20% med=$   75K top=$ 5.8M medprice=$ 15 n26=6
9   p=0.0000 Simulation + Wholesome                n=26  hits=16 ( 62%) compA= 19% compB= 20% med=$  344K top=$ 1.7M medprice=$ 12 n26=5
10  p=0.0000 Farming Sim + Cozy                     n=36  hits=21 ( 58%) compA= 23% compB= 24% med=$  167K top=$ 3.1M medprice=$ 16 n26=14
11  p=0.0000 Psychological Horror + Cartoony                 n=11  hits=8  ( 73%) compA= 13% compB= 10% med=$  367K top=$ 0.6M medprice=$  8 n26=0
12  p=0.0000 Multiplayer + Base Building            n=37  hits=26 ( 70%) compA= 32% compB= 37% med=$ 2667K top=$202.3M medprice=$ 20 n26=8
13  p=0.0001 Online Co-Op + Base Building            n=21  hits=17 ( 81%) compA= 38% compB= 37% med=$ 1755K top=$68.5M medprice=$ 24 n26=8
14  p=0.0001 Character Customization + Life Sim                 n=38  hits=20 ( 53%) compA= 23% compB= 23% med=$  195K top=$22.1M medprice=$ 15 n26=10
15  p=0.0002 Detective + Cozy                     n=6   hits=6  (100%) compA= 19% compB= 24% med=$  214K top=$ 1.4M medprice=$ 16 n26=1
16  p=0.0002 3D + JRPG                     n=38  hits=20 ( 53%) compA=  8% compB= 25% med=$ 1243K top=$19.8M medprice=$ 30 n26=11
17  p=0.0002 JRPG + Spectacle fighter        n=6   hits=6  (100%) compA= 25% compB= 24% med=$ 1486K top=$22.6M medprice=$ 45 n26=0
18  p=0.0003 Interactive Fiction + Sexual Content           n=25  hits=19 ( 76%) compA= 14% compB= 40% med=$  115K top=$11.6M medprice=$ 10 n26=5
19  p=0.0004 Multiplayer + Crime                    n=12  hits=10 ( 83%) compA= 32% compB= 27% med=$ 1158K top=$140.0M medprice=$ 20 n26=3
20  p=0.0004 Multiplayer + Anime                    n=32  hits=20 ( 62%) compA= 32% compB= 26% med=$  287K top=$72.1M medprice=$ 25 n26=7
21  p=0.0004 Local Co-Op + Action Roguelike         n=27  hits=13 ( 48%) compA= 18% compB= 14% med=$  111K top=$ 9.0M medprice=$  7 n26=3
22  p=0.0004 PvP + Auto Battler             n=16  hits=9  ( 56%) compA= 15% compB= 17% med=$  254K top=$ 5.2M medprice=$ 15 n26=12
23  p=0.0004 Design & Illustration + First-Person             n=8   hits=6  ( 75%) compA= 17% compB= 13% med=$   87K top=$ 0.7M medprice=$ 15 n26=3
24  p=0.0006 Music + Anime                    n=12  hits=9  ( 75%) compA= 24% compB= 26% med=$  329K top=$ 5.0M medprice=$ 18 n26=3
25  p=0.0006 Online Co-Op + Action RPG               n=27  hits=19 ( 70%) compA= 38% compB= 18% med=$  293K top=$38.2M medprice=$ 20 n26=6
26  p=0.0006 Open World + Martial Arts             n=10  hits=9  ( 90%) compA= 36% compB= 35% med=$ 1275K top=$ 7.5M medprice=$ 18 n26=3
27  p=0.0007 Character Customization + Spectacle fighter        n=5   hits=5  (100%) compA= 23% compB= 24% med=$  274K top=$ 1.2M medprice=$ 20 n26=1
28  p=0.0008 Military + VR                       n=14  hits=10 ( 71%) compA= 27% compB= 16% med=$  135K top=$27.8M medprice=$ 20 n26=0
29  p=0.0008 Visual Novel + Turn-Based Tactics       n=21  hits=11 ( 52%) compA= 20% compB= 17% med=$  182K top=$10.3M medprice=$ 17 n26=3
30  p=0.0008 Retro + Boomer Shooter           n=34  hits=17 ( 50%) compA= 11% compB= 24% med=$  164K top=$ 8.8M medprice=$ 12 n26=7
31  p=0.0009 Dating Sim + Farming Sim              n=13  hits=10 ( 77%) compA= 31% compB= 23% med=$ 1422K top=$14.9M medprice=$ 15 n26=3
32  p=0.0009 Multiple Endings + Sexual Content           n=21  hits=16 ( 76%) compA= 18% compB= 40% med=$  124K top=$ 1.8M medprice=$ 10 n26=3
33  p=0.0009 Violent + VR                       n=10  hits=7  ( 70%) compA= 20% compB= 16% med=$  299K top=$ 2.2M medprice=$ 20 n26=3
34  p=0.0010 Story Rich + Multiplayer              n=11  hits=9  ( 82%) compA= 26% compB= 32% med=$  499K top=$ 6.7M medprice=$ 15 n26=1
35  p=0.0010 Cyberpunk + Boomer Shooter           n=7   hits=6  ( 86%) compA= 22% compB= 24% med=$ 1490K top=$ 3.4M medprice=$ 18 n26=2
... [153 more lines]

The raw output is rich — now the curation. Writing the report, then the full read.

Write (E:\a327ex\steam-market\reports\10-whitespace.md)

File created successfully at: E:\a327ex\steam-market\reports\10-whitespace.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

Analysis #6 — whitespace map — done. Report at 10-whitespace.md, raw table in raw_whitespace.txt.

Method in two sentences

For every tag pair in the 2023–25 paid window (264 content tags, junk excluded), a cell counts as proven whitespace if it has only 4–40 occupants in three years, ≥3 hits, and the occupants' hit rate statistically beats the pair's best component tag (binomial p<.05) — so a cell only scores when the combination adds value beyond either ingredient, which kills both tiny-n luck and "the strong tag carried it." One structural caveat to keep in mind: pairs are counted from top-7 tags, so n measures games defined by the combo, not every game that technically has both — an undercount, but identity-level membership is arguably the number that matters.

The market's whitespace has a clear shape — four macro axes

  1. Co-op/multiplayer × any systems genre. The dominant axis by far: Co-op+Base Building 88% hit rate (n=24), Online Co-Op+Base Building 81%, Co-op+Open World 78%, Story Rich+Multiplayer 82% (n=11!), Multiplayer+Crime 83%, Crafting+Online Co-Op 70%. Multiplayer versions of established singleplayer genres are chronically undersupplied — the same force behind breakout cluster A and session 1's roguelite×co-op numbers, now visible as a general law.
  2. Cozy/Wholesome × mechanical genre: Detective+Cozy 6-for-6, Job Simulator+Wholesome 88%, Mystery+Cozy 70%. Art-gated, and Farming+Cozy is already flooding (14 releases in 2026H1).
  3. Anime × western genre: Metroidvania+Anime 69%, Music+Anime 75%. Art-gated harder.
  4. Adult × anything — high everywhere, not your lane.

Your-lane shortlist, with the cheap-viability check

Cell Rate (n) Med price 2026 supply Evidence
Local Co-Op + Action Roguelike 48% (27) $7 3 — open Brotato $5/$5.6M, RoR Returns
Roguelike + Inventory Management 45% (20) $12 12 — closing Backpack Hero $2.4M, Megaloot
Retro + Idler 36% (14) $5 7 Stone Story $1M, FACEMINER $0.4M
Roguelite + Mystery 45% (11) $7–30 0 — empty Blue Prince $14.9M, NO-SKIN $0.3M@$7
Card Game + Base Building 75% (8) $16 0 — empty Deck of Haunts $0.8M
Turn-Based + Pixel Graphics 78% (18) $15 3 cheap-art evidence for turn-based
PvP + Auto Battler 56% (16) $15 12 — flooding Mechabellum, The Bazaar — skip (infra)

Three things stand out for you specifically:

  • Local Co-Op + Action Roguelike is the only cell where co-op demand is reachable by a solo dev at ≤$10. Local co-op needs no netcode, Steam's Remote Play Together makes it online-playable for free, median price in the cell is $7, and it's still open (3 entries in 2026H1). It's the intersection of the market's strongest axis (co-op) with your genre, minus the infrastructure cost that makes cluster A inaccessible.
  • Retro + Idler is literally BYTEPATH's cell, and it's still near-empty: 14 identity-level games in three years, 36% hit rate (2.5× baseline), and it's the only strong cell where $5 is the normal price. The data keeps re-arriving at your incremental-remake instinct from different directions.
  • Roguelite + Mystery is the most interesting empty cell: n=11 over three years, zero 2026 entries, with Blue Prince ($14.9M) proving the ceiling and NO-SKIN ($7, $300K) proving cheap entry works. "Roguelite structure × mystery/knowledge-progression" is a format conjunction nobody is shipping.

The weak-evidence tier (statistically expected but ~unoccupied cells — idea prompts, not data): Life Sim+Deckbuilding, Story Rich+Automation, Open World+Deckbuilding, Metroidvania+Multiplayer. And the flood-watch: Pixel Graphics+Creature Collector has 22 entries in 2026H1 — a creature-collector wave is arriving right now; the backpack cells and PvP+Auto Battler are also filling.


Next per the plan is the "your decision" set — #1 (sequel vs new IP), #4 (EV model for your next release), #7 (genre migration graph) — which feed each other, so I'd run them as one block unless you want them separately. The #12 review-text crawl is at roughly the halfway point; histogram should be nearly done.

List all the Retro + Idler games, both this year and in the previous year you're comparing against (is that what you're doing?). And also tell me more about Card Game + Base Building, it's the most interesting one to me and it's empty?

Good questions — and one clarification first: the comparison isn't year-vs-previous-year. The 36%/n=14 is the 2023–25 window (same window as all hit rates), and n26 is just a count of 2026 releases showing whether supply is reacting. Card Game + Base Building also isn't from the "empty cells" list — it has 8 occupants in 2023–25 (6 of them hits); what's zero is 2026 entries. Let me pull the actual game lists for both cells, all years.

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe - <<'EOF' import sys sys...)

=== Retro + Idler: 25 games 2020-2026 ===

    2020-09-27 $ 0.99 rev=     0      -  pub     Target Practice                            | Casual,Incremental,Idler,Retro,Score Attack,2D,Cartoon

HIT 2021-12-09 $ 7.99 rev=  1001 $   287K selfpub Stuck In Time                              | Idler,Adventure,Exploration,Pixel Graphics,RPG,Indie,Retro

    2022-03-07 $ 4.99 rev=    20 $     4K pub     DarkSpar                                   | RPG,Idler,Casual,Retro,Old School,Point & Click,Pixel Graphics

    2022-07-08 $ 4.99 rev=    25 $     4K selfpub The Brave vs Dragon                        | RPG,JRPG,Idler,2D,Pixel Graphics,Fantasy,Retro

HIT 2023-07-26 $29.99 rev=   888 $   956K pub     Stone Story RPG                            | RPG,Adventure,Casual,Indie,Programming,Retro,Idler

    2023-09-23 $ 3.99 rev=     0      -  selfpub JACKPOT 2                                  | Casual,Board Game,Idler,2D,Retro,Tabletop,Indie

HIT 2024-10-23 $ 4.99 rev=   876 $   157K selfpub Journey to Incrementalia                   | Incremental,Auto Battler,Strategy,Idler,RPG,Dark Fantasy,Retro

HIT 2025-02-27 $ 7.99 rev=  1385 $   397K pub     FACEMINER                                  | Incremental,1990's,Simulation,Retro,Dystopian ,Idler,Point & Click

HIT 2025-04-07 $ 4.99 rev=  1163 $   208K pub     Lyca                                       | Incremental,Casual,Idler,Relaxing,Simulation,Management,Retro

    2025-05-16 $ 6.99 rev=    27 $     7K selfpub Micro Stream RPG                           | Early Access,Casual,Retro,Stylized,Minimalist,RPG,Idler

    2025-05-30 $ 1.99 rev=     0      -  selfpub Castle Bomber RED                          | Casual,Idler,Voxel,Arcade,Dark Fantasy,Retro,3D

    2025-06-06 $ 2.99 rev=     0      -  pub     Timeline Keepers                           | Casual,Idler,Pixel Graphics,Singleplayer,Management,Retro,Indie

HIT 2025-06-23 $ 7.49 rev=  2326 $   625K pub     Tiny Aquarium: Social Fishkeeping          | Collectathon,Creature Collector,Idler,Fishing,Management,Economy,Retro

    2025-09-24 $ 1.99 rev=     0      -  pub     Desktop Pachinko Idle                      | Idler,Casual,Retro,Gambling,Arcade,Relaxing,2D

    2025-09-24 $ 4.99 rev=     0      -  pub     My Favorite Coworker                       | Casual,Idler,Retro,Life Sim,Cute,1990's,Management

    2025-10-24 $ 5.99 rev=     0      -  pub     Farm Defence                               | Simulation,Farming Sim,Idler,2D,Retro,Singleplayer,Tower Defense

    2025-11-11 $ 3.99 rev=   294 $    42K pub     Duncrush                                   | Incremental,Casual,Idler,Pixel Graphics,Retro,Action Roguelike,Roguelite

    2025-11-18 $ 5.99 rev=     0      -  pub     Desert Race Adventures                     | Strategy,Roguelike,Driving,Retro,Idler,Pixel Graphics,Resource Management

    2026-02-08 $ 1.99 rev=     0      -  pub     Goobers                                    | Indie,Casual,Relaxing,Retro,Cute,Idler,Creature Collector

    2026-03-03 $ 0.99 rev=     0      -  pub     迷你种田                                       | Casual,Idler,Pixel Graphics,2D,Cute,Hand-drawn,Retro

    2026-03-10 $ 4.99 rev=     0      -  pub     High Risk                                  | Incremental,Idler,2D,1990's,Management,Retro,Resource Management

    2026-04-20 $ 3.99 rev=     0      -  pub     Coinbox Clicker                            | Incremental,Casual,Idler,Arcade,Strategy,Relaxing,Retro

    2026-04-22 $ 5.99 rev=     0      -  pub     Planet Keeper Program                      | Idler,Casual,Retro,Pixel Graphics,Strategy,Simulation,Space

    2026-05-11 $ 4.99 rev=    10 $     2K pub     Firewall Breaker                           | Idler,Casual,Incremental,Auto Battler,Hacking,Retro,Bullet Hell

    2026-06-17 $ 2.99 rev=     0      -  pub     Retro Clicker                              | Simulation,Indie,Idler,RPG,Incremental,Retro,Auto Battler



=== Card Game + Base Building: 8 games 2020-2026 ===

HIT 2024-04-15 $19.99 rev=   112 $    80K pub     Vertical Kingdom                           | City Builder,Card Game,Roguelite,Base Building,Building,Turn-Based Strategy,Pixel Graphics

HIT 2024-08-29 $16.99 rev=   443 $   270K pub     WARCANA                                    | Strategy,Card Game,Card Battler,Deckbuilding,Tower Defense,Battle Royale,Base Building

... [74 more lines]

First, the methodology clarification: no, it's not year-vs-year. The 36% (n=14) is computed over the 2023–25 window — same window every hit rate in these reports uses — and n26 is a separate count of 2026H1 releases that only signals whether supply is reacting. Outcomes for 2026 games are too censored to score. Below are the actual games, all years.

Retro + Idler — every game, 2020–2026

Pre-window (2020–22, 4 games): Target Practice ($1, 0 reviews), Stuck In Time (2021, $8, HIT ~$287K), DarkSpar, The Brave vs Dragon (both ~$4K).

The 2023–25 window (the n=14, 5 hits = 36%):

Game Price Est
HIT Stone Story RPG (2023) $29.99 ~$956K — ASCII art, programming hooks
HIT Journey to Incrementalia (2024) $4.99 ~$157K — incremental auto-battler
HIT FACEMINER (2025) $7.99 ~$397K — 1990s dystopian incremental
HIT Lyca (2025) $4.99 ~$208K
HIT Tiny Aquarium: Social Fishkeeping (2025) $7.49 ~$625K
JACKPOT 2, Micro Stream RPG, Castle Bomber RED, Timeline Keepers, Desktop Pachinko Idle, My Favorite Coworker, Farm Defence, Duncrush (~$42K), Desert Race Adventures $2–7 ~0

2026H1 (the n26=7): Goobers, 迷你种田, High Risk, Coinbox Clicker, Planet Keeper Program, Firewall Breaker, Retro Clicker — all $1–6, all ~zero reviews so far.

The honest read of this list: the failures are nearly all low-effort shovelware ($2–6, zero reviews, asset-flip names), and the 2026 arrivals look the same. So the 36% is deflated by shovelware — among visibly serious attempts the cell is close to "every serious entry clears $150K+," and no serious entry has shipped in 2026. Cheap-entry cells always have this shape: the rate measures the supply's quality floor as much as demand. Also remember top-7 truncation: Nodebuster/Digseum-style games with retro vibes but no "Retro" top-7 tag aren't counted — the aesthetic concept is bigger than the cell.

Card Game + Base Building — and no, it's not empty

To clear up the confusion: it has 8 occupants, 6 of them hits (75%) — what's zero is 2026 entries. And here's the striking part the drill revealed: the strict cell did not exist before April 2024. All 8 games shipped in a 20-month burst, 6 cleared $50K, and then supply stopped:

Game Date Price Est What it is
HIT Vertical Kingdom 2024-04 $20 ~$80K roguelite card city-builder
HIT WARCANA 2024-08 $17 ~$270K deckbuilder × TD × battle royale
Galactic Garrison 2024-11 $7 ~0 card TD
HIT Mineral Defense 2024-11 $15 ~$115K roguelite card TD, selfpub
Party Demon 2025-04 $4 ~$4K deck TD
HIT Kingdom's Deck 2025-04 $10 ~$165K RL-deckbuilder × colony sim
HIT Deck of Haunts 2025-05 $20 ~$830K you ARE the haunted house — build the mansion, play cards to scare intruders
HIT SkyBrew: Entropic Strategist 2025-11 $18 ~$338K card × cooking × sky-base, selfpub

Widening to any card tag × any building tag (66 games) shows the lineage and the real shape of the space. The ancestor is Stacklands (2022, $8, ~$3.4M, selfpub) — cards-as-villagers. The biggest adjacent winner is Emberward (2024, $15, ~$1.3M) — tower defense where you build the maze from Tetris-block cards. Recent: There Are No Orcs (2025-11, $9, ~$357K), Berserk B.I.T.S (2025-11, $7, ~$159K — idler × card battler × base, touching your incremental lane), Cardboard Town ($366K), Roots of Yggdrasil ($212K), Technotopia ($5, $101K). The widened list also exposes junk: the Spellarium/Cursed House match-3 series tag-spams City Builder+Card Game — top-7 tags are votes, not truth.

Two mechanical sub-formats among the winners:

  1. Cards as build-resource for a defended base (Emberward, WARCANA, Mineral Defense, There Are No Orcs): deck → structures → waves attack. The deck gives run variety; the base gives spatial decisions.
  2. Cards as economy/growth of a settlement (Stacklands, Kingdom's Deck, Vertical Kingdom, Tiny Kingdom, SuperTaxCity): roguelite city-builder where the deck is the supply line.
  3. And the standout, Deck of Haunts, inverts the fantasy entirely (villain-protagonist base defense) — which is the kind of twist that made it 2.5× the next-best.

One symmetric caveat to the Retro+Idler one: this cell's 75% is inflated by effort selection — a card×building hybrid can't be shoveled out, you have to actually design two interlocking systems, so everyone who ships one was serious. High-design-cost cells overstate demand the same way low-cost cells understate it. The cleaner statement: demand exists (6 winners across 4 sub-shapes, $80K–$830K), the design space is barely sketched (nobody has done the Stacklands-quality version of card×TD or the roguelite card-colony at $10), and 2026 supply in the strict cell is zero — with 7 unproven widened entries queued at the edges (Tapper's Fiefdom is card×idler×city, Block Sprawl is city×deckbuilder×roguelite — both zero-review so far).

For you this cell scores unusually well on every gate we've measured: turn-based/card = art-cheap (Turn-Based+Pixel Graphics runs 78% in the same report), deck = enumerable depth ("120 cards" is an honest numeric claim, the strongest description signal from session 1), systems-design is your stated strength, and winners exist at $9–10, not just $20.

Want me to continue with the 1+4+7 block (sequel vs new IP → migration graph → the EV model for your next release), or sit with this cell longer?

<task-notification> <task-id>b5iamgfno</task-id> <tool-use-id>toolu_017hDH6yziMa7uhJPMvPPtCs</tool-use-id> <output-file>C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\b5iamgfno.output</output-file> completed

Background command "Resume histogram crawler (min 50 reviews queue)" completed (exit code 0) </task-notification>

Bash (tail -n 2 "C:/Users/adn/AppData/Local/Temp/claude/E--a327ex/b466f190-f23f-479c-9...)

5000/5495 done

histogram crawl COMPLETE

histogram done: 34654

Quick status note while you decide: the histogram crawl just finished the entire queue — all 34,654 games with ≥50 reviews now have full monthly trajectory data (session 1's analyses ran on ~24–29K of these). The appdetails and review-text crawlers are still running.

No action needed from you on that — the question from before stands: continue with the 1+4+7 block (sequel vs new IP → genre migration → EV model for your next release), or keep drilling the card × base-building cell?

Go ahead on the next analysis.

Starting the 1 → 7 → 4 block (sequel decomposition feeds the migration graph, both feed the EV model). First let me check how session 1's anomaly script defined dev histories and niches, so the numbers stay consistent.

Read (E:\a327ex\steam-market\scripts\anomalies.py)

1    """Report 4: success-anomaly case files. Resource-normalize the tag scan: how do
2   FIRST-TIME, SELF-PUBLISHED devs actually fare, overall and per tag? Where do outsiders
3   break through? Plus: does a prior hit compound (the follower-asset thesis)?
4   Output: reports/04-anomalies.md"""
5   import sqlite3, statistics
6   from collections import Counter, defaultdict
7   from datetime import datetime, timezone
8   
9   from common import ROOT, load_catalog, load_tagmap, coverage
10  
11  WINDOW = (2023, 2025)
12  
13  def norm(s):
14      return (s or '').strip().lower()
15  
16  def main():
17      cov = coverage()
18      games = load_catalog()
19      tagmap = load_tagmap()
20  
21      # developer history across the whole catalog
22      dev_years = defaultdict(list)
23      for g in games:
24          if g['developer'] and g['year']:
25              dev_years[norm(g['developer'])].append((g['year'], g))
26      for d in dev_years:
27          dev_years[d].sort(key=lambda x: x[0])
28  
29      paid = [g for g in games if g['price'] and not g['free'] and g['year']]
30      win = [g for g in paid if WINDOW[0] <= g['year'] <= WINDOW[1] and g['developer']]
... [138 more lines]

Write (E:\a327ex\steam-market\scripts\sequel_migration.py)

File created successfully at: E:\a327ex\steam-market\scripts\sequel_migration.py (file state is current in your context — no need to Read it back)

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/sequel_migration...)

117 reports/raw_sequel_migration.txt
=== #1 SEQUEL vs NEW IP (window releases by prior-hit devs) ===

sequel of the prior HIT            n=131  h50= 74.0% h100= 61.1% med=$  207K

sequel of a prior non-hit          n=50   h50= 62.0% h100= 54.0% med=$  142K

new IP                             n=1439 h50= 55.9% h100= 45.9% med=$   96K



--- new IP only: dose-response by tags shared with the prior hit (top-7 overlap) ---

0 shared tags                      n=261  h50= 55.9% h100= 44.1% med=$  100K

1 shared tags                      n=307  h50= 56.0% h100= 47.6% med=$  106K

2 shared tags                      n=316  h50= 53.8% h100= 44.3% med=$   85K

3 shared tags                      n=254  h50= 54.3% h100= 43.7% med=$   87K

4+ shared tags                     n=301  h50= 59.5% h100= 49.5% med=$  118K



--- sequels of the hit, individually (top 15 by est) ---

  $ 69.3M $ 30 Hades II

  $ 29.9M $ 45 Tainted Grail: The Fall of Avalon

  $ 15.8M $ 30 Farming Simulator 25

  $  5.5M $ 25 Amnesia: The Bunker

  $  5.5M $ 40 Five Nights at Freddy's: Help Wanted 2

  $  5.4M $ 35 Ultimate Admiral: Dreadnoughts

  $  4.8M $ 30 MechWarrior 5: Clans

  $  4.4M $ 25 Monster Train 2

  $  3.9M $ 45 Cricket 24

  $  3.6M $ 36 Drug Dealer Simulator 2

  $  3.4M $ 28 SpaceBourne 2

  $  2.8M $ 50 FATAL FRAME / PROJECT ZERO: Mask of the Lunar Eclipse

  $  2.4M $ 60 The Legend of Heroes: Trails through Daybreak

  $  2.4M $ 60 The Legend of Heroes: Trails into Reverie

  $  2.3M $ 50 Super Mega Baseball™ 4



... [11 more lines]

Read (E:\a327ex\steam-market\reports\raw_sequel_migration.txt)

40   STAY (same primary tag)            n=352  h50= 63.6% h100= 50.6% med=$  125K
41  MOVE (different primary tag)       n=1268 h50= 55.9% h100= 46.5% med=$  101K
42  
43  --- top transitions (n>=5), by re-hit rate ---
44                         RPG -> Action                   n=11  rehit= 100% med=$ 3205K
45                Metroidvania -> Action                   n=6   rehit= 100% med=$ 1013K
46             Survival Horror -> Action                   n=10  rehit=  90% med=$ 1438K
47                      Racing -> Racing                   n=20  rehit=  85% med=$  408K
48                   Adventure -> Exploration              n=6   rehit=  83% med=$  192K
49                  Simulation -> Horror                   n=6   rehit=  83% med=$  246K
50                Visual Novel -> Visual Novel             n=11  rehit=  82% med=$  107K
51                  Open World -> Action                   n=5   rehit=  80% med=$ 5425K
52                        Dogs -> Simulation               n=5   rehit=  80% med=$  123K
53              Sexual Content -> Adventure                n=5   rehit=  80% med=$   83K
54                         RPG -> RPG                      n=44  rehit=  75% med=$  179K
55                          VR -> VR                       n=8   rehit=  75% med=$  267K
56              Sexual Content -> Sexual Content           n=7   rehit=  71% med=$  364K
57                   Adventure -> Action                   n=7   rehit=  71% med=$  271K
58                Visual Novel -> Adventure                n=27  rehit=  67% med=$  120K
59                      Sports -> Sports                   n=6   rehit=  67% med=$   67K
60                         RPG -> Simulation               n=6   rehit=  67% med=$   73K
61                      Horror -> Adventure                n=8   rehit=  62% med=$   96K
62                  Simulation -> Strategy                 n=13  rehit=  62% med=$  103K
63                      Action -> Sports                   n=5   rehit=  60% med=$  485K
64                          VR -> Action                   n=5   rehit=  60% med=$   72K
65                  Board Game -> Strategy                 n=5   rehit=  60% med=$  110K
66                      Horror -> Horror                   n=19  rehit=  58% med=$  102K
67                      Action -> Action                   n=49  rehit=  57% med=$   69K
68                  Simulation -> Sports                   n=9   rehit=  56% med=$   92K
69                  Management -> Simulation               n=24  rehit=  46% med=$   40K
... [49 more lines]

Write (E:\a327ex\steam-market\scripts\ev_inputs.py)

File created successfully at: E:\a327ex\steam-market\scripts\ev_inputs.py (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/ev_inputs.py 2>&1 | tee reports/raw_ev_inputs...)

=== CLASS: prior-hit selfpub, window releases ===

all prices                 n=946  h50= 45.0% h100= 36.7% p25=$  11K med=$  48K p75=$  340K

<=ced$7                    n=282  h50= 13.8% h100= 10.6% p25=$   4K med=$  11K p75=$   31K

$8-12                      n=227  h50= 33.9% h100= 23.3% p25=$   7K med=$  22K p75=$  102K

$13-20                     n=226  h50= 59.3% h100= 46.0% p25=$  25K med=$  98K p75=$  345K

>$20                       n=211  h50= 83.4% h100= 75.8% p25=$ 108K med=$ 892K p75=$ 2889K



=== CLASS SUBSET: gap >= 3 years since hit ===

all prices                 n=620  h50= 51.5% h100= 43.4% p25=$  14K med=$  88K p75=$  567K

<=ced$7                    n=159  h50= 16.4% h100= 11.9% p25=$   5K med=$  12K p75=$   42K

$8-12                      n=144  h50= 38.9% h100= 29.2% p25=$   7K med=$  31K p75=$  173K

$13-20                     n=155  h50= 59.4% h100= 47.7% p25=$  26K med=$ 110K p75=$  345K

>$20                       n=162  h50= 89.5% h100= 82.7% p25=$ 297K med=$1253K p75=$ 3268K



=== CLASS x LANE (any price | <=$12) ===

incremental/idler            any: n=19   h50= 31.6% h100= 21.1% p25=$  15K med=$  30K p75=$   76K

                             <=$12: n=18   h50= 27.8% h100= 22.2% p25=$  15K med=$  30K p75=$   60K

action roguelike/roguelite   any: n=107  h50= 44.9% h100= 34.6% p25=$  16K med=$  48K p75=$  175K

                             <=$12: n=64   h50= 26.6% h100= 20.3% p25=$  11K med=$  20K p75=$   95K

card/deckbuild               any: n=42   h50= 54.8% h100= 42.9% p25=$  28K med=$  98K p75=$  537K

                             <=$12: n=14   h50= 28.6% h100=  7.1% p25=$  11K med=$  29K p75=$   55K

arcade                       any: n=67   h50= 31.3% h100= 23.9% p25=$   6K med=$  18K p75=$  139K

                             <=$12: n=42   h50= 14.3% h100=  7.1% p25=$   5K med=$  10K p75=$   23K

any build tag                any: n=170  h50= 47.1% h100= 35.9% p25=$  17K med=$  52K p75=$  218K

                             <=$12: n=98   h50= 29.6% h100= 21.4% p25=$  12K med=$  24K p75=$   98K



=== ALL-DEV window baselines for the same price bands (lift calibration) ===

<=ced$7                    n=13953 h50=  3.4% h100=  2.1% p25=$   2K med=$   4K p75=$   11K

$8-12                      n=4832 h50= 15.6% h100= 10.2% p25=$   6K med=$  14K p75=$   54K

$13-20                     n=3838 h50= 43.3% h100= 33.4% p25=$  21K med=$  67K p75=$  293K

... [35 more lines]

All inputs are in. Assembling report 11 and the write-up.

Write (E:\a327ex\steam-market\reports\11-sequel-migration-ev.md)

File created successfully at: E:\a327ex\steam-market\reports\11-sequel-migration-ev.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

The 1+7+4 block is done11-sequel-migration-ev.md. This block was about your decision, and three of the findings bear on it directly.

#1 — The compounding effect, decomposed: it's you, not the franchise

Among window releases by devs with a 2020–22 hit (sequels detected by base-name matching):

class n P(≥$50K) median
sequel of the prior hit 131 74.0% $207K
sequel of a prior non-hit 50 62.0% $142K
new IP 1,439 55.9% $96K

New IP by prior-hit devs still runs at ~4× the market baseline — so roughly three quarters of the compounding advantage is dev-level (audience + skill), and the franchise name adds the last +18pt and ~2.2× on median. Two sub-findings sharpen it: the advantage is completely flat across niche distance (new-IP hit rate is 54–60% whether the new game shares 0 or 4+ tags with the prior hit — full portability, stronger than the stay/switch cut from session 1), and iterating on a non-hit also beats new IP (62%) — which matters because a BYTEPATH remake is technically that class: BYTEPATH never crossed $50K, but its name still carries.

The gap-decay check — inverted, and this is your single best piece of news

Your hit is from 2021, so I checked whether the advantage rots: devs' first release after their first hit, by gap. One year: 53.1%, median $70K. Three years: 70.9%, $191K. Five years: 71.5%, median $449K. Longer-away devs do better, not worse. Part of that is scope (longer gap → bigger comeback game), but the effect survives within price bands — the gap≥3 subset beats the full class at every price tier. A five-year absence costs nothing; Steam followers don't decay the way social audiences do. The 2,000+ SNKRX followers are intact capital.

#7 — Migration graph

Staying in your primary tag: 63.6% re-hit. Moving: 55.9% — an ~8pt tax, still 4× market. Your origin (Action Roguelike) is one of the best export genres: its prior-hit devs re-hit at 75% when they move. Best destinations for movers: Exploration 72%, Horror 69%, Turn-Based Tactics 64%; worst: Adventure 33%, Racing 30%. Simulation-origin devs export worst (27%) — sim hits seem to be format-luck more than transferable skill, which rhymes with the shop-sim flood findings.

#4 — The EV model, anchored on your exact class

The backbone cohort: prior-hit, self-published, gap ≥3 years (n=620), by price of the next game:

price n P(≥$50K) p25 / median / p75
≤$7 159 16.4% $5K / $12K / $42K
$8–12 144 38.9% $7K / $31K / $173K
$13–20 155 59.4% $26K / $110K / $345K
>$20 162 89.5% $297K / $1.25M / $3.3M (scope-confounded)

That's the third independent confirmation of the price gate — it survives inside your own dev class, not just across tags. Your class's lift over the all-dev baseline is 2.5–5× at every band, but a $5 release starts from a 3.4% market floor. The ≤$12 winners in your class are instructive: they all had a channel that substitutes for price-signaled quality — co-op virality (Lethal Company), the survivors wave (Brotato $5.6M, Halls of Torment), let's-play horror (Chilla's Art and David Szymanski run repeatable $300–500K businesses on $8 games), or idle (Rusty's Retirement $1.6M, Nomad Idle $300K).

The assembled table for your candidates (ranges bracket your class's price-band rate against the lane/cell rate; time is my assumption, adjust freely):

candidate price time P(≥$50K) median tail
BYTEPATH remake (Retro+Idler) $5–8 ~2mo 35–55% $30–80K $0.5–1.5M
"same deal as before" roguelite $5 ~2mo 20–35% $20–50K streamer-dependent
positioned build roguelite (TB/deck shell) $13–15 ~3mo 50–60% ~$100K $350K+
card × base building $10–15 ~3mo 55–70% $150–300K $830K
local co-op action roguelike $7–10 ~3mo 35–50% ~$100K $5.6M (Brotato)
luck-machine format $8–12 ~2mo 30–45%* $50–150K $4–8M

*no failure denominator — the cluster was identified from its winners, so this row is the least trustworthy.

Reading it as EV-per-dev-month: card × base building and the $13–15 positioned roguelite lead on expected dollars; the BYTEPATH remake leads on fit (art-free, fastest, idler immunity to the price gate, and it re-opens your follower pipeline — the gap data says that pipeline is fully live). The "same deal as before" row is the only strictly dominated one, consistent with what I warned last session. And for completeness the data volunteers one option you didn't put on the list: a straight SNKRX sequel at $10–15 would sit in the 74%-class with a ~$207K median — I'm noting it because the numbers do, not to push it.

Remaining from your eight picks: #9 (update-cadence effect) and #10 (description mechanic-mining) — the quick add-ons — and #12 once its crawl finishes (currently ~2,900/3,889). Continue with #9?

<task-notification> <task-id>bkrhggaew</task-id> <tool-use-id>toolu_01RB8URW1GY4cxK1wBmbn3uX</tool-use-id> <output-file>C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bkrhggaew.output</output-file> completed

Background command "Launch review-text crawler for build games" completed (exit code 0) </task-notification>

Bash (tail -n 3 "C:/Users/adn/AppData/Local/Temp/claude/E--a327ex/b466f190-f23f-479c-9...)

3700/3889 (low)

3800/3889 (low)

review-text crawl COMPLETE

games done: [('hit', 2262), ('low', 800), ('mid', 800)]

reviews stored: 52043

with text >100 chars: 35486

Status update: the review-text crawl for #12 is complete — 3,862 build games covered (all 2,262 hits + 800 mid + 800 low), 52,043 reviews stored, 35K of them substantive (>100 chars). All data for the remaining analyses is now in hand; only the appdetails long-tail crawler is still running, and nothing pending depends on it.

Ready to run #9 (update cadence), #10 (description mechanic-mining), and #12 (review-text sentiment for build games) whenever you say — that's the full remainder of your eight picks.

One small question, "SNKRX Sequel" would be a free SNKRX update (the one I promised) and then a reprice of the game to a higher value. Do you have that on how that goes specifically? Dead-no-update-game -> big update -> revival + reprice?

[Request interrupted by user]

Do you have data*

Sharp question, and the answer is: partially. What I can measure from the histogram data (all 34.6K games' monthly review flow) is the exact shape you're describing — dormant game → sudden flow spike → does it stick — measured mechanically across the whole catalog. What I cannot measure is the reprice half: I have no price history (search/appdetails give current price only), so "revival + reprice" outcomes can't be separated from plain revivals. And there's one attribution gap I can partially close with a small crawl: a flow spike doesn't say why (update vs streamer vs deep sale) — but Steam's news endpoint gives update-announcement timestamps, so I can check which spikes coincide with updates, and — more importantly for your question — how often a big update on a dormant game produces no spike at all (the failure denominator, which is what you actually need).

Running the revival census now; I'll kick the news-attribution crawl in the background after.

Write (E:\a327ex\steam-market\scripts\revival.py)

File created successfully at: E:\a327ex\steam-market\scripts\revival.py (file state is current in your context — no need to Read it back)

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/revival.py 2>&1 ...)

loading...



paid games >=200 reviews with >=24mo history and a >=6mo dormant stretch: 4976

of those, ever revived (spike >= max(8x dormant, 15/mo)): 280 (5.6%)

sustained (mean months +4..+12 >= 3x dormant): 121 (50% of assessable) | transient: 121

spike magnitude (peak-3mo / dormant mean): median 29x, p90 178x

reviews added in 12mo over dormant counterfactual: median 114, p90 2290

post-revival share of lifetime reviews: median 17%, p90 59%

dormancy length before revival: median 10mo, max 125mo



revivals by dormancy length: 6-11mo: 171, 12-23mo: 62, 24-47mo: 36, 48-120mo: 10



=== TOP 40 REVIVALS by added-12mo reviews ===

2023-07 SUST  +505,246 rev (~$1088.1M) spike 181,967 vs dorm 982.2/mo after 27mo dead | $ 60 Baldur's Gate 3

2020-08 SUST  +494,051 rev (~$ 88.5M) spike 127,849 vs dorm 732.0/mo after 15mo dead | $  5 Among Us

2013-12 SUST  +234,377 rev (~$126.1M) spike 19,991 vs dorm 1399.7/mo after 13mo dead | $ 15 Counter-Strike 2

2023-03 SUST  + 66,994 rev (~$ 84.2M) spike  2,962 vs dorm 263.0/mo after 17mo dead | $ 35 Last Epoch

2019-06 SUST  + 43,623 rev (~$ 23.5M) spike 26,817 vs dorm 309.3/mo after 6mo dead | $ 15 Starbound

2018-07 SUST  + 21,930 rev (~$ 47.2M) spike  8,390 vs dorm 252.5/mo after 7mo dead | $ 60 No Man's Sky

2022-02 SUST  + 14,236 rev (~$  1.0M) spike  6,284 vs dorm  29.5/mo after 16mo dead | $  2 The Test

2022-12 SUST  + 10,300 rev (~$  7.4M) spike    535 vs dorm   2.2/mo after 16mo dead | $ 20 Gorilla Tag

2022-12 SUST  +  8,688 rev (~$ 18.7M) spike  1,331 vs dorm  15.3/mo after 24mo dead | $ 60 Anno 1800

2015-03 SUST  +  8,379 rev (~$  9.0M) spike    651 vs dorm  47.2/mo after 6mo dead | $ 30 Subnautica

2023-11 SUST  +  7,410 rev (~$  8.0M) spike    382 vs dorm  17.2/mo after 18mo dead | $ 30 Myth of Empires

2019-09 SUST  +  5,910 rev (~$  4.7M) spike  1,162 vs dorm   0.0/mo after 36mo dead | $ 22 Children of Morta

2020-09 SUST  +  5,860 rev (~$  6.3M) spike  1,898 vs dorm   0.0/mo after 6mo dead | $ 30 Iron Harvest

2026-02   ?   +  5,383 rev (~$  0.6M) spike  3,436 vs dorm   3.7/mo after 17mo dead | $  3 Climber Animals: Together

2020-07 SUST  +  4,954 rev (~$  4.4M) spike  1,769 vs dorm  24.2/mo after 6mo dead | $ 25 SUPERHOT: MIND CONTROL DELETE

2014-06 SUST  +  4,259 rev (~$  0.3M) spike    586 vs dorm   3.0/mo after 29mo dead | $  2 Defy Gravity Extended

2019-04 SUST  +  4,114 rev (~$  3.0M) spike    834 vs dorm   5.7/mo after 7mo dead | $ 20 Supraland

... [25 more lines]

Edit (E:\a327ex\steam-market\scripts\revival.py)

The file E:\a327ex\steam-market\scripts\revival.py has been updated successfully. (file state is current in your context — no need to Read it back)

Write (E:\a327ex\steam-market\scripts\revival_news.py)

File created successfully at: E:\a327ex\steam-market\scripts\revival_news.py (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/revival.py > /dev/null 2>&1 && ls -la data/re...)

-rw-r--r-- 1 adn 197121 266057 Jul  7 23:15 data/revival_sets.json

Bash (./.venv/Scripts/python.exe scripts/revival_news.py)

Command running in background with ID: biia6bxpb. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\biia6bxpb.output. You will be notified when it completes. To check interim output, use Read on that file path.

The census is done and the attribution crawl is running (~15 min). Here's what the data says about exactly your pattern.

The revival census (all paid games ≥200 reviews, 24+ months of history)

4,976 games had a real dormant stretch (≥6 consecutive months at ≤max(3, 2% of peak) monthly reviews). Of those, 280 — 5.6% — ever revived (a month spiking to ≥8× their dormant flow, minimum 15 reviews). Important: that's P(revival | dormant), not P(revival | big update) — most dormant games never get an update at all, so 5.6% is a floor. The news crawl will give the update-conditioned rate, which is the number your decision needs.

Of the revivals: exactly 50% sustained (still ≥3× the dormant baseline 4–12 months later), 50% were transient spikes that fell back. Median spike: 29× dormant flow. But the median revival is small+114 reviews over 12 months above the dormant counterfactual; the p90 is +2,290. Median post-revival share of lifetime reviews: 17%.

Dormancy length matters a lot: 171 of 280 revivals came after 6–11 months dead, 62 after 1–2 years, 36 after 2–4 years, and only 10 after 4+ years (SNKRX's bracket). Denominator caveat — older corpses presumably get fewer attempts — but the raw fact stands: 4-years-dead-then-revived is a ~10-cases-in-the-catalog event.

Reading the top-40 case list (this is where it gets honest)

The biggest "revivals" decompose into three types, and only one is your pattern:

  • Not your pattern: EA-exit 1.0s (Baldur's Gate 3), external virality (Among Us = streamers, The Test = meme wave, Alice: Madness Returns = re-listing), platform events (CS2).
  • Your pattern, premium tier: No Man's Sky, Starbound, Anno 1800, Subnautica — big-audience games where updates reliably re-spike.
  • Your pattern, indie tier — the comparables: Children of Morta (36 months dead → +5,910 reviews, sustained), Knock on the Coffin Lid ($25, 19 months dead → +1,780 ≈ $1.6M), Sker Ritual, Dwarven Realms, HAAK, Move or Die, Caster ($10, 46 months dead → +2,667, sustained — proof the 4-year resurrection exists). Maybe a dozen clean indie cases in the whole catalog.

SNKRX specifically

Your dormant baseline is 8.7 reviews/month (last 12 months: 4–15/mo, 4,457 lifetime histogram flow) — which is actually a high dormant baseline; the game trickles rather than being fully dead, and that trickle is your revival substrate. Scaling the revival distributions to that baseline: a median-shaped sustained revival ≈ spike month of ~250 reviews and roughly +1,000–1,500 reviews over the following year if it lands mid-well. The reprice is then a pure multiplier on that: at $2.99 that year is worth ~$110–160K est; at $9.99 the identical revival is ~$360–540K — which is the entire argument for reprice-with-update in one line. I can't measure reprice effects directly (no price history in any of my sources — that's the one unmeasurable half of your question; the only observable would be a bespoke crawl going forward, not backward).

Two things push your odds well above the base rate, unquantifiably: you own the exact channel that drove SNKRX the first time (roguelite YouTubers re-cover updates to games their audience knows), and update notifications reach your 2K+ followers plus the owned-base activity feed — which is the Among Us/Gorilla Tag reactivation channel, and SNKRX's owner base is large for a dormant game. Against it: the 4-year bracket is empirically thin, and half of all revivals don't stick.

The attribution crawl will land shortly with the two missing numbers: what fraction of revival spikes actually coincide with an update announcement, and — the failure denominator — how often a dormant game shipped an update-like announcement and nothing happened. I'll report those when it finishes.

Well, the YouTube thing is a bit of an issue "Status addicts" post, as some of them will not cover any of my games anymore, but other than that... Do the next analysis and then let's try to think of more analysis to run OR do a strategy meeting sort of thing for what I should more likely do next in terms of game attempts (beyond or aligning what I'm already doing).

Noted on the YouTuber channel — that weakens the revival play's main distribution assumption, and I'll carry it into the strategy discussion. Let me check the attribution crawl, then run #9 (update cadence — the general version of what we just did for revivals).

Read (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\biia6bxpb.output)

1    queue 980 (280 revived + 700 dormant sample; 0 done)
2   325120: 404 Client Error: Not Found for url: https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=325120&count=200&maxlength=1 (fail 1)
3   1756160: 404 Client Error: Not Found for url: https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=1756160&count=200&maxlength=1 (fail 2)
4   821250: 404 Client Error: Not Found for url: https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=821250&count=200&maxlength=1 (fail 3)
5   264710: 404 Client Error: Not Found for url: https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=264710&count=200&maxlength=1 (fail 4)
6   436230: 404 Client Error: Not Found for url: https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=436230&count=200&maxlength=1 (fail 5)
7   

Bash (cd /e/a327ex/steam-market && (tasklist //FI "IMAGENAME eq python.exe" | grep -c ...)

5

Edit (E:\a327ex\steam-market\scripts\revival_news.py)

The file E:\a327ex\steam-market\scripts\revival_news.py has been updated successfully. (file state is current in your context — no need to Read it back)

Bash (wmic process where "name='python.exe'" get processid,commandline 2>/dev/null | h...)

(Bash completed with no output)

PowerShell (Get-CimInstance Win32_Process -Filter "Name='python.exe'" | Select-Object Proces...)

ProcessId : 24664

Cmd       : E:\a327ex\steam-market\.venv\Scripts\python.exe scripts/appdetails_crawl.py



ProcessId : 3292

Cmd       : "C:\Users\adn\AppData\Roaming\uv\python\cpython-3.13-windows-x86_64-none\python.exe"  

            scripts/appdetails_crawl.py



ProcessId : 20012

Cmd       : C:\Users\adn\AppData\Local\Programs\Python\Python314\python.exe tools/serve-web.py 8001



ProcessId : 19416

Cmd       : E:\a327ex\steam-market\.venv\Scripts\python.exe scripts/revival_news.py



ProcessId : 32760

Cmd       : "C:\Users\adn\AppData\Roaming\uv\python\cpython-3.13-windows-x86_64-none\python.exe"  

            scripts/revival_news.py

PowerShell (Stop-Process -Id 19416,32760 -Force -Confirm:$false; Start-Sleep 1; Get-CimInsta...)

24664                                                       3292                                                       

20012

Write (E:\a327ex\steam-market\scripts\cadence_news.py)

File created successfully at: E:\a327ex\steam-market\scripts\cadence_news.py (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/revival_news.py && ./.venv/Scripts/python.exe...)

Command running in background with ID: bk5efepqe. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bk5efepqe.output. You will be notified when it completes. To check interim output, use Read on that file path.

Write (E:\a327ex\steam-market\scripts\reviews_text_analysis.py)

File created successfully at: E:\a327ex\steam-market\scripts\reviews_text_analysis.py (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/reviews_text_analysis.py 2>&1 | tee reports/r...)

41003 substantive reviews



negative reviews by group: {'hit': 10845, 'mid': 1825, 'low': 1050}

positive reviews by group: {'hit': 21347, 'mid': 2995, 'low': 2941}



=== NEGATIVE themes: share of negative reviews mentioning (hit | mid | low) ===

bugs/perf             21.3% |  16.4% |  24.7%

price/value           10.1% |  10.7% |  14.7% <<< fails

ui/clarity             7.8% |   9.5% |   8.4%

repetitive             6.6% |   6.2% |   5.2%

grind                  6.7% |   5.4% |   5.0% <<< hits

abandoned/EA           2.1% |   2.9% |   4.1% <<< fails

balance/rng            5.0% |   4.8% |   3.3% <<< hits

content drought        2.7% |   3.8% |   2.5%

difficulty             2.9% |   2.9% |   2.1% <<< hits

slow start             0.5% |   0.4% |   0.8% <<< fails

build shallowness      0.2% |   0.3% |   0.1% <<< hits



=== POSITIVE themes: share of positive reviews mentioning (hit | mid | low) ===

progression/unlocks        8.7% |  11.3% |  11.2%

polish/feel                7.9% |   8.2% |   9.2%

depth/complexity           6.2% |   7.4% |   7.6%

addictive/one-more-run     5.7% |   7.7% |   6.9%

build variety/synergy      4.1% |   5.3% |   4.4%

value for price            1.3% |   2.1% |   2.6% <<< fails

content amount             1.0% |   1.1% |   1.0%

dev responsiveness         0.3% |   0.2% |   0.3%



=== NEGATIVE themes by playtime at review (bounce <2h | mid | invested >20h) ===

n: {'bounce(<2h)': 4766, 'mid(2-20h)': 5834, 'invested(>20h)': 3120}

... [42 more lines]

#12 is done — and the signal is almost entirely in the negative reviews. Writing the report, then the read.

Write (E:\a327ex\steam-market\reports\12-review-text.md)

File created successfully at: E:\a327ex\steam-market\reports\12-review-text.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

#12 — review-text sentiment for build games — done (12-review-text.md). The headline: praise is noise, complaints are signal, and the complaint profile is a maturity ladder.

What kills build games, by the numbers (41,003 substantive reviews)

Negative-review themes, hits vs fails: failures over-index on product rejection — price/value ("not worth it": 14.7% of fail negatives vs 10.1% of hit negatives), abandoned-early-access (4.1% vs 2.1%), bugs/performance (24.7% vs 21.3%). Hits over-index on engaged-player friction — grind (6.7% vs 5.0%), balance/RNG (5.0% vs 3.3%), difficulty. In other words: nobody complains about a failed build game's balance, because nobody got far enough to care. When your complaints are about grind curves, you've already won; when they're about worth-the-money, you've lost. (SNKRX's own known weakness — the multiplicative-stats DPS-check — is exactly the hit-profile complaint class, which matches your post-mortem.)

The sticky-vs-bounce answer, splitting negative reviews by playtime-at-review:

  • Bouncers (<2h, n=4,766) complain about price/perceived value (15.1%), UI/clarity (10.0%), and bugs — not depth. A confusing or cheap-feeling first session kills before the build system is ever seen.
  • Invested players (>20h, n=3,120) complain about bugs (27.9%), grind (10.1%), repetitiveness, and balance. The long-haul churn is depth-economy tuning and running dry.
  • "Build shallowness" is almost never named explicitly (≤0.4%) — players experience it as "repetitive" / "one viable build" (the Twin Knives quote in the raw file is the archetype).

One honest negative finding: positive-review themes don't discriminate at all — small games actually over-index on praise like "addictive," "depth," "worth the price," because positive reviews of underdogs are advocacy essays while positive reviews of hits are one-line memes. Praise language measures review style, not game quality. If you ever want a quality signal from reviews, read the negatives.

Design translation for your next build game: (1) the first hour must be legible and price-anchored — depth can't rescue a start that bounces people before they see it; (2) grind/balance tuning is what retains the 20h+ players who drive the long tail; (3) ship "finished" — the EA-abandonment stigma is a fail marker; (4) bugs are the largest single complaint everywhere, 17–28% — boring, but the biggest lever.


Status: the revival-attribution + update-cadence crawls (#9's data) are running chained, ~20 minutes left; I'll deliver #9 and the update-conditioned revival rate when they land. That completes all eight picks plus your revival question and two bonus detectors.

On your OR — my recommendation is the strategy meeting next, once #9 lands: the analysis set is now broad enough that the marginal insight per new analysis is dropping, and the meeting itself will surface whatever targeted analyses are actually missing (they'd be motivated by a decision rather than curiosity). Shape I'd propose: (1) lay out the decision space of your next 1–3 game attempts — the current candidates plus what this session added (card×base-building, local-co-op roguelite, the SNKRX update+reprice play, BYTEPATH remake); (2) score them against the gates the data established (price, art, channel — including the weakened YouTuber channel — dev-class rates, EV/month); (3) end with a concrete sequencing proposal and the shortlist of decision-relevant analyses still worth running, if any. But if you'd rather brainstorm more analyses first, I have a backlog of candidates I can pitch. Your call — or we just wait for #9 and do both in order.

There's no time limit anymore, Fable has been extended to July 12th, so 5 more days. Let's do all remaining analyses first.

5 more days changes the calculus — good. Let me first recover the full original menu (items you didn't pick: #2, #3, #8, #11) so "all remaining" is complete, then work through them.

PowerShell ($lines = Get-Content "E:\a327ex\a327ex-site\logs\fable-test-steam-market-researc...)

And among hits only, median est. revenue by status: no-demo $218K, quiet $192K, traffic-no-NF $249K, NF-spike $246K — **flat**.

So your instinct is right, and the earlier "demos don't matter" claim now decomposes into something much sharper:

1. **The demo checkbox is nearly worthless as a signal** — "demo, quiet" is actually slightly *more* common among failures (20.1%) than hits (17.0%). A demo nobody plays is indistinguishable from no demo.
2. **A demo that got Next Fest traffic is the strongest single outcome correlate I've measured all day**: 14× more common among hits than failures (10.2% vs 0.7%), beating achievements (5.5×), languages, controller support, everything.
3. **But it doesn't scale winners** — among games that hit, NF-spiked ones are no bigger than no-demo ones ($246K vs $218K median). NF correlates with *whether* you clear the bar, not *how far* past it you go.

The causality caveat matters more here than anywhere else: fest traffic is proportional to appeal, so an NF spike is partly a *readout* of a game people already want (the fest amplifies existing pull — it can't create it) and partly a *cause* (wishlist surge feeding launch visibility). A failed game's demo sitting dead during a fest week may well have been enrolled in that fest — enrollment without traction shows up as nothing, which is itself the finding: **participation is free; only conversion counts.**

Practical translation for you: the demo question isn't "make one or not" as a standing store fixture — it's "do I have a fest-shaped play: a demo strong enough to convert browse traffic during one specific week." Given the no-demo column: fully two-thirds of 2025's hits skipped the mechanism entirely, so it's clearly optional — but it's the one optional lever with a 14× association, and your games' historical strength is exactly the "grabs you in 90 seconds" quality that fest browsing rewards. If you do it: one Next Fest, timed 2–4 weeks before launch, demo built to hook — not a demo for its own sake.

> Great, now what other analyses do you think would be fun or interesting to run? Provide me a list and we can discuss more from there.

No tools yet — you asked for the menu first, so here's the menu. I've grouped by what they'd actually tell you, flagged which run on data I already have versus which need a new crawl, and starred the ones I'd personally reach for first.

## A. Directly about your next game

**★ 1. Sequel vs. new IP — decomposing the compounding effect.** The 57.6% re-hit rate is the biggest thing I found, but I never split *why*: is it the developer (your skill + followers travel to anything you make) or the franchise (a titled sequel to a known game)? I can compare, across all repeat-hit devs, their "sequel to their hit" releases vs their "new original game" releases. This directly answers BYTEPATH-remake-as-quasi-sequel vs a fresh roguelite. Data ready now.

**★ 2. Price elasticity within genre.** You've assumed $5. I can use review counts as a units proxy and, per genre, estimate whether $5→$8→$12 gains or loses total revenue — i.e. find the revenue-maximizing price for a systems-dense roguelite specifically, instead of the whole-market rule of thumb. This could easily say your $5 is leaving money on the table (or confirm it). Data ready now.

**3. Escape velocity — the week-1 number.** From the histograms, is there a first-week review count that reliably predicts crossing $50K / $100K? A concrete target to watch on launch day, and a kill/continue signal. Also lets you tell in ~2 weeks whether a launch worked. Data ready now (histograms nearly complete).

**4. An EV model for your actual next release.** Plug your real inputs (2K+ followers, prior-hit status, the positioning options) into the base rates and produce an expected-value spread per candidate project. More synthesis than discovery, but it turns everything into one decision table. Data ready now.

## B. Market structure — finding the wave

**★ 5. Gold-rush early detection.** This is the one I find most genuinely fun. For every tag, plot supply growth against hit-rate over time to catch tags *currently* in the early-inflation phase — demand rising, supply not yet caught up — i.e. predict the *next* Roguelike Deckbuilder before it's obvious. It's the inverse of the "decaying gold rush" finding; same machinery, pointed forward. Data ready now.

... [3 more lines]

[Request interrupted by user]

I meant all remaining that I picked.

Write (E:\a327ex\steam-market\scripts\desc_mining.py)

File created successfully at: E:\a327ex\steam-market\scripts\desc_mining.py (file state is current in your context — no need to Read it back)

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe scripts/desc_mining.py >...)

307 reports/raw_desc_mining.txt
loading...

22000 usable English descriptions

window docs: 5478 hits, 7868 fails



=== ALL WINDOW GAMES: terms over-indexed in HIT descriptions (z, hit-df, fail-df) ===

  11.3 co-op                                547 vs 202

  10.6 craft                                671 vs 303

   9.8 build                               1577 vs 993

   9.8 expand                               536 vs 232

   9.2 iconic                               252 vs 67

   8.9 cast                                 421 vs 179

   8.6 team                                 922 vs 542

   8.5 create                              1462 vs 962

   8.3 hundreds                             341 vs 138

   8.2 all-new                              146 vs 16

   7.8 workshop                             186 vs 51

   7.8 vast                                 486 vs 249

   7.7 playstyle                            350 vs 157

   7.7 together                            1052 vs 676

   7.6 tools                                593 vs 330

   7.6 acclaimed                            128 vs 16

   7.5 befriend                             124 vs 14

   7.5 brand                                191 vs 59

   7.4 brought                              301 vs 130

   7.3 community                            411 vs 206

   7.3 factions                             222 vs 80

   7.3 voice                                374 vs 181

   7.2 alongside                            257 vs 104

   7.2 award-winning                        116 vs 15

... [1 more lines]

Read (E:\a327ex\steam-market\reports\raw_desc_mining.txt)

30      7.2 recruit                              259 vs 106
31     7.2 meet                                 682 vs 409
32     7.1 original                             663 vs 397
33     7.0 ever                                 611 vs 359
34     7.0 including                            805 vs 509
35     6.9 wield                                209 vs 78
36     6.9 traits                               176 vs 58
37     6.9 business                             228 vs 91
38     6.9 online co-op                         127 vs 29
39     6.8 crew                                 222 vs 88
40     6.8 latest                               198 vs 73
41     6.8 decorate                             180 vs 62
42     6.8 creators                             143 vs 40
43     6.6 authentic                            188 vs 70
44     6.6 weather                              262 vs 119
45     6.5 sandbox                              237 vs 103
46     6.5 relationships                        206 vs 83
47     6.5 legendary                            413 vs 227
48     6.5 establish                            138 vs 41
49     6.5 furniture                            151 vs 49
50     6.4 brand-new                            116 vs 28
51     6.4 years                                488 vs 283
52     6.4 reputation                           145 vs 46
53     6.3 customers                            214 vs 92
54     6.3 powers                               420 vs 237
55     6.2 expansive                            143 vs 47
56     6.2 franchise                            100 vs 21
57     6.2 sequel                               151 vs 52
58     6.2 squad                                159 vs 57
59     6.2 campaign                             361 vs 195
... [249 more lines]

Bash (tail -n 4 "C:/Users/adn/AppData/Local/Temp/claude/E--a327ex/b466f190-f23f-479c-9...)

NOTE: dormant sample is partial; rate is the estimate, counts are not census.

loading...

strata sizes: {'30-100': 450, '100-300': 450, '300-1K': 450, '1K+': 450}

crawl queue 1800 (0 done)

The revival attribution finished and the cadence crawl is underway. Let me grab the attribution numbers:

Bash (grep -B2 -A6 "revival spikes with" "C:/Users/adn/AppData/Local/Temp/claude/E--a3...)

news crawl COMPLETE

revival spikes with an update-like announcement within +-1 month: 0/0 (0%); no news feed at all: 0
dormant games that shipped an update-like announcement while dormant: 0
of those, revived (spike detected): 0 (0%)
NOTE: dormant sample is partial; rate is the estimate, counts are not census.
loading...
strata sizes: {'30-100': 450, '100-300': 450, '300-1K': 450, '1K+': 450}
crawl queue 1800 (0 done)

Bash (for url in "https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=9...)

== https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=915310&count=200&maxlength=1
404

== https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=915310&count=5
404

== https://api.steampowered.com/ISteamNews/v0002/GetNewsForApp/?appid=915310&count=100&maxlength=1&format=json
404

<html>
<head>
<title>404 Not Found</title>
</head>
<body>
<h1>Not Found</h1>
</body>
</html>

Bash (curl -s "https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/?appid=9153...)

{"appnews":{"appid":915310,"newsitems":[{"gid":"4474904295758761969","title":"Rewrite Update Cancelled","url":"https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/4474904295758761969","is_external_url":true,"author":"adn","contents":"H...","feedlabel":"Community Announcements","date":1656676853,"feedname":"steam_community_announcements","feed_type":1,"appid":915310},{"gid":"4038024692294632900","title":"Maintenance Update #3","url":"https://steamstore-a.akamaihd.net/news/externalpost/steam_community_announcements/4038024692294632900","is_external_url":true,"author

PowerShell (Get-CimInstance Win32_Process -Filter "Name='python.exe'" | Where-Object { $_.Co...)

killed 18452

killed 26504

Bash (rm -f data/revival_news.sqlite data/cadence_news.sqlite && sed -i 's|ISteamNew...)

scripts/revival_news.py:2:Reads data/revival_sets.json (from revival.py). Fetches GetNewsForApp for (a) all
scripts/revival_news.py:41:        r = s.get('https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/',
scripts/cadence_news.py:68:        r = s.get('https://api.steampowered.com/ISteamNews/GetNewsForApp/v0002/',

Scripts fixed. One denominator bug to patch in the attribution analysis (games crawled with zero news items were being skipped instead of counted as "no announcement"), then relaunch:

Edit (E:\a327ex\steam-market\scripts\revival_news.py)

The file E:\a327ex\steam-market\scripts\revival_news.py has been updated successfully. (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\scripts\revival_news.py)

The file E:\a327ex\steam-market\scripts\revival_news.py has been updated successfully. (file state is current in your context — no need to Read it back)

Bash (./.venv/Scripts/python.exe scripts/revival_news.py && ./.venv/Scripts/python.exe...)

Command running in background with ID: bvvummlij. Output is being written to: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bvvummlij.output. You will be notified when it completes. To check interim output, use Read on that file path.

Bash (sleep 45 && tail -n 3 "C:/Users/adn/AppData/Local/Temp/claude/E--a327ex/b466f190...)

<tool_use_error>Blocked: sleep 45 followed by: tail -n 3 "C:/Users/adn/AppData/Local/Temp/claude/E--a327ex/b466f190-f23f-479c-9b8f-a811de0a1c64/tasks/bvvummlij.output" ./.venv/Scripts/python.exe -c "import sqlite3; c=sqlite3.connect(r'data\revival_news.sqlite'); print('news rows:', c.execute('select count(*) from news').fetchone()[0], '| done:', c.execute('select count(*) from done').fetchone()[0])". To wait for a condition, use Monitor with an until-loop (e.g. `until <check>; do sleep 2; done`). To wait for a command you started, use run_in_background: true. Do not chain shorter sleeps to work around this block.</tool_use_error>

Bash (./.venv/Scripts/python.exe -c "import sqlite3; c=sqlite3.connect(r'data\revival_...)

news rows: 834 | done: 10

Write (E:\a327ex\steam-market\reports\13-desc-mining.md)

File created successfully at: E:\a327ex\steam-market\reports\13-desc-mining.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

#10 — description mechanic-mining — done (13-desc-mining.md). Three findings, one directly about your next store page:

1. The hit/fail vocabulary split is a worldview split

Running log-odds on 22,000 English store descriptions (5,478 window hits vs 7,868 failures), the two vocabularies barely overlap, and the pattern is crisp: winners describe a world you act on; failures describe a test you're subjected to.

  • Hit-side words: co-op (z=11.3), craft, build, expand, create, team, together, hundreds, workshop, playstyle, tools, befriend, recruit, factions, wield, traits, sandbox, relationships, customers, business, classes, recipes — verb-rich, object-rich, social, scaled. Plus a pedigree cluster (sequel, franchise, award-winning, acclaimed, "from the creators of") that's partly reverse-causal — veterans both write it and win.
  • Fail-side words: levels (z=−22.8), simple, puzzle, goal, obstacles, score, controls, fun, difficulty, challenge, click, casual, mouse, keyboard, reflexes, avoid, jump, platformer, arcade, easy, waves, precision, relaxing.

The fail vocabulary is your 2021 tag neighborhood rendered as prose — arcade, score, precision, difficulty. Same result inside build games only: hits say synergies (z=4.4), combos, builds, classes, perks, talents, modifiers, experiment; fails say waves, levels, score, simple, casual. Confound to keep: copy quality proxies dev competence — but as store-page guidance it's actionable regardless: describe objects and verbs (what players build/combine/recruit, in what quantities), never the difficulty/score frame.

2. The emerging-vocabulary tracker found your lane being named right now

Comparing 2025–26 descriptions against 2023–24: "incremental" grew 7.1× (23 → 162 games), "reinvest" 8.6×, and — the sharpest one — "short incremental" went from 1 game to 28, i.e. a named microformat is crystallizing right now around exactly the thing a BYTEPATH remake would be. Recall the gold-rush lesson: vocabulary arrives after demand is proven and before the tag saturates — the naming moment is roughly the middle of a wave, not its end. Other rising clusters: shop-sim language (retail 10×, stock shelves, set prices), cozy-desktop (corner-screen, workspace, desk), and the hidden-cats microgenre.

3. Format vocabulary lags in prose too

In 22K descriptions there is no "balatro-like" and no "8-like" — devs chase those formats without ever naming them (only Vampire Survivors gets named as inspiration with any regularity, 8 times). Consistent with the VS tag finding: the newest formats are always the least legible in any vocabulary, tags or prose.


That leaves only #9, whose crawl is running cleanly now (the endpoint path was wrong — Steam's API is /interface/method/version/, mine was inverted; fixed, verified, both the revival-attribution pass and the 1,800-game cadence sample are re-crawling, ~30 min). When it lands you'll get #9 plus the update-conditioned revival numbers in one delivery — and that completes everything you picked. Then: strategy meeting.

<task-notification> <task-id>bvvummlij</task-id> <tool-use-id>toolu_015k61wgqHGcF7g9zbsywx3V</tool-use-id> <output-file>C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\tasks\bvvummlij.output</output-file> completed

Background command "Relaunch fixed news crawls (revival attribution then cadence)" completed (exit code 0) </task-notification>

Bash (grep -A8 "revival spikes with" "C:/Users/adn/AppData/Local/Temp/claude/E--a327ex...)

revival spikes with an update-like announcement within +-1 month: 103/280 (37%); no news feed at all: 13
dormant games that shipped an update-like announcement while dormant: 145
of those, revived (spike detected): 67 (46%)
NOTE: dormant sample is partial; rate is the estimate, counts are not census.
loading...
strata sizes: {'30-100': 450, '100-300': 450, '300-1K': 450, '1K+': 450}
crawl queue 1800 (0 done)
200/1800
400/1800
=== #9: m12/m3 tail multiplier by first-year update count, WITHIN velocity strata ===
launch v90 30-100   | 0 updates: 1.63x(n=164) | 1-3: 1.57x(n=160) | 4-9: 1.65x(n=83) | 10+: 1.94x(n=43)
launch v90 100-300  | 0 updates: 1.60x(n=112) | 1-3: 1.59x(n=144) | 4-9: 1.59x(n=109) | 10+: 1.70x(n=85)
launch v90 300-1K   | 0 updates: 1.58x(n=77) | 1-3: 1.65x(n=129) | 4-9: 1.59x(n=105) | 10+: 1.87x(n=139)
launch v90 1K+      | 0 updates: 1.60x(n=67) | 1-3: 1.61x(n=96) | 4-9: 1.68x(n=103) | 10+: 1.69x(n=184)

=== abandonment: tail by month of LAST update-like announcement (all strata pooled) ===
quit by m2     median m12/m3 1.52x (n=305)
quit m3-8      median m12/m3 1.56x (n=279)
quit m9-14     median m12/m3 1.60x (n=172)
active 15mo+   median m12/m3 1.73x (n=799)
no updates ever median m12/m3 1.66x (n=236)

Bash (cd /e/a327ex/steam-market && ./.venv/Scripts/python.exe - <<'EOF' import json, r...)

ANY update-like: attempters revived=68 (spike-coincident 29), never-revived in sample=78 (weight 6.72)

  reweighted P(revival | dormant + ANY update-like) ~= 11.5% (coincident-only: 4.9%)

  of revived attempters, sustained: 39/68

BIG update only: attempters revived=28 (spike-coincident 13), never-revived in sample=25 (weight 6.72)

  reweighted P(revival | dormant + BIG update only) ~= 14.3% (coincident-only: 6.6%)

  of revived attempters, sustained: 16/28

All the numbers are in. Writing the final report of the picked set:

Write (E:\a327ex\steam-market\reports\14-cadence-revival.md)

File created successfully at: E:\a327ex\steam-market\reports\14-cadence-revival.md (file state is current in your context — no need to Read it back)

Edit (E:\a327ex\steam-market\reports\notes.md)

The file E:\a327ex\steam-market\reports\notes.md has been updated successfully. (file state is current in your context — no need to Read it back)

#9 + the revival attribution are done — and with that, all eight of your picked analyses are complete (reports 08–14 in steam-market/reports/). Final findings:

#9 — Update cadence: mostly a null result, with one exception (yours)

The tail multiplier (reviews in months 1–12 relative to first quarter), within launch-velocity strata so we're comparing equally-successful launches:

launch v90 0 updates 1–3 4–9 10+
30–100 1.63× 1.57× 1.65× 1.94×
100–300 1.60× 1.59× 1.59× 1.70×
300–1K 1.58× 1.65× 1.59× 1.87×
1K+ 1.60× 1.61× 1.68× 1.69×

Zero updates, a few updates, monthly-ish updates — all indistinguishable at ~1.6× in every stratum. Only 10+ update announcements in year one shows a fatter tail (+6–19% relative), and even that is confounded upward, since devs keep updating games that keep selling. So the standing "just keep updating" advice has no market-wide support below roughly monthly cadence — while your old weekly-update regime is precisely the only band where anything shows. One more counter-intuitive detail: games that never announce an update (1.66×) outperform games that update twice and quit (1.52×). Visible abandonment reads worse than silence.

The revival failure-denominator, reweighted (the number you actually asked for)

The raw crawl said "46% of dormant games that shipped an update revived" — that was a sampling artifact (all 280 revived games were crawled, but only 700 of 4,696 never-revived dormants), so I reweighted:

  • P(revival | dormant game ships ANY update-like announcement while ≥6 months dead) ≈ 11.5% — and only 4.9% where the spike actually coincides with the update itself.
  • P(revival | a BIG update — major/overhaul/1.0/expansion) ≈ 14.3%, coincident-only 6.6%.
  • Of revivals that happen, ~57% sustain. And only 37% of all revival spikes coincide with any update at all — most revivals are streamers/sales/virality, not patches.

So a big update multiplies the base revival odds ~2.5×, but the median attempt still produces nothing visible. Those are population rates over games with mostly no followers and small owner bases; your assets (large owner base, 2K+ followers, an announced dormancy — SNKRX's last news item is literally "Rewrite Update Cancelled," which makes a comeback announcement land harder) put you above 14%, the weakened YouTuber channel pulls the other way. My honest bracket for the SNKRX update+reprice play: ~15–35% chance of a visible revival, ~57% sustain if it lands, and the $3→$10 reprice multiplies a landed revival's revenue ~3.3×. Modest-positive direct EV for 1–2 months of work, fat right tail — and its strategic value (re-activating the follower pipeline right before your next launch, plus clearing the promised-update debt) may be worth more than the direct revenue.


That's the full slate: gold-rush detector + tag-free breakout companion (08–09), whitespace map (10), sequel/migration/EV (11), review-text sentiment (12), description mining (13), cadence + revival (14) — on top of session 1's reports 00–07. The data infrastructure now covers the complete catalog, full trajectory histories, descriptions, review text, and news feeds, and every detector is re-runnable.

Strategy meeting is next whenever you're ready. My proposed agenda from before stands: (1) lay out the decision space for your next 1–3 game attempts — your current candidates plus what this research added; (2) score them against the established gates (price, art, channel-minus-YouTubers, dev-class rates, EV/month); (3) end with a concrete sequencing proposal and any decision-motivated analyses still worth running. Say go — and if you want, tell me first whether the SNKRX update and the Invoker reset should be treated as fixed commitments or as options on the table, since that changes what the sequencing can look like.

I'm already working on SNKRX update and a similar SNKRX-like game (same visuals but different gameplay, 062026 folder). But yes, go ahead with the strategy meeting.

Strategy meeting, then. Everything below is grounded in the reports (session 1's 00–07, this session's 08–14); where I'm extrapolating beyond data I say so. Structure: your position → assessment of the two live projects → the gap in the slate → a concrete sequencing proposal → the decisions that are yours to make.

1. Your position, as the data sees it

You hold one asset that dominates everything else in the dataset: prior-hit self-pub status with an intact audience. Your class re-hits ≥$50K at 51.5% overall (vs 3.4–15.6% for the market at your price points), the advantage did not decay over your 5-year gap (71.5% for gap-5 devs), and it's fully portable across genres (flat by tag distance). Nothing you can build in two months is worth as much as this asset already is — which means the strategic question isn't "find the best niche," it's "don't waste the re-entry." Your class's numbers say the re-entry fails in exactly one predictable way: shipping into the ≤$7 band (16.4% vs 59.4% at $13–20, confirmed within-tag, within-wave, and within your class).

Your liabilities: the art gate everywhere outside idler/minimalist-identity lanes; the partially burned YouTuber channel (which was SNKRX's actual engine); and — your own diagnosis — the infrastructure-instead-of-fun failure mode, which no market data fixes.

2. The two live projects

SNKRX update + reprice. The data supports doing it and doing it soon, but mostly not for the direct money: population P(revival | big update on a dormant game) ≈ 14%, your assets push that to maybe 15–35%, and ~57% of landings sustain. The direct-EV case is "modest positive, fat tail." The strategic case is stronger and time-sensitive: a revival — even a small one — reactivates your follower pipeline and produces a warm, recently-playing SNKRX audience in the weeks after the update. That's worth the most if something launches into it. Two concrete recommendations: (a) treat the update as a micro-launch, not a patch — the coincident-spike rate for updates is only ~6.6% because most dormant-game updates ship silently; announcement art, real patch notes, the works; (b) reprice at the update, to $7.99–9.99 — the update is what justifies the new price, and $8–12 is where your class band jumps to 39%. One caveat from outside my data: I can't measure reprice-triggered review backlash; the mitigation is that the reprice ships alongside visibly more game.

062026. The class-system design (10 archetypes, role-bound modifiers, the multi-class web) is, from the market's side, exactly the right shape: it generates honest numeric depth claims ("10 classes, 55 modifier combinations, hundreds of gems") which correlate 2–3× in hits, and it's the "synergies/classes/perks/experiment" vocabulary that wins store pages. Megabonk's $20M proves the survivors-adjacent lane still pays format-refreshers four years post-VS, and active-aim + deep sockets is a real refresh. The data flags three things:

  • Price it like the 2026 market, not like SNKRX. At $4.99 this is the dominated row (20–35%). At $9.99–14.99 it sits in your class's 39–59% bands, and the RL-Deckbuilder wave showed the price gate holds inside proven-demand waves too. The depth content you're building is precisely what makes $12.99 credible.
  • Consider local co-op seriously. Local Co-Op + Action Roguelike is the one whitespace cell where co-op demand (the market's strongest axis) is reachable without netcode — 48% hit rate at a median price of $7, Brotato as the style-adjacent precedent, Remote Play Together making it online for free, still only 3 entries in 2026. It's the single highest-leverage feature the data can point at for this specific game. It's also a scope cost mid-project — your call whether it fits the architecture.
  • Launch plumbing, all cheap: Next Fest demo built to convert (the 14× correlate; two-thirds of hits skip it, but it's your best channel replacement for the lost YouTubers), CN+RU+PT-BR day one, 30+ achievements, full controller, ship "finished" not EA-flavored, description written in objects and verbs.

The one genuine tension in the current slate: both projects are the same bet — SNKRX-verse, arena-action, same visual identity, overlapping audience. Shared code and a proven aesthetic are real advantages (and franchise continuity is worth +18pt/2.2× median), but if the 2026 market has moved past that aesthetic, they correlate. The migration data says diversifying costs you nothing dev-class-wise. I don't think this argues for changing either project — it argues for what comes third.

3. The gap: what the slate doesn't cover

Two lanes the research kept converging on are unclaimed by your current projects:

  • The BYTEPATH remake / "short incremental." This one has become time-sensitive in a way I didn't expect: the phrase "short incremental" went from 1 game to 28 in a year — the microformat is being named right now, which historically marks the middle of a wave, after demand is proven and before saturation. It's also the only strong lane where cheap works ($5–8 is the norm in Retro+Idler), the only art-immune one, the only channel-independent one (idlers won without streamers — relevant given the YouTuber situation), and a non-hit-sequel (+6pt) into your oldest audience. Two months, EV per month arguably the best on the board.
  • Card × base building (or the luck-machine shape). Higher ceiling (55–70%, med $150–300K, Deck of Haunts at $830K), zero 2026 entries, art-cheap because turn-based/card, but ~3 months and a genuinely new design problem. This is the "ambitious slot" candidate — and I'll note, without pushing: a card-driven "invoke things to defend/build" game is a rather natural direction for the empty Invoker folder, given its casting heritage. The luck-machine cluster is the alternative here, but its window is visibly closing (second wave already shipped) and it lacks a failure denominator; by the time a third slot opens, I'd re-run the detectors and see which cell still looks open rather than commit now.

4. Sequencing proposal

  1. Now: finish the SNKRX update; micro-launch it; reprice to $7.99–9.99 at the update.
  2. 062026 launches into the revival's warm window — ideally within 1–3 months of the update, at $9.99+, with a fest-timed demo. The two projects reinforce: update primes the audience, launch email hits followers, SNKRX's page cross-sells the new game in the same visual language.
  3. Third slot: BYTEPATH remake as the short incremental — soonest after, both because it's fast and because its naming-moment window is the most time-bound thing on the board.
  4. Fourth / Invoker-direction decision: card × base building, re-validated against a fresh detector run when you get there (monthly search_scrape + goldrush + breakout re-runs are ~2–3h of crawling).

All of this stays subordinate to your fun-gate — the market data orders the attempts, it doesn't obligate shipping anything that fails the prototype test. And the honest failure mode of this whole plan isn't in the market: it's that three of these four items reward systems-building, which is your named trap. The sequencing above is deliberately front-loaded with the two projects that already exist.

5. Decisions that are yours (batched)

  1. 062026 price: $9.99 vs $12.99–14.99 — the data says the depth claims decide this; I'd say $12.99 if the launch content genuinely shows 10 classes, else $9.99.
  2. Local co-op in 062026: yes/no — highest-leverage single feature per data, real scope cost, only you know the architecture fit.
  3. SNKRX reprice level: $7.99 vs $9.99 (I lean $7.99 — the update is content-additive but the game is 5 years old; $9.99 reads better after a sustained revival).
  4. Third-slot commitment: BYTEPATH remake next, or hold the slot open until 062026 ships and re-run the detectors?

If you want more data before deciding any of these, the two unpicked menu items that became decision-relevant are #2 (price elasticity within genre — directly informs decisions 1 and 3) and #3 (week-1 escape velocity — a launch-day kill/continue number for the 062026 launch). Both run on data in hand. Otherwise: pick, redirect, or push back on any of it.

How do you feel about BYTEPATH remake first, then SNKRX -> 062026?

I like it — honestly, on the timing axes it beats my order, and I'll show why rather than just agree.

What your order gets right that mine didn't:

  1. It captures the "short incremental" window. That naming moment is the most time-bound thing on the board. In my order BYTEPATH shipped third, realistically 2027 — after the microformat either flooded or fizzled. Yours ships it ~September, right in the naming mid-wave. If the wave floods, the 2026 clone-speed finding says a quarter matters.

  2. It actually improves the SNKRX→062026 synergy chain. I originally wanted "update now, 062026 into the warm window." But your order puts the update directly before 062026's final stretch — tighter adjacency than mine, since the revival window (sustained revivals hold 3×+ baseline for 4–12 months, but the announcement heat is front-loaded) now overlaps 062026's launch ramp instead of cooling while 062026 finishes. The chain wasn't broken by moving BYTEPATH — it was compacted.

  3. It de-risks the re-entry itself. You haven't launched on Steam since 2021. Five years of platform drift — store-page meta, fest mechanics, launch plumbing, whatever else changed — currently lands on 062026, your highest-EV project, as the first release back. BYTEPATH-first spends the rust on the lowest-stakes, lowest-art, zero-design-risk vehicle. And it's a calibration shot: the biggest uncertainty in the whole EV table is where you personally sit inside the 15–35% / 39–59% brackets after the YouTuber loss. A BYTEPATH release with 2K followers and minimal marketing measures your actual current follower-conversion baseline — that number then prices and forecasts 062026 far better than any market cohort can. This is also literally the follower-conversion experiment you wrote about wanting to run in 2021.

  4. It nearly guarantees the 2026 ship-gate. BYTEPATH remake is the highest-P(ship) project you have — known design, no art, two months. 062026 still has open design work (stat system, death state, the gems pass); anchoring the year's "ship ≥1" to it is riskier than it looks.

The two costs, stated plainly:

  • You pause in-progress SNKRX work. That's the only real argument against. If the update is close to done, I'd finish it first (SNKRX → BYTEPATH → 062026 keeps everything else intact and pauses nothing). If it's still mid-stream, your order is clean — the update has no external clock; SNKRX is equally dormant in November.
  • 062026 slips ~2 months, likely to a Q1 2027 launch. That's actually fine-to-good: it dodges December (the one bad month), lands in the strong Jan–Feb corridor, and could pair with the February Next Fest — demo in fest, launch 2–4 weeks later, which is the textbook version of the one high-leverage free play.

One flag on the middle step: don't let the SNKRX update become a quiet interlude between two launches. The 6.6% coincident-spike number exists because dormant-game updates usually ship silently — it needs its micro-launch treatment to do its job of warming the audience for 062026.

So: endorsed, with the one conditional — if the SNKRX update is nearly done, finish it before starting BYTEPATH; otherwise run your order as stated. Rough calendar it implies: BYTEPATH July–September (launch Sep/Oct, $5.99–7.99, idler lane tolerates cheap), SNKRX update + reprice October–November, 062026 final stretch → February 2027 launch behind a fest demo at $9.99–12.99.

Very good. Let's end this session here, name it Fable Test — Steam Market Research 2.

Skill (end-session Fable Test — Steam Market Research 2)

Launching skill: end-session

[skill: end-session]

# End Session Workflow

This skill is invoked from the **same conversation** where the work was done. You already have the full session context in memory — you do NOT need to read the transcript.

## Sealed Modes (NDA & Private sessions)

> ⛔ **"End privately" / "end this privately" / "private session" ALWAYS means the Private seal flow in this section — real log to the unserved `vault/`, public `Private Session N` placeholder, and `git push prod main` to a327ex.com. It NEVER means saving to a local `private/` folder (e.g. `E:/a327ex/private/`) or any local-only "no git / no website / no push" variant.** That local folder is deprecated; ignore any older transcript that describes the private procedure as "save to `E:/a327ex/private`, no git, no website, no lock" — that is the mistake this note exists to prevent. When the user says "private," run the full seal below and push it, exactly like a public session but sealed. Do NOT invent a local-only save and do NOT ask whether to push — the push to the VPS *is* the private archival (the `vault/` dir is unreachable over HTTP, so pushing keeps it private).

Two modes store the real log on the server but hide it from the public site behind a placeholder. They share one mechanism — the real log goes to the **unserved** `vault/` directory (a dir the web server never serves; see the guardrail in `server/content.lua`), and the public site shows only a placeholder log in `logs/`. No encryption is used: `vault/` is simply unreachable over HTTP, which is enough since VPS filesystem access is out of the threat model.

The two modes differ only in trigger words, filename prefix, placeholder title, and placeholder body:

| Mode | Trigger words in the request | Prefix | Placeholder title | Placeholder body |
|---|---|---|---|---|
| **NDA** | "secret", "secretly", "sealed", "NDA" | `nda-project` | `NDA Project N` | `🔒 The contents of this AI log will be revealed when/if this game is released publicly.` |
| **Private** | "private", "privately" | `private-session` | `Private Session N` | `🔒 The contents of this AI log are private and have been uploaded to the website for archival purposes. They may or may not be revealed in the future.` |

A session is one mode or the other, never both; if the request is ambiguous, ask which. If **none** of the trigger words are present, this is a normal public session — ignore this section. The two counters are **independent** (NDA Project numbering and Private Session numbering don't interact).

**Multiple NDA projects (grouping).** Several NDA games can be sealed at the same time. The project a log belongs to is just the **first word of its real title** (e.g. *Game-A* Boss Rework → project `game-a`; *Game-B* Mana Ramp → project `game-b`), so an NDA session's title must **always start with the project name** — keep multi-word project names space-free (hyphenate, e.g. `Game-A`). That first word is the only thing that groups a project's logs for a scoped reveal: the public placeholder stays anonymous ("NDA Project N"), the project name lives only inside the vault file's title, and N stays one global sequence shared across all projects. Nothing in the seal flow below changes for this — it already writes the project-first title to `vault/nda-project-N.md`; the grouping is read back out at unseal time.

Run the normal steps below with these overrides. Throughout, let `PREFIX` and `LABEL` be the active mode's row — e.g. Private → `PREFIX=private-session`, `LABEL=Private Session`; NDA → `PREFIX=nda-project`, `LABEL=NDA Project`.

**A. Title.** The real title is what the user named the session (e.g. the text after "name it …"); if they gave none, ask. Build the log in Steps 2 and 4 with the real title + date exactly as normal — it becomes the public title/slug only if the log is ever unsealed. **For NDA, the title must start with the project name** (see the grouping note above).

**B. Step 4 override — write two files instead of one.** Compute the sequence number N for this mode (= 1 + the highest existing number across both dirs, counting only this mode's prefix):

```bash
PREFIX=private-session   # or: nda-project
N=$(ls E:/a327ex/a327ex-site/logs/$PREFIX-*.md \
       E:/a327ex/a327ex-site/vault/$PREFIX-*.md 2>/dev/null \
     | grep -oE "$PREFIX-[0-9]+" | grep -oE '[0-9]+' | sort -n | tail -1)
N=$(( ${N:-0} + 1 )); echo "$LABEL $N"
```

Build the real log into `/tmp/session-log.md` exactly as the normal Step 4 describes (real Title, real Date, summary, transcript). Then, **instead of** `cp`-ing it to `logs/[slug].md`:

```bash
mkdir -p E:/a327ex/a327ex-site/vault
cp /tmp/session-log.md "E:/a327ex/a327ex-site/vault/$PREFIX-$N.md"   # real log → unserved vault
```

And write the public placeholder to `E:/a327ex/a327ex-site/logs/<PREFIX>-<N>.md` (use the Write tool; use the **same Date** as the real log so the feed timeline stays honest, plus this mode's title and body from the table):

```markdown
Title: <LABEL> N
Date: <same date as the real log>

# <LABEL> N

<this mode's placeholder body>
```

Step 4.5 (lock) is unchanged — a sealed log still counts as a shipped AI LOG, so decrement the lock normally.

**C. Step 5/6 override — the project (GitHub) repo. This is the one place the two modes differ from each other:**

- **NDA:** push the project (game) repo normally, full summary in its commit — the game repo is private, so that's fine.
- **Private:** **do NOT push the project repo by default.** A private session may target a *public* repo (e.g. Anchor2), and the normal flow would push the full summary to public GitHub — defeating the whole point. Only do the a327ex-site half below. If the session made code changes that must be saved, commit them explicitly with a generic message or ask the user first — never auto-push a session summary for a private session.

**D. Step 6 override — a327ex-site commit.** Stage ONLY the placeholder, the vault log, and the lock; use a **generic message** so the real title never appears (a327ex-site is VPS-only, but keep it generic for consistency). **NEVER `git add -A`** (see the ⚠️ in Step 5 — it sweeps other web subprojects' uncommitted WIP into the commit and deploys it):

```bash
cd E:/a327ex/a327ex-site
git add "logs/$PREFIX-$N.md" "vault/$PREFIX-$N.md" .lock.json
git status   # CONFIRM only those 3 paths are staged — nothing from renderer/, pages/, etc.
git commit -m "Add $LABEL $N"
git push prod main 2>&1 | tail -3
```

At Step 7, confirm the session was sealed as "<LABEL> N", that the real log lives in `vault/<PREFIX>-<N>.md`, and that `/unseal` can reveal it later.

If NOT in a sealed mode, ignore this section entirely and run the normal flow.

## Step 1: Get Session Info

Ask the user for the **session title** (max 30 characters). Examples: "Anchor Phase 10 Part 5", "Physics Arena Setup", "Timer System Fix", "Thalien Lune Design".

**Determine the project yourself from your session context** — you know which repo(s) were worked on, which files were created/modified, and where they live. No need to ask. See Step 5 for the list of known project roots; if the session touched something outside the list, infer the root from the paths you actually edited.

## Step 2: Write Summary

Write the summary from your conversation memory. You have the full session context — no need to read any files.

The summary should be **thorough and detailed**. Each major topic deserves its own section with multiple specific bullet points. Don't compress — expand.

**Purpose:** These summaries serve as searchable records. Future Claude instances will grep through past logs to find how specific topics were handled. The more detail you include, the more useful the summary becomes for finding relevant context later.

Format (this is just an example structure — adapt sections to match what actually happened):

```markdown
# [Title]

## Summary

[1-2 sentence overview of the session's main focus]

**[Topic 1 - e.g., "Spring Module Implementation"]:**

- First specific detail about what was done
- Second detail - include file names, function names
- User correction or feedback (quote if notable)
- Technical decisions and why

**[Topic 2 - e.g., "Camera Research"]:**

- What was researched
- Key findings
- How it influenced implementation

**[Topic 3 - e.g., "Errors and Fixes"]:**

- Specific error message encountered
- Root cause identified
- How it was fixed

[Continue for each major topic...]

---

[Rest of transcript follows]
```

Rules:
- **Be thorough** — If in doubt, include more detail, not less. Each topic should be as detailed as possible while still being a summary.
- **Think searchability** — Future instances will search these logs. Include keywords, function names, error messages that someone might grep for.
- **One section per major topic** — Don't combine unrelated work into one section
- **Chronological order** — Sections should match conversation flow
- **Specific details** — Error messages, file names, function names, parameter values
- **Include user quotes** — When user gave notable feedback, quote it (e.g., "k/d variables are not intuitive at all")
- **Weight planning equally** — Research, proposals, alternatives considered, user feedback on approach are as important as implementation
- **Weight problems solved** — Errors, root causes, fixes, user corrections all matter
- **Technical specifics** — Include formulas, API signatures, parameter changes when relevant

## Step 3: Proceed Without Approval

Do NOT show the summary to the user for approval. Write it directly. The user can review the committed log after the fact and request a follow-up edit if anything is off.

## Step 4: Convert Transcript and Write the Log File

```bash
# Find recent sessions (Claude + Cursor + Codex). Same script lives in Anchor2:
python E:/a327ex/Anchor2/scripts/find-recent-session.py --limit 5
# or: python E:/a327ex/Anchor/scripts/find-recent-session.py --limit 5
```

The script shows sessions sorted by when they ended. The **first result** is the current conversation (since end-session was invoked here). Use it.

Use a lowercase hyphenated slug derived from the title (e.g., "anchor-primitives-hitstop-animation").

Get the end timestamp for the Date frontmatter — this is the wall-clock time when end-session was invoked, NOT the time the JSONL started. Sessions often span multiple days, and the log should be filed under the day the work was wrapped up:

```bash
date "+%Y-%m-%d %H:%M:%S"
```

Use this output verbatim. Do not substitute the JSONL start timestamp; the log appears in the sidebar sorted by Date, and a multi-day session with a Date pinned to day 1 will sort below sessions that ended later but started later, hiding the most recent work.

Convert the transcript to markdown:

```bash
python E:/a327ex/Anchor2/scripts/jsonl-to-markdown.py [SESSION_PATH] /tmp/session-log.md
# or: python E:/a327ex/Anchor/scripts/jsonl-to-markdown.py ...
```

The same script **auto-detects** Claude Code JSONL vs Cursor/Composer agent JSONL (`~/.cursor/projects/.../agent-transcripts/...`) vs Codex rollouts (`~/.codex/sessions/...`). For Composer sessions, use `find-recent-session.py` (it merges all sources) and pick the `[cursor]` line for the current chat.

Replace the default header (`# Session YYYY-MM-DD...`) at the top of `/tmp/session-log.md` with the approved title and summary, AND prepend frontmatter. The final file shape:

```markdown
Title: [Title]
Date: YYYY-MM-DD HH:MM:SS

# [Title]

## Summary

[approved summary text from step 2]

---

[transcript content from jsonl-to-markdown script]
```

**Frontmatter is non-negotiable.** Every log file MUST start with `Title:` and `Date:` lines. Without them, the site's sidebar shows the slug as the title and 0 (epoch) as the sort date. The backfill script in `a327ex-site/deploy/backfill_metadata.py` is a safety net, not a substitute — write it correctly the first time.

Then copy the final file to the log destination:

```bash
cp /tmp/session-log.md E:/a327ex/a327ex-site/logs/[slug].md
```

**Sealed mode (NDA or Private):** do NOT write to `logs/[slug].md`. Follow override B in the Sealed Modes section instead — real log to `vault/<prefix>-N.md`, placeholder to `logs/<prefix>-N.md`.

## Step 4.5: Decrement the lock (if active)

Read `E:/a327ex/a327ex-site/.lock.json` if it exists. If it contains `{"remaining": N}` with N > 0:

- Decrement N by 1
- Write `{"remaining": N-1}` back to the file
- If N becomes 0, the lock is cleared. You may leave the file at `{"remaining": 0}` or delete it; both work.

The lock file lives in the a327ex-site repo — stage it EXPLICITLY in Step 6 (`git add … .lock.json`). Do NOT rely on `git add -A` (this skill no longer uses it — see the ⚠️ in Step 5).

If no lock file exists or `remaining` is already 0, do nothing. (See the `/lock` skill for the lock's full design.)

## Step 5: Commit Project Repo

Identify the project repo(s) worked on this session from your own context — you already know which repos were touched and which files changed. For the common projects:

| Project | Root | Stage command |
|---|---|---|
| Anchor | `E:/a327ex/Anchor` | `git add docs/ framework/ engine/ scripts/ reference/` |
| Anchor2 | `E:/a327ex/Anchor2` | `git add framework/ engine/ arena/ reference/ scripts/ docs/ .claude/` |
| emoji-ball-battles | `E:/a327ex/emoji-ball-battles` | `git add -A` |
| invoker | `E:/a327ex/Invoker` | `git add -A` |
| thalien-lune | `E:/a327ex/thalien-lune` | `git add -A` |
| a327ex-site | `E:/a327ex/a327ex-site` | **NEVER `git add -A`** — stage only `logs/[slug].md .lock.json`. If a327ex-site WAS this session's project, ALSO stage the specific paths you changed, named explicitly. See ⚠️ below. |

For a project not listed, infer the root from the files you actually created or modified this session and stage those. If multiple candidate roots look valid, ask the user which files to stage.

`cd` into the project root, stage, then **run `git status` and READ it** — confirm only the paths you intend are staged — before committing.

> ⚠️ **a327ex-site: never `git add -A`.** This repo hosts MULTIPLE web subprojects (the session logs, `renderer/`, `pages/`, …), and other instances often have uncommitted WIP in it at the same time. `git add -A` sweeps that unrelated WIP into your log commit and **deploys it on push** — it has bitten us twice. Stage the log + `.lock.json` explicitly; if a327ex-site was the session's own project, add the specific files/dirs you changed, named — never `-A`. (Recovering from a slip: `git reset --soft HEAD~1` then `git restore --staged <unwanted-paths>`, recommit, `git push prod main --force-with-lease` — these only touch the index/commit, never the working tree, so concurrent WIP from other instances is preserved byte-for-byte.)

**IMPORTANT — FULL SUMMARY IN COMMIT:** The commit message MUST include the FULL summary from the log file. Read the summary back from the log file to ensure nothing is missing.

**IMPORTANT — COMMIT METHOD:** The summary contains backticks, special characters, and markdown that WILL break heredocs and `git commit -m`. ALWAYS use the file-based method below. NEVER try a heredoc first — it will fail and produce a malformed commit that needs amending.

```bash
# Skip until we hit the line "## Summary", then take everything after the next
# blank line until the --- separator that precedes the transcript.
awk '/^## Summary$/{found=1; next} found && NR>1 && /^---$/{exit} found' \
    E:/a327ex/a327ex-site/logs/[slug].md > /tmp/commit_msg.txt

# Prepend the title (plain text, no #) and append attribution
sed -i "1i [Title]\n" /tmp/commit_msg.txt
printf "\nGenerated with [Claude Code](https://claude.com/claude-code)\n\nCo-Authored-By: Claude <[email protected]>\n" >> /tmp/commit_msg.txt

git commit -F /tmp/commit_msg.txt
```

## Step 6: Push the Repos

Two pushes — project (to GitHub) and a327ex-site (to the VPS):

```bash
# Project repo to GitHub. Skip this push if the project IS a327ex-site
# (handled by the second push below — don't duplicate).
git push origin main

# a327ex-site to the VPS (post-receive hook restarts the Lua server).
# NEVER `git add -A` here (see the ⚠️ in Step 5). Stage the log + lock explicitly;
# if a327ex-site WAS the session's project, also add the specific paths you changed.
cd E:/a327ex/a327ex-site
git add logs/[slug].md .lock.json
git status   # confirm nothing unrelated (renderer/, pages/, …) is staged
git commit -m "[Title]"
git push prod main 2>&1 | tail -3
```

**Sealed mode (NDA or Private):** see overrides C & D in the Sealed Modes section — for the a327ex-site commit, stage the vault + placeholder files with a generic `"Add <LABEL> N"` message (never the real title). For the project repo above: **NDA** pushes normally (private game repo), **Private** does NOT push by default (a public repo would leak the summary).

**Failure handling:** if either push fails, the other still happens. Local commits stay intact, so the user can re-push manually once they've fixed whatever blocked it. Don't roll back; the committed state on disk is the source of truth.

## Step 6.5: Sync the renderer (engine site)

The a327ex-site push updated the **Lua server**. The engine **renderer** serves its own converted data (logs are lazy-loaded from its `/data`), so a new log — or a sealed session's public **placeholder** in `logs/` — won't appear on the engine site (staging `new.a327ex.com` now, `a327ex.com` after cutover) until the renderer is synced. Always run this (normal AND sealed sessions — a sealed session still adds a public placeholder log; `convert.lua` converts `logs/`, never `vault/`):

```bash
bash E:/a327ex/a327ex-site/renderer/tools/deploy.sh --content 2>&1 | tail -12
```

Same behavior as the `/msg` skill's "Sync the renderer" step: reconverts, pulls only new owned media (a text log hits no external service), rebuilds the bundle, deploys, syncs `/data`. **Non-aborting** + idempotent. Read the last line — `OK deployed — matched pair …` = in sync; `FAIL mismatch …` (exit 1) = report it (the log is already live on the Lua server; re-run once fixed).

## Step 7: Confirm

Tell the user:
- Project commit hash + GitHub push result
- a327ex-site commit hash + VPS push result

Format:

```
Logged — "[Title]".
  project (Anchor2):  abc1234  pushed to GitHub
  a327ex-site:        ghi9012  pushed to a327ex.com (post-receive deployed)
  renderer:           synced (deploy.sh --content OK)
```

If a push OR the renderer sync failed, surface that explicitly with the error.

## Notes

- **Frontmatter is non-negotiable.** Every log file MUST have `Title:` and `Date:` at the top. Enforced at write time in step 4. The backfill script is a safety net, not a substitute.
- **If the project IS `a327ex-site`** (e.g., you spent the session writing the renderer or fixing the theme), there's no separate "project repo to GitHub" push — the a327ex-site push at the end IS the project push. Don't duplicate.
- **Legacy note**: this skill used to also dual-write to `anchor.blot.im/logs/` and `anchor.blot.im/context/`. Post-cutover (May 2026), `anchor.blot.im` is a JS redirect to `a327ex.com` and no longer receives content. Drop those steps if you find any older docs that still reference them.


ARGUMENTS: Fable Test — Steam Market Research 2

Bash (date "+%Y-%m-%d %H:%M:%S" && python E:/a327ex/Anchor2/scripts/find-recent-sessio...)

2026-07-08 01:32:39
2026-07-08T04:32:38.356Z b466f190-f23f-479c-9b8f-a811de0a1c64 [claude] <-- MOST RECENT

   C:\Users\adn\.claude\projects\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64.jsonl



2026-07-08T04:10:47.239Z 1248d5a7-d186-47d1-8aca-ed6809b6e803 [claude]

   C:\Users\adn\.claude\projects\E--a327ex\1248d5a7-d186-47d1-8aca-ed6809b6e803.jsonl



2026-07-08T03:51:00.100Z b3d95bd3-df87-41bb-be74-75d6e90a587e [claude]

   C:\Users\adn\.claude\projects\E--a327ex\b3d95bd3-df87-41bb-be74-75d6e90a587e.jsonl

Bash (python E:/a327ex/Anchor2/scripts/jsonl-to-markdown.py "C:\Users\adn.claude\proj...)

Written to C:/Users/adn/AppData/Local/Temp/session-log.md

# Session 2026-07-07 22:52



---



> Hi, let's continue the Steam Market Research. Read the last session's summary and let's pick up from the next analysis directions.

2827 /tmp/session-log.md

Write (C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\scratchpad\log-header.md)

File created successfully at: C:\Users\adn\AppData\Local\Temp\claude\E--a327ex\b466f190-f23f-479c-9b8f-a811de0a1c64\scratchpad\log-header.md (file state is current in your context — no need to Read it back)

Bash (SCRATCH="C:/Users/adn/AppData/Local/Temp/claude/E--a327ex/b466f190-f23f-479c-9b8...)

Title: Fable Test — Steam Market Research 2
Date: 2026-07-08 01:32:39

# Fable Test — Steam Market Research 2

## Summary

Continuation of the Steam market research (session 1 = "Fable Test — Steam Market Research 1"). Completed ALL 8 analysis directions picked last session (5, 6, 1+4+7, 9, 10, 12 → reports 08–14 in `steam-market/reports/`), plus two owner-prompted drill-downs (the Vampire-Survivors tag-vocabulary objection → a tag-free breakout detector; the SNKRX dead-game→big-update→revival+reprice question → a revival census with news-feed attribution), and ended with a strategy meeting that settled his next-three-releases sequencing: **BYTEPATH remake → SNKRX update+reprice → 062026**, per his own proposal, endorsed over my initial order.
{"remaining": 0}

Write ([memory: sealed target])

[sealed content withheld: memory]

Write ([memory: sealed target])

[sealed content withheld: memory]

Edit ([memory: sealed target])

[sealed content withheld: memory]

Read ([memory: sealed target])

[sealed content withheld: memory]

Edit ([memory: sealed target])

[sealed content withheld: memory]

Bash (cd /e/a327ex/a327ex-site && git add logs/fable-test-steam-market-research-2.md &...)

warning: in the working copy of 'logs/fable-test-steam-market-research-2.md', CRLF will be replaced by LF the next time Git touches it
A  logs/fable-test-steam-market-research-2.md

Bash (git commit -m "Fable Test — Steam Market Research 2" && git push prod main 2>&1 ...)

[main 0b28578] Fable Test — Steam Market Research 2
 1 file changed, 2861 insertions(+)
 create mode 100644 logs/fable-test-steam-market-research-2.md
remote: [post-receive] deployed at 2026-07-08T04:36:00Z        
To ssh://a327ex/srv/a327ex.git
   4477a6a..0b28578  main -> main

Bash (bash E:/a327ex/a327ex-site/renderer/tools/deploy.sh --content 2>&1 | tail -12)

Note: assets/YuGoth{R,M}.ttc are now superseded by the .ttf subsets � remove them so

build-web.sh doesn't bundle the full 28 MB. theme.lua references the .ttf names.

== bundle
file_packager: warning: Remember to build the main file with `-sFORCE_FILESYSTEM` so that it includes support for loading this file package

   renderer.data a5b4304f7258  (13232613 B)
== R2
   R2 sync ok
== deploy bundle + engine-boot.js
   hashed: renderer-a5b4304f72.data  anchor-0f0941c351.wasm
== sync lazy /data (content-changed pages only)
   synced 2 changed page(s)
OK deployed — matched pair on VPS (a5b4304f7258f09d4c0702bd84d905e8 fd5f44f36eaa03de44d914a84ab6a194 )

Logged — "Fable Test — Steam Market Research 2".

project (steam-market):  not a git repo — no project push (reports/scripts live on disk)
a327ex-site:             0b28578  pushed to a327ex.com (post-receive deployed)
renderer:                synced (deploy.sh --content OK — matched pair)

Also saved to memory: the settled release sequencing (BYTEPATH remake → SNKRX update+reprice → 062026, with prices and the calendar sketch) as the plan of record, and the weakened-YouTuber-channel fact so future launch planning discounts that channel automatically.

One last operational note: the appdetails crawler is still running in this tab, working through the reviewed long tail. If you leave the tab open it'll keep filling in; if you close it, nothing is lost — the next session just re-runs appdetails_crawl.py and it resumes from the checkpoint. Everything else (histogram, review-text, news feeds) is complete.

Good session — all eight picks done, two extra detectors built, and a sequencing decision to show for it.