REDACTED PUBLIC COPY (13 October 2026). Names, internal file paths and internal tool names are replaced; nothing else is changed. The sha256 values below refer to the unredacted originals, available on request from seo@blotato.com. 2026-10-12 17:29:16 CDT PREREG.md v1 sha256=e8a4a8281fe9ef33f84cd49a3baa6c75cda12311a79b5a83242dc58f37d784bc | no trend computed yet; state = schema/totals only 2026-10-12 17:32:02 CDT DISCLOSURE: prior-art.md exposed ecosystem-wide (NOT social) MCP Registry first-publish monthly counts from a DEV post (407 Sep-2025 ... 6,265 Aug-2026). No social or GitHub-series figure seen. Gates unchanged by it. 2026-10-12 17:34:29 CDT DISCLOSURE: AI baseline exposed ecosystem MCP counts (Gravity 41,400, +37%/30d) and PostEverywhere vendor agent-POSTING figures (2.8x Jul-Sep). Neither is a social MCP supply series or a study #7 measure. internal review NO-SHIP on v1; the study lead chose hardened test -> section on study #6. v2 follows. 2026-10-12 17:35:20 CDT PREREG.md v2 sha256=e41ccd575cdc10f362d3e71659afc0bc771736aa66308e10918ee27166cebd24 | still no study #7 trend computed 2026-10-12 17:42:23 CDT LOCK v3 (procedure locked; no study #7 trend computed; analyze_trend.py smoke-tested on synthetic data only, independent check matched): sha256=2e117a8b29f7a9b5e83fe8228fdea25c43e8f74ee3f2d6090d70dda34539f097 step0/PREREG.md sha256=7224b5172234310516678d3ba61a4c0bc7813aeb1701adc9167581f1ba4bf427 collect_trend.py sha256=1ceac37f104df28a893ede34f3fe0667dcffcbde00211dcc6563a8bbc1f36ab7 analyze_trend.py sha256=30ab960647fcfdbe8d10b118d6ed71db54022f19a5b9863e8b3b6cad4c436c25 recheck_cells.py sha256=bfc0a8a130c7d75ea619d8273c3b0c445dd2baf39a37b7c8b9d9a90478425426 ../social-media-mcp-census/collect.py note: collect_trend.py mtime 17:36:21 CT, unchanged since before the first raw call 17:36:35 CT. 2026-10-12 17:43:26 CDT D1 pulled after v3 lock (Labs, $~0.015). Format conversion only: Labs returns monthly_searches as a {YYYY-MM: volume} map; saved verbatim in d1_labs_raw.json and converted to the list shape analyze_trend.py reads (d1_labs.json). No procedure change. Labs window = 2025-09..2026-08 (prereg: latest 6 vs prior 6 of the 12 returned; shift disclosed). 13 of 21 set keywords absent from Labs (dropped per rule, not re-pulled). 2026-10-12 17:47:06 CDT AMENDMENT A1 (internal review: text-vs-code mismatches). State: D NOT yet collected (raw/d empty), no N or share trend computed. Changes: (1) share numerator = N restricted to repos present in collected D (N_not_in_D reported); G0-G2 keep full N. (2) X false-stem rule = study #6 collect.py L197 exactly (name-only stem, twitter/tweet guard, drops the x match only); PREREG names PLATFORMS_A3, not PLATFORMS. (3) G5a text aligned to code (stratum whose only-match removal lowers P2 capped N most). Text-only clarifications: STOP uses quarters for N and P1/P2 for D; 'multi' stratum named; D1 floor = >=4 remain after removing the largest (D1 already pulled; 7 kept, so either reading gives the same input); G5b G4 = ratio only. collect_trend.py docstring 'PREREG v2 ... ids == total_count' is stale and superseded by analyze_trend.py tol()/recheck (file left unedited to keep its hash). D1 conversion verified lossless by script. Synthetic smoke test re-run, behaves as specified. sha256=cf3a6034ca2e2be73832edd8ef64f4e20c2c6e0829c5da27b588ee7428526e3b step0/PREREG.md sha256=420476fc61580aaf1107d215e14bc14f350d12d788ac0e43c7f387ed9b6d3770 analyze_trend.py sha256=7224b5172234310516678d3ba61a4c0bc7813aeb1701adc9167581f1ba4bf427 collect_trend.py sha256=30ab960647fcfdbe8d10b118d6ed71db54022f19a5b9863e8b3b6cad4c436c25 recheck_cells.py 2026-10-13 09:32:53 CDT AMENDMENT A2 (the study lead: "do what you think is best"). State: N collected (987 cells, 0 incomplete); D collecting (2025-10/11 cells only, unchanged code); npm metadata only, NO download pulled; no D1, D2, N or share figure computed by anyone. Defect: npm search 'keywords:mcp ' does not filter by term (all 15 terms total=79,385) and the locked code stops at from=1750, so each term = top 2,000 by searchScore, which tracks downloads (Spearman 0.54-0.91 on name matches); matching packages still present at rank 1,750-2,000 for 13 of 15 terms, so the pull was truncated and popularity-tilted. Fix: new collect_npm_a2.py (search 'keywords:mcp keywords:', a real filter, totals 10-416; collected == total proven per tag in raw/npm/SEARCH.log; exits non-zero otherwise); metadata, downloads, date range and analyze_trend.py d2_gate unchanged. Capped pull moved to raw/npm_capped_v3/ and never computed. collect_trend.py and analyze_trend.py unchanged. sha256=c7714e3cb4e548465e3ecdbfe0b18d2fe47d8ac35678a1ea22d0d5c2ab01504b step0/PREREG.md (v3.2) sha256=ff4cf3dcfdc5121a05caedbb62eef349cac9f5502348392274ec1ee465571069 collect_npm_a2.py sha256=7224b5172234310516678d3ba61a4c0bc7813aeb1701adc9167581f1ba4bf427 collect_trend.py sha256=420476fc61580aaf1107d215e14bc14f350d12d788ac0e43c7f387ed9b6d3770 analyze_trend.py sha256=30ab960647fcfdbe8d10b118d6ed71db54022f19a5b9863e8b3b6cad4c436c25 recheck_cells.py 2026-10-13 09:34:11 CDT CLASSIFICATION PROCEDURE (fixed before any sample is drawn; no figure computed): fetch_samples.py saves README/repo.json/root manifests per sampled repo from api.github.com (404 = GONE = unreadable = no) and splits items into blind batches (N: P1+P2 shuffled together, 6 batches; D: 2 batches; seed 20261013; period never shown). classifier agents label from saved files only per work/CLASSIFY_BRIEF.md (study #6 R1/R3 + C5/C7/C8 + A1 verbatim). spot-check = a separate spot-check agent re-labels a seeded 20% of each of the four samples (seed 20261012) from the same files. Resolution rule (not in PREREG s5, fixed now): on disagreement the spot-check label replaces the classifier label for that item; if the spot-check disagreement rate on the gated field (N: server, D: mcp_code) exceeds 10% in any of the four samples, that whole sample is re-labelled by spot-check and the spot-check labels are used. sha256=1b2424f6db5a92a33229726e2253262d0bf3ad8d79c348c78490ccbc7f0eb028 fetch_samples.py sha256=1315dfe7da348c20d902fb8a4c3309bbdc4e12722aa41561ed7b7af92bf7727b work/CLASSIFY_BRIEF.md 2026-10-13 09:35:28 CDT ORCHESTRATION ONLY (no procedure change): D (~349,575 repos by month head totals) was latency-bound at ~8 searches/min on one worker. Stopped 'collect_trend.py d' and resumed with run_d_months.py (imports collect_trend.py's own list_cell; same query, split rule and files) on three workers with disjoint months, ~25 searches/min total, under GitHub's 30/min. sha256=3f12e6f679ec79e97a69e5a4b1b8d83f8860cd4bee7995c85bdbd70ce3a3248f run_d_months.py 2026-10-13 09:42:25 CDT INCIDENT + ORCHESTRATION (no procedure change, no figure computed): the working folder is cloud-synced and the sync service replayed the 09:32 rename raw/npm -> raw/npm_capped_v3 at ~09:39, folding the first A2 run's fresh raw/npm (search files, SEARCH.log, search_names.json, 51 metas; no downloads) into the capped folder. A2 run stopped; its files quarantined in raw/npm_a2_misfiled_2026-10-13/ (never computed); capped folder restored to its own 5,827 metas and its search_names.json rebuilt from its 120 search files (6,089 names). A2 re-runs from scratch into raw_stage/npm (collect_npm_a2.main with ct.RAW pointed at raw_stage; same code, same requests) so no later rename replay can touch it; copied (cp, not mv) to raw/npm and verified (1 meta + 1 dl per search name, no extras) before analyze_trend.py runs. 2026-10-13 09:51:52 CDT ORCHESTRATION ONLY (no procedure change, no figure computed): new session took over (the study lead closed the earlier 10-13 chat). The three run_d_months.py workers had stopped ~09:44 with no EXIT line (raw/d: 62 files, all parse). Restarted the same three disjoint month sets with unchanged code (run_d_months.py sha256=3f12e6f679ec79e97a69e5a4b1b8d83f8860cd4bee7995c85bdbd70ce3a3248f); existing cell files are skipped. npm A2 stage run (pid 6060) left running. 2026-10-13 10:28:16 CDT NPM A2 COPY + VERIFY (no procedure change, no figure computed): raw_stage/npm finished EXIT=0 (1,395 names). Copied with cp -R to raw/npm (raw/npm did not exist; byte-identical to stage, 0 differing files). Verified by script: file sets meta == dl == md5 of search_names.json (1,395 each, no extras); every meta name matches its search name and has time.created; 1,386 dl files hold resp.package == name and a 365-day series 2025-10-01..2026-09-30; 9 dl files are _http 404 (@flashdata-dev/mcp, @granitebps/youtube-mcp, @socifyr/mcp, @trackmedia/mcp-server, instoryview, minionix-mcp, scrupp-mcp-server, transcriptyt, vid2llm-mcp), all created 2026-10-12/13 (no download history yet) and outside the D2 cohort (created >= 2025-10-01), so no D2 input is affected. Not re-pulled. 2026-10-13 12:01:04 CDT ORCHESTRATION ONLY (no procedure change, no figure computed): D worker 1 finished (2025-12..2026-03, EXIT=0). Running recheck_cells.py d (locked, sha256 30ab9606...) alongside the two remaining D workers (~3 search processes, under 30/min). It re-pulls once each incomplete cell present now; it will be run again after D finishes for cells written later (it skips cells already rechecked). 2026-10-13 12:11:04 CDT AMENDMENT A3 (code defect, no procedure change intended; logged BEFORE the fixed recheck runs; no study figure computed by anyone). State: D 10 of 12 months collected (Jun, Sep still running), npm A2 verified, N complete. Defect: recheck_cells.py stopped paging when a page returned fewer than 100 items. GitHub search returned short pages mid-pull with incomplete_results=false, so the first recheck run (12:01-12:10, 17 cells) wrote truncated re-pulls (e.g. 299 of 588, 297 of 635) while 4 cells re-pulled fully; analyze_trend.load_cells prefers a recheck file, so these would have replaced near-complete originals. collect_trend.list_cell (the collector) never had the defect: it pages while collected < total and page < 10, stopping only on an empty page. Fix: recheck_cells.py now pages exactly like list_cell (total taken from the first page; stop at total, page 10, or an empty/errored page). PREREG s4 'an incomplete cell is re-pulled once' is unchanged; the defective run is treated as no re-pull (same handling as A2's capped pull). Its 17 outputs + log copied byte-verified to raw/d_recheck_defective_2026-10-13/ and removed from raw/d/recheck/ (never computed). The fixed recheck runs once over every incomplete cell after D finishes, alone (no D worker running). sha256=3d7acc11cecba66e4cad436280abd92e48b05bcb1f8120c499996ce7b498143c recheck_cells.py sha256=7224b5172234310516678d3ba61a4c0bc7813aeb1701adc9167581f1ba4bf427 collect_trend.py (unchanged) sha256=420476fc61580aaf1107d215e14bc14f350d12d788ac0e43c7f387ed9b6d3770 analyze_trend.py (unchanged) sha256=c7714e3cb4e548465e3ecdbfe0b18d2fe47d8ac35678a1ea22d0d5c2ab01504b step0/PREREG.md (unchanged) 2026-10-13 12:31:42 CDT D COLLECTION COMPLETE (no figure computed): all three workers EXIT=0, 0 ERROR cells. work/check_d_coverage.py: every month 2025-10..2026-09 tiled by its leaf cells with no gap, overlap or missing edge (1-second grain); sum total_count 379,603, collected ids 379,335. Running fixed recheck_cells.py d (A3 hash 3d7acc11...) alone, then recheck_cells.py n. 2026-10-13 12:46:51 CDT STOP RULE TRIGGERED (PREREG s4; no sample drawn, no N, share or demand figure computed). Fixed recheck d (A3) re-pulled all 21 incomplete cells once: 7 now complete, 14 (all P2) still short by 3-5 ids each, returning the same ids on both pulls (GitHub's total_count includes repos its search never returns). analyze_trend.py sample: stopN=[], stopD=[P2: incomplete-cell totals 8,437 > 1% of raw D P2 225,297]. Actual missing ids in those 14 cells: 54 (0.024% of raw D P2). recheck n: 0 cells. Waiting for the study lead per PREREG ('The study STOPS (the study lead told)'). 2026-10-13 12:50:54 CDT AMENDMENT A4 (the study lead, 12:47: "Amend and continue"; logged BEFORE analyze_trend.py sample re-runs; no sample drawn, no N, share or demand figure computed by anyone). The s4 stop rule now sums missing ids (total_count - collected) over still-incomplete cells instead of their whole total_count. Reason: after the A3 re-pull, 14 P2 D cells stay 3-5 short on both pulls with identical ids (GitHub total_count counts repos search never returns); missing = 54 of raw D P2 225,297 (0.024%), cell totals 8,437 (3.7%). The original rule's firing and both figures are disclosed in PREREG v3.4 and, on a pass, on the page Method. Code: analyze_trend.load_cells one line (inc += total - n_ids). Text: PREREG s4 + v3.4 note (v3.3 skipped: A3 had no text change). sha256=93e507a4e48b16c1d198ad897e2347673bef29f4b593da938200eb6da10f13fe step0/PREREG.md (v3.4) sha256=219931f7962b1280fbd379cd8aeb6855ba7eb120fe6e96cc7406d1dd6f7dea45 analyze_trend.py sha256=3d7acc11cecba66e4cad436280abd92e48b05bcb1f8120c499996ce7b498143c recheck_cells.py (A3, unchanged since) sha256=7224b5172234310516678d3ba61a4c0bc7813aeb1701adc9167581f1ba4bf427 collect_trend.py (unchanged) 2026-10-13 12:51:12 CDT analyze_trend.py sample (post-A4): stopN=[], stopD=[]; seeded samples written (N_P1 150, N_P2 150, D_P1 100, D_P2 100). Running fetch_samples.py (locked, sha256 1b2424f6...). 2026-10-13 12:51:26 CDT SPOT-CHECK SELECTION fixed and run before any label exists (orchestration detail of the logged CLASSIFICATION PROCEDURE): work/spotcheck_pick.py, per sample a fresh random.Random(20261012) draws round(20%) of sorted full_names -> work/spotcheck/. sha256=c2e92e0512c389d63a45f47d6bd24b4e7a7285ef292f6d8f1cff2617565376d8 2026-10-13 13:04:58 CDT fetch_samples.py EXIT=0: 500 repos, 0 GONE, 8 blind batches (N1-6 x50, D1-2 x100). 61 have no saved README: 41 have none in root; 20 re-queried once read-only (work/readme_diag.log): 6 README files are empty (content length 0), 14 repos are empty (readme and root both 404) -> saved state accurate, no re-fetch. Classification starts (8 classifier agents per CLASSIFY_BRIEF.md). 2026-10-13 13:06:13 CDT LABEL ASSEMBLY fixed before any label was read: work/build_class.py applies the logged spot-check rule mechanically (spot-check replaces classifier on any-field disagreement for picked items; >10% gated disagreement in a sample = full spot-check re-label of that sample, exit 3 until supplied); prints disagreement rates only. sha256=e422acd85b418ff54eb284323c8cb1ced51a7a63ea5aa024a8121d3c6f17f733 2026-10-13 13:09:28 CDT CLASSIFICATION DONE: 8 classifier batches (500 repos, label sets verified complete per batch) + 2 spot-check agents (60 N + 40 D picks). build_class.py (hash as logged): gated disagreement N_P1 1/30 (3.3%), N_P2 0/30, D_P1 0/20, D_P2 0/20; none over 10%, so no full re-label. spot-check labels replaced classifier on 2 items (1 server, 1 publishes-only). class_*.json written. Running analyze_trend.py gates. 2026-10-13 13:09:55 CDT GATES RESULT (analyze_trend.py gates, hashes as logged; work/gates.json sha256=04353ac8abe2a45e4600b5ccda8c91dda3c87ac55f7f7707fd7b7285a2ff5543): G0 PASS (capped N P1 1,223), G1 PASS (adj 2.26), G2 PASS, G3 PASS (D1 4.48 pass; D2 1.21 fail, non-blocking), G4 FAIL (S P1 1.277% -> P2 1.568%, raw 1.228, lower bound R_p/R_d 0.873, adj 1.072 < 1.10), G5 FAIL (no-youtube G4 adj 1.098; drop-top-month G4 adj 1.050). OVERALL SKIP. Per PREREG s8 and the study lead 2026-10-12: Task 5 SKIPPED, nothing published. A4 could raise S(P2) by at most 0.024%; the gate failed regardless. 2026-10-13 13:49:21 CDT POST-RESULT DECISION (the study lead, after seeing the SKIP): publish the honest result as a dated section on study #6, under the study #7 merge authority and full Gates A-G. This departs from PREREG s8 ('ANY gate fails: nothing is published'); the page must disclose that publishing was pre-registered as pass-only and that the test missed its bar. No gate, threshold, definition, sample or label is changed. Point estimate for the record (same code, boot() point values): raw share ratio 1.228 x R_p 1.292 / R_d 1.045 = 1.518; conservative (lower 2.5%) 1.072 < 1.10. 2026-10-13 14:08:46 CDT FOR THE RECORD (accuracy gate finding, no gate changed): PREREG v2 (hashed 17:35:20, before the first collection call 17:36:35) defined G4 as S(P2)/S(P1) x lower bound of R_p, with S on all capped N. Computed from gates.json: derived from gates.json (capN, capD and G1 lb_Rp). v3 (locked 17:42:23, after collection began, before any figure) added R_d and the latest-quarter check, and A1 restricted the numerator to N in D. The page reports the locked (stricter) result and discloses the v2 value.