Conversation
--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>
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>
…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>
- 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>
Clicking a quarter now lists the composite first, then all seven categories in alphabetical order, each with its index level (pts) at that quarter. Drops the repeated quarter label (already shown in the dropdown). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…0 rebuild - ipi.js: quarter-click readout lists composite then all 7 categories (A-Z) - index.html: "How to read the units" header explainer (+ .units CSS) - 18-build: TOP_N 25 -> 100; rebuilt data.json/freelancers.json (592 sellers) Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Replace the three stacked intro paragraphs (mission/def/units) with a two-column grid of boxes — 'What this is' and 'How to read it' — with trimmed text to reduce the wall of text at the top. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…bands
(A) code/20-validate-extraction.py: audits parsed prices vs independent signals
(og:title price, presence-in-HTML, pipeline re-parse). Displayed window
(2020Q1+) validates 100%; failures confined to pre-2017 old_json era.
(B) 19-tpd: per-quarter regression SE (splu on X'X) -> *-tpd-se.csv; 18-build
emits index_tpd_se/composite_tpd_se; ipi.js draws a shaded 95% band on the
fixed-effects chart (composite ±3.2%, translation ±34% — thin cats read wide).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Adds a note under the fixed-effects chart: a random 300-snapshot spot-check found 100% of displayed-era (2020Q1+) prices match an independent on-page price (none hallucinated, all reproducible). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
- Independent quarter picker (#qpick2) and readout (#qreadout2) on the fixed-effects chart; own pinned state (pinnedFx) so it's separate from the main chart. Readout lists composite first, then all 7 categories (A-Z), reading the fixed-effects series (DATA.index_tpd). - Remove "Corrected" from the fixed-effects chart y-axis label. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…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>
- 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>
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>
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>
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>
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>
…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>
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>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.