Skip to content

Mockup - #1

Open
aruship4 wants to merge 121 commits into
mainfrom
mockup
Open

Mockup#1
aruship4 wants to merge 121 commits into
mainfrom
mockup

Conversation

@aruship4

Copy link
Copy Markdown
Collaborator

No description provided.

APRILjcc and others added 17 commits June 23, 2026 15:15
--html-dir given as a relative path crashed filepath.relative_to(BASE_DIR)
(BASE_DIR is absolute), silently producing an empty prices CSV. Resolve the
path first and fall back to the raw string.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- 13-recent-manifest.py: select recent-window snapshots (>=2 quarters, anchored
  2024Q3, >=1 snapshot in trailing 12mo), 7 categories.
- 14-recent-ipi.py: matched-model index (Jevons elementary per category,
  review-weighted geometric composite), quarterly + monthly, trailing-12mo headline.
- run-recent-pipeline.sh: idempotent driver (download retry -> extract -> build).
- gitignore: exclude html-recent/ raw HTML (22GB) and transient .out logs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
15,150/15,309 snapshots (99%), 100% price extraction across 7 categories.
Composite IPI flat over the past year (2025Q1->2026Q1: -0.3%); video -11.6%,
coding -6.8%, writing -6.6%, design +2.1%. Includes per-category indices and
volume-proxy weights for client-side recompute.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- code/15-build-site-data.py: reuse step 14's monthly build to emit
  per-category monthly index -> site/data.json (2.2 KB, trailing 12mo,
  rebased to window-start=100).
- site/index.html + site/ipi.js: category checklist drives live in-browser
  composite recompute (matches pipeline's exp(Sum w.ln/Sum w)).
- Verified: client recompute over all categories reproduces composite_all.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Page wasn't working and the user is building their own site. Removed
site/index.html, site/ipi.js, scripts/deploy-site.sh and deleted the
gh-pages branch. Kept code/15-build-site-data.py + site/data.json as the
data layer for the user's own frontend.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Rebuilt CSRankings-style site now hand-rolls the trend chart and
sparklines as inline SVG — no Plotly/CDN. Validated: JS syntax OK,
data.json contract complete, client composite reproduces composite_all
(headline -2.1% trailing 12mo). Adds deploy-site.sh redeploy helper.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…ting

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Serve the IPI frontend from /docs (branch mode) instead of the site/
subfolder, which Pages branch mode cannot serve. Drop the Actions
workflow; update the data-build script output path.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Self-contained faq.html (no external libs): explains the purpose of the
index and documents the exact formulas — price relatives, chained Jevons
category index, weighted-geometric-mean composite, headline 12mo change,
and review-based weights — with CSS-rendered math. Cross-linked from the
main index header.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages June 30, 2026 18:53 — with GitHub Pages Inactive
Polished, still fully self-contained (no external libs/CDN): Inter/system
font stack, soft canvas with white rounded cards + subtle shadows, indigo
accent, inline-SVG logo + favicon, pill basket toggles, refined table and
tooltip, responsive tweaks. FAQ restyled to match (TOC card, paper card,
boxed formulas). All JS hooks and the data contract are unchanged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages June 30, 2026 19:40 — with GitHub Pages Inactive
…ection

- index.html: add full-sentence IPI definition directly beneath the page title
- index.html: lay out trend chart (left) and category-selection table (right)
  side by side via CSS grid, collapsing to stacked below 900px; widen wrap
- faq.html: matching aesthetic refresh

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages June 30, 2026 20:29 — with GitHub Pages Inactive
- ipi.js: significantMoves() flags MoM moves past 0.8% plus the biggest
  rise/drop; drawChart overlays a green/red segment + labeled % on the
  composite line, recomputed live as categories are toggled
- index.html: legend caption under the chart (green=rise, red=drop)

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages June 30, 2026 20:53 — with GitHub Pages Inactive
The collection process was already described after the roadmap, but the
responses to its limitations were scattered across four places: a
five-row revision table, a two-sentence orphan on what the crawl's shape
caused, 3.1's two-phase scoping argument, and a standalone subsection on
the enlarged collections. A reader could not see the record as a whole.

Consolidates them into one eight-row table - limitation the data
revealed, change made in response, effect - and folds in the three
responses that were never in the change log: the catalogue-first design
as the answer to the archive's size, the 2018Q3 floor as the answer to
the severed chain, and the enlarged collections as the answer to matched
gigs per pair being the binding unit.

Keeps prose for the three that carry consequences. The Stage 5b
paragraph now makes detection the point: the defect survived every check
until the extraction share table exposed it, which is why stage 5 reports
shares rather than a success rate.

No numeric token lost, checker passes, HTML re-rendered. No figure from
results.md crossed into the paper.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Section 3 was describing the collection four times over - a phase
roadmap, an eight-stage table, a change table, and prose - and none of
them was the story of what actually happened. That is why four rounds of
patching the wording did not make it land.

Rebuilds 3.2 around a chronological narrative: seven dated steps, each
forced by what the step before it revealed, from harvesting the catalogue
through the abandoned sampling rule, the pilot, the second crawl, the
rate and storage lessons, the parsing defect, and locating the binding
constraint. The pipeline table stays, retitled, as a replication
reference rather than as the section's spine.

Reorders 3.1 for truth. The archive's sparsity was stated before how the
source was chosen, which read as though we knew and picked Fiverr anyway.
Those figures are measured over the capture index and could not have
existed before it, so they now follow the scoping decision.

Deletes the phase roadmap as the redundant telling and absorbs three
prose paragraphs into the narrative.

Section numbering left untouched - 91 cross-references across 13 files
depend on it. No numeric token lost, checker passes, HTML re-rendered.

3.3-3.10 are not data collection and were not rewritten.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Section 3 was 9,050 words. This brings it under 4,000 by relocating
detail rather than deleting it.

New drafts/sections/appendix-a.md holds the estimation diagnostics: the
chained-index decomposition, the extraction-method share table, the
MIN_MATCH sweep, the precision-vs-n subsampling table with its
finite-population correction, the window/base/threshold decomposition and
the coding ceiling, the full hedonic table with its caveats, the five
retracted-elasticity diagnostics, and the corrections table. Wired into
main.md and the renderer's ORDER.

Collection detail compresses to pointers at drafts/data-collection.md,
which already held all of it.

Section 3 keeps every claim, both figures, the weights and adequacy
tables, the two GEKS equations, and all 23 checker-required figures.

A token diff caught roughly fifteen figures the first pass had dropped
outright - the extraction shares, the coding ceiling, the reputation
standard error and n, the base-quarter log standard errors - and those
are restored into the appendix.

Checker passes. HTML re-rendered; inline math converts with no raw LaTeX
leaking.

The hedonic table of U7 now sits in the appendix rather than 3.8. It is
still in the paper, which is what U7 required, but no longer in the body.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
results.md named GEKS-Jevons once, in a provenance note about which
script it imports, and never said what the model does or why it was
chosen over the alternatives that were tried.

Adds "The final model, and why it is the one we use" ahead of the
analysis: what a matched-model index does and why comparing a gig to
itself matters when seller, quality and task difficulty cannot be
measured from an archived page; what the Jevons and GEKS halves each
contribute; the exact specification; and an explicit note that levels in
this file are nominal, the CPI-U deflation being a paper step not applied
here.

The three rejected models get a table with the reason for each - chained
Jevons, time-product-dummy, and the direct base-to-terminal comparison
that survives as a check rather than as an index. Weighted multilaterals
were never available: an archived page shows a price but never a sale.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Five rounds of editing the paper's prose did not make the collection
process or the results land. The register was the problem: the paper is
compressed, cross-referenced and hedged by design.

Adds drafts/methods-and-results.md, at the drafts root rather than in
sections/, so it is explicitly not a paper section and sits outside the
frozen-numbers checker. Seven parts: what we measure and why it is hard,
the six collection steps with the funnel, one real gig traced end to end,
how gigs become an index number, every problem and what we changed, the
results, and what we still cannot do.

Two figures in it are computed live from the CSVs rather than quoted from
prose, and both are new to the project's documentation: one gig's actual
quarterly medians, and a real quarter-pair comparison showing 1,132
matched gigs of which 976 did not change price at all. That last point -
the index moves because a minority re-price - was nowhere in the writing.

The problem/change table carries a "did it work?" column, including the
honest no on the 2017-2018 gap, which is a permanent loss and not a
repair.

All 15 headline figures cross-checked against paper-numbers.md; the two
computed figures verified against the CSVs; paper checker still passes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
haojian and others added 5 commits August 17, 2026 19:58
Phase -1 of the transaction-volume study. The study is causal from the
start, so Phase 0 (which reveals per-category demand breaks) cannot run
until the exposure ranking and specification are committed -- a ranking
built after seeing outcomes is not pre-registered, and that is the
objection that retracted the elasticity table in step 29.

Ranking sourced from Eloundou et al. (2023) rather than transcribed:
occ_level.csv pulled from the authors' public replication repo and
vendored so it reproduces offline. Human annotation is primary; the
GPT-4 annotation is declared robustness, because it is a model scoring
its own labour-market reach.

The two annotators disagree about coding (dv rank 1, human rank 4) and
marketing (3 vs 5), so the primary contrast uses only the four
categories they agree on -- HIGH {translation, writing} vs LOW {video,
audio} -- and coding is quarantined rather than assigned to an arm.

Also locked: 2022Q4 break, gig + quarter FE, gig-clustered SEs, the
2018Q3-2019Q4 placebo, parallel trends as a pass/fail gate with
synthetic control as the only authorised fallback, and the step-29
battery required to pass all four tests before anything is called
causal. Power computed pre-outcome: 129,378 accrual observations in the
primary contrast.

No outcome estimated; no paper section, figure or frozen number touched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ran the pre-registered specification on 236,535 accrual observations
(35,888 gigs, 2018Q1-2024Q4). Two results pointing different ways.

The premise held. MDE tightened 4.7x-9.4x (+/-4.2% to +/-7.0%, was
+/-23% to +/-66%) and all seven categories now show large significant
falls in review accrual at 2022Q4: writing -42.9%, translation -37.2%,
audio -35.5%, coding -35.2%, video -28.6%, marketing -23.7%, design
-13.1%, every |t| > 6.6.

The attribution did not. The categories fell together, including the two
least AI-exposed, and the differential died three ways: parallel trends
failed the pre-registered gate (6 of 16 pre-period interactions
significant), the linear-trend horse race collapsed HIGH x POST from
-7.9% (t -4.14) to -0.8% (t -0.30) while HIGH x trend stayed significant,
and the CPI-U placebo came back significant (t -2.93). Placebo window
passed; DW 2.26, so the SEs are fine and the effect is absent rather
than mis-estimated.

Worth recording why this mattered: the DiD read -7.9% [-11.4, -4.2],
t = -4.14, on a realised MDE of +/-3.96% -- it MET the project's +/-5%
adequacy standard. Tight, significant, correctly signed, and wrong. The
pre-registration caught it instead of a reviewer.

Consequences: Phase 1 (review-propensity drift) moves ahead of Phase 2,
because a platform-wide accrual fall is exactly what buyers reviewing a
smaller share of purchases looks like -- so the -13% to -43% cannot be
called a demand decline yet. Fiverr Inc.'s reported GMV is promoted with
it. Implemented as a new step so step 24 survives as the underpowered
baseline.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
First actual transaction data in the project. The archive has none --
review_count is a proxy -- so the only route to real quantities is
Fiverr Inc. (NYSE: FVRR), which nothing here had used.

Fiverr defines spend per buyer as TTM GMV / active buyers, so
GMV = buyers x spend is an identity, and it reproduces every
independently reported GMV to within rounding. Revenue is not a
substitute: 2024 revenue/GMV is 36% against a 27.6% take rate.

Active buyers peaked at 4.20M in 2021 and are 2.70M as of TTM 2026Q2,
-35.7%. GMV peaked in 2023 and is only -12.8%, because spend per buyer
rose every single year from $119 (2017) to $368. Fewer, larger buyers.

Deriving orders = real GMV / real IPI price gives implied orders -18.0%
vs 2020 and -38.6% from the 2021 peak. That is an UPPER BOUND on the
decline: the IPI prices the listed basic package, not realised order
value, and Fiverr's upmarket push means realised price rose faster.

Buyer growth hit exactly +0.0% in 2022 after +44.7% and +23.5% in
2020-21. The era fits ChatGPT and fits post-pandemic normalisation
equally well, so timing is suggestive, not evidence.

Main consequence: this substantially discharges the review-propensity
threat that was blocking Phase 0's interpretation. Fiverr's buyer and
GMV series have nothing to do with reviewing behaviour and they fall
too, so the direction of the 13-43% accrual decline is corroborated as
real. Fiverr publishes no category split, so the "which categories"
half of the question stays not identified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Ran the pre-registration's only authorised fallback (synthetic control)
plus the specification that directly targets step 46's failure mode.

Category-specific linear trends kill the DiD outright: HIGH x POST
= -0.4% (t -0.17). Audio's own trend is +2.7%/qtr (t 7.87) and
translation's +2.6% (t 8.57), so the categories genuinely trend
differently and no differential break survives allowing it.

Synthetic control is self-contradictory rather than merely
inconclusive. Translation -- the most AI-exposed category by the
pre-registered measure (beta 0.840) -- has a gap of -2.2% under the
registered LOW donor pool (ratio 0.14, within pre-period noise) and
flips to a WRONG-SIGNED +1.4% under the expanded pool. Writing falls
-12.4% / -15.6%. In-space placebos put writing 1st of 7 (one-sided
p = 0.143) and translation LAST of 7 (p = 1.000), with audio -- the
LEAST exposed -- 2nd. Two HIGH categories at opposite ends of the
placebo distribution is not an AI signal.

Structural ceiling, known before running: with seven categories the
smallest attainable one-sided p is 1/7 = 0.143, so category-level
placebo inference cannot reach 5% whatever the data say.

Four designs have now failed (parallel trends, trend horse race, CPI-U
placebo, synthetic control). Position: per-category breaks are measured
precisely (-13% to -43%, +/-4.2-7.0%); their differences cannot be
attributed to AI exposure. The category route moves to the backlog's
gig-level continuous-exposure design, now cheaper because the vendored
Eloundou file is the external measure it needed.

Expanded donor pool logged as a declared deviation, and noted as
WORSENING the finding so it cannot read as specification-searching.
Also caught: all seven categories drop steeply into 2024Q4 -- trailing
edge thinning, not a demand event.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… fifth on timing

The user asked how generative-AI diffusion changes long-run pricing and
competitive structure. The pricing half was already answered; the structure
half had never been asked. Steps 49 and 51 ask it on the balanced frame
(2019Q3-2024Q4, 257,208 observations), with a placebo attached to every
candidate finding before it is believed.

Nine candidates, five killed, one demoted to a lead:

  prices fall                -> real listed prices +40.7% (+/-3.7%)
  quantities rise            -> Fiverr buyers -36%; implied orders -18%
  the cheap tier widens      -> the $5 tier EMPTIED, 27.3% -> 10.3%
  competition intensifies    -> repricing 23.6% -> 18.3%, ENTIRELY through
                                fewer increases (18.1% -> 12.4%); cuts flat
  sales concentrate          -> Gini flat among trading listings AND sellers

The one prediction that matches in sign fails on timing: the $5 tier's
steepest decline is 2021Q2 and it slows after ChatGPT. That is the third
independent series to date the change to 2021, after the buyer-growth
inflection and the searched repricing break (2021Q3).

Two methodological traps are recorded because they generalise: gig FE do
not protect against composition (the quota manifest adds ~1,250 cheaper
listings at 2022Q3, manufacturing a +5.7pp jump one quarter before the
break), and break dates must be searched with the break FORM chosen --
assuming 2022Q4 gives a significant, wrongly-signed headline.

The survivors are locked in plans/active/structure-descriptive-lock.md
before any further search: eight descriptive claims, six nulls that may not
be quietly dropped, one lead with a written promotion rule.

Framing decision: a second paper, "What Generative AI Did Not Do to a
Freelance Market" (drafts/structure/), not an IPI section. Seven sections
written from drafts/market-structure-answer.md; render.py gains --main so a
second tree can render, and paper 1 re-renders unchanged in structure.

Nine test files earned their keep immediately -- three FAILs, all closed the
same session, including the paper's sharpest self-limitation: a uniform AI
shock is absorbed by category x quarter FE by construction, so design I6's
null does not mean AI had no effect. Four FAILs remain open and are listed
on the to-do item rather than hidden.

No IPI paper section, figure, frozen number or site file was touched.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
haojian and others added 3 commits August 19, 2026 23:15
Steps 50, 52-55 were run and written up across earlier sessions but the
scripts themselves were never committed, so progress.md referenced code
that was not in the repository.

  50  gig-level continuous exposure (pre-registered, design 6)
  52  searched break vs the AI timeline (15 candidate quarters)
  53  recent-window exposure contrast (the lead)
  54  promotion battery, gates A-E (the lead is not promoted)
  55  cheap-tier erosion, Upwork's under-$500 prediction (design 8)

plans/active/exposure-continuous-prereg.md is the lock file for design 6,
which fixed its five gates and their failure consequences before any
outcome was estimated.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every route to more 2025-26 data measured rather than assumed, because
the todo asserted a live forward crawl was the only one on the strength
of a single observation.

  R1  re-harvest Wayback CDX      real but small, 1.55x
  R2  exhaust the existing index  ~2x, the cheapest real gain
  R3  Common Crawl                DEAD - zero gig pages in two crawls
  R4  why the archive died        PerimeterX; 2026Q2+ does not exist
  R5  the gig sitemap             free, open, and not on the agenda
  R6  Save Page Now               untested, low expected value

R5 is new. robots.txt publishes sitemap_gigs.xml.gz, it is not behind the
bot wall, and it resolves to 288,976 distinct gig URLs. Snapshotted before
asking, because the option decays daily and the action is one public GET.

Two results from the first snapshot alone. Archive dropout is NOT exit:
the share of panel gigs still listed today is near-flat by last-archived
quarter (27.8% for 2023Q1, 40.6% for 2026Q1), so disappearance from the
archive is a sampling artifact and the dormancy proxy inherits it. And the
sitemap is rank-selected (3.2% listed at 0-1 reviews rising monotonically
to 63.3% at 716+), so it is not a clean exit measure either.

The snapshot .gz is committed rather than ignored: a day not snapshotted
is lost forever.

Open decision, needing the user's sign-off per CLAUDE.md: whether to run a
live browser crawl.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…positive control

Designs 1-8 all proxied AI with something external to the market: an
Eloundou occupation score (36.8% zero-match, 7 category units, p-floor
0.143) or a release date. The panel has carried a direct measure the whole
time and no design used it -- `title`, present on 384,967 of 384,983
gig-date observations (100.0%). Sellers who use generative AI advertise it.

Step 57 builds that measure. Five results.

1. Diffusion is sharp and dates to 2023Q1. Share of NEW listings ever
   AI-branded runs 0.0-0.5% through 2022Q4, then 5.98% in 2023Q1 -- the
   first full quarter after ChatGPT, twelvefold in one quarter. The
   measure is biased against this: "ever AI-branded" gives early cohorts
   more quarters in which to be flagged.

2. THE POSITIVE CONTROL, and it is why this matters. The strongest
   objection to steps 52/55 was never answerable: if the searched-break
   procedure never finds ChatGPT, maybe it cannot find anything. Run the
   identical search on the diffusion series:

     transaction proxy (52)      best 2020Q4   ChatGPT 11 of 15
     cheap-end (55)              best 2020Q3   ChatGPT 16 of 17   spread 0.06%
     AI share of new listings    best 2023Q1   ChatGPT  1 of 19   spread 227%

   The top four candidates of nineteen are 2023Q1, 2022Q4, 2023Q2, 2022Q3
   -- every generative-AI milestone quarter, consecutively, at the top.
   The instrument resolves the AI date to within one quarter. So the
   absence of AI from the pricing and structure results is a fact about
   the market, not about the method. Written up as answer section 4.3.1.

   Not licensed by this: a positive control shows the procedure detects a
   break of the size present in the diffusion series, not an arbitrarily
   small one in the price series. Step 55's power caveat stands.

3. Diffusion ran through ENTRY, not incumbent conversion. Of 11,425
   listings observed in both 2022 and 2024, 22 (0.19%) ever relabelled,
   and none dropped the label. This is also why gig-FE designs found
   nothing: an entrant is invisible under gig fixed effects.

4. AI entered ABOVE the median price -- $30 against $25, over-represented
   in the top two price bands. Not a low-price flood, consistent with the
   $5 tier having emptied before the technology existed. The -12.5%
   conditional gap is recorded as a selection fact about who advertises
   AI, not an effect; the within-gig version is 61 adopters at t -0.78.

5. An anti-AI segment that did not exist. Listings selling explicitly
   human production are exactly zero in every quarter from 2019Q1 to
   2023Q1 and appear from 2023Q2.

Three classifier guards were required, each found by auditing flagged
titles rather than anticipated: `.ai` is the Adobe Illustrator file
extension and was the largest source of pre-2022 hits; "Synthesia" is also
piano-tutorial software; "real human traffic" is SEO bot-traffic language.
Realised precision floor is 7 distinct titles across all of 2019-2021.

One bug found and fixed mid-run: _ols did a single sequential demeaning
pass for two FE sets, which is wrong -- demeaning on the second
reintroduces variation in the first. It returned an exact 0.0000 with a
0.0000 SE, which is what exposed it. Now alternating projections.

Design 9 (niche-level AI penetration) is pre-registered, not run. Its
endogeneity is declared in advance: sellers enter with AI where AI works,
so it can produce a documented association and never an identified effect.

data/pilot/ai-title-flags.csv is gitignored at 33 MB; code/57 regenerates
it in minutes.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The governing plan for the user's question had its last progress entry at
2026-08-18 and did not record steps 52-57 -- including the positive
control, which is the result that most changes the paper's standing.

Adds five closed steps (52, 53-55, 56, 57, and the positive control) and
two open ones: fold sections 3.7 and 4.3.1 into drafts/structure/, and
design 9.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
haojian and others added 8 commits August 20, 2026 00:03
…s it

From a user question -- "look at specific AI launch dates and compare before
and after, or did you do that already?" Honest answer was no: steps 52/55/57
searched for breaks and ranked milestones by fit, none compared before against
after at a named date, and all three ran quarterly.

Design 10 adds three things. Monthly resolution (the `month` field was on every
row and unused). Twenty launches dated by PUBLIC AVAILABILITY rather than
announcement, since an announcement cannot change a gig. And each launch matched
to the category it targets -- Copilot/coding, ElevenLabs/audio,
Midjourney/design -- with non-targets as controls, which needs no exposure score
and so escapes the Eloundou measure entirely.

PRICE MARGIN -- valid, and null.
  7 confounded (every image-model date, Copilot, GPT-4o)
  11 null
  2 clear the pre-window gate (GPT-3 API, ChatGPT)
Two survivors is FEWER than the ~3 that 60 tests give by chance, and GPT-3's
API date is 2020-06, the pandemic inflection step 52 already flagged as
wrong-signed. Design prices fall 4.5-5.1% at every image-model date and every
one has a LARGER pre-window effect -- design was already diverging before any
image model shipped.

DEMAND MARGIN -- discarded on its own placebo.
It returned 11 of 20 significant where chance predicts one, with incoherent
signs: image tools raising design accrual while text tools cut writing's. Step
58b runs the identical design on 12 fake 2019 launches:

  price   1 of 12 =  8% false positives (nominal 5%) -> stands
  demand  9 of 12 = 75% false positives             -> DISCARDED

The eleven demand results are reported nowhere. The placebo ran before the
write-up, which is why they never entered the draft.

THE PREMISE FAILED, and that is the informative part. The first stage rejects
the targeting assumption: ChatGPT produced no differential adoption in writing,
and AI branding concentrated in coding regardless of which tool launched. That
is what step 57 predicts -- diffusion came through entry, not incumbent
conversion -- and it is the deepest diagnosis yet of designs 1-8: they searched
for AI's effect inside the categories a crosswalk called exposed, and that is
not where AI arrived.

Caveats recorded, not buried: the first stage clusters on 7 categories (step
54's gate A defect) so only direction is read, and launches sit 1-3 months
apart so each pre-window contains other launches.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`code/59-review-order-audit.py` reads a block every archived gig page has
carried since 2019 and that `code/09-extract-prices.py` has always discarded:
one order record per displayed review, with an order id, the order date (not
the capture date) and the amount the buyer paid in a band.

Orders under $50 are 1.0% of all orders against a listed entry-package median
of $25-30, so buyers essentially never buy the package the index prices. Two
thirds land in $50-200. No new collection is needed — the 86 GB of stored HTML
already holds it.

Three consequences for `drafts/market-structure-answer.md`:

- §1.3 stops being a caveat about something unmeasurable and becomes a
  measurement, with the paid distribution and its three limits (starts 2022,
  ~13% of orders recovered and display-ranked rather than sampled, amounts
  interval-censored with an open top band).
- §2's implied "orders −18%" is flagged: the divisor is a price nobody pays,
  so it is an upper bound on the decline, now measured rather than assumed.
- §5's entry saying realised order value is "not measurable at any effort" was
  wrong. Struck through rather than silently deleted — a section about what is
  unmeasurable had an entry in it that was measurable from data already on disk.

Same pass makes the document readable without the econometrics vocabulary: a
"How to read this document" glossary of thirteen terms, "In plain terms:"
glosses at the five densest results, and an opening to §4 that explains what an
identification design is and what it means for one to fail.

`tests/structure-data.test.md`: R4 strengthened from asserted to measured, R8
added and recorded FAIL (the display-selection threat, open), R9 added PASS.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…tion

`drafts/plain-summary.md` is a standalone non-technical companion to
`drafts/market-structure-answer.md` — same numbers, no econometrics vocabulary,
and the data collection stated before the findings, which the answer doc never
does because it was written for a reader who already knew where the panel came
from.

It leads with a correction the project must expect from every non-specialist
reader: *prices rose during the AI launches and transactions fell.* Both
directions are right. The equivocation is on **during** — the level movements
span the AI period, but every turning point the project can date lands in
2020Q3-2021Q4. Stating that before Part 1 rather than inside §4 is deliberate:
a reader arriving with the AI hypothesis otherwise reads the descriptive
sections as confirmation of it.

Three figures corrected while drafting:

- pages downloaded is ~375,000 (291,997 balanced + 67,377 expanded + 15,150
  recent), not the 384,983 gig-date *observations* — different quantities
- realised-price bands recomputed from §1.3: $50-200 = 67.3%, >$200 = 31.7%
- design count is nine run, nine failed (1-8 and 10). Design 9 is
  pre-registered and has never been estimated, and design 10's demand half was
  discarded on its own placebo rather than failing — an easy conflation

Rendered to `drafts/plain-summary-2026-08-20.html` via `drafts/render.py --main`.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`progress.md` gains the three 2026-08-20 entries in order — the order-record
audit, the answer-doc rewrite, and the plain-language summary.

`tests/structure-master.test.md`: U4 records the readability instruction, U5
the summary instruction, U6 the "during" correction. M9 added as a standing
criterion and deliberately split — PASS in `market-structure-answer.md` and
`plain-summary.md`, FAIL in `drafts/structure/`, which carries neither the
plain-language pass nor the realised-price finding and still states the scope
as six designs.

`plans/todo.md` gains three Active items:

- PRIORITY 1b, re-extract the order records — with the display-selection test
  as the first deliverable, not an index. Pages rank displayed reviews by
  relevancy, not at random; if display is selected on price, every realised
  price number is biased and unusable.
- propagate the plain-language pass into the paper tree
- keep `plain-summary.md` in sync — it is now a second place every headline
  number lives and `code/32-check-draft-numbers.py` points at neither it nor
  the answer doc

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… missed

From two reader questions in succession — "what does GMV mean" and "when you
say buyers decreased 36 percent, do you mean transactions or revenue?" — both
against a document published the same day whose purpose was to be readable
without jargon.

The readability pass had glossed every econometrics term and left every finance
term untouched, because GMV and active buyers did not read as jargon to the
person writing them. The document reported three quantities in one table
(buyers, spend per buyer, GMV) and used a fourth word for them collectively
(transactions), without ever saying they are different things. A reader who
takes "buyers −36%" as a statement about sales volume was misled by the
document.

Added to `drafts/plain-summary.md`:

- "Six words that get mixed up", placed before the "during" correction —
  buyers (people), orders (purchases, published by nobody and estimated here),
  GMV (dollars transacted), revenue (Fiverr's cut, ~1/3 of GMV), review accrual
  (our sales proxy), listed vs realised price. Plus the two consequences: GMV =
  buyers x spend per buyer is arithmetic rather than an estimate, and every
  transactions-fell claim in the document is derived rather than reported.
- §2.2 spells GMV out on first use, states that it is not revenue, and glosses
  the column headers inline.
- The implied order count now actually appears — −18% vs 2020, −38.6% from the
  2021 peak, with its upper-bound caveat. The glossary was promising an
  estimate the document did not contain.
- "Buyers −36%" restated as 1.5 million people who used to buy here and no
  longer do.

Recorded as `tests/structure-master.test.md` U7. Re-rendered.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
From a user request for a before/after design on the project's headline
question. Registered before any outcome is estimated.

The move that makes a before/after work here is **staggered arrival**: each
niche is dated by the quarter AI listings actually appear in it, not by a
platform-wide calendar date. Design 10 died partly because one global date puts
every niche's "after" in the same quarters as the pandemic unwind and the 2022
tech contraction; with staggered dates those are absorbed by quarter fixed
effects and only the event-time profile is read.

Fixed in advance: niches frozen and shared with design 9 so neither design can
be accused of picking a definition to suit its result; arrival = AI share >=5%
sustained two quarters; controls are **never-treated niches only**, because
two-way FE under staggered adoption uses already-treated units as counterfactuals
and can return a sign opposite to every underlying effect; SEs clustered on
niche; outcomes log price and log review accrual, reported together.

Three abandonment points, all pre-outcome: fewer than 100 usable niches (S2),
arrivals not actually staggered (S3), and the pre-trend gate G1 — which is the
one the question turns on, and the one that killed design 10's image-model
result.

Endogeneity declared now rather than after: AI sellers enter where AI works, so
this can produce an association and never an identified effect.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e AI

The project had no transaction series on the website and no category split
anywhere. Two cards added, plus the paper figure behind them.

PLATFORM (step 47). orders = real GMV / real IPI price, the project's only
transaction-count series. Drawn as three lines rather than one because the
finding is that the quotient falls while the numerator does not: real GMV
+11.3% against a real price +35.8%, leaving orders -18.0% vs 2020 and -38.6%
from the 2021 peak. Same 2020 = 100 base on all three, so one axis, never two.

CATEGORIES (step 62, new). Fiverr publishes no category split, so within-gig
review accrual is the only route. Reported as a SERIES for the first time -
step 46 estimated the break and never wrote what it broke. Six of seven peak
in 2020Q3 and the fall is a simultaneous step between 2021Q2 and 2021Q3,
fifteen months before ChatGPT, which itself lands inside a flat stretch where
five of seven categories are HIGHER in 2023Q3 than 2022Q3.

Identification stated in the script rather than discovered later: within a gig
age and calendar quarter move one-for-one, so the shape is identified and the
trend is not. The peak quarter is the statistic that survives. A capture-span
diagnostic is included for the same reason - mean span widens 1.2 -> 1.75
quarters, so part of the 2024 fall is the crawl.

Two structural notes. write_site_block lives in steps 47 and 62 rather than 18,
because both series are quotients of the index step 18 builds; step 18 writes
data.json whole, so RERUNNING IT DROPS BOTH BLOCKS. And step 34 now takes
figure names, so one figure regenerates without figure 4's subsampling curve.

The category panel is small multiples, not seven overlaid lines, on a
measurement rather than a preference: the site's seven category colours fail a
colour-vision check on all 21 pairs, worst pair dE 6.1 deutan and one pair at
dE 13.2 for NORMAL vision. Faceting removes the problem at its source. The
underlying palette defect still affects the hero price chart and is filed as
tech-debt TD2 rather than repainted, since that is a site-wide change.

No causal claim anywhere. Both cards say so in their own text, because a chart
with a ChatGPT line on it invites exactly that reading.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
From a user correction — "I'm trying to look at just the volume of
transactions" — which exposed a real defect in how the page was arranged.

Every quantity on the site went through the IPI. That is defensible for the
implied order count (Fiverr reports dollars and never an order count, so
orders = GMV / price is the only route to one), but it meant the question
"what is the volume" was answered with a quotient whose denominator is a price
index. Two of the three volume measures in this project never touch a price,
and neither was presented as such.

The new card is placed FIRST, above the implied-order card, because it is the
direct answer and everything below it is derived from something. Pooled review
accrual (quarterly, counted off the archived pages) and active buyers (annual,
as Fiverr reports it), both indexed 2020 = 100 so they share ONE axis - the
mixed cadence is only legitimate because of the shared base, and buyers carries
open annual markers so its grain is visible rather than implied.

pooled is equal-weighted across the seven categories, not review-weighted:
review weight IS the outcome here, so weighting by it would let the largest
category set its own denominator. Computed in step 62 rather than in the
browser, so the definition lives with the data.

The card states what it is not. Accrual is per SURVIVING listing and the
archive cannot measure exit (n_404 = 0 across 509,339 captures), so it will not
scale to a platform total; buyers counts people, and spend per buyer nearly
doubled over the window. An actual count needs the dated order records still
unextracted in the archived HTML - encrypted_order_id plus created_at, no price
required - which stays PRIORITY 1b.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants