Skip to content

Mockup - #1

Open
aruship4 wants to merge 86 commits into
mainfrom
mockup
Open

Mockup#1
aruship4 wants to merge 86 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
…note under chart

- #qpick2 now shares #qpick's rounded styling (was rendering with sharp default corners)
- move the "Prices validated" note directly under the fixed-effects chart, above its dropdown

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 14, 2026 01:33 — with GitHub Pages Inactive
- Replace the paragraph subtitle with bullets: what the chart is, the shaded
  95% CI band, and a professional data+method validation point.
- Remove the standalone "Prices validated" box; its facts merged into the
  validation bullet.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 14, 2026 01:47 — with GitHub Pages Inactive
New standalone docs/gallery.html + docs/gallery.js: one card per category with
its fixed-effects price-index trend (95% CI band) and a featured real gig's
package-price history from freelancers.json. Featured-gig picker prefers
on-topic gigs (per-category keyword relevance) over longer but cross-tagged
ones, then richest price history. Cards ordered by size of the '20-'26 move.
Adds a Gallery link to the index and FAQ header nav.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 14, 2026 18:31 — with GitHub Pages Inactive
Standalone markdown recap of recent site changes (gallery, confidence
bands, extraction validation, header/chart polish) and the
time-product-dummy fixed-effects index that corrects for irregular
Wayback sampling across gigs.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 14, 2026 20:09 — with GitHub Pages Inactive
Add a "Correcting for irregular sampling" step to the "How is the index
calculated?" FAQ, with the two-gig logo example: frequently-captured
gigs reveal the price path's shape, so each rarely-captured gig's change
is spread across the correct quarters instead of piled into the
reappearance quarter.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 14, 2026 20:10 — with GitHub Pages Inactive
The 2026-07-15 decision dropped fixed effects in favour of GEKS-Jevons,
but only the data side had been done: 18-build-site-data-long.py emitted
index_geks/composite_geks/*_geks_se and the rebuilt data.json no longer
carried the index_tpd block, while ipi.js and gallery.js still read
DATA.index_tpd. The second home-page chart was returning early on the
missing key and the gallery had fallen back to the drifting chained
series. This finishes the rewire.

- rename the data contract in ipi.js, gallery.js, index.html and
  gallery.html (index_tpd* -> index_geks*, composite_tpd*, delta_tpd,
  drawChartTPD, #tpdDelta); no tpd references remain under docs/
- replace the user-facing "fixed effects" copy: chart title, the three
  bullets (pairwise comparison over all routes, bootstrap CI,
  PriceIndexCalc validation), tooltip, gallery badge/caption/footer
- rewrite FAQ Step 5 around chain drift, the bilateral Jevons formula
  and GEKS transitivity, in place of the alpha/delta regression
- rewrite method 3.4: the estimator with both equations, sample
  construction and 2020Q1 window rationale, TPD reframed as the
  imputation alternative, dump-price bias tested rather than assumed,
  and the reference validation; five new CITE placeholders
- add code/21-geks-index.py and its four output CSVs
- update tests/method.test.md (R1 rewritten, R2/R3/R4/R7 added, R5/R8
  FAIL, R6 BLOCKED, U2/U3 recorded) and progress.md

Known open items, recorded in the tests rather than fixed here:
translation coverage (15% of quarter pairs have zero overlap, +/-26%
band), the MIN_MATCH=3 sensitivity check, and the 2019Q1-vs-2020Q1 base
period inconsistency in the composite paragraph.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 23, 2026 05:46 — with GitHub Pages Inactive
…ies shown

The headline chart was still DATA.index, the chained-Jevons series the project
replaced on 2026-07-15. It reads design 2020Q1->2026Q1 as 100 -> 304 against 134
for the GEKS-Jevons chart directly beneath it.

Direct matched-pair Jevons (no chaining, no multilateral correction) corroborates
GEKS in every category — design 154 vs 147 GEKS vs 318 chained at 2024Q3 — and on
2024Q3->2026Q1, where coverage is thick, 299-570 matched design gigs give 94-100.
Chained runs 1.6-2.7x high throughout.

- collapse the two chart cards into one; the GEKS series keeps the confidence
  band, the sharpest-QoQ-move highlights and the quarter inspector
- remove drawChartGEKS, pinnedFx, pinQuarterFx, renderInspectorFx and the
  #chart2/#tip2/#qpick2/#qreadout2/#qclear2 markup and CSS
- move the Delta '20-'26 column and its sort key from delta12 to delta_geks
  (design +204.1% -> +34.1%) and the row sparklines to index_geks
- drop gallery.js's silent DATA.index/delta12 fallbacks
- add a hero bullet explaining why a chained index is not used

data.json still carries index/delta12/composite_all for the paper's method
comparison; they are simply no longer plotted.

Also logs TD1: code/12-panel-ipi.py keys within-gig relatives by destination
quarter alone, so a gig's multi-quarter change is applied as a single-quarter
change on top of growth already chained in from gigs observed in between
(22-31% of links span >1 quarter). Fix attempted and reverted — choosing among
the viable constructions moves the paper's peak-composite and chain-drift
figures, so it is a methods decision. tests/method.test.md R9 FAIL.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@haojian
haojian temporarily deployed to github-pages July 27, 2026 04:05 — with GitHub Pages Inactive
haojian and others added 4 commits July 30, 2026 21:57
The index is quoted in dollars and the dollar lost ~27% of its value over
2020Q1-2026Q1, so the nominal series answers "how many dollars does this
gig cost" while the real series answers "how much intelligence work
actually costs" -- the question the project exists to ask. Real is now the
default view, with a Real/Nominal toggle on the hero chart.

Composite 2020Q1->2026Q1: +44.7% nominal -> +14.1% real, against CPI-U
+26.8%. Roughly two-thirds of the nominal rise is the dollar, not the
service. Design -- ~71% of review weight -- goes +34.1% -> +5.8%, i.e.
essentially flat in real terms over six years.

- 23-real-index.py deflates GEKS-Jevons by CPI-U (FRED CPIAUCSL, SA
  primary; CPIAUCNS checked as robustness, max divergence 0.36%), cached
  to data/cpi-u.csv so reruns are offline. BLS published no October 2025
  CPI-U, so that month is linearly interpolated and the quarter flagged.
- 18-build reads the real CSVs through the same chain_category ->
  aligned -> composite_series path as the nominal series, so the two
  differ only by the deflator. No *_real_se block: the deflator carries
  no sampling error, so the existing bootstrap SEs apply to both bases.
- ipi.js routes every index read through idxSrc()/deltaSrc() rather than
  scattered DATA.index_geks references, so the two bases cannot partially
  mix. Nominal view draws CPI-U as a dashed reference line; the real view
  omits it (flat at 100 by construction). Toggle self-hides on older data.
- gallery.js switched to the real series; featured gig package prices
  stay nominal, since those are actual posted dollar amounts.

Also lands 22-confounder-diagnostics.py from 2026-07-29 (reputation
treadmill, pre-AI placebo, entry-price survivorship), whose results the
FAQ limitations now cite.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Q9 was rewritten for the real series in the previous commit, but auditing
the rest of the page turned up four claims that went stale when the
chained series was retired (2026-07-27) and real became the default.

- Q3 quoted the retired chained series: "three or four times their 2020
  level" are delta12 magnitudes (marketing +478%), not anything plotted.
  The real range is +5.8% (design) to +117% (translation). The ordering
  claim was also inverted -- it named translation among the bottom
  categories when it is in fact the highest of the seven. Rewritten with
  the true ordering, plus a paragraph saying plainly that translation
  topping the table is not what an exposure story predicts, and why it
  carries the least weight (thinnest series, widest band, missing
  quarters).
- Q8 presented the chained index as the published one and framed GEKS as
  a correction shown on "the second chart on the home page" -- there has
  been one chart since 2026-07-27. Reframed so GEKS-Jevons + CPI-U
  deflation is stated up front, with steps 1-4 kept as the clearest
  explanation of a matched-model index and labelled not plotted.
- Added Step 6 documenting deflation: I_real = I x CPI_0/CPI_t, why the
  seasonally adjusted series is primary, and why the bootstrap bands are
  identical on both bases. Real was the default view with the calculation
  undocumented.
- Q13 replaced the drift caveat (it described a series no longer shown)
  and added two measured limitations from the confounder diagnostics:
  the reputation treadmill (doubling reviews ~ +7% price, ~40% of
  within-gig growth, and why reviews are a bad control) and survivorship
  (entrants post flat prices 2019-2025 while the matched index climbs).
  Causation bullet moved to the descriptive-first position.
- Q14 names the real three-script build and the PriceIndexCalc check.

docs/GUIDE.md and docs/README.md still document the pre-quarterly data
contract. Q14 links to them, so it now warns readers and points at
data.json as authoritative; the refresh is logged in plans/todo.md.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Fiverr Pro directory pages (/hire/*) and agency listings (/agencies/*) were
being parsed as gigs. They are not gigs: the package-list parser finds nothing
on them and falls back to scraping a dollar figure off the page, which is a
budget-filter default rather than a price -- 2,436 rows at exactly $500 and 330
at $1000. Fiverr changed that widget's default between 2024Q4 and 2025Q1,
manufacturing a fake 1000 -> 500 move that dragged the whole recent segment
down and inverted its trend.

Drops 3,846 of 37,782 observations (10.2%), all in the recent crawl -- `hire`
3,806 + `agencies` 40. The historical crawl is clean.

Audited for other families of the same kind before fixing: two independent
tests (reserved leading path segment; non-gig-shaped page title) agree exactly
and find no third family. Chose the URL-family rule over dropping
extraction_method=dollar_fallback, because 2,527 of 2,531 historical
dollar-fallback rows are genuine pre-2017 gigs clustered at Fiverr's original
$5 floor.

New code/gigfilter.py holds the single rule (is_gig / is_gig_id over a 27-entry
RESERVED set) and is applied on all seven price-reading paths: 12, 13 (the
crawl manifest, so these URLs are never fetched again), 14, 16, 18 (which had
its own duplicate copy of the set applied to the gallery but not the index --
now an import, so the two cannot disagree), 19 (both panel builders), and 22.

Re-ran 12 -> 14 -> 19 -> 21 -> 23 -> 18. Recent panel 3,566 -> 2,908 gigs;
the historical panel is unchanged and panel-ipi.csv / panel-elasticity.csv /
panel-category-indices*.csv are byte-identical, independently confirming the
historical segment was already clean.

Headline: spliced composite 2020Q1->2026Q1 goes +44.7% -> +78.4% nominal and
+14.1% -> +40.7% real. The recent segment flips from falling to flat-or-rising
in six of seven categories. Bootstrap SEs narrow in five of seven (audio
0.155 -> 0.071, -54%), so the removed rows were injecting variance, not signal.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Six of the seven categories miss the +/-5% terminal-quarter precision standard
adopted on 2026-08-05 -- not two, as first recorded. At 2026Q1, on 1.96*se_ln:
translation +/-29.2%, coding +/-17.1%, audio +/-13.9%, video +/-11.9%,
writing +/-8.3%, marketing +/-7.7%. Only design (+/-4.8%) clears it, and
coding -- which the original note missed entirely -- is worse than audio.

That makes suppression unviable: greying the failures would leave a
one-category site. So precision is published instead of hidden.

  - New sortable +/-95% column on the category table, computed from
    index_geks_se at each category's terminal quarter, with the exact
    asymmetric CI on the change in the cell tooltip and an amber marking on
    the six that miss the standard.
  - Confidence bands are now drawn for every plotted line, not only the
    emphasised one. Previously six of seven categories rendered as bare lines,
    showing them as more certain than they are.

The live exposure was the ranking, not any single level. The site sorted by
delta and the FAQ asserted an order, but the top three -- audio 254.2
+/-13.9%, translation 236.3 +/-29.2%, marketing 232.2 +/-7.7% -- have
intervals that overlap one another completely, so which is highest is not
determined by these data. Design is the one genuine separation. The home-page
caveat and FAQ Q3 now say so plainly rather than presenting an ordering.

Also publishes a fact that was true all along and stated nowhere: the
composite meets the standard at +/-3.7%, because it is review-weighted and
design carries ~71% of that weight. The +40.7% headline is on firmer ground
than any category line except design's.

Adds code/24-margin-diagnostics.py, which measures the non-price margins
behind the FAQ's new "no detectable break" claim. review_count is a usable
sales proxy (88.7%/90.7% coverage post-gigfilter, monotone to within 0.4%),
but the demand-rate and dormancy breaks at 2022Q4 are null in every category
with bounds of +/-23% to +/-66%, and true exit and entry are unmeasurable in a
Wayback-derived, survival-selected crawl.

Verified with a rebuilt DOM-shim harness that runs the real render path
against the real data.json: 49 checks pass, including that every published
+/- figure matches an independent recompute off the raw arrays and that the
three-way overlap claim holds. HTML nesting, FAQ anchors, and JS syntax clean.

Note: index.html and faq.html also carry the site-copy half of the preceding
non-gig-exclusion commit, and progress.md / plans/todo.md span both -- the
working tree had them intermixed and they could not be split cleanly.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
haojian and others added 3 commits August 6, 2026 00:32
Step 25 — ln(price) on seller rating, prior-gig count and task type.
Rating is priced (+3.15% per 0.1 point); task type dominates (coding
+124% vs design, translation -40%); total R^2 is only 0.065. Handles a
10-point/5-point rating scale bug (217 rows) and reports the slope per
0.1 point because 41% of gigs sit at exactly 5.0. The finding is that
the volume slope REVERSES: +0.022 (t 1.64) across sellers vs +0.133
(t 7.87) within a gig, so a hedonic cross-section would wrongly conclude
experience is unpriced.

Step 26 — sweeps MIN_MATCH over 8 values x 7 categories x 2 segments.
The coverage-for-precision trade-off does not exist: raising it buys
nothing in the five dense categories and destroys precision in the thin
ones (audio +/-11.3% at k=1 -> +/-34.1% at k=6), because MIN_MATCH
deletes comparisons rather than adding matched gigs. Surfaces that the
historical coding level is not identified — 312.8 at k=3 -> 717.7 at
k=4, when its terminal quarter drops from 8 supporting link paths to 1.
Composite is robust at +76.4% to +78.4% across k=1..6.

Both import the index scripts unmodified and vary one thing, so the
sample matches production. Measurement only — no data, docs or drafts
touched.

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

Readiness audit found the binding constraint on publication is the prose,
not the analysis. Every section except method.md and faq.md is dated
2026-03-23, and the abstract is retracted rather than stale: it quotes the
chained series' 312 peak (removed from the site 2026-07-27), the elasticity
table already slated for retirement, "9 categories / 2017-2025" (it is 7,
floored at 2018Q3, running to 2026Q1), and frames AI as the driver against
the 2026-07-30 descriptive-first decision. Also 85 [CITE-] placeholders,
4 unfilled figures, and 7 of 10 test files never reviewed.

User decision: publish the pilot as a measurement paper; the full-scale
collection becomes paper 2. Every margin measured converges on the same
bound, so the pilot cannot rank categories by AI impact — but it can
deliver the instrument, the bounds, and the forward design requirements.

New plans/active/publication.md sequences it in four phases with the
number-moving decisions gating the rewrite. D1 (MIN_MATCH) is closed:
keep 3, and stop treating it as the precision lever. Split out D1b
(adequacy criterion) and D1c (historical series that are not identified,
which no confidence band expresses).

Adds U4/U5 to tests/findings.test.md so the measurement-paper framing and
the hedonic result are durable requirements rather than conversation
history. Records that tests/method.test.md R12 still carries the
superseded two-category version of the adequacy failure.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Dated draft renders are version-controlled (see draft-2026-03-21.html,
draft-2026-07-23.html); this one was left untracked. Superseded by the
07-23 render — committed for the audit trail, not as current.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
haojian and others added 6 commits August 6, 2026 18:36
… two wrong-signed categories

Phase 1 decision D2 of plans/active/publication.md. code/27-reputation-band.py
adjusts the production panels cell-by-cell (adjusted = p * exp(-b*ln(1+reviews)))
so raw and adjusted differ only by the adjustment.

The band: composite 2020Q1->2026Q1 is raw +79.0%, reputation-adjusted +39.7%.
The adjusted series is a lower bound, not a correction — reviews are cumulative
sales, so beta absorbs demand as well as reputation. Raw stays the headline.

beta is pooled at +0.1068 (se 0.0201, t 5.32, gig-clustered). Pooling is forced
rather than preferred: per category, audio (-0.089) and translation (-0.080)
come back wrong-signed, so adjusting them with their own beta would raise their
index. The spread across the remaining five (marketing +0.206 to design +0.075)
means pooling is a stated assumption, not a formality.

Two things for §3. Step 22's beta SE is unclustered — gig-clustered SEs are
1.93x larger (se 0.0101 -> 0.0195, t 10.19 -> 5.26); beta survives, the
published t does not. And the band's floor is soft: across beta's own 95% CI
the adjusted bound runs ~+50% to +28%, so it must not be quoted as one number.

Measurement only — nothing in data/, docs/ or drafts/ was modified.

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

Phase 1 decision D3 of plans/active/publication.md. code/28-window-choice.py
sweeps 5 window starts (2018Q1..2020Q1) x 7 categories, varying only
window_start on 19-tpd-index.py and 21-geks-index.py imported unmodified.

Decision: keep 2020Q1; publish 2018Q3-2020Q1 as a separate pre-AI exhibit.
Extending gains nothing on the headline (composite 2020Q1->2026Q1 reads +74.3%
to +78.4% nominal across all five starts, inside its own +/-3.7% band) and costs
precision in four of seven categories, by up to 4x (design +/-23.3% -> +/-93.7%,
writing +/-38.1% -> +/-103.2%, marketing +/-86.5% -> +/-182.6%). Translation
gains nothing at all — it bases at 2019Q4 under every window <=2019Q3 — and
audio's pre-period chain is broken at three adjacent pairs carrying 2 matched
gigs each. The extended series is also MORE fragile to MIN_MATCH: at k=4 five of
seven categories change terminal quarter, against three at 2020Q1.

The by-product matters more than the decision. Over the IDENTICAL span
2020Q1->terminal, audio's growth reads +103.9% on a 2018Q3 window and +258.7% on
the 2020Q1 window; spreads run 16% to 76% across six categories. Levels are
deterministic, so this is the estimator. Decomposed into two channels, only one
of which fires: the gig set contributes nothing (max |d lnP| over shared
bilaterals is 0.0000 in all seven categories) and the link set contributes all of
it (growth on the shared link set is exactly identical across windows — audio
142.0% under both, a figure neither published number matches). Shared link sets
number 2 to 5.

MIN_MATCH (D1c), the base quarter (2026-08-03) and the window are therefore one
defect, not three: each perturbs how many link paths support a quarter. The
composite is exempt and the reason is verified — the splice truncates the
historical leg at 2024Q3, whose spread is 4.0% for design, which carries ~71% of
the review weight.

Two run-time self-checks: the production window reproduces the shipped
panel-category-indices-geks.csv to 0.005 index points, and the local re-basing
helper reproduces tpd.chain_category exactly at START_Q.

Measurement only — nothing in data/, docs/ or drafts/ was modified.

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

Phase 1 decision D4 of plans/active/publication.md — the last one.
code/29-chained-elasticity-audit.py answers two questions with different answers.

THE ELASTICITY TABLE IS A SPURIOUS REGRESSION. It fits log price index on log
AI-benchmark score over ~20 quarterly observations, two trending series, no
control group. Three independent tests:

  - Durbin-Watson runs 0.22 to 1.08 in all six categories, so every p=0.0000 in
    panel-elasticity.csv rests on an invalid standard error. Newey-West at lag 4
    shrinks the t by 1.3-1.8x but cannot fix the cause.
  - A plain linear time trend, with zero AI content, fits BETTER than the AI
    score in all six categories (design R2 0.979 vs 0.412, marketing 0.981 vs
    0.934, coding 0.974 vs 0.909).
  - CPI-U fits at least as well in five of six and returns "elasticities" of
    +4.56 to +8.73 — the same regression, an unpublishable claim.
  - In first differences the relationship vanishes: t = 0.26, -0.02, 0.48, 2.24,
    -0.34, 0.20. One marginal result in six tests.

The ranking, which is all the table is used for, is not stable to anything:
shipped vs the same estimator on the production panel and base gives Spearman
rho = +0.314 (p = 0.544), with design falling from +1.139 (most elastic of
eight) to +0.295 (fourth of six). A fourth independent route to the conclusion
that the pilot cannot rank categories by AI impact.

THE CHAIN-DRIFT COMPARISON IS ALSO NOT PUBLISHABLE AS IT STANDS. Splitting the
chained-vs-GEKS gap into as-built -> adjacent-only (the TD1 defect) and
adjacent-only -> GEKS (genuine drift), the defect's share runs from 7% (audio)
to 802% (translation) — above 100% because in coding and translation the
adjacent-only chain lands BELOW GEKS. So §3.4 is wrong in both directions: part
of the gap is a coding defect, and the residual drift has no consistent sign.
The defect fires on 24-35% of within-gig links, longest span 35 quarters.

TD1 is therefore retired by DECISION, not repair: compute the comparison on the
production panel at the production base (step 29 already does, and reproduces
step 12's shipped level exactly in four of seven categories) rather than fixing
step 12, whose own panel and 2019Q1 base are independent sources of divergence.

Phase 1 is complete, and none of D1-D4 moves a published figure, so Phase 2
needs no pipeline re-run — docs/data.json stands.

Measurement only — nothing in data/, docs/ or drafts/ was modified.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phases 2 and 3 of plans/active/publication.md. The analysis had been four and a
half months ahead of the writing; it no longer is.

PHASE 2 — code/30-freeze-numbers.py writes data/pilot/paper-numbers.{md,json}
from docs/data.json. Every section quotes that one table; no section computes
its own figures. code/32-check-draft-numbers.py enforces it, and additionally
greps for retracted figures and requires a retraction cue nearby. No pipeline
re-run was needed: D1-D4 moved no published figure.

The frozen table adopts the SITE's band convention (196*se, the linear log-scale
form docs/ipi.js publishes) rather than the exponential form. The first pass used
the latter and reported design at +/-5.0%, which flips design across the +/-5%
adequacy line; the site says +/-4.8%. A paper and a public site disagreeing on a
published figure is the worse failure, so they now match exactly, with the exact
asymmetric interval carried alongside.

PHASE 3 — all eight prose sections.

  §3 Methods (2,345 -> 5,367 words) now carries every Phase 1 decision, plus
  three new subsections: §3.6 the +/-5% adequacy criterion with the precision-vs-n
  curve and matched-gigs-per-bilateral, §3.7 the link-path identification failure
  (MIN_MATCH, base quarter and window shown to be one defect), and §3.9 which
  retracts the price elasticity of intelligence and prints the diagnostics. §3.5
  adds CPI-U deflation, absent until now. The 2019Q1/2020Q1 base inconsistency is
  fixed and the unreproducible "10.9% filled" is restated as 14.9% with its
  definition and an explicit note.

  §4 Findings rewritten real-first, the 2025 reversal retracted in text rather
  than deleted, the category ranking refused with the overlapping intervals
  shown, and a new §4.6 reporting the non-gig exclusion as a finding in its own
  right.

  Abstract, §1, §5 and §7 written from scratch, descriptive-first. §6 rewritten
  with a measured bound on every limitation that has one.

  §2 Related Work was not in the Phase 3 list but was self-contradictory — still
  promising the retracted elasticity, framing benchmarks as the regressor,
  justifying a forecasting component the paper does not have, and carrying a
  positioning table row reading "Forecasting: Yes". Fixed at six claim-level
  points; its 68 [CITE-] placeholders remain Phase 4 work.

  The FAQ mirror is now GENERATED (code/31-mirror-faq.py) rather than hand-copied.
  It had drifted three weeks and carried retracted figures while the live page was
  correct; a hand-maintained mirror is a recurring defect, not a one-off.

Test infrastructure brought current across seven files, five of which had never
been reviewed. method.test.md goes 5 FAIL + 1 BLOCKED -> 1 FAIL; findings.test.md
5 FAIL -> 0 FAIL with two PARTIALs kept honest. R10 stays FAIL deliberately: the
direct matched-pair check is absent from the draft and its figures predate the
Stage 5b exclusion.

Verified: all new scripts py_compile clean and exit 0; render.py produces
draft-2026-08-06.html with 0 missing includes; the number checker passes with 22
frozen figures present and 6 retracted figures all properly cued. §4.1's
descriptive statistics were recomputed rather than carried over, which caught a
wrong median (the old $25 is the recent panel; the historical panel is $20).

Remaining before submission: 86 [CITE-] placeholders, 5 figures,
model-paper.test.md (10 BLOCKED), master.test.md, and method.test.md R10.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Phase 4 apparatus. Every <!-- FIGURE --> placeholder is gone and every
[CITE-] placeholder now resolves.

- 33-direct-matched-check.py: the direct base-to-terminal bilateral Jevons,
  which shares no machinery with GEKS (no chain, no transitivity correction,
  no link quarters, no regression, no imputation). Recent panel agrees to a
  median 2.7%; the historical panel has only 1-4 gigs surviving both endpoints
  and is reported as uninformative rather than omitted. Closes method R10 —
  that file is now 0 FAIL.
- 34-figures.py: five standalone SVGs, embedded with numbered captions.
  Figure 4's precision curve was RECOMPUTED, and it was wrong: subsampling
  without replacement needs a (1 - n/N) correction, without which the curve
  understates the precision loss and reads zero at n=N. Corrected, ±5% needs
  ~900 (writing), 1,100 (design), 1,600 (video) and ~7,400 (coding) matched
  gigs — superseding the "850-2,500 per category" range quoted in four
  sections and on the site. The corrected curve also validates the published
  bootstrap SEs independently, agreeing to within 3 points in all four.
- 35-bibliography.py + references.json: 63 entries, no unresolved keys,
  generating references.md into the draft. 7 entries are UNVERIFIED and all 7
  are in §2 — a submission blocker, tracked as related-work R16. Also fixes
  Massenkoff & McCrory, previously keyed to the data provider.
- render.py had no image support, so all five embeds would have rendered as
  literal markdown text.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
§3.8 carried the hedonic regression as prose — the headline numbers were
there, but no reader could check a coefficient. Adds the estimating equation
and a three-column table: (1) cross-section, (2) + quarter FE, (3) the volume
slope re-estimated within-gig, each with t-statistics, R², n and clusters.

The reversal that justifies the matched-model design is now a table row
rather than a claim: ln(1+reviews) reads +0.022 (1.64), −0.001, and
+0.133 (7.87) across the three columns.

Two things the table forced in that the prose had left out: the second
reading of "prior gigs" (seller gig counts, −0.051, t = −0.59, leaving every
other coefficient unchanged) and the rating-scale sensitivity as three
numbers rather than an assurance that the bug does not matter.

User chose the paper over the live site when offered both — recorded as
method U7 so it is not moved later without asking.

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