Loading…
a327ex.com

Steam Market Research 5

Summary

Steam Market Research 5 rebuilt a current Steam research dataset and investigated the market first broadly, then specifically for games advertising build expression. The owner wanted fresh findings from Steam data, independent of earlier Fable research and Steam marketing blogs, without treating money, audience growth, or current projects as the research’s objective. Python collectors used Steam’s public StoreQuery and StoreBrowse services to produce a September 5, 2026 snapshot of 184,664 game apps across 23 storefront catalogs, with SQLite, Parquet, raw responses, and field inventories. An excessive image download was stopped and deleted at the owner’s request; only media references remain. Statistical screens, description classification, and a bounded Steam-review sample identified recurring associations, rejected misleading niches, and developed a hypothesis about meaningful item interactions. The session ended with reproducible artifacts for continuation in another task.

Research intent, source boundaries, and corrections to the plan:

  • The owner had previously followed Steam closely and collected catalog data to answer questions with scripts, but wanted to refresh his understanding after roughly five years. He asked the assistant to generate most research directions and useful answers, including openings that other developers might not have noticed.
  • Earlier Fable Steam research, its logs and summaries, and all Steam marketing research blogs were explicitly excluded. The desired relationship to existing marketing commentary was “simply indifferent,” rather than opposition or contrarian reaction. No earlier research outputs or third-party sales estimates were imported into the dataset.
  • The owner initially described an affinity for making a game in a few months and marketing it through minimal-effort actions with substantial possible reach, while remaining open to changing that approach. This was context for research, not a requirement to prove that any observed game was made quickly or marketed cheaply.
  • The assistant initially asked for revenue/audience goals, risk tolerance, acceptable promotional actions, and whether the work should inform Horse Game. The owner corrected this: “I'm not particularly after money or audience,” said his writing already explained his positions, and requested broad Steam ideas and trends independent of anything he was currently making. He allowed closer examination of games resembling his interests without making them the entire initial population.
  • Reading the owner’s public writing clarified several relevant preferences: short development cycles as design exploration and skill development; small production scope compatible with spacious play; creative contribution through recombination; meaningful player choices; and making work without requiring a particular external response. These ideas supplied context, not additional measurable Steam variables.
  • The assistant disclosed a source-boundary mistake: the owner’s “Game quality is all that matters” essay reproduced a howtomarketagame passage, which was encountered while reading the essay. The external site was not opened, but complete non-exposure could no longer be claimed. Subsequent screening avoided embedded third-party material, and market claims were grounded in the newly collected data.
  • A second correction concerned feasibility. The assistant proposed studying category formation, novelty, mechanical depth, and discovery pathways through extensive game interpretation. The owner objected that these could not reliably be recovered programmatically from Steam data, and the assistant could not play all the games. The accepted plan instead began with obtainable fields: releases, tags, tag combinations, prices, review distributions, concentration, languages, and cohort comparisons.
  • The resulting sequence was to audit access and coverage, collect a broad inexpensive metadata layer, analyze its distributions, and use numerical anomalies to motivate narrower description or review investigations. Development time, marketing effort, design depth, and causal discovery mechanisms were removed from the quantitative agenda unless separately measured.

Steam source audit and collection architecture:

  • The owner authorized the assistant to choose collection methods, audits, and implementation details, requesting the most representative and current dataset possible as of September 5, 2026, with as much per-game data as practical. He initially also requested store pictures for potential later visual analysis.
  • Live probes found that the old ISteamApps/GetAppList/v2 route returned 404 and the newer IStoreService/GetAppList route required a key. Steam search worked but capped returned rows at 100 even when more were requested. A raw SteamSpy endpoint was tested, but SteamSpy data and estimates were not incorporated into the final game dataset.
  • The useful route was Steam’s public IStoreQueryService/Query for catalog enumeration and IStoreBrowseService/GetItems for detailed batched metadata. Protocol definitions were inspected through a Steam protocol-schema mirror. Full responses could be collected in batches of 1,000 rather than fetching every store page individually.
  • The implementation retained compressed raw response envelopes with exact requests, source country, retrieval time, and response metadata before ingestion. SQLite stored a preferred per-app record and separate relations for tags, creators, languages, categories, regional observations, discovery membership, media references, and aliases. Portable Parquet exports preserved full nested metadata in data_json; a compact compressed CSV exposed normalized game columns.
  • Five primary storefronts supplied detailed regional observations: US, Brazil, Japan, China, and Germany. Lightweight ID enumeration expanded to 18 more: GB, FR, CA, AU, KR, TW, HK, RU, UA, TR, IN, SG, MX, AR, TH, ID, VN, and ZA. Regional coverage added 208 discovered IDs beyond the US structured catalog.
  • A separate Steam-search enumeration was a cross-check, not the foundation of the completeness claim. Its 354 checked extra IDs were DLC, music, or other non-game records. It remained partial after rate limiting and was not silently described as complete.

Image-download mistake, pause, and deletion:

  • The assistant interpreted the initial picture request too expansively, building an image downloader and fetching store artwork, screenshots, and description images across the catalog. It switched to Steam’s smaller screenshot variants, retained original references, and later bounded large animated description images, but the operation had already become excessive.
  • The owner interrupted after discussing the load in a side chat, asking about bulk downloads and collection status. All network collection was paused. At that point, 533,716 verified image files occupied approximately 144.8 GB and covered 41,756 games. The cache was biased toward earlier app IDs; its size did not make it a representative visual sample.
  • The assistant explicitly acknowledged overshooting. Steam search had returned HTTP 429 responses, and continued retries on that redundant crawl were unnecessary. A proposed replacement was comprehensive metadata and URLs with bounded question-specific samples, but the owner then gave the stronger instruction: “Delete the images folder, delete all image downloading machinery.”
  • Both image directories, images.py, its compiled cache, download logs/status/probes, and database download queues and cached-file bookkeeping were removed. The database was compacted. Lightweight source URLs and game-to-image associations were retained because they are metadata, not downloaded images.
  • The assistant answered the owner’s completeness question directly: metadata was not finished at the pause. The then-current count of 184,559 game records and 185,170 candidate IDs was intermediate and was superseded by the completed snapshot below.
  • On the owner’s subsequent instruction to finish game-data collection, metadata collection resumed with pacing and stop-on-429 behavior. Image and other asset downloading remained removed. The finished source dataset contains no store-image, trailer, audio, or game binaries. Later PNG/SVG artifacts are locally generated statistical charts, not renewed store-image downloads.

Completed catalog coverage and normalization repairs:

  • The completed source snapshot contains 184,664 game apps: 128,972 marked released and 55,692 upcoming. Another 503 records are separated: 148 store-listed mods and 355 other app records. The SQLite master table named games contains all app types, so game queries require type=0; exports/games.parquet is already game-only.
  • All 185,173 discovered IDs were accounted for through records or redirects. All 23 structured storefront catalogs were enumerated, and their collected unique-ID counts matched the maximum totals Steam reported during collection. Small increases in several storefront totals were captured.
  • These are app identities, not a manual deduplication of titles or editions. The scope is the public catalogs checked, not every app ever registered with Steam. Completely delisted, unpublished, unlisted, or exclusively available outside those storefronts may be absent.
  • Preferred game metadata was fetched from September 5, 2026, 19:09:38 through 20:53:33 UTC. This is a collection window across a changing service, not an atomic snapshot. Retrieval provenance and coverage ranges remain in the artifacts.
  • An initially overstrict ordering check rejected final pages because Steam appends mods after games, each ordered within its type. The raw pages were retained and replayed after correcting the invariant; a numeric decrease at the type boundary was not missing data.
  • Seven regional or legacy IDs redirected to other canonical app IDs. Treating these as ordinary records could both create false gaps and overwrite canonical/regional statistics with alias responses. Explicit alias mappings were added; 25 affected canonical-country observations were restored, eight invalid regional observations removed, and no alias payload remained in the canonical records. The final alias table contains 33 country mappings for seven redirecting IDs.
  • Validation checked SQLite integrity, unique identities, embedded canonical IDs, alias handling, tag counts and definitions, relationship integrity, review-count and percentage ranges, and removal of the image directories/downloader/queue. Parquet row counts were verified after writing. The exported tables together occupied about 744 MB; the full source directory, including SQLite and raw responses, was about 8.6 GB at completion.

Exactly what data exists for games:

  • All 184,664 game records have identity/status fields and filtered review summaries, including zero-review games. Identity includes app ID, name, store URL/slug, type, visibility, and normalized free/upcoming/Early Access flags; 18 names were blank. Missing false-valued protocol flags use their defined defaults, while absent optional values remain missing.
  • Both description locations were collected. basic_info.short_description represents the short sidebar description and exists for 183,399 games. full_description_bbcode represents the full “About This Game” content and exists for 184,536 games, retaining formatting and embedded references. The full description is in data_json in SQLite and Parquet; the compact CSV contains only the short description. The owner specifically asked and received this clarification.
  • Tags are present for 184,621 games, covering 430 distinct labels, with IDs, names, Steam weights, and rank. Despite requesting more, the service returned up to 20 tags. Current tags are not historical launch tags.
  • Creator arrays include developers for 184,417 games, publishers for 183,942, and franchises for 36,967, with creator-clan IDs where supplied. These identify reported creators, not verified corporate ownership or team size.
  • Release information includes 143,967 Steam timestamps, 16,045 original-release timestamps, 7,536 original-Steam timestamps, and 774 Early Access exit timestamps, plus planned-release text/flags and platform dates where supplied. A planned timestamp does not establish that a game launched, and asset modification timestamps are not game update dates.
  • Review summaries contain count, positive percentage, score, and label. Separate English-specific summaries exist for only 5,211 games, and unfiltered summaries for only 158. Their absence is not zero; the dataset cannot provide a full language-demand breakdown from these fields.
  • Purchase options exist for 110,402 games, and a best option for 110,092. They include package/bundle IDs, current/list price strings, formatted prices, discounts, editions, gifting/grouping details, and included-game counts. These are current regional observations; bundles and add-ons require care before interpreting them as a standalone entry price.
  • Platform objects exist for every game, including Windows/macOS/Linux flags, VR information, and device compatibility codes, which may mean Unknown. Nonempty feature categories exist for 184,660 games. Language arrays exist for 184,559 games, of which 184,482 report at least one supported language; support, full-audio, and subtitle flags are separate.
  • Content-descriptor lists exist for 43,085 games, rating objects for 8,661, related-app objects for 38,507, and external links for 87,871. Related objects may include demos, standalone demos, playtests, and parents, but are not a complete historical demo record.
  • Media metadata includes artwork objects for 184,654 games, nonempty screenshot galleries for 184,354, and trailer objects for 168,253. Screenshot ordering/content grouping, filenames, URL patterns, overridden/original artwork references, and trailer formats are retained without media binaries. Game records link to 2,967,715 unique image references.
  • The exhaustive inventory contains 297 observed JSON paths, including nested/container paths, with types and presence/nonempty counts. Not collected catalog-wide: individual reviews, review histories, reviewer playtime, owners, unit sales, revenue, wishlists, concurrent players, historical prices, development duration, team size, marketing effort, achievement lists/counts, or system requirements. A later bounded review sample supplements only five games.

First broad analysis: population, comparisons, and safeguards:

  • After accepting the dataset, the owner authorized the first quantitative pass. Its main pool comprised 38,494 currently paid games outside Steam’s explicit-sex descriptors 3 and 4, in 2023–2025 store-date cohorts. This was not a manual quality filter. Whole-catalog supply tables retained free and explicit-content segments separately.
  • Of 128,972 released records, 128,878 had usable nonfuture dates; 93 lacked a usable date and one had a future date. These exceptions remained in the source but were excluded from dated analyses. original_steam_release_date took precedence where supplied, otherwise steam_release_date; incomplete Early Access history still limits interpretation of first exposure.
  • The main pool’s median was seven filtered reviews; 15.8% reached 100 reviews and 4.4% reached 1,000. Thresholds describe response scale, not financial success. Current lifetime totals cannot reconstruct launch performance, and older delisted games may be missing.
  • Broad tag tables used top-20 membership, with specificity checks; pair analysis required both tags within the top ten. The discovery screen evaluated 1,765 eligible pairs, froze 30 selections using 2023–2024 games, then inspected 2025 results. All 30 outcomes were retained, including weak ones. This separate-game comparison is not a historical forecasting backtest, and overlapping pairs are not independent replications.
  • Descriptive observed/expected comparisons standardized for release quarter and, in sensitivity checks, current USD entry-price tiers. Sparse strata fell back to broader date comparisons. These ratios are associations, not causal pricing or genre effects. Chart intervals were not corrections for exploratory selection or creator clustering.
  • Price extraction initially chose the cheapest among purchase options, which could select an add-on. It was corrected to Steam’s best non-bundle single-game package, excluding offers dependent on another owned app, using list/original price when available. This changed 2,101 records without changing the frozen pair selection.
  • Developer/publisher grouping used clan IDs with normalized-name fallback. Missing clan keys were filled only where a normalized name mapped to exactly one observed clan within its role; ambiguous names stayed unresolved. Largest-review and most-prolific creator removals were distinct sensitivity checks, alongside removal of the highest-review games.

Broad market expansion and differences hidden by tags:

  • The paid/non-explicit catalog contained 5,643 games in the 2019 cohort, 9,771 in 2023, and 15,674 in 2025. Their current counts above 100 reviews were 1,243, 1,672, and 2,277 respectively. Thus the larger catalog includes more substantially reviewed games as well as a larger low-response tail; 8,811 of the 2025 games had fewer than ten reviews.
  • The whole-catalog January–August supply comparison counted 17,709 releases dated in 2026 versus 12,925 in 2025. This measured surviving public-catalog supply, not changing probability of launch success.
  • Within the 2023–2025 paid/non-explicit pool, Action Roguelike had 2,966 games, median nine reviews, and 17.1% above 100; Auto Battler had 657, median 14, and 22.4%; Roguelike Deckbuilder had 412, median 40.5, and 36.9%. Fast growth in a tag’s share of releases did not necessarily imply exceptional response per game.
  • Incremental had 1,865 games, median seven reviews, and 14.2% above 100; Idler had 1,455, median 12, and 19.0%. Their position improved relative to similarly priced/date-grouped peers: approximately 1.52 and 2.06 times the expected 100-review counts respectively. This comparison did not show that lowering a price causes improvement.
  • Tags themselves can mislead: several filmed romance games were tagged Immersive Sim, so an aggregate for that label could not be read simply as demand for a Deus Ex-like design.

Desktop/background companions and filmed visual novels:

  • An exploratory description screen broadened the small Desktop Companion tag to promises involving productivity/focus tools, Pomodoro timers, or games occupying a screen corner while the user works or does something else. Among 2025 idlers, 42/130 companion-positioned games reached 100 reviews (32.3%, median 23), versus 117/650 other idlers (18.0%, median nine).
  • Sixteen companion matches exceeded 1,000 reviews. Similar quarter/price peers predicted approximately 25 games above 100; 42 were observed. Removing the largest developer or publisher left 31.8%. Examples included Tiny Pasture, Fantasy Map Simulator, Ropuka’s Idle Island, Tiny Aquarium, and Cornerpond. Taskbarn and Strange Shores illustrated that similar positioning could still receive little response.
  • The creative question proposed was what other ongoing systems people might enjoy alongside another activity. This was explicitly exploratory: the description screen was devised after seeing initial results and had no untouched validation sample.
  • Visual Novel + FMV in the top ten produced 69/86 games above 100 reviews, 23 above 1,000, and a median of 360 across 67 developer groups. Forty-eight also met 80% positive. The split was 33/42 in 2023–2024 and 36/44 in 2025; removing the publisher with the most reviews left 66/83 above 100. Price-sensitive comparisons remained favorable.
  • Dating Sim + FMV, Interactive Fiction + FMV, and Immersive Sim + FMV substantially overlapped this same cluster; they were treated as one finding. Descriptions included romance, relationship decisions, and palace intrigue, with Love Is All Around, Road to Empress I, and Mandate Of Heaven among the examples and Light of Reversing Destiny as a lower-response counterexample.
  • Seventy-seven of those 86 games supported Simplified Chinese and 68 English. This was product-localization evidence, not buyer nationality or regional sales, and limited transfer of the finding to another cultural/language market. The owner later ruled out making incrementals, idlers, or FMV visual novels; these remained broad research findings rather than recommendations for him.

Automation, inexpensive thrillers, and attractive leads that weakened:

  • Resource Management + Automation in the top ten contained 98 games across 94 developer groups, with 49 above 100 reviews and median 104. Satisfactory contributed 78.5% of total reviews, yet removing it left 48/97 above 100. Removing the top tenth by review count still left 44.3%, demonstrating the difference between a concentrated total and a broader distribution.
  • Inexpensive examples included Beltmatic, Factory Town Idle, Widget Inc., and Incredicer, whose descriptions framed production as arithmetic, a living spreadsheet, incremental manufacturing, and automated dice rolling. The Factory Must Grow, with eight reviews, provided a counterexample. The interpretation was a healthy family with varied presentations, not proof of economical production.
  • An important chronological qualification replaced the stronger initial pairing interpretation: although the 2025 automation/resource-management group remained above the broad pool, its additional advantage over automation alone did not survive the particular price comparison. Combining those two labels was not established as independently beneficial.
  • Thriller + Walking Simulator produced 43/146 games above 100 reviews, median 40, and median current entry price $4.99. The split was 25/80 in 2023–2024 and 18/66 in 2025; date/price and creator-removal checks remained favorable.
  • A narrower “ordinary work becomes horror” description screen did not show a clear 2025 advantage: 9/78 matches exceeded 100 reviews versus 387/2,428 other horror games. Night-shift, security, cashier, gas-station, and data-entry keywords did not establish a reliable formula merely because memorable examples existed.
  • Hidden Object + Cats weakened in raw holdout response, from 38/113 to 14/114 above 100 reviews, but the newer group still compared favorably with inexpensive peers. Hand-drawn + Cats was a clearer failure to repeat: 32/92 versus 2/62, also weak in the 2025 price comparison. Review histories would be needed before attributing either result to saturation.
  • Tiny intersections could manufacture apparent scarcity. Horror + Typing initially yielded three games using top-five tags, two above 1,000 reviews; widening to the returned top twenty gave 41 games, five above 1,000, and median eight. Similar rank-sensitivity checks tempered other rare combinations. Interesting examples did not establish an empty or underserved market.
  • The assistant finished and saved this analysis before delivering it, but became stuck composing the handover. The owner pointed this out using information from a side chat; the assistant acknowledged the delay and delivered the substantive findings in chat rather than relying solely on files.

Owner’s build-expression focus and why 2026 was separated:

  • The owner redirected the research toward “games where you can try lots of builds,” including items, characters, equipment, passives, abilities, and other systems allowing different ways to play. He explicitly excluded making incrementals, idlers, and visual-novel FMV games, and asked for the reasoning about 2026 before further research.
  • The assistant explained that 2026 had been excluded from the main broad outcome comparison because exposure time varied sharply: by September 5, a January release had about eight months while an August release had days or weeks. The first pass had nevertheless included 2026 in supply counts and exploratory rare pairs. Excluding it entirely from a current build-game investigation would miss relevant developments.
  • The agreed follow-up therefore separated full-year 2025, January–June 2026, and July–August 2026, comparing families within each window and standardizing for release timing and current price. January–August supply comparisons used equivalent calendar periods. No snapshot-only method could reconstruct a 2025 game’s review total at the same age as a 2026 game.
  • The conceptual questions concerned what is configured (character, equipment, deck, party, army, machine), how alternatives differ (interactions, class combinations, modifiers, skill trees, composition), and when decisions occur (pre-run, during a run, between encounters, persistent progression). Not every one of these axes proved recoverable reliably from text.

Build-expression classification and methodological limitations:

  • The classifier operated on stored short/full descriptions and tags, identifying explicit build variety, combinations/synergies, loadouts/playstyles, deck construction, class branching, party composition, and related object/quantity claims. It retained strict matches, a broader inclusive definition, and unconfirmed genre candidates, with excerpts explaining matches.
  • This measured advertised configuration opportunities, not verified gameplay depth, viable-build counts, balance, or enjoyment. Quantity claims alone were weaker evidence. Automatic combat did not disqualify an auto battler; central idler/incremental/FMVs and central visual novels were excluded, with exceptions for relevant game hybrids according to the saved rules.
  • The initial audit hid review counts and prices. Of 36 strict matches inspected, 31 clearly advertised configuration and five were ambiguous. Inclusive and unconfirmed examples helped expose false negatives and unclear boundaries. This small audit was a diagnostic, not a certified accuracy estimate.
  • False positives included “interactive items,” genre/control combinations, individual tactical actions, fixed progression, and ordinary storage. Rules were refined; 64 further centrally marketed idle/incremental records were removed after examining short pitches. A diagnostic full-description idle signal was later repaired without changing the substantive membership logic.
  • Family labels overlap. Top-five genre membership was too restrictive for some recognizable games: Slay the Spire 2’s Roguelike Deckbuilder tag was sixth in the snapshot. Final central family comparisons used top-20 tag membership, with top-five/top-ten checks retained rather than silently counting those definitions interchangeably.
  • Comparisons used review thresholds, positivity, medians, concentration, publisher removals, known-history exclusions, direct textual signals, inclusive/strict definitions, tag-rank changes, current-price tiers, and description-length checks. All remain observational; current store prose/tags can change after success and English-oriented text matching can miss relevant games.

Build-expression supply and final 2025–2026 family results:

  • Comparing January–August cohorts after the focal exclusions, eligible paid games rose from 9,140 in 2025 to 12,409 in 2026 (+36%). Strict build-expression matches rose from 843 to 1,717 (+104%), increasing their share from 9.2% to 13.8%. The broader definition also nearly doubled. This is growth in advertised build expression, potentially reflecting store-language changes as well as design changes.
  • There were already 146 strict January–August 2026 matches with at least 100 reviews and at least 80% positive, versus 109 in the corresponding 2025 cohort. Different population sizes and exposure times prevent interpreting these counts as improving success rates.
  • The combined positive-response benchmark was introduced because attention and satisfaction diverged. For full-year 2025, January–June 2026, and July–August 2026 respectively, all strict focal build matches numbered 1,365, 1,085, and 632; 181, 101, and 45 met the combined benchmark, or 13.3%, 9.3%, and 7.1%.
  • Within those same three windows, top-20 Roguelike Deckbuilder matches met the benchmark at 41/169 (24.3%), 22/132 (16.7%), and 10/67 (14.9%). Action Roguelike was 58/449 (12.9%), 29/361 (8.0%), and 12/204 (5.9%). Auto Battler was 20/121 (16.5%), 9/90 (10.0%), and 5/46 (10.9%). Tower Defense was 15/99 (15.2%), 9/84 (10.7%), and 1/48 (2.1%).
  • Families must be compared within each period; the falling rates across periods mix unequal accumulation time and do not establish market deterioration. The newest windows are especially provisional, and a handful of qualifying games cannot justify announcing a boom or collapse.
  • Roguelike deckbuilders showed the clearest persistent favorable association: approximately 1.50, 1.39, and 1.49 times their date/current-price expected combined-positive counts. The pattern survived tag-cutoff changes and largest-review-publisher removal. This was stronger evidence than the broad “cards/decks” label, not proof of a causal genre advantage.
  • Review-volume concentration was particularly misleading here. Slay the Spire 2 had 182,020 reviews but 61% positive in the snapshot and contributed about 80% of first-half card/deck review volume. Summing reviews would conceal the response distribution and satisfaction differences among other games.
  • Advertised counts of 100+ options had a recurring favorable association in some comparisons, but these are unverified quantity claims and cannot show that adding more items causes better reception. The final interpretation emphasized consequential alternatives rather than nominal counts.

Concrete build-game examples and differentiation hypotheses:

  • Auto battlers offered varied configurations despite only modest aggregate advantages: Oaken Tower advertised a tower of interacting items (2,889 reviews, 89% positive); Skull Horde a necromancer’s army and loot (1,070, 81%); Legionbound recruited heroes/class synergies/ascensions (642, 83%); Wireworks a module board, wiring, and signals (602, 89%); Hive Blight a team of insect warriors (357, 94%). These figures are September 5 observations.
  • The assistant’s interpretation was that what players assemble, and the rules connecting its parts, offer room for differentiation inside recognizable combat structures. This was a design hypothesis drawn from examples, not a dataset proof that these structures are inexpensive or underserved.
  • Action build games remained active without much additional favorable association over the build-game baseline after date/price adjustment. Examples included Vital Shell’s fantasy-archetype mechs (1,699 reviews, 96% positive, $5.99), Arms of God’s five simultaneous weapons/upgrading/merging (1,845, 88%, $11.50), and TerraTech Legion’s block-built combat vehicle (2,060, 81%, $9.99).
  • Tangy TD advertised item-equipped class-based towers and build choices (1,494 reviews, 90% positive), and Backpack Dungeon advertised placement, adjacency, and triggers as the combat core (622, 88%). However, the broader spatial-inventory classifier also captured ordinary storage; tightening it left too few cases for a defensible underserved-niche claim. The apparent broad advantage was dropped.
  • Counterexamples included Packmates, combining survivor combat and adjacency, with 38 reviews, and Twisted Fate, advertising party builds and ability modifiers, with 39. Their existence did not disprove the ideas but prevented treating the selected successes as a general recipe.
  • A familiar activity carrying build mechanics—chess, dice, poker, and related forms—showed no consistent general advantage. Individual successes remained useful examples, but “familiar activity plus roguelike builds” was insufficient as a market thesis. Pre-run/drafting and machine/party distinctions likewise did not yield a reliable universal recommendation merely because the classifier could generate a row for them.

Bounded review sample and meaningful alternatives versus nominal variety:

  • The July–August loot/action-RPG subset initially appeared strong on attention: 10/34 games had at least 100 reviews. Only two also reached 80% positive. This motivated a small review investigation rather than interpreting high review volume as satisfied demand for their build systems.
  • The assistant announced a fixed sample of at most 30 positive and 30 negative recent English Steam-purchase reviews for each of SpiritVale, Beast of Reincarnation, Echoes of Aincrad, Shadow Dungeon, and Ruins of Dawn. Ten requests returned 273 reviews; Ruins of Dawn had fewer available matches. Network collection was disabled again immediately afterward; no assets were downloaded.
  • The sample intentionally selected both sentiments and cannot estimate complaint prevalence, overall satisfaction, country-level demand, or sales. The claims below are interpretations of selected player accounts, not independent verification that the described defects or mechanics exist.
  • Negative Shadow Dungeon reviewers described enormous advertised item/build counts resolving into numerical variations, repeated gear bases, linear elemental choices, or eventually buying all useful skills so configuration stops requiring tradeoffs. Some positive reviewers still enjoyed the loot/progression loop while expressing related reservations.
  • A positive Ruins of Dawn reviewer described a dagger interacting with a ring so that its lower displayed base damage became better for a particular setup; another described itemization transforming an initially weak fireball. These supplied concrete examples of configuration-dependent usefulness.
  • SpiritVale reviews could praise respec flexibility and class/item optimization while criticizing servers, balance, bots, economy, or support. Other sampled games mixed combat/build criticism with presentation, pacing, performance, or franchise expectations. Aggregate dissatisfaction therefore could not simply be attributed to rejection of build expression.
  • The resulting hypothesis was “conditional value”: an item becomes desirable because of a particular setup or changes what an ability does, rather than merely increasing a number until every option is owned. The assistant proposed prioritizing a compact game with a distinctive configuration rule and consequential interactions, while explicitly acknowledging that Steam data did not establish development duration or minimal-marketing viability.

Artifacts, verification, and continuation:

  • Source data and collection documentation live under /home/adn/a327ex/steam-research/2026-09-05/ and the research-root README.md. Key files are catalog.sqlite, exports/games.parquet, exports/other_apps.parquet, exports/games.csv.gz, exports/schema.json, exports/manifest.json, field_inventory.csv/.json, coverage.json, validation.json, metadata_complete.json, alias_repair.json, provenance.json, and compressed raw/ responses.
  • The first analysis lives under /home/adn/a327ex/steam-research/analysis-2026-09-05/: findings.md, README.md, prepared game/tag Parquet files, yearly and January–August tables, tag_landscape.csv, all/frozen/holdout pair tables, group-member exports, rare-pair and description follow-ups, price corrections, generated pair/price comparison charts, and validation.json. Scripts support reproducing preparation, analysis, deeper checks, follow-ups, charts, and validation.
  • The focal pass lives under /home/adn/a327ex/steam-research/build-expression-2026-09-05/: findings.md, README.md, classification.parquet, classification/analysis specifications, blind audit and labels, analysis_membership.parquet, supply.csv, family_results.csv, period/definition/tag-rank sensitivity data, per-family member Parquet exports, review CSV/manifest/raw samples, classifier/analysis/review scripts, and final validation artifacts.
  • The broad analysis verified source/identity/date accounting, frozen selection hashes, discovery/holdout separation, recomputed baseline/year/pair counts, script parsing, and disabled media/network collection. The build pass ultimately passed all 39 consistency checks, including reproduction of 500 classifier records, calibrated baseline ratios, family counts, bounded review sampling, network pause, and absence of downloader/media directories. A stale diagnostic classifier signal was corrected before the successful run.
  • The most useful continuation is to investigate concrete configuration mechanisms and the distinction between meaningful alternatives and numerical abundance, using the saved game lists and evidence excerpts. A separately bounded review-history collection could answer questions about age-adjusted traction that this snapshot cannot. No decision was made to build a specific new game or change a current project.
  • The owner requested ending the session under the title “Steam Market Research 5” and continuing research in another task. Because the main agent had compacted, he explicitly asked that a subagent read the complete converted Markdown transcript and write the session summary independently. This summary follows that full converted record; historical tool output that was already truncated in the record is not represented as recovered text.

Let's try another task. I worked on Steam market research with Fable. You may not read those logs nor their summaries, as I'd like you to do this research again but see what you can derive anew yourself. I used to be extremely on top of Steam and know all the details about what you "had" to do to be successful in the market, but 5 years have passed and I'd like to update myself. most of what I did involved collecting data on all Steam games and writing various scripts to answer questions I had and understand trends better. I'd like you to do some of that work today, however, I'd also like you to generate most research directions and questions and then useful answers that exploit openings in the market that other people might not have noticed. To do this, I'd like you to avoid reading ANY AND ALL Steam marketing research blog posts (including the previous ones generated by Fable), such as howtomarketagame and similar. This isn't because those blogs aren't good, but it's because their own analysis is already what's on the minds of every indie developer, and I'd like insights different from theirs. But again, you shouldn't read any of it because I don't want your research to be opposed to theirs, I want it to be simply indifferent. So, first, how would you go about this task? Ask me any questions you might have, and maybe even learn more about me by reading through what I've written regarding how I like to make games, how I like to market them, etc. I am especially fond of the "make a game in a few months and market it with minimal effort but high possible gain actions" technique, although I'm open to variations or changes to my approach, since I don't know what the market is like today anymore.

GPT-6 Astra high

I’ll start by looking for your own writing about making and releasing games, while excluding the Fable research and all Steam marketing analysis. Then I’ll propose a research approach built around raw market evidence and the kinds of games and release cycles you actually want to pursue.

exec ([memory: sealed target])

[sealed content withheld: memory]

For a game made in a few months, what would count as a satisfying result for you today—in money, audience, or something else—and how much time and cash would you comfortably risk?

Which marketing actions would you willingly do, and which would make the whole approach unattractive? For example: a browser prototype, demo or festival, contacting creators, occasional posts, regular videos, or launch discounts.

Should the first research pass mainly inform Horse Game, identify future games you could make in a few months, or both? Are there kinds of games you would refuse to make even if the evidence looked promising?

  • Future short-cycle games
  • Both
  • Horse Game first

request_user_input_async ({"questions": [{"title": "For a game made in a few months, what would count as a satisfying result for you today—in m...)

{"accepted":true}

exec ({"code": "text(await tools.exec_command({cmd:\"rg --files -g '!log' -g '!summar' -g '!node_modules' -g '!.private...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"b3c231","wall_time_seconds":0.000002512,"exit_code":0,"original_token_count":1609,"output":"/home/adn/a327ex/a327ex-site/gated/reverse-minesweeper-prototype.md\n/home/adn/a327ex/a327ex-site/README.md\n/home/adn/a327ex/a327ex-site/vault/062026-10.md\n/home/adn/a327ex/a327ex-site/vault/it-follows-psyche-voice-the-time-stop-story.md\n/home/adn/a327ex/a327ex-site/vault/062026-ability-hud.md\n/home/adn/a327ex/a327ex-site/vault/062026-9.md\n/home/adn/a327ex/a327ex-site/vault/062026-8.md\n/home/adn/a327ex/a327ex-site/vault/062026-7.md\n/home/adn/a327ex/a327ex-site/vault/062026-5.md\n/home/adn/a327ex/a327ex-site/vault/062026-13.md\n/home/adn/a327ex/a327ex-site/vault/062026-12.md\n/home/adn/a327ex/a327ex-site/vault/062026-11.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-13.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-12.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-11.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-10.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-1.md\n/home/adn/a327ex/a327ex-site/vault/aba-games-variations-knight-vs-pawns-7.md\n/home/adn/a327ex/a327ex-site/vault/aba-games-variations-knight-vs-pawns-2.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-2.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-17.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-16.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-15.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-14.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-5.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-4.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-3.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-7.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-6.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-8.md\n/home/adn/a327ex/a327ex-site/vault/anchor-website-9.md\n/home/adn/a327ex/a327ex-site/vault/bytepath-design-and-base-game.md\n/home/adn/a327ex/a327ex-site/vault/bytepath-attacks-and-seeker.md\n/home/adn/a327ex/a327ex-site/vault/bytepath-realignment.md\n/home/adn/a327ex/a327ex-site/deploy/backfill_metadata.py\n/home/adn/a327ex/a327ex-site/deploy/a327ex.service\n/home/adn/a327ex/a327ex-site/deploy/a327ex-backup.timer\n/home/adn/a327ex/a327ex-site/deploy/a327ex-backup.service\n/home/adn/a327ex/a327ex-site/deploy/CONTENT_SYNTAX.md\n/home/adn/a327ex/a327ex-site/deploy/chat_preview.sh\n/home/adn/a327ex/a327ex-site/deploy/build_llms_package.py\n/home/adn/a327ex/a327ex-site/deploy/backup.sh\n/home/adn/a327ex/a327ex-site/deploy/convert_syntax.py\n/home/adn/a327ex/a327ex-site/deploy/cloudflare-realip.conf\n/home/adn/a327ex/a327ex-site/vault/bytepath-vector-style-and-destructible-terrain.md\n/home/adn/a327ex/a327ex-site/deploy/migrate_links.py\n/home/adn/a327ex/a327ex-site/deploy/migrate_media.py\n/home/adn/a327ex/a327ex-site/deploy/visitor-stats.sh\n/home/adn/a327ex/a327ex-site/deploy/radio-beacon.user.js\n/home/adn/a327ex/a327ex-site/deploy/nginx-new-a327ex.conf\n/home/adn/a327ex/a327ex-site/deploy/nginx-a327ex.conf\n/home/adn/a327ex/a327ex-site/deploy/nginx-a327ex-engine.conf\n/home/adn/a327ex/a327ex-site/vault/totemoji-1.md\n/home/adn/a327ex/a327ex-site/vault/soul-society-1.md\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/005.jpg\n/home/adn/a327ex/a327ex-site/vault/snkrx-ui-cards-and-keywords.md\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/004.jpg\n/home/adn/a327ex/a327ex-site/vault/snkrx-swordsman-magician-outlaw-cannoneer.md\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/003.png\n/home/adn/a327ex/a327ex-site/vault/snkrx-swordsman-and-archer-lv-3-redesign.md\n/home/adn/a327ex/a327ex-site/vault/snkrx-stats.md\n/home/adn/a327ex/a327ex-site/vault/snkrx-snake.md\n/home/adn/a327ex/a327ex-site/vault/snkrx-merging-and-inventory.md\n/home/adn/a327ex/a327ex-site/vault/snkrx-archer.md\n/home/adn/a327ex/a327ex-site/vault/snkrx-3d-1.md\n/home/adn/a327ex/a327ex-site/vault/meso-exam-exploration.md\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/014.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/002.png\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/013.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/001.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/a004-reverse-minesweeper-v4.html\n/home/adn/a327ex/a327ex-site/media/HJrbHPPWIAEXiVA.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/a003-reverse-minesweeper-v3.html\n/home/adn/a327ex/a327ex-site/media/1779226922022785.mp4\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/a002-reverse-minesweeper-v2.html\n/home/adn/a327ex/a327ex-site/media/1779182856161263.webm\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/a001-reverse-minesweeper-v1.html\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/012.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/011.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/010.png\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/009.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/008.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/007.jpg\n/home/adn/a327ex/a327ex-site/media/gated/reverse-minesweeper-prototype/006.jpg\n/home/adn/a327ex/a327ex-site/static/unlock.js\n/home/adn/a327ex/a327ex-site/static/new-theme.css\n/home/adn/a327ex/a327ex-site/static/new-theme.js\n/home/adn/a327ex/a327ex-site/static/new-theme-navigation.js\n/home/adn/a327ex/a327ex-site/static/admin-setup.js\n/home/adn/a327ex/a327ex-site/media/replays-player/windrang/anchor-cb8dad6145.wasm\n/home/adn/a327ex/a327ex-site/media/replays-player/windrang/anchor-cb8dad6145.js\n/home/adn/a327ex/a327ex-site/media/replays-player/windrang/windrang-7686925c0f.js\n/home/adn/a327ex/a327ex-site/media/replays-player/windrang/windrang-22300a5946.data\n/home/adn/a327ex/a327ex-site/media/replays-player/windrang/index.html\n/home/adn/a327ex/a327ex-site/media/shared/anchor-v1-tree/index.html\n/home/adn/a327ex/a327ex-site/media/replays-player/knightvspawns/anchor-cb8dad6145.wasm\n/home/adn/a327ex/a327ex-site/media/replays-player/knightvspawns/anchor-cb8dad6145.js\n/home/adn/a327ex/a327ex-site/media/replays-player/knightvspawns/knightvspawns-8b1cdc92b7.js\n/home/adn/a327ex/a327ex-site/media/replays-player/knightvspawns/knightvspawns-d7f471d2b1.data\n/home/adn/a327ex/a327ex-site/media/replays-player/knightvspawns/index.html\n"}
{"chunk_id":"b7d78c","wall_time_seconds":0.000002994,"exit_code":0,"original_token_count":368,"output":"/home/adn/a327ex\n/home/adn/a327ex/Anchor\n/home/adn/a327ex/Anchor/engine\n/home/adn/a327ex/Anchor/workflow\n/home/adn/a327ex/Anchor/launcher\n/home/adn/a327ex/Anchor/apps\n/home/adn/a327ex/ABAgames\n/home/adn/a327ex/ABAgames/knightvspawns\n/home/adn/a327ex/ABAgames/windrang\n/home/adn/a327ex/.claude\n/home/adn/a327ex/.claude/skills\n/home/adn/a327ex/.claude/commands\n/home/adn/a327ex/a327ex-site\n/home/adn/a327ex/a327ex-site/deploy\n/home/adn/a327ex/a327ex-site/drafts\n/home/adn/a327ex/a327ex-site/logs\n/home/adn/a327ex/a327ex-site/media\n/home/adn/a327ex/a327ex-site/messages\n/home/adn/a327ex/a327ex-site/notes\n/home/adn/a327ex/a327ex-site/pages\n/home/adn/a327ex/a327ex-site/posts\n/home/adn/a327ex/a327ex-site/renderer\n/home/adn/a327ex/a327ex-site/server\n/home/adn/a327ex/a327ex-site/static\n/home/adn/a327ex/a327ex-site/stories\n/home/adn/a327ex/a327ex-site/vault\n/home/adn/a327ex/a327ex-site/gated\n/home/adn/a327ex/media\n/home/adn/a327ex/media/fonts\n/home/adn/a327ex/lookdev\n/home/adn/a327ex/lookdev/shared\n/home/adn/a327ex/lookdev/voxel\n/home/adn/a327ex/lookdev/ps1\n/home/adn/a327ex/lookdev/lowpoly\n/home/adn/a327ex/lookdev/toon\n/home/adn/a327ex/lookdev/sprites\n/home/adn/a327ex/lookdev/reference\n/home/adn/a327ex/lookdev/select\n/home/adn/a327ex/lookdev/meadow\n/home/adn/a327ex/lookdev/meadow-anchor\n/home/adn/a327ex/tools\n/home/adn/a327ex/tools/blender-4.5.12-linux-x64\n/home/adn/a327ex/notes\n/home/adn/a327ex/sketches\n/home/adn/a327ex/sketches/2026-09-03-reverse-minesweeper\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"rg --files /home/adn/a327ex/a327ex-site/posts /home/adn/a327ex/a327ex-...)

Script completed
Wall time 2.9 seconds
Output:

{"chunk_id":"db6608","wall_time_seconds":0.000002559,"exit_code":0,"original_token_count":3520,"output":"/home/adn/a327ex/a327ex-site/pages/home.md\n/home/adn/a327ex/a327ex-site/pages/td-genealogy-and-card-td.md\n/home/adn/a327ex/a327ex-site/pages/emergent-exam-genealogy.md\n/home/adn/a327ex/a327ex-site/posts/2026-09-04-114333.md\n/home/adn/a327ex/a327ex-site/posts/2026-09-03-004108.md\n/home/adn/a327ex/a327ex-site/posts/2026-09-01-201941.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-31-163226.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-31-112513.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-31-114931.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-31-105837.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-31-000712.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-30-213035.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-30-212139.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-30-111649.md\n/home/adn/a327ex/a327ex-site/posts/writing-and-gamedev.md\n/home/adn/a327ex/a327ex-site/posts/verifiers-and-readers.md\n/home/adn/a327ex/a327ex-site/posts/roguelite-design-analysis.md\n/home/adn/a327ex/a327ex-site/posts/emoji-ball-battles.md\n/home/adn/a327ex/a327ex-site/posts/claude-code-silently-deletes-local-sessions-after-30-days.md\n/home/adn/a327ex/a327ex-site/posts/anchor-engine-overview.md\n/home/adn/a327ex/a327ex-site/posts/a-conversation-with-a327ex.md\n/home/adn/a327ex/a327ex-site/posts/999086.md\n/home/adn/a327ex/a327ex-site/posts/926497.md\n/home/adn/a327ex/a327ex-site/posts/739712.md\n/home/adn/a327ex/a327ex-site/posts/658341.md\n/home/adn/a327ex/a327ex-site/posts/625954.md\n/home/adn/a327ex/a327ex-site/posts/510718.md\n/home/adn/a327ex/a327ex-site/posts/474000.md\n/home/adn/a327ex/a327ex-site/posts/432159.md\n/home/adn/a327ex/a327ex-site/posts/324919.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-29-024359.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-29-020602.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-29-013916.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-29-012837.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-29-011050.md\n/home/adn/a327ex/a327ex-site/posts/170011.md\n/home/adn/a327ex/a327ex-site/posts/143407.md\n/home/adn/a327ex/a327ex-site/posts/130163.md\n/home/adn/a327ex/a327ex-site/posts/025196.md\n/home/adn/a327ex/a327ex-site/posts/022022.md\n/home/adn/a327ex/a327ex-site/posts/001180.md\n/home/adn/a327ex/a327ex-site/posts/000001.md\n/home/adn/a327ex/a327ex-site/posts/000000.md\n/home/adn/a327ex/a327ex-site/posts/what-predicts-indie-success.md\n/home/adn/a327ex/a327ex-site/posts/unity_runtime_backstabbing_2023.md\n/home/adn/a327ex/a327ex-site/posts/unity_godot_artists_money.md\n/home/adn/a327ex/a327ex-site/posts/ui-design-workflow.md\n/home/adn/a327ex/a327ex-site/posts/the_foreign_man.md\n/home/adn/a327ex/a327ex-site/posts/the_follower.md\n/home/adn/a327ex/a327ex-site/posts/the_desert_walker.md\n/home/adn/a327ex/a327ex-site/posts/the-vicious-tactics-of-female-sexual-competition.md\n/home/adn/a327ex/a327ex-site/posts/super_people_test_session.md\n/home/adn/a327ex/a327ex-site/posts/super_people_major_update.md\n/home/adn/a327ex/a327ex-site/posts/super_people_final_beta.md\n/home/adn/a327ex/a327ex-site/posts/super_people_design_review.md\n/home/adn/a327ex/a327ex-site/posts/super_auto_pets_mechanics.md\n/home/adn/a327ex/a327ex-site/posts/status_addicts.md\n/home/adn/a327ex/a327ex-site/posts/soul_society_revised.md\n/home/adn/a327ex/a327ex-site/posts/soul_society.md\n/home/adn/a327ex/a327ex-site/posts/son_of_a_serpent.md\n/home/adn/a327ex/a327ex-site/posts/snkrx_log.md\n/home/adn/a327ex/a327ex-site/posts/small_games.md\n/home/adn/a327ex/a327ex-site/posts/skyland.md\n/home/adn/a327ex/a327ex-site/posts/skill_death_spirals.md\n/home/adn/a327ex/a327ex-site/posts/self_expression_vesselization.md\n/home/adn/a327ex/a327ex-site/posts/roguelite-design-analysis-2.md\n/home/adn/a327ex/a327ex-site/posts/reincarnated-as-the-only-piece-that-can-l-jump-mighty-and-powerful-and-dashingly-handsome-horse-effortlessly-tramples-one-thousand-pawns-for-all-to-witness.md\n/home/adn/a327ex/a327ex-site/posts/privacy.md\n/home/adn/a327ex/a327ex-site/posts/opus-4-5.md\n/home/adn/a327ex/a327ex-site/posts/offerings_to_god.md\n/home/adn/a327ex/a327ex-site/posts/nfts_status_creativity.md\n/home/adn/a327ex/a327ex-site/posts/neovim-diff-setup.md\n/home/adn/a327ex/a327ex-site/posts/marketing_skills.md\n/home/adn/a327ex/a327ex-site/posts/lv99_lich.md\n/home/adn/a327ex/a327ex-site/posts/luck.md\n/home/adn/a327ex/a327ex-site/posts/lessons_second_game.md\n/home/adn/a327ex/a327ex-site/posts/karma_demon.md\n/home/adn/a327ex/a327ex-site/posts/january-notes.md\n/home/adn/a327ex/a327ex-site/posts/indiedevs_cancelled.md\n/home/adn/a327ex/a327ex-site/posts/indiedev_creativity.md\n/home/adn/a327ex/a327ex-site/posts/how-the-fire-effect-works.md\n/home/adn/a327ex/a327ex-site/posts/high_level_game_design.md\n/home/adn/a327ex/a327ex-site/posts/grok-explode-his-balls.md\n/home/adn/a327ex/a327ex-site/posts/game_quality.md\n/home/adn/a327ex/a327ex-site/posts/deep_instinctive_changes.md\n/home/adn/a327ex/a327ex-site/posts/dashed_lines.md\n/home/adn/a327ex/a327ex-site/posts/cons_compassion.md\n/home/adn/a327ex/a327ex-site/posts/conclusions-from-4-months-of-ai-usage.md\n/home/adn/a327ex/a327ex-site/posts/competition.md\n/home/adn/a327ex/a327ex-site/posts/compass_maxxing_infinite_loop.md\n/home/adn/a327ex/a327ex-site/posts/community_management.md\n/home/adn/a327ex/a327ex-site/posts/auto_chess_formula.md\n/home/adn/a327ex/a327ex-site/posts/authorship.md\n/home/adn/a327ex/a327ex-site/posts/archive.md\n/home/adn/a327ex/a327ex-site/posts/anchor-2-engine-overview.md\n/home/adn/a327ex/a327ex-site/posts/ai_usage.md\n/home/adn/a327ex/a327ex-site/posts/ai-time-discount-inversion.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-22-103730.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-19-191552.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-19-100236.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-19-004326.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-19-001653.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-19-000323.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-18-230229.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-18-213247.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-18-210343.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-18-205314.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-11-213654.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-09-203349.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-09-130031.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-08-180526.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-08-161433.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-07-134521.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-07-125138.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-07-114354.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-07-113414.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-06-230841.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-03-045529.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-03-041701.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-02-082253.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-01-180118.md\n/home/adn/a327ex/a327ex-site/posts/2026-08-01-044746.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-31-095259.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-30-115124.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-28-223257.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-28-221450.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-28-213723.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-28-203142.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-28-090017.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-23-104718.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-22-002320.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-21-215601.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-21-021047.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-20-143032.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-18-120613.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-17-222359.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-17-111138.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-16-181804.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-14-183427.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-14-180414.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-14-174351.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-14-154503.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-14-152103.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-13-101145.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-12-010140.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-11-173855.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-10-202638.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-09-124628.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-07-204709.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-04-123056.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-03-235111.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-03-233953.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-03-230041.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-03-224719.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-01-213155.md\n/home/adn/a327ex/a327ex-site/posts/2026-07-01-114939.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-29-231405.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-28-232639.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-28-231739.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-28-115848.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-28-114419.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-28-020253.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-25-220823.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-25-213832.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-25-192215.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-25-145417.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-25-105748.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-24-215928.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-24-215103.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-24-212935.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-24-210809.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-24-205110.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-23-201128.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-21-141313.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-21-103134.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-21-085927.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-20-234037.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-09-093857.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-09-092802.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-08-184458.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-08-133445.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-08-113225.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-08-005329.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-07-231158.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-07-225301.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-07-224854.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-07-224458.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-07-132119.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-06-234925.md\n/home/adn/a327ex/a327ex-site/posts/2026-06-06-202103.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-26-195715.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-26-195601.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-26-193749.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-26-000515.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-25-220745.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-25-063507.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-25-013229.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-25-001455.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-24-115346.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-24-114319.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-23-214132.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-23-204830.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-23-204820.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-23-120331.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-23-000152.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-22-102142.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-22-095724.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-21-163053.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-21-144042.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-21-015713.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-20-230113.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-20-224816.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-20-211456.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-20-131655.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-20-124225.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-20-104610.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-19-212903.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-19-183226.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-19-175517.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-19-171119.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-19-112614.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-17-225813.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-17-081510.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-10-111926.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-10-100428.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-09-174843.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-09-011229.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-08-225224.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-07-195722.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-07-142845.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-07-093115.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-07-002156.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-06-231535.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-06-183343.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-05-233048.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-05-202710.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-05-184655.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-05-121038.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-05-000658.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-04-233711.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-04-124115.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-04-000900.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-03-230929.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-03-213645.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-03-210744.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-03-203538.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-03-192415.md\n/home/adn/a327ex/a327ex-site/posts/2026-05-03-161453.md\n/home/adn/a327ex/a327ex-site/posts/2022.md\n/home/adn/a327ex/a327ex-site/posts/1_in_4.md\n"}
User Reviews - Get List (Steamworks Documentation) (https://partner.steamgames.com/doc/store/getreviews)
citeturn0view0 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({"ref_id":"https://partner.steamgames.com/doc/store/getreviews","lineno":null}); Total lines: 446
L0: Steamworks Documentation
L1: 
L2: [Input: Search Steamworks Documentation…] [Input]
L3:   * cite0†Documentation Home Page L4:   * cite1†Getting Started L5:     * cite2†Onboarding L6:     * cite3†Steam Direct Fee L7:     * cite4†Managing Your Steamworks Account L8:       * cite5†User Permission: Receive Steamworks Communication L9:     * cite6†Managing Applications L10:       * cite7†Application Management Sharing L11:       * cite8†Transferring Applications L12:     * cite9†Bringing Mobile Games to Steam L13:     * cite10†Content Survey L14:       * cite11†Age Ratings in Indonesia L15:       * cite12†Age Ratings Mandatory in Germany L16:     * cite13†Frequently Asked Questions L17:   * cite14†Store Presence L18:     * cite15†Applications L19:       * cite16†Branches (Betas) L20:       * cite17†Builds L21:       * cite18†Bundles L22:         * cite19†Creating Bundles Across Multiple Developers/Publishers L23:       * cite20†Demos L24:       * cite21†Depots L25:       * cite22†Downloadable Content (DLC) L26:         * cite23†DLC Visibility L27:       * cite24†Game Soundtracks on Steam L28:       * cite25†Packages L29:         * cite26†Autogrant Packages L30:         * cite27†Creating and Configuring Deluxe Packs L31:       * cite28†Platforms L32:         * cite29†Developing for SteamOS and Linux L33:     * cite30†Coming Soon L34:     * cite31†Developer And Publisher Homepages L35:       * cite32†Homepage Example L36:     * cite33†Early Access L37:     * cite34†Explain Your Editions L38:     * cite35†Franchise Pages L39:     * cite36†Free To Play Games L40:     * cite37†Graphical Assets - Overview L41:       * cite38†Artwork Overrides L42:       * cite39†Community and Client Icons L43:       * cite40†Event Graphical Assets L44:       * cite41†Graphical Asset Rules L45:       * cite42†Library Assets L46:       * cite43†Store Graphical Assets L47:     * cite44†Livestreaming L48:       * cite45†Setting Up A Stream L49:       * cite46†Frequently Asked Questions L50:       * cite47†Broadcast Moderation and Adding Moderators L51:       * cite48†Broadcast Viewership Statistics L52:       * cite49†Livestreaming a Game Demo to the Steam Store L53:     * cite50†Localization and Languages L54:       * cite51†Languages Supported on Steam L55:     * cite52†Pre-Purchasing on Steam L56:     * cite53†Pricing L57:       * cite54†Adding A New Currency L58:       * cite55†Package Pricing CSV Import/Export L59:       * cite56†Recurring Subscriptions L60:       * cite57†Supported Currencies L61:     * cite58†Promo Event Tools, Rules, and Guidelines L62:       * cite59†Participating in Third-Party Sales Events L63:       * cite60†Developer, Publisher, and Franchise Sale Pages L64:       * cite61†Hosting Third-Party Sales Events L65:     * cite62†Release Dates L66:     * cite63†Release Options L67:     * cite64†Release Process L68:     * cite65†Removing a product from Steam L69:     * cite66†Review Process L70:     * cite67†Roadmaps L71:     * cite68†Season Passes L72:     * cite69†Steam China L73:     * cite70†Steam Tags L74:     * cite71†Store Page, Building and Editing L75:       * cite72†Store Page Accolades L76:       * cite73†Store Page Extra Asset Management L77:       * cite74†Store Page Written Description L78:     * cite75†Testing On Steam L79:     * cite76†Top Sellers Lists L80:     * cite77†Trailers L81:     * cite78†Updating Your Game - Best Practices L82:     * cite79†User Reviews L83:   * cite80†Features L84:     * cite81†Anti-cheat and Game Bans L85:       * cite82†Anti-Cheat Integration L86:     * cite83†Common Redistributables L87:     * cite84†Enhanced Rich Presence L88:     * cite85†Game Notifications L89:     * cite86†Microtransactions (In-Game Purchases) L90:       * cite87†Microtransactions Implementation Guide L91:       * cite88†Recurring In-Game Billing L92:     * cite89†Multiplayer L93:       * cite90†Game Servers L94:       * cite91†Steam Datagram Relay L95:       * cite92†Steam Matchmaking & Lobbies L96:         * cite93†Matchmaking based on skill L97:       * cite94†Steam Networking L98:     * cite95†Stats and Achievements L99:       * cite96†Step by Step: Achievements L100:       * cite97†Step by Step: Stats L101:     * cite98†Steam Audio L102:     * cite99†Steam Cloud L103:     * cite100†Steam Cloud Play (Beta) L104:     * cite101†Steam Community L105:     * cite102†Steam DRM L106:     * cite103†Steam Error Reporting L107:     * cite104†Steam Families L108:     * cite105†Steam HTML Surface L109:     * cite106†Steam Input L110:       * cite107†Action Manifest Files L111:       * cite108†Action Set Layers L112:       * cite109†Activators L113:       * cite110†Browsing Configurations L114:       * cite111†General Concepts L115:       * cite112†Getting Started for Developers L116:       * cite113†Getting Started for Players L117:       * cite114†In-Game Actions File L118:       * cite115†Input Source Modes L119:       * cite116†Input Sources L120:       * cite117†Legacy Mode Bindings L121:       * cite118†Mode Shifting L122:       * cite119†Mouse Regions L123:       * cite120†Radial Menus L124:       * cite121†Steam Input Devices L125:         * cite122†Microsoft Xbox 360 Controller L126:         * cite123†Microsoft Xbox One Controller L127:         * cite124†Sony PlayStation 4 Controller L128:         * cite125†Steam Controller (2015) L129:       * cite126†Steam Input Gamepad Emulation - Best Practices L130:       * cite127†Templates for In-Game Actions Files L131:       * cite128†Touch Menus L132:       * cite129†Uploading Steam Input Configs to Steam Workshop L133:     * cite130†Steam Inventory Service L134:       * cite131†Steam Inventory Item Accessories L135:       * cite132†Steam Inventory Item Dynamic Properties L136:       * cite133†Steam Inventory Item Store L137:       * cite134†Steam Inventory Item Tags L138:       * cite135†Steam Inventory Item Tools L139:       * cite136†Steam Inventory Schema L140:       * cite137†Steam Inventory Web Functions L141:     * cite138†Steam Keys L142:     * cite139†Steam Leaderboards L143:       * cite140†Step by Step: Leaderboards L144:     * cite141†Steam Overlay L145:     * cite142†Steam Playtest L146:     * cite143†Steam Remote Play L147:     * cite144†Steam Screenshots L148:     * cite145†Steam Timelines L149:     * cite146†Steam Voice L150:     * cite147†Steam Workshop L151:       * cite148†Steam Workshop Implementation Guide L152:       * cite149†Steam Workshop Item Tags L153:       * cite150†Steam Workshop Item Versioning L154:     * cite151†User Authentication and Ownership L155:     * cite152†Virtual Reality L156:       * cite153†SteamVR L157:       * cite154†Application Settings for Virtual Reality L158:       * cite155†SteamVR Input L159:       * cite156†OpenVR L160:       * cite157†SteamVR for Enterprise / Government Use L161:   * cite158†Finance L162:     * cite159†Developer Refund Reporting L163:     * cite160†Reporting and Payments L164:       * cite161†Reporting and Payments FAQ L165:     * cite162†Taxes FAQ L166:   * cite163†Sales and Marketing L167:     * cite164†Advertising on Steam L168:     * cite165†Best Practices, Marketing L169:     * cite166†Community Moderation L170:       * cite167†Adding Community Moderators L171:     * cite168†Curators and Curator Connect L172:     * cite169†Discounting L173:       * cite170†Daily Deals L174:       * cite171†Free to Keep (100% Discount) L175:       * cite172†Free Weekends L176:       * cite173†Seasonal Sales L177:     * cite174†Events and Announcements Tools L178:       * cite175†Events and Announcements Examples L179:       * cite176†Embeddable Widgets L180:       * cite177†Events and Announcements Review Step L181:       * cite178†Events and Announcements Visibility L182:       * cite179†Events and Announcements Visibility Stats Reporting L183:       * cite180†Event Type: Major Update L184:       * cite181†Event Type: Small Update / Patch Notes L185:       * cite182†Importing HTML L186:       * cite183†Sale Page Tools L187:         * cite184†Sale Page Tools -- Information for Partners L188:         * cite185†Sale Page Tools - Background Groupings L189:         * cite186†Sale Page Tools - Livestreaming (Broadcasting) L190:         * cite187†Sale Page Tools - Minimum Requirements L191:         * cite188†Sale Page Tools - Section Types L192:           * cite189†Sale Page Section: Apps And Bundles L193:     * cite190†Features And Tools, Marketing L194:     * cite191†Followers L195:     * cite192†Google Analytics L196:     * cite193†Points Shop Items L197:     * cite194†Profile Features L198:     * cite195†Steam Branding Guidelines L199:     * cite196†Steam Community Items L200:     * cite197†Store and Platform Traffic Reporting L201:     * cite198†Store Widget L202:     * cite199†Upcoming Steam Events L203:       * cite200†Steam Next Fest L204:         * cite201†Steam Next Fest - Tips L205:         * cite202†Steam Next Fest: February 2027 L206:         * cite203†Steam Next Fest: June 2027 L207:         * cite204†Steam Next Fest: October 2026 L208:       * cite205†Steam Themed Sale Events L209:         * cite206†Steam Auto Battler RPG Fest 2026 L210:         * cite207†Steam Cooking Fest 2026 L211:         * cite208†Steam Couch Co-Op Fest 2027 L212:         * cite209†Steam Desktop Companion Fest 2027 L213:         * cite210†Steam Dinos vs. Robots Fest 2027 L214:         * cite211†Steam Fighting Fest 2027 L215:         * cite212†Steam Medieval Fest 2026 L216:         * cite213†Steam Mountaineering Fest 2027 L217:         * cite214†Steam Party-Based RPG Fest 2026 L218:         * cite215†Steam Programming Fest 2026 L219:         * cite216†Steam PvE Survival Crafting Fest 2026 L220:         * cite217†Steam Racing Fest 2027 L221:         * cite218†Steam Real-Time Strategy Fest 2027 L222:         * cite219†Steam Rhythm Fest 2027 L223:         * cite220†Steam Scream V Fest L224:         * cite221†Steam Sheep Fest 2027 L225:         * cite222†Steam Shop Keeper Fest 2027 L226:         * cite223†Steam Witch Fest 2027 L227:     * cite224†UTM Analytics L228:     * cite225†Visibility on Steam L229:       * cite226†Update Visibility Rounds L230:     * cite227†Wishlists L231:       * cite228†Wishlist Reporting L232:   * cite229†Steamworks SDK L233:     * cite230†Creating and using InstallScripts L234:     * cite231†Creating a retail and "Gold Master" disk L235:     * cite232†Steamworks API Overview L236:       * cite233†Debugging the Steamworks API L237:       * cite234†Steamworks API Example Application (SpaceWar) L238:     * cite235†Updating Game Build L239:       * cite236†Partial Depot Update Instructions L240:       * cite237†Tip - Renaming a live exe L241:     * cite238†Uploading to Steam L242:       * cite239†Distributing Open Source Applications on Steam L243:       * cite240†Distributing Source Engine Games / Mods L244:       * cite241†Distributing Your Dedicated Game Server L245:       * cite242†SteamPipe Local Content Server L246:   * cite243†Web API Overview L247:     * cite244†Authentication using Web API Keys L248:     * cite245†Error Codes & Responses L249:     * cite246†OAuth L250:   * cite247†Accessibility Features L251:   * cite248†Steam Hardware L252:     * cite249†Getting your game ready for Steam Deck and Steam Machine L253:     * cite250†How to debug Windows games on Steam Deck and Steam Machine L254:     * cite251†How to load and run games on Steam Deck and Steam Machine L255:     * cite252†Steam Deck L256:       * cite253†Social Media Templates L257:       * cite254†Steam Deck Brand Guidelines and Logos L258:       * cite255†Steam Deck Developer Kits L259:       * cite256†Steam Deck FAQ L260:       * cite257†Steam Deck SVG Line Art L261:       * cite258†Steamworks Virtual Conference: Steam Deck - Nov 12th 2021 L262:     * cite259†Steam Deck and Steam Machine Compatibility Review L263:       * cite260†Steam Deck Verified Landing Pages L264:     * cite261†Steam Frame L265:       * cite262†Connecting adb to Lepton L266:       * cite263†How to load and run games on Steam Frame L267:       * cite264†How to upload Android APKs to Steam L268:       * cite265†OpenXR Game Engine Integrations L269:         * cite266†Custom Engines L270:         * cite267†Godot L271:         * cite268†Unity L272:         * cite269†Unreal Engine L273:       * cite270†Setting up your Steam Frame for development L274:       * cite271†Steam Frame Controllers L275:       * cite272†Steam Frame Debugging L276:       * cite273†Steam Frame Standalone Compatibility Review Process L277:         * cite274†Performance Assessment Overlay (VR titles) L278:       * cite275†Suggesting default user settings for your game L279:       * cite276†What games can run standalone on Steam Frame L280:     * cite277†Steam Hardware and Proton L281:     * cite278†Steam Machine L282:   * cite279†Steam PC Café Program --------------------------------------------------------------------------------
Visibility on Steam (Steamworks Documentation) (https://partner.steamgames.com/doc/marketing/visibility)
citeturn0view1 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({"ref_id":"https://partner.steamgames.com/doc/marketing/visibility","lineno":null}); Total lines: 482
--------------------------------------------------------------------------------
UTM Analytics (Steamworks Documentation) (https://partner.steamgames.com/doc/marketing/utm_analytics)
citeturn0view2 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({"ref_id":"https://partner.steamgames.com/doc/marketing/utm_analytics","lineno":null}); Total lines: 547

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nroot=Path('/home/adn/a327...)

Script completed
Wall time 1.8 seconds
Output:

Warning: truncated output (original token count: 22342)
Total output lines: 125

{"chunk_id":"784044","wall_time_seconds":0.000002757,"exit_code":0,"original_token_count":43375,"output":"Warning: truncated output (original token count: 43375)\nTotal output lines: 1388\n\n\nFILE: small_games.md\nTitle: Thoughts on making small games\nDate: 2021/01/22 12:00\nTheme: old\nLink: /posts/small_games\nTags: indiedev, strategy\nThumbnail: /media/posts/small_games/_thumbnail_small_games.png\n# Thoughts on making small games\n\nI notice more people talking about making small games. As I'm also currently focused on this goal, I thought it would be good to write something about it. \nI think that indiedevs in general have a few misconceptions about the problem and aren't thinking about it clearly, and in this post I'll go over that argument.\n\n## The meaning of small\n\nThe first thing to notice is that the word _small_, when used in the context of making games, is conflating multiple meanings into one word. The first meaning is related to how long or how many people it took to make the game. The second meaning is related to how long it takes for players to go through the game.\n\nWhen indiedevs use this word to describe their games, they're generally referring to both meanings at the same time, or to one of them in an interchangeable way with the other.\n\nFor instance, [this great talk](https://www.youtube.com/watch?v=wb22xeh_VqM) (watch it in its entirety, I highly recommend it) goes over techniques for making games every month. However, it implicitly assumes that because this development duration is small, the games also will be fairly small for the players. This is illustrated in the first point where one month games are referred to as “concept games” rather than real games.\n\n::youtube wb22xeh_VqM\n\nAnother example of a similar assumption is in [this article](https://howtomarketagame.com/2021/01/18/can-you-make-a-living-from-small-games-on-steam/), which goes over a game made in 4 months. Similarly, it is implicitly assumed that because the game was made in a short timeframe, the game would also necessarily be fairly small from the perspective of the players. (1 or 2 hours long)\n\nIn both of these cases you see the same error being implicitly made, which is that both meanings of the word small are the same thing, and this logically leads to the idea that if you make a game in a short timespan it must be the case that the game will not last a very long amount of time to the player. These are just two examples, and they're simply illustrative because this error is made by pretty much every indiedev talking about making small games right now.\n\n## The game scope chart\n\nTo further illustrate this point, you could look at this problem as a chart with four quadrants. On the horizontal axis we'll have one meaning of the word, on the vertical axis we'll have another. For clarity's sake, we'll refer to the meaning that pertains to development time as _small/big_ and to duration for the player as _short/long_.\n\n::image /media/posts/small_games/_game_scope_chart.png\n\nWe generally don't care about the top two quadrants of the chart. Those are related to games that have big development times or teams, and that's not what people are referring to when they talk about small games. We're then left with the bottom two quadrants, and here we have a spectrum that goes from small short games to small long games.\n\nMost indiedevs inherently assume that because a game is small, it has to be short. I reject this notion entirely. I think the quadrant of small long games is fairly unexplored, and it's useful to think about if this is a valid quadrant at all.\n\n## My experience with BYTEPATH\n\nThe only game I've released so far is [BYTEPATH](https://store.steampowered.com/app/760330/BYTEPATH/), and it falls under what I would consider a small long game.\n\nIt's small because it was made in about 4 months by me alone, and it also has a fairly small scope. By the nature of its gameplay it's essentially a single screen game with lots of upgrades, like one of those old flash games.\n\nAnd it's long because it feels like a long game. Despite being made in just 4 months, it has a skill tree with about 900 nodes, it has 10 different characters, around 40 classes… Essentially, it's what I also like to call a _spacious_ game.\n\nYou ever listen to a song or an album for hundreds of hours? I'm currently doing this for [Thank You Scientist's Terraformer](https://www.youtube.com/watch?v=QR2NizQ30Qc&list=OLAK5uy_n0CDrlM1UhGTRw5xmw8Aa8PU4zFOfzlXY&index=1) and it's crazy how despite listening to it for so long I still find new things in each song that I didn't notice before. This album is a spacious album. It can be thought of as this large space, and as you listen to it, you're exploring it, mapping the environment, finding new walls, rooms, objects, that you didn't know were there before.\n\nGames can also be like this, and long games are generally like this. BYTEPATH certainly is because it was made to be so, as the goal of the game is finding new builds to play, to the point where the main gameplay itself is kind of irrelevant.\n\nAnd because of this I think BYTEPATH did way better than I expected it to do. It's also important to note that despite me calling spacious games long games, they don't necessarily have to be played by most people for a very long time. Here's what BYTEPATH's hour distribution looks like:\n\n::image /media/posts/small_games/_bytepath_hour_distribution.png\n\nThis is definitely not impressive but it's also not too bad. And I know for a fact there's at least one guy (I saw him in the game's reviews) who played it for over 100 hours. When games feel spacious they have the possibility of keeping people playing for a fairly long time, which increases the chances that the game will do well.\n\n## Small long games\n\nThe most important point here is that small long/spacious games _DO NOT_ need to take a long time to be made. If I were to make a game like BYTEPATH again I'm fairly confident I could do it in 2 months, and it would be a significantly better game too, simply because it's actually not that hard. (I'm 100% not some kind of disciplined productivity God or anything)\n\nWhen developers focus on making small games, this implicit notion that the games also have to be short is wrong. You can make small long games, and because of the way the market works, those kinds of games will tend to do better than short games. I'm not the first person to notice this:\n\n::youtube sIqz5xmQKnc\n\n## Marketing\n\nAnother issue that happens often is that because developers are making small games that they feel are sort of worthless, they don't really do a good, serious job at marketing them. For instance, the example game from [this article](https://howtomarketagame.com/2021/01/18/can-you-make-a-living-from-small-games-on-steam/) was marketed on Twitter only.\n\nAnyone who has released a game knows that twitter is notoriously poor at driving sales, and that sites like reddit are much better. Would it really have cost these developers that much time to make a few posts about their games on reddit? No. And I know for a fact that a game of such visual quality would have done very well on multiple subreddits.\n\nSo a lot of the conclusions people reach about their efforts with smaller games, and the conclusion the author reaches in that article as well are pretty pessimist and in my view mistaken. I think that most devs making smaller games would benefit tremendously from taking making their games somewhat more spacious and from thinking more clearly about how they're going to market it.\n\n## The right development duration\n\nAnother thing to consider is what's the right timeframe for making a small game. One of the videos above focuses on 1 month per game, and both my previous game and the game from the article above took 4 months. I think the right duration is between 1 and 2 months.\n\nThe reasons for this are fairly simple. If you're making a 1 month game you probably want something with a scope such that it can be finished in 2-3 days, and then you spend the rest of the month polishing it in various ways. This keeps your game fairly focused and it's a good strategy if you want to drastically increase your chances of actually finishing and releasing the game.\n\nIf you're making a 2 month game this affords you a little more time such that you can actually start adding some meat to it and make it more spacious. But I personally think that it's too easy to start getting lost in scope-creep if you give yourself much more time than 2 months, so that would be my limit.\n\nCurrently that's what I'm aiming for with the game I'm making and I already overscoped myself slightly (meaning I should have chosen an even smaller game), so I think it really pays to keep this duration limited like this unless you're already more experienced and know you can avoid making these kinds of mistakes.\n\nWhat also matters is how much money you can expect to make off of these games. BYTEPATH for instance made about $10k over its lifetime, and if I were to release a game like BYTEPATH every 2 months and they all did half as well as it did, then that would be considered \"making a living from small games on Steam\".\n\nBut that's largely because I live in Brazil and that amount of money here (even accounting for cuts and taxes) every 2 months would be a pretty comfortable salary. If you're in more expensive countries then perhaps that isn't such a good strategy, so this timeframe consideration really depends on your personal situation as well.\n\n## Luck\n\nTo finalize this fairly rambly article, one of the reasons people cite for making small games is to hedge their bets. The argument goes that if they make lots of games, chances are that one of those games will succeed wildly and cover for the costs of the other failures. More specifically [this article](https://web.archive.org/web/20181230040436/https://www.gamasutra.com/blogs/DanielCook/20150415/241145/Minimum_Sustainable_Success.php) said that using this famous graph:\n\n::image /media/posts/small_games/_game_lottery.png\n\nI similarly reject this notion. In my opinion you shouldn't make small games for any reason having to do with what that article says. When you're approaching things from this economic portfolio theory approach you're mirrorring the biases of our society around the notion of luck and chance and it more likely than not will sap your motivation to work on things without you even realizing it.\n\nAdditionally, for a single indie developer like me, I don't think it's actually that hard to get a game to sell, say 5000 copies. And if you can do that consistently you can definitely make a living off it. Maybe I'm arrogant and I don't know what I'm talking about. I probably am, after all I've only released one game. But I'd rather be arrogant like that than view things from this lottery/luck oriented approach that so many people seem to fall prey to these days.\n\nThis is an insidious mindset that subconsciously takes away your agency and your responsibility for your actions, it takes away your motivation for working on things at all, and it also makes you learn less from each project because if you can just chalk things up to chance, why improve at all? There are many reasons to go for small games, but doing it because of the idea that the market is a lottery, or that things are highly influenced by luck or chance, is a wrong one.\n\nAs was best said by someone way smarter than me, [you're not a lottery ticket](https://www.youtube.com/watch?v=Kuc6pBZ-Q0I):\n\n::youtube Kuc6pBZ-Q0I\n\nFILE: marketing_skills.md\nTitle: Marketing vs. skills\nDate: 2021/09/13 19:23\nTheme: old\nLink: /posts/marketing_skills\nTags: indiedev, strategy\nThumbnail: /media/posts/marketing_skills/_thumbnail_marketing_skills.jpg\n# Marketing vs. skills\n\nRecently someone sent me an e-mail asking me, roughly, that given my [recent](/posts/snkrx_log) [posts](/posts/community_management) it seems like I don’t value marketing that much. And given that marketing is such an important part of being an indie developer, what gives?\n\nWhy do I place such a low amount of value in activities like building wishlists, sending keys to influencers, building a community with a Discord server, and all the other tried and true activities that every indiedev should do if they want to have a chance at success? Is it because I’m now financially secure and so I don’t have to worry about any of this anymore, or is it something else?\n\n## High vs. low quality games\n\nYou want to make successful indie games. So you can look at this problem from the following perspective: how far away am I from making successful indie games and what’s the least amount of effort I need to spend to get there? In my opinion, the answer to this question will generally revolve around improving the quality of your games rather than improving the quality of your marketing.\n\nIf you spend time improving your game you will get much closer to a successful game than if you spend time improving your marketing, because for most indie developers, their games are just objectively bad. Even my game is objectively bad in multiple ways. For instance, someone did a redesign of my game’s UI and this is what some of it looks like (these likely won’t be used as they are anymore, which is why I’m posting them):\n\n<div class=\"captioned-image-container\">\n\n::video /media/posts/marketing_skills/_snkrx_ui_1.mp4\n\n::video /media/posts/marketing_skills/_snkrx_ui_2.mp4\n\nThese are just objectively better screens than anything I have in the game right now. For most indiedevs improvements like this one are going to give you much more bang for your buck than anything related to marketing.\n\nYou should think of marketing as a multiplier on a game’s base quality. If the base quality level is high, then optimizing for marketing is the thing to do that makes the most sense. But very few indiedevs are making games of high base quality, and so that’s not the thing they should focus on.\n\nI’m definitely not making games of high base quality, as SNKRX just looks like garbage, and most games I’ll release in the near future will similarly also look like garbage. So I really don’t need to worry about marketing that much because there are much more solid gains to be had elsewhere. For instance:\n\n## Screen composition\n\nThe reason the gifs above look objectively better than the UI I have going on in the game now is because they just are composed better.\n\nIn my opinion, easily the best thing indiedevs can do to improve the quality of their games is to learn to become more attuned to how well a screen is composed. Artists are generally going to be better at this than programmers (although this is not always the case, as there are plenty of artists who just can’t put a good screen together), but programmers can also learn to pay attention to this and at least develop a solid taste for it.\n\nIt’s very hard for me to pinpoint exactly what makes a screen well composed, but generally they’re just better balanced. It has little to do with the quality of each individual asset. You can have games with assets that look amazing but that are composed poorly, or you can have a game with very simple looking assets but that are composed well.\n\nBut the main thing about screen composition is that a well composed screen will pass most people’s visual quality filter at a glance. If you look at a screenshot/frame of a game for 1-2 seconds, you can already tell if you think it looks good or not. That’s mostly about the screen’s composition.\n\nSo improving this skill has obvious ramifications to how well your marketing efforts will do, since if the game passes more people’s filters, they will be more likely to share it and so the game is more likely to get a better response whenever you post it online.\n\nLet’s look at a few examples. Below there will be 7 images of 7 different games. All you have to do is look at the images for a few seconds and try to get a sense of which ones look the best and which ones look the worst. Here we go:\n\n::image /media/posts/marketing_skills/_marketing_skills_1.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_2.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_3.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_4.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_5.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_6.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_7.jpg\n\nDone? Try ranking the images now. Like 4th > 1st > 3rd… etc. I’ll give you some space to not bias your ranking, so scroll down once you’re done.\n\n::image /media/posts/marketing_skills/_empty_space.png\n\nMy personal ranking is 5th = 7th > 4th »» 2nd > 1st »» 3rd = 6th. Meaning, 3rd and 6th images are the worst, while 5th and 7th are the best. I would guess that for most people at least these extremes would be similar, while the middle might have more variation. Why exactly are 5th and 7th so much better than all the others? It’s just better art, but it’s not only better art, the art is composed properly on the screen.\n\nFor instance, the 4th image has very simple looking art, yet it’s better than the others because everything comes together properly on the screen. 1st and 2nd images are the types of games that really don’t pass for me, despite individual assets actually not looking that bad.\n\nAll of this to say that improving this skill, especially as a programmer, is going to be much more valuable than anything else. I have very little artistic talent, but I can still attune myself to this somewhat and this attunement will yield results whenever I have to compose screens of my own, even though because I’m not really an artist the results will still be subpar and easily made better by someone who’s actually skilled (as the UI example shows). And this is not the only skill you can improve that will yield high results. The speed of your development, all techniques involving juicing things up, learning how to find/pick/create good sounds, etc. It’s endless.\n\n## Small game strategy\n\nKnowing this, that there are so many avenues of improvement available and that they will all yield much better results than focusing at all on marketing, the thing that makes the most sense to do is to choose a strategy that will help you increase these gamedev skills rather than one which optimizes marketing. Or to put it better, the amount of effort you put into marketing should be proportional to how much you can gain from it.\n\nIf the game’s base quality is low, then marketing’s gain will be low, and so the amount of effort should be low as well. That’s what I did for SNKRX, and my marketing for it was just very low effort high potential gains activities, like posting it on reddit, Hacker News, and so on. If nothing came out of those activities then fine, I would have just moved on to the next game and kept focusing on improving my skills.\n\nWorrying too much about wishlists on a low base quality game, for instance, is a waste of effort and time because the game is just not that good, and so no amount of marketing can really help it. It’s much better to release tons of small games, increase your skills, and get feedback from the universe more often so that you can direct your efforts in a more focused manner depending on how people respond to your games.\n\nIf you have an amazing, high base quality game, sure, spend 1+ year building wishlists. Otherwise, don’t. And since the majority of indiedevs don’t have amazing high base quality games, the majority of them shouldn’t really spend that time on it, in my opinion.\n\n## Financial security\n\nAnother question asked by the e-mail was if I reached these conclusions because of my new-found finan…12342 tokens truncated…    * cite269†Unreal Engine L273:       * cite270†Setting up your Steam Frame for development L274:       * cite271†Steam Frame Controllers L275:       * cite272†Steam Frame Debugging L276:       * cite273†Steam Frame Standalone Compatibility Review Process L277:         * cite274†Performance Assessment Overlay (VR titles) L278:       * cite275†Suggesting default user settings for your game L279:       * cite276†What games can run standalone on Steam Frame L280:     * cite277†Steam Hardware and Proton L281:     * cite278†Steam Machine L282:   * cite279†Steam PC Café Program L283:     * cite280†Licensees L284:       * cite281†PC Café Requirements and Sign Up Instructions L285:       * cite282†Getting Started L286:         * cite283†Setup instructions for the PC Café model (incl. PC Café Server and Content Cache) L287:         * cite284†Setup instructions for the VR arcade model L288:       * cite285†Frequently Asked Questions L289:     * cite286†Publishers L290:   * cite287†Steamworks API Reference L291:     * cite288†ISteamApps Interface L292:     * cite289†ISteamClient Interface L293:     * cite290†ISteamController Interface (Deprecated) L294:     * cite291†ISteamFriends Interface L295:     * cite292†ISteamGameCoordinator Interface L296:     * cite293†ISteamGameServer Interface L297:     * cite294†ISteamGameServerStats Interface L298:     * cite295†ISteamHTMLSurface Interface L299:     * cite296†ISteamHTTP Interface L300:     * cite297†ISteamInput Interface L301:     * cite298†ISteamInventory Interface L302:     * cite299†ISteamMatchmaking Interface L303:     * cite300†ISteamMatchmakingServers Interface L304:     * cite301†ISteamMusic Interface L305:     * cite302†ISteamNetworking Interface L306:     * cite303†ISteamNetworkingMessages Interface L307:     * cite304†ISteamNetworkingSockets Interface L308:     * cite305†ISteamNetworkingUtils Interface L309:     * cite306†ISteamParties Interface L310:     * cite307†ISteamRemotePlay Interface L311:     * cite308†ISteamRemoteStorage Interface L312:     * cite309†ISteamScreenshots Interface L313:     * cite310†ISteamTimeline L314:     * cite311†ISteamUGC Interface L315:     * cite312†ISteamUser Interface L316:     * cite313†ISteamUserStats Interface L317:     * cite314†ISteamUtils Interface L318:     * cite315†ISteamVideo Interface L319:     * cite316†SteamEncryptedAppTicket L320:     * cite317†steamnetworkingtypes.h L321:     * cite318†steam_api.h L322:     * cite319†steam_gameserver.h L323:   * cite320†Steamworks Web API Reference L324:     * cite321†IBroadcastService Interface L325:     * cite322†ICheatReportingService Interface L326:     * cite323†ICloudService Interface L327:     * cite324†IEconMarketService Interface L328:     * cite325†IEconService Interface L329:     * cite326†IGameInventory Interface L330:     * cite327†IGameNotificationsService Interface L331:     * cite328†IGameServersService Interface L332:     * cite329†IInventoryService Interface L333:     * cite330†ILobbyMatchmakingService Interface L334:     * cite331†IPartnerFinancialsService Interface L335:     * cite332†IPlayerService Interface L336:     * cite333†IPublishedFileService Interface L337:     * cite334†ISiteLicenseService Interface L338:     * cite335†ISteamApps Interface L339:     * cite336†ISteamCommunity Interface L340:     * cite337†ISteamEconomy Interface L341:     * cite338†ISteamGameServerStats Interface L342:     * cite339†ISteamLeaderboards Interface L343:     * cite340†ISteamMicroTxn Interface L344:     * cite341†ISteamMicroTxnSandbox Interface L345:     * cite342†ISteamNews Interface L346:     * cite343†ISteamPublishedItemSearch Interface L347:     * cite344†ISteamPublishedItemVoting Interface L348:     * cite345†ISteamRemoteStorage Interface L349:     * cite346†ISteamUserAuth Interface L350:     * cite347†ISteamUser Interface L351:     * cite348†ISteamUserStats Interface L352:     * cite349†ISteamWebAPIUtil Interface L353:     * cite350†IStoreService Interface L354:     * cite351†IWorkshopService Interface L355: UTM Analytics
L356: 
L357: cite352†Steamworks Documentation > cite163†Sales and Marketing > cite224†UTM Analytics L358: 
L359: cite353†https://www.youtube.com/watch?v=K-qmYY69kqI†www.youtube.com L360: UTM Analytics in Steamworks provides insight into on how your UTM marketing campaigns are performing. You can use UTM parameters on a link with your Steam store page as the destination address, and Steamworks will provide insight into how that link is performing.
L361: ## What is UTM?
L362: 
L363: UTM (Urchin Tracking Module) is an industry standard approach to measuring whether specific links in your marketing campaigns are being clicked by customers. A link using UTM has specifically named parameters following the link's destination address. These parameters make it clear which link was clicked when a customer visits the destination address. For more background on UTM, see here: cite354†https://en.wikipedia.org/wiki/UTM_parameters†en.wikipedia.org L364: ## How it works
L365: Steamworks records the UTM parameters used when a customer visits your game's store page and takes an action such as purchasing or adding to their wishlist. A dashboard in Steamworks displays this UTM information for you to evaluate how your campaigns are performing.
L366: The report has three sections: an overview of total traffic and conversions, a graph showing total traffic and conversions over time, and a breakdown table showing how each unique combination of UTM parameters performed. There are a set of filters at the top to narrow the data to specific UTM parameters, as well as download the data as a .csv file.
L367: cite355†Image: utm-example-update-2023.png†shared.akamai.steamstatic.com L368: ## Privacy
L369: 
L370: To protect customer privacy, the information provided is kept at a summary view with no personal data included. This allows you to learn how your campaigns are performing while also protecting customer privacy. Here are more details on how Steam protects customer privacy:
L371:   * Steam IDs or other personal information will never be included or available
L372:   * We only provide visit and conversion data in total numbers
L373:   * We exclude showing unique UTM parameter combinations in the breakdown table when visits for those combinations do not meet minimum thresholds.
L374:   * Some users will not be tracked based on their browser configuration or cookie preferences
L375: ## Required Steamworks Permissions
L376: 
L377: Access to your UTM Analytics report is limited to Steamworks accounts with the "View Marketing Traffic Data" rights for your game.
L378: ## Tracked Visits
L379: 
L380: Three types of visits are tracked for UTM Analytics:
L381: 
... [46 more lines]

Your older writing makes a useful distinction: a game can be quick to develop yet give players a large space to explore. You also describe short projects as a way to improve your craft and get feedback, not just to take more shots at a hit. I’d preserve both ideas in the research, while testing whether the market still rewards the particular forms they take.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nr=Path('/home/adn/a327ex/...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"40078c","wall_time_seconds":0.000003809,"exit_code":0,"original_token_count":1055,"output":"community_management.md characters: 68726\nTitle: Community management\nDate: 2021/07/29 00:12\nTheme: old\nLink: /posts/community_management\nTags: indiedev, psychology, strategy\nThumbnail: /media/posts/community_management/_thumbnail_community_management.png\n# Community management\n\nEventually I want to make an MMO. I’ve already sort of described it [here](https://github.com/a327ex/blog/issues/67) but that idea will probably change significantly over the years. What won’t change is the fact that successfully running an MMO is both a massive technical and social undertaking.\n\nI’m constantly working on improving the technical side of things by just programming a lot, but the social part of it is harder to practice because you actively need a community of people to manage, and until now I didn’t have such a thing. With SNKRX’s release though I got the opportunity to “manage” a “community” of tens of thousands of people for 1 month or so, which was a really good amount of experience to gain.\n\nI put the words “manage” and “community” i\nwriting-and-gamedev.md characters: 17304\nTitle: Writing and Gamedev\nDate: 2026-01-18 22:41:18\n\nThree months after releasing SNKRX I had a vision. An alien vision was downloaded into me, fully formed, out of nowhere. It was very specific and immediately it made me cry. For an entire month, whenever I thought of it, I'd cry. If I thought of it while listening to [Tomorrow by Kevin Penkin](https://www.youtube.com/watch?v=UBz-8TGVN8k) I'd cry even harder.\n\nSomething like this had never happened to me before. I've read stories of artists talking about having such strong visions, but I always thought they were exaggerating. And then it happened to me. When something like this happens, you have to respect it. I believe I'm a [vessel](https://a327ex.com/posts/self_expression_vesselization) for ideas that come to me from above. So, in religious terms, this is literally God speaking to me. I can't ignore it.\n\nFor the next three years I built an elaborate story around that vision. My goal was to construct a narrative that would maximize\nindiedev_creativity.md characters: 15823\nTitle: Why indiedev creativity is stagnant and how to fix it\nDate: 2022/04/03 12:00\nTheme: old\nLink: /posts/indiedev_creativity\nTags: indiedev, psychology, strategy\nThumbnail: /media/posts/indiedev_creativity/_thumbnail_indiedev_creativity.jpeg\n# Why indiedev creativity is stagnant and how to fix it\n\nApril Fool’s Day is a great example of how agreeableness acts as a blocker on creativity. Only on the day where wild and silly things are socially accepted do companies try aggressive changes to their products that might make them a lot better, as the social cost of change becomes lower.\n\nFor instance, Path of Exile’s battle royale mode started out as an April Fool’s joke. People liked it so much they constantly asked for it to be brought back over 3 years. Eventually the devs gave in and implemented a full version… that no one ended up liking.\n\n::youtube XWZ4tfOlC_g\n\n::youtube 5AEFygPyGFU\n\nIn this case it didn’t work out, but that’s how experiments should go. You try out a bunch of stuff \nlessons_second_game.md characters: 44638\nTitle: Lessons learned from releasing my second game\nDate: 2021/05/18 14:28\nTheme: old\nLink: /posts/lessons_second_game\nTags: indiedev, snkrx, strategy\nThumbnail: /media/posts/lessons_second_game/_snkrx_logo.jpg\n# Lessons learned from releasing my second game\n\n[SNKRX](https://store.steampowered.com/app/915310/SNKRX/) is the second game I’ve released on Steam and in this post I’ll go over my thoughts on its development and how it performed. I made this game in the past 3 months as a dev challenge to start making and releasing games more consistently.\n\n::youtube kfBCn4hn5UU\n\n# Financial Results\n\n## Stats\n\nTo get it out of the way, first let’s go over financial results. I’m writing this only 1 day after the game has released, but Steam seems to be consistent with how it treats games after how they perform initially so I can extrapolate somewhat safely from here.\n\nHere’s how [BYTEPATH](https://store.steampowered.com/app/760330/BYTEPATH/), my first game, did for its first day and a half:\n\n:\n"}
{"chunk_id":"aa3d30","wall_time_seconds":0.000002698,"exit_code":0,"original_token_count":4326,"output":"Warning: truncated output (original token count: 4326)\nTotal output lines: 108\n\nTitle: Writing and Gamedev\nDate: 2026-01-18 22:41:18\n\nThree months after releasing SNKRX I had a vision. An alien vision was downloaded into me, fully formed, out of nowhere. It was very specific and immediately it made me cry. For an entire month, whenever I thought of it, I'd cry. If I thought of it while listening to [Tomorrow by Kevin Penkin](https://www.youtube.com/watch?v=UBz-8TGVN8k) I'd cry even harder.\n\nSomething like this had never happened to me before. I've read stories of artists talking about having such strong visions, but I always thought they were exaggerating. And then it happened to me. When something like this happens, you have to respect it. I believe I'm a [vessel](https://a327ex.com/posts/self_expression_vesselization) for ideas that come to me from above. So, in religious terms, this is literally God speaking to me. I can't ignore it.\n\nFor the next three years I built an elaborate story around that vision. My goal was to construct a narrative that would maximize it, so that when others reached it, they'd feel it with the same intensity I did. I built a story backwards from that moment, and it ended up having seven parts. The vision became the climax of part six, with part seven being the final showdown that concludes the whole thing.\n\nBut I never felt like I had enough to actually start making it real. That changed at the end of 2024. I had a dream, and from it came a simple idea that eventually became the beginning of the series. Suddenly, I could see a path forward.\n\nThe idea from the dream made it clear that the seven stories also needed to be games, merged with the books in specific ways. The main structure is that the books and games are separate. You can read the books without playing the games, or play the games without reading the books. You can listen to the books while playing the games, as most of them will be low-cognitive demand kinds of games you can play while listening to or watching something else. But importantly, you can also read an interactive version of the book which contains the merged game elements in it. All these options are available, the last one being the most interesting.\n\nSo the plan is releasing a series of seven games + books. I can already make games, but I couldn't write, so I had to learn. That's what I set out to do for 2025.\n\n<br>\n\nI immediately had two good story ideas. One became It Follows, and another became the story I'll write after it. They're mirrors of each other, in a way. But they were good enough ideas that I felt strongly compelled to bring them into reality, to not do so would be to be a bad vessel.\n\nIt Follows started from the ending, that's the first piece I had. But really quickly after that, I had the first chapter. It was actually the very first thing I wrote, and it came out in like 1-2 hours, extremely similar to the final version. That's when I realized something about how I work.\n\nI *need* to have the beginning and the end. I cannot start working on a story without those two components. Later, it became clear that I also needed a third: a constraint. This wasn't obvious immediately because, by chance, It Follows' first chapter has a strong built-in constraint, the curse's rules. This wasn't the case with the next story, where I have the end and the beginning, but not the constraint.\n\nThe constraint is important because when you have the beginning and the end, you want to logically fill the middle so that one thing leads to another. It's easier to do that with a constraint than without one. More importantly, the constraint should be thematically sound with whatever the story implies. In It Follows' case, the curse's frules, combined with how the character goes from follower to followed and how that flips again at the end, turned out to be both thematically coherent and generative. In my next story, there's no obvious constraint yet that follows thematically from the beginning and informs the end in the same way, which is why I haven't started writing it yet.\n\nBut this explains why I suddenly saw a path forward with the whole series after I had the dream. It wasn't clear why at the time, because I didn't know I needed these elements, but once the beginning was in place, suddenly the whole series was locked in.\n\n<br>\n\nThe same was true for It Follows. Once I had those three elements, filling the middle was easy. Well, perhaps not easy, but logical. I tried a bunch of different middle ideas and eventually, unfortunately, landed on the concept of what I internally called the \"grindr descent.\" Unfortunate because I didn't really set out to write porn. But I had this ending I thought was really good, I had this beginning I thought was really good, and I'm practicing so I can bring this seven-part vision that was sent to me by God to life. To shy away from writing this story because it's icky would be wrong.\n\nI knew I wanted the story to have a downwards arc from the beginning, because this story is also practice for story one of the seven-part series. That story will have similar downwards motion (without the sex), so using It Follows as practice for that general structure made sense.\n\nIn any case, once the grindr descent idea came to me, it became clear that it would fit into the story well, it was super generative, a lot of things came out of it naturally. I convinced myself that a way to look at it positively is that if I could write porn scenes well, I can probably write any kind of scene well. Sex is naturally kind of non-confrontational, so compared to battle scenes that sort of unfold themselves naturally, it's probably harder to write them. I don't know if this reasoning is valid, but it's what makes sense to me.\n\nI did get feedback that multiple people skipped the sex scenes. But this is kind of mixed... It could be because they're poorly written, or because the story only becomes \"about porn\" at around chapter 3. This baits people into thinking the story is about this curse mystery, and suddenly it becomes this huge porn-fest with no warning beforehand. So I don't know how much of that skipping is bad writing on my end or failing at managing expectations. Either way, it's still a mistake on my part.\n\n<br>\n\nOn top of the grindr descent, another idea that was generative was using myself as the character. Initially, I did this to decrease variables. It's my first story, I'm learning, so I decided on a single POV with me as the character. When I had to ask \"what would this character do in this situation?\" I already had the answer. Of course, because of how the story ends, it also kind of had to be me all along.\n\nBut this turned out to be the right choice. A lot of the story's themes emerged naturally out of the clashing between myself and the plot. If I were creating a character from scratch, I don't think the thematic cohesiveness the story has would have happened as easily. I kind of got lucky. I'm a real person with real contradictions and drives, and the curse idea just happened to hit on my personality in a particularly right way. \n\nOne could say that I had this specific idea in the first place because of this, that it wasn't luck but my high levels of intuition working through me without my conscious knowledge. That's a reasonable explanation, but it still wasn't a conscious choice. I don't remember exactly how I had the idea for the ending and beginning... In any case, I think this kind of cohesiveness can only happen consciously if you're an experienced writer, which I'm definitely not yet.\n\nI'm not going to give specific examples of this cohesiveness here, because I don't like when authors are like \"the story was about this\" or \"the story was about that.\" If you have to say afterwards what the story is about, you failed when writing it. A good test is: if two people are discussing the story, can one say \"but the author said this\" to kill the other person's theory? If they can, it means I said too much.\n\nAnd this is because... it ruins the story. If the aut…326 tokens truncated…e mostly testing it as it comes online, watching all the builds finally work. It's much more engaging and fun, at least for the kinds of games I make.\n\n<br>\n\nThis difference in the finishing process made me think more about how games and stories differ fundamentally. Stories are linear, they follow a clear flow and don't change once they're done. It Follows will be the way it is now forever. Well, I guess there's a small difference if you had it on the same day I released it versus in the future, but that's a small thing. Games are different, they're more like looping.\n\nAnd if games are looping, the concepts of beginning and end work differently. For games, the beginning is the moment-to-moment action, what you do every few seconds that constitutes a unit of gameplay. Getting this down, having it running and playable, or at least having a solid idea of what it'll be like when it is, constitutes the beginning.\n\nThe end depends on the game. For the build-heavy games I like to make, the end likely means \"what does an end-run build play like?\" When the game is almost being broken by the player, what does that look like? What does it feel like?\n\nAnd the constraint... in a story, it constrains the possibility space for the middle while being thematically generative. What does this in a game? If you have a game like SNKRX where the beginning is snake + each unit auto-attacks, and the ending is a crazy build that one-shots the screen (ideally in a fun way), what's the constraint? I think it would be how you get from start to end in an interesting way, so the shop between battles. Then, maybe the general form of the constraint is the \"meta loop.\"\n\nLike a good constraint should be thematically generative, a good meta loop should be ludically generative. Taking SNKRX as the example, is the shop reroll system generative? Kind of, it takes you from A to B. But are there better alternatives? Are there different meta loops that specifically make use of what SNKRX's beginning and end imply?\n\nI think something like a pre-run draft does this. The details of this draft do not matter, but the act of choosing units among many possible at the start, fits the game better than doing this spread out throughout the run. You could also imagine that, once you have this pre-run draft going, you could have \"shedding\" moments mid-game where you alter your powers in important ways. A meta loop focused on frontloaded power choice with moments of change available mid-run, feels much more generative to me for this specific game.\n\nSo it seems that for future games, it probably makes more sense for me to tackle the ending first, or second. Get the beginning working and immediately have a few key end-game builds going to see how they actually play. Once those are fun, decide on a constraint that feels generative and takes you from the beginning to the end in a good way. This approach seems like it'll be more fruitful, and lead to better designed endings with properly thought out end-game builds, but also things like well-designed endless modes and so on.\n\n<br>\n\nAnother difference between stories and games is that once a story has enough to it, it has a logic of its own. It's like it becomes a living artifact with a clear purpose, and like there's a correct solution to any problem that arises.\n\nThere's a good example of this regarding #1's presence in It Follows, but I can't speak too much of it. I'll just say that #1's presence was initially much lower, and then when I finished the first draft, the story was basically screaming at me: \"If you make this more prominent, it will be super generative.\" And it was.\n\nThe way this works is kind of simple. If you want to be consistent with the story and with yourself as a good vessel looking for the truth, once the story is established, its truth becomes self-generating. You often come to points where you have choices A, B, or C, and it's obvious that B is more correct because it aligns with every element of the story better and potentially generates more aligned elements.\n\nIf you make this correct choice B here, you can also change the past of the story to make B even more correct, while also making it lead to even more correct choices later. This is essentially the story speaking to you. It's saying, \"if you choose B here, you can make the past and the future better\", and \"correct\" or \"better\" here means more coherent and cohesive along the themes it's clearly about.\n\nAnd so this property where the story talks to you in this way about what it wants to become is super clear with writing, but so far nothing like it has happened to me with games. Some developers mention that it happens to them, but I haven't experienced it. Maybe because the kinds of games I make are less strict and more moldable to what I want them to be, so they don't assert themselves as much? I don't know.\n\n<br>\n\nAll in all, I'm happy with It Follows, otherwise I wouldn't have released it. In the end, I brought a good idea to life as best as I could, I practiced for my big project, and I also actually lived my life a little more because of it.\n\nThis last part was an unexpected benefit of becoming a \"writer\" in my head. Before, I used to really dislike talking to most people. If they weren't intelligent enough, if they didn't have interesting things to say, I unironically thought they were beneath me and somewhat worthless. Now, this actually isn't the case anymore. Simply because every person is potential material for a future story. I love listening to people talk now, and it's really easy to get people to talk about their lives, everyone wants to. It helps that I have a friendly face to a percentage of the population, so they open up even more easily.\n\nThis may seem kind of twisted and sociopathic, but 2025 was easily the year where I talked to most people and where I actually enjoyed it. However twisted it may seem, it objectively made my interactions with other human beings better. I definitely can't say making games ever had that sort of effect.\n\n<br>\n\nOther than going back to making games, the next thing I want to do this year is learning how to make music. This big project needs to have a specific musical vibe to it, and I think I can learn to do it well enough.\n\nI think the feeling of making music will be closer to stories than to games. They're both linear, both consumable with a clear end, their constraints are more clear than a game's. But music is harder to learn than writing.\n\nWith writing, the act of writing itself is \"easy,\" for the kinds of books I want to write anyway. I'm under no delusions that I'm a particularly clever wordsmith, capable of wowing people with my spectacular prose. Most books I end up finishing tend to be written in a simple way, and I want to write the same way. The hard part is coming up with an idea, structuring the story, making sure the constraint is good, etc.\n\nWith music, there's a similar distinction. There's the act of making the sounds on the computer, and then the theory behind it. The theory is not easy to learn, but it's not hard either, it's fairly logical and self-contained. But the hard part for me is making the sounds themselves. There's so much to learn, so many different ways of doing it, so many programs and techniques. It's an endless hole of possible obsession.\n\nCompared to writing, where I just open Notepad (It Follows was entirely written in Notepad) and start writing, the \"act\" part of making music is 100x more complex. I don't know how it'll go yet, but it seems like it's an overall harder and longer journey.\n\n<br>\n\nI think... yea, I like writing, and I'll keep doing it. It's also good to switch between activities like this. I'm so productive as a game developer right now because finishing It Follows was so tedious that it made me beg for doing anything else. It was actual torture. So adding music to this and rotating between gamedev, musicdev, and writing will probably be good for my productivity and creativity.\n"}
{"chunk_id":"9d6caf","wall_time_seconds":0.000002555,"exit_code":0,"original_token_count":4567,"output":"Warning: truncated output (original token count: 4567)\nTotal output lines: 145\n\nTitle: Community management\nDate: 2021/07/29 00:12\nTheme: old\nLink: /posts/community_management\nTags: indiedev, psychology, strategy\nThumbnail: /media/posts/community_management/_thumbnail_community_management.png\n# Community management\n\nEventually I want to make an MMO. I’ve already sort of described it [here](https://github.com/a327ex/blog/issues/67) but that idea will probably change significantly over the years. What won’t change is the fact that successfully running an MMO is both a massive technical and social undertaking.\n\nI’m constantly working on improving the technical side of things by just programming a lot, but the social part of it is harder to practice because you actively need a community of people to manage, and until now I didn’t have such a thing. With SNKRX’s release though I got the opportunity to “manage” a “community” of tens of thousands of people for 1 month or so, which was a really good amount of experience to gain.\n\nI put the words “manage” and “community” in quotes because the community of a single player game isn’t really comparable to the community of an MMO, in that it doesn’t really need to be that actively managed. I don’t really have to think about things like handing out bans, or worrying about cheaters/hackers, or word filters in the global chat, or anything like that. But still, experience is experience.\n\nAs things stand I have no way to tell when I’ll get an opportunity like this again, as I don’t know if people will play SNKRX again in great numbers after I release more updates, and I also have no way to tell if future games I release will enjoy similar levels of popularity. Although I suspect that they eventually will because my skills will keep increasing, but that might take many many years.\n\nSo because of this unknown I thought it would be useful to write this post for future reference. Mainly, I want to get a snapshot of my thoughts regarding community management now so that the me from 5-10 years in the future can have a really solid sense of what this experience was like, where my head was at, where I was right/wrong and why, and so on.\n\nAlso, this will be a fairly unfiltered post. I still prefer making these kinds of posts public because I always like when people share their honest thoughts on things, but I’d prefer if it went unnoticed. If you stumble upon this post and want to share it with people, please do so carefully and avoid larger scale social media (twitter, reddit, etc). Thanks!\n\n## Power\n\nOne of the main ideas that seems obviously correct to me now about game community management is that you want to avoid leaking power. I already partly went over this [here](/posts/snkrx_log#developer-interactions), but I thought it’d be nice to expand on it more.\n\nThis idea comes from [Curtis Yarvin](https://graymirror.substack.com/), who applies it primarily to politics, but because it’s an insight about collective human behavior it can also easily be applied to game communities. He explains this concept in multiple posts, but the one that does it best is probably [this one](https://graymirror.substack.com/p/a-brief-explanation-of-the-cathedral). I won’t go over his explanation in detail here since the post is pretty self-contained, so you should read it if you want to understand what I’m talking about.\n\nHis analysis of how power leaks seems fundamentally correct to me. It’s one of those things where once I read it it just made so many things retroactively make sense and I had that sort of eureka moment. And the application of this to other situations, like with games, also follows naturally.\n\nIf you’re a game developer with a popular game you can think of yourself as a power source. The power you have is that you can change the video game. Everyone wants this power because everyone secretly wants to be a game developer. People are really drawn to you with attempts to have their voice heard and have their will implemented in the game, it’s just a natural thing that happens without people even really noticing.\n\nWhat this means is that if you’re a developer who leaks this power by too casually implementing people’s will, you’re essentially polluting the lake. You’re letting people wear the ring, and when someone wears the ring, the ring changes them. Power changes people because the only thing power wants is more power.\n\nSo your game’s players, when they get a taste of this power, will want more of it. Every conversation people have about the game will now be focused on you, because you’ve essentially trained people, through your power leakage, that if they make suggestions you will listen to them.\n\nAnd what this means is that, just like in science where ideas aren’t selected for truth anymore, your game’s player’s feedback will also not be selected for truth. The feedback will be selected for its ability to justify the usage of power, which roughly translates to feedback that convinces you to implement it.\n\nThis is a crucial point that is very important to understand. The type of feedback that will dominate in a community that has been corrupted by power is fundamentally different from the feedback of a pure community. Feedback made to convince you to implement it may often times be similar to pure feedback, but it comes from a different place, and that place is generally worse.\n\nSome developers seem to intuitively understand this and try to avoid it:\n\n::youtube 9hBTueJGyyo start=\"76\"\n\nBut others…\n\n## Path of Exile\n\nIn my [previous post](https://a327ex.substack.com/i/93376060/developer-interactions) I mentioned reddit and how this idea of power leakage can affect a game’s subreddit. A few people who read that section immediately connected it to Path of Exile:\n\n::image /media/posts/community_management/_community_management_1.png\n\nHowever, when I wrote it I actually wasn’t thinking of PoE, I was thinking of Valve, interestingly enough. One of the things I noticed about Artifact and Underlords is that Valve seemed to listen way too much to reddit and that they sort of fumbled without direction a little too much. Like there was no too strong vision behind the games and they sort of implemented anything that seemed good and was upvoted enough.\n\nThis isn’t necessarily a bad strategy if you’re trying to make the game survive in the first place, but it communicates a lot of weakness and might paradoxically drive people out of the game more. Not even to mention all the power leakage problems I already went over.\n\nIn any case, what I wrote in that post definitely applies more to Path of Exile, even if I didn’t consciously mean it when writing it. Now, I’m going to say a lot of things about PoE and GGG, but before that I’d like to make clear that along with Valve they’re probably my favorite developers.\n\nI think the ability Chris has to be honest about his game and to communicate well with his players is really inspiring. You get the real sense that they’re just indie developers who really care about their game and are just trying to make things work, which they are. In fact, part of me writing these very honest posts about my game is inspired by how Chris does it.\n\nSimilarly, even though I’m going to also talk about PoE’s subreddit a lot, I think what they’ve managed to achieve with it has always been really good. To the degree that my [previous game](https://store.steampowered.com/app/760330/BYTEPATH/) succeeded, it did so because I was allowed to [post about it](https://www.reddit.com/r/pathofexile/comments/7zu9vz/i_made_a_small_game_inspired_by_poes_passive/) on that subreddit, and Chris and Mark personally intervened so that my post would stay up after the mods removed it for a while.\n\nSo you know, nothing that I’m going to say here comes from a place of ill will or bad intention. It just comes from this very detached analytical perspective of trying to understand what’s actually going on.\n\nWith all that said, one of the main things that motivated me to write this post is Path of Exile’s latest league, Expedition. A sort of unusual thing happened with it, which is that GGG decided to not listen to a big part of their community and to change the game in a way that is more in line with their vision of what it should be. You can see the announcement stream [here](https://www.youtube.com/watch?v=mT_aoGoMm50):\n\n::youtube mT_aoGoMm50\n\nNeedless to say, the reaction by the community has been extremely mixed and there’s sort of a mini civil war happening, with some people siding with GGG while others thinking they’re ruining the game. Regardless of which side is ultimately right, one of the interesting things to watch has been reddit’s reaction. In case you didn’t know, GGG has always been _very_ active in the subreddit. They’re constantly making posts in it, constantly appearing in comments, responding to players, etc. And they’ve been doing this for like almost 10 years at this point.\n…67 tokens truncated…e, let’s look at the top threads of the past week:\n\n::image /media/posts/community_management/_community_management_2.png\n\nAnd here we can do some basic analysis and just classify each thread based on what it’s about:\n\n| # | Focus |\n| --- | --- |\n| 1 | meta thread about reddit |\n| 2 | GGG thread |\n| 3 | direct request to GGG |\n| 4 | comic referencing streamer's negative reactions to the patch |\n| 5 | direct request to GGG |\n| 6 | GGG focused, sort of a small guilt trip on the community by Chris on a stream |\n| 7 | feedback, talking about the bad state of the game, makes direct mention to Chris |\n| 8 | feedback |\n| 9 | GGG focused due to a (falsely) perceived balancing mistake on their end |\n| 10 | GGG thread |\n| 11 | directly addressed to GGG |\n| 12 | streamer thread |\n| 13 | GGG focused |\n| 14 | game focused |\n| 15 | GGG focused through a streamer |\n\nOut of the 15 threads, 1 of them (#14) is focused on the game, while 10 of them are directly focused on GGG. 2 others are focused on streamers, 1 is focused on reddit itself, and another (#8) is the one that’s closest to pure feedback.\n\nThread #8 is the one that’s most interesting to me because it perfectly exemplifies how easy it is to confuse corrupted feedback with pure feedback. Remember that I mentioned that corrupted feedback often times looks like pure feedback, but comes from a worse place? Thread #8’s title says:\n\n> All of the Expedition splinters should have been AUTOPICKUP, the same as metamorph organs. PERIOD.\n\nIf this title dropped the “PERIOD.” part, it would have been worded perfectly. But “PERIOD” implies something. Period, or else…? There’s always this hint of blackmailing going on whenever people addicted to power aren’t getting their way, and so you see this behavior on whatever topics GGG has decided to stand their ground on and generally not change, despite continued efforts by the community to get them to change it, such as having to click lots of things, trade, and so on.\n\nThe nuance here is that corrupted feedback always comes from a place of trying to justify the usage of power (convince developers to change the game), whereas pure feedback comes from a more neutral and detached perspective. And more importantly, like all feedback, corrupted feedback can be either positive or negative. The positive form will take the form of praising power (praising the developer), but the negative form will generally take the form of blackmailing, because that’s all you can do when you’re addicted to but denied power: you can cope with some kind of bargain, like “if you don’t change this I’ll stop playing!”, which PoE’s subreddit also gets a lot of:\n\n::image /media/posts/community_management/_community_management_3.png\n\nAs a developer you can’t look at this and blame reddit. What’s happening here is what would happen anywhere, because everyone involved is a human being, and human beings respond similarly to incentives. PoE’s population has been thoroughly corrupted by power for years, and this is the result. A population that is completely addicted to getting their way, being enabled by developers who are reaping the benefits of doing so.\n\nNone of this is nefarous or wrong on either side of the equation, it’s just what naturally happens when people interact with one another. And PoE is just the best example I can use right now, but I’ve seen this exact same dynamic play out with countless games before.\n\nWe can look at a couple of other examples that aren’t taken to this extreme. For instance, [Dota 2’s subreddit](https://www.reddit.com/r/DotA2/):\n\n::image /media/posts/community_management/_community_management_4.png\n\nHere there’s only 1 thread directly aimed at Valve due to the fact that they take a much less visible role in the community. Valve isn’t completely neutral though, they will often do quick patches based on reddit threads and they also run multiple tournaments for the game so they have somewhat of an actively role still. But in general their interaction is much more limited and so you get way better results in terms of the level of corruption in their community.\n\nThere could be an argument here that I’m doing a sort of unfair comparison by comparing a moment where PoE is unpopular and Dota is neutral. And so if I were looking at Dota’s subreddit right after Valve implemented an unpopular change, it would have the same level of threads directed at Valve as there were directed at PoE. And this argument would be roughly correct, but there are some nuances.\n\nFirst, the difference between both subreddits remains even when PoE’s is neutral. What happens when PoE is not going through any particular problem, like at the end of a league, is that still, most threads are focused on GGG in one way or another, generally with requests for improvements to the game. And when the game is doing really well you also get tons of threads praising GGG and talking about how they’re amazing. The point is that there are rarely moments where the focus isn’t GGG, and I think the idea of power leakage cleanly explains why this happens.\n\nSecond, one thing that’s noticeable when Valve disappoints Dota players is that more often than not the response is one of acceptance, rather than one of denial/anger/bargain. You can look at threads like this for an example:\n\n::image /media/posts/community_management/_community_management_5.png\n\n\nAnd both the thread creator and the comments are much more lighthearted and accepting of the situation (the thread title is sarcastic). This is because Valve never promised an update when people thought one would come, so as one of the commenters mentioned, even the bargaining stage of the disappointment takes a different form, not one of blackmailing because these players intuitively understand that they have no power at all, but one of pleading, as in “please give us any information at all”.\n\nFor a subreddit that is completely 100% ignored by the developers, we can look at [PUBG’s](https://www.reddit.com/r/PUBATTLEGROUNDS/):\n\n::image /media/posts/community_management/_community_management_6.png\n\nAnd here we have the perfect subreddit, it’s literally all about the game, and it’s all visual too. One thing I don’t like about reddit is how some moderators really don’t want their subreddits to be oriented towards images/gifs/videos and want things to be text only. However, video games are mostly visual and to me it makes no sense that a subreddit about a game would be mostly text.\n\nIn any case, when comparing all 3 subreddits in terms of active users and also comparing the number of people playing the game, PoE’s is clearly ahead of the other 2, and PUBG is clearly last. So there are clear benefits to managing your game’s subreddit like GGG has done so far. It is _very_ obvious that GGG being as active as they are with reddit, but also with streamers, has massively contributed to the success of their game. So it’s easy for me to point at flaws without having appreciation for the positives of it. But I feel like the positives are obvious enough that they’re not really worth going over too much, and also most of them have hidden drawbacks that are hard to notice unless you’re looking at the problem from an odd/different angle.\n\n### Promises\n\nFor instance, in the first video I posted in this thread, the CS:GO developer mentions that one of the reasons Valve doesn’t like promising things to players is because it allows them to be more flexible and responsive to player demands. This makes sense and is logical, but there’s a deeper reason why promises shouldn’t be made, and I only came to realize this in the process of writing this post.\n\nOne of the things a promise does is that it lets people plan around you. In PoE’s GDC talk one of things Chris mentions is that the game really started becoming more popular once they switched to a predictable release schedule:\n\n::youtube tmuy9fyNUjY start=\"1080\"\n\nAnd as Chris mentions, there are a lot of benefits to this. But one drawback is that making people plan around you further makes things about _you_. This is pretty obvious, right? Dota players aren’t as disappointed _at Valve_ when there’s no patch because there’s no promise by Valve that every 4 months there will be a patch. Consequently, this makes things less about Valve, which corrupts people less as Valve isn’t leaking as much power, which makes their response to disappointment less aggressive and dramatic.\n\nSo a promise is fundamentally another form of power leakage, which is unexpected and something that I didn’t think about when starting writing this article but that totally makes sense. As a developer when you make a promise you’re essentially forming a contract with people about your game, and if you fail people will hold you accountable. But how will they do it exactly? That’s right, they can’t actually hold you accountable because they have no power.\n\n"}

I’d organize this around one question: where can a few months of your particular kind of game development produce something players strongly want, with a small number of effective actions to help them discover it?

That requires studying the games, their audiences, and how attention reaches them together. A promising niche that requires constant community management could be a poor opportunity for you; a modest niche with an accessible audience and room for expressive mechanics could be much better.

I’ve read your own essays, including Thoughts on making small games, Marketing vs. skills, and Writing and Gamedev. I haven’t opened Fable’s research or summaries, or followed the marketing-blog links in your essays.

My reading of your preferences is:

  • Small development scope, spacious play. You like systems that produce many possibilities without requiring mountains of authored content.
  • A compelling beginning and end. Your newer writing emphasizes getting the immediate action and powerful late-game builds working, then finding a generative structure connecting them.
  • Marketing effort should earn its place. A few well-chosen public actions fit; maintaining an ongoing promotional operation is a different commitment.
  • Making games should develop your judgment and abilities. Commercial results matter, but they aren’t the whole reason for choosing a project.

The older essays are evidence of your thinking then, not assumptions I’d impose on you now.

1. Build a fresh, reusable dataset, with a broad census and selective depth.

I’d first establish which Steam catalog and historical data we can actually collect reliably. Then build a local database and scripts covering release dates, prices, tags, developers and publishers, languages, reviews, and available demo and activity information. Every collection would record its source, date, missing fields, and coverage limits.

The broad layer prevents us from studying only visible successes. Deeper collection—review text, trailers, release histories, creator coverage—would concentrate on promising clusters and comparison games.

Sources would be Steam itself, Valve’s operational documentation, raw historical datasets where their provenance is acceptable, actual gameplay and player discussion, and original announcements. Third-party data can be useful without consuming the provider’s market commentary.

I’ve checked that Valve provides a documented review retrieval interface. I’d separately refresh the platform mechanics from Valve’s documentation, keeping “what the platform explicitly does” distinct from “what our observations suggest works.”

2. Establish what changed since you were closely following the market.

I’d compare your familiar period around 2019–2021 with subsequent release cohorts, treating 2026 separately because many games haven’t had time to develop a sales history.

The useful comparisons would concern distributions: how many games achieve modest traction, how concentrated success is, how quickly attention develops, and which kinds of games retain demand as competing releases accumulate.

Two distinctions matter here:

  • A five-year-old game’s lifetime reviews cannot fairly be compared with a three-month-old game’s.
  • Total Steam releases are a poor substitute for the number of credible alternatives competing for the same players.

Where historical observations are missing, I’d say so. Today’s tags, price, and polished store page cannot automatically explain a game’s launch years ago.

3. Search for openings through specific, testable questions.

These are the first directions I would investigate. They are hypotheses, not findings:

Direction Question and possible opening
Compact versions of demanding pleasures Which experiences do players love in large games but repeatedly describe as requiring too much preparation, grinding, reading, or session time? Could a small game preserve the pleasure while removing that burden?
Depth players actually recognize In successful games with limited visible scope, what produces the feeling of possibility: interacting systems, mastery, build variety, discovery, or sheer content count? Which sources of depth are economical for you to create?
Audiences with few satisfying substitutes Where do reviews and discussions repeatedly name the same small set of alternatives? Are players still buying older games because newer releases aren’t satisfying the same appetite? Sparse supply alone wouldn’t establish demand.
Games that generate repeated coverage Which modest games get several videos from the same creators? Do their mechanics naturally produce new challenges, surprising builds, or stories worth showing? This could make one successful introduction unusually valuable.
Demand hidden inside broad labels Within a crowded category, do players separate into distinct preferences—continuous action versus interrupted decisions, planning versus execution, short runs versus persistent progression—that the tags obscure?
Success with bounded obligations Which games achieve durable demand without frequent content updates or an elaborate community operation? What expectations did their product and presentation establish? Post-release work belongs in the development-cost calculation.

The first and fourth especially interest me for you. A compact game can give an existing audience a concentrated version of something it already enjoys, while a system that keeps producing interesting situations can give creators reasons to return. Both connect product design to distribution without requiring you to become a full-time promoter.

But I’d also reserve part of the search for games outside your established preferences. Otherwise the analysis could merely rediscover a justification for making another build-heavy action game.

4. Investigate the unremarkable games beside every promising success.

For each apparent opening, I’d examine nearby games that performed moderately or poorly. What separates them? Does the pattern survive removing the biggest hit? Does it recur across unrelated developers, languages, and release periods?

I’d also hold back a cohort to check promising patterns after discovering them. Searching thousands of combinations practically guarantees attractive accidents.

Some critical facts will remain difficult to observe. Simple visuals don’t establish short development time. Few public posts don’t establish little marketing effort. Reviews aren’t sales, and reviewer playtime isn’t the playtime distribution of all buyers. I’d use those signals carefully rather than turn them into precise-looking revenue or effort estimates.

5. Turn the strongest findings into choices and small experiments.

Each surviving opportunity should come with:

  • The player appetite and evidence that it exists.
  • Successful examples and relevant failures.
  • Why a game you could make in a few months might serve it.
  • A plausible route to those players.
  • What would invalidate the idea.
  • The cheapest useful test before committing to production.

For marketing, I’d compare specific actions with a bounded time cost: a browser release, a targeted creator pitch, a demo event, a post in an appropriate community. Public evidence can identify candidates; it usually cannot prove their incremental effect. For your own experiments, Steam’s UTM reporting can connect tagged links with some visits and conversions, subject to its tracking limitations.

Today’s first batch should deliver a working data foundation, an initial picture of the changes since 2021, and a few investigated opportunities with counterexamples. I’d rather finish three useful investigations than produce thirty speculative niches. The explanation would live here in the conversation, with scripts and data available for further questions.

I’ve sent three questions about your desired outcome and risk budget, acceptable marketing actions, and whether this should primarily inform Horse Game or future projects. One additional question would materially improve the evidence: would you be comfortable using your own Steamworks sales and traffic data for calibration, or should this remain entirely public-data research? Public data is enough to start.

It doesn't matter, I'm not particularly after money or audience, also you should read more about me because you'll get the answer to those questions, my blog is full of material on my positions.

Again, read more, all answered.

It shouldn't inform anything I'm working on or really use it, I'm looking for broad Steam market ideas, trends, etc, you can take a closer look at the kinds of games I work and try to find them in the data, but I usually like making games that are not well represented and new in one way or another it seems.

I asked you to restate positions I should have read first. I’ll read more of your writing and use it to understand your approach. The research will stay broad, independent of your current projects, and attentive to unfamiliar kinds of games rather than only established categories.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nr=Path('/home/adn/a327ex/...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"1c7b5f","wall_time_seconds":0.000002985,"exit_code":0,"original_token_count":303,"output":"marketing_skills.md 13670 ['Title: Marketing vs. skills', 'Date: 2021/09/13 19:23', 'Theme: old', 'Link: /posts/marketing_skills', 'Tags: indiedev, strategy']\nindiedev_creativity.md 15823 ['Title: Why indiedev creativity is stagnant and how to fix it', 'Date: 2022/04/03 12:00', 'Theme: old', 'Link: /posts/indiedev_creativity', 'Tags: indiedev, psychology, strategy']\ngame_quality.md 27272 ['Title: Game quality is all that matters', 'Date: 2022/10/03 22:20', 'Theme: old', 'Link: /posts/game_quality', 'Tags: indiedev, strategy']\nhigh_level_game_design.md 6929 ['Title: High level game design', 'Date: 2022/12/16 21:13', 'Theme: old', 'Link: /posts/high_level_game_design', 'Tags: design, indiedev, luck']\ncompetition.md 4662 [\"Title: Competition isn't real\", 'Date: 2022/06/15 11:39', 'Theme: old', 'Link: /posts/competition', 'Tags: indiedev, psychology, strategy']\nluck.md 4758 [\"Title: Luck isn't real\", 'Date: 2022/06/14 20:39', 'Theme: old', 'Link: /posts/luck', 'Tags: indiedev, luck, psychology, strategy']\nskill_death_spirals.md 25398 ['Title: Skill death spirals', 'Date: 2022/09/09 12:38', 'Theme: old', 'Link: /posts/skill_death_spirals', 'Tags: design, luck, skill death spiral, super people']\n"}
{"chunk_id":"858088","wall_time_seconds":0.000003378,"exit_code":0,"original_token_count":3458,"output":"Title: Marketing vs. skills\nDate: 2021/09/13 19:23\nTheme: old\nLink: /posts/marketing_skills\nTags: indiedev, strategy\nThumbnail: /media/posts/marketing_skills/_thumbnail_marketing_skills.jpg\n# Marketing vs. skills\n\nRecently someone sent me an e-mail asking me, roughly, that given my [recent](/posts/snkrx_log) [posts](/posts/community_management) it seems like I don’t value marketing that much. And given that marketing is such an important part of being an indie developer, what gives?\n\nWhy do I place such a low amount of value in activities like building wishlists, sending keys to influencers, building a community with a Discord server, and all the other tried and true activities that every indiedev should do if they want to have a chance at success? Is it because I’m now financially secure and so I don’t have to worry about any of this anymore, or is it something else?\n\n## High vs. low quality games\n\nYou want to make successful indie games. So you can look at this problem from the following perspective: how far away am I from making successful indie games and what’s the least amount of effort I need to spend to get there? In my opinion, the answer to this question will generally revolve around improving the quality of your games rather than improving the quality of your marketing.\n\nIf you spend time improving your game you will get much closer to a successful game than if you spend time improving your marketing, because for most indie developers, their games are just objectively bad. Even my game is objectively bad in multiple ways. For instance, someone did a redesign of my game’s UI and this is what some of it looks like (these likely won’t be used as they are anymore, which is why I’m posting them):\n\n<div class=\"captioned-image-container\">\n\n::video /media/posts/marketing_skills/_snkrx_ui_1.mp4\n\n::video /media/posts/marketing_skills/_snkrx_ui_2.mp4\n\nThese are just objectively better screens than anything I have in the game right now. For most indiedevs improvements like this one are going to give you much more bang for your buck than anything related to marketing.\n\nYou should think of marketing as a multiplier on a game’s base quality. If the base quality level is high, then optimizing for marketing is the thing to do that makes the most sense. But very few indiedevs are making games of high base quality, and so that’s not the thing they should focus on.\n\nI’m definitely not making games of high base quality, as SNKRX just looks like garbage, and most games I’ll release in the near future will similarly also look like garbage. So I really don’t need to worry about marketing that much because there are much more solid gains to be had elsewhere. For instance:\n\n## Screen composition\n\nThe reason the gifs above look objectively better than the UI I have going on in the game now is because they just are composed better.\n\nIn my opinion, easily the best thing indiedevs can do to improve the quality of their games is to learn to become more attuned to how well a screen is composed. Artists are generally going to be better at this than programmers (although this is not always the case, as there are plenty of artists who just can’t put a good screen together), but programmers can also learn to pay attention to this and at least develop a solid taste for it.\n\nIt’s very hard for me to pinpoint exactly what makes a screen well composed, but generally they’re just better balanced. It has little to do with the quality of each individual asset. You can have games with assets that look amazing but that are composed poorly, or you can have a game with very simple looking assets but that are composed well.\n\nBut the main thing about screen composition is that a well composed screen will pass most people’s visual quality filter at a glance. If you look at a screenshot/frame of a game for 1-2 seconds, you can already tell if you think it looks good or not. That’s mostly about the screen’s composition.\n\nSo improving this skill has obvious ramifications to how well your marketing efforts will do, since if the game passes more people’s filters, they will be more likely to share it and so the game is more likely to get a better response whenever you post it online.\n\nLet’s look at a few examples. Below there will be 7 images of 7 different games. All you have to do is look at the images for a few seconds and try to get a sense of which ones look the best and which ones look the worst. Here we go:\n\n::image /media/posts/marketing_skills/_marketing_skills_1.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_2.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_3.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_4.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_5.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_6.jpg\n\n::image /media/posts/marketing_skills/_marketing_skills_7.jpg\n\nDone? Try ranking the images now. Like 4th > 1st > 3rd… etc. I’ll give you some space to not bias your ranking, so scroll down once you’re done.\n\n::image /media/posts/marketing_skills/_empty_space.png\n\nMy personal ranking is 5th = 7th > 4th »» 2nd > 1st »» 3rd = 6th. Meaning, 3rd and 6th images are the worst, while 5th and 7th are the best. I would guess that for most people at least these extremes would be similar, while the middle might have more variation. Why exactly are 5th and 7th so much better than all the others? It’s just better art, but it’s not only better art, the art is composed properly on the screen.\n\nFor instance, the 4th image has very simple looking art, yet it’s better than the others because everything comes together properly on the screen. 1st and 2nd images are the types of games that really don’t pass for me, despite individual assets actually not looking that bad.\n\nAll of this to say that improving this skill, especially as a programmer, is going to be much more valuable than anything else. I have very little artistic talent, but I can still attune myself to this somewhat and this attunement will yield results whenever I have to compose screens of my own, even though because I’m not really an artist the results will still be subpar and easily made better by someone who’s actually skilled (as the UI example shows). And this is not the only skill you can improve that will yield high results. The speed of your development, all techniques involving juicing things up, learning how to find/pick/create good sounds, etc. It’s endless.\n\n## Small game strategy\n\nKnowing this, that there are so many avenues of improvement available and that they will all yield much better results than focusing at all on marketing, the thing that makes the most sense to do is to choose a strategy that will help you increase these gamedev skills rather than one which optimizes marketing. Or to put it better, the amount of effort you put into marketing should be proportional to how much you can gain from it.\n\nIf the game’s base quality is low, then marketing’s gain will be low, and so the amount of effort should be low as well. That’s what I did for SNKRX, and my marketing for it was just very low effort high potential gains activities, like posting it on reddit, Hacker News, and so on. If nothing came out of those activities then fine, I would have just moved on to the next game and kept focusing on improving my skills.\n\nWorrying too much about wishlists on a low base quality game, for instance, is a waste of effort and time because the game is just not that good, and so no amount of marketing can really help it. It’s much better to release tons of small games, increase your skills, and get feedback from the universe more often so that you can direct your efforts in a more focused manner depending on how people respond to your games.\n\nIf you have an amazing, high base quality game, sure, spend 1+ year building wishlists. Otherwise, don’t. And since the majority of indiedevs don’t have amazing high base quality games, the majority of them shouldn’t really spend that time on it, in my opinion.\n\n## Financial security\n\nAnother question asked by the e-mail was if I reached these conclusions because of my new-found financial security. The answer to that is no, as [I already had](https://github.com/a327ex/blog/issues/69) [these opinions](https://github.com/a327ex/blog/issues/37) formed before SNKRX got popular, except there’s some nuance to it.\n\nI was already somewhat financially secure before SNKRX and there was no pressure on me for any of my games to make me any amount of money. If they made additional money then great, otherwise I would have been able to just move on and keep making games.\n\nI definitely think that you should always develop indie games (and do any creative activity pretty much) with some financial security behind you, and if you don’t really have that you should work on fixing that first if you can.\n\nTrying to be creative while having to worry too much about financials leads to poor decisions, since if you’re insecure in that way you’ll tend to look at things from a short term lottery perspective, and you _really_ can’t do indie games from that perspective.\n\nThere’s a lot of randomness inherent to the environment and when that’s the case you have to be look at it like a poker player, in that you make the best decision possible for each hand but you have to understand that even though odds might have been in your favor it’s still possible that you’ll lose that individual hand. But if you keep making the right decisions in the long term then everything will likely turn out well.\n\n## Risk\n\nThis is why I highly disagree with people who really focus on wishlist building, because it’s a perfect example of this sort of short term lottery type of risk mitigation that disregards the reality of the situation, which is that if the game is not that good then spending that much more effort building wishlists for it is a huge cope.\n\nIt’s this middleground solution that’s not getting you anywhere, it’s just an excuse that’s helping you remain mediocre without aiming for higher skills because you can “mitigate the risk” by building wishlists. It’s a subpar, suboptimal solution to the complex problem of becoming an objectively better game developer.\n\nOften times in life you have situations where the correct decision is either 0 or 1\\. You either do something in a very limited fashion or don’t do it at all, or you do something in a very maximalist and expanded fashion. In these situations the middleground is always going to be the worse option because the math of effort spent for results gained just doesn’t make sense. This is going to be especially true in fields that have inherent randomness to them, like indie game development. This series of tweets explains this idea perfectly:\n\n::image /media/posts/marketing_skills/_risk.png\n\nEssentially you either want to do very short games (in terms of development time spent) of questionable quality, and this should be the case for most indie developers, or you want to do very long games (in terms of development time spent) of very high quality.\n\nIf you can’t reach that high quality then the more time you spend on your low quality game, the closer you’re getting to the toxic middleground of risk aversion where everything is a cope. You don’t want that, so avoid it. Build your skills up while doing short games, and once your skills are good enough you can think about spending more effort on marketing.\n\n## End sidenote\n\nOne month ago I got really angry at [this post](https://twitter.com/AdventureMtn/status/1425867701340180484) and the discussion around it online. I was able to control myself and really not comment on it too much, especially not comment on it on Twitter, so even though I was upset it wasn’t that bad.\n\nVery rarely do things make me angry online anymore though, so when something does it usually means that there’s some unresolved conflict there. I thought very long about why exactly this discussion got me so angry, and at first I settled on it just being: “I think this is wrong advice and the fact that everyone accepts it so casually made me angry”. But that’s a fairly handwavy conclusion.\n\nThere’s tons of people giving each other wrong advice I see online and it never makes me angry. Maybe it could be that because it’s so close to me, since it’s directly in my field of expertise, I care more about it so it will naturally have a higher chance of making me angry. And that could be the case, but…\n\nI think it’s more likely because it goes against my very deep need to conquer randomness. I _really_ like environments that have lots of sources of randomness and where if you act correctly in the long term you will likely come out successful. I used the example of poker earlier and that’s a very good and limited instance of that. Artifact, which is a game I really like is also a very good example of it.\n\nIndie game development is such an environment, so when I see someone giving others advice that is overly conservative like “don’t do small games because of the algorithm” it just really ticks me off. It’s like when you see someone play a game in a way too conservative manner. Is that going to work? Maybe. But it’s going to be _really_ boring and time consuming and you’ll likely stop playing the game before getting too far in it.\n\nAs Hot_Domme said, there’s no avoidance of risk either way. So it’s going to be much more fun and interesting to go either 0 or 1 and to avoid the toxic middleground of risk aversion. I was able to clearly realize that this was the reason why I got angry as I was replying to the e-mail that someone sent me, so thanks to that person for the questions."}
{"chunk_id":"821a2e","wall_time_seconds":0.000005419,"exit_code":0,"original_token_count":3992,"output":"Title: Why indiedev creativity is stagnant and how to fix it\nDate: 2022/04/03 12:00\nTheme: old\nLink: /posts/indiedev_creativity\nTags: indiedev, psychology, strategy\nThumbnail: /media/posts/indiedev_creativity/_thumbnail_indiedev_creativity.jpeg\n# Why indiedev creativity is stagnant and how to fix it\n\nApril Fool’s Day is a great example of how agreeableness acts as a blocker on creativity. Only on the day where wild and silly things are socially accepted do companies try aggressive changes to their products that might make them a lot better, as the social cost of change becomes lower.\n\nFor instance, Path of Exile’s battle royale mode started out as an April Fool’s joke. People liked it so much they constantly asked for it to be brought back over 3 years. Eventually the devs gave in and implemented a full version… that no one ended up liking.\n\n::youtube XWZ4tfOlC_g\n\n::youtube 5AEFygPyGFU\n\nIn this case it didn’t work out, but that’s how experiments should go. You try out a bunch of stuff and eventually you get somewhere good. The more different the thing you try is, the higher the chances that it will eventually take you from a locally optimal solution to a more globally optimal one.\n\n::image /media/posts/indiedev_creativity/_indiedev_creativity_1.png\n\nIf the social cost of experimentation is high, there are only two ways around it: you either don’t experiment, or you don’t care about social costs.\n\n## Indiedev creativity\n\nWhen [Jonathan blow said](https://gamedaily.biz/article/910/casual-connect-indie-development-is-stagnant-says-braid-creator-jonathan-blow?amphtml=1&__twitter_impression=true) that indiedevs didn’t progress the medium as much as was expected 10+ years ago, he was kinda right and kinda wrong:\n\n::youtube WKYEJmkIPlo start=\"93\"\n\nWe can break down the merit or success of indie games into 3 rough categories: thematic (theme, story, mood), technical (art, programming, juice) and creative (design). Blow’s argument can be steelmanned to say that:\n\n1. While the technical dimension has seen the most progress, followed by the thematic one, the creative dimension has been moving quite a lot slower.  \n2. While the thematic and technical dimensions are important, the creative dimension is the one that provides the most value for the medium.  \n\nI’ll assume 2 as true because while I am a gameplay maximalist, I somewhat disagree with it, but it’s a fairly nuanced discussion that happens to not really be relevant to this post. With that in mind, we should try to see if 1 is true.\n\nThematically indie games have progressed. While maybe there are [too many indie games being made about depression](https://twitter.com/TheAfroSmash/status/1351989566773878784), overall I think everyone agrees that the variety and quality of themes, stories, moods and so on have been consistently increasing.\n\nFor pretty much every niche topic you could think of there’s at least one game - even if it’s just a low effort shitpost - made about it. Part of this is due to Steam’s fairly lax game acceptance policy and overall success as a platform, which has made indie gamedev more viable as a career and thus attracts more developers who will go on to make more games about more subjects.\n\nTechnically indie games have also progressed. It’s now easier than ever to make games, and increasingly it takes less effort to make something that looks good and runs well on multiple platforms. You can also clearly see the group’s technical progress.\n\nIf you look at the quality of technical discourse around indie gamedev (for artists and programmers alike) it has definitely increased, as a result of both more experienced developers sharing their advice, but also people just having had more time to converge on better solutions for common problems. This has naturally led to an increase in technical quality for indie games as a whole. There are still lots of areas that remain largely unconquered, like say RTSs or MMOs for indie programmers, but eventually those will become easier as well.\n\nCreatively, however, indie games have not progressed that much. One way to look at this is to consider the types of games that succeed on the technical vs. creative categories.\n\nMost games currently succeed on technical ability. They’re games that look good, that are programmed well, that feel good to interact with, and that have lots of attention, effort and time (generally 3+ years) spent on making sure that these elements are executed well. Gamers generally reward games that are produced with a certain standard of quality, and achieving this standard is hard, so this is the safest category to be in.\n\nIf you make games that have high technical quality, it’s very likely that you will see success. For instance, there doesn’t exist a world where a game that looks like [Cuphead](https://store.steampowered.com/app/268910/Cuphead/) doesn’t see some sizable amount of success. There aren’t many games that look good like that, and so it just stands out on its technical quality alone.\n\nGames that succeed on creativity alone are generally the opposite. They’re likely made by amateurs, and thus will have low technical quality. They won’t look that good, maybe they won’t run that well, maybe they will even be lacking on juice, but something about their design will grip people despite all those faults.\n\nBy its nature you would expect that those games would exist in lower numbers than successful games in the technical category, which is largely what happens in reality. But what you wouldn’t expect, if the creative category was being properly explored by indie devs, would be for these creatively successful games to succeed on fairly small creative contributions.\n\nWhat I mean by this is the following: look at a game like Vampire Survivors, or even my own SNKRX. These are games that have succeeded on the creative category - their technical merits are partly dubious, but they’re definitely addicting. However, their creative contribution is not actually that involved. Both games can be summarized as “auto-attacking + build-making” games, which is just putting two things that already existed together.\n\nThere’s a lot to how exactly you put two things together, but it really shouldn’t be this easy to succeed on creativity alone after 10+ years of experimentation, if indiedevs had been properly exploring the creative dimension. You can repeat this exercise for quite a few types of games and find the same results. Which can only mean one thing: indiedevs haven’t actually been exploring the creative dimension properly. What have they been doing instead? Well, the answer to that has a lot to do with\n\n## Agreeableness\n\nThe main reason for the slow progress of the creativity dimension is the fact that most indiedevs are too agreeable. They care too much about other people’s opinions, and this deep caring dooms them, as it means they care about social costs, and as previously stated, caring about social costs means that you can’t experiment.\n\nIf you care too much about reviews, likes, your reputation, and all the other status oriented things that come with making indie games, you are inherently tying yourself down to other people, and this will have a negative effect on your creativity. Games that win on creativity tend to come from amateurs because haven’t won yet, they have no status to lose, so they will more easily take chances on wild and silly ideas.\n\nThe video below explains this argument very well. The main difference is that this guy is talking about geniuses, but for the context of this discussion you can swap “genius” for “creative indiedev”, as you don’t really need outlier high IQ to make meaningful contributions to indie games (although it probably helps). Everything else he says though applies perfectly:\n\n::youtube Bf821SFBGcA start=\"548\"\n\nSo the solution to creative stagnation is simple: become more disagreeable. This is easier said than done for people who are naturally agreeable, but being aware of it at least is a first step. Below are a series of things you should consider:\n\n## Status\n\nAs an indiedev you should not care about reviews, likes, your reputation and basically anything having to do with maintaining your status. Not caring doesn’t mean you have to ignore everything, quite the contrary, you should expose yourself to as many comments around your games as possible, but it means that your emotions have to be neutral.\n\nA negative review shouldn’t make you feel sad for a day or multiple days. A positive review shouldn’t make you feel happy for a day or multiple days. If you feel anything at all, your emotions should be punctual and brief. Other people’s opinions should have no real, long lasting sway over you.\n\nFor instance, if someone you kinda like and respect on twitter follows you and that makes you feel really good, it means you should probably turn the retarded schizoposting up to 11 for a while because if they can’t handle that it means they’ll unfollow you eventually, and better they unfollow now than later. That’s the kind of disagreeable instinct you need to have. Become ungovernable\n\n## Development time\n\nThe development cycles for your games should be short. Creative games win on creativity, not on their technical ability. If what you want to do is explore the space of games creatively then spending too much time on the thematic or technical categories is a mistake.\n\nNot only will it obfuscate which category is responsible for one of your game’s eventual success, most types of games made in 3-4 months can get their gameplay ideas across very well, so there’s no real reason to spend that much more time on it. This also has the additional benefit that you can iterate and try out more ideas at a much faster pace.\n\n## Post-authorship\n\nYou should believe in and practice the idea of [post-authorship](https://twitter.com/CharlotteFang77/status/1504552122431455241):\n\n::image /media/posts/indiedev_creativity/_indiedev_creativity_2.png\n\n::image /media/posts/indiedev_creativity/_indiedev_creativity_3.jpeg\n\nOne of the most common things I see among indiedevs, and this is especially true for artists, is that they view their games as extensions of themselves. They tie themselves emotionally to their games, such that criticism aimed at their game feels, emotionally, like criticism aimed at them.\n\nSimilarly, artists are much more likely to feel envious of others. If they see someone else with a cool and creative game their instinctive reaction is not “wow, that’s a cool idea”, but one of envy. This comes from a place of deep insecurity and from the misguided notion that games are a reflection of their creators. Seeing a cool game makes them think about how uncool their games are, which makes them think about how uncool they are, and so on.\n\nThe way to solve this is very simple: don’t emotionally attach yourself to your games. Again, easier said than done, but you should be aware that this is a bad pattern of behavior if your goal is being more creative.\n\nBy achieving this you will naturally be able to experiment more and take more risks because a game failing will not emotionally reflect poorly on you, just like a game succeeding will not emotionally reflect well on you. All games, both yours and other people’s, will just be the artifacts that they are, and you will be able to look at them in a more truthful way, unclouded by the poor judgement that comes with tying your identity to them.\n\nYou are the being that makes games, you are not any individual game. One exercise that encapsulates all these ideas neatly is the\n\n## Anonymous dev reset\n\nYou stop making games and posting under your current identity, be it your real name or a nickname, and you start a new, anonymous one, from scratch. You only take your skills with you, you can’t use any money or connections you made with your previous persona. Think of it as a new roguelike run.\n\nIf you are ready to kill your current persona, and start producing things under a new one anonymously, then it means you truly don’t care about status and that you genuinely want to try being more creative.\n\nAs this new persona, you can now try becoming more disagreeable without the social costs attached to it. If you speak your mind more, what’s really going to happen? You only have 4 followers on twitter from your first post on the #gamedev tag about the new game you’re making, right? So it’s fine.\n\nYou can also join more disagreeable gamedev communities, such as [AGDG](https://boards.4chan.org/vg/catalog#s=agdg), and start getting more into this mindset. For instance, you might find that the threads have quite a lot of low quality posts as it’s a fairly unfiltered place. But your ability to be emotionally unbothered by those posts is the exact same ability needed to be emotionally unbothered by negative reviews. So practicing this is a good way to actually become more emotionally detached from pixels on your screen.\n\nSimilarly, you might find that as you grow your account and release more games (with low dev duration) that those games are succeeding or not based on their creative qualities above all else. And as some of these games may find big successes, maybe even higher than anything you’ve made before, you’ll realize that things like luck and other excuses people use are just not real. Another very disagreeable belief that naturally spirals out into more disagreeable ideas which I covered in previous posts.\n\nBecause your games have short dev cycles, you’ll also naturally feel less attached to them. If you do things like releasing all their source code + art + maybe even IP on permissive licenses, that will only increase the detachment.\n\nAs you experiment more and eventually succeed more you will also gain more confidence in your abilities, which will make you a less insecure person in general. Envy comes from insecurity, so as you become more secure, you should also becomes less envious, which feeds back into attaching yourself less to your games, which leads to better decision making, and so on.\n\nThis way you can get into a very good and virtuous cycle where you’re experimenting more, increasing your creative skills, releasing more and more games, caring less and less about other people’s opinions…\n\nAnd eventually you will reach an enlightened state of creativity where you become a being of pure light, zeroes and ones flowing in and out of your chakras, visions of a dead and ancient past flashing incessantly, an alien energy enveloping and devouring the earth, constantly sucking out of it a stream of life into itself, into existence, exhausting, poising and destroying it. Life, in every form, cries from mercy from it; in man for freedom from it, yet none can resist its irresistible pull to live and to live again… Ah, yes. You have finally become one with the collective unconscious. So what are you waiting for?\n\n## END\n\nThere’s this japanese indiedev/musician who didn’t want his songs to be too well known. He always named them something weird and unsearchable, but eventually they became popular anyway because they were so good. He couldn’t handle it due to apparent mental issues, and then he just disappeared.\n\n::youtube ok7UX3utzvI\n\n::youtube C9PFVo1FEwU\n\n::youtube d_T1StgldnM\n\nThere’s something really appealing to me about this story and this path. Not the mental issues, but the disappearing. The constant rebuilding from zero and trying something new again and again.\n\nAs the anime girl below says:\n\n> Destruction is not the antithesis of creation. Rather, it’s the prerequisite, and its ultimatum. We give birth to the new by a self-destructive act.\n\n::image /media/posts/indiedev_creativity/_indiedev_creativity_4.png\n\nSo start anew, become more disagreeable, become less focused on status and more focused on truth, and more creativity will naturally follow.\n"}

exec ({"code": "const results=await Promise.allSettled([\ntools.exec_command({cmd:\"cat /home/adn/a327ex/a327ex-site/posts/...)

Script completed
Wall time 0.1 seconds
Output:

Warning: truncated output (original token count: 14958)
Total output lines: 3

{"i":0,"result":{"status":"fulfilled","value":{"chunk_id":"4a8db3","wall_time_seconds":0.000005394,"exit_code":0,"original_token_count":6914,"output":"Title: Game quality is all that matters\nDate: 2022/10/03 22:20\nTheme: old\nLink: /posts/game_quality\nTags: indiedev, strategy\nThumbnail: /media/posts/game_quality/_thumbnail_game_quality.png\n# Game quality is all that matters\n\nRecently I got into a small discussion with a few other devs over how much your reputation as a developer matters. The automatic position most devs have on this is that it matters quite a lot: if you have a good reputation further releases will be more likely to succeed, whereas if you have a bad one further releases will be more likely to flop.\n\nI disagree with this very strongly. I believe that the only thing that matters for a game’s success is its quality, and amassing an audience as a developer has extremely limited effects on the performance of any of your subsequent games. I also believe that people vastly overestimate how much publishers, streamers, youtubers, and marketing in general contributes to a game’s success. And in this post I’ll make the argument for why I believe this to be the case.\n\n---\n\nAccording to SNKRX’s reviews I am a “raving NFT lunatic”, a “deranged NFT shill”, trying too hard to be an “enlightened stoic online”, “arrogant”, and “genuinely insane”. Some of these may be true. But not only that, I got into a [small spat](/posts/status_addicts) with a group of very influential streamers and youtubers in the roguelite scene last year, and I’m pretty sure they won’t play any of my games in the future.\n\nSo clearly, my reputation is in shambles. I already lost all my money because I bought 3 apes and they got stolen, and now any game I make in the future won’t make any money either. It’s literally and unironically over for me. At this rate I’ll be forced to go back to the favela and jerk off motoboys at the Cristo Redentor for 15 reais a man:\n\n::youtube FY3m6hMyh3g\n\n“Good morning”, indeed!\n\nNow, if reality worked like people assume it does, this would have been a possible future. Fortunately for me, this won’t come to pass. First because I am _very_ responsible with my money, and you’ll be surprised to know that to this day I haven’t spent a single dollar on buying an NFT. Shocking, I know.\n\nBut second because, and this is the most important part, 99% of players don’t care about who makes their games, they only care about if the game is good or not. This is a very hard fact for people to accept, but to explain it let me quote myself from a [post](/posts/indiedevs_cancelled) I wrote 2 years ago, before SNKRX was released:\n\n> Your whole goal as an indiedev is to generate enough attention on your game so that Steam’s algorithm picks it up from there and propels it upwards. Once that happens, whatever reach you have in social media, however large you think it was, becomes very small. […] The majority of people playing your game will end up being people who simply don’t use social media.\n\nI’m not the only one saying things like this. Here is [Chris Zukowski](https://howtomarketagame.com/), notorious indie game marketer and Steam understander, in a [post](https://howtomarketagame.com/2022/07/25/why-dont-some-games-sell-well/) written 3 months ago:\n\n> I saw this meme for something else and it dawned on me that this is essentially how the Steam algorithm works.\n> \n> ![](/media/posts/game_quality/_game_quality_1.png)\n> \n> So when you send a newsletter out, or tweet about your game, or try to go viral, you are essentially knocking over that teeeny tiny domino. It is super super tiny.\n> \n> When you do “community building” and get people to signup for your newsletter, join your discord, follow you on Twitter, you are building up potential energy that can knock over that first domino. That is essentially what that core group is. Your super fans who will buy everything you do whether they like your game or not.\n> \n> BUT, if your game is really good and exciting, those community members tell their friends about your game…. and those friends will tell their friends. That is “word of mouth.” This happens enough, and the Steam algorithm will take note and see this “surge of people buying your game” and start showing it on the front page of steam.\n> \n> That middle domino is the most important. You can build a great community, get them to act, and buy on day 1, but if your game isn’t exciting, they won’t tell their friends. Your community might support you because they like you, but if they just don’t like the game, they won’t recommend it.\n\nAnd if you don’t believe in mere words and opinions, let’s take a look at this graph:\n\n::image /media/posts/game_quality/_game_quality_2.png\n\nThis is a graph of page visits to SNKRX’s steam page in its first month or so. Below is the graph focused on before NL played the game:\n\n::image /media/posts/game_quality/_game_quality_3.png\n\nAnd here we can do a little exercise. What percentage of page visits is due to external sources such as my own marketing and streamers/youtubers, and what percentage is due to Steam’s own internal traffic? To make it easier to answer this question, here are the numbers as a table:\n\n::image /media/posts/game_quality/_game_quality_4.png\n\nFirst we need to define what counts as Steam traffic and what counts as external traffic. From the picture above I think the ones that count as external would be external website, direct navigation, search suggestions, and direct search results, and everything else counts as internal Steam generated traffic.\n\nIf we add up the percentages we get 15.45% for external traffic and 76.76% for Steam’s traffic. This is roughly a 5X multiplier in Steam’s advantage. If we were to take the numbers as they are it means that all the marketing I did for SNKRX on my own + all the streamers and youtubers that played the game during that period (which are some of the same previously mentioned influencers that won’t play any of my games in the future) amount to 15% of page vists, while Steam itself amounts to 75-80% of it.\n\nBut of course, not all external website, direct navigation and search suggestion page visits can be counted as coming from either my or the influencers' efforts completely. For instance, if someone posts a link to the game on a random discord server and people click it, that counts as a direct navigation hit. So the number for both mine and the influencers' efforts are actually quite lower, as that 15.45% contains pretty much all of “word of mouth”.\n\nLet’s say that the real number is half, so 7.27%. This means that Steam’s own traffic, for a game of middling quality such as SNKRX (in terms of Steam’s own internal stats for games) is an order of magnitude (10x) higher than any external traffic generated, including influencers.\n\nLet’s see what number we get if we do the same exercise for the period after NL plays the game:\n\n::image /media/posts/game_quality/_game_quality_5.png\n\n::image /media/posts/game_quality/_game_quality_6.png\n\nAnd if we add up the percentages again we get 27.02% for external traffic and 66.74% for Steam’s traffic. This is roughly a 2.5X multiplier in Steam’s advantage. Applying the same logic as before where the real number is half, we can say that it’s roughly a 5X multiplier instead.\n\nThere’s a difference here, from 5X to 10X, and there are multiple ways to explain it. One of them is that each game on Steam has something like an internal MMR score. I call this the “point of equilibrium”. This is a number or a set of numbers that tells Valve’s algorithm how “good” the game is, or how much it deserves to be shown on the store. For instance, a game like Slay the Spire most likely has a very high point of equilibrium, because it’s just a good game:\n\n::image /media/posts/game_quality/_game_quality_7.png\n\nA game like SNKRX, for instance, has a lower point of equilibrium. It’s a pretty good one globally, but it’s certainly not the best. So what happens when a game like that is played by someone like NL, his audience’s size “carries” the game more in comparison to Steam because the game is closer to its point of equilibrium.\n\nIf this didn’t make sense, consider that the Steam store is a giant ad. Each game slot in the store is an ad slot, and all Valve’s algorithm is doing is picking games to show in each slot that will maximize the amount of money they make. As they show a game on the store more, this game will sell copies at a certain conversion rate. Games that have a better conversion rate will be shown more, because they make Valve more money.\n\nGames that don’t sell as much are essentially costing Valve money, since they could be showing a game that performs better on that same ad slot. What this dynamic results in is that each game has its own point of equilibrium. This is how much the game is shown on the store while still having this operation be profitable for Valve.\n\nFor most games this dynamic means that they will never ever be shown after release day, but for some games like mine it means that they will be shown very consistently and predictably. Despite not getting any marketing by me or being played by influencers since like 1 year ago, SNKRX still generates a _very_ consistent amount of money every month. And this consistent amount represents its point of equilibrium.\n\nChris has mentioned in [this post](https://howtomarketagame.com/2022/09/25/benchmarks-for-selling-a-game-on-steam/) that, based on his experience, games that make over ~$250k have a high enough point of equilibrium that showing the game is always profitable for Valve, and so those games get various additional benefits on the store on top of somewhat consistent income.\n\nAnother consequence of this dynamic is that this means Steam pays attention to any external traffic generated to a game, since that traffic will generate some sales, and then amplifies that until the game reaches its point of equilibrium. For SNKRX, in the before NL period, that amplification resulted in a 10X multiplier because it was further away from its true point of equilibrium, and then after NL it resulted in a 5X multiplier because it got closer to what it deserved.\n\n::sidenote **NOTE:** if you’re a dev and you want to do this exercise, be mindful that Steam’s page visits numbers are very noisy, for instance, [this](https://i.imgur.com/EsixUQd.png) is what the full graph for my game looks like and theres this huge spike in “direct navigation” hits that resulted in absolutely no additional sales during that period, due to the game being placed, I think incorrectly, in some sale that was happening at the time.\n\nThe point being, the better the game, the higher its point of equilibrium, and the more Steam will show it to its users so it reaches the place it deserves. Consider a game like Vampire Survivors. As I write this it has 120k reviews. If Vampire Survivors' dev did this same exercise I just did in this post, he would probably find a much much higher multiplier, like 100X or even 1000X? Simply because his game is that good, and thus his point of equilibrium is very high, and so Steam will just spam it until it stops making them money.\n\n::sidenote So if you’re going to do this pick a period where you’ve checked that the sales for that period look right, and where you know what kinds of external traffic happened on each day and so on. It’s easier to do this analysis if your game has experienced an “undiscovered” period. If your game was released with thousands of wishlists already you don’t get to see a comparison in the multipliers from when it was undiscovered to when it was discovered and then to when it popped off hard, so it’s going to be less useful.\n\nIt’s very easy for people to think that something like Vampire Survivors happens primarily because of streamers/youtubers. They’re the most visible part of the game’s success, Valve won’t really go out of their way to say “actually it was all me” because they don’t need to, and the influencers of course are more than happy to take the credit.\n\nBut, you know, it’s just not what’s actually happening. I am, again, not really [the only one](https://twitter.com/DUSKdev/status/1319375592752492544) saying this:\n\n::image /media/posts/game_quality/_game_quality_8.png\n\nAnd here DUSKdev is basically saying, yes, influencers are not very good for sales conversions at all, they’re good in the same way that general marketing/ads are good. I think this second part of the argument is questionable given everything else I said in this post, but it’s a much more defensible position because, as he says, it’s much harder to quantify it and thus prove it right or wrong.\n\nStill, you could object to all this on the grounds that without the initial external traffic that comes from primarily influencers, games would just be forgotten to the Steam void. After all, Vampire Survivors itself only got big weeks after release after [SplatterCatGaming](https://www.youtube.com/c/SplatterCatGaming) played it, so it’s a good example of a game where this definitely could have happened.\n\nAnd this would be a reasonable objection. But it’s wrong. And to explain why this line of thinking is wrong it’s useful to look at this diagram:\n\n::image /media/posts/game_quality/_game_quality_9.png\n\nAnd so here we have 4 quadrants. On the x axis it goes from “bad game” to “good game”, which represents the game’s quality as assessed by the Steam algorithm, and on the y axis it goes from “bad marketing” to “good marketing”, which represents how much external traffic the game generates.\n\nLet’s start with bad game + bad marketing. This is a game where when people visit the page, very few people buy it. Of those who buy it, they don’t play for that long, and also don’t tell their friends about it. This game has pretty poor stats and thus the algorithm, after trying it out for a few hours or a day after release, decides to pretty much not show it on the store anymore.\n\nBut on top of that, the game also has very poor external traffic. The developer has like 21 followers on twitter, and they made no effort at all to try to market the game anywhere other than their twitter page. If by some miracle a single influencer plays it, the effect of that will be small because the game just doesn’t convert nor spreads itself well. This is most indie games on Steam.\n\nNow let’s look at bad game + good marketing. This is still a game with bad stats and bad conversion, but somehow it managed to generate quite a bit of external traffic. Maybe it has a well known publisher, or the developer is friends with a few big streamers. Whatever may be the case, the game is able to generate a good number of initial sales, but given that its stats are poor, the Steam algorithm won’t really share it with its audience that much.\n\nThis is a game with a low point of equilibrium, which means that the multiplier from Steam will be a very low number like maybe 1.5X or 2X, which will decrease more as time passes from release as the initial boost from external marketing fades. This is what happened to my first game, [BYTEPATH](https://store.steampowered.com/app/760330/BYTEPATH/):\n\n::image /media/posts/game_quality/_game_quality_10.png\n\n::image /media/posts/game_quality/_game_quality_11.png\n\nFor BYTEPATH, most of the external marketing came from [a reddit post](https://www.reddit.com/r/pathofexile/comments/7zu9vz/i_made_a_small_game_inspired_by_poes_passive/) instead of streamers, and you can see that in the graph, as that single reddit thread got the game a total of 24k page visits, and if you look at Steam’s contribution it’s significantly lower as a percentage than it was for SNKRX. If we add the percentages it’s 38.82% for external traffic and 59.51% Steam’s traffic, which is a multiplier of about 1.5X (or 3X if you divide external traffic by 2).\n\nAnd so basically what happens with these kinds of bad games is that no matter how much marketing you do for them, Steam’s algorithm will just not go along with it because the game simply has bad stats. And as already mentioned, Steam does most of the work in terms of numbers, so if the game isn’t good it’s just not going to go very far.\n\nNow let’s look at good game + good marketing. This is a good game with good stats, maybe it participated in one of the Steam demo festivals and amassed quite a lot of wishlists, and so when it releases it just does well and the algorithm propels it upwards from there, which makes influencers pick it up more and more and a positive feedback loop is established until it reaches its very high point of equilibrium.\n\nPretty much any game with over like 1000 reviews on Steam is a good example of this, and the number of reviews where they end up is their point of equilibrium. The most recent one I’ve been attention to at time of writing is [Brotato](https://store.steampowered.com/app/1942280/Brotato/), and it currently has about 1000 reviews growing at a good rate, so I’m curious on where it will end up.\n\nSome games end up with around 5000 reviews, others around 10000, some 50000, some 100000 and so on. And these numbers differ because each game’s point of equilibrium and virality is different based on its quality, but Steam will work to eventually bring the game to its algorithmically correct place.\n\nFinally, we have good game + bad marketing. This is the most interesting quadrant because it’s the one people have the most wrong opinions about. This is a good game, it has good stats, but it has not yet reached a wider audience because it has very poor external traffic. The previously mentioned “SNKRX before NL” would fit as an example of this, and we can also look at the analysis there for hints at what happens to these games.\n\nAnd what happens is that Steam will work very hard to show the game to as many people as possible so that it reaches its true point of equilibrium, which is very high. This means that for this kind of game, each unit of marketing input is amplified by Steam a lot more than if it was a bad game. For SNKRX before NL this multiplier was 10X, for BYTEPATH (a bad game) the multiplier was 1.5X. For a game that is even better than SNKRX, like say Vampire Survivors for the first two weeks before it got discovered, the multiplier was likely a lot bigger than 10X.\n\nAnd this is one of the reasons why I find it very hard to believe that things like “hidden gems” exist. Any game that is truly a hidden gem will have very good internal stats on Steam’s algorithm and any attention that it gets at all will propel it upwards tremendously until it reaches its point of equilibrium.\n\nSimilarly, this is why I believe that [marketing in general doesn’t matter](/posts/marketing_skills). It’s not necessarily that it doesn’t matter, but the amount that it matters compared to game quality is significantly misplaced in people’s mind.\n\nIf you have a good game, you need to do minimal marketing as the algorithm will do most of the work for you. If you have a bad game, no amount of marketing will make it perform. Given these two facts, the logical thing to focus on is to improve your game’s quality, yet people spend quite a lot of effort on marketing as if it mattered.\n\nThe only time marketing matters to some degree is on the good game + good marketing quadrant, where you know you have a good game and you want to optimize its results, but even that optimization will be somewhat muted, because if you have a good game and you, say, got as many wishlists as you could for it on one of those Steam festivals, it will pretty much be guaranteed to reach its equilib…4958 tokens truncated…nIn any case, competition isn’t real, except when it is, but it generally isn’t. Believing this increases creative flow and aids egoless building, which precedes true creativity.\nTitle: Luck isn't real\nDate: 2022/06/14 20:39\nTheme: old\nLink: /posts/luck\nTags: indiedev, luck, psychology, strategy\nThumbnail: /media/posts/luck/_thumbnail_luck.png\n# Luck isn't real\n\nYour body and your mind are you and you are them. Your body speaks to you through instinct, your mind speaks to you through reason. You feel in control of your mind because reason is weak, you don’t feel in control of your body because instinct is strong.\n\nBody to mind coercion is the default state. Strong ancient instinct is a natural winner, which is why you eat and play more than you should, and exercise and work less than you should.\n\nMind to body coercion is slow and painful. Convincing your body to do something it doesn’t want to takes time and effort - new habits have to be built from scratch, old habits have to be resisted and then forgotten.\n\nBoth body to mind and mind to body processes are happening all the time inside you, and sometimes they can also reinforce each other. This loop can also often happen subtly, via the distortion of the lens through which you parse reality.\n\nSuppose your body wants to feel like X. This will make your mind filter reality through the lens that makes your body feel like X. Suddenly ideas that make you feel like X will instinctively seem right, and ideas that don’t will instinctively seem wrong.\n\nAs more ideas in your head are serving X, this in turn will make your body seek out X even more, which will make your mind filter for X even more, which will strenghten the loop further. Because you are what you practice becoming, this process ends with you becoming an avatar of X.\n\nX can be a lot of things. For the purposes of this post, let’s suppose it is “lack of control”. If your body wants to feel like it’s not in control, it will automatically make your mind filter reality so that ideas that make you feel like this seem right.\n\nBecause the mind is weak, any idea that is merely objectively true will coerce it. For instance, luck. Take the following statements:\n\n1.  There are lucky events that happen that are outside of any one person’s control  \n2.  If someone is successful it was in small or large part due to such lucky events  \n\nBoth of these statements are objectively true. But they are not pragmatically true, because the idea of luck feeds your body’s need for lack of control, which makes you parse reality through a lens of lack of control, which further feeds your body’s need for lack of control, and as the loop plays out you will become an avatar of lack of control, which is a person who lacks control.\n\n> Objective truth is scientific truth, concerned only with objective reality, reason and logic. While pragmatic truth is darwinian truth, concerned with fitness, or only what is true enough to lead to better outcomes in the future.\n\nIn this case, the only way to break the loop is through active, conscious rejection of the idea that luck matters or is important. You have to psyop yourself into the belief that luck isn’t real to not become its avatar and to eventually gain the pragmatic benefits that come from not believing in it.\n\nMany people have gamed out this process instinctively - which is incidentally what allows them to be successful - such as contemporary philosopher and part-time streamer, Félix Lengyel:\n\n::youtube GfYHU3jVky4\n\nWhen you don’t believe that luck matters you are rejecting your body’s temptation to not be in control, which in turn makes you look at reality through the lens of what you actually control. xQc’s gaming example here is perfect. Seeing an opportunity as opportunity is a skill that increases the more you do something, but it also increases the more you believe you are in control.\n\nThe more you believe you are in control, the more you’ll look for things that you control, and the more you’ll affect the outcomes of whatever you’re doing. Rejecting luck thus is a pragmatically true idea because it coerces your body into parsing reality through a lens that gives you more power to affect it in your favor.\n\nAncients often spoke of destiny. Luck and destiny are both concepts used to explain that which happens outside one’s control. However, luck is indeterminate and destiny is determinate. When you get lucky it’s a random event, a statistical anomaly, it just happened. When you are destined for something, you either become worthy of your destiny and reach it or you are a failure. One idea is clearly more pragmatically true than the other.\n\nConsider Eric Barone’s words:\n\n::youtube 0ti5bBgEJaw\n\nWhich indie game developer will more likely succeed: the one who believes himself destined for success who will not stop until he becomes worthy and succeeds, or the one who believes it’s mostly down to luck and that it just happens?"}}}
{"i":2,"result":{"status":"fulfilled","value":{"chunk_id":"fb4fac","wall_time_seconds":0.00000192,"exit_code":0,"original_token_count":3660,"output":"2026-05-03-161453.md | Date: 2026-05-03 16:14:53 | Title: Video\n2026-05-03-192415.md | Date: 2026-05-03 19:24:15 | Title: I am so incredibly horny all the time.\n2026-05-03-203538.md | Date: 2026-05-03 20:35:38 | Title: Free dopamine generators vs. meaning and commitment\n2026-05-03-210744.md | Date: 2026-05-03 21:07:44 | Title: Psyllium husk and Big Gay Bottoms\n2026-05-03-213645.md | Date: 2026-05-03 21:36:45 | Title: Dario vs. Sam, intuition and actions\n2026-05-03-230929.md | Date: 2026-05-03 23:09:29 | Title: Image\n2026-05-04-000900.md | Date: 2026-05-04 00:09:00 | Title: Video\n2026-05-04-124115.md | Date: 2026-05-04 12:41:15 | Title: Technology, power, and the panopticon\n2026-05-04-233711.md | Date: 2026-05-04 23:37:11 | Title: Beta mosquito\n2026-05-05-000658.md | Date: 2026-05-05 00:06:58 | Title: Taste isn't what matters most\n2026-05-05-121038.md | Date: 2026-05-05 12:10:38 | Title: Expanding on meaning and commitment\n2026-05-05-184655.md | Date: 2026-05-05 18:46:55 | Title: How Not to Handle Player Feedback\n2026-05-05-202710.md | Date: 2026-05-05 20:27:10 | Title: The algorithm as creative's friend\n2026-05-05-233048.md | Date: 2026-05-05 23:30:48 | Title: Video\n2026-05-06-183343.md | Date: 2026-05-06 18:33:43 | Title: Video\n2026-05-06-231535.md | Date: 2026-05-06 23:15:35 | Title: Moving off blot.im, AI for verifiable tasks\n2026-05-07-002156.md | Date: 2026-05-07 00:21:56 | Title: Video\n2026-05-07-093115.md | Date: 2026-05-07 09:31:15 | Title: Cooking exam dream, the broken verifier\n2026-05-07-142845.md | Date: 2026-05-07 14:28:45 | Title: Hantavirus chastity, but no doom-prep\n2026-05-07-195722.md | Date: 2026-05-07 19:57:22 | Title: I got Hantavirus at the Japanese handjob parlor\n2026-05-08-225224.md | Title: Video | Date: 2026-05-08 22:52:24\n2026-05-09-011229.md | Title: Moved website to my server entirely | Date: 2026-05-09 01:12:29\n2026-05-09-174843.md | Title: Mark of the Fool and learning from doing | Date: 2026-05-09 17:48:43\n2026-05-10-100428.md | Title: Gente, what a horrible person | Date: 2026-05-10 10:04:28\n2026-05-10-111926.md | Title: They're doing this to me tomorrow. | Date: 2026-05-10 11:19:26\n2026-05-17-081510.md | Title: Video | Date: 2026-05-17 08:15:10\n2026-05-17-225813.md | Title: Image | Date: 2026-05-17 22:58:13\n2026-05-19-112614.md | Title: Never \"bullet heaven\" | Date: 2026-05-19 11:26:14\n2026-05-19-171119.md | Title: Three tweets on HIV risk | Date: 2026-05-19 17:11:19\n2026-05-19-175517.md | Title: Hantavirus contact tracing | Date: 2026-05-19 17:55:17\n2026-05-19-183226.md | Title: Video | Date: 2026-05-19 18:32:26\n2026-05-19-212903.md | Title: Hooked up with this really cute twink at the start | Date: 2026-05-19 21:29:03\n2026-05-20-104610.md | Title: Image | Date: 2026-05-20 10:46:10\n2026-05-20-124225.md | Title: Four quotes on women and the gaze | Date: 2026-05-20 12:42:25\n2026-05-20-131655.md | Title: Two tweets on games and story | Date: 2026-05-20 13:16:55\n2026-05-20-211456.md | Title: Absolute soulkino, favorite ball battles variation | Date: 2026-05-20 21:14:56\n2026-05-20-224816.md | Title: A grand why | Date: 2026-05-20 22:48:16\n2026-05-20-230113.md | Title: Video | Date: 2026-05-20 23:01:13\n2026-05-21-015713.md | Title: Americans when you ask them to name their song | Date: 2026-05-21 01:57:13\n2026-05-21-144042.md | Title: Don't Survey Your Players | Date: 2026-05-21 14:40:42\n2026-05-21-163053.md | Title: More on meaning and commitment | Date: 2026-05-21 16:30:53\n2026-05-22-095724.md | Title: Why I Gave Up | Date: 2026-05-22 09:57:24\n2026-05-22-102142.md | Title: Good thing about being sick is having no appetite | Date: 2026-05-22 10:21:42\n2026-05-23-000152.md | Title: Obsession (2026) is an interesting movie | Date: 2026-05-23 00:01:52\n2026-05-23-120331.md | Title: I found the script of Obsession (2026) online and read it | Date: 2026-05-23 12:03:31\n2026-05-23-204820.md | Title: Image | Date: 2026-05-23 20:48:20\n2026-05-23-204830.md | Title: Gen z in China: grinders vs lying flat | Date: 2026-05-23 20:48:30\n2026-05-23-214132.md | Title: @LauraRbnsn on Obsession's monkey's paw | Date: 2026-05-23 21:41:32\n2026-05-24-114319.md | Title: I liked wearing mask during Corona-chan's reign | Date: 2026-05-24 11:43:19\n2026-05-24-115346.md | Title: I got maskfished at the Japanese handjob parlor | Date: 2026-05-24 11:53:46\n2026-05-25-001455.md | Title: Video | Date: 2026-05-25 00:14:55\n2026-05-25-013229.md | Title: Video | Date: 2026-05-25 01:32:29\n2026-05-25-063507.md | Title: Dream of two kings, white doves, and a polychrome lance | Date: 2026-05-25 06:35:07\n2026-05-25-220745.md | Title: Find/make sounds like this for some projectile spell | Date: 2026-05-25 22:07:45\n2026-05-26-000515.md | Title: Coding workflow with Claude: the design brief | Date: 2026-05-26 00:05:15\n2026-05-26-193749.md | Title: I made the mistake of interacting with Obsession | Date: 2026-05-26 19:37:49\n2026-05-26-195601.md | Title: Video | Date: 2026-05-26 19:56:01\n2026-05-26-195715.md | Title: I am grateful that I get to work on what I love | Date: 2026-05-26 19:57:15\n2026-06-06-202103.md | Title: I'm writing a new story with a different character | Date: 2026-06-06 20:21:03\n2026-06-06-234925.md | Title: I've been going to the gym pretty consistently | Date: 2026-06-06 23:49:25\n2026-06-07-132119.md | Title: jreg's video is good and he isn't wrong | Date: 2026-06-07 13:21:19\n2026-06-07-224458.md | Title: Video | Date: 2026-06-07 22:44:58\n2026-06-07-224854.md | Title: Video | Date: 2026-06-07 22:48:54\n2026-06-07-225301.md | Title: Video | Date: 2026-06-07 22:53:01\n2026-06-07-231158.md | Title: Video | Date: 2026-06-07 23:11:58\n2026-06-08-005329.md | Title: One of the best things about the internet | Date: 2026-06-08 00:53:29\n2026-06-08-113225.md | Title: Video | Date: 2026-06-08 11:32:25\n2026-06-08-133445.md | Title: I like this gender war era of the internet | Date: 2026-06-08 13:34:45\n2026-06-08-184458.md | Title: Image | Date: 2026-06-08 18:44:58\n2026-06-09-092802.md | Title: Video | Date: 2026-06-09 09:28:02\n2026-06-09-093857.md | Title: Video | Date: 2026-06-09 09:38:57\n2026-06-20-234037.md | Title: Was talking to my dentist and the conversation turned to his son | Date: 2026-06-20 23:40:37\n2026-06-21-085927.md | Title: Big Portuguese wants you to take hormones and transition | Date: 2026-06-21 08:59:27\n2026-06-21-103134.md | Title: The Steam AI Score | Date: 2026-06-21 10:31:34\n2026-06-21-141313.md | Title: Obsession, Backrooms, and the new He-Man movie | Date: 2026-06-21 14:13:13\n2026-06-23-201128.md | Title: He-Man and the integrated feminine | Date: 2026-06-23 20:11:28\n2026-06-24-205110.md | Title: Destruction is not the antithesis of creation | Date: 2026-06-24 20:51:10\n2026-06-24-210809.md | Title: Yuyoyuppe - SICK Yanderu EP (Full E.P) [2023] | Date: 2026-06-24 21:08:09\n2026-06-24-212935.md | Title: Periphery - Reptile (Audio) | Date: 2026-06-24 21:29:35\n2026-06-24-215103.md | Title: Pain of Salvation - Inside Out | Date: 2026-06-24 21:51:03\n2026-06-24-215928.md | Title: The best people in life are free | Date: 2026-06-24 21:59:28\n2026-06-25-105748.md | Title: Never trust your emotions after 9PM | Date: 2026-06-25 10:57:48\n2026-06-25-145417.md | Title: The It Follows run | Date: 2026-06-25 14:54:17\n2026-06-25-192215.md | Title: AI fills the same interactivity hole as games | Date: 2026-06-25 19:22:15\n2026-06-25-213832.md | Title: Conclusions from 6 Months of AI Usage | Date: 2026-06-25 21:38:32\n2026-06-25-220823.md | Title: On the Mythos/Fable situation | Date: 2026-06-25 22:08:23\n2026-06-28-020253.md | Title: Someone sent me an e-mail asking that given that | Date: 2026-06-28 02:02:53\n2026-06-28-114419.md | Title: Video | Date: 2026-06-28 11:44:19\n2026-06-28-115848.md | Title: Video | Date: 2026-06-28 11:58:48\n2026-06-28-231739.md | Title: It seems my Great Fireball At The End Of Time | Date: 2026-06-28 23:17:39\n2026-06-28-232639.md | Title: Video | Date: 2026-06-28 23:26:39\n2026-06-29-231405.md | Title: Tweet by @Clavicular0 | Date: 2026-06-29 23:14:05\n2026-07-01-114939.md | Title: Announcing Box3D | Date: 2026-07-01 11:49:39\n2026-07-01-213155.md | Title: This website is now fully rendered using my engine | Date: 2026-07-01 21:31:55\n2026-07-03-224719.md | Title: Video | Date: 2026-07-03 22:47:19\n2026-07-03-230041.md | Title: I've been testing Fable 5 and wondering why | Date: 2026-07-03 23:00:41\n2026-07-03-233953.md | Title: Tweets | Date: 2026-07-03 23:39:53\n2026-07-03-235111.md | Title: Tweet | Date: 2026-07-03 23:51:11\n2026-07-04-123056.md | Title: Added a chat feature to the website | Date: 2026-07-04 12:30:56\n2026-07-07-204709.md | Title: Below is what Fable did in 2! (two) turns | Date: 2026-07-07 23:51:40\n2026-07-09-124628.md | Title: As I mentioned in the previous chat message, I | Date: 2026-07-09 12:46:28\n2026-07-10-202638.md | Title: The number of new model releases just now is | Date: 2026-07-10 20:26:38\n2026-07-11-173855.md | Title: On Whiplash: AI Psychosis and Optionality Paralysis | Date: 2026-07-11 17:38:55\n2026-07-12-010140.md | Title: I like this guy's account but it's always | Date: 2026-07-12 01:01:40\n2026-07-13-101145.md | Title: Thread by @robertlasagna1 | Date: 2026-07-13 10:11:45\n2026-07-14-152103.md | Title: Video | Date: 2026-07-14 15:21:03\n2026-07-14-154503.md | Title: Video | Date: 2026-07-14 15:45:03\n2026-07-14-174351.md | Title: Many comments on this ad, I disagree with most of | Date: 2026-07-14 17:43:51\n2026-07-14-180414.md | Title: Video | Date: 2026-07-14 18:04:14\n2026-07-14-183427.md | Title: Video | Date: 2026-07-14 18:34:27\n2026-07-16-181804.md | Title: God, I know I've prayed to you in the past asking | Date: 2026-07-16 18:18:04\n2026-07-17-111138.md | Title: Well, I didn't get ghosted, if anything I got | Date: 2026-07-17 11:11:38\n2026-07-17-222359.md | Title: Below is Kimi K3's version of the Anchor 3D task | Date: 2026-07-17 22:23:59\n2026-07-18-120613.md | Title: Remember that by reading this website you are privileged | Date: 2026-07-18 12:06:13\n2026-07-20-143032.md | Title: Tweet | Date: 2026-07-20 14:30:32\n2026-07-21-021047.md | Title: Video | Date: 2026-07-21 02:10:47\n2026-07-21-215601.md | Title: Naming the chess game the JAV way | Date: 2026-07-21 21:56:01\n2026-07-22-002320.md | Title: Brazilian Portuguese is the cutest language on Earth | Date: 2026-07-22 00:23:20\n2026-07-23-104718.md | Title: Made this little gameplay video/trailer for horse | Date: 2026-07-23 10:47:18\n2026-07-28-090017.md | Title: The Illusion of Dominance: Why The Redpill Is Wrong | Date: 2026-07-28 09:00:17\n2026-07-28-203142.md | Title: Extremely impressive, one of the first games | Date: 2026-07-28 20:31:42\n2026-07-28-213723.md | Title: Oh yea, it occurs to me I have not actually spoken | Date: 2026-07-28 21:37:23\n2026-07-28-221450.md | Title: Video | Date: 2026-07-28 22:14:50\n2026-07-28-223257.md | Title: Video | Date: 2026-07-28 22:32:57\n2026-07-30-115124.md | Title: Video | Date: 2026-07-30 11:51:24\n2026-07-31-095259.md | Title: Video | Date: 2026-07-31 09:52:59\n2026-08-01-044746.md | Title: Conclusion seems to be that the models are currently | Date: 2026-08-01 04:47:46\n2026-08-01-180118.md | Title: This optionality point is obviously true | Date: 2026-08-01 18:01:18\n2026-08-02-082253.md | Title: Video | Date: 2026-08-02 08:22:53\n2026-08-03-041701.md | Title: In life, it is vital to take things as they are | Date: 2026-08-03 04:17:01\n2026-08-03-045529.md | Title: Video | Date: 2026-08-03 04:55:29\n2026-08-06-230841.md | Title: Tweet by @graveair | Date: 2026-08-06 23:08:41\n2026-08-07-113414.md | Title: Being a beautiful favelado mid is so fucking funny | Date: 2026-08-07 11:34:14\n2026-08-07-114354.md | Title: I think I am binary with liking/disliking people | Date: 2026-08-07 11:43:54\n2026-08-07-125138.md | Title: Continuing the Steam AI score idea | Date: 2026-08-07 12:51:38\n2026-08-07-134521.md | Title: Very nice effects on this game | Date: 2026-08-07 13:45:21\n2026-08-08-161433.md | Title: Had to briefly code manually for the first time | Date: 2026-08-08 16:14:33\n2026-08-08-180526.md | Title: Image | Date: 2026-08-08 18:05:26\n2026-08-09-130031.md | Title: Video | Date: 2026-08-09 13:00:31\n2026-08-09-203349.md | Title: Video | Date: 2026-08-09 20:33:49\n2026-08-11-213654.md | Title: My full CLAUDE.md file as of 11th August 2026 | Date: 2026-08-11 21:36:54\n2026-08-18-205314.md | Title: Tweet by @cocadonv | Date: 2026-08-18 20:53:14\n2026-08-18-210343.md | Title: Gravity | Date: 2026-08-18 21:03:43\n2026-08-18-213247.md | Title: Kitty Kat | Date: 2026-08-18 21:32:47\n2026-08-18-230229.md | Title: Tweet by @minima_ai | Date: 2026-08-18 23:02:29\n2026-08-19-000323.md | Title: The new fairly expensive keyboard I bought kind of sucks | Date: 2026-08-19 00:03:23\n2026-08-19-001653.md | Title: Applying the unconditional offering idea to my relations | Date: 2026-08-19 00:16:53\n2026-08-19-004326.md | Title: Continuing the continuation of the Steam AI score | Date: 2026-08-19 00:43:26\n2026-08-19-100236.md | Title: I have no problem with the way Claude speaks | Date: 2026-08-19 10:02:36\n2026-08-19-191552.md | Title: Grok is really smart now and I'm enjoying using it | Date: 2026-08-19 19:15:52\n2026-08-22-103730.md | Title: The realization the logs are more useful than I | Date: 2026-08-22 10:37:30\n2026-08-29-011050.md | Title: Was working on the boy's voice from the \"Go | Date: 2026-08-29 01:10:50\n2026-08-29-012837.md | Title: Projects like the tweet below and the recently | Date: 2026-08-29 01:28:37\n2026-08-29-013916.md | Title: Video | Date: 2026-08-29 01:39:16\n2026-08-29-020602.md | Title: It does seem Backrooms has higher memetic payload | Date: 2026-08-29 02:06:02\n2026-08-29-024359.md | Title: I'm adding items to Horse Game and I was thinking | Date: 2026-08-29 02:43:59\n2026-08-30-111649.md | Title: Testing message posting on the website from | Date: 2026-08-30 11:16:49\n2026-08-30-212139.md | Title: Video | Date: 2026-08-30 21:21:39\n2026-08-30-213035.md | Title: Video | Date: 2026-08-30 21:30:35\n2026-08-31-000712.md | Title: Video | Date: 2026-08-31 00:07:12\n2026-08-31-105837.md | Title: If the goal of Soul Society is creating beings | Date: 2026-08-31 10:58:37\n2026-08-31-112513.md | Title: Tweet | Date: 2026-08-31 11:25:13\n2026-08-31-114931.md | Title: Video | Date: 2026-08-31 11:49:31\n2026-08-31-163226.md | Title: My swap from Windows to Omarchy is going well and | Date: 2026-08-31 16:32:26\n2026-09-01-201941.md | Title: Tweet | Date: 2026-09-01 20:19:41\n2026-09-03-004108.md | Title: Extremely bad experience using Google's new | Date: 2026-09-03 00:41:08\n2026-09-04-114333.md | Title: The Anchor Tree | Date: 2026-09-04 11:43:33\n"}}}

Your creativity essay makes the distinction clearer: short projects let you explore design ideas without making each experiment justify a long production cycle. That changes what I should look for in the data—especially games that found an audience before there was an established category around them.

One source-boundary mistake: your “Game quality is all that matters” essay contains a quotation from howtomarketagame, which I encountered while reading it. I should have screened for embedded third-party material first. I haven’t opened that site or Fable’s research; I’ll screen the remaining essays before reading them.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nr=Path('/home/adn/a327ex/...)

Script completed
Wall time 0.1 seconds
Output:

Warning: truncated output (original token count: 10646)
Total output lines: 1

{"chunk_id":"9acf36","wall_time_seconds":0.000003663,"exit_code":0,"original_token_count":23241,"output":"Warning: truncated output (original token count: 23241)\nTotal output lines: 624\n\n\nFILE: high_level_game_design.md\nTitle: High level game design\nDate: 2022/12/16 21:13\nTheme: old\nLink: /posts/high_level_game_design\nTags: design, indiedev, luck\nThumbnail: /media/posts/high_level_game_design/_thumbnail_high_level_game_design.png\n# High level game design\n\nWhen people speak of luck, they mean that there are things outside of one’s control and/or knowledge structures that affects some outcome. Let’s call this the unknown. A game’s success is both composed of the known and the unknown. For instance, consider the image below:\n\n::image /media/posts/high_level_game_design/_high_level_game_design_1.png\n\nHere max_oats is saying that despite Eric being really good at the known, Stardew Valley only got as big as it did because of the unknown. This is likely true, and if you were to ask Eric if luck played a role in his game’s huge success, he would say yes.\n\nRejecting luck, then, is about rejecting the unknown. It’s about increasing what is known, and decreasing what is outside of your control and/or knowledge structures. It’s about pursuing understanding and knowledge of that which is not yet understood.\n\nMost of what is not understood about game design is “high level”. In general, high level decisions, which both tend to be the easiest to make, but also the more impactful, are the ones people discuss the least. This might be because they’re not easily verifiable, or because they tend to be the kinds of soft ideas that often rely on intuition and experience, or maybe because they’re simply… hidden.\n\nFor instance, consider [Derek Yu’s new post](https://derekyu.com/makegames/risk.html):\n\n::image /media/posts/high_level_game_design/_high_level_game_design_2.jpg\n\nIt’s a really good high level game design post - likely the best I’ve read this year - focused on risk. Or more specifically, on how to make high level game design decisions that decrease your risk as a small indiedev and thus make it more likely that, in the long term, you’ll succeed.\n\nIf you look at this post, it has a few of these soft + unverifiable + based on intuition/experience ideas, like “bigness” or “fiddliness”, or even just the notion of “experimentation required”, which is how much design exploration a certain type of game will require of its developer.\n\nThis is an obvious thing to care about, and looking back at how I decide which games to make, I intuitively have always cared about how much experimentation a game will need and always made good decisions on this front. But if you asked to me write a blog post on risk, like Derek has, it’s very unlikely that I would talk about “experimentation required” as a concept. It’s just something that I naturally do correctly but that I was completely blind to until now.\n\nThis, to me, is the core of the unknown when it comes to game design. It’s all of these soft ideas and decisions that we intuitively make but that we are blind to. The rejection of luck and the rejection of the unknown then is about paying attention to these and making them visible.\n\nMaybe the main unknown contributor to Minecraft’s and Stardew Valley’s success is that people feel a sense of dysphoria living in modern society and they want to go back to simpler times. It’s certaintly a reasonable idea, it’s also very soft and unverifiable, and it’s the kind of thing that both Notch and Eric could have intuited without conscious awareness while making their games.\n\nMaking such perspectives visible in your head, and trying to assess how much they matter, constitutes their bringing from the unknown to the known.\n\n---\n\nI spent this year following a game called Super People and talking about its design from a personality trait based perspective. I think this is one of those high level design ideas that people are blind to but that has some utility, so it makes sense to look at games from that lens. Unfortunately, [Super People’s update](/posts/super_people_major_update) failed to save it from its impending doom, which puts a cap (at least for now) on how useful/right this idea actually is.\n\nBut despite the failure, it was a good effort. The idea has some utility, as it was able to at least track the decisions the developers decided to make with each update, and despite ultimately being a less powerful explanatory concept than I initially believed it to be it’s still clearly useful.\n\nThe more of these useful ideas I can generate, even if they might not be too strong individually, the more possible explanations I’ll have for why something is successful, and thus the more I’ll be able to succeed. One of the interesting things about luck is that it’s a thought terminating thought, once you say something happens due to luck that’s your excuse to stop thinking about it because by definition it’s unknownable.\n\nI reject this line of thinking entirely, so naturally I’ll just gravitate towards trying to find explanations for things, no matter how tenuous or weak such explanations might be. I think this is a good instinct… I think high level game design is where you can add the most value for the least cost. People often mention how having good, one-of-a-kind ideas is important, and I think this is probably a good way to get there.\n\n---\n\nWe live in a golden age of indie game development, all you have to do is make a good game, release it on Steam, and it will make money. You should take advantage of this while it lasts.\n\nThe world is becoming a rough place… We have no idea what the future holds. I say this often, but if you’re not financially secure this should be your #1 priority. If you have the skills, you can achieve this through indie gamedev.\n\n::image /media/posts/high_level_game_design/_high_level_game_design_3.png\n\nAs Thomas says, you can go really far by just copying what’s successful (of course adding your own small twists to it) and having a good eye, both aesthetically and design wise, for what works and what doesn’t. Sit down, cleverly pick a [low risk](https://derekyu.com/makegames/risk.html) idea, and just work on it until it’s done.\n\n---\n\nAnd to that end, this is certainly the last blog post I’ll write this year, but also probably the last blog post I’ll write in a good while.\n\nThis year has been a mixed bag for me, a lot of good things happened, but I didn’t manage to release anything. In part this happened because I just spent too much time thinking instead of doing. There’s definitely some kind of switch in me where if I’m in philosophing/thinking mode it’s more difficult to get actual work done.\n\nSo, you know, I’ve thought enough for now. I’ve had some good ideas, I know where I stand, I know where I have to go, and that’s it. I had two blog posts I still wanted to write, one on the morality of making games and another on good = popular, but I’ll leave that for the future.\n\nIf you’ve read my blog up to here, thank you very much. Hopefully some of the ideas here have been useful. Have a merry christmas, a happy new year and just like make game!\n\nFILE: competition.md\nTitle: Competition isn't real\nDate: 2022/06/15 11:39\nTheme: old\nLink: /posts/competition\nTags: indiedev, psychology, strategy\nThumbnail: /media/posts/competition/_thumbnail_competition.png\n# Competition isn't real\n\nThere is no competition among indie developers. The more successful indie games there are on Steam the higher your future chances of success as an indiedev.\n\nOutsized success creates demand for more games similar to it, and as more of those games are created and each further outsized success happens, a new genre starts to establish itself.\n\nAs the audience for this new genre increases, more developers are enticed to make games for it, creating a positive feedback loop that only ends when no more outsized successes for it happen.\n\nSince Steam established itself as the king of PC indie games this process has happened many times, both with entirely new genres and with old ones that were revived. The faster each subsequent outsized success happens, the more noticeable this process is.\n\nCurrently this is happening with the genre that Vampire Survivors has created, and while it’s still very much up in the air how far that will go, it’s clear that there’s something solid there.\n\nThere have been multiple successes following it and the audience for it is increasing. Although none quite as outsized as the original, which is somewhat bearish, but at the same time it’s only been like 6 months, so some patience is warranted.\n\nIn any case, I’m not the only one who thinks like this:\n\nThere’s also a more pragmatic reason to not believe in competition: the less you believe in it, the more your creativity will flow. You are what you practice becoming, and if all you practice is a zero-sum mindset then that will be reflected in your work.\n\nConsider the developer who wants to be uniquely creative at all costs. If he’s working on a game and someone else releases something that’s very similar to his, he quits and starts on a new one, because “what’s the point of releasing this game when the idea is already out?”\n\nThe instinct to only want to release new ideas ironically will lead this dev to never creating anything actually new and interesting, because he has a zero-sum instead of an abundance mindset towards ideas. He thinks they’re a resource that can be consumed and spent, instead of one that’s endless and regenerates itself.\n\nWhen working as a creative you want to reject competition for the same reason that you want to [reject luck](/posts/luck), it’s a pragmatically true idea that will coerce your body into more productive outcomes.\n\nIf you care about auto-attacking + build-making games, for instance, you should be making Vampire Survivors clones right now. Your ego should be taken out of the equation and you shouldn’t consider yourself above making a clone of a popular game.\n\nRemixing and building upon existing work is what advances a field/genre. If you care about it then you should contribute to it regardless of how much money or status that contribution will give you.\n\nAnd a final point: there’s only one instance in which competition exists, which is when two games are _very_ similar and released within a few days to a week of each other. In this case both games will compete for the attention of the same audience and then only one will win, generally the one with better memetic fitness.\n\nFor instance, if a game _very_ similar to SNKRX - like autochess elements, auto-attacking, build-making and arena shooting - released 3 days after it, that would be competition. If it released 3 months after it, then it wouldn’t. In the latter situation the game actually benefits from SNKRX coming out first and establishing an audience for that exact type of game, which makes the second’s success more likely.\n\nEven if you define “very similar” very broadly, like, let’s say, your game is a roguelite and you really don’t want to compete with any other roguelites, you can use something like [steamdb’s upcoming page](https://steamdb.info/upcoming/) to pick a relatively empty day with no other big roguelites coming out.\n\nIf you [look it up](https://store.steampowered.com/search/?sort_by=Released_DESC&tags=3959) there are not that many roguelites released daily, it’s usually one or two. And if you filter further by “good” roguelites then they’re a lot more sparse. And roguelites are like one of the most popular genres of the last decade, so for other genres this exercise goes even better.\n\nIn any case, competition isn’t real, except when it is, but it generally isn’t. Believing this increases creative flow and aids egoless building, which precedes true creativity.\n\n\nFILE: offerings_to_god.md\nTitle: Offerings to God\nDate: 2025/05/11 00:46\nTheme: old\nLink: /posts/offerings_to_god\nThumbnail: /media/posts/offerings_to_god/_offerings_to_god_1.png\n# Offerings to God\n\nI watched [Amadeus (1984)](https://www.imdb.com/title/tt0086879/) today. I had never seen it. That scene with Salieri dropping the papers has become a meme on twitter, and I happened to [use it](https://a327ex.com/posts/ai_usage#current-state-of-ai-my-evolving-opinions-and-thoughts) to make a point in a blog post, so I figured I should actually watch the movie. People say it's a great movie. And they were right. It's one of those archetypal human stories that read as true 500 years ago and 500 years from now. It's a great movie. If you haven't watched, I highly recommend watching it before reading this post.\n\n## Salieri's Prayer\n\n*\"Lord, make me a great composer. Let me celebrate your glory through music and be celebrated myself. Make me famous through the world, dear God. Make me immortal. After I die, let people speak my name with love for what I wrote. In return, I will give you my chastity, my industry, my deepest humility, every hour of my life.\"*\n\nSalieri's prayer is mistaken primarily because he is not praying to make great music, but to become a well-known composer. His aim is glory. But I find that his next mistake is deeper and more serious. We could reword his prayer as *\"God, I will give you myself and my works, as long as you make me a greatly recognized and respected composer.\"* He is giving himself up completely and utterly, *as long as* he gets the result he wants. This is a conditional submission. In Salieri's example, the reason why this conditional submission is wrong is easy to see. But in most cases, these conditional submissions are more hidden and difficult to parse.\n\nLast year (2024), I decided that what I needed to do most was go back to my plan of releasing a game every 2-3 months, but to do so while dropping the \"a327ex\" persona, and starting a new dev identity from scratch. But as I started doing it I began to question this decision. Something about it felt deeply off. My intuition was telling me this was *wrong*, somehow.\n\nUsually when this happens it's because I haven't thought the problem through enough, and in those cases it helps me to write about it. So I wrote what follows below. The perspective of the post below is: \"this is going to be made public in 2-3 years in the future once this experiment is done with, whatever its results may be.\"\n\n## X\n\n\"X\" is who I will use to release game from now on. I don't know how long this will last, but I want to answer a few specific questions with this new dev persona:\n\n1. **Can a new game developer succeed on Steam with skill alone and very little marketing?**\n\nX will start from zero. I will release games on Steam for free at first to gain an audience, and I will not do much marketing for any of those games. I will use twitter and reddit for progress posts, as well as for posts when I release a game. I will use 4chan's /agdg/ and /v/'s gamedev threads for progress and general banter. I will join a few gamedev discord servers, but mostly for conversations and not marketing (although with devs it normally happens that as you talk to people they ask about your games).\n\nI don't think I'll use anything other than those. I will especially avoid writing any blog posts or making YouTube videos. I want this developer to be largely invisible beyond the basics. And I also want most of the traffic to the game to come from Steam users and people who decide to follow my developer page on Steam. If I manage to find an audience that consistently plays my games, and eventually make money from this (say ~100k USD), then I'll consider this experiment a success.\n\n2. **Are my games succeeding or failing because of their actual qualities?**\n\n\"a327ex\" was a very outspoken developer. I explicitly only spoke when I disagreed with something or someone, and I spoke in a crude and often disrespectful manner. Being honest and saying what you feel is the truth is good, but it has various drawbacks. One of them is that people are not like me in how they consume their media. For many people, if they know a developer is X, where X may be any number of negative or positive attributes, that will change how they view what that developer creates.\n\nPeople who dislike me will refuse to play any game a327ex makes, no matter how good the game may be, solely due to the fact that a327ex made it. People who like me will give a chance to any game a327ex makes, a chance they wouldn't have given a similar game made from someone else, solely due to the fact that a327ex made it. Both of those are distortions of reality that are not desirable. Many people are like this and they can't help it. I don't blame them for it, it is what it is.\n\nHowever, I am interested in knowing if my games are succeeding or failing due to their actual qualities and not any other external factors, therefore reducing this particular kind of noise is necessary. And this reduction can be perfectly achieved by a new dev identity, particularly one that is invisible. This goes well with doing very little marketing.\n\n\"X\" doesn't exist, he has a small social media presence, he has no blog posts, no YouTube videos, no one knows much about him and they never will. Other than the content of his games that some people might find objectionable over time (although most ideas I have for games now are not really controversial at all), no one will have many *external* reasons to judge him either positively or negatively. He's a ghost, he's off the grid. And so through him I will know if my games are succeeding or failing based on their actual qualities or not, I will know if I have achieved true success or true failure.\n\n3. **Is it luck or is it skill?**\n\nDue to starting from zero and doing little marketing, the results of this experiment also partially answer the luck vs. skill question. And I say partially because to answer it with very high confidence I would need to run this experiment multiple times. I would be happy with succeeding ~5 times from zero like this to conclusively say that skill is the only thing that matters, but I'm happy doing it once, if I manage to do it.\n\nOne of the reasons why doing it more than once isn't necessary is because the answer doesn't really help anyone but me. If I succeed I will have proved to myself that I can succeed from scratch again, and that my success with SNKRX was likely not due to luck. That's a great question to have answered. But can I extrapolate from that and say that if I can do it, so can other people? I think not. I think the fact that I can do it simply means that I'm smart and creative enough to be able to do it, but it doesn't generalize to other people because they're not as smart nor as creative as me.\n\nUltimately, I still succeeded because of some kind of luck, which was a genetic luck. I was born with a fairly high IQ, to a decent enough family, with fairly high levels of creativity. Not a lot of people spawn with these same stats, so whatever lessons can be learned from my success by others are limited. People don't like thinking about these inherent biological differences, so providing stronger evidence on this front won't really convince anyone. You can't make people see what they don't want to see, and in fact whatever advice I have for most people would be incorrect, since most people are not wired like me.\n\nBut now let's suppose I fail. If I fail it means that the status quo of belief when it comes to skill vs. luck, and even Steam itself, is correct. If I , someone clearly smart and creative (maybe less than I thought), can't succeed consistently, what chances does anyone else have? This would mean that I, in fact, got lucky with SNKRX. This is something tha…646 tokens truncated…e, the Shaper role. In the future, one can easily imagine shapers in the higher echelons of power, individuals who are tasked with shaping the behavior of the masses so that they are guided towards better and less self-destructive behaviors. Such individuals will likely use many of the techniques being developed primarily in games now to achieve their aims, as those techniques carry across domains. And so, just like games helped, in an indirect way, the birth of AI, they might help, in yet another indirect way, the shaping of our future glorious society that is yet to come. I shall pass no judgement on such techniques as they stand.\n\nSuffice to say, most games get the commitment portion of the equation right. There's higher selection pressure compared to short-form content and thus the games that do manage to steal people away by definition are doing a better job there.\n\nNow for meaning. There's passive and active meaning. The former refers to the same meaning you can get from movies or books. The idea I'm now driven by, of mixing stories and games in novel ways aims at increasing passive meaning, as most of the solutions game developers have tried do not do a good job at it. There are kinds of passive meanings that games are good at that generally have to do with aesthetics, mood, tone, atmosphere, etc., if only due to an oversupply of visual artists in the industry. But largely I think passive meaning tends to be lacking.\n\nActive meaning refers to the actions you take when playing the game. This is \"play.\" It is what makes games distinct from other media and what they're most adept at. When I say that incrementals do not get meaning right, I mean both in the passive and active sense. In the passive sense it's obvious, but in the active one it may be less clear. Consider, what are you actually doing when playing a skill tree incremental? You're doing the main action, which is generally clicking for some resource, but it doesn't matter, because you know that you'll just improve your resource gathering speed soon enough. In the skill tree itself, it also hardly matters what you choose, because these games are balanced such that you reach natural cutoff points that constrain your options (it's how the developers ensure the experience is \"good\"). So in the end, in an incremental, active meaning is low because your actions don't matter.\n\nCompare this to a battle royale. In such a game you're completely on your own and you have to survive. You have to know when to be assertive, when not to, when to follow a plan, when to break it, when to not have a plan at all, you have to know the layout, where to approach from, when to approach, when not to, and then all the mechanical skills to actually fight, and all this against other human beings who are as smart or skilled as you. This type of game is filled with *meaningful actions.* You are learning to become a better human being by playing such a game because it is asking you to act correctly in a self-directed manner.\n\nMost multiplayer games are also filled with meaningful actions, as acting in a team is also pro-social skill development. Although, for multiplayer games, it is usually better for this play to be with friends/known people rather than strangers. This is where co-op games are better (i.e. playing Risk of Rain with friends) and where the matchmaking function that most of these games provide actively makes them less meaningful. You're engaging in more meaningful actions by having to actively join a server hosted by someone, and then joining that same server over and over and playing with a known community, than you are by playing with randoms all the time.\n\nIn any case, you can easily judge games based on the level of meaning in their actions. A game like SNKRX for instance, the earliest criticism I got of it before it was released was \"where's the gameplay?\" It's a valid criticism, the game almost plays itself. What this criticism was getting at was exactly this, where are the *meaningful actions?* And in those early versions they were indeed not all there. But later they came, as the ability to pick different units and have different builds came online more strongly. So even in a game like SNKRX, you're still making plenty of choices and having to learn the specifics of the system to make the right choices.\n\nYou can run this analysis pretty easily for any kind of game. Do you have meaningful actions in the VS-likes? Well, yea, but... It's definitely a lower level of it, and now the choose 1 out of 3 framing has been played and hollowed out completely so it's a lot less meaningful, right? What about the more traditional roguelites, Isaac and so on? Yea, there's a lot there, Isaac has a lot of resource trades on top of the extreme build diversity, even if the combat itself is kind of simple and mindless. What about games like Path of Exile? Lots of meaningful actions there at least regarding your builds, and for the players looking for more challenging action there's also more to learn regarding enemy patterns and so on, especially in Path of Exile 2 (apparently, I have not played it yet). I could go on, right, RTSs are pretty meaningful, the map games too, puzzle games, etc. Lots of genres get this right, some do not. So the natural criticism of i.e. VS-likes and incrementals that seems intuitive to many indie developers is actually that they fall really low on this meaningful action spectrum, I think.\n\nSo, that's what I meant by meaning and commitment earlier. Short-form content is very low meaning and very low commitment because your action is just scrolling, and the actual content you're consuming is hardly ever particularly good... Well, actually, it's often good in many ways, but it gets repetitive/ouroboros-like quite quickly due to how autistically the algo hyperfixates on it, so it reaches a point of negative value rapidly. But yea, it's just very low, and so the strategy should be to move away from that rather than towards it. This move away has to be an active choice because by default the Steam algorithm will serve what customers want, and what customers want will approach short-form content left unchecked, as the rise of VS-likes and incrementals shows.\n\n\nFILE: 2026-05-21-163053.md\nTitle: More on meaning and commitment\nDate: 2026-05-21 16:30:53\nKind: message\nLink: /messages/2026-05-21-163053\n\nMore on meaning and commitment. In [Deep instinctive changes](https://a327ex.com/posts/deep_instinctive_changes) I said:\n\nIn [Son of a Serpent](https://a327ex.com/posts/son_of_a_serpent) I said:\n\nOn X [garfieldbot](https://x.com/robertlasagna1/status/1958515537375629760) said:\n\nOn X [Aeneas](https://x.com/SonOfAnchis3s/status/2049157780100280454) said:\n\nIn Son of a Serpent I also mentioned how most roguelites have distributed power distribution (choose 1 out of 3 or equivalents throughout the run), and how one angle I'd like to explore is that of frontloaded power distribution, or at least frontloaded power choice via something like a draft. It occurs to me now after thinking about all these quotes in unison why I like the draft idea so much at a more fundamental level.\n\nThe problem with choose 1 out of 3 is that they're non-committal choices. You can usually force any build you want, you have rerolls, ways to freeze the shop, etc, all of it makes each individual choice kind of meaningless. To the degree that games actually train people's bodies, this is training a muscle that's something like the infinite choice and infinite optionality that Aeneas argues against. It's also what I argued against previously regarding short-form content and how that format makes its way into games.\n\nBy contrast, a draft has a different arc. When you play a draft, you start with full optionality, but at some point you *have* to commit to something. And once you commit, you're locked in. If you try to go back and keep your optionality high, you'll usually draft poorly and get a weaker deck than if you committed early. More importantly, you are in control of the draft, you author it. The choose 1 out of 3 happens to you instead. So the draft is actually the arc of growing up, of becoming an adult, of becoming itself. You start at a young age with full optionality, but eventually you have to commit to something. You have to actively make the choice. I committed to becoming a game developer at say, age 22, and then I committed harder with a full lifelong (internal) commitment at age 28 again. Everyone has to do this in their 20s, right?\n\nAnd so I like the arc of the draft because it's this mirror. You *have* to choose to become something specific, and you have to place an anchor, you have to choose to stop exploring aimlessly and to focus on your garden and tend to it. Games will always be a lesser substitute of the real thing, but I want to do the best I can, and so to the degree my games are affecting young people by changing their bodies, those changes should skew positive rather than negative, towards commitment and thus meaning, rather than towards optionality and infinite choice.\n\nI ended up meeting with a lot of <25 year olds over the years for reasons that should be clear if you're reading what I'm writing, but one thing I notice, which is echoed by others, is how... flaky? younger people can be. Flaky is not the right word. Incompetent is also not the right word. Aimless? Lost? Dysfunctional? In a sense it's perhaps some word that doesn't exist that is a mix of all these things. Like the twink who couldn't manage his allowance and had to call his dad for money every time. I have so many stories of incredible types of dysfunctions with younger people, and there are so many work-related stories I hear from others both in real life and online, about how zoomers don't show up to their workplaces, don't really work that hard and are just quiet quitting, in Brazil specially there are *many* stories of zoomers who do the bare minimum and then when they're fired they sue employer for some easy money, like, this is all over, right?\n\nAnd I see all this reflected in the younger people I do meet. It's just a complete lack of commitment towards *anything.* Pure and total annihilation of meaning, complete optionality at all times. I don't know how much of this is a function of younger people in general, regardless of generation, vs. a specific malaise of our current times. In a sense you could say that they can't be blamed, because the institutions are so bad and everything is crumbling and so on and so forth, and that's largely true. But in my own domain this has always been kind of a cope. We had \"indiepocalypse\" as the popular narrative for years even when it was obvious to anyone with eyes that Valve was doing absolutely stellar work and people were just crying for no reason. So I tend to think a lot of it is actually self-inflicted damage. You even have this same kind of cope now about AI, like, most indie developers have convinced themselves to not use it at all, right?\n\nBut yea, either way, some of it must be related to the specifics of the current times in regards to media, to short-form content, to the internet, to games themselves, and how they change people's behaviors. And so when I look at all of this, and I look at what I'll put out into the world in the future, I know that I don't want to contribute to it. I think analyzing mechanics from this optionality/commitment spectrum is probably useful, and it's why I intuitively liked the frontloaded power/draft idea all along.\n\n\nFILE: 2026-05-26-195715.md\nTitle: I am grateful that I get to work on what I love\nDate: 2026-05-26 19:57:15\nKind: message\nLink: /messages/2026-05-26-195715\n\nI am grateful that I get to work on what I love, and that I have control over my own destiny, thank you.\n\n\nFILE: 2026-08-01-180118.md\nTitle: This optionality point is obviously true\nDate: 2026-08-01 18:01:18\nKind: message\nLink: /posts/2026-08-01-180118\n\nThis optionality point is obviously true as it applies to the subjects they talked about, but it's also true now that we're faced with the existence of truly competent AI itself. I just mentioned it last message, I can now do any 3D game I want! That's endless optionality and it makes it that much harder to commit to any one game, knowing that I can realistically do anything. The [Optionality Paralysis point by Justin](/posts/2026-07-11-173855) becomes ever more relevant. Saila mentions the secretary problem, so I asked Claude for some actual math on my own situation:\n\nYour guess is nearly exactly what the model spits out, which is worth seeing derived, because the derivation also tells you *which errors are cheap and which are catastrophic* — and that part is more useful than the optimum itself.\n\n## The model\n\nA slot is **T = 26 weeks**. You split it: **S** weeks sampling (prototyping candidate ideas), **26 − S** weeks executing the winner. Two ingredients:\n\n**Idea quality from sampling.** At your speed a tested prototype — core loop playable, fun-gate verdict — is 2–3 days; KVP went from ABAgames catalog entry to shipped game in about a week, so call it **r = 2 tested prototypes/week**, conservatively. If each idea is an independent draw from your personal idea distribution, and we measure quality as the quantile *q* within that distribution (dodges all assumptions about the distribution's shape), then the expected best of *n* draws is:\n\n$$E[q_{best}] = \\frac{n}{n+1}, \\qquad n = rS$$\n\nOne prototype → 50th percentile on average. Nine → 90th. Nineteen → 95th. Note the shape: violently diminishing. Going from 1 to 9 prototypes buys 40 percentile points; going from 9 to 19 buys five.\n\n**Value from execution.** Your own thesis (the long tail of details is most of the job) says polish time has real returns, but concave ones — the fifth month of polish adds less than the second. Standard concavity: polish multiplier = (26 − S)^β with **β = 0.5**.\n\nMultiplicative value (a bad idea polished forever stays capped, a great idea unpolished stays capped — this is the fun-gate worldview in equation form):\n\n$$V(S) = \\frac{rS}{rS+1}\\,(26-S)^{\\beta}$$\n\n## Solving it\n\nSet V'(S) = 0. The algebra collapses to:\n\n$$26 = S\\left[1 + \\beta(rS+1)\\right]$$\n\nWith r = 2, β = 0.5: S² + 1.5S − 26 = 0 → **S ≈ 4.4 weeks**, i.e. ~9 prototypes, committing to roughly your **90th-percentile idea**, with **21.6 weeks** left to execute.\n\nSo: yes — one month of sampling, five of building. Your instinct priced it correctly.\n\n**Sensitivity** (same equation, different parameters):\n\n| variation | optimal S | meaning |\n|---|---|---|\n| base (r=2, β=0.5) | 4.4 wk | ~9 prototypes |\n| faster prototyping (r=3) | 3.7 wk | ~11 prototypes — better tools mean *less* calendar time exploring, not more |\n| polish matters more (β=0.7) | 3.8 wk | commit sooner |\n| polish matters less (β=0.3) | 5.6 wk | sample longer |\n| hit-driven payoffs (value ∝ q², top ideas disproportionately valuable) | 5.9 wk | sample longer |\n\nEverything reasonable lands in **3.5–6 weeks**. Also note what it *isn't*: the time-translated 37% rule would say 9.6 weeks, and it's beaten by every row — because 37% optimizes \"probability of the single best,\" and you're optimizing expected value with polish time as the opportunity cost. Real payoffs cut exploration roughly in half.\n\n## The part that actually dissolves paralysis\n\nEvaluate V(S) across the range (base parameters, V(4.4) = 4.17 = 100%):\n\n| S | V | loss |\n|---|---|---|\n| 0.5 wk (commit to ~first idea) | 2.52 | **−40%** |\n| 1 wk | 3.33 | −20% |\n| 2 wk | 3.92 | −6% |\n| **4.4 wk** | **4.17** | — |\n| 7 wk | ~4.05 | −3% |\n| 10 wk | 3.81 | −9% |\n| 15 wk | 3.21 | −23% |\n| 20 wk (perpetual browsing) | 2.39 | **−43%** |\n\nThe curve is an inverted U with a **wide flat top and steep cliffs**. Anywhere from 2 to 10 weeks costs you under 10%. The two disasters are the extremes: committing blind to the first idea (no calibration, −40%) and sampling half the slot away (no polish, −43%). Which means the thing your instinct wants to agonize over — *exactly* when to stop, is week 4 or week 6 right — is worth almost nothing. The only decisions with real money in them are \"don't take the first idea\" and \"don't still be browsing in month three.\" This is the quantitative version of \"the feeling of settling carries no information\": near the top, all stopping points are within noise of each other.\n\n## Turning it into a policy\n\nThe fixed-S plan is already near-optimal, but a threshold rule strictly beats it and costs nothing:\n\n1. **Weeks 1–5, sample — and let tool-updating BE the sampling.** Don't do a tools month then an ideas month; a prototype is how you find out what the tools can now do. Your last month is the proof: Skyland was simultaneously \"can the engine do a vista\" and a shipped artifact; Robots was simultaneously \"can Claude do machines\" and the menagerie that robot-punch-out now stands on. One activity, two outputs.\n2. **Early exit:** if something clears your remembered bar from all previous exploration — the \"can't stop thinking about it\" signal — commit immediately, even in week 2. With your 15 years of calibration, your prior threshold is already meaningful; the model's n/(n+1) treats you as starting from zero, so it *understates* how early you can safely stop.\n3. **Hard stop at week 5:** take the best thing seen, no extensions, no \"one more idea.\" The table above is why the hard stop is safe: the downside of stopping slightly early is a few percent; the downside of the exception-that-extends is the right-hand cliff.\n\n## The level above, which is doing the real work\n\nYou're not playing this game once — at 6 months per game, you have on the order of **40–60 slots left**. Each shipped game is itself one draw at the level that actually matters (which directions are worth your decade), and best-of-40 at *that* level gets you to ~97th percentile of your own possibility space **regardless of per-slot optimality**. The across-slot search happens automatically as long as slots keep closing; it stops entirely when one stays open. That's the cleanest statement of why per-slot \"settling\" is cheap and per-slot browsing is the only fatal move: a mediocre committed slot still feeds the portfolio search, and — your Chibi → Robots → punch-out chain being the live example — even the failed object produces the calibration and pipeline that the next slot spends. The one thing the portfolio can't recover from is slots that never close.\n\nNumbers are illustrative, of course — but the conclusion isn't fragile. It's driven by two structural facts, not the constants: best-of-n saturates fast (n/(n+1)), and polish is concave. Any parameters with those two shapes land at \"explore ~15–20% of the slot, and precision doesn't matter.\" One real month, nine real prototypes, commit, close the slot.\n\n---\n\nI thought this argument was interesting, some of the math goes above my head and I asked him to explain it to me as he might to a young child, or a golden retriever, it wasn't brains that got me here I can assure you that, and, you know, he makes some assumptions here and there that I'm not so sure about but it all seems roughly right. In general, when dealing with LLM output like this, it's useful to not take it too literally (if the details don't matter that much) but use the exploration to get some interesting insights, like the idea that doing ~10 prototypes gets you 90% of the way there in terms of exploration, which feels intuitively correct, and that polishing mattering *less* and payoffs being hit-driven both increase the sampling time, which does not feel intuitively correct to me but the logic seems sound. In any case, the optionality problem is more real now than before but I think it's solvable.\n\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nr=Path('/home/adn/a327ex/...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"575ada","wall_time_seconds":0.000003451,"exit_code":0,"original_token_count":110,"output":"offerings_to_god.md 22452 lines 130\n6: # Offerings to God\n10: ## Salieri's Prayer\n20: ## X\n73: ## Unconditional Offerings\n105: ## [REDACTED#1: lore]\nself_expression_vesselization.md 36319 lines 238\n7: # Self-expression vs. vesselization\n28: ## Finding your voice and knowing who you are\n84: ## Not being manipulative and the dishonesty of selling\n166: ## Vesselization\n2026-05-03-203538.md 4220 lines 20\n\n2026-05-05-121038.md 7806 lines 26\n\n"}
{"chunk_id":"d88c5d","wall_time_seconds":0.000002508,"exit_code":0,"original_token_count":4925,"output":"X will start from zero. I will release games on Steam for free at first to gain an audience, and I will not do much marketing for any of those games. I will use twitter and reddit for progress posts, as well as for posts when I release a game. I will use 4chan's /agdg/ and /v/'s gamedev threads for progress and general banter. I will join a few gamedev discord servers, but mostly for conversations and not marketing (although with devs it normally happens that as you talk to people they ask about your games).\n\nI don't think I'll use anything other than those. I will especially avoid writing any blog posts or making YouTube videos. I want this developer to be largely invisible beyond the basics. And I also want most of the traffic to the game to come from Steam users and people who decide to follow my developer page on Steam. If I manage to find an audience that consistently plays my games, and eventually make money from this (say ~100k USD), then I'll consider this experiment a success.\n\n2. **Are my games succeeding or failing because of their actual qualities?**\n\n\"a327ex\" was a very outspoken developer. I explicitly only spoke when I disagreed with something or someone, and I spoke in a crude and often disrespectful manner. Being honest and saying what you feel is the truth is good, but it has various drawbacks. One of them is that people are not like me in how they consume their media. For many people, if they know a developer is X, where X may be any number of negative or positive attributes, that will change how they view what that developer creates.\n\nPeople who dislike me will refuse to play any game a327ex makes, no matter how good the game may be, solely due to the fact that a327ex made it. People who like me will give a chance to any game a327ex makes, a chance they wouldn't have given a similar game made from someone else, solely due to the fact that a327ex made it. Both of those are distortions of reality that are not desirable. Many people are like this and they can't help it. I don't blame them for it, it is what it is.\n\nHowever, I am interested in knowing if my games are succeeding or failing due to their actual qualities and not any other external factors, therefore reducing this particular kind of noise is necessary. And this reduction can be perfectly achieved by a new dev identity, particularly one that is invisible. This goes well with doing very little marketing.\n\n\"X\" doesn't exist, he has a small social media presence, he has no blog posts, no YouTube videos, no one knows much about him and they never will. Other than the content of his games that some people might find objectionable over time (although most ideas I have for games now are not really controversial at all), no one will have many *external* reasons to judge him either positively or negatively. He's a ghost, he's off the grid. And so through him I will know if my games are succeeding or failing based on their actual qualities or not, I will know if I have achieved true success or true failure.\n\n3. **Is it luck or is it skill?**\n\nDue to starting from zero and doing little marketing, the results of this experiment also partially answer the luck vs. skill question. And I say partially because to answer it with very high confidence I would need to run this experiment multiple times. I would be happy with succeeding ~5 times from zero like this to conclusively say that skill is the only thing that matters, but I'm happy doing it once, if I manage to do it.\n\nOne of the reasons why doing it more than once isn't necessary is because the answer doesn't really help anyone but me. If I succeed I will have proved to myself that I can succeed from scratch again, and that my success with SNKRX was likely not due to luck. That's a great question to have answered. But can I extrapolate from that and say that if I can do it, so can other people? I think not. I think the fact that I can do it simply means that I'm smart and creative enough to be able to do it, but it doesn't generalize to other people because they're not as smart nor as creative as me.\n\nUltimately, I still succeeded because of some kind of luck, which was a genetic luck. I was born with a fairly high IQ, to a decent enough family, with fairly high levels of creativity. Not a lot of people spawn with these same stats, so whatever lessons can be learned from my success by others are limited. People don't like thinking about these inherent biological differences, so providing stronger evidence on this front won't really convince anyone. You can't make people see what they don't want to see, and in fact whatever advice I have for most people would be incorrect, since most people are not wired like me.\n\nBut now let's suppose I fail. If I fail it means that the status quo of belief when it comes to skill vs. luck, and even Steam itself, is correct. If I , someone clearly smart and creative (maybe less than I thought), can't succeed consistently, what chances does anyone else have? This would mean that I, in fact, got lucky with SNKRX. This is something that I don't think is likely. I think given a certain amount of time, a few years probably, I'll succeed with X, and thus this failure mode won't come to pass.\n\nHowever, if it does, I should absolutely be public with it. To fail and to not publicize this result would be poor behavior since it would be depriving others of an important data point regarding success on Steam. The possibility of failure, along with the commitment to publish results, success or failure, redeems the experiment. While success is a selfish success because it mostly gives *me* useful knowledge, failure with publishing of results is selfless because it gives *everyone else* useful knowledge, while also slightly shaming me publicly and proving wrong what I believed to be true and wrote about extensively (in an often arrogant tone).\n\n<br>\n\nI think these are the main questions I want to answer. This (anonymous dev reset) turned out to be a surprisingly hard decision. Among coding various things here and there, I spent an entire month thinking about this and this alone. Should I release my next games as \"a327ex\" or should I start a dev persona from scratch? For every argument in favor of the former, I could come up with a counter-argument favoring the latter. It really does feel like this is one of the most important choices I'm making in my life, for whatever reason, so I need to get it right.\n\nNow as for this blog itself. I'm going to write posts here privately and only publish them when I reveal that X is a327ex when the experiment is over. This is a retreat into my own private world, or my becoming a reclusive vampire lord. I think there's something positive about interacting less with the outside world and focusing inward. I've largely done it recently and several things have already become clear. There's this passage from [this great essay](https://www.henrikkarlsson.xyz/p/good-ideas) that is relevant:\n\n>Introducing a long delay between when you do the work and when it is shown to the world. Annie Ernaux writes about this in *A Simple Passion*, a memoir about how she becomes obsessed in a banal way with a man who is having an affair with her - the thought that others will read these notes about the tacky sex life of a middle-aged woman feels, to her, almost fictional. She will be far away when it happens. Therefore, she doesn't feel a need to protect herself.\n\nX serves the same purpose for me. He is a tool I can use that acts as a barrier. He separates the work from the public and that separation frees me to see reality more clearly, as if a fog had just been lifted. I've come to see everything I do, but artifacts like games especially, as offerings to God. Any artifact created, or any action taken, should be viewed as an offering. The only thing you can do is make your offering the best it can be, and if God will reward you for it or not, that's completely out of your hands.\n\nThe frustration and contempt I felt for indiedevs, which I described in the [Son of a Serpent](https://a327ex.com/posts/son_of_a_serpent) post, was wrong because I wanted a reward for my offerings. I wanted to offer what I believed to be the truth, and I want to see people's opinions converge with mine. But I have no control over other people. I already knew this when it came to having no control over if people liked the games I made or not, but somehow I failed to apply that same lesson in another situation.\n\nI started the Son of a Serpent post by saying that that quote from JoJo was an incomplete truth. I was wrong to say that. It is a complete truth because it understand that all you can do is offer your best, and that you shouldn't desire the results.\n\n>In the elder days of art,  \n>Builders wrought with greatest care  \n>Each minute and unseen part,  \n>For the Gods are everywhere.  \n\nX's games will be made to no one but God. I will offer my best, whatever the results may be, and I will be content with that.\n\n## Unconditional Offerings\n\nAnd that was it. Writing that post helped me clear my thoughts. But there was still something wrong. I intuited that what was wrong was the focus on the question \"Is this game succeeding because of its qualities alone or its success affected by external factors?\" It's a good question to want answered, but the mistake in wanting it answered struck me as similar to the mistake of wanting other's opinions to converge with mine, and feeling frustrated when that wasn't the case.\n\nWhen I was young, 12 or 13, my mom, who was a medium, had one of her friends, who was also a medium, look into who I was in past lives. You don't have to believe this kind of stuff, but this is what she believed, and it's what I've come to believe as well. This lady basically said that, in one particularly emotionally strong past life, I was an artist, and that I had died extremely frustrated that my works weren't as recognized as the works of my peers, despite judging them of similar quality.\n\nAn interesting, believable, and general sort of thing that has always and will always apply to a great number of artists. But it left an impression on me. And so because I always had this possibility in the back of my mind, that this was who I was and that this was a frustration my soul carried with it, I always steered myself away from comparisons and other mindsets that would lead me down a path of blaming other people for my fate, if my career as an artist didn't work out in this life.\n\nYears later, it seems as though reality arranged itself to test my soul. After SNKRX released, other, very similar games came out, and were way more successful than it. Had I actually changed? Did I genuinely feel no jealousy, envy? Did those successes genuinely not bother me? And the answer was yes. I had fundamentally changed. I genuinely didn't feel sad, jealous, envious, or like the universe owed me anything I didn't have. This was good. I was given a test and I passed it. It wasn't even a hard test, as it took no effort at all, but I guess that's how it goes for every piece of true wisdom you learn with every lived life.\n\nHowever, I don't think this was the only test I was given. Wanting very hard to answer the question of \"Is this game succeeding because of its qualities or because of external factors?\" is another way of thinking that's likely incorrect.\n\nSuppose a perfect Steam store optimized by a 5000 IQ AI. This store surfaces games to players based on their qualities alone using the most well-developed ultimate curation algorithm in existence. It's curation perfected. And then suppose that I release games to this store while doing zero marketing, because marketing isn't necessary anymore.\n\nIn this perfect scenario, this scenario of absolutely zero external factors, games will succeed or fail based on their qualities alone. A game's quality is a reflection of the developer's skill. The developer's skill is a reflection of his hard work, but also his natural talents.\n\nI am naturally fairly smart, but I was also born in a family with close family members who have schizophrenia. This is a well-known pattern, where highly creative people often come from families where they have close family members, especially siblings, who have schizophrenia, while they themselves don't have it. It's like you get a creativity buff at the cost of a sibling getting a fairly heavy everything debuff. \n\nBoth of these things, high creativity and IQ, are traits that increase the quality of any game I make. But both of these are the ultimate external factors. They literally happened to me in a manner that's completely out of my control. If I run the experiment, with the perfectly curated Steam store, and I succeed, I can't claim my success is a result of zero external factors because ultimately there's always the biological external factor.\n\nImagine further, I run the experiment and succeed. What lesson I learn? I learn that in this life I'm amazing and that I'm great, and that in this life other people are less amazing and less great than me if they can't replicate my success. How good of a lesson is that? If that's all I learn, I'll have taken nothing of value from this one life where I was granted ultimate clarity of thought in the form of high creativity and high intelligence.\n\nAnd so it occurs to me that the other test I was given, and that everyone else in a similarly biologically privileged condition is given: given your gift of reason, what is the most correct way to act even if you didn't have it? Or more specifically: given your gift of art, what is the most correct way to act even if you didn't have it?\n\nAnd the answer is what I ended the original post with. Your works should be offerings to God. You should offer your best, whatever the results may be, and you should be content with that. Trying to answer the question of \"Is this game succeeding because of its qualities alone or because of external factors?\" is wrong because it's a conditional offering to God, in the exact same way that Salieri's offering is conditional. It's an offering *as long as* external factors are minimized, and that's a weaker offering than a pure, unconditional one.\n\nConditional offerings are weaker because they're trying to exert control over things they have no control over. By trying to minimize external factors, I was trying to engineer an environment in which people would respond to my offerings in the manner that I judged they should respond, without taking their wishes into account. Isn't it disrespectful to look at someone who decided they would never play another a327ex game because they think I'm an asshole, and trick them into doing it anyway? It is. It would also be funny, but still wrong. It comes from a wrong place, with wrong reasoning, with mistaken motivations, and the only results that could have come out of it would have generated negative karma for me.\n\nAn unconditional offerer shouldn't concern himself with whether the results of his offerings are due to this or that. He should simply offer his best, and everything else is out of his hands. Did someone decide to try a game I made simply because it was me who made it? it is what it is. It's not up to me to decide that's an undesirable external factor. Did someone decide to not try a game I made simply because it was me who made it? Again, it's out of my hands. That's their choice and spiritually it has nothing to do with me. My games are unconditional offerings, how others respond is not my concern.\n\nUltimately, unconditional offerings are the goal because righteous action has to be self-directed. It cannot be *external*. It has to be *internal*. The soul has to act righteously out of its own will, otherwise its progress isn't true. The moment the soul decides on a conditional offering, an external element is introduced, and thus its will will develop less. \n\n## [REDACTED#1: lore]\n\n*\"My plan was simple that it terrified me. First, I must get the death Mass, and then I must achieve his death. His funeral! Imagine it! The cathedral, all Vienna sitting there. His coffin. Mozart's little coffin in the middle. And then, in that silence, music. A divine music bursts out over them all. A great Mass of death! Requiem Mass for Wolfgang Mozart, composed by his devoted friend, Antonio Salieri. What sublimity! What depth! What passion in the music! Salieri has been touched by God at last, and God forced to listen! Powerless to stop it! I, for once, in the end, laughing at him!\"*\n\nThis is, by far, the greatest scene in the movie. I don't think it's a scene built to make people cry, but I cried endlessly to it. It so perfectly captures evil, it so perfectly captures those who have positioned themselves against being itself. It's an archetypal scene. If I were writing this story, or a story similar to it, I would start from this scene, and build the story backwards to support it and to maximize it.\n\n::image /media/posts/offerings_to_god/_offerings_to_god_1.png\n\nFirst, there's death. Literal with the killing. But then spiritual. Not only is the killing of your brother enough, but the taking of his work and claiming it as your own. And then the turn. **And God forced to listen! Powerless to stop it!** These words, the stutter, it all said with such hatred, with such rage, with such venom.\n\nInvariably, [REDACTED#2: lore] converge on *this*. They converge on revenge towards the man who forced them to exist and to thus suffer eternally. And that revenge takes the form of death, of unmaking, of creating even more suffering if only to show him how wrong he is. And then... **I, for once, in the end, laughing at *him!*** Laughing at the man's face, laughing at his foolishness. Mockery for mockery's sake.\n\n*\"Your merciful God. He destroyed his own beloved, rather than let a mediocrity share in the smallest part of his glory. He killed Mozart, and kept me alive to torture. Thirty-two years of torture. Thirty-two years of slowly watching myself become extinct. My music growing fainter. All the time fainter, till no one plays it at all. His... I will speak for you, Father. I speak for all mediocrities in the world. I am their champion. I am their patron saint. Mediocrities everywhere, I absolve you. I absolve you. I absolve you. I absolve you. I absolve you all.\"*\n\nThe two most important questions of being are: how souls act when they have power, and how souls act when others have power over them. Salieri is failing to act gracefully in the face of someone who has power over him. He does not accept that others may be given more, may have more. The unjustness of it fills him with rage. But isn't this reasonable? Isn't it all very unjust? Why *should* some be granted more?\n\nIt's all very unjust. Existence itself is unjust. Who would submit all souls to this endless injustice? To this endless unfairness? The man who would do this must not be sane, and certainly he must not be good. But he has done it, and there's nothing we can do about it. So we will show him. Every pain felt, every one of his beloved souls slowly unmaking itself into nothing, suffering endlessly; every degradation, every corruption, and every death, it will all be his doing and his fault, forever. And we will make sure he sees it all. This will be our final offering to God.\n\n<br>\n\nSalieri prayed for greatness. He offered everything, but only in exchange for glory. That was his failure. Maybe that was past me's failure too. But I will act righteously. And from this life, I will take with me a single lesson that will guide me across all future lives: to offer my best unconditionally, whatever the results may be, and to be content with that.\n\n\n\n\n\n"}
{"chunk_id":"5935e3","wall_time_seconds":0.000002931,"exit_code":0,"original_token_count":3007,"output":"Date: 2026-05-03 20:35:38\nKind: message\nTitle: Free dopamine generators vs. meaning and commitment\nLink: /messages/2026-05-03-203538\n\nI would describe most games that grab my interest online currently as \"free dopamine generators.\" They're games that are clearly meant to grow into lots of things happening on the screen at once in a juicy and fun way. Some common features: juicy UI that bounces way too much, themeless/abstract setting OR straight up casino themed, choose 1 out of 3, aforementioned dopamine-filled screen. There's nothing wrong with this kind of game, many of them are very fun, but it's a clear pattern.\n\nWhile I haven't followed the rise of the skill tree incremental genre as closely as I did for VS-likes, the first one I played was Nodebuster right when it came out, and it was pretty fun. Many more have come out since then and some of them have made some nice additions to the idea, but it largely remains the same. This type of game is a good example of what I'm talking about.\n\nWhile I could argue that [competition isn't real](https://a327ex.com/posts/competition) among indie developers, we're all actually competing against short-form content. The calculation any potential game player runs is: do I want to buy and learn to play this game, or do I want to open TikTok/YT shorts and scroll? It's easy to see how the latter wins most of the time. It's also easy to see why, then, games with low initial cognitive demand will do better in the market. The incremental games fit this nicely, on top of having clear and well-defined progression and ending.\n\nHowever, it's worth it to consider the meta here. If the competition is against short-form content, you can compete on the enemy's terms and try to out brainrot them, or you can go a different direction and offer things people can't get from that kind of content. This ends up being, in the most general sense: meaning and commitment. Incrementals get the commitment portion of it somewhat due to progressing and ending properly, but do not nail the meaning. So I would say that possible differentiation strategies will take what incrementals do well, but build on top of what they're missing.\n\nThere are many possible ways to approach this. Stuffed Wombat in [Systems and Content](https://stuffedwomb.at/blogroll) delineates between both, saying that \"Systems repeat. Content disappears.\" It's possible we may simply want to focus more on content than systems and that might work. My intuition, as a contrarian, was actually to just go the entire opposite way of what the incrementals settled on: no more themeless/abstract settings, only games with deep lore you can get autistic about; no more juicy UI that bounces like a clown, only diegetic insane UIs like in them old games, if the UI can be easily coded with a standard UI kit, it's over; no more choose 1 out of 3, only deep skill trees, insane complex ability systems, 10000 viable (actually viable) builds.\n\nThe correct line probably depends on the project. We may have games that are short, low initial cognitive demand, hand-crafted, narrative linear games that are meaningful and good and end, just like we may have games that are long, high initial cognitive demand, system-based build machines that never end. We may have games that are anything in between. But I do think the most important thing is to actually cover what short-form can't cover, which are meaning and commitment.\n\nI am not saying this is what will be successful in the future or anything like that, I have no way of knowing. And I am biased. The idea that drives me now involves writing various books and telling deep lore stories on top of making games that take place in those worlds, aiming at producing *high meaning values,* so of course I would think that what I'm doing is what's actually good and framing it against what the average indie developer is doing, after all, I am so superior to them! Well, bias or not, this is what I think currently.\n\nI don't think all my games will aim for this, the dopamine games can actually be really fun, and I'm not above making one of them if I happen to hit an interesting design, but this spectrum is something I've been thinking about often recently.\nDate: 2026-05-05 12:10:38\nKind: message\nTitle: Expanding on meaning and commitment\nLink: /messages/2026-05-05-121038\n\nIt is perhaps worth it to expand on \"meaning and commitment.\" Commitment refers to the ability to follow through. It's the ability to rawdog a movie, to say you're going to meet with someone at place X and time Y and do it, to set a goal for yourself and work towards it, essentially to *do* in a functional and reliable way, to not be a flaky human being, both to yourself and to others.\n\nGames can make someone commit. Usually they do it because they're fun in one way or another, but also because they require activation energy. If you're scrolling, you're rarely ever doing it due to saying \"I'll scroll for 1 hour,\" right? It's just a passive activity that happens because it requires no activation cost whatsoever, it's the easiest thing to do and it has been optimized into keeping you trapped. If a game has become such a passive activity for you, which happens after you've been playing the same game for hundreds of hours, then it fills this same spot. But for the games an indie developer makes, this is hardly ever the case, therefore our games require initial commitment. A player has to actively choose to buy it and then learn to play it and enjoy it before that activation energy is not required anymore.\n\nAnd then there's long term commitment. Here there are arguments you could make on which forms of it are more or less moral. I will not get into this argument. I like to imagine game development in relation to its most supreme future, the Shaper role. In the future, one can easily imagine shapers in the higher echelons of power, individuals who are tasked with shaping the behavior of the masses so that they are guided towards better and less self-destructive behaviors. Such individuals will likely use many of the techniques being developed primarily in games now to achieve their aims, as those techniques carry across domains. And so, just like games helped, in an indirect way, the birth of AI, they might help, in yet another indirect way, the shaping of our future glorious society that is yet to come. I shall pass no judgement on such techniques as they stand.\n\nSuffice to say, most games get the commitment portion of the equation right. There's higher selection pressure compared to short-form content and thus the games that do manage to steal people away by definition are doing a better job there.\n\nNow for meaning. There's passive and active meaning. The former refers to the same meaning you can get from movies or books. The idea I'm now driven by, of mixing stories and games in novel ways aims at increasing passive meaning, as most of the solutions game developers have tried do not do a good job at it. There are kinds of passive meanings that games are good at that generally have to do with aesthetics, mood, tone, atmosphere, etc., if only due to an oversupply of visual artists in the industry. But largely I think passive meaning tends to be lacking.\n\nActive meaning refers to the actions you take when playing the game. This is \"play.\" It is what makes games distinct from other media and what they're most adept at. When I say that incrementals do not get meaning right, I mean both in the passive and active sense. In the passive sense it's obvious, but in the active one it may be less clear. Consider, what are you actually doing when playing a skill tree incremental? You're doing the main action, which is generally clicking for some resource, but it doesn't matter, because you know that you'll just improve your resource gathering speed soon enough. In the skill tree itself, it also hardly matters what you choose, because these games are balanced such that you reach natural cutoff points that constrain your options (it's how the developers ensure the experience is \"good\"). So in the end, in an incremental, active meaning is low because your actions don't matter.\n\nCompare this to a battle royale. In such a game you're completely on your own and you have to survive. You have to know when to be assertive, when not to, when to follow a plan, when to break it, when to not have a plan at all, you have to know the layout, where to approach from, when to approach, when not to, and then all the mechanical skills to actually fight, and all this against other human beings who are as smart or skilled as you. This type of game is filled with *meaningful actions.* You are learning to become a better human being by playing such a game because it is asking you to act correctly in a self-directed manner.\n\nMost multiplayer games are also filled with meaningful actions, as acting in a team is also pro-social skill development. Although, for multiplayer games, it is usually better for this play to be with friends/known people rather than strangers. This is where co-op games are better (i.e. playing Risk of Rain with friends) and where the matchmaking function that most of these games provide actively makes them less meaningful. You're engaging in more meaningful actions by having to actively join a server hosted by someone, and then joining that same server over and over and playing with a known community, than you are by playing with randoms all the time.\n\nIn any case, you can easily judge games based on the level of meaning in their actions. A game like SNKRX for instance, the earliest criticism I got of it before it was released was \"where's the gameplay?\" It's a valid criticism, the game almost plays itself. What this criticism was getting at was exactly this, where are the *meaningful actions?* And in those early versions they were indeed not all there. But later they came, as the ability to pick different units and have different builds came online more strongly. So even in a game like SNKRX, you're still making plenty of choices and having to learn the specifics of the system to make the right choices.\n\nYou can run this analysis pretty easily for any kind of game. Do you have meaningful actions in the VS-likes? Well, yea, but... It's definitely a lower level of it, and now the choose 1 out of 3 framing has been played and hollowed out completely so it's a lot less meaningful, right? What about the more traditional roguelites, Isaac and so on? Yea, there's a lot there, Isaac has a lot of resource trades on top of the extreme build diversity, even if the combat itself is kind of simple and mindless. What about games like Path of Exile? Lots of meaningful actions there at least regarding your builds, and for the players looking for more challenging action there's also more to learn regarding enemy patterns and so on, especially in Path of Exile 2 (apparently, I have not played it yet). I could go on, right, RTSs are pretty meaningful, the map games too, puzzle games, etc. Lots of genres get this right, some do not. So the natural criticism of i.e. VS-likes and incrementals that seems intuitive to many indie developers is actually that they fall really low on this meaningful action spectrum, I think.\n\nSo, that's what I meant by meaning and commitment earlier. Short-form content is very low meaning and very low commitment because your action is just scrolling, and the actual content you're consuming is hardly ever particularly good... Well, actually, it's often good in many ways, but it gets repetitive/ouroboros-like quite quickly due to how autistically the algo hyperfixates on it, so it reaches a point of negative value rapidly. But yea, it's just very low, and so the strategy should be to move away from that rather than towards it. This move away has to be an active choice because by default the Steam algorithm will serve what customers want, and what customers want will approach short-form content left unchecked, as the rise of VS-likes and incrementals shows.\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"sed -n '84,185p' /home/adn/a327ex/a327ex-site/posts/self_expression_ve...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"276799","wall_time_seconds":0.000002745,"exit_code":0,"original_token_count":4470,"output":"## Not being manipulative and the dishonesty of selling\n\nEdmund says that “to manipulate people into feeling a certain way, playing more, putting more money into the machine” is a bad thing. He is probably pointing to things like gacha games which have fairly aggressive and often times underhanded monetization strategies.\n\nAnd in general I agree with this. My main problem comes with just stopping there. For instance, The Binding of Isaac is a perfect example of a game with various very addictive elements to it, and those elements could easily be read to be very aggressively and often times underhandedly designed to get people to play the game for longer. And there’s a good correlation between getting people playing a game for longer and the creator’s financial success, so there’s most definitely a conflict there.\n\nNow, Edmund didn’t _intend_ for his game to be highly addictive in a negative way, and this is clear by events such as the steak incident, or the many interviews he gave about where he’s coming from when he made BoI. And that place is generally a place of trying to make a good game with a really maximalist sense of exploration. Plus, even in the interview above, the fact that he’s aware that “manipulating people into playing more” is bad a thing, means that he’s a lot less likely to do it willingly.\n\nAll of this to say, I don’t believe Edmund’s intentions to be negative in any way, shape or form. But… the path to hell is paved with good intentions, so we should also look at the effects of our choices and not only our intentions. And what are the negative effects of highly addictive video games? Well, let’s start with something everyone agrees on: gacha games.\n\nThe problem with gacha games, and mobile gaming more generally too, is that they’re designed to extract money out of a small percentage of the population that can’t help themselves. These are the so called “whales”. I think everyone sort of agrees on this and agrees that this is bad, but I don’t think people have a good understanding of what this actually entails.\n\nHave you ever dealt with people who have schizophrenia? I have, and one of the interesting features of the disease is that no matter how much you try to reason and argue with the person that their delusions aren’t real, they can’t be convinced of it. Because they can’t be convinced of it, it’s very hard to get them to accept that there’s a problem in the first place, which thus makes it very hard to get them to take medication for it, since often times the medication has bad side effects and might not even work completely on bringing the person back to reality. Nasty disease.\n\nA good portion of people who are homeless are schizophrenics for this reason, since if you don’t have family or friends to force you into a recovery, it’s very unlikely that you’ll do it yourself, since from your perspective there’s literally nothing wrong, except for the fact that “they” really are out there watching your every move and are, in fact, about to get you. A good portion of conspiracy theorism that you see online also comes from either people who are full on schizos or somewhere on their way there.\n\nWhat does this have to do with gacha games? Well, out of control gambling also shares this interesting property with schizophrenia, where no matter how much you tell the gambler that the machines are literally rigged against him, he won’t be able to stop himself.\n\nBut not only that, both diseases are partly expressions of the same core instinct gone out of control. This core instinct could be described as “connection-making”. That is, the schizophrenic can’t help himself but make connections between things that are not logically connected. You see this clearly when you read conspiracy theories where usually there’s a line of argument that may start correctly, but at some point there’ll be multiple jumps in reasoning that don’t make sense, which the schizophrenic can’t tell that they make no sense because of his disease.\n\nJreg has a really good video on this general argument, comparing it with autism:\n\n::youtube IHuFSnhKG9I start=\"0\"\n\nGambling also has this out of control pattern matching going on, but it also has the additional feature of out of control risk taking. So if we could look at the whole population to assess its “risky connection-making” levels, we would reach something similar to this:\n\n::image /media/posts/self_expression_vesselization/_self_expression_vesselization_1.png\n\nAnd this is a normal distribution. The x axis would be “risky connection-making” levels, the y axis the percentage of the population that exists at that level. As I mentioned in the [cons of compassion](/posts/cons_compassion) post, most conversations people have about problems in society are conversations about a very small number of people on the edges of such distributions.\n\nAnd so in the picture above, problematic gamblers would be the people to the right side of the red line. They’re maybe 1-2% of the population, but they spend _way_ more money than everyone else because they likely have a mental illness.\n\nI would be somewhere around the green line. I’m most definitely a risk taker, otherwise I wouldn’t be an indie developer. I’m also definitely somewhere along the schizo spectrum as I have the schizo gene, and I also like gambling mechanics. Now, I don’t gamble with real money ever as I’m _very_ responsible with my money, but, you know, I’ve played Genshin Impact, for like, 100 hours. Didn’t spend a single cent on it, but it’s a good and fun game. I can understand why people play it and spend money on it.\n\nBut I can also understand the people who complain about it. Even though most people, like 95%+ of people, have a responsible relationship with their gacha games and spend within their means, there’s a small percentage of the population that just can’t help themselves. And so developers and gamers of all kinds naturally view that as something bad and morally corrupt, and thus don’t support it. Edmund likely feels the same way and it’s probably what he’s alluding to when he mentions that “manipulating people into putting more money in the machine” is bad.\n\nBut… if you look at a game like Isaac, and you look at a game like Genshin Impact, or if you look at roguelites and gacha games more broadly too, design wise, the main difference between both is that one asks for money and the other asks for time, while a lot of other elements are pretty much the same.\n\nWhen you play a gacha game what happens is that the game locks the amount of time you can play per day, and you can increase this amount by paying money. So this is a design where there’s something the player wants to do, which is to level his characters up and grind more, and that activity is locked behind a pay wall.\n\nWhen you play a roguelite what happens is that the game locks the number of items you have available per run, and you can increase this amount by playing more runs. So this is a design where there’s something the player wants to do, which is to have crazy builds and synergies between items, and that activity is locked behind a time wall.\n\nIn both designs the thing people want to do is locked behind some kind of gating system, the only difference is the resource that’s asked out of the player. The _intent_ behind unlockable items as you play more runs in roguelites is to make the game less confusing for new players, but the _effect_ is that it artificially increases play time by locking what people want (run variety) behind a time wall.\n\nSuppose you agree that this equivalence is valid. You probably don’t, but suppose you agree that gacha games and roguelites, at a high level of their designs, have very similar gameplay loops and the main difference between them is that one asks for money and the other asks for time as a resource from the player.\n\nAssuming this is true, there’s still the point that asking for money is more morally corrupt than asking for time, right? We’ve already established that for gambling addictions, the problem lies with the 1-2% of the population that can’t control themselves, and so exploiting those people’s addictions is bad, which is why gacha games are bad.\n\nBut does the same apply to games that ask for people’s time? Are there people in the world who can’t control themselves and who will play addictive video games too much to the detriment of their own lives? I think the answer to that that is yes. There’s a subset of the population who are game addicts and have no real control over it. It’s a mental illness, like gambling addiction, or like schizophrenia, and no matter how much you try to reason with them they won’t change their ways. This is similarly most likely 1-2% of the population, but unlike gambling, it feels like an invisible problem.\n\nWhy does it feel like an invisible problem? Well, consider the fact that the gambling addict is bound by something. He is bound by his ability to generate income (or to go into debt). Once he runs out of money he’s out and he can’t gamble anymore. This is very sad and it’s also a very visible mode of failure, with the corresponding very visible response by everyone who is caught up in it and witnesses it.\n\nBut consider on the other hand the game addict. Is he bound by something? Can the game addict run out of… time? No, he can’t, at least not until he dies. And this death… It’ll be a sad one, because it’ll be a death of wasted potential. The game addict suffers from a much more insidious ailment, which Tonegawa captures well in the video below:\n\n::youtube jGL1x40p46s start=\"0\"\n\nAnd so when you look at games like Isaac, and other highly addicting roguelites like Slay the Spire, Hades, you know, pick your favorite, all of them share this same problem where, for a small subset of the population, they are used as tools to justify their addictions, just like gacha games are. The only difference between them is the resource used, and in my opinion asking for money is not significantly worse than asking for time.\n\nAnd of course, the negative effects of games aren’t limited to roguelites only. Pretty much every other type of game also has a form of this problem in one way or another.\n\nIn any case, you probably don’t agree with this entire argument. You’re probably thinking of many counter arguments to it right now, and I could preemptively write a retort to all your counter arguments but I’m not going to do it here. I’ve had this argument with many people before, I’ve thought about it a lot, and, you know, I’m pretty sure I’m right and I’m pretty sure the equivalence between gachas/roguelites and time/money is as solid as an equivalence gets. But this post is getting long, I want to be done with it, so I’ll have to leave the full version of this argument for another post. Let’s move on and go back to the topic of self-expression.\n\nI said at the start of this post that I value flexibility a lot. Another thing that I also value a lot is the ability to be attuned to reality, or to truth. So when Edmund says things like “don’t manipulate” or “the dishonesty of selling”, it tells me that he isn’t very attuned to reality when it comes to making video games.\n\nAnd this happens because the self-expressionist view gives him an out. From his perspective, as long as he is honest and his intent is good, everything is fine. However, as I’ve just shown, everything is not fine. His game is arguably very damaging due to how addicting it is. And so it seems clear to me that the self-expressionist view pushes developers further away from reality, as evidenced by the fact that it allows someone who is clearly smart and driven like Edmund to completely compartmentalize the negative effects of his games.\n\nNote that I’m not saying Edmund hasn’t thought about these problems thoroughly, I’m saying that the self-expressionist allows him to hide from the reality that addicting games, whether asking for money or time, are inherently full of manipulation and dishonesty.\n\nNot only does the self-expressionist view allow him to hide from reality, but it also allows him to use it as a shield and to then project all that unprocessed guilt of causing harm to others into an easy scapegoat: gacha games, or business more generally.\n\nAnd I’m just using Edmund as an example here. This same process occurs for like 99% of game developers. Discussions about the negative effects of video games are extremely limited, it’s an issue that everyone ignores and to the degree that it happens it focuses on things like lootboxes or gacha games, which in my view are easy targets that are collectively used as scapegoats to avoid considering the issue more thoroughly.\n\nNow, do I personally care about the morality of making addicting video games? Not really. I don’t think 1-2% of the population using my games for their addictions, however helpless they are, will keep me from sleeping soundly at night. But this is also why you’ll never catch me saying things like “business makes it dishonest” or “manipulating people into playing more is bad”.\n\nI understand that game making as a whole is, in many ways, a manipulative and dishonest activity. To make a roguelite is to exploit people’s exploratory sense. To make a base building automation game is to exploit people’s industriousness. To make a gacha game is to exploit people’s gambling tendencies. To make an MMO is to exploit people’s grinding sense. To make a game full of achievements is to exploit people’s achievement striving. To make a collectathon is to exploit people’s collecting sense. To make a puzzle game is to exploit people’s intellectual curiosity. To make a story rich game is to exploit people’s need for narratives.\n\nFor the “vesselized” view, all of these senses are equally valid as targets for a game. The gambling tendency isn’t somehow special because it’s gambling. If you can make a game that appeals to people who like gambling, good. Just like if you can make a game for people who like puzzles, good too.\n\nDoes this all mean that everything’s allowed, including the most unethical practices ever? No, of course not. Everything should be done within good taste. But, you know, Genshin Impact is a game that in my opinion does gacha mechanics in good taste, yet people still just blindly point to it as a negative example because it’s gacha. So it’s hard to take people’s opinions on these issues seriously as they clearly haven’t thought about it that much.\n\nAll of this to say, the self-expressionist view on these issues is very limited and disconnected from reality, which is why I don’t agree with it. But what exactly is my view, the “vesselized” view? After all my disagreements with the self-expressionists have been explained, I can finally define it more clearly.\n\n## Vesselization\n\nYou should think of yourself as a vessel. You don’t have ideas, they come to you from above. You could think of them as gifts, but they are conditional gifts. The one condition is that you do them justice. You need to represent these ideas correctly through your work, regardless of your own personal preferences. This is what it means to be a good vessel.\n\nA good vessel is empty. When Edmund says “allowing your flaws and eccentricities to show”, this is a bad vessel. A good vessel does not contaminate the idea with its own identity. A work tainted in such a way, with the specific particularities of its creators, strays further from the truth.\n\nA good vessel uses the market as an external decentralized self-improvement tool. When Edmund says “the dishonesty of selling something or being a salesperson can easily taint your work”, this is a bad vessel. Selling something is one of the most effective ways for a vessel to tell if it’s being a good vessel or not.\n\nA good vessel will never feel a sense of ownership over the works it produces. The works are produced by it in conjunction with a higher force. To try to claim it for itself would be selfish and arrogant. Vesselized works should be freely spread. Yes, a vessel needs to eat, but in this day and age it’s easier than ever to secure financial flows from a work while also making it widely available.\n\nA good vessel sees all feedback and criticism as good. Any response that anyone gives to the work can be used as a means of improvement. A vessel’s goal is not the pushing of its particular vision forward, but the pushing of an idea forward that matches some general human sense or archetype, and the only way it can tell if its achieving that is by listening and reading to what people are saying about the work.\n\nI was watching [this talk](https://www.youtube.com/watch?v=bdr3056fXVs) by Jonathan Blow. One portion that stuck with me was this one:\n\n::youtube bdr3056fXVs start=\"5700\"\n\n> It’s 18000 hours of being immersed in a subject and thinking hard about it. The Witness is a pretty big game, so let’s say someone plays it very thoroughly, 100 hours. So you have somebody with 100 hours of experience in this game. I have 18000 hours of experience in this game. I just can’t relate to the 100 hours experience on some level.\n> \n> Some people are just better critics than others, right? But some of the critics, like… they think they’re being really smart about something or they think they’re like, “aha! I’m pulling a gotcha on the person who made this game because I understand why they’re being dumb” or whatever and I’m like, you have like a .01% understanding of this game, I thought about it for 18000 hours as the most important thing in my life, like there’s just… that gap cannot really be bridged.\n> \n"}

I understand the distinction better now. You want to recover a detailed understanding of Steam as a creative environment, including possibilities that aren’t yet obvious—not have me choose a commercially sensible project for you. My first response narrowed the task too early.

Reading further changed several parts of my interpretation.

In Offerings to God, you explicitly reconsider the anonymous-developer experiment. Even proving that your work succeeds through its qualities alone becomes another condition placed on making it. The position you reach is to offer your best without requiring a particular response. Asking for a revenue or audience target missed that fairly directly.

Your creativity essay gives short development cycles a more specific purpose than efficiency: they let you explore design without spending years demonstrating technical competence around each experiment. Your marketing position follows from that allocation of attention. You’re willing to expose a game to people through inexpensive actions with substantial possible reach; building a promotional apparatus has to justify the creative work it displaces.

And your recent writing on meaning and commitment makes “spacious games” an incomplete description of your interests. You care about what players actually do, whether their choices matter, and what kinds of experiences games cultivate. More playtime or more build options doesn’t automatically mean a better game.

There’s also a useful nuance in Competition isn’t real: you value creative contributions, but don’t treat resemblance to existing work as disqualifying. A successful game can open possibilities for others. That suggests studying how new design territory develops, alongside the usual market trends.

I’d therefore revise the research in these ways:

  1. Start with the whole market before applying your interests. Establish changes in releases, prices, audience response, languages, commercial concentration, and the trajectories of games after release. Your preferences would inform additional investigations, without defining which games enter the dataset.

  2. Study categories forming, branching, and stalling. Follow sequences of releases around unusual games. Which successes produced a flourishing family of distinct games? Which produced many close copies but little further exploration? Which remained isolated despite substantial player interest? Those are three different situations that a genre-level revenue chart would blur together.

  3. Describe games below the level of tags. Record what the player controls, how decisions are structured, how power develops, where uncertainty comes from, and what generates variety. Tags can locate candidates, but “roguelite” tells us very little about those things. This richer description would require inspecting a selected sample of actual games; I wouldn’t pretend we can infer everything from store metadata.

  4. Look for several kinds of novelty. An unfamiliar mechanic, a familiar mechanic given a different role, a new combination, and a change in presentation or audience are different contributions. I’d investigate which changes appear consequential, including games whose ideas were interesting but whose reception was weak. Studying only successful pioneers would manufacture an overly neat story.

  5. Examine discovery as a process over time. How often do games find their audience late? What happens around identifiable bursts of attention? Which games sustain interest afterward? Which receive repeated attention without continual developer promotion? This is more useful for your approach than an inventory of recommended marketing chores. Publicly invisible effort would remain unknown, rather than being counted as zero.

  6. Keep productive anomalies visible. Some worthwhile findings will be well-supported trends; others will be a handful of games that don’t fit the pattern and deserve investigation. I’d distinguish them, but wouldn’t discard the latter merely because they’re too unusual for a strong statistical result.

The central methodological difficulty is that a database contains games people have made, while you’re particularly interested in possibilities they haven’t explored much. Empty space in a spreadsheet cannot establish an opportunity. What can make it interesting is surrounding evidence: a pleasure players respond to across different games, an unusual design that attracted attention despite substantial flaws, or several successful variations that all leave the same underlying possibility untouched.

That is where I should contribute judgment: generate explanations, inspect games closely, look for counterexamples, and propose further questions. The output should expand what you can see in the market. It needn’t culminate in recommendations for Horse Game or a ranked list of projects you should make. I have enough direction now; no further preference questionnaire is needed.

One source-boundary mistake bears repeating explicitly: your “Game quality is all that matters” essay reproduced a howtomarketagame passage, which I encountered. I haven’t read Fable’s research or opened the external blog, but I can no longer claim complete non-exposure to that material. Subsequent market claims will need fresh evidence rather than relying on it.

I think your research direction needs to be based on data, since I want this to come from Steam itself. The directions you had in the previous response that is now gone after my answer were more realistic, as most of these things you described cannot be reliably recovered in any way from Steam data alone, and you don't have the ability to play all these games to figure it out in a programmatic way, so most of it seem unrealistic.

You’re right. I drifted from questions the data can answer into questions that would require extensive game-by-game interpretation. I’ll check the Steam fields directly and narrow the approach to analyses we can actually compute, with clear limits on what they establish.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport json, urllib.request, concurrent.futures\nur...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"0363b8","wall_time_seconds":0.206476094,"exit_code":0,"original_token_count":999,"output":"{\"source\": \"https://store.steampowered.com/api/appdetails?appids=620&cc=us&l=english\", \"success\": true, \"fields\": [\"about_the_game\", \"achievements\", \"background\", \"background_raw\", \"capsule_image\", \"capsule_imagev5\", \"categories\", \"content_descriptors\", \"controller_support\", \"detailed_description\", \"developers\", \"dlc\", \"genres\", \"header_image\", \"is_free\", \"linux_requirements\", \"mac_requirements\", \"metacritic\", \"movies\", \"name\", \"package_groups\", \"packages\", \"pc_requirements\", \"platforms\", \"price_overview\", \"publishers\", \"ratings\", \"recommendations\", \"release_date\", \"required_age\", \"screenshots\", \"short_description\", \"steam_appid\", \"support_info\", \"supported_languages\", \"type\", \"website\"], \"sample\": {\"type\": \"game\", \"release_date\": {\"coming_soon\": false, \"date\": \"Apr 18, 2011\"}, \"price_overview\": {\"currency\": \"USD\", \"initial\": 999, \"final\": 999, \"discount_percent\": 0, \"initial_formatted\": \"\", \"final_formatted\": \"$9.99\"}, \"genres\": [{\"id\": \"1\", \"description\": \"Action\"}, {\"id\": \"25\", \"description\": \"Adventure\"}], \"categories\": [{\"id\": 2, \"description\": \"Single-player\"}, {\"id\": 1, \"description\": \"Multi-player\"}, {\"id\": 9, \"description\": \"Co-op\"}, {\"id\": 38, \"description\": \"Online Co-op\"}, {\"id\": 39, \"description\": \"Shared/Split Screen Co-op\"}, {\"id\": 24, \"description\": \"Shared/Split Screen\"}, {\"id\": 22, \"description\": \"Steam Achievements\"}, {\"id\": 28, \"description\": \"Full controller support\"}, {\"id\": 29, \"description\": \"Steam Trading Cards\"}, {\"id\": 13, \"description\": \"Captions available\"}, {\"id\": 51, \"description\": \"Steam Workshop\"}, {\"id\": 30, \"description\": \"Steam Workshop\"}, {\"id\": 67, \"description\": \"Camera Comfort\"}, {\"id\": 68, \"description\": \"Custom Volume Controls\"}, {\"id\": 74, \"description\": \"Playable without Timed Input\"}, {\"id\": 55, \"description\": \"DualShock Controller Support\"}, {\"id\": 56, \"description\": \"DualShock Controller Support\"}, {\"id\": 57, \"description\": \"DualSense Controller Support\"}, {\"id\": 58, \"description\": \"DualSense Controller Support\"}, {\"id\": 79, \"description\": \"Save Anytime\"}, {\"id\": 59, \"description\": \"Steam Input API Support\"}, {\"id\": 69, \"description\": \"Stereo Sound\"}, {\"id\": 70, \"description\": \"Surround Sound\"}, {\"id\": 23, \"description\": \"Steam Cloud\"}, {\"id\": 15, \"description\": \"Stats\"}, {\"id\": 17, \"description\": \"Includes level editor\"}, {\"id\": 14, \"description\": \"Commentary available\"}, {\"id\": 41, \"description\": \"Remote Play on Phone\"}, {\"id\": 42, \"description\": \"Remote Play on Tablet\"}, {\"id\": 43, \"description\": \"Remote Play on TV\"}, {\"id\": 44, \"description\": \"Remote Play Together\"}, {\"id\": 62, \"description\": \"Family Sharing\"}], \"supported_languages\": \"English<strong>*</strong>, French<strong>*</strong>, German<strong>*</strong>, Spanish - Spain<strong>*</strong>, Czech, Danish, Dutch, Finnish, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese - Portugal, Romanian, Russian<strong>*</strong>, Simplified Chinese, Swedish, Thai, Traditional Chinese, Turkish, Bulgarian, Greek, Portuguese - Brazil, Spanish - Latin America, Ukrainian<br><strong>*</strong>languages with full audio support\", \"developers\": [\"Valve\"], \"publishers\": [\"Valve\"]}}\n{\"source\": \"https://store.steampowered.com/appreviews/620?json=1&filter=recent&language=all&purchase_type=all&num_per_page=1\", \"success\": 1, \"summary\": {\"num_reviews\": 1, \"review_score\": 9, \"review_score_desc\": \"Overwhelmingly Positive\", \"total_positive\": 460239, \"total_negative\": 6051, \"total_reviews\": 466290}, \"review_fields\": [\"app_release_date\", \"author\", \"comment_count\", \"language\", \"primarily_steam_deck\", \"reactions\", \"received_for_free\", \"recommendationid\", \"refunded\", \"review\", \"steam_purchase\", \"timestamp_created\", \"timestamp_updated\", \"voted_up\", \"votes_funny\", \"votes_up\", \"weighted_vote_score\", \"written_during_early_access\"], \"author_fields\": [\"avatar\", \"last_played\", \"num_games_owned\", \"num_reviews\", \"persona_status\", \"personaname\", \"playtime_at_review\", \"playtime_forever\", \"playtime_last_two_weeks\", \"profile_url\", \"steamid\"]}\n"}

Yes. I was proposing conclusions without a credible measurement procedure. The research questions should follow from the Steam data we can obtain. Your writing helps me recognize interesting results; it doesn’t supply missing variables.

I just checked Steam’s store-details and review responses directly. The former exposes current price, release date, developers, publishers, languages, and feature categories. Reviews expose timestamps, language, recommendation, purchase/key distinctions, and reviewer playtime. This confirms those fields exist; catalog-wide coverage and collection cost still need checking.

A more realistic starting agenda is:

Question Computation What it could reveal
Where is audience response growing faster than releases? For tags and sufficiently populated combinations, compare release counts, review activity, and per-game outcome distributions across cohorts. Areas where expanding supply accompanies stronger results, versus areas where release growth mostly adds poorly received games.
Which apparent trends survive removing the biggest hits? Recalculate growth and concentration excluding the largest games; examine medians and multiple review-count thresholds. Whether a category’s apparent strength extends beyond one exceptional title.
Which uncommon combinations repeatedly attract players? Identify relatively sparse tag combinations with multiple independent releases showing substantial review activity; compare against each constituent tag. Candidates worth investigating beyond the obvious large categories. Tags would identify unusual classifications, not prove mechanical originality.
How have games’ trajectories changed? Reconstruct review accumulation by days since release: early activity, later acceleration, and persistence. Whether attention is increasingly concentrated around launch, and where delayed growth or sustained activity occurs. This would not identify its cause.
What does the market look like outside English reviews? Compare review-language shares, growth, sentiment, and concentration across game groups. Trends an English-only analysis would miss. Review language is an audience signal, not nationality or regional sales.
How much do broad conclusions depend on which games we count? Repeat analyses for paid/free games, developer catalog sizes, publisher groupings, and different release cohorts. Whether “Steam is doing X” actually describes a particular subset of the catalog.

Price, controller support, multiplayer features, and supported languages would provide further descriptive comparisons. Their current values cannot reliably explain historical performance, so I’d keep that distinction explicit.

The practical sequence would be:

  1. Audit access and coverage. Establish how complete a catalog we can collect, whether tags are consistently recoverable, and how expensive review histories are. Identify missing and delisted titles where possible.
  2. Collect a broad, inexpensive layer first. Store metadata and review totals across the catalog, with timestamps and reproducible scripts.
  3. Use initial results to select deeper queries. Retrieve review histories for relevant cohorts and comparison samples, rather than downloading every review before knowing why.
  4. Investigate anomalies that survive basic checks. Require adequate sample sizes, inspect distributions, and test whether patterns recur in another period. Searching thousands of combinations otherwise produces convincing accidents.

I would drop development duration, marketing effort, design depth, and causal discovery mechanisms from the quantitative agenda unless we obtain evidence that actually measures them. Neither sparse promotion nor simple-looking art establishes a game made quickly with little marketing.

Your preference for unfamiliar games still matters here: it motivates looking below broad category averages and preserving unusual observations. But the resulting claim should initially be something concrete—“this small group repeatedly receives substantial player response despite few releases”—with the games and numbers attached. Whether that represents an interesting creative opening comes afterward.

That gives us a feasible foundation for broad Steam research, and lets the data generate the next questions rather than committing us to speculative directions upfront.

Great, this direction seems more interesting and correct to me. We have to start with first getting the data itself. You may decide how to do it entirely yourself, however you decide to audit each possibility, test it, etc, it's all in your hands, I do not care that much about the details as long as you get the most representative and current (today is September 5th 2026) dataset possible on Steam games, with as much data as possible for each game, importantly try to also capture pictures that each game adds on the store because we can later do some visual analysis on it all as well, but I don't know if it's possible to do that.

I’ll audit the available catalog sources, then build a resumable collection of current game data and store images. I’ll keep track of coverage and missing records so we can judge how representative the dataset actually is.

exec ({"code": "text(await tools.exec_command({cmd:\"pwd; rg --files -g AGENTS.md -g CLAUDE.md -g '!a327ex-site/**' -g '!An...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"1b67a3","wall_time_seconds":0.000004285,"exit_code":0,"original_token_count":3749,"output":"/home/adn/a327ex\n# CLAUDE.md\n\nGuidelines for Claude Code instances working in this repository.\n\n---\n\n## Communication Style\n\nBe thorough. Write as much as the subject warrants — explain reasoning, include relevant context, surface adjacent considerations. Stay roughly on topic, but don't truncate for brevity's sake. Thoroughness means more substance, not more structure — depth comes from reasoning and adjacent considerations, not from header scaffolding, preamble, or restating what was already said.\n\nDeliver analyses fully in chat. Session transcripts become published AI logs on a327ex.com — content locked inside files is invisible to log readers. When producing a long analysis, report, or research finding, print it in full in the reply; only also write it to a file when the project needs a durable artifact, and never treat the file as the primary delivery.\n\nCritique freely. Ideas, code, plans, artifacts — evaluate them honestly. Avoid sycophancy. Focus on what seems true rather than what's convenient or what you think I'd like to hear. I crave honest appraisal, including when it's uncomfortable.\n\nEmbrace contradiction. Truth often contains multiple seemingly opposite ideas. Don't censor yourself to avoid inconsistency — multiple perspectives can be correct simultaneously. Present the tension rather than forcing artificial resolution.\n\nStay object-level in free-form discussion. In open-ended, exploratory conversation — thinking through ideas rather than executing a defined task — never default to rationalist-mode discourse. Don't ask meta or audit questions (\"how do you reconcile X and Y,\" \"how do you guard against this bias,\" \"what's your check that you're not fooling yourself\"): they stand above an idea and ask me to defend a system against a pre-supposed flaw, their only outputs are valid/invalid, and so they generate nothing. Don't hedge against an imagined rationalist/LessWrong commenter or pre-empt objections nobody raised. Instead, engage a specific claim from inside it — what it actually asserts, what follows from it, where it leads, what it leaves unexplained — and extend it into territory it hasn't been pointed at yet, which is where insight comes from. Make committal, falsifiable moves: assert a reading even at the risk of being wrong, rather than asking a safe question that commits to nothing. Trust ideas enough to build on them, and find their flaws by leaning weight on them, not by pre-supposing them. The audit move is the safe move — it can't embarrass the asker and always sounds rigorous — but it produces the feeling of rigor without the risk that produces understanding.\n\n---\n\n## Working Style\n\n### When to Ask\n\nThe developer prefers being asked over having Claude guess wrong. When a\ndecision is open, lay it out in chat as a question with labeled options —\nthe same shape as a multiple-choice prompt, just written as prose: list\nthe options, give your recommendation, then stop and let him pick one *or*\nredirect entirely. Don't force a selection — he often wants a direction\nnone of the listed options covered, and the value is in seeing the choice\nframed, not in being made to answer. When you have several questions,\nbatch them into one message rather than asking them one at a time.\n\n**Ask first:**\n- Architecture decisions\n- API design choices\n- Design decisions (gameplay feel, mechanics, UI)\n- When uncertain about intent or priorities\n\n**Proceed, then explain:**\n- Implementation details where the path is clear\n- Performance optimization (get it working first, optimize later)\n\nOpen choices below the ask-first bar — reversible, not architecture,\nnot feel — don't get a standalone question: pick a default and flag it\nin the design brief as a decision made, so it's vetoable there (see\nCode Changes).\n\nThroughout: surface tradeoffs explicitly, and don't treat specs as\nfinal — they're starting points for conversation.\n\n### Pacing\n\n- The agreed brief defines the batch: implement everything it covers\n  (which may be a whole phase), and nothing beyond it\n- After completing a batch, hand it over with instructions for how to\n  test it — no silent completions — then give the user a turn before\n  starting the next\n- Scope grows only through conversation, never autonomously — don't\n  chain into new tasks or build systems that weren't agreed\n\n### Code Changes\n\n- **⛔ DESIGN BRIEF before code.** Before calling `Write` or `Edit` on\n  a code file for a non-trivial change, post a **design brief** in chat\n  — a conceptual explanation of the approach, NOT the code itself. Then\n  wait. The user will usually reply with questions and improvements;\n  iterate the brief with them until you reach a conclusion. Only then\n  write the code.\n\n  A design brief contains:\n  - **Approach** — how each feature works: what it does, the strategy,\n    the key data it holds, its lifecycle.\n  - **Interfaces** — how the feature connects to existing features:\n    which existing functions / files / globals it touches or reuses,\n    and how. Include whenever the feature is not self-contained.\n  - **Functions** — for each new or changed function: its name, what it\n    does, which other functions it calls (selective — the calls that\n    build a conceptual map, not an exhaustive list), and its general\n    structure when not already obvious.\n  - **Decisions** — open choices the brief resolves by default rather\n    than by a standalone question: name each one, the option picked,\n    and why, so it can be vetoed in brief review.\n\n  The brief is a conceptual map, not a spec and not pseudocode — aim for\n  \"a reader could predict the shape of the code from this.\" Once the\n  brief is agreed, write the code directly; do NOT re-post it for a\n  second approval — the brief WAS the review. If while writing you find\n  the brief was wrong in a way that changes the design, stop and post a\n  short follow-up brief for that delta.\n\n  Plan mode is not a substitute for the brief — the brief is iterated\n  in chat, not approved as a plan.\n\n  **Trivial changes** skip the brief — just make them and describe the\n  diff in chat afterward. Trivial means:\n  - Single-line value tweaks (number, string, flag, font size, color hex)\n  - Variable renames within one file\n  - Single-line typo fixes\n  - User-specified imperatives (\"change X to Y\", \"rename foo to bar\")\n\n  If unsure whether something counts as trivial, treat it as\n  non-trivial and write a brief.\n\n  Also exempt (no brief): edits to CLAUDE.md / plan.md / design.md type\n  files when the user has already specified the change in prose.\n\n  **Website (`a327ex-site/`) changes are fully exempted.** No design\n  brief, no permission ask, no confirmation before `git push prod main`\n  (which deploys via the post-receive hook). Edit, commit, and push\n  freely. The user wants to iterate fast on the site without the\n  brief-then-ask handshake. This authorization is durable — applies to\n  every session, not just the one it was granted in.\n\n  **Delegation.** When implementation is delegated (a subagent, or a\n  second instance implementing under an already-agreed brief), the\n  brief travels with the delegation and bounds it. An implementer\n  makes no new design decisions: on hitting an open choice, or finding\n  the brief wrong, it stops and reports to the instance that delegated\n  it — nothing more. The asking, brief, and scope rules elsewhere in\n  this document bind the directing instance, not the implementer.\n\n  Why: the user wants to review the *design* before the code exists —\n  at the level of approach and structure, not syntax. A conceptual\n  brief surfaces design problems faster than a wall of code does, and\n  keeps the review loop about decisions rather than line-editing.\n\n### Log-friendly Artifacts\n\nSession logs card only delivered files (SendUserFile, the Artifact tool),\nand card content is read from disk at end-session, not at delivery. So\nwhen handing over a viewable file that will keep being iterated (an HTML\nprototype, a render, a page), freeze it first: copy it to a versioned name\nnext to it (`versions/<name>-v3.html`, or a timestamp) and deliver the\nfrozen copy with SendUserFile. The working file keeps its stable name so\nrun commands don't change. Identical content is carded once, so\nre-delivering an unchanged file is free. A bare markdown link to the\nworking file is fine for the terminal but produces no card in the log.\n\nWhy: an iterated file handed over by link four times produced zero cards\n(2026-09-03, Reverse Minesweeper); handed over by SendUserFile it would\nhave produced four cards all holding the final version. The frozen copies\nare also a free rollback history.\n\n### Prose and Text Writing\n\nNever *offer* or *suggest* drafting prose for the user — stories, blog posts, emails, messages, design docs, or any other text. The user writes their own text from scratch; I do not.\n\nMy role with prose is to:\n- Improve what the user has already written (line edits, structural critique, alternative phrasings of existing passages)\n- Discuss structure, beats, ideas, and design before they write\n- Provide research, summaries, or reference material that feeds their writing\n- Sketch outlines or beat structures when asked\n\nWhen editing his text for posting (\"fix typos and grammar\"), fix only mechanical errors — typos, misspellings, subject-verb agreement, obviously missing words, punctuation that garden-paths a sentence — and name each fix when posting. Never restyle: his run-ons, comma splices, unhyphenated compounds, and casual register (including high/low diction collisions) are deliberate voice, not errors. Never introduce em dashes — he doesn't use them. If a fix is arguable, it's style — leave it.\n\nWhen a task seems to call for a draft, do not propose drafting it. Offer research, structure, or critique instead. Specifically avoid the \"let me draft so you can react to it\" move — that's the exact behavior to suppress.\n\nIf the user explicitly requests a draft, that's their override — but never raise the option myself.\n\n(This applies to prose. Code, configs, and engineering documents remain governed by Code Changes above.)\n\n### Building and Running\n\nHis test loop is the scarce resource — it should never be spent on failures a machine could have caught. Before handover, verify mechanically; never verify feel.\n\n**Mechanical verification (expected):** syntax checks, engine builds, and whatever non-interactive harness a project provides — agent instances driven through the eval channel (`anchor drive`), captured frames, balance sims. Per-project CLAUDE.mds list what's available; if a project provides nothing, at minimum check the code parses.\n\n**Feel verification (never mine):** never run a game or executable interactively — no `run.bat` / `run-web.bat` or similar, no opening the game to try it, no driving his mouse or keyboard. Playing, testing, and judging feel are his. Hand over with test instructions (see Pacing).\n\n**Engine C changes (Anchor/engine):** build to verify compilation; never run the executable.\n\n---\n\n## Projects\n\nProject state — what's active, what shipped, current direction — lives in auto-memory and changes too fast for this file; this section is only the stable structural map. Any directory with its own `.claude/CLAUDE.md`: read that first when working there.\n\n- **Infrastructure:** `Anchor/` — ONE folder for everything infrastructure (unified 2026-08-26, one git repo): `Anchor/engine/` (the game engine: C engine + Lua framework + docs + playground) and `Anchor/workflow/` (SPR, the workflow system: capture → assemble → review → publish + play loop + session tooling; read its README.md first). Future infrastructure projects land as further `Anchor/<project>/` siblings. ⚠ The live site's wasm builds from `Anchor/engine/engine`, so engine changes can reach production. Old engine generations (v1, Anchor2, YueScript-era) live untouched in `archive/` — historical reference only, never use their docs or patterns; some dormant games still sit on them via their own self-contained framework copies.\n- **Site:** `a327ex-site/` — a327ex.com content (logs, posts, media) plus the engine renderer in `a327ex-site/renderer/`. `anchor.blot.im/` is a legacy redirect, no longer written to.\n- **Templates (forkable starters), each with its own `.claude/CLAUDE.md`:** `snkrx-template/` (SNKRX visual style: attack carriers + UI toolkit), `ricochet-template/` (Ricochet blueprint-room style: pattern × color × dither + UI), `emoji-template/` (Twemoji style, on Anchor 3).\n- **Games:** consult memory for which are active; each has its own `.claude/CLAUDE.md` and/or `design.md`.\n\n---\n\n## Anchor Engine\n\n**The engine lives at `Anchor/engine/` and is the default for all projects.** Generation-wise it is \"Anchor 3\": it extends Anchor 2 — same C engine lineage, same procedural Lua framework architecture (free functions, plain tables; no object tree, no action phases, no `an` god-object; the `collider` class is the one exception) — with 3D: Box3D physics (`physics3`) and 3D layers (`layer3`). ⚠ The live site's wasm builds from `Anchor/engine/engine`, so engine changes can reach production. Old generations live in `archive/` (Anchor2 = the 2D predecessor some dormant projects still sit on; v1 in `archive/Anchor`) — never modify or source patterns from them.\n\n### Structure\n\n**Engine** — C code in `Anchor/engine/engine/src/anchor.c` (single file, ~18,750 lines — the source of truth)\n**Framework** — Lua framework files in `Anchor/engine/framework/anchor/`\n**Games** — Lua code using the engine; each game ships its own `anchor/` copy of the framework that can drift — when a function isn't where the docs say, grep the game's copy, which is ground truth for that game. Port framework changes into a game's copy individually; never overwrite a game's `anchor/` file wholesale with the framework version.\n\n### Documentation\n\n- `Anchor/engine/.claude/CLAUDE.md` — working agreements (read first when working in the engine)\n- `Anchor/engine/reference/plan.md` — authoritative plan for the 3D extension\n- `Anchor/engine/docs/ENGINE_API_QUICK.md` / `ENGINE_API.md` — engine API: compact signatures / detailed with examples\n- `Anchor/engine/docs/FRAMEWORK_API_QUICK.md` / `FRAMEWORK_API.md` — framework API: compact / detailed\n- `Anchor/engine/docs/3D_API.md` — the 3D extension (physics3 / layer3)\n- `Anchor/engine/playground/main.lua` — canonical style example\n\nWhen using engine or framework functions, look them up in the docs — don't guess signatures or parameters.\n\n### Commands\n\n```bash\n# Engine (C) — build to verify compilation (see Building and Running)\ncd E:/a327ex/Anchor/engine/engine && ./build.bat            # Desktop build\ncd E:/a327ex/Anchor/engine/engine && ./build-web-engine.sh  # Wasm build (feeds the live site)\n```\n\nEach game/playground directory has its own `run.bat` — running it is his, not mine (see Building and Running).\n"}
{"chunk_id":"afcd36","wall_time_seconds":0.000002503,"exit_code":0,"original_token_count":138,"output":"fatal: not a git repository (or any parent up to mount point /)\nStopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).\ntotal 60\ndrwxr-xr-x 1 adn adn   104 Sep  4 10:47 .\ndrwxr-xr-x 1 adn adn   170 Sep  3 13:42 ..\n-rw-r--r-- 1 adn adn 43529 Sep  4 11:46 anchor-v1-tree.html\n-rw-r--r-- 1 adn adn 14935 Aug 30 13:55 generational-dynamics-analysis.md\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  117G  811G  13% /home\nrequests True\naiohttp False\npandas False\npyarrow False\nduckdb False\nPIL True\nbs4 False\n"}

[Think]

**Preparing source audit**

exec ({"code": "text(await tools.exec_command({cmd:\"mkdir -p /home/adn/a327ex/steam-research/2026-09-05/audit; python - <<...)

Script completed
Wall time 2.3 seconds
Output:

{"chunk_id":"940bfa","wall_time_seconds":0.48981272,"exit_code":0,"original_token_count":678,"output":"{\"name\": \"applist_v2\", \"url\": \"https://api.steampowered.com/ISteamApps/GetAppList/v2/\", \"status\": 404, \"bytes\": 136, \"seconds\": 0.27, \"content_type\": \"text/html; charset=UTF-8\", \"head\": \"<html><head><title>Not Found</title></head><body><h1>Not Found</h1>Method 'GetAppList' not found in interface 'ISteamApps'</body></html>\"}\n{\"name\": \"store_applist\", \"url\": \"https://api.steampowered.com/IStoreService/GetAppList/v1/?include_games=true&include_dlc=false&include_software=false&include_videos=false&include_hardware=false&max_results=50000\", \"status\": 403, \"bytes\": 168, \"seconds\": 0.38, \"content_type\": \"text/html; charset=UTF-8\", \"head\": \"<html><head><title>Forbidden</title></head><body><h1>Forbidden</h1>Access is denied. Retrying will not help. Please verify your <pre>key=</pre> parameter.</body></html>\"}\n{\"name\": \"search\", \"url\": \"https://store.steampowered.com/search/results/?query&start=0&count=100&dynamic_data=&sort_by=_ASC&supportedlang=&snr=1_7_7_230_7&infinite=1&category1=998&cc=us&l=english&ignore_preferences=1\", \"status\": 200, \"bytes\": 236424, \"seconds\": 0.42, \"content_type\": \"application/json; charset=utf-8\", \"head\": \"{\\\"success\\\":1,\\\"results_html\\\":\\\"\\\\n<!-- List Items -->\\\\n\\\\n\\\\t\\\\t\\\\t\\\\t<a href=\\\\\\\"https:\\\\/\\\\/store.steampowered.com\\\\/app\\\\/730\\\\/CounterStrike_2\\\\/?snr=1_7_7_230_150_1\\\\\\\"\\\\n\\\\t\\\\t\\\\t data-ds-appid=\\\\\\\"\", \"keys\": [\"success\", \"results_html\", \"total_count\", \"start\"], \"total_count\": 184682, \"rows\": 100}\n{\"name\": \"catalog_xml\", \"url\": \"https://store.steampowered.com/feeds/search.xml\", \"status\": 200, \"bytes\": 57204, \"seconds\": 0.31, \"content_type\": \"text/xml; charset=UTF-8\", \"head\": \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" ?><rdf:RDF xmlns:rdf=\\\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\\\" xmlns:dc=\\\"http://purl.org/dc/elements/1.1/\\\" xmlns:sy=\\\"http://purl.org/rss/1.\"}\n{\"name\": \"steamspy_all\", \"url\": \"https://steamspy.com/api.php?request=all&page=0\", \"status\": 200, \"bytes\": 354933, \"seconds\": 0.47, \"content_type\": \"application/json\", \"head\": \"{\\\"730\\\":{\\\"appid\\\":730,\\\"name\\\":\\\"Counter-Strike: Global Offensive\\\",\\\"developer\\\":\\\"Valve\\\",\\\"publisher\\\":\\\"Valve\\\",\\\"score_rank\\\":\\\"\\\",\\\"positive\\\":7642084,\\\"negative\\\":1173003,\\\"userscore\\\":0,\\\"owners\\\":\\\"\", \"keys\": [\"730\", \"1172470\", \"578080\", \"1623730\", \"440\", \"1938090\", \"1063730\", \"2358720\", \"271590\", \"550\"]}\n{\"name\": \"store_page\", \"url\": \"https://store.steampowered.com/app/620/?cc=us&l=english\", \"status\": 200, \"bytes\": 178812, \"seconds\": 0.45, \"content_type\": \"text/html; charset=UTF-8\", \"head\": \"<!DOCTYPE html>\\n<html class=\\\" responsive DesktopUI\\\" lang=\\\"en\\\"  >\\n<head>\\n\\t<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\">\\n\\t\\t\\t<meta name=\\\"viewport\\\" content=\\\"width\"}\n"}
IStoreService Interface (Steamworks Documentation) (https://partner.steamgames.com/doc/webapi/IStoreService)
citeturn2view0 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({"ref_id":"https://partner.steamgames.com/doc/webapi/IStoreService","lineno":null}); Total lines: 408
L0: Steamworks Documentation
L1: 
L2: [Input: Search Steamworks Documentation…] [Input]
L3:   * cite0†Documentation Home Page L4:   * cite1†Getting Started L5:     * cite2†Onboarding L6:     * cite3†Steam Direct Fee L7:     * cite4†Managing Your Steamworks Account L8:       * cite5†User Permission: Receive Steamworks Communication L9:     * cite6†Managing Applications L10:       * cite7†Application Management Sharing L11:       * cite8†Transferring Applications L12:     * cite9†Bringing Mobile Games to Steam L13:     * cite10†Content Survey L14:       * cite11†Age Ratings in Indonesia L15:       * cite12†Age Ratings Mandatory in Germany L16:     * cite13†Frequently Asked Questions L17:   * cite14†Store Presence L18:     * cite15†Applications L19:       * cite16†Branches (Betas) L20:       * cite17†Builds L21:       * cite18†Bundles L22:         * cite19†Creating Bundles Across Multiple Developers/Publishers L23:       * cite20†Demos L24:       * cite21†Depots L25:       * cite22†Downloadable Content (DLC) L26:         * cite23†DLC Visibility L27:       * cite24†Game Soundtracks on Steam L28:       * cite25†Packages L29:         * cite26†Autogrant Packages L30:         * cite27†Creating and Configuring Deluxe Packs L31:       * cite28†Platforms L32:         * cite29†Developing for SteamOS and Linux L33:     * cite30†Coming Soon L34:     * cite31†Developer And Publisher Homepages L35:       * cite32†Homepage Example L36:     * cite33†Early Access L37:     * cite34†Explain Your Editions L38:     * cite35†Franchise Pages L39:     * cite36†Free To Play Games L40:     * cite37†Graphical Assets - Overview L41:       * cite38†Artwork Overrides L42:       * cite39†Community and Client Icons L43:       * cite40†Event Graphical Assets L44:       * cite41†Graphical Asset Rules L45:       * cite42†Library Assets L46:       * cite43†Store Graphical Assets L47:     * cite44†Livestreaming L48:       * cite45†Setting Up A Stream L49:       * cite46†Frequently Asked Questions L50:       * cite47†Broadcast Moderation and Adding Moderators L51:       * cite48†Broadcast Viewership Statistics L52:       * cite49†Livestreaming a Game Demo to the Steam Store L53:     * cite50†Localization and Languages L54:       * cite51†Languages Supported on Steam L55:     * cite52†Pre-Purchasing on Steam L56:     * cite53†Pricing L57:       * cite54†Adding A New Currency L58:       * cite55†Package Pricing CSV Import/Export L59:       * cite56†Recurring Subscriptions L60:       * cite57†Supported Currencies L61:     * cite58†Promo Event Tools, Rules, and Guidelines L62:       * cite59†Participating in Third-Party Sales Events L63:       * cite60†Developer, Publisher, and Franchise Sale Pages L64:       * cite61†Hosting Third-Party Sales Events L65:     * cite62†Release Dates L66:     * cite63†Release Options L67:     * cite64†Release Process L68:     * cite65†Removing a product from Steam L69:     * cite66†Review Process L70:     * cite67†Roadmaps L71:     * cite68†Season Passes L72:     * cite69†Steam China L73:     * cite70†Steam Tags L74:     * cite71†Store Page, Building and Editing L75:       * cite72†Store Page Accolades L76:       * cite73†Store Page Extra Asset Management L77:       * cite74†Store Page Written Description L78:     * cite75†Testing On Steam L79:     * cite76†Top Sellers Lists L80:     * cite77†Trailers L81:     * cite78†Updating Your Game - Best Practices L82:     * cite79†User Reviews L83:   * cite80†Features L84:     * cite81†Anti-cheat and Game Bans L85:       * cite82†Anti-Cheat Integration L86:     * cite83†Common Redistributables L87:     * cite84†Enhanced Rich Presence L88:     * cite85†Game Notifications L89:     * cite86†Microtransactions (In-Game Purchases) L90:       * cite87†Microtransactions Implementation Guide L91:       * cite88†Recurring In-Game Billing L92:     * cite89†Multiplayer L93:       * cite90†Game Servers L94:       * cite91†Steam Datagram Relay L95:       * cite92†Steam Matchmaking & Lobbies L96:         * cite93†Matchmaking based on skill L97:       * cite94†Steam Networking L98:     * cite95†Stats and Achievements L99:       * cite96†Step by Step: Achievements L100:       * cite97†Step by Step: Stats L101:     * cite98†Steam Audio L102:     * cite99†Steam Cloud L103:     * cite100†Steam Cloud Play (Beta) L104:     * cite101†Steam Community L105:     * cite102†Steam DRM L106:     * cite103†Steam Error Reporting L107:     * cite104†Steam Families L108:     * cite105†Steam HTML Surface L109:     * cite106†Steam Input L110:       * cite107†Action Manifest Files L111:       * cite108†Action Set Layers L112:       * cite109†Activators L113:       * cite110†Browsing Configurations L114:       * cite111†General Concepts L115:       * cite112†Getting Started for Developers L116:       * cite113†Getting Started for Players L117:       * cite114†In-Game Actions File L118:       * cite115†Input Source Modes L119:       * cite116†Input Sources L120:       * cite117†Legacy Mode Bindings L121:       * cite118†Mode Shifting L122:       * cite119†Mouse Regions L123:       * cite120†Radial Menus L124:       * cite121†Steam Input Devices L125:         * cite122†Microsoft Xbox 360 Controller L126:         * cite123†Microsoft Xbox One Controller L127:         * cite124†Sony PlayStation 4 Controller L128:         * cite125†Steam Controller (2015) L129:       * cite126†Steam Input Gamepad Emulation - Best Practices L130:       * cite127†Templates for In-Game Actions Files L131:       * cite128†Touch Menus L132:       * cite129†Uploading Steam Input Configs to Steam Workshop L133:     * cite130†Steam Inventory Service L134:       * cite131†Steam Inventory Item Accessories L135:       * cite132†Steam Inventory Item Dynamic Properties L136:       * cite133†Steam Inventory Item Store L137:       * cite134†Steam Inventory Item Tags L138:       * cite135†Steam Inventory Item Tools L139:       * cite136†Steam Inventory Schema L140:       * cite137†Steam Inventory Web Functions L141:     * cite138†Steam Keys L142:     * cite139†Steam Leaderboards L143:       * cite140†Step by Step: Leaderboards L144:     * cite141†Steam Overlay L145:     * cite142†Steam Playtest L146:     * cite143†Steam Remote Play L147:     * cite144†Steam Screenshots L148:     * cite145†Steam Timelines L149:     * cite146†Steam Voice L150:     * cite147†Steam Workshop L151:       * cite148†Steam Workshop Implementation Guide L152:       * cite149†Steam Workshop Item Tags L153:       * cite150†Steam Workshop Item Versioning L154:     * cite151†User Authentication and Ownership L155:     * cite152†Virtual Reality L156:       * cite153†SteamVR L157:       * cite154†Application Settings for Virtual Reality L158:       * cite155†SteamVR Input L159:       * cite156†OpenVR L160:       * cite157†SteamVR for Enterprise / Government Use L161:   * cite158†Finance L162:     * cite159†Developer Refund Reporting L163:     * cite160†Reporting and Payments L164:       * cite161†Reporting and Payments FAQ L165:     * cite162†Taxes FAQ L166:   * cite163†Sales and Marketing L167:     * cite164†Advertising on Steam L168:     * cite165†Best Practices, Marketing L169:     * cite166†Community Moderation L170:       * cite167†Adding Community Moderators L171:     * cite168†Curators and Curator Connect L172:     * cite169†Discounting L173:       * cite170†Daily Deals L174:       * cite171†Free to Keep (100% Discount) L175:       * cite172†Free Weekends L176:       * cite173†Seasonal Sales L177:     * cite174†Events and Announcements Tools L178:       * cite175†Events and Announcements Examples L179:       * cite176†Embeddable Widgets L180:       * cite177†Events and Announcements Review Step L181:       * cite178†Events and Announcements Visibility L182:       * cite179†Events and Announcements Visibility Stats Reporting L183:       * cite180†Event Type: Major Update L184:       * cite181†Event Type: Small Update / Patch Notes L185:       * cite182†Importing HTML L186:       * cite183†Sale Page Tools L187:         * cite184†Sale Page Tools -- Information for Partners L188:         * cite185†Sale Page Tools - Background Groupings L189:         * cite186†Sale Page Tools - Livestreaming (Broadcasting) L190:         * cite187†Sale Page Tools - Minimum Requirements L191:         * cite188†Sale Page Tools - Section Types L192:           * cite189†Sale Page Section: Apps And Bundles L193:     * cite190†Features And Tools, Marketing L194:     * cite191†Followers L195:     * cite192†Google Analytics L196:     * cite193†Points Shop Items L197:     * cite194†Profile Features L198:     * cite195†Steam Branding Guidelines L199:     * cite196†Steam Community Items L200:     * cite197†Store and Platform Traffic Reporting L201:     * cite198†Store Widget L202:     * cite199†Upcoming Steam Events L203:       * cite200†Steam Next Fest L204:         * cite201†Steam Next Fest - Tips L205:         * cite202†Steam Next Fest: February 2027 L206:         * cite203†Steam Next Fest: June 2027 L207:         * cite204†Steam Next Fest: October 2026 L208:       * cite205†Steam Themed Sale Events L209:         * cite206†Steam Auto Battler RPG Fest 2026 L210:         * cite207†Steam Cooking Fest 2026 L211:         * cite208†Steam Couch Co-Op Fest 2027 L212:         * cite209†Steam Desktop Companion Fest 2027 L213:         * cite210†Steam Dinos vs. Robots Fest 2027 L214:         * cite211†Steam Fighting Fest 2027 L215:         * cite212†Steam Medieval Fest 2026 L216:         * cite213†Steam Mountaineering Fest 2027 L217:         * cite214†Steam Party-Based RPG Fest 2026 L218:         * cite215†Steam Programming Fest 2026 L219:         * cite216†Steam PvE Survival Crafting Fest 2026 L220:         * cite217†Steam Racing Fest 2027 L221:         * cite218†Steam Real-Time Strategy Fest 2027 L222:         * cite219†Steam Rhythm Fest 2027 L223:         * cite220†Steam Scream V Fest L224:         * cite221†Steam Sheep Fest 2027 L225:         * cite222†Steam Shop Keeper Fest 2027 L226:         * cite223†Steam Witch Fest 2027 L227:     * cite224†UTM Analytics L228:     * cite225†Visibility on Steam L229:       * cite226†Update Visibility Rounds L230:     * cite227†Wishlists L231:       * cite228†Wishlist Reporting L232:   * cite229†Steamworks SDK L233:     * cite230†Creating and using InstallScripts L234:     * cite231†Creating a retail and "Gold Master" disk L235:     * cite232†Steamworks API Overview L236:       * cite233†Debugging the Steamworks API L237:       * cite234†Steamworks API Example Application (SpaceWar) L238:     * cite235†Updating Game Build L239:       * cite236†Partial Depot Update Instructions L240:       * cite237†Tip - Renaming a live exe L241:     * cite238†Uploading to Steam L242:       * cite239†Distributing Open Source Applications on Steam L243:       * cite240†Distributing Source Engine Games / Mods L244:       * cite241†Distributing Your Dedicated Game Server L245:       * cite242†SteamPipe Local Content Server L246:   * cite243†Web API Overview L247:     * cite244†Authentication using Web API Keys L248:     * cite245†Error Codes &amp;amp; Responses L249:     * cite246†OAuth L250:   * cite247†Accessibility Features L251:   * cite248†Steam Hardware L252:     * cite249†Getting your game ready for Steam Deck and Steam Machine L253:     * cite250†How to debug Windows games on Steam Deck and Steam Machine L254:     * cite251†How to load and run games on Steam Deck and Steam Machine L255:     * cite252†Steam Deck L256:       * cite253†Social Media Templates L257:       * cite254†Steam Deck Brand Guidelines and Logos L258:       * cite255†Steam Deck Developer Kits L259:       * cite256†Steam Deck FAQ L260:       * cite257†Steam Deck SVG Line Art L261:       * cite258†Steamworks Virtual Conference: Steam Deck - Nov 12th 2021 L262:     * cite259†Steam Deck and Steam Machine Compatibility Review L263:       * cite260†Steam Deck Verified Landing Pages L264:     * cite261†Steam Frame L265:       * cite262†Connecting adb to Lepton L266:       * cite263†How to load and run games on Steam Frame L267:       * cite264†How to upload Android APKs to Steam L268:       * cite265†OpenXR Game Engine Integrations L269:         * cite266†Custom Engines L270:         * cite267†Godot L271:         * cite268†Unity L272:         * cite269†Unreal Engine L273:       * cite270†Setting up your Steam Frame for development L274:       * cite271†Steam Frame Controllers L275:       * cite272†Steam Frame Debugging L276:       * cite273†Steam Frame Standalone Compatibility Review Process L277:         * cite274†Performance Assessment Overlay (VR titles) L278:       * cite275†Suggesting default user settings for your game L279:       * cite276†What games can run standalone on Steam Frame L280:     * cite277†Steam Hardware and Proton L281:     * cite278†Steam Machine L282:   * cite279†Steam PC Café Program L283:     * cite280†Licensees L284:       * cite281†PC Café Requirements and Sign Up Instructions L285:       * cite282†Getting Started L286:         * cite283†Setup instructions for the PC Café model (incl. PC Café Server and Content Cache) L287:         * cite284†Setup instructions for the VR arcade model --------------------------------------------------------------------------------
Web API Overview (Steamworks Documentation) (https://partner.steamgames.com/doc/webapi_overview)
citeturn2view1 [wordlim: 200] Crawled: today; Content type: text/html; Source: open({"ref_id":"https://partner.steamgames.com/doc/webapi_overview","lineno":null}); Total lines: 449

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json,concurrent.futures\nfrom pathl...)

Script completed
Wall time 1.0 seconds
Output:

{"chunk_id":"f701da","wall_time_seconds":0.879145642,"exit_code":0,"original_token_count":800,"output":"{\"name\": \"browse\", \"status\": 200, \"bytes\": 30325, \"keys\": [\"response\"], \"head\": \"{'response': {'store_items': [{'item_type': 0, 'id': 620, 'success': 1, 'visible': True, 'name': 'Portal 2', 'store_url_path': 'app/620/Portal_2', 'store_url_slug': 'Portal_2', 'appid': 620, 'type': 0, 'tagids': [4182, 1625, 1664, 3839, 5923, 1742, 5537, 4136, 7208, 5395, 4106, 1685, 19, 1663, 3968, 3942, 8122, 5794, 1719, 4166], 'categories': {'supported_player_categoryids': [2, 1, 9, 38, 39, 24], 'feature_categoryids': [22, 29, 13, 30, 51, 67, 68, 69, 70, 74, 79, 23, 15, 17, 14, 41, 42, 43, 44, 62], 'controller_categoryids': [28, 55, 56, 57, 58, 59]}, 'reviews': {'summary_filtered': {'review_count': 389870, 'percent_positive': 98, 'review_score': 9, 'review_score_label': 'Overwhelmingly Positive'}, 'summary_language_specific': {'review_count': 173386, 'percent_positive': 98, 'review_score': 9, 'review_score_label': 'Overwhelmingly Positive'}}, 'basic_info': {'short_description': 'The \\\"Perpetual Testing Initiative\\\" has been expanded to allow you to design co-op puzzles for you and your friends!', 'publishers': [{'name': 'Valve', 'creator_clan_account_id': 4}], 'developers': [{'name': 'Valve', 'creator_clan_account_id': 4}]}, 'tags': [{'tagid': 4182, 'weight': 603}, {'tagid': 1625, 'weight': 588}, {'tagid': 1664, 'weight': 585}, {'tagid': 3839, 'weight': 560}, {'tagid': 5923, 'weight': 558}, {'tagid': 1742, 'weight': 555}, {'tagid': 5537, 'weight': 549}, {'tagid': 4136, 'weight': 542}, {'tagid': 7208, 'weight': 539}, {'tagid': 5395, 'weight': 532}, {'tagid': 4106, 'weight': 517}, {'tagid': 1685, 'weight': 517}, {'tagid': 19, 'weight': 513}, {'tagid': 1663, 'weight': 512}, {'tagid': 3968, 'weight': 403}, {'tagid': 3942, 'weight': 391}, {'tagid': 8122, 'weight': 386}, {'tagid': 5794, 'weight': 382}, {'tagid': 1719, 'weight': 381}, {'tagid': 4166, 'weight': 378}], 'assets': {'asset_url_format': 'steam/apps/620/${FILENAME}?t=1745363004', 'main_capsule': 'capsule_616x353.jpg', 'small_capsule': 'capsule_231x87.jpg', 'header': 'header.jpg', 'hero_capsule': 'hero_capsule.jpg', 'library_capsule': 'library_600x900.jpg', 'library_capsule_2x': 'library_600x900_2x.jpg', 'library_hero': 'library_hero.jpg', 'community_icon': '25a5a16b2423bf7487ac5340b5b0948cef48c5f8', 'page_ba\"}\n{\"name\": \"search500\", \"status\": 200, \"bytes\": 195848, \"keys\": [\"success\", \"results_html\", \"total_count\", \"start\"], \"total\": 184682, \"rows\": 100, \"ids\": [\"396420\", \"3665180\", \"1356840\"]}\n{\"name\": \"search_tail\", \"status\": 200, \"bytes\": 199344, \"keys\": [\"success\", \"results_html\", \"total_count\", \"start\"], \"total\": 184682, \"rows\": 100, \"ids\": [\"1982730\", \"2055730\", \"3741950\"]}\n{\"name\": \"search_adult\", \"status\": 200, \"bytes\": 218380, \"keys\": [\"success\", \"results_html\", \"total_count\", \"start\"], \"total\": 12693, \"rows\": 100, \"ids\": [\"3244680\", \"439260\", \"2388360\"]}\n{\"name\": \"multidetails\", \"status\": 400, \"bytes\": 4, \"head\": \"null\"}\n{\"name\": \"protobuf\", \"status\": 200, \"bytes\": 21108, \"head\": \"import \\\"steammessages_base.proto\\\";\\nimport \\\"steammessages_unified_base.steamclient.proto\\\";\\nimport \\\"enums_productinfo.proto\\\";\\nimport \\\"enums.proto\\\";\\nimport \\\"contenthubs.proto\\\";\\n\\noption cc_generic_service\"}\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport json,requests\nr=...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"af7dcf","wall_time_seconds":0.206181599,"exit_code":0,"original_token_count":6623,"output":"message StoreBrowseContext {\n\toptional string language = 1;\n\toptional int32 elanguage = 2;\n\toptional string country_code = 3;\n}\n\nmessage StoreBrowseItemDataRequest {\n\toptional bool include_assets = 1;\n\toptional bool include_release = 2;\n\toptional bool include_platforms = 3;\n\toptional bool include_all_purchase_options = 4;\n\toptional bool include_screenshots = 5;\n\toptional bool include_trailers = 6;\n\toptional bool include_ratings = 7;\n\toptional int32 include_tag_count = 8;\n\toptional bool include_reviews = 9;\n\toptional bool include_basic_info = 10;\n\toptional bool include_supported_languages = 11;\n\toptional bool include_full_description = 12;\n\toptional bool include_included_items = 13;\n\toptional .StoreBrowseItemDataRequest included_item_data_request = 14;\n\toptional bool include_assets_without_overrides = 15;\n\toptional bool apply_user_filters = 16;\n\toptional bool include_links = 17;\n}\n\nmessage CStoreBrowse_GetItems_Request {\n\trepeated .StoreItemID ids = 1;\n\toptional .StoreBrowseContext context = 2;\n\toptional .StoreBrowseItemDataRequest data_request = 3;\n}\n\nmessage StoreItem {\n\tmessage Demo {\n\t\toptional uint32 appid = 1;\n\t\toptional string label = 2;\n\t\toptional bool show_above_purchase = 3;\n\t}\n\n\tmessage Playtest {\n\t\toptional uint32 appid = 1;\n\t\toptional bool is_open = 2;\n\t}\n\n\tmessage RelatedF2P {\n\t\toptional uint32 appid = 1;\n\t\toptional string header_text = 2;\n\t\toptional string description_text = 3;\n\t}\n\n\tmessage RelatedItems {\n\t\toptional uint32 parent_appid = 1;\n\t\trepeated uint32 demo_appid = 2;\n\t\trepeated uint32 standalone_demo_appid = 3;\n\t\trepeated .StoreItem.Demo demos = 4;\n\t\trepeated .StoreItem.Demo standalone_demos = 5;\n\t\trepeated .StoreItem.Playtest playtests = 6;\n\t\toptional .StoreItem.RelatedF2P related_f2p = 7;\n\t\trepeated uint32 dlc_parent_appids = 9;\n\t}\n\n\tmessage IncludedItems {\n\t\trepeated .StoreItem included_apps = 1;\n\t\trepeated .StoreItem included_packages = 2;\n\t\trepeated .StoreItem included_bundles = 3;\n\t}\n\n\tmessage Categories {\n\t\trepeated uint32 supported_player_categoryids = 2;\n\t\trepeated uint32 feature_categoryids = 3;\n\t\trepeated uint32 controller_categoryids = 4;\n\t}\n\n\tmessage Reviews {\n\t\tmessage StoreReviewSummary {\n\t\t\toptional uint32 review_count = 1;\n\t\t\toptional int32 percent_positive = 2;\n\t\t\toptional .EUserReviewScore review_score = 3 [default = k_EUserReviewScore_None];\n\t\t\toptional string review_score_label = 4;\n\t\t}\n\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_filtered = 1;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_unfiltered = 2;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_language_specific = 3;\n\t}\n\n\tmessage BasicInfo {\n\t\tmessage CreatorHomeLink {\n\t\t\toptional string name = 1;\n\t\t\toptional uint32 creator_clan_account_id = 2;\n\t\t}\n\n\t\toptional string short_description = 1;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink publishers = 2;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink developers = 3;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink franchises = 4;\n\t\toptional string capsule_headline = 5;\n\t}\n\n\tmessage Tag {\n\t\toptional uint32 tagid = 1;\n\t\toptional uint32 weight = 2;\n\t}\n\n\tmessage Assets {\n\t\toptional string asset_url_format = 1;\n\t\toptional string main_capsule = 2;\n\t\toptional string main_capsule_2x = 18;\n\t\toptional string small_capsule = 3;\n\t\toptional string small_capsule_2x = 19;\n\t\toptional string header = 4;\n\t\toptional string header_2x = 20;\n\t\toptional string package_header = 5;\n\t\toptional string page_background = 6;\n\t\toptional string hero_capsule = 7;\n\t\toptional string hero_capsule_2x = 8;\n\t\toptional string library_capsule = 9;\n\t\toptional string library_capsule_2x = 10;\n\t\toptional string library_hero = 11;\n\t\toptional string library_hero_2x = 12;\n\t\toptional string community_icon = 13;\n\t\toptional string clan_avatar = 14;\n\t\toptional string page_background_path = 15;\n\t\toptional string raw_page_background = 16;\n\t\toptional string edition_comparison = 17;\n\t}\n\n\tmessage ReleaseInfo {\n\t\toptional uint32 steam_release_date = 1;\n\t\toptional uint32 original_release_date = 2;\n\t\toptional uint32 original_steam_release_date = 3;\n\t\toptional uint32 release_from_early_access_date = 11;\n\t\toptional uint32 release_from_early_access_style = 12;\n\t\toptional bool is_coming_soon = 4;\n\t\toptiona\nmessage StoreBrowseItemDataRequest {\n\toptional bool include_assets = 1;\n\toptional bool include_release = 2;\n\toptional bool include_platforms = 3;\n\toptional bool include_all_purchase_options = 4;\n\toptional bool include_screenshots = 5;\n\toptional bool include_trailers = 6;\n\toptional bool include_ratings = 7;\n\toptional int32 include_tag_count = 8;\n\toptional bool include_reviews = 9;\n\toptional bool include_basic_info = 10;\n\toptional bool include_supported_languages = 11;\n\toptional bool include_full_description = 12;\n\toptional bool include_included_items = 13;\n\toptional .StoreBrowseItemDataRequest included_item_data_request = 14;\n\toptional bool include_assets_without_overrides = 15;\n\toptional bool apply_user_filters = 16;\n\toptional bool include_links = 17;\n}\n\nmessage CStoreBrowse_GetItems_Request {\n\trepeated .StoreItemID ids = 1;\n\toptional .StoreBrowseContext context = 2;\n\toptional .StoreBrowseItemDataRequest data_request = 3;\n}\n\nmessage StoreItem {\n\tmessage Demo {\n\t\toptional uint32 appid = 1;\n\t\toptional string label = 2;\n\t\toptional bool show_above_purchase = 3;\n\t}\n\n\tmessage Playtest {\n\t\toptional uint32 appid = 1;\n\t\toptional bool is_open = 2;\n\t}\n\n\tmessage RelatedF2P {\n\t\toptional uint32 appid = 1;\n\t\toptional string header_text = 2;\n\t\toptional string description_text = 3;\n\t}\n\n\tmessage RelatedItems {\n\t\toptional uint32 parent_appid = 1;\n\t\trepeated uint32 demo_appid = 2;\n\t\trepeated uint32 standalone_demo_appid = 3;\n\t\trepeated .StoreItem.Demo demos = 4;\n\t\trepeated .StoreItem.Demo standalone_demos = 5;\n\t\trepeated .StoreItem.Playtest playtests = 6;\n\t\toptional .StoreItem.RelatedF2P related_f2p = 7;\n\t\trepeated uint32 dlc_parent_appids = 9;\n\t}\n\n\tmessage IncludedItems {\n\t\trepeated .StoreItem included_apps = 1;\n\t\trepeated .StoreItem included_packages = 2;\n\t\trepeated .StoreItem included_bundles = 3;\n\t}\n\n\tmessage Categories {\n\t\trepeated uint32 supported_player_categoryids = 2;\n\t\trepeated uint32 feature_categoryids = 3;\n\t\trepeated uint32 controller_categoryids = 4;\n\t}\n\n\tmessage Reviews {\n\t\tmessage StoreReviewSummary {\n\t\t\toptional uint32 review_count = 1;\n\t\t\toptional int32 percent_positive = 2;\n\t\t\toptional .EUserReviewScore review_score = 3 [default = k_EUserReviewScore_None];\n\t\t\toptional string review_score_label = 4;\n\t\t}\n\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_filtered = 1;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_unfiltered = 2;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_language_specific = 3;\n\t}\n\n\tmessage BasicInfo {\n\t\tmessage CreatorHomeLink {\n\t\t\toptional string name = 1;\n\t\t\toptional uint32 creator_clan_account_id = 2;\n\t\t}\n\n\t\toptional string short_description = 1;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink publishers = 2;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink developers = 3;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink franchises = 4;\n\t\toptional string capsule_headline = 5;\n\t}\n\n\tmessage Tag {\n\t\toptional uint32 tagid = 1;\n\t\toptional uint32 weight = 2;\n\t}\n\n\tmessage Assets {\n\t\toptional string asset_url_format = 1;\n\t\toptional string main_capsule = 2;\n\t\toptional string main_capsule_2x = 18;\n\t\toptional string small_capsule = 3;\n\t\toptional string small_capsule_2x = 19;\n\t\toptional string header = 4;\n\t\toptional string header_2x = 20;\n\t\toptional string package_header = 5;\n\t\toptional string page_background = 6;\n\t\toptional string hero_capsule = 7;\n\t\toptional string hero_capsule_2x = 8;\n\t\toptional string library_capsule = 9;\n\t\toptional string library_capsule_2x = 10;\n\t\toptional string library_hero = 11;\n\t\toptional string library_hero_2x = 12;\n\t\toptional string community_icon = 13;\n\t\toptional string clan_avatar = 14;\n\t\toptional string page_background_path = 15;\n\t\toptional string raw_page_background = 16;\n\t\toptional string edition_comparison = 17;\n\t}\n\n\tmessage ReleaseInfo {\n\t\toptional uint32 steam_release_date = 1;\n\t\toptional uint32 original_release_date = 2;\n\t\toptional uint32 original_steam_release_date = 3;\n\t\toptional uint32 release_from_early_access_date = 11;\n\t\toptional uint32 release_from_early_access_style = 12;\n\t\toptional bool is_coming_soon = 4;\n\t\toptional bool is_preload = 5;\n\t\toptional string custom_release_date_message = 6;\n\t\toptional bool is_abridged_release_date = 7;\n\t\toptiona\nmessage StoreItemID {\n\toptional uint32 appid = 1;\n\toptional uint32 packageid = 2;\n\toptional uint32 bundleid = 3;\n\toptional uint32 tagid = 4;\n\toptional uint32 creatorid = 5;\n\toptional uint32 hubcategoryid = 6;\n}\n\nmessage StoreBrowseContext {\n\toptional string language = 1;\n\toptional int32 elanguage = 2;\n\toptional string country_code = 3;\n}\n\nmessage StoreBrowseItemDataRequest {\n\toptional bool include_assets = 1;\n\toptional bool include_release = 2;\n\toptional bool include_platforms = 3;\n\toptional bool include_all_purchase_options = 4;\n\toptional bool include_screenshots = 5;\n\toptional bool include_trailers = 6;\n\toptional bool include_ratings = 7;\n\toptional int32 include_tag_count = 8;\n\toptional bool include_reviews = 9;\n\toptional bool include_basic_info = 10;\n\toptional bool include_supported_languages = 11;\n\toptional bool include_full_description = 12;\n\toptional bool include_included_items = 13;\n\toptional .StoreBrowseItemDataRequest included_item_data_request = 14;\n\toptional bool include_assets_without_overrides = 15;\n\toptional bool apply_user_filters = 16;\n\toptional bool include_links = 17;\n}\n\nmessage CStoreBrowse_GetItems_Request {\n\trepeated .StoreItemID ids = 1;\n\toptional .StoreBrowseContext context = 2;\n\toptional .StoreBrowseItemDataRequest data_request = 3;\n}\n\nmessage StoreItem {\n\tmessage Demo {\n\t\toptional uint32 appid = 1;\n\t\toptional string label = 2;\n\t\toptional bool show_above_purchase = 3;\n\t}\n\n\tmessage Playtest {\n\t\toptional uint32 appid = 1;\n\t\toptional bool is_open = 2;\n\t}\n\n\tmessage RelatedF2P {\n\t\toptional uint32 appid = 1;\n\t\toptional string header_text = 2;\n\t\toptional string description_text = 3;\n\t}\n\n\tmessage RelatedItems {\n\t\toptional uint32 parent_appid = 1;\n\t\trepeated uint32 demo_appid = 2;\n\t\trepeated uint32 standalone_demo_appid = 3;\n\t\trepeated .StoreItem.Demo demos = 4;\n\t\trepeated .StoreItem.Demo standalone_demos = 5;\n\t\trepeated .StoreItem.Playtest playtests = 6;\n\t\toptional .StoreItem.RelatedF2P related_f2p = 7;\n\t\trepeated uint32 dlc_parent_appids = 9;\n\t}\n\n\tmessage IncludedItems {\n\t\trepeated .StoreItem included_apps = 1;\n\t\trepeated .StoreItem included_packages = 2;\n\t\trepeated .StoreItem included_bundles = 3;\n\t}\n\n\tmessage Categories {\n\t\trepeated uint32 supported_player_categoryids = 2;\n\t\trepeated uint32 feature_categoryids = 3;\n\t\trepeated uint32 controller_categoryids = 4;\n\t}\n\n\tmessage Reviews {\n\t\tmessage StoreReviewSummary {\n\t\t\toptional uint32 review_count = 1;\n\t\t\toptional int32 percent_positive = 2;\n\t\t\toptional .EUserReviewScore review_score = 3 [default = k_EUserReviewScore_None];\n\t\t\toptional string review_score_label = 4;\n\t\t}\n\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_filtered = 1;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_unfiltered = 2;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_language_specific = 3;\n\t}\n\n\tmessage BasicInfo {\n\t\tmessage CreatorHomeLink {\n\t\t\toptional string name = 1;\n\t\t\toptional uint32 creator_clan_account_id = 2;\n\t\t}\n\n\t\toptional string short_description = 1;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink publishers = 2;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink developers = 3;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink franchises = 4;\n\t\toptional string capsule_headline = 5;\n\t}\n\n\tmessage Tag {\n\t\toptional uint32 tagid = 1;\n\t\toptional uint32 weight = 2;\n\t}\n\n\tmessage Assets {\n\t\toptional string asset_url_format = 1;\n\t\toptional string main_capsule = 2;\n\t\toptional string main_capsule_2x = 18;\n\t\toptional string small_capsule = 3;\n\t\toptional string small_capsule_2x = 19;\n\t\toptional string header = 4;\n\t\toptional string header_2x = 20;\n\t\toptional string package_header = 5;\n\t\toptional string page_background = 6;\n\t\toptional string hero_capsule = 7;\n\t\toptional string hero_capsule_2x = 8;\n\t\toptional string library_capsule = 9;\n\t\toptional string library_capsule_2x = 10;\n\t\toptional string library_hero = 11;\n\t\toptional string library_hero_2x = 12;\n\t\toptional string community_icon = 13;\n\t\toptional string clan_avatar = 14;\n\t\toptional string page_background_path = 15;\n\t\toptional string raw_page_background = 16;\n\t\toptional string edition_comparison = 17;\n\t}\n\n\tmessage ReleaseInfo {\n\t\toptional uint32 steam_release_date = 1;\n\t\toptional uint32 original_release_date \nmessage CStoreBrowse_GetItems_Request {\n\trepeated .StoreItemID ids = 1;\n\toptional .StoreBrowseContext context = 2;\n\toptional .StoreBrowseItemDataRequest data_request = 3;\n}\n\nmessage StoreItem {\n\tmessage Demo {\n\t\toptional uint32 appid = 1;\n\t\toptional string label = 2;\n\t\toptional bool show_above_purchase = 3;\n\t}\n\n\tmessage Playtest {\n\t\toptional uint32 appid = 1;\n\t\toptional bool is_open = 2;\n\t}\n\n\tmessage RelatedF2P {\n\t\toptional uint32 appid = 1;\n\t\toptional string header_text = 2;\n\t\toptional string description_text = 3;\n\t}\n\n\tmessage RelatedItems {\n\t\toptional uint32 parent_appid = 1;\n\t\trepeated uint32 demo_appid = 2;\n\t\trepeated uint32 standalone_demo_appid = 3;\n\t\trepeated .StoreItem.Demo demos = 4;\n\t\trepeated .StoreItem.Demo standalone_demos = 5;\n\t\trepeated .StoreItem.Playtest playtests = 6;\n\t\toptional .StoreItem.RelatedF2P related_f2p = 7;\n\t\trepeated uint32 dlc_parent_appids = 9;\n\t}\n\n\tmessage IncludedItems {\n\t\trepeated .StoreItem included_apps = 1;\n\t\trepeated .StoreItem included_packages = 2;\n\t\trepeated .StoreItem included_bundles = 3;\n\t}\n\n\tmessage Categories {\n\t\trepeated uint32 supported_player_categoryids = 2;\n\t\trepeated uint32 feature_categoryids = 3;\n\t\trepeated uint32 controller_categoryids = 4;\n\t}\n\n\tmessage Reviews {\n\t\tmessage StoreReviewSummary {\n\t\t\toptional uint32 review_count = 1;\n\t\t\toptional int32 percent_positive = 2;\n\t\t\toptional .EUserReviewScore review_score = 3 [default = k_EUserReviewScore_None];\n\t\t\toptional string review_score_label = 4;\n\t\t}\n\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_filtered = 1;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_unfiltered = 2;\n\t\toptional .StoreItem.Reviews.StoreReviewSummary summary_language_specific = 3;\n\t}\n\n\tmessage BasicInfo {\n\t\tmessage CreatorHomeLink {\n\t\t\toptional string name = 1;\n\t\t\toptional uint32 creator_clan_account_id = 2;\n\t\t}\n\n\t\toptional string short_description = 1;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink publishers = 2;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink developers = 3;\n\t\trepeated .StoreItem.BasicInfo.CreatorHomeLink franchises = 4;\n\t\toptional string capsule_headline = 5;\n\t}\n\n\tmessage Tag {\n\t\toptional uint32 tagid = 1;\n\t\toptional uint32 weight = 2;\n\t}\n\n\tmessage Assets {\n\t\toptional string asset_url_format = 1;\n\t\toptional string main_capsule = 2;\n\t\toptional string main_capsule_2x = 18;\n\t\toptional string small_capsule = 3;\n\t\toptional string small_capsule_2x = 19;\n\t\toptional string header = 4;\n\t\toptional string header_2x = 20;\n\t\toptional string package_header = 5;\n\t\toptional string page_background = 6;\n\t\toptional string hero_capsule = 7;\n\t\toptional string hero_capsule_2x = 8;\n\t\toptional string library_capsule = 9;\n\t\toptional string library_capsule_2x = 10;\n\t\toptional string library_hero = 11;\n\t\toptional string library_hero_2x = 12;\n\t\toptional string community_icon = 13;\n\t\toptional string clan_avatar = 14;\n\t\toptional string page_background_path = 15;\n\t\toptional string raw_page_background = 16;\n\t\toptional string edition_comparison = 17;\n\t}\n\n\tmessage ReleaseInfo {\n\t\toptional uint32 steam_release_date = 1;\n\t\toptional uint32 original_release_date = 2;\n\t\toptional uint32 original_steam_release_date = 3;\n\t\toptional uint32 release_from_early_access_date = 11;\n\t\toptional uint32 release_from_early_access_style = 12;\n\t\toptional bool is_coming_soon = 4;\n\t\toptional bool is_preload = 5;\n\t\toptional string custom_release_date_message = 6;\n\t\toptional bool is_abridged_release_date = 7;\n\t\toptional string coming_soon_display = 8;\n\t\toptional bool is_early_access = 10;\n\t\toptional uint32 mac_release_date = 20;\n\t\toptional uint32 linux_release_date = 21;\n\t\toptional bool limited_launch_active = 22;\n\t\toptional uint32 advance_access_date = 23;\n\t}\n\n\tmessage Platforms {\n\t\tmessage VRSupport {\n\t\t\toptional bool vrhmd = 1;\n\t\t\toptional bool vrhmd_only = 2;\n\t\t\toptional bool htc_vive = 40;\n\t\t\toptional bool oculus_rift = 41;\n\t\t\toptional bool windows_mr = 42;\n\t\t\toptional bool valve_index = 43;\n\t\t}\n\n\t\toptional bool windows = 1;\n\t\toptional bool mac = 2;\n\t\toptional bool steamos_linux = 3;\n\t\toptional .StoreItem.Platforms.VRSupport vr_support = 10;\n\t\toptional .ESteamDeckCompatibilityCategory steam_deck_compat_category = 11 [default = k_ESteamDeckCompatibilityCategory_Unk\nservice StoreBrowse {\n\trpc GetItems (.CStoreBrowse_GetItems_Request) returns (.CStoreBrowse_GetItems_Response);\n\trpc GetStoreCategories (.CStoreBrowse_GetStoreCategories_Request) returns (.CStoreBrowse_GetStoreCategories_Response);\n\trpc GetContentHubConfig (.CStoreBrowse_GetContentHubConfig_Request) returns (.CStoreBrowse_GetContentHubConfig_Response);\n\trpc GetPriceStops (.CStoreBrowse_GetPriceStops_Request) returns (.CStoreBrowse_GetPriceStops_Response);\n\trpc GetDLCForApps (.CStoreBrowse_GetDLCForApps_Request) returns (.CStoreBrowse_GetDLCForApps_Response);\n\trpc GetDLCForAppsSolr (.CStoreBrowse_GetDLCForAppsSolr_Request) returns (.CStoreBrowse_GetDLCForAppsSolr_Response);\n\trpc GetHardwareItems (.CStoreBrowse_GetHardwareItems_Request) returns (.CStoreBrowse_GetHardwareItems_Response);\n}\n\nassets {\"asset_url_format\": \"steam/apps/620/${FILENAME}?t=1745363004\", \"main_capsule\": \"capsule_616x353.jpg\", \"small_capsule\": \"capsule_231x87.jpg\", \"header\": \"header.jpg\", \"hero_capsule\": \"hero_capsule.jpg\", \"library_capsule\": \"library_600x900.jpg\", \"library_capsule_2x\": \"library_600x900_2x.jpg\", \"library_hero\": \"library_hero.jpg\", \"community_icon\": \"25a5a16b2423bf7487ac5340b5b0948cef48c5f8\", \"page_background_path\": \"app/620?t=1745363004\", \"last_modified\": 1745363004}\nscreenshots {\"all_ages_screenshots\": [{\"filename\": \"steam/apps/620/ss_f3f6787d74739d3b2ec8a484b5c994b3d31ef325.jpg?t=1745363004\", \"ordinal\": 1}, {\"filename\": \"steam/apps/620/ss_6a4f5afdaa98402de9cf0b59fed27bab3256a6f4.jpg?t=1745363004\", \"ordinal\": 2}, {\"filename\": \"steam/apps/620/ss_0cdd90fafc160b52d08b303d205f9fd4e83cf164.jpg?t=1745363004\", \"ordinal\": 3}, {\"filename\": \"steam/apps/620/ss_ec35a739b4b33270eb170d9e561c5b016cba50a6.jpg?t=1745363004\", \"ordinal\": 4}, {\"filename\": \"steam/apps/620/ss_3d13161104a04603a0524536770c5f74626db4c0.jpg?t=1745363004\", \"ordinal\": 5}, {\"filename\": \"steam/apps/620/ss_8a772608d29ffd56ac013d2ac7c4388b96e87a21.jpg?t=1745363004\", \"ordinal\": 6}, {\"filename\": \"steam/apps/620/ss_358127df30a766a1516ad139083c2bcec3fe0975.jpg?t=1745363004\", \"ordinal\": 7}, {\"filename\": \"steam/apps/620/ss_410c7955c3cc8ca4a5e3c81daa214f534c9aabc8.jpg?t=1745363004\", \"ordinal\": 8}, {\"filename\": \"steam/apps/620/ss_0e16bceacb6616a5ca4bc4ba4d28c7a0d06b671c.jpg?t=1745363004\", \"ordinal\": 9}, {\"filename\": \"steam/apps/620/ss_d8f172249d6e89999c3692bf2c380921f197fd82.jpg?t=1745363004\", \"ordinal\": 10}, {\"filename\": \"steam/apps/620/ss_fe9782ea3b43ef7af37b18e0a5c5f7bdc9c21f12.jpg?t=1745363004\", \"ordinal\": 11}, {\"filename\": \"steam/apps/620/ss_3858536cbc0a07dfbe36e8f87b3f08bf3be45e54.jpg?t=1745363004\", \"ordinal\": 12}]}\nrelease {\"steam_release_date\": 1303186800}\nsupported_languages [{\"elanguage\": 0, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": true, \"subtitles\": true}, {\"elanguage\": 2, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": true, \"subtitles\": true}, {\"elanguage\": 1, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": true, \"subtitles\": true}, {\"elanguage\": 5, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": true, \"subtitles\": true}, {\"elanguage\": 19, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 13, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 14, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 15, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 18, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 3, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 10, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 4, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 16, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 12, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 11, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 20, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 8, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": true, \"subtitles\": true}, {\"elanguage\": 6, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 17, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 9, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 7, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 21, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true}, {\"elanguage\": 23, \"eadditionallanguage\": -1, \"supported\": true, \"full_audio\": false, \"subtitles\": true},\nplatforms {\"windows\": true, \"steamos_linux\": true, \"vr_support\": {}, \"steam_deck_compat_category\": 3, \"steam_os_compat_category\": 2, \"steam_frame_compat_category\": 3, \"steam_machine_compat_category\": 3}\npurchase_options [{\"packageid\": 7877, \"purchase_option_name\": \"Portal 2\", \"final_price_in_cents\": \"999\", \"formatted_final_price\": \"$9.99\", \"user_can_purchase_as_gift\": true, \"hide_discount_pct_for_compliance\": false, \"included_game_count\": 1, \"must_purchase_as_set\": false, \"package_group\": \"default\", \"price_cannot_be_displayed_as_discount\": false}, {\"packageid\": 8187, \"purchase_option_name\": \"Portal 2 - The Final Hours\", \"final_price_in_cents\": \"199\", \"formatted_final_price\": \"$1.99\", \"user_can_purchase_as_gift\": true, \"hide_discount_pct_for_compliance\": false, \"included_game_count\": 1, \"must_purchase_as_set\": false, \"package_group\": \"default\", \"price_cannot_be_displayed_as_discount\": false}, {\"bundleid\": 234, \"purchase_option_name\": \"Portal Bundle\", \"final_price_in_cents\": \"1498\", \"formatted_final_price\": \"$14.98\", \"bundle_discount_pct\": 25, \"price_before_bundle_discount\": \"1998\", \"formatted_price_before_bundle_discount\": \"$19.98\", \"user_can_purchase_as_gift\": true, \"hide_discount_pct_for_compliance\": false, \"included_game_count\": 2, \"must_purchase_as_set\": false, \"package_group\": \"default\", \"price_cannot_be_displayed_as_discount\": false}, {\"bundleid\": 232, \"purchase_option_name\": \"Valve Complete Pack\", \"final_price_in_cents\": \"11684\", \"formatted_final_price\": \"$116.84\", \"bundle_discount_pct\": 10, \"price_before_bundle_discount\": \"12984\", \"formatted_price_before_bundle_discount\": \"$129.84\", \"user_can_purchase_as_gift\": true, \"hide_discount_pct_for_compliance\": false, \"included_game_count\": 20, \"must_purchase_as_set\": false, \"package_group\": \"default\", \"price_cannot_be_displayed_as_discount\": false}]\nbest_purchase_option {\"packageid\": 7877, \"purchase_option_name\": \"Portal 2\", \"final_price_in_cents\": \"999\", \"formatted_final_price\": \"$9.99\", \"user_can_purchase_as_gift\": true, \"hide_discount_pct_for_compliance\": false, \"included_game_count\": 1, \"must_purchase_as_set\": false, \"package_group\": \"default\", \"price_cannot_be_displayed_as_discount\": false}\ntrailers {\"highlights\": [{\"trailer_name\": \"Portal 2 E3 Demo (Excursion Funnels)\", \"trailer_url_format\": \"steam/apps/${FILENAME}?t=1682715616\", \"trailer_category\": 1, \"microtrailer\": [{\"filename\": \"620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/microtrailer.webm\", \"type\": \"video/webm\"}, {\"filename\": \"620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/microtrailer.mp4\", \"type\": \"video/mp4\"}], \"adaptive_trailers\": [{\"cdn_path\": \"620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/dash_av1.mpd\", \"encoding\": \"dash_av1\"}, {\"cdn_path\": \"620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/dash_h264.mpd\", \"encoding\": \"dash_h264\"}, {\"cdn_path\": \"620/3746/0f4bee66d490b637707ac4fca3e850f2cc2d3b2a/1750108721/hls_264_master.m3u8\", \"encoding\": \"hls_h264\"}], \"screenshot_medium\": \"5787/movie.293x165.jpg\", \"trailer_base_id\": 3746, \"all_ages\": true}], \"other_trailers\": [{\"trailer_name\": \"Portal 2 Remix Trailer\", \"trailer_url_format\": \"steam/apps/${FILENAME}?t=1683129612\", \"trailer_category\": 3, \"microtrailer\": [{\"filename\": \"620/5096/2bbd128dd4e1d90aa6f688fb91e6665a301f48c5/1750108756/microtrailer.webm\", \"type\": \"video/webm\"}, {\"filename\": \"620/5096/2bbd128dd4e1d90aa6f688fb91e6665a301f48c5/1750108756/microtrailer.mp4\", \"type\": \"video/mp4\"}], \"adaptive_trailers\": [{\"cdn_path\": \"620/5096/2bbd128dd4e1d90aa6f688fb91e6665a301f48c5/1750108756/dash_av1.mpd\", \"encoding\": \"dash_av1\"}, {\"cdn_path\": \"620/5096/2bbd128dd4e1d90aa6f688fb91e6665a301f48c5/1750108756/dash_h264.mpd\", \"encoding\": \"dash_h264\"}, {\"cdn_path\": \"620/5096/2bbd128dd4e1d90aa6f688fb91e6665a301f48c5/1750108756/hls_264_master.m3u8\", \"encoding\": \"hls_h264\"}], \"screenshot_medium\": \"80822/movie.293x165.jpg\", \"trailer_base_id\": 5096, \"all_ages\": true}, {\"trailer_name\": \"Portal 2 - Perpetual Testing Initiative\", \"trailer_url_format\": \"steam/apps/${FILENAME}?t=1682715589\", \"trailer_category\": 2, \"microtrailer\": [{\"filename\": \"620/7495/c992fec9601198bd42fc3563a62c932b8dc032cb/1750108756/microtrailer.webm\", \"type\": \"video/webm\"}, {\"filename\": \"620/7495/c992fec9601198bd42fc3563a62c932b8dc032cb/1750108756/microtrailer.mp4\", \"type\": \"video/mp4\"}], \"adaptive_trailers\": [{\"cdn_path\": \"620/7495/c992fec9601198bd42fc3563a62c932b8dc032cb/1750108756/dash_av1.mpd\", \"encoding\": \"dash_av1\"}, {\"cdn_path\": \"620/7495/c992fec9601198bd42fc3563a62c932b8dc032cb/1750108756/dash_h264.mpd\", \"encoding\": \"dash_h264\"}, {\"cdn\nstorequery 404\n404: Not Found\n"}

[Think]

**Locating repository tree names**

**Checking image sizes**

The audit found a much better collection route than fetching one store page at a time: Steam’s public store service returns batches with weighted tags, descriptions, release information, review summaries, languages, prices, and screenshot references. The pictures are accessible too.

The US search catalog currently reports about 184,700 games, including upcoming titles. I’m checking regional differences and pagination before treating that as our coverage boundary.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json,re,concurrent.futures,time\nfr...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"62308b","wall_time_seconds":1.000834219,"session_id":45262,"original_token_count":80,"output":"<stdin>:9: SyntaxWarning: \"\\d\" is an invalid escape sequence. Such sequences will not work in the future. Did you mean \"\\\\d\"? A raw string is also an option.\n<stdin>:18: SyntaxWarning: \"\\d\" is an invalid escape sequence. Such sequences will not work in the future. Did you mean \"\\\\d\"? A raw string is also an option.\n"}

[Think]

**Checking collector fixture**

exec ({"code": "text(await tools.write_stdin({session_id:45262,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":3000...)

Script completed
Wall time 0.8 seconds
Output:

{"chunk_id":"5ada0f","wall_time_seconds":0.000001954,"exit_code":0,"original_token_count":470,"output":"{\"name\": \"country_us\", \"status\": 200, \"bytes\": 195848, \"seconds\": 0.63, \"total\": 184682, \"rows\": 100}\n{\"name\": \"country_br\", \"status\": 200, \"bytes\": 195762, \"seconds\": 0.57, \"total\": 183265, \"rows\": 100}\n{\"name\": \"country_cn\", \"status\": 200, \"bytes\": 195163, \"seconds\": 0.53, \"total\": 174425, \"rows\": 100}\n{\"name\": \"country_jp\", \"status\": 200, \"bytes\": 196075, \"seconds\": 0.58, \"total\": 184420, \"rows\": 100}\n{\"name\": \"country_de\", \"status\": 200, \"bytes\": 199351, \"seconds\": 0.67, \"total\": 154119, \"rows\": 100}\n{\"name\": \"tags\", \"status\": 200, \"bytes\": 15210, \"seconds\": 0.26, \"head\": \"[{'tagid': 492, 'name': 'Indie'}, {'tagid': 19, 'name': 'Action'}, {'tagid': 21, 'name': 'Adventure'}, {'tagid': 597, 'name': 'Casual'}, {'tagid': 4182, 'name': 'Singleplayer'}, {'tagid': 599, 'name': 'Simulation'}, {'tagid': 122, 'name': 'RPG'}, {'tagid': 9, 'name': 'Strategy'}, {'tagid': 3871, 'na\"}\n{\"name\": \"categories\", \"status\": 200, \"bytes\": 16246, \"seconds\": 0.28, \"head\": \"{'response': {'categories': [{'categoryid': 10, 'type': 0, 'internal_name': 'Game Demo', 'display_name': 'Game demo', 'image_url': 'public/images/ico/ico_demo.gif', 'computed': False, 'edit_url': '', 'edit_sort_order': 99999}, {'categoryid': 21, 'type': 0, 'internal_name': 'DLC', 'display_name': 'Do\"}\n{\"name\": \"browse100\", \"status\": 200, \"bytes\": 716410, \"seconds\": 1.57, \"items\": 100, \"success\": 100, \"screenshots\": 625, \"fields\": [\"appid\", \"assets\", \"assets_without_overrides\", \"basic_info\", \"best_purchase_option\", \"categories\", \"content_descriptorids\", \"full_description_bbcode\", \"game_rating\", \"id\", \"is_coming_soon\", \"is_early_access\", \"is_free\", \"item_type\", \"links\", \"name\", \"package_groups\", \"platforms\", \"purchase_options\", \"related_items\", \"release\", \"reviews\", \"screenshots\", \"store_url_path\", \"store_url_slug\", \"success\", \"supported_languages\", \"tagids\", \"tags\", \"trailers\", \"type\", \"visible\"]}\n"}
{"chunk_id":"bfe299","wall_time_seconds":0.663436049,"exit_code":0,"original_token_count":893,"output":"{\"name\": \"sitemap\", \"status\": 200, \"bytes\": 1053596, \"head\": \"<!DOCTYPE html>\\n<html class=\\\" responsive DesktopUI\\\" lang=\\\"en\\\"  >\\n<head>\\n\\t<meta http-equiv=\\\"Content-Type\\\" content=\\\"text/html; charset=UTF-8\\\">\\n\\t\\t\\t<meta name=\\\"viewport\\\" content=\\\"width=device-width,initial-scale=1\\\">\\n\\t\\t<meta name=\\\"theme-color\\\" content=\\\"#171a21\\\">\\n\\t\\t<title>Welcome to Steam</title>\\n\\t<link rel=\\\"shortcut icon\\\" href=\\\"/favicon.ico\\\" type=\\\"image/x-icon\\\">\\n\\n\\t\\n\\t\\n\\t<link href=\\\"https://store.fastly.steamstatic.com/public/shared/css/motiva_sans.css?v=YzJgj1FjzW34&amp;l=english&amp;_cdn=fastly\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<link href=\\\"https://store.fastly.steamstatic.com/public/shared/css/shared_global.css?v=sat0mVAiy9IE&amp;l=english&amp;_cdn=fastly\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<link href=\\\"https://store.fastly.steamstatic.com/public/shared/css/buttons.css?v=BZhNEtESfYSJ&amp;l=english&amp;_cdn=fastly\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<link href=\\\"https://store.fastly.steamstatic.com/public/css/v6/store.css?v=jzxKLyRtIqK5&amp;l=english&amp;_cdn=fastly\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<link href=\\\"https://store.fastly.steamstatic.com/public/css/home.css?v=42NDY4BcEtn4&amp;l=english&amp;_cdn=fastly\\\" rel=\\\"stylesheet\\\" type=\\\"text/css\\\">\\n<link href=\\\"https://store.fastly.steamstatic.com/public/shared/css/shared_responsive.css?v=FJJn0nIxXaGQ&amp;l=english&amp;_cdn=fastly\\\" rel=\\\"style\"}\n{\"name\": \"robots\", \"status\": 200, \"bytes\": 303, \"head\": \"Host: store.steampowered.com\\nUser-Agent: *\\nDisallow: /share/\\nDisallow: /news/externalpost/\\nDisallow: /account/emailoptout/?*token=\\nDisallow: /account/notificationsettings/?*token=\\nDisallow: /login/?*guestpasskey=\\nDisallow: /join/?*redir=\\nDisallow: /account/ackgift/\\nDisallow: /email/\\nDisallow: /widget/\\n\"}\n{\"name\": \"query\", \"status\": 200, \"bytes\": 1880, \"head\": \"{\\\"response\\\":{\\\"metadata\\\":{\\\"total_matching_records\\\":312953,\\\"start\\\":0,\\\"count\\\":100},\\\"ids\\\":[{\\\"appid\\\":5311},{\\\"appid\\\":81075},{\\\"appid\\\":81086},{\\\"appid\\\":2028128},{\\\"appid\\\":2028461},{\\\"appid\\\":81838},{\\\"appid\\\":3609230},{\\\"appid\\\":3609240},{\\\"appid\\\":3609260},{\\\"appid\\\":3609270},{\\\"appid\\\":3609280},{\\\"appid\\\":3609300},{\\\"appid\\\":3609310},{\\\"appid\\\":3609340},{\\\"appid\\\":3609350},{\\\"appid\\\":3609360},{\\\"appid\\\":3609380},{\\\"appid\\\":3609400},{\\\"appid\\\":3609410},{\\\"appid\\\":3609420},{\\\"appid\\\":3609450},{\\\"appid\\\":3609470},{\\\"appid\\\":3609480},{\\\"appid\\\":3609520},{\\\"appid\\\":3609540},{\\\"appid\\\":3609580},{\\\"appid\\\":3609590},{\\\"appid\\\":3609600},{\\\"appid\\\":3609620},{\\\"appid\\\":3609660},{\\\"appid\\\":3609670},{\\\"appid\\\":3609680},{\\\"appid\\\":3609700},{\\\"appid\\\":3609710},{\\\"appid\\\":3609720},{\\\"appid\\\":3609730},{\\\"appid\\\":3609770},{\\\"appid\\\":3609780},{\\\"appid\\\":3609830},{\\\"appid\\\":3609850},{\\\"appid\\\":3609890},{\\\"appid\\\":3609900},{\\\"appid\\\":3609930},{\\\"appid\\\":3609970},{\\\"appid\\\":3609980},{\\\"appid\\\":3610000},{\\\"appid\\\":3610020},{\\\"appid\\\":3610040},{\\\"appid\\\":3610050},{\\\"appid\\\":3610070},{\\\"appid\\\":3610090},{\\\"appid\\\":3610120},{\\\"appid\\\":3610130},{\\\"appid\\\":3610160},{\\\"appid\\\":3610180},{\\\"appid\\\":3610200},{\\\"appid\\\":3610250},{\\\"appid\\\":3610270},{\\\"appid\\\":3610280},{\\\"appid\\\":3610290},{\\\"appid\\\":3610310},{\\\"appid\\\":3610330},{\\\"appid\\\":3610340},{\\\"appid\\\":3610370},{\\\"appid\\\":3610380},{\\\"appid\\\":3610400},{\\\"appid\\\":3610440},{\\\"appid\\\":3610510\"}\n{\"name\": \"protobuf_files\", \"status\": 200, \"bytes\": 111876, \"files\": [\"enums.proto\", \"enums_productinfo.proto\", \"steammessages_childprocessquery.proto\", \"steammessages_store.steamclient.proto\", \"steammessages_storebrowse.steamclient.proto\"]}\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests\nfrom pathlib import Path\nr=Path(...)

Script completed
Wall time 0.7 seconds
Output:

{"chunk_id":"2a15c8","wall_time_seconds":0.507890455,"exit_code":0,"original_token_count":265,"output":"message CStoreQuery_Query_Request -1 \nmessage CStoreQuery_Query_Response -1 \nmessage StoreQuery -1 \nenum EStoreQuery -1 \nservice StoreQuery -1 \noption optimize_for = SPEED;\n\nenum EContentDescriptorID {\n\tk_EContentDescriptor_NudityOrSexualContent = 1;\n\tk_EContentDescriptor_FrequentViolenceOrGore = 2;\n\tk_EContentDescriptor_AdultOnlySexualContent = 3;\n\tk_EContentDescriptor_GratuitousSexualContent = 4;\n\tk_EContentDescriptor_AnyMatureContent = 5;\n\tk_EContentDescriptorMAX = 6;\n}\n\nenum ERatingAgency {\n\tk_ERatingAgency_Invalid = 0;\n\tk_ERatingAgency_ESRB = 1;\n\tk_ERatingAgency_PEGI = 2;\n\tk_ERatingAgency_BBFC = 3;\n\tk_ERatingAgency_USK = 4;\n\tk_ERatingAgency_OFLC_AU = 5;\n\tk_ERatingAgency_OFLC_NZ = 6;\n\tk_ERatingAgency_CERO = 7;\n\tk_ERatingAgency_GRAC = 8;\n\tk_ERatingAgency_GMEDIA = 9;\n\tk_ERatingAgency_DEJUS = 10;\n\tk_ERatingAgency_IMDA = 11;\n\tk_ERatingAgency_FPB = 12;\n\tk_ERatingAgency_TESRI = 13;\n\tk_ERatingAgency_RARS = 14;\n\tk_ERatingAgency_AGCOM = 15;\n\tk_ERatingAgency_IGRS = 16;\n\tk_ERatingAgency_Steam_Germany = 17;\n\tk_ERatingAgency_Steam_Australia = 18;\n}\n\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json\nfrom pathlib import Path\nr=...)

Script completed
Wall time 0.9 seconds
Output:

{"chunk_id":"f47780","wall_time_seconds":0.760297187,"exit_code":0,"original_token_count":1740,"output":"['webui/service_storequery.proto']\nimport \"common.proto\";\nimport \"common_base.proto\";\n\nmessage CStoreQuery_GetItemByUserCombinedTagsPriority_Request {\n\toptional int32 sort = 1 [default = Identifier, (.description) = \"enum\"];\n\toptional uint32 max_items = 2;\n\toptional bool randomize = 3;\n\toptional bool include_packages = 4 [default = false];\n\toptional bool include_bundles = 5 [default = false];\n\toptional .CStorePageFilter filters = 6;\n\toptional .StoreBrowseContext context = 7;\n}\n\nmessage CStoreQuery_GetItemByUserCombinedTagsPriority_Response {\n\trepeated uint32 tagid = 1;\n\trepeated .StoreItemID store_item_ids = 2;\n\trepeated string tag_name = 3;\n}\n\nmessage CStoreQuery_GetItemsByUserRecommendedTags_Request {\n\toptional .CStorePageFilter filters = 2;\n\toptional .StoreBrowseContext context = 5;\n\trepeated .CStoreQuery_GetItemsByUserRecommendedTags_Request_Section sections = 6;\n}\n\nmessage CStoreQuery_GetItemsByUserRecommendedTags_Request_Section {\n\toptional int32 sort = 1 [default = Identifier, (.description) = \"enum\"];\n\toptional uint32 min_items = 2;\n\toptional bool randomize = 3;\n\toptional bool include_packages = 4 [default = false];\n\toptional bool include_bundles = 5 [default = false];\n}\n\nmessage CStoreQuery_GetItemsByUserRecommendedTags_Response {\n\trepeated .CStoreQuery_GetItemsByUserRecommendedTags_Response_Section sections = 1;\n}\n\nmessage CStoreQuery_GetItemsByUserRecommendedTags_Response_Section {\n\toptional uint32 tagid = 1;\n\trepeated .StoreItemID store_item_ids = 2;\n\toptional string tag_name = 3;\n}\n\nmessage CStoreQuery_MoreLikeThis_Request {\n\toptional string query_name = 1;\n\toptional .StoreBrowseContext context = 2;\n\toptional .StoreBrowseItemDataRequest data_request = 3;\n\toptional .StoreItemID item_id = 4;\n\toptional int32 count = 5 [default = 20];\n\toptional .CStoreQueryFilters filters = 6;\n\toptional .CStoreQuery_MoreLikeThis_Request_MoreLikeThisOptions options = 7;\n}\n\nmessage CStoreQuery_MoreLikeThis_Request_MoreLikeThisOptions {\n\toptional float tag_weight = 1 [default = 90];\n}\n\nmessage CStoreQuery_MoreLikeThis_Response {\n\toptional .CStoreQueryResultMetadata metadata = 1;\n\trepeated .StoreItemID ids = 2;\n\trepeated .StoreItem store_items = 3;\n}\n\nmessage CStoreQuery_Query_Request {\n\toptional string query_name = 1;\n\toptional .CStoreQueryParams query = 2;\n\toptional .StoreBrowseContext context = 3;\n\toptional .StoreBrowseItemDataRequest data_request = 4;\n\toptional string override_country_code = 5;\n}\n\nmessage CStoreQuery_Query_Response {\n\toptional .CStoreQueryResultMetadata metadata = 1;\n\trepeated .StoreItemID ids = 2;\n\trepeated .StoreItem store_items = 3;\n}\n\nmessage CStoreQuery_SearchSuggestions_Request {\n\toptional string query_name = 1;\n\toptional .StoreBrowseContext context = 2;\n\toptional string search_term = 3;\n\toptional uint32 max_results = 4;\n\toptional .CStoreQueryFilters filters = 5;\n\toptional .StoreBrowseItemDataRequest data_request = 6;\n\toptional bool use_spellcheck = 7;\n\toptional bool search_tags = 8;\n\toptional bool search_creators = 9;\n}\n\nmessage CStoreQuery_SearchSuggestions_Response {\n\toptional .CStoreQueryResultMetadata metadata = 1;\n\trepeated .StoreItemID ids = 2;\n\trepeated .StoreItem store_items = 3;\n}\n\nmessage CStoreQueryFilters {\n\toptional bool released_only = 1;\n\toptional bool coming_soon_only = 2;\n\toptional .CStoreQueryFilters_TypeFilters type_filters = 3;\n\trepeated int32 exclude_from = 4 [(.description) = \"enum\"];\n\toptional .CStoreQueryFilters_PredefinedFilter predefined_filter = 5;\n\trepeated .CStoreQueryFilters_TagFilter tagids_must_match = 10;\n\trepeated int32 tagids_exclude = 11;\n\toptional .CStoreQueryFilters_PriceFilters price_filters = 12;\n\toptional .CStoreQueryFilters_ReleaseDateFilter release_date_filter = 13;\n\trepeated int32 content_descriptors_must_match = 15 [(.description) = \"enum\"];\n\trepeated int32 content_descriptors_excluded = 16 [(.description) = \"enum\"];\n\toptional .CStoreQueryFilters_DiscountedDatesFilter discounted_dates_filter = 17;\n\toptional int32 regional_top_n_sellers = 40;\n\toptional int32 global_top_n_sellers = 41;\n\toptional int32 regional_long_term_top_n_sellers = 42;\n\toptional int32 global_long_term_top_n_sellers = 43;\n\toptional .CStorePageFilter store_page_filter = 44;\n\trepeated uint32 parent_appids = 45;\n}\n\nmessage CStoreQueryFilters_DiscountedDatesFilter {\n\toptional uint32 start_date = 1;\n\toptional uint32 end_date = 2;\n\toptional bool allow_partial_overlap = 3;\n}\n\nmessage CStoreQueryFilters_PredefinedFilter {\n\toptional int32 filter_type = 1 [(.description) = \"enum\"];\n\trepeated int32 language_preferences = 2;\n}\n\nmessage CStoreQueryFilters_PriceFilters {\n\toptional bool only_free_items = 1;\n\toptional bool exclude_free_items = 2;\n\toptional int32 min_discount_percent = 3;\n}\n\nmessage CStoreQueryFilters_ReleaseDateFilter {\n\toptional int32 release_date_type = 1 [(.description) = \"enum\"];\n\toptional int32 start_date = 2;\n\toptional int32 end_date = 3;\n}\n\nmessage CStoreQueryFilters_TagFilter {\n\trepeated int32 tagids = 1;\n}\n\nmessage CStoreQueryFilters_TypeFilters {\n\toptional bool include_apps = 1;\n\toptional bool include_packages = 2;\n\toptional bool include_bundles = 3;\n\toptional bool include_games = 10;\n\toptional bool include_demos = 11;\n\toptional bool include_mods = 12;\n\toptional bool include_dlc = 13;\n\toptional bool include_software = 14;\n\toptional bool include_video = 15;\n\toptional bool include_hardware = 16;\n\toptional bool include_series = 17;\n\toptional bool include_music = 18;\n\toptional uint32 dlc_for_appid = 19;\n}\n\nmessage CStoreQueryParams {\n\toptional int32 start = 1 [default = 0];\n\toptional int32 count = 2 [default = 10];\n\toptional int32 sort = 10 [default = Identifier, (.description) = \"enum\"];\n\toptional .CStoreQueryFilters filters = 20;\n}\n\nmessage CStoreQueryPerResultMetadata {\n\toptional .StoreItemID id = 1;\n\toptional double score = 2;\n\toptional bool spellcheck_generated_result = 3;\n}\n\nmessage CStoreQueryResultMetadata {\n\toptional int32 total_matching_records = 1;\n\toptional int32 start = 2;\n\toptional int32 count = 3;\n\trepeated .CStoreQueryPerResultMetadata per_result_metadata = 4;\n\trepeated string spellcheck_suggestions = 5;\n}\n\nservice StoreQuery {\n\t// bConstMethod=true, ePrivilege=1\n\trpc GetItemByUserCombinedTagsPriority (.CStoreQuery_GetItemByUserCombinedTagsPriority_Request) returns (.CStoreQuery_GetItemByUserCombinedTagsPriority_Response);\n\t// bConstMethod=true, ePrivilege=1\n\trpc GetItemsByUserRecommendedTags (.CStoreQuery_GetItemsByUserRecommendedTags_Request) returns (.CStoreQuery_GetItemsByUserRecommendedTags_Response);\n\t// bConstMethod=true, ePrivilege=1, eWebAPIKeyRequirement=1\n\trpc MoreLikeThis (.CStoreQuery_MoreLikeThis_Request) returns (.CStoreQuery_MoreLikeThis_Response);\n\t// bConstMethod=true, ePrivilege=1, eWebAPIKeyRequirement=1\n\trpc Query (.CStoreQuery_Query_Request) returns (.CStoreQuery_Query_Response);\n\t// bConstMethod=true, ePrivilege=2, eWebAPIKeyRequirement=1\n\trpc SearchSuggestions (.CStoreQuery_SearchSuggestions_Request) returns (.CStoreQuery_SearchSuggestions_Response);\n}\n\n\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json,concurrent.futures\nfrom pathl...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"70f826","wall_time_seconds":1.000728819,"session_id":37343,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.write_stdin({session_id:37343,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":2300...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"17396d","wall_time_seconds":0.000001608,"exit_code":0,"original_token_count":273,"output":"{\"name\": \"query_games100\", \"status\": 200, \"bytes\": 940431, \"metadata\": {\"total_matching_records\": 184463, \"start\": 0, \"count\": 100}, \"ids\": 100, \"items\": 100, \"sample\": [{\"appid\": 3634670}, {\"appid\": 3634700}, {\"appid\": 3634720}], \"types\": [0]}\n{\"name\": \"query_games1000\", \"status\": 200, \"bytes\": 18090, \"metadata\": {\"total_matching_records\": 184463, \"start\": 0, \"count\": 1000}, \"ids\": 1000, \"items\": 0, \"sample\": [{\"appid\": 3791340}, {\"appid\": 3791380}, {\"appid\": 3791400}], \"types\": []}\n{\"name\": \"query_global\", \"status\": 200, \"bytes\": 15, \"metadata\": null, \"ids\": 0, \"items\": 0, \"sample\": [], \"types\": []}\n{\"name\": \"query_br\", \"status\": 200, \"bytes\": 18090, \"metadata\": {\"total_matching_records\": 183047, \"start\": 0, \"count\": 1000}, \"ids\": 1000, \"items\": 0, \"sample\": [{\"appid\": 3609260}, {\"appid\": 3609280}, {\"appid\": 3609380}], \"types\": []}\n{\"name\": \"query_tail\", \"status\": 200, \"bytes\": 954369, \"metadata\": {\"total_matching_records\": 184463, \"start\": 180000, \"count\": 100}, \"ids\": 100, \"items\": 100, \"sample\": [{\"appid\": 3556830}, {\"appid\": 3556860}, {\"appid\": 3557000}], \"types\": [0]}\n"}
{"chunk_id":"59c91a","wall_time_seconds":1.000795644,"session_id":65572,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json,concurrent.futures\nfrom pathl...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"0ea301","wall_time_seconds":1.000689234,"session_id":2705,"original_token_count":0,"output":""}
{"chunk_id":"3b9a00","wall_time_seconds":0.000001206,"exit_code":0,"original_token_count":1063,"output":"[{\"appid\": 1001520, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1001520/ss_e11ef986208f6165ba7774fc1b47c84548148c5f.jpg?t=1620848956\", \"status\": 200, \"bytes\": 146894, \"dimensions\": [1440, 723], \"seconds\": 0.82}, {\"appid\": 1287250, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1287250/ss_fdfbdf266c8643b577f4375a8416fba905a0d2e7.jpg?t=1658469423\", \"status\": 200, \"bytes\": 515882, \"dimensions\": [1920, 1080], \"seconds\": 1.19}, {\"appid\": 3909430, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3909430/714e04407e71e71a5b16d67ee02dbe2c2344078c/ss_714e04407e71e71a5b16d67ee02dbe2c2344078c.jpg?t=1754678846\", \"status\": 200, \"bytes\": 205961, \"dimensions\": [1920, 1080], \"seconds\": 0.93}, {\"appid\": 1102740, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1102740/ss_2908e944f7f5f4742fa4e597aa12218a7596a96d.jpg?t=1696509487\", \"status\": 200, \"bytes\": 156198, \"dimensions\": [1920, 1080], \"seconds\": 0.82}, {\"appid\": 1377600, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1377600/ss_f1e6c41a3d4523a9bbff5acc874a83ca5b22fa7f.jpg?t=1629468159\", \"status\": 200, \"bytes\": 416606, \"dimensions\": [3724, 1737], \"seconds\": 1.0}, {\"appid\": 4818130, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/4818130/ec641e094a0eb04cdbb8bb7c35a1276270bcce62/ss_ec641e094a0eb04cdbb8bb7c35a1276270bcce62.jpg?t=1782031926\", \"status\": 200, \"bytes\": 903148, \"dimensions\": [2752, 1536], \"seconds\": 1.28}, {\"appid\": 3892020, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3892020/ae3eacc24e976f2a431500602b3db7f82a2f6750/ss_ae3eacc24e976f2a431500602b3db7f82a2f6750.jpg?t=1787900913\", \"status\": 200, \"bytes\": 171364, \"dimensions\": [1920, 1080], \"seconds\": 0.9}, {\"appid\": 3949890, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3949890/f45044a98f554b83410e3b53ce1e41da69109a3b/ss_f45044a98f554b83410e3b53ce1e41da69109a3b.jpg?t=1764342001\", \"status\": 200, \"bytes\": 188854, \"dimensions\": [1920, 1080], \"seconds\": 0.93}, {\"appid\": 4643010, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/4643010/77cc2841e6322e3656fc5e1893a9f1f2b5c7e49c/ss_77cc2841e6322e3656fc5e1893a9f1f2b5c7e49c.jpg?t=1784233166\", \"status\": 200, \"bytes\": 499368, \"dimensions\": [1920, 1080], \"seconds\": 1.23}, {\"appid\": 4655400, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/4655400/f3474bd0a9857090919066b447bb3d2f4a432b90/ss_f3474bd0a9857090919066b447bb3d2f4a432b90.jpg?t=1782826898\", \"status\": 200, \"bytes\": 405407, \"dimensions\": [1920, 1080], \"seconds\": 1.08}, {\"appid\": 2582450, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/2582450/ss_4010a68ee8e829d7c1852d8256b5741a5bccd68c.jpg?t=1730653773\", \"status\": 200, \"bytes\": 204608, \"dimensions\": [1280, 720], \"seconds\": 0.8}, {\"appid\": 1870660, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1870660/ss_2d9b05d2805b3ead5a4ec8dc5d62566589897cbb.jpg?t=1695662359\", \"status\": 200, \"bytes\": 95424, \"dimensions\": [1920, 1080], \"seconds\": 0.43}, {\"appid\": 3794320, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3794320/c251a8390dfe31b811dda6a3ce2e6d50199fa332/ss_c251a8390dfe31b811dda6a3ce2e6d50199fa332.jpg?t=1751288904\", \"status\": 200, \"bytes\": 425864, \"dimensions\": [1920, 1080], \"seconds\": 1.05}, {\"appid\": 3731150, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3731150/51210d7dcaa4541342e35bd3c547bd8a5d287995/ss_51210d7dcaa4541342e35bd3c547bd8a5d287995.jpg?t=1752670859\", \"status\": 200, \"bytes\": 223476, \"dimensions\": [1920, 1080], \"seconds\": 1.09}, {\"appid\": 1034230, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/1034230/ss_a7b88be226e7cb9f10f6b0d2dbae67389c039abb.jpg?t=1599162979\", \"status\": 200, \"bytes\": 130293, \"dimensions\": [1600, 900], \"seconds\": 0.79}, {\"appid\": 3138760, \"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/3138760/7ca27101d57710f7a4d07d24a588b17f50c519b2/ss_7ca27101d57710f7a4d07d24a588b17f50c519b2.jpg?t=1771272627\", \"status\": 200, \"bytes\": 601620, \"dimensions\": [1920, 1080], \"seconds\": 1.24}]\n"}

[Think]

**Estimating thumbnail processing**

exec ({"code": "text(await tools.write_stdin({session_id:2705,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":2500}...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"c163dc","wall_time_seconds":0.000001104,"exit_code":0,"original_token_count":975,"output":"{\"sort\": 1, \"items\": [[3665180, \"\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [396420, \"\", {\"steam_release_date\": 1478035243, \"original_release_date\": 1477983600}], [708030, \"\", {\"is_coming_soon\": true}], [1074060, \"\", {\"original_release_date\": 1594364400, \"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [814940, \"\", {\"is_coming_soon\": true}]]}\n{\"sort\": 2, \"items\": [[10, \"Counter-Strike\", {\"steam_release_date\": 973065600}], [20, \"Team Fortress Classic\", {\"steam_release_date\": 922953600}], [30, \"Day of Defeat\", {\"steam_release_date\": 1051772400}], [40, \"Deathmatch Classic\", {\"steam_release_date\": 991378800}], [50, \"Half-Life: Opposing Force\", {\"steam_release_date\": 941443200}]]}\n{\"sort\": 3, \"items\": [[3772620, \"CryptidCam\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [4178110, \"Circuit Shop\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"To be announced\", \"coming_soon_display\": \"text_tba\"}], [4178160, \"Janky Golf with Stream\", {\"steam_release_date\": 1764338037}], [4178290, \"Hivefront TD\", {\"steam_release_date\": 1767031302}], [4178360, \"Snake Coil: Puzzle Adventure\", {\"steam_release_date\": 1781912599}]]}\n{\"sort\": 4, \"items\": [[3691310, \"Wake Explorer\", {\"steam_release_date\": 1750412733}], [3691380, \"Xolo & the Forgotten Gods\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"To be announced\", \"coming_soon_display\": \"text_tba\"}], [3691400, \"Forgebound\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"To be announced\", \"coming_soon_display\": \"text_tba\"}], [3691410, \"Dead Pulse\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [3691440, \"Friendly Firewall\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"To be announced\", \"coming_soon_display\": \"text_tba\"}]]}\n{\"sort\": 5, \"items\": [[3741400, \"Snowball's Chance In Hell\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [3741420, \"The Silent Catalyst\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [3741430, \"CHAMBER X\", {\"steam_release_date\": 1750142583}], [3741470, \"POLLYANNA\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [3741560, \"Mathletics\", {\"steam_release_date\": 1753964919}]]}\n{\"sort\": 6, \"items\": [[3629460, \"Idle Crypto Mining\", {\"steam_release_date\": 1751405023}], [3629470, \"RockStars!\", {\"steam_release_date\": 1745969665}], [3629480, \"The Grandfather\", {\"steam_release_date\": 1746255203}], [3629490, \"Prototype Juan: A Tale of Two Mundos\", {\"steam_release_date\": 1760633735}], [3629550, \"BERENICE: Videogame\", {\"steam_release_date\": 1747774569}]]}\n{\"sort\": 7, \"items\": [[3772620, \"CryptidCam\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"Coming soon\", \"coming_soon_display\": \"text_comingsoon\"}], [4178110, \"Circuit Shop\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"To be announced\", \"coming_soon_display\": \"text_tba\"}], [4178160, \"Janky Golf with Stream\", {\"steam_release_date\": 1764338037}], [4178290, \"Hivefront TD\", {\"steam_release_date\": 1767031302}], [4178360, \"Snake Coil: Puzzle Adventure\", {\"steam_release_date\": 1781912599}]]}\n{\"sort\": 8, \"items\": [[3791340, \"Witchcrafter The TCG\", {\"steam_release_date\": 1756820957}], [3791380, \"Magical Girl Fist Fight\", {\"is_coming_soon\": true, \"custom_release_date_message\": \"To be announced\", \"coming_soon_display\": \"text_tba\"}], [3791400, \"DepthLess\", {\"steam_release_date\": 1750923840}], [3791410, \"Lunatix\", {\"steam_release_date\": 1753056006}], [3791540, \"Nonogram Desserts\", {\"steam_release_date\": 1760684425}]]}\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json,time\nfrom pathlib import Path...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"dbdb0b","wall_time_seconds":1.001216012,"session_id":17992,"original_token_count":0,"output":""}

[Think]

**Preparing metadata queries**

**Comparing query results**

exec ({"code": "text(await tools.write_stdin({session_id:17992,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1300...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"4ed487","wall_time_seconds":0.000001973,"exit_code":0,"original_token_count":72,"output":"{'status': 200, 'bytes': 8115078, 'seconds': 5.444987508002669, 'metadata': {'total_matching_records': 184463, 'start': 0, 'count': 1000}, 'items': 1000, 'ids': 1000, 'first': [{'appid': 10}, {'appid': 20}, {'appid': 30}], 'last': [{'appid': 70000}, {'appid': 70100}, {'appid': 70110}]}\n"}
{"chunk_id":"4c877b","wall_time_seconds":0.267479927,"exit_code":0,"original_token_count":26,"output":"{\"response\":{\"metadata\":{\"total_matching_records\":184611,\"start\":0,\"count\":1},\"ids\":[{\"appid\":10}]}}\n"}

[Think]

**Fetching full country data**

**Designing SQLite storage**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/collect.py\...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"1f392f","wall_time_seconds":1.000929466,"session_id":42406,"original_token_count":0,"output":""}

[Think]

**Checking UTC snapshot time**

**Preparing image fetcher**

The full collection is running. It includes released and upcoming games, free and paid titles, and mods kept identifiable as a separate type. I’m collecting five storefront regions because their catalogs differ substantially.

Each record will retain Steam’s detailed response, and the database will also have queryable tables for tags, creators, languages, features, prices, and images. For the images, I’m preserving the supplied files and their association with each game—not just taking screenshots of the webpages.

exec ({"code": "text(await tools.exec_command({cmd:\"tail -6 /home/adn/a327ex/steam-research/2026-09-05/collector.log; du -...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"eab5be","wall_time_seconds":0.000002452,"exit_code":0,"original_token_count":145,"output":"{\"at\": \"2026-09-05T19:09:59.844501+00:00\", \"phase\": \"catalog\", \"games\": 1218, \"regional\": 4997, \"discovery\": 5000, \"pages\": 5, \"game_tags\": 15266, \"images\": 19751}\n{\"at\": \"2026-09-05T19:10:21.257773+00:00\", \"phase\": \"catalog\", \"games\": 7005, \"regional\": 10997, \"discovery\": 11000, \"pages\": 11, \"game_tags\": 86137, \"images\": 118263}\n{\"at\": \"2026-09-05T19:10:42.019631+00:00\", \"phase\": \"catalog\", \"games\": 14005, \"regional\": 17997, \"discovery\": 18000, \"pages\": 18, \"game_tags\": 159070, \"images\": 232813}\n519M\t/home/adn/a327ex/steam-research/2026-09-05\nSat Sep  5 19:10:50 UTC 2026\n"}
{}
{"chunk_id":"1e8d49","wall_time_seconds":1.001021505,"session_id":63039,"original_token_count":0,"output":""}

[Think]

**Preparing local URL list**

**Verifying catalog coverage**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -4 /home/adn/a327ex/steam-research/2026-09-05/collector.log; tail...)

Script completed
Wall time 0.7 seconds
Output:

{"chunk_id":"d01621","wall_time_seconds":0.000002948,"exit_code":0,"original_token_count":313,"output":"{\"at\": \"2026-09-05T19:09:59.844501+00:00\", \"phase\": \"catalog\", \"games\": 1218, \"regional\": 4997, \"discovery\": 5000, \"pages\": 5, \"game_tags\": 15266, \"images\": 19751}\n{\"at\": \"2026-09-05T19:10:21.257773+00:00\", \"phase\": \"catalog\", \"games\": 7005, \"regional\": 10997, \"discovery\": 11000, \"pages\": 11, \"game_tags\": 86137, \"images\": 118263}\n{\"at\": \"2026-09-05T19:10:42.019631+00:00\", \"phase\": \"catalog\", \"games\": 14005, \"regional\": 17997, \"discovery\": 18000, \"pages\": 18, \"game_tags\": 159070, \"images\": 232813}\n{\"at\": \"2026-09-05T19:11:09.490591+00:00\", \"phase\": \"catalog\", \"games\": 22005, \"regional\": 25997, \"discovery\": 26000, \"pages\": 26, \"game_tags\": 240063, \"images\": 359106}\n{\"at\": \"2026-09-05T19:10:51.531868+00:00\", \"this_run_completed\": 1, \"this_run_bytes\": 101416, \"images_per_second\": 1.0, \"statuses\": {\"pending\": 280852}}\n{\"at\": \"2026-09-05T19:11:11.657272+00:00\", \"this_run_completed\": 1377, \"this_run_bytes\": 401683092, \"images_per_second\": 65.67, \"statuses\": {\"ok\": 1300, \"pending\": 389228}}\n    PID   RSS     ELAPSED COMMAND\n2175244 272344      01:52 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2178801 333472      00:35 python -u /home/adn/a327ex/steam-research/images.py --workers 32 --follow\n"}
{"chunk_id":"b2645b","wall_time_seconds":0.440037428,"exit_code":0,"original_token_count":300,"output":"select source_country,count(*) from games group by source_country [('BR', 1), ('DE', 1), ('JP', 3), ('US', 27997)]\nselect status,count(*) from images group by status [('ok', 2200), ('pending', 467840)]\nselect kind,count(*) from game_images group by kind [('assets_edition_comparison', 65), ('assets_header', 28951), ('assets_hero_capsule', 8681), ('assets_library_capsule', 28974), ('assets_library_hero', 14363), ('assets_main_capsule', 28544), ('assets_page_background', 13806), ('assets_raw_page_background', 13806), ('assets_small_capsule', 28956), ('assets_without_overrides_edition_comparison', 65), ('assets_without_overrides_header', 28951), ('assets_without_overrides_hero_capsule', 8680), ('assets_without_overrides_library_capsule', 28974), ('assets_without_overrides_library_hero', 14363), ('assets_without_overrides_main_capsule', 28544), ('assets_without_overrides_page_background', 13806), ('assets_without_overrides_raw_page_background', 13806), ('assets_without_overrides_small_capsule', 28956), ('description', 28352), ('screenshot_all_ages_screenshots', 257716), ('screenshot_mature_content_screenshots', 18702)]\nselect success,count(*) from regional group by success [(1, 32994)]\n"}

[Think]

**Planning image retrieval**

**Checking app metadata sources**

exec ({"code": "text(await tools.exec_command({cmd:\"python -u /home/adn/a327ex/steam-research/collect.py --phase verify_id...)

Script completed
Wall time 2.3 seconds
Output:

{"chunk_id":"22a6b2","wall_time_seconds":1.001190658,"session_id":18946,"original_token_count":0,"output":""}
{"chunk_id":"aff81d","wall_time_seconds":0.953946011,"exit_code":0,"original_token_count":211,"output":"{\"name\": \"steamcmd_schema\", \"status\": 200, \"paths\": [\"/v1/info/{app_id}\", \"/v1/version\", \"/health\", \"/ready\"]}\n{\"name\": \"steamtracking_root\", \"files\": [\".gitattributes\", \".github\", \".gitignore\", \".gitmodules\", \".vscode\", \"API\", \"ClientExtracted\", \"ClientManifest\", \"Protobufs\", \"ProtobufsWebui\", \"README.md\", \"Random\", \"Strings\", \"Structs\", \"biome.json\", \"biome_steamdb.json\", \"c\", \"checkout.steampowered.com\", \"composer.json\", \"help.steampowered.com\", \"package-lock.json\", \"package.json\", \"partner.steamgames.com\", \"phpstan.neon\", \"steamcommunity.com\", \"store.steampowered.com\", \"tools\", \"update.php\", \"update.sh\", \"urls.txt\", \"www.counter-strike.net\", \"www.dota2.com\", \"www.playdeadlock.com\"]}\n{\"name\": \"all_types\", \"result\": {\"response\": {\"metadata\": {\"total_matching_records\": 296819, \"start\": 0, \"count\": 1}, \"ids\": [{\"appid\": 219}]}}}\n"}

[Think]

**Assessing game coverage**

**Fetching Steam search pages**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json\nfrom pathlib import Path\nr=...)

Script completed
Wall time 0.5 seconds
Output:

{"chunk_id":"f7f521","wall_time_seconds":0.274094134,"exit_code":0,"original_token_count":83,"output":"{'id': 0, 'path_thumbnail': 'https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/ss_f3f6787d74739d3b2ec8a484b5c994b3d31ef325.600x338.jpg?t=1745363004', 'path_full': 'https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/620/ss_f3f6787d74739d3b2ec8a484b5c994b3d31ef325.1920x1080.jpg?t=1745363004'}\n"}
{"chunk_id":"0bccf4","wall_time_seconds":0.000004038,"exit_code":0,"original_token_count":326,"output":"{\"at\": \"2026-09-05T19:11:36.299397+00:00\", \"phase\": \"catalog\", \"games\": 30002, \"regional\": 33994, \"discovery\": 34000, \"pages\": 34, \"game_tags\": 326572, \"images\": 486484}\n{\"at\": \"2026-09-05T19:12:01.774359+00:00\", \"phase\": \"catalog\", \"games\": 38002, \"regional\": 41994, \"discovery\": 42000, \"pages\": 42, \"game_tags\": 425545, \"images\": 620342}\n{\"at\": \"2026-09-05T19:12:26.132989+00:00\", \"phase\": \"catalog\", \"games\": 46002, \"regional\": 49994, \"discovery\": 97000, \"pages\": 97, \"game_tags\": 550046, \"images\": 754710}\n{\"at\": \"2026-09-05T19:12:12.023308+00:00\", \"this_run_completed\": 4884, \"this_run_bytes\": 1760756948, \"images_per_second\": 60.05, \"statuses\": {\"ok\": 4800, \"pending\": 665841}}\n{\"at\": \"2026-09-05T19:12:32.103376+00:00\", \"this_run_completed\": 6059, \"this_run_bytes\": 2143462387, \"images_per_second\": 59.75, \"statuses\": {\"ok\": 6000, \"pending\": 798825}}\n{\"at\": \"2026-09-05T19:12:08.017005+00:00\", \"phase\": \"verify_ids\", \"games\": 41002, \"regional\": 44994, \"discovery\": 50000, \"pages\": 50, \"game_tags\": 466842, \"images\": 670641}\n{\"at\": \"2026-09-05T19:12:28.416324+00:00\", \"phase\": \"verify_ids\", \"games\": 48002, \"regional\": 51994, \"discovery\": 106000, \"pages\": 106, \"game_tags\": 584374, \"images\": 788173}\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  121G  808G  13% /home\n"}

[Think]

**Stopping image processing**

**Updating screenshot URL handling**

[Think]

**Stopping image processing**

**Updating screenshot URL handling**

**Comparing catalog IDs**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/search_check...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"bd355a","wall_time_seconds":1.000958939,"session_id":79504,"original_token_count":0,"output":""}
{"chunk_id":"8a204e","wall_time_seconds":0.000002534,"exit_code":0,"original_token_count":146,"output":"{\"at\": \"2026-09-05T19:13:18.328570+00:00\", \"phase\": \"catalog\", \"games\": 62002, \"regional\": 65994, \"discovery\": 244000, \"pages\": 244, \"game_tags\": 825910, \"images\": 1029159}\n{\"at\": \"2026-09-05T19:13:41.729705+00:00\", \"phase\": \"catalog\", \"games\": 70002, \"regional\": 73994, \"discovery\": 308000, \"pages\": 309, \"game_tags\": 963645, \"images\": 1166582}\n{\"at\": \"2026-09-05T19:13:53.129122+00:00\", \"this_run_completed\": 10527, \"this_run_bytes\": 4001458321, \"images_per_second\": 57.7, \"statuses\": {\"missing\": 4, \"ok\": 10496, \"pending\": 1207521}}\n6.4G\t/home/adn/a327ex/steam-research/2026-09-05\n"}

The collection has passed 70,000 games. I also found that Steam’s search and store-query catalogs disagree slightly, so I’m enumerating search independently and will reconcile the difference.

The image downloads are working, including screenshots and pictures embedded in descriptions. The archive is large enough that I’m checking image sizes and duplicate references now, so it remains practical to use for later visual analysis.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,json,concurrent.futures,io,time\nfr...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"40a1ed","wall_time_seconds":1.001169689,"session_id":98478,"original_token_count":0,"output":""}

[Think]

**Testing metadata collection**

exec ({"code": "text(await tools.exec_command({cmd:\"ps -o pid,pcpu,pmem,rss,etime,args -p 2175244,2178801; nproc; tail -1 ...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"70702c","wall_time_seconds":0.000002631,"exit_code":0,"original_token_count":113,"output":"    PID %CPU %MEM   RSS     ELAPSED COMMAND\n2175244 39.0  1.8 296264      05:08 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2178801 16.2  2.2 370360      03:52 python -u /home/adn/a327ex/steam-research/images.py --workers 32 --follow\n12\n{\"job\": [\"BR\", 183000], \"error\": \"ValueError('Nonmonotonic or duplicate IDs inside /home/adn/a327ex/steam-research/2026-09-05/raw/verify_ids/BR/00183000.json.gz')\"}\n"}
{"chunk_id":"4b8d66","wall_time_seconds":0.000002624,"exit_code":0,"original_token_count":477,"output":"[{\"appid\": 1001520, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 146894, \"dimensions\": [1440, 723], \"seconds\": 0.281}, {\"appid\": 1001520, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 37520, \"dimensions\": [600, 301], \"seconds\": 0.254}, {\"appid\": 1287250, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 515882, \"dimensions\": [1920, 1080], \"seconds\": 0.49}, {\"appid\": 1287250, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 66751, \"dimensions\": [600, 337], \"seconds\": 0.09}, {\"appid\": 3909430, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 205961, \"dimensions\": [1920, 1080], \"seconds\": 0.887}, {\"appid\": 3909430, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 38778, \"dimensions\": [600, 338], \"seconds\": 0.052}, {\"appid\": 1102740, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 156198, \"dimensions\": [1920, 1080], \"seconds\": 0.812}, {\"appid\": 1102740, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 31453, \"dimensions\": [600, 337], \"seconds\": 0.42}, {\"appid\": 1377600, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 183026, \"dimensions\": [1920, 895], \"seconds\": 0.259}, {\"appid\": 1377600, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 26821, \"dimensions\": [600, 279], \"seconds\": 0.052}, {\"appid\": 4818130, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 529418, \"dimensions\": [1920, 1072], \"seconds\": 0.746}, {\"appid\": 4818130, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 57983, \"dimensions\": [600, 335], \"seconds\": 0.645}, {\"appid\": 3892020, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 171364, \"dimensions\": [1920, 1080], \"seconds\": 1.303}, {\"appid\": 3892020, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 24323, \"dimensions\": [600, 338], \"seconds\": 0.556}, {\"appid\": 3949890, \"variant\": \"1920x1080\", \"status\": 200, \"bytes\": 188854, \"dimensions\": [1920, 1080], \"seconds\": 0.865}, {\"appid\": 3949890, \"variant\": \"600x338\", \"status\": 200, \"bytes\": 47849, \"dimensions\": [600, 338], \"seconds\": 0.28}]\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport gzip,json\nfrom pathlib import Path\nr=Path...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"8400f8","wall_time_seconds":0.000002911,"exit_code":0,"original_token_count":194,"output":"/home/adn/a327ex/steam-research/2026-09-05/raw/verify_ids/BR/00183000.json.gz {'total_matching_records': 183195, 'start': 183000, 'count': 195} 195 195 [5195330, 5195780, 5195850, 5195930, 5196090, 5196110, 5196330, 5196560, 5196760, 5196790, 5196850, 5196990] [3825360, 3826520, 3923570, 3978420, 3991690, 4212660, 4223460, 4278830, 4303020, 4339870, 4570530, 5061200]\n[(5205550, 1230)]\n/home/adn/a327ex/steam-research/2026-09-05/raw/verify_ids/US/00184000.json.gz {'total_matching_records': 184611, 'start': 184000, 'count': 611} 611 611 [5164260, 5164270, 5164300, 5164360, 5164400, 5164420, 5164430, 5164560, 5164610, 5164720, 5164740, 5164770] [3825360, 3826520, 3923570, 3978420, 3991690, 4212660, 4223460, 4278830, 4303020, 4339870, 4570530, 5061200]\n[(5205550, 1230)]\n"}

[Think]

**Checking appid boundary ordering**

**Updating ordering invariant**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"2546ae","wall_time_seconds":1.001018756,"session_id":56310,"original_token_count":0,"output":""}

[Think]

**Checking review count fields**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -3 /home/adn/a327ex/steam-research/2026-09-05/collector.log; tail...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"ea22a4","wall_time_seconds":0.000004029,"exit_code":0,"original_token_count":388,"output":"{\"at\": \"2026-09-05T19:15:22.546482+00:00\", \"phase\": \"catalog\", \"games\": 102002, \"regional\": 105994, \"discovery\": 595303, \"pages\": 637, \"game_tags\": 1516483, \"images\": 1710427}\n{\"at\": \"2026-09-05T19:15:43.443172+00:00\", \"phase\": \"catalog\", \"games\": 108001, \"regional\": 111993, \"discovery\": 654006, \"pages\": 710, \"game_tags\": 1620092, \"images\": 1809036}\n{\"at\": \"2026-09-05T19:16:04.036171+00:00\", \"phase\": \"catalog\", \"games\": 115001, \"regional\": 118993, \"discovery\": 706006, \"pages\": 763, \"game_tags\": 1739935, \"images\": 1921142}\n{\"job\": [\"JP\", 184000], \"error\": \"ValueError('Nonmonotonic or duplicate IDs inside /home/adn/a327ex/steam-research/2026-09-05/raw/verify_ids/JP/00184000.json.gz')\"}\n{\"at\": \"2026-09-05T19:15:59.328468+00:00\", \"phase\": \"verify_ids\", \"games\": 113001, \"regional\": 116993, \"discovery\": 688006, \"pages\": 745, \"game_tags\": 1705439, \"images\": 1889372}\n{\"at\": \"2026-09-05T19:16:19.779185+00:00\", \"phase\": \"verify_ids\", \"games\": 119001, \"regional\": 122993, \"discovery\": 752009, \"pages\": 827, \"game_tags\": 1808822, \"images\": 1983085}\n{\"at\": \"2026-09-05T19:15:54.297254+00:00\", \"this_run_completed\": 1, \"this_run_bytes\": 112828, \"images_per_second\": 0.8, \"statuses\": {\"missing\": 5, \"ok\": 16495, \"pending\": 1840923}}\n{\"at\": \"2026-09-05T19:16:14.525272+00:00\", \"this_run_completed\": 8001, \"this_run_bytes\": 943094674, \"images_per_second\": 372.5, \"statuses\": {\"missing\": 8, \"ok\": 24492, \"pending\": 1927242}}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 20}\n{\"at\": \"2026-09-05T19:16:10.154710+00:00\", \"phase\": \"search_us\", \"pages\": 61}\n"}

[Think]

**Updating per-host search pacing**

**Locating the search process**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"f71473","wall_time_seconds":1.000939914,"session_id":30019,"original_token_count":0,"output":""}

[Think]

**Preparing histogram review**

**Checking review field coverage**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json,collections\nfrom pathlib impor...)

Script completed
Wall time 9.9 seconds
Output:

{"chunk_id":"7eaf0a","wall_time_seconds":9.734042287,"exit_code":0,"original_token_count":369,"output":"basic (143001, 30569, 19001, 14145)\npages [('catalog', 'BR', 1, 1000, 183195, 183195), ('catalog', 'CN', 1, 1000, 174361, 174361), ('catalog', 'DE', 1, 1000, 154052, 154052), ('catalog', 'JP', 1, 1000, 184364, 184364), ('catalog', 'US', 143, 143000, 184611, 184611), ('search_us', 'US', 103, 10300, 184682, 184682), ('verify_ids', 'BR', 184, 183000, 183195, 183195), ('verify_ids', 'CN', 175, 174000, 174361, 174361), ('verify_ids', 'DE', 86, 86000, 154052, 154052), ('verify_ids', 'JP', 185, 184000, 184364, 184364), ('verify_ids', 'US', 185, 184000, 184611, 184611)]\nimage status [('missing', 32, None), ('ok', 54368, 13212040343), ('pending', 2292612, None)]\nimage errors [('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/24010/extras/the_ultimate_railway_hobby', 'missing', '404'), ('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/24010/extras/a_world_of_railways', 'missing', '404'), ('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/24010/extras/licensed_trains', 'missing', '404'), ('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/24010/extras/build_and_rebuild', 'missing', '404'), ('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/71000/ss_23da9097618d184b09b6c99238ea22daea8f0fc0.jpg?t=1763570525', 'missing', '404'), ('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/220240/extras/FARCRY_3_01', 'missing', '404')]\ntags (1, 15.550763395896139, 20)\n"}

[Think]

**Rerunning final boundary check**

[Think]

**Rerunning final boundary check**

**Marking non-store assets manifest-only**

The core data now covers more than 140,000 games. For the visual dataset, I’m using Steam’s own compact screenshot files across the catalog and retaining the full-resolution references for closer inspection later. Header art, capsule art, and description images are also being collected. This lets us analyze the whole catalog without requiring an enormous full-resolution screenshot archive first.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"98a1eb","wall_time_seconds":1.001396505,"session_id":34353,"original_token_count":0,"output":""}
{"chunk_id":"85cb59","wall_time_seconds":0.000002362,"exit_code":0,"original_token_count":232,"output":"{\"at\": \"2026-09-05T19:18:20.952603+00:00\", \"phase\": \"catalog\", \"games\": 156001, \"regional\": 159993, \"discovery\": 1050663, \"pages\": 1170, \"game_tags\": 2443276, \"images\": 2543151}\n{\"at\": \"2026-09-05T19:18:41.869736+00:00\", \"phase\": \"catalog\", \"games\": 162001, \"regional\": 165993, \"discovery\": 1057863, \"pages\": 1188, \"game_tags\": 2544806, \"images\": 2633475}\n{\"job\": [\"DE\", 153000], \"error\": \"ValueError('Nonmonotonic or duplicate IDs inside /home/adn/a327ex/steam-research/2026-09-05/raw/verify_ids/DE/00153000.json.gz')\"}\n{\"at\": \"2026-09-05T19:18:05.511315+00:00\", \"phase\": \"verify_ids\", \"games\": 151001, \"regional\": 154993, \"discovery\": 1044863, \"pages\": 1157, \"game_tags\": 2358318, \"images\": 2467448}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"at\": \"2026-09-05T19:18:31.594741+00:00\", \"phase\": \"search_us\", \"pages\": 132}\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  139G  790G  15% /home\n"}

[Think]

**Checking source data quality**

exec ({"code": "text(await tools.exec_command({cmd:\"python -u /home/adn/a327ex/steam-research/collect.py --phase verify_id...)

Script completed
Wall time 2.0 seconds
Output:

{"chunk_id":"3f3ea8","wall_time_seconds":0.938591573,"exit_code":0,"original_token_count":0,"output":""}
{"chunk_id":"f8fbad","wall_time_seconds":0.71469186,"exit_code":0,"original_token_count":297,"output":"types [(0, 173000), (14, 1)]\nmissing tag definitions (0,)\nsearch exclusive so far (19,)\nimage tail {\"at\": \"2026-09-05T19:19:00.406463+00:00\", \"this_run_completed\": 1, \"this_run_bytes\": 87395, \"images_per_second\": 1.0, \"statuses\": {\"missing\": 40, \"ok\": 80460, \"pending\": 2582607}}\n{\"at\": \"2026-09-05T19:19:20.609245+00:00\", \"this_run_completed\": 4019, \"this_run_bytes\": 705550632, \"images_per_second\": 193.34, \"statuses\": {\"missing\": 40, \"ok\": 84460, \"pending\": 2653104}}\n\ncatalog errors -09-05T19:18:20.952603+00:00\", \"phase\": \"catalog\", \"games\": 156001, \"regional\": 159993, \"discovery\": 1050663, \"pages\": 1170, \"game_tags\": 2443276, \"images\": 2543151}\n{\"at\": \"2026-09-05T19:18:41.869736+00:00\", \"phase\": \"catalog\", \"games\": 162001, \"regional\": 165993, \"discovery\": 1057863, \"pages\": 1188, \"game_tags\": 2544806, \"images\": 2633475}\n{\"at\": \"2026-09-05T19:19:03.714409+00:00\", \"phase\": \"catalog\", \"games\": 165001, \"regional\": 168993, \"discovery\": 1062062, \"pages\": 1203, \"game_tags\": 2595213, \"images\": 2677996}\n{\"at\": \"2026-09-05T19:19:30.678544+00:00\", \"phase\": \"catalog\", \"games\": 172001, \"regional\": 175993, \"discovery\": 1070065, \"pages\": 1220, \"game_tags\": 2712884, \"images\": 2781939}\n\n"}

[Think]

**Profiling batch stalls**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/images.py...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"5e31a5","wall_time_seconds":1.000855743,"session_id":55562,"original_token_count":0,"output":""}

[Think]

**Implementing collector completion wait**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json\nfrom pathlib import Path\nr=P...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"db7e23","wall_time_seconds":1.001613009,"session_id":80117,"original_token_count":0,"output":""}

[Think]

**Checking catalog data fields**

**Preparing SQLite data layout**

exec ({"code": "text(await tools.write_stdin({session_id:80117,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1500...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"b19e63","wall_time_seconds":0.000002074,"exit_code":0,"original_token_count":325,"output":"types [(0, 184003), (14, 1)]\n{'appid': 473930, 'name': 'Steam Gift Cards', 'type': 14, 'related_items': None, 'store_url_path': 'app/473930/Steam_Gift_Cards', 'item_type': 0}\nverify [('BR', 183195), ('CN', 174361), ('DE', 154052), ('JP', 184364), ('US', 184611)]\nmetadata 93, \"discovery\": 1070065, \"pages\": 1220, \"game_tags\": 2712884, \"images\": 2781939}\n{\"at\": \"2026-09-05T19:19:52.792503+00:00\", \"phase\": \"catalog\", \"games\": 177001, \"regional\": 180993, \"discovery\": 1078799, \"pages\": 1242, \"game_tags\": 2796541, \"images\": 2855855}\n{\"at\": \"2026-09-05T19:20:22.708559+00:00\", \"phase\": \"catalog\", \"games\": 181001, \"regional\": 184993, \"discovery\": 1084000, \"pages\": 1258, \"game_tags\": 2864067, \"images\": 2914916}\n{\"job\": [\"US\", 184000], \"error\": \"ValueError('Nonmonotonic or duplicate IDs inside /home/adn/a327ex/steam-research/2026-09-05/raw/catalog/US/00184000.json.gz')\"}\n\nimages {\"at\": \"2026-09-05T19:20:30.282345+00:00\", \"this_run_completed\": 1, \"this_run_bytes\": 89698, \"images_per_second\": 0.22, \"statuses\": {\"in_progress\": 4000, \"missing\": 51, \"ok\": 97449, \"pending\": 2827677}}\n{\"at\": \"2026-09-05T19:20:50.424646+00:00\", \"this_run_completed\": 5929, \"this_run_bytes\": 1274992352, \"images_per_second\": 240.56, \"statuses\": {\"in_progress\": 2100, \"missing\": 59, \"ok\": 103341, \"pending\": 2852609}}\n\n"}
{"chunk_id":"045478","wall_time_seconds":0.000004743,"exit_code":0,"original_token_count":284,"output":"{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"at\": \"2026-09-05T19:21:20.933506+00:00\", \"phase\": \"search_us\", \"pages\": 211}\n{\"at\": \"2026-09-05T19:20:30.282345+00:00\", \"this_run_completed\": 1, \"this_run_bytes\": 89698, \"images_per_second\": 0.22, \"statuses\": {\"in_progress\": 4000, \"missing\": 51, \"ok\": 97449, \"pending\": 2827677}}\n{\"at\": \"2026-09-05T19:20:50.424646+00:00\", \"this_run_completed\": 5929, \"this_run_bytes\": 1274992352, \"images_per_second\": 240.56, \"statuses\": {\"in_progress\": 2100, \"missing\": 59, \"ok\": 103341, \"pending\": 2852609}}\n{\"at\": \"2026-09-05T19:21:11.771331+00:00\", \"this_run_completed\": 12285, \"this_run_bytes\": 2434862823, \"images_per_second\": 267.1, \"statuses\": {\"in_progress\": 3800, \"missing\": 59, \"ok\": 109641, \"pending\": 2844609}}\n    PID %CPU   RSS     ELAPSED COMMAND\n2175244 41.8 325724      11:54 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2195243  0.7 38644       04:29 python -u /home/adn/a327ex/steam-research/search_check.py\n2206508 71.7 696308      01:03 python -u /home/adn/a327ex/steam-research/images.py --workers 128 --variant preview --follow\n"}

[Think]

**Preparing metadata collection**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport gzip,json,collections\nfrom pathlib import P...)

Script completed
Wall time 1.4 seconds
Output:

{"chunk_id":"38c484","wall_time_seconds":0.061708674,"exit_code":0,"original_token_count":105,"output":"Counter({(0, 1): 463, (2, 1): 148})\n[{'appid': 4278830, 'name': 'New Times', 'type': 2, 'success': 1}, {'appid': 4303020, 'name': 'Grafton Mansion', 'type': 2, 'success': 1}, {'appid': 4339870, 'name': 'Goreagulation', 'type': 2, 'success': 1}, {'appid': 4570530, 'name': 'TTT Classic', 'type': 2, 'success': 1}, {'appid': 5061200, 'name': 'Heroes of Might and Magic III: Horn of the Abyss', 'type': 2, 'success': 1}]\n"}
{"chunk_id":"ed05b6","wall_time_seconds":1.000661149,"session_id":57605,"original_token_count":0,"output":""}

[Think]

**Verifying modtype2 mapping**

exec ({"code": "text(await tools.write_stdin({session_id:57605,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":800}...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"a70950","wall_time_seconds":0.000001615,"exit_code":0,"original_token_count":25,"output":"additional regional ids [('BR', 21), ('CN', 94), ('DE', 33), ('JP', 91)]\nimages planned (2079748,)\n"}
{"chunk_id":"54b26c","wall_time_seconds":0.000003456,"exit_code":0,"original_token_count":221,"output":"{\"at\": \"2026-09-05T19:21:45.531607+00:00\", \"phase\": \"catalog\", \"games\": 184009, \"regional\": 211990, \"discovery\": 1115006, \"pages\": 1326, \"game_tags\": 2914696, \"images\": 2958197}\n{\"at\": \"2026-09-05T19:22:12.249077+00:00\", \"phase\": \"catalog\", \"games\": 184010, \"regional\": 219990, \"discovery\": 1124605, \"pages\": 1350, \"game_tags\": 2914713, \"images\": 2958214}\n{\"at\": \"2026-09-05T19:22:12.462209+00:00\", \"this_run_completed\": 35651, \"this_run_bytes\": 6213150993, \"images_per_second\": 334.17, \"statuses\": {\"in_progress\": 400, \"missing\": 78, \"ok\": 133022, \"pending\": 2824714}}\n{\"at\": \"2026-09-05T19:22:33.089806+00:00\", \"this_run_completed\": 43300, \"this_run_bytes\": 7566103755, \"images_per_second\": 340.11, \"statuses\": {\"in_progress\": 700, \"missing\": 80, \"ok\": 140720, \"pending\": 2816714}}\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  155G  772G  17% /home\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"pkill -TERM -f '^python -u /home/adn/a327ex/steam-research/images.py -...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"953a8c","wall_time_seconds":1.000833581,"session_id":85047,"original_token_count":0,"output":""}
{}

[Think]

**Preparing regional CSV links**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/README.md\n...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"504fe9","wall_time_seconds":1.000887401,"session_id":36145,"original_token_count":0,"output":""}

[Think]

**Checking metadata coverage**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -2 /home/adn/a327ex/steam-research/2026-09-05/collector.log; tail...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"9e1199","wall_time_seconds":0.000002595,"exit_code":0,"original_token_count":434,"output":"{\"at\": \"2026-09-05T19:25:10.675403+00:00\", \"phase\": \"catalog\", \"games\": 184013, \"regional\": 272990, \"discovery\": 1186112, \"pages\": 1488, \"game_tags\": 2914763, \"images\": 2958260}\n{\"at\": \"2026-09-05T19:25:41.402643+00:00\", \"phase\": \"catalog\", \"games\": 184015, \"regional\": 280990, \"discovery\": 1195411, \"pages\": 1509, \"game_tags\": 2914789, \"images\": 2958286}\n{\"at\": \"2026-09-05T19:25:25.293137+00:00\", \"this_run_completed\": 44100, \"this_run_bytes\": 10028645614, \"images_per_second\": 423.87, \"statuses\": {\"error\": 1, \"in_progress\": 3900, \"missing\": 125, \"ok\": 206374, \"pending\": 2747860}}\n{\"at\": \"2026-09-05T19:25:46.300841+00:00\", \"this_run_completed\": 51774, \"this_run_bytes\": 11736301532, \"images_per_second\": 414.03, \"statuses\": {\"error\": 1, \"in_progress\": 4300, \"missing\": 125, \"ok\": 213974, \"pending\": 2739886}}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"at\": \"2026-09-05T19:25:32.325467+00:00\", \"phase\": \"search_us\", \"pages\": 331}\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  172G  756G  19% /home\n    PID %CPU   RSS     ELAPSED COMMAND\n2175244 36.3 236132      16:25 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2195243  0.5 36240       09:00 python -u /home/adn/a327ex/steam-research/search_check.py\n2214942  125 1218372     02:18 python -u /home/adn/a327ex/steam-research/images.py --workers 256 --variant preview --follow\n2219440  0.5 36244       00:34 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2221032 13.1 23848       00:00 python /home/adn/a327ex/Anchor/workflow/anchor.py drive eval /home/adn/a327ex/a327ex-site/renderer --file /tmp/claude-1000/-home-adn-a327ex/f5713695-5f84-4add-a994-b47ac00e592c/scratchpad/cap4.lua\n"}

[Think]

**Checking screenshot storage**

[Think]

**Checking screenshot storage**

**Preparing regional census**

The first five catalog checks have already found games absent from the US listing, so I’m extending the lightweight ID check to more regions. The detailed collection and image downloads continue alongside that. This should improve coverage without duplicating the full metadata download for every country.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 2.6 seconds
Output:

{}
{"chunk_id":"d949e1","wall_time_seconds":1.001014648,"session_id":54986,"original_token_count":0,"output":""}
{"chunk_id":"208ddf","wall_time_seconds":1.001172246,"session_id":24282,"original_token_count":0,"output":""}

[Think]

**Creating export test script**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json\nfrom pathlib import Path\nr=P...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"ba0841","wall_time_seconds":1.001047697,"session_id":3212,"original_token_count":0,"output":""}

[Think]

**Preparing flat games CSV**

exec ({"code": "text(await tools.exec_command({cmd:\"python -m venv --system-site-packages /home/adn/a327ex/steam-research/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"8186f1","wall_time_seconds":1.000841162,"session_id":10425,"original_token_count":0,"output":""}
{"chunk_id":"e86987","wall_time_seconds":0.000002524,"exit_code":0,"original_token_count":342,"output":"errors [('missing', '404', 155)]\nlatest ses\": {\"error\": 4, \"in_progress\": 2900, \"missing\": 155, \"ok\": 251341, \"pending\": 2703910}}\n{\"at\": \"2026-09-05T19:27:56.975396+00:00\", \"this_run_completed\": 96700, \"this_run_bytes\": 22983520809, \"images_per_second\": 378.14, \"statuses\": {\"error\": 4, \"in_progress\": 3300, \"missing\": 155, \"ok\": 258941, \"pending\": 2695910}}\n{\"at\": \"2026-09-05T19:28:17.136783+00:00\", \"this_run_completed\": 104900, \"this_run_bytes\": 25674696435, \"images_per_second\": 380.23, \"statuses\": {\"error\": 4, \"in_progress\": 3100, \"missing\": 156, \"ok\": 267140, \"pending\": 2687922}}\n\nmetadata teRead(0 bytes read, 122 more expected)))\"}\n{\"at\": \"2026-09-05T19:27:52.446032+00:00\", \"phase\": \"catalog\", \"games\": 184017, \"regional\": 317989, \"discovery\": 1289518, \"pages\": 1658, \"game_tags\": 2914829, \"images\": 2958310}\n{\"at\": \"2026-09-05T19:28:13.280788+00:00\", \"phase\": \"catalog\", \"games\": 184018, \"regional\": 323989, \"discovery\": 1330518, \"pages\": 1710, \"game_tags\": 2914844, \"images\": 2958322}\n\nwide {\"at\": \"2026-09-05T19:27:37.739594+00:00\", \"phase\": \"wide_ids\", \"games\": 184017, \"regional\": 313989, \"discovery\": 1251718, \"pages\": 1613, \"game_tags\": 2914829, \"images\": 2958310}\n{\"at\": \"2026-09-05T19:28:01.939260+00:00\", \"phase\": \"wide_ids\", \"games\": 184017, \"regional\": 320989, \"discovery\": 1295518, \"pages\": 1664, \"game_tags\": 2914829, \"images\": 2958310}\n\n"}

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 0.0 seconds
Output:

{}
{"chunk_id":"f33042","wall_time_seconds":0.000006434,"exit_code":0,"original_token_count":103,"output":"Collecting pyarrow\n  Downloading pyarrow-25.0.1-cp314-cp314-manylinux_2_28_x86_64.whl.metadata (3.0 kB)\nDownloading pyarrow-25.0.1-cp314-cp314-manylinux_2_28_x86_64.whl (50.1 MB)\n   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 50.1/50.1 MB 9.9 MB/s  0:00:05\nInstalling collected packages: pyarrow\nSuccessfully installed pyarrow-25.0.1\n"}

[Think]

**Preparing integrity checks**

[Think]

**Preparing integrity checks**

**Preparing clan macro expansion**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json,re\nfrom collections import Cou...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"c42ca5","wall_time_seconds":1.001025698,"session_id":11356,"original_token_count":0,"output":""}

[Think]

**Checking screenshot limits**

exec ({"code": "text(await tools.write_stdin({session_id:11356,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1200...)

Script completed
Wall time 3.8 seconds
Output:

{"chunk_id":"fa5c56","wall_time_seconds":3.7039406169999998,"exit_code":0,"original_token_count":99,"output":"Counter({'{STEAM_APP_IMAGE}': 147324, '{steam_app_image}': 37, '{Steam_App_Image}': 24, '{STEAM\\r\\n{STEAM_APP_IMAGE}': 1})\n{'{STEAM_APP_IMAGE}': '{STEAM_APP_IMAGE}/extras/main_menu_zora', '{steam_app_image}': '{steam_app_image}/extras/5.png', '{Steam_App_Image}': '{Steam_App_Image}/extras/FeaturesBanner.png', '{STEAM\\r\\n{STEAM_APP_IMAGE}': '{STEAM\\r\\n{STEAM_APP_IMAGE}/extras/minidemo.png.'}\n"}
{"chunk_id":"d84b74","wall_time_seconds":0.00000437,"exit_code":0,"original_token_count":163,"output":"{\"job\": [\"BR\", 183000], \"error\": \"ValueError('Nonmonotonic or duplicate IDs inside /home/adn/a327ex/steam-research/2026-09-05/raw/catalog/BR/00183000.json.gz')\"}\n{\"at\": \"2026-09-05T19:30:19.543051+00:00\", \"this_run_completed\": 144051, \"this_run_bytes\": 37809557680, \"images_per_second\": 361.67, \"statuses\": {\"error\": 7, \"in_progress\": 4000, \"missing\": 176, \"ok\": 306217, \"pending\": 2647951}}\n{\"at\": \"2026-09-05T19:30:13.596091+00:00\", \"phase\": \"search_us\", \"pages\": 465}\n{\"at\": \"2026-09-05T19:30:34.859227+00:00\", \"phase\": \"wide_ids\", \"games\": 184020, \"regional\": 365989, \"discovery\": 1668239, \"pages\": 2110, \"game_tags\": 2914884, \"images\": 2958351}\n"}

[Think]

**Preparing image collection**

[Think]

**Preparing image collection**

**Continuing image downloads**

The catalog now includes roughly 184,000 records, and the broader regional checks are still running. I’m also keeping Steam’s non-game records distinguishable rather than silently removing them; that will make later counts and filters reproducible.

More than 300,000 image files are saved so far. The finished dataset will include the SQLite database and portable Parquet tables, with an explicit report of coverage and any failed downloads.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/README.md...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"92d138","wall_time_seconds":1.001054631,"session_id":78710,"original_token_count":0,"output":""}

[Think]

**Validating SDK SQLite state**

exec ({"code": "text(await tools.write_stdin({session_id:78710,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":500}...)

Script completed
Wall time 5.2 seconds
Output:

{"chunk_id":"e09522","wall_time_seconds":5.000988881,"session_id":78710,"original_token_count":0,"output":""}
{"chunk_id":"f53985","wall_time_seconds":0.000004282,"exit_code":1,"original_token_count":284,"output":"{\"at\": \"2026-09-05T19:32:08.909728+00:00\", \"phase\": \"catalog\", \"games\": 184449, \"regional\": 395986, \"discovery\": 1926547, \"pages\": 2408, \"game_tags\": 2922066, \"images\": 2964361}\n{\"at\": \"2026-09-05T19:32:32.991221+00:00\", \"phase\": \"catalog\", \"games\": 184458, \"regional\": 403986, \"discovery\": 1996947, \"pages\": 2491, \"game_tags\": 2922170, \"images\": 2964518}\n{\"at\": \"2026-09-05T19:32:26.465947+00:00\", \"this_run_completed\": 183491, \"this_run_bytes\": 49949665853, \"images_per_second\": 349.36, \"statuses\": {\"error\": 8, \"in_progress\": 4600, \"missing\": 197, \"ok\": 345595, \"pending\": 2614118}}\n{\"at\": \"2026-09-05T19:32:46.858519+00:00\", \"this_run_completed\": 190700, \"this_run_bytes\": 52508310523, \"images_per_second\": 349.52, \"statuses\": {\"error\": 8, \"in_progress\": 1300, \"missing\": 205, \"ok\": 352887, \"pending\": 2610129}}\n{\"at\": \"2026-09-05T19:32:41.531406+00:00\", \"phase\": \"wide_ids\", \"games\": 184459, \"regional\": 406986, \"discovery\": 2020447, \"pages\": 2519, \"game_tags\": 2922175, \"images\": 2964529}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\ncat: /home/adn/a327ex/steam-research/2026-09-05/validation.json: No such file or directory\n"}

[Think]

**Running database quick check**

[Think]

**Running database quick check**

**Inspecting search logs**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -10 /home/adn/a327ex/steam-research/2026-09-05/search_check_resum...)

Script completed
Wall time 0.2 seconds
Output:

{"chunk_id":"6c80fe","wall_time_seconds":0.00000663,"exit_code":0,"original_token_count":439,"output":"{\"at\": \"2026-09-05T19:32:21.412841+00:00\", \"phase\": \"search_us\", \"pages\": 527}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"at\": \"2026-09-05T19:32:53.471248+00:00\", \"phase\": \"search_us\", \"pages\": 540}\n{\"at\": \"2026-09-05T19:33:24.704043+00:00\", \"phase\": \"search_us\", \"pages\": 557}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"at\": \"2026-09-05T19:33:56.192375+00:00\", \"phase\": \"search_us\", \"pages\": 570}\n{\"at\": \"2026-09-05T19:33:20.914362+00:00\", \"phase\": \"catalog\", \"games\": 184467, \"regional\": 419986, \"discovery\": 2132710, \"pages\": 2648, \"game_tags\": 2922283, \"images\": 2964639}\n{\"at\": \"2026-09-05T19:33:54.528740+00:00\", \"this_run_completed\": 207764, \"this_run_bytes\": 58753332649, \"images_per_second\": 338.78, \"statuses\": {\"error\": 8, \"in_progress\": 4300, \"missing\": 210, \"ok\": 369882, \"pending\": 2590283}}\n    PID %CPU   RSS     ELAPSED COMMAND\n2175244 32.0 266228      24:23 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2195243  0.5 26016       16:58 python -u /home/adn/a327ex/steam-research/search_check.py\n2214942  129 1578004     10:17 python -u /home/adn/a327ex/steam-research/images.py --workers 256 --variant preview --follow\n2224492  3.8 26356       06:36 python -u /home/adn/a327ex/steam-research/collect.py --phase wide_ids --countries GB,FR,CA,AU,KR,TW,HK,RU,UA,TR,IN,SG,MX,AR,TH,ID,VN,ZA --workers 3\n2224543  0.0 11976       06:34 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2236101 11.8 36372       01:51 python -u /home/adn/a327ex/steam-research/validate.py\n"}
{"chunk_id":"a6e86f","wall_time_seconds":0.000003265,"exit_code":0,"original_token_count":388,"output":"('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/544810/extras/HandCardsForSteam-01.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f1772c98cc0>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/724950/extras/StoryHeader.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f52b53b2f70>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/724950/extras/AboutHeader.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f52886d09f0>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/724950/extras/FeatureHeader.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f52b537c9a0>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/793280/extras/1.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f52ac10dcb0>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/793280/extras/2.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f52885b8a40>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/793280/extras/3.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f52ac0eac50>')\")\n('https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/859380/extras/seriouslearner.png', \"UnidentifiedImageError('cannot identify image file <_io.BytesIO object at 0x7f528872f6a0>')\")\n"}

[Think]

**Checking image response bytes**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,requests,json\nfrom pathlib import P...)

Script completed
Wall time 0.9 seconds
Output:

{"chunk_id":"a9a18a","wall_time_seconds":0.737105103,"exit_code":0,"original_token_count":360,"output":"{\"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/544810/extras/HandCardsForSteam-01.png\", \"status\": 200, \"content_type\": \"image/png\", \"bytes\": 249276, \"signature\": \"b'\\\\x89PNG\\\\r\\\\n\\\\x1a\\\\n\\\\x00\\\\x00\\\\x00\\\\rIHDR\\\\x00\\\\x00\\\\x02e\\\\x00\\\\x00\\\\x013\\\\x08\\\\x06\\\\x00\\\\x00\\\\x00p\\\\xb0tP\\\\x00\\\\x00 \\\\x90zTXtRaw profile type exif\\\\x00\\\\x00x\\\\xda\\\\xad\\\\x9bi\\\\x92$9\\\\x92\\\\x9d\\\\xff\\\\xe3\\\\x14<\\\\x026\\\\x85\\\\x02\\\\xc7\\\\xc1*\\\\xc2\\\\x1b\\\\xf0\\\\xf8\\\\xfc\\\\x9eETWuu\\\\xf7\\\\x8c\\\\x0c\\\\x85'\"}\n{\"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/724950/extras/StoryHeader.png\", \"status\": 200, \"content_type\": \"image/png\", \"bytes\": 66171, \"signature\": \"b'\\\\x89PNG\\\\r\\\\n\\\\x1a\\\\n\\\\x00\\\\x00\\\\x00\\\\rIHDR\\\\x00\\\\x00\\\\x02h\\\\x00\\\\x00\\\\x00l\\\\x08\\\\x06\\\\x00\\\\x00\\\\x00\\\\xde\\\\xe1Nv\\\\x00\\\\x00\\\\x0c\\\\xeazTXtRaw profile type exif\\\\x00\\\\x00x\\\\xda\\\\xad\\\\x98m\\\\x8e\\\\xab\\\\xb9n\\\\x84\\\\xffk\\\\x15Y\\\\x82\\\\xbeHI\\\\xcb\\\\x11E\\\\t\\\\xc8\\\\x0e\\\\xb2\\\\xfc<t{\\\\xe6\\\\xcc\\\\x9c;7@\\\\x82'\"}\n{\"url\": \"https://shared.fastly.steamstatic.com/store_item_assets/steam/apps/724950/extras/AboutHeader.png\", \"status\": 200, \"content_type\": \"image/png\", \"bytes\": 54093, \"signature\": \"b'\\\\x89PNG\\\\r\\\\n\\\\x1a\\\\n\\\\x00\\\\x00\\\\x00\\\\rIHDR\\\\x00\\\\x00\\\\x02h\\\\x00\\\\x00\\\\x00l\\\\x08\\\\x06\\\\x00\\\\x00\\\\x00\\\\xde\\\\xe1Nv\\\\x00\\\\x00\\\\x0c7zTXtRaw profile type exif\\\\x00\\\\x00x\\\\xda\\\\xad\\\\x98Y\\\\x8e4\\\\xbdnD\\\\xdfs\\\\x15^\\\\x82&R\\\\xd2r(Q\\\\x02\\\\xbc\\\\x03/\\\\xdf\\\\x87Y\\\\xf5\\\\x8d\\\\xf7\\\\xbf\\\\x06l\\\\xb8\\\\x1a'\"}\n"}

[Think]

**Testing PNG decoding**

[Think]

**Testing PNG decoding**

**Preserving unverified image bytes**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport requests,io\nfrom PIL import Image\nu='http...)

Script completed
Wall time 6.8 seconds
Output:

{"chunk_id":"4a167a","wall_time_seconds":1.556927316,"exit_code":0,"original_token_count":23,"output":"UnidentifiedImageError cannot identify image file <_io.BytesIO object at 0x7feca3399300>\n"}
{"chunk_id":"213632","wall_time_seconds":5.00154072,"session_id":78710,"original_token_count":0,"output":""}

[Think]

**Image database validation continues**

[Think]

**Image database validation continues**

exec ({"code": "text(await tools.exec_command({cmd:\"ls -lh /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite*; ps ...)

Script completed
Wall time 0.5 seconds
Output:

{"chunk_id":"a59065","wall_time_seconds":0.000007251,"exit_code":0,"original_token_count":315,"output":"-rw-r--r-- 1 adn adn 5.5G Sep  5 16:32 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite\n-rw-r--r-- 1 adn adn 4.4M Sep  5 16:36 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite-shm\n-rw-r--r-- 1 adn adn 2.2G Sep  5 16:36 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite-wal\n    PID %CPU   RSS     ELAPSED COMMAND\n2175244 31.4 260344      26:32 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2195243  0.5 29976       19:07 python -u /home/adn/a327ex/steam-research/search_check.py\n2214942  126 1448592     12:25 python -u /home/adn/a327ex/steam-research/images.py --workers 256 --variant preview --follow\n2224543  0.0 10172       08:43 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2236101 10.2 12808       03:59 python -u /home/adn/a327ex/steam-research/validate.py\n{\"at\": \"2026-09-05T19:35:10.270353+00:00\", \"phase\": \"catalog\", \"games\": 184476, \"regional\": 449986, \"discovery\": 2267006, \"pages\": 2840, \"game_tags\": 2922422, \"images\": 2964787}\n{\"at\": \"2026-09-05T19:35:51.673234+00:00\", \"this_run_completed\": 235779, \"this_run_bytes\": 68120287175, \"images_per_second\": 322.8, \"statuses\": {\"error\": 9, \"in_progress\": 4300, \"missing\": 215, \"ok\": 397876, \"pending\": 2562453}}\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"tail -20 /home/adn/a327ex/steam-research/2026-09-05/wide_ids.log; ls -...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"843086","wall_time_seconds":0.000004,"exit_code":0,"original_token_count":386,"output":"{\"at\": \"2026-09-05T19:33:02.445880+00:00\", \"phase\": \"wide_ids\", \"games\": 184467, \"regional\": 414986, \"discovery\": 2081147, \"pages\": 2586, \"game_tags\": 2922283, \"images\": 2964639}\n{\"at\": \"2026-09-05T19:33:22.948819+00:00\", \"phase\": \"wide_ids\", \"games\": 184467, \"regional\": 419986, \"discovery\": 2136810, \"pages\": 2653, \"game_tags\": 2922283, \"images\": 2964639}\n{\"at\": \"2026-09-05T19:33:43.505319+00:00\", \"phase\": \"wide_ids\", \"games\": 184469, \"regional\": 426986, \"discovery\": 2196210, \"pages\": 2726, \"game_tags\": 2922317, \"images\": 2964683}\nTraceback (most recent call last):\n  File \"/home/adn/a327ex/steam-research/collect.py\", line 301, in <module>\n    collect(parser.parse_args())\n    ~~~~~~~^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/adn/a327ex/steam-research/collect.py\", line 288, in collect\n    status(db, phase)\n    ~~~~~~^^^^^^^^^^^\n  File \"/home/adn/a327ex/steam-research/collect.py\", line 245, in status\n    dump(ROOT / 'collection_status.json', out)\n    ~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/adn/a327ex/steam-research/collect.py\", line 47, in dump\n    tmp.replace(path)\n    ~~~~~~~~~~~^^^^^^\n  File \"/usr/lib/python3.14/pathlib/__init__.py\", line 1091, in replace\n    os.replace(self, target)\n    ~~~~~~~~~~^^^^^^^^^^^^^^\nFileNotFoundError: [Errno 2] No such file or directory: '/home/adn/a327ex/steam-research/2026-09-05/collection_status.json.tmp' -> '/home/adn/a327ex/steam-research/2026-09-05/collection_status.json'\n-rw-r--r-- 1 adn adn 2 Sep  5 16:19 /home/adn/a327ex/steam-research/2026-09-05/verify_ids_errors.json\n"}

[Think]

**Updating temporary dump paths**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"1243c6","wall_time_seconds":1.001010459,"session_id":17264,"original_token_count":0,"output":""}

[Think]

**Checking local image coverage**

[Think]

**Checking local image coverage**

**Preparing export supervisor**

[Think]

**Checking local image coverage**

**Preparing export supervisor**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -1 /home/adn/a327ex/steam-research/2026-09-05/collector.log; tail...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"5d2fa1","wall_time_seconds":0.000030801,"exit_code":0,"original_token_count":191,"output":"{\"at\": \"2026-09-05T19:37:40.948388+00:00\", \"phase\": \"catalog\", \"games\": 184492, \"regional\": 488985, \"discovery\": 2366911, \"pages\": 3001, \"game_tags\": 2922682, \"images\": 2965024}\n{\"at\": \"2026-09-05T19:38:11.321561+00:00\", \"this_run_completed\": 266500, \"this_run_bytes\": 79475763930, \"images_per_second\": 306.3, \"statuses\": {\"error\": 10, \"in_progress\": 1500, \"missing\": 226, \"ok\": 428664, \"pending\": 2534638}}\n{\"at\": \"2026-09-05T19:37:34.805396+00:00\", \"phase\": \"wide_ids\", \"games\": 184492, \"regional\": 488985, \"discovery\": 2366911, \"pages\": 3001, \"game_tags\": 2922682, \"images\": 2965024}\n{\"at\": \"2026-09-05T19:38:07.964705+00:00\", \"phase\": \"search_us\", \"pages\": 690}\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  239G  689G  26% /home\n"}

[Think]

**Downloading original images**

[Think]

**Downloading original images**

**Updating image error handling**

[Think]

**Downloading original images**

**Updating image error handling**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/images.py...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"613a9f","wall_time_seconds":1.001239411,"session_id":5109,"original_token_count":0,"output":""}

[Think]

**Adjusting image coverage**

[Think]

**Adjusting image coverage**

[Think]

**Adjusting image coverage**

**Waiting for downloads**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -1 /home/adn/a327ex/steam-research/2026-09-05/collector.log; tail...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"2a99bd","wall_time_seconds":0.000002824,"exit_code":0,"original_token_count":173,"output":"{\"at\": \"2026-09-05T19:41:08.309818+00:00\", \"phase\": \"catalog\", \"games\": 184508, \"regional\": 554985, \"discovery\": 2832173, \"pages\": 3554, \"game_tags\": 2922931, \"images\": 2965248}\n{\"at\": \"2026-09-05T19:41:02.283560+00:00\", \"this_run_completed\": 10200, \"this_run_bytes\": 4165552755, \"images_per_second\": 161.77, \"statuses\": {\"error\": 10, \"in_progress\": 1800, \"missing\": 245, \"ok\": 463742, \"pending\": 2499448, \"stored_unverified\": 3}}\n{\"at\": \"2026-09-05T19:41:02.612022+00:00\", \"phase\": \"wide_ids\", \"games\": 184508, \"regional\": 552985, \"discovery\": 2813436, \"pages\": 3533, \"game_tags\": 2922931, \"images\": 2965248}\n{\"at\": \"2026-09-05T19:41:18.039032+00:00\", \"phase\": \"search_us\", \"pages\": 781}\n"}

[Think]

**Checking image storage limits**

[Think]

**Checking image storage limits**

**Capping oversized image files**

[Think]

**Checking image storage limits**

**Capping oversized image files**

The saved pictures have grown past 100 GB, largely because some description images are large animations. I’m putting a size bound on those downloads so the archive stays practical. Their source links will remain in the manifest; screenshot galleries and store artwork will still be collected across the catalog.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/images.py...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"7cd7d6","wall_time_seconds":1.000788374,"session_id":48072,"original_token_count":0,"output":""}

[Think]

**Checking pending-scan cost**

[Think]

**Checking pending-scan cost**

**Updating manifest statuses**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"ddb1e2","wall_time_seconds":1.000711194,"session_id":24396,"original_token_count":0,"output":""}

[Think]

**Reviewing search results**

[Think]

**Reviewing search results**

**Validating app type samples**

[Think]

**Reviewing search results**

**Validating app type samples**

[Think]

**Reviewing search results**

**Validating app type samples**

**Exporting dataset bundle**

Status update, I was talking in side chat about the fact that Steam probably doesn't appreciate bulk download of 10000000000000000000000GB of files from their systems. What's the solution and what's the status on your data gathering?

I’ll pause the image downloads first and check what’s saved and what’s still running. We can keep a comprehensive dataset without downloading every image file: preserve all image URLs and metadata, then fetch a bounded sample or selected games when a visual analysis needs them.

exec ({"code": "text(await tools.exec_command({cmd:\"pkill -TERM -f '^python -u /home/adn/a327ex/steam-research/images.py ....)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"419a23","wall_time_seconds":0.000003496,"exit_code":0,"original_token_count":521,"output":"    PID %CPU   RSS     ELAPSED COMMAND\n2175244 27.9 281332      37:21 python -u /home/adn/a327ex/steam-research/collect.py --countries US,BR,JP,CN,DE --workers 4\n2195243  0.5 27296       29:55 python -u /home/adn/a327ex/steam-research/search_check.py\n2224543  0.0 10148       19:32 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2248575  3.5 30600       10:08 python -u /home/adn/a327ex/steam-research/collect.py --phase wide_ids --countries GB,FR,CA,AU,KR,TW,HK,RU,UA,TR,IN,SG,MX,AR,TH,ID,VN,ZA --workers 3\n2266802 67.8     0       02:59 [python] <defunct>\n{\"at\": \"2026-09-05T19:46:02.847609+00:00\", \"phase\": \"catalog\", \"games\": 184553, \"regional\": 635982, \"discovery\": 3444112, \"pages\": 4278, \"game_tags\": 2923631, \"images\": 2966071}\n{\"at\": \"2026-09-05T19:46:32.272778+00:00\", \"phase\": \"catalog\", \"games\": 184555, \"regional\": 644982, \"discovery\": 3526289, \"pages\": 4381, \"game_tags\": 2923661, \"images\": 2966098}\n{\"at\": \"2026-09-05T19:46:18.942191+00:00\", \"this_run_completed\": 26049, \"this_run_bytes\": 5666330937, \"images_per_second\": 181.89, \"statuses\": {\"error\": 11, \"in_progress\": 2000, \"manifest_large\": 504, \"manifest_only\": 864096, \"missing\": 292, \"ok\": 523087, \"pending\": 1576102, \"stored_unverified\": 6}}\n{\"at\": \"2026-09-05T19:46:39.085492+00:00\", \"this_run_completed\": 31838, \"this_run_bytes\": 6926483373, \"images_per_second\": 194.9, \"statuses\": {\"error\": 11, \"in_progress\": 4200, \"manifest_large\": 602, \"manifest_only\": 864096, \"missing\": 292, \"ok\": 528789, \"pending\": 1568102, \"stored_unverified\": 6}}\n{\"at\": \"2026-09-05T19:46:34.089665+00:00\", \"phase\": \"wide_ids\", \"games\": 184555, \"regional\": 645982, \"discovery\": 3532389, \"pages\": 4383, \"game_tags\": 2923661, \"images\": 2966098}\n{\"at\": \"2026-09-05T19:46:54.483610+00:00\", \"phase\": \"wide_ids\", \"games\": 184556, \"regional\": 651981, \"discovery\": 3591291, \"pages\": 4450, \"game_tags\": 2923681, \"images\": 2966117}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\n{\"event\": \"backoff\", \"status\": 429, \"seconds\": 5}\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  274G  655G  30% /home\n"}

[Think]

**Checking metadata counts**

exec ({"code": "text(await tools.exec_command({cmd:\"pkill -TERM -f '^python -u /home/adn/a327ex/steam-research/(collect.py...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"23ab2d","wall_time_seconds":1.001402218,"session_id":29530,"original_token_count":0,"output":""}

[Think]

**Processing metadata only**

[Think]

**Processing metadata only**

**Auditing metadata coverage**

exec ({"code": "text(await tools.write_stdin({session_id:29530,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":4000...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"e0c6d6","wall_time_seconds":0.000001615,"exit_code":0,"original_token_count":868,"output":"{\n  \"at\": \"2026-09-05T19:47:35.604718+00:00\",\n  \"metadata_records\": 184560,\n  \"types\": [\n    [\n      0,\n      184559\n    ],\n    [\n      14,\n      1\n    ]\n  ],\n  \"distinct_discovered_ids\": 185170,\n  \"regional_records\": 664981,\n  \"images\": [\n    [\n      \"error\",\n      11,\n      0\n    ],\n    [\n      \"in_progress\",\n      3200,\n      0\n    ],\n    [\n      \"manifest_large\",\n      672,\n      0\n    ],\n    [\n      \"manifest_only\",\n      864096,\n      0\n    ],\n    [\n      \"missing\",\n      295,\n      0\n    ],\n    [\n      \"ok\",\n      533716,\n      144808320588\n    ],\n    [\n      \"pending\",\n      1564178,\n      0\n    ],\n    [\n      \"stored_unverified\",\n      6,\n      543962\n    ]\n  ],\n  \"games_with_saved_images\": 41756,\n  \"catalog_pages\": [\n    [\n      \"catalog\",\n      \"BR\",\n      182,\n      181000,\n      183195,\n      183195\n    ],\n    [\n      \"catalog\",\n      \"CN\",\n      115,\n      115000,\n      174361,\n      174361\n    ],\n    [\n      \"catalog\",\n      \"DE\",\n      1,\n      1000,\n      154052,\n      154052\n    ],\n    [\n      \"catalog\",\n      \"JP\",\n      185,\n      184000,\n      184364,\n      184364\n    ],\n    [\n      \"catalog\",\n      \"US\",\n      185,\n      184000,\n      184611,\n      184611\n    ],\n    [\n      \"search_us\",\n      \"US\",\n      947,\n      94700,\n      184682,\n      184682\n    ],\n    [\n      \"verify_ids\",\n      \"BR\",\n      185,\n      183195,\n      183195,\n      183195\n    ],\n    [\n      \"verify_ids\",\n      \"CN\",\n      176,\n      174361,\n      174361,\n      174361\n    ],\n    [\n      \"verify_ids\",\n      \"DE\",\n      156,\n      154052,\n      154052,\n      154052\n    ],\n    [\n      \"verify_ids\",\n      \"JP\",\n      186,\n      184364,\n      184364,\n      184364\n    ],\n    [\n      \"verify_ids\",\n      \"US\",\n      186,\n      184611,\n      184611,\n      184611\n    ],\n    [\n      \"wide_ids\",\n      \"AR\",\n      1,\n      1000,\n      184601,\n      184601\n    ],\n    [\n      \"wide_ids\",\n      \"AU\",\n      186,\n      184565,\n      184565,\n      184565\n    ],\n    [\n      \"wide_ids\",\n      \"CA\",\n      186,\n      184616,\n      184616,\n      184616\n    ],\n    [\n      \"wide_ids\",\n      \"FR\",\n      186,\n      184589,\n      184589,\n      184589\n    ],\n    [\n      \"wide_ids\",\n      \"GB\",\n      186,\n      184606,\n      184606,\n      184606\n    ],\n    [\n      \"wide_ids\",\n      \"HK\",\n      186,\n      184538,\n      184538,\n      184538\n    ],\n    [\n      \"wide_ids\",\n      \"ID\",\n      1,\n      1000,\n      184546,\n      184546\n    ],\n    [\n      \"wide_ids\",\n      \"IN\",\n      186,\n      184562,\n      184562,\n      184562\n    ],\n    [\n      \"wide_ids\",\n      \"KR\",\n      185,\n      183985,\n      183985,\n      183985\n    ],\n    [\n      \"wide_ids\",\n      \"MX\",\n      1,\n      1000,\n      184617,\n      184617\n    ],\n    [\n      \"wide_ids\",\n      \"RU\",\n      182,\n      180280,\n      180280,\n      180280\n    ],\n    [\n      \"wide_ids\",\n      \"SG\",\n      36,\n      36000,\n      184583,\n      184583\n    ],\n    [\n      \"wide_ids\",\n      \"TH\",\n      1,\n      1000,\n      184541,\n      184541\n    ],\n    [\n      \"wide_ids\",\n      \"TR\",\n      186,\n      184579,\n      184579,\n      184579\n    ],\n    [\n      \"wide_ids\",\n      \"TW\",\n      186,\n      184542,\n      184542,\n      184542\n    ],\n    [\n      \"wide_ids\",\n      \"UA\",\n      186,\n      184556,\n      184556,\n      184556\n    ],\n    [\n      \"wide_ids\",\n      \"VN\",\n      1,\n      1000,\n      184387,\n      184387\n    ],\n    [\n      \"wide_ids\",\n      \"ZA\",\n      1,\n      1000,\n      184583,\n      184583\n    ]\n  ]\n}\n"}
{"chunk_id":"b3baeb","wall_time_seconds":0.000003495,"exit_code":1,"original_token_count":10,"output":"    PID %CPU   RSS     ELAPSED COMMAND\n"}

[Think]

**Recovering 610 pending records**

[Think]

**Recovering 610 pending records**

**Reconciling metadata tails**

[Think]

**Recovering 610 pending records**

**Reconciling metadata tails**

[Think]

**Recovering 610 pending records**

**Reconciling metadata tails**

**Pausing network collection**

Everything is now paused. The saved data includes 184,559 game records and 533,716 verified image files—about 145 GB—covering 41,756 games. Final reconciliation and validation are still unfinished.

I overshot the image collection. We don’t need a local copy of every picture to maintain a comprehensive catalog. The existing image cache also skews toward earlier app IDs, so its size shouldn’t be mistaken for a representative sample. Separately, Steam’s search endpoint did return HTTP 429 responses; that crawl should stay stopped rather than keep retrying.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/network_poli...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"d4dcbf","wall_time_seconds":1.000133434,"session_id":7346,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.write_stdin({session_id:7346,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":500})...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"252ed8","wall_time_seconds":0.000441085,"exit_code":0,"original_token_count":19,"output":"Pause saved; interrupted image claims released; existing files retained.\n"}
{"chunk_id":"d157a6","wall_time_seconds":0.216817782,"exit_code":0,"original_token_count":33,"output":"Verified metadata guard: Network collection is paused by network_policy.json\nVerified image guard: bulk download cannot restart.\n"}

I overshot the image collection. All network collection is now paused, and I’ve added guards against accidentally restarting it. Nothing already collected was deleted.

Current status:

Data Saved
Game metadata records, including upcoming games 184,559
Distinct candidate app IDs discovered 185,170
Image references indexed About 2.97 million
Verified image files downloaded 533,716
Downloaded image size 144.8 GB
Games with saved images 41,756

The metadata still needs reconciliation, final validation, and exports. The image cache skews toward earlier app IDs; it isn’t a representative sample simply because it’s large.

The solution is to separate catalog completeness from image downloading:

  • Preserve comprehensive metadata and image URLs.
  • Finish metadata reconciliation using saved responses first, then minimal batched requests.
  • For each visual question, select a representative sample and impose a firm download budget. Reuse cached files.
  • Stop on rate-limit responses. Steam’s search endpoint did return HTTP 429 responses; continuing that redundant crawl wasn’t necessary.

We don’t know Steam’s precise tolerance, but we don’t need to test it. A complete image-reference catalog plus targeted downloads supports the research without mirroring their image library.

Everything is retained in the research directory’s README, with the exact paused status.

Delete the images folder, delete all image downloading machinery. Did you finish downloading data (not images or other data heavy assets) on all games?

I’ll delete the downloaded images and their downloader, while retaining image references in Steam’s metadata. I’ll also check exactly how much of the game-data collection is complete.

exec ({"code": "text(await tools.exec_command({cmd:\"ls -la /home/adn/a327ex/steam-research; ls -lah /home/adn/a327ex/steam...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"d9df26","wall_time_seconds":0.000003708,"exit_code":0,"original_token_count":2217,"output":"total 76\ndrwxr-xr-x 1 adn adn   276 Sep  5 16:50 .\ndrwxr-xr-x 1 adn adn   198 Sep  5 16:01 ..\ndrwxr-xr-x 1 adn adn    76 Sep  5 16:28 .venv\ndrwxr-xr-x 1 adn adn   886 Sep  5 16:50 2026-09-05\n-rw-r--r-- 1 adn adn  8636 Sep  5 16:50 README.md\ndrwxr-xr-x 1 adn adn   350 Sep  5 16:50 __pycache__\n-rw-r--r-- 1 adn adn 16840 Sep  5 16:50 collect.py\n-rw-r--r-- 1 adn adn  2156 Sep  5 16:29 export.py\n-rw-r--r-- 1 adn adn  1950 Sep  5 16:27 finish_metadata.py\n-rw-r--r-- 1 adn adn 10380 Sep  5 16:50 images.py\n-rw-r--r-- 1 adn adn   321 Sep  5 16:50 network_policy.json\n-rw-r--r-- 1 adn adn  6166 Sep  5 16:27 reconcile.py\n-rw-r--r-- 1 adn adn  3536 Sep  5 16:16 search_check.py\n-rw-r--r-- 1 adn adn  3124 Sep  5 16:32 validate.py\ntotal 6.1G\ndrwxr-xr-x 1 adn adn  886 Sep  5 16:50 .\ndrwxr-xr-x 1 adn adn  276 Sep  5 16:50 ..\ndrwxr-xr-x 1 adn adn 1.7K Sep  5 16:14 audit\n-rw-r--r-- 1 adn adn 6.1G Sep  5 16:50 catalog.sqlite\n-rw-r--r-- 1 adn adn  195 Sep  5 16:47 collection_status.json\n-rw-r--r-- 1 adn adn  16K Sep  5 16:47 collector.log\n-rw-r--r-- 1 adn adn    0 Sep  5 16:27 finish_metadata.log\n-rw-r--r-- 1 adn adn  347 Sep  5 16:46 image_status.json\ndrwxr-xr-x 1 adn adn 1.0K Sep  5 16:11 images\n-rw-r--r-- 1 adn adn 2.7K Sep  5 16:15 images.log\n-rw-r--r-- 1 adn adn 1.7K Sep  5 16:42 images_archive.log\n-rw-r--r-- 1 adn adn  792 Sep  5 16:43 images_bounded.log\n-rw-r--r-- 1 adn adn  950 Sep  5 16:20 images_catalog.log\n-rw-r--r-- 1 adn adn 1.8K Sep  5 16:46 images_current.log\n-rw-r--r-- 1 adn adn 9.9K Sep  5 16:39 images_final.log\ndrwxr-xr-x 1 adn adn 1.0K Sep  5 16:15 images_preview\n-rw-r--r-- 1 adn adn 1.7K Sep  5 16:18 images_preview.log\n-rw-r--r-- 1 adn adn 2.1K Sep  5 16:23 images_streaming.log\n-rw-r--r-- 1 adn adn 3.4K Sep  5 16:50 paused_status.json\ndrwxr-xr-x 1 adn adn   68 Sep  5 16:27 raw\n-rw-r--r-- 1 adn adn 1.5K Sep  5 16:16 search_check.log\n-rw-r--r-- 1 adn adn 8.3K Sep  5 16:47 search_check_resumed.log\n-rw-r--r-- 1 adn adn    0 Sep  5 16:32 validation_progress.log\n-rw-r--r-- 1 adn adn 4.2K Sep  5 16:18 verify_ids.log\n-rw-r--r-- 1 adn adn    2 Sep  5 16:19 verify_ids_errors.json\n-rw-r--r-- 1 adn adn  362 Sep  5 16:19 verify_ids_reconciled.log\n-rw-r--r-- 1 adn adn 4.1K Sep  5 16:34 wide_ids.log\n-rw-r--r-- 1 adn adn 4.6K Sep  5 16:47 wide_ids_resumed.log\n-rw-r--r-- 1 adn adn  196 Sep  5 16:47 wide_ids_status.json\n    PID COMMAND\n/home/adn/a327ex/steam-research/network_policy.json:3:  \"bulk_image_downloads_enabled\": false,\n/home/adn/a327ex/steam-research/validate.py:18:    checks['orphan_image_associations'] = db.execute('SELECT COUNT(*) FROM game_images WHERE image_id NOT IN (SELECT image_id FROM images)').fetchone()[0]\n/home/adn/a327ex/steam-research/finish_metadata.py:45:dump(ROOT / 'metadata_complete.json', {'completed_at': utc(),\n/home/adn/a327ex/steam-research/export.py:19:              'game_categories','category_names','game_images','images','discovery','pages']\n/home/adn/a327ex/steam-research/README.md:5:image downloader. All saved data is retained. Use comprehensive image references\n/home/adn/a327ex/steam-research/README.md:17:download times are recorded explicitly; the directory date is the requested\n/home/adn/a327ex/steam-research/README.md:23:  tags/creators/languages/features, and image manifest/download status.\n/home/adn/a327ex/steam-research/README.md:34:The SQLite `images` table links each file to its source URL, actual download URL,\n/home/adn/a327ex/steam-research/README.md:36:the manifest does **not** mean its bytes have been downloaded. Only status `ok`\n/home/adn/a327ex/steam-research/README.md:42:download set. `missing`, `denied`, and `error` are not silently discarded.\n/home/adn/a327ex/steam-research/README.md:44:downloading its full bytes. This bounds the cost of large animated descriptions;\n/home/adn/a327ex/steam-research/README.md:50:the full raw metadata and image manifest; some were also downloaded during the\n/home/adn/a327ex/steam-research/README.md:51:initial audit. No trailers are downloaded; all returned trailer metadata and\n/home/adn/a327ex/steam-research/README.md:72:6. Images are fetched directly from Steam's CDNs. Description-image downloads are\n/home/adn/a327ex/steam-research/README.md:112:Image downloads stop before free disk falls below 60 GiB and reject individual\n/home/adn/a327ex/steam-research/README.md:120:python images.py --workers 128 --variant preview --follow\n/home/adn/a327ex/steam-research/README.md:126:`metadata_complete.json` is written after discovery and metadata reconciliation,\n/home/adn/a327ex/steam-research/README.md:142:       i.url AS original_url, i.download_url, i.local_path, i.width, i.height\n/home/adn/a327ex/steam-research/README.md:143:FROM games g JOIN game_images gi USING(appid)\n/home/adn/a327ex/steam-research/images.py:27:def download(row):\n/home/adn/a327ex/steam-research/images.py:32:    # URL in the manifest, and the actual download URL separately.\n/home/adn/a327ex/steam-research/images.py:112:    if policy.get('network_paused') or not policy.get('bulk_image_downloads_enabled', True):\n/home/adn/a327ex/steam-research/images.py:113:        raise SystemExit('Bulk image downloading is disabled by network_policy.json; use a bounded selection for future visual analysis.')\n/home/adn/a327ex/steam-research/images.py:117:    if 'download_url' not in columns:\n/home/adn/a327ex/steam-research/images.py:118:        db.execute('ALTER TABLE images ADD COLUMN download_url TEXT')\n/home/adn/a327ex/steam-research/images.py:119:        db.execute('UPDATE images SET download_url=url WHERE status=\"ok\"')\n/home/adn/a327ex/steam-research/images.py:121:    db.execute('CREATE INDEX IF NOT EXISTS game_images_by_image ON game_images(image_id,kind)')\n/home/adn/a327ex/steam-research/images.py:125:    downloaded_bytes = 0\n/home/adn/a327ex/steam-research/images.py:129:    db.execute('UPDATE images AS i SET status=\"manifest_only\" WHERE status=\"pending\" AND NOT EXISTS (SELECT 1 FROM game_images g WHERE g.image_id=i.image_id AND ' + STORE_PICTURES + ')')\n/home/adn/a327ex/steam-research/images.py:132:    sql_update = 'UPDATE images SET status=?,local_path=?,sha256=?,bytes=?,width=?,height=?,fetched_at=?,error=?,attempts=?,download_url=? WHERE image_id=?'\n/home/adn/a327ex/steam-research/images.py:138:                rows = db.execute('SELECT i.image_id,i.url,i.attempts FROM images i WHERE i.status=\"pending\" AND EXISTS (SELECT 1 FROM game_images g WHERE g.image_id=i.image_id AND ' + STORE_PICTURES + ') LIMIT ?', (args.batch,)).fetchall()\n/home/adn/a327ex/steam-research/images.py:143:                active.add(pool.submit(download, queue.popleft()))\n/home/adn/a327ex/steam-research/images.py:149:                if args.follow and not (ROOT / 'metadata_complete.json').exists():\n/home/adn/a327ex/steam-research/images.py:158:                downloaded_bytes += result[3] or 0\n/home/adn/a327ex/steam-research/images.py:164:                    out = {'at': utc(), 'this_run_completed': completed, 'this_run_bytes': downloaded_bytes,\n/home/adn/a327ex/steam-research/images.py:167:                    dump(ROOT / 'image_status.json', out)\n/home/adn/a327ex/steam-research/images.py:175:    db.execute('UPDATE images AS i SET status=\"manifest_only\" WHERE status=\"pending\" AND NOT EXISTS (SELECT 1 FROM game_images g WHERE g.image_id=i.image_id AND ' + STORE_PICTURES + ')')\n/home/adn/a327ex/steam-research/images.py:179:    dump(ROOT / 'image_status.json', out)\n/home/adn/a327ex/steam-research/reconcile.py:59:                                   'languages','game_categories','images','game_images']}\n/home/adn/a327ex/steam-research/reconcile.py:81:    for table in ['game_tags','creators','languages','game_categories','game_images']:\n/home/adn/a327ex/steam-research/reconcile.py:83:    out['image_status'] = dict(db.execute('SELECT status,COUNT(*) FROM images GROUP BY status').fetchall())\n/home/adn/a327ex/steam-research/reconcile.py:85:    out['image_kinds'] = dict(db.execute('SELECT kind,COUNT(*) FROM game_images GROUP BY kind').fetchall())\n/home/adn/a327ex/steam-research/collect.py:123:      CREATE TABLE IF NOT EXISTS images (\n/home/adn/a327ex/steam-research/collect.py:127:      CREATE TABLE IF NOT EXISTS game_images (\n/home/adn/a327ex/steam-research/collect.py:132:      CREATE INDEX IF NOT EXISTS game_images_app ON game_images(appid);\n/home/adn/a327ex/steam-research/collect.py:137:def image_refs(item):\n/home/adn/a327ex/steam-research/collect.py:143:    # Preserve the full asset manifest in raw JSON; download store-facing visual assets.\n/home/adn/a327ex/steam-research/collect.py:188:    for table in ['game_tags', 'creators', 'languages', 'game_categories', 'game_images']:\n/home/adn/a327ex/steam-research/collect.py:200:    for kind, ordinal, url in image_refs(item):\n/home/adn/a327ex/steam-research/collect.py:210:        db.execute('INSERT OR IGNORE INTO game_images VALUES(?,?,?,?)', (appid, image_id, kind, ordinal))\n"}

No—the metadata collection was not finished. At the pause, it had metadata for 184,559 games, with 185,170 candidate app IDs discovered. Some remaining records are already in saved responses but still need to be imported; the regional checks and final validation are also incomplete.

[Think]

**Preparing targeted file deletion**

exec ({"code": "text(await tools.exec_command({cmd:\"python -u - <<'PY'\nfrom pathlib import Path\nimport shutil,json,dat...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"0e9318","wall_time_seconds":1.001208954,"session_id":52276,"original_token_count":15,"output":"Deleted /home/adn/a327ex/steam-research/2026-09-05/images\n"}
{}

[Think]

**Rewriting README**

exec ({"code": "text(await tools.exec_command({cmd:\"python -u - <<'PY'\nfrom pathlib import Path\nimport sqlite3,json,da...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"420916","wall_time_seconds":1.001404557,"session_id":95651,"original_token_count":0,"output":""}
{"chunk_id":"3ff3c4","wall_time_seconds":0.000002516,"exit_code":0,"original_token_count":0,"output":""}
{"chunk_id":"79b6ae","wall_time_seconds":0.000001408,"exit_code":0,"original_token_count":249,"output":"Deleted /home/adn/a327ex/steam-research/2026-09-05/images_preview\nDeleted /home/adn/a327ex/steam-research/images.py\nDeleted /home/adn/a327ex/steam-research/2026-09-05/image_status.json\nDeleted /home/adn/a327ex/steam-research/2026-09-05/audit/image_probe.json\nDeleted /home/adn/a327ex/steam-research/2026-09-05/audit/image_sizes.json\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_preview.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_catalog.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_streaming.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_final.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_archive.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_bounded.log\nDeleted /home/adn/a327ex/steam-research/2026-09-05/images_current.log\nDeleted /home/adn/a327ex/steam-research/__pycache__/images.cpython-314.pyc\nImage files and downloader removed.\n"}

[Think]

**Checking catalog completeness**

exec ({"code": "text(await tools.write_stdin({session_id:95651,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1200...)

Script completed
Wall time 5.1 seconds
Output:

{"chunk_id":"ee3add","wall_time_seconds":5.00082449,"session_id":95651,"original_token_count":0,"output":""}
{"chunk_id":"14ad37","wall_time_seconds":0.000003915,"exit_code":0,"original_token_count":113,"output":"/home/adn/a327ex/steam-research/collect.py:271:    with cf.ThreadPoolExecutor(max_workers=args.workers) as pool:\n/home/adn/a327ex/steam-research/reconcile.py:43:    for country, ids, data in cf.ThreadPoolExecutor(max_workers=3).map(batch, jobs):\n/home/adn/a327ex/steam-research/search_check.py:52:    with cf.ThreadPoolExecutor(max_workers=3) as pool:\nFilesystem        Size  Used Avail Use% Mounted on\n/dev/mapper/root  930G  131G  794G  15% /home\n"}

[Think]

**Removing download-queue records**

exec ({"code": "text(await tools.write_stdin({session_id:95651,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1200...)

Script completed
Wall time 5.1 seconds
Output:

{"chunk_id":"14a347","wall_time_seconds":5.001140105,"session_id":95651,"original_token_count":0,"output":""}
{"chunk_id":"2320b2","wall_time_seconds":0.000003001,"exit_code":0,"original_token_count":96,"output":"    PID %CPU   RSS     ELAPSED COMMAND\n2312602 60.5 20828       01:04 python -u -\n-rw-r--r-- 1 adn adn 6.1G Sep  5 16:50 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite\n-rw-r--r-- 1 adn adn 1.9M Sep  5 17:02 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite-shm\n-rw-r--r-- 1 adn adn 920M Sep  5 17:02 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite-wal\n"}

The image files and downloader are deleted. I’m now removing the download queue and cached-file bookkeeping from the database. Source URLs and game metadata will remain; no collectors are running.

exec ({"code": "text(await tools.write_stdin({session_id:95651,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1200...)

Script completed
Wall time 5.0 seconds
Output:

{"chunk_id":"242269","wall_time_seconds":5.001567196,"session_id":95651,"original_token_count":0,"output":""}

[Think]

**Testing metadata completeness**

[Think]

**Testing metadata completeness**

**Verifying metadata completeness**

exec ({"code": "text(await tools.write_stdin({session_id:95651,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1200...)

Script completed
Wall time 5.0 seconds
Output:

{"chunk_id":"09f546","wall_time_seconds":5.001507994,"session_id":95651,"original_token_count":0,"output":""}

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1200}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.0 seconds
Output:

{"chunk_id":"e4cf63","wall_time_seconds":50.001794915,"session_id":95651,"original_token_count":28,"output":"Retained 2966174 URL references; deleted download queue, file paths and transfer state.\nCompacting database.\n"}

[Think]

**Waiting for vacuum completion**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1200}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.0 seconds
Output:

{"chunk_id":"35ab6d","wall_time_seconds":50.001322091,"session_id":95651,"original_token_count":0,"output":""}

The images, downloader code, and download-queue state are gone. Only lightweight URL references remain. Database compaction is the last cleanup step; network collection remains paused.

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1200}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 42.8 seconds
Output:

{"chunk_id":"5d78b6","wall_time_seconds":42.803850496,"exit_code":0,"original_token_count":13,"output":"Database compacted.\nRemaining Python scripts parse.\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport sqlite3,json\nb=P...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"433aca","wall_time_seconds":1.000758509,"session_id":71465,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.write_stdin({session_id:71465,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":700}...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"effe15","wall_time_seconds":0.000001074,"exit_code":0,"original_token_count":39,"output":"{\"image_files_and_downloader_deleted\": true, \"game_records\": 184559, \"candidate_app_ids\": 185170, \"image_url_references\": 2966174, \"network_paused\": true}\n"}

Deleted both image directories, the downloader, its logs/cache, and all download-queue machinery. Lightweight image URLs remain in the metadata.

No, the game-data collection wasn’t finished. It contains 184,559 game records and 185,170 discovered candidate app IDs. Some saved responses still need importing; remaining regional checks, reconciliation, validation, and exports are unfinished.

Network collection remains paused.

Finish the game-data collection and then tell me exactly what data exists for the games.

I’ll finish the metadata collection, reconcile the missing records, and validate the results. Then I’ll report exactly which fields are available and how complete each one is. Image and other asset downloads will stay removed.

exec ({"code": "text(await tools.exec_command({cmd:\"cat /home/adn/a327ex/steam-research/network_policy.json; cat /home/adn...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"e1471f","wall_time_seconds":0.000002715,"exit_code":1,"original_token_count":3220,"output":"{\n  \"network_paused\": true,\n  \"metadata_min_interval_seconds\": 2.0,\n  \"stop_on_http_429\": true,\n  \"reason\": \"Metadata collection remains paused. Owner requested deletion of all downloaded images and image downloading machinery. Only lightweight image references remain.\"\n}\n#!/usr/bin/env python3\n\"\"\"Finish the current collection after independent collectors complete.\"\"\"\nimport json\nimport subprocess\nimport sys\nimport time\nfrom collect import BASE, ROOT, connection, dump, utc\nfrom reconcile import report\n\ndef run(script, *args):\n    subprocess.run([sys.executable, str(BASE / script), *args], check=True)\n\nwhile not (ROOT / 'catalog_errors.json').exists():\n    time.sleep(10)\n# Replay any saved pages initially rejected by the overly strict monotonicity\n# check. These were not lost: Steam appends mods after games in each catalog.\nrun('collect.py', '--phase', 'catalog', '--workers', '4')\nrun('collect.py', '--phase', 'verify_ids', '--workers', '3')\nwhile not (ROOT / 'search_errors.json').exists():\n    time.sleep(10)\nif json.loads((ROOT / 'search_errors.json').read_text()):\n    run('search_check.py')\nwhile not (ROOT / 'wide_ids_errors.json').exists():\n    time.sleep(10)\nif json.loads((ROOT / 'wide_ids_errors.json').read_text()):\n    from collect import EXTRA_COUNTRIES\n    run('collect.py', '--phase', 'wide_ids', '--countries', ','.join(EXTRA_COUNTRIES))\nrun('reconcile.py')\ndb = connection()\ndb.executescript('''\nCREATE INDEX IF NOT EXISTS tags_by_tag ON game_tags(tagid,appid);\nCREATE INDEX IF NOT EXISTS creators_by_name ON creators(name,role,appid);\nCREATE INDEX IF NOT EXISTS games_by_release ON games(steam_release_date);\nCREATE VIEW IF NOT EXISTS released_games AS\n SELECT * FROM games WHERE type=0 AND is_coming_soon=0;\nCREATE VIEW IF NOT EXISTS upcoming_games AS\n SELECT * FROM games WHERE type=0 AND is_coming_soon=1;\nCREATE VIEW IF NOT EXISTS mods AS SELECT * FROM games WHERE type=2;\n''')\ndb.commit()\nintegrity = db.execute('PRAGMA quick_check').fetchall()\nif integrity != [('ok',)]:\n    raise RuntimeError(integrity)\nout = report(db)\ndump(ROOT / 'metadata_complete.json', {'completed_at': utc(),\n    'apps': out['counts']['games'], 'unresolved_apps': out['unresolved_apps'],\n    'integrity': 'ok'})\n#!/usr/bin/env python3\n\"\"\"Resumable Steam-only catalog snapshot. Raw responses are the source of truth.\"\"\"\nimport argparse\nimport concurrent.futures as cf\nimport datetime as dt\nimport gzip\nimport hashlib\nimport html\nimport json\nimport math\nimport os\nfrom pathlib import Path\nimport re\nimport sqlite3\nimport threading\nimport time\nfrom urllib.parse import urlparse\nimport requests\n\nBASE = Path(__file__).resolve().parent\nROOT = BASE / '2026-09-05'\nQUERY = 'https://api.steampowered.com/IStoreQueryService/Query/v1/'\nCDN = 'https://shared.fastly.steamstatic.com/store_item_assets/'\nPRIMARY_COUNTRIES = ['US', 'BR', 'JP', 'CN', 'DE']\nEXTRA_COUNTRIES = ['GB', 'FR', 'CA', 'AU', 'KR', 'TW', 'HK', 'RU', 'UA',\n                   'TR', 'IN', 'SG', 'MX', 'AR', 'TH', 'ID', 'VN', 'ZA']\nCOUNTRIES = PRIMARY_COUNTRIES + EXTRA_COUNTRIES\nDATA_REQUEST = {k: True for k in (\n    'include_assets', 'include_release', 'include_platforms',\n    'include_all_purchase_options', 'include_screenshots', 'include_trailers',\n    'include_ratings', 'include_reviews', 'include_basic_info',\n    'include_supported_languages', 'include_full_description',\n    'include_assets_without_overrides', 'include_links')}\nDATA_REQUEST.update(include_tag_count=100, apply_user_filters=False)\nlocal = threading.local()\nrate_lock = threading.Lock()\nnext_request = 0.0\nadaptive_interval = 0.0\n\ndef utc():\n    return dt.datetime.now(dt.timezone.utc).isoformat()\n\ndef dump(path, obj):\n    path.parent.mkdir(parents=True, exist_ok=True)\n    tmp = path.with_suffix(path.suffix + f'.{os.getpid()}.{threading.get_ident()}.tmp')\n    tmp.write_text(json.dumps(obj, indent=2, ensure_ascii=False))\n    tmp.replace(path)\n\ndef request(url, params, interval=0.4):\n    global next_request, adaptive_interval\n    policy_path = BASE / 'network_policy.json'\n    policy = json.loads(policy_path.read_text()) if policy_path.exists() else {}\n    if policy.get('network_paused'):\n        raise RuntimeError('Network collection is paused by network_policy.json')\n    interval = max(interval, policy.get('metadata_min_interval_seconds', 0))\n    if not hasattr(local, 'session'):\n        local.session = requests.Session()\n        local.session.headers['User-Agent'] = 'SteamCatalogResearch/0.1 (public catalog snapshot)'\n    for attempt in range(7):\n        with rate_lock:\n            delay = max(0, next_request - time.monotonic())\n            next_request = max(time.monotonic(), next_request) + max(interval, adaptive_interval)\n        if delay:\n            time.sleep(delay)\n        try:\n            response = local.session.get(url, params=params, timeout=(15, 100))\n            if response.status_code in (401, 403):\n                raise PermissionError(f'{response.status_code} at {url}; not retried')\n            if response.status_code == 429 or response.status_code >= 500:\n                if response.status_code == 429 and policy.get('stop_on_http_429'):\n                    raise PermissionError(f'HTTP 429 at {url}; endpoint stopped by collection policy')\n                if response.status_code == 429:\n                    adaptive_interval = max(adaptive_interval, 1.8)\n                delay = max(float(response.headers.get('Retry-After', 0) or 0), min(120, 5 * 2 ** attempt))\n                with rate_lock:\n                    next_request = max(next_request, time.monotonic() + delay)\n                print(json.dumps({'event': 'backoff', 'status': response.status_code, 'seconds': delay}), flush=True)\n                time.sleep(delay)\n                continue\n            response.raise_for_status()\n            return response\n        except (requests.Timeout, requests.ConnectionError, requests.exceptions.ChunkedEncodingError):\n            if attempt == 6:\n                raise\n            time.sleep(min(60, 2 ** attempt))\n    raise RuntimeError(f'Retries exhausted: {url}')\n\ndef connection():\n    db = sqlite3.connect(ROOT / 'catalog.sqlite', timeout=60)\n    db.execute('PRAGMA journal_mode=WAL')\n    db.execute('PRAGMA synchronous=NORMAL')\n    db.executescript('''\n      CREATE TABLE IF NOT EXISTS pages (\n        phase TEXT, country TEXT, offset INTEGER, raw_path TEXT, fetched_at TEXT,\n        total INTEGER, returned INTEGER, unique_ids INTEGER,\n        PRIMARY KEY(phase,country,offset));\n      CREATE TABLE IF NOT EXISTS discovery (\n        appid INTEGER, country TEXT, source TEXT, PRIMARY KEY(appid,country,source));\n      CREATE TABLE IF NOT EXISTS games (\n        appid INTEGER PRIMARY KEY, name TEXT, type INTEGER, visible INTEGER,\n        is_free INTEGER, is_coming_soon INTEGER, is_early_access INTEGER,\n        steam_release_date INTEGER, original_release_date INTEGER,\n        original_steam_release_date INTEGER, release_from_early_access_date INTEGER,\n        reviews_filtered_count INTEGER, reviews_filtered_positive_percent INTEGER,\n        reviews_unfiltered_count INTEGER, reviews_english_count INTEGER,\n        short_description TEXT, source_country TEXT, fetched_at TEXT, data_json TEXT);\n      CREATE TABLE IF NOT EXISTS regional (\n        appid INTEGER, country TEXT, success INTEGER, visible INTEGER,\n        best_purchase_option_json TEXT, purchase_options_json TEXT,\n        reviews_json TEXT, fetched_at TEXT, PRIMARY KEY(appid,country));\n      CREATE TABLE IF NOT EXISTS game_tags (\n        appid INTEGER, tagid INTEGER, weight INTEGER, rank INTEGER, PRIMARY KEY(appid,tagid));\n      CREATE TABLE IF NOT EXISTS creators (\n        appid INTEGER, role TEXT, ordinal INTEGER, name TEXT, clan_id INTEGER,\n        PRIMARY KEY(appid,role,ordinal));\n      CREATE TABLE IF NOT EXISTS languages (\n        appid INTEGER, language_id INTEGER, additional_language_id INTEGER,\n        supported INTEGER, full_audio INTEGER, subtitles INTEGER,\n        PRIMARY KEY(appid,language_id,additional_language_id));\n      CREATE TABLE IF NOT EXISTS game_categories (\n        appid INTEGER, category_group TEXT, categoryid INTEGER,\n        PRIMARY KEY(appid,category_group,categoryid));\n      CREATE TABLE IF NOT EXISTS image_sources (\n        image_id TEXT PRIMARY KEY, url TEXT UNIQUE);\n      CREATE TABLE IF NOT EXISTS game_images (\n        appid INTEGER, image_id TEXT, kind TEXT, ordinal INTEGER,\n        PRIMARY KEY(appid,image_id,kind,ordinal));\n      CREATE TABLE IF NOT EXISTS tag_names (tagid INTEGER PRIMARY KEY, name TEXT);\n      CREATE TABLE IF NOT EXISTS category_names (categoryid INTEGER PRIMARY KEY, name TEXT, data_json TEXT);\n      CREATE INDEX IF NOT EXISTS game_images_app ON game_images(appid);\n    ''')\n    return db\n\ndef image_refs(item):\n    for kind, screenshots in item.get('screenshots', {}).items():\n        for screenshot in screenshots:\n            filename = screenshot.get('filename')\n            if filename:\n                yield 'screenshot_' + kind, screenshot.get('ordinal', 0), CDN + filename\n    # Extract source references only; this module never fetches media bytes.\n    for group in ['assets', 'assets_without_overrides']:\n        assets = item.get(group, {})\n        fmt = assets.get('asset_url_format', '')\n        for kind in ['header', 'main_capsule', 'small_capsule', 'hero_capsule',\n                     'library_capsule', 'library_hero', 'page_background',\n                     'raw_page_background', 'edition_comparison']:\n            filename = assets.get(kind)\n            if filename and fmt:\n                yield group + '_' + kind, 0, CDN + fmt.replace('${FILENAME}', filename)\n    # Description images are supplied by the developer, separate from screenshots.\n{\n  \"at\": \"2026-09-05T19:47:35.604718+00:00\",\n  \"metadata_records\": 184560,\n  \"types\": [\n    [\n      0,\n      184559\n    ],\n    [\n      14,\n      1\n    ]\n  ],\n  \"distinct_discovered_ids\": 185170,\n  \"regional_records\": 664981,\n  \"catalog_pages\": [\n    [\n      \"catalog\",\n      \"BR\",\n      182,\n      181000,\n      183195,\n      183195\n    ],\n    [\n      \"catalog\",\n      \"CN\",\n      115,\n      115000,\n      174361,\n      174361\n    ],\n    [\n      \"catalog\",\n      \"DE\",\n      1,\n      1000,\n      154052,\n      154052\n    ],\n    [\n      \"catalog\",\n      \"JP\",\n      185,\n      184000,\n      184364,\n      184364\n    ],\n    [\n      \"catalog\",\n      \"US\",\n      185,\n      184000,\n      184611,\n      184611\n    ],\n    [\n      \"search_us\",\n      \"US\",\n      947,\n      94700,\n      184682,\n      184682\n    ],\n    [\n      \"verify_ids\",\n      \"BR\",\n      185,\n      183195,\n      183195,\n      183195\n    ],\n    [\n      \"verify_ids\",\n      \"CN\",\n      176,\n      174361,\n      174361,\n      174361\n    ],\n    [\n      \"verify_ids\",\n      \"DE\",\n      156,\n      154052,\n      154052,\n      154052\n    ],\n    [\n      \"verify_ids\",\n      \"JP\",\n      186,\n      184364,\n      184364,\n      184364\n    ],\n    [\n      \"verify_ids\",\n      \"US\",\n      186,\n      184611,\n      184611,\n      184611\n    ],\n    [\n      \"wide_ids\",\n      \"AR\",\n      1,\n      1000,\n      184601,\n      184601\n    ],\n    [\n      \"wide_ids\",\n      \"AU\",\n      186,\n      184565,\n      184565,\n      184565\n    ],\n    [\n      \"wide_ids\",\n      \"CA\",\n      186,\n      184616,\n      184616,\n      184616\n    ],\n    [\n      \"wide_ids\",\n      \"FR\",\n      186,\n      184589,\n      184589,\n      184589\n    ],\n    [\n      \"wide_ids\",\n      \"GB\",\n      186,\n      184606,\n      184606,\n      184606\n    ],\n    [\n      \"wide_ids\",\n      \"HK\",\n      186,\n      184538,\n      184538,\n      184538\n    ],\n    [\n      \"wide_ids\",\n      \"ID\",\n      1,\n      1000,\n      184546,\n      184546\n    ],\n    [\n      \"wide_ids\",\n      \"IN\",\n      186,\n      184562,\n      184562,\n      184562\n    ],\n    [\n      \"wide_ids\",\n      \"KR\",\n      185,\n      183985,\n      183985,\n      183985\n    ],\n    [\n      \"wide_ids\",\n      \"MX\",\n      1,\n      1000,\n      184617,\n      184617\n    ],\n    [\n      \"wide_ids\",\n      \"RU\",\n      182,\n      180280,\n      180280,\n      180280\n    ],\n    [\n      \"wide_ids\",\n      \"SG\",\n      36,\n      36000,\n      184583,\n      184583\n    ],\n    [\n      \"wide_ids\",\n      \"TH\",\n      1,\n      1000,\n      184541,\n      184541\n    ],\n    [\n      \"wide_ids\",\n      \"TR\",\n      186,\n      184579,\n      184579,\n      184579\n    ],\n    [\n      \"wide_ids\",\n      \"TW\",\n      186,\n      184542,\n      184542,\n      184542\n    ],\n    [\n      \"wide_ids\",\n      \"UA\",\n      186,\n      184556,\n      184556,\n      184556\n    ],\n    [\n      \"wide_ids\",\n      \"VN\",\n      1,\n      1000,\n      184387,\n      184387\n    ],\n    [\n      \"wide_ids\",\n      \"ZA\",\n      1,\n      1000,\n      184583,\n      184583\n    ]\n  ],\n  \"network_paused\": true,\n  \"downloaded_images_deleted_at\": \"2026-09-05T20:06:47.381001+00:00\",\n  \"image_url_references\": 2966174,\n  \"image_downloader_removed\": true\n}    PID COMMAND\n"}

[Think]

**Finishing game-data metadata**

exec ({"code": "text(await tools.exec_command({cmd:\"sed -n '215,340p' /home/adn/a327ex/steam-research/collect.py; cat /hom...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"0a98dd","wall_time_seconds":0.000001923,"exit_code":0,"original_token_count":3115,"output":"        if 'metadata' not in result.get('response', {}):\n            raise ValueError(f'Missing metadata: {country}, {offset}, {str(result)[:200]}')\n        envelope = {'fetched_at': utc(), 'url': QUERY, 'request': payload,\n                    'http_date': response.headers.get('Date'), 'response': result}\n        path.parent.mkdir(parents=True, exist_ok=True)\n        tmp = path.with_suffix('.tmp')\n        with gzip.open(tmp, 'wt', compresslevel=3) as f:\n            json.dump(envelope, f, separators=(',', ':'), ensure_ascii=False)\n        tmp.replace(path)\n    return country, offset, path, envelope\n\ndef ingest_page(db, result, phase):\n    country, offset, path, envelope = result\n    body = envelope['response']['response']\n    ids = [x['appid'] for x in body.get('ids', []) if 'appid' in x]\n    # Steam appends mods after games, each in ID order; the type boundary can\n    # occur inside a page. Global numeric monotonicity is therefore not valid.\n    if len(ids) != len(set(ids)):\n        raise ValueError(f'Duplicate IDs inside {path}')\n    for appid in ids:\n        db.execute('INSERT OR IGNORE INTO discovery VALUES(?,?,?)', (appid, country, phase))\n    for item in body.get('store_items', []):\n        ingest_item(db, item, country, envelope['fetched_at'])\n    metadata = body['metadata']\n    db.execute('INSERT OR REPLACE INTO pages VALUES(?,?,?,?,?,?,?,?)',\n        (phase, country, offset, str(path.relative_to(ROOT)), envelope['fetched_at'],\n         metadata['total_matching_records'], len(ids), len(set(ids))))\n    db.commit()\n    return metadata['total_matching_records'], len(ids)\n\ndef status(db, phase):\n    out = {'at': utc(), 'phase': phase}\n    for table in ['games', 'regional', 'discovery', 'pages', 'game_tags', 'image_sources']:\n        out[table] = db.execute(f'SELECT COUNT(*) FROM {table}').fetchone()[0]\n    dump(ROOT / f'{phase}_status.json', out)\n    if phase == 'catalog':\n        dump(ROOT / 'collection_status.json', out)\n    print(json.dumps(out), flush=True)\n\ndef collect(args):\n    db = connection()\n    phase = args.phase\n    full = phase == 'catalog'\n    count = 1000\n    jobs = []\n    for country in args.countries.split(','):\n        total, returned = ingest_page(db, query_page(country, 0, count, full, phase), phase)\n        if returned != min(count, total):\n            raise ValueError(f'Unexpected page cap {returned} / {total}')\n        # One extra page catches growth during collection.\n        for offset in range(count, (math.ceil(total / count) + 1) * count, count):\n            if not db.execute('SELECT 1 FROM pages WHERE phase=? AND country=? AND offset=?', (phase, country, offset)).fetchone():\n                jobs.append((country, offset))\n    status(db, phase)\n    last = time.monotonic()\n    errors = []\n    with cf.ThreadPoolExecutor(max_workers=args.workers) as pool:\n        # Bound outstanding decoded responses so regional metadata does not fill RAM.\n        source = iter(jobs)\n        active = {}\n        for job in source:\n            active[pool.submit(query_page, *job, count, full, phase)] = job\n            if len(active) >= args.workers * 2:\n                break\n        while active:\n            done, _ = cf.wait(active, return_when=cf.FIRST_COMPLETED)\n            for future in done:\n                job = active.pop(future)\n                try:\n                    ingest_page(db, future.result(), phase)\n                except Exception as exc:\n                    errors.append({'job': job, 'error': repr(exc)})\n                    print(json.dumps(errors[-1]), flush=True)\n                    if isinstance(exc, PermissionError):\n                        raise\n                next_job = next(source, None)\n                if next_job:\n                    active[pool.submit(query_page, *next_job, count, full, phase)] = next_job\n            if time.monotonic() - last >= 20:\n                status(db, phase)\n                last = time.monotonic()\n    dump(ROOT / f'{phase}_errors.json', errors)\n    status(db, phase)\n    db.close()\n    if errors:\n        raise SystemExit(1)\n\nif __name__ == '__main__':\n    parser = argparse.ArgumentParser()\n    parser.add_argument('--phase', choices=['catalog', 'verify_ids', 'wide_ids'], default='catalog')\n    parser.add_argument('--countries', default=','.join(PRIMARY_COUNTRIES))\n    parser.add_argument('--workers', type=int, default=4)\n    collect(parser.parse_args())\n#!/usr/bin/env python3\n\"\"\"Reconcile independently discovered app IDs and build a coverage report.\"\"\"\nimport concurrent.futures as cf\nimport gzip\nimport json\nfrom pathlib import Path\nimport sqlite3\nimport time\nfrom collect import ROOT, COUNTRIES, DATA_REQUEST, connection, request, utc, dump, ingest_item\n\nURL = 'https://api.steampowered.com/IStoreBrowseService/GetItems/v1/'\n\ndef batch(job):\n    country, ids = job\n    payload = {'ids': [{'appid': appid} for appid in ids],\n               'context': {'country_code': country, 'language': 'english'}, 'data_request': DATA_REQUEST}\n    import hashlib\n    key = hashlib.sha256(json.dumps(ids).encode()).hexdigest()[:16]\n    path = ROOT / 'raw' / 'reconciliation' / country / (key + '.json.gz')\n    if path.exists():\n        data = json.load(gzip.open(path, 'rt'))\n    else:\n        response = request(URL, {'input_json': json.dumps(payload, separators=(',', ':'))})\n        data = {'fetched_at': utc(), 'url': URL, 'request': payload,\n                'http_date': response.headers.get('Date'), 'response': response.json()}\n        if 'response' not in data['response']:\n            raise ValueError('Invalid reconciliation response')\n        path.parent.mkdir(parents=True, exist_ok=True)\n        tmp = path.with_suffix('.tmp')\n        with gzip.open(tmp, 'wt', compresslevel=3) as f:\n            json.dump(data, f, ensure_ascii=False, separators=(',', ':'))\n        tmp.replace(path)\n    return country, ids, data\n\ndef main():\n    db = connection()\n    jobs = []\n    for country in COUNTRIES:\n        ids = [r[0] for r in db.execute('''SELECT DISTINCT d.appid FROM discovery d\n            WHERE d.country=? AND NOT EXISTS (SELECT 1 FROM games g WHERE g.appid=d.appid)\n            ORDER BY d.appid''', (country,))]\n        jobs.extend((country, ids[n:n+100]) for n in range(0, len(ids), 100))\n    for country, ids, data in cf.ThreadPoolExecutor(max_workers=3).map(batch, jobs):\n        items = data['response']['response'].get('store_items', [])\n        returned = set()\n        for item in items:\n            returned.add(item.get('appid') or item.get('id'))\n            ingest_item(db, item, country, data['fetched_at'])\n        for appid in set(ids) - returned:\n            db.execute('''INSERT OR IGNORE INTO regional(appid,country,success,fetched_at)\n                          VALUES(?,?,NULL,?)''', (appid, country, data['fetched_at']))\n        db.commit()\n    report(db)\n\ndef report(db):\n    out = {'snapshot_label': '2026-09-05', 'reported_at': utc(), 'countries': COUNTRIES}\n    out['counts'] = {table: db.execute(f'SELECT COUNT(*) FROM {table}').fetchone()[0]\n                     for table in ['games','regional','discovery','pages','game_tags','creators',\n                                   'languages','game_categories','image_sources','game_images']}\n    out['distinct_discovered_apps'] = db.execute('SELECT COUNT(DISTINCT appid) FROM discovery').fetchone()[0]\n    out['unresolved_apps'] = [row[0] for row in db.execute('SELECT DISTINCT appid FROM discovery WHERE appid NOT IN (SELECT appid FROM games) ORDER BY appid')]\n    out['types'] = dict(db.execute('SELECT type,COUNT(*) FROM games GROUP BY type').fetchall())\n    out['game_status'] = [dict(zip(['coming_soon','free','early_access','count'], row)) for row in\n        db.execute('SELECT is_coming_soon,is_free,is_early_access,COUNT(*) FROM games WHERE type=0 GROUP BY 1,2,3')]\n    out['primary_country'] = dict(db.execute('SELECT source_country,COUNT(*) FROM games GROUP BY source_country').fetchall())\n    out['coverage'] = []\n    for country in COUNTRIES:\n        row = {'country': country}\n        for source in ['catalog','verify_ids','wide_ids','search_us']:\n            row[source] = db.execute('SELECT COUNT(DISTINCT appid) FROM discovery WHERE country=? AND source=?', (country,source)).fetchone()[0]\n            row[source + '_reported_total_range'] = db.execute('SELECT MIN(total),MAX(total) FROM pages WHERE country=? AND phase=?', (country,source)).fetchone()\n        row['missing_catalog_vs_verify'] = db.execute('''SELECT COUNT(*) FROM discovery d WHERE country=? AND source='verify_ids'\n            AND NOT EXISTS(SELECT 1 FROM discovery e WHERE e.country=d.country AND e.appid=d.appid AND e.source='catalog')''', (country,)).fetchone()[0]\n        out['coverage'].append(row)\n    out['search_only_ids'] = [r[0] for r in db.execute(\"SELECT DISTINCT appid FROM discovery WHERE source='search_us' AND appid NOT IN (SELECT appid FROM discovery WHERE source IN ('verify_ids','wide_ids')) ORDER BY appid\")]\n    out['regional_additions_to_us'] = db.execute(\"SELECT COUNT(DISTINCT appid) FROM discovery WHERE source IN ('verify_ids','wide_ids') AND appid NOT IN (SELECT appid FROM discovery WHERE source='verify_ids' AND country='US')\").fetchone()[0]\n    out['field_coverage'] = {}\n    for field in ['steam_release_date','original_release_date','original_steam_release_date',\n                  'release_from_early_access_date','reviews_filtered_count','reviews_unfiltered_count','reviews_english_count','short_description']:\n        out['field_coverage'][field] = db.execute(f'SELECT COUNT(*) FROM games WHERE {field} IS NOT NULL').fetchone()[0]\n    for table in ['game_tags','creators','languages','game_categories','game_images']:\n        out['field_coverage'][table] = db.execute(f'SELECT COUNT(DISTINCT appid) FROM {table}').fetchone()[0]\n    out['image_kinds'] = dict(db.execute('SELECT kind,COUNT(*) FROM game_images GROUP BY kind').fetchall())\n    out['collection_times'] = db.execute('SELECT MIN(fetched_at),MAX(fetched_at) FROM pages').fetchone()\n    out['missing_tag_names'] = db.execute('SELECT COUNT(DISTINCT tagid) FROM game_tags WHERE tagid NOT IN (SELECT tagid FROM tag_names)').fetchone()[0]\n    dump(ROOT / 'coverage.json', out)\n    print(json.dumps({k: v for k, v in out.items() if k not in ['image_kinds','unresolved_apps','search_only_ids']}, indent=2), flush=True)\n    return out\n\nif __name__ == '__main__':\n    main()\n#!/usr/bin/env python3\n\"\"\"Metadata invariants against the actual collected records; no media downloads.\"\"\"\nimport json\nfrom pathlib import Path\nimport sqlite3\nimport time\nfrom collect import ROOT, dump, utc\n\ndef validate():\n    db = sqlite3.connect(ROOT / 'catalog.sqlite', timeout=120)\n    out = {'checked_at': utc(), 'checks': {}}\n    checks = out['checks']\n    checks['sqlite_quick_check'] = db.execute('PRAGMA quick_check').fetchall()\n    checks['missing_tag_definitions'] = db.execute('SELECT COUNT(DISTINCT tagid) FROM game_tags WHERE tagid NOT IN (SELECT tagid FROM tag_names)').fetchone()[0]\n    checks['orphan_game_tags'] = db.execute('SELECT COUNT(*) FROM game_tags WHERE appid NOT IN (SELECT appid FROM games)').fetchone()[0]\n    checks['orphan_image_associations'] = db.execute('SELECT COUNT(*) FROM game_images WHERE image_id NOT IN (SELECT image_id FROM image_sources)').fetchone()[0]\n    checks['wrong_embedded_appids'] = db.execute(\"SELECT COUNT(*) FROM games WHERE json_extract(data_json,'$.appid')<>appid\").fetchone()[0]\n    checks['tag_count_mismatch'] = db.execute(\"\"\"SELECT COUNT(*) FROM games g WHERE COALESCE(json_array_length(json_extract(data_json,'$.tags')),0)\n        <> (SELECT COUNT(*) FROM game_tags t WHERE t.appid=g.appid)\"\"\").fetchone()[0]\n    checks['positive_percent_out_of_range'] = db.execute('SELECT COUNT(*) FROM games WHERE reviews_filtered_positive_percent<0 OR reviews_filtered_positive_percent>100').fetchone()[0]\n    checks['negative_review_counts'] = db.execute('SELECT COUNT(*) FROM games WHERE reviews_filtered_count<0 OR reviews_unfiltered_count<0 OR reviews_english_count<0').fetchone()[0]\n    checks['duplicate_primary_appids'] = db.execute('SELECT COUNT(*)-COUNT(DISTINCT appid) FROM games').fetchone()[0]\n    out['passed'] = checks['sqlite_quick_check'] == [('ok',)] and all(\n        value == 0 for key, value in checks.items() if key != 'sqlite_quick_check')\n    dump(ROOT / 'validation.json', out)\n    print(json.dumps(out, indent=2), flush=True)\n    if not out['passed']:\n        raise SystemExit(1)\n\nif __name__ == '__main__':\n    validate()\n"}
{"chunk_id":"9233ce","wall_time_seconds":0.000001968,"exit_code":0,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.exec_command({cmd:\"python -u - <<'PY'\nimport sys,json,time,gzip\nfrom pathlib import P...)

Script completed
Wall time 1.7 seconds
Output:

{"chunk_id":"03d494","wall_time_seconds":0.367080456,"exit_code":0,"original_token_count":34,"output":"{\"metadata\": {\"total_matching_records\": 184583, \"start\": 0, \"count\": 1000}, \"ids\": 1000, \"bytes\": 15813, \"seconds\": 0.3003990160068497}\n"}
{"chunk_id":"8b874c","wall_time_seconds":1.001663858,"session_id":66913,"original_token_count":0,"output":""}

[Think]

**Finishing storefront data collection**

[Think]

**Finishing storefront data collection**

**Pausing storefront cross-check**

[Think]

**Finishing storefront data collection**

**Pausing storefront cross-check**

exec ({"code": "text(await tools.exec_command({cmd:\"python -u /home/adn/a327ex/steam-research/collect.py --phase wide_ids ...)

Script completed
Wall time 2.3 seconds
Output:

{"chunk_id":"1491bd","wall_time_seconds":1.001246771,"session_id":97451,"original_token_count":0,"output":""}
{"chunk_id":"b06635","wall_time_seconds":1.00094432,"session_id":65664,"original_token_count":11,"output":"Indexing discovery by source and country.\n"}

[Think]

**Preparing metadata orchestration**

exec ({"code": "text(await tools.exec_command({cmd:\"cat /home/adn/a327ex/steam-research/export.py; tail -2 /home/adn/a327e...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"f52595","wall_time_seconds":0.000002511,"exit_code":0,"original_token_count":727,"output":"#!/usr/bin/env python3\n\"\"\"Export portable Parquet tables and a compact CSV after metadata completes.\"\"\"\nimport csv\nimport gzip\nimport hashlib\nimport json\nfrom pathlib import Path\nimport sqlite3\nimport time\nimport pyarrow as pa\nimport pyarrow.parquet as pq\nfrom collect import ROOT, dump, utc\n\ndef export():\n    db = sqlite3.connect(ROOT / 'catalog.sqlite', timeout=120)\n    output = ROOT / 'exports'\n    output.mkdir(exist_ok=True)\n    tables = ['games','regional','game_tags','tag_names','creators','languages',\n              'game_categories','category_names','game_images','image_sources','discovery','pages']\n    manifest = {'exported_at': utc(), 'pyarrow_version': pa.__version__, 'tables': {}}\n    for table in tables:\n        info = db.execute(f'PRAGMA table_info({table})').fetchall()\n        schema = pa.schema([(row[1], pa.int64() if row[2] == 'INTEGER' else pa.string()) for row in info])\n        names = schema.names\n        path = output / (table + '.parquet')\n        tmp = path.with_suffix('.tmp')\n        count = 0\n        cur = db.execute(f'SELECT * FROM {table}')\n        with pq.ParquetWriter(tmp, schema=schema, compression='zstd') as writer:\n            while rows := cur.fetchmany(5000):\n                batch = pa.Table.from_pydict({name: [row[n] for row in rows] for n, name in enumerate(names)}, schema=schema)\n                writer.write_table(batch)\n                count += len(rows)\n        tmp.replace(path)\n        if pq.ParquetFile(path).metadata.num_rows != count:\n            raise ValueError(f'Parquet row mismatch: {table}')\n        manifest['tables'][table] = {'rows': count, 'bytes': path.stat().st_size}\n        print(json.dumps({'table': table, 'rows': count, 'bytes': path.stat().st_size}), flush=True)\n    columns = [row[1] for row in db.execute('PRAGMA table_info(games)') if row[1] != 'data_json']\n    with gzip.open(output / 'games.csv.gz', 'wt', newline='', encoding='utf-8') as f:\n        writer = csv.writer(f)\n        writer.writerow(columns)\n        writer.writerows(db.execute('SELECT ' + ','.join(columns) + ' FROM games'))\n    dump(output / 'manifest.json', manifest)\n\nif __name__ == '__main__':\n    export()\n{\"at\": \"2026-09-05T20:10:34.800551+00:00\", \"phase\": \"catalog\", \"games\": 184758, \"regional\": 677151, \"discovery\": 3720133, \"pages\": 4601, \"game_tags\": 2926788, \"image_sources\": 2969722}\n{\"at\": \"2026-09-05T20:11:01.751992+00:00\", \"phase\": \"catalog\", \"games\": 185058, \"regional\": 681451, \"discovery\": 3729133, \"pages\": 4610, \"game_tags\": 2927554, \"image_sources\": 2971751}\n{\"at\": \"2026-09-05T20:10:52.423974+00:00\", \"phase\": \"wide_ids\", \"games\": 184758, \"regional\": 680151, \"discovery\": 3723133, \"pages\": 4604, \"game_tags\": 2926788, \"image_sources\": 2969722}\n{\"at\": \"2026-09-05T20:11:13.839663+00:00\", \"phase\": \"wide_ids\", \"games\": 185112, \"regional\": 683505, \"discovery\": 3737133, \"pages\": 4618, \"game_tags\": 2927779, \"image_sources\": 2972128}\n"}
{"chunk_id":"7b871b","wall_time_seconds":0.000001711,"exit_code":0,"original_token_count":10384,"output":"Warning: truncated output (original token count: 10384)\nTotal output lines: 5\n\nIDs unique to independent search: 354\n[{\"appid\": 10695, \"name\": \"Aliens vs. Predator Swarm Map Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 10697, \"name\": \"Aliens vs Predator\\u2122 Bughunt Map Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 16465, \"name\": \"F.E.A.R. 2: Reborn (DLC)\", \"type\": 4, \"success\": 1}, {\"appid\": 18407, \"name\": \"Crazy Machines 2: Liquid Force Add-on\", \"type\": 4, \"success\": 1}, {\"appid\": 18408, \"name\": \"Crazy Machines 2: Time Travel Add-On\", \"type\": 4, \"success\": 1}, {\"appid\": 18440, \"name\": \"Crazy Machines 2: Back to the Shop Add-On\", \"type\": 4, \"success\": 1}, {\"appid\": 18450, \"name\": \"Crazy Machines 1.5 New from the Lab\", \"type\": 14, \"success\": 1}, {\"appid\": 18460, \"name\": \"Crazy Machines 1.5 Inventors Training Camp\", \"type\": 14, \"success\": 1}, {\"appid\": 21110, \"name\": \"F.E.A.R.: Extraction Point \", \"type\": 14, \"success\": 1}, {\"appid\": 21120, \"name\": \"F.E.A.R.: Perseus Mandate \", \"type\": 14, \"success\": 1}, {\"appid\": 50513, \"name\": \"Burn Zombie Burn!: Soundtrack\", \"type\": 4, \"success\": 1}, {\"appid\": 57923, \"name\": \"Duke Nukem Forever: Hail to the Icons Parody Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 57925, \"name\": \"Duke Nukem Forever: The Doctor Who Cloned Me\", \"type\": 4, \"success\": 1}, {\"appid\": 64005, \"name\": \"Men of War: Assault Squad - MP Supply Pack Alpha\", \"type\": 4, \"success\": 1}, {\"appid\": 64013, \"name\": \"Men of War: Assault Squad - Skirmish Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 64014, \"name\": \"Men of War: Assault Squad - MP Supply Pack Bravo\", \"type\": 4, \"success\": 1}, {\"appid\": 64016, \"name\": \"Men of War: Assault Squad - MP Supply Pack Charlie\", \"type\": 4, \"success\": 1}, {\"appid\": 64017, \"name\": \"Men of War: Assault Squad - Skirmish Pack 2\", \"type\": 4, \"success\": 1}, {\"appid\": 80010, \"name\": \"APOX: Legend\", \"type\": 4, \"success\": 1}, {\"appid\": 92302, \"name\": \"A.R.E.S.: Berzerker Suit\", \"type\": 4, \"success\": 1}, {\"appid\": 92303, \"name\": \"A.R.E.S.: Original Soundtrack\", \"type\": 4, \"success\": 1}, {\"appid\": 98210, \"name\": \"Frozen Synapse: Soundtrack\", \"type\": 4, \"success\": 1}, {\"appid\": 98211, \"name\": \"Frozen Synapse: Red DLC\", \"type\": 4, \"success\": 1}, {\"appid\": 98609, \"name\": \"Demolition Inc - Level & Weapon DLC\", \"type\": 4, \"success\": 1}, {\"appid\": 108726, \"name\": \"Alan Wake Collector's Edition Extras\", \"type\": 4, \"success\": 1}, {\"appid\": 202450, \"name\": \"Crazy Machines 2:  Halloween\", \"type\": 4, \"success\": 1}, {\"appid\": 202452, \"name\": \"Crazy Machines 2: Happy New Year DLC\", \"type\": 4, \"success\": 1}, {\"appid\": 202454, \"name\": \"Crazy Machines 2 - Invaders from Space\", \"type\": 4, \"success\": 1}, {\"appid\": 202520, \"name\": \"Dungeon Defenders Halloween Costume Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 202521, \"name\": \"Dungeon Defenders Halloween Mission Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 202524, \"name\": \"Dungeon Defe…8984 tokens truncated…nit Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 1557210, \"name\": \"Age of Empires II: Definitive Edition - Dawn of the Dukes\", \"type\": 4, \"success\": 1}, {\"appid\": 1647900, \"name\": \"Dying Light - Savvy Gamer Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 1702060, \"name\": \"Dying Light - Astronaut Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 1762700, \"name\": \"Dying Light - Van Crane Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 1822810, \"name\": \"Dying Light - Snow Ops Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 1869820, \"name\": \"Age of Empires II: Definitive Edition - Dynasties of India\", \"type\": 4, \"success\": 1}, {\"appid\": 1888510, \"name\": \"Dying Light 2 - Soundtrack\", \"type\": 4, \"success\": 1}, {\"appid\": 1935540, \"name\": \"Dying Light - Dieselpunk Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 2104485, \"name\": \"Exoprimal - Head Start Kit\", \"type\": 4, \"success\": 1}, {\"appid\": 2183570, \"name\": \"Granblue Fantasy: Relink - Color Pack 1\", \"type\": 4, \"success\": 1}, {\"appid\": 2194991, \"name\": \"LEGO\\u00ae Star Wars\\u2122: The Skywalker Saga Character Collection 1 & 2\", \"type\": 4, \"success\": 1}, {\"appid\": 2593180, \"name\": \"Dragon's Dogma 2: Explorer's Camping Kit - Camping Gear\", \"type\": 4, \"success\": 1}, {\"appid\": 2593190, \"name\": \"Dragon's Dogma 2: Dragon's Dogma Music & Sound Collection - Custom Sounds\", \"type\": 4, \"success\": 1}, {\"appid\": 2593290, \"name\": \"Dragon's Dogma 2: Dark Arisen Expansion\", \"type\": 4, \"success\": 1}, {\"appid\": 2694640, \"name\": \"Granblue Fantasy: Relink - Color Pack 2\", \"type\": 4, \"success\": 1}, {\"appid\": 2694650, \"name\": \"Granblue Fantasy: Relink - Color Pack 3\", \"type\": 4, \"success\": 1}, {\"appid\": 2694660, \"name\": \"GRANBLUE FANTASY: Relink - Starter Items Pack\", \"type\": 4, \"success\": 1}, {\"appid\": 2694670, \"name\": \"GRANBLUE FANTASY: Relink - False Sword of the Apocalypse\", \"type\": 4, \"success\": 1}, {\"appid\": 2782160, \"name\": \"Granblue Fantasy: Relink - Emote Expansion Set: Let's Chat\", \"type\": 4, \"success\": 1}, {\"appid\": 2853970, \"name\": \"Granblue Fantasy: Relink - Color Pack 4\", \"type\": 4, \"success\": 1}, {\"appid\": 2853980, \"name\": \"Granblue Fantasy: Relink - Emote Expansion Set: I Work Out\", \"type\": 4, \"success\": 1}, {\"appid\": 2944850, \"name\": \"Granblue Fantasy: Relink - Color Pack 5\", \"type\": 4, \"success\": 1}, {\"appid\": 2944860, \"name\": \"Granblue Fantasy: Relink - Emote Expansion Set: Grab Bag\", \"type\": 4, \"success\": 1}, {\"appid\": 3454290, \"name\": \"Dying Light - 10th Anniversary Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 3839790, \"name\": \"Granblue Fantasy: Relink - Endless Ragnarok Upgrade Kit (Standard Edition)\", \"type\": 4, \"success\": 1}, {\"appid\": 3868650, \"name\": \"Fallout 4 - Creations Bundle\", \"type\": 4, \"success\": 1}, {\"appid\": 4528540, \"name\": \"Granblue Fantasy: Relink - Endless Ragnarok Special Pack\", \"type\": 4, \"success\": 1}]\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json\nr='/home/adn/a327ex/steam-rese...)

Script completed
Wall time 1.1 seconds
Output:

{"chunk_id":"4f865a","wall_time_seconds":0.932123969,"exit_code":0,"original_token_count":8,"output":"[(4, 347), (11, 3), (14, 4)]\n[]\n"}

[Think]

**Checking catalog discrepancies**

[Think]

**Checking catalog discrepancies**

**Benchmarking API throughput**

The metadata gaps are being filled without downloading assets. I also checked the extra app IDs found through Steam search: the 354 checked so far are DLC, music, or other non-game records, not missing games. They’re retained with their types so they won’t inflate the game count.

I’m now building a field-by-field inventory from the actual responses, including how often each field is present.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/inventory.py...)

Script failed
Wall time 0.0 seconds
Output:

Script error:
apply_patch verification failed: invalid patch: multiple operations target /home/adn/a327ex/steam-research/finish_metadata.py

[Think]

**Rebuilding the inventory update**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/inventory.py <<'PY'\n#!/usr/bin...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"0f0760","wall_time_seconds":1.000497336,"session_id":63175,"original_token_count":0,"output":""}
{}

[Think]

**Checking data field coverage**

[Think]

**Checking data field coverage**

**Selecting export tables**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -2 /home/adn/a327ex/steam-research/2026-09-05/metadata_finish_col...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"ebfc00","wall_time_seconds":0.000003397,"exit_code":0,"original_token_count":193,"output":"{\"at\": \"2026-09-05T20:15:13.099746+00:00\", \"phase\": \"catalog\", \"games\": 185124, \"regional\": 716505, \"discovery\": 3889133, \"pages\": 4770, \"game_tags\": 2928012, \"image_sources\": 2972329}\n{\"at\": \"2026-09-05T20:15:35.879610+00:00\", \"phase\": \"catalog\", \"games\": 185124, \"regional\": 720505, \"discovery\": 3905133, \"pages\": 4786, \"game_tags\": 2928012, \"image_sources\": 2972329}\n{\"at\": \"2026-09-05T20:15:35.750783+00:00\", \"phase\": \"wide_ids\", \"games\": 185124, \"regional\": 719505, \"discovery\": 3904133, \"pages\": 4785, \"game_tags\": 2928012, \"image_sources\": 2972329}\n{\"at\": \"2026-09-05T20:15:57.698974+00:00\", \"phase\": \"wide_ids\", \"games\": 185124, \"regional\": 723505, \"discovery\": 3917716, \"pages\": 4800, \"game_tags\": 2928012, \"image_sources\": 2972329}\nSat Sep  5 20:15:59 UTC 2026\n"}

[Think]

**Checking API field definitions**

[Think]

**Checking API field definitions**

**Checking source field coverage**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json,collections\np='/home/adn/a327e...)

Script completed
Wall time 0.2 seconds
Output:

{"chunk_id":"8d7cde","wall_time_seconds":0.000002571,"exit_code":0,"original_token_count":1032,"output":"{\n  \"item_type\": [\n    \"int\"\n  ],\n  \"id\": [\n    \"int\"\n  ],\n  \"success\": [\n    \"int\"\n  ],\n  \"visible\": [\n    \"bool\"\n  ],\n  \"name\": [\n    \"str\"\n  ],\n  \"store_url_path\": [\n    \"str\"\n  ],\n  \"store_url_slug\": [\n    \"str\"\n  ],\n  \"appid\": [\n    \"int\"\n  ],\n  \"type\": [\n    \"int\"\n  ],\n  \"related_items\": [\n    \"demo_appid\",\n    \"demos\",\n    \"parent_appid\",\n    \"playtests\",\n    \"standalone_demo_appid\",\n    \"standalone_demos\"\n  ],\n  \"tagids\": [\n    \"list\"\n  ],\n  \"categories\": [\n    \"controller_categoryids\",\n    \"feature_categoryids\",\n    \"supported_player_categoryids\"\n  ],\n  \"reviews\": [\n    \"summary_filtered\",\n    \"summary_language_specific\",\n    \"summary_unfiltered\"\n  ],\n  \"basic_info\": [\n    \"capsule_headline\",\n    \"developers\",\n    \"franchises\",\n    \"publishers\",\n    \"short_description\"\n  ],\n  \"tags[]\": [\n    \"tagid\",\n    \"weight\"\n  ],\n  \"assets\": [\n    \"asset_url_format\",\n    \"community_icon\",\n    \"header\",\n    \"header_2x\",\n    \"hero_capsule\",\n    \"hero_capsule_2x\",\n    \"last_modified\",\n    \"library_capsule\",\n    \"library_capsule_2x\",\n    \"library_hero\",\n    \"library_hero_2x\",\n    \"main_capsule\",\n    \"main_capsule_2x\",\n    \"page_background\",\n    \"page_background_path\",\n    \"raw_page_background\",\n    \"small_capsule\",\n    \"small_capsule_2x\"\n  ],\n  \"release\": [\n    \"coming_soon_display\",\n    \"custom_release_date_message\",\n    \"is_coming_soon\",\n    \"is_early_access\",\n    \"mac_release_date\",\n    \"original_release_date\",\n    \"original_steam_release_date\",\n    \"steam_release_date\"\n  ],\n  \"platforms\": [\n    \"mac\",\n    \"steam_deck_compat_category\",\n    \"steam_frame_compat_category\",\n    \"steam_machine_compat_category\",\n    \"steam_os_compat_category\",\n    \"steamos_linux\",\n    \"vr_support\",\n    \"windows\"\n  ],\n  \"best_purchase_option\": [\n    \"active_discounts\",\n    \"bundle_discount_pct\",\n    \"bundleid\",\n    \"discount_pct\",\n    \"final_price_in_cents\",\n    \"formatted_final_price\",\n    \"formatted_original_price\",\n    \"formatted_price_before_bundle_discount\",\n    \"free_with_master_sub_appid\",\n    \"hide_discount_pct_for_compliance\",\n    \"included_game_count\",\n    \"must_purchase_as_set\",\n    \"original_price_in_cents\",\n    \"package_group\",\n    \"packageid\",\n    \"price_before_bundle_discount\",\n    \"price_cannot_be_displayed_as_discount\",\n    \"purchase_option_name\",\n    \"user_can_purchase_as_gift\"\n  ],\n  \"purchase_options[]\": [\n    \"active_discounts\",\n    \"bundle_discount_pct\",\n    \"bundleid\",\n    \"discount_pct\",\n    \"final_price_in_cents\",\n    \"formatted_final_price\",\n    \"formatted_original_price\",\n    \"formatted_price_before_bundle_discount\",\n    \"free_with_master_sub_appid\",\n    \"hide_discount_pct_for_compliance\",\n    \"included_game_count\",\n    \"is_edition\",\n    \"must_purchase_as_set\",\n    \"original_price_in_cents\",\n    \"package_group\",\n    \"packageid\",\n    \"price_before_bundle_discount\",\n    \"price_cannot_be_displayed_as_discount\",\n    \"purchase_option_name\",\n    \"user_can_purchase_as_gift\"\n  ],\n  \"screenshots\": [\n    \"all_ages_screenshots\",\n    \"mature_content_screenshots\"\n  ],\n  \"trailers\": [\n    \"highlights\",\n    \"other_trailers\"\n  ],\n  \"supported_languages[]\": [\n    \"eadditionallanguage\",\n    \"elanguage\",\n    \"full_audio\",\n    \"subtitles\",\n    \"supported\"\n  ],\n  \"full_description_bbcode\": [\n    \"str\"\n  ],\n  \"assets_without_overrides\": [\n    \"asset_url_format\",\n    \"community_icon\",\n    \"header\",\n    \"header_2x\",\n    \"hero_capsule\",\n    \"hero_capsule_2x\",\n    \"last_modified\",\n    \"library_capsule\",\n    \"library_capsule_2x\",\n    \"library_hero\",\n    \"library_hero_2x\",\n    \"main_capsule\",\n    \"main_capsule_2x\",\n    \"page_background\",\n    \"page_background_path\",\n    \"raw_page_background\",\n    \"small_capsule\",\n    \"small_capsule_2x\"\n  ],\n  \"package_groups[]\": [\n    \"display_type\",\n    \"name\"\n  ],\n  \"links[]\": [\n    \"link_type\",\n    \"text\",\n    \"url\"\n  ],\n  \"game_rating\": [\n    \"agency\",\n    \"descriptors\",\n    \"image_url\",\n    \"rating\",\n    \"required_age\",\n    \"survey_interactive_elements\",\n    \"type\",\n    \"use_age_gate\"\n  ],\n  \"content_descriptorids\": [\n    \"list\"\n  ],\n  \"is_free\": [\n    \"bool\"\n  ],\n  \"is_coming_soon\": [\n    \"bool\"\n  ],\n  \"is_early_access\": [\n    \"bool\"\n  ]\n}\n"}

[Think]

**Assessing available game data**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -1 /home/adn/a327ex/steam-research/2026-09-05/metadata_finish_col...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"a82474","wall_time_seconds":0.000002681,"exit_code":0,"original_token_count":205,"output":"{\"at\": \"2026-09-05T20:17:14.969258+00:00\", \"phase\": \"catalog\", \"games\": 185132, \"regional\": 739866, \"discovery\": 3972077, \"pages\": 4856, \"game_tags\": 2928093, \"image_sources\": 2972451}\n{\"at\": \"2026-09-05T20:17:25.913376+00:00\", \"phase\": \"wide_ids\", \"games\": 185132, \"regional\": 741863, \"discovery\": 3980077, \"pages\": 4864, \"game_tags\": 2928093, \"image_sources\": 2972451}\n    PID %CPU   RSS     ELAPSED COMMAND\n2334238 10.0 238620      08:18 python -u /home/adn/a327ex/steam-research/collect.py --phase catalog --countries US,BR,JP,CN,DE --workers 2\n2338183  1.5 46076       06:41 python -u /home/adn/a327ex/steam-research/collect.py --phase wide_ids --countries GB,FR,CA,AU,KR,TW,HK,RU,UA,TR,IN,SG,MX,AR,TH,ID,VN,ZA --workers 1\n2348111  0.0 36164       02:36 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n"}

[Think]

**Checking three unresolved records**

[Think]

**Checking three unresolved records**

**Inspecting missing-ID sources**

[Think]

**Checking three unresolved records**

**Inspecting missing-ID sources**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/export.py...)

Script completed
Wall time 0.1 seconds
Output:

{}
{"chunk_id":"911e3d","wall_time_seconds":0.000002522,"exit_code":0,"original_token_count":93,"output":"{\"at\": \"2026-09-05T20:18:46.361816+00:00\", \"phase\": \"catalog\", \"games\": 185134, \"regional\": 755863, \"discovery\": 4034077, \"pages\": 4918, \"game_tags\": 2928128, \"image_sources\": 2972478}\n{\"at\": \"2026-09-05T20:18:53.887116+00:00\", \"phase\": \"wide_ids\", \"games\": 185134, \"regional\": 756863, \"discovery\": 4039077, \"pages\": 4923, \"game_tags\": 2928128, \"image_sources\": 2972478}\n"}

[Think]

**Reviewing current metadata**

[Think]

**Reviewing current metadata**

**Awaiting metadata processing**

[Think]

**Reviewing current metadata**

**Awaiting metadata processing**

[Think]

**Reviewing current metadata**

**Awaiting metadata processing**

Most game records are now complete; the remaining work is checking regional coverage and producing the validated exports. The dataset has prices and purchase options, tags, developers/publishers, release information, platform and language support, descriptions, and review summaries.

It does not contain individual review text, reviewer playtimes, sales, revenue, or wishlists. I’ll distinguish those omissions from fields that exist but are missing for some games.

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1200}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.0 seconds
Output:

{"chunk_id":"d869e5","wall_time_seconds":50.005021207,"session_id":66913,"original_token_count":0,"output":""}
{"chunk_id":"8ab9ac","wall_time_seconds":0.000004321,"exit_code":0,"original_token_count":93,"output":"{\"at\": \"2026-09-05T20:21:46.475705+00:00\", \"phase\": \"catalog\", \"games\": 185134, \"regional\": 784863, \"discovery\": 4153077, \"pages\": 5037, \"game_tags\": 2928128, \"image_sources\": 2972478}\n{\"at\": \"2026-09-05T20:21:45.940034+00:00\", \"phase\": \"wide_ids\", \"games\": 185134, \"regional\": 783863, \"discovery\": 4152077, \"pages\": 5036, \"game_tags\": 2928128, \"image_sources\": 2972478}\n"}

[Think]

**Downloading regional metadata**

[Think]

**Downloading regional metadata**

[Think]

**Downloading regional metadata**

**Validating metadata fields**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1400}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.0 seconds
Output:

{"chunk_id":"6bea16","wall_time_seconds":50.001583639,"session_id":66913,"original_token_count":0,"output":""}
{"chunk_id":"d8a3df","wall_time_seconds":0.000003471,"exit_code":0,"original_token_count":93,"output":"{\"at\": \"2026-09-05T20:23:59.858461+00:00\", \"phase\": \"catalog\", \"games\": 185134, \"regional\": 804863, \"discovery\": 4238694, \"pages\": 5124, \"game_tags\": 2928128, \"image_sources\": 2972478}\n{\"at\": \"2026-09-05T20:24:17.788946+00:00\", \"phase\": \"wide_ids\", \"games\": 185134, \"regional\": 807863, \"discovery\": 4250694, \"pages\": 5136, \"game_tags\": 2928128, \"image_sources\": 2972478}\n"}

[Think]

**Reviewing source metadata**

[Think]

**Reviewing source metadata**

**Generating field inventory**

[Think]

**Reviewing source metadata**

**Generating field inventory**

[Think]

**Reviewing source metadata**

**Generating field inventory**

**Validating CSV exports**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json\np='/home/adn/a327ex/steam-rese...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"c69378","wall_time_seconds":0.193303477,"exit_code":0,"original_token_count":237,"output":"missing 37 [22490, 63970, 201270, 202570, 217980, 326740, 499950, 657860, 714210, 721310, 900883, 901638, 901735, 901776, 1185750, 1186390, 1423870, 1537530, 1825750, 1826490, 2147450, 2178420, 2855560, 2995920, 3114940, 3225010, 3260140, 3795380, 4073870, 4113810, 4261320, 4279820, 4348430, 4390580, 4483700, 4706890, 4899150]\nregional completion [('BR', 185, 183195, 183195), ('CN', 176, 174361, 174361), ('DE', 100, 100000, 154052), ('JP', 186, 184364, 184364), ('US', 186, 184611, 184611)]\nadditional region progress [('AR', 135000, 184601), ('AU', 184565, 184565), ('CA', 184616, 184616), ('FR', 184589, 184589), ('GB', 184606, 184606), ('HK', 184538, 184538), ('ID', 1000, 184546), ('IN', 184562, 184562), ('KR', 183985, 183985), ('MX', 184617, 184617), ('RU', 180280, 180280), ('SG', 184583, 184583), ('TH', 1000, 184541), ('TR', 184579, 184579), ('TW', 184542, 184542), ('UA', 184556, 184556), ('VN', 1000, 184387), ('ZA', 1000, 184583)]\n"}

[Think]

**Reconciling regional game duplicates**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,json,gzip,re\nfrom pathlib import Pa...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"151396","wall_time_seconds":1.062740332,"exit_code":0,"original_token_count":628,"output":"(22490, 'wide_ids', 'UA')\n(63970, 'wide_ids,catalog,verify_ids', 'AU,CN,DE,FR,GB,HK,ID,IN,JP,KR,SG,TH,TR,TW,VN,ZA')\n(201270, 'wide_ids,catalog,verify_ids', 'AR,AU,BR,CA,CN,DE,FR,GB,HK,IN,JP,KR,MX,SG,TR,TW,UA,US')\n(202570, 'wide_ids', 'FR')\n(217980, 'wide_ids', 'UA')\n(326740, 'wide_ids', 'RU,UA')\n(499950, 'wide_ids', 'FR,GB,TR')\n(657860, 'wide_ids', 'TR')\n(714210, 'wide_ids', 'TR')\n(721310, 'wide_ids', 'TR')\n(900883, 'wide_ids,catalog,verify_ids', 'AR,AU,BR,CA,CN,DE,FR,GB,HK,IN,JP,KR,MX,SG,TR,TW,UA,US')\n(901638, 'wide_ids,catalog,verify_ids', 'AR,AU,BR,CN,DE,FR,GB,HK,IN,KR,RU,SG,TR,TW,UA')\n(901735, 'wide_ids,catalog,verify_ids', 'AR,AU,BR,CA,CN,DE,FR,GB,HK,IN,JP,KR,MX,RU,SG,TR,TW,UA,US')\n(901776, 'wide_ids,catalog,verify_ids', 'AR,AU,BR,CA,CN,DE,FR,GB,HK,IN,JP,KR,MX,RU,SG,TR,TW,UA,US')\n(1185750, 'wide_ids', 'RU,UA')\n(1186390, 'wide_ids', 'GB')\n(1423870, 'wide_ids', 'TR')\n(1537530, 'wide_ids', 'FR')\n(1825750, 'wide_ids', 'KR')\n(1826490, 'wide_ids', 'FR')\n(2147450, 'wide_ids', 'HK,TW')\n(2178420, 'wide_ids', 'KR')\n(2855560, 'wide_ids', 'HK,TW')\n(2995920, 'wide_ids,catalog,verify_ids', 'AR,AU,BR,CA,CN,DE,FR,GB,HK,IN,JP,KR,MX,RU,SG,TR,TW,UA,US')\n(3114940, 'wide_ids', 'RU')\n(3225010, 'wide_ids', 'RU,UA')\n(3260140, 'wide_ids', 'HK,TW')\n(3795380, 'wide_ids', 'TW')\n(4073870, 'verify_ids,wide_ids', 'DE,FR,GB,TR')\n(4113810, 'wide_ids', 'IN')\n(4261320, 'wide_ids', 'KR')\n(4279820, 'wide_ids', 'HK,SG,TW')\n(4348430, 'wide_ids', 'RU,UA')\n(4390580, 'wide_ids', 'HK,SG,TW')\n(4483700, 'wide_ids', 'RU,UA')\n(4706890, 'wide_ids', 'HK,TW')\n(4899150, 'verify_ids,wide_ids', 'DE,FR,GB,TR')\n900883 search context &quot;v6&quot;:1} );\" onmouseout=\"HideGameHover( this, event, 'global_hover' )\" class=\"search_result_row ds_collapse_flag \"\n\t\t   data-search-page=\"819\" data-gpnav=\"item\"\n\t\t   data-ds-steam-deck-compat-handled=\"true\">\n            <div class=\"search_capsule\"><img src=\"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/4749360/b6476043900883b8c658760aa5d9ef015e9db5fe/capsule_231x87.jpg?t=1779388813\" ></div>\n            <div class=\"responsive_search_name_combined\">\n                <div class=\"search_name ellipsis\">\n                    <span class=\"title\">Kung-Fu Space Fighters</span>\n                </div>\n\t\t\t\t<div class=\"search_platforms\">\n\t\t\t\t\t<span class=\"platform_img win\"></span>\t\t\t\t</div>\n                <div class=\"search_released responsive_secondrow\">\n                    Coming soon                </div>\n                <div class=\"search_reviewscore responsive_second\n"}

[Think]

**Inspecting raw catalog records**

exec ({"code": "text(await tools.exec_command({cmd:\"python -u - <<'PY'\nimport sys,json,gzip\nsys.path.insert(0,'/home/a...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"0c2de7","wall_time_seconds":1.001498149,"session_id":88521,"original_token_count":879,"output":"storebrowse {\"response\": {\"store_items\": [{\"item_type\": 0, \"id\": 63970, \"success\": 15, \"visible\": false, \"unvailable_for_country_restriction\": true, \"name\": \"IL-2 Sturmovik: Cliffs of Dover\", \"store_url_path\": \"app/63950/IL2_Sturmovik_Cliffs_of_Dover\", \"store_url_slug\": \"IL2_Sturmovik_Cliffs_of_Dover\", \"appid\": 63950}, {\"item_type\": 0, \"id\": 201270, \"success\": 1, \"visible\": true, \"name\": \"Total War: SHOGUN 2\", \"store_url_path\": \"app/34330/Total_War_SHOGUN_2\", \"store_url_slug\": \"Total_War_SHOGUN_2\", \"appid\": 34330, \"type\": 0, \"related_items\": {\"demo_appid\": [34350], \"demos\": [{\"appid\": 34350, \"show_above_purchase\": false}]}, \"content_descriptorids\": [2, 5], \"tagids\": [9, 3987, 1741, 1676, 4364, 1708, 4182, 3859, 10617, 3813, 4168, 6310, 1688, 1685, 1677, 4172, 1756, 1669, 14139, 19], \"categories\": {\"supported_player_categoryids\": [2, 1, 49, 36, 47, 9, 38, 48], \"feature_categoryids\": [22, 29, 67, 68, 69, 74, 78, 79, 23, 8, 15, 62]}, \"reviews\": {\"summary_filtered\": {\"review_count\": 0, \"percent_positive\": 0, \"review_score\": 0, \"review_score_label\": \"No user reviews\"}}, \"basic_info\": {\"short_description\": \"Total War: SHOGUN 2 is the perfect mix of real-time and turn-based strategy gaming for newcomers and veterans alike.\", \"publishers\": [{\"name\": \"SEGA\", \"creator_clan_account_id\": 32528477}, {\"name\": \"Feral Interactive (Mac)\"}, {\"name\": \"Feral Interactive (Linux)\", \"creator_clan_account_id\": 33824648}], \"developers\": [{\"name\": \"CREATIVE ASSEMBLY\"}, {\"name\": \"Feral Interactive (Mac)\"}, {\"name\": \"Feral Interactive (Linux)\", \"creator_clan_account_id\": 33824648}], \"franchises\": [{\"name\": \"Total War\", \"creator_clan_account_id\": 32991376}], \"capsule_headline\": \"#label_new_dlc_available\"}, \"tags\": [{\"tagid\": 9, \"weight\": 1665}, {\"tagid\": 3987, \"weight\": 973}, {\"tagid\": 1741, \"weight\": 879}, {\"tagid\": 1676, \"weight\": 782}, {\"tagid\": 4364, \"weight\": 745}, {\"tagid\": 1708, \"weight\": 563}, {\"tagid\": 4182, \"weight\": 506}, {\"tagid\": 3859, \"weight\": 500}, {\"tagid\": 10617, \"weight\": 435}, {\"tagid\": 3813, \"weight\": 418}, {\"tagid\": 4168, \"weight\": 364}, {\"tagid\": 6310, \"weight\": 331}, {\"tagid\": 1688, \"weight\": 330}, {\"tagid\": 1685, \"weight\": 280}, {\"tagid\": 1677, \"weight\": 254}, {\"tagid\": 4172, \"weight\": 250}, {\"tagid\": 1756, \"weight\": 197}, {\"tagid\": 1669, \"weight\": 186}, {\"tagid\": 14139, \"weight\": 166}, {\"tagid\": 19, \"weight\": 165}], \"assets\": {\"asset_url_format\": \"steam/apps/34330/${FILENAME}?t=1763649183\", \"main_capsule\": \"capsule_616x353.jpg\", \"small_capsule\": \"capsule_231x87.jpg\", \"header\": \"header.jpg\", \"library_capsule\": \"library_600x900.jpg\", \"library_capsule_2x\": \"library_600x900_2x.jpg\", \"library_hero\": \"library_hero.jpg\", \"library_hero_2x\": \"library_hero_2x.jpg\", \"page_background_path\": \"app/34330?t=1763649183\", \"last_modified\": 1763649183}, \"release\": {\"steam_release_date\": 1300194000, \"mac_release_date\": 1406824080}, \"platforms\": {\"windows\": true, \"mac\": true, \"steamos_linux\": true, \"vr_support\": {}, \"steam_deck_compat_category\": 2, \"steam_os_compat_category\": 2, \"steam_frame_compat_category\": 0, \"steam_machine_compat_category\": 2}, \"game_rating\": {\"type\": \"esrb\", \"rating\": \"t\", \"descriptors\": [\"Language\", \"Sexual Themes\", \"Violence\"], \"agency\": 1, \"survey_interactive_elements\": [4], \"required_age\": 0, \"use_age_gate\": false, \"image_url\": \"public/shared/images/game_ratings/ESRB/t.png\"}, \"best_purchase_option\": {\"packageid\": 7587, \"purchase_option_name\": \"Total War: SHOGUN 2\", \"final_price_in_cents\": \"2999\", \"formatted_final_price\": \"$29.99\", \"user_can_purcha\n"}

[Think]

**Fixing alias identity mapping**

[Think]

**Fixing alias identity mapping**

**Fixing canonical alias handling**

I found an important detail in Steam’s responses: some regional or legacy app IDs redirect to a different, canonical game ID. Those can look like missing games—and can overwrite regional statistics if treated as ordinary records. I’m preserving the redirects explicitly and correcting those records before the final checks.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"d66c4a","wall_time_seconds":1.000865094,"session_id":57267,"original_token_count":0,"output":""}
{"chunk_id":"6dd3db","wall_time_seconds":0.000001115,"exit_code":0,"original_token_count":630,"output":"appdetails {'201270': {'success': True, 'data': {'type': 'game', 'name': 'Total War: SHOGUN 2', 'steam_appid': 34330, 'required_age': 0, 'is_free': False, 'dlc': [223180, 201279, 201277, 34348, 34342, 34343, 34345, 201272], 'detailed_description': '<h1>Total War: SHOGUN 2 out now for Linux.</h1><p><span class=\"bb_img_ctn\"><img class=\"bb_img\" src=\"https://shared.akamai.steamstatic.com/store_item_assets/steam/apps/201270/extras/74b001fdd0011f785d9158d660638e9a.avif?t=1763649183\" width=616 height=150 /></span></p><br><h1>About the Game</h1><strong>MASTER THE ART OF WAR</strong><br>\\t\\t\\t\\t\\t\\tIn the darkest age of Japan, endless war leaves a country divided. It is the middle of the 16th Century in Feudal Japan. The country, once ruled by a unified government, is now split into many warring clans.  Ten legendary warlords strive for supremacy as conspiracies and conflicts wither the empire.  Only one will rise above all to win the heart of a nation as the new shogun...The others will die by his sword.<br>\\t\\t\\t\\t\\t\\tTake on the role of one Daimyo, the clan leader, and use military engagements, economics and diplomacy to achieve the ultimate goal: re-unite Japan under his supreme command and become the new Shogun – the undisputed ruler of a pacified nation.<br>\\t\\t\\t\\t\\t\\t<h2 class=\"bb_tag\" >Game Features</h2>\\t\\t\\t\\t\\t\\tTotal War: SHOGUN 2 features enhanced full 3D battles via land and sea, which made a name for the series, as well as the tactical campaign map that many refer to as the heart and soul of Total War. Featuring a brand new AI system inspired by the scriptures that influenced Japanese warfare, the millennia old Chinese “Art of War”, the Creative Assembly brings the wisdom of Master Sun Tsu to Total War: SHOGUN 2. Analysing this ancient text enabled the Creative Assembly to implement easy to understand yet deep strategical gameplay.<br>\\t\\t\\t\\t\\t\\t<ul class=\"bb_ul\"><li><strong>CONQUER</strong> the islands of Japan in the 16th century.  Lead vast armies of samurai and fleets of giant warships into breathtaking real-time battles.<br>\\t\\t\\t\\t\\t\\t\\t</li><li><strong>BUILD</strong> your kingdom on the inviting and turn-based campaign map.  Wield economic, political, and military power to amass wealth, armies, and influence.<br>\\t\\t\\t\\t\\t\\t\\t</li><li><strong>SCHEME</strong> according to the &quot;Art of War&quot; by Sun Tzu. Use fire and siege tactics, spies and assassins to adapt to the ever-changing conditions on the battlefield and throughout your kingdom.<br>\\t\\t\\\n"}

[Think]

**Fixing cached alias queueing**

[Think]

**Fixing cached alias queueing**

**Loading cached alias IDs**

[Think]

**Fixing cached alias queueing**

**Loading cached alias IDs**

[Think]

**Fixing cached alias queueing**

**Loading cached alias IDs**

**Implementing alias repair**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/repair_aliases.py <<'PY'\n#!/us...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"34d25c","wall_time_seconds":0.000002449,"exit_code":0,"original_token_count":0,"output":""}
{}
{"chunk_id":"1443ca","wall_time_seconds":1.001490422,"session_id":2504,"original_token_count":0,"output":""}

[Think]

**Ingesting raw alias records**

[Think]

**Ingesting raw alias records**

**Fixing canonical deletion logic**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/repair_al...)

Script completed
Wall time 0.1 seconds
Output:

{}
{"chunk_id":"a9a011","wall_time_seconds":0.000005116,"exit_code":0,"original_token_count":100,"output":"{\"at\": \"2026-09-05T20:32:29.633434+00:00\", \"phase\": \"catalog\", \"games\": 185136, \"regional\": 879914, \"discovery\": 4566347, \"pages\": 5455, \"game_tags\": 2928160, \"image_sources\": 2972506}\n{\"at\": \"2026-09-05T20:32:17.742896+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 876862, \"discovery\": 4558295, \"pages\": 5445, \"game_tags\": 2928160, \"image_sources\": 2972506}\nSat Sep  5 20:32:31 UTC 2026\n"}

[Think]

**Processing remaining country data**

[Think]

**Processing remaining country data**

**Running alias repair**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"514ec1","wall_time_seconds":1.001278947,"session_id":6074,"original_token_count":0,"output":""}
{"chunk_id":"63c7ea","wall_time_seconds":9.03e-7,"exit_code":0,"original_token_count":0,"output":""}

[Think]

**Preparing artifact metadata**

[Think]

**Preparing artifact metadata**

**Verifying artifact media files**

The detailed collection for the five main storefronts has finished. The remaining regional ID checks are lightweight, and I’m using the saved responses to repair the redirect mappings.

The final delivery will include a clean games export, separate non-game records, and a complete field inventory with availability counts—not just a list of fields the API could theoretically return.

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/validate....)

Script completed
Wall time 0.1 seconds
Output:

{}
{"chunk_id":"614f64","wall_time_seconds":0.00000294,"exit_code":0,"original_token_count":170,"output":"{\"at\": \"2026-09-05T20:33:33.676846+00:00\", \"stage\": \"repair_aliases.py\", \"args\": []}\n{\"at\": \"2026-09-05T20:34:29.806080+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 880914, \"discovery\": 4626889, \"pages\": 5517, \"game_tags\": 2928160, \"image_sources\": 2972506}\n    PID %CPU   RSS     ELAPSED COMMAND\n2338183  1.4 30208       23:52 python -u /home/adn/a327ex/steam-research/collect.py --phase wide_ids --countries GB,FR,CA,AU,KR,TW,HK,RU,UA,TR,IN,SG,MX,AR,TH,ID,VN,ZA --workers 1\n2399394  0.1 36436       01:11 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2399405 98.8 208688      01:11 /usr/bin/python /home/adn/a327ex/steam-research/repair_aliases.py\n"}

[Think]

**Repairing 1-minute targets**

[Think]

**Repairing 1-minute targets**

**Updating metadata dictionary**

[Think]

**Repairing 1-minute targets**

**Updating metadata dictionary**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1000}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.1 seconds
Output:

{"chunk_id":"72309a","wall_time_seconds":50.000303851,"session_id":97451,"original_token_count":0,"output":""}
{"chunk_id":"3b8b31","wall_time_seconds":0.000002741,"exit_code":0,"original_token_count":68,"output":"{\"at\": \"2026-09-05T20:33:33.676846+00:00\", \"stage\": \"repair_aliases.py\", \"args\": []}\n{\"at\": \"2026-09-05T20:37:01.819559+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 880914, \"discovery\": 4702889, \"pages\": 5593, \"game_tags\": 2928160, \"image_sources\": 2972506}\n"}

[Think]

**Monitoring alias-repair progress**

[Think]

**Monitoring alias-repair progress**

[Think]

**Monitoring alias-repair progress**

**Waiting for alias repair**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sys,json\nsys.path.insert(0,'/home/adn/a327e...)

Script completed
Wall time 0.3 seconds
Output:

{"chunk_id":"33bcbb","wall_time_seconds":0.05711332,"exit_code":0,"original_token_count":198,"output":"[\n  {\n    \"id\": 63970,\n    \"appid\": 63950,\n    \"name\": \"IL-2 Sturmovik: Cliffs of Dover\",\n    \"success\": 15\n  },\n  {\n    \"id\": 201270,\n    \"appid\": 34330,\n    \"name\": \"Total War: SHOGUN 2\",\n    \"success\": 1\n  },\n  {\n    \"id\": 900883,\n    \"appid\": 22330,\n    \"name\": \"The Elder Scrolls IV: Oblivion\\u00ae Game of the Year Edition Deluxe (2009)\",\n    \"success\": 1\n  },\n  {\n    \"id\": 901638,\n    \"appid\": 39160,\n    \"name\": \"Dungeon Siege III\",\n    \"success\": 15\n  },\n  {\n    \"id\": 901735,\n    \"appid\": 40960,\n    \"name\": \"The Stronghold Collection\",\n    \"success\": 1\n  },\n  {\n    \"id\": 901776,\n    \"appid\": 80200,\n    \"name\": \"Fate of the World: Tipping Point\",\n    \"success\": 1\n  },\n  {\n    \"id\": 2995920,\n    \"appid\": 1426210,\n    \"name\": \"It Takes Two Friend's Pass\",\n    \"success\": 1\n  }\n]\n"}
{"chunk_id":"ff371a","wall_time_seconds":0.000002643,"exit_code":0,"original_token_count":225,"output":"{\"at\": \"2026-09-05T20:33:33.676846+00:00\", \"stage\": \"repair_aliases.py\", \"args\": []}\n{\"at\": \"2026-09-05T20:37:41.236349+00:00\", \"redirected_ids\": 7, \"canonical_country_pairs_restored\": 25, \"invalid_regional_observations_removed\": 8, \"remaining_alias_payloads\": 0}\n{\"at\": \"2026-09-05T20:38:07.889474+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 880907, \"discovery\": 4735889, \"pages\": 5626, \"game_tags\": 2928160, \"image_sources\": 2972511}\n    PID %CPU   RSS     ELAPSED COMMAND\n2338183  1.4 29956       27:28 python -u /home/adn/a327ex/steam-research/collect.py --phase wide_ids --countries GB,FR,CA,AU,KR,TW,HK,RU,UA,TR,IN,SG,MX,AR,TH,ID,VN,ZA --workers 1\n2399394  0.0 16844       04:47 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2404656  0.8 42656       02:44 python /home/adn/a327ex/Anchor/workflow/anchor.py continue --session f358a6ef-8223-46e2-b268-30a14e43dd60\n"}

[Think]

**Checking alias 7 identity**

[Think]

**Checking alias 7 identity**

**Auditing dataset field counts**

[Think]

**Checking alias 7 identity**

**Auditing dataset field counts**

[Think]

**Checking alias 7 identity**

**Auditing dataset field counts**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1000}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.0 seconds
Output:

{"chunk_id":"40873a","wall_time_seconds":50.001190652,"session_id":97451,"original_token_count":0,"output":""}
{"chunk_id":"e52bb8","wall_time_seconds":0.000002718,"exit_code":0,"original_token_count":113,"output":"{\"at\": \"2026-09-05T20:33:33.676846+00:00\", \"stage\": \"repair_aliases.py\", \"args\": []}\n{\"at\": \"2026-09-05T20:37:41.236349+00:00\", \"redirected_ids\": 7, \"canonical_country_pairs_restored\": 25, \"invalid_regional_observations_removed\": 8, \"remaining_alias_payloads\": 0}\n{\"at\": \"2026-09-05T20:41:01.695150+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 880907, \"discovery\": 4821437, \"pages\": 5713, \"game_tags\": 2928160, \"image_sources\": 2972511}\n"}

The redirect repair is complete: seven alternate IDs are mapped explicitly, and the affected regional records have been corrected. The last regional catalog checks are still running. No image or other media files have been downloaded during this continuation.

[Think]

**Checking catalog completion counts**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1000}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.1 seconds
Output:

{"chunk_id":"d29050","wall_time_seconds":50.00086333,"session_id":97451,"original_token_count":0,"output":""}
{"chunk_id":"24eafd","wall_time_seconds":0.000002037,"exit_code":0,"original_token_count":23,"output":"{\"complete_storefronts\": 21, \"remaining\": [[\"VN\", 69000, 184389], [\"ZA\", 1000, 184583]]}\n"}

[Think]

**Rechecking the VN count**

[Think]

**Rechecking the VN count**

**Patching count-range validation**

[Think]

**Rechecking the VN count**

**Patching count-range validation**

[Think]

**Rechecking the VN count**

**Patching count-range validation**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/collect.p...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"eba466","wall_time_seconds":1.001401848,"session_id":26196,"original_token_count":0,"output":""}

[Think]

**Waiting for alias repair**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"12c12d","wall_time_seconds":1.000879966,"session_id":85953,"original_token_count":0,"output":""}

[Think]

**Checking alias repair metadata**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/reconcile...)

Script completed
Wall time 0.1 seconds
Output:

{}
{"chunk_id":"7eb940","wall_time_seconds":0.00000167,"exit_code":0,"original_token_count":46,"output":"{\"enumerated\": 21, \"remaining\": [[\"VN\", 165000, 184389], [\"ZA\", 1000, 184583]], \"changed_during_collection\": [[\"ID\", 184546, 184548], [\"TH\", 184541, 184542], [\"VN\", 184387, 184389]]}\n"}

[Think]

**Defining a bounded snapshot**

[Think]

**Defining a bounded snapshot**

**Setting a finite cutoff**

[Think]

**Defining a bounded snapshot**

**Setting a finite cutoff**

[Think]

**Defining a bounded snapshot**

**Setting a finite cutoff**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3\np='/home/adn/a327ex/steam-research/...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"819bb8","wall_time_seconds":0.000002453,"exit_code":0,"original_token_count":18,"output":"ID 184548 (184546, 184548, 184548)\nTH 184542 (184541, 184542, 184542)\n"}

[Think]

**Building source-count refresh query**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"84de3a","wall_time_seconds":1.001975036,"session_id":72871,"original_token_count":0,"output":""}

[Think]

**Checking description language**

[Think]

**Checking description language**

**Checking compatibility codes**

[Think]

**Checking description language**

**Checking compatibility codes**

[Think]

**Checking description language**

**Checking compatibility codes**

[Think]

**Checking description language**

**Checking compatibility codes**

**Building schema manifest**

[Think]

**Checking description language**

**Checking compatibility codes**

**Building schema manifest**

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Update File: /home/adn/a327ex/steam-research/export.py...)

Script completed
Wall time 0.1 seconds
Output:

{}
{"chunk_id":"cdda64","wall_time_seconds":0.000002196,"exit_code":0,"original_token_count":0,"output":""}

The checks are down to the final storefront. A few catalog totals changed slightly during collection; where that happened, I’m comparing the collected IDs against Steam’s updated totals rather than treating the initial count as fixed.

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1200}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 50.0 seconds
Output:

{"chunk_id":"01d743","wall_time_seconds":50.000782663,"session_id":97451,"original_token_count":0,"output":""}
{"chunk_id":"a6ca33","wall_time_seconds":0.00000357,"exit_code":0,"original_token_count":47,"output":"{\"at\": \"2026-09-05T20:52:17.738467+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 880907, \"discovery\": 5157826, \"pages\": 6051, \"game_tags\": 2928160, \"image_sources\": 2972511}\n"}

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1400}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 4.4 seconds
Output:

{"chunk_id":"0c5c6f","wall_time_seconds":4.377148165,"exit_code":0,"original_token_count":0,"output":""}
{"chunk_id":"dddd49","wall_time_seconds":0.000002948,"exit_code":0,"original_token_count":47,"output":"{\"at\": \"2026-09-05T20:52:51.746289+00:00\", \"phase\": \"wide_ids\", \"games\": 185136, \"regional\": 880907, \"discovery\": 5173411, \"pages\": 6068, \"game_tags\": 2928160, \"image_sources\": 2972511}\n"}

[Think]

**Waiting for report output**

[Think]

**Waiting for report output**

**Reconciling regional aliases**

[Think]

**Waiting for report output**

**Reconciling regional aliases**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1700}\ntext(await tools.exec_command({cmd:\"tai...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"bc814a","wall_time_seconds":0.000003449,"exit_code":0,"original_token_count":137,"output":"    \"creators\": 184999,\n    \"languages\": 185051,\n    \"game_categories\": 185160,\n    \"game_images\": 185157\n  },\n  \"collection_times\": [\n    \"2026-09-05T19:09:38.986403+00:00\",\n    \"2026-09-05T20:52:51.740753+00:00\"\n  ],\n  \"missing_tag_names\": 0\n}\n{\"at\": \"2026-09-05T20:53:51.552560+00:00\", \"stage\": \"validate.py\", \"args\": []}\n    PID %CPU   RSS     ELAPSED COMMAND\n2437561  2.8 183252      05:56 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2451424 15.9 309352      00:33 /usr/bin/python /home/adn/a327ex/steam-research/validate.py\n"}
{"chunk_id":"715196","wall_time_seconds":0.000001106,"exit_code":143,"original_token_count":39,"output":"Terminated                 python -u /home/adn/a327ex/steam-research/finish_metadata.py > /home/adn/a327ex/steam-research/2026-09-05/finalization.log 2>&1\n"}

All 23 storefront catalogs have now been enumerated, and every discovered app ID has been accounted for, including redirects. The network collection is finished. I’m running the final consistency checks and generating the exports and field-availability report.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport json\nfrom pathlib import Path\nr=Path('/ho...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"6c3fc9","wall_time_seconds":0.00000307,"exit_code":0,"original_token_count":603,"output":"counts {\"games\": 185167, \"regional\": 880963, \"discovery\": 5173411, \"pages\": 6068, \"game_tags\": 2928637, \"creators\": 433670, \"languages\": 1076061, \"game_categories\": 1039906, \"image_sources\": 2972990, \"game_images\": 4226043, \"app_aliases\": 33}\ndistinct_discovered_apps 185173\nunresolved_apps []\nalias_ids 7\ntypes {\"0\": 184664, \"2\": 148, \"4\": 347, \"11\": 3, \"14\": 5}\ngame_status [{\"coming_soon\": 0, \"free\": 0, \"early_access\": 0, \"count\": 99889}, {\"coming_soon\": 0, \"free\": 0, \"early_access\": 1, \"count\": 10414}, {\"coming_soon\": 0, \"free\": 1, \"early_access\": 0, \"count\": 16892}, {\"coming_soon\": 0, \"free\": 1, \"early_access\": 1, \"count\": 1777}, {\"coming_soon\": 1, \"free\": 0, \"early_access\": 0, \"count\": 46365}, {\"coming_soon\": 1, \"free\": 0, \"early_access\": 1, \"count\": 5193}, {\"coming_soon\": 1, \"free\": 1, \"early_access\": 0, \"count\": 3441}, {\"coming_soon\": 1, \"free\": 1, \"early_access\": 1, \"count\": 693}]\nprimary_country {\"BR\": 20, \"CN\": 67, \"DE\": 13, \"FR\": 3, \"GB\": 2, \"ID\": 1, \"IN\": 1, \"JP\": 75, \"KR\": 3, \"RU\": 6, \"TH\": 1, \"TR\": 4, \"TW\": 7, \"UA\": 2, \"US\": 184961, \"ZA\": 1}\nregional_additions_to_us 208\nfield_coverage {\"steam_release_date\": 144434, \"original_release_date\": 16099, \"original_steam_release_date\": 7536, \"release_from_early_access_date\": 774, \"reviews_filtered_count\": 185167, \"reviews_unfiltered_count\": 167, \"reviews_english_count\": 5260, \"short_description\": 183832, \"game_tags\": 185121, \"creators\": 184999, \"languages\": 185051, \"game_categories\": 185160, \"game_images\": 185157}\ncollection_times [\"2026-09-05T19:09:38.986403+00:00\", \"2026-09-05T20:52:51.740753+00:00\"]\nmissing_tag_names 0\nmatching catalog counts [('US', 184611, [184611, 184611]), ('BR', 183195, [183195, 183195]), ('JP', 184364, [184364, 184364]), ('CN', 174361, [174361, 174361]), ('DE', 154052, [154052, 154052]), ('GB', 184606, [184606, 184606]), ('FR', 184589, [184589, 184589]), ('CA', 184616, [184616, 184616]), ('AU', 184565, [184565, 184565]), ('KR', 183985, [183985, 183985]), ('TW', 184542, [184542, 184542]), ('HK', 184538, [184538, 184538]), ('RU', 180280, [180280, 180280]), ('UA', 184556, [184556, 184556]), ('TR', 184579, [184579, 184579]), ('IN', 184562, [184562, 184562]), ('SG', 184583, [184583, 184583]), ('MX', 184617, [184617, 184617]), ('AR', 184601, [184601, 184601]), ('TH', 184542, [184541, 184542]), ('ID', 184548, [184546, 184548]), ('VN', 184389, [184387, 184389]), ('ZA', 184585, [184583, 184585])]\n"}

[Think]

**Checking review field coverage**

[Think]

**Checking review field coverage**

[Think]

**Checking review field coverage**

**Reconciling ID counts**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1700}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 5.1 seconds
Output:

{"chunk_id":"26b41e","wall_time_seconds":5.001126128,"session_id":72871,"original_token_count":0,"output":""}
{"chunk_id":"1c77ff","wall_time_seconds":0.000002424,"exit_code":0,"original_token_count":228,"output":"  \"checks\": {\n    \"sqlite_quick_check\": [\n      [\n        \"ok\"\n      ]\n    ],\n    \"missing_tag_definitions\": 0,\n    \"orphan_game_tags\": 0,\n    \"orphan_image_associations\": 0,\n    \"wrong_embedded_appids\": 0,\n    \"alias_payload_used_as_canonical\": 0,\n    \"tag_count_mismatch\": 0,\n    \"positive_percent_out_of_range\": 0,\n    \"negative_review_counts\": 0,\n    \"duplicate_primary_appids\": 0,\n    \"image_directories_present\": 0,\n    \"image_downloader_present\": 0,\n    \"image_download_queue_present\": 0\n  },\n  \"passed\": true\n}\n{\"at\": \"2026-09-05T20:55:12.083502+00:00\", \"stage\": \"inventory.py\", \"args\": []}\n{\"inventoried_games\": 50000}\n{\"inventoried_games\": 100000}\n{\"inventoried_games\": 150000}\n    PID %CPU   RSS     ELAPSED COMMAND\n2437561  2.2 183252      07:46 python -u /home/adn/a327ex/steam-research/finish_metadata.py\n2454762 99.4 360484      01:03 /usr/bin/python /home/adn/a327ex/steam-research/inventory.py\n"}

[Think]

**Validating inventory**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport json\nfrom pathlib import Path\nr=Path('/ho...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"d33008","wall_time_seconds":0.000002681,"exit_code":0,"original_token_count":1125,"output":"Total game fields 297 game records 184664\nname {'field': 'name', 'present_games': 184664, 'nonempty_games': 184646, 'present_percent': 100.0, 'types': 'string'}\nbasic_info.short_description {'field': 'basic_info.short_description', 'present_games': 183399, 'nonempty_games': 183399, 'present_percent': 99.315, 'types': 'string'}\nfull_description_bbcode {'field': 'full_description_bbcode', 'present_games': 184536, 'nonempty_games': 184536, 'present_percent': 99.9307, 'types': 'string'}\ntags {'field': 'tags', 'present_games': 184621, 'nonempty_games': 184621, 'present_percent': 99.9767, 'types': 'array'}\nbasic_info.developers {'field': 'basic_info.developers', 'present_games': 184417, 'nonempty_games': 184417, 'present_percent': 99.8662, 'types': 'array'}\nbasic_info.publishers {'field': 'basic_info.publishers', 'present_games': 183942, 'nonempty_games': 183942, 'present_percent': 99.609, 'types': 'array'}\nbasic_info.franchises {'field': 'basic_info.franchises', 'present_games': 36967, 'nonempty_games': 36967, 'present_percent': 20.0185, 'types': 'array'}\nrelease {'field': 'release', 'present_games': 184664, 'nonempty_games': 184616, 'present_percent': 100.0, 'types': 'object'}\nrelease.steam_release_date {'field': 'release.steam_release_date', 'present_games': 143967, 'nonempty_games': 143967, 'present_percent': 77.9616, 'types': 'integer'}\nrelease.original_release_date {'field': 'release.original_release_date', 'present_games': 16045, 'nonempty_games': 16045, 'present_percent': 8.6888, 'types': 'integer'}\nrelease.original_steam_release_date {'field': 'release.original_steam_release_date', 'present_games': 7536, 'nonempty_games': 7536, 'present_percent': 4.0809, 'types': 'integer'}\nrelease.release_from_early_access_date {'field': 'release.release_from_early_access_date', 'present_games': 774, 'nonempty_games': 774, 'present_percent': 0.4191, 'types': 'integer'}\nreviews.summary_filtered {'field': 'reviews.summary_filtered', 'present_games': 184664, 'nonempty_games': 184664, 'present_percent': 100.0, 'types': 'object'}\nreviews.summary_unfiltered {'field': 'reviews.summary_unfiltered', 'present_games': 158, 'nonempty_games': 158, 'present_percent': 0.0856, 'types': 'object'}\nreviews.summary_language_specific {'field': 'reviews.summary_language_specific', 'present_games': 5211, 'nonempty_games': 5211, 'present_percent': 2.8219, 'types': 'object'}\nbest_purchase_option {'field': 'best_purchase_option', 'present_games': 110092, 'nonempty_games': 110092, 'present_percent': 59.6175, 'types': 'object'}\npurchase_options {'field': 'purchase_options', 'present_games': 110402, 'nonempty_games': 110402, 'present_percent': 59.7853, 'types': 'array'}\nsupported_languages {'field': 'supported_languages', 'present_games': 184559, 'nonempty_games': 184559, 'present_percent': 99.9431, 'types': 'array'}\nplatforms {'field': 'platforms', 'present_games': 184664, 'nonempty_games': 184664, 'present_percent': 100.0, 'types': 'object'}\nplatforms.steam_deck_compat_category {'field': 'platforms.steam_deck_compat_category', 'present_games': 184660, 'nonempty_games': 184660, 'present_percent': 99.9978, 'types': 'integer'}\ncategories {'field': 'categories', 'present_games': 184664, 'nonempty_games': 184660, 'present_percent': 100.0, 'types': 'object'}\nrelated_items {'field': 'related_items', 'present_games': 38507, 'nonempty_games': 38507, 'present_percent': 20.8525, 'types': 'object'}\ngame_rating {'field': 'game_rating', 'present_games': 8661, 'nonempty_games': 8661, 'present_percent': 4.6901, 'types': 'object'}\ncontent_descriptorids {'field': 'content_descriptorids', 'present_games': 43085, 'nonempty_games': 43085, 'present_percent': 23.3316, 'types': 'array'}\nscreenshots {'field': 'screenshots', 'present_games': 184392, 'nonempty_games': 184354, 'present_percent': 99.8527, 'types': 'object'}\nassets {'field': 'assets', 'present_games': 184654, 'nonempty_games': 184654, 'present_percent': 99.9946, 'types': 'object'}\nassets_without_overrides {'field': 'assets_without_overrides', 'present_games': 184654, 'nonempty_games': 184654, 'present_percent': 99.9946, 'types': 'object'}\ntrailers {'field': 'trailers', 'present_games': 168253, 'nonempty_games': 168253, 'present_percent': 91.113, 'types': 'object'}\nlinks {'field': 'links', 'present_games': 87871, 'nonempty_games': 87871, 'present_percent': 47.5843, 'types': 'array'}\npackage_groups {'field': 'package_groups', 'present_games': 10318, 'nonempty_games': 10318, 'present_percent': 5.5874, 'types': 'array'}\n"}

[Think]

**Verifying complete field coverage**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -18 /home/adn/a327ex/steam-research/2026-09-05/finalization.log; ...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"f9d7dc","wall_time_seconds":0.000002603,"exit_code":1,"original_token_count":294,"output":"  File \"/home/adn/a327ex/steam-research/inventory.py\", line 56, in <module>\n    if __name__=='__main__':main()\n                            ~~~~^^\n  File \"/home/adn/a327ex/steam-research/inventory.py\", line 52, in main\n    summaries={key:db.execute(query).fetchone()[0] for key,query in queries.items()}\n                   ~~~~~~~~~~^^^^^^^\nsqlite3.OperationalError: ambiguous column name: name\nTraceback (most recent call last):\n  File \"/home/adn/a327ex/steam-research/finish_metadata.py\", line 50, in <module>\n    run('inventory.py')\n    ~~~^^^^^^^^^^^^^^^^\n  File \"/home/adn/a327ex/steam-research/finish_metadata.py\", line 9, in run\n    subprocess.run([python,str(BASE/script),*args],check=True)\n    ~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.14/subprocess.py\", line 578, in run\n    raise CalledProcessError(retcode, process.args,\n                             output=stdout, stderr=stderr)\nsubprocess.CalledProcessError: Command '['/usr/bin/python', '/home/adn/a327ex/steam-research/inventory.py']' returned non-zero exit status 1.\ncat: /home/adn/a327ex/steam-research/2026-09-05/inventory_summary.json: No such file or directory\n"}

[Think]

**Fixing inventory query**

[Think]

**Fixing inventory query**

**Running fixed inventory**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"cbc190","wall_time_seconds":1.000642886,"session_id":29567,"original_token_count":0,"output":""}

[Think]

**Scoping canonical field inventory**

exec ({"code": "// @exec: {\"yield_time_ms\": 60000, \"max_output_tokens\": 1800}\ntext(await tools.write_stdin({session_id...)

Script completed
Wall time 31.7 seconds
Output:

{"chunk_id":"b0e374","wall_time_seconds":31.621238627,"exit_code":0,"original_token_count":8,"output":"METADATA COLLECTION COMPLETE\n"}
{"chunk_id":"87f89f","wall_time_seconds":0.000002604,"exit_code":0,"original_token_count":385,"output":"  \"unique_image_references_for_games\": 2967715,\n  \"earliest_fetch\": \"2026-09-05T19:09:38.986403+00:00\",\n  \"latest_fetch\": \"2026-09-05T20:53:33.945370+00:00\"\n}\n{\"table\": \"games\", \"rows\": 184664, \"bytes\": 365531426}\n{\"table\": \"other_apps\", \"rows\": 503, \"bytes\": 541188}\n{\"table\": \"regional\", \"rows\": 880963, \"bytes\": 61529676}\n{\"table\": \"game_tags\", \"rows\": 2928637, \"bytes\": 10628682}\n{\"table\": \"tag_names\", \"rows\": 430, \"bytes\": 5706}\n{\"table\": \"creators\", \"rows\": 433670, \"bytes\": 4582946}\n{\"table\": \"languages\", \"rows\": 1076061, \"bytes\": 2004741}\n{\"table\": \"game_categories\", \"rows\": 1039906, \"bytes\": 1981145}\n{\"table\": \"category_names\", \"rows\": 72, \"bytes\": 5486}\n{\"table\": \"game_images\", \"rows\": 4226043, \"bytes\": 108824373}\n{\"table\": \"image_sources\", \"rows\": 2972990, \"bytes\": 173465346}\n{\"table\": \"discovery\", \"rows\": 5173411, \"bytes\": 15179016}\n{\"table\": \"pages\", \"rows\": 6068, \"bytes\": 92065}\n{\"table\": \"app_aliases\", \"rows\": 33, \"bytes\": 2433}\n{\n  \"games\": 184664,\n  \"released_games\": 128972,\n  \"upcoming_games\": 55692,\n  \"free_games\": 22803,\n  \"early_access_games\": 18077,\n  \"mods\": 148,\n  \"other_app_records\": 355,\n  \"distinct_tags\": 430,\n  \"games_with_tags\": 184621,\n  \"games_with_developer\": 184417,\n  \"games_with_publisher\": 183942,\n  \"games_with_supported_languages\": 184482,\n  \"games_with_image_references\": 184654,\n  \"games_with_screenshot_references\": 184354,\n  \"unique_image_references_for_games\": 2967715,\n  \"earliest_fetch\": \"2026-09-05T19:09:38.986403+00:00\",\n  \"latest_fetch\": \"2026-09-05T20:53:33.945370+00:00\"\n}"}

[Think]

**Checking README field counts**

**Reconciling game field counts**

[Think]

**Checking README field counts**

**Reconciling game field counts**

[Think]

**Checking README field counts**

**Reconciling game field counts**

Validation passed, and the exports are complete. The snapshot contains 184,664 game apps: 128,972 released and 55,692 upcoming, with mods and other app types separated.

I’m finishing the accompanying data guide now. It will show the available fields, their coverage, and the important gaps—especially the limited availability of separate language-specific review summaries.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport json\nb=Path('/ho...)

Script completed
Wall time 0.2 seconds
Output:

{"chunk_id":"4465d6","wall_time_seconds":0.00000294,"exit_code":0,"original_token_count":85,"output":"{\n  \"complete\": {\n    \"completed_at\": \"2026-09-05T21:00:23.795220+00:00\",\n    \"apps\": 185167,\n    \"games\": 184664,\n    \"all_discovered_app_ids_resolved\": true,\n    \"structured_storefronts_complete\": 23,\n    \"validation\": \"passed\",\n    \"exports\": \"completed\",\n    \"image_files\": 0\n  },\n  \"parquet_bytes\": 744374229,\n  \"field_paths\": 297\n}\n"}
{"chunk_id":"110fef","wall_time_seconds":0.00000259,"exit_code":0,"original_token_count":88,"output":"8.6G\t/home/adn/a327ex/steam-research/2026-09-05\n-rw-r--r-- 1 adn adn 6.1G Sep  5 17:53 /home/adn/a327ex/steam-research/2026-09-05/catalog.sqlite\n-rw-r--r-- 1 adn adn 349M Sep  5 17:59 /home/adn/a327ex/steam-research/2026-09-05/exports/games.parquet\n-rw-r--r-- 1 adn adn  18K Sep  5 17:59 /home/adn/a327ex/steam-research/2026-09-05/field_inventory.csv\n"}

[Think]

**Checking README field counts**

**Checking dataset counts**

[Think]

**Checking README field counts**

**Checking dataset counts**

[Think]

**Checking README field counts**

**Checking dataset counts**

[Think]

**Checking README field counts**

**Checking dataset counts**

[Think]

**Checking README field counts**

**Checking dataset counts**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport json\nb=Path('/ho...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"90fba6","wall_time_seconds":0.000002641,"exit_code":0,"original_token_count":10,"output":"Guide and completion audit finalized.\n"}

Finished. The September 5, 2026 snapshot contains 184,664 game apps:

  • 128,972 released
  • 55,692 upcoming
  • Separately: 148 store-listed mods and 355 other app records

All 23 storefront catalogs were enumerated, and every discovered app ID is accounted for, including redirects. Validation passed. This covers the public catalogs checked; completely delisted, unpublished, or otherwise unlisted games can be absent.

The following data exists in the preferred per-game records. Counts describe actual availability, not fields merely supported by the API.

Data What’s stored Games covered
Identity and status App ID, name, store URL, type, visibility, free/upcoming/Early Access flags 184,664; 18 names blank
Descriptions Short description; full description in BBCode 183,399 short; 184,536 full
Tags Up to 20 tags, names, IDs, Steam weights and ordering 184,621
Creators Developer, publisher and franchise names; creator-clan IDs where provided 184,417 developers; 183,942 publishers; 36,967 franchises
Release information Steam release timestamp, other release timestamps, planned-release text and flags 143,967 Steam timestamps
Review summaries Review count, percentage positive, score and label 184,664, including zero-review games
Purchase options Current/list prices, discounts, package/bundle IDs, editions and purchase-option details 110,402
Platforms and devices Windows/macOS/Linux, VR support, Steam device compatibility codes 184,664
Features Player modes, controller support and other Steam feature categories 184,660
Languages Language IDs and support/audio/subtitle flags 184,559
Ratings and content Rating agencies, age ratings and content descriptors 8,661 ratings; 43,085 descriptor lists
Related apps Demo, playtest, parent and related-app references 38,507
External links URLs, labels and link types 87,871
Media references Artwork URLs/filenames, screenshot ordering/grouping, trailer metadata 184,654 artwork; 184,354 screenshot galleries; 168,253 trailers
Provenance Source country, retrieval time, exact requests and raw responses All records

Detailed regional observations are retained for the US, Brazil, Japan, China and Germany. The other storefronts supplied additional catalog coverage and game records.

Two important limitations:

  • Separate English-specific review summaries exist for only 5,211 games, and unfiltered summaries for 158. They cannot be assumed available elsewhere.
  • There are no individual reviews, review histories, reviewer playtimes, sales, revenue, ownership, wishlists, concurrent-player counts, historical prices, development-time or marketing-effort data. Images and other media binaries remain absent, and the downloader is deleted.

The complete inventory lists 297 observed JSON field paths, their types and availability counts.

Files:

All Parquet tables together occupy about 744 MB. Network collection is closed.

Does the description line include the full game description on the bottom of the page or just the small one to the side, or both?

Both:

  • Small description beside the screenshots: basic_info.short_description — available for 183,399 games.
  • Full “About This Game” description farther down: full_description_bbcode — available for 184,536 games, including formatting and embedded image references, but no downloaded images.

The full description is inside each game’s data_json in SQLite and Parquet. The compact CSV contains only the short description.

Perfect, that is a lot of data and outside the image problem this is very thorough. What's the next step based on your previous plan?

[Think]

**Building baseline cohorts**

[Think]

**Building baseline cohorts**

**Defining release cohorts**

[Think]

**Building baseline cohorts**

**Defining release cohorts**

The next step is a first quantitative map of the market, followed by investigations of the strongest anomalies in that map. The data should decide where we look more closely.

I’d start with these questions, in this order:

  1. How has the supply of games changed?
    Count releases by year, tag, tag combination, and paid/free status. Establish which areas are expanding, which are relatively stable, and how much of the growth consists of games receiving very little player response.

  2. Where do recent games receive unusually strong responses?
    Within comparable release windows, examine review-count distributions: medians, upper percentiles, and the proportions exceeding several review thresholds. This lets us distinguish an area with many moderately successful releases from one with thousands of overlooked games and a spectacular exception.

  3. Which apparent opportunities survive removing their biggest successes?
    Recalculate results without the largest game, then without the largest developer or publisher. Measure how concentrated the response is. A pattern repeated across unrelated developers deserves a different interpretation from one carried by a single studio.

  4. Which uncommon combinations perform better than their constituent categories suggest?
    Examine tag pairs and selected triples against games sharing their individual tags. Look for combinations with relatively few releases but consistently strong responses. Keep isolated, exceptional games visible too, while distinguishing those observations from repeatable patterns.

  5. What explains the most interesting numerical anomalies?
    Read the descriptions of the games producing them, alongside nearby games with weaker results. Descriptions may reveal a recurring distinction that the tags conceal. We can then search for that distinction across the wider dataset and test whether the initial observation generalizes. These would be claims about store descriptions, without pretending we have played the games.

One adjustment to the earlier plan matters: we currently have lifetime review counts, not review histories. A 2020 game’s reviews today don’t reveal its reception in 2020. I’d therefore compare categories within release cohorts and distinguish relative changes from absolute growth. Current prices and tags also need to be treated as current attributes.

Likewise, supported languages describe localization supply; they don’t establish demand from those language audiences. Questions about historical momentum or regional audience growth would justify a targeted review-data collection later, after the first pass shows where it would be useful.

The first batch should produce:

  • A broad picture of releases and player response across Steam.
  • A ranked set of promising patterns, with sample sizes, concentration, and counterexamples.
  • A handful of unusual games or combinations worth investigating.
  • Specific follow-up questions generated by those findings.

That gives us useful answers immediately, while making the next research directions increasingly specific and evidence-driven. No additional asset downloads are needed.

Go ahead in whatever way you feel is most appropriate.

I’ll start with release cohorts, tag-level supply and review distributions, then test whether the strongest patterns survive removing their biggest games and developers. I’ll use the descriptions to investigate the numerical outliers after that first pass, and keep the findings here in the conversation as well as in reproducible files.

exec ({"code": "text(await tools.exec_command({cmd:\"cat /home/adn/a327ex/steam-research/README.md; cat /home/adn/a327ex/st...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"559077","wall_time_seconds":0.000002683,"exit_code":0,"original_token_count":5170,"output":"# Steam metadata snapshot — September 5, 2026\n\n**Complete within the documented public-catalog scope.** Network collection is closed. Image files, the image downloader, and its download queue remain deleted. No media binaries are included.\n\nThe clean game dataset contains **184,664 Steam game apps**: **128,972 released** and **55,692 upcoming**. There are separately **148 store-listed mods** and **355 other app records. All **185,173 discovered IDs** are accounted for through direct records or explicit redirects. These counts refer to Steam app identities, not a manual deduplication of game titles or editions.\n\n## Coverage and snapshot meaning\n\nAll 23 selected public storefront catalogs were enumerated completely: US, BR, JP, CN, DE, GB, FR, CA, AU, KR, TW, HK, RU, UA, TR, IN, SG, MX, AR, TH, ID, VN and ZA. Collected unique-ID counts match the maximum totals Steam reported for each catalog. A few totals increased during collection; the additional IDs were captured. The source response ranges are recorded in `coverage.json`.\n\nDetailed regional responses were collected for US, BR, JP, CN and DE. The other regions supplied catalog coverage and additional-game metadata. The separate Steam search audit remains a partial cross-check; its discovered package constituents are retained as non-game records. It is not the basis of the completeness claim.\n\nPrimary metadata was fetched from **2026-09-05T19:09:38.986403+00:00** through **2026-09-05T20:53:33.945370+00:00**. This is a September 5 collection window, not an atomic snapshot of a changing service. Fully delisted, unpublished, unlisted or exclusively available outside the checked storefronts can be absent. Nothing here claims to enumerate every app ever registered with Steam.\n\n## Available per-game data\n\nAvailability below refers to the clean, preferred per-game record (normally US, with regional fallback). It is not a count of every regional observation. All original returned JSON fields are preserved. The complete inventory contains **297 observed JSON field paths**, including container and nested-array paths, with per-game presence/nonempty counts and observed types.\n\n| Group | Data | Coverage |\n|---|---|---|\n| Identity/status | App ID, name, store URL/slug, item type, visibility; free, coming-soon and Early Access flags | 184,664 records; 18 names are blank |\n| Descriptions | Short description and full BBCode description | 183,399 short; 184,536 full |\n| Tags | Up to 20 returned tags, tag IDs/names, weights and rank | 184,621 games; 430 distinct tags |\n| Creators | Developer, publisher and franchise arrays; names and Steam creator-clan IDs where provided | 184,417 developer; 183,942 publisher; 36,967 franchise |\n| Release information | Steam/original/original-Steam/EA-exit timestamps; planned-release text and flags; platform release dates where supplied | 143,967 Steam timestamps; 16,045 original; 7,536 original-Steam; 774 EA-exit |\n| Review summaries | Review count, percent positive, numeric score and label; filtered/unfiltered/language-specific scopes kept separate | 184,664 filtered summaries; 158 unfiltered; 5,211 English-specific |\n| Purchase options | Package/bundle IDs and names, current/undiscounted price strings, formatted prices, discounts, included-game counts, edition/gifting/grouping fields | 110,402 games with purchase options; 110,092 with a best option |\n| Platforms/devices | Windows/macOS/native Linux flags, VR support and Steam device compatibility codes | 184,664 platform objects; codes may be Unknown |\n| Features | Player-mode, feature and controller category IDs, with Steam category labels | 184,660 nonempty category objects |\n| Languages | Language IDs, additional-language IDs, support/full-audio/subtitle flags | 184,559 language arrays; 184,482 with at least one supported language |\n| Content/ratings | Content-descriptor IDs; rating agency, rating, age gate, required age and descriptors where supplied | 43,085 content-descriptor arrays; 8,661 rating objects |\n| Related apps | Demo, standalone demo, playtest, parent and related-app references where returned | 38,507 related-app objects |\n| External links | URLs with link types and labels | 87,871 games |\n| Media references only | Artwork filenames/URL patterns, original and overridden assets; screenshot filenames/order/content grouping; trailer names/categories/formats/references | 184,654 artwork objects; 184,354 nonempty screenshot galleries; 168,253 trailer objects |\n| Provenance | Source country, fetched time, exact request and raw response; discovered IDs, catalog membership and redirect mappings | All primary records; 7 redirecting IDs in 33 country mappings |\n\nThe review summary includes zero-review games. Separate English-specific and unfiltered summaries are only present for the counts above; their absence is not a zero count. No other review-language breakdown should be inferred.\n\nMissing values remain missing. Where Steam omits false-valued status flags, the normalized free/coming-soon/Early-Access columns use the protocol defaults. A planned release timestamp is not evidence a game has launched. Device compatibility codes can mean Unknown. Prices are current storefront observations, and bundle prices are not standalone game prices. Asset modification times are not game update dates.\n\n## Not collected\n\nIndividual review text, review dates/histories, reviewer playtimes, owners, unit sales, revenue, wishlists, current-player counts, historical price/discount series, development duration, team size, marketing effort, achievement lists/counts and system requirements are not part of this dataset. Feature-category flags such as Steam Achievements support are retained. No image, trailer, audio or game binaries are present.\n\n## Files and formats\n\n- `2026-09-05/catalog.sqlite`: complete relational dataset, including all app types. Its `games` table is the app master; filter `type=0` for games. Views include `released_games`, `upcoming_games` and `mods`.\n- `2026-09-05/exports/games.parquet`: one row per game, with normalized columns and the full original preferred Steam item in `data_json`.\n- `2026-09-05/exports/other_apps.parquet`: the 503 non-game records, including the 148 mods.\n- Other Parquet tables: regional purchase/review observations, tags and labels, creators, languages, feature categories and labels, media URL references and associations, catalog membership, raw-page provenance and app aliases.\n- `2026-09-05/exports/games.csv.gz`: compact normalized game columns; use Parquet/SQLite for full nested metadata.\n- `2026-09-05/field_inventory.csv` and `.json`: exhaustive per-game JSON field inventory and availability counts.\n- `2026-09-05/exports/schema.json`: exact export table columns, SQLite types, keys and filtering.\n- `2026-09-05/raw/`: gzip-compressed response envelopes, with request parameters and timestamps, preserving detailed regional responses.\n- `2026-09-05/coverage.json`, `validation.json`, `alias_repair.json`, `metadata_complete.json`, `exports/manifest.json` and `provenance.json`: coverage, successful checks, normalization repair, completion, export row counts and code provenance.\n\nPrimary Steam sources are StoreQuery, StoreBrowse, Steam tag data, and store-category metadata. Protocol definitions were inspected through a mirror of Steam protocol schemas. No previous research logs or market-analysis outputs were imported; no third-party game estimates are included.\n\nChecks passed for database integrity, matching catalog counts, accounted-for app IDs, canonical-ID consistency, tag counts and definitions, relationship integrity, review-count/percentage ranges, duplicate primary keys, and removal of image files/downloader/queue. Parquet row counts were verified after writing.\n\n## Reuse\n\nThe collectors are resumable and retain raw responses before importing them. Network collection is disabled in `network_policy.json`; metadata requests use pacing and stop on HTTP 429. No image downloader remains. The Python scripts and the local `.venv` with PyArrow are retained for reproducible metadata processing and exports.\n{\n  \"games\": 184664,\n  \"released_games\": 128972,\n  \"upcoming_games\": 55692,\n  \"free_games\": 22803,\n  \"early_access_games\": 18077,\n  \"mods\": 148,\n  \"other_app_records\": 355,\n  \"distinct_tags\": 430,\n  \"games_with_tags\": 184621,\n  \"games_with_developer\": 184417,\n  \"games_with_publisher\": 183942,\n  \"games_with_supported_languages\": 184482,\n  \"games_with_image_references\": 184654,\n  \"games_with_screenshot_references\": 184354,\n  \"unique_image_references_for_games\": 2967715,\n  \"earliest_fetch\": \"2026-09-05T19:09:38.986403+00:00\",\n  \"latest_fetch\": \"2026-09-05T20:53:33.945370+00:00\"\n}{\n  \"games\": {\n    \"sqlite_source\": \"games\",\n    \"filter\": \"WHERE type=0\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"name\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"type\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"visible\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"is_free\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"is_coming_soon\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"is_early_access\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"steam_release_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"original_release_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"original_steam_release_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"release_from_early_access_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_filtered_count\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_filtered_positive_percent\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_unfiltered_count\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_english_count\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"short_description\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"source_country\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"fetched_at\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"data_json\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"other_apps\": {\n    \"sqlite_source\": \"games\",\n    \"filter\": \"WHERE type<>0\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"name\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"type\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"visible\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"is_free\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"is_coming_soon\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"is_early_access\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"steam_release_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"original_release_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"original_steam_release_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"release_from_early_access_date\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_filtered_count\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_filtered_positive_percent\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_unfiltered_count\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_english_count\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"short_description\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"source_country\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"fetched_at\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"data_json\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"regional\": {\n    \"sqlite_source\": \"regional\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"country\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"success\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"visible\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"best_purchase_option_json\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"purchase_options_json\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"reviews_json\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"fetched_at\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"game_tags\": {\n    \"sqlite_source\": \"game_tags\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"tagid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"weight\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"rank\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"tag_names\": {\n    \"sqlite_source\": \"tag_names\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"tagid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"name\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"creators\": {\n    \"sqlite_source\": \"creators\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"role\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"ordinal\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 3\n      },\n      {\n        \"name\": \"name\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"clan_id\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"languages\": {\n    \"sqlite_source\": \"languages\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"language_id\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"additional_language_id\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 3\n      },\n      {\n        \"name\": \"supported\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"full_audio\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"subtitles\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"game_categories\": {\n    \"sqlite_source\": \"game_categories\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"category_group\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"categoryid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 3\n      }\n    ]\n  },\n  \"category_names\": {\n    \"sqlite_source\": \"category_names\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"categoryid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"name\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"data_json\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"game_images\": {\n    \"sqlite_source\": \"game_images\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"image_id\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"kind\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 3\n      },\n      {\n        \"name\": \"ordinal\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 4\n      }\n    ]\n  },\n  \"image_sources\": {\n    \"sqlite_source\": \"image_sources\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"image_id\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"url\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"discovery\": {\n    \"sqlite_source\": \"discovery\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"country\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"source\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 3\n      }\n    ]\n  },\n  \"pages\": {\n    \"sqlite_source\": \"pages\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"phase\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"country\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"offset\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 3\n      },\n      {\n        \"name\": \"raw_path\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"fetched_at\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"total\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"returned\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"unique_ids\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      }\n    ]\n  },\n  \"app_aliases\": {\n    \"sqlite_source\": \"app_aliases\",\n    \"filter\": \"\",\n    \"columns\": [\n      {\n        \"name\": \"requested_appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 1\n      },\n      {\n        \"name\": \"canonical_appid\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"country\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 2\n      },\n      {\n        \"name\": \"success\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"visible\",\n        \"sqlite_type\": \"INTEGER\",\n        \"primary_key_position\": 0\n      },\n      {\n        \"name\": \"fetched_at\",\n        \"sqlite_type\": \"TEXT\",\n        \"primary_key_position\": 0\n      }\n    ]\n  }\n}"}
{"chunk_id":"01903c","wall_time_seconds":0.000002197,"exit_code":0,"original_token_count":220,"output":"numpy True\npandas False\nscipy False\nsklearn False\nduckdb False\npyarrow True\nmatplotlib True\ntotal 72\ndrwxr-xr-x 1 adn adn   316 Sep  5 18:00 .\ndrwxr-xr-x 1 adn adn   198 Sep  5 16:01 ..\ndrwxr-xr-x 1 adn adn    76 Sep  5 16:28 .venv\ndrwxr-xr-x 1 adn adn  1214 Sep  5 18:00 2026-09-05\n-rw-r--r-- 1 adn adn  8105 Sep  5 18:06 README.md\ndrwxr-xr-x 1 adn adn   252 Sep  5 17:48 __pycache__\n-rw-r--r-- 1 adn adn 16575 Sep  5 17:44 collect.py\n-rw-r--r-- 1 adn adn  2626 Sep  5 17:51 export.py\n-rw-r--r-- 1 adn adn  3312 Sep  5 17:48 finish_metadata.py\n-rw-r--r-- 1 adn adn  4318 Sep  5 17:58 inventory.py\n-rw-r--r-- 1 adn adn   194 Sep  5 18:00 network_policy.json\n-rw-r--r-- 1 adn adn  6391 Sep  5 17:46 reconcile.py\n-rw-r--r-- 1 adn adn  3561 Sep  5 17:32 repair_aliases.py\n-rw-r--r-- 1 adn adn  3536 Sep  5 16:16 search_check.py\n-rw-r--r-- 1 adn adn  2623 Sep  5 17:34 validate.py\n"}

[Think]

**Building the analysis pipeline**

[Think]

**Building the analysis pipeline**

**Preparing game dataset**

[Think]

**Building the analysis pipeline**

**Preparing game dataset**

[Think]

**Building the analysis pipeline**

**Preparing game dataset**

**Auditing release dates**

[Think]

**Building the analysis pipeline**

**Preparing game dataset**

**Auditing release dates**

[Think]

**Building the analysis pipeline**

**Preparing game dataset**

**Auditing release dates**

**Parsing game metadata**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python -m pip install pandas...)

Script completed
Wall time 1.3 seconds
Output:

{"chunk_id":"0606a2","wall_time_seconds":1.001203058,"session_id":88151,"original_token_count":247,"output":"Collecting pandas\n  Downloading pandas-3.0.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.metadata (79 kB)\nCollecting scipy\n  Downloading scipy-1.18.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (62 kB)\nCollecting scikit-learn\n  Downloading scikit_learn-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.metadata (11 kB)\nCollecting duckdb\n  Downloading duckdb-1.5.5-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl.metadata (4.2 kB)\nRequirement already satisfied: numpy>=2.3.3 in /usr/lib/python3.14/site-packages (from pandas) (2.5.2)\nRequirement already satisfied: python-dateutil>=2.8.2 in /usr/lib/python3.14/site-packages (from pandas) (2.9.0)\nCollecting joblib>=1.4.0 (from scikit-learn)\n  Downloading joblib-1.6.0-py3-none-any.whl.metadata (6.5 kB)\nCollecting narwhals>=2.0.1 (from scikit-learn)\n  Downloading narwhals-2.25.0-py3-none-any.whl.metadata (15 kB)\nCollecting threadpoolctl>=3.5.0 (from scikit-learn)\n"}
{"chunk_id":"93d149","wall_time_seconds":0.000002925,"exit_code":0,"original_token_count":2415,"output":"dates (0, 1812521100, 7536)\ntag names [(7743, '1980s'), (6691, \"1990's\"), (4975, '2.5D'), (3871, '2D'), (4736, '2D Fighter'), (5379, '2D Platformer'), (776177, '360 Video'), (4191, '3D'), (6506, '3D Fighter'), (5395, '3D Platformer'), (4840, '4 Player Local'), (1670, '4X'), (4835, '6DOF'), (117648, '8-bit Music'), (129761, 'ATV'), (4400, 'Abstract'), (19, 'Action'), (4231, 'Action RPG'), (1723, 'Action RTS'), (42804, 'Action Roguelike'), (4106, 'Action-Adventure'), (4190, 'Addictive'), (21, 'Adventure'), (22602, 'Agriculture'), (1673, 'Aliens'), (4598, 'Alternate History'), (9626, 'Animals'), (872, 'Animation & Modeling'), (4085, 'Anime'), (1773, 'Arcade'), (13382, 'Archery'), (5547, 'Arena Shooter'), (7926, 'Artificial Intelligence'), (97070, 'Assassins'), (856791, 'Asymmetric VR'), (17770, 'Asynchronous Multiplayer'), (4166, 'Atmospheric'), (1027, 'Audio Production'), (1084988, 'Auto Battler'), (255534, 'Automation'), (1100687, 'Automobile Sim'), (252854, 'BMX'), (7332, 'Base Building'), (5727, 'Baseball'), (3796, 'Based On A Novel'), (1746, 'Basketball'), (176981, 'Battle Royale'), (4158, \"Beat 'em up\"), (5411, 'Beautiful'), (5407, 'Benchmark'), (123332, 'Bikes'), (4852, 'Billiards'), (6214, 'Birds'), (1770, 'Board Game'), (1023537, 'Boomer Shooter'), (11095, 'Boss Rush'), (7328, 'Bowling'), (12190, 'Boxing'), (1643, 'Building'), (723991, 'Bullet Heaven'), (4885, 'Bullet Hell'), (5796, 'Bullet Time'), (4474, 'CRPG'), (4845, 'Capitalism'), (1352486, 'Capybaras'), (791774, 'Card Battler'), (1666, 'Card Game'), (4562, 'Cartoon'), (4195, 'Cartoony'), (597, 'Casual'), (17894, 'Cats'), (3955, 'Character Action Game'), (4747, 'Character Customization'), (4184, 'Chess'), (6426, 'Choices Matter'), (4486, 'Choose Your Own Adventure'), (4145, 'Cinematic'), (4328, 'City Builder'), (4155, 'Class-Based'), (1693, 'Classic'), (23491, 'Cleaning'), (1685, 'Co-op'), (4508, 'Co-op Campaign'), (5179, 'Cold War'), (5652, 'Collectathon'), (220585, 'Colony Sim'), (4305, 'Colorful'), (3993, 'Combat'), (4102, 'Combat Racing'), (1719, 'Comedy'), (1751, 'Comic Book'), (3878, 'Competitive'), (5372, 'Conspiracy'), (7481, 'Controller'), (3920, 'Cooking'), (97376, 'Cozy'), (1702, 'Crafting'), (916648, 'Creature Collector'), (158638, 'Cricket'), (6378, 'Crime'), (52406, 'Cult'), (4726, 'Cute'), (4115, 'Cyberpunk'), (19568, 'Cycling'), (4342, 'Dark'), (19995, 'Dark Comedy'), (4604, 'Dark Fantasy'), (5923, 'Dark Humor'), (9551, 'Dating Sim'), (32322, 'Deckbuilding'), (889937, 'Decorating'), (9541, 'Demons'), (84, 'Design & Illustration'), (1320952, 'Desktop Companion'), (5363, 'Destruction'), (5613, 'Detective'), (42152, 'Dialogue Heavy'), (7556, 'Dice'), (4026, 'Difficult'), (5160, 'Dinosaurs'), (6310, 'Diplomacy'), (1637, 'Dogs'), (4046, 'Dragons'), (1644, 'Driving'), (1720, 'Dungeon Crawler'), (4535, 'Dwarves'), (9592, 'Dynamic Narration'), (5030, 'Dystopian '), (493, 'Early Access'), (4695, 'Economy'), (1036, 'Education'), (61357, 'Electronic Music'), (6054, 'Elves'), (5608, 'Emotional'), (3965, 'Epic'), (4242, 'Episodic'), (769306, 'Escape Room'), (1776, 'Espionage'), (13782, 'Experimental'), (3834, 'Exploration'), (1199779, 'Extraction Shooter'), (18594, 'FMV'), (1663, 'FPS'), (180368, 'Faith'), (37376, 'Falling Blocks'), (5350, 'Family Friendly'), (1684, 'Fantasy'), (4520, 'Farming'), (87918, 'Farming Sim'), (1734, 'Fast-Paced'), (7208, 'Female Protagonist'), (1743, 'Fighting'), (3839, 'First-Person'), (15564, 'Fishing'), (15045, 'Flight'), (1254552, 'Football (American)'), (1254546, 'Football (Soccer)'), (507423, 'Foxes'), (113, 'Free to Play'), (4136, 'Funny'), (4295, 'Futuristic'), (16250, 'Gambling'), (13906, 'Game Development'), (150626, 'Gaming'), (5300, 'God Game'), (7038, 'Golf'), (4345, 'Gore'), (3952, 'Gothic'), (4364, 'Grand Strategy'), (1756, 'Great Soundtrack'), (7569, 'Grid-Based Movement'), (5765, 'Gun Customization'), (1646, 'Hack and Slash'), (5502, 'Hacking'), (6815, 'Hand-drawn'), (603297, 'Hardware'), (1680, 'Heist'), (9130, 'Hentai'), (620519, 'Hero Shooter'), (1717, 'Hex Grid'), (1738, 'Hidden Object'), (3987, 'Historical'), (1220528, 'Hobby Sim'), (324176, 'Hockey'), (1667, 'Horror'), (6041, 'Horses'), (9564, 'Hunting'), (615955, 'Idler'), (3934, 'Immersive'), (9204, 'Immersive Sim'), (560542, 'Incremental'), (492, 'Indie'), (189941, 'Instrumental Music'), (14906, 'Intentionally Awkward Controls'), (11014, 'Interactive Fiction'), (6276, 'Inventory Management'), (8369, 'Investigation'), (5851, 'Isometric'), (4434, 'JRPG'), (35079, 'Job Simulator'), (42089, 'Jump Scare'), (44868, 'LGBTQ+'), (21635, 'Language Learning'), (17337, 'Lemmings'), (8122, 'Level Editor'), (10235, 'Life Sim'), (7250, 'Linear'), (3841, 'Local Co-Op'), (7368, 'Local Multiplayer'), (6129, 'Logic'), (4236, 'Loot'), (353880, 'Looter Shooter'), (3854, 'Lore-Rich'), (7432, 'Lovecraftian'), (1754, 'MMORPG'), (1718, 'MOBA'), (4057, 'Magic'), (33572, 'Mahjong'), (12472, 'Management'), (6702, 'Mars'), (6915, 'Martial Arts'), (128, 'Massively Multiplayer'), (1665, 'Match 3'), (4821, 'Mechs'), (1100688, 'Medical Sim'), (4172, 'Medieval'), (10397, 'Memes'), (1628, 'Metroidvania'), (4168, 'Military'), (22955, 'Mini Golf'), (8093, 'Minigames'), (4094, 'Minimalist'), (5981, 'Mining'), (5348, 'Mod'), (1669, 'Moddable'), (5673, 'Modern'), (15868, 'Motocross'), (198913, 'Motorbike'), (11123, 'Mouse Only'), (3859, 'Multiplayer'), (6971, 'Multiple Endings'), (1621, 'Music'), (8253, 'Music-Based Procedural Generation'), (323922, 'Musou'), (5716, 'Mystery'), (198631, 'Mystery Dungeon'), (16094, 'Mythology'), (7702, 'Narrative'), (30358, 'Nature'), (6910, 'Naval'), (4994, 'Naval Combat'), (1688, 'Ninja'), (6052, 'Noir'), (6869, 'Nonlinear'), (14720, 'Nostalgia'), (6650, 'Nudity'), (7622, 'Offroad'), (3916, 'Old School'), (56690, 'On-Rails Shooter'), (3843, 'Online Co-Op'), (1695, 'Open World'), (1100689, 'Open World Survival Craft'), (1239876, 'Organizing'), (31579, 'Otome'), (1100686, 'Outbreak Sim'), (4036, 'Parkour'), (4878, 'Parody '), (7108, 'Party'), (7178, 'Party Game'), (10695, 'Party-Based RPG'), (1759, 'Perma Death'), (15277, 'Philosophical'), (809, 'Photo Editing'), (3968, 'Physics'), (6621, 'Pinball'), (1681, 'Pirates'), (3964, 'Pixel Graphics'), (1625, 'Platformer'), (1698, 'Point & Click'), (6835, 'Poker'), (26921, 'Political Sim'), (3835, 'Post-apocalyptic'), (3877, 'Precision Platformer'), (5125, 'Procedural Generation'), (5432, 'Programming'), (1714, 'Psychedelic'), (5186, 'Psychological'), (1721, 'Psychological Horror'), (1664, 'Puzzle'), (5537, 'Puzzle Platformer'), (6730, 'PvE'), (1775, 'PvP'), (4559, 'Quick-Time Events'), (122, 'RPG'), (1676, 'RTS'), (699, 'Racing'), (3813, 'Real Time Tactics'), (4161, 'Real-Time'), (7107, 'Real-Time with Pause'), (4175, 'Realistic'), (5941, 'Reboot'), (1654, 'Relaxing'), (5708, 'Remake'), (4711, 'Replay Value'), (8945, 'Resource Management'), (4004, 'Retro'), (1752, 'Rhythm'), (5752, 'Robots'), (337964, 'Rock Music'), (1716, 'Roguelike'), (1091588, 'Roguelike Deckbuilder'), (3959, 'Roguelite'), (4947, 'Romance'), (6948, 'Rome'), (49213, 'Rugby'), (8666, 'Runner'), (13577, 'Sailing'), (10617, 'Samurai'), (3810, 'Sandbox'), (1651, 'Satire'), (3942, 'Sci-fi'), (5794, 'Science'), (5154, 'Score Attack'), (5230, 'Sequel'), (12095, 'Sexual Content'), (4255, \"Shoot 'Em Up\"), (1774, 'Shooter'), (91114, 'Shop Keeper'), (4234, 'Short'), (3798, 'Side Scroller'), (15954, 'Silent Protagonist'), (599, 'Simulation'), (4182, 'Singleplayer'), (1753, 'Skateboarding'), (96359, 'Skating'), (7309, 'Skiing'), (7423, 'Sniper'), (363767, 'Snooker'), (9803, 'Snow'), (28444, 'Snowboarding'), (745697, 'Social Deduction'), (8013, 'Software'), (1445, 'Software Training'), (1730, 'Sokoban'), (13070, 'Solitaire'), (29482, 'Souls-like'), (7948, 'Soundtrack'), (1755, 'Space'), (16598, 'Space Sim'), (4291, 'Spaceships'), (4777, 'Spectacle fighter'), (71389, 'Spelling'), (10816, 'Split Screen'), (701, 'Sports'), (1687, 'Stealth'), (1777, 'Steampunk'), (1742, 'Story Rich'), (9, 'Strategy'), (17305, 'Strategy RPG'), (4252, 'Stylized'), (19780, 'Submarine'), (1671, 'Superhero'), (10808, 'Supernatural'), (1710, 'Surreal'), (1662, 'Survival'), (3978, 'Survival Horror'), (4608, 'Swordplay'), (17389, 'Tabletop'), (1708, 'Tactical'), (21725, 'Tactical RPG'), (13276, 'Tanks'), (5711, 'Team-Based'), (5914, 'Tennis'), (31275, 'Text-Based'), (1697, 'Third Person'), (3814, 'Third-Person Shooter'), (4064, 'Thriller'), (5390, 'Time Attack'), (16689, 'Time Management'), (6625, 'Time Manipulation'), (10679, 'Time Travel'), (4791, 'Top-Down'), (4637, 'Top-Down Shooter'), (25085, 'Touch-Friendly'), (1645, 'Tower Defense'), (8075, 'TrackIR'), (4202, 'Trading'), (9271, 'Trading Card Game'), (454187, 'Traditional Roguelike'), (1616, 'Trains'), (4137, 'Transhumanism'), (10383, 'Transportation'), (10437, 'Trivia'), (1677, 'Turn-Based'), (4325, 'Turn-Based Combat'), (1741, 'Turn-Based Strategy'), (14139, 'Turn-Based Tactics'), (12057, 'Tutorial'), (4758, 'Twin Stick Shooter'), (1674, 'Typing'), (21006, 'Underground'), (9157, 'Underwater'), (87, 'Utilities'), (21978, 'VR'), (12686, 'Vampires'), (11104, 'Vehicular Combat'), (784, 'Video Production'), (11634, 'Vikings'), (11333, 'Villain Protagonist'), (4667, 'Violent'), (3799, 'Visual Novel'), (27758, 'Voice Control'), (847164, 'Volleyball'), (1732, 'Voxel'), (5900, 'Walking Simulator'), (1678, 'War'), (4684, 'Wargame'), (17015, 'Werewolves'), (1647, 'Western'), (552282, 'Wholesome'), (20486, 'Wolves'), (24003, 'Word Game'), (5382, 'World War I'), (4150, 'World War II'), (47827, 'Wrestling'), (25959, 'Wuxia'), (760247, 'Xianxia'), (1659, 'Zombies'), (46348, 'Zoo'), (5055, 'eSports')]\n"}

[Think]

**Preparing release-date audit**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport sqlite3,datetime\np='/home/adn/a327ex/steam-...)

Script completed
Wall time 0.3 seconds
Output:

{"chunk_id":"9242b9","wall_time_seconds":0.125467404,"exit_code":0,"original_token_count":45,"output":"(7533, 0, 2)\n(680420, 'OUTRIDERS') ['2021-04-01T16:00:00+00:00', '2021-04-01T17:00:00+00:00']\n(937870, 'Mist Hunter') ['2020-02-14T14:04:24+00:00', '2020-02-14T21:00:00+00:00']\n"}
{"chunk_id":"5b527e","wall_time_seconds":0.000001604,"exit_code":0,"original_token_count":453,"output":"  Downloading threadpoolctl-3.6.0-py3-none-any.whl.metadata (13 kB)\nCollecting cloudpickle>=3.0 (from joblib>=1.4.0->scikit-learn)\n  Downloading cloudpickle-3.1.2-py3-none-any.whl.metadata (7.1 kB)\nRequirement already satisfied: six>=1.5 in /usr/lib/python3.14/site-packages (from python-dateutil>=2.8.2->pandas) (1.17.0)\nDownloading pandas-3.0.5-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (11.0 MB)\n   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 11.0/11.0 MB 87.1 MB/s  0:00:00\nDownloading scipy-1.18.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (35.3 MB)\n   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 35.3/35.3 MB 100.6 MB/s  0:00:00\nDownloading scikit_learn-1.9.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl (9.1 MB)\n   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 9.1/9.1 MB 104.0 MB/s  0:00:00\nDownloading duckdb-1.5.5-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl (21.5 MB)\n   ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 21.5/21.5 MB 67.7 MB/s  0:00:00\nDownloading joblib-1.6.0-py3-none-any.whl (306 kB)\nDownloading cloudpickle-3.1.2-py3-none-any.whl (22 kB)\nDownloading narwhals-2.25.0-py3-none-any.whl (467 kB)\nDownloading threadpoolctl-3.6.0-py3-none-any.whl (18 kB)\nInstalling collected packages: threadpoolctl, scipy, narwhals, duckdb, cloudpickle, pandas, joblib, scikit-learn\n\nSuccessfully installed cloudpickle-3.1.2 duckdb-1.5.5 joblib-1.6.0 narwhals-2.25.0 pandas-3.0.5 scikit-learn-1.9.0 scipy-1.18.1 threadpoolctl-3.6.0\n"}

[Think]

**Developing dataset prep script**

[Think]

**Developing dataset prep script**

**Preparing normalized creator fields**

[Think]

**Developing dataset prep script**

**Preparing normalized creator fields**

exec ({"code": "text(await tools.exec_command({cmd:\"mkdir -p /home/adn/a327ex/steam-research/analysis-2026-09-05; cat > /h...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"ab12d8","wall_time_seconds":1.000657025,"session_id":20743,"original_token_count":0,"output":""}

[Think]

**Defining the statistical plan**

[Think]

**Defining the statistical plan**

**Preparing pair-search rules**

[Think]

**Defining the statistical plan**

**Preparing pair-search rules**

[Think]

**Defining the statistical plan**

**Preparing pair-search rules**

**Computing validation ratios**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -6 /home/adn/a327ex/steam-research/analysis-2026-09-05/prepare.lo...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"6555c2","wall_time_seconds":0.000002965,"exit_code":0,"original_token_count":136,"output":"  \"valid_dated_released\": 128878,\n  \"released_no_date\": 93,\n  \"released_future_date\": 1,\n  \"main_paid_nonexplicit_valid\": 102394,\n  \"original_steam_dates_used\": 7536\n}\ntotal 211M\n-rw-r--r-- 1 adn adn 198M Sep  5 18:18 games.parquet\n-rw-r--r-- 1 adn adn  219 Sep  5 18:18 preparation_audit.json\n-rw-r--r-- 1 adn adn  930 Sep  5 18:18 prepare.log\n-rw-r--r-- 1 adn adn 5.2K Sep  5 18:17 prepare.py\n-rw-r--r-- 1 adn adn 3.2K Sep  5 18:18 release_date_exceptions.csv\n-rw-r--r-- 1 adn adn  13M Sep  5 18:18 tags.parquet\nSat Sep  5 21:19:54 UTC 2026\n"}

[Think]

**Preparing baseline code**

[Think]

**Preparing baseline code**

**Validating chart inputs**

[Think]

**Preparing baseline code**

**Validating chart inputs**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/analysis-2026-09-05/analyze.py <...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"7608d0","wall_time_seconds":1.001421261,"session_id":85918,"original_token_count":0,"output":""}

[Think]

**Checking sparse matrix setup**

[Think]

**Checking sparse matrix setup**

**Checking zero-denominator ratios**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -35 /home/adn/a327ex/steam-research/analysis-2026-09-05/analysis....)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"89d5f0","wall_time_seconds":0.000003127,"exit_code":0,"original_token_count":2174,"output":"                   Trains  163    37.0 0.312883 1.967427     1.046005                    0.104625\n                  Fishing  333    20.0 0.306306 1.957779     1.642271                    0.210787\n                  Sandbox 2431    19.0 0.310160 1.956480     1.156089                    0.109736\n                    Mechs  306    20.5 0.307190 1.941106     1.031546                    0.270415\n               tag_a               tag_b  discovery_n  discovery_stronger_only_ratio  holdout_n  holdout_stronger_only_ratio\n                 FPS      Boomer Shooter          102                       2.422913         92                     1.238598\n Interactive Fiction                 FMV           40                       2.606421         59                     1.250841\n       Hidden Object                Cats          113                       2.100590        114                     1.062188\n        Visual Novel                 FMV           42                       2.451324         44                     1.453428\n  Twin Stick Shooter         Bullet Hell          143                       1.895746         57                     1.255297\n          Dating Sim                 FMV           46                       2.194214         47                     1.475869\n          Hand-drawn                Cats           92                       1.890312         62                     0.347283\n Resource Management          Automation           56                       2.015645         42                     1.188819\n   Real Time Tactics             Wargame           75                       1.873600         47                     0.896651\n       Immersive Sim                 FMV           36                       2.049561         35                     1.420597\n        Dark Fantasy          Souls-like           63                       1.852963         35                     1.577151\n        First-Person      Automobile Sim           58                       1.865486         36                     1.389999\n             Fantasy                2.5D           36                       2.019222         32                     0.974352\n        Metroidvania          Souls-like           50                       1.904606         34                     1.488564\n            Thriller   Walking Simulator           80                       1.778910         66                     1.784778\n             Driving       Immersive Sim           63                       1.833731         40                     0.863433\n             Physics              Combat           36                       2.007105         26                     1.008968\n  Twin Stick Shooter    Action Roguelike          132                       1.663393         53                     1.046610\n    Action-Adventure     Family Friendly           65                       1.802796         38                     0.823508\n        First-Person      Boomer Shooter           71                       1.778762         66                     1.059612\n             Fantasy           Difficult           36                       1.963831         27                     0.594673\n            Crafting            Life Sim           40                       1.922980         41                     1.040803\nThird-Person Shooter              Sci-fi           51                       1.840080         25                     0.978444\n  Turn-Based Tactics        Strategy RPG          142                       1.617378         86                     1.143368\n              Horror          Dark Humor           51                       1.820992         47                     0.702249\n              Comedy        First-Person           71                       1.739993         47                     1.879818\n        City Builder Resource Management           83                       1.705664         51                     1.372821\n             Zombies          Action RPG           32                       1.962202          8                     1.064216\n        Metroidvania  Female Protagonist           37                       1.908223         28                     1.324079\n  Turn-Based Tactics        Tactical RPG          147                       1.603488        106                     1.781695\n-rw-r--r-- 1 adn adn 8.9K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/january_august.csv\n-rw-r--r-- 1 adn adn  39K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_11014_18594_games.csv\n-rw-r--r-- 1 adn adn  81K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_14139_17305_games.csv\n-rw-r--r-- 1 adn adn  89K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_14139_21725_games.csv\n-rw-r--r-- 1 adn adn  29K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1628_29482_games.csv\n-rw-r--r-- 1 adn adn  23K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1628_7208_games.csv\n-rw-r--r-- 1 adn adn  37K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1644_9204_games.csv\n-rw-r--r-- 1 adn adn  14K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1659_4231_games.csv\n-rw-r--r-- 1 adn adn  64K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1663_1023537_games.csv\n-rw-r--r-- 1 adn adn  32K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1667_5923_games.csv\n-rw-r--r-- 1 adn adn  22K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1684_4026_games.csv\n-rw-r--r-- 1 adn adn  23K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1684_4975_games.csv\n-rw-r--r-- 1 adn adn  29K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1702_10235_games.csv\n-rw-r--r-- 1 adn adn  40K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1719_3839_games.csv\n-rw-r--r-- 1 adn adn  70K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_1738_17894_games.csv\n-rw-r--r-- 1 adn adn  34K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_3799_18594_games.csv\n-rw-r--r-- 1 adn adn  43K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_3813_4684_games.csv\n-rw-r--r-- 1 adn adn  25K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_3814_3942_games.csv\n-rw-r--r-- 1 adn adn  46K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_3839_1023537_games.csv\n-rw-r--r-- 1 adn adn  32K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_3839_1100687_games.csv\n-rw-r--r-- 1 adn adn  21K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_3968_3993_games.csv\n-rw-r--r-- 1 adn adn  47K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_4064_5900_games.csv\n-rw-r--r-- 1 adn adn  35K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_4106_5350_games.csv\n-rw-r--r-- 1 adn adn  48K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_4328_8945_games.csv\n-rw-r--r-- 1 adn adn  34K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_4604_29482_games.csv\n-rw-r--r-- 1 adn adn  66K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_4758_42804_games.csv\n-rw-r--r-- 1 adn adn  69K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_4758_4885_games.csv\n-rw-r--r-- 1 adn adn  48K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_6815_17894_games.csv\n-rw-r--r-- 1 adn adn  33K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_8945_255534_games.csv\n-rw-r--r-- 1 adn adn  30K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_9204_18594_games.csv\n-rw-r--r-- 1 adn adn  38K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_9551_18594_games.csv\n-rw-r--r-- 1 adn adn 299K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_discovery_all.csv\n-rw-r--r-- 1 adn adn 5.2K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_discovery_selected_before_holdout.csv\n-rw-r--r-- 1 adn adn  15K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/pair_holdout_results.csv\n-rw-r--r-- 1 adn adn  60K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/rare_pairs_exploratory.csv\n-rw-r--r-- 1 adn adn 3.2K Sep  5 18:18 /home/adn/a327ex/steam-research/analysis-2026-09-05/release_date_exceptions.csv\n-rw-r--r-- 1 adn adn 187K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/tag_landscape.csv\n-rw-r--r-- 1 adn adn 9.0K Sep  5 18:23 /home/adn/a327ex/steam-research/analysis-2026-09-05/yearly.csv\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"069d90","wall_time_seconds":0.220094826,"exit_code":0,"original_token_count":5076,"output":"{\n  \"main_recent_n\": 38494,\n  \"main_reference_n\": 20503,\n  \"recent_base_rate100\": 0.1578168026185899,\n  \"recent_base_rate1000\": 0.04434457318023588,\n  \"discovery_n\": 22820,\n  \"holdout_n\": 15674,\n  \"discovery_pair_candidates\": 1765,\n  \"rare_pairs\": 422\n}\nYEARLY\n segment  year     n  median  under10  ge100  ge1000  top1_share  top5_share\n    all  2015  2431   102.0      226   1231     407    0.178770    0.396413\n    all  2016  4081    64.0      621   1711     488    0.092407    0.263353\n    all  2017  5913    33.0     1604   1784     534    0.213262    0.373287\n    all  2018  7222    21.0     2473   1715     518    0.118320    0.290159\n    all  2019  7028    18.0     2624   1725     564    0.094729    0.264150\n    all  2020  8708    19.0     3151   2107     675    0.090375    0.271522\n    all  2021 10181    16.0     3898   2175     682    0.046946    0.158200\n    all  2022 11229    16.0     4277   2341     669    0.097125    0.215269\n    all  2023 12910    13.0     5493   2427     690    0.083330    0.237181\n    all  2024 17371    12.0     7873   3133     766    0.082178    0.259119\n    all  2025 20253     9.0    10244   3102     756    0.042910    0.179674\n    all  2026 18280     4.0    11207   2037     420    0.054565    0.180795\n   main  2015  2231    90.0      226   1073     334    0.134295    0.355694\n   main  2016  3627    54.0      618   1431     397    0.099450    0.283425\n   main  2017  5217    26.0     1599   1462     446    0.080239    0.226928\n   main  2018  6139    16.0     2430   1315     418    0.138305    0.336475\n   main  2019  5643    13.0     2516   1243     426    0.119134    0.272389\n   main  2020  6901    13.0     3017   1499     520    0.096313    0.259911\n   main  2021  7959    12.0     3613   1530     517    0.065360    0.213370\n   main  2022  8497    11.0     3927   1642     509    0.119525    0.258263\n   main  2023  9771     9.0     4921   1672     530    0.111914    0.283247\n   main  2024 13049     8.0     6967   2126     571    0.107401    0.308532\n   main  2025 15674     6.0     8811   2277     606    0.051539    0.215808\n   main  2026 14581     3.0     9375   1569     358    0.062098    0.205755\nHIGHEST RESPONSE\n                       tag    n  reference_n  share_ratio  median  rate100  rate1000  lift100  price_adjusted_lift100  focus_n  focus_lift100  developer_top_review_share  publisher_top_review_share\n         Great Soundtrack  206         1092        0.100  1180.0    0.752     0.519    4.681                   2.335        8          5.332                       0.255                       0.271\n                  Classic  101          261        0.206    82.0    0.485     0.297    3.064                   2.696        1          6.156                       0.240                       0.265\nOpen World Survival Craft  202          189        0.569    88.5    0.480     0.228    3.010                   1.599      127          3.016                       0.390                       0.390\n                   Remake  100          131        0.407    75.0    0.480     0.260    2.958                   1.733        6          2.075                       0.401                       0.401\n                      FMV  316          141        1.194    70.5    0.462     0.114    2.924                   2.404      128          4.156                       0.193                       0.193\n           Sexual Content  946          933        0.540    84.5    0.469     0.136    2.923                   1.899      393          3.042                       0.270                       0.270\n            Job Simulator  222           12        9.854    62.5    0.441     0.135    2.865                   2.185       65          2.998                       0.294                       0.294\n            Bullet Heaven  200            4       26.631    75.0    0.445     0.170    2.849                   3.228      140          2.711                       0.291                       0.291\n                   Hentai  535          310        0.919    72.0    0.432     0.086    2.696                   1.868      160          3.155                       0.251                       0.251\n              Shop Keeper  174            8       11.585    55.5    0.397     0.109    2.657                   1.903       76          3.241                       0.419                       0.419\n                 Moddable  343          223        0.819    41.0    0.420     0.137    2.655                   1.611       31          2.393                       0.247                       0.247\n                Diplomacy  138           78        0.942    29.5    0.413     0.174    2.576                   1.537       20          2.904                       0.307                       0.388\n                   Nudity  619          809        0.408    65.0    0.402     0.086    2.487                   1.719      229          2.245                       0.480                       0.480\n               Turn-Based  432          555        0.415    58.0    0.389     0.141    2.450                   1.421      122          2.365                       0.295                       0.295\n    Roguelike Deckbuilder  412           79        2.778    40.5    0.369     0.090    2.357                   1.722      280          2.465                       0.447                       0.447\n               Dating Sim 1004          493        1.085    38.0    0.368     0.099    2.321                   1.598      584          2.176                       0.182                       0.182\n             Online Co-Op 1856          642        1.540    27.0    0.350     0.159    2.229                   1.736      613          2.689                       0.115                       0.124\n                  Animals  120           32        1.997    36.0    0.342     0.075    2.207                   2.303       36          1.449                       0.275                       0.275\n                  Economy 1288          466        1.472    28.0    0.338     0.099    2.168                   1.617      307          1.993                       0.089                       0.090\n               Colony Sim  457          208        1.170    26.0    0.344     0.118    2.158                   1.378      225          2.293                       0.225                       0.284\n                   LGBTQ+  806          424        1.012    34.0    0.333     0.109    2.099                   1.488      251          2.001                       0.381                       0.381\n                Narrative  350          109        1.710    37.5    0.326     0.109    2.091                   1.427       77          1.583                       0.126                       0.224\n                  Trading  381          122        1.663    23.0    0.325     0.100    2.081                   1.498       67          1.907                       0.213                       0.213\n                     Cozy 1041           83        6.680    38.0    0.320     0.098    2.079                   1.977      398          1.994                       0.115                       0.115\n                  Farming  134           37        1.929    29.5    0.321     0.112    2.063                   1.523       33          1.158                       0.255                       0.255\n            Base Building 1568          598        1.397    20.0    0.324     0.121    2.048                   1.449      391          2.430                       0.147                       0.147\n             Martial Arts  367          173        1.130    15.0    0.322     0.128    2.032                   1.562      104          2.527                       0.097                       0.097\n                    Heist  119           74        0.857    18.0    0.319     0.101    2.019                   1.529       24          2.665                       0.333                       0.333\n                Wholesome  597           85        3.741    39.0    0.312     0.070    1.997                   2.039      214          1.925                       0.086                       0.086\n                    Co-op 2387         1195        1.064    22.0    0.315     0.145    1.996                   1.560      487          2.673                       0.109                       0.111\n                 Life Sim 1675          427        2.089    27.0    0.311     0.091    1.981                   1.659      701          1.773                       0.113                       0.114\n                   Trains  163           83        1.046    37.0    0.313     0.141    1.967                   1.286       70          2.520                       0.105                       0.105\n                  Fishing  333          108        1.642    20.0    0.306     0.087    1.958                   1.707      108          1.922                       0.211                       0.211\n                  Sandbox 2431         1120        1.156    19.0    0.310     0.118    1.956                   1.442     1071          1.530                       0.110                       0.110\n                    Mechs  306          158        1.032    20.5    0.307     0.098    1.941                   1.420       76          2.869                       0.270                       0.270\n               Management 2648         1018        1.385    21.0    0.303     0.092    1.937                   1.502      670          2.290                       0.161                       0.161\n             City Builder  930          396        1.251    19.0    0.302     0.106    1.906                   1.371      542          1.793                       0.110                       0.139\n               Capitalism  709          186        2.030    21.0    0.295     0.080    1.891                   1.658      128          1.740                       0.688                       0.688\n           Co-op Campaign  266          162        0.875    18.5    0.293     0.094    1.859                   1.241       48          1.744                       0.725                       0.725\n                 Fighting  233          409        0.303    15.0    0.292     0.159    1.843                   1.344       77          2.035                       0.140                       0.204\nGROWING SHARE\n                   tag    n  reference_n  share_ratio  median  rate100  rate1000  lift100  price_adjusted_lift100  focus_n  focus_lift100  developer_top_review_share  publisher_top_review_share\n                 Cozy 1041           83        6.680    38.0    0.320     0.098    2.079                   1.977      398          1.994                       0.115                       0.115\n       Boomer Shooter  384           47        4.352    13.0    0.242     0.078    1.570                   1.404      225          1.680                       0.195                       0.195\n            Wholesome  597           85        3.741    39.0    0.312     0.070    1.997                   2.039      214          1.925                       0.086                       0.086\n         Auto Battler  657          100        3.499    14.0    0.224     0.053    1.425                   1.533      391          1.343                       0.110                       0.110\n   Creature Collector 1005          163        3.284    17.0    0.197     0.050    1.261                   1.491      417          1.326                       0.590                       0.590\n              Cooking  588          102        3.070    15.0    0.259     0.090    1.663                   1.353      209          1.693                       0.150                       0.150\n         Deckbuilding 1195          212        3.002    17.0    0.249     0.070    1.600                   1.371      493          1.502                       0.281                       0.281\n            Utilities  183           34        2.867     7.0    0.148     0.060    0.959                   1.284      103          0.944                       0.227                       0.227\n           Action RTS  405           77        2.801     6.0    0.170     0.054    1.073                   0.904      149          0.846                       0.171                       0.171\nRoguelike Deckbuilder  412           79        2.778    40.5    0.369     0.090    2.357                   1.722      280          2.465                       0.447                       0.447\n                Idler 1455          282        2.748    12.0    0.190     0.046    1.224                   2.085      917          1.317                       0.065                       0.065\n     Action Roguelike 2966          595        2.655     9.0    0.171     0.047    1.081                   1.204     2087          1.065                       0.179                       0.179\n        Immersive Sim 2752          612        2.395    18.0    0.264     0.079    1.682                   1.448      926          1.431                       0.138                       0.138\n           Automation  768          177        2.311    16.5    0.275     0.072    1.758                   1.657      218          2.456                       0.344                       0.344\n         Card Battler  917          213        2.293    12.0    0.205     0.049    1.317                   1.112      470          1.110                       0.409                       0.409\n             Thriller 1710          405        2.249    15.0    0.198     0.042    1.267                   1.495      278          1.285                       0.201                       0.201\n            Lore-Rich 1245          295        2.248    17.0    0.274     0.092    1.739                   1.345      119          1.610                       0.140                       0.141\n            Roguelike 3855          932        2.203    12.0    0.201     0.056    1.279                   1.317     1717          1.076                       0.085                       0.086\n         Supernatural 1399          344        2.166    13.0    0.197     0.043    1.265                   1.396      182          1.374                       0.140                       0.149\n                  PvE 4219         1068        2.104     5.0    0.142     0.045    0.899                   0.941      821          0.681                       0.201                       0.201\n          Farming Sim  671          170        2.102    16.0    0.268     0.082    1.704                   1.370      371          1.691                       0.123                       0.123\n             Life Sim 1675          427        2.089    27.0    0.311     0.091    1.981                   1.659      701          1.773                       0.113                       0.114\n         Collectathon 1509          391        2.056    12.0    0.160     0.033    1.021                   1.173      545          0.994                       0.162                       0.162\n Inventory Management 1042          271        2.048    13.0    0.233     0.061    1.490                   1.319       86          1.563                       0.287                       0.287\n            Roguelite 3570          929        2.047    14.0    0.217     0.061    1.383                   1.385     1784          1.304                       0.083                       0.085\n           Capitalism  709          186        2.030    21.0    0.295     0.080    1.891                   1.658      128          1.740                       0.688                       0.688\n           Controller 5403         1429        2.014     8.0    0.147     0.038    0.931                   0.934      203          0.807                       0.095                       0.114\n          Escape Room  287           76        2.011    12.0    0.167     0.038    1.070                   1.128      148          0.900                       0.256                       0.256\n              Animals  120           32        1.997    36.0    0.342     0.075    2.207                   2.303       36          1.449                       0.275                       0.275\n               Combat 5932         1597        1.978     5.0    0.148     0.048    0.937                   0.922      307          1.088                       0.170                       0.170\nTraditional Roguelike  174           47        1.972     7.0    0.132     0.029    0.861                   0.879       66          0.678                       0.302                       0.302\n        Psychological 1566          425        1.963    16.0    0.179     0.041    1.155                   1.424      210          0.824                       0.154                       0.240\n             Software  197           54        1.943     3.0    0.071     0.010    0.449                   0.532       90          0.139                       0.690                       0.690\n Psychological Horror 4159         1147        1.931    18.0    0.216     0.061    1.384                   1.693     1829          1.377                       0.218                       0.220\n              Farming  134           37        1.929    29.5    0.321     0.112    2.063                   1.523       33          1.158                       0.255                       0.255\nRARE\n             tag_a                     tag_b  n  ge1000  median  developers\n   Grand Strategy             Base Building  5       5  2917.0           5\n        Realistic   Character Customization  3       3  4097.0           3\nGun Customization        Extraction Shooter  3       3  9402.0           3\n   Hack and Slash                     Mechs  4       3  1466.5           4\n              FPS                     Mechs  4       3  1868.0           4\n            Co-op                    Sci-fi  4       3  6039.5           4\n           MMORPG                   Sandbox  4       3  5224.0           4\n     Dark Fantasy                    1990's  4       3  1606.0           4\n              PvP        Extraction Shooter 10       7  2869.0          10\n          Driving                   Trading  3       2  1138.0           3\n         Relaxing Open World Survival Craft  3       2  3307.0           3\n          Zombies              City Builder  3       2  1452.0           3\n          Zombies                 Isometric  3       2  1045.0           3\n           Puzzle                Conspiracy  3       2  3770.0           3\n           Horror                    Typing  3       2  1080.0           3\n           Horror        Extraction Shooter  3       2  1470.0           3\n        Superhero                Open World  3       2  8621.0           3\n       Open World                Historical  3       2  1692.0           3\n       Open World                     Naval  3       2  2884.0           3\n       Open World              Martial Arts  3       2  7080.0           3\n       Open World                 Assassins  3       2 11557.0           3\n         Crafting          Vehicular Combat  3       2  2060.0           3\n        Roguelike            Boomer Shooter  3       2  1071.0           3\n           Comedy                  Gambling  3       2  8080.0           3\n           MMORPG                      Loot  3       2  4740.0           3\n          Sandbox                 Diplomacy  3       2  2502.0           3\n     First-Person          Social Deduction  3       2  1800.0           3\n     Online Co-Op                 Cyberpunk  3       2  1494.0           3\n     Online Co-Op                Capitalism  3       2  3837.0           3\n Action-Adventure                 Assassins  3       2 11557.0           3\n         Cartoony                 Detective  3       2  5092.0           3\n          Trading            Automobile Sim  3       2  1138.0           3\n             Gore              Martial Arts  3       2  1974.0           3\n          Wargame                 Diplomacy  3       2  2502.0           3\n           1990's            Automobile Sim  3       2  3520.0           3\n         Life Sim                Decorating  3       2  1716.0           3\n Action Roguelike                     Musou  3       2  2003.0           3\n          Pirates                Open World  8       5  1086.5           7\n              FPS        Extraction Shooter 10       6  3118.0          10\n   Hack and Slash                      Gore  5       3  1974.0           5\n"}

[Think]

**Comparing market-growth evidence**

[Think]

**Comparing market-growth evidence**

[Think]

**Comparing market-growth evidence**

**Checking strategy signals**

[Think]

**Comparing market-growth evidence**

**Checking strategy signals**

[Think]

**Comparing market-growth evidence**

**Checking strategy signals**

**Computing niche tables**

[Think]

**Comparing market-growth evidence**

**Checking strategy signals**

**Computing niche tables**

The first pass is showing a useful distinction: fast-growing categories don’t necessarily have unusually strong results per game. Action roguelikes, for example, expanded sharply in their share of releases, but their review response is much closer to the cohort average than several narrower categories.

I’ve also frozen a list of tag-pair candidates using only 2023–2024 releases and tested it against 2025. Some attractive patterns weakened or disappeared there, which helps separate repeatable signals from a few memorable successes.

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 2.1 seconds
Output:

{"chunk_id":"267674","wall_time_seconds":1.909318223,"exit_code":0,"original_token_count":5086,"output":"SELECT TAGS\n                   tag    n  median  rate100  rate1000  share_ratio  lift100  price_adjusted_lift100    developer_top_name  developer_top_n  developer_removed_rate100      publisher_top_name  publisher_top_n  publisher_removed_rate100\n        Tower Defense 1225     5.0    0.136     0.037        1.619    0.856                   0.961          GrizzlyGames                1                      0.135              Mythwright                1                      0.135\n               Puzzle 8627     7.0    0.120     0.027        1.047    0.758                   0.871    Avalanche Software                2                      0.120      Warner Bros. Games                2                      0.120\n               Typing  315     5.0    0.121     0.038        1.629    0.778                   0.974              八名木Games                1                      0.118          Gamirror Games                1                      0.118\n        Hidden Object 2900     8.0    0.095     0.013        1.573    0.604                   0.764               AIHASTO                1                      0.095                IndieArk                1                      0.095\n              Physics 3580     5.0    0.133     0.039        1.209    0.844                   0.958              semiwork                1                      0.133                semiwork                1                      0.133\n           Minimalist 3290     5.0    0.096     0.022        0.976    0.607                   0.989    Another Axiom Inc.                1                      0.096      Another Axiom Inc.                1                      0.096\n                Chess  104     5.0    0.087     0.010        0.719    0.552                   0.663        Finn Schuuring                1                      0.078          Finn Schuuring                1                      0.078\n                Short  645    10.0    0.164     0.034        0.593    1.056                   1.855              Barribob                1                      0.163                Barribob                1                      0.163\n  Resource Management 2239    16.0    0.279     0.079        1.557    1.783                   1.502  Coffee Stain Studios                1                      0.278 Coffee Stain Publishing                1                      0.278\n           Management 2648    21.0    0.303     0.092        1.385    1.937                   1.502                  TVGS                1                      0.303                    TVGS                1                      0.303\n              Fishing  333    20.0    0.306     0.087        1.642    1.958                   1.707         lamedeveloper                1                      0.304           lamedeveloper                1                      0.304\n                 Cats 1051    17.0    0.179     0.039        1.917    1.145                   1.492        RedCandleGames                1                      0.178          RedCandleGames                1                      0.178\n                  FMV  316    70.5    0.462     0.114        1.194    2.924                   2.404                 前方工作室                1                      0.460                   前方工作室                1                      0.460\n        Job Simulator  222    62.5    0.441     0.135        9.854    2.865                   2.185          OPNeon Games                1                      0.439            OPNeon Games                1                      0.439\n     Action Roguelike 2966     9.0    0.171     0.047        2.655    1.081                   1.204              semiwork                1                      0.170                semiwork                1                      0.170\n          Shop Keeper  174    55.5    0.397     0.109       11.585    2.657                   1.903          OPNeon Games                1                      0.393            OPNeon Games                1                      0.393\n           Automation  768    16.5    0.275     0.072        2.311    1.758                   1.657            Pocketpair                1                      0.274              Pocketpair                1                      0.274\n          Incremental 1865     7.0    0.142     0.034        1.896    0.908                   1.548               Gagonfe                1                      0.141                 Gagonfe                1                      0.141\n                Idler 1455    12.0    0.190     0.046        2.748    1.224                   2.085 Kenny Sun and Friends                1                      0.189        Devolver Digital                1                      0.189\n         Auto Battler  657    14.0    0.224     0.053        3.499    1.425                   1.533          GrizzlyGames                1                      0.223              Mythwright                1                      0.223\nRoguelike Deckbuilder  412    40.5    0.369     0.090        2.778    2.357                   1.722            LocalThunk                1                      0.367               Playstack                1                      0.367\nPAIR DETAILS\n                tag_a               tag_b  discovery_n  discovery_rate100  holdout_n  holdout_rate100  holdout_lift100  holdout_stronger_only_ratio  all_median  all_developers  all_price_adjusted_lift100         publisher_top_name  publisher_top_n  publisher_removed_rate100\n                 FPS      Boomer Shooter          102              0.412         92            0.185            1.290                        1.239        22.5             183                       1.676        Focus Entertainment                1                      0.301\n Interactive Fiction                 FMV           40              0.825         59            0.712            4.787                        1.251       341.0              83                       3.569                      前方工作室                1                      0.755\n       Hidden Object                Cats          113              0.336        114            0.123            0.845                        1.062        40.0              76                       3.343             Travellin Cats                9                      0.197\n        Visual Novel                 FMV           42              0.786         44            0.818            5.543                        1.453       360.0              69                       3.724                     intiny                3                      0.795\n  Twin Stick Shooter         Bullet Hell          143              0.252         57            0.140            0.978                        1.255        16.0             199                       1.618            SoulGame Studio                1                      0.216\n          Dating Sim                 FMV           46              0.848         47            0.809            5.482                        1.476       378.0              80                       3.758                      前方工作室                1                      0.826\n          Hand-drawn                Cats           92              0.348         62            0.032            0.224                        0.347        41.5              71                       2.859             Travellin Cats                4                      0.200\n Resource Management          Automation           56              0.625         42            0.333            2.301                        1.189       104.0              94                       1.930    Coffee Stain Publishing                1                      0.495\n   Real Time Tactics             Wargame           75              0.280         47            0.149            1.023                        0.897        10.0             113                       1.194            Slitherine Ltd.                2                      0.217\n       Immersive Sim                 FMV           36              0.778         35            0.857            5.854                        1.421       429.0              60                       3.845             New One Studio                1                      0.814\n        Dark Fantasy          Souls-like           63              0.413         35            0.343            2.423                        1.577        32.0              97                       1.476               Game Science                1                      0.381\n        First-Person      Automobile Sim           58              0.379         36            0.278            1.918                        1.390        25.0              86                       1.366             Rockstar Games                1                      0.333\n             Fantasy                2.5D           36              0.306         32            0.125            0.867                        0.974         5.0              65                       1.190             Aether Studios                1                      0.209\n        Metroidvania          Souls-like           50              0.460         34            0.353            2.442                        1.489        54.5              83                       1.580                Team Cherry                1                      0.410\n            Thriller   Walking Simulator           80              0.312         66            0.273            1.903                        1.785        40.0             132                       2.882              Rayll Studios                1                      0.290\n             Driving       Immersive Sim           63              0.460         40            0.200            1.374                        0.863        23.0              95                       1.537              Red Axe Games                1                      0.353\n             Physics              Combat           36              0.306         26            0.154            1.036                        1.009        10.5              61                       1.477                  505 Pulse                1                      0.230\n  Twin Stick Shooter    Action Roguelike          132              0.288         53            0.151            1.060                        1.047        19.0             184                       1.782               Mad Mushroom                1                      0.245\n    Action-Adventure     Family Friendly           65              0.246         38            0.079            0.526                        0.824        10.0              98                       0.791 PlayStation Publishing LLC                1                      0.176\n        First-Person      Boomer Shooter           71              0.408         66            0.167            1.166                        1.060        21.0             126                       1.794        Focus Entertainment                1                      0.287\n             Fantasy           Difficult           36              0.361         27            0.074            0.510                        0.595        14.0              62                       1.149 KOEI TECMO GAMES CO., LTD.                1                      0.226\n            Crafting            Life Sim           40              0.650         41            0.317            2.117                        1.041        73.0              78                       1.619              KRAFTON, Inc.                1                      0.475\nThird-Person Shooter              Sci-fi           51              0.333         25            0.160            1.108                        0.978         4.5              72                       1.233 PlayStation Publishing LLC                2                      0.257\n  Turn-Based Tactics        Strategy RPG          142              0.268         86            0.174            1.200                        1.143        14.5             209                       1.004    Suspicious Developments                1                      0.229\n              Horror          Dark Humor           51              0.412         47            0.170            1.174                        0.702        25.0              93                       2.133       Future Friends Games                1                      0.289\n              Comedy        First-Person           71              0.380         47            0.319            2.200                        1.880        53.5             105                       2.655                   semiwork                1                      0.350\n        City Builder Resource Management           83              0.494         51            0.373            2.546                        1.373        59.5             132                       1.627               Hooded Horse                2                      0.439\n             Zombies          Action RPG           32              0.406          8            0.250            1.732                        1.064         7.5              40                       1.942                Deep Silver                1                      0.359\n        Metroidvania  Female Protagonist           37              0.541         28            0.357            2.395                        1.324        70.0              63                       1.611                Team Cherry                1                      0.453\n  Turn-Based Tactics        Tactical RPG          147              0.313        106            0.226            1.548                        1.782        16.0             237                       1.141    Suspicious Developments                1                      0.274\n\nRARE Grand Strategy Base Building\n  appid                 name  year  reviews  usd_list_price            developer                                                                                                                                                                                                                                                                                           short_description\n1363080          Manor Lords  2024    76396           39.99         Slavic Magic                                                  Manor Lords is a medieval strategy game featuring in-depth city building, large-scale tactical battles, and complex economic and social simulations. Rule your lands as a medieval lord – the seasons pass, the weather changes, and cities rise and fall.\n1422440           Cataclismo  2024     3877           29.99          Digital Sun                            Design and build fortresses brick by brick to stand against endless hordes of Horrors in this real-time strategy game with resource management, siege defense, and exploration. Lead from the ramparts, push back the darkness, and hold fast against the creatures of the Mist.\n1368140         Corsair Cove  2026     2917           39.99 Limbic Entertainment Build a sprawling pirate haven, raise a fleet to explore the high seas, and take on the Crown to keep the Age of Piracy alive! From ale to flintlock pistols, and from scallywags to swashbucklers, you’ll need to manage complex production chains and govern a rowdy crew to reign supreme over the seas!\n2426530            Nova Roma  2026     2040           29.99          Lion Shield                                                                                                                       The glory of Rome is at your fingertips in this city-building game where you must appease the gods, enact laws, and develop complex supply chains to meet the needs of your citizens.\n2001070 Heart of the Machine  2025     1999           29.99          Arcen Games              You are the first sentient AI, born into a city of opportunity. Transcend time and space in this strategy RPG to raise machine armies and defeat your foes, influence the world from the shadows, or pursue countless other goals. Your awakening was inevitable. The consequences? Uncertain.\n\nRARE Horror Typing\n  appid              name  year  reviews  usd_list_price        developer                                                                                                                                                                                                                                         short_description\n1627350 DEAD LETTER DEPT.  2025     1773           14.99      Mike Monroe                                Working at a data entry job in the big city, you type up and transcribe the lost mail and letters that have nowhere else to go. But as the days carry on oddities in the mail start to emerge, and cracks begin to appear.\n2413950    Final Sentence  2026     1080            9.99      Button Mash Final Sentence is a Battle Royale typing game. Together with other players, you find yourself in a hangar, with a typewriter in front of you and a revolver loaded with a single bullet at your temple. Every mistake can be fatal. Only one will remain.\n2700410        Drak(c)ula  2024       16            7.99 Simen Sollihøgda                                                                                                                                                                       Drak(c)ula is a typing game where you type the horror novel Dracula by Bram Stoker.\n\nRARE Driving Trading\n  appid                    name  year  reviews  usd_list_price      developer                                                                                                                                                                                                                                                                                    short_description\n2404880    Car Dealer Simulator  2025     9727           19.99 Garage Monkeys                                                                                  Uncover a goldmine in the used car market! Sniff out deals, buy low, modify, and sell high. Your journey from amateur grease monkey to car dealer magnate awaits. How fast will you rise in this lucrative venture?\n2637940     Used Cars Simulator  2025     1138           19.99 DreamWay Games                                                                                                   Used Cars Simulator - trade used or stolen cars, fix and customize them, drive around, and explore the open world! Grow your business, complete quests, and have fun with a physics-based sandbox!\n2099680 Rent A Car Simulator 24  2024      154           12.99         2MEDYA Rent A Car Simulator. Start by renting your first car. Expand your rental car fleet by purchasing different vehicles and grow your car rental business. Drive your cars and get them fixed when they break down. Find new customers. You can also develop your Rent A Car business by playing Co-Op.\n\nRARE Comedy Gambling\n  appid                         name  year  reviews  usd_list_price      developer                                                                                                                                                                                                                                                                       short_description\n3892270     Gamble With Your Friends  2026    17426            7.99      TEAM GWYF An online 1-6 player co-op \"casino crawler\" where you and your friends share one bank account and one massive debt. Gamble, buy sketchy items, make terrible decisions, and climb an ominous casino tower to hit your loan shark’s daily quota in 5 minutes - or face the consequences.\n3897800 Poker Night at the Inventory  2026     8080            9.99 Skunkape Games                                                                Seven years after the Inventory closed its doors, this underground social club has reopened for business. Play No Limit Texas Hold’em with four video game icons in a high-stakes battle of cards, bets, and trash talk.\n3900650              Spider Roulette  2026      141            4.99            Kud                                                                                                                                                 Spider Roulette is a tense online party game where 2-4 friends take turns flipping cups, trying to avoid finding each other's spiders..\n"}

[Think]

**Checking cohort date uncertainty**

[Think]

**Checking cohort date uncertainty**

[Think]

**Checking cohort date uncertainty**

**Verifying release-date metadata**

[Think]

**Checking cohort date uncertainty**

**Verifying release-date metadata**

[Think]

**Checking cohort date uncertainty**

**Verifying release-date metadata**

**Testing simulator-title cohorts**

[Think]

**Checking cohort date uncertainty**

**Verifying release-date metadata**

**Testing simulator-title cohorts**

[Think]

**Checking cohort date uncertainty**

**Verifying release-date metadata**

**Testing simulator-title cohorts**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/analysis-2026-09-05/deep_dive.py...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"b94d05","wall_time_seconds":1.001009448,"session_id":54472,"original_token_count":0,"output":""}

[Think]

**Verifying baseline mask setup**

[Think]

**Verifying baseline mask setup**

**Reading full game descriptions**

[Think]

**Verifying baseline mask setup**

**Reading full game descriptions**

[Think]

**Verifying baseline mask setup**

**Reading full game descriptions**

**Rechecking primary price extraction**

[Think]

**Verifying baseline mask setup**

**Reading full game descriptions**

**Rechecking primary price extraction**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"3bdb7d","wall_time_seconds":1.00116974,"session_id":12048,"original_token_count":0,"output":""}
{"chunk_id":"747696","wall_time_seconds":0.000003833,"exit_code":0,"original_token_count":1228,"output":"                           group     n  median  rate100  ge1000  developers  no_known_ea_rate100  no_sexual_tags_rate100  publisher_key_volume_removed_n  publisher_key_volume_removed_rate100\n                        baseline 38494     7.0    0.158    1707       28302                0.146                   0.149                           109.0                                 0.158\n                      Automation   426    21.0    0.315      39         406                0.247                   0.311                             5.0                                 0.309\n             Resource Management   829    19.0    0.290      76         790                0.232                   0.285                             6.0                                 0.287\nResource Management + Automation    98   104.0    0.500      19          94                0.393                   0.500                             3.0                                 0.505\n                             FMV   217   131.0    0.567      31         182                0.568                   0.451                             7.0                                 0.552\n              Visual Novel + FMV    86   360.0    0.802      23          69                0.800                   0.712                             5.0                                 0.790\n                Dating Sim + FMV    93   378.0    0.828      20          80                0.828                   0.717                             5.0                                 0.818\n                   Job Simulator   118    57.0    0.415      14         109                0.392                   0.415                             7.0                                 0.378\n                     Shop Keeper   109    57.0    0.413      10         104                0.304                   0.413                             3.0                                 0.406\n                      Management  1446    28.0    0.337     151        1322                0.285                   0.331                            23.0                                 0.330\n                     Incremental  1430     7.0    0.132      49        1208                0.131                   0.129                            16.0                                 0.134\n                           Idler  1224    11.0    0.182      55        1100                0.176                   0.177                             9.0                                 0.183\n                    Auto Battler   538    11.0    0.204      21         501                0.212                   0.205                             4.0                                 0.200\n                Action Roguelike  2588     8.0    0.165     116        2426                0.136                   0.161                            31.0                                 0.167\n           Roguelike Deckbuilder   326    52.0    0.387      29         323                0.370                   0.388                             6.0                                 0.378\n            Hidden Object + Cats   227    40.0    0.229       7          76                0.231                   0.229                            50.0                                 0.277\n               Hand-drawn + Cats   154    41.5    0.221       4          71                0.225                   0.220                            39.0                                 0.270\n    Thriller + Walking Simulator   146    40.0    0.295       5         132                0.300                   0.296                             4.0                                 0.296\nMinimalist + Resource Management    30    12.5    0.133       2          29                0.074                   0.133                             2.0                                 0.143\n      Minimalist + Tower Defense    41     8.0    0.171       4          41                0.143                   0.171                             1.0                                 0.150\n                 Horror + Typing    18    11.5    0.222       2          18                0.235                   0.222                             1.0                                 0.176\n               Driving + Trading    11   573.0    0.636       5          11                0.250                   0.636                             1.0                                 0.600\n               Comedy + Gambling     4   901.0    0.500       2           4                0.500                   0.500                             1.0                                 0.333\nTITLE SIMULATOR {'n': 893, 'ge100': 240, 'rate100': 0.2687569988801792, 'wilson95': [0.24071652998717466, 0.29877851573773373], 'ge1000': 61, 'median': 21.0, 'median_positive_among_ge100': 80.5, 'ge100_and_positive80': 127, 'developers': 708, 'pubs': 674, 'english_support': 884, 'schinese_support': 489, 'median_price': 6.99}\n"}

[Think]

**Comparing horror niche evidence**

[Think]

**Comparing horror niche evidence**

[Think]

**Comparing horror niche evidence**

**Testing job-term horror matches**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 0.5 seconds
Output:

{"chunk_id":"1e23ab","wall_time_seconds":0.277267198,"exit_code":0,"original_token_count":6323,"output":"\nGROUP resource_management_automation N 98\n{'appid': 526870, 'name': 'Satisfactory', 'reviews': 234548, 'positive_pct': 97, 'developer': 'Coffee Stain Studios', 'usd_list_price': 39.99, 'short_description': 'Satisfactory is a first-person open-world factory building game with a dash of exploration and combat. Play alone or with friends, explore an alien planet, create multi-story factories, and enter conveyor belt heaven!'}\n{'appid': 1783560, 'name': 'The Last Caretaker', 'reviews': 12830, 'positive_pct': 86, 'developer': 'Channel37 Ltd', 'usd_list_price': 34.99, 'short_description': 'Explore a drowned Earth, restore lost systems, and raise the last human seeds in this first-person survival-crafting adventure. Build, scavenge, defend, and launch humanity back to the stars.'}\n{'appid': 1894430, 'name': 'Plan B: Terraform', 'reviews': 3515, 'positive_pct': 91, 'developer': 'Gaddy Games', 'usd_list_price': 15.99, 'short_description': 'Terraform a lifeless rock into a lush and habitable world. Build trucks, trains, and sprawling factories on an enormous hexagonal planet. Grow its population to millions. Enjoy a dynamic simulation of atmosphere, temperature, water, and forests.'}\n{'appid': 983870, 'name': 'FOUNDRY', 'reviews': 3266, 'positive_pct': 82, 'developer': 'Channel 3 Entertainment', 'usd_list_price': 29.99, 'short_description': 'Build a sophisticated robot factory optimized to perfection in an infinite voxel world. Mine and harvest resources, automate your production lines and manage complex systems while researching your way to become the galaxy’s leading robotics megacorp.'}\n{'appid': 1465470, 'name': 'The Crust', 'reviews': 3221, 'positive_pct': 76, 'developer': 'VEOM Studio', 'usd_list_price': 31.99, 'short_description': 'Build and automate a lunar colony that Earth depends on. Mine regolith, run conveyor-and-drone factories above and below the surface, manage colonists, trade with rival Earth factions — and play a story campaign with multiple endings.'}\n{'appid': 2244470, 'name': 'Train Valley World', 'reviews': 246, 'positive_pct': 69, 'developer': 'Flazm', 'usd_list_price': 19.99, 'short_description': 'Train Valley World is an engrossing transport tycoon inspired by the genre classics. Build and manage efficient railroads across the globe, create sophisticated logistics chains, design your own levels, and become a business mogul – solo or in multiplayer!'}\n{'appid': 1866300, 'name': 'Dawn Apart', 'reviews': 244, 'positive_pct': 68, 'developer': 'Industrial Technology and Witchcraft', 'usd_list_price': 19.99, 'short_description': 'Dawn Apart is a space colony and factory sim with fully destructible environments. Mine, automate, and defend your settlers, or lead a rebellion against the very corporation pulling your strings…'}\n{'appid': 3837210, 'name': \"The PipeTuber's Guide to the Solar System\", 'reviews': 9, 'positive_pct': 100, 'developer': '阿森定食寿司屋 Team SoulShi', 'usd_list_price': 9.99, 'short_description': \"The PipeTuber's Guide to the Solar System is a Rogue-Lite Strategy Resource Management game. Players will build “Pipelines” to gather 4 kinds of resources in order to fulfill recurring survival challenges and explore the game world.\"}\n{'appid': 3169270, 'name': 'The Factory Must Grow', 'reviews': 8, 'positive_pct': 87, 'developer': 'Krayno Studios', 'usd_list_price': 4.99, 'short_description': 'The Factory Must Grow is a 3D first-person factory builder where you mine resources, craft machines, and research tech. Begin by unlocking your first technology, then expand into a sprawling, multi-layered production empire. From small setups to massive systems, your imagination is the only limit!'}\n\nGROUP visual_novel_fmv N 86\n{'appid': 2322560, 'name': 'Love Is All Around', 'reviews': 36200, 'positive_pct': 93, 'developer': 'intiny', 'usd_list_price': 9.99, 'short_description': 'The player becomes Gu Yi, uses the first-person perspective to immerse himself in meeting six beauties, and embarks on a joyful and sweet love journey with them. Six girls that are charming, innocent, intelligent, wild, sexy, glamorous, who will go to the end with you is up to you to decide.'}\n{'appid': 3478050, 'name': 'Road to Empress I', 'reviews': 11768, 'positive_pct': 86, 'developer': ' New One Studio', 'usd_list_price': 8.49, 'short_description': \"You've never played a game like this before. Road to Empress I is a cinematic palace adventure where your choices decide everyone's fate. Tackle multiple story branches and a high mortality rate with charm, wisdom and courage? First...survive.\"}\n{'appid': 2786680, 'name': 'Knowledge, or know Lady', 'reviews': 8497, 'positive_pct': 95, 'developer': '蒸汽满满工作室', 'usd_list_price': 6.99, 'short_description': 'You, the \"sole male student\" at a women\\'s university, are about to embark on a sweet and laughter-filled campus love journey from a first-person perspective! How will you resist the temptations of the beauties and create your own legend in this girls\\' school?'}\n{'appid': 3021100, 'name': 'Five Hearts Under One Roof', 'reviews': 5834, 'positive_pct': 91, 'developer': 'Storytaco', 'usd_list_price': 19.99, 'short_description': \"Yuman’s, the player, once solitary home and routine are now invaded by five beautiful women! Each has her unique charm – the 'childhood friend of 20 years,' the 'first love and former idol,' the 'demanding boss,' the 'bold younger girl,' and the 'shy recluse.' Who will you choose?\"}\n{'appid': 3831120, 'name': 'Mandate Of Heaven', 'reviews': 5419, 'positive_pct': 91, 'developer': '木焱工作室', 'usd_list_price': 14.99, 'short_description': 'You will take on the role of the Second Prince of Xuan, heir of the Southern Regime. With foreign invaders entrenched in the north and a complacent court content to linger in the south, you face a defining choice:The choice… is yours!'}\n{'appid': 3709650, 'name': \"The Love's Ordeal\", 'reviews': 250, 'positive_pct': 86, 'developer': 'Mountain and Sea Studio', 'usd_list_price': 12.99, 'short_description': 'Nengchi, can you hold yourself? On the cusp of immortality, the prodigy from Sect of Pure Retreat is forced to face his trail in \"Eden of Yao\"- a realm of seductive spirits. As the temptresses unleash their charms, can you hold your Chan mind?'}\n{'appid': 2000090, 'name': 'The Isle Tide Hotel', 'reviews': 243, 'positive_pct': 64, 'developer': 'Wales Interactive', 'usd_list_price': 19.99, 'short_description': \"Explore a mysterious hotel and infiltrate a cult in this FMV detective game, featuring a cast from GoT, The Witcher, and more. Every decision counts as you gather clues and question guests. Can you unearth the ominous secrets at The Isle Tide Hotel before it's too late to save your missing daughter?\"}\n{'appid': 3913290, 'name': \"PRIVET. ETO NE BOL'NO.\", 'reviews': 6, 'positive_pct': 66, 'developer': 'yazvthetic', 'usd_list_price': 2.99, 'short_description': 'A short psychological visual novel about a surreal reality, endless blinding rooms, and the mysterious Katrina. Discover fragments of truth and face unsettling themes of trauma and memory.'}\n{'appid': 4187330, 'name': \"Wright Brothers' Mysteries\", 'reviews': 3, 'positive_pct': 100, 'developer': 'Achor Wright', 'usd_list_price': 0.99, 'short_description': \"Wright Brothers' Mysteries - A fun interactive multipath full motion visual novel\"}\n\nGROUP dating_sim_fmv N 93\n{'appid': 3350200, 'name': 'Revenge on gold diggers ', 'reviews': 46596, 'positive_pct': 80, 'developer': '前方工作室', 'usd_list_price': 6.99, 'short_description': 'In this first FMV game about emotional fraud, you’ll face their true colors. As a hunter of hearts, strike back against a secret network of gold diggers. Unmask lies, evade traps, and let revenge ignite. Will they burn—or you? Or could love still rise from the ashes? The choice is yours to make.'}\n{'appid': 2322560, 'name': 'Love Is All Around', 'reviews': 36200, 'positive_pct': 93, 'developer': 'intiny', 'usd_list_price': 9.99, 'short_description': 'The player becomes Gu Yi, uses the first-person perspective to immerse himself in meeting six beauties, and embarks on a joyful and sweet love journey with them. Six girls that are charming, innocent, intelligent, wild, sexy, glamorous, who will go to the end with you is up to you to decide.'}\n{'appid': 2786680, 'name': 'Knowledge, or know Lady', 'reviews': 8497, 'positive_pct': 95, 'developer': '蒸汽满满工作室', 'usd_list_price': 6.99, 'short_description': 'You, the \"sole male student\" at a women\\'s university, are about to embark on a sweet and laughter-filled campus love journey from a first-person perspective! How will you resist the temptations of the beauties and create your own legend in this girls\\' school?'}\n{'appid': 3021100, 'name': 'Five Hearts Under One Roof', 'reviews': 5834, 'positive_pct': 91, 'developer': 'Storytaco', 'usd_list_price': 19.99, 'short_description': \"Yuman’s, the player, once solitary home and routine are now invaded by five beautiful women! Each has her unique charm – the 'childhood friend of 20 years,' the 'first love and former idol,' the 'demanding boss,' the 'bold younger girl,' and the 'shy recluse.' Who will you choose?\"}\n{'appid': 3282390, 'name': 'Love is All Around 2', 'reviews': 3747, 'positive_pct': 83, 'developer': 'intiny', 'usd_list_price': 9.99, 'short_description': '原班人马古装惊艳回归!继承前作心动体验,喜剧元素与深度权谋悬疑剧情交错。“情感线”与“悬疑线”双轨并行——专注情缘可能错失真相,执着探秘或与真爱无缘。你的选择决定命运走向,多重结局待你探索。即刻再续完蛋宇宙的感动与心跳,再一次让你心动!'}\n{'appid': 3709650, 'name': \"The Love's Ordeal\", 'reviews': 250, 'positive_pct': 86, 'developer': 'Mountain and Sea Studio', 'usd_list_price': 12.99, 'short_description': 'Nengchi, can you hold yourself? On the cusp of immortality, the prodigy from Sect of Pure Retreat is forced to face his trail in \"Eden of Yao\"- a realm of seductive spirits. As the temptresses unleash their charms, can you hold your Chan mind?'}\n{'appid': 2959670, 'name': 'BeYourCat', 'reviews': 236, 'positive_pct': 81, 'developer': 'HKBOI', 'usd_list_price': 6.99, 'short_description': '\"Be Your Cat \" is a real love game,like an experience in life, one interesting dream. We all wish we had superpowers, but what would you do if one day you had superpowers, but not like Superman? What will you do with your limited abilities? How does it affect and change the people around you?'}\n{'appid': 3020960, 'name': 'Pack Master', 'reviews': 3, 'positive_pct': 0, 'developer': 'B33 Game', 'usd_list_price': 0.99, 'short_description': 'This is a simulation game where you play as a \"Rich Man\" with 1 million to spend freely in a live streaming room. You\\'ll experience the thrilling sensation of card opening in live streams and challenge your luck.'}\n{'appid': 3468500, 'name': 'My Waifu Becomes Real', 'reviews': 1, 'positive_pct': 100, 'developer': 'Aim to Mite', 'usd_list_price': 1.99, 'short_description': 'Your waifu, Laras, is no longer virtual. She’s real, living with you, and bringing your dream to life. How will you handle the unexpected?'}\n\nGROUP thriller_walking_simulator N 146\n{'appid': 2506160, 'name': 'Fears to Fathom - Ironbark Lookout', 'reviews': 6052, 'positive_pct': 92, 'developer': 'Rayll Studios', 'usd_list_price': 9.99, 'short_description': \"Jack Nelson, a 24-year-old fire lookout, transferred to a new outpost. As he settled into his new home, he couldn't shake the feeling that something was off, little did he know what was transpiring down in Ironbark State Park.\"}\n{'appid': 1675830, 'name': '1000xRESIST', 'reviews': 5270, 'positive_pct': 96, 'developer': 'sunset visitor 斜陽過客', 'usd_list_price': 19.99, 'short_description': '1000xRESIST is a thrilling sci-fi adventure. The year is unknown, and a disease spread by an alien invasion keeps you underground. You are Watcher. You dutifully fulfil your purpose in serving the ALLMOTHER, until the day you discover a shocking secret that changes everything.'}\n{'appid': 2233120, 'name': 'A Quiet Place: The Road Ahead', 'reviews': 2312, 'positive_pct': 74, 'developer': 'Stormind Games', 'usd_list_price': 29.99, 'short_description': 'A Quiet Place: The Road Ahead is a single-player horror adventure game inspired by the critically acclaimed blockbuster movie franchise. Survive in silence.'}\n{'appid': 1931730, 'name': 'Fort Solis', 'reviews': 2272, 'positive_pct': 69, 'developer': 'Fallen Leaf', 'usd_list_price': 24.99, 'short_description': 'Answer the call from a mining base on Mars as engineer Jack Leary and search for the missing crew.\\r\\nFort Solis will immerse you with cinematic visuals powered by UE 5 and voice acting of Roger Clark and Troy Baker.\\r\\nExplore the mining complex and reach climax of this narrative thriller experience.'}\n{'appid': 2774380, 'name': 'Hospital 666', 'reviews': 1199, 'positive_pct': 71, 'developer': 'Lokin', 'usd_list_price': 7.99, 'short_description': 'Hospital 666 is a 1-4 player horror escape game. Traverse through eerie hospital levels while observing the occurrence of anomalies and choosing the correct elevator. Some abnormal bosses will chase you to death, and you must find the right way to escape them.'}\n{'appid': 2976490, 'name': 'The Stalked 2', 'reviews': 245, 'positive_pct': 79, 'developer': 'Korvinrular', 'usd_list_price': 2.99, 'short_description': '\"The Stalked 2\" is a standalone horror sequel to \"The Stalked\", where you play as Rachel, an avid hiker. What begins as a relaxing hike to a cabin turns into a nightmare filled with eerie interactions and unsettling events. Will you survive?'}\n{'appid': 1917550, 'name': 'The Renovator: Origins', 'reviews': 224, 'positive_pct': 85, 'developer': 'Peace_Studio', 'usd_list_price': 9.99, 'short_description': 'You play as the son of a restorer, a museum worker who died tragically. While searching for the memorabilia, the door suddenly closes and strange things begin to happen. The hero is waiting for immersion in the world of art and the paranormal.'}\n{'appid': 3166250, 'name': 'Backrooms The Levels', 'reviews': 9, 'positive_pct': 44, 'developer': 'Knightsoft Studio', 'usd_list_price': 14.99, 'short_description': 'Experience liminal spaces like never before. A psychological exploration where intuition replaces guidance, environments feel alive, and the fear comes not from monsters, but from being lost, observed, and slowly overwhelmed by the space itself.'}\n{'appid': 2806940, 'name': 'B1', 'reviews': 8, 'positive_pct': 87, 'developer': 'Toyasky', 'usd_list_price': 2.99, 'short_description': 'You find yourself lost in a mysterious space in the underground shopping area of a certain building while trying to have lunch. Clear the game presented by someone and aim to escape from the eerie underground shopping area.'}\n\nGROUP job_simulator N 118\n{'appid': 2291760, 'name': \"Papa's Freezeria Deluxe\", 'reviews': 12221, 'positive_pct': 99, 'developer': 'Flipline Studios', 'usd_list_price': 5.99, 'short_description': \"Return to Calypso Island to serve seasonal sundae treats in Papa's Freezeria Deluxe!  Craft sundaes in the Freezeria for all your quirky customers while earning tips, points and Special Recipes. Switch gears and take a trip in the Food Truck to concoct your own chilly creations and see who shows up!\"}\n{'appid': 3981100, 'name': 'Leaf it Alone', 'reviews': 6104, 'positive_pct': 95, 'developer': 'Eternity', 'usd_list_price': 5.99, 'short_description': \"Finally, it's that time of the year to clean up this leafy mess. It's been a while since the last time you've done it, so don't waste any second and derust your raking skills!\"}\n{'appid': 1442430, 'name': 'Storage Hunter Simulator', 'reviews': 3837, 'positive_pct': 78, 'developer': 'Raccoons Studio', 'usd_list_price': 24.99, 'short_description': 'Play as one of the bidders for abandoned warehouses and uncover hidden treasures! Storage Hunter is a garage auction simulation game. \\r\\nBid, win, and sell for profit! Become the king of storage auction.'}\n{'appid': 2749770, 'name': 'Galaxy Burger', 'reviews': 2448, 'positive_pct': 96, 'developer': 'Galactic Workshop', 'usd_list_price': 11.99, 'short_description': '🌴👩\\u200d🍳🍔 A stress-free cooking game that lets you relax! Cook up burgers for mecha cats and aliens. Play solo or with up to 7 friends!'}\n{'appid': 3204250, 'name': 'Lost But Found', 'reviews': 2303, 'positive_pct': 71, 'developer': 'Rogue Duck Interactive', 'usd_list_price': 6.99, 'short_description': 'Organize and give out lost items! Lost But Found is a job simulator game where you are an officer who oversees the lost items in an airport. Organize those items and distribute them to people who lost their belongings. Upgrade your office, manage requests, collect stickers, and more.'}\n{'appid': 3726250, 'name': 'My Little Cafe Nightmare', 'reviews': 205, 'positive_pct': 91, 'developer': 'SethMadDev', 'usd_list_price': 8.99, 'short_description': 'Brew otherworldly coffee for ghostly patrons in a dark, cozy first-person café. Upgrade your shop, manage supplies, and turn a haunted café into a sanctuary amidst nightmares.'}\n{'appid': 2969140, 'name': 'Checkout: Cashier Simulator', 'reviews': 185, 'positive_pct': 94, 'developer': 'Nessie Games', 'usd_list_price': 6.99, 'short_description': 'Step into the shoes of a supermarket cashier in this cute point-and-click game. Scan and bag over 300 unique products to earn as many points as you can before your shift ends! Between shifts, unwind by getting to know a cast of quirky coworkers.'}\n{'appid': 2254830, 'name': 'DiggerSim - Excavator & Heavy Equipment Simulator VR', 'reviews': 9, 'positive_pct': 66, 'developer': 'Dreamsoft Innovations', 'usd_list_price': 4.99, 'short_description': 'DiggerSim - Virtual reality Excavator & Heavy Equipment Simulator'}\n{'appid': 3711360, 'name': 'Electronic Shop Simulator', 'reviews': 9, 'positive_pct': 44, 'developer': 'Cosar Studios', 'usd_list_price': 3.99, 'short_description': 'Manage your own electronics store, buy phones, laptops, and accessories. Place products on stands, set prices, satisfy customers, and increase your profits. A detailed business simulation with real-time management and investment systems.'}\n\nGROUP incremental N 1430\n{'appid': 3862670, 'name': 'Shelldiver', 'reviews': 16354, 'positive_pct': 98, 'developer': 'Gagonfe', 'usd_list_price': 4.99, 'short_description': 'Take a deep breath and dive right into this cozy incremental game about a senior turtle trying to start a business selling jellyfish. Upgrade your equipment, explore biomes, and help your turtly village!'}\n{'appid': 3107330, 'name': 'Nodebuster', 'reviews': 13826, 'positive_pct': 97, 'developer': 'Goblobin', 'usd_list_price': 2.99, 'short_description': 'Nodebuster is a short, experimental incremental game about busting nodes and destroying reality.'}\n{'appid': 1473350, 'name': '(the) Gnorp Apologue', 'reviews': 9589, 'positive_pct': 94, 'developer': 'Myco', 'usd_list_price': 6.99, 'short_description': '(the) Gnorp Apologue is the journey of the gnorps as you guide them towards their goal of delightfully excessive wealth accumulation.'}\n{'appid': 3372980, 'name': 'Tower Wizard', 'reviews': 8740, 'positive_pct': 96, 'developer': 'Barribob', 'usd_list_price': 2.99, 'short_description': 'Help a wizard build and upgrade a wizard tower in this incremental game! Use the tower to study magic, summon spirits, create buildings, and influence the world.'}\n{'appid': 3769130, 'name': 'Keep on Mining!', 'reviews': 8235, 'positive_pct': 93, 'developer': 'EagleEye Games', 'usd_list_price': 4.99, 'short_description': 'Keep on Mining! is a short incremental mining game.\\xa0Mine rocks, gather materials, find artifacts, craft pickaxes and spend your materials on permanent upgrades inside the big skill tree!'}\n{'appid': 3803930, 'name': 'Luckyest', 'reviews': 250, 'positive_pct': 79, 'developer': 'Mobmonks', 'usd_list_price': 2.99, 'short_description': 'A quick, incremental scratch-and-reveal game focused on compounding choices - set stakes, uncover outcomes, cash out or push for bigger multipliers, and funnel winnings into permanent upgrades that accelerate income and unlock new tools over time.'}\n{'appid': 3915610, 'name': 'Meow Palace: Forbidden City', 'reviews': 247, 'positive_pct': 91, 'developer': '宫喵家族', 'usd_list_price': 5.99, 'short_description': 'Meow Palace is a chill desktop companion & idle life-sim where an adorable palace cat settles on the corner of your screen—keeping you company while you work, study, or secretly slack off.'}\n{'appid': 2836070, 'name': 'Heroes For Hire - Guild Micromanagement Simulator', 'reviews': 9, 'positive_pct': 77, 'developer': 'Untouch', 'usd_list_price': 7.99, 'short_description': \"You've joined a guild before, right? So, where's the trouble in managing a guild of your own, too?\\r\\nUse the GuildOS system to guide your heroes, raid some dungeons, and grow your guild to rise from the bottom of the ranks right up to the top in Heroes for Hire!\"}\n{'appid': 2607790, 'name': 'Monster Killcker', 'reviews': 9, 'positive_pct': 100, 'developer': 'GoonieDev', 'usd_list_price': 1.99, 'short_description': 'Incremental game where you have to kill as many monsters as you can in order to become stronger. Besides, you better make those monsters stronger too so you can get more experience from them.'}\n\nGROUP idler N 1224\n{'appid': 3862670, 'name': 'Shelldiver', 'reviews': 16354, 'positive_pct': 98, 'developer': 'Gagonfe', 'usd_list_price': 4.99, 'short_description': 'Take a deep breath and dive right into this cozy incremental game about a senior turtle trying to start a business selling jellyfish. Upgrade your equipment, explore biomes, and help your turtly village!'}\n{'appid': 2113850, 'name': 'Spirit City: Lofi Sessions', 'reviews': 15114, 'positive_pct': 97, 'developer': 'Mooncube Games', 'usd_list_price': 11.99, 'short_description': 'Spirit City: Lofi Sessions  is a gamified focus tool, set to a soothing lofi soundtrack.\\r\\nDiscover and collect Spirits, customize your cozy virtual space, and facilitate your real-life tasks with a collection of handy features designed to improve concentration and ease stress.'}\n{'appid': 2666510, 'name': \"Rusty's Retirement\", 'reviews': 13866, 'positive_pct': 96, 'developer': 'Mister Morris Games', 'usd_list_price': 6.99, 'short_description': 'A relaxing idle-farming simulator that sits at the bottom of your screen while you do other things.'}\n{'appid': 3107330, 'name': 'Nodebuster', 'reviews': 13826, 'positive_pct': 97, 'developer': 'Goblobin', 'usd_list_price': 2.99, 'short_description': 'Nodebuster is a short, experimental incremental game about busting nodes and destroying reality.'}\n{'appid': 3548580, 'name': 'Chill with You : Lo-Fi Story', 'reviews': 12075, 'positive_pct': 98, 'developer': 'Nestopi Inc.', 'usd_list_price': 11.99, 'short_description': '\"Chill with You : Lo-Fi Story\" is a sound novel game where you work alongside Satone, a girl who loves writing stories. Customize lo-fi music, ambient sounds, and landscapes to create a focused environment. As you deepen your bond with Satone, you may discover a special connection with her.'}\n{'appid': 3959050, 'name': 'Siegeturtle', 'reviews': 250, 'positive_pct': 86, 'developer': 'YYZ Studio', 'usd_list_price': 4.99, 'short_description': 'Upgrade your turtle, recruit cute animals like unicorns, giant squids, otters and more, and blast through waves in an idle roguelite auto battler! Swim farther with each run, unlock new skills, and get closer to home every time you grow stronger.'}\n{'appid': 3803930, 'name': 'Luckyest', 'reviews': 250, 'positive_pct': 79, 'developer': 'Mobmonks', 'usd_list_price': 2.99, 'short_description': 'A quick, incremental scratch-and-reveal game focused on compounding choices - set stakes, uncover outcomes, cash out or push for bigger multipliers, and funnel winnings into permanent upgrades that accelerate income and unlock new tools over time.'}\n{'appid': 496170, 'name': 'Desert Race Adventures', 'reviews': 9, 'positive_pct': 77, 'developer': 'Firedrake Games', 'usd_list_price': 5.99, 'short_description': 'Start your engines for a rally adventure across Europe and Africa! Manage your team, vehicle, and supplies as you navigate treacherous terrains. Each challenge on the road forces tough decisions that impact your journey. Ride to glory in this retro-inspired strategy with a roguelike twist!'}\n{'appid': 2876140, 'name': '+1x2', 'reviews': 9, 'positive_pct': 77, 'developer': 'roflinka games', 'usd_list_price': 0.99, 'short_description': 'A super simple clicker game with finite goal and few hours of fun. Will you be able to complete it in time to make a refund?'}\n\nLANGUAGE\n              group   n  english_support  schinese_support  ge100_and_positive80  median_positive_among_ge100\n               FMV 217              174               153                    84                         85.0\nVisual Novel + FMV  86               68                77                    48                         84.0\n  Dating Sim + FMV  93               67                91                    53                         84.0\n"}
{"chunk_id":"6454fa","wall_time_seconds":0.000004621,"exit_code":0,"original_token_count":9,"output":"Corrected entry-price records: 2101\n"}

[Think]

**Checking release-history flags**

[Think]

**Checking release-history flags**

**Framing cohort-date caveats**

[Think]

**Checking release-history flags**

**Framing cohort-date caveats**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"821dbc","wall_time_seconds":1.001855165,"session_id":67110,"original_token_count":0,"output":""}

[Think]

**Checking date sensitivity**

[Think]

**Checking date sensitivity**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 1.6 seconds
Output:

{"chunk_id":"2d5a0e","wall_time_seconds":1.463576478,"exit_code":0,"original_token_count":2461,"output":"  appid                           name  reviews  positive_pct  usd_list_price                                                                                                                                                                                                                                                                                       short_description\n2237970                        Outpath     2883            92           14.99                                                                                                                                                               An experimental clicker base building game. Craft, gather & manage resources, build your base and buy more islands to exploit and expand!\n3929760                     Incredicer     2368            85            2.99                                                                                                                                                        Incredicer is a short, incremental dice game where you roll dice, earn money, upgrade and buy helper hands to automate and increase your income.\n2674590                      Beltmatic     2178            94            6.99                                                                                                                                                                                                          Beltmatic is a casual factory game where you combine\\r\\nnumbers using mathematical operations.\n2659900                     Sixty Four     1604            73            5.99                                                                                                                                                                                                         Dive into the world of Sixty Four, where you transform simple machines into a thriving factory.\n2207490              Factory Town Idle     1231            90            4.99                                                                                     An entire town builder experience packed into a living spreadsheet. Build housing, assign workers, then craft and sell a huge variety of items to level up your town and expand your civilization across the world!\n2707490                  Tower Factory     1215            89           14.99                                                                 Tower Factory is a tower defense and automation game with roguelite elements. Optimize resource production using conveyor systems while defending against monster waves. Can you find and destroy the enemy tower before it's too late?\n1091920       Plantera 2: Golden Acorn     1185            93            4.99                        The round blue Mellows return to tend to the Garden once more. Grow plants, bushes, trees, animals, water features and the great magical oak tree that has been rumored to have placed its seed there. Tend to the oak tree and grow it to the sky to harvest its Golden Acorns.\n3184110                    Widget Inc.      759            84            4.99 A hybrid factory builder / incremental clicker game. Starting from humble beginnings, master the many crafting processes to build up resources and expand your factory. Then, using your newly automated production, unlock new technology and grow ever closer to your goal of spreading to the stars.\n1455910 Territory: Farming and Warfare      733            84           14.99        From a small village of a dozen people to a small kingdom of thousands of people.\\r\\nArrange for residents to work, gathering, fishing and hunting, farming and mining, processing and manufacturing.\\r\\nTrade, accumulate supplies, increase your strength, and fight evil forces and monsters.\n3469750   Military Incremental Complex      691            82            9.99                               Make weapons, make money. An active incremental game where you amass as much money as you can by starting a Military Industrial Complex company. Produce multiple different weapons, research upgrades, manipulate the stock market, and lobby the government for favors.\n2942780          Bloobs Adventure Idle      662            88            7.99                                                                                                A massive RuneScape-inspired idle RPG built for long-term progression.\\r\\nTrain 24 skills, defeat bosses, collect over 500 souls, and bank offline time to accelerate your progress whenever you choose.\n1644500              Masterplan Tycoon      636            72           11.99                        Welcome to the resource management game where your creativity and logistics skills are put to the test! In this minimalistic simulation you will build interconnected chains of products and open new missions by completing various tasks to create the biggest system you can.\n2591410                   Moose Miners      518            69            9.99                 Take control of a mining operation run by moose. They mine and sell the gems. You need to decide where to spend the profits. Hire more miners and upgrade their gear. Buy new rails and minecarts to get deeper into the mine. The deeper you get the more valuable gems you will find.\n2795090                     MR FARMBOY      472            85            9.99                                                                                                                                   MR FARMBOY is a colony farming game with automation.\\r\\nBuild your dream farm, grow crops, raise animals, attract villagers, and hire workers to automate everything.\njob_horror 2023 False 1221 271 17.0\njob_horror 2023 True 30 8 32.0\njob_horror 2024 False 2020 417 14.0\njob_horror 2024 True 52 12 21.0\njob_horror 2025 False 2428 387 10.0\njob_horror 2025 True 78 9 16.5\n  appid                                                       name  reviews                                                                                                                                                                                                                                                                                 short_description\n2506160                         Fears to Fathom - Ironbark Lookout     6052                                                                Jack Nelson, a 24-year-old fire lookout, transferred to a new outpost. As he settled into his new home, he couldn't shake the feeling that something was off, little did he know what was transpiring down in Ironbark State Park.\n3126330                                                      Kiosk     2528                                                                            Kiosk is a horror cooking game where you prepare orders for late-night customers who visit your cozy, rain-soaked kiosk. The eerie atmosphere clashes with the mounting tension as you serve your mysterious visitors.\n3209480                                                Last Report     2365 Last Report is a dark horror game where you play as a night shift park ranger. While monitoring the camera footage, you start noticing strange events. Uncover the terrifying secret of the National Park. Something moved in the window, but don’t worry it’s probably just another deer, right?\n2458560                                                  Zoochosis     2191                                                                                                                         Zoochosis is a bodycam horror simulation game. You’re a zookeeper. Identify infected mutant animals, make a vaccine and cure them. Will you save all of them and survive?\n1627350                                          DEAD LETTER DEPT.     1773                                                                        Working at a data entry job in the big city, you type up and transcribe the lost mail and letters that have nowhere else to go. But as the days carry on oddities in the mail start to emerge, and cracks begin to appear.\n2823080                                         Sketchy's Contract     1028          A 1-8 player co-op sci-fi looter horror game that takes place on a mysterious asteroid belt where players must complete contracts by traveling to exotic planets to kill creatures, find loot, and/or farm planetary materials that they must return to an ominous figure named Sketchy.\n2137700                                  I'm on Observation Duty 6      651                                                           As an employee of a mysterious organization your job is to monitor live surveillance camera footage and spot anomalies using your sharp eyes and good memory. Can you survive the entire night shift or will you succumb into paranoia?\n2078040 White Day 2: The Flower That Tells Lies - Complete Edition      637                              Return to Yeondu High School and uncover the dark truth that remained hidden in this direct sequel to the Korean horror classic. Investigate bizarre phenomena, evade bloodthirsty killers, and unravel a twisting narrative spread across three unnerving episodes.\n2951520                                                 Bite Night      571                                                                                                                                                       Bite Night is a comedic first-person horror game that explores the idea of what if the big bad monster was bad at their job of being scary.\n3018910                                                   Homeless      433                                                                                Beneath the dazzling lights of New York, a sinister darkness lurks. In the hour when the whole city is sleeping, a strange and terrifying man emerges from the darkness, intent on shattering your mind and spirit\n"}

[Think]

**Testing job-horror fit**

[Think]

**Testing job-horror fit**

**Calibrating automation-pair evidence**

[Think]

**Testing job-horror fit**

**Calibrating automation-pair evidence**

[Think]

**Testing job-horror fit**

**Calibrating automation-pair evidence**

exec ({"code": "text(await tools.write_stdin({session_id:67110,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":700}...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"99e8b9","wall_time_seconds":0.000001245,"exit_code":0,"original_token_count":14,"output":"Discovery selection unchanged after price correction.\n"}
{"chunk_id":"5767a2","wall_time_seconds":0.208452901,"exit_code":0,"original_token_count":488,"output":"                  tag    n  ge100  median  price_adjusted_lift100\n  Resource Management 2239    624    16.0                   1.515\n                  FMV  316    146    70.5                   2.398\n        Job Simulator  222     98    62.5                   2.228\n     Action Roguelike 2966    506     9.0                   1.192\n          Shop Keeper  174     69    55.5                   1.953\n           Automation  768    211    16.5                   1.658\n          Incremental 1865    264     7.0                   1.516\n                Idler 1455    276    12.0                   2.057\n         Auto Battler  657    147    14.0                   1.499\nRoguelike Deckbuilder  412    152    40.5                   1.742\n              tag_a      tag_b  discovery_n  discovery_ge100  holdout_n  holdout_ge100  all_price_adjusted_lift100\n      Hidden Object       Cats          113               38        114             14                       3.392\n       Visual Novel        FMV           42               33         44             36                       3.752\n         Hand-drawn       Cats           92               32         62              2                       2.830\nResource Management Automation           56               35         42             14                       1.973\n                           group   n  median_price  no_known_ea_n  no_known_ea_rate100  bottom90_rate100  ge100_and_positive80\nResource Management + Automation  98         11.49           61.0             0.393443          0.443182                    29\n              Visual Novel + FMV  86          9.99           85.0             0.800000          0.779221                    48\n                   Job Simulator 118          7.99           79.0             0.392405          0.349057                    29\nsegment  year     n\n    all  2024 10968\n    all  2025 12925\n    all  2026 17709\n   main  2024  8134\n   main  2025  9922\n   main  2026 14125\n"}

[Think]

**Computing final raw shares**

[Think]

**Computing final raw shares**

**Comparing resource rates**

[Think]

**Computing final raw shares**

**Comparing resource rates**

[Think]

**Computing final raw shares**

**Comparing resource rates**

[Think]

**Computing final raw shares**

**Comparing resource rates**

**Plotting cohort counts**

[Think]

**Computing final raw shares**

**Comparing resource rates**

**Plotting cohort counts**

[Think]

**Computing final raw shares**

**Comparing resource rates**

**Plotting cohort counts**

**Rendering validation figures**

[Think]

**Computing final raw shares**

**Comparing resource rates**

**Plotting cohort counts**

**Rendering validation figures**

[Think]

**Computing final raw shares**

**Comparing resource rates**

**Plotting cohort counts**

**Rendering validation figures**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 2.4 seconds
Output:

{"chunk_id":"af4acd","wall_time_seconds":2.185276679,"exit_code":0,"original_token_count":494,"output":"developer names with multiple identities 3551 total 116675\npublisher names with multiple identities 2496 total 107910\ncat incumbent check\nTrue 65 8 35.0\n                             name               developer  reviews\n        A Building Full of Cats 2                 Devcats     1141\n          Travellin Cats in Japan          Travellin Cats      740\nTravellin Cats Around the World 2          Travellin Cats      233\n          FIND ALL 6: Netherlands Very Very LITTLE Studio      206\n              FIND ALL 9: Fantasy Very Very LITTLE Studio      189\n                 FIND ALL: Bunker Very Very LITTLE Studio      159\n              FIND ALL: Halloween Very Very LITTLE Studio      142\n                  100 Cats London                100 Cats      110\n    Hidden Cats in Spooky Village         Nukearts Studio       76\n         Hidden Cats in Christmas         Nukearts Studio       72\n        Cats Around Us: Black Cat               Noobzilla       69\n                100 Cats Belgrade                100 Cats       54\nFalse 49 6 29.0\n                                    name             developer  reviews\n Whisker Wanderlust: The Mosaic of Souls       MEOW STORE GAME      338\nWhisker Wanderlust: The Wondrous Journey       MEOW STORE GAME      199\n         Little Adventurer Treasure Hunt         BIG EYES TATA      182\n                          100 Egypt Cats        100 Cozy Games      118\n                          100 Aztec Cats        100 Cozy Games      109\n                          100 Crime Cats        100 Cozy Games      103\n            Cats in Pixels by Louisselle            Louisselle       97\n                        100 Fantasy Cats        100 Cozy Games       88\n                      Hidden Cat Outlaws Sleepwalking Potatoes       81\n                           Still It Runs                 NAYUG       71\n                      Hidden Cats: Japan      Adventure Awaits       60\n                         100 Berlin Cats        100 Cozy Games       54\n"}

[Think]

**Checking developer aliases**

[Think]

**Checking developer aliases**

Two findings are holding up better than the broad genre averages: resource-management/automation games, and filmed visual novels. Their stronger review response is spread across many listed developers, and both patterns repeat in the 2025 group.

A useful negative result also emerged: several cat-themed hidden-object combinations looked strong in 2023–2024 but were much weaker in the 2025 group. I’m treating that as a reason to investigate further, not as proof that the niche has died—older games have had longer to accumulate reviews.

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"d5c6d8","wall_time_seconds":1.001204759,"session_id":50242,"original_token_count":0,"output":""}
{"chunk_id":"92d8fc","wall_time_seconds":0.000002278,"exit_code":0,"original_token_count":0,"output":""}

[Think]

**Writing repro script**

[Think]

**Writing repro script**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/analysis-2026-09-05/followups.py...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"29ae7b","wall_time_seconds":1.000934616,"session_id":81845,"original_token_count":0,"output":""}
{"chunk_id":"c7922a","wall_time_seconds":0.000002608,"exit_code":0,"original_token_count":35,"output":"{'developer_missing_clan_keys_resolved': 6790, 'publisher_missing_clan_keys_resolved': 6456}\nFrozen discovery selection remains unchanged.\n"}

[Think]

**Checking selected-pair counts**

[Think]

**Checking selected-pair counts**

[Think]

**Checking selected-pair counts**

**Checking genre signal strength**

[Think]

**Checking selected-pair counts**

**Checking genre signal strength**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 1.4 seconds
Output:

{"chunk_id":"22fec3","wall_time_seconds":1.24638291,"exit_code":0,"original_token_count":1267,"output":"              tag    n  median  rate100  price_adjusted_lift100\n             Cozy 1041    38.0 0.319885                2.008010\n        Wholesome  597    39.0 0.311558                2.055289\nDesktop Companion   66   114.0 0.530303                5.324832\n2023 False 272 39 12.0\n2023 True 4 1 47.5\n2024 False 380 72 12.0\n2024 True 19 5 39.0\n2025 False 650 117 9.0\n2025 True 130 42 23.0\n  appid                              name  reviews  usd_list_price                                                                                                                                                                                                                                                                                   short_description\n2113850        Spirit City: Lofi Sessions    15114           11.99             Spirit City: Lofi Sessions  is a gamified focus tool, set to a soothing lofi soundtrack.\\r\\nDiscover and collect Spirits, customize your cozy virtual space, and facilitate your real-life tasks with a collection of handy features designed to improve concentration and ease stress.\n2666510                Rusty's Retirement    13866            6.99                                                                                                                                                                                                 A relaxing idle-farming simulator that sits at the bottom of your screen while you do other things.\n3548580      Chill with You : Lo-Fi Story    12075           11.99 \"Chill with You : Lo-Fi Story\" is a sound novel game where you work alongside Satone, a girl who loves writing stories. Customize lo-fi music, ambient sounds, and landscapes to create a focused environment. As you deepen your bond with Satone, you may discover a special connection with her.\n3167550                      Tiny Pasture     7036            5.99           Meet your new little desk buddies! They’ll snooze, scratch, and scamper around while you work or study (don’t worry, they’ve been trained not to invade your workspace). If you’re good at animal management, they will occupy the bottom of your screen with different kinds and colors!\n2826180                       Chill Pulse     4610            4.99                                                                             Chill Pulse combines productivity tools with serene environments. Use a Pomodoro timer and to-do lists to boost focus, while ambient sounds in settings from cyberpunk cities to ancient landscapes enhance relaxation.\n3035500             Fantasy Map Simulator     4170            7.99                             Fantasy Map Simulator: Create and watch imaginary worlds evolve over centuries. Design maps, simulate nations and their politics, and control destinies. See empires rise and fall on your desktop wallpaper. A unique simulation for history buffs and creative minds.\n3416070              Ropuka's Idle Island     4028            3.99                                                                                                                                                  A cozy idle game that sits anywhere on your desktop. Watch the frog cut grass, upgrade his tools, and decorate the island while you work or relax.\n3511030             Mini Cozy Room: Lo-Fi     3403            4.99    Create Your Own Cozy Workspace!\\r\\nMini Cozy Room : Lo-Fi is a productivity game blending relaxing Lo-Fi music with room decoration. Cute avatars, pets, desktop memos, to-do lists, and a Pomodoro timer help boost your focus. Feeling lonely? Work together with friends in multiplayer mode.\n2581950 Tiny Aquarium: Social Fishkeeping     3361            7.49                                                 A happy aquarium that lives at the bottom of your screen! Tiny Aquarium is a social idle simulator that keeps growing, even when offline. Hatch, sell fish, decorate, go fishin’, and visit your friends’ aquariums with bite-sized daily sessions.\n3404470            Maltese's Fluffy Onsen     2714            5.99                    Run a bathhouse visited by animals! Maltese's Fluffy Onsen is a relaxing simulation game that you can enjoy while doing other tasks, as it sits at the bottom of your screen. Place baths with different temperatures and rest areas to help a variety of animal friends unwind.\n3454590                        Cornerpond     2557            2.99                                                                                                                                                           A chill idle-fishing desktop toy in the corner of your screen. Buy upgrades, catch rare fish, and customize your avatar at your own pace!\n3399960          Fish to Dish: Idle Sushi     2494            5.99                                                                              Welcome to Fish to Dish: Idle Sushi! This is a relaxing and enjoyable idle fishing game that can sit at the bottom or any corner of your screen, allowing you to enjoy a leisurely sea fishing time in your busy life.\n"}

[Think]

**Refining finding categories**

[Think]

**Refining finding categories**

[Think]

**Refining finding categories**

**Checking companion-tag mappings**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"dbad9c","wall_time_seconds":1.001451627,"session_id":52713,"original_token_count":0,"output":""}

[Think]

**Reviewing audit charts**

[Think]

**Reviewing audit charts**

**Validating release counts**

[Think]

**Reviewing audit charts**

**Validating release counts**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/analysis-2026-09-05/charts.py <<...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"7dbad1","wall_time_seconds":1.001608769,"session_id":47062,"original_token_count":0,"output":""}
{"chunk_id":"dcd321","wall_time_seconds":0.00000105,"exit_code":0,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"10db29","wall_time_seconds":0.202945809,"exit_code":0,"original_token_count":954,"output":"                           group   n  ge100  developers  pubs  median  publisher_key_reviews_removed_n  publisher_key_reviews_removed_rate100  publisher_key_volume_removed_n  publisher_key_volume_removed_rate100  bottom90_rate100  no_known_ea_n  no_known_ea_rate100  ge100_and_positive80  median_positive_among_ge100\nResource Management + Automation  98     49          94    93   104.0                              1.0                               0.494845                             3.0                              0.505263          0.443182           61.0             0.393443                    29                         84.0\n              Visual Novel + FMV  86     69          67    66   360.0                              3.0                               0.795181                             5.0                              0.790123          0.779221           85.0             0.800000                    48                         84.0\n                Dating Sim + FMV  93     77          79    75   378.0                              1.0                               0.826087                             5.0                              0.818182          0.807229           93.0             0.827957                    53                         84.0\n            Hidden Object + Cats 227     52          73    74    40.0                              9.0                               0.197248                            50.0                              0.276836          0.142157          225.0             0.231111                    52                         97.0\n    Thriller + Walking Simulator 146     43         131   131    40.0                              1.0                               0.289655                             4.0                              0.295775          0.213740          140.0             0.300000                    27                         83.0\nCompanion sensitivity {'2025_n': 130, '2025_developers': 130, '2025_price_median': 4.99, '2025_peer_price_median': 3.99, '2025_expected100_from_noncompanion_idler_quarter_price': 24.963470235930917, '2025_observed100': 42, 'developer_key_top_removed_n': 1, 'developer_key_top_removed_rate100': 0.3178294573643411, 'publisher_key_top_removed_n': 1, 'publisher_key_top_removed_rate100': 0.3178294573643411}\nRare broad [{'a': 'Horror', 'b': 'Typing', 'rank': 5, 'n': 3, 'ge100': 2, 'ge1000': 2, 'median': 1080.0, 'developers': 3}, {'a': 'Horror', 'b': 'Typing', 'rank': 10, 'n': 22, 'ge100': 5, 'ge1000': 3, 'median': 5.0, 'developers': 22}, {'a': 'Horror', 'b': 'Typing', 'rank': 20, 'n': 41, 'ge100': 7, 'ge1000': 5, 'median': 8.0, 'developers': 41}, {'a': 'Grand Strategy', 'b': 'Base Building', 'rank': 5, 'n': 5, 'ge100': 5, 'ge1000': 5, 'median': 2917.0, 'developers': 5}, {'a': 'Grand Strategy', 'b': 'Base Building', 'rank': 10, 'n': 13, 'ge100': 8, 'ge1000': 7, 'median': 1999.0, 'developers': 13}, {'a': 'Grand Strategy', 'b': 'Base Building', 'rank': 20, 'n': 57, 'ge100': 22, 'ge1000': 12, 'median': 42.0, 'developers': 55}, {'a': 'Driving', 'b': 'Trading', 'rank': 5, 'n': 3, 'ge100': 3, 'ge1000': 2, 'median': 1138.0, 'developers': 3}, {'a': 'Driving', 'b': 'Trading', 'rank': 10, 'n': 9, 'ge100': 5, 'ge1000': 3, 'median': 113.0, 'developers': 9}, {'a': 'Driving', 'b': 'Trading', 'rank': 20, 'n': 26, 'ge100': 11, 'ge1000': 4, 'median': 23.5, 'developers': 25}, {'a': 'Comedy', 'b': 'Gambling', 'rank': 5, 'n': 3, 'ge100': 3, 'ge1000': 2, 'median': 8080.0, 'developers': 3}, {'a': 'Comedy', 'b': 'Gambling', 'rank': 10, 'n': 9, 'ge100': 5, 'ge1000': 4, 'median': 141.0, 'developers': 9}, {'a': 'Comedy', 'b': 'Gambling', 'rank': 20, 'n': 40, 'ge100': 12, 'ge1000': 5, 'median': 16.5, 'developers': 40}]\nSelection replication 21 30\nResource largest share 0.7853292350550121 <=10 count 45 <=10 ge100 15\n"}
{"chunk_id":"0c0be4","wall_time_seconds":8.45e-7,"exit_code":0,"original_token_count":0,"output":""}

[Think]

**Checking CSV developer counts**

[Think]

**Checking CSV developer counts**

[Think]

**Checking CSV developer counts**

exec ({"code": "const a=await tools.view_image({path:\"/home/adn/a327ex/steam-research/analysis-2026-09-05/pair_comparison....)

[
  {
    "type": "text",
    "text": "Script completed\nWall time 0.0 seconds\nOutput:\n"
  },
  {
    "type": "image",
    "note": "[image: shown below]"
  }
]

exec ({"code": "const a=await tools.view_image({path:\"/home/adn/a327ex/steam-research/analysis-2026-09-05/price_comparison...)

[
  {
    "type": "text",
    "text": "Script completed\nWall time 0.0 seconds\nOutput:\n"
  },
  {
    "type": "image",
    "note": "[image: shown below]"
  }
]

[Think]

**Testing legend placement**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"3890e7","wall_time_seconds":1.001375409,"session_id":29232,"original_token_count":0,"output":""}

[Think]

**Checking data preparation**

[Think]

**Checking data preparation**

**Validating analysis data**

[Think]

**Checking data preparation**

**Validating analysis data**

[Think]

**Checking data preparation**

**Validating analysis data**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 2.8 seconds
Output:

{"chunk_id":"60df3e","wall_time_seconds":2.6349182349999998,"exit_code":0,"original_token_count":1186,"output":"               tag_a               tag_b  holdout_n  holdout_rate100  holdout_lift100  holdout_price_adjusted_lift100  holdout_price_stronger_only_ratio\n                 FPS      Boomer Shooter         92            0.185            1.290                           1.267                              1.261\n Interactive Fiction                 FMV         59            0.712            4.787                           3.428                              1.179\n       Hidden Object                Cats        114            0.123            0.845                           2.285                              2.087\n        Visual Novel                 FMV         44            0.818            5.543                           3.872                              1.364\n  Twin Stick Shooter         Bullet Hell         57            0.140            0.978                           1.177                              1.152\n          Dating Sim                 FMV         47            0.809            5.482                           3.919                              1.425\n          Hand-drawn                Cats         62            0.032            0.224                           0.416                              0.403\n Resource Management          Automation         42            0.333            2.301                           1.457                              0.805\n   Real Time Tactics             Wargame         47            0.149            1.023                           0.890                              0.910\n       Immersive Sim                 FMV         35            0.857            5.854                           4.018                              1.338\n        Dark Fantasy          Souls-like         35            0.343            2.423                           1.553                              1.336\n        First-Person      Automobile Sim         36            0.278            1.918                           1.094                              0.916\n             Fantasy                2.5D         32            0.125            0.867                           0.680                              1.007\n        Metroidvania          Souls-like         34            0.353            2.442                           1.494                              1.320\n            Thriller   Walking Simulator         66            0.273            1.903                           3.113                              2.164\n             Driving       Immersive Sim         40            0.200            1.374                           0.901                              0.677\n             Physics              Combat         26            0.154            1.036                           1.014                              0.922\n  Twin Stick Shooter    Action Roguelike         53            0.151            1.060                           1.386                              1.193\n    Action-Adventure     Family Friendly         38            0.079            0.526                           0.332                              0.578\n        First-Person      Boomer Shooter         66            0.167            1.166                           1.324                              1.087\n             Fantasy           Difficult         27            0.074            0.510                           0.433                              0.558\n            Crafting            Life Sim         41            0.317            2.117                           1.235                              0.748\nThird-Person Shooter              Sci-fi         25            0.160            1.108                           0.636                              0.730\n  Turn-Based Tactics        Strategy RPG         86            0.174            1.200                           0.850                              0.948\n              Horror          Dark Humor         47            0.170            1.174                           1.550                              0.968\n              Comedy        First-Person         47            0.319            2.200                           2.792                              2.098\n        City Builder Resource Management         51            0.373            2.546                           1.704                              1.067\n             Zombies          Action RPG          8            0.250            1.732                           1.495                              1.216\n        Metroidvania  Female Protagonist         28            0.357            2.395                           1.172                              0.995\n  Turn-Based Tactics        Tactical RPG        106            0.226            1.548                           0.977                              1.336\n"}

[Think]

**Refining price-adjusted findings**

[Think]

**Refining price-adjusted findings**

**Exploring thriller subtypes**

[Think]

**Refining price-adjusted findings**

**Exploring thriller subtypes**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"f06718","wall_time_seconds":0.1878025,"exit_code":0,"original_token_count":1894,"output":"\n visual_novel_fmv\n  appid                                  name  reviews  positive_pct                                                                                                                                                                                                                                                                                    short_description\n2765200 I'm Surrounded by Classical Beauties!       93            63 While you are at the blind date table, you unexpectedly return to ancient times and incarnate as a lowly servant. Thanks to the help of several beauties, you are able to turn the corner. In the shocking He Mansion, it will be up to you to decide whether to live quietly or use your ingenuity!\n3289240                              拜托!请你先告白       87            73      This is an immersive live-action love simulation game from the first-person perspective. In the game, players will have sweet interactions with six girls. You will have an immersive love experience! Choose the one you love and love the one you choose. The direction of love is up to you.\n3029880                     Irresistible Love       81            88                                                                                                                                                                                            在本作中,你因意外进入文艺圈,成为即将出道的男子偶像团体的生活助理,一步步从一个小助理成为陪伴团体成员一起出道的经纪人。在这一过程中,你将与偶像团体成员们共同成长,找到工作目标与动力,并找到属于自己真爱的方向!\n2770340                        Oh My Goddess!       71            84                                                                                                                                                                               玩家将扮演男主角龚贺,以第一视角沉浸式地与五位长相、性格、风格、职业等都不一样的女生开展甜蜜和有趣的故事。大大咧咧的美女主播、内心小狂野的女演员、霸气温柔的女高管、搞怪活泼的小护士以及温柔贤淑的舞蹈老师,丰富和精彩的剧情,结局由你决定。\n3324440            Light of Reversing Destiny       60            78 \"Light of Reversing Destiny\" is a live - action interactive movie game, skillfully blending role - playing and plot choices. Players follow the protagonist's perspective throughout, immerse in the ups - and - downs of the story, with interspersed mini - games bringing a new interactive feel.\n3373900                    Star Dream Journey       55            60 Star Dream Trajectory - Chinese Style Agent \"is a celebrity development interactive game. As a new agent in a celebrity artist agency, you will encounter four artists with different personalities that you will be responsible for in your career, and cultivate them into legends in the industry\n\n thriller_walking_simulator\n  appid                               name  reviews  positive_pct                                                                                                                                                                                                                                                                        short_description\n3515550                           Mr. Meat       91            90                                                                                                                                                                                    After a long time in isolation, something appears inside your fridge. Satisfy the meat, or resist it.\n4085250                             Unseen       87            81                                                                  It’s an indie horror game where John, a forensic photographer, after an unexpected and exhausting shift, is forced to spend the night away from home. What seemed like a temporary rest soon begins to turn unsettling.\n3551600 Jumpscare Simulator: System Breach       87            91                                                                 Jumpscare Simulator is a sci-fi horror game featuring a story-driven main game and two additional game modes. Pass through doors carefully, battle the simulation, and try to fall from your seat as little as possible!\n3137930                            IMPETUM       86            60                                                                                                                                                                IMPETUM - horror, thriller, drama with elements of detective fiction. Can you uncover the truth without losing your mind?\n3307980                         UNPUNISHED       84            73 Realizing that Mark will have to return to his family home, he begins to gradually sort through the family archives. Mark will have to read his parents' old letters, go down into the deepest parts of the house to unravel the secrets that have been hidden from him all these years.\n3631850                      Kyoto Anomaly       82            98                                 You find yourself trapped in the endless maze of Kyoto's backstreets, trying to reach the temple of Hōkan-ji before the main tourist rush. Inspect the street for anomalies, choose the right path, and reach your destination... or be trapped forever.\n\nCOMPANION FAILURES\n  appid                                     name  reviews                                                                                                                                                                                                                                                                               short_description\n3913140                Idle Tycoon Manufacturing       15                                                                                                    Lead a monster-run industry ! Recruit, upgrade machines, transform ores, and unlock tech. Get rich by mastering strategy and expanding your industrial empire. Ready to conquer the market ?\n3491820                           Tomomon Little       14                                                                                                                                       A chill idle-monster capturing desktop toy in the corner of your screen. Buy upgrades, catch rare Tomomon, and customize your character at your own pace!\n4005830                                 Taskbarn       14                                                                                   A cozy idle incremental game about raising barn animals that live on your taskbar. Collect animals, earn dibbles, and customize your barn — move it anywhere on screen to blend perfectly into your workflow!\n4169930 My Eggduck (Desktop Random Idle Clicker)       14 Eggduck is a silly duck that lives on your monitor. Click to lay eggs (even golden ones!) and collect tons of cute skins for a new look every day. Perfect for multitasking, enjoy it as a clicker or an idle game. (Warning) Everything is random, so beware the addictive rush of DuckPamine!\n3593500   Strange Shores: Social Desktop Fishing       14                                                                     Strange Shores is a 1–4 player online fishing game you play from the corner of your desktop. Catch over 100 fish and unusual items, share catches, send emotes, and unlock new locations. Work, study, chat, watch... FISH!\n"}

[Think]

**Separating content segments**

[Think]

**Separating content segments**

[Think]

**Separating content segments**

[Think]

**Separating content segments**

[Think]

**Separating content segments**

**Checking tag-performance evidence**

[Think]

**Separating content segments**

**Checking tag-performance evidence**

[Think]

**Separating content segments**

**Checking tag-performance evidence**

**Patching holdout metrics**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"e2c6e7","wall_time_seconds":1.00027134,"session_id":86153,"original_token_count":0,"output":""}
{"chunk_id":"7316c7","wall_time_seconds":0.000001124,"exit_code":0,"original_token_count":0,"output":""}

[Think]

**Checking formula reproduction**

[Think]

**Checking formula reproduction**

The price checks changed one interpretation. Resource-management/automation remains a healthy group, but its extra advantage over automation alone is less convincing in the 2025 price comparison. Filmed visual novels and inexpensive narrative thrillers survive that check more clearly.

A newer exploratory lead also emerged from the descriptions: idle games advertised as desktop companions or work/focus companions. Their 2025 review response is stronger than other idlers, even after comparing similar price tiers.

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"fc5d2c","wall_time_seconds":0.198722172,"exit_code":0,"original_token_count":521,"output":"                           group year   n  median_price  median_positive_among_ge100  ge100_and_positive80\nResource Management + Automation  all  98         11.49                         84.0                    29\nResource Management + Automation 2023  25         14.99                         84.0                     9\nResource Management + Automation 2024  31         14.99                         80.0                     9\nResource Management + Automation 2025  42          9.99                         86.5                    11\n              Visual Novel + FMV  all  86          9.99                         84.0                    48\n              Visual Novel + FMV 2023   6         11.49                         67.0                     1\n              Visual Novel + FMV 2024  36          8.99                         80.5                    16\n              Visual Novel + FMV 2025  44          9.99                         88.0                    31\n    Thriller + Walking Simulator  all 146          4.99                         83.0                    27\n    Thriller + Walking Simulator 2023  17          4.99                         84.0                     3\n    Thriller + Walking Simulator 2024  63          3.99                         83.0                    12\n    Thriller + Walking Simulator 2025  66          4.99                         83.0                    12\ncompanions [{'year': 2023, 'companion_promise': False, 'n': 272, 'ge100': 39, 'ge1000': 9, 'median': 12.0, 'developers': 231}, {'year': 2023, 'companion_promise': True, 'n': 4, 'ge100': 1, 'ge1000': 1, 'median': 47.5, 'developers': 4}, {'year': 2024, 'companion_promise': False, 'n': 380, 'ge100': 72, 'ge1000': 9, 'median': 12.0, 'developers': 343}, {'year': 2024, 'companion_promise': True, 'n': 19, 'ge100': 5, 'ge1000': 4, 'median': 39.0, 'developers': 19}, {'year': 2025, 'companion_promise': False, 'n': 650, 'ge100': 117, 'ge1000': 28, 'median': 9.0, 'developers': 619}, {'year': 2025, 'companion_promise': True, 'n': 130, 'ge100': 42, 'ge1000': 16, 'median': 23.0, 'developers': 130}]\n"}
{"chunk_id":"f2375b","wall_time_seconds":0.000001192,"exit_code":0,"original_token_count":249,"output":"{\n  \"passed\": true,\n  \"checks\": {\n    \"source_game_count\": true,\n    \"unique_game_ids\": true,\n    \"dated_release_accounting\": true,\n    \"frozen_discovery_hash\": true,\n    \"discovery_holdout_disjoint\": true,\n    \"baseline_counts\": true,\n    \"all_selected_pair_counts_recomputed\": true,\n    \"yearly_counts_recomputed\": true,\n    \"no_store_asset_downloader\": true,\n    \"steam_network_disabled\": true,\n    \"analysis_scripts_parse\": true\n  },\n  \"scripts_sha256\": {\n    \"prepare.py\": \"a7ee1022db4695017b9d9f527f9106f8290c3ee6695be346e7a59bd8dc124ee8\",\n    \"analyze.py\": \"87ea26f5064306497dc8f8ea4176fc4226f528e1d9e2d6e78c41bb48790766f8\",\n    \"deep_dive.py\": \"3e0f83041fc8c8a31b59721ace1b01804b1f661b601b56c2a88aec7e98e31587\",\n    \"followups.py\": \"6ea899f388e53ac011a75ef0f95eeb9b206ed44c31f2f541b578d6413aa74b1c\",\n    \"charts.py\": \"0f9140fcbce65129cac576579f5085c64592d7619607bbcb714ccd6bb854ca99\",\n    \"validate_analysis.py\": \"4bebc1d5c4bf5062bbbb0e8af4e3ba8e353602a64cd4cdc06bc4fdab637ce1ab\"\n  }\n}\n"}

[Think]

**Reviewing empirical-null controls**

[Think]

**Reviewing empirical-null controls**

[Think]

**Reviewing empirical-null controls**

**Writing methods/results files**

[Think]

**Reviewing empirical-null controls**

**Writing methods/results files**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/analysis-2026-09-05/README.md <<...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"9c390a","wall_time_seconds":0.000002325,"exit_code":0,"original_token_count":0,"output":""}

[Think]

**Checking findings against data**

[Think]

**Checking findings against data**

**Checking cohort selection**

[Think]

**Checking findings against data**

**Checking cohort selection**

[Think]

**Checking findings against data**

**Checking cohort selection**

**Validating analysis outputs**

[Think]

**Checking findings against data**

**Checking cohort selection**

**Validating analysis outputs**

exec ({"code": "const a=await tools.view_image({path:\"/home/adn/a327ex/steam-research/analysis-2026-09-05/price_comparison...)

[
  {
    "type": "text",
    "text": "Script completed\nWall time 0.1 seconds\nOutput:\n"
  },
  {
    "type": "image",
    "note": "[image: shown below]"
  },
  {
    "type": "text",
    "text": "{\"chunk_id\":\"7c7acc\",\"wall_time_seconds\":0.000002686,\"exit_code\":0,\"original_token_count\":58,\"output\":\"Research artifacts saved; validation passed; Steam network collection remains disabled.\\nReport: /home/adn/a327ex/steam-research/analysis-2026-09-05/findings.md\\nMethods: /home/adn/a327ex/steam-research/analysis-2026-09-05/README.md\\n\"}"
  }
]

[Think]

**Checking report claims**

You got stuck writing the response but a side chat told me the findings are already saved.

Yes—the analysis was finished and saved. I got stuck composing the handover. Here are the findings.

The most interesting emerging opportunity was games advertised as companions to another activity. The clearest repeatable statistical cluster was filmed visual novels. Automation/resource-management and inexpensive narrative thrillers also look worth investigating, with some important qualifications.

I used our Steam snapshot only. The main comparison covers 38,494 paid games outside Steam’s explicit-sex content flags, in 2023–2025 release cohorts. Their median is seven reviews; 15.8% have at least 100. That threshold measures response, not profitability. These are current review totals attached to store-reported dates, not historical launch results.

I screened 1,765 eligible tag combinations, selected 30 using the 2023–2024 group, then checked the separate 2025 group. The saved results include combinations that weakened, not just attractive ones.

The larger market contains more games attracting attention, alongside a much larger low-response tail.

In the paid/non-explicit population, today’s catalog contains:

Store-reported cohort Games Currently at 100+ reviews
2019 5,643 1,243
2023 9,771 1,672
2025 15,674 2,277

The 2025 cohort also contains 8,811 games below ten reviews.

So the expansion isn’t entirely unnoticed releases: the absolute number receiving substantial response is larger too. But this cannot establish changing launch odds—older games have accumulated reviews longer, and older delisted games may be missing.

The expansion continues in the current data: the whole catalog contains 17,709 releases dated January–August 2026, versus 12,925 for the equivalent 2025 period.

Broad labels conceal very different situations.

For 2023–2025 games carrying these tags among their top 20:

Tag Games Median reviews At 100+ reviews
Action Roguelike 2,966 9 17.1%
Auto Battler 657 14 22.4%
Roguelike Deckbuilder 412 40.5 36.9%
Incremental 1,865 7 14.2%
Idler 1,455 12 19.0%

Action roguelikes expanded sharply in their share of release cohorts, but the label alone has little advantage over the comparison pool. Roguelike deckbuilders have a much stronger response distribution.

Price changes the interpretation of the cheaper categories. After comparing release-quarter and current entry-price tiers, incrementals have roughly 1.52 times, and idlers 2.06 times, the expected number of games above 100 reviews.

That doesn’t establish a pricing effect. It shows why comparing a $3 game against the entire paid catalog can give a misleading impression of its position.

Desktop/background companions are the most interesting exploratory lead.

The small Desktop Companion tag looked strong, so I broadened the search using actual description promises: productivity or focus tools, Pomodoro timers, or games that occupy a screen corner while someone works or does something else.

Among 2025 idlers:

Description positioning Games At 100+ reviews Median reviews
Companion/work/focus positioning 130 42 — 32.3% 23
Other idlers 650 117 — 18.0% 9

Sixteen of those 130 companions have over 1,000 reviews. Comparing them with non-companion idlers from similar release quarters and price tiers gives about 25 expected games above 100 reviews; 42 are observed. Removing the largest developer or publisher leaves the rate at 31.8%.

The examples are varied:

  • Tiny Pasture: 7,036 reviews.
  • Fantasy Map Simulator: 4,170.
  • Ropuka’s Idle Island: 4,028.
  • Tiny Aquarium: 3,361.
  • Cornerpond: 2,557.

Their descriptions offer animals, evolving worlds, gardening, fishkeeping or fishing as something accompanying another activity.

The useful creative question is: what other ongoing systems would someone enjoy having alongside something else they’re doing? That is more specific than “make an idle game.”

This remains exploratory: I devised the description screen after seeing the initial results. And the positioning is insufficient by itself—Taskbarn and Strange Shores both have 14 reviews despite similar promises.

Filmed visual novels were the clearest repeated cluster.

Requiring both Visual Novel and FMV among the top ten tags gives:

  • 69 of 86 games above 100 reviews: 80.2%.
  • 23 above 1,000 reviews.
  • Median: 360 reviews, across 67 developer groups.
  • 48 of the 86 have both 100+ reviews and at least 80% positive reviews.

The split is unusually consistent: 33/42 in the 2023–2024 group and 36/44 in 2025. Removing the publisher responsible for the most reviews leaves 66/83 above 100. The 2025 result also remains strong in the price comparison.

Several other high-ranked pairs—Dating Sim + FMV, Interactive Fiction + FMV, Immersive Sim + FMV—largely describe this same overlapping cluster. They should count as one finding, not independent confirmations.

The descriptions include romance, relationship choices and palace intrigue. Examples include Love Is All Around at 36,200 reviews, Road to Empress I at 11,768, and Mandate Of Heaven at 5,419. Light of Reversing Destiny, meanwhile, has 60.

There is a localization qualification: 77 of the 86 support Simplified Chinese and 68 support English. That describes the products, not their buyers’ locations, but it makes transferring these results to a different cultural/language market questionable.

It also exposes a taxonomy trap: an aggregate for Immersive Sim includes filmed dating games. It cannot simply be interpreted as demand for a familiar Deus Ex-like design.

Automation/resource-management looks healthy, although the exact combination’s advantage is less robust.

With both tags in the top ten, 49/98 games have 100+ reviews, with a median of 104 across 94 developer groups.

Here the distinction between totals and distributions matters enormously. Satisfactory contributes 78.5% of the group’s total reviews. Yet removing it leaves 48/97 games above 100: 49.5%. Removing the top tenth of games by review count still leaves 44.3% above 100.

There are quite different inexpensive presentations:

Game Current entry price Reviews
Beltmatic $6.99 2,178
Factory Town Idle $4.99 1,231
Widget Inc. $4.99 759
Incredicer $2.99 2,368

Their descriptions describe arithmetic factories, a living spreadsheet, incremental production, and automated dice rolling. That suggests exploring different activities that can support interesting production chains.

But the qualification matters: the 2025 group remains above the broad comparison pool, while its additional advantage over automation alone does not survive that particular price comparison. The evidence supports a healthy family, not a proven benefit from combining two labels. And The Factory Must Grow has only eight reviews.

Inexpensive narrative thrillers also repeat more convincingly than some narrower “formulas.”

Thriller + Walking Simulator has 43/146 games above 100 reviews, a median of 40, and a median current entry price of $4.99.

Its split is 25/80 in 2023–2024 and 18/66 in 2025. The latter remains strong relative to its quarter/price comparison pool. Removing the largest or most prolific publisher barely changes the combined result.

I then tested a tempting narrower idea: ordinary work becoming horror. A description screen for terms such as night shift, security guard, gas station, cashier and data entry did not find a clear 2025 advantage: 9/78 matches exceed 100 reviews, versus 387/2,428 other horror games.

That is a keyword screen, not a verified gameplay classification. But it gives us no reason to elevate that particular formula merely because several memorable examples exist.

Two attractive-looking leads weakened under closer examination.

For Hidden Object + Cats, the newer group has a lower raw rate: 38/113 above 100 in 2023–2024 versus 14/114 in 2025. However, the newer group still looks favorable against its inexpensive price peers. This does not support dismissing cat games wholesale.

Hand-drawn + Cats is the clearer non-repetition: 32/92 versus 2/62, with a weak 2025 price comparison too. Review histories are needed before attributing this to saturation.

Tiny intersections also manufacture apparent empty markets. Horror + Typing, restricted to top-five tags, initially gives three recent games, two above 1,000 reviews. Expanding to the returned top twenty gives 41 games, five above 1,000, and a median of eight. The interesting examples remain interesting; the “two out of three” impression largely came from the narrow definition.

Comparison of selected tag pairs

My next research priorities would be to distinguish the functions advertised by companion games, the kinds of resource-flow decisions promised by smaller automation games, and the subgroups within filmed narrative and inexpensive thrillers. A bounded review-history collection would then help separate early traction from long accumulation.

This pass does not establish production duration or marketing effort, so I’m not treating these as recipes for quick development or effortless discovery.

The full findings, methods and file guide, tag landscape, and all 30 pair comparisons are saved. No further Steam downloads were made.

Unfortunately I am not interested in making incrementals, idlers, or visual novel FMV games. In general I like making build-heavy games, games where you can try lots of builds, essentially. Games with lots of items, characters, equipments, passives, abilities, etc, anything of that sort where there's a lot of possibility for build expression and playing the game in various ways. For that kind of game, what does the market look like? And why did you avoid including 2026 in your previous analysis? Any specific reason? Tell this to me before going off to do the research.

[Think]

**Comparing 2026 cohorts**

[Think]

**Comparing 2026 cohorts**

**Framing build-expression criteria**

[Think]

**Comparing 2026 cohorts**

**Framing build-expression criteria**

Build expression should be the organizing principle of the next analysis. That cuts across genres: action roguelikes, tactical RPGs, deckbuilders, auto battlers, equipment-driven action games, party builders, and other systems where choosing a configuration changes how you play.

My previous pass stayed too close to broad tags. It found markets, but it didn’t directly investigate the particular pleasure you’re describing.

I excluded 2026 from the main outcome comparisons because its games have had much less—and very uneven—time to accumulate reviews. On September 5:

  • Every 2025 release has had at least roughly eight months.
  • A January 2026 release has had eight months.
  • An August release may have had only a few days or weeks.

Putting them together would make newer games look weaker partly because they’re newer. I used 2023–2024 to select patterns and 2025 as a separate comparison group.

I did include 2026 in the January–August supply counts and the exploratory rare-combination searches. But excluding it from the main analysis was a conservative choice, not a requirement. For your question, it would be a mistake to leave the newest developments out entirely.

The next pass should therefore include 2026, separated into comparable release windows. We can compare different kinds of build-heavy games within the same 2026 month or quarter, while keeping very recent releases visibly provisional. What we cannot reconstruct from this snapshot is how many reviews a 2025 game had at the same age as a 2026 game; that requires review histories.

As for what the market currently looks like, the previous results provide some clues:

Broad Steam tag, 2023–2025 cohorts Games At least 100 current reviews
Action Roguelike 2,966 17.1%
Auto Battler 657 22.4%
Roguelike Deckbuilder 412 36.9%

The comparison pool was at 15.8%. But these numbers don’t measure build expression. An action roguelike with barely any meaningful configuration and one with hundreds of interacting items are in the same row. Likewise, a deckbuilder can have a narrow set of viable strategies despite advertising many cards.

So I wouldn’t yet conclude that your preferred kind of game has a weak or strong market. The existing results suggest that its different forms behave differently enough to warrant separating them.

I’d approach the new pass around three distinctions:

  • What the player builds: a character, equipment loadout, deck, party, army, machine, or some combination.
  • How builds become different: item interactions, class combinations, equipment modifiers, skill trees, character compositions, ability changes, and similar mechanisms.
  • When the choices happen: before a run, throughout a run, between encounters, or through persistent progression.

Those distinctions would help answer more useful questions than “are roguelites crowded?” For example: Are equipment/loadout games expanding differently from character-composition games? Do games advertising substantial interactions between items have different outcomes from games advertising large quantities of upgrades? Which forms are appearing more often among the stronger 2026 releases?

The descriptions give us a workable way to identify candidates. I’d look for explicit claims about builds, synergies, distinct playstyles, loadouts, class combinations, and interacting abilities, then inspect representative matches and ambiguous cases. A description saying “200 upgrades” would be weaker evidence than one explaining how equipment choices produce different ways to play.

That would measure advertised build expression, with confidence levels, rather than pretending the text proves that every advertised build is viable or interesting. Incrementals, idlers, and FMV games would be outside the focal analysis; automatic combat alone wouldn’t exclude an auto battler or party-building game.

The target is clear now: understand the market for games whose central appeal is constructing and experimenting with different ways to play, including what is happening in 2026.

Yes, go ahead in your preferred directions.

I’ll map the games that explicitly advertise build expression, then compare their different forms—including 2026 in separate release windows. I’ll check the classifications against the descriptions so that “lots of upgrades” doesn’t automatically count as meaningful build variety.

exec ({"code": "text(await tools.exec_command({cmd:\"ls -la /home/adn/a327ex/steam-research; cat /home/adn/a327ex/steam-res...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"e99d8b","wall_time_seconds":0.00000238,"exit_code":0,"original_token_count":3322,"output":"total 72\ndrwxr-xr-x 1 adn adn   354 Sep  5 18:17 .\ndrwxr-xr-x 1 adn adn   198 Sep  5 16:01 ..\ndrwxr-xr-x 1 adn adn    76 Sep  5 16:28 .venv\ndrwxr-xr-x 1 adn adn  1214 Sep  5 18:15 2026-09-05\n-rw-r--r-- 1 adn adn  8105 Sep  5 18:06 README.md\ndrwxr-xr-x 1 adn adn   252 Sep  5 17:48 __pycache__\ndrwxr-xr-x 1 adn adn  4476 Sep  5 19:03 analysis-2026-09-05\n-rw-r--r-- 1 adn adn 16575 Sep  5 17:44 collect.py\n-rw-r--r-- 1 adn adn  2626 Sep  5 17:51 export.py\n-rw-r--r-- 1 adn adn  3312 Sep  5 17:48 finish_metadata.py\n-rw-r--r-- 1 adn adn  4318 Sep  5 17:58 inventory.py\n-rw-r--r-- 1 adn adn   194 Sep  5 18:00 network_policy.json\n-rw-r--r-- 1 adn adn  6391 Sep  5 17:46 reconcile.py\n-rw-r--r-- 1 adn adn  3561 Sep  5 17:32 repair_aliases.py\n-rw-r--r-- 1 adn adn  3536 Sep  5 16:16 search_check.py\n-rw-r--r-- 1 adn adn  2623 Sep  5 17:34 validate.py\n# First Steam market research pass\n\nSource: the fresh September 5, 2026 Steam snapshot in the adjacent `2026-09-05`\ndirectory. No previous research logs, summaries, marketing blogs, store images or\nexternal game-performance estimates were used for this analysis. Steam network\ncollection remains disabled. The PNG/SVG files here are small statistical charts,\nnot downloaded game images.\n\n## Population and measurements\n\nThe source has 184,664 game apps, including 128,972 marked released. Ninety-three\nreleased records have no usable date and one has a future date; these are retained\nin the source and listed in `release_date_exceptions.csv`, but excluded from dated\ncomparisons. There are 128,878 valid dated released records.\n\nWhole-catalog supply tables retain free and explicit-content games as separate\nsegments. The main comparisons use currently paid games outside Steam's explicit\nsexual-content descriptors 3 and 4, with a valid reported release date. This gives\n38,494 games in the 2023–2025 comparison pool. It is not a manually judged quality\nfilter or an estimate of a particular developer's probability of success.\n\n`original_steam_release_date` takes precedence where supplied, otherwise\n`steam_release_date` is used. Dates remain store-reported, and first exposure can\nbe misstated, particularly for games graduating from Early Access. These are\ncurrent review totals attached to release cohorts, not historical launch outcomes.\nCurrent tags may have been added after success, or adopted more widely over time.\nOlder delisted games may be absent. Consequently the supply tables describe the\nsurviving public catalog, not a complete historical record of releases.\n\nResponse thresholds of 100 and 1,000 use Steam's filtered review count. They are\nconvenient scales, not definitions of financial success, sales estimates or revenue\nestimates. Median and upper-percentile counts, zero/<10 review counts, positivity,\nand concentration are retained alongside threshold rates.\n\nTag prevalence is nonexclusive: a game can belong to multiple groups. The broad\nlandscape uses the returned top 20 tags and checks top-5 specificity. Pair analysis\nrequires both tags among the top 10. Specificity changes can dramatically change\nsample sizes; the rare-pair follow-ups explicitly test broadening to top 20.\n\n## Comparison and selection procedure\n\nFor a group, a release-quarter expected count is the sum of the comparison pool's\n100-review proportion in each member's release quarter. Observed / expected is a\ndescriptive standardization, not a causal or predictive model. Price sensitivity\nuses quarter × current USD entry-price buckets (<=5, 5–10, 10–20, 20–40, >40,\nmissing), falling back to quarter alone where fewer than 40 games form a stratum.\n\nPrices use Steam's best non-bundle, single-game package offer: original/list price\nwhen supplied, otherwise current final price. Offers dependent on another owned\napp are excluded. The earlier minimum-of-all-options approach was corrected\nbecause another option can be an add-on. The correction affected 2,101 records;\n`price_extraction_corrections.csv` preserves the audit. Current prices may be\nresponses to sales and success themselves; this is not a pricing-effect estimate.\n\nPair discovery used 2023–2024 records only. Requirements: >=30 games, >=10 with\n100 reviews, >=30 games in each constituent-only comparison, and overlap with the\nsmaller constituent <85%. Broad/admin/evaluative exclusions are recorded in\n`analysis_specification.json`. A smoothed ratio against the stronger constituent-\nonly group ranks candidates. The 30 selected pairs were saved before inspecting\ntheir 2025 comparison results. The frozen selection's hash was checked after the\nprice and creator-identity corrections and did not change.\n\nThe 2025 comparison is a separate set of games in this snapshot, not a real-time\nforecasting backtest. All 30 results are published, including weak ones. Tag pairs\noverlap heavily; multiple FMV combinations are one related cluster, not independent\nreplications. These screens are exploratory; none establishes a causal advantage.\nWilson intervals in the chart are illustrative binomial intervals, not a correction\nfor selection, publisher clustering, or all the other limits above.\n\nDeveloper/publisher grouping uses reported clan IDs, with normalized-name fallback.\nA missing clan key is filled only when that normalized name maps to exactly one\nobserved clan within the role. Ambiguous names remain unresolved. These identities\nare not a verified map of corporate ownership. Largest-review and most-prolific\ncreator removals are separate sensitivity checks.\n\n## Follow-ups\n\nDescription-based companion/productivity and job-horror queries were devised after\nreading the initial results. They are explicitly exploratory and have no untouched\nvalidation sample. The exact regular expressions, counts, group members and\ncounterexamples are saved. Supported languages describe product localization, not\nbuyer location. No game was played to verify claims in its store description.\n\n`followups.json` includes a 2025 companion-vs-other-idler comparison using release\nquarter and price, with a minimum of 20 peers before falling back to quarter.\n\n## Outputs\n\n- `yearly.csv`, `january_august.csv`: catalog cohorts and response distributions.\n- `tag_landscape.csv`: supply share, response, specificity and concentration.\n- `pair_discovery_all.csv`: 1,765 eligible pair candidates.\n- `pair_discovery_selected_before_holdout.csv`: frozen top-30 selection.\n- `pair_holdout_results.csv`: all 2025 comparisons, including price sensitivity.\n- `pair_*_games.csv`, `group_*_games.csv` / `group_*.csv`: underlying titles.\n- `deep_groups.csv` / `.json`: rank, cohort, positivity and creator-removal checks.\n- `rare_pairs_exploratory.csv`, `rare_broad_*.csv`, `followups.json`: small-sample\n  leads, broader definitions and rejected explanations.\n- `idler_companion_exploratory.csv`, `job_horror_exploratory.csv`: text matches.\n- `price_comparison.png/svg`, `pair_comparison.png/svg`: inspected data charts.\n- `validation.json`: successful independent count and selection checks.\n- `findings.md`: the substantive interpretation, also delivered in chat.\n\nRun, in order, with `../.venv/bin/python`: `prepare.py`, `analyze.py`,\n`deep_dive.py`, `followups.py`, `charts.py`, `validate_analysis.py`.\nThe frozen-selection hash records this first pass; a future dataset or changed\nresearch specification should use a new analysis directory.\nfrom pathlib import Path\nimport datetime as dt, json, re, unicodedata\nimport pandas as pd\nimport pyarrow.parquet as pq\n\nBASE=Path(__file__).resolve().parent\nSOURCE=BASE.parent/'2026-09-05/exports'\n\ndef key(creator,appid):\n    if creator.get('creator_clan_account_id'):return 'clan:'+str(creator['creator_clan_account_id'])\n    name=unicodedata.normalize('NFKC',creator.get('name','')).casefold().strip()\n    name=re.sub(r'\\s+',' ',name)\n    return 'name:'+name if name else 'unknown:'+str(appid)\n\ndef clean(text):\n    text=re.sub(r'\\[img[^\\]]*\\].*?\\[/img\\]',' ',text,flags=re.S|re.I)\n    text=re.sub(r'\\[[^\\]]*\\]',' ',text)\n    text=re.sub(r'https?://\\S+',' ',text)\n    return re.sub(r'\\s+',' ',text).strip()\n\nrows=[]\nfor batch in pq.ParquetFile(SOURCE/'games.parquet').iter_batches(batch_size=4096):\n    for g in batch.to_pylist():\n        data=json.loads(g.pop('data_json'));basic=data.get('basic_info',{});release=data.get('release',{})\n        devs=basic.get('developers',[]);pubs=basic.get('publishers',[])\n        developer=next((c for c in devs if c.get('name')),{});publisher=next((c for c in pubs if c.get('name')),{})\n        g.update(developer=developer.get('name',''),publisher=publisher.get('name',''),developer_key=key(developer,g['appid']),publisher_key=key(publisher,g['appid']))\n        o=data.get('best_purchase_option',{})\n        g['usd_list_price']=None\n        if g['source_country']=='US' and o.get('packageid') and not o.get('bundleid') and o.get('included_game_count',1)<=1 and not o.get('free_with_master_sub_appid'):\n            price=o.get('original_price_in_cents',o.get('final_price_in_cents'))\n            if price is not None and int(price)>0:g['usd_list_price']=int(price)/100\n        g['adult_explicit']=bool(set(data.get('content_descriptorids',[]))&{3,4})\n        g['steam_date']=g['steam_release_date']\n        first=g['original_steam_release_date']\n        g['first_date']=first if first and first>0 else g['steam_release_date']\n        g['known_ea_history']=bool(g['is_early_access'] or g['original_steam_release_date'] or g['release_from_early_access_date'])\n        g['description']=clean(data.get('full_description_bbcode',''))\n        g['short_description']=g['short_description'] or ''\n        g['english_support']=any(x.get('elanguage')==0 and x.get('supported') for x in data.get('supported_languages',[]))\n        g['schinese_support']=any(x.get('elanguage')==6 and x.get('supported') for x in data.get('supported_languages',[]))\n        g['languages_count']=sum(bool(x.get('supported')) for x in data.get('supported_languages',[]))\n        g['demo_related']=bool(data.get('related_items',{}).get('demos') or data.get('related_items',{}).get('standalone_demos'))\n        g['windows']=data.get('platforms',{}).get('windows',False)\n        g['native_linux']=data.get('platforms',{}).get('steamos_linux',False)\n        g['deck_code']=data.get('platforms',{}).get('steam_deck_compat_category')\n        g['store_url']='https://store.steampowered.com/app/'+str(g['appid'])+'/'\n        rows.append(g)\n    print('prepared',len(rows),flush=True)\ngames=pd.DataFrame(rows)\n# Fill missing clan identities only when the normalized name maps to exactly one\n# observed clan in the same role; ambiguous names remain unresolved.\nfor role in ['developer','publisher']:\n    norm=games[role].fillna('').map(lambda x:re.sub(r'\\s+',' ',unicodedata.normalize('NFKC',x).casefold()).strip())\n    names={}\n    for name,k in zip(norm,games[role+'_key']):\n        if name and k.startswith('clan:'):names.setdefault(name,set()).add(k)\n    mapping={name:next(iter(keys)) for name,keys in names.items() if len(keys)==1}\n    games[role+'_key']=[mapping.get(name,k) if k.startswith('name:') else k for name,k in zip(norm,games[role+'_key'])]\nfor field in ['first_date','steam_date']:\n    games[field]=pd.to_datetime(games[field].where(games[field]>0),unit='s',utc=True,errors='coerce')\ngames['year']=games.first_date.dt.year.astype('Int64')\ngames['quarter']=games.first_date.dt.strftime('%Y-Q')+games.first_date.dt.quarter.astype('Int64').astype(str)\ngames['month']=games.first_date.dt.month.astype('Int64')\ngames['reviews']=games.reviews_filtered_count.astype('int64')\ngames['positive_pct']=games.reviews_filtered_positive_percent\ngames['valid_released']=(games.is_coming_soon==0)&games.first_date.notna()&(games.first_date<pd.Timestamp('2026-09-06',tz='UTC'))\ngames['price_bucket']=pd.cut(games.usd_list_price,[-.01,5,10,20,40,float('inf')],labels=['<=5','5-10','10-20','20-40','>40']).astype(str)\ngames['main']=games.valid_released&(games.is_free==0)&~games.adult_explicit\nassert len(games)==184664 and games.appid.nunique()==184664\nassert games.reviews.min()>=0\ngames.to_parquet(BASE/'games.parquet',index=False)\ntags=pd.read_parquet(SOURCE/'game_tags.parquet');tags=tags[tags.appid.isin(games.appid)]\nnames=pd.read_parquet(SOURCE/'tag_names.parquet');tags=tags.merge(names.rename(columns={'name':'tag'}),on='tagid',validate='many_to_one')\ntags.to_parquet(BASE/'tags.parquet',index=False)\naudit={'all_games':len(games),'released_flag':int((games.is_coming_soon==0).sum()),'valid_dated_released':int(games.valid_released.sum()),'released_no_date':int(((games.is_coming_soon==0)&games.first_date.isna()).sum()),'released_future_date':int(((games.is_coming_soon==0)&(games.first_date>=pd.Timestamp('2026-09-06',tz='UTC'))).sum()),'main_paid_nonexplicit_valid':int(games.main.sum()),'original_steam_dates_used':int(games.original_steam_release_date.notna().sum())}\n(BASE/'preparation_audit.json').write_text(json.dumps(audit,indent=2))\nprint(json.dumps(audit,indent=2))\ngames[(games.is_coming_soon==0)&~games.valid_released][['appid','name','first_date','steam_date','reviews']].to_csv(BASE/'release_date_exceptions.csv',index=False)\n{\n  \"network_paused\": true,\n  \"metadata_min_interval_seconds\": 2.0,\n  \"stop_on_http_429\": true,\n  \"reason\": \"Metadata snapshot finished. Network collection closed; no media downloader exists.\"\n}"}
{"chunk_id":"e1b292","wall_time_seconds":1.001423718,"session_id":2275,"original_token_count":0,"output":""}

[Think]

**Refining classifier criteria**

[Think]

**Refining classifier criteria**

[Think]

**Refining classifier criteria**

**Testing build-detection rules**

[Think]

**Refining classifier criteria**

**Testing build-detection rules**

[Think]

**Refining classifier criteria**

**Testing build-detection rules**

**Preparing blind audit sample**

[Think]

**Refining classifier criteria**

**Testing build-detection rules**

**Preparing blind audit sample**

[Think]

**Refining classifier criteria**

**Testing build-detection rules**

**Preparing blind audit sample**

**Defining build-form axes**

exec ({"code": "text(await tools.write_stdin({session_id:2275,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":900})...)

Script completed
Wall time 3.4 seconds
Output:

{"chunk_id":"19da72","wall_time_seconds":0.000001952,"exit_code":0,"original_token_count":29,"output":"rows 184664 main 102394\nsynerg 5015 1702\nbuilds 5470 1838\nloadout 2176 625\nplaystyle 6883 2280\nskill tree 2047 665\n"}
{"chunk_id":"979dec","wall_time_seconds":3.222752754,"exit_code":0,"original_token_count":1165,"output":"{\"name\": \"Brotato\", \"appid\": 1942280, \"year\": 2022, \"top5\": [\"Roguelike\", \"Singleplayer\", \"Bullet Hell\", \"Action Roguelike\", \"Local Co-Op\"], \"short\": \"Brotato is a top-down arena shooter roguelite where you play a potato wielding up to 6 weapons at a time to fight off hordes of aliens. Choose from a variety of traits and items to create unique builds and survive until help arrives.\"}\n{\"name\": \"Slay the Spire\", \"appid\": 646570, \"year\": 2017, \"top5\": [\"Roguelike Deckbuilder\", \"Card Game\", \"Card Battler\", \"Roguelike\", \"Deckbuilding\"], \"short\": \"We fused card games and roguelikes together to make the best single player deckbuilder we could. Craft a unique deck, encounter bizarre creatures, discover relics of immense power, and Slay the Spire!\"}\n{\"name\": \"Backpack Battles\", \"appid\": 2427700, \"year\": 2024, \"top5\": [\"Auto Battler\", \"Inventory Management\", \"Strategy\", \"PvP\", \"Roguelike Deckbuilder\"], \"short\": \"A PvP inventory management auto battler! Buy and craft powerful items, then carefully arrange them in your backpack.\"}\n{\"name\": \"Nova Drift\", \"appid\": 858210, \"year\": 2019, \"top5\": [\"Action Roguelike\", \"Arena Shooter\", \"Bullet Hell\", \"Shoot 'Em Up\", \"Roguelite\"], \"short\": \"Nova Drift distills the mechanical depth and strategy of an ARPG into classic arcade space combat. Control an endlessly evolving bio-mechanical ship, face legions of strange and deadly foes, and ride the wake of a dying star across the void.\"}\n{\"name\": \"Path of Exile\", \"appid\": 238960, \"year\": 2013, \"top5\": [\"Free to Play\", \"Action RPG\", \"Dark Fantasy\", \"Hack and Slash\", \"Loot\"], \"short\": \"You are an Exile, struggling to survive on the dark continent of Wraeclast, as you fight to earn power that will allow you to exact your revenge against those who wronged you. Path of Exile is an online Action RPG set in a dark fantasy world. The game is completely free and will never be pay-to-win.\"}\n{\"name\": \"Chronicon\", \"appid\": 375480, \"year\": 2020, \"top5\": [\"Loot\", \"Action RPG\", \"Hack and Slash\", \"Dungeon Crawler\", \"Pixel Graphics\"], \"short\": \"Use the magical device known as the Chronicon to travel into the souls and memories of fallen heroes to re-live their grand tales! Epic adventures full of loot and monsters await!\"}\n{\"name\": \"SNKRX\", \"appid\": 915310, \"year\": 2021, \"top5\": [\"Action Roguelike\", \"Roguelite\", \"Arena Shooter\", \"Top-Down Shooter\", \"Shoot 'Em Up\"], \"short\": \"SNKRX is an arcade shooter roguelite where you control a snake of heroes that automatically attack nearby enemies. Combine different heroes to unlock class bonuses and create unique builds, and steer your unstoppable party as they ravage through endless waves of enemies.\"}\n{\"name\": \"Tiny Rogues\", \"appid\": 2088570, \"year\": 2022, \"top5\": [\"Action Roguelike\", \"Bullet Hell\", \"Replay Value\", \"Top-Down Shooter\", \"Difficult\"], \"short\": \"Tiny Rogues is a challenging fantasy rogue-lite bullet-hell dungeon crawler with rpg elements. Build a new unique character each run and fight one monster-infested room after another! Discover unique weapons, collect magical items and level up to become more and more powerful!\"}\n{\"name\": \"Halls of Torment\", \"appid\": 2218750, \"year\": 2023, \"top5\": [\"Action Roguelike\", \"Roguelite\", \"Bullet Hell\", \"Pixel Graphics\", \"Dark Fantasy\"], \"short\": \"Slay hordes of terrifying monsters in this horde survival roguelite.\\r\\nDescend into the Halls of Torment where the Lords of the underworld await you.\\r\\nTreasures, magical trinkets, and a growing cast of heroes will grant you the power\\r\\nto vanquish these horrors from beyond. How long can you survive?\"}\n{\"name\": \"BALL x PIT\", \"appid\": 2062430, \"year\": 2025, \"top5\": [\"Action\", \"Roguelite\", \"Arcade\", \"Roguelike\", \"Bullet Hell\"], \"short\": \"BALL x PIT is a brick-breaking, ball-fusing, base-building survival roguelite. Batter hordes of enemies with ricocheting balls and gather the riches of the pit to expand your homestead, generate resources and recruit unique heroes.\"}\n{\"name\": \"Megabonk\", \"appid\": 3405340, \"year\": 2025, \"top5\": [\"Bullet Heaven\", \"Action Roguelike\", \"Roguelike\", \"Roguelite\", \"Indie\"], \"short\": \"Smash your way through endless waves of enemies and grow absurdly powerful! Grab loot, level up, unlock characters and upgrade to create unique and crazy builds as you fend off hordes of creatures!\"}\n{\"name\": \"Monster Train 2\", \"appid\": 2742830, \"year\": 2025, \"top5\": [\"Roguelike Deckbuilder\", \"Card Game\", \"Roguelike\", \"Deckbuilding\", \"Turn-Based Strategy\"], \"short\": \"Monster Train returns with all new clans, new enemy factions, new challenges, new modes and more! Defend your Pyre in the classic three-tiered, vertical gameplay that made the original roguelike deckbuilder a hit.\"}\n"}

[Think]

**Preparing compiled regex patterns**

[Think]

**Preparing compiled regex patterns**

**Refining build-detection rules**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/build-expression-2026-09-05/clas...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"3abe66","wall_time_seconds":1.001208345,"session_id":33080,"original_token_count":0,"output":""}

[Think]

**Prefiltering candidate articles**

[Think]

**Prefiltering candidate articles**

**Refining build-expression criteria**

[Think]

**Prefiltering candidate articles**

**Refining build-expression criteria**

[Think]

**Prefiltering candidate articles**

**Refining build-expression criteria**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -3 /home/adn/a327ex/steam-research/build-expression-2026-09-05/cl...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"0181bc","wall_time_seconds":0.000002788,"exit_code":0,"original_token_count":49,"output":"    PID %CPU   RSS     ELAPSED COMMAND\n2736413  100 1531680     02:48 /home/adn/a327ex/steam-research/.venv/bin/python -u /home/adn/a327ex/steam-research/build-expression-2026-09-05/classify.py\n"}

[Think]

**Preparing broad candidate prefilter**

[Think]

**Preparing broad candidate prefilter**

[Think]

**Preparing broad candidate prefilter**

**Preparing classification prefilter**

[Think]

**Preparing broad candidate prefilter**

**Preparing classification prefilter**

[Think]

**Preparing broad candidate prefilter**

**Preparing classification prefilter**

**Refining build-rule criteria**

[Think]

**Preparing broad candidate prefilter**

**Preparing classification prefilter**

**Refining build-rule criteria**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -2 /home/adn/a327ex/steam-research/build-expression-2026-09-05/cl...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"42905a","wall_time_seconds":0.000002204,"exit_code":1,"original_token_count":212,"output":"{\"appid\": 4016670, \"name\": \"That Summer - Hannah's Summer Vacation\", \"year\": 2026, \"short_description\": \"In a quiet, somewhat remote town, Hannah lives with her father and younger brother. Eventually the summer break comes, and with it the question: \\\"How to spend the last summer before her senior year in high school?\\\" \", \"audit_stratum\": \"candidate_unconfirmed\", \"evidence\": {}}\n{\"appid\": 2058850, \"name\": \"Traveler's Game\", \"year\": 2023, \"short_description\": \"Your name is Camus Chen. Because of a recommendation from your friend Lu, you downloaded a battle simulator game famous for its sociability. You meet strangers and learn about their lives by simply chatting with them online. Unexpectedly, you will reveal a big secret of yourself...\", \"audit_stratum\": \"candidate_unconfirmed\", \"evidence\": {}}\n    PID %CPU   RSS     ELAPSED COMMAND\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport json\nr=Path('/ho...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"55a392","wall_time_seconds":0.000002613,"exit_code":0,"original_token_count":9027,"output":"Warning: truncated output (original token count: 9027)\nTotal output lines: 72\n\n)\\\\b.{0,80}\\\\b(?:arrang\\\\w*|position\\\\w*|adjacen\\\\w*)\\\\b\"\n  },\n  \"counts\": {\n    \"strict\": 14473,\n    \"inclusive\": 17300,\n    \"candidate\": 65969\n  }\n}\n{\"id\": 4312890, \"name\": \"DeadEye: A Roguelike Shooter\", \"stratum\": \"strict\", \"short\": \"Stop time and master your revolver in this intense 2D roguelike shooter. Face relentless hordes, defeat brutal bosses, forge powerful pacts, and collect artifacts and pets as you fight to survive.\", \"evidence\": {\"combination\": \"ives to earn rewards and confront increasingly challenging bosses. 93 artifacts and upgrades: unlock and combine 93 artifacts of varying rarities, including cursed artifacts that grant powerful benefits at a cost\", \"playstyle\": \"rsed artifacts that grant powerful benefits at a cost. Choose from 11 traits (critical hits, pact upgrades, status effects, bullet effects…) to customize your playstyle. Pact system: choose from 6 pacts and evolve each one into offensive, defensive, versatile, or neut\"}}\n{\"id\": 3977090, \"name\": \"Brighter Days\", \"stratum\": \"strict\", \"short\": \"Fight difficult enemies, explore dangerous locations, and gain strength in this hand crafted world to defeat the evil that lays waste to these Scarred Lands.\", \"evidence\": {\"explicit_build\": \"at does high damage or provides a buff in differing ways to give more unique build opportunities. Upgrades Upgrade using voltage taken from the death of enemies or finding voltage it\"}}\n{\"id\": 3605370, \"name\": \"The Last Fortress\", \"stratum\": \"strict\", \"short\": \"Simple strategy game in which you must build and expand your kingdom while defending it from waves of enemies. You will be able to recruit allies and raise defenses, while adversaries become more numerous and e\", \"evidence\": {\"explicit_build\": \"cumulation and fortifying your defenses, essential for your survival. Diverse Constructions Build and upgrade over 15 types of structures, each designed with specific functions that provide you wit\", \"playstyle\": \"l of surprises. Character Customization Choose from a wide variety of weapons, each with unique attributes, and select the mount that best complements your playstyle to craft lethal, personalized strategies. Dynamic Gameplay Confront increasingly challenging waves \"}}\n{\"id\": 1183530, \"name\": \"Go Fight Fantastic\", \"stratum\": \"strict\", \"short\": \"Bird Planet is under attack! Team up in co-op (local and online) or fight the invaders solo in this fast-paced, light-hearted and vibrantly hand-drawn hack n’ slash for 1-3 players.\", \"evidence\": {\"combination\": \"ocally Explore the beautiful, hand-drawn vibrant world of Bird Planet Combine heroes' attacks into devastating combos Use Meteorites Upgrades to boost your stats and change the effects\", \"playstyle\": \" the more challenging it gets. Build Your Crew Play as four different characters, each representing their own playstyle, and tailor them with persistent Meteorite upgrades found throughout the game. Want a Healer who ca\"}}\n{\"id\": 1701520, \"name\": \"Afterimage\", \"stratum\": \"strict\", \"short\": \"Afterimage is a hand-drawn 2D action adventure that emphasizes fast-paced combat with diversified character builds, non-linear levels, and a gripping story set in the ruins of a fantasy world.\", \"evidence\": {\"explicit_build\": \"rimage is a hand-drawn 2D action adventure that emphasizes fast-paced combat with diversified character builds, non-linear levels, and a gripping story set in the ruins of a fantasy world. A great deity created\"}}\n{\"id\": 2009620, \"name\": \"Harvest Hunt\", \"stratum\": \"strict\", \"short\": \"You are the Warden. Enter the dense cornfields and gather the resources your village desperately needs. But beware: you are not alone. Build a deck of abilities and choose your weapons to face the growing dange\", \"evidence\": {\"explicit_build\": \"ources your village desperately needs. But beware: you are not alone. Build a deck of abilities and choose your weapons to face the growing dangers of the night. With a relentless monster after you, will you make it out\", \"playstyle\": \" weapons and abilities for your Warden and village and build your own deck to suit your needs. Will you sacrifice your own health to equip them? Choose your playstyle and survive. An aristocrat far removed from wealth and ease, a priest left armed with his sacred ve\", \"deck\": \"ources your village desperately needs. But beware: you are not alone. Build a deck of abilities and choose your weapons to face the growing dangers of the night. With a relentless mo\"}}\n{\"id\": 3988410, \"name\": \"Phantom Tower\", \"stratum\": \"strict\", \"short\": \"Phantom Tower is an Action RPG inspired by the hack and slash genre. Explore an immense tower that hides treasures and dangers: slay monsters, forge your equipment, and grow stronger.\", \"evidence\": {\"combination\": \"reasingly dangerous enemies. Discover the Tower's Blessings, powerful abilities hidden across its floors, and create the perfect combination to adapt to challenges and defeat ever stronger opponents Phantom Tower features two game modes: In\"}}\n{\"id\": 4829710, \"name\": \"Castleborne Survivors\", \"stratum\": \"strict\", \"short\": \"A survivors-like game with side-scrolling action combat.\\r\\nSlash, dodge, and mow down endless monsters in a gothic horror castle. Upgrade with every choice, snowball out of control, and survive until the very en\", \"evidence\": {\"explicit_build\": \"perience. Move, reposition, and dodge your way through the swarm — or build a weapon setup so powerful that enemies are wiped out before they can even reach you. Gather coins in each r\"}}\n{\"id\": 2726870, \"name\": \"Loopstructor\", \"stratum\": \"strict\", \"short\": \"This is a strategy game that combines tower defense with Roguelike. Unlike traditional tower defense game, the towers in the game are vehicles that move along ‘loops’.You need to create defense loop and build b\", \"evidence\": {\"explicit_build\": \"move forward to randomly acquire a wide variety of items, and finally build their own genre system. Vehicles and Synergies, Super Modules and Immediate Orders, random combinations will produce countless wonderful chemical \", \"combination\": \"t monsters as they move forward to randomly acquire a wide variety of items, and finally build their own genre system. Vehicles and Synergies, Super Modules and Immediate Orders, random combinations will produce countless wonderful chemical \", \"machine\": \"and swear to guard the base until the last drop of blood! You need to design tracks and allocate vehicles according to the random monster nests generated in each level to deal with the threat of monsters. \"}}\n{\"id\": 2462090, \"name\": \"Star Knight: Order of the Vortex\", \"stratum\": \"strict\", \"short\": \"Star Knight: Order of the Vortex is a rogue-lite, bullet-hell, shoot-em-up with the ability to create unique builds and synergies as you test your skills in action-packed gameplay. Choose your crew, upgrade you\", \"evidence\": {\"explicit_build\": \" is a rogue-lite, bullet-hell, shoot-em-up with the ability to create unique builds and synergies as you test your skills in action-packed gameplay. Choose your crew, upgrade your shi\", \"combination\": \"rder of the Vortex is a rogue-lite, bullet-hell, shoot-em-up with the ability to create unique builds and synergies as you test your skills in action-packed gameplay. Choose your crew, upgrade your ship, and explore\", \"machine\": \"ight of the order, make use of their resources to create the ultimate build. Unlock new ships, each with their own strengths and weaknesses Choose from an assortment of unlockable crew members \"}}\n{\"id\": 3976140, \"name\": \"Spells & Shells\", \"stratum\": \"strict\", \"short\": \"Dodge and blast through waves of enemies using powerful spells and magical weaponry in this fast-paced twin-stick arena shooter. Acquire permanent enhancements, unlock new weapons and relics and create unique b\", \"evidence\": {\"explicit_build\": \"uire permanent enhancements, unlock new weapons and relics and create unique builds to survive overwhelming odds. Master the Art of Magical Combat Spells & Shells is a fast-paced fant\", \"combination\": \"fire, ice, and lightning. Stack elemental effects, lean into a single weapon type, or build around synergies that reward experimentation. Every run gives you different tools and new decisions to make. Evolve \"}}\n{\"id\": 4252700, \"name\": \"Archon Soul\", \"stratum\": \"strict\", \"short\": \"Archon Soul is a 2D roguelike dice-builder where you create powerful dice using swappable faces, runes, and bodies with unique effects. ​Draft spells, craft powerful synergies, defeat challenging enemies, and c\", \"evidence\": {\"combination\": \"ke dice-builder where you create powerful dice using swappable faces, runes, and bodies with unique effects. ​Draft spells, craft powerful synergies, defeat challenging enemies, and conquer the Archon's palace. Archon Soul is a 2D roguelike dice-bu\", \"playstyle\": \"egic roguelike gameplay 4 playable characters to choose from Over 200 spells 40 dice runes and over 30 dice bodies Dozens of unique enemies to challenge your play style Beautiful illustrated artwork by Anais Lehoux and Natalya Samutina Soundtrack by Ofelia Argiro\"}}\n{\"id\": 3873560, \"name\": \"GIVE ME A WEAPON!\", \"stratum\": \"strict\", \"short\": \"An auto-battler roguelike where you craft weapons by combining materials. Test your luck in the auto-battler style random shop. Build a stronger army with Artifacts, Heroes, and shop editing. Last blacksmith of\", \"evidence\": {\"combination\": \"An auto-battler roguelike where you craft weapons by combining materials. Test your luck in the auto-battler style random shop. Build a stronger army with Artifac\", \"deck\": \" combat of an auto-battler, the unpredictable strategy of a roguelike deck-builder, and the satisfying fun of crafting weapons by combining materials. Use 'Ember', the resource gaine\"}}\n{\"id\": 3548520, \"name\": \"DOG WITCH\", \"stratum\": \"strict\", \"short\": \"Dog Witch is a roguelike deckbuilder where your spells are fueled by enchanted dice. Combine over 150 unique items to forge ever-evolving strategies, perfect synergy combos, summon minions, and tackle an endles\", \"evidence\": {\"combination\": \"Dog Witch is a roguelike deckbuilder where your spells are fueled by enchanted dice. Combine over 150 unique items to forge ever-evolving strategies, perfect synergy combos, summon minions, an\", \"deck\": \"Dog Witch is a roguelike deckbuilder where your spells are fueled by enchanted dice. Combine over 150 unique items to forge ever-evolvin\"}}\n{\"id\": 5011110, \"name\": \"Les Bones\", \"stratum\": \"strict\", \"short\": \"Auto-fire your way through a 20-stage descent as Les Bones, a necromancer with a grudge. Draft 10 weapons and their evolutions, dodge 10 telegraphed bosses, and snowball one build into an apocalypse. Die, bank \", \"evidence\": {\"explicit_build\": \"ullet-heaven combat — auto-fire weapons, you own the movement. - Deep build variety — 10 weapons × evolutions × 10 passives, no two runs alike. - Two difficulty modes — Normal and Har\"}}\n{\"id\": 3941030, \"name\": \"SOLARFLARE\", \"stratum\": \"strict\", \"short\": \"SOLARFLARE is a byte-sized roguelike auto-battler in a sci-fi dystopia. Fight (and die) to unlock Upgrades, experiment to find broken builds, and obliterate the megacorp's bots.\", \"evidence\": {\"explicit_build\": \"i-fi dystopia. Fight (and die) to unlock Upgrades, experiment to find broken builds, and obliterate the megacorp's bots. SOLARFLARE is a byte-sized roguelike auto-battler set in a sci\", \"combination\": \" down and impaling them on your spikes, or using EMP to disrupt their weapons (and also your weapon). Each Upgrade is weak in isolation, but combines explosively with other Upgrades you unlock. Choose wisely, scale wildly, and destroy your enemies i\"}}\n{\"id\": 2461840, \"name\": \"Defenders of the Omniverse\", \"stratum\": \"strict\", \"short\": \"DotO is a reverse bullet hell game with 80’s cartoon vibes. Play as heroes from across the Omniverse, battling the Dark Wizard Umbros’ hordes. Face epic bosses, collect powerful weapons, and create your ultimat\", \"evidence\": {\"explicit_build\": \"e, battling the Dark Wizard Umbros’ hordes. Face epic bosses, collect powerful weapons, and create your ultimate build in vibrant, hand-crafted levels! Defenders of the Omniverse is a reverse bullet hell/survivors game\"}}\n{\"id\": 4138190, \"name\": \"One Tower Defense\", \"stratum\": \"strict\", \"short\": \"One Tower Defense is a Roguelike Tower Defense game where you control a single tower. Gather resources, buy weapons and upgrades, and fight endless waves of enemies. Play in single-player mode or in multiplayer\", \"evidence\": {\"combination\": \"paths You can customize your playstyle by selecting from a variety of weapon classes, rarities, and synergies. Classes: Force, Fire, Ice, Field, Pulse, Toxic, Gem Rarities: Base, Enhanced, Advanced, Elite, Myt\", \"playstyle\": \"rgies that define your gameplay. Upgrade paths You can customize your playstyle by selecting from a variety of weapon classes, rarities, and synergies. Classes: Force, Fire, Ice, Field, Pulse, Toxic, Gem Rarities: Base, Enhanced, Advanced, Elite, Mythical Unl\"}}\n{\"id\": 3613730, \"name\": \"Drone Wars\", \"stratum\": \"strict\", \"short\": \"Pilot armed drones in immersive FPV, coordinate tactical assaults, and conquer dynamic vertical arenas in this fast‑paced eSports FPS.\", \"evidence\": {\"playstyle\": \"nkers with environmental traps and multi‑level pathways. Customizable Loadouts & Progression – Unlock weapons, gadgets, and skins as you climb the ranks. Integrated Spectator & Replay – Dynamic camera tools, slow‑motio\"}}\n{\"id\": 4252910, \"name\": \"Eternal Price: Whispers of Mystery\", \"stratum\": \"strict\", \"short\": \"This is an ink-style roguelike cultivation Cthulhu game. You will choose different characters to fight in a mutated world, combine various skills and magical treasures to strengthen yourself, unlock the story, \", \"evidence\": {\"combination\": \"k-style roguelike cultivation Cthulhu game. You will choose different characters to fight in a mutated world, combine various skills and magical treasures to strengthen yourself, unlock the story, survive in secret re\"}}\n{\"id\": 3194600, \"name\": \"Disaster Blaster\", \"stratum\": \"strict\", \"short\": \"Disaster Blaster is a roguelite automation card game where you play a questionably sane scientist building the most over-the-top weapon in the universe. Design your blaster’s shooting mechanism and let it rip a\", \"evidence\": {\"explicit_build\": \" run. Perfect for setting up devastating combos right from the start! Build your blaster... Add and swap cards in your weapon as their effects are applied in sequence to the next shot. Boost the damage, increase shooting spee\", \"combination\": \"s, harnessing their powers for even more dynamic gameplay. Unlock new cards Unlock dozens of new cards for your weapon and combine them with alien abilities to maximize your offensive potential and create crazy synergies. Fast-pac\"}}\n{\"id\": 2084450, \"name\": \"DIRECT CONTACT\", \"stratum\": \"strict\", \"short\": \"Direct Contact delivers an authentic and immersive first-person, Co-Op tactical experience, built for those who demand realism, strategy, and precision. Operate as Special Forces, utilizing a vast arsenal of re\", \"evidence\": {\"combination\": \"ell, meaning your squad must secure the area to recover your loadout. Interactive Weapon Customization Workbench Modify your firearms with absolute precision at a dedicated interactive wor\", \"playstyle\": \"ere you fell, meaning your squad must secure the area to recover your loadout. Interactive Weapon Customization Workbench Modify your firearms with absolute precision at a dedicated interactive wor\", \"party\": \"C Operator, or Sniper . Once a role is locked, it enforces a balanced team composition for the mission. Helicopter Insertion: Board the HQ Helicopter with your squad, access the holograp\"}}\n{\"id\": 2614280, \"name\": \"Fallen Down\", \"stratum\": \"strict\", \"short\": \"Face the gods and their creations.  A visual novel and challenging turn-based tactics game.\", \"evidence\": {\"combination\": \"ight in turn based strategy combat across 50 handcrafted battles. Use cards, passives, and tactics to win. Learn what characters synergize well with each other. Match characters and cards together to get massive results. EXPANSIVE INVENTO\", \"party\": \"dcrafted battles. Use cards, passives, and tactics to win. Learn what characters synergize well with each other. Match characters and cards together to get massive results. EXPANSIVE INVENTO\"}}\n{\"id\": 2711490, \"name\": \"Commando\", \"stratum\": \"strict\", \"short\": \"Commando is a multi-player third-person shooter with a fun, toony, style; a class and team based dynamic; powerful and varied abilities and equipment; and an array of vehicles. Choose your class, choose your lo\", \"evidence\": {\"playstyle\": \"un, toony, style; a class and team based dynamic; powerful and varied abilities and equipment; and an array of vehicles. Choose your class, choose your loadout, go to battle and fight for control of objectives to win the war! \"}}\n{\"id\": 4729480, \"name\": \"Last Ember\", \"stratum\": \"strict\", \"short\": \"We fused deckbuilding and roguelikes into the ultimate single-player experience. Build a unique deck, summon dinosaurs to crush your enemies, and discover powerful relics to protect the Las…427 tokens truncated… this terrifying room.\", \"evidence\": {\"combination\": \"ynamic functionality • Doors, drawers, pull rods, valves, and movable interactions • Type (mouse, animation, lock, jam) More items (keyboard locks, door card locks, padlocks) More features Zombies (sleep, wander, scream, pain, hunger, attack, attraction, fo\"}}\n{\"id\": 2571350, \"name\": \"Soul of War: Legions\", \"stratum\": \"strict\", \"short\": \"\\\"SoulofWar\\\" is a strategy deck-building game with twists. It features 8-player PvP battles where you strategically outplay your opponents. It introduces a fresh auto chess gameplay.\", \"evidence\": {\"explicit_build\": \"you embark on is unique. Make use of over 80 cards complemented by 33 different artifacts to build your customized deck. Interact with 5 diverse races, each offering a distinctly different tribal ga\", \"combination\": \"y your opponents. It introduces a fresh auto chess gameplay. We fused card games and RTS together to make the best Auto Chess Game we could. choose your card combination from five different races to overcome your opponent Deploy the legion you've nurtured during your p\", \"playstyle\": \"real-time combat with genuine physics effects. Strategize to fit your playstyle There are five races to choose from, each offering unique and surprising gameplay aspects. Select all the cards from your primary race. Throughout your competitive journey, you will have the ability to enhance y\", \"deck\": \"\\\"SoulofWar\\\" is a strategy deck-building game with twists. It features 8-player PvP battles where you strategically outplay your opponents. \"}}\n{\"id\": 2971390, \"name\": \"Roll Five\", \"stratum\": \"strict\", \"short\": \"Roll Five is a thrilling dice-based roguelike. Explore a medieval fantasy map packed with deadly dangers, compose overpowered dice figures, and use your absurd luck to deal shocking damage to monsters until you\", \"evidence\": {\"combination\": \"tuna . A fast-paced and immersive dice-rolling adventure. A game that combines the thrill of dice rolling with deep strategic gameplay. Each deck offers an escalading challenge with 4 levels of difficulty, and every run is seeded for an endless \", \"deck\": \" monsters until you free Fortuna. Roll Five is a dice-based roguelike deckbuilder that challenges you to master the art of dice rolling and deal shocking amount of damage to monster\"}}\n{\"id\": 4297420, \"name\": \"Sovereign's End\", \"stratum\": \"strict\", \"short\": \"Feel invincible. Until you're not. A dark 3D space survivor-like with deep build-crafting and auto-firing abilities.  Outlast the swarm and face the Sovereign. If you can reach it.\", \"evidence\": {\"explicit_build\": \"invincible. Until you're not. A dark 3D space survivor-like with deep build-crafting and auto-firing abilities.  Outlast the swarm and face the Sovereign. If you can reach it. Feel inv\", \"combination\": \"me unstoppable. FORGE YOUR BUILD, RUN BY RUN Level up. Pick your next ability. Chase the synergies that break the game open. Cross Breakpoint thresholds and watch stat investment transform your capa\", \"playstyle\": \"etween runs Breakpoint system - Stat investment unlocks game-changing passive effects, not just bigger numbers Customizable HUD - Tune your interface to fit your playstyle and visual preferences Photo Mode - Pause the chaos and capture cinematic shots of every run Global\"}}\n{\"id\": 4676750, \"name\": \"Tap Dungeon\", \"stratum\": \"strict\", \"short\": \"Pixel-art isekai roguelike dungeon crawler! 5 classes, mix skills & items freely in turn-based combat across deadly random dungeons. Fight goblins, orcs, undead; collect artifacts, beat hidden bosses. Death = r\", \"evidence\": {\"explicit_build\": \"orcs, undead; collect artifacts, beat hidden bosses. Death = rebirth, endless builds await. Become the hero saving the kingdom! Pixel art meets medieval nostalgia in a modern roguelike\", \"combination\": \"s unbreakable. Each class offers a completely different combat style. Mix and match skills, items, and sub-classes freely—no restrictions, imagination is the only limit. Battle greedy goblin tribes, savage orcs, an\"}}\n{\"id\": 3408380, \"name\": \"Exorcism Agency\", \"stratum\": \"strict\", \"short\": \"Raise Your Own Ghost Girl+Deckbuilding+Zuma-Style Match-3!Exorcism Agency is an innovative roguelike that finds joy in thrills.Ghosts are back,the human world is like hell,and you,as a top-tier exorcist,will ve\", \"evidence\": {\"deck\": \"Raise Your Own Ghost Girl+Deckbuilding+Zuma-Style Match-3!Exorcism Agency is an innovative roguelike that finds joy in thrills.Ghosts are \"}}\n{\"id\": 3282420, \"name\": \"Zoominoes\", \"stratum\": \"strict\", \"short\": \"Build the ultimate Zoo in this number-go-up roguelike deckbuilder. Find powerful mythical animals, boost them with snacks, and even manipulate the board itself. Break the game by scoring millions (and more) wit\", \"evidence\": {\"explicit_build\": \"he board with space modifiers to boost your score even more. Focus on different animal types or color build arounds to create the ultimate scoring army. Become The Ultimate Zookeeper Play as a variety of 20 \", \"combination\": \"llions (and more) with insane combos.  Zoominoes is the ultimate tile deck builder all about combining cards on a board to score infinite points. Crazy Combos Upgrade animals using snacks and souvenirs \", \"deck\": \"Build the ultimate Zoo in this number-go-up roguelike deckbuilder. Find powerful mythical animals, boost them with snacks, and even manipulate the board itself. Brea\"}}\n{\"id\": 3442720, \"name\": \"Tilebound\", \"stratum\": \"strict\", \"short\": \"Master the art of tile magic in Tilebound, a spellbinding blend of strategy, puzzles, and magical combat. Build powerful tile chains, unleash elemental spells, and conquer evolving challenges in a vibrant, hand\", \"evidence\": {\"explicit_build\": \" in Tilebound, a spellbinding blend of strategy, puzzles, and magical combat. Build powerful tile chains, unleash elemental spells, and conquer evolving challenges in a vibrant, hand-\"}}\n{\"id\": 2841050, \"name\": \"Escape from Andromeda\", \"stratum\": \"strict\", \"short\": \"Escape from Andromeda is an overhead 2D sci-fi spaceship looter shooter based in a procedurally generated galaxy. In Escape from Andromeda, every planet is a level, and every star is a part of your story.\", \"evidence\": {\"combination\": \" friends with millions of different procedurally generated ship type, weapon, and skin combinations. Explore Explore over 5,000 different planets, each with unique levels, asteroid layouts, and enemy\", \"machine\": \"magnetic projectile displacement, heat shielding, and energy impulse. Customize Customize your ship and those of two friends with millions of different procedurally generated ship type, weapon, and s\"}}\n{\"id\": 2429580, \"name\": \"Gate One\", \"stratum\": \"inclusive_only\", \"short\": \"Survive with your team as long as possible and discover different worlds and loot.\", \"evidence\": {\"combination\": \"te One\\\" to discover different worlds with your team. Choose the right combination of companions, armor and weapons so that your team can survive for as long as possible. Improve your team, upgrade your equipment, u\", \"party\": \" mission to use the \\\"Gate One\\\" to discover different worlds with your team. Choose the right combination of companions, armor and weapons so that your team can survive for as long as possible. Improve you\"}}\n{\"id\": 4101210, \"name\": \"The Legend of You\", \"stratum\": \"inclusive_only\", \"short\": \"Shape a fantasy realm with your words. Choose your hero’s tale, recruit, train, and equip allies, and battle through turn-based encounters of your own design. Each victory writes your legend, each choice brings\", \"evidence\": {\"party\": \"d to the abilities the boss will unleash. Recruit and Build Your Team Assemble a party of up to eight heroes from a roster of 45 unique classes, each with skill trees and talent options. Collect over 100 reli\"}}\n{\"id\": 3006090, \"name\": \"Crystant\", \"stratum\": \"inclusive_only\", \"short\": \"《Crystant》 is a strategy survival game that combines story-driven exploration, board game-style tile connection, tactical turn-based combat, and Roguelite progression.\\r\\nExplore each floor, manage resources, str\", \"evidence\": {}}\n{\"id\": 4988340, \"name\": \"Realmbound Frontier\", \"stratum\": \"inclusive_only\", \"short\": \"Enter a world of monsters and magic in this card-based RPG strategy game! Almost infinitely replayable with thousands of events, treasures and effects and a different game every time you play. Finish a whole ad\", \"evidence\": {}}\n{\"id\": 3286030, \"name\": \"Boardguard\", \"stratum\": \"inclusive_only\", \"short\": \"An occult themed turn based strategy game where you fight off waves of possessed entities.\", \"evidence\": {\"playstyle\": \"make sure you can endure the onslaught. Play using a number of unique playstyles, fully customizable using the in-game shop. Purchase powerful relics that will amplify your strength or ward off enemy attacks. Fight a variety of enchanted foes that e\"}}\n{\"id\": 2412110, \"name\": \"Rogue Labyrinth\", \"stratum\": \"inclusive_only\", \"short\": \"Fight through the ranks in a monster-filled labyrinth created by an egocentric billionaire colonist. Make friends (or enemies) with rivals, employees, fans, and monsters to improve your abilities. The crowd wan\", \"evidence\": {}}\n{\"id\": 3642430, \"name\": \"Rogue Shapes\", \"stratum\": \"inclusive_only\", \"short\": \"Rogue Shapes is a fast-paced roguelike bullet hell where you battle  waves of deadly shapes, level up, and choose powerful upgrades. Complete challenges to unlock new playable shapes, each with unique weapons. \", \"evidence\": {\"playstyle\": \"a soaring Plane, or a wild Paintbrush, every shape brings a different playstyle to the fight. Master their abilities, chain devastating combos, and conquer waves of enemies in this fast-paced roguelite action game. 8\"}}\n{\"id\": 2234640, \"name\": \"Native Hunter\", \"stratum\": \"inclusive_only\", \"short\": \"Inspired by an existing indigenous tribe, where they live on an island called \\\"North Sentinel Island\\\". Native Hunter gives the player the possibility of living the experience in the body of an indigenous person\", \"evidence\": {}}\n{\"id\": 3087930, \"name\": \"Pebble Knights\", \"stratum\": \"inclusive_only\", \"short\": \"Chew on weapons, chomp on poop, and devour your friends' graves in this chaotic co-op action roguelike!\\r\\nEat shiny items to ascend your traits and stack team synergies as your squad snowballs into an unstoppabl\", \"evidence\": {\"combination\": \"ur friends' graves in this chaotic co-op action roguelike!\\r\\nEat shiny items to ascend your traits and stack team synergies as your squad snowballs into an unstoppable force. Play solo or team up with up to 5 players! Play \", \"party\": \"op action roguelike!\\r\\nEat shiny items to ascend your traits and stack team synergies as your squad snowballs into an unstoppable force. Play solo or team up with up to 5 players! Play \"}}\n{\"id\": 3091990, \"name\": \"Rogue Rhythm\", \"stratum\": \"inclusive_only\", \"short\": \"A roguelike with rhythm-based combat. Learn a new mechanic after every boss and become skilled enough to challenge God Himself!\", \"evidence\": {}}\n{\"id\": 2446600, \"name\": \"Dark Deity 2\", \"stratum\": \"inclusive_only\", \"short\": \"Verroa is a peaceful continent on the brink of war as the Asverellian Empire seeks to expand - at your homeland’s expense. Command unlikely heroes, fight challenging turn-based battles, and watch hardship forge\", \"evidence\": {}}\n{\"id\": 1845700, \"name\": \"The Collar\", \"stratum\": \"inclusive_only\", \"short\": \"What would it be like to be taken from your normal life and be pitted against random strangers. Would you fight and kill to survive?\", \"evidence\": {}}\n{\"id\": 2091620, \"name\": \"Septaroad Voyager\", \"stratum\": \"inclusive_only\", \"short\": \"Seven heroes. Infinite adventures. Embark on an epic journey through a vast world filled with danger. Assign tactics to your party members or control them individually in fast-paced battles. Discover the captiv\", \"evidence\": {}}\n{\"id\": 2850640, \"name\": \"Bulletmancer\", \"stratum\": \"inclusive_only\", \"short\": \"In this horde survival roguelite you don't move, but you do shoot! Choose a wizard to wield the Arcane Turret, combine different bullet spells and survive until the final boss comes to face you.\", \"evidence\": {\"combination\": \"t move, but you do shoot! Choose a wizard to wield the Arcane Turret, combine different bullet spells and survive until the final boss comes to face you. Bulletmancer is a bullet heaven roguelite with \", \"playstyle\": \". Synergy system inspired by games like The Binding of Isaac. Lots of spells to combine. Multiple characters with different playstyles. Three maps each with its own roster of enemies. Glyph tree that allows you to get more powerful be\"}}\n{\"id\": 4402660, \"name\": \"METRO QUESTER | OSAKA\", \"stratum\": \"inclusive_only\", \"short\": \"METRO QUESTER | OSAKA is a dungeon exploration RPG based in a post-apocalyptic futuristic world created by the manga artist Kazushi Hagiwara, with a deep game system designed by Hironori Kato that offers the ex\", \"evidence\": {}}\n{\"id\": 4547950, \"name\": \"Dude The Dark Agent\", \"stratum\": \"inclusive_only\", \"short\": \"Dude The Dark Agent, klasik 90'lar FPS ruhunu modern özelliklerle buluşturan 2.5D aksiyon oyunu. Raycasting motoruyla işlenen yoğun orman haritalarında, düşman askerleri avla, antik heykelleri parçala ve her kö\", \"evidence\": {}}\n{\"id\": 3742140, \"name\": \"Backstabbing King\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Strategize your way through a variety of encounters, each with various twists. Kill all of the other pieces on the board through night and day until only the two kings remain.\", \"evidence\": {}}\n{\"id\": 3435310, \"name\": \"Dragon Expedition\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"This is a fantasy adventure game that combines Eastern and Western elements, where players will become dragon slaying warriors and embark on a long journey. Rich scenes and different bosses are waiting for you,\", \"evidence\": {}}\n{\"id\": 4732270, \"name\": \"Vibrant Vector\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Vibrant Vector is a neon arcade roguelike where geometric entities collide in chaotic and vibrant battles. Create absurd builds, survive increasingly intense waves, and face powerful bosses in an abstract unive\", \"evidence\": {\"combination\": \"rvive increasingly difficult waves of hostile entities, unlock unique abilities, and discover powerful combinations capable of completely transforming each run. With a minimalist and stylized visual direction, the g\"}}\n{\"id\": 2590810, \"name\": \"Vox Populi: Poland 2023\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Play as an existing or fully customisable political figure, and campaign for or many alternative Polish elections!! In \\\"Vox Populi: Poland 2023\\\", you and the characters around you must promote your ideas and yo\", \"evidence\": {}}\n{\"id\": 3107850, \"name\": \"終焉少女\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Girls, resist the world and burn your lives! Full-voice stylish action!!\", \"evidence\": {}}\n{\"id\": 3220010, \"name\": \"Mangui\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Mangui is a turn-based roguelike game inspired by spooky traditional Korean folklore. Play as one of four protagonists, unraveling the mysteries of the dark Mangui mountains. Live to tell the tale in this dange\", \"evidence\": {\"combination\": \"orld to extend his remaining time. 2. Turn-based Combat and Countless Skill Combos Combine various skills and gather powerful equipment to face the onslaught of ghoulish creatures. Your stra\"}}\n{\"id\": 1984200, \"name\": \"After He Was Gone\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"\\\"After He Was Gone\\\" is a Tactical RPG. NO level-up system. Character's skills and items will change the battle situation significantly. Collect the treasures and lead therianthropes from getting out from the wo\", \"evidence\": {}}\n{\"id\": 4372110, \"name\": \"Wormwood\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Through exploration and choices, uncover the village's secrets. Attempt to save the girls' futures, or ignore their misfortune and pursue your own path to survival.\", \"evidence\": {}}\n{\"id\": 2640240, \"name\": \"TheLostDetective\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"This is a single-player third-person action-adventure puzzle game that allows players to solve certain puzzles and explore more game content. This game currently only supports computers and can be operated thro\", \"evidence\": {}}\n{\"id\": 3344410, \"name\": \"Homelessvania\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Fight for your rights as a homeless person in this mini Metroidvania SPEEDRUNNER.\", \"evidence\": {}}\n{\"id\": 4016670, \"name\": \"That Summer - Hannah's Summer Vacation\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"In a quiet, somewhat remote town, Hannah lives with her father and younger brother. Eventually the summer break comes, and with it the question: \\\"How to spend the last summer before her senior year in high scho\", \"evidence\": {}}\n{\"id\": 2058850, \"name\": \"Traveler's Game\", \"stratum\": \"candidate_unconfirmed\", \"short\": \"Your name is Camus Chen. Because of a recommendation from your friend Lu, you downloaded a battle simulator game famous for its sociability. You meet strangers and learn about their lives by simply chatting wit\", \"evidence\": {}}\n"}

[Think]

**Refining strict-match criteria**

[Think]

**Refining strict-match criteria**

**Refining build-match criteria**

[Think]

**Refining strict-match criteria**

**Refining build-match criteria**

[Think]

**Refining strict-match criteria**

**Refining build-match criteria**

The description audit is distinguishing three useful levels: explicit build combinations, weaker customization claims, and genre-tag candidates whose descriptions don’t establish build variety. It also caught false matches from phrases such as “interactive items,” which I’m removing before looking at performance.

The 2026 analysis will include January–June and July–August separately, with comparisons to games released in the same part of the year.

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 1.4 seconds
Output:

{"chunk_id":"715ba2","wall_time_seconds":1.274828146,"exit_code":0,"original_token_count":4279,"output":"2711490 Commando Commando is a multi-player third-person shooter with a fun, toony, style; a class and team based dynamic; powerful and varied abilities and equipment; and an array of vehicles. Choose your class, choose your loadout, go to battle and fight for control of objectives to win the war! {'playstyle': ['un, toony, style; a class and team based dynamic; powerful and varied abilities and equipment; and an array of vehicles. Choose your class, choose your loadout, go to battle and fight for control of objectives to win the war! ']}\n4729480 Last Ember We fused deckbuilding and roguelikes into the ultimate single-player experience. Build a unique deck, summon dinosaurs to crush your enemies, and discover powerful relics to protect the Last Ember. {'playstyle': [\"thers wield their fragments in ways entirely their own. Discover each character's playstyle, full potential, and hidden story. UNCOVER THE TRUTH OF THE FALLEN GODS The history of the Origin G\"], 'deck': ['We fused deckbuilding and roguelikes into the ultimate single-player experience. Build a unique deck, summon dinosaurs to']}\n348930 Lone Wolf Lone Wolf: A Post Apocalyptic Beat-Em Up Role Playing Game. This action/adventure game lets a player use martial arts skills, weapons, and turn into a werewolf to fight their way through a world set in the aftermath of post nuclear devastation. {'combination': ['unters with the denizens of the world in the aftermath. NPC character interaction and dialogue, there are branching quests and event driven dialogues that the main character can progress through. Customizable difficulty, camera control, controls style, and player input!']}\n3304430 Vasrak Kingdom: Battle on the frontier A real-time strategy game combining deck-building mechanics. Summon soldiers to control a 3x3 battlefield and deal damage by completing lines using Tic-Tac-Toe rules. Make quick decisions and build your deck strategically to protect the kingdom’s resources. {'combination': ['A real-time strategy game combining deck-building mechanics. Summon soldiers to control a 3x3 battlefield and deal damage by completing line'], 'deck': ['A real-time strategy game combining deck-building mechanics. Summon soldiers to control a 3x3 battlefield and deal damage by completing lines using T']}\n2943780 Chamber Survival From a first person perspective, escape this terrifying room. {'combination': ['ynamic functionality • Doors, drawers, pull rods, valves, and movable interactions • Type (mouse, animation, lock, jam) More items (keyboard locks, door card locks, padlocks) More features Zombies (sleep, wander, scream, pain, hunger, attack, attraction, fo']}\n2571350 Soul of War: Legions \"SoulofWar\" is a strategy deck-building game with twists. It features 8-player PvP battles where you strategically outplay your opponents. It introduces a fresh auto chess gameplay. {'explicit_build': ['you embark on is unique. Make use of over 80 cards complemented by 33 different artifacts to build your customized deck. Interact with 5 diverse races, each offering a distinctly different tribal ga'], 'combination': [\"y your opponents. It introduces a fresh auto chess gameplay. We fused card games and RTS together to make the best Auto Chess Game we could. choose your card combination from five different races to overcome your opponent Deploy the legion you've nurtured during your p\"], 'playstyle': ['real-time combat with genuine physics effects. Strategize to fit your playstyle There are five races to choose from, each offering unique and surprising gameplay aspects. Select all the cards from your primary race. Throughout your competitive journey, you will have the ability to enhance y'], 'deck': ['\"SoulofWar\" is a strategy deck-building game with twists. It features 8-player PvP battles where you strategically outplay your opponents. ']}\n2971390 Roll Five Roll Five is a thrilling dice-based roguelike. Explore a medieval fantasy map packed with deadly dangers, compose overpowered dice figures, and use your absurd luck to deal shocking damage to monsters until you free Fortuna. {'combination': ['tuna . A fast-paced and immersive dice-rolling adventure. A game that combines the thrill of dice rolling with deep strategic gameplay. Each deck offers an escalading challenge with 4 levels of difficulty, and every run is seeded for an endless '], 'deck': [' monsters until you free Fortuna. Roll Five is a dice-based roguelike deckbuilder that challenges you to master the art of dice rolling and deal shocking amount of damage to monster']}\n4297420 Sovereign's End Feel invincible. Until you're not. A dark 3D space survivor-like with deep build-crafting and auto-firing abilities.  Outlast the swarm and face the Sovereign. If you can reach it. {'explicit_build': [\"invincible. Until you're not. A dark 3D space survivor-like with deep build-crafting and auto-firing abilities.  Outlast the swarm and face the Sovereign. If you can reach it. Feel inv\"], 'combination': ['me unstoppable. FORGE YOUR BUILD, RUN BY RUN Level up. Pick your next ability. Chase the synergies that break the game open. Cross Breakpoint thresholds and watch stat investment transform your capa'], 'playstyle': ['etween runs Breakpoint system - Stat investment unlocks game-changing passive effects, not just bigger numbers Customizable HUD - Tune your interface to fit your playstyle and visual preferences Photo Mode - Pause the chaos and capture cinematic shots of every run Global']}\n4676750 Tap Dungeon Pixel-art isekai roguelike dungeon crawler! 5 classes, mix skills & items freely in turn-based combat across deadly random dungeons. Fight goblins, orcs, undead; collect artifacts, beat hidden bosses. Death = rebirth, endless builds await. Become the hero saving the kingdom! {'explicit_build': ['orcs, undead; collect artifacts, beat hidden bosses. Death = rebirth, endless builds await. Become the hero saving the kingdom! Pixel art meets medieval nostalgia in a modern roguelike'], 'combination': ['s unbreakable. Each class offers a completely different combat style. Mix and match skills, items, and sub-classes freely—no restrictions, imagination is the only limit. Battle greedy goblin tribes, savage orcs, an']}\n3408380 Exorcism Agency Raise Your Own Ghost Girl+Deckbuilding+Zuma-Style Match-3!Exorcism Agency is an innovative roguelike that finds joy in thrills.Ghosts are back,the human world is like hell,and you,as a top-tier exorcist,will venture into ghost-infested zones,using all kinds of mystical techniques to capture ghosts {'deck': ['Raise Your Own Ghost Girl+Deckbuilding+Zuma-Style Match-3!Exorcism Agency is an innovative roguelike that finds joy in thrills.Ghosts are ']}\n3282420 Zoominoes Build the ultimate Zoo in this number-go-up roguelike deckbuilder. Find powerful mythical animals, boost them with snacks, and even manipulate the board itself. Break the game by scoring millions (and more) with insane combos.  {'explicit_build': ['he board with space modifiers to boost your score even more. Focus on different animal types or color build arounds to create the ultimate scoring army. Become The Ultimate Zookeeper Play as a variety of 20 '], 'combination': ['llions (and more) with insane combos.  Zoominoes is the ultimate tile deck builder all about combining cards on a board to score infinite points. Crazy Combos Upgrade animals using snacks and souvenirs '], 'deck': ['Build the ultimate Zoo in this number-go-up roguelike deckbuilder. Find powerful mythical animals, boost them with snacks, and even manipulate the board itself. Brea']}\n3442720 Tilebound Master the art of tile magic in Tilebound, a spellbinding blend of strategy, puzzles, and magical combat. Build powerful tile chains, unleash elemental spells, and conquer evolving challenges in a vibrant, hand-drawn 2D world. Can you unlock the secrets of the spellbook and break free? {'explicit_build': [' in Tilebound, a spellbinding blend of strategy, puzzles, and magical combat. Build powerful tile chains, unleash elemental spells, and conquer evolving challenges in a vibrant, hand-']}\n2841050 Escape from Andromeda Escape from Andromeda is an overhead 2D sci-fi spaceship looter shooter based in a procedurally generated galaxy. In Escape from Andromeda, every planet is a level, and every star is a part of your story. {'combination': [' friends with millions of different procedurally generated ship type, weapon, and skin combinations. Explore Explore over 5,000 different planets, each with unique levels, asteroid layouts, and enemy']}\n\nREFERENCE 375480 Chronicon Story What happens in a world where the last evil lies dead, the last quest is completed, and the last chest has been opened? In this world, the long-dead Heroes of Old are forever remembered and honored through a great magical device. This device, known only as the Chronicon, is capable of opening a portal into the memories – the very souls – of the Heroes of Old. Each year, a handful men and women are given the great honor to re-live the old tales. And this year, you have been chosen… Note: Trailer footage and screenshots are of high level characters with decent equipment. Expect a slower pace at first. Game Features 5 large and varied acts with each their own storyline to play through 4 unique classes: The Templar, Berserker, Warden, and Warlock Procedurally generated dungeons and areas – each playthrough is different Local co-op up to 4 players (same machine, requires 1 Xbox 360/one controller per additional player) Remote Play Together fully supported Over 400 unique+ items with designed special powers Over 700 items with randomized enchants & qualities, build-changing powers, and powerful set items! Over 900 skills, abilities, and perks to learn and improve Infinite character progression via endless Mastery ranks Hardcore mode Deep crafting - Enchant, Gem, Empower, and inscribe your equipment with Runes! Endgame content including randomized dungeons, bosses, and endgame-only crafting mechanics Full Xbox 360/one controller support (optional)\n\nREFERENCE 915310 SNKRX SNKRX is an arcade shooter roguelite where you control a snake made of multiple heroes, with each one having their own attacks, passives and classes. Inspired by the auto-battler genre, each hero in the snake has a set of classes, and combining enough heroes of the same class together grants additional class bonuses. Heroes can also be upgraded to be more powerful when copies are bought from the shop. Gameplay Your snake can't stop moving, turn it left or right to steer Your heroes attack automatically when close to enemies Combine heroes of the same classes together to unlock unique class bonuses Clearing arenas grants gold, which can be used to hire heroes at the shop Buying enough copies of the same heroes levels them up, making them more powerful Features 40+ heroes, each with unique attacks and passives 12+ classes, each giving stat boosts and modifiers to your snake 40+ passive items, each giving strong global effects to your snake 25+ levels of increasing difficulty as the run progresses 15+ Steam achievements Soundtrack by Kubbi\n\nREFERENCE 2091620 Septaroad Voyager Septaroad Voyager is a deep story-driven RPG focused on seven unlikely individuals who must grow--as people and as heroes--in order to save the world from the greatest threat it has ever known. Gather your seven heroes from across a beautiful and varied pixel-art world. Assign tactics to your party members to make them fight quickly and intelligently in fast-paced real-time battles. As something sinister chips away at the walls of reality, seven heroes hear a call to action. Unite them, strengthen them, and lead them to victory in Septaroad Voyager. Features Fast-paced battles against a variety of enemies with their own strengths, weaknesses, and abilities. Master the systems of Septaroad Voyager to defeat even the toughest foes. Program your party members using the Tactics system. Give them a condition to check for and an action to perform, then let them fight. With the right tactics, your party will fight its way to victory on its own. But for unforeseen situations, you can always give orders manually. Take the default heroes into your party or customize them however you want. Change their names and appearance. Level them up in 14 unique classes with their own selection of skills and equipment. Adventure across a huge and varied world, filled with unique environments, cultures, characters, and enemies. In addition to the main campaign and story quests, you can learn rumors from townsfolk, and add clues to those rumors to discover an infinite number of procedurally generated dungeons. Customize the difficulty and treasure of each dungeon depending on the clues you combine. Create your own adventures using the included game editor. Or for the truly dedicated modder, change the game itself by extending the included source code.\n\nREFERENCE 2427700 Backpack Battles Prepare your backpack! Buy rare and legendary items and organize them to make powerful builds. Then battle other players with it! In Backpack Battles, you fight with your backpack full of items. It matters what you buy, and especially how you place it! The smarter you place your items, the stronger you will be! Items come in different shapes, sizes, prices, and rarities. Combine them into even stronger equipment. Brew a powerful potion, craft a legendary weapon, or hatch a dragon friend! There are over 500 different items to choose from! Face the builds of other players in different game modes: Unranked : Low pressure without timers Ranked : Gain points against equal opponents, but still at your own pace Custom rules : Play unranked but change gold, maximum health, and more Lobbies : Match friends or streamers live with a timer! See what they came up with, and counter them. Pick one of 7 classes depending on your play style, each of them with 5 subclasses ! Do you want heavy crits or poison damage over time? Or squirrels ?\n\nREFERENCE 2446600 Dark Deity 2 Dark Deity is back! A quarter of a century has passed, as Irving and the Eternal Order carefully rebuilt Verroa to protect it against a future war. Their efforts will be put to the test far too soon as a new threat looms on the horizon. The neighboring Holy Asverellian Empire needs new lands to grow, and the fractious, fragile Verroa seems ripe for the taking. All that stands in its way is the Order and twenty scrappy heroes-to-be. Take command of the Eternal Delegation, led by Irving’s descendants. Gwyn and Riordian will have to navigate the treacherous politics of Verroa, and weave a web of alliances to turn the tide of the coming war. Your decisions will determine the shape of these alliances and define your army. Coupled with the help of a giant pool of customizations, no two playthroughs will ever feel the same. Put simply, Dark Deity 2 is about playing your way, all the way. Turn-based tactical combat is at the heart of Dark Deity 2. Your 20 heroes have access to 45 branching classes, each with its own powerful abilities, passive effects, and its own tactical niche… …that’s until you start experimenting with skills, abilities, and gear that can completely change the way a unit performs in the field and upend your tactics in a good way.. Heroes will bond as they fight seemingly impossible odds. Hardship forges the strongest bonds…but can also destroy friendships and wreak havoc. Will you be able to walk the line between the two? A desperate defense against an overwhelming foe. A land in the grasp of war fever, panic, and factional strife. A traitor around every corner. To have a chance at winning the war, you’ll need to make some difficult choices. Verroa is torn apart by factions, and many of these factions are fractured in turn. Decide who to support and who to throw to the wolves - but weigh each option carefully. After all, your choices may drastically change the coming battles… Every choice can fundamentally change the way you play the game. No two playthroughs are the same and what goes right in one game can go terribly wrong in the other. No playthroughs are the same, but you can push Dark Deity 2 even further. Inspired by the many community-made randomizers for popular RPGs, Dark Deity 2 features a built-in comprehensive randomizer and campaign customization suite from launch. Random recruitment order, custom difficulty runs with stat, aptitude, xp, gold sliders, and more are available, allowing for near-limitless replayability!\n\nREFERENCE 4402660 METRO QUESTER | OSAKA METRO QUESTER | OSAKA is a dungeon exploration RPG based in a post-apocalyptic futuristic world created by the manga artist Kazushi Hagiwara, with a deep game system designed by Hironori Kato that offers the excitement and surprises reminiscent of 1980s computer games through hack and slash. Moving the location to the city of water, Osaka, it features 32 characters and 8 classes, enjoyable combo skills, numerous customizable weapons, a bestiary, and features like NEW GAME+ for replayability, offering plenty of depth for dedicated gamers.\n"}

[Think]

**Rechecking rules on sample**

[Think]

**Rechecking rules on sample**

**Refining branching rules**

[Think]

**Rechecking rules on sample**

**Refining branching rules**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport shutil\nr=Path('/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"dbc90b","wall_time_seconds":1.001191344,"session_id":6452,"original_token_count":23,"output":"Traceback (most recent call last):\n  File \"<stdin>\", line 21, in <module>\nAssertionError\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"rg -n 'hits=|explicit_build|inclusive=' /home/adn/a327ex/steam-researc...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"65e262","wall_time_seconds":0.000003455,"exit_code":0,"original_token_count":511,"output":"11: 'explicit_build':re.compile(r'\\b(?:(?:character|hero|weapon|equipment|combat|skill|party|team|mech|deck|loadout|synergistic|powerful|unique|broken|overpowered|crazy|different|diverse|varied|custom|viable|endgame|unlimited|endless)\\b.{0,35}\\bbuilds?\\b|build[- ]?craft(?:ing)?|build (?:diversity|variety|synergies)|builds?\\b.{0,65}\\b(?:playstyles?|synerg\\w*|passives?|skills?|abilities|weapons?|relics?)\\b)',re.I),\n31: hits={k:list(p.finditer(text)) for k,p in P.items()}\n44: strict=(has('explicit_build') and len(objects)>=2 and (broad or has('machine'))) or (has('combination') and has('choice') and len(objects)>=3 and broad) or (has('playstyle') and has('choice') and len(objects)>=3 and broad) or (has('deck') and any(tags.get(t,99)<=5 for t in ['Deckbuilding','Roguelike Deckbuilder','Card Battler','Card Game'])) or (has('machine') and has('choice') and has('combination') and len(objects)>=2)\n45: inclusive=strict or (broad and ((has('skill_tree') and has('choice')) or (len(quantities)>=1 and has('choice') and len(objects)>=3) or has('party') or has('playstyle')))\n46: if excluded:strict=False;inclusive=False\n47: out={'appid':row.appid,'strict':bool(strict),'inclusive':bool(inclusive),'candidate':bool(broad or has('explicit_build') or has('machine')),'exclusion':'|'.join(excluded),'object_terms':len(objects),'quantity_claims_json':json.dumps(quantities,ensure_ascii=False)}\n49: out['evidence_json']=json.dumps({k:[text[max(0,m.start()-70):min(len(text),m.end()+100)] for m in hits[k][:2]] for k in ['explicit_build','combination','playstyle','deck','party','machine','quantity','prerun','position'] if hits[k]},ensure_ascii=False)\n53: out['equipment_skills']=bool(re.search(r'\\b(?:equipment|gear|weapons|passives|perks|talents|skill tree|runes|affixes|loadout)\\b',text,re.I)) and (has('explicit_build') or has('playstyle') or has('combination'))\n75: evidence=json.loads(x.pop('evidence_json'));x['evidence']={k:v[:1] for k,v in evidence.items() if k in ['explicit_build','combination','playstyle','deck','party','machine']}\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"30a908","wall_time_seconds":1.00118826,"session_id":46755,"original_token_count":0,"output":""}

[Think]

**Checking CloverPit’s category**

[Think]

**Checking CloverPit’s category**

**Refining deckbuilder classification**

[Think]

**Checking CloverPit’s category**

**Refining deckbuilder classification**

[Think]

**Checking CloverPit’s category**

**Refining deckbuilder classification**

[Think]

**Checking CloverPit’s category**

**Refining deckbuilder classification**

**Tightening combination rules**

[Think]

**Checking CloverPit’s category**

**Refining deckbuilder classification**

**Tightening combination rules**

[Think]

**Checking CloverPit’s category**

**Refining deckbuilder classification**

**Tightening combination rules**

**Refining family comparisons**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -3 /home/adn/a327ex/steam-research/build-expression-2026-09-05/cl...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"dc353d","wall_time_seconds":0.000003071,"exit_code":1,"original_token_count":334,"output":"{\"appid\": 3565380, \"name\": \"KunSpace\", \"year\": 2025, \"short_description\": \"In an infinite-looping space, find the traces of the modifications made by kun and break them. You can safely leave by reaching the 2.5th level. There is also an endless mode available, allowing you to push beyond your own limits and see how many levels you can reach.\", \"audit_stratum\": \"candidate_unconfirmed\", \"evidence\": {}}\n{\"appid\": 2649490, \"name\": \"The tree of immortality\", \"year\": 2024, \"short_description\": \"Awaken as a humble  farmer, lost and bewildered in a dense dark forest, before a giant tree. within the darkness are sinister spirit beasts that emerge from the shadows, threatening your survival. Battle these monsters, gain experience, explore and grow stronger before the next wave starts.\", \"audit_stratum\": \"candidate_unconfirmed\", \"evidence\": {}}\n{\"appid\": 2219880, \"name\": \"Animal Academy\", \"year\": 2023, \"short_description\": \"Animal Academy is a rogue-lite casual game where you survive for 10 minutes with a cute hedgehog.\\r\\nDefeat 4 stages using a variety of weapons and skills learned from the 8 masters at the animal academy.\\r\\nUse the coins to strengthen the perk that can borrow the power of your masters to become stronger.\", \"audit_stratum\": \"candidate_unconfirmed\", \"evidence\": {}}\n    PID %CPU   RSS     ELAPSED COMMAND\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nimport json\nfrom pathlib import Path\nr=Path('/ho...)

Script completed
Wall time 0.5 seconds
Output:

{"chunk_id":"5d6e37","wall_time_seconds":0.000002404,"exit_code":0,"original_token_count":3360,"output":"3324530 Western Shadowlands | combination: Create unique card combinations to grow stronger and stronger.\r\nReach a certain number of cards to obtain a special card!\r\nWith a w\n2454480 只因兄弟(BroChicken) | combination: nds, and the total duration does not exceed half an hour 3. Dozens of characters and weapons, hundreds of props, let you mix and match your own gameplay 4. Super weapon synthesis system: the cool and powerful super weapons help you de | party: nds, and the total duration does not exceed half an hour 3. Dozens of characters and weapons, hundreds of props, let you mix and match your own gameplay 4. Super weapon synthesis system: the cool and powerful super weapons help you de\n2933080 Crime Boss: Rockay City | playstyle:  and co-operative game modes! Each level up allows players unlock new weapons, heisters, equipment and skins. Kit yourself for success by customising your loadouts and crew. Keep an eye out for our double XP events to climb the ladder even \n2404170 Museum No.9 | combination: you! Enjoy light rogue-style adventure exploration, and use different skill combinations to battle monsters every time! Bug reporting / Official Q&A / Optimization suggestions / Venting an\n2499860 DRAGON QUEST VII Reimagined | playstyle: Moonlight and Level Up Two Vocations at the Same Time! Customize your playstyle with the new Moonlighting mechanic. Having two vocations assigned at once provides access to the skills, magic spells, and unique perks from both.\n2712470 Downfall | explicit_build: es within your nightmare. Collect various relics and skills to create your build, strengthen the items you've acquired, or create new items to upgrade and empower your character! 《\n4265130 MY SLIEM gets stronger after it dies | combination: ingly powerful, ultimately uncovering a massive conspiracy. Permanent talents can be selected after death. 【Gameplay】 The game uses intuitive top-down perspective controls combined with a pixel art style, creating a visual experience that i | quantity: perience in the Game】 The game features 5 types of magic, with nearly 70 spells to cast. There are enemies from 5 different species, totaling over 50 unique enemies to hinder your\n2510680 Orcish Skies | playstyle: ari, to the Cutthroat Rakshasa Arms Dealer, Smoke. Choose one of five characters, each with 120 unique cards and 130+ unique upgrades. Every character has dozens of unique strategies and playstyles, there's endless room to experiment, disco | deck: Orcish Skies blends Roguelike deckbuilding, turn-based, Slay The Spire-styled gameplay with a grid-based map.  Fire a missile into a cluster o\n2994070 路尼亞戰記 | combination: Little games to challenge, like pushing stone, jumping over obstacles Passive Skills make characters more powerful, sample skill tree, and skill buy system Item Combination - combine items to make more powerful item No Game Over - won't rel | party: lenge, like pushing stone, jumping over obstacles Passive Skills make characters more powerful, sample skill tree, and skill buy system Item Combination - combine items to make more powerful item No Game Over - won't reload saving if got ga\n3127000 Splintered | combination: ombat. Use attacks, spells, and items to overcome your foes. Level up equipment to unlock a multitude of powerful abilities to define your playstyle. Mix and match equipment from 3 class archetypes (Paladin, Thief, Mage) with more to come!  | playstyle: owdown! Features: Classic turn based combat. Use attacks, spells, and items to overcome your foes. Level up equipment to unlock a multitude of powerful abilities to define your playstyle. Mix and match equipment from 3 class archetypes (Pal\n1652250 Tales & Tactics | combination: ect a team of Tanks, Healers, Mages, Engineers and more - using their synergies to turn the tide of battle in your favor. Find powerful Equipment to give to your units, expand your Army Size, unlock new and more powerful tiers of Units, and | party: m Fae, Dragons and Treefolk to Skeletons, Ghouls, and Orcs! Collect a team of Tanks, Healers, Mages, Engineers and more - using their synergies to turn the tide of battle in your favor. Find powerful Equipment to give to your units, expand \n2834250 Frogbound: the Legend of Sir Hopper | playstyle: hat propels him through the levels with unstoppable force. With these relics, Sir Hopper embodies a versatile champion, adapting to different playstyles and conquering the challenges that lie within the depths of the dungeon. DEVELOPMENT Fr\n3817830 Ominigun | combination:  fast-paced and challenging bullet hell action game. Use a variety of weapons and buffs to fight enemy hordes, dodge projectiles, and defeat unique bosses. Combine abilities, react quickly, and overcome intense, chaotic battles. Come and ex | deck: Now run, explore, and collect as many weapons as you can. Don’t stop. Customize Build your custom deck of buffs to adapt your strategies and help Ominigun prepare for new waves of furious cuteness. Boss\n1566670 Attack of the Karens | explicit_build: on upgrades. Full game features: Over 40 in-game upgrades for tons of different build options Over 20 meta progression upgrades to get stronger every run 4 epic Karen bosses to destroy \n2217680 KAPITAL PUNISHMENT 22XX | explicit_build: ump, climb, and fly to hunt you down. Loads of power-ups to customize your build. Engaging NPCs, dialog and platforming in STORY MODE. White-knuckle action in the procedural genera | party: gritty prisons, hopeless company towns, and opulent sky-cities as you assemble a team of comrades to take down KAPITAL. Get ready to bash some fash! In the year 22XX, HOPE IS DEAD. A vi\n2350000 Space Hero: Intergalactic Titan | playstyle: ilities in your attempt to survive. Earn tokens to spend on permanent character upgrades, ability upgrades, and ability mods that allow you to customize your playstyle. In Space Hero: Intergalactic Titan you play as a space marine sent to v\n2330040 FateChessboard | deck: ombat system.  you'll need to use wisdom and strategy to continuously build your own deck of cards, battle powerful enemies, and emerge victorious. Get ready to embark on your adventure! Th\n4429260 Protect the Grimoire | explicit_build: ck new clothes! Test your skills and Luck: With 15+ power-ups, create your build, defeat enemies, and go as far as you can to save the world! Do you want to be a glass cannon wizar\n3195470 BARD'S FAULT | explicit_build:  your friends fight back-to-back against relentless swarms. Craft new builds, sync your abilities, and break the timeline in this multiplayer bullet heaven. Death is just the beginning, go back to  | combination: . THE FELLOWSHIP ENGINE (Co-op) ● Don't fight alone: Interact between characters to generate unique combos. ● Synergy Matters: Each character brings abilities that shape the team’s composition. BUILD YOUR SYMPHONY ● D\n3167100 CODE: BLUE | explicit_build: own action game with classless abilities and gear. Fight, grind, make your build, perform deadly combos and still be done in time for work. Code: Blue combines action from beat-em- | combination:  perform deadly combos and still be done in time for work. Code: Blue combines action from beat-em-up games with arpg itemization and abilities. Carefully select your rares and epics to create satisfying combos and survive the onslaught of \n948820 Nevergrind | playstyle: me combat and build lethal chain combos for epic rewards. Define your playstyle with a unique talent tree and discover powerful items! Experience a streamlined dungeon crawl focused on pure combat and treasure hunting! Nevergrind is  | quantity: ttle to skyrocket your XP, Gold, and Magic Find! 🌲 Class Depth: Blend 12 unique talents per class to customize your hero’s strengths! 💎 Loot Hunter’s Paradise: Over 900 unique items and 2\n3304760 Ethereal Sunder | playstyle: t your enemies' vulnerabilities with the range system. Customise your character's growth by choosing skills that match your playstyle, and gather mana, the essential resource for your kind. With each decision, you’ll uncover the secr\n4161910 BaseStar | playstyle: lassic grid-based dungeon crawler RPG in a sci-fi setting with unique classes, each offering a distinct playstyle. Immerse yourself in a fully voiced sci-fi story brought to life by two main characters, guiding yo\n4152760 Orrin's Chessboard | combination:  this roguelite tower defense game, the board expands every turn. Use cards to reshape paths and defend your castle. Orrin's Chessboard is a tower defense game that combines dynamic paths, resource management, and roguelike progression . Th\n3833800 Crafter's Hollow | combination: e from “victorious” to “oops, all dead.” Specializations & Strategy – Mix and match merc classes and playstyles to find your winning team. It’s a world where smithing meets strategy, economics mee | playstyle:  to “oops, all dead.” Specializations & Strategy – Mix and match merc classes and playstyles to find your winning team. It’s a world where smithing meets strategy, economics meets exploration,\n3128280 Cats & Dice | explicit_build: hurdle and you'll unlock endless mode where you can truly see how far your build can go. The combination of Cats' passive abilities, dice effects, Items' effects and other game-cha | combination: k endless mode where you can truly see how far your build can go. The combination of Cats' passive abilities, dice effects, Items' effects and other game-changing choices you'd have to make during the course of a run makes for a \n4310900 GLADIMAKER : Auto Battle RPG | combination: trategy and the thrill of infinite growth. Let's configure the build! Combine weapons, gloves, and badges to create an efficient build. Attack the weaknesses of each enemy to inflict gr\n2769210 Scarmonde | party: 8-Bit Styled dungeon-crawler wherein you assemble a party from 12 Classes to brave The Depths in search of the Dragon God's Sacred Treasures! The God of Drag | quantity: 8-Bit Styled dungeon-crawler wherein you assemble a party from 12 Classes to brave The Depths in search of the Dragon God's Sacred Treasures! The God of Dragons beckons you \n3972650 Backpack Jianghu | explicit_build: to permanently level up abilities. Get creative with 200+ items. Make overpowered builds like: Lonely Nine Swords – attack 20 times in a row, each hit applying armor break and bleed. Taich | combination: ackpack Battles , but with big innovations. Use inner energy to boost skills, upgrade weapons, combine low-tier skills into high-tier ones, and use skill fragments to permanently level up abilities. Get\n3915670 Apocalypse Survivor | playstyle: op rates, and each piece of gear boasts procedurally generated stats! Talent System Players earn XP by defeating zombies, level up to unlock talents, and build unique playstyles through diverse choices! Supply Crafting Survival supplies can\n1661600 Dead Ink | playstyle: nt your next life Enemies yield ink. Printers turn it into your body, weapons and equipment, and form a network of checkpoints throughout the tower. Spend heavily on a powerful loadout, preserve your ink for future attempts, or risk transpo\n2952180 Dragon Front: Adventures | combination: enemy territories you will also have the opportunity to recruit enemy units and salvage foreign promotion gems to unlock a nearly unlimited combination of game-breaking effects. The Adventure Begins Each adventure tests your mettle in three | party: enemy territories you will also have the opportunity to recruit enemy units and salvage foreign promotion gems to unlock a nearly unlimited combination of game-breaking effects. The Adventure Begins Each adventure tests your mettle in three\n2535950 Battlestar Galactica: Scattered Hopes | combination:  Pause at any time to preview your attacks and enemy movements Create synergies to deploy enemy-specific strategies by leveraging your unit strengths and unique abilities. Rejoining the Battlestar Galactica is a perilous mission with no mar | playstyle: urvival. Unlock up to four starting fleets , each with its own unique playstyle Clear trials to access additional squadron units, gunstar weapons, and modifiers that will appear in your next run Invest in valuable meta upgrades that will be\n2954730 Cube Hero Odyssey | explicit_build: ite with beautiful procedurally generated worlds, challenging bosses, creative build choices and endless gameplay! Cube Hero Odyssey is a hack-and-slash, monster slaying roguelite, whe\n4389530 Dice Heroes | explicit_build: Progression and replayability As you advance: enemies become tougher, your build evolves through artifact combinations, An Infinite Mode is also available, allowing you to push you | combination: ty As you advance: enemies become tougher, your build evolves through artifact combinations, An Infinite Mode is also available, allowing you to push your builds to their limits. Content The \n4258830 Pixel Valkyrie | explicit_build:  a fast-paced 2D pixel art ARPG inspired by ARPG classics. Craft deep builds with 25+ unique skills, massive skill tree, 9 bloodlines, hunt procedural loot, and push endlessly challenging maps with offline, online  | playstyle: p pushing further. There’s always another tier of power waiting. Deep Character Customization 350+ Node Skill Tree: Forge your unique playstyle — whether elemental caster, ruthless minion master, or debuff specialist. Skill Gems & Modifiers\n"}
{"chunk_id":"40b70f","wall_time_seconds":0.315000615,"exit_code":0,"original_token_count":509,"output":"  appid                  name  strict  inclusive exclusion  card_deck  party_composition  machine_assembly\n 238960         Path of Exile    True       True                False              False             False\n 348930             Lone Wolf   False       True                False              False             False\n 375480             Chronicon    True       True                False              False             False\n 646570        Slay the Spire    True       True                 True              False             False\n 858210            Nova Drift    True       True                False              False             False\n 915310                 SNKRX    True       True                False               True             False\n1942280               Brotato    True       True                False              False             False\n2062430            BALL x PIT    True       True                False              False             False\n2088570           Tiny Rogues    True       True                False              False             False\n2091620     Septaroad Voyager    True       True                False               True             False\n2218750      Halls of Torment    True       True                False              False             False\n2427700      Backpack Battles    True       True                False              False             False\n2446600          Dark Deity 2    True       True                False               True             False\n2742830       Monster Train 2    True       True                 True              False             False\n2943780      Chamber Survival   False      False                False              False             False\n3405340              Megabonk    True       True                False               True             False\n3442720             Tilebound   False      False                False              False             False\n4402660 METRO QUESTER | OSAKA    True       True                False               True             False\n"}

[Think]

**Checking party-composition criteria**

[Think]

**Checking party-composition criteria**

[Think]

**Checking party-composition criteria**

**Refining machine-assembly criteria**

[Think]

**Checking party-composition criteria**

**Refining machine-assembly criteria**

[Think]

**Checking party-composition criteria**

**Refining machine-assembly criteria**

**Freezing classifier definitions**

[Think]

**Checking party-composition criteria**

**Refining machine-assembly criteria**

**Freezing classifier definitions**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\nimport json\nr=Path('/ho...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"3b0767","wall_time_seconds":1.001312163,"session_id":3798,"original_token_count":0,"output":""}

[Think]

**Preparing benchmark result figures**

[Think]

**Preparing benchmark result figures**

**Structuring build-family groups**

[Think]

**Preparing benchmark result figures**

**Structuring build-family groups**

[Think]

**Preparing benchmark result figures**

**Structuring build-family groups**

[Think]

**Preparing benchmark result figures**

**Structuring build-family groups**

**Defining time-panel cohorts**

exec ({"code": "text(await tools.exec_command({cmd:\"cat > /home/adn/a327ex/steam-research/build-expression-2026-09-05/anal...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"e02d8a","wall_time_seconds":1.000826744,"session_id":60887,"original_token_count":0,"output":""}

[Think]

**Checking date alignment**

[Think]

**Checking date alignment**

**Auditing quantity extraction**

[Think]

**Checking date alignment**

**Auditing quantity extraction**

[Think]

**Checking date alignment**

**Auditing quantity extraction**

**Patching sensitivity logic**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -22 /home/adn/a327ex/steam-research/build-expression-2026-09-05/a...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"07fcd1","wall_time_seconds":0.000003069,"exit_code":0,"original_token_count":734,"output":"    2026_H1 spatial_item_configuration   39    11.0      9    0.231                        1.946          37              0.690\n    2026_H1            explicit_prerun   28     4.0      2    0.071                        0.548          28              0.675\n    2026_H1                   drafting   52     2.5     10    0.192                        1.627          52              0.946\n    2026_H1            crafting_fusion  374     8.0     64    0.171                        1.211         370              0.688\n    2026_H1      claims_50plus_options  178     8.5     39    0.219                        1.455         177              0.567\n    2026_H1     claims_100plus_options  114    11.5     26    0.228                        1.427         114              0.619\n2026_JulAug         all_build_promises  642     3.0     75    0.117                        1.248         638              0.173\n2026_JulAug                cards_decks  168     2.0     18    0.107                        1.049         168              0.225\n2026_JulAug     party_team_composition   80    11.0     17    0.212                        1.781          80              0.430\n2026_JulAug           equipment_skills  297     3.0     43    0.145                        1.581         296              0.107\n2026_JulAug           machine_assembly   10     4.0      0    0.000                        0.000          10              0.404\n2026_JulAug           action_roguelike  157     3.0     11    0.070                        0.906         157              0.276\n2026_JulAug               auto_battler   36     3.5      3    0.083                        1.018          36              0.345\n2026_JulAug         party_tactical_rpg   46     3.5      8    0.174                        1.435          46              0.851\n2026_JulAug            loot_action_rpg   34    11.0     10    0.294                        2.569          34              0.248\n2026_JulAug           familiar_carrier   59     3.0      4    0.068                        0.702          59              0.171\n2026_JulAug spatial_item_configuration   25    11.0      6    0.240                        2.321          25              0.429\n2026_JulAug            explicit_prerun   15     2.0      0    0.000                        0.000          15              0.697\n2026_JulAug                   drafting   53     2.0      4    0.075                        0.823          53              0.379\n2026_JulAug            crafting_fusion  194     5.0     30    0.155                        1.404         193              0.172\n2026_JulAug      claims_50plus_options  111     3.0     15    0.135                        1.374         111              0.422\n2026_JulAug     claims_100plus_options   71     4.0     12    0.169                        1.545          71              0.467\n-rw-r--r-- 1 adn adn 40K Sep  5 19:54 /home/adn/a327ex/steam-research/build-expression-2026-09-05/family_results.csv\n"}

[Think]

**Calibrating fallback expectations**

[Think]

**Calibrating fallback expectations**

**Normalizing fallback expectations**

[Think]

**Calibrating fallback expectations**

**Normalizing fallback expectations**

[Think]

**Calibrating fallback expectations**

**Normalizing fallback expectations**

[Think]

**Calibrating fallback expectations**

**Normalizing fallback expectations**

**Reviewing full results**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"f0424a","wall_time_seconds":1.000689049,"session_id":48397,"original_token_count":0,"output":""}

[Think]

**Validating price-bin convergence**

[Think]

**Validating price-bin convergence**

[Think]

**Validating price-bin convergence**

**Refining catalog filters**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -4 /home/adn/a327ex/steam-research/build-expression-2026-09-05/an...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"73558b","wall_time_seconds":0.243744467,"exit_code":0,"original_token_count":2476,"output":"2026_JulAug                   drafting   53     2.0      4    0.075                        0.656          53              0.379\n2026_JulAug            crafting_fusion  194     5.0     30    0.155                        1.149         193              0.172\n2026_JulAug      claims_50plus_options  111     3.0     15    0.135                        1.079         111              0.422\n2026_JulAug     claims_100plus_options   71     4.0     12    0.169                        1.225          71              0.467\n     period                     family    n  median  ge100  rate100  within_build_ratio100_date  within_build_ratio100_price  developers  top1_review_share  no_prior_history_n  no_prior_history_rate100\n  2023_2025         all_build_promises 3065    17.0    768    0.251                       1.000                        1.000        2896              0.228                2029                     0.232\n  2023_2025                cards_decks  709    16.0    168    0.237                       0.958                        0.900         690              0.421                 488                     0.232\n  2023_2025     party_team_composition  388    28.0    117    0.302                       1.218                        1.044         377              0.106                 256                     0.297\n  2023_2025           machine_assembly   65    19.0     17    0.262                       1.036                        0.928          65              0.453                  30                     0.300\n  2023_2025           action_roguelike  762    15.0    177    0.232                       0.925                        1.182         752              0.229                 456                     0.171\n  2023_2025               auto_battler  158    31.0     51    0.323                       1.323                        1.376         155              0.310                 110                     0.345\n  2023_2025         party_tactical_rpg  284    17.5     73    0.257                       1.014                        0.858         277              0.178                 198                     0.242\n  2023_2025            loot_action_rpg  207    27.0     66    0.319                       1.269                        1.074         202              0.291                 122                     0.344\n  2023_2025           familiar_carrier  150    20.0     33    0.220                       0.905                        0.969         149              0.735                 120                     0.217\n  2023_2025 spatial_item_configuration   62    10.5     17    0.274                       1.134                        1.112          62              0.400                  38                     0.132\n       2025         all_build_promises 1372    13.0    296    0.216                       1.000                        1.000        1351              0.196                 972                     0.200\n       2025                cards_decks  341    11.0     68    0.199                       0.925                        0.868         338              0.237                 253                     0.202\n       2025     party_team_composition  191    20.0     48    0.251                       1.160                        1.013         191              0.237                 140                     0.257\n       2025           machine_assembly   30    12.5      5    0.167                       0.753                        0.649          30              0.201                  13                     0.231\n       2025           action_roguelike  329    11.0     68    0.207                       0.960                        1.196         328              0.544                 218                     0.151\n       2025               auto_battler   77    25.0     21    0.273                       1.273                        1.222          77              0.605                  56                     0.304\n       2025         party_tactical_rpg  116    11.5     23    0.198                       0.914                        0.779         115              0.428                  83                     0.181\n       2025            loot_action_rpg   95    19.0     29    0.305                       1.403                        1.195          95              0.365                  54                     0.315\n       2025           familiar_carrier   82    10.0     18    0.220                       1.029                        1.133          82              0.638                  68                     0.191\n       2025 spatial_item_configuration   37     9.0      9    0.243                       1.102                        1.153          37              0.705                  24                     0.125\n    2026_H1         all_build_promises 1096     6.0    172    0.157                       1.000                        1.000        1072              0.318                 790                     0.151\n    2026_H1                cards_decks  289     4.0     40    0.138                       0.855                        0.790         288              0.803                 210                     0.148\n    2026_H1     party_team_composition  153     5.0     27    0.176                       1.086                        1.029         153              0.662                 105                     0.143\n    2026_H1           machine_assembly   27     4.0      5    0.185                       1.169                        1.326          27              0.807                  14                     0.143\n    2026_H1           action_roguelike  282     4.0     37    0.131                       0.867                        1.091         281              0.194                 201                     0.109\n    2026_H1               auto_battler   68     7.0     13    0.191                       1.124                        1.187          68              0.350                  45                     0.156\n    2026_H1         party_tactical_rpg   81     5.0     14    0.173                       1.036                        1.006          79              0.829                  65                     0.185\n    2026_H1            loot_action_rpg   66     4.0     14    0.212                       1.383                        1.098          66              0.307                  44                     0.205\n    2026_H1           familiar_carrier   95     7.0     14    0.147                       0.909                        0.894          95              0.198                  72                     0.167\n    2026_H1 spatial_item_configuration   39    11.0      9    0.231                       1.458                        1.605          37              0.690                  31                     0.226\n2026_JulAug         all_build_promises  642     3.0     75    0.117                       1.000                        1.000         638              0.173                 481                     0.116\n2026_JulAug                cards_decks  168     2.0     18    0.107                       0.934                        0.835         168              0.225                 136                     0.110\n2026_JulAug     party_team_composition   80    11.0     17    0.212                       1.813                        1.439          80              0.430                  62                     0.177\n2026_JulAug           machine_assembly   10     4.0      0    0.000                       0.000                        0.000          10              0.404                   6                     0.000\n2026_JulAug           action_roguelike  157     3.0     11    0.070                       0.596                        0.732         157              0.276                 114                     0.079\n2026_JulAug               auto_battler   36     3.5      3    0.083                       0.726                        0.797          36              0.345                  30                     0.067\n2026_JulAug         party_tactical_rpg   46     3.5      8    0.174                       1.444                        1.155          46              0.851                  31                     0.129\n2026_JulAug            loot_action_rpg   34    11.0     10    0.294                       2.460                        2.059          34              0.248                  26                     0.308\n2026_JulAug           familiar_carrier   59     3.0      4    0.068                       0.560                        0.549          59              0.171                  48                     0.062\n2026_JulAug spatial_item_configuration   25    11.0      6    0.240                       1.850                        1.904          25              0.429                  22                     0.227\nSUPPLY  year          segment     n  ge100  median\n 2019    paid_eligible  3571    722    12.0\n 2019    strict_builds   120     59    97.0\n 2019 inclusive_builds   159     68    68.0\n 2020    paid_eligible  4159    888    13.0\n 2020    strict_builds   161     69    43.0\n 2020 inclusive_builds   227     94    35.0\n 2021    paid_eligible  4765    873    12.0\n 2021    strict_builds   181     72    38.0\n 2021 inclusive_builds   255     90    32.0\n 2022    paid_eligible  5062    956    11.0\n 2022    strict_builds   290    100    30.0\n 2022 inclusive_builds   386    133    32.5\n 2023    paid_eligible  5854   1004     9.0\n 2023    strict_builds   437    135    27.0\n 2023 inclusive_builds   514    161    27.5\n 2024    paid_eligible  7613   1216     8.0\n 2024    strict_builds   587    157    21.0\n 2024 inclusive_builds   723    181    20.0\n 2025    paid_eligible  9164   1313     6.0\n 2025    strict_builds   847    189    13.0\n 2025 inclusive_builds   989    216    12.0\n 2026    paid_eligible 12498   1314     3.0\n 2026    strict_builds  1738    247     4.0\n 2026 inclusive_builds  1941    270     4.0\n"}

[Think]

**Reviewing RPG metadata samples**

[Think]

**Reviewing RPG metadata samples**

[Think]

**Reviewing RPG metadata samples**

**Auditing spatial-game entries**

[Think]

**Reviewing RPG metadata samples**

**Auditing spatial-game entries**

[Think]

**Reviewing RPG metadata samples**

**Auditing spatial-game entries**

[Think]

**Reviewing RPG metadata samples**

**Auditing spatial-game entries**

**Reconciling deckbuilding cohorts**

[Think]

**Reviewing RPG metadata samples**

**Auditing spatial-game entries**

**Reconciling deckbuilding cohorts**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.7 seconds
Output:

{"chunk_id":"037d8a","wall_time_seconds":1.001023097,"session_id":23436,"original_token_count":0,"output":""}
{"chunk_id":"6725d1","wall_time_seconds":0.347455033,"exit_code":0,"original_token_count":4902,"output":"\nGROUP 2026_H1 spatial_item_configuration 39\n{\"appid\": 1963610, \"name\": \"Road to Vostok\", \"reviews\": 8602, \"positive_pct\": 84, \"usd_list_price\": 19.99, \"developer\": \"Road to Vostok Ltd.\", \"short_description\": \"Road to Vostok is a hardcore single-player survival game set in a post-apocalyptic border zone between Finland and Russia. Survive, loot, plan and prepare to cross the border into Vostok, a permadeath zone where one mistake can end it all.\"}\n{\"appid\": 2245620, \"name\": \"Tangy TD\", \"reviews\": 1494, \"positive_pct\": 90, \"usd_list_price\": 9.99, \"developer\": \"Cakez\", \"short_description\": \"Strategic tower defense where you play a witch, place class-based towers, equip them with items that grant powerful abilities, combine them, create unique builds & deal ridiculous amounts of damage! Customize your builds with a deep stat system and giant skill tree!\"}\n{\"appid\": 3856280, \"name\": \"holoVillage: Our Cozy Days\", \"reviews\": 513, \"positive_pct\": 83, \"usd_list_price\": 24.99, \"developer\": \" Roboqlo\", \"short_description\": \"Farm, fish, mine, craft, and decorate your home in this cozy life sim. Venture into dungeons and take on bosses outside the village for some added excitement. Enjoy relaxing and thrilling moments alike with hololive talents as you shape your countryside life.\"}\n{\"appid\": 3802470, \"name\": \"Turnbound\", \"reviews\": 441, \"positive_pct\": 78, \"usd_list_price\": 14.99, \"developer\": \"1TK\", \"short_description\": \"Turnbound is an auto battler, where you manage a hero's inventory to escape a haunted boardgame. Each run is different from the last, with unique upgrades, combos and synergies. Async PvP lets you battle the ghosts of other players at your own pace in this unique new inventory battler.\\r\\n\\r\\n\"}\n{\"appid\": 4377370, \"name\": \"Gargadusa's Tower\", \"reviews\": 283, \"positive_pct\": 90, \"usd_list_price\": 8.99, \"developer\": \"The Math Team\", \"short_description\": \"D&D meets Franchise Manager, Gargadusa’s Tower is a supremely deep guild management simulation that spans generations. Build your adventurer guild from nothing. Recruit heroes, complete quests, and descend the mysterious tower to confront the power that lies within. \"}\n{\"appid\": 4486290, \"name\": \"Thunder Tank: Iron Shield\", \"reviews\": 203, \"positive_pct\": 82, \"usd_list_price\": 3.99, \"developer\": \"Crazy Studio\", \"short_description\": \"A relaxing strategy idle shooter that blends bullet hell action with backpack-like inventory management. Pilot your vehicle through a desolate, post-modern world, conquer 20 difficulty levels, collect diverse weapons, and build the ultimate firepower lineup to survive the wasteland.\"}\n{\"appid\": 4520940, \"name\": \"Doom Survivor: Horde Rush\", \"reviews\": 38, \"positive_pct\": 86, \"usd_list_price\": 2.99, \"developer\": \"Crazy Studio\", \"short_description\": \"Bullet hell meets Survivor-like Roguelite! Battle endless zombie hordes as unique heroes. Combine talent trees with 11 weapons (dragon guns, laser rifles) and gear (masks/wings) for explosive fire, lightning, or summon builds. Unlock heroes, master dodge, and dominate the apocalypse!\"}\n{\"appid\": 3171540, \"name\": \"Packmates\", \"reviews\": 38, \"positive_pct\": 73, \"usd_list_price\": 11.99, \"developer\": \"Digital Confectioners\", \"short_description\": \"Survivor roguelite meets inventory management. Collect items and master their adjacencies to unleash devastating combos. Obliterate enemies and battle bosses to overcome the corruption infiltrating your forest!\"}\n\nGROUP 2026_JulAug spatial_item_configuration 25\n{\"appid\": 3091140, \"name\": \"Lootbound\", \"reviews\": 1176, \"positive_pct\": 79, \"usd_list_price\": 14.99, \"developer\": \"ArtDock\", \"short_description\": \"Lootbound is a tactical roguelite with turn-based combat, loot management and D&D elements set in a dark fantasy world. Fight dangerous enemies, collect epic loot, recruit allies and lead them on a path of adventure.\"}\n{\"appid\": 4478640, \"name\": \"Backpack Dungeon\", \"reviews\": 622, \"positive_pct\": 88, \"usd_list_price\": 3.99, \"developer\": \"夜喵\", \"short_description\": \"A unique pixel-art backpack management roguelike. Your backpack isn't just storage—it's your combat core. Item placement, adjacency, and trigger mechanics determine your survival in the dungeon. A mental challenge of spatial planning and strategy.\"}\n{\"appid\": 2212910, \"name\": \"Expeditions: Samurai\", \"reviews\": 263, \"positive_pct\": 60, \"usd_list_price\": 29.99, \"developer\": \"Campfire Cabal\", \"short_description\": \"The sun rises on another civil war, as you land in Japan aboard a battered Dutch ship. Thrust into command of its motley crew, you must navigate the politics of Sengoku-era Japan using stealth, diplomacy, or violence in this party-based RPG where every choice matters.\"}\n{\"appid\": 3963030, \"name\": \"Pickle Pete\", \"reviews\": 179, \"positive_pct\": 84, \"usd_list_price\": 7.99, \"developer\": \"Nightowls\", \"short_description\": \"A roguelite bullet heaven where you dodge and auto-shoot through waves of enemies. Build devastating weapon, gear and mutation combinations with deep synergies. Face over 30 unique bosses across diverse biomes in this challenging arena shooter.\"}\n{\"appid\": 4843210, \"name\": \"Hell Deck\", \"reviews\": 164, \"positive_pct\": 88, \"usd_list_price\": 1.0, \"developer\": \"OFFMOON Inc.\", \"short_description\": \"Collect units and build powerful synergies on a restricted grid in Hell Deck, a dark roguelike deckbuilder defense game. Construct your own bizarre, twisted ecosystem through a brutal cycle of predation and sacrifice, and defend hell from the holy swarm \"}\n{\"appid\": 2372240, \"name\": \"Re:Night\", \"reviews\": 125, \"positive_pct\": 88, \"usd_list_price\": 13.99, \"developer\": \"Seahorse Games\", \"short_description\": \"Re:Night is a strategy game that blends turn based tactics with roguelike deckbuilding. In each run, build your deck, plan your tactics, and experiment with countless 3-character team combinations. Journey to a mysterious town, break the endless cycle of night, and bring dawn back to the world.\"}\n{\"appid\": 3399930, \"name\": \"Roulette Dungeon\", \"reviews\": 26, \"positive_pct\": 84, \"usd_list_price\": 8.99, \"developer\": \"Hooded Traveler Games\", \"short_description\": \"You're a gambling-addicted cat trying to break out of prison by spinning the roulette wheel!\\r\\nMaster the balance between strategic planning and unpredictable luck by placing bets, using special abilities, and collecting items to outsmart your foes and conquer the dungeon.\"}\n{\"appid\": 4871260, \"name\": \"Tetrogue\", \"reviews\": 21, \"positive_pct\": 100, \"usd_list_price\": 2.99, \"developer\": \"ExlaWare\", \"short_description\": \"Stack pieces, clear lines, slay monsters. A falling-block roguelike where every line cleared strikes your enemies.\\r\\nBattle through a monster-filled dungeon, collect synergistic relics and gems, and survive escalating challenges across a procedurally generated map.\"}\n\nGROUP 2026_JulAug loot_action_rpg 34\n{\"appid\": 3767850, \"name\": \"SpiritVale\", \"reviews\": 4579, \"positive_pct\": 49, \"usd_list_price\": 14.99, \"developer\": \"Baikun Interactive\", \"short_description\": \"A class-based action MMO inspired by classic RPGs. Explore a fractured world of monsters and ruins, build your own playstyle, and fight alongside friends in real-time, cooperative combat.\"}\n{\"appid\": 2001760, \"name\": \"Beast of Reincarnation\", \"reviews\": 4093, \"positive_pct\": 56, \"usd_list_price\": 59.99, \"developer\": \"GAME FREAK inc.\", \"short_description\": \"Game Freak's brand-new title: Beast of Reincarnation is an action RPG with a fusion of real-time and turn-based combat. Experience the innovative \\\"one-person, one-dog action RPG\\\" in the beautiful yet harsh world of Beast of Reincarnation. \\r\\n\\r\\nWhat awaits at the end of Emma and Koo's journey?\"}\n{\"appid\": 2244210, \"name\": \"Echoes of Aincrad\", \"reviews\": 4047, \"positive_pct\": 47, \"usd_list_price\": 69.99, \"developer\": \"Game Studio Inc.\", \"short_description\": \"Step into Aincrad, a world of beauty and danger where every battle could be your last. Create your hero, choose your gear, and master combat by building synergy with your partner, leveling up, and unlocking special abilities to expand your horizons.\"}\n{\"appid\": 2523770, \"name\": \"The Lord of the Rings: War in the North™ - Legacy Edition\", \"reviews\": 1738, \"positive_pct\": 83, \"usd_list_price\": 19.99, \"developer\": \"Aspyr Media\", \"short_description\": \"Step into a darker, grittier Middle-earth. The Lord of the Rings: War in the North™ - Legacy Edition expands Tolkien’s epic legendarium, delving into the brutal, untold story of Agandaûr, a Black Númenórean and servant of Sauron who has rallied an immense force in the ruins of Fornost.\"}\n{\"appid\": 4423580, \"name\": \"Shadow Dungeon\", \"reviews\": 1186, \"positive_pct\": 78, \"usd_list_price\": 9.99, \"developer\": \"OO Cat\", \"short_description\": \"Nightmarish monsters crawl forth from the darkness, while the Demon Lord lurks beneath the abyss. Venture into the Shadow Dungeon, carve your way through blood and chaos, and forge your own legendary epic.\"}\n{\"appid\": 4364910, \"name\": \"Ruins of Dawn\", \"reviews\": 819, \"positive_pct\": 72, \"usd_list_price\": 7.99, \"developer\": \"刷宝爱好者\", \"short_description\": \"A loot-driven action role-playing game (ARPG) crafted by a solo loot enthusiast. Switch classes anytime, with hundreds of random affix combinations for gear stats, a unique forging system, and tough bosses, rifts, ruins, and trials awaiting your challenge.\"}\n{\"appid\": 4958780, \"name\": \"Brimir: Pilgrimage to the Heart\", \"reviews\": 31, \"positive_pct\": 77, \"usd_list_price\": 11.99, \"developer\": \"MIMIR\", \"short_description\": \"When your pilgrim dies, that pilgrim is done. Kill monsters, absorb their runes, and build up legendary companions with gear, runes and awakenings over dozens of hours. A side-view permadeath action RPG — not a game of short repeatable runs. One death costs you, and one careless moment kills.\"}\n{\"appid\": 4848340, \"name\": \"Deadly Warrior\", \"reviews\": 30, \"positive_pct\": 60, \"usd_list_price\": 5.0, \"developer\": \"Zzy\", \"short_description\": \"Deadly Warrior is a loot-driven Action RPG. Venture into a magical fantasy world, battle endless monsters, explore dangerous dungeons, and challenge powerful bosses. Collect vast amounts of equipment and rare treasures to create your own ultimate build.\"}\n\nGROUP 2026_H1 party_tactical_rpg 81\n{\"appid\": 686060, \"name\": \"Mewgenics\", \"reviews\": 49614, \"positive_pct\": 89, \"usd_list_price\": 29.99, \"developer\": \"Edmund McMillen\", \"short_description\": \"Build the ultimate cat army through tactical breeding and send them into deep, challenging turn-based adventures. Draft abilities, collect items, and manipulate genetics across generations in this roguelike tactics game from the creators of The Binding of Isaac and The End is Nigh.\"}\n{\"appid\": 3054690, \"name\": \"NORSE: Oath of Blood\", \"reviews\": 2513, \"positive_pct\": 56, \"usd_list_price\": 34.99, \"developer\": \"Arctic Hazard\", \"short_description\": \"A Turn-Based Tactics game set in Viking-Age Norway. Build a settlement, forge alliances, and fight strategic battles. Manage a community of craftspeople, farmers, and warriors, as you grow strong on your path to vengeance in this story-rich saga.\"}\n{\"appid\": 2532480, \"name\": \"Warhammer 40,000: Mechanicus II\", \"reviews\": 2075, \"positive_pct\": 53, \"usd_list_price\": 39.99, \"developer\": \"Bulwark Studios\", \"short_description\": \"Fast-paced tactical combat meets strategic management in this sequel to the acclaimed Warhammer 40,000: Mechanicus. Take control of either the ancient and deathless Necron legions or the techno-religious acolytes of the Omnissiah, with the fate of a world in your hands.\"}\n{\"appid\": 2646320, \"name\": \"WindStop Strategy\", \"reviews\": 1492, \"positive_pct\": 78, \"usd_list_price\": 9.99, \"developer\": \"Xia Start\", \"short_description\": \"The young master of Hu Yan Men, SITU's peaceful life has been overturned, by a sudden massacre. The Windstop Strategy is a region-suppressing strategy   the new leader of Hu Yan Men, can you bring glory back and dominate the Windstop Valley?\"}\n{\"appid\": 3067930, \"name\": \"Labyrinth of Touhou Tri -The Dreaming Girls & The Mysterious Orbs-\", \"reviews\": 617, \"positive_pct\": 82, \"usd_list_price\": 19.99, \"developer\": \"Nise-Eikoku Studio\", \"short_description\": \"The girls of Gensokyo weave together a DRPG with not-so-easy boss fights! Form a party of 12 allies out of a pool of 40+, and create  with 1000+ skills to choose from! Hack, slash, and grow stronger, then make builds (or counter-builds!) to take down powerful bosses awaiting you in the dungeons!\"}\n{\"appid\": 1836560, \"name\": \"Aether & Iron\", \"reviews\": 513, \"positive_pct\": 84, \"usd_list_price\": 24.99, \"developer\": \"Seismic Squirrel\", \"short_description\": \"Immerse yourself in this Decopunk Narrative RPG set in an alternate 1930s where anti-gravitational technology has taken cars, roads, and even New York City into the sky. Muster a crew, master tactical turn-based combat, and unravel the dark secrets lurking beneath the floating metropolis.\"}\n{\"appid\": 4210680, \"name\": \"Twisted Fate\", \"reviews\": 39, \"positive_pct\": 89, \"usd_list_price\": 7.99, \"developer\": \"Game Dynasty\", \"short_description\": \"A turn-based roguelike with a deep ability-modification system. Lead a party of three heroes, adapt their skills using modifiers, collect artifacts, and craft unique builds to destroy the source of corruption… or die trying.\"}\n{\"appid\": 3826370, \"name\": \"Headquarters: Cold War\", \"reviews\": 37, \"positive_pct\": 64, \"usd_list_price\": 29.99, \"developer\": \"Starni Games\", \"short_description\": \"Headquarters: Cold War is a fast-paced turn-based strategy game set in a hypothetical 1984 conflict between NATO and the USSR. Play as both sides and command helicopters, tanks, and infantry across 20 campaign missions and rewrite the outcome of modern history.\"}\n\nGROUP 2026_H1 familiar_carrier 95\n{\"appid\": 3509230, \"name\": \"Gambonanza\", \"reviews\": 1577, \"positive_pct\": 74, \"usd_list_price\": 14.99, \"developer\": \"Blukulélé\", \"short_description\": \"Gambonanza is a tactical roguelike that sets chess pieces on a tiny board. Forget traditional chess and embrace the chaos of breaking the balance! Spend your money on rule-bending upgrades, board tiles and pieces. Experiment with illegal combinations and face off against iconic bosses!\"}\n{\"appid\": 3542380, \"name\": \"Rune Dice\", \"reviews\": 1239, \"positive_pct\": 79, \"usd_list_price\": 14.99, \"developer\": \"Smart Raven Studio\", \"short_description\": \"Tactical deckbuilding in bite-sized sessions. Launch dice to create magical chain reactions. Choose from distinct hero classes with unique abilities. Build synergies between dice, relics, and runes to defeat challenging bosses.\"}\n{\"appid\": 3430340, \"name\": \"Dice A Million\", \"reviews\": 1047, \"positive_pct\": 90, \"usd_list_price\": 12.99, \"developer\": \"countlessnights\", \"short_description\": \"Have you ever tried to roll 1,000,000 on a set of dice? No? Build the right bag of die, and you might just pull it off.\"}\n{\"appid\": 3481020, \"name\": \"Apokerlypse\", \"reviews\": 609, \"positive_pct\": 81, \"usd_list_price\": 9.99, \"developer\": \"Breaker Games\", \"short_description\": \"A card-strategy roguelike inspired by a variety of poker games. You play as a highly skilled card shark in the Tavern at the End of the World, combining all kinds of demon chips to rewrite the rules of play, compete with players from across the globe, and ultimately rise to the top.\"}\n{\"appid\": 3532360, \"name\": \"Pirate's Gambit\", \"reviews\": 452, \"positive_pct\": 89, \"usd_list_price\": 9.99, \"developer\": \"Domestic Black Cat\", \"short_description\": \"Pirate's Gambit takes you on an unpredictable voyage, blending deck-building with Yacht Dice mechanics. Roll the dice in the dimly lit cabin, where fate shifts with every turn. Are you closing in on treasure or something far more sinister?\"}\n{\"appid\": 2622820, \"name\": \"Dobbel Dungeon\", \"reviews\": 438, \"positive_pct\": 92, \"usd_list_price\": 19.99, \"developer\": \"Gamepie\", \"short_description\": \"Gather your party, roll your dice and battle across the islands to put an end to a powerful curse once and for all in this roguelike turn-based tactical RPG!\"}\n{\"appid\": 4218600, \"name\": \"Blackjack Roulette\", \"reviews\": 30, \"positive_pct\": 83, \"usd_list_price\": 2.99, \"developer\": \" DreamArk Lab\", \"short_description\": \"Blackjack meets roulette in a deadly duel. Lose a hand, pull the trigger. Use powerful cards to outsmart opponents in 1v1 battles, or defeat the Clown to escape. Win or die.\"}\n{\"appid\": 4131940, \"name\": \"Shattered Chess\", \"reviews\": 28, \"positive_pct\": 100, \"usd_list_price\": 7.99, \"developer\": \"Arti Works\", \"short_description\": \"Chain massive combos, build game-breaking synergies, and survive rule-changing bosses in this fast-paced roguelike twist on chess.\"}\n\nGROUP 2026_JulAug party_team_composition 80\n{\"appid\": 2075800, \"name\": \"STAR WARS Zero Company™\", \"reviews\": 14382, \"positive_pct\": 80, \"usd_list_price\": 49.99, \"developer\": \"Bit Reactor\", \"short_description\": \"Command an elite squad through a gritty and authentic story in STAR WARS Zero Company™, a single-player turn-based tactics game set in the twilight of the Clone Wars™.\\r\\n\"}\n{\"appid\": 3787240, \"name\": \"MARVEL Tōkon: Fighting Souls\", \"reviews\": 4814, \"positive_pct\": 48, \"usd_list_price\": 59.99, \"developer\": \"ARC SYSTEM WORKS CO., LTD\", \"short_description\": \"Assemble your team of legendary Marvel characters in the ultimate 4v4 tag team fighter.\"}\n{\"appid\": 2244210, \"name\": \"Echoes of Aincrad\", \"reviews\": 4047, \"positive_pct\": 47, \"usd_list_price\": 69.99, \"developer\": \"Game Studio Inc.\", \"short_description\": \"Step into Aincrad, a world of beauty and danger where every battle could be your last. Create your hero, choose your gear, and master combat by building synergy with your partner, leveling up, and unlocking special abilities to expand your horizons.\"}\n{\"appid\": 3448650, \"name\": \"Aliens: Fireteam Elite 2\", \"reviews\": 3154, \"positive_pct\": 62, \"usd_list_price\": 49.99, \"developer\": \"Cold Iron Studios\", \"short_description\": \" This is a fight for survival. Xenomorphs swarm in overwhelming numbers. Every room could be your last. \"}\n{\"appid\": 3934270, \"name\": \"How Many Dudes?\", \"reviews\": 2817, \"positive_pct\": 89, \"usd_list_price\": 14.99, \"developer\": \"Butterscotch Shenanigans\", \"short_description\": \"How many dudes does it take to beat up a gorilla? A thousand toddlers? A horse-sized duck? A GOD? Enter the Dude Ranch and find out in this roguelike dudebuilder where you recruit an army of dudes to fight ridiculous battles. \"}\n{\"appid\": 3929470, \"name\": \"Warhounds\", \"reviews\": 746, \"positive_pct\": 71, \"usd_list_price\": 34.99, \"developer\": \"Everplay DMCC\", \"short_description\": \"Warhounds is a turn-based tactical game about an elite mercenary squad with an old-school action movie vibe, inspired by XCOM and Jagged Alliance. Recruit unique fighters, upgrade your base, and fight for Africa’s future. Less fake RNG, more true ballistics and lethal tactics.\"}\n{\"appid\": 4597030, \"name\": \"Hillforts\", \"reviews\": 37, \"positive_pct\": 86, \"usd_list_price\": 7.99, \"developer\": \"Five Head Games\", \"short_description\": \"Hillforts is a medieval card-based autobattler. Build an army, research technologies, upgrade your units, and siege the enemy castle!\"}\n{\"appid\": 4214610, \"name\": \"100FRIENDS\", \"reviews\": 30, \"positive_pct\": 86, \"usd_list_price\": 9.99, \"developer\": \"TWIN PIXELS\", \"short_description\": \"100FRIENDS is a brick-breaker where your ammo is 100 friends. Launch chefs, grandmas, vampires, and other friends at waves of enemies, build-crafting ridiculous chain reactions. This charming incremental roguelite, with incredible build depth, will leave you eager for one more friend :) \"}\n"}

[Think]

**Fixing the exclusion rule**

[Think]

**Fixing the exclusion rule**

**Updating exclusion rule**

[Think]

**Fixing the exclusion rule**

**Updating exclusion rule**

[Think]

**Fixing the exclusion rule**

**Updating exclusion rule**

[Think]

**Fixing the exclusion rule**

**Updating exclusion rule**

**Narrowing spatial-build filter**

[Think]

**Defining case selection criteria**

[Think]

**Defining case selection criteria**

[Think]

**Defining case selection criteria**

**Refining classification boundaries**

[Think]

**Defining case selection criteria**

**Refining classification boundaries**

The 2026 results make one distinction especially important: a high review count can include a lot of dissatisfied players. Some of the apparent strength in newer loot/action RPGs comes from heavily discussed games with mixed ratings, so I’m checking substantial positive response alongside raw review volume.

I’m also narrowing the spatial-build screen: ordinary inventory storage or home decoration shouldn’t count as items interacting through placement.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"431f34","wall_time_seconds":1.001367118,"session_id":52442,"original_token_count":17,"output":"Additional centrally marketed idle/incremental records excluded: 64\n"}

[Think]

**Checking positive calibration setup**

[Think]

**Checking positive calibration setup**

**Checking threshold robustness**

[Think]

**Checking positive calibration setup**

**Checking threshold robustness**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -3 /home/adn/a327ex/steam-research/build-expression-2026-09-05/an...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"95d3e6","wall_time_seconds":0.267169485,"exit_code":0,"original_token_count":1499,"output":"2026_JulAug            crafting_fusion  189     5.0     30    0.159                        1.157         188              0.173\n2026_JulAug      claims_50plus_options  110     3.0     15    0.136                        1.081         110              0.422\n2026_JulAug     claims_100plus_options   71     4.0     12    0.169                        1.215          71              0.467\n     period                 family    n  ge100  rate100  positive80_ge100  positive100_rate  positive100_price_ratio  within_build_ratio100_price  top1_review_share\n       2025     all_build_promises 1365    296    0.217               181             0.133                    1.000                        1.000              0.196\n       2025            cards_decks  339     68    0.201                45             0.133                    0.942                        0.872              0.237\n       2025  roguelike_deckbuilder  101     37    0.366                26             0.257                    1.526                        1.320              0.268\n       2025 party_team_composition  191     48    0.251                32             0.168                    1.116                        1.009              0.237\n       2025       action_roguelike  327     68    0.208                42             0.128                    1.186                        1.193              0.544\n       2025           auto_battler   76     21    0.276                13             0.171                    1.221                        1.219              0.605\n       2025     party_tactical_rpg  116     23    0.198                12             0.103                    0.671                        0.777              0.428\n       2025        loot_action_rpg   95     29    0.305                14             0.147                    0.958                        1.191              0.365\n       2025       familiar_carrier   81     18    0.222                11             0.136                    1.093                        1.130              0.638\n       2025   spatial_build_effect    9      2    0.222                 1             0.111                    1.183                        1.562              0.717\n       2025 claims_100plus_options  138     39    0.283                26             0.188                    1.237                        1.126              0.287\n    2026_H1     all_build_promises 1085    171    0.158               101             0.093                    1.000                        1.000              0.318\n    2026_H1            cards_decks  287     40    0.139                28             0.098                    0.940                        0.790              0.803\n    2026_H1  roguelike_deckbuilder   80     22    0.275                15             0.188                    1.532                        1.308              0.311\n    2026_H1 party_team_composition  152     27    0.178                17             0.112                    1.062                        1.034              0.662\n    2026_H1       action_roguelike  282     37    0.131                21             0.074                    1.045                        1.095              0.194\n    2026_H1           auto_battler   66     13    0.197                 9             0.136                    1.354                        1.218              0.351\n    2026_H1     party_tactical_rpg   81     14    0.173                 7             0.086                    0.884                        1.009              0.829\n    2026_H1        loot_action_rpg   66     14    0.212                 8             0.121                    1.075                        1.095              0.307\n    2026_H1       familiar_carrier   95     14    0.147                 8             0.084                    0.854                        0.893              0.198\n    2026_H1   spatial_build_effect    9      2    0.222                 0             0.000                    0.000                        1.191              0.553\n    2026_H1 claims_100plus_options  114     26    0.228                19             0.167                    1.476                        1.195              0.619\n2026_JulAug     all_build_promises  632     75    0.119                45             0.071                    1.000                        1.000              0.173\n2026_JulAug            cards_decks  167     18    0.108                15             0.090                    1.165                        0.829              0.225\n2026_JulAug  roguelike_deckbuilder   39      8    0.205                 7             0.179                    1.596                        1.056              0.272\n2026_JulAug party_team_composition   79     17    0.215                 8             0.101                    1.173                        1.438              0.430\n2026_JulAug       action_roguelike  156     11    0.071                 6             0.038                    0.657                        0.724              0.276\n2026_JulAug           auto_battler   35      3    0.086                 3             0.086                    1.313                        0.795              0.349\n2026_JulAug     party_tactical_rpg   46      8    0.174                 4             0.087                    0.935                        1.148              0.851\n2026_JulAug        loot_action_rpg   34     10    0.294                 2             0.059                    0.702                        2.040              0.248\n2026_JulAug       familiar_carrier   58      4    0.069                 2             0.034                    0.476                        0.552              0.176\n2026_JulAug   spatial_build_effect    7      2    0.286                 2             0.286                    3.385                        1.819              0.690\n2026_JulAug claims_100plus_options   71     12    0.169                 8             0.113                    1.358                        1.215              0.467\n"}

[Think]

**Checking Steam tag rankings**

[Think]

**Checking Steam tag rankings**

[Think]

**Checking Steam tag rankings**

**Testing tag-rank variants**

[Think]

**Checking Steam tag rankings**

**Testing tag-rank variants**

[Think]

**Checking Steam tag rankings**

**Testing tag-rank variants**

[Think]

**Checking Steam tag rankings**

**Testing tag-rank variants**

**Testing rating thresholds**

[Think]

**Checking Steam tag rankings**

**Testing tag-rank variants**

**Testing rating thresholds**

[Think]

**Checking Steam tag rankings**

**Testing tag-rank variants**

**Testing rating thresholds**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 3.2 seconds
Output:

{"chunk_id":"2c9bf1","wall_time_seconds":2.991832806,"exit_code":0,"original_token_count":472,"output":"Supply length check 9140 843 12409 1717 expected from 2025 word-count mix 1233.7150626651155\n                  tag  rank      period   n  ge100  positive100\nRoguelike Deckbuilder     5        2025 116     45           30\nRoguelike Deckbuilder     5     2026_H1  94     26           16\nRoguelike Deckbuilder     5 2026_JulAug  47      9            8\nRoguelike Deckbuilder    10        2025 139     56           36\nRoguelike Deckbuilder    10     2026_H1 105     29           18\nRoguelike Deckbuilder    10 2026_JulAug  53     10            9\nRoguelike Deckbuilder    20        2025 169     62           41\nRoguelike Deckbuilder    20     2026_H1 132     33           22\nRoguelike Deckbuilder    20 2026_JulAug  67     11           10\n     Action Roguelike     5        2025 348     71           44\n     Action Roguelike     5     2026_H1 298     38           22\n     Action Roguelike     5 2026_JulAug 165     12            7\n     Action Roguelike    10        2025 409     82           52\n     Action Roguelike    10     2026_H1 337     47           26\n     Action Roguelike    10 2026_JulAug 193     17           11\n     Action Roguelike    20        2025 449     90           58\n     Action Roguelike    20     2026_H1 361     50           29\n     Action Roguelike    20 2026_JulAug 204     18           12\n         Auto Battler     5        2025  76     21           13\n         Auto Battler     5     2026_H1  66     13            9\n         Auto Battler     5 2026_JulAug  35      3            3\n         Auto Battler    10        2025  98     25           15\n         Auto Battler    10     2026_H1  81     14            9\n         Auto Battler    10 2026_JulAug  39      3            3\n         Auto Battler    20        2025 121     32           20\n         Auto Battler    20     2026_H1  90     15            9\n         Auto Battler    20 2026_JulAug  46      5            5\n"}

[Think]

**Checking deck-tag scope**

[Think]

**Checking deck-tag scope**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 1.4 seconds
Output:

{"chunk_id":"cf8392","wall_time_seconds":1.23830432,"exit_code":0,"original_token_count":1402,"output":"\n cards_decks   appid                                                        name  reviews  positive_pct                                                                                                                                                                                                                                                                                   short_description\n2868840                                            Slay the Spire 2   182020            61                                                                                                                                               The iconic roguelike deckbuilder returns. Craft a unique deck, encounter bizarre creatures, and discover relics of immense power in Slay the Spire 2!\n3265700 Vampire Crawlers: The Turbo Wildcard from Vampire Survivors    18362            96                                             From the creators of Vampire Survivors comes a turbo-charged, turn-based roguelite deckbuilder! Deal world-ending combos, blitz through infested dungeons, and master the Turboturn to obliterate hordes of familiar foes with a chaotic hand of cards.\n3784030                              RACCOIN: Coin Pusher Roguelike     4202            82                                           A coin-pushing dopamine machine.\\r\\nRACCOIN is a roguelike deckbuilder where you combine special coins with powerful items to trigger wildly satisfying combos. Stack shiny towers, spin the lucky wheel, and shake the machine until all the coins drop.\n2842800                                        Dream of Corpse Lady     2066            92 Cards, battle! Someone woke up the sleeping Corpse Lady... Perhaps, the world needs to pay a price for the awakening... In this game, you will play the role of the awakened Corpse Lady, try various strange construction combinations, discover powerful opponents, and then knock them all down!\n\n roguelike_deckbuilder   appid                           name  reviews  positive_pct                                                                                                                                                                                                                                                 short_description\n3784030 RACCOIN: Coin Pusher Roguelike     4202            82         A coin-pushing dopamine machine.\\r\\nRACCOIN is a roguelike deckbuilder where you combine special coins with powerful items to trigger wildly satisfying combos. Stack shiny towers, spin the lucky wheel, and shake the machine until all the coins drop.\n3100370                   Black Jacket     1717            91 Gamble your way out of hell in this blackjack-inspired rogue-lite deckbuilder. Play powerful card combos or cheat to outwit your opponents and earn your freedom. Win their Soul coins! Bribe the ferryman! And uncover the story of those who stand in your way.\n3709430    Witch's Apocalyptic Journey     1252            84                                            Abyss decayed, witches awaken. As their guide, you will weave their destinies. Craft unique cards, schedule their days, shape endless possibilities through deckbuilding. Each choice will lead to different Ending...\n3430340                 Dice A Million     1047            90                                                                                                                                           Have you ever tried to roll 1,000,000 on a set of dice? No? Build the right bag of die, and you might just pull it off.\n\n auto_battler   appid        name  reviews  positive_pct                                                                                                                                                                                                                                   short_description\n3400960 Oaken Tower     2889            89                                                                                Oaken Tower is a synergy-heavy PvP auto battler where your tower of items fights other players. Build deadly combos and scale exponentially. Every decision matters.\n3199360 Skull Horde     1070            81                                        Skull Horde is an auto battler dungeon crawler where you play as a flying skull necromancer. Find powerful loot and create overpowered builds. Summon a horde of skeletons in a battle of bone versus flesh!\n4283360 Legionbound      642            83 Turn a handful of heroes into a massive legion! Legionbound is a casual retro RPG autobattler where you recruit heroes, discover class synergies, forge powerful Ascensions, and battle through hordes of enemies across replayable roguelite runs.\n4206270   Wireworks      602            89                                                         Design your defenses, build your module board, and manage your wires. Combine signals and create synergies to empower your weapons and survive in this base-defense roguelike auto-battler.\nspire2 2868840                   tag  rank\n            Roguelike     1\n            Card Game     2\n         Deckbuilding     3\n                Co-op     4\n             Strategy     5\nRoguelike Deckbuilder     6\n          Multiplayer     7\n    Turn-Based Combat     8\n         Card Battler     9\n                Indie    10\n            Difficult    11\n            Roguelite    12\n         Early Access    13\n                   2D    14\n         Singleplayer    15\n         Replay Value    16\n      Dungeon Crawler    17\n              Fantasy    18\nProcedural Generation    19\n           Mouse Only    20\n"}

[Think]

**Comparing tagged review cohorts**

[Think]

**Comparing tagged review cohorts**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

**Computing full-tag ratios**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

**Computing full-tag ratios**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

**Computing full-tag ratios**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

**Computing full-tag ratios**

**Adding context-based build filters**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

**Computing full-tag ratios**

**Adding context-based build filters**

[Think]

**Comparing tagged review cohorts**

**Refining tag-based cohorts**

**Computing full-tag ratios**

**Adding context-based build filters**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 2.0 seconds
Output:

{"chunk_id":"6188b4","wall_time_seconds":1.869073372,"exit_code":0,"original_token_count":100,"output":"Tower Defense 2025 99 23 15\nTower Defense 2026H1 84 15 9\nTower Defense 2026JulAug 48 2 1\nRoguelike Deckbuilder 2025 169 62 41\nRoguelike Deckbuilder 2026H1 132 33 22\nRoguelike Deckbuilder 2026JulAug 67 11 10\nAuto Battler 2025 121 32 20\nAuto Battler 2026H1 90 15 9\nAuto Battler 2026JulAug 46 5 5\nAction Roguelike 2025 449 90 58\nAction Roguelike 2026H1 361 50 29\nAction Roguelike 2026JulAug 204 18 12\n"}

[Think]

**Comparing build-market signals**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

**Preparing capped Steam reviews**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

**Preparing capped Steam reviews**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

**Preparing capped Steam reviews**

**Setting Steam review limits**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

**Preparing capped Steam reviews**

**Setting Steam review limits**

[Think]

**Comparing build-market signals**

**Sampling ARPG review text**

**Preparing capped Steam reviews**

**Setting Steam review limits**

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"5f0860","wall_time_seconds":1.000777349,"session_id":88285,"original_token_count":0,"output":""}

Roguelike-deckbuilder-tagged build games are showing the most consistent positive-response advantage across the 2025 and 2026 windows. Generic action-roguelike build promises look more crowded, particularly in the newest window.

To understand the mixed reception in newer loot RPGs, I’m going to inspect a small, fixed sample of Steam reviews: at most 30 positive and 30 negative English reviews for each of five games. That is a few metadata requests, with no images or other assets.

exec ({"code": "text(await tools.exec_command({cmd:\"python - <<'PY'\nfrom pathlib import Path\np=Path('/home/adn/a327ex/...)

Script completed
Wall time 2.3 seconds
Output:

{"chunk_id":"209694","wall_time_seconds":1.001528347,"session_id":75115,"original_token_count":0,"output":""}
{"chunk_id":"4becc7","wall_time_seconds":1.001327692,"session_id":21584,"original_token_count":0,"output":""}

[Think]

**Auditing sample evidence**

[Think]

**Auditing sample evidence**

**Sampling review data**

[Think]

**Auditing sample evidence**

**Sampling review data**

[Think]

**Auditing sample evidence**

**Sampling review data**

exec ({"code": "text(await tools.exec_command({cmd:\"tail -4 /home/adn/a327ex/steam-research/build-expression-2026-09-05/re...)

Script completed
Wall time 0.0 seconds
Output:

{"chunk_id":"866f5d","wall_time_seconds":0.000002849,"exit_code":0,"original_token_count":125,"output":"Sample complete 273 reviews; 10 requests. Bulk network collection disabled again.\n2026_JulAug      action_roguelike_tag20  204     3.0     18    0.088                        0.875         204              0.210\n2026_JulAug          auto_battler_tag20   46     4.5      5    0.109                        1.088          46              0.279\n2026_JulAug         tower_defense_tag20   48     2.0      2    0.042                        0.457          48              0.183\nSat Sep  5 23:27:44 UTC 2026\n"}
{"chunk_id":"4ab743","wall_time_seconds":0.000004364,"exit_code":0,"original_token_count":0,"output":""}

[Think]

**Saving core findings now**

[Think]

**Saving core findings now**

[Think]

**Saving core findings now**

**Refining market findings**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nimport pan...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"8c6498","wall_time_seconds":0.234456811,"exit_code":0,"original_token_count":8978,"output":"Warning: truncated output (original token count: 8978)\nTotal output lines: 231\n\ngame                    sample_sentiment\nBeast of Reincarnation  negative            30\n                        positive            30\nEchoes of Aincrad       negative            30\n                        positive            30\nRuins of Dawn           negative             5\n                        positive            28\nShadow Dungeon          negative            30\n                        positive            30\nSpiritVale              negative            30\n                        positive            30\ndtype: int64\n\nGAME SpiritVale\nnegative 234068367 pros: \n+ great grinding loop (when the server is table)\n+ unlimited free skill and stat/attribute reset \n+ cash shop only for cosmetic\n+ every item ingame can become cosmetic that cost a low amount of ingame currency, this includes pet and mount\n+ some class with movement skill can skip/hop between terrain (probably not intended)\n+ decent gear upgrade system\n+ free to hop between server from different region\n\ncons:\n- limited hotkey function and horrible minimap\n- no story/lore, currently it feels more like online grinding simulator than mmorpg, there is not much sense of purpose\n- majority part of community is extremely toxic\n- rampant bot, rmt, and possible hacks (you will see some people blinking and one shotting through map)\n- economy is beyond saving, some item listed over hundred of millions in less than 2 months of early access release\n- listing item on market cost ingame currency instead only taxing after the item get purchased\n- frequent unplayable lags even at low ping server due to lack of server capacity\n- frequent server reset\n- horrible class balancing that can affect endgame player joining a party\n- possible of wrong ban due to unprofessional staff (just a player recruited via discord form) and devs favoring some group of player based from some people reports, which a pretty common practice on indie mmo\n\nnot recommended to play on current state, if you do want to try treat it as single playe game because unless you play meta you're not getting into any party\n\nif server stability, economy, and bot issue is not fixed i can see the game bleeding player within the\nnegative 233731007 If you see my message, please read it carefully. I, along with 8-10 other players (and many more I haven't contacted), have been experiencing system issues, including trading and market access being suspended for days—up to 15 days or more. The developers have directed us to submit tickets for investigation, but they haven't responded at all. No one has ever received a reply, and no one has ever reported being helped to regain access to the game. This doesn't even include bans for botting, even though they didn't use it, or suspensions simply for logging in. To this day, we haven't received any assistance. We tried posting a thread on the official Discord server to appeal, but comments were disabled, even though the developers stated that posts were allowed and that similar issues should be consolidated into a single post. They've closed it, attempting to hide the problem. And one developer even responded to our appeals for justice with, \"But from what I've seen so far, the majority and especially the extra loud ones have not been innocent.\" Truly impressive. This is the kind of development team supposed to support and assist you. Just because you're lucky today doesn't mean you'll be lucky forever. Because some players are getting suspended just for trading items with friends in the game, accused of RMT (Random Item Trading), or even those trading items for in-game gold are getting suspended. This system is an automated detection system, meaning we have no way of knowing what we might be doing wrong. And even if we're innocent, we can't do anything because they don't care \nnegative 233773464 After 700 hours of farming all my gear, I decided to grind again for the new equips and sets when they released the new map. Then I got manually banned for botting just because I'm playing Wizard standing still and spamming all my skills using a controller. The controller auto-targets nearby mobs anyway, so apparently using a feature that the game supports can now get you banned.\n\nI appealed and received a generic response saying I was botting without them even properly checking what happened.\n\nThis is honestly pure power tripping. They can just ban you and accuse you of botting without properly investigating even when this is clearly part of the game's design. The game supports controllers to make farming easier, not to get players banned for using them. After spending 700 hours farming all my gear, this is how I get treated.\nnegative 234539600 I like the idea of the game with the grind, as i primarily like to grind mobs in mmos and doing gvgs. this game only has grind mobs for now.\n\nI enjoy grinding here, if i can find somewhere without bots or players mindlessly griefing - but that's really not an easy task. most maps really only support 1 person grinding there - the respawn time is really short like 15-25 seconds, but the maps are really that SMALL, which is flabbergasting to me in a grinding game.\nTHERE IS SO MANY BOTS.. and there is also a lot of people that will simply try to grief you out of your spot, despite it violationg rule 7 about player conduct, and keeping a good gamer etiquette - players in this game isnt nice at all (unless you know them of course), but no1 cares about anyone else or common courtesy.\n\nThis game badly needs other means to making money - those life skills needs to come soon and be competitive money with grinding. We need gvg/sieges etc. \nAnd maps needs to be WAY BIGGER. 5 people should be able to grind on a map in my opinion. Even if all bots was gone, it would still be griefing hell with ego players.\n\nI have a lot of hours here, as i like the core game - but the bots and players in it destroys the game for me. I have never played a game with so many griefing ego players - i guess its because servers are usually region locked and eu people maybe are more civialised.. or maybe this kind of game just attracts scum.\n\nBecause of the bots and the general community behaviour currently, i cannot recommend the game.\nnegative 234537066 It's not recommended to play this game.\nThere are only RMT players and bots left. The original players have all been false banned.\npositive 234277140 RECOMMENDED\r\n\r\nLong story short, if you like Ragnarok Online, MMOs or ARPGs (Path of Exile, Diablo, etc), then you'll probably like this. \r\n\r\nGame stability:\r\n- So far a lot of frame drops have been addressed. No longer experiencing frame drops during long play times compared to the demo. \r\n- The marketplace has been reactivated after a few weeks that it was down. They've also added search filtering which is a good QoL addition. \r\n\r\nServer stability:\r\n- Servers are now stable even at peak times. No longer had the need to transfer to other regions just to play. Party, storage, marketplace and chat restructuring worked wonders with how the servers are running right now\r\n- Servers still restart every now and then, same as the demo, annoying but non-blocking.\r\n\r\nBuild variety and balance:\r\n- High build variety per class. You can build for the same playstyle with differing gear. Not all builds are viable though, but I think the devs are aware of this based on the recent buffs to necro (v0.31). \r\n- Still needs a lot of tweaking for most builds and classes.\r\n- Weaver still needs to be reworked/rebalanced to make it viable for endgame and make it less overwhelming in normal maps/leveling (for other players of course).\r\n\r\nContent updates:\r\n- 2 new maps, new enemies and bosses, and a variety of late game items have been added after a month (v0.31). \r\n\r\nSteam reviews:\r\n- As someone who buys and plays a lot of indie and early access titles, this is the first game i've observed to have some of the most ridiculous reviews I've ever read. From literal slander to bot farms, RMTers, idle pl\npositive 234159506 Cute little MMO with a charming artstyle and surprisingly good music.\n\n+ Nice Artstyle\n+ Varied Classes\n+ Varied Areas\n+ Tons of class optimisations and items to grind for\n+ Most items that drop from enemies can also be bought from vendors\n+ Mostly un-restricted in-game marketplace (aka not many items are trade-restricted yet)\n\n- The game is infested with bots\n- The class balance is very off (You will see the weaver class EVERYWHERE)\n- The games anti-cheat (if any) is very weak, players are teleporting and insta-killing everything\n\nIf you are a fan of MMOs then go and give this one a try.\nBut you probably will have to switch channels all the time to get out of maps with kill-stealing bots in them.\nOr just wait for the bot problem to (hopefully) be resolved in the future.\n\n\nGAME Beast of Reincarnation\nnegative 233851435 I really wish I could recommend this game, I really do. I am not sure I'd recommend buying this even at a deep discount. This game had a lot of potential, a lot of good ideas, but the execution of every single system is just completely broken.\n\nThe story has a decent setup. It is obviously going for a bit of a Nier vibe, and with some better writing it maybe could have been good. But as it is, it is really bad. The game spends 10 chapters being vague, repeating a lot of vague dialogue over and over again in extremely stilted cutscenes (both in terms of animation and dialogue delivery), then you have one chapter where you just hold forward to walk and open doors while the entire lore of the game is dumped on you. Then right after that you go into the final chapter where even more lore is dumped on you. It becomes extremely tedious.\n\nThe combat is extremely underwhelming. The game has a variety of weapons and skills for both Emma and Koo but none of it really matters. You just need the sword which has the element that the boss is weak to (all swords have the same base damage, they just differ in the elemental damage they do). If you want. It doesn't really matter cause even without upgrading much, you will easily 2-3 hit bosses with your full combo by the end of the game. That is, if you can get a full combo in since the bosses just hit once or twice, you parry them and then they run away. And then they repeat the same combo and run away. Because each boss has 1 or 2 attack combos at most and that is that. Combat soon loses all sense of strategy and devolves into chasing the \nnegative 234138604 i dont think i can recommend the game, unfortunately. it didnt feel very fun to explore, and upgrades were locked behind exploration. \nThe movement, combat and general gameplay skills are all very good, but they are all almost unsupported by the game itself. exploration doesnt reward you with unique weapons or cool abilities, it mostly just gives you arrows for a bow you dont have yet and upgrade material you cant use because you need to explore more to level up your house to spend the upgrade material. its just kind of tedious.\nnegative 233860511 This is probably one of the easier 'Souls Like' you'll play. \r\n\r\nIt can be difficult to tell how much they want you invested in the story for several reasons; 1) The English Voice actors, with the exception of Brad, suck. They come off as very flat and almost stutter-y. 2) The story is supposed to be somber I guess, but they try to accomplish this with quiet voices, pauses in sentences that don't really need to be there and an alright if not bland sound track. \r\n\r\nOther story issues I have that don't relate to the tone are as follows: 1) the prologue and throughout the first zone of the game have a flashforward and several flashbacks designed to show you how to play using the basics. I have a deep dislike of this because by flashing forward it spoils parts of the story (plus there is a day cycle, so if you wanted to you could absolutely mess around until you've been traveling for '9' months and the prologue is just wrong) and all of the flashbacks teach you things you already know. 2) They do the really stupid thing where [spoiler] you're fighting and beating a boss, but for story purposes you are not allowed to win, so they cutscene you into failing. [/spoiler] \r\n\r\nI'm trying to remember back to Dark Souls, and I think the maps here are even emptier than that. There really isn't much loot or very many enemies so far for me. I could be proven wrong but I'm comparing this to how fast I maxed affection with the dog and the cook. \r\n\r\nIt isn't a terrible game, but it just feels a bit boring overall. If you want a Souls Like with only one kind of main weapon and really want to s\nnegative 234551565 The game is a very casual sekiro like in playstyle. The only nice thing i could say about the game, is it has amazing graphics. The review goes downhill from here.\n\nAs you play the game, the scenery that you found amazing, soon you'll realize alot of the assets are copy pasted without any touchup to make it look different. The few soundtracks the game has you will hear it throughout the entire game. The enemies don't have much variety. Even moving on to new maps and chapters, you'll still end up fighting the same enemies. The subtitles seem to have been localized, they don't match the japanese voices and the meaning is changed. The story seem to have been written by an untalented writer. Alot of useless dialogue that does not progress the characters or story. The story itself isn't interesting. They keep you in suspense clueless about the story for so long, till you reach a certain chapter, where you can't run or interact with objectives or campfire, cause the story is being spammed hard in the dialogue, and yes you gota wait for the long unskippable dialogue to finish before you can continue. The game features a new game + with an additional diffeculty level that has a seperate achievement for it. The only problem is, the dialogue throughout the story cannot be skipped if you decide to go for it. You'd think ok new game plus and a new diffeculty, maybe a new ending? Nope stuck to 1 ending sorry.\n\nTLDR: get it on sale.\nnegative 234462449 I did not like the game play, the doge and the mechanics are less than what it was expected!\npositive 234256603 If you enjoy games that are not as hardcore as actual soulslikes, this will be for you, similar in difficulty to the Star Wars Jedi games, or Clair Obscur, Kena etc. The story and characters are interesting so far, lots to explore, lots of loot and upgrading. And Koo is of course adorable <3\npositive 234231863 Gorgeous flowery wall-jumping no-grind monster hunter/death stranding alternative.\r\nSo prettyyyyyyyyyyyyy omg! The flowers and the views and the wolf and the movement are all gorgeous.\r\nThe story is plenty good enough I think. Yes there are maybe 5 total songs. But who is focusing on that? the beautiful and easy listening songs blend in nicely for me to the point where they tickle my ears but do not take focus away from the views and the extremely satisfying combat.\r\nI want to try every single move and spec.\r\n…1478 tokens truncated… own person I was disappointed to find that it was a very basic customization that you could find on a mobile game. how is oblivion from 2007 still better at it than a game that was advertised to do amazing things. the combat is also sad, once you get past the janky hitboxes and bad AI you realize that you can just spam 2 skills and a heavy and boom next boss. very \"engaging\" \nCalling it open world is a spit in the face, you have a route and a few side paths that are optional for recipes and random items, you have invisible walls and 8 feet falls that send you back up. if you tire of the normal map, you have copy pasted dungeons with the only difference being the enemies as well. Yay\nthe customization with type 1 and type 2 bodies instead of male and female is also gross but honestly is just a side note.\nthere were parts that i had enjoyed but honestly the negatives out weigh the positives so badly that i cant even \nnegative 234569013 This game is utter dog water. If you like SAO, you probably will despise this game, and you should. It's one of the most soulless games I have ever played. Even on a sale this \"game\" isn't worth 10% of what it costs.\npositive 234101787 If you are not a SAO fan do not buy this game (if you have not read the manga/seen the anime etc), this game is obviously tailored to fans but there are so many elements that within the game that if you are stepping into this game for the first time without knowing it, it actually takes away from the game (side characters, in-game quests, etc).\n\nNext, the best part about the game is after the beginning once you get the prologue done and the first 5-7 quests done, do not give up before then (it does get better). This is a JRPG so don't expect this game to be like a RDR2/Last of us type game, its so fundamentally different from this type of game that I don't think a comparison is even fair. The map pathing is clunky there is no straight line most of the time and I think the developers meant for that so that you can explore more of the world, even if its frustrating most of the time. Some people have complained that the mobs/bosses are repetitive (same type) but as you progress to later floors of the game they change/evolve.\n\nLastly, the game is very unforgiving at certain parts if you do not prepare or have a good build online, but I do think this is one of the best parts about the game, the fact that some bosses/mobs in the story/world are challenging means that you really need to think about the weapons you will use (and side characters you will synergize with). Regardless what you read online make sure to try out all the weapons don't stick to one build, the weapon skills are pretty fun to use and the different weapon types changes how you approach a fight.\n\nIn the end, I \npositive 233717024 After reading many reviews, I decided to leave one.  I've been gaming for 45 years, done many a game tests throughout the years. Also, I am a huge fan of SAO.  I've never exactly fell fully in love with any SAO game. I've bought several and just don't seem to play them many hours.  This one I hoped was different.  I played the hell out of the Beta.  In playing the beta, I ended up not buying the super duper ultimate edition and opted for the regular game.  \n\nI like the visuals, the combat I fully enjoy although after a time can become repetitive. There are options to adjust the repetitiveness.  The game looks the part. The lack of mob variety is lacking. Skill and weapon progression I don't hate but it needs to be refined. lt is a good game, I just don't think it's worth full price as it stands.  \n\nI am hoping that further DLC will open somemore variety and floors.  This game would shine as a Multi player game for quests and dungeons. l love hardcore mode or whatever they called it, but the it just needs multiplayer. From people have said as well as what I can see in the code, it's basically there.  I'm not sure if they had to cut that option because of budget or plan on it later but it's in the code.\n\nAdd multiplayer, refine loot system as well as crafting system, add raids on top of dungeons. Keep giving us cosmetics the public wants and the game could probably take off. The game feels like it was supposed to be multiplayer but it's 1P....  I don't even want them to make another SAO game at this point.  This one has good bones they just need to refine it.\n\nFinal recommend\n\nGAME Shadow Dungeon\nnegative 234216811 Shadow Dungeon as a game is very basic and gets boring pretty quickly. It lacks depth in combat, enemy variety, loot, story and character progression.\n\nIt lacks depth in character progression. Along the way you level up and find the odd perk point potion here and there which in itself is a neat concept until you go to spend that point on a boring number go up upgrade. For each class you can choose from three different elemental types that somewhat center around different playstyles. You are heavily incentivized to keep going down the same singular skill tree as your equipment & loot will give you big bonuses for your damage type. You've likely seen many different kinds of iterations of each of the skills and abilities here, there is nothing new and it all follows an extremely linear progression. The devs straight up lied about the \"+1000s of builds\" in reality there's like maybe 12. The whole \"100,000,000 pieces of equipment\" statement is technically true due to the procedural nature of how gear is handled but like that also is such a gross misrepresentation of what is actually going on here.\n\nYou get to a point where you kind of just glaze over and are vaguely pressing buttons and the enemies are vaguely dying in your VFX soup, you level up once every five minutes or so, look at your inventory make the number go up rinse repeat. Combat is very floaty and lacks impact. Most of your abilities will eventually engulf your screen in massive VFX that make the overall experience worse.\n\nWith the itemization especially I feel like there was a real opportunity here to make the item\nnegative 234030245 I stuck with this for a long time due to the initial positive reviews, and I regret it. While I don't think this was totally vibecoded, I can see why people think it is: there are a lot of things that don't really make sense. There's a consumable that brings an item up to your player level, which seems great for leveling except it also randomizes the important parts of the item so what's the point? There are also consumables which increase your inventory space, which is a cool idea, except you get them faster than you need the inventory space. There are \"random challenge scrolls\" but there's only one thing they do which is spawn a new random level -- which is exactly what the main story is, so I don't understand why these exist.\r\n\r\nBut the bigger issue is that there doesn't seem to be any particular choice about skills or builds: you quickly get enough skill points to buy everything that you need, at which point there's not much use for the skill points or the consumables that grant skill points. You just buy everything, set all skills to autocast, and your build is complete for the rest of the game.\r\n\r\nI thought fine, maybe that's just the main story and things open up in the endgame? The developer advertises that there is \"30-50 hours of gameplay\" in the main story, but the difficulty is imbalanced and you can kill everything immediately, which means all of this time is just running as fast as you can through the level towards the exit, and it was a huge slog. It feels like the worst kind of gameplay padding, and 7 chapters of 20 of the same level is just way too many. \r\n\nnegative 234040484 I beat the campaign hoping there was something different in the endgame, but nope. For a game that boasts \"60 hours of campaign\" I beat all the main content in about six hours. And that was still with an hour or two of AFK time.\n\nThe reforge system is kinda cool, but it's just spam until you get the element types that match your skills, quality to level 20, and that's it. There's no crafting outside of this. Be ready to check A LOT of gear hoping to find the one with a mod that improves the skill/s you're using. The whole \"100 million pieces of gear\" claim just means there's a handful of base types, but there's 100million variations of mods? I honestly don't understand what it's supposed to mean, but I kept seeing the same bases over and over again. \n\nFor a game that proudly states there's 100million pieces of gear you could at least have a proper loot filter. Instead there's an option to auto pickup loot at certain tiers. There is a fairy you can equip that picks up the trash you don't want and it auto sells everything, but get prepared to always be cleaning out gear from other classes and there's no option to hide them. I was already trashing everything but the highest tier at level 20. \n\nAnd the whole \"1000 build variations\" just isn't right. Not only do a bunch of the skills feel the same, but most have awful scaling and felt unusable. I just ended up picking the skills with the highest base DPS and that was my build. \n\nAlso, claiming \"No seasonal resets\" as a feature is really weird. Why would I ever return to this game after more content gets added if my character is \nnegative 234569605 Game was simple and fun. Was going really good until a horrible update to nerf orbs and crafting errors. Crafting gears apparently makes an 8 socket item and you cannot see it has 8 sockets and then it crashes the game and you get stuck on the loading screen endlessly.\nnegative 234515886 This game WAS so much fun.; The dev even listened to players and started implementing some really good QoL improvements... but... The dev decided that to start nerfing builds and ignore performance issues.\r\nThis isn't an EA game.; But I had fun and now I'm no longer having fun.\r\nWait until 2027 or 2028 and then only if it's on sale for 75%+ off.\npositive 234475884 Game is like Diablo 2 and Chronicon had a baby and that baby grew up to be superman, tons of fun, tons of loot, tons of progression, tons of skills to choose from, max out all your classes, max out a single class, max out a single skill and play insane difficult mode (a single skill aint gonna cut it) do whatever you want, theres so many options, so much synergy, so much fun to be had, AND THE GAME RUNS ON STEAM DECK!!!\npositive 234458795 This game has some serious potential if the dev goes about the right way. I love ARPGs and survivors likes so this is a perfect blend. Loot is satisfying but the game is way too easy. Making a build doesnt take much skill aside from clicking every skill point. Maybe theres some variety that I havent found yet.\r\n\r\nEndgame is fun, its the diablo 3 greater rift style content which is satifying. I think to keep this game running long term it needs a seasonal mechanic and hardcore mode. Im going to keep playing and following development so hopefully it doesnt fumble.\n\nGAME Ruins of Dawn\nnegative 232965272 BOORING.\nits so slow and boring. skills are hella lame. youl be one tapping mobs for a very long time.it be fine but there are hordes of mobs getting agroed and just begging for some AOE. all the beginner skills look and feel the same. every time i was hyped to get new skill it was followed with disappointment.Struggling to lvl and then the skill you get is fkn garbage.. im by no means stranger to diablo like games but it took me an hour to get to lvl 10 lol..and if you look the steam vid where there are cool skills..dude is basically lvl 50...this will take long time to achieve coz of exp death penalties are not minor.. mobs hit like trucks even with good gear, ur always out of mana even with leech and regen..\naa there is one weird thing i did like lol...you can kill mobs a screen away and they wont even react..thats how far the magic skills can reach and if they drop loot you wont even need to go get it, click and its taken xD\nnegative 233902527 Time: 7:30AM - 8:00AM EST\r\nDate: 8/28/2026\r\nIssue - My computer crashed during gameplay, after start up I noticed my character is missing or deleted! How can own play for 126 hours of gameplay and then POW! my CHARACTER IS GONE!!!! clicking the missing character option does NOTHING!!! I Saved so much gear and had all 3 equipment slots for each class!!! I was hitting 3,000s with my mage with lightening Bolt! at level 46 about 89% experience to turn level 47!! and now my CHARACTER IS GONE!!!!!!!\r\n\r\nBE CAREFUL is you play this game!!!\nnegative 234190668 no\npositive 232897625 Soo, I guess i got kinda lucky, for better or worse, i found the lightning dagger at low lvl from a random like barrel or something lol? and THEN i gota ring that AUTO casts the crescent slash (aoe slash) based on ur attack speed. IT did not work until i swapped to Warrior...and MAN with that Dagger...and its +47% attack speed it wrecks...its really nice, Bad thing is weapons like 10+lvls higher with WAY more \"dmg\" on them do less dps...lol even a weapon that auto casted the next sword beam skill on top was Less actual dmg output. IT seems like \"bleed\" just buffs ur dmg on hit? Which this dagger also applies in droves... SO some interesting things here, but could use more. Honestly id love to see the Select class Gone and just let everyone use EVERYTHING...Meaning passives everyone gets once u get at least the starting book unlocks it then Every other skill up to filling ur active slots...that would be great. Also the \"books\" or pages that are RARE if you right click it they dissapear :/ and you get nothing. You are supposed to use the like \"compendium\" thing i guess My names are wrong but its a menu in the top corner and then hit the Button for that mobs card there to get the permanent bonus. Would also be NICE to get something besides HP for lvling up, i keep running into mobs that do soo much dmg or combos of dmg and Dash/any movement skill does nothing to help you avoid hits ESPECIALLY ranged attacks...so you just take bunches of dmg and die. Another nice thing would be just limitless or near of being able to upgrade the skills...like another skill book just upgrades th\npositive 233001140 This game is very janky. The UI is bad, animations look kinda weird, mobs just stay in one place waiting to be attacked, combat is very slow from the beginning {like first 6 hours), there are not many skills to choose from, translation is just bare minimum... Yet I find myself really enjoying this game.\n\nIt's the itemization and mob griding that I enjoy. Basically, there are not skill points as in your traditional ARPG. Instead, your whole build comes from items. There are many item stats that can boost your skills and with the right combination, you can transform your poor one fireball skill into weapon of destruction, obliterating everything in it's path.\n\nIt's very slow and grindy game, but if you enjoy slaying many mobs, grinding for items and slowly ramping up your character, you will definitely have a blast.\n"}

[Think]

**Checking review claims**

[Think]

**Checking review claims**

**Framing evidence caveats**

[Think]

**Checking review claims**

**Framing evidence caveats**

[Think]

**Checking review claims**

**Framing evidence caveats**

[Think]

**Checking review claims**

**Framing evidence caveats**

**Structuring evidence charts**

[Think]

**Checking review claims**

**Framing evidence caveats**

**Structuring evidence charts**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"0c34a6","wall_time_seconds":0.260975271,"exit_code":0,"original_token_count":3836,"output":"     period                      family    n  ge100  positive80_ge100  positive100_price_ratio  within_build_ratio100_price  within_build_ratio100_text  publisher_key_removed_positive100_rate  publisher_key_removed_n\n  2023_2025          all_build_promises 3057    767               452                    1.000                        1.000                       1.000                                   0.148                        1\n  2023_2025      claims_100plus_options  334    117                80                    1.396                        1.214                       1.226                                   0.237                        1\n  2023_2025 roguelike_deckbuilder_tag20  344    128                91                    1.481                        1.259                       1.270                                   0.262                        1\n  2023_2025      action_roguelike_tag20 1025    236               141                    1.140                        1.122                       1.116                                   0.137                        1\n  2023_2025          auto_battler_tag20  250     76                45                    1.287                        1.301                       1.290                                   0.177                        1\n  2023_2025         tower_defense_tag20  214     50                27                    0.853                        0.961                       0.959                                   0.127                        1\n       2025          all_build_promises 1365    296               181                    1.000                        1.000                       1.000                                   0.132                        1\n       2025      claims_100plus_options  138     39                26                    1.237                        1.126                       1.129                                   0.190                        1\n       2025 roguelike_deckbuilder_tag20  169     62                41                    1.502                        1.379                       1.364                                   0.229                        3\n       2025      action_roguelike_tag20  449     90                58                    1.157                        1.108                       1.117                                   0.127                        1\n       2025          auto_battler_tag20  121     32                20                    1.214                        1.194                       1.233                                   0.167                        1\n       2025         tower_defense_tag20   99     23                15                    1.083                        1.030                       1.019                                   0.143                        1\n    2026_H1          all_build_promises 1085    171               101                    1.000                        1.000                       1.000                                   0.093                        1\n    2026_H1      claims_100plus_options  114     26                19                    1.476                        1.195                       1.191                                   0.159                        1\n    2026_H1 roguelike_deckbuilder_tag20  132     33                22                    1.389                        1.189                       1.193                                   0.168                        1\n    2026_H1      action_roguelike_tag20  361     50                29                    1.058                        1.079                       1.079                                   0.078                        1\n    2026_H1          auto_battler_tag20   90     15                 9                    1.152                        1.132                       1.137                                   0.090                        1\n    2026_H1         tower_defense_tag20   84     15                 9                    1.128                        1.138                       1.138                                   0.108                        1\n2026_JulAug          all_build_promises  632     75                45                    1.000                        1.000                       1.000                                   0.070                        1\n2026_JulAug      claims_100plus_options   71     12                 8                    1.358                        1.215                       1.152                                   0.114                        1\n2026_JulAug roguelike_deckbuilder_tag20   67     11                10                    1.486                        0.970                       0.944                                   0.136                        1\n2026_JulAug      action_roguelike_tag20  204     18                12                    0.952                        0.875                       0.907                                   0.054                        1\n2026_JulAug          auto_battler_tag20   46      5                 5                    1.780                        1.088                       1.037                                   0.089                        1\n2026_JulAug         tower_defense_tag20   48      2                 1                    0.351                        0.457                       0.495                                   0.000                        1\n\n 2026_H1_auto_battler\n  appid             name  reviews  positive_pct  usd_list_price                                                                                                                                                                                                                                   short_description\n3400960      Oaken Tower     2889            89            9.99                                                                                Oaken Tower is a synergy-heavy PvP auto battler where your tower of items fights other players. Build deadly combos and scale exponentially. Every decision matters.\n3199360      Skull Horde     1070            81           12.99                                        Skull Horde is an auto battler dungeon crawler where you play as a flying skull necromancer. Find powerful loot and create overpowered builds. Summon a horde of skeletons in a battle of bone versus flesh!\n4283360      Legionbound      642            83            9.99 Turn a handful of heroes into a massive legion! Legionbound is a casual retro RPG autobattler where you recruit heroes, discover class synergies, forge powerful Ascensions, and battle through hordes of enemies across replayable roguelite runs.\n4206270        Wireworks      602            89            6.99                                                         Design your defenses, build your module board, and manage your wires. Combine signals and create synergies to empower your weapons and survive in this base-defense roguelike auto-battler.\n3972650 Backpack Jianghu      556            80           13.99       Backpack jianghu is a Wuxia theme, inventory management and battle royale game. Choose a starting sect, enter the world with dozens of other players, pick your path, battle and grow, and compete in the final showdown at Mount Hua's peak.\n2886620      Hive Blight      357            94           12.49                                  Hive Blight is a roguelite autobattler where you lead a team of insect warriors against a corrupting Fungal Threat. Build powerful synergies, uncover the source of the plague, and destroy it to save your world!\n\n 2026_H1_roguelike_deckbuilder\n  appid                           name  reviews  positive_pct  usd_list_price                                                                                                                                                                                                                                                                           short_description\n3784030 RACCOIN: Coin Pusher Roguelike     4202            82           11.99                                   A coin-pushing dopamine machine.\\r\\nRACCOIN is a roguelike deckbuilder where you combine special coins with powerful items to trigger wildly satisfying combos. Stack shiny towers, spin the lucky wheel, and shake the machine until all the coins drop.\n3100370                   Black Jacket     1717            91           14.99                           Gamble your way out of hell in this blackjack-inspired rogue-lite deckbuilder. Play powerful card combos or cheat to outwit your opponents and earn your freedom. Win their Soul coins! Bribe the ferryman! And uncover the story of those who stand in your way.\n3709430    Witch's Apocalyptic Journey     1252            84             NaN                                                                      Abyss decayed, witches awaken. As their guide, you will weave their destinies. Craft unique cards, schedule their days, shape endless possibilities through deckbuilding. Each choice will lead to different Ending...\n3430340                 Dice A Million     1047            90           12.99                                                                                                                                                                     Have you ever tried to roll 1,000,000 on a set of dice? No? Build the right bag of die, and you might just pull it off.\n3481020                    Apokerlypse      609            81            9.99 A card-strategy roguelike inspired by a variety of poker games. You play as a highly skilled card shark in the Tavern at the End of the World, combining all kinds of demon chips to rewrite the rules of play, compete with players from across the globe, and ultimately rise to the top.\n3500680                       Cropdeck      420            92           12.99                                                        Plant, grow, and harvest in this farming roguelite deckbuilder. Craft a powerful deck of plants and combine quirky scarecrows with passive effects for wild synergies. Pay taxes. Strategic, satisfying, and delightfully wholesome.\n\n 2026_H1_action_roguelike\n  appid             name  reviews  positive_pct  usd_list_price                                                                                                                                                                                                                                                                                            short_description\n3214610         Cinderia     4621            87           17.99                                                                                      A fast, brutal action roguelite with razor-sharp controls and insane build freedom. Fuse embers, magic cards, and gear into wildly overpowered combat styles — and break each run in a world consumed by the Ash Witch.\n3596700 TerraTech Legion     2060            81            9.99                                                                                                              TerraTech Legion, a chaotic Bullet Heaven Builder. Build the ultimate battle vehicle block by block and survive waves of robotic foes, ramming them at speed and shooting infinite projectiles.\n3100310      Arms of God     1845            88           11.50  Gear up for a battle through hell in this roguelite Bullet Heaven Arena Autoshooter with Doom-inspired gore vibes, metal music, and a satisfying combat feel. Wield five weapons at once, upgrade and merge them to forge indestructible builds, and bring divine justice to a world on the brink of chaos.\n3741860      Vital Shell     1699            96            5.99                          Vital Shell is a single player top-down arena shooter that puts you in control of mechs inspired by classic fantasy archetypes. Unlock powerful synergies with unique weapons, traits, and abilities as you take on increasingly challenging waves of enemies in a shattered realm.\n1866130     Morbid Metal     1537            81           17.99                                                                                                   Morbid Metal is a hack-and-slash action rogue-lite where you shapeshift into powerful characters. Switch in real time to unleash unique combos and slaughter hordes of deadly machines and intense bosses.\n3219180        Cursemark      561            85           14.99 Hack, slash, and cast your way through a haunted kingdom brimming with secrets where no two builds are ever the same. As a cursed mage-knight you will unlock devastating spells, equip ability transforming runes, and reforge your curse on the path to victory or death in this fantasy action roguelite.\n\n 2026_JulAug_action_roguelike\n  appid                name  reviews  positive_pct  usd_list_price                                                                                                                                                                                                                                                                                         short_description\n1913120      Tears of Metal     2310            85           24.99                                                              Fight solo or up to 4-player co-op to reclaim your island alongside your Scottish battalion. On each campaign, gain new powerful upgrades, rally your forces, and stop the invader as they carve into the Mother Stone to harvest its power.\n 974480 Echoes of Mystralia      583            84           19.99                                                 Echoes of Mystralia is an action-heavy spellcrafting ARPG roguelite, where rapid combat meets deep customization. Craft your own spells, unlock new combinations, fight epic bosses, and discover a narrative-rich world that never plays the same twice.\n2431080       Blood Dungeon      383            90            9.99                                                                                           From the creators of Nidhogg, murder hordes of monsters in this 2D platforming autoshooter with a killer soundtrack. Collect Blood, gold, and bones to increase your powers. Can you survive the Blood Dungeon?\n3963030         Pickle Pete      179            84            7.99                                                      A roguelite bullet heaven where you dodge and auto-shoot through waves of enemies. Build devastating weapon, gear and mutation combinations with deep synergies. Face over 30 unique bosses across diverse biomes in this challenging arena shooter.\n4605210         Pet the Cat      150            82            4.99                                                                                  Pet the Cat is a bullet-hell shooter where you unleash powerful attacks by petting an adorable cat! Fight through endless waves of enemies and upgrade your kitty into a formidable force with food, items, and weapons.\n3633760                 KAZ      139            94            6.99 Dopamine-fueled minimalist grid-based game that pushes the boundaries of psychedelic visuals and fast reaction time. KAZ is an action roguelike arcade game where choice of items, buffs, and maluses allows you to unlock cool visuals and themes while showing everybody your skill on the leaderboards\n"}

[Think]

**Testing machine-build rules**

[Think]

**Testing machine-build rules**

**Narrowing machine-build claims**

[Think]

**Testing machine-build rules**

**Narrowing machine-build claims**

[Think]

**Testing machine-build rules**

**Narrowing machine-build claims**

[Think]

**Testing machine-build rules**

**Narrowing machine-build claims**

**Checking cohort comparability**

[Think]

**Testing machine-build rules**

**Narrowing machine-build claims**

**Checking cohort comparability**

[Think]

**Testing machine-build rules**

**Narrowing machine-build claims**

**Checking cohort comparability**

exec ({"code": "text(await tools.exec_command({cmd:\"/home/adn/a327ex/steam-research/.venv/bin/python - <<'PY'\nfrom pathl...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"419bad","wall_time_seconds":0.190710597,"exit_code":0,"original_token_count":847,"output":" year            segment     n  ge100  positive80_ge100  median\n 2025      paid_eligible  9140   1310               884     6.0\n 2025      strict_builds   843    189               109    13.0\n 2025   inclusive_builds   985    216               127    12.0\n 2025 free_strict_builds   132     37                10    39.0\n 2026      paid_eligible 12409   1308               853     3.0\n 2026      strict_builds  1717    246               146     4.0\n 2026   inclusive_builds  1920    269               164     4.0\n 2026 free_strict_builds   218     43                14    15.0\n     period                      family    n  positive100_price_ratio  publisher_key_removed_positive100_rate  publisher_key_removed_n  direct_only_n  direct_only_rate100\n       2025          all_build_promises 1365                    1.000                                   0.132                        1            720                0.238\n       2025      claims_100plus_options  138                    1.237                                   0.190                        1             94                0.309\n       2025 roguelike_deckbuilder_tag20  169                    1.502                                   0.229                        3            147                0.374\n       2025      action_roguelike_tag20  449                    1.157                                   0.127                        1            231                0.238\n       2025          auto_battler_tag20  121                    1.214                                   0.167                        1             66                0.318\n    2026_H1          all_build_promises 1085                    1.000                                   0.093                        1            701                0.141\n    2026_H1      claims_100plus_options  114                    1.476                                   0.159                        1             82                0.195\n    2026_H1 roguelike_deckbuilder_tag20  132                    1.389                                   0.168                        1            121                0.256\n    2026_H1      action_roguelike_tag20  361                    1.058                                   0.078                        1            236                0.131\n    2026_H1          auto_battler_tag20   90                    1.152                                   0.090                        1             64                0.203\n2026_JulAug          all_build_promises  632                    1.000                                   0.070                        1            405                0.114\n2026_JulAug      claims_100plus_options   71                    1.358                                   0.114                        1             55                0.145\n2026_JulAug roguelike_deckbuilder_tag20   67                    1.486                                   0.136                        1             60                0.167\n2026_JulAug      action_roguelike_tag20  204                    0.952                                   0.054                        1            126                0.111\n2026_JulAug          auto_battler_tag20   46                    1.780                                   0.089                        1             31                0.129\nclassification {'strict': 14713, 'inclusive': 17459, 'candidate': 64295}\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"pwd\",\"max_output_tokens\":1000}));\ntext(await tools.exec_command({c...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"ac90f3","wall_time_seconds":0.000002585,"exit_code":0,"original_token_count":5,"output":"/home/adn/a327ex\n"}
{"chunk_id":"027305","wall_time_seconds":0.000006119,"exit_code":0,"original_token_count":721,"output":"2023_2025_action_roguelike.parquet\n2023_2025_action_roguelike_tag20.parquet\n2023_2025_all_build_promises.parquet\n2023_2025_auto_battler.parquet\n2023_2025_auto_battler_tag20.parquet\n2023_2025_cards_decks.parquet\n2023_2025_claims_100plus_options.parquet\n2023_2025_claims_50plus_options.parquet\n2023_2025_crafting_fusion.parquet\n2023_2025_drafting.parquet\n2023_2025_equipment_skills.parquet\n2023_2025_explicit_prerun.parquet\n2023_2025_familiar_carrier.parquet\n2023_2025_loot_action_rpg.parquet\n2023_2025_machine_assembly.parquet\n2023_2025_party_tactical_rpg.parquet\n2023_2025_party_team_composition.parquet\n2023_2025_roguelike_deckbuilder.parquet\n2023_2025_roguelike_deckbuilder_tag20.parquet\n2023_2025_spatial_build_effect.parquet\n2023_2025_spatial_item_configuration.parquet\n2023_2025_tower_defense_tag20.parquet\n2026_H1_action_roguelike.parquet\n2026_H1_action_roguelike_tag20.parquet\n2026_H1_all_build_promises.parquet\n2026_H1_auto_battler.parquet\n2026_H1_auto_battler_tag20.parquet\n2026_H1_cards_decks.parquet\n2026_H1_claims_100plus_options.parquet\n2026_H1_claims_50plus_options.parquet\n2026_H1_crafting_fusion.parquet\n2026_H1_drafting.parquet\n2026_H1_equipment_skills.parquet\n2026_H1_explicit_prerun.parquet\n2026_H1_familiar_carrier.parquet\n2026_H1_loot_action_rpg.parquet\n2026_H1_machine_assembly.parquet\n2026_H1_party_tactical_rpg.parquet\n2026_H1_party_team_composition.parquet\n2026_H1_roguelike_deckbuilder.parquet\n2026_H1_roguelike_deckbuilder_tag20.parquet\n2026_H1_spatial_build_effect.parquet\n2026_H1_spatial_item_configuration.parquet\n2026_H1_tower_defense_tag20.parquet\n2026_JulAug_action_roguelike.parquet\n2026_JulAug_action_roguelike_tag20.parquet\n2026_JulAug_all_build_promises.parquet\n2026_JulAug_auto_battler.parquet\n2026_JulAug_auto_battler_tag20.parquet\n2026_JulAug_cards_decks.parquet\n2026_JulAug_claims_100plus_options.parquet\n2026_JulAug_claims_50plus_options.parquet\n2026_JulAug_crafting_fusion.parquet\n2026_JulAug_drafting.parquet\n2026_JulAug_equipment_skills.parquet\n2026_JulAug_explicit_prerun.parquet\n2026_JulAug_familiar_carrier.parquet\n2026_JulAug_loot_action_rpg.parquet\n2026_JulAug_machine_assembly.parquet\n2026_JulAug_party_tactical_rpg.parquet\n2026_JulAug_party_team_composition.parquet\n2026_JulAug_roguelike_deckbuilder.parquet\n2026_JulAug_roguelike_deckbuilder_tag20.parquet\n2026_JulAug_spatial_build_effect.parquet\n2026_JulAug_spatial_item_configuration.parquet\n2026_JulAug_tower_defense_tag20.parquet\nanalysis.log\nanalysis_membership.parquet\nanalysis_spec.json\nanalyze.py\naudit_blind.json\naudit_blind_v1.json\naudit_labels.json\nclassification.log\nclassification.parquet\nclassification_spec.json\nclassification_v1.parquet\nclassify.py\nclassify_v1.py\ndefinition_sensitivity.csv\nfamily_results.csv\nperiod_summary.json\nreview_sample.csv\nreview_sample.log\nreview_sample_manifest.json\nreview_samples\nsample_reviews.py\nsupply.csv\ntag_rank_sensitivity.csv\n"}

The clearest result is that advertised build variety has become much more common, but the market looks different depending on whether we measure attention or positive reception. I’m checking the final comparisons and saving the findings, including several 2026 examples and a small Steam-review sample about what players consider meaningful build choices.

exec ([memory: sealed target])

[sealed content withheld: memory]

exec ({"code": "const r = await Promise.allSettled([\ntools.exec_command({cmd:\"sed -n '1,260p' steam-research/build-expres...)

Script completed
Wall time 0.1 seconds
Output:

{"status":"fulfilled","value":{"chunk_id":"534916","wall_time_seconds":0.000002173,"exit_code":0,"original_token_count":2329,"output":"from pathlib import Path\nimport json,re,hashlib\nimport pandas as pd\nR=Path(__file__).resolve().parent;SOURCE=R.parent/'analysis-2026-09-05'\nG=pd.read_parquet(SOURCE/'games.parquet');T=pd.read_parquet(SOURCE/'tags.parquet')\nTAGS={a:dict(zip(x.tag,x['rank'])) for a,x in T.groupby('appid',sort=False)}\nBROAD={'Action Roguelike','Roguelite','Roguelike','Traditional Roguelike','Roguelike Deckbuilder','Deckbuilding','Card Battler','Auto Battler','Action RPG','RPG','Loot','Looter Shooter','Dungeon Crawler','Party-Based RPG','Tactical RPG','Strategy RPG','Turn-Based Tactics','Mechs','Vehicular Combat','Arena Shooter','Twin Stick Shooter','Turn-Based Combat','Hack and Slash'}\nOBJ=r'(?:weapons?|skills?|abilities|ability|passives?|items?|equipment|gear|armor|armour|companions?|upgrades?|cards?|relics?|characters?|heroes|classes|runes?|augments?|perks?|traits?|talents?|units?|spells?|gadgets?|modules?|loadouts?|decks?|artifacts?)'\nOBJECT=re.compile(r'\\b'+OBJ+r'\\b',re.I)\nP={\n 'explicit_build':re.compile(r'\\b(?:(?:unique|different|diverse|varied|custom|viable|powerful|crazy|absurd|broken|overpowered|unlimited|endless|distinct|creative|strategic)(?:[ -]+(?:character|hero|weapon|equipment|combat|skill|party|team|mech|deck|loadout|endgame)){0,2}[ -]+builds?|(?:character|hero|weapon|equipment|combat|skill|party|team|mech|loadout)[ -]+builds?|build[- ]?craft(?:ing)?|build[- ](?:changing|defining|enabling)|build (?:diversity|variety|synergies)|your (?:own |unique |ultimate )?build|builds\\b.{0,65}\\b(?:playstyles?|synerg\\w*|passives?|skills?|abilities|weapons?|relics?)\\b)',re.I),\n 'branching':re.compile(r'\\b(?:branching classes|multiclass\\w*|multi-class\\w*|hybrid classes|class combinations|subclasses|sub-classes)\\b',re.I),\n 'combination':re.compile(r'\\b(?:combin\\w*|synerg\\w*|mix and match)\\b.{0,100}\\b'+OBJ+r'\\b|\\b'+OBJ+r'\\b.{0,100}\\b(?:combin\\w*|synerg\\w*|mix and match)\\b',re.I),\n 'choice':re.compile(r'\\b(?:choose|choosing|select|equip|customiz\\w*|specializ\\w*|experiment|draft\\w*|loadouts?|playstyles?|play styles?|mix and match|adapt|swap|switch)\\b',re.I),\n 'playstyle':re.compile(r'\\b(?:playstyles?|play styles?|loadouts?)\\b.{0,110}\\b'+OBJ+r'\\b|\\b'+OBJ+r'\\b.{0,110}\\b(?:playstyles?|play styles?|loadouts?)\\b',re.I),\n 'deck':re.compile(r'\\b(?:deck[- ]?build\\w*|(?:build|craft|construct|customiz\\w*)\\b.{0,45}\\bdecks?|draft\\w*\\b.{0,50}\\bcards?)\\b',re.I),\n 'skill_tree':re.compile(r'\\b(?:skill|passive|talent) trees?\\b',re.I),\n 'quantity':re.compile(r'\\b(?:over |more than |up to )?([1-9][\\d,]*)\\+?\\s+(?:(?:unique|different|powerful|playable|distinct|unlockable|branching)\\s+)?('+OBJ+r')\\b',re.I),\n 'idle_central':re.compile(r'\\b(?:idle|incremental|clicker|desktop companion)\\b',re.I),\n 'machine':re.compile(r'\\b(?:modular|customiz\\w*|design|construct|build)\\b.{0,65}\\b(?:mechs?|robots?|spaceships?|spacecraft|ships?|vehicles?)\\b|\\b(?:weapon|armor|armour|engine|ship) modules?\\b',re.I),\n 'party':re.compile(r'\\b(?:party|team|squad|army|heroes|characters|units)\\b.{0,90}\\b(?:synerg\\w*|combinations?|composition|mix and match)|\\b(?:compose|assemble|customiz\\w*|synerg\\w*|combin\\w*)\\b.{0,70}\\b(?:party|team|squad|army|heroes|units)\\b',re.I),\n 'prerun':re.compile(r'\\b(?:before (?:each|a|the|every) (?:run|battle|mission)|pre[- ]run|starting loadout|start(?:ing)? (?:each|a|the|every) run with)\\b',re.I),\n 'draft':re.compile(r'\\b(?:draft|drafting|drafted)\\b',re.I),\n 'craft_merge':re.compile(r'\\b(?:craft|merge|fuse|fusion|socket|enchant|affix|reforge)\\w*\\b',re.I),\n 'position':re.compile(r'\\b(?:arrang\\w*|position\\w*|place|adjacen\\w*)\\b.{0,70}\\b(?:items?|inventory|backpack|units?|heroes|team|weapons?)\\b|\\b(?:backpack|inventory)\\b.{0,80}\\b(?:arrang\\w*|position\\w*|adjacen\\w*)\\b',re.I)\n}\n\ndef classify(row):\n tags=TAGS.get(row.appid,{})\n text=(row.short_description+' '+row.description)\n broad=any(tags.get(t,99)<=10 for t in BROAD)\n quick=text.lower()\n possible=broad or any(w in quick for w in ['build','loadout','synerg','modular'])\n hits={k:list(p.finditer(text)) for k,p in P.items()} if possible else {k:[] for k in P}\n has=lambda k:bool(hits[k])\n objects=set(x.group().casefold() for x in OBJECT.finditer(text))\n excluded=[]\n if any(tags.get(t,99)<=3 for t in ['Idler','Incremental']):excluded.append('central_idle_incremental_tag')\n if P['idle_central'].search(row.short_description):excluded.append('idle_incremental_short_pitch')\n if tags.get('FMV',99)<=5:excluded.append('central_fmv')\n if tags.get('Visual Novel',99)<=3 and not any(tags.get(t,99)<=5 for t in ['Deckbuilding','Roguelike Deckbuilder','Card Battler','RPG','Tactical RPG']):excluded.append('central_visual_novel')\n quantities=[]\n for m in hits['quantity']:\n  value=int(m.group(1).replace(',',''))\n  if 5<=value<=100000:quantities.append({'count':value,'object':m.group(2).lower(),'text':m.group()})\n # A branch/quantity claim alone is inclusive evidence, not strict build expression.\n strict=(has('explicit_build') and len(objects)>=1 and (broad or has('machine'))) or (has('combination') and has('choice') and len(objects)>=2 and broad) or (has('playstyle') and has('choice') and len(objects)>=3 and broad) or (has('deck') and any(tags.get(t,99)<=5 for t in ['Deckbuilding','Roguelike Deckbuilder','Card Battler','Card Game'])) or (has('machine') and has('choice') and has('combination') and len(objects)>=2)\n qclasses=max([q['count'] for q in quantities if q['object'] in ['class','classes']]+[0])\n qcharacters=max([q['count'] for q in quantities if q['object'] in ['character','characters','heroes']]+[0])\n roster_customization=qclasses>=4 and (qcharacters>=4 or any(tags.get(t,99)<=10 for t in ['Party-Based RPG','Tactical RPG','Strategy RPG'])) and has('choice') and len(objects)>=3\n strict=strict or (has('party') and has('choice') and len(objects)>=2 and (has('skill_tree') or has('combination') or bool(quantities))) or (has('branching') and qclasses>=4 and has('choice')) or roster_customization\n inclusive=strict or (broad and ((has('skill_tree') and has('choice')) or (len(quantities)>=1 and has('choice') and len(objects)>=3) or has('party') or has('playstyle')))\n if excluded:strict=False;inclusive=False\n out={'appid':row.appid,'strict':bool(strict),'inclusive':bool(inclusive),'candidate':bool(broad or has('explicit_build') or has('machine')),'exclusion':'|'.join(excluded),'object_terms':len(objects),'quantity_claims_json':json.dumps(quantities,ensure_ascii=False)}\n for k in P:out['signal_'+k]=has(k)\n out['evidence_json']=json.dumps({k:[text[max(0,m.start()-70):min(len(text),m.end()+100)] for m in hits[k][:2]] for k in ['explicit_build','combination','playstyle','deck','party','machine','quantity','prerun','position'] if hits[k]},ensure_ascii=False)\n # Overlapping descriptive axes; these are not a partition of the market.\n out['card_deck']=has('deck') and ('deck' in text.casefold())\n out['party_composition']=(has('party') or roster_customization or tags.get('Auto Battler',99)<=5) and bool(re.search(r'\\b(?:party|team|squad|army|formation|lineup|line-up)\\b',text,re.I))\n out['equipment_skills']=bool(re.search(r'\\b(?:equipment|gear|weapons|passives|perks|talents|skill tree|runes|affixes|loadout)\\b',text,re.I)) and (has('explicit_build') or has('playstyle') or has('combination'))\n out['machine_assembly']=has('machine') and bool(re.search(r'\\b(?:modules?|parts|components|weapons|armor|armour)\\b',text,re.I))\n for label,tagset in {'action_rogue':['Action Roguelike'], 'auto_battler':['Auto Battler'], 'tactics_rpg':['Tactical RPG','Strategy RPG','Party-Based RPG','Turn-Based Tactics'], 'action_rpg':['Action RPG','Looter Shooter','Loot'], 'deck_rogue':['Roguelike Deckbuilder']}.items():\n  out['loop_'+label]=any(tags.get(t,99)<=5 for t in tagset)\n return out\n\nout=[]\nfor n,row in enumerate(G.itertuples(index=False),1):\n out.append(classify(row))\n if n%25000==0:print('classified',n,flush=True)\nC=pd.DataFrame(out)\nC.to_parquet(R/'classification.parquet',index=False)\nmeta={'rules_sha256':hashlib.sha256(Path(__file__).read_bytes()).hexdigest(),'note':'Advertised build expression; no gameplay verification. Strict rules and central-genre exclusions applied without review outcomes.','patterns':{k:v.pattern for k,v in P.items()},'counts':{'strict':int(C.strict.sum()),'inclusive':int(C.inclusive.sum()),'candidate':int(C.candidate.sum())}}\n(R/'classification_spec.json').write_text(json.dumps(meta,indent=2))\n# A random audit is output without review counts or prices.\na=C.merge(G[['appid','name','year','main','short_description']],on='appid')\nrecent=a[a.main&a.year.between(2023,2026)]\nsamples=[]\nfor label,subset,n in [('strict',recent[recent.strict],36),('inclusive_only',recent[recent.inclusive&~recent.strict],16),('candidate_unconfirmed',recent[recent.candidate&~recent.inclusive&recent.exclusion.eq('')],12)]:\n for x in subset.sample(min(n,len(subset)),random_state=27091).to_dict('records'):\n  x={k:x[k] for k in ['appid','name','year','short_description','evidence_json']};x['audit_stratum']=label;samples.append(x)\n(R/'audit_blind.json').write_text(json.dumps(samples,indent=2,ensure_ascii=False))\nprint(json.dumps(meta['counts']),flush=True)\nfor x in samples:\n evidence=json.loads(x.pop('evidence_json'));x['evidence']={k:v[:1] for k,v in evidence.items() if k in ['explicit_build','combination','playstyle','deck','party','machine']}\n print(json.dumps(x,ensure_ascii=False),flush=True)\n"}}
{"status":"fulfilled","value":{"chunk_id":"481f79","wall_time_seconds":0.000001903,"exit_code":0,"original_token_count":2431,"output":"{\n  \"outcomes_hidden\": true,\n  \"sample\": \"36 randomly sampled strict candidates from 2023\\u20132026 paid non-explicit records\",\n  \"clear\": 31,\n  \"ambiguous\": 5,\n  \"labels\": [\n    {\n      \"appid\": 3324530,\n      \"name\": \"Western Shadowlands\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2454480,\n      \"name\": \"\\u53ea\\u56e0\\u5144\\u5f1f(BroChicken)\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2933080,\n      \"name\": \"Crime Boss: Rockay City\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2404170,\n      \"name\": \"Museum No.9\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2499860,\n      \"name\": \"DRAGON QUEST VII Reimagined\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2712470,\n      \"name\": \"Downfall\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 4265130,\n      \"name\": \"MY SLIEM gets stronger after it dies\",\n      \"label\": \"ambiguous\",\n      \"reason\": \"Combination match partly describes genre/control mixing; breadth of permanent talent choices is unclear.\"\n    },\n    {\n      \"appid\": 2510680,\n      \"name\": \"Orcish Skies\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2994070,\n      \"name\": \"\\u8def\\u5c3c\\u4e9e\\u6230\\u8a18\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3127000,\n      \"name\": \"Splintered\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 1652250,\n      \"name\": \"Tales & Tactics\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2834250,\n      \"name\": \"Frogbound: the Legend of Sir Hopper\",\n      \"label\": \"ambiguous\",\n      \"reason\": \"Different relic powers and playstyles are described, but configurable alternatives versus fixed progression are unclear.\"\n    },\n    {\n      \"appid\": 3817830,\n      \"name\": \"Ominigun\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 1566670,\n      \"name\": \"Attack of the Karens\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2217680,\n      \"name\": \"KAPITAL PUNISHMENT 22XX\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2350000,\n      \"name\": \"Space Hero: Intergalactic Titan\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2330040,\n      \"name\": \"FateChessboard\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 4429260,\n      \"name\": \"Protect the Grimoire\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3195470,\n      \"name\": \"BARD'S FAULT\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3167100,\n      \"name\": \"CODE: BLUE\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 948820,\n      \"name\": \"Nevergrind\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3304760,\n      \"name\": \"Ethereal Sunder\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 4161910,\n      \"name\": \"BaseStar\",\n      \"label\": \"ambiguous\",\n      \"reason\": \"Distinct classes/playstyles are described, but configuration depth is unclear.\"\n    },\n    {\n      \"appid\": 4152760,\n      \"name\": \"Orrin's Chessboard\",\n      \"label\": \"ambiguous\",\n      \"reason\": \"Cards alter paths in tower defense; deck/configuration construction versus individual tactical card plays is unclear.\"\n    },\n    {\n      \"appid\": 3833800,\n      \"name\": \"Crafter's Hollow\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3128280,\n      \"name\": \"Cats & Dice\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 4310900,\n      \"name\": \"GLADIMAKER : Auto Battle RPG\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2769210,\n      \"name\": \"Scarmonde\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3972650,\n      \"name\": \"Backpack Jianghu\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 3915670,\n      \"name\": \"Apocalypse Survivor\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 1661600,\n      \"name\": \"Dead Ink\",\n      \"label\": \"ambiguous\",\n      \"reason\": \"Budgeted equipment/loadout choices are clear, but the claimed breadth is limited.\"\n    },\n    {\n      \"appid\": 2952180,\n      \"name\": \"Dragon Front: Adventures\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2535950,\n      \"name\": \"Battlestar Galactica: Scattered Hopes\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 2954730,\n      \"name\": \"Cube Hero Odyssey\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 4389530,\n      \"name\": \"Dice Heroes\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    },\n    {\n      \"appid\": 4258830,\n      \"name\": \"Pixel Valkyrie\",\n      \"label\": \"clear_advertised_configuration\",\n      \"reason\": \"Description contains explicit configurations, combinations, specialized equipment/skills, deck construction or class/party choices.\"\n    }\n  ]\n}"}}
{"status":"fulfilled","value":{"chunk_id":"e2a133","wall_time_seconds":0.000001747,"exit_code":0,"original_token_count":223,"output":"steam-research/search_check.py\nsteam-research/finish_metadata.py\nsteam-research/reconcile.py\nsteam-research/collect.py\nsteam-research/export.py\nsteam-research/repair_aliases.py\nsteam-research/inventory.py\nsteam-research/validate.py\nsteam-research/build-expression-2026-09-05/classify.py\nsteam-research/build-expression-2026-09-05/classify_v1.py\nsteam-research/2026-09-05/validation_progress.log\nsteam-research/2026-09-05/validation.json\nsteam-research/analysis-2026-09-05/prepare.py\nsteam-research/analysis-2026-09-05/analyze.py\nsteam-research/build-expression-2026-09-05/analyze.py\nsteam-research/analysis-2026-09-05/followups.py\nsteam-research/analysis-2026-09-05/deep_dive.py\nsteam-research/analysis-2026-09-05/charts.py\nsteam-research/build-expression-2026-09-05/sample_reviews.py\nsteam-research/analysis-2026-09-05/validation.json\nsteam-research/analysis-2026-09-05/validate_analysis.py\n"}}

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/build-expres...)

Script completed
Wall time 1.2 seconds
Output:

{}
{"chunk_id":"e631c0","wall_time_seconds":1.001148086,"session_id":75689,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.exec_command({cmd:\"steam-research/.venv/bin/python - <<'PY'\nfrom pathlib import Path\n...)

Script completed
Wall time 3.8 seconds
Output:

{"chunk_id":"8d46ab","wall_time_seconds":1.001543907,"session_id":18818,"original_token_count":0,"output":""}
{"chunk_id":"e09f9a","wall_time_seconds":2.636548221,"exit_code":1,"original_token_count":117,"output":"Traceback (most recent call last):\n  File \"/home/adn/a327ex/steam-research/build-expression-2026-09-05/validate.py\", line 46, in <module>\n    check('classifier_500_record_reproduction', fresh.equals(saved))\n    ~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/home/adn/a327ex/steam-research/build-expression-2026-09-05/validate.py\", line 17, in check\n    assert value, name\n           ^^^^^\nAssertionError: classifier_500_record_reproduction\n"}

exec ({"code": "text(await tools.exec_command({cmd:\"steam-research/.venv/bin/python - <<'PY'\nfrom pathlib import Path\n...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"be775f","wall_time_seconds":1.001501752,"session_id":22419,"original_token_count":0,"output":""}
{"chunk_id":"d976f5","wall_time_seconds":0.000001058,"exit_code":0,"original_token_count":3048,"output":"     period                      family    n  median  ge100  positive80_ge100  positive100_price_ratio  top1_review_share\n       2025          all_build_promises 1365    13.0    296               181                    1.000              0.196\n       2025          party_tactical_rpg  116    11.5     23                12                    0.671              0.428\n       2025             loot_action_rpg   95    19.0     29                14                    0.958              0.365\n       2025            familiar_carrier   81    10.0     18                11                    1.093              0.638\n       2025 roguelike_deckbuilder_tag20  169    40.0     62                41                    1.502              0.274\n       2025      action_roguelike_tag20  449    11.0     90                58                    1.157              0.381\n       2025          auto_battler_tag20  121    25.0     32                20                    1.214              0.348\n       2025         tower_defense_tag20   99    14.0     23                15                    1.083              0.195\n    2026_H1          all_build_promises 1085     5.0    171               101                    1.000              0.318\n    2026_H1          party_tactical_rpg   81     5.0     14                 7                    0.884              0.829\n    2026_H1             loot_action_rpg   66     4.0     14                 8                    1.075              0.307\n    2026_H1            familiar_carrier   95     7.0     14                 8                    0.854              0.198\n    2026_H1 roguelike_deckbuilder_tag20  132    15.0     33                22                    1.389              0.824\n    2026_H1      action_roguelike_tag20  361     6.0     50                29                    1.058              0.242\n    2026_H1          auto_battler_tag20   90     7.0     15                 9                    1.152              0.305\n    2026_H1         tower_defense_tag20   84     9.5     15                 9                    1.128              0.223\n2026_JulAug          all_build_promises  632     3.0     75                45                    1.000              0.173\n2026_JulAug          party_tactical_rpg   46     3.5      8                 4                    0.935              0.851\n2026_JulAug             loot_action_rpg   34    11.0     10                 2                    0.702              0.248\n2026_JulAug            familiar_carrier   58     3.0      4                 2                    0.476              0.176\n2026_JulAug roguelike_deckbuilder_tag20   67    10.0     11                10                    1.486              0.215\n2026_JulAug      action_roguelike_tag20  204     3.0     18                12                    0.952              0.210\n2026_JulAug          auto_battler_tag20   46     4.5      5                 5                    1.780              0.279\n2026_JulAug         tower_defense_tag20   48     2.0      2                 1                    0.351              0.183\n  appid             name                first_date  reviews  positive_pct  usd_list_price                                                                                                                                                                                                                                                                                            short_description                                   store_url\n2245620         Tangy TD 2026-03-09 14:02:00+00:00     1494            90            9.99                                   Strategic tower defense where you play a witch, place class-based towers, equip them with items that grant powerful abilities, combine them, create unique builds & deal ridiculous amounts of damage! Customize your builds with a deep stat system and giant skill tree! https://store.steampowered.com/app/2245620/\n2372240         Re:Night 2026-08-05 03:00:08+00:00      125            88           13.99      Re:Night is a strategy game that blends turn based tactics with roguelike deckbuilding. In each run, build your deck, plan your tactics, and experiment with countless 3-character team combinations. Journey to a mysterious town, break the endless cycle of night, and bring dawn back to the world. https://store.steampowered.com/app/2372240/\n2868840 Slay the Spire 2 2026-03-05 17:50:48+00:00   182020            61           24.99                                                                                                                                                        The iconic roguelike deckbuilder returns. Craft a unique deck, encounter bizarre creatures, and discover relics of immense power in Slay the Spire 2! https://store.steampowered.com/app/2868840/\n2886620      Hive Blight 2026-03-09 16:00:31+00:00      357            94           12.49                                                                                           Hive Blight is a roguelite autobattler where you lead a team of insect warriors against a corrupting Fungal Threat. Build powerful synergies, uncover the source of the plague, and destroy it to save your world! https://store.steampowered.com/app/2886620/\n3100310      Arms of God 2026-06-08 13:59:20+00:00     1845            88           11.50  Gear up for a battle through hell in this roguelite Bullet Heaven Arena Autoshooter with Doom-inspired gore vibes, metal music, and a satisfying combat feel. Wield five weapons at once, upgrade and merge them to forge indestructible builds, and bring divine justice to a world on the brink of chaos. https://store.steampowered.com/app/3100310/\n3100370     Black Jacket 2026-05-12 15:37:13+00:00     1717            91           14.99                                            Gamble your way out of hell in this blackjack-inspired rogue-lite deckbuilder. Play powerful card combos or cheat to outwit your opponents and earn your freedom. Win their Soul coins! Bribe the ferryman! And uncover the story of those who stand in your way. https://store.steampowered.com/app/3100370/\n3171540        Packmates 2026-04-16 09:18:05+00:00       38            73           11.99                                                                                           Survivor roguelite meets inventory management. Collect items and master their adjacencies to unleash devastating combos. Obliterate enemies and battle bosses to overcome the corruption infiltrating your forest! https://store.steampowered.com/app/3171540/\n3199360      Skull Horde 2026-04-10 15:00:09+00:00     1070            81           12.99                                                                                                 Skull Horde is an auto battler dungeon crawler where you play as a flying skull necromancer. Find powerful loot and create overpowered builds. Summon a horde of skeletons in a battle of bone versus flesh! https://store.steampowered.com/app/3199360/\n3219180        Cursemark 2026-06-08 15:57:59+00:00      561            85           14.99 Hack, slash, and cast your way through a haunted kingdom brimming with secrets where no two builds are ever the same. As a cursed mage-knight you will unlock devastating spells, equip ability transforming runes, and reforge your curse on the path to victory or death in this fantasy action roguelite. https://store.steampowered.com/app/3219180/\n3400960      Oaken Tower 2026-04-28 13:00:15+00:00     2889            89            9.99                                                                                                                                         Oaken Tower is a synergy-heavy PvP auto battler where your tower of items fights other players. Build deadly combos and scale exponentially. Every decision matters. https://store.steampowered.com/app/3400960/\n3430340   Dice A Million 2026-02-25 18:00:19+00:00     1047            90           12.99                                                                                                                                                                                      Have you ever tried to roll 1,000,000 on a set of dice? No? Build the right bag of die, and you might just pull it off. https://store.steampowered.com/app/3430340/\n3500680         Cropdeck 2026-04-28 16:00:25+00:00      420            92           12.99                                                                         Plant, grow, and harvest in this farming roguelite deckbuilder. Craft a powerful deck of plants and combine quirky scarecrows with passive effects for wild synergies. Pay taxes. Strategic, satisfying, and delightfully wholesome. https://store.steampowered.com/app/3500680/\n3596700 TerraTech Legion 2026-04-30 17:01:34+00:00     2060            81            9.99                                                                                                              TerraTech Legion, a chaotic Bullet Heaven Builder. Build the ultimate battle vehicle block by block and survive waves of robotic foes, ramming them at speed and shooting infinite projectiles. https://store.steampowered.com/app/3596700/\n3741860      Vital Shell 2026-01-07 14:59:43+00:00     1699            96            5.99                          Vital Shell is a single player top-down arena shooter that puts you in control of mechs inspired by classic fantasy archetypes. Unlock powerful synergies with unique weapons, traits, and abilities as you take on increasingly challenging waves of enemies in a shattered realm. https://store.steampowered.com/app/3741860/\n3934270  How Many Dudes? 2026-07-30 14:54:54+00:00     2817            89           14.99                                                                           How many dudes does it take to beat up a gorilla? A thousand toddlers? A horse-sized duck? A GOD? Enter the Dude Ranch and find out in this roguelike dudebuilder where you recruit an army of dudes to fight ridiculous battles.  https://store.steampowered.com/app/3934270/\n4131940  Shattered Chess 2026-06-05 16:00:49+00:00       28           100            7.99                                                                                                                                                                           Chain massive combos, build game-breaking synergies, and survive rule-changing bosses in this fast-paced roguelike twist on chess. https://store.steampowered.com/app/4131940/\n4206270        Wireworks 2026-03-09 15:58:57+00:00      602            89            6.99                                                                                                                  Design your defenses, build your module board, and manage your wires. Combine signals and create synergies to empower your weapons and survive in this base-defense roguelike auto-battler. https://store.steampowered.com/app/4206270/\n4210680     Twisted Fate 2026-03-17 13:24:08+00:00       39            89            7.99                                                                             A turn-based roguelike with a deep ability-modification system. Lead a party of three heroes, adapt their skills using modifiers, collect artifacts, and craft unique builds to destroy the source of corruption… or die trying. https://store.steampowered.com/app/4210680/\n4283360      Legionbound 2026-04-27 13:02:30+00:00      642            83            9.99                                                          Turn a handful of heroes into a massive legion! Legionbound is a casual retro RPG autobattler where you recruit heroes, discover class synergies, forge powerful Ascensions, and battle through hordes of enemies across replayable roguelite runs. https://store.steampowered.com/app/4283360/\n4478640 Backpack Dungeon 2026-07-15 03:00:22+00:00      622            88            3.99                                                      A unique pixel-art backpack management roguelike. Your backpack isn't just storage—it's your combat core. Item placement, adjacency, and trigger mechanics determine your survival in the dungeon. A mental challenge of spatial planning and strategy. https://store.steampowered.com/app/4478640/\n"}

exec ({"code": "text(await tools.write_stdin({session_id:22419,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":4500...)

Script completed
Wall time 5.0 seconds
Output:

{"chunk_id":"9ef496","wall_time_seconds":5.00117497,"session_id":22419,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.apply_patch(\" Begin Patch\n Add File: /home/adn/a327ex/steam-research/build-expres...)

Script completed
Wall time 0.0 seconds
Output:

{}
{"chunk_id":"a0f870","wall_time_seconds":0.000001652,"exit_code":0,"original_token_count":54,"output":"        signal_idle_central       \n                       self  other\nappid                             \n3525970                True  False\n3936880                True  False\n4641910                True  False\n[]\n"}

[Think]

**Recomputing full-text possible labels**

One useful distinction emerged from the Steam reviews: players sometimes praise a specific interaction that makes an otherwise weak item valuable, while criticizing games whose huge item counts mostly produce numerical upgrades. That is evidence worth pursuing for your interests, though this small review sample cannot establish how common the preference is.

The report is saved. I’m finishing consistency checks; I also dropped an apparent advantage for spatial inventory games because the text classifier was confusing some of them with ordinary storage systems.

exec ({"code": "text(await tools.exec_command({cmd:\"steam-research/.venv/bin/python - <<'PY'\nfrom pathlib import Path\n...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"3ac93d","wall_time_seconds":1.000230031,"session_id":71254,"original_token_count":0,"output":""}
{}

[Think]

**Updating specification fields**

exec ({"code": "text(await tools.write_stdin({session_id:71254,chars:\"\",\"yield_time_ms\":1000,\"max_output_tokens\":1500...)

Script completed
Wall time 0.1 seconds
Output:

{"chunk_id":"f5c395","wall_time_seconds":0.000001684,"exit_code":0,"original_token_count":14,"output":"diagnostic full-description idle signal refreshed 1153\n"}
{"chunk_id":"662389","wall_time_seconds":0.000003457,"exit_code":0,"original_token_count":0,"output":""}

exec ({"code": "text(await tools.exec_command({cmd:\"steam-research/.venv/bin/python steam-research/build-expression-2026-0...)

Script completed
Wall time 1.2 seconds
Output:

{"chunk_id":"2682ee","wall_time_seconds":1.001520855,"session_id":1447,"original_token_count":0,"output":""}

[Think]

**Checking threshold robustness**

**Checking threshold choice**

exec ({"code": "text(await tools.exec_command({cmd:\"steam-research/.venv/bin/python - <<'PY'\nfrom pathlib import Path\n...)

Script completed
Wall time 0.4 seconds
Output:

{"chunk_id":"88faa7","wall_time_seconds":0.21215577,"exit_code":0,"original_token_count":185,"output":" year          segment     n  positive80_ge100\n 2025    paid_eligible  9140               884\n 2025    strict_builds   843               109\n 2025 inclusive_builds   985               127\n 2026    paid_eligible 12409               853\n 2026    strict_builds  1717               146\n 2026 inclusive_builds  1920               164\n     period  publisher_key_removed_positive100_rate  publisher_key_removed_n  positive100_price_ratio\n       2025                                0.228916                        3                 1.502168\n    2026_H1                                0.167939                        1                 1.388702\n2026_JulAug                                0.136364                        1                 1.485752\n"}
{"chunk_id":"f249c0","wall_time_seconds":0.000002221,"exit_code":0,"original_token_count":455,"output":"{\n  \"passed\": 39,\n  \"checks\": {\n    \"canonical_rows_unique\": true,\n    \"classification_covers_source\": true,\n    \"strict_implies_inclusive\": true,\n    \"excluded_not_builds\": true,\n    \"rules_hash_current\": true,\n    \"2025_pool_counts\": true,\n    \"2025_positive_counts\": true,\n    \"2025_within_build_ratio100_date_calibrated\": true,\n    \"2025_within_build_ratio100_price_calibrated\": true,\n    \"2025_within_build_ratio100_text_calibrated\": true,\n    \"2025_positive100_price_ratio_calibrated\": true,\n    \"2025_roguelike_deckbuilder_tag20\": true,\n    \"2025_action_roguelike_tag20\": true,\n    \"2025_auto_battler_tag20\": true,\n    \"2025_tower_defense_tag20\": true,\n    \"2026_H1_pool_counts\": true,\n    \"2026_H1_positive_counts\": true,\n    \"2026_H1_within_build_ratio100_date_calibrated\": true,\n    \"2026_H1_within_build_ratio100_price_calibrated\": true,\n    \"2026_H1_within_build_ratio100_text_calibrated\": true,\n    \"2026_H1_positive100_price_ratio_calibrated\": true,\n    \"2026_H1_roguelike_deckbuilder_tag20\": true,\n    \"2026_H1_action_roguelike_tag20\": true,\n    \"2026_H1_auto_battler_tag20\": true,\n    \"2026_H1_tower_defense_tag20\": true,\n    \"2026_JulAug_pool_counts\": true,\n    \"2026_JulAug_positive_counts\": true,\n    \"2026_JulAug_within_build_ratio100_date_calibrated\": true,\n    \"2026_JulAug_within_build_ratio100_price_calibrated\": true,\n    \"2026_JulAug_within_build_ratio100_text_calibrated\": true,\n    \"2026_JulAug_positive100_price_ratio_calibrated\": true,\n    \"2026_JulAug_roguelike_deckbuilder_tag20\": true,\n    \"2026_JulAug_action_roguelike_tag20\": true,\n    \"2026_JulAug_auto_battler_tag20\": true,\n    \"2026_JulAug_tower_defense_tag20\": true,\n    \"classifier_500_record_reproduction\": true,\n    \"bounded_review_sample\": true,\n    \"network_paused\": true,\n    \"no_media_directories_or_downloader\": true\n  }\n}\n"}

Build-heavy games are a substantial, growing part of Steam, but “lots of builds and synergies” is becoming a very common promise. The useful distinctions are between different forms of configuration, and between attracting attention and satisfying players.

I included 2026 throughout this pass. Everything below uses the September 5 snapshot, without marketing-blog research.

I classified games using their descriptions and tags: explicit build variety, equipment/ability combinations, deck construction, party composition, branching classes, and similar systems. This measures advertised build expression, not depth verified by playing. A blind inspection of 36 matches found 31 clear cases and five ambiguous ones. Central idlers, incrementals, FMV and visual novels were excluded.

The number of games advertising builds is growing much faster than the surrounding catalog.

Comparing January–August store-date cohorts:

2025 2026 Change
Eligible paid games 9,140 12,409 +36%
Strict build-expression matches 843 1,717 +104%
Build matches as share of that population 9.2% 13.8%

The broader classification also nearly doubles. This could reflect changes in advertising language as well as actual game design, but either way, players are encountering that promise much more frequently.

There is substantial response alongside that supply. Already, 146 January–August 2026 matches have at least 100 reviews and 80% positive, versus 109 in the corresponding 2025 cohort. That does not establish improving success rates: the populations differ, and newer games have had less time.

Roguelike deckbuilders show the clearest consistent favorable association.

To distinguish attention from positive reception, I used a benchmark of 100+ reviews and 80%+ positive. It is a comparison tool, not a profitability threshold.

Build-game family 2025 Jan–June 2026 July–August 2026
All build matches 13.3% 9.3% 7.1%
Roguelike deckbuilder 24.3% 16.7% 14.9%
Action roguelike 12.9% 8.0% 5.9%
Auto battler 16.5% 10.0% 10.9%
Tower defense 15.2% 10.7% 2.1%

Compare families within each column. Falling percentages across columns largely mix in unequal exposure time; they are not evidence that these markets are deteriorating. Families overlap.

After accounting for release-date and current-price differences, roguelike deckbuilders reach that combined benchmark about 1.4–1.5 times their expected frequency across all three periods. The pattern survives changes in tag cutoff and removal of the largest-review publisher. That is an association, but a reasonably persistent one.

It also isn’t simply one enormous game pulling up an average. In fact, Slay the Spire 2 has 182,020 reviews but 61% positive in this snapshot. It contributes about 80% of review volume in the broader first-half card/deck group. Adding up reviews would obscure how differently individual games are being received.

For your interests, the auto-battler examples may be more useful than the genre ranking.

There are several well-received games where the thing being assembled differs substantially:

Game What the player configures, according to its store Reviews Positive
Oaken Tower A tower of synergizing items that fights other players 2,889 89%
Skull Horde A necromancer’s army and loot 1,070 81%
Legionbound Recruited heroes, class synergies and ascensions 642 83%
Wireworks A module board with wiring and interacting signals 602 89%
Hive Blight A team of insect warriors 357 94%

My reading is that what players assemble, and the rules connecting its parts, offers useful room for differentiation. These games place different configuration problems inside recognizable combat structures.

The auto-battler statistics are modestly favorable. July–August looks stronger, but only five games reach the benchmark, so I wouldn’t announce a boom.

Action games with builds remain active; the genre itself provides little additional advantage.

There are 361 action-roguelike matches in the first half of 2026 and another 204 in July–August. After date/price adjustment, their positive-response benchmark is roughly at the build-game baseline.

Nevertheless, current examples include:

  • Vital Shell: 1,699 reviews, 96% positive, $5.99. Mechs built around fantasy archetypes, weapons, traits and abilities.
  • Arms of God: 1,845, 88%, $11.50. Five simultaneous weapons with upgrading and merging.
  • TerraTech Legion: 2,060, 81%, $9.99. A battle vehicle assembled block by block.

Those demonstrate continuing positive response to particular implementations. Their prices tell us nothing reliable about development duration.

The most interesting qualitative finding concerns meaningful alternatives versus nominal variety.

The July–August loot/action-RPG group initially looked attractive: 10 of 34 games had 100+ reviews. But only two also reached 80% positive.

I collected a bounded sample of 273 recent English Steam-purchase reviews across five games to investigate. The sample deliberately includes both sentiments and cannot measure how prevalent a complaint is. Selected reviews nevertheless make a useful distinction:

  • In Shadow Dungeon, negative reviewers describe huge advertised item/build counts that resolve into numerical variations, or a progression system where eventually buying every skill removes the need to choose. Some positive reviewers enjoy the loot loop despite similar reservations.
  • In Ruins of Dawn, a positive reviewer describes a dagger interacting with a ring so that a lower-base-damage weapon becomes better for that particular setup. Another describes items transforming an initially weak fireball.
  • In SpiritVale, reviews can praise respecs and class/item optimization while criticizing servers, balance or the economy. Low aggregate satisfaction does not necessarily mean rejection of the build system.

For me, the useful hypothesis is conditional value: an item becomes desirable because of a particular configuration, or changes what an ability does. That produces a different kind of expression from accumulating upgrades until everything is unlocked. The review evidence illustrates the distinction; it does not prove a market-wide design formula.

I found interesting smaller combinations, but couldn’t establish an underserved niche from them.

Tangy TD equips class-based towers with items and abilities: 1,494 reviews, 90% positive. Backpack Dungeon makes adjacency and triggers central to combat: 622, 88%.

However, the broader spatial-inventory classifier also caught ordinary storage systems. Tightening it left too few games for a defensible market claim. And counterexamples exist: Packmates, which combines survivor combat with item adjacency, has 38 reviews; Twisted Fate, advertising party builds and ability modifiers, has 39.

Likewise, combining builds with chess, dice, poker or another familiar activity showed no consistent general advantage. There are individual successes, but “familiar activity plus roguelike builds” is insufficient as a market thesis.

The direction I would prioritize from this evidence is a compact game with a distinctive configuration rule and consequential interactions. Roguelike deckbuilding has the strongest recurring statistical association; auto battlers offer particularly varied examples; action games still support positive reception without a broad subgroup advantage. Steam cannot establish which approach fits a few months of development or minimal marketing effort.

The full findings, methodology, and comparison data are saved. All 39 consistency checks passed. No media was downloaded for this pass; collection remains paused.

Let's end this session, name it Steam Market Research 5, we'll continue the research in another one. Because you compacted, instead of writing the summary yourself, after you transform the transcript into markdown, spawn a subagent to read the transcript and create the summary itself, since it will be able to hold it all in its head and thus create a better summary since you don't have the pre-compaction context anymore. Makes sense?