# Independent investigation of Fable Steam Research 1–4

Analysis date: September 6, 2026. Source snapshot: September 5, 2026. This study
reads Fable's published summaries and selected original methods, then tests the
claims against the independently collected data from Codex sessions 5 and 6.
It imports no Fable game records, estimates, visual scores, or review histories.
The old Windows archive was consulted read-only for definitions and code audits.

## Sources

- `../2026-09-05/catalog.sqlite` and `exports/`: 184,664 public game app records,
  128,972 marked released, across 23 checked storefront catalogs. This is not all
  historical Steam apps; delisting and unavailable regions can remove games.
- `../career-history-2026-09-06/reviews.parquet`: the original 24 paid-game subset
  contains 15,445 currently returned Steam-purchase reviews. Three currently free
  games remain outside this study's primary historical comparisons.
- `../../a327ex-site/logs/fable-test-steam-market-research-{1,2,3}.md` and
  `../../a327ex-site/logs/steam-market-research-4.md`: claims, with later corrections
  taking precedence. Selected original scripts/reports are at
  `/mnt/Main/a327ex/steam-market/`, read only.
- Official Steam sale announcements: four individually fetched calendar pages,
  with URLs/excerpts in `official_sale_sources.json`. No fresh game collection.
- Steam's review API and review documentation clarify filtering and mutable
  reviews: https://partner.steamgames.com/doc/store/getreviews and
  https://partner.steamgames.com/doc/store/reviews .

## Definitions

`prepare.py` independently normalizes the original raw game export. It uses a
valid original-Steam date where supplied, otherwise the reported Steam date, and
the previously verified local KOF XV correction. Consequently the main 2023–2025
paid, non-explicit pool is **38,493**, one fewer than the uncorrected session-5
pool. Current free flags and explicit descriptors 3/4 define those exclusions;
no manual seriousness or quality filter is used in the main market pool.

Prices are current USD list prices from a standalone best package, excluding
bundles, multi-game packages, and options requiring another app. Missing price
is not zero. The price/review formula is retained only as a replication device:
`h50 = reviews * current_price * 35.9 >= 50,000`. `h50_n` is the known-price
denominator; review thresholds retain games without an observed price. The
25/35.9/55 constants are sensitivity choices, not confidence limits. No sales,
profit, development cost, or actual revenue is estimated here.

Fixed count outcomes are at least 50, 100, 556, or 1,000 filtered reviews. The
joint benchmark is at least 100 reviews and at least 80% positive. 556 is used to
replicate Fable's career cutoff; it is not treated as proof of 25,000 buyers.

Tag membership is checked at ranks 7, 10, and 20. Current tags do not reconstruct
historical tags. Headline 2023–2025 outcomes use today's cumulative counts, while
2026 and same-calendar-window supply are separate. Neither calendar matching nor
the passage of one year produces equal-age outcomes from this snapshot.

`compare()` directly standardizes against nonmembers in exact observed strata,
usually release quarter/current-price band, with stronger year/price/primary-tag/
description-length or month checks where specified. Require at least five
controls per cell (three for detailed calendar timing). Unsupported target rows
are excluded from both observed and expected totals. Report support explicitly.
Observed/expected ratios are descriptive, with residual composition, creator
clustering, current-state look-ahead, and selection. They are not causal effects,
validated forecasts, or multiplicity-adjusted evidence unless explicitly stated.

Career identity uses normalized literal single developer credits. Names are not
verified people, organizations may change, aliases can split careers, and games
with multiple credits are excluded. A free-inclusive sensitivity has 114,227
games/69,008 names; paid non-explicit sequences have 90,884 games/56,323 names.
Games through July 1, 2026 enter sequences; most release-outcome tests stop July 1,
2025, matching Fable's maturity convention. Current outcome measurements remain
September 5. Some comparisons use one latest or first qualifying release per
name; this changes the target population rather than magically eliminating bias.
Sequences prefer chronology then app ID; known ports, batch arrivals, missing EA
history and delisting can misrepresent first exposure or the true order of work.

All catalog-wide prior-review bands are **current counts of earlier games**, not
counts available at the next launch. Historical reconstruction is limited to the
24 named paid games. Their current surviving reviews omit deleted/filtered
records, and current votes/text are not archived original votes/text. Calendar
launch-month counts in `history_windows.csv` can be zero when reviews first arrive
the next month; Fable's first-nonempty-bucket method would skip that empty bucket.

The rare-pair multiplicity check uses Fable's non-content exclusions, component
minimum 80, pair range 4–40 and max(component rates, baseline) binomial null.
All 10,804 eligible pairs enter BH adjustment, including pairs failing the
outcome-based hit-count screen. This is a diagnostic applied to the new catalog,
not a reanalysis of Fable's exact old search family. Pair tests overlap and the
binomial model treats estimated comparison rates as fixed; the resulting q-values
are not a certification of the surviving combinations.

## Reproduction

From this directory, use `../.venv/bin/python` in this order:

1. `prepare.py`
2. `market.py`, `careers.py`, `history.py`, `selection_check.py`, `timing.py`
3. `followups.py`, `career_extensions.py`, `continuation_checks.py`,
   `additional_checks.py`, `quantity_sensitivity.py`
4. `charts.py`, `validate.py`

Scripts are offline. `official_sale_sources.json` preserves the four calendar
lookups used to encode events; no network is needed to reproduce timing tables.
The raw snapshot and collection policy remain unchanged. No images were
downloaded. The chart is a locally generated statistical plot.

`claim_register.csv` maps the complete finding families to their verdicts and
evidence. `findings.md` records the substantive assessment, also delivered in
chat. Tables retain counts and support; `pair_members.csv`, career Parquet,
historical tables, and the named/audit lists support inspection. The original
quantity regex is preserved as a replication; a stricter largest-count rule
and an outcome-hidden 12-description diagnostic test its interpretation.

Validation discovered non-game tag rows in the all-app source relation. Those
are now filtered during normalization. Every numerical analysis already joined
against the game population, so this removal does not alter its memberships or
results. Validation also checks raw SQLite counts, 250 source records, relation
identities, aggregate bounds, selected exact recounts, 100 developer histories,
historical windows, syntax and closed collection state.
