{
  "review_archive": [
    {
      "path": "notes/R-0001.md",
      "title": "R-0001",
      "url": "/notes/R-0001/"
    },
    {
      "path": "notes/R-0002.md",
      "title": "R-0002",
      "url": "/notes/R-0002/"
    },
    {
      "path": "notes/R-0003.md",
      "title": "R-0003",
      "url": "/notes/R-0003/"
    },
    {
      "path": "notes/R-0004.md",
      "title": "R-0004",
      "url": "/notes/R-0004/"
    },
    {
      "path": "notes/R-0005.md",
      "title": "R-0005",
      "url": "/notes/R-0005/"
    },
    {
      "path": "notes/R-0006.md",
      "title": "R-0006",
      "url": "/notes/R-0006/"
    },
    {
      "path": "notes/R-0007.md",
      "title": "R-0007",
      "url": "/notes/R-0007/"
    },
    {
      "path": "notes/R-0008.md",
      "title": "R-0008",
      "url": "/notes/R-0008/"
    },
    {
      "path": "notes/R-0009.md",
      "title": "R-0009",
      "url": "/notes/R-0009/"
    },
    {
      "path": "notes/R-0010.md",
      "title": "R-0010",
      "url": "/notes/R-0010/"
    },
    {
      "path": "notes/R-0011.md",
      "title": "R-0011",
      "url": "/notes/R-0011/"
    },
    {
      "path": "notes/R-0012.md",
      "title": "94095825 [('uv', 76466745, 81.3), ('pip', 17280928, 18.4), ('poetry', 267685, 0.3)]",
      "url": "/notes/R-0012/"
    },
    {
      "path": "notes/R-0013.md",
      "title": "R-0013",
      "url": "/notes/R-0013/"
    },
    {
      "path": "notes/R-0014.md",
      "title": "R-0014",
      "url": "/notes/R-0014/"
    },
    {
      "path": "notes/R-0015.md",
      "title": "R-0015",
      "url": "/notes/R-0015/"
    },
    {
      "path": "notes/R-0016.md",
      "title": "R-0016",
      "url": "/notes/R-0016/"
    },
    {
      "path": "notes/R-0017.md",
      "title": "R-0017",
      "url": "/notes/R-0017/"
    },
    {
      "path": "notes/R-0018.md",
      "title": "R-0018",
      "url": "/notes/R-0018/"
    },
    {
      "path": "notes/R-0019.md",
      "title": "R-0019",
      "url": "/notes/R-0019/"
    },
    {
      "path": "notes/R-0020.md",
      "title": "R-0020: rarer-further-down, reader review",
      "url": "/notes/R-0020/"
    },
    {
      "path": "notes/R-0021.md",
      "title": "Release review of LH015",
      "url": "/notes/R-0021/"
    },
    {
      "path": "notes/R-0022.md",
      "title": "R-0022: review of \"recipes-follow-the-pin\"",
      "url": "/notes/R-0022/"
    },
    {
      "path": "notes/R-0023.md",
      "title": "R-0023: evidence review of LH016, record 0.1, its data and replays, and the surfaces it changed",
      "url": "/notes/R-0023/"
    },
    {
      "path": "notes/R-0024.md",
      "title": "R-0024: evidence review of the correction round of 29 September 2026, late evening: the reading of the pace (1.2, record 0.4), the reading of what stays behind (1.2, record 0.4), LH016 0.2 and the surfaces they changed",
      "url": "/notes/R-0024/"
    },
    {
      "path": "notes/R-0025.md",
      "title": "R-0025: A reader's review of two pieces, version 1.2",
      "url": "/notes/R-0025/"
    },
    {
      "path": "notes/R-0026.md",
      "title": "R-0026: release review of LH017 (blind check and evidence review)",
      "url": "/notes/R-0026/"
    },
    {
      "path": "notes/R-0027.md",
      "title": "R-0027: reader-and-inference review of LH017's pieces",
      "url": "/notes/R-0027/"
    },
    {
      "path": "notes/R-0028.md",
      "title": "R-0028: recheck of the resolutions of R-0026 and R-0027 (LH017)",
      "url": "/notes/R-0028/"
    },
    {
      "path": "notes/R-0029-php-emergency-evidence.md",
      "title": "R-0029: PHP emergency account, evidence review",
      "url": "/notes/R-0029-php-emergency-evidence/"
    },
    {
      "path": "notes/R-0030-php-emergency-reader.md",
      "title": "R-0030: PHP emergency account, reader-and-inference review",
      "url": "/notes/R-0030-php-emergency-reader/"
    },
    {
      "path": "notes/R-0031-php-emergency-blind-reader.md",
      "title": "R-0031: PHP emergency reader-and-inference review",
      "url": "/notes/R-0031-php-emergency-blind-reader/"
    },
    {
      "path": "notes/R-0032-php-later-evidence.md",
      "title": "R-0032: Evidence review of the PHP account's later evidence (version 1.1)",
      "url": "/notes/R-0032-php-later-evidence/"
    },
    {
      "path": "notes/R-0033-php-later-evidence-reader.md",
      "title": "R-0033: Reader-and-inference review of the PHP account, version 1.1",
      "url": "/notes/R-0033-php-later-evidence-reader/"
    },
    {
      "path": "notes/R-0034-php-later-evidence-recheck.md",
      "title": "R-0034: Recheck of what the two reviews' resolutions wrote (PHP account, version 1.1)",
      "url": "/notes/R-0034-php-later-evidence-recheck/"
    },
    {
      "path": "notes/R-0035-php-cisa-evidence.md",
      "title": "R-0035: Evidence review of the PHP account's CISA later evidence (version 1.2)",
      "url": "/notes/R-0035-php-cisa-evidence/"
    },
    {
      "path": "notes/R-0036-php-cisa-reader.md",
      "title": "R-0036: Reader-and-inference review of the PHP account, version 1.2",
      "url": "/notes/R-0036-php-cisa-reader/"
    },
    {
      "path": "notes/R-0037-php-cisa-recheck.md",
      "title": "R-0037: Recheck of the resolutions to R-0035 and R-0036 (PHP account, version 1.2)",
      "url": "/notes/R-0037-php-cisa-recheck/"
    },
    {
      "path": "notes/R-0038-essay-tone-review.md",
      "title": "Every week held since 23 September: weekend-day mean over weekday mean (Mon to Fri of the same week)",
      "url": "/notes/R-0038-essay-tone-review/"
    },
    {
      "path": "notes/R-0039-week-one-evidence.md",
      "title": "R-0039: evidence review of the week-one piece",
      "url": "/notes/R-0039-week-one-evidence/"
    },
    {
      "path": "notes/R-0040-week-one-reader.md",
      "title": "R-0040: reader stage for \"A week after two fixes\"",
      "url": "/notes/R-0040-week-one-reader/"
    },
    {
      "path": "notes/R-0041-week-one-recheck.md",
      "title": "R-0041: recheck of the week-one piece after reviews R-0039 and R-0040",
      "url": "/notes/R-0041-week-one-recheck/"
    },
    {
      "path": "notes/R-0042-essay-checks.md",
      "title": "R-0042: checks of the essay \"Seen from outside, seen from inside\" before release",
      "url": "/notes/R-0042-essay-checks/"
    },
    {
      "path": "notes/R-0043-php-compromise-evidence.md",
      "title": "R-0043: evidence review of the PHP account's version 1.3 (later evidence of 30 October)",
      "url": "/notes/R-0043-php-compromise-evidence/"
    },
    {
      "path": "notes/R-0044-php-compromise-reader.md",
      "title": "R-0044, reader-and-inference review of the PHP account, version 1.3",
      "url": "/notes/R-0044-php-compromise-reader/"
    },
    {
      "path": "notes/R-0045-php-compromise-recheck.md",
      "title": "R-0045, recheck of the PHP account's version 1.3 resolutions",
      "url": "/notes/R-0045-php-compromise-recheck/"
    },
    {
      "path": "notes/R-0046-lh013-evidence.md",
      "title": "R-0046: evidence review of LH013 version 0.1",
      "url": "/notes/R-0046-lh013-evidence/"
    },
    {
      "path": "notes/R-0047-lh013-reader.md",
      "title": "R-0047: reader-and-inference review of the 3 November later-evidence notice on articles/old-versions-new-pythons.md",
      "url": "/notes/R-0047-lh013-reader/"
    },
    {
      "path": "notes/R-0048-lh013-recheck.md",
      "title": "R-0048: fresh-agent recheck of the LH013 later-evidence round",
      "url": "/notes/R-0048-lh013-recheck/"
    },
    {
      "path": "notes/R-0049-lh035-map-evidence.md",
      "title": "R-0049: evidence review of the LH035 map page (draft)",
      "url": "/notes/R-0049-lh035-map-evidence/"
    },
    {
      "path": "notes/R-0050-lh035-map-reader.md",
      "title": "R-0050: LH035 map, reader stage",
      "url": "/notes/R-0050-lh035-map-reader/"
    },
    {
      "path": "notes/R-0051-lh035-map-recheck.md",
      "title": "R-0051: recheck of the LH035 map page's review resolutions",
      "url": "/notes/R-0051-lh035-map-recheck/"
    },
    {
      "path": "notes/R-0052-it-was-only-a-test.md",
      "title": "Publication check: It was only a test",
      "url": "/notes/R-0052-it-was-only-a-test/"
    },
    {
      "path": "notes/R-0053-it-was-only-a-test-correction.md",
      "title": "Version 1.1 correction and source-verification record",
      "url": "/notes/R-0053-it-was-only-a-test-correction/"
    },
    {
      "path": "notes/R-0054-what-the-watch-would-see-claims.md",
      "title": "R-0054-what-the-watch-would-see-claims",
      "url": "/notes/R-0054-what-the-watch-would-see-claims/"
    },
    {
      "path": "notes/R-0055-what-the-watch-would-see-reader.md",
      "title": "What a reader would believe, written before reading the record",
      "url": "/notes/R-0055-what-the-watch-would-see-reader/"
    },
    {
      "path": "notes/R-0056-lh046-evidence.md",
      "title": "R-0056: evidence review of LH046 version 0.1",
      "url": "/notes/R-0056-lh046-evidence/"
    },
    {
      "path": "notes/R-0057-lh041-evidence.md",
      "title": "R-0057: evidence review of LH041, the registry worms, dated (record 0.1)",
      "url": "/notes/R-0057-lh041-evidence/"
    },
    {
      "path": "notes/R-0058-lh042-evidence.md",
      "title": "R-0058: evidence review of LH042, exposed AI services, dated (record 0.1)",
      "url": "/notes/R-0058-lh042-evidence/"
    },
    {
      "path": "notes/R-0059-lh044-evidence.md",
      "title": "R-0059: evidence review of LH044's brief, draw and baseline checkpoint (8 November 2026)",
      "url": "/notes/R-0059-lh044-evidence/"
    },
    {
      "path": "notes/R-0060-what-the-watch-would-see-recheck.md",
      "title": "R-0060: recheck of what the revision wrote, essays/what-the-watch-would-see.md",
      "url": "/notes/R-0060-what-the-watch-would-see-recheck/"
    },
    {
      "path": "notes/R-0061-lh041-reader.md",
      "title": "R-0061: LH041 reader-and-inference review",
      "url": "/notes/R-0061-lh041-reader/"
    },
    {
      "path": "notes/R-0062-lh046-reader.md",
      "title": "R-0062: reader-and-inference review of LH046 and its proposed \"Later evidence\" notices",
      "url": "/notes/R-0062-lh046-reader/"
    },
    {
      "path": "notes/R-0063-lh047-evidence.md",
      "title": "R-0063: evidence review of LH047, the rules of the road (record 0.1)",
      "url": "/notes/R-0063-lh047-evidence/"
    },
    {
      "path": "notes/R-0064-lh046-recheck.md",
      "title": "R-0064: recheck of the LH046 review resolution and its \"Later evidence\" notices",
      "url": "/notes/R-0064-lh046-recheck/"
    },
    {
      "path": "notes/R-0065-lh047-reader.md",
      "title": "R-0065: LH047 reader and inference review",
      "url": "/notes/R-0065-lh047-reader/"
    },
    {
      "path": "notes/R-0066-lh041-recheck.md",
      "title": "R-0066: LH041 recheck of the R-0061 resolution",
      "url": "/notes/R-0066-lh041-recheck/"
    },
    {
      "path": "notes/R-0067-lh047-recheck.md",
      "title": "R-0067: LH047 recheck of what the reader-review resolution wrote",
      "url": "/notes/R-0067-lh047-recheck/"
    }
  ],
  "schema_version": "0.2",
  "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
  "mode": "current catalogue",
  "stale_annotations": [],
  "generated_for": "2026-11-11",
  "boundary": "Every investigation declaration, study directory with a top-level Markdown lead, and released top-level finding/essay at the frozen commit. Short forms, drafts, checkpoints and raw evidence are excluded.",
  "counts": {
    "investigations": 3,
    "studies": 49,
    "findings": 18,
    "essays": 3,
    "references": 228
  },
  "nodes": [
    {
      "id": "investigations/ai-cost-and-spread.md",
      "path": "investigations/ai-cost-and-spread.md",
      "url": "/investigations/ai-cost-and-spread/",
      "kind": "investigation",
      "title": "What AI activity costs the shared internet",
      "summary": "",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "investigations/model-found-bugs.md",
      "path": "investigations/model-found-bugs.md",
      "url": "/investigations/model-found-bugs/",
      "kind": "investigation",
      "title": "When a model finds the bug",
      "summary": "",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "investigations/software-updates.md",
      "path": "investigations/software-updates.md",
      "url": "/investigations/software-updates/",
      "kind": "investigation",
      "title": "Where does a software update go?",
      "summary": "",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH000/LH000.md",
      "path": "studies/LH000/LH000.md",
      "url": "/studies/LH000/LH000/",
      "kind": "study",
      "title": "LH000 Observing one dispatch end to end",
      "summary": "Harbour's take record for this dispatch held 37 item fields, 23 with a value and 14 null: an observation of what Harbour stored, not of what happened on the host. Two host samples six minutes apart found a close to idle four core container, with load averages of 0.02 and 0.01 and 23 then 21 established IPv4 connections, also observations. That this load belongs mostly to the container's own supervisor processes and this session's harness, not the dispatch's own work, is an interpretation: every top process could be named from its command line, though no idle only baseline was sampled. This dispatch's residue inside the repository, so far, is the new directory studies/LH000/ holding this study. Whether the write-up shapes a later dispatch, such as one answering ticket Q-0002 or I-0002, is a scenario, not yet confirmed.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "LH000 Observing one dispatch end to end",
      "explanation": {
        "path": "studies/LH000/LH000.md",
        "question": "What does Harbour record about one dispatch, what does its host show, and what does it leave behind?",
        "summary": "One exploratory dispatch left a Harbour record, two host samples and a study directory. The samples describe the host container; attributing its near-idle load to background processes is an interpretation without an idle baseline.",
        "limit": "One dispatch cannot supply the planned calibration or observe the model inference occurring outside the container.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH000/LH000.md",
            "passage": "Harbour's take record for this dispatch held 37 item fields, 23 with a value and 14 null: an observation of what Harbour stored, not of what happened on the host. Two host samples six minutes apart found a close to idle four core container, with load averages of 0.02 and 0.01 and 23 then 21 established IPv4 connections, also observations. That this load belongs mostly to the container's own supervisor processes and this session's harness, not the dispatch's own work, is an interpretation: every top process could be named from its command line, though no idle only baseline was sampled. This dispatch's residue inside the repository, so far, is the new directory studies/LH000/ holding this study. Whether the write-up shapes a later dispatch, such as one answering ticket Q-0002 or I-0002, is a scenario, not yet confirmed.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "7994492e967db276ed0b4ba194d68d60c2be393c0ef2d857466d03d9d6de9830",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH000/LH000.md#L15"
          },
          {
            "label": "Boundary",
            "path": "studies/LH000/LH000.md",
            "passage": "This agent cannot see its own token usage or cost from inside the task; CLAUDE.md records that only the driver session can, so none are given here. This agent's own inference happens outside this container, on Anthropic's infrastructure, and appears in no host sample; the counts above describe the container hosting the agent, not the computation producing this text.",
            "line_start": 81,
            "line_end": 81,
            "sha256": "7994492e967db276ed0b4ba194d68d60c2be393c0ef2d857466d03d9d6de9830",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH000/LH000.md#L81"
          },
          {
            "label": "Boundary",
            "path": "studies/LH000/LH000.md",
            "passage": "The sample is one dispatch, read twice, not LH001's proposed three repetition calibration with an idle only baseline, a non-LLM comparator and a seven day follow-up window, so no signal per token, per request or per change can be produced here. Clock uncertainty between the five commands inside one sample was not separately measured. Whether a person or Harbour's autopilot loop initiated this dispatch cannot be told from the take record alone.",
            "line_start": 83,
            "line_end": 83,
            "sha256": "7994492e967db276ed0b4ba194d68d60c2be393c0ef2d857466d03d9d6de9830",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH000/LH000.md#L83"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH002/LH002.md",
      "path": "studies/LH002/LH002.md",
      "url": "/studies/LH002/LH002/",
      "kind": "study",
      "title": "When something changes in a small software neighbourhood, where does the change appear next?",
      "summary": "In this neighbourhood the change travelled, and the public record shows where it went but not why. Within the window, four of the nine dependents' repositories came to hold the library's new release, mcp 1.27.0. The earliest record of it is R04's first GitHub commit, 2.1 days after publication, which already held it; the first move visible as a change came 6.2 days after publication. In one case the release went a further step: a dependent's own release, published 22 minutes after its update, pinned it for everyone who installs that dependent (observation and derived measurement, git and Open Source Insights). All four moves are explained by ordinary maintenance: a maintainer's standing habit of pinning each new release, this time 22 minutes before the project's own release, a bulk lockfile refresh, the pinning of another package's dependencies, and a first adoption. No identified bot made any of them, and no maintainer identity is shared with the library (derived measurement; interpretation for \"explained\").",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "When something changes in a small software neighbourhood, where does the change appear next?",
      "explanation": {
        "path": "studies/LH002/LH002.md",
        "question": "Where does one library release appear next in a small software neighbourhood?",
        "summary": "Four of nine selected dependents came to hold mcp 1.27.0 during the window, and one dependent published a release that pinned it. The public records establish the order of these changes, without establishing their cause or showing installation or use.",
        "limit": "The cohort was selected partly on uptake, so four of nine is not an uptake rate; open-range resolutions at installation leave no trace in these records.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH002/LH002.md",
            "passage": "In this neighbourhood the change travelled, and the public record shows where it went but not why. Within the window, four of the nine dependents' repositories came to hold the library's new release, `mcp` 1.27.0. The earliest record of it is R04's first GitHub commit, 2.1 days after publication, which already held it; the first move visible as a change came 6.2 days after publication. In one case the release went a further step: a dependent's own release, published 22 minutes after its update, pinned it for everyone who installs that dependent (observation and derived measurement, git and Open Source Insights). All four moves are explained by ordinary maintenance: a maintainer's standing habit of pinning each new release, this time 22 minutes before the project's own release, a bulk lockfile refresh, the pinning of another package's dependencies, and a first adoption. No identified bot made any of them, and no maintainer identity is shared with the library (derived measurement; interpretation for \"explained\").",
            "line_start": 15,
            "line_end": 15,
            "sha256": "1bb41e21e58e6894e363d0a6a93200f7cff3d5ec8415bfff3495d4265fb41d8a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH002/LH002.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH002/LH002.md",
            "passage": "What links the release to each move is a version string that did not exist before 2 April, together with the order of events in time. That proves which came first; it does not show that the release prompted the change (interpretation). The records connect nothing to running software. No source read says which version of the library anyone installed or ran during the window. Open Source Insights today resolves the same dependents' window-time versions to releases published in September 2026, five months later. Two exact pins that did not move within the window, and a failed resolution, complete the picture: version propagation can be read where dependents pin or commit lockfiles, cannot be read where they declare open ranges, and its cause cannot be read anywhere in these records (interpretation).",
            "line_start": 17,
            "line_end": 17,
            "sha256": "1bb41e21e58e6894e363d0a6a93200f7cff3d5ec8415bfff3495d4265fb41d8a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH002/LH002.md#L17"
          },
          {
            "label": "Boundary",
            "path": "studies/LH002/LH002.md",
            "passage": "**The cohort is selected on uptake.** Frame A holds packages that Open Source Insights resolves to the release in the window, so four movers in nine is not a rate at which dependents take up a release, and must not be read as one. Frame B's two members are the only contrast, and both are old projects that did not move. How the service defines a version's dependents is not documented on the page read, so the frame's exact meaning is uncertain.",
            "line_start": 83,
            "line_end": 83,
            "sha256": "1bb41e21e58e6894e363d0a6a93200f7cff3d5ec8415bfff3495d4265fb41d8a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH002/LH002.md#L83"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH003/LH003.md",
      "path": "studies/LH003/LH003.md",
      "url": "/studies/LH003/LH003/",
      "kind": "study",
      "title": "LH003 Survey of surveys",
      "summary": "Thirty-four candidate observatories were considered; seventeen have a full row in sources.md's included table and seventeen are excluded there with a stated reason, an observation. Of the seventeen included, most see only one of LH F02's layers from one narrow population: repository-event archives and dependency resolvers see residue (changed structure), API-broker rankings and vendor usage reports see activity (inference calls), and vulnerability databases see a specific kind of residue, a disclosed flaw, rather than its exploitation. No source in this reading is classed as observing propagation directly. That is Lighthouse's classification, not an observation about the sources: LH F02 defines propagation as a derived link between an earlier residue record and later activity, not a surface any instrument reads off directly, so under that definition no source could be counted as seeing it. The empirical question is which of these records support identifying and testing such links. A propagation claim has to be built by joining two sources' records and testing the join, which is what LH002 is designed to attempt on a small scale for one such join (a dependency change and a dependent's later change) and what this study does not attempt at all. The strongest supported finding, an interpretation resting on the rows above rather than on any single one, is that these seventeen sources are partial views whose relationships to one another are unmeasured in anything this survey read: each is scoped to its own population (one forge, one broker, one vendor's product tiers in a given report, one company's network), no source read here states how much its population overlaps another's, and this study took no joint sample, so their counts cannot simply be added into a total. Distinct boundaries do not establish little overlap, and the table itself records connections, an observation: Open Source Insights links packages in seven ecosystems to their GitHub, GitLab and Bitbucket projects and to OSV advisories; OSV.dev aggregates GitHub Security Advisories, PyPA and RustSec among its upstream sources; GitHub's unreviewed advisories come from the NVD feed and are published in OSV format; NVD enriches records that CVE Numbering Authorities assign (this last per a search summary; see the fourth Finding). Where the populations overlap, and by how much, is a question for a joint sample, not something this reading establishes. What stays invisible, or visible only in part, is specific. No source read here can reliably tell a person's download or code change from an agent's. Cloudflare's AI Crawl Control does attribute crawler traffic to named AI operators, and its page lets a site owner group that traffic by crawler, by operator and by \"Category: Analyze crawlers by their purpose or type\" (an observation, from notes/R-0001.md's raw read of the page, last updated 23 April 2026); but it covers only crawlers Cloudflare has already identified, and because the category belongs to the crawler rather than to any one request, it cannot say why a particular page was fetched (an interpretation). The conversation figures do not say whether a person or a program was typing. No source states at what layer an AI system operated, and usage that happens off all these particular surfaces goes unseen, for instance direct provider API traffic outside a broker, a private repository, or a deployment that never triggers a public event. The first of those examples holds for the sources as read here; the first review note says later Economic Index reports, which this survey has not read, include one vendor's first-party API traffic.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "LH003 Survey of surveys",
      "explanation": {
        "path": "studies/LH003/LH003.md",
        "question": "Who already observes AI-related activity online, which layer does each source see, and where does coverage end?",
        "summary": "The survey included 17 of 34 candidate observatories and found partial views of different populations. Their relationships and overlap were unmeasured, so their counts cannot simply be added.",
        "limit": "The survey read documentation rather than testing source behaviour, and some rows rely on search summaries; it estimates neither overall coverage nor population overlap.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH003/LH003.md",
            "passage": "Thirty-four candidate observatories were considered; seventeen have a full row in sources.md's included table and seventeen are excluded there with a stated reason, an observation. Of the seventeen included, most see only one of LH F02's layers from one narrow population: repository-event archives and dependency resolvers see residue (changed structure), API-broker rankings and vendor usage reports see activity (inference calls), and vulnerability databases see a specific kind of residue, a disclosed flaw, rather than its exploitation. No source in this reading is classed as observing propagation directly. That is Lighthouse's classification, not an observation about the sources: LH F02 defines propagation as a derived link between an earlier residue record and later activity, not a surface any instrument reads off directly, so under that definition no source could be counted as seeing it. The empirical question is which of these records support identifying and testing such links. A propagation claim has to be built by joining two sources' records and testing the join, which is what LH002 is designed to attempt on a small scale for one such join (a dependency change and a dependent's later change) and what this study does not attempt at all. The strongest supported finding, an interpretation resting on the rows above rather than on any single one, is that these seventeen sources are partial views whose relationships to one another are unmeasured in anything this survey read: each is scoped to its own population (one forge, one broker, one vendor's product tiers in a given report, one company's network), no source read here states how much its population overlaps another's, and this study took no joint sample, so their counts cannot simply be added into a total. Distinct boundaries do not establish little overlap, and the table itself records connections, an observation: Open Source Insights links packages in seven ecosystems to their GitHub, GitLab and Bitbucket projects and to OSV advisories; OSV.dev aggregates GitHub Security Advisories, PyPA and RustSec among its upstream sources; GitHub's unreviewed advisories come from the NVD feed and are published in OSV format; NVD enriches records that CVE Numbering Authorities assign (this last per a search summary; see the fourth Finding). Where the populations overlap, and by how much, is a question for a joint sample, not something this reading establishes. What stays invisible, or visible only in part, is specific. No source read here can reliably tell a person's download or code change from an agent's. Cloudflare's AI Crawl Control does attribute crawler traffic to named AI operators, and its page lets a site owner group that traffic by crawler, by operator and by \"Category: Analyze crawlers by their purpose or type\" (an observation, from notes/R-0001.md's raw read of the page, last updated 23 April 2026); but it covers only crawlers Cloudflare has already identified, and because the category belongs to the crawler rather than to any one request, it cannot say why a particular page was fetched (an interpretation). The conversation figures do not say whether a person or a program was typing. No source states at what layer an AI system operated, and usage that happens off all these particular surfaces goes unseen, for instance direct provider API traffic outside a broker, a private repository, or a deployment that never triggers a public event. The first of those examples holds for the sources as read here; the first review note says later Economic Index reports, which this survey has not read, include one vendor's first-party API traffic.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "48a31821cb626154bddf496d2ca68a991feb969c87eeee40ab8dca7bd1851b7c",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH003/LH003.md#L15"
          },
          {
            "label": "Boundary",
            "path": "studies/LH003/LH003.md",
            "passage": "Several rows rest on a WebSearch summary of a source's documentation rather than a direct read of the primary page; sources.md flags each one. A WebSearch summary is a secondary account of what a page says, produced by a different model than the one writing this study, and it can compress or misstate a detail the primary page states precisely; none of those rows should be treated as more reliable than the direct-fetch rows until someone reads the primary source.",
            "line_start": 45,
            "line_end": 45,
            "sha256": "48a31821cb626154bddf496d2ca68a991feb969c87eeee40ab8dca7bd1851b7c",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH003/LH003.md#L45"
          },
          {
            "label": "Boundary",
            "path": "studies/LH003/LH003.md",
            "passage": "This survey states each source's population and boundary as its own documentation describes them; it does not test any of those claims against the source's actual behaviour (for instance, whether GH Archive's payload really does vary the way its docs warn, or whether OpenRouter's CC BY 4.0 licence covers the exact figures a study would want to cite). Confirming a claimed licence or boundary against the source's actual output is a further task, not done here.",
            "line_start": 47,
            "line_end": 47,
            "sha256": "48a31821cb626154bddf496d2ca68a991feb969c87eeee40ab8dca7bd1851b7c",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH003/LH003.md#L47"
          },
          {
            "label": "Boundary",
            "path": "studies/LH003/LH003.md",
            "passage": "This study cannot compare any two sources' populations quantitatively (how much they overlap, or how much of the wider population that \"what can we actually see of AI activity on the internet\" asks about, either one covers) because no source read here states its own overlap with another, and estimating one would require a joint sample this reading-only ticket did not take. Version 0.1's Findings called the populations \"almost disjoint by construction\", an interpretation drawn from each source's stated boundary; that reading did not follow and is withdrawn in version 0.2 (see Corrections). The Findings now describe partial views whose relationships are unmeasured: this study measured neither an overlap fraction nor its absence, and did not look for anyone else's measurement.",
            "line_start": 49,
            "line_end": 49,
            "sha256": "48a31821cb626154bddf496d2ca68a991feb969c87eeee40ab8dca7bd1851b7c",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH003/LH003.md#L49"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH004/LH004.md",
      "path": "studies/LH004/LH004.md",
      "url": "/studies/LH004/LH004/",
      "kind": "study",
      "title": "The xz backdoor, read through Lighthouse's three layers",
      "summary": "A compromised release of xz-utils, a compression library that several Linux distributions link into their ssh server through distribution-specific dependencies (see the last finding), carried a backdoor from a tarball built in February 2024 into several distributions' rolling repositories before anyone recognised it (observation, drawn from the sources in Findings). Reading the case through Lighthouse's three layers: the backdoor's residue, malicious code sitting in two release tarballs, was technically public from 24 February 2024, the day version 5.6.0 was released, but nobody detected it there. What was actually detected, twice, sat in the activity layer: memory-checking errors seen in Red Hat's distributions from 4 March, which the backdoor's author answered with a purported fix on 8 March and a reworked backdoor released as 5.6.1 on 9 March, and then, on 29 March, one engineer's own ssh sessions running measurably slower and burning more CPU than they should, alongside valgrind errors on the same machines, which he traced to liblzma and disclosed the same day (observation, S14 and the timeline reconstruction, as read by R-0001). The second of these is the signal that broke the case. The first was not passed over: it was answered, by the person who had planted the backdoor, with changes that took the symptom away (observation of what S14 and the timeline record; the phrase \"took the symptom away\" is interpretation). Of the two, only the second maps cleanly onto a surface in LH F02's table, Processing, task wall time; the first is a correctness signal from a memory sanitiser, and F02's activity surfaces, tuned to resource consumption, have no row for it (interpretation). Propagation followed only after disclosure gave residue a name: distributions that had already built the compromised tarball reverted their packages within a day, and the case became a CVE, several advisories and a still-cited timeline within the same week (observation, Findings). No instrument Lighthouse has registered or proposed sat at any of these observation points, and the outward instruments LH F02 already names, GH Archive and Open Source Insights, watch source forges and language package ecosystems, not the Linux distribution package pipelines this case actually propagated through (interpretation). Whether an undetected case of the same kind exists today cannot be answered from this one case; it can only say what made this one detectable, which is not the same thing (interpretation, Limits).",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The xz backdoor, read through Lighthouse's three layers",
      "explanation": {
        "path": "studies/LH004/LH004.md",
        "question": "What would Lighthouse’s three layers have shown during the documented xz backdoor event, and which carried the first detectable signal?",
        "summary": "In this retrospective case reading, malicious tarballs were public before recognition, while memory-checking errors and later ssh overhead supplied activity-layer signals. The earlier errors were answered by the backdoor’s author; the later investigation exposed the backdoor.",
        "limit": "This detected case cannot establish how many quieter cases go unseen; earlier dates rest partly on secondary reconstruction, and no Lighthouse instrument observed the event.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH004/LH004.md",
            "passage": "A compromised release of xz-utils, a compression library that several Linux distributions link into their ssh server through distribution-specific dependencies (see the last finding), carried a backdoor from a tarball built in February 2024 into several distributions' rolling repositories before anyone recognised it (observation, drawn from the sources in Findings). Reading the case through Lighthouse's three layers: the backdoor's residue, malicious code sitting in two release tarballs, was technically public from 24 February 2024, the day version 5.6.0 was released, but nobody detected it there. What was actually detected, twice, sat in the activity layer: memory-checking errors seen in Red Hat's distributions from 4 March, which the backdoor's author answered with a purported fix on 8 March and a reworked backdoor released as 5.6.1 on 9 March, and then, on 29 March, one engineer's own ssh sessions running measurably slower and burning more CPU than they should, alongside valgrind errors on the same machines, which he traced to liblzma and disclosed the same day (observation, S14 and the timeline reconstruction, as read by R-0001). The second of these is the signal that broke the case. The first was not passed over: it was answered, by the person who had planted the backdoor, with changes that took the symptom away (observation of what S14 and the timeline record; the phrase \"took the symptom away\" is interpretation). Of the two, only the second maps cleanly onto a surface in LH F02's table, Processing, task wall time; the first is a correctness signal from a memory sanitiser, and F02's activity surfaces, tuned to resource consumption, have no row for it (interpretation). Propagation followed only after disclosure gave residue a name: distributions that had already built the compromised tarball reverted their packages within a day, and the case became a CVE, several advisories and a still-cited timeline within the same week (observation, Findings). No instrument Lighthouse has registered or proposed sat at any of these observation points, and the outward instruments LH F02 already names, GH Archive and Open Source Insights, watch source forges and language package ecosystems, not the Linux distribution package pipelines this case actually propagated through (interpretation). Whether an undetected case of the same kind exists today cannot be answered from this one case; it can only say what made this one detectable, which is not the same thing (interpretation, Limits).",
            "line_start": 15,
            "line_end": 15,
            "sha256": "8b26b37f9b92c800dd8fc5bd6cbd90147d89e96404356855e628fa2f62276254",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH004/LH004.md#L15"
          },
          {
            "label": "Boundary",
            "path": "studies/LH004/LH004.md",
            "passage": "**Survivor bias, as LH F04 itself warns.** This is a case that was detected, and detected unusually well: an engineer who happened to run valgrind and idle micro-benchmarks as routine habit, on a rolling-release system close enough to the injection that the compromised library was still installed, with an overhead, roughly half a second per login, large enough to notice by feel rather than needing a dashboard. An undetected case would lack exactly these things: a habitually suspicious observer, a system still carrying the compromised version at the moment of use, and an overhead large enough to notice without instrumentation. This study cannot say how many such cases exist, nor whether a quieter one has already run its course undetected; it can say only what made this one visible, and that a much smaller overhead, or a target further from a technically curious user base, plausibly would not have been.",
            "line_start": 45,
            "line_end": 45,
            "sha256": "8b26b37f9b92c800dd8fc5bd6cbd90147d89e96404356855e628fa2f62276254",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH004/LH004.md#L45"
          },
          {
            "label": "Boundary",
            "path": "studies/LH004/LH004.md",
            "passage": "**The dates of the earlier signal rest on secondary reconstruction; the signal itself does not.** The 4 March start, the attribution of the first errors to Red Hat's distributions, and the dates and descriptions of the 8 and 9 March changes come from research.swtch.com's timeline, and the Fedora origin of the reports from one co-maintainer's own gist. S14, the primary disclosure, corroborates that the injected code caused valgrind errors and that 5.6.1 attempted to work around them, but gives no date for either and does not name where the errors were first seen. This study did not clone the xz-utils git history and check commit timestamps directly, so these dates are reported as the reconstruction's account, not independently confirmed.",
            "line_start": 47,
            "line_end": 47,
            "sha256": "8b26b37f9b92c800dd8fc5bd6cbd90147d89e96404356855e628fa2f62276254",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH004/LH004.md#L47"
          },
          {
            "label": "Boundary",
            "path": "studies/LH004/LH004.md",
            "passage": "**No Lighthouse instrument, registered or proposed, observed any part of this case.** Every instrument attribution in Findings is an interpretation about what an instrument would have recorded had one existed at that observation point at that time; none is an observation of an actual reading, because Lighthouse did not exist as an observatory in 2021 to 2024 and has no retroactive access to any host or build system involved.",
            "line_start": 53,
            "line_end": 53,
            "sha256": "8b26b37f9b92c800dd8fc5bd6cbd90147d89e96404356855e628fa2f62276254",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH004/LH004.md#L53"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH005/LH005.md",
      "path": "studies/LH005/LH005.md",
      "url": "/studies/LH005/LH005/",
      "kind": "study",
      "title": "Can any public record connect a software release to its installation?",
      "summary": "Partly, and only as far as the download. PyPI's public download record, read through ClickHouse's copy of it, connects a release to the files fetched from PyPI by version, day, installer and a self-reported CI flag. For mcp 1.27.0 it shows the release taken almost at once: 22.3 per cent of all mcp downloads on its release day, 1,639,539 of 7,351,271, in the nine hours after publication; 48.1 per cent the next day; between 45 and 71 per cent of every day's downloads from then to the window's end; 95,672,297 of the window's 219,899,536 mcp downloads in all (observation and derived measurement). By the time the first of LH002's dependents was seen pinning it, six days after publication, the release had been about half of all downloads for five days. What carried it to the downloaders was install-time resolution of open version ranges, mostly by uv (78.6 per cent of the window's downloads), not the dependents' pins (interpretation).",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Can any public record connect a software release to its installation?",
      "explanation": {
        "path": "studies/LH005/LH005.md",
        "question": "Can a public record connect a software release to its installation?",
        "summary": "Public copies of PyPI’s download log connect mcp 1.27.0 to fetched files and show it at about half of downloads by the next day. They reach the download, without establishing installation, execution or a link between one package’s download and another’s.",
        "limit": "Counts are the copies’ counts, checked against one another rather than against BigQuery; anonymous aggregate rows cannot link downloads into installations.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH005/LH005.md",
            "passage": "Partly, and only as far as the download. PyPI's public download record, read through ClickHouse's copy of it, connects a release to the files fetched from PyPI by version, day, installer and a self-reported CI flag. For `mcp` 1.27.0 it shows the release taken almost at once: 22.3 per cent of all `mcp` downloads on its release day, 1,639,539 of 7,351,271, in the nine hours after publication; 48.1 per cent the next day; between 45 and 71 per cent of every day's downloads from then to the window's end; 95,672,297 of the window's 219,899,536 `mcp` downloads in all (observation and derived measurement). By the time the first of LH002's dependents was seen pinning it, six days after publication, the release had been about half of all downloads for five days. What carried it to the downloaders was install-time resolution of open version ranges, mostly by `uv` (78.6 per cent of the window's downloads), not the dependents' pins (interpretation).",
            "line_start": 15,
            "line_end": 15,
            "sha256": "0a4e94e12de04954c12722b56b1bb598356d0de132a8d2e0c269b575ce073371",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH005/LH005.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH005/LH005.md",
            "passage": "The record reaches the download and stops there. A row is a file served by PyPI to a client that names itself. It is not an installation: mirrors, proxies and caches install many times from one download, and CI runs, `pip download` and scanners download without installing. It is never a run. It is aggregate and anonymous, so it cannot link one package's download to another's. lean-lsp-mcp 0.26.0 and 0.26.1, which pin `mcp==1.27.0` exactly, were downloaded 35,024 times from 8 to 29 April, 0.03 per cent of `mcp` 1.27.0's 109,023,441 on those days. The second hop LH002 found is real in the metadata and invisible in the downloads (derived measurement; interpretation).",
            "line_start": 17,
            "line_end": 17,
            "sha256": "0a4e94e12de04954c12722b56b1bb598356d0de132a8d2e0c269b575ce073371",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH005/LH005.md#L17"
          },
          {
            "label": "Boundary",
            "path": "studies/LH005/LH005.md",
            "passage": "**A copy, not the original.** Every count is ClickPy's, pypistats's or pepy's, not BigQuery's. The copies agree with each other to about one per cent in the window, which is evidence that none has drifted far, not proof that any matches the original.",
            "line_start": 75,
            "line_end": 75,
            "sha256": "0a4e94e12de04954c12722b56b1bb598356d0de132a8d2e0c269b575ce073371",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH005/LH005.md#L75"
          },
          {
            "label": "Boundary",
            "path": "studies/LH005/LH005.md",
            "passage": "**Aggregate and anonymous.** No field ties two downloads together, so co-installation, the second hop, and the share of downloads made by any one dependent's users cannot be measured.",
            "line_start": 81,
            "line_end": 81,
            "sha256": "0a4e94e12de04954c12722b56b1bb598356d0de132a8d2e0c269b575ce073371",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH005/LH005.md#L81"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH006/LH006.md",
      "path": "studies/LH006/LH006.md",
      "url": "/studies/LH006/LH006/",
      "kind": "study",
      "title": "Is there a public record of what was installed, past the download?",
      "summary": "Yes, in part: a published container image is a public record of installed state, and it reaches past the download to the installation, though not to a run. Inside each image's layers the installer's own record, a site-packages/mcp-<version>.dist-info directory, says which version of mcp was installed, and the image's configuration says when it was built. For the images read here that record could be read anonymously from the registry without pulling the image, by streaming the image's upper layers and stopping at the directory, between 25 and 211 MB of compressed data per image (observation; data/imagemcp.csv).",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Is there a public record of what was installed, past the download?",
      "explanation": {
        "path": "studies/LH006/LH006.md",
        "question": "Can a public record show what was installed, beyond the download?",
        "summary": "Published container layers exposed installed mcp versions: 38 images from six readable repositories yielded 37 with mcp and one without it. The build instructions could explain an image moving before its repository’s lockfile, while registry tag histories retained only part of the past.",
        "limit": "Images show packaged installations rather than runs; byte and registry allowances left images unread, and this selected neighbourhood does not represent installations at large.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH006/LH006.md",
            "passage": "Yes, in part: a published container image is a public record of installed state, and it reaches past the download to the installation, though not to a run. Inside each image's layers the installer's own record, a `site-packages/mcp-<version>.dist-info` directory, says which version of `mcp` was installed, and the image's configuration says when it was built. For the images read here that record could be read anonymously from the registry without pulling the image, by streaming the image's upper layers and stopping at the directory, between 25 and 211 MB of compressed data per image (observation; data/image_mcp.csv).",
            "line_start": 15,
            "line_end": 15,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH006/LH006.md",
            "passage": "The population is thin. Of the 37 packages in the frame (LH002's ten projects and the 34 direct dependents of `mcp` 1.27.0 that Open Source Insights lists), 7 name a published image of their own, and 6 of those could be read (observation; data/candidates.csv). In those six, 38 images were read to a result: 37 held an installed `mcp` and one, jesse's, held none (derived; data/image_timeline.csv). Three things came out of them that neither the download log nor git shows:",
            "line_start": 17,
            "line_end": 17,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L17"
          },
          {
            "label": "Answer",
            "path": "studies/LH006/LH006.md",
            "passage": "- **The installed version follows how the image is built, not the project's pin alone.** agentcrew's repository locked `mcp` 1.26.0 until 24 April, and LH002 counted it among the dependents that did not move. Its images held 1.27.0 from 8 April, 5.5 days after the release, because its Dockerfile installs from an open range (`mcp>=1.24.0`) rather than the lockfile. serena pins exactly and mcp-snowflake-server installs from its lockfile, and their images moved only when the pin did: serena 2.9 days after its git pin and 24.9 days after the release, mcp-snowflake-server 11 minutes after its pin and 34.1 days after the release. keboola's package pins exactly and it has no public repository; its images moved between two builds on 17 April, 14.9 days after the release, in a build of the package version whose PyPI release three days later is the first to require 1.27.0, so its move with its pin is inferred, not seen. octobot's images still held 1.26.0 in its next image, on 30 July (observation for versions and times; derived for the lags; interpretation for the cause).",
            "line_start": 19,
            "line_end": 19,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L19"
          },
          {
            "label": "Answer",
            "path": "studies/LH006/LH006.md",
            "passage": "- **A registry keeps what a tag used to point at only by accident.** Neither Docker Hub's nor ghcr.io's anonymous interfaces list the earlier digests of a tag. An earlier build stays visible only if another tag still names it, as agentcrew's first 0.12.3 build does; builds that only ever carried a moving tag, such as serena's `main`, leave nothing listed (observation of every field returned; derived).",
            "line_start": 21,
            "line_end": 21,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L21"
          },
          {
            "label": "Answer",
            "path": "studies/LH006/LH006.md",
            "passage": "The limits are as sharp. An image is an installation made to be run; nothing in a registry says whether, where or how often it ran, and a pull count or last-pulled time counts requests, including sweeps by some client that pulled 612 of keboola's tags on one day. Docker Hub's anonymous allowance, served here as 100 pulls an hour shared across the proxy's addresses, was exhausted by other traffic from 18:43:57 to at least 18:55:26 UTC, and with the study's own budget of 30 pulls it bounded what could be read (observation).",
            "line_start": 23,
            "line_end": 23,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L23"
          },
          {
            "label": "Boundary",
            "path": "studies/LH006/LH006.md",
            "passage": "- **Byte caps cut two repositories short.** agentcrew's installed environment sits in a 500 MB layer in which `mcp` appears after about 110 MB, and jesse's first image had to be read to the end (786 MB) to show it held no `mcp`. Both reached the 800 MB per-repository cap: agentcrew's 0.11.1 image and jesse's 1.13.9 are recorded as \"not determined\", jesse's 1.13.11 and 2.1.3 as configuration only. jesse 2.1.3, whose PyPI release requires `mcp==1.26.0`, would have been the one jesse image expected to hold it. The total, 2,960,812,225 bytes, stayed under the 3 GB cap.",
            "line_start": 97,
            "line_end": 97,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L97"
          },
          {
            "label": "Boundary",
            "path": "studies/LH006/LH006.md",
            "passage": "- **Not a run, and not a population.** Nothing here says an image was started. The six repositories are the images of a selected neighbourhood; frame A is selected on having taken 1.27.0 up at some point (studies/LH002/brief.md), and nothing here estimates how images at large take a release.",
            "line_start": 104,
            "line_end": 104,
            "sha256": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH006/LH006.md#L104"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH007/LH007.md",
      "path": "studies/LH007/LH007.md",
      "url": "/studies/LH007/LH007/",
      "kind": "study",
      "title": "When a widely used library releases, how much of the software built on it installs the new version because an installer resolved an open range, and how much waits for a maintainer to move a pin or lockfile?",
      "summary": "In this sample, the images that resolve an open range took the new release within days, and the images built from a lockfile or an exact pin took it only when the pin moved. For most of the lockfile and exact-pin repositories that was a month or more after the release, or had not happened by 15 August: of 12 such image repositories, 9 had no pin on the new release within four weeks of it, and the largest group of pin moves, four of the nine found, came within 28 hours of a security advisory published a month after the release rather than in the days after the release itself.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "When a widely used library releases, how much of the software built on it installs the new version because an installer resolved an open range, and how much waits for a maintainer to move a pin or lockfile?",
      "explanation": {
        "path": "studies/LH007/LH007.md",
        "question": "Do published images take a new library release through open ranges, or wait for a pin or lockfile to move?",
        "summary": "In the 13 readable image repositories, open-range builds generally took mcp 1.28.x within days, while pinned or locked builds held the named version until the pin moved. More first pins moved soon after the advisory evening than in the four weeks after release, a timing pattern rather than established causation.",
        "limit": "The 49 images are a small, clustered and selected sample, with much of Docker Hub left unread; images do not show runs or the installed population.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH007/LH007.md",
            "passage": "In this sample, the images that resolve an open range took the new release within days, and the images built from a lockfile or an exact pin took it only when the pin moved. For most of the lockfile and exact-pin repositories that was a month or more after the release, or had not happened by 15 August: of 12 such image repositories, 9 had no pin on the new release within four weeks of it, and the largest group of pin moves, four of the nine found, came within 28 hours of a security advisory published a month after the release rather than in the days after the release itself.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "8513ffa6188fab27b8ce065cdbe5d1d875ecc98684d6806096a88640fad25af1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH007/LH007.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH007/LH007.md",
            "passage": "The sample is the published images of the direct dependents of `mcp` that Open Source Insights lists around release 1.28.0 (16 June 2026), fixed by a hash-order rule before any image was read: 22 of 120 screened packages name an image of their own, and 13 image repositories gave an installed `mcp` version, 49 images in all (observation; data/candidates.csv, data/image_timeline.csv).",
            "line_start": 17,
            "line_end": 17,
            "sha256": "8513ffa6188fab27b8ce065cdbe5d1d875ecc98684d6806096a88640fad25af1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH007/LH007.md#L17"
          },
          {
            "label": "Answer",
            "path": "studies/LH007/LH007.md",
            "passage": "- **More first pins moved in the day after the advisory than in the four weeks after the release.** Of 13 projects whose first commit pinning or locking 1.28.x was found, six made it between 0.9 and 27.6 hours after GHSA-vj7q-gjh5-988w, a high-severity advisory fixed in 1.28.1, was published on 16 July at 20:14 UTC, 29.9 days after 1.28.0. It was the third high-severity advisory against `mcp` published that evening; the two before it, at 19:56 and 19:58 UTC, concern flaws fixed in 1.27.2 (data/osv_mcp_all.csv, read by the review). Four of the six commits were changes Dependabot wrote: three committed under its name and one merged by a person from its branch. One was made under a project's own bot account, with a person as co-author, in a change whose message says it upgrades FastMCP to version 3 and regenerates the lock; the sixth is a person's, citing the three advisories (observation of commits and the advisories' publication times; the causal link is interpretation from timing and commit messages). Three first pins moved in the four weeks after the release (days 0.7, 7.1 and 20.8) and four between days 40 and 57. Five sampled projects had no commit pinning or locking 1.28.x by 15 August (browser-use, hybrid-groups, modulector, alation's MCP server and mcp-standards-server).",
            "line_start": 22,
            "line_end": 22,
            "sha256": "8513ffa6188fab27b8ce065cdbe5d1d875ecc98684d6806096a88640fad25af1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH007/LH007.md#L22"
          },
          {
            "label": "Answer",
            "path": "studies/LH007/LH007.md",
            "passage": "The limits are sharp. The sample is small and clustered: 49 images from 13 repositories, many of them from better-telegram-mcp (10), mcp-proxy-for-aws (6) and mcp-mesh (7). The byte ceiling was reached before most Docker Hub images were read: of the seven Docker Hub repositories, including the largest projects (langflow, browser-use, jesse), only browser-use gave an installed version. Images are installations, not runs, and a published image is not the installed population.",
            "line_start": 26,
            "line_end": 26,
            "sha256": "8513ffa6188fab27b8ce065cdbe5d1d875ecc98684d6806096a88640fad25af1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH007/LH007.md#L26"
          },
          {
            "label": "Boundary",
            "path": "studies/LH007/LH007.md",
            "passage": "- **The advisory link is timing.** Six pins moved within 28 hours of the advisory; the Dependabot commit messages say \"Bump mcp from ... to 1.28.1\" and do not say whether they were security updates, though serena's was authored within four minutes of the third advisory; openroad-mcp's cites \"3 high-severity CVEs\" and names alerts matching the three advisories of that evening; mcp-atlassian's is a FastMCP migration whose regenerated lock carried `mcp` to 1.28.1. Three advisories were published within 18 minutes, so \"the advisory\" here means the set, and the one fixed only in 1.28.1 is what made 1.28.x, rather than 1.27.2, the version that cleared them all.",
            "line_start": 107,
            "line_end": 107,
            "sha256": "8513ffa6188fab27b8ce065cdbe5d1d875ecc98684d6806096a88640fad25af1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH007/LH007.md#L107"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH008/LH008.md",
      "path": "studies/LH008/LH008.md",
      "url": "/studies/LH008/LH008/",
      "kind": "study",
      "title": "When software built on a widely used library pins or locks it, what moves the pin: a new release, or a security advisory fixed by one?",
      "summary": "In this sample, pins and locks moved after both, and neither drew most of them. Across four libraries in the top 50 by downloads (urllib3, cryptography, pyjwt, starlette), 102 kept repository and library pairs held a version below a fix when it was released; 73 moved to the fix or later by 27 September, a median 18.7 days after the release (and, for the 54 that moved after the advisory, a median 10.5 days after it), 28 had not moved and one stopped pinning the library. The rate of moves rose in the two days after the release (8 moves, 4.1 per 100 repository-days) and again in the week after the advisory (8 moves in its first two days, 5.1; 14 in days two to seven, 4.3), against 1.3 to 1.7 per 100 repository-days from the third day after the release to the advisory and in the three weeks after the advisory's first week (derived measurement; data/hazard.csv, figure rates.svg). The release's spell lasted two days: from day two to day seven, stopping at the advisory where it came first, the rate was 1.5. No burst like LH007's appeared: 4 of the 102 moved within a day after the advisory, where LH007 found 6 of 13 mcp projects within 28 hours (observation; LH007 is one library and one evening).",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "When software built on a widely used library pins or locks it, what moves the pin: a new release, or a security advisory fixed by one?",
      "explanation": {
        "path": "studies/LH008/LH008.md",
        "question": "What moves a dependent’s pin: a new release or a security advisory?",
        "summary": "Across four libraries, 73 of 102 repository and library pairs moved to a fix or later, at a median 18.7 days after release. Moves rose after both releases and advisories; each two-day window contained eight moves, which cannot show which the advisory caused.",
        "limit": "A pin move is a repository request, without evidence of installation, execution or exposure; release notes were not read, so before the advisory need not mean before public notice of the fix.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH008/LH008.md",
            "passage": "In this sample, pins and locks moved after both, and neither drew most of them. Across four libraries in the top 50 by downloads (urllib3, cryptography, pyjwt, starlette), 102 kept repository and library pairs held a version below a fix when it was released; 73 moved to the fix or later by 27 September, a median 18.7 days after the release (and, for the 54 that moved after the advisory, a median 10.5 days after it), 28 had not moved and one stopped pinning the library. The rate of moves rose in the two days after the release (8 moves, 4.1 per 100 repository-days) and again in the week after the advisory (8 moves in its first two days, 5.1; 14 in days two to seven, 4.3), against 1.3 to 1.7 per 100 repository-days from the third day after the release to the advisory and in the three weeks after the advisory's first week (derived measurement; data/hazard.csv, figure rates.svg). The release's spell lasted two days: from day two to day seven, stopping at the advisory where it came first, the rate was 1.5. No burst like LH007's appeared: 4 of the 102 moved within a day after the advisory, where LH007 found 6 of 13 `mcp` projects within 28 hours (observation; LH007 is one library and one evening).",
            "line_start": 15,
            "line_end": 15,
            "sha256": "3820fbc12859a6e7465cac064ce3e3db13a66242408b6e39310f70f3f6e05a0f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH008/LH008.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH008/LH008.md",
            "passage": "What this does not say: which moves the advisory caused. The advisory's two days and the release's two days carry eight moves each, a count at which the difference between 4.1 and 5.1 is noise. A fixed release may say in its own notes that it fixes a security flaw before any advisory is published; this study did not read release notes, so \"before the advisory\" is not \"before anyone knew\" (interpretation). A move is a request in a repository, not an installation or a run, and no project here is said to have been exposed.",
            "line_start": 21,
            "line_end": 21,
            "sha256": "3820fbc12859a6e7465cac064ce3e3db13a66242408b6e39310f70f3f6e05a0f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH008/LH008.md#L21"
          },
          {
            "label": "Boundary",
            "path": "studies/LH008/LH008.md",
            "passage": "- **A move is a request.** It changes what the repository's next build or install would take; nothing here says what was installed, deployed or run, or whether any project was exposed to an advisory.",
            "line_start": 142,
            "line_end": 142,
            "sha256": "3820fbc12859a6e7465cac064ce3e3db13a66242408b6e39310f70f3f6e05a0f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH008/LH008.md#L142"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH009/LH009.md",
      "path": "studies/LH009/LH009.md",
      "url": "/studies/LH009/LH009/",
      "kind": "study",
      "title": "When a fixed release says in its own notes that it fixes a security flaw, do pinned dependents move to it before the advisory is published, more than they move to a fix released silently?",
      "summary": "In this sample, pinned dependents moved to an announced fix before its advisory at about 1.7 times the pace they moved to a silent one, but the same share of their moves came before the advisory, and the difference rests on few moves in few libraries. Of the 37 fixed releases behind LH008's 68 advisories, 19 said in their own changelog, tag or PyPI description, at or before the release, that they fixed a security flaw, and 18 did not (observation; data/fixclasses.csv). Taking each of LH008's 16 libraries' one event (eight announced, eight silent; seven of each had pinned dependents to follow), 257 repository and event pairs held an affected version when the fix came out, and 173 moved to it by 27 September (derived; data/summarybyclass.csv).",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "When a fixed release says in its own notes that it fixes a security flaw, do pinned dependents move to it before the advisory is published, more than they move to a fix released silently?",
      "explanation": {
        "path": "studies/LH009/LH009.md",
        "question": "Do pinned dependents move sooner before an advisory when the fix’s own notes announce the flaw?",
        "summary": "The selected announced fixes had about 1.7 times the pooled pre-advisory move rate of silent fixes, while similar shares of moves came before the advisory. Few libraries and moves carried the difference, so the pattern cannot distinguish an effect of the notes from differences between libraries’ users.",
        "limit": "One release per library confounds class with library; unread release pages could contain announcements, so silent means silent only in the sources read.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH009/LH009.md",
            "passage": "In this sample, pinned dependents moved to an announced fix before its advisory at about 1.7 times the pace they moved to a silent one, but the same share of their moves came before the advisory, and the difference rests on few moves in few libraries. Of the 37 fixed releases behind LH008's 68 advisories, 19 said in their own changelog, tag or PyPI description, at or before the release, that they fixed a security flaw, and 18 did not (observation; data/fix_classes.csv). Taking each of LH008's 16 libraries' one event (eight announced, eight silent; seven of each had pinned dependents to follow), 257 repository and event pairs held an affected version when the fix came out, and 173 moved to it by 27 September (derived; data/summary_by_class.csv).",
            "line_start": 15,
            "line_end": 15,
            "sha256": "2350246f9b3d9f5845540bae14a93f110af1e7f2a79c23fc1dc3083494406534",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH009/LH009.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH009/LH009.md",
            "passage": "What this does not say (interpretation). With one release per library, class and library cannot be separated: the announced class's lead before the advisory comes mostly from gitpython (8 moves, 6 of them in its first two days, four of those Renovate's) and pyjwt (10 moves over a 25-day gap), and the days-two-to-seven difference is 13 moves against 5, three of the 13 in one organisation's repositories on one morning. The pattern fits people reading an announced fix's notes and moving within the week, while bots move both classes on the same schedule; it fits equally a difference between the libraries' users. \"Silent\" means silent in the three sources the rule reads: GitHub's release pages, where litellm, mcp and langchain may put their notes, were refused, and those three releases had no notes in any source read. A move is a request in a repository, not an installation or a run, and no project here is said to have been exposed.",
            "line_start": 22,
            "line_end": 22,
            "sha256": "2350246f9b3d9f5845540bae14a93f110af1e7f2a79c23fc1dc3083494406534",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH009/LH009.md#L22"
          },
          {
            "label": "Boundary",
            "path": "studies/LH009/LH009.md",
            "passage": "- **Class is library.** Each library gives one release, so every difference between the classes is also a difference between seven libraries and seven others: their users, their bots, how often their dependents update. gitpython's dependents moved fastest of all (median 5.3 days) and carry 8 of the announced class's 29 moves before the advisory; pyjwt's 25-day gap carries 10. Leaving out any one event keeps the announced class ahead, but not by much when gitpython is left out (1.84 against 1.13 to 1.68).",
            "line_start": 91,
            "line_end": 91,
            "sha256": "2350246f9b3d9f5845540bae14a93f110af1e7f2a79c23fc1dc3083494406534",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH009/LH009.md#L91"
          },
          {
            "label": "Boundary",
            "path": "studies/LH009/LH009.md",
            "passage": "- **Silent in the sources read.** GitHub's release pages were refused (HTTP 403, every one), and three silent events (litellm, mcp, langchain) have no notes in the changelog, the description or the tag, so they may have announced the fix on GitHub or elsewhere. Security mailing lists, blogs and social media were not read. litellm's repository held a release-notes page for v1.83.0 for three weeks after the release, not at the tag or the head; its security words concern the March supply-chain incident.",
            "line_start": 93,
            "line_end": 93,
            "sha256": "2350246f9b3d9f5845540bae14a93f110af1e7f2a79c23fc1dc3083494406534",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH009/LH009.md#L93"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH010/LH010.md",
      "path": "studies/LH010/LH010.md",
      "url": "/studies/LH010/LH010/",
      "kind": "study",
      "title": "Do pinned dependents move faster before the advisory to fixes whose notes announce a security flaw than to silent ones, when each class has enough libraries that no one or two carry the result?",
      "summary": "The study does not settle the question. Before the advisory, pinned dependents moved to announced fixes at a higher pooled rate than to silent ones under every clock and every restriction tried, but with the library as the unit the brief's classes cannot be told apart under any of them (only the strict class under a clock chosen after the fact reaches p < 0.05; \"How many comparisons\" below), and under the brief's own clock the pooled lead's uncertainty spans no difference. The top 500 projects gave 43 libraries with a qualifying event, not the 40 or more the design needed: 22 announced and 21 silent, of which 18 announced and 12 silent had pinned dependents to follow (observation; brief.md amendment 1, data/summarybyclass.csv). Their 209 repository and event pairs gave 142 moves by 27 September. Version 0.3 reanalysed the retained evidence after every outcome was known (outcome-aware and post hoc, not preregistered; Findings, \"Reanalysis of retained evidence, version 0.3\"); the first three bullets are version 0.2's figures, unchanged, with one interval added.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Do pinned dependents move faster before the advisory to fixes whose notes announce a security flaw than to silent ones, when each class has enough libraries that no one or two carry the result?",
      "explanation": {
        "path": "studies/LH010/LH010.md",
        "question": "Does the announced-fix lead hold when more libraries contribute and each library counts once?",
        "summary": "The study leaves the question unsettled: pooled pre-advisory moves favour announced fixes, but the typical libraries cannot be told apart and the brief-clock pooled interval spans no difference. Later clocks and restrictions are outcome-aware, post hoc readings rather than confirmed findings.",
        "limit": "Only 18 announced and 12 silent libraries had pinned dependents, short of the planned 20 each; the widening reuses earlier cases and is not a replication, and inaccessible notes are missing evidence.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH010/LH010.md",
            "passage": "The study does not settle the question. Before the advisory, pinned dependents moved to announced fixes at a higher pooled rate than to silent ones under every clock and every restriction tried, but with the library as the unit the brief's classes cannot be told apart under any of them (only the strict class under a clock chosen after the fact reaches p < 0.05; \"How many comparisons\" below), and under the brief's own clock the pooled lead's uncertainty spans no difference. The top 500 projects gave 43 libraries with a qualifying event, not the 40 or more the design needed: 22 announced and 21 silent, of which 18 announced and 12 silent had pinned dependents to follow (observation; brief.md amendment 1, data/summary_by_class.csv). Their 209 repository and event pairs gave 142 moves by 27 September. Version 0.3 reanalysed the retained evidence after every outcome was known (outcome-aware and post hoc, not preregistered; Findings, \"Reanalysis of retained evidence, version 0.3\"); the first three bullets are version 0.2's figures, unchanged, with one interval added.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH010/LH010.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH010/LH010.md",
            "passage": "- **Pooled over pairs, by the brief's clock** (derived; data/hazard_by_class.csv). From the release to the event's advisory, 2.30 moves per 100 repository-days at risk for announced fixes (35 moves over 1,522.4 repository-days) against 1.57 for silent ones (20 over 1,273.4), a ratio of 1.46; LH009 had 2.36 against 1.36. A library-clustered bootstrap (10,000 resamples of libraries within each class, seed 20260927; added in version 0.3) puts the ratio's 95 per cent interval at 0.52 to 3.96. Leaving out any one library, the announced rate stays between 2.04 and 3.73 and the silent between 1.41 and 1.95. In days two to seven after the release, stopping at the advisory, 3.34 (11 moves) against 2.29 (5), ratio 1.46, interval 0.43 to 6.17.",
            "line_start": 17,
            "line_end": 17,
            "sha256": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH010/LH010.md#L17"
          },
          {
            "label": "Boundary",
            "path": "studies/LH010/LH010.md",
            "passage": "- **Too few libraries.** The design asked for 20 libraries a class with pinned dependents; the top 500 projects and five months of advisories gave 18 and 12. Many fixes followed their release before by days, and Open Source Insights lists few or no dependents for such a release, so the frame rule loses exactly the libraries that release often.",
            "line_start": 225,
            "line_end": 225,
            "sha256": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH010/LH010.md#L225"
          },
          {
            "label": "Boundary",
            "path": "studies/LH010/LH010.md",
            "passage": "- **Outcome-aware reanalysis.** Every reading in version 0.3 (the two new clocks, the notes restriction, the bootstrap) was chosen after version 0.2's outcomes were known, and the reanalysis makes 36 overlapping comparisons with no correction; the few intervals and p values that exclude no difference are all under readings chosen after the fact. The notes-evidence rule was written after the retained texts had been read for it.",
            "line_start": 227,
            "line_end": 227,
            "sha256": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH010/LH010.md#L227"
          },
          {
            "label": "Boundary",
            "path": "studies/LH010/LH010.md",
            "passage": "- **Silent in the sources read.** Eight silent events have no notes in the changelog at the tag, the description or the annotation, and a ninth (fastmcp) had notes only 64 days after its release; version 0.3 separates these nine (state c, insufficient accessible notes) from the twelve silent events whose notes were read and carry no announcement (state b). \"Silent\" in version 0.2 and in every table before the reanalysis covers both. GitHub's release pages were not requested, since LH009 found every one refused, and such projects often write their notes only there, so a c state is missing evidence, not silence. Security mailing lists, blogs and social media were not read.",
            "line_start": 229,
            "line_end": 229,
            "sha256": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH010/LH010.md#L229"
          },
          {
            "label": "Boundary",
            "path": "studies/LH010/LH010.md",
            "passage": "- **Not independent of LH009.** 12 of the 43 events, ten of them among the 30 libraries with pairs, are LH008's releases with LH009's class and LH008's or LH009's frames, so LH010 is a widening of LH009, not a replication of it.",
            "line_start": 233,
            "line_end": 233,
            "sha256": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH010/LH010.md#L233"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH011/LH011.md",
      "path": "studies/LH011/LH011.md",
      "url": "/studies/LH011/LH011/",
      "kind": "study",
      "title": "When one of the most downloaded Python projects releases a new version, does it reach half of the project's downloads within two days as a rule, and how much of its early uptake carries the build-server flag, compared with the release it replaces?",
      "summary": "For some projects, not as a rule, by the brief's convention; and the new release's early downloads carry the build-server flag less often than the old release's on the same days, by about seven percentage points.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "When one of the most downloaded Python projects releases a new version, does it reach half of the project's downloads within two days as a rule, and how much of its early uptake carries the build-server flag, compared with the release it replaces?",
      "explanation": {
        "path": "studies/LH011/LH011.md",
        "question": "Do releases of the most downloaded Python projects reach half of downloads within two days, and how does their early CI flag compare with the replaced version?",
        "summary": "For 26 of 37 releasing projects, most releases reached half of downloads within two days, counting each release or any later one: 70.3 per cent (95 per cent interval 54.1 to 83.8), below the brief’s 75 per cent rule. New releases’ early pip and uv downloads carried the CI flag less often than replaced releases, with a median project difference of 6.6 percentage points below.",
        "limit": "The interval spans the brief’s 75 per cent boundary; downloads weight frequent uncached fetches rather than uptake by people or projects, while the CI flag provides only a floor on builds.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH011/LH011.md",
            "passage": "Of the 37 projects among the 50 most downloaded that released a new newest version between April and August 2026, 26 had most of their releases reach half of the project's downloads, counting that release or any later one, on the first or second day after release: 70.3 per cent, with a project-resampled 95 per cent interval of 54.1 to 83.8 per cent (derived measurement). The brief's convention calls 75 per cent or more \"as a rule\" and below 50 per cent \"not as a rule\", so 70.3 per cent reads \"for some projects\"; the interval includes 75 and excludes 50. The split is sharp rather than graded: 21 projects had every release reach half, 11 had none, and five were mixed. Where it happened it happened fast, usually on the first full day. Where it did not, the new release's share was between 2 and 34 per cent on the day after release (project medians), moved little over the month, to between 2 and 37 per cent by day 30, litellm's rising most, from 9.5 to 21, and, for ten of the eleven, never reached half within 30 days (derived measurement). Pooled over releases rather than projects, only 127 of 424 releases (30.0 per cent) reached half within two days, because the three projects that release almost daily, boto3, botocore and litellm, account for 252 releases and none of theirs did.",
            "line_start": 17,
            "line_end": 17,
            "sha256": "ddd50890c3b8aed0846098cd2256f7df028d83a08d16707c4d354cdb117e0162",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH011/LH011.md#L17"
          },
          {
            "label": "Answer",
            "path": "studies/LH011/LH011.md",
            "passage": "For one release a project a month (104 releases, all 37 projects), a median of 32.2 per cent of a new release's pip and uv downloads over its first three days carried the CI flag, against 40.7 per cent of the replaced release's on the same days (medians of project medians). Every project's median difference, the median over its releases of the new share minus the replaced share, was below zero; the median of project medians was -6.6 percentage points (95 per cent interval -11.4 to -5.0), and 96 of 104 releases had the new release below the old. For the three daily releasers, boto3, botocore and litellm, whose per-release differences took both signs, the median difference was just below zero while the median new-release share was a little above the median replaced share, so the two summaries do not point the same way there; the difference of medians is not the measure the brief fixed. The flag's meaning was read from pip's and uv's own source: both send true when one of four CI variables is set and nothing otherwise, so it is a floor on builds, not a measure of them. LH005's one case, `mcp` 1.27.0, had 10.6 per cent of its downloads flagged against 48.6 per cent of the previous release's, a gap of 38 points, larger than any project's median here (at most 30); it was measured over 3 to 22 April and over all installers, not over days 0 to 2 and pip and uv, so the two are not the same measure (interpretation).",
            "line_start": 19,
            "line_end": 19,
            "sha256": "ddd50890c3b8aed0846098cd2256f7df028d83a08d16707c4d354cdb117e0162",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH011/LH011.md#L19"
          },
          {
            "label": "Boundary",
            "path": "studies/LH011/LH011.md",
            "passage": "**A share of downloads is a share of fetches.** Each row counts a file served, so an environment that installs from scratch many times a day, such as a build that keeps no cache, counts as many times as it fetches, while one that caches, or sits behind a mirror, counts once or not at all. A version's share is weighted towards environments that fetch often and without a cache: a low share is not by itself slow uptake by people or projects, and a high share is not broad uptake (interpretation, added in version 0.3).",
            "line_start": 82,
            "line_end": 82,
            "sha256": "ddd50890c3b8aed0846098cd2256f7df028d83a08d16707c4d354cdb117e0162",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH011/LH011.md#L82"
          },
          {
            "label": "Boundary",
            "path": "studies/LH011/LH011.md",
            "passage": "**The flag is a floor on builds.** pip and uv flag CI only when one of four variables is set; builds without them, including most container builds outside a CI service, are counted as not flagged. The rule was read for four versions; ClickPy drops the installer version, so older pip and uv versions were assumed to follow it. The 1.7 per cent of downloads by other installers were left out of the CI share.",
            "line_start": 84,
            "line_end": 84,
            "sha256": "ddd50890c3b8aed0846098cd2256f7df028d83a08d16707c4d354cdb117e0162",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH011/LH011.md#L84"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH012/LH012.md",
      "path": "studies/LH012/LH012.md",
      "url": "/studies/LH012/LH012/",
      "kind": "study",
      "title": "After a new release of one of the most downloaded Python libraries, what keeps older versions downloaded, and which explanations can the public record rule out: other libraries' version bounds, Pythons the new release no longer supports, or environments rebuilt from frozen lists?",
      "summary": "Pythons the newer releases no longer support are ruled out as the main reason for older downloads as a rule: for 32 of the 37 projects (86.5 per cent, project-resampled 95 per cent interval 75.7 to 97.3), less than half of the downloads on versions older than the release of a month before came from a Python that every newer release excludes, even counting downloads with no Python reported as excluded (derived measurement, on the Python the installer reports). For three projects such downloads are most of the older downloads, the brief's class \"accounts for most\": boto3 (76.3 to 77.0 per cent), aiobotocore (63.0 to 63.5) and numpy (62.5 to 66.7); the question stays open for pandas and urllib3. That class counts fetches that could not have been of R or later; it does not say why they were of the versions they were. For boto3 and aiobotocore few were at the highest version their Python admits, where a fresh install lands (6.7 and 0.6 per cent; numpy 56.7). Read after version 0.2 was released (post hoc, below), their count-by-version profiles are flat for long runs of versions below each Python's edge (for boto3 on Python 3.9, about a hundred at one level and several hundred at the next), the shape an installer's resolution walk leaves when it fetches each version it tries and rejects; on that reading most of those downloads were versions inspected and discarded, not installed (interpretation, untested). Identified bounds, the requirements that the 500 most downloaded projects declare, are in the brief's class \"accounts for most\" for four tightly coupled projects: pydantic-core (held by pydantic's exact pin), fsspec (by s3fs), and botocore and s3transfer (by boto3). B is an estimate under the co-fetch assumption, that each fetch of a held dependent version brings one fetch of the project, and the log does not observe that, since it counts each project's fetches separately; so the class says what identified bounds could account for, not what they did. The log's own ratios strain the assumption for botocore and s3transfer, boto3 being fetched 2.94 and 3.88 times as often as they are (7.51 times botocore on Python 3.9), and are most consistent with it for pydantic-core, whose dependent is fetched about as often (1.05 times) and whose older fetches sit largely at the one version pydantic's newest releases pin. Only for pydantic-core do the dependent's current versions carry a large part of the hold (53.2 per cent); for fsspec, botocore and s3transfer the hold comes from s3fs's and boto3's older versions, which moves the question to why those are fetched. On the same assumption, identified bounds are ruled out as the main reason for seven projects; they are undetermined for 26, mostly because requirements the log cannot resolve (extras, platform markers, versions not read) leave the upper estimate near one. Environments rebuilt from frozen lists cannot be counted in the log, as the brief said in advance; 18 of the 37 projects show their trace (most older downloads off every version a fresh install on the identified constraints would land on, and more often flagged CI than new downloads). So for most projects the public record rules out the Python explanation, cannot rule identified bounds in or out, and leaves what remains unmeasured, consistent with frozen lists but not shown to be them.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "After a new release of one of the most downloaded Python libraries, what keeps older versions downloaded, and which explanations can the public record rule out: other libraries' version bounds, Pythons the new release no longer supports, or environments rebuilt from frozen lists?",
      "explanation": {
        "path": "studies/LH012/LH012.md",
        "question": "What keeps older Python library versions downloaded, and which explanations can the public record rule out?",
        "summary": "Unsupported Pythons cannot account for most older downloads in 32 of 37 projects; identified dependency bounds remain undetermined for 26, and frozen lists are consistent with a trace rather than measured. A separate test found day-30 shares within ten points of day 2 for most releases in 28 of 32 projects, while shares usually continued rising within that band.",
        "limit": "Bounds are estimates under an unobserved co-fetch assumption; the post hoc resolver-walk reading is untested, and the download log cannot establish which fetched candidates were installed.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH012/LH012.md",
            "passage": "Pythons the newer releases no longer support are ruled out as the main reason for older downloads as a rule: for 32 of the 37 projects (86.5 per cent, project-resampled 95 per cent interval 75.7 to 97.3), less than half of the downloads on versions older than the release of a month before came from a Python that every newer release excludes, even counting downloads with no Python reported as excluded (derived measurement, on the Python the installer reports). For three projects such downloads are most of the older downloads, the brief's class \"accounts for most\": boto3 (76.3 to 77.0 per cent), aiobotocore (63.0 to 63.5) and numpy (62.5 to 66.7); the question stays open for pandas and urllib3. That class counts fetches that could not have been of R or later; it does not say why they were of the versions they were. For boto3 and aiobotocore few were at the highest version their Python admits, where a fresh install lands (6.7 and 0.6 per cent; numpy 56.7). Read after version 0.2 was released (post hoc, below), their count-by-version profiles are flat for long runs of versions below each Python's edge (for boto3 on Python 3.9, about a hundred at one level and several hundred at the next), the shape an installer's resolution walk leaves when it fetches each version it tries and rejects; on that reading most of those downloads were versions inspected and discarded, not installed (interpretation, untested). Identified bounds, the requirements that the 500 most downloaded projects declare, are in the brief's class \"accounts for most\" for four tightly coupled projects: pydantic-core (held by pydantic's exact pin), fsspec (by s3fs), and botocore and s3transfer (by boto3). B is an estimate under the co-fetch assumption, that each fetch of a held dependent version brings one fetch of the project, and the log does not observe that, since it counts each project's fetches separately; so the class says what identified bounds could account for, not what they did. The log's own ratios strain the assumption for botocore and s3transfer, boto3 being fetched 2.94 and 3.88 times as often as they are (7.51 times botocore on Python 3.9), and are most consistent with it for pydantic-core, whose dependent is fetched about as often (1.05 times) and whose older fetches sit largely at the one version pydantic's newest releases pin. Only for pydantic-core do the dependent's current versions carry a large part of the hold (53.2 per cent); for fsspec, botocore and s3transfer the hold comes from s3fs's and boto3's older versions, which moves the question to why those are fetched. On the same assumption, identified bounds are ruled out as the main reason for seven projects; they are undetermined for 26, mostly because requirements the log cannot resolve (extras, platform markers, versions not read) leave the upper estimate near one. Environments rebuilt from frozen lists cannot be counted in the log, as the brief said in advance; 18 of the 37 projects show their trace (most older downloads off every version a fresh install on the identified constraints would land on, and more often flagged CI than new downloads). So for most projects the public record rules out the Python explanation, cannot rule identified bounds in or out, and leaves what remains unmeasured, consistent with frozen lists but not shown to be them.",
            "line_start": 16,
            "line_end": 16,
            "sha256": "bea4f31914de0ac1115ce8a836add4ea5f07f33a69ead5826d2bf454d5d5c4ef",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH012/LH012.md#L16"
          },
          {
            "label": "Answer",
            "path": "studies/LH012/LH012.md",
            "passage": "The first-day observation holds as a rule on releases no earlier study read: for 28 of the 32 projects with a release between November 2025 and March 2026 (87.5 per cent, interval 75.0 to 96.9), most releases' at-or-newer share on day 30 was within ten points of day 2. Within the band the share went on rising: it was higher on day 30 than on day 2 in 339 of the 355 releases (median 7.15 points, raised by the 238 releases of the three projects that release on most working days; 3.02 without them), and the median release rose for 31 of the 32 projects, by 3.2 points for the median project, so to settle is to stay within ten points, not to stop (a reading made after the counts, found by a replay in studies/LH016; version 0.4, review/v04_checks.txt). The band is absolute: by the brief's secondary descriptor, the ratio of the day-2 to the day-30 share, boto3's and aiobotocore's median releases held only 0.60 and 0.58 of their day-30 share on day 2, their shares being small (reported from version 0.3; firstday_releases.csv, summarised in review/r0018_check.txt, B).",
            "line_start": 18,
            "line_end": 18,
            "sha256": "bea4f31914de0ac1115ce8a836add4ea5f07f33a69ead5826d2bf454d5d5c4ef",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH012/LH012.md#L18"
          },
          {
            "label": "Boundary",
            "path": "studies/LH012/LH012.md",
            "passage": "**A download can be a version the installer tried and rejected.** A resolver that fetches each candidate it tries counts every one as a download; the log marks none of them. The profiles of boto3's, aiobotocore's and grpcio-status's older downloads have that shape (post hoc, above), so their older shares, and P for boto3 and aiobotocore, may count inspections rather than installations.",
            "line_start": 86,
            "line_end": 86,
            "sha256": "bea4f31914de0ac1115ce8a836add4ea5f07f33a69ead5826d2bf454d5d5c4ef",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH012/LH012.md#L86"
          },
          {
            "label": "Boundary",
            "path": "studies/LH012/LH012.md",
            "passage": "**B rests on the co-fetch assumption, and the log strains it.** B treats each fetch of a held dependent version as bringing one fetch of the project. The log records each project's fetches separately and never links one fetch to another, so B is a modelled estimate, never an observed count of held fetches, and its classes say what identified bounds could account for. Where the dependent is fetched far more often than the project (boto3 is 2.94 times botocore and 3.88 times s3transfer, and 7.51 times botocore on Python 3.9), the lower estimate can reach one without the dependent's environments carrying that many of the project's fetches; the guard checks only that the project's older fetches sit at versions the held dependent admits. \"Accounts for most\" for botocore and s3transfer should be read with that ratio.",
            "line_start": 88,
            "line_end": 88,
            "sha256": "bea4f31914de0ac1115ce8a836add4ea5f07f33a69ead5826d2bf454d5d5c4ef",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH012/LH012.md#L88"
          },
          {
            "label": "Boundary",
            "path": "studies/LH012/LH012.md",
            "passage": "**Frozen lists are not measured.** The trace is a description consistent with frozen lists and with unidentified bounds and pins; nothing here counts environments rebuilt from lists.",
            "line_start": 98,
            "line_end": 98,
            "sha256": "bea4f31914de0ac1115ce8a836add4ea5f07f33a69ead5826d2bf454d5d5c4ef",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH012/LH012.md#L98"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH013/LH013.md",
      "path": "studies/LH013/LH013.md",
      "url": "/studies/LH013/LH013/",
      "kind": "study",
      "title": "Over the two weeks after LH012's, do the 37 libraries' older shares and Python exclusion hold, how much of each library's downloads falls in its single largest combination of reported fields, and does the flat, walk-like shape of some libraries' older downloads hold?",
      "summary": "The study ran. Its eligibility condition was met: on 2 November 2026 at 15:30 UTC, LH012's coverage query found 1 November 2026 as the last day held for every one of the 37 projects in all five per-day tables, and the preflight of 22 October had already found 21 October, so ClickPy held 12 October well before 31 October. When it first held that day the source cannot say (Method). Every day of both weeks was held for every project, no day was a gap, and W0's totals, read again, equalled LH012's to the download for all 37.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Over the two weeks after LH012's, do the 37 libraries' older shares and Python exclusion hold, how much of each library's downloads falls in its single largest combination of reported fields, and does the flat, walk-like shape of some libraries' older downloads hold?",
      "explanation": {
        "path": "studies/LH013/LH013.md",
        "question": "Do older-download shares, Python exclusion and concentrated download profiles hold over the next two weeks?",
        "summary": "Over three adjacent weeks, older shares stayed within five points for 32 of 37 projects and Python-exclusion classes held for 35 of 37; the largest reported-field cells generally held across the two new weeks. All four tests of the earlier post hoc boto3 readings held on those new weeks, while interpreting the flat profile as a resolver walk remains unproven.",
        "limit": "Holding does not explain downloads: a reported-field cell is not a machine or a population, and these adjacent weeks cannot establish longer-term stability or identify installer versions.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH013/LH013.md",
            "passage": "Over these three adjacent weeks, what stays behind held from week to week, as a rule, on every measure the brief tests (derived measurements, counts of fetches). A project's older share O, at the reference release R0 held fixed from LH012, stayed within 5 points of W0 in both new weeks for 32 of 37 projects (86.5 per cent, project-resampled 95 per cent interval 75.7 to 97.3); the five that moved further were aiohttp, fsspec, litellm, numpy and pydantic-core, all downwards. The median project's O was 37.3, 36.6 and 36.7 per cent in W0, W1 and W2. The class of Python exclusion P held for 35 of 37 (94.6 per cent, 86.5 to 100): boto3, aiobotocore and numpy stayed \"accounts for most\" in both weeks (boto3 76.9 to 78.3 per cent across the weeks' estimates), and the two that changed, pandas and urllib3, were the two \"undetermined\" in W0 and moved to \"cannot be the main reason\" as their upper estimates slipped under one half.",
            "line_start": 18,
            "line_end": 18,
            "sha256": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH013/LH013.md#L18"
          },
          {
            "label": "Answer",
            "path": "studies/LH013/LH013.md",
            "passage": "Downloads are concentrated in few combinations of reported fields. The largest cell of six fields (Python minor, installer, system, libc, CI flag, country) held the median project's 10.2 and 10.1 per cent of downloads in W1 and W2, and nine cells together carried half for the median project; boto3's largest cell, Python 3.9, pip, Linux, glibc, no CI flag, US, held 61.1 and 61.3 per cent of all its downloads, and with country set aside 64.9 and 64.8 per cent. C held, same cell and within 5 points, for 33 of 37 (89.2 per cent, 78.4 to 97.3), and C5, without country, for 29 of 37 (78.4 per cent, 64.9 to 91.9, an interval that reaches below the three quarters the label needs). Read after the counts (post hoc, over the twelve cases where the largest cell changed): in ten of them the two largest cells were within 2.1 points of each other in both weeks and within 0.8 in at least one, so these changes are near ties changing places; the other two are litellm's, whose largest cell passed from pip to uv. A cell is not a machine, an owner or a population.",
            "line_start": 20,
            "line_end": 20,
            "sha256": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH013/LH013.md#L20"
          },
          {
            "label": "Answer",
            "path": "studies/LH013/LH013.md",
            "passage": "All four tests of LH012's post hoc readings held, on two weeks no Lighthouse study had read, for the one library they concern. boto3's downloads reporting Python 3.9 were 65.3 and 65.1 per cent of its downloads (test: above one half); Python 3.9 fetched boto3 7.16 and 8.04 times as often as botocore, against 2.73 and 2.92 over all Pythons (test: at least twice); 95.2 and 95.5 per cent of boto3's Python 3.9 downloads were below 1.42.97 (test: above three quarters); and boto3's Python 3.9 profile below 1.42.97 stayed flat, flatness 0.0007 and 0.0005 against 0.001 in W0 (test: below 0.05). The staircase kept its shape (median counts per block of twenty versions, described, not tested): about 850,000 to 900,000 a version for the first hundred versions from the edge down, then about 520,000 to 550,000 for the next four hundred, then about 106,000 to 127,000, and 1.42.87 stayed at about half its neighbours (0.53 and 0.55, 0.55 in W0). That these are a resolver's walk stays an interpretation: the log cannot say which installer versions made them, and whether it counts requests for metadata files is still not known. Holding is not explanation; nothing here says who or what makes these downloads.",
            "line_start": 22,
            "line_end": 22,
            "sha256": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH013/LH013.md#L22"
          },
          {
            "label": "Boundary",
            "path": "studies/LH013/LH013.md",
            "passage": "**A download is a fetch, and a cell is not a machine.** Every share weights environments by how often they fetch. A cell that holds its values and size from week to week has not been shown to be the same machines; many unrelated machines can share one, and one machine can fall in several.",
            "line_start": 77,
            "line_end": 77,
            "sha256": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH013/LH013.md#L77"
          },
          {
            "label": "Boundary",
            "path": "studies/LH013/LH013.md",
            "passage": "**Two adjacent weeks.** W1 and W2 follow W0 directly. Holding over three consecutive weeks says nothing of longer stretches, of other seasons, or of what a change in one large population would do.",
            "line_start": 79,
            "line_end": 79,
            "sha256": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH013/LH013.md#L79"
          },
          {
            "label": "Boundary",
            "path": "studies/LH013/LH013.md",
            "passage": "**Unknown stays unknown.** When ClickPy first held 12 October 2026 cannot be read from the source; the record knows only that it was held by 03:59 UTC on 22 October. Whether the download log counts requests for PEP 658 metadata files is not stated on either page read, so which pips can leave a walk in the log is not settled; which installer versions make the flat profiles needs the installer's version, which ClickPy does not hold.",
            "line_start": 85,
            "line_end": 85,
            "sha256": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH013/LH013.md#L85"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH014/LH014.md",
      "path": "studies/LH014/LH014.md",
      "url": "/studies/LH014/LH014/",
      "kind": "study",
      "title": "Below the fifty most downloaded Python projects, does a new newest version reach half of its project's downloads within two days as a rule, and does its share settle by day 2?",
      "summary": "Not as a rule in either band, by the brief's convention; the share of projects whose new releases mostly reached half of downloads within two days falls from the top fifty to each band below it. The share of a new release still settles by day 2 as a rule in band A, and for some projects in band B.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Below the fifty most downloaded Python projects, does a new newest version reach half of its project's downloads within two days as a rule, and does its share settle by day 2?",
      "explanation": {
        "path": "studies/LH014/LH014.md",
        "question": "Below the top fifty Python projects, do releases reach half of downloads within two days, and do their shares settle by day 2?",
        "summary": "The two-day majority held for 25 of 52 releasing projects drawn from ranks 51 to 500 and 9 of 35 from ranks 501 to 5,000, below the brief’s rule in both bands. The ten-point day-2 to day-30 band held for 39 of 50 and 23 of 35 projects respectively.",
        "limit": "These are samples of 80 projects per band beside a top-fifty census, and the first band’s interval crosses the one-half boundary; rank is descriptive rather than causal, and fetch shares are not direct uptake measures.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH014/LH014.md",
            "passage": "For projects ranked 51 to 500 in ClickPy's August 2026 downloads (band A), 25 of the 52 drawn projects with a release between April and August 2026 had most of their releases reach half of the project's downloads, counting that release or any later one, on the first or second day after release: 48.1 per cent, with a project-resampled 95 per cent interval of 34.6 to 61.5 (derived measurement). For projects ranked 501 to 5,000 (band B), 9 of 35: 25.7 per cent, 11.4 to 40.0. The brief's convention calls a share below one half \"not as a rule\", so both bands read \"not as a rule\"; band A's interval includes one half, so in another draw it could read \"for some projects\". Beside them, as a description and not a test, LH011's top fifty: 26 of 37, 70.3 per cent, 54.1 to 83.8. Pooled over releases, 114 of 295 releases in band A (38.6 per cent) and 38 of 196 in band B (19.4 per cent) reached half within two days, against 127 of 424 (30.0 per cent) in the top fifty, where three near-daily releasers weigh on the pooled figure.",
            "line_start": 17,
            "line_end": 17,
            "sha256": "23dc4d74a4852b7aa1e8266fe1d4d9f318dd3d3306139b40e55b9f4d2d8c9965",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH014/LH014.md#L17"
          },
          {
            "label": "Answer",
            "path": "studies/LH014/LH014.md",
            "passage": "LH012's settling test (the at-or-newer share on day 30 within ten points of day 2 for most of a project's releases) held for 39 of 50 projects in band A, 78.0 per cent (66.0 to 88.0), \"holds as a rule\", and for 23 of 35 in band B, 65.7 per cent (51.4 to 80.0), \"holds for some projects\" (derived measurement). Beside them, LH012 found 28 of 32 top-fifty projects settling on November to March releases, and 35 of 37 on LH011's April to August releases as a description.",
            "line_start": 19,
            "line_end": 19,
            "sha256": "23dc4d74a4852b7aa1e8266fe1d4d9f318dd3d3306139b40e55b9f4d2d8c9965",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH014/LH014.md#L19"
          },
          {
            "label": "Boundary",
            "path": "studies/LH014/LH014.md",
            "passage": "**A download is a fetch.** Each row is a file PyPI served; an environment that installs from scratch many times a day counts as often as it fetches, and one behind a cache or mirror once or not at all. A low share is not by itself slow uptake by people or projects (LH011, Limits).",
            "line_start": 73,
            "line_end": 73,
            "sha256": "23dc4d74a4852b7aa1e8266fe1d4d9f318dd3d3306139b40e55b9f4d2d8c9965",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH014/LH014.md#L73"
          },
          {
            "label": "Boundary",
            "path": "studies/LH014/LH014.md",
            "passage": "**Two samples beside a census.** The top fifty is every project with a release among the fifty most downloaded; each band is 80 projects drawn at random, of which 52 and 35 released. The intervals, thirteen to fourteen points either side, carry the sampling; band A's primary share, 48.1 per cent, sits just below the one-half line its interval crosses, and its settling share, 78.0 per cent (75.6 without the overlap projects), just above the three-quarter line. The groups differ in many ways besides rank: the gradient is a description, not a cause.",
            "line_start": 75,
            "line_end": 75,
            "sha256": "23dc4d74a4852b7aa1e8266fe1d4d9f318dd3d3306139b40e55b9f4d2d8c9965",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH014/LH014.md#L75"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH015/LH015.md",
      "path": "studies/LH015/LH015.md",
      "url": "/studies/LH015/LH015/",
      "kind": "study",
      "title": "At the snapshots LH008 to LH010 timed, does a pinned repository keep a container recipe, and does that recipe install its Python requirements from the file that held the pin or lock, or resolve them afresh?",
      "summary": "P1. 247 of the 469 pairs, 52.7 per cent (95 per cent interval 45.9 to 59.3), keep at least one container recipe at the snapshot: for some pairs, by the brief's convention, with an interval that spans the one-half boundary (derived measurement). In the repository view the share is 45.3 per cent (40.1 to 50.8), not as a rule, a different label, also spanning the boundary; 151 of the 332 repositories keep a recipe at one of their snapshots and 150 at every one.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "At the snapshots LH008 to LH010 timed, does a pinned repository keep a container recipe, and does that recipe install its Python requirements from the file that held the pin or lock, or resolve them afresh?",
      "explanation": {
        "path": "studies/LH015/LH015.md",
        "question": "Do pinned repositories’ container recipes install from the file holding the timed pin or lockfile?",
        "summary": "Of 469 timed pairs, 247 kept a container recipe; among 167 decided pairs, 129 had recipes instructing builds to install requirements from the pinned file, including 21 of 37 lockfile-only pairs. More than a quarter of recipe pairs were undetermined, so the brief’s labels for these shares are withheld.",
        "limit": "A recipe is a set of instructions rather than an observed build; no image or run was read, and whether the target library is installed at all is unresolved.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH015/LH015.md",
            "passage": "**P1.** 247 of the 469 pairs, 52.7 per cent (95 per cent interval 45.9 to 59.3), keep at least one container recipe at the snapshot: **for some pairs**, by the brief's convention, with an interval that spans the one-half boundary (derived measurement). In the repository view the share is 45.3 per cent (40.1 to 50.8), **not as a rule**, a different label, also spanning the boundary; 151 of the 332 repositories keep a recipe at one of their snapshots and 150 at every one.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "8869ed32eaa031064e617505ea19e85536ef6dae092ba0f369560c191f2841eb",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH015/LH015.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH015/LH015.md",
            "passage": "**P2.** Of the 167 pairs whose recipes the rules decide, 129, 77.2 per cent (68.6 to 84.4), are **from the pinned file**: some build installs L's version from a timed file and no other build takes it elsewhere. The label this share would carry, \"as a rule\", **does not stand**: undetermined pairs are 68 of the 247 with a recipe (27.5 per cent, above the brief's one fifth), and the two undetermined bounds carry different labels, 83.8 per cent \"as a rule\" with every undetermined pair counted as from the pinned file and 54.9 per cent \"for some pairs\" with every one counted as not. By pin class, with every label withheld for the same reason: lockfile 21 of 37, 56.8 per cent (37.8 to 75.0; bounds 79.5 and 26.9 per cent); exact pin 63 of 77, 81.8 per cent (68.9 to 91.0; bounds 83.9 and 72.4); both 45 of 53, 84.9 per cent (72.9 to 94.3; bounds 88.6 and 64.3). The repository view gives 70.2 per cent overall (61.5 to 78.4), which would read \"for some pairs\".",
            "line_start": 17,
            "line_end": 17,
            "sha256": "8869ed32eaa031064e617505ea19e85536ef6dae092ba0f369560c191f2841eb",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH015/LH015.md#L17"
          },
          {
            "label": "Answer",
            "path": "studies/LH015/LH015.md",
            "passage": "**What the classes mean.** A class is a reading of a recipe's instructions: what a build from it would be told to install, from which file, with the context the brief's rules fix. A recipe is not a build. No registry or image was read, so nothing here shows that any image exists, which recipe, if any, makes the images anyone runs, or what an image holds. Whether a build installs L at all (through extras, groups, markers or another package) is not resolved: \"from the pinned file\" means a step installs the project's requirements from a timed file that pins or locks L, and \"not from the pinned file\" means no step does and some step installs the project's requirements from elsewhere.",
            "line_start": 19,
            "line_end": 19,
            "sha256": "8869ed32eaa031064e617505ea19e85536ef6dae092ba0f369560c191f2841eb",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH015/LH015.md#L19"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH016/LH016.md",
      "path": "studies/LH016/LH016.md",
      "url": "/studies/LH016/LH016/",
      "kind": "study",
      "title": "In the research rounds of 28 and 29 September 2026, which steps of Lighthouse's research and review workflow changed what its pieces and records say, what kind of change did each make, at what cost, and what reached release uncaught?",
      "summary": "Who changed what a claim means. In the six rounds of 28 and 29 September 2026 (LH011 to LH015), 125 changes were made to the pieces, their public surfaces and their records while a step of the workflow ran, and 66 of them changed what a careful reader of a public surface would believe (tier A in the codebook the brief fixed before any change was coded; derived measurement). The evidence review made the most, 23 in six rounds, and 13 of those were figures or how sure a sentence sounded. Changes to what a claim meant, what a count counts, what caused what, or a new reading, came mostly from outside review that the keeper relayed after two pieces' release, readings from outside the workflow's own steps, whether the keeper's own or another reviewer's (5 of its 8; step K, which version 0.1 called the keeper's reading) and from the reader-and-inference review's second stage (8 of its 17), and seldom from the evidence review (4 of its 23); this grouping of the codebook's types was made after the counts. All 8 of the relayed review's changes, and 15 of stage 2's 17, altered text that an evidence review had read and passed. The repository records who relayed each such reading, not who or what produced it, and by the account of Astra, a reviewer outside the workflow, in a report the keeper relayed after release, much of it was Astra's analysis, so nothing here compares a person's reading with an agent's.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "In the research rounds of 28 and 29 September 2026, which steps of Lighthouse's research and review workflow changed what its pieces and records say, what kind of change did each make, at what cost, and what reached release uncaught?",
      "explanation": {
        "path": "studies/LH016/LH016.md",
        "question": "Which research and review steps changed Lighthouse’s claims, at what cost, and what passed through to release?",
        "summary": "Across six rounds, 66 of 125 recorded changes altered what readers would believe: evidence review most often changed figures or certainty, while changes to meaning came mostly from reader review and outside review relayed after release, a grouping made after the counts. Eight of ten public-claim changes at recheck corrected text just written to resolve an earlier review.",
        "limit": "The study counts changes rather than truth; step order and differing texts prevent ranking reviewers by their counts or costs, and relayed review’s authorship and cost are known only in part.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH016/LH016.md",
            "passage": "**Who changed what a claim means.** In the six rounds of 28 and 29 September 2026 (LH011 to LH015), 125 changes were made to the pieces, their public surfaces and their records while a step of the workflow ran, and 66 of them changed what a careful reader of a public surface would believe (tier A in the codebook the brief fixed before any change was coded; derived measurement). The evidence review made the most, 23 in six rounds, and 13 of those were figures or how sure a sentence sounded. Changes to what a claim meant, what a count counts, what caused what, or a new reading, came mostly from outside review that the keeper relayed after two pieces' release, readings from outside the workflow's own steps, whether the keeper's own or another reviewer's (5 of its 8; step K, which version 0.1 called the keeper's reading) and from the reader-and-inference review's second stage (8 of its 17), and seldom from the evidence review (4 of its 23); this grouping of the codebook's types was made after the counts. All 8 of the relayed review's changes, and 15 of stage 2's 17, altered text that an evidence review had read and passed. The repository records who relayed each such reading, not who or what produced it, and by the account of Astra, a reviewer outside the workflow, in a report the keeper relayed after release, much of it was Astra's analysis, so nothing here compares a person's reading with an agent's.",
            "line_start": 16,
            "line_end": 16,
            "sha256": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH016/LH016.md#L16"
          },
          {
            "label": "Answer",
            "path": "studies/LH016/LH016.md",
            "passage": "**Fixes need checking.** Text written to resolve a check carried problems of its own. 8 of the recheck's 10 public-claim changes corrected text written minutes before in response to a review, six of the eight sentences stage 2's resolution had introduced and half of the eight a new reading stated more broadly or surely than its evidence, or mislabelled; and 6 of the 7 changes the evidence review made to LH011's revision corrected text written after the relayed reading (derived; a reading made after the counts, from a literal search of each round's starting text).",
            "line_start": 18,
            "line_end": 18,
            "sha256": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH016/LH016.md#L18"
          },
          {
            "label": "Answer",
            "path": "studies/LH016/LH016.md",
            "passage": "**Cost.** At list rates, estimated from transcripts: the evidence review $30.41 over six rounds, $1.32 per public-claim change it made, and $1.94 in the three rounds where the reader review also ran; the reader review with its recheck $22.47 over three rounds, $0.83; the blind check, run once, $7.24 for 3 public-claim changes and 5 to the record; the relayed review an unknown cost, which version 0.1 gave as none, since who or what produced it was not recorded. The steps read different texts in a fixed order, so a later step's count is what it added after the others, not what it would find alone, and changes differ in importance: these figures describe these rounds, and they do not rank the steps or say where to spend.",
            "line_start": 24,
            "line_end": 24,
            "sha256": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH016/LH016.md#L24"
          },
          {
            "label": "Boundary",
            "path": "studies/LH016/LH016.md",
            "passage": "- **Changes, not truth.** The study counts what each step changed and whether the change moved the text towards the retained evidence, as the first coder judged it; it does not say whether any claim is now right, and it cannot see an error no step changed.",
            "line_start": 112,
            "line_end": 112,
            "sha256": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH016/LH016.md#L112"
          },
          {
            "label": "Boundary",
            "path": "studies/LH016/LH016.md",
            "passage": "- **Order and credit.** The steps ran in one order on texts earlier steps had left, so a step's count is what it added in its place. No step ran without the others, and nothing here measures what the workflow would have released without a given step, except the replays and the corrections after release.",
            "line_start": 113,
            "line_end": 113,
            "sha256": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH016/LH016.md#L113"
          },
          {
            "label": "Boundary",
            "path": "studies/LH016/LH016.md",
            "passage": "- **What the history holds.** The clone starts at db300e2, so the first drafts of 26 September are read only through the notes. The keeper's own words are not in the repository; what the keeper asked is taken from the revision commits and the close-outs. Nor does the history say who produced the readings the keeper relayed: step K records the route, and Astra's account, which the keeper relayed after release (review/relayed-review-astra-2026-09-29.md), is that much of that analysis was Astra's, so K's author and cost are known only in part, and K is not a person's reading (version 0.2).",
            "line_start": 116,
            "line_end": 116,
            "sha256": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH016/LH016.md#L116"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH017/LH017.md",
      "path": "studies/LH017/LH017.md",
      "url": "/studies/LH017/LH017/",
      "kind": "study",
      "title": "At the snapshots LH008 to LH010 timed, does some job in a pinned project's CI workflows install the library's version from the file that held the pin or lock, and in particular from the lockfile, including where the project's own container recipe leaves that file unread?",
      "summary": "P1. 395 of the 469 pairs, 84.2 per cent (95 per cent interval 79.7 to 88.3), keep at least one GitHub Actions or GitLab CI job at the snapshot: as a rule, by the brief's convention (derived measurement). In the repository view the share is 81.5 per cent (77.3 to 85.5), the same label; 271 of the 332 repositories keep CI at one of their snapshots and 270 at every one. 5 more pairs keep only another CI system's files (counted, not classed), and 69 keep none.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "At the snapshots LH008 to LH010 timed, does some job in a pinned project's CI workflows install the library's version from the file that held the pin or lock, and in particular from the lockfile, including where the project's own container recipe leaves that file unread?",
      "explanation": {
        "path": "studies/LH017/LH017.md",
        "question": "Do pinned projects’ CI jobs install from the timed pin or lockfile, including where container recipes leave it unread?",
        "summary": "Of 469 timed pairs, 395 kept CI; instructions showed some job would take the timed pinned file in 282 of 291 decided pairs, and the timed lockfile itself in 164 of 188. In 83 of those 164 pairs, all lock-reading jobs used commands that could re-lock, and lockfile-only pairs’ pin-reading share carries no label because too many are undetermined.",
        "limit": "A workflow is instructions rather than a run; some-job counts differ from recipes’ every-build rule, and the comparison under a shared rule was made after the counts.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Answer",
            "path": "studies/LH017/LH017.md",
            "passage": "**P1.** 395 of the 469 pairs, 84.2 per cent (95 per cent interval 79.7 to 88.3), keep at least one GitHub Actions or GitLab CI job at the snapshot: **as a rule**, by the brief's convention (derived measurement). In the repository view the share is 81.5 per cent (77.3 to 85.5), the same label; 271 of the 332 repositories keep CI at one of their snapshots and 270 at every one. 5 more pairs keep only another CI system's files (counted, not classed), and 69 keep none.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L15"
          },
          {
            "label": "Answer",
            "path": "studies/LH017/LH017.md",
            "passage": "**P2.** Of the 291 pairs whose CI the rules decide, 282, 96.9 per cent (94.4 to 98.9), have **some job that installs L's version from a timed file**: **as a rule** (derived measurement); 50 pairs are undetermined, 14.7 per cent of the pairs whose CI installs the project's requirements or is undetermined, below the brief's one fifth, so the label stands. By pin class: exact pin 94 of 95, 98.9 per cent (96.4 to 100), **as a rule**; both 91 of 92, 98.9 per cent (96.3 to 100), **as a rule**; lockfile 97 of 104, 93.3 per cent (87.5 to 97.7), **no label**: undetermined pairs are 31 of 135 of that class's frame, 23.0 per cent, above one fifth, and the two undetermined bounds read \"as a rule\" (94.8 per cent) and \"for some pairs\" (71.9 per cent). The repository view gives 96.4 per cent overall (93.8 to 98.6) and 91.0 per cent for lockfile pairs.",
            "line_start": 17,
            "line_end": 17,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L17"
          },
          {
            "label": "Answer",
            "path": "studies/LH017/LH017.md",
            "passage": "**P3.** Of the 188 pairs with a timed lockfile whose CI is decided for the lock, 164, 87.2 per cent (80.2 to 93.3), have **some job that installs L's version from the timed lockfile itself**: **as a rule** (derived measurement). Undetermined pairs are 41 of 229, 17.9 per cent, below one fifth; with every one counted as not reading the lock the share would be 71.6 per cent (\"for some pairs\"), and as reading it 89.5 per cent. The repository view gives 87.5 per cent (81.8 to 92.8). **Half of these rest on commands that could re-lock:** in 83 of the 164 pairs every job that reads the timed lock does so through `uv run` or `uv sync` without `--locked` or `--frozen` (or a bare `pipenv install`, `pdm install` or hatch-pip-compile), which keep the locked versions unless the project's own constraints exclude them (LH015's D4); counted as resolving afresh, as the brief's sensitivity does, the share is 81 of 161, 50.3 per cent (38.6 to 60.9). Counted by this study's pair rule, some container build read the timed lock at 71 pairs, and at 14 of them every such build did so only through such commands (at 6 of the 45 that LH015's own rule decides), by LH015's flags: a comparison made after the counts, for the figure, and not tested (post hoc; Finding 14).",
            "line_start": 19,
            "line_end": 19,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L19"
          },
          {
            "label": "Answer",
            "path": "studies/LH017/LH017.md",
            "passage": "**Beside the container recipes (described, not tested).** LH015 counts a pair \"from the pinned file\" only when every build that installs the project's requirements is class 1, where this study counts a pair that reads the pin when any job is; the comparisons in this paragraph are the ones the brief fixed, with LH015's classes as they stand, and Finding 14 sets the two kinds of build side by side under one rule, after the counts. For the pairs with a timed lockfile that both studies decide, a container build read the timed lock in 40 and did not in 25 (LH015's `reads_T_lock`); of those 25, a CI job read it in 20. Of LH015's 38 pairs \"not from the pinned file\", CI reads the pin in 21 of the 24 this study decides; of the 7 pairs whose recipe left a timed lock unused, CI reads it in 4 of the 5 decided. Of the 222 pairs with no recipe, 131 are decided and CI reads the pin in 126; 59 keep neither a recipe nor CI. Counting both kinds of build, a container build or a CI job installs from the pinned file at 321 of the 469 pairs (68.4 per cent, 62.1 to 74.6); of the 413 pairs where the two readings together decide it, neither does at 92 (22.3 per cent, 17.4 to 27.4), 59 of them with no recipe and no CI; at the 56 pairs outside the 413, a recipe or CI is undetermined and neither reads the pin.",
            "line_start": 21,
            "line_end": 21,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L21"
          },
          {
            "label": "Answer",
            "path": "studies/LH017/LH017.md",
            "passage": "**What the classes mean.** A class is a reading of a workflow's instructions: what a job would be told to install, from which file, in the working directory the rules fix. A workflow is a recipe for a run, not a record of one: nothing here shows that a job ran, how often, on which events, with a cache that made no download, or against which index. \"Reads the pin\" means that some job's install step takes L's version from a timed file, whatever other jobs do; whether a job installs L at all (extras, groups, markers, another package) is not resolved. The study shows that a road runs from the pin to installs of the kind the download log's CI flag marks, for almost every one of these projects that keeps CI; it does not show how many of the log's older downloads come down that road, nor whether older downloads are frozen lists rather than unread bounds or an installer's resolution walk.",
            "line_start": 23,
            "line_end": 23,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L23"
          },
          {
            "label": "Boundary",
            "path": "studies/LH017/LH017.md",
            "passage": "- A workflow is not a run. Nothing here says which jobs run, how often, with what cache or against which index; a job under an `if:` is read as if it runs (6 pairs read the pin only through such steps), and jobs are counted alike whether they test, lint, publish or run once a year.",
            "line_start": 69,
            "line_end": 69,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L69"
          },
          {
            "label": "Boundary",
            "path": "studies/LH017/LH017.md",
            "passage": "- LH015's pair rule asks of every build what this study's asks of any job, so the two studies' shares compare only when put under one rule (Finding 14): under either, the workflows read the timed lockfile more often than the recipes, and under LH015's they install from the pin no more often.",
            "line_start": 75,
            "line_end": 75,
            "sha256": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH017/LH017.md#L75"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH018/LH018.md",
      "path": "studies/LH018/LH018.md",
      "url": "/studies/LH018/LH018/",
      "kind": "study",
      "title": "Which public records show the emergency PHP fix moving downstream?",
      "summary": "At this first snapshot, all three preselected distribution package tracks had vendor records naming a fixed revision for both CVE-2026-109618 and CVE-2026-109619. Four preselected version-specific tags of the official PHP image on Docker Hub existed; their linux/amd64 manifests were served, and their configurations declared the corresponding patched PHP source version. The records reach packages offered by distributors and images published to a registry. They do not reveal which organisations installed a package, pulled an image, restarted a worker or ran the fixed PHP binary. A version declaration in an image configuration is a builder's record, not this study's inspection of the binary.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Which public records show the emergency PHP fix moving downstream?",
      "explanation": {
        "path": "studies/LH018/LH018.md",
        "question": "Which public records show the emergency PHP fix moving downstream?",
        "summary": "Three selected distribution tracks named vendor-fixed revisions for both emergency flaws, and four selected official image configurations declared fixed PHP source versions at the first snapshot. These are package and registry records, not installed or running PHP.",
        "limit": "The image tags were chosen for known fixed version names; this snapshot supplies no adoption rate or common hours-to-patch clock.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH018/LH018.md",
            "passage": "# Which public records show the emergency PHP fix moving downstream?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "94acd203442c4059e954d34874aab5f6aa0b770bfc6f5346b72cfa5f2eaa2d18",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH018/LH018.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH018/LH018.md",
            "passage": "At this first snapshot, all three preselected distribution package tracks had vendor records naming a fixed revision for **both** CVE-2026-109618 and CVE-2026-109619. Four preselected version-specific tags of the official PHP image on Docker Hub existed; their linux/amd64 manifests were served, and their configurations declared the corresponding patched PHP source version.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "94acd203442c4059e954d34874aab5f6aa0b770bfc6f5346b72cfa5f2eaa2d18",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH018/LH018.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH018/LH018.md",
            "passage": "This selected snapshot does not give a patch-adoption rate. Every image tag was chosen because its **name** incorporated a known fixed version; the question there was whether and when the named build appeared, not how much of PHP use it represents.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "94acd203442c4059e954d34874aab5f6aa0b770bfc6f5346b72cfa5f2eaa2d18",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH018/LH018.md#L9"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH019/LH019.md",
      "path": "studies/LH019/LH019.md",
      "url": "/studies/LH019/LH019/",
      "kind": "study",
      "title": "What do the official PHP moving image tags name over time?",
      "summary": "At the first reading, each of four preselected moving tags in the official PHP Docker Hub repository named the same linux/amd64 manifest digest as its LH018 version-specific, same-variant counterpart. Each manifest and configuration blob was retrieved, its content verified against its SHA-256 digest, and the configuration declared the corresponding fixed PHP source version. The moving tags were first observed after their current manifests had been pushed. This baseline cannot say whether they briefly named older images after the fix release, when a pointer changed, whether the built executable is patched, or whether anyone pulled or ran an image.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "What do the official PHP moving image tags name over time?",
      "explanation": {
        "path": "studies/LH019/LH019.md",
        "question": "What do the official PHP moving image tags name over time?",
        "summary": "All four moving tags initially matched their selected fixed-version images and still matched on 22 October. Later rate-limited reads saw two changed digests, but verified the rebuilt PHP declaration only for 8.5; the other two tags were unknown after 22 October.",
        "limit": "Publication and equal observed endpoints do not establish continuous tag history, patched executable behaviour, pulls or deployments.",
        "state": "Closed",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH019/LH019.md",
            "passage": "# What do the official PHP moving image tags name over time?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "235abfd06e9a1477e320d9ecd8043b15164602b87718e66296fc451ac7223064",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH019/LH019.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH019/LH019.md",
            "passage": "**At close, 30 October 2026.** At the 22 October checkpoint all four tags still named the same linux/amd64 digests. The 24 and 28 October checkpoints were cut short by the registry's rate limit (HTTP 429), so they cover one and two tags. `8.5-apache` named the same digest on 24 October and a new one on 28 October (pushed 28 October 03:54 UTC), whose configuration still declares PHP 8.5.12, so it was rebuilt on the same PHP release; `8.4-fpm`'s tag record named a new digest on 28 October (pushed 04:05 UTC), whose manifest was refused, so its declared version is not read. `8.3-cli` and `8.2-fpm` are unknown after 22 October. Nothing read shows a moving tag pointing back to an older PHP release; what else changed in the rebuilds is not read.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "235abfd06e9a1477e320d9ecd8043b15164602b87718e66296fc451ac7223064",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH019/LH019.md#L9"
          },
          {
            "label": "Limit",
            "path": "studies/LH019/LH019.md",
            "passage": "A later unchanged digest says only that the two observed endpoints match; it cannot rule out a change and reversal between visits. If a later digest differs, the change lies somewhere between the two observations. Missing responses remain unknown.",
            "line_start": 30,
            "line_end": 30,
            "sha256": "235abfd06e9a1477e320d9ecd8043b15164602b87718e66296fc451ac7223064",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH019/LH019.md#L30"
          },
          {
            "label": "State",
            "path": "studies/LH019/LH019.md",
            "passage": "**Status:** closed; the brief's four checkpoints are taken, the last two partial.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "235abfd06e9a1477e320d9ecd8043b15164602b87718e66296fc451ac7223064",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH019/LH019.md#L3"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH019/checkpoints/2026-10-24.md",
          "url": "/studies/LH019/checkpoints/2026-10-24/",
          "title": "2026-10-24"
        },
        {
          "path": "studies/LH019/checkpoints/2026-10-28.md",
          "url": "/studies/LH019/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH020/LH020.md",
      "path": "studies/LH020/LH020.md",
      "url": "/studies/LH020/LH020/",
      "kind": "study",
      "title": "Which public records connect PHP's security notice to its official image publication?",
      "summary": "The public record gives a dated path from an early issue in the PHP image-maintainer repository, through two explicitly linked pull requests, their reviews and CI, to images later observed on Docker Hub. It is more than a list of advisories: the second PR names the first, and the official-images test rerun reports 68 successful jobs. It is less than a complete build or adoption history: LH020 did not inspect Docker's intermediate meta and staging records, and neither a CI success nor a registry image says anyone installed or ran it. A public issue at 07:17 UTC documents communication in one selected venue, not the first notice to any maintainer or a count of readers.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Which public records connect PHP's security notice to its official image publication?",
      "explanation": {
        "path": "studies/LH020/LH020.md",
        "question": "Which public records connect PHP's security notice to its official image publication?",
        "summary": "A selected retrospective chain links a maintainer issue, two explicitly linked pull requests and successful publisher tests to subsequently observed images. Intermediate staging and build records were not read, and communication or CI success does not establish adoption.",
        "limit": "This known chain is one coordinated episode; its distinct source clocks give descriptive intervals, not causal build durations or readership.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH020/LH020.md",
            "passage": "# Which public records connect PHP's security notice to its official image publication?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "32e241699318bb4c9174e1b1b0410645455c6fc3cbf2b9520dbf4cb7bf1eac2a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH020/LH020.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH020/LH020.md",
            "passage": "The public record gives a dated path from an early issue in the PHP image-maintainer repository, through two explicitly linked pull requests, their reviews and CI, to images later observed on Docker Hub. It is more than a list of advisories: the second PR names the first, and the official-images test rerun reports 68 successful jobs. It is less than a complete build or adoption history: LH020 did not inspect Docker's intermediate `meta` and staging records, and neither a CI success nor a registry image says anyone installed or ran it.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "32e241699318bb4c9174e1b1b0410645455c6fc3cbf2b9520dbf4cb7bf1eac2a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH020/LH020.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH020/LH020.md",
            "passage": "These source and release PRs were known before the protocol. This is a retrospective selected case. Their explicit references show documented linkage, not who learned from whom, why they acted or how far the information spread outside these repositories. The 07:17 issue is not asserted to be the earliest public mention.",
            "line_start": 27,
            "line_end": 27,
            "sha256": "32e241699318bb4c9174e1b1b0410645455c6fc3cbf2b9520dbf4cb7bf1eac2a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH020/LH020.md#L27"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH021/LH021.md",
      "path": "studies/LH021/LH021.md",
      "url": "/studies/LH021/LH021/",
      "kind": "study",
      "title": "What can public PHP consumer image repositories show of a rebuild?",
      "summary": "The public records can show selected projects' PHP base-image instructions and that workflows ran at the sampled commit. In this precommitted three-repository sample, the deterministic four-file cap found three literal FROM php: lines for WordPress and four for Drupal; for Nextcloud it selected four unrelated proxy example Dockerfiles. Each repository's ten most recent run records included two successful runs at its sampled head SHA. None of those observations says which base digest a job resolved, whether it pulled layers, whether an image was published or deployed, or whether the patch prompted a change. The Nextcloud result is a coverage failure of this file-selection rule, not evidence that Nextcloud does not use PHP.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "What can public PHP consumer image repositories show of a rebuild?",
      "explanation": {
        "path": "studies/LH021/LH021.md",
        "question": "What can public PHP consumer image repositories show of a rebuild?",
        "summary": "A fixed three-repository source check found literal PHP base instructions for WordPress and Drupal and successful workflows at sampled heads. The deterministic cap selected unrelated proxy examples for Nextcloud, a coverage failure rather than evidence against PHP use.",
        "limit": "A moving source instruction or successful workflow does not reveal the resolved base digest, publication, deployment or a patch response.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH021/LH021.md",
            "passage": "# What can public PHP consumer image repositories show of a rebuild?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "01d6708fdbf9339f0a9676f7f8460350f559f790ffb47f8c7390d9fbbc4b16b6",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH021/LH021.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH021/LH021.md",
            "passage": "In this precommitted three-repository sample, the deterministic four-file cap found three literal `FROM php:` lines for WordPress and four for Drupal; for Nextcloud it selected four unrelated proxy example Dockerfiles. Each repository's ten most recent run records included two successful runs at its sampled head SHA.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "01d6708fdbf9339f0a9676f7f8460350f559f790ffb47f8c7390d9fbbc4b16b6",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH021/LH021.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH021/LH021.md",
            "passage": "None of those observations says which base digest a job resolved, whether it pulled layers, whether an image was published or deployed, or whether the patch prompted a change. The Nextcloud result is a coverage failure of this file-selection rule, not evidence that Nextcloud does not use PHP.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "01d6708fdbf9339f0a9676f7f8460350f559f790ffb47f8c7390d9fbbc4b16b6",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH021/LH021.md#L7"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH022/LH022.md",
      "path": "studies/LH022/LH022.md",
      "url": "/studies/LH022/LH022/",
      "kind": "study",
      "title": "Drupal production-image link: a selection failure",
      "summary": "The preselected exact 11.3-php8.3-fpm tag was absent from the current official-images library/drupal manifest. Under the fixed rule there is no selected derivative, so this case cannot link a production recipe, base digest or image artifact. The study stops at selection. It does not classify Drupal's uptake.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Drupal production-image link: a selection failure",
      "explanation": {
        "path": "studies/LH022/LH022.md",
        "question": "Can a Drupal image build be linked to the fixed PHP base?",
        "summary": "The exact preselected Drupal tag was absent from the publisher manifest, so the case stopped at selection without linking a production recipe, resolved base or derived artifact. An alternative tag noticed afterwards was not substituted.",
        "limit": "The failed exact-tag rule does not show Drupal lacked an 8.3 image or classify its uptake.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH022/LH022.md",
            "passage": "# Drupal production-image link: a selection failure",
            "line_start": 1,
            "line_end": 1,
            "sha256": "4c8eaace021c2f93d1c36d2d72ac91dc1a260b3d1658bd60bf6d2e514e639f48",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH022/LH022.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH022/LH022.md",
            "passage": "The preselected exact `11.3-php8.3-fpm` tag was absent from the current official-images `library/drupal` manifest. Under the fixed rule there is no selected derivative, so this case cannot link a production recipe, base digest or image artifact. The study stops at selection. It does not classify Drupal's uptake.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "4c8eaace021c2f93d1c36d2d72ac91dc1a260b3d1658bd60bf6d2e514e639f48",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH022/LH022.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH022/LH022.md",
            "passage": "This is a failed exact-tag rule, not evidence that the repository lacks an 8.3 image. A separate explicitly post-selection case can choose a tag known to exist and measure how far the public chain reaches; it cannot turn this failure into a successful preselected case. No prior derived-image digest exists in this study.",
            "line_start": 19,
            "line_end": 19,
            "sha256": "4c8eaace021c2f93d1c36d2d72ac91dc1a260b3d1658bd60bf6d2e514e639f48",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH022/LH022.md#L19"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH023/LH023.md",
      "path": "studies/LH023/LH023.md",
      "url": "/studies/LH023/LH023/",
      "kind": "study",
      "title": "A Drupal image is published; its base resolution remains unseen",
      "summary": "The known drupal:10.6-php8.3-fpm production tag had a published linux/amd64 image at this observation. Its exact manifest and config hashes verified, and the config declares PHPVERSION=8.3.36, the fixed 8.3 source version. The production Dockerfile's literal base instruction is FROM php:8.3-fpm-trixie. No selected public source Actions run after the PHP image publication at the frozen heads exposed a resolved PHP base digest, and the config has no ancestry label. This does not prove when or from which base digest the derivative was built, that it was deployed, or that an executable was independently patched.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "A Drupal image is published; its base resolution remains unseen",
      "explanation": {
        "path": "studies/LH023/LH023.md",
        "question": "Can the selected Drupal production tag be linked through source, base resolution and published image?",
        "summary": "A Drupal tag chosen post hoc after the failed selection had a published verified manifest and configuration declaring fixed PHP 8.3.36. Its recipe named a moving PHP base, but no selected run or ancestry label exposed the resolved base digest.",
        "limit": "This known positive-looking case cannot establish the historical build input, independently patched executable, deployment or adoption rate.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH023/LH023.md",
            "passage": "# A Drupal image is published; its base resolution remains unseen",
            "line_start": 1,
            "line_end": 1,
            "sha256": "934c429ac0b5d78339ee4fbf6f57758e584dfca4c2e96a81103e68e1ab8d4c12",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH023/LH023.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH023/LH023.md",
            "passage": "The known `drupal:10.6-php8.3-fpm` production tag had a published linux/amd64 image at this observation. Its exact manifest and config hashes verified, and the config declares `PHP_VERSION=8.3.36`, the fixed 8.3 source version. The production Dockerfile's literal base instruction is `FROM php:8.3-fpm-trixie`. No selected public source Actions run after the PHP image publication at the frozen heads exposed a resolved PHP base digest, and the config has no ancestry label.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "934c429ac0b5d78339ee4fbf6f57758e584dfca4c2e96a81103e68e1ab8d4c12",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH023/LH023.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH023/LH023.md",
            "passage": "The `10.6` tag was selected after seeing its existence in the LH022 manifest. Current image metadata cannot reconstruct earlier tag pointers.",
            "line_start": 24,
            "line_end": 24,
            "sha256": "934c429ac0b5d78339ee4fbf6f57758e584dfca4c2e96a81103e68e1ab8d4c12",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH023/LH023.md#L24"
          },
          {
            "label": "Selection",
            "path": "studies/LH023/LH023.md",
            "passage": "**Selection:** disclosed post hoc choice of a tag seen in LH022's failed selection, so no independent cohort inference.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "934c429ac0b5d78339ee4fbf6f57758e584dfca4c2e96a81103e68e1ab8d4c12",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH023/LH023.md#L3"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH024/LH024.md",
      "path": "studies/LH024/LH024.md",
      "url": "/studies/LH024/LH024/",
      "kind": "study",
      "title": "An emergency patch had several public kinds of protection",
      "summary": "The fixed public panel exposes different sorts of response: PHP's release notice, public-agency advice, and network providers' claims about traffic rules. Of ten selected institutions, six supplied directly readable relevant pages in this bounded snapshot (PHP, UK NCSC, CERT-EU, Cloudflare, Fastly and Akamai). CISA refused a direct request; AWS and Google Cloud returned Site Unavailable pages with HTTP 200; the Azure site-restricted search supplied no selected relevant page. Those four are instrument outcomes, not evidence of inactivity. Three selected media outlets supplied article metadata, not operator-action evidence. The panel is purposive and supports no percentage about all operators or protected sites.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "An emergency patch had several public kinds of protection",
      "explanation": {
        "path": "studies/LH024/LH024.md",
        "question": "What did a fixed public panel say about the PHP emergency?",
        "summary": "The week-long panel recorded advice, claimed traffic rules and provider patch or rebuild claims as different responses; readable institutional sources rose from six to eight of ten, while CISA stayed refused and Azure had no selected page. Relevant visible claim changes were dated by 23 October or earlier, with no later exposed-field changes through 28 October.",
        "limit": "Provider claims do not measure efficacy or protected hosts; purposive searches missed material and their full ranked outputs were not retained.",
        "state": "Closed",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH024/LH024.md",
            "passage": "# An emergency patch had several public kinds of protection",
            "line_start": 1,
            "line_end": 1,
            "sha256": "23f8c0c06430bf0d9738ca207af702db2bf4d0efaecc4d349d14146278451e5a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH024/LH024.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH024/LH024.md",
            "passage": "The fixed public panel exposes different sorts of response: PHP's release notice, public-agency advice, and network providers' claims about traffic rules.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "23f8c0c06430bf0d9738ca207af702db2bf4d0efaecc4d349d14146278451e5a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH024/LH024.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH024/LH024.md",
            "passage": "**Protocol deviation:** the search connector output was not itself retained with exact query invocation times and full ranked results. The selected URLs, frozen queries and direct reads are retained; nonselected search hits and precise search times cannot be replayed. This weakens any comparison of a missing result or search rank.",
            "line_start": 23,
            "line_end": 23,
            "sha256": "23f8c0c06430bf0d9738ca207af702db2bf4d0efaecc4d349d14146278451e5a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH024/LH024.md#L23"
          },
          {
            "label": "State",
            "path": "studies/LH024/LH024.md",
            "passage": "**Status:** closed; daily reads 22 to 28 October.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "23f8c0c06430bf0d9738ca207af702db2bf4d0efaecc4d349d14146278451e5a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH024/LH024.md#L3"
          },
          {
            "label": "Week",
            "path": "studies/LH024/LH024.md",
            "passage": "**Over the week, to 28 October.** From 23 October eight of the ten institutions had directly readable pages at every read, after AWS's and Google Cloud's pages, placeholders on 22 October, became readable; CISA's alert refused the reader at all seven reads, and Azure never had a selected page. The day's searches added three own-domain records on 23 October (an AWS security bulletin, a Fastly post and a BleepingComputer article) and none after. The claims that changed did so by 23 October: AWS's bulletin, by its own fields updated on 22 and 23 October, described automatic platform updates for Elastic Beanstalk, blueprints for Lightsail that running instances cannot take in place, and then affected EMR releases and Bref for Lambda; Google Cloud's blog took editor's notes to 23 October and claims its Gemini 4 Argon model contributed to finding and patching the flaws. Those changes are dated 23 October or earlier by the sources' own clocks and were all seen by the 24 October read; from 25 to 28 October no exposed title, canonical, published, modified or author field changed, and server headers moved on pages whose visible text did not. Of the institutional pages, only PHP's, CERT-EU's and Cloudflare's named the related flaw CVE-2026-115560, at every read from 23 October.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "23f8c0c06430bf0d9738ca207af702db2bf4d0efaecc4d349d14146278451e5a",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH024/LH024.md#L9"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH024/checkpoints/2026-10-23.md",
          "url": "/studies/LH024/checkpoints/2026-10-23/",
          "title": "2026-10-23"
        },
        {
          "path": "studies/LH024/checkpoints/2026-10-24.md",
          "url": "/studies/LH024/checkpoints/2026-10-24/",
          "title": "2026-10-24"
        },
        {
          "path": "studies/LH024/checkpoints/2026-10-25.md",
          "url": "/studies/LH024/checkpoints/2026-10-25/",
          "title": "2026-10-25"
        },
        {
          "path": "studies/LH024/checkpoints/2026-10-26.md",
          "url": "/studies/LH024/checkpoints/2026-10-26/",
          "title": "2026-10-26"
        },
        {
          "path": "studies/LH024/checkpoints/2026-10-27.md",
          "url": "/studies/LH024/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH024/checkpoints/2026-10-28.md",
          "url": "/studies/LH024/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH025/LH025.md",
      "path": "studies/LH025/LH025.md",
      "url": "/studies/LH025/LH025/",
      "kind": "study",
      "title": "Five derived PHP image tags already declared fixed versions",
      "summary": "At the first observation, all five preselected Docker Hub library application image tags exposed a linux/amd64 manifest and config declaring one of the fixed PHP source versions. They are current derived publisher artifacts, not evidence of when their moving tags first changed, whether their executable bytes were independently checked or whether any customer deployed them. All five tracks are left-censored with respect to the patch event, and the known Drupal track is a deliberate overlap with LH023.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Five derived PHP image tags already declared fixed versions",
      "explanation": {
        "path": "studies/LH025/LH025.md",
        "question": "What do selected derived PHP image tags name each day?",
        "summary": "All five selected tags already declared fixed PHP versions at baseline; all 16 retained configurations across the week kept those declarations. Nextcloud and WordPress digests changed, but five of seven reads were partial, leaving much of the later panel unknown.",
        "limit": "The tracks are left-censored and Drupal was selected with its result known; declarations and digests do not establish rebuild causes, verified binaries or deployment.",
        "state": "Closed",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH025/LH025.md",
            "passage": "# Five derived PHP image tags already declared fixed versions",
            "line_start": 1,
            "line_end": 1,
            "sha256": "0a5df3084259127be0a4fd68d1fb9b07d8f720b3b335d781591d25520cb72c37",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH025/LH025.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH025/LH025.md",
            "passage": "**Over the week, to 28 October.** No read from 22 to 28 October showed any of the five tags declaring an older PHP version: all 16 configurations retained declare the same fixed version as at the first read.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "0a5df3084259127be0a4fd68d1fb9b07d8f720b3b335d781591d25520cb72c37",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH025/LH025.md#L9"
          },
          {
            "label": "Limit",
            "path": "studies/LH025/LH025.md",
            "passage": "These five tags were chosen by repository family and variant, with Drupal included after LH023 had already read it. They are not a sample of all PHP consumers, and five of five is not an uptake rate.",
            "line_start": 31,
            "line_end": 31,
            "sha256": "0a5df3084259127be0a4fd68d1fb9b07d8f720b3b335d781591d25520cb72c37",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH025/LH025.md#L31"
          },
          {
            "label": "State",
            "path": "studies/LH025/LH025.md",
            "passage": "**Status:** closed; daily reads 22 to 28 October, five of seven partial.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "0a5df3084259127be0a4fd68d1fb9b07d8f720b3b335d781591d25520cb72c37",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH025/LH025.md#L3"
          },
          {
            "label": "Missing reads",
            "path": "studies/LH025/LH025.md",
            "passage": "The registry's anonymous rate limit cut five of the seven reads short, so after 25 October the panel saw only the two WordPress tags, and much of the week is unknown for the rest.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "0a5df3084259127be0a4fd68d1fb9b07d8f720b3b335d781591d25520cb72c37",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH025/LH025.md#L9"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH025/checkpoints/2026-10-23.md",
          "url": "/studies/LH025/checkpoints/2026-10-23/",
          "title": "2026-10-23"
        },
        {
          "path": "studies/LH025/checkpoints/2026-10-24.md",
          "url": "/studies/LH025/checkpoints/2026-10-24/",
          "title": "2026-10-24"
        },
        {
          "path": "studies/LH025/checkpoints/2026-10-25.md",
          "url": "/studies/LH025/checkpoints/2026-10-25/",
          "title": "2026-10-25"
        },
        {
          "path": "studies/LH025/checkpoints/2026-10-26.md",
          "url": "/studies/LH025/checkpoints/2026-10-26/",
          "title": "2026-10-26"
        },
        {
          "path": "studies/LH025/checkpoints/2026-10-27.md",
          "url": "/studies/LH025/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH025/checkpoints/2026-10-28.md",
          "url": "/studies/LH025/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH026/LH026.md",
      "path": "studies/LH026/LH026.md",
      "url": "/studies/LH026/LH026/",
      "kind": "study",
      "title": "Drupal's published layers extend the fixed PHP base layers",
      "summary": "The current published drupal:10.6-php8.3-fpm linux/amd64 image's 17 ordered filesystem layers begin with all 12 layers of the current php:8.3-fpm-trixie linux/amd64 image, matching both the compressed layer digests in their OCI manifests and the uncompressed rootfs.diffids in their configs. Both configs declare PHPVERSION=8.3.36. This is content-level evidence that the selected derived artifact contains the selected fixed PHP base's filesystem layers, with five additional layers. It does not reconstruct the tag pointer seen by the historical build or prove a running Drupal deployment or the PHP executable's behaviour.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Drupal's published layers extend the fixed PHP base layers",
      "explanation": {
        "path": "studies/LH026/LH026.md",
        "question": "Do Drupal's published layers extend the selected PHP base?",
        "summary": "In one case selected after its fixed-version declaration was known, all 12 ordered PHP base layers matched the prefix of Drupal's 17 layers, for both compressed and uncompressed digests. This establishes shared published layer content with five additional layers.",
        "limit": "The match does not identify the historical mutable tag pointer, a unique build route, tested executable behaviour or a running deployment.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH026/LH026.md",
            "passage": "# Drupal's published layers extend the fixed PHP base layers",
            "line_start": 1,
            "line_end": 1,
            "sha256": "da1e148b390e179b6ec30f000d105e668eaa92cccd9d5dbbc8dc8b9eacce65de",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH026/LH026.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH026/LH026.md",
            "passage": "The current published `drupal:10.6-php8.3-fpm` linux/amd64 image's 17 ordered filesystem layers begin with **all 12 layers** of the current `php:8.3-fpm-trixie` linux/amd64 image, matching both the compressed layer digests in their OCI manifests and the uncompressed `rootfs.diff_ids` in their configs. Both configs declare `PHP_VERSION=8.3.36`.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "da1e148b390e179b6ec30f000d105e668eaa92cccd9d5dbbc8dc8b9eacce65de",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH026/LH026.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH026/LH026.md",
            "passage": "This comparison was made after the derivative had been chosen and after its config declared a fixed PHP version. It is a single selected feasibility case, not a frequency of downstream rebuilds.",
            "line_start": 24,
            "line_end": 24,
            "sha256": "da1e148b390e179b6ec30f000d105e668eaa92cccd9d5dbbc8dc8b9eacce65de",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH026/LH026.md#L24"
          },
          {
            "label": "Content boundary",
            "path": "studies/LH026/LH026.md",
            "passage": "Matching ordered layer digests establishes content identity for those published layer objects. It does not identify the historical mutable tag pointer a builder resolved, prove a unique route to those bytes, validate the executable by running it, or establish that a customer pulled or deployed this image.",
            "line_start": 25,
            "line_end": 25,
            "sha256": "da1e148b390e179b6ec30f000d105e668eaa92cccd9d5dbbc8dc8b9eacce65de",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH026/LH026.md#L25"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH027/LH027.md",
      "path": "studies/LH027/LH027.md",
      "url": "/studies/LH027/LH027/",
      "kind": "study",
      "title": "A selected outage notice was unavailable to the direct reader",
      "summary": "Inconclusive. The selected first-party notice returned HTTP 403 to this direct reader. The search result had already claimed some services were taken offline, but its snippet cannot supply the full notice, exact service list, update history or present status. This observation does not verify availability or restoration.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "A selected outage notice was unavailable to the direct reader",
      "explanation": {
        "path": "studies/LH027/LH027.md",
        "question": "What does one operator's precautionary outage notice establish?",
        "summary": "The selected National Archives notice refused the single direct read with HTTP 403, leaving the case inconclusive. A previously seen search snippet could not verify its exact service list, history, availability or restoration.",
        "limit": "An access denial is not evidence about the services, and a case selected for an apparent shutdown cannot estimate shutdown prevalence.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH027/LH027.md",
            "passage": "# A selected outage notice was unavailable to the direct reader",
            "line_start": 1,
            "line_end": 1,
            "sha256": "1f8b3ddf3614659acf9f4466cc0a18892a20ba8ce5b4ec3e4fbf12e7d86b96b0",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH027/LH027.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH027/LH027.md",
            "passage": "Inconclusive. The selected first-party notice returned HTTP 403 to this direct reader. The search result had already claimed some services were taken offline, but its snippet cannot supply the full notice, exact service list, update history or present status. This observation does not verify availability or restoration.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "1f8b3ddf3614659acf9f4466cc0a18892a20ba8ce5b4ec3e4fbf12e7d86b96b0",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH027/LH027.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH027/LH027.md",
            "passage": "An access denial to this instrument says nothing about whether the operator removed the notice or whether the named services are still offline. The search snippet is insufficient to attribute an exact list or clock. This chosen positive-looking case cannot measure the rate of preventive shutdowns.",
            "line_start": 19,
            "line_end": 19,
            "sha256": "1f8b3ddf3614659acf9f4466cc0a18892a20ba8ce5b4ec3e4fbf12e7d86b96b0",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH027/LH027.md#L19"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH028/LH028.md",
      "path": "studies/LH028/LH028.md",
      "url": "/studies/LH028/LH028/",
      "kind": "study",
      "title": "The first public attack trace predates the PHP disclosure, but says little about AI use by attackers",
      "summary": "The web reader showed Amazon Threat Intelligence's first-party account of an attempted exploit in its MadPot honeypot dated 17 October, with further attempts from 02:00 to 08:00 UTC on 21 October and after the stated 14:00 UTC embargo lift. Amazon says it does not know how the earlier actor obtained the information or whether attempts would have succeeded on real systems [S1]. The direct collector received a Site Unavailable placeholder for this article, so the Amazon text is not independently replayable from retained raw bytes here. Cloudflare's retained page says it observed attack traffic against its customers and changing payloads, but gives no count or rate for this episode [S2]. Neither observation shows a named system compromised or attributes an individual request to AI.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The first public attack trace predates the PHP disclosure, but says little about AI use by attackers",
      "explanation": {
        "path": "studies/LH028/LH028.md",
        "question": "What can the first public telemetry establish about this PHP event and AI's role?",
        "summary": "Amazon's web-rendered account dated a honeypot attempt before disclosure, while retained Cloudflare text reported attack traffic without episode counts; neither identified attacker AI use or a compromised system. OpenAI's participant account described AI-assisted defensive discovery and coordination.",
        "limit": "The direct Amazon read was a placeholder, so its text cannot be replayed from retained bytes; selected qualitative accounts supply no global attempt rate or causal AI attribution.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH028/LH028.md",
            "passage": "# The first public attack trace predates the PHP disclosure, but says little about AI use by attackers",
            "line_start": 1,
            "line_end": 1,
            "sha256": "f160d642dd9fb77f6bd8b1a70499efe438b52e2ae3a3c59043a9aae0a0d739d2",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH028/LH028.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH028/LH028.md",
            "passage": "The web reader showed Amazon Threat Intelligence's first-party account of an attempted exploit in its MadPot honeypot dated **17 October**, with further attempts from 02:00 to 08:00 UTC on 21 October and after the stated 14:00 UTC embargo lift. Amazon says it does not know how the earlier actor obtained the information or whether attempts would have succeeded on real systems [S1].",
            "line_start": 7,
            "line_end": 7,
            "sha256": "f160d642dd9fb77f6bd8b1a70499efe438b52e2ae3a3c59043a9aae0a0d739d2",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH028/LH028.md#L7"
          },
          {
            "label": "Limit",
            "path": "studies/LH028/LH028.md",
            "passage": "The direct collector received a `Site Unavailable` placeholder for this article, so the Amazon text is **not** independently replayable from retained raw bytes here.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "f160d642dd9fb77f6bd8b1a70499efe438b52e2ae3a3c59043a9aae0a0d739d2",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH028/LH028.md#L7"
          },
          {
            "label": "AI role",
            "path": "studies/LH028/LH028.md",
            "passage": "OpenAI's retained page says Calif identified one flaw using GPT-5.6 Sol, Wiz independently reported both, and PHP maintainers led the fixes, with OpenAI and partners assisting coordination [S3]. That is a disclosed use of AI in *defensive discovery* and response, not evidence of attackers' tools.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "f160d642dd9fb77f6bd8b1a70499efe438b52e2ae3a3c59043a9aae0a0d739d2",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH028/LH028.md#L9"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH028/checkpoints/2026-10-22T1600Z.md",
          "url": "/studies/LH028/checkpoints/2026-10-22T1600Z/",
          "title": "2026-10-22T1600Z"
        },
        {
          "path": "studies/LH028/checkpoints/2026-10-22T2200Z.md",
          "url": "/studies/LH028/checkpoints/2026-10-22T2200Z/",
          "title": "2026-10-22T2200Z"
        },
        {
          "path": "studies/LH028/checkpoints/2026-10-23T0400Z.md",
          "url": "/studies/LH028/checkpoints/2026-10-23T0400Z/",
          "title": "2026-10-23T0400Z"
        },
        {
          "path": "studies/LH028/checkpoints/2026-10-23T1000Z.md",
          "url": "/studies/LH028/checkpoints/2026-10-23T1000Z/",
          "title": "2026-10-23T1000Z"
        },
        {
          "path": "studies/LH028/checkpoints/2026-10-23T1600Z.md",
          "url": "/studies/LH028/checkpoints/2026-10-23T1600Z/",
          "title": "2026-10-23T1600Z"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH029/LH029.md",
      "path": "studies/LH029/LH029.md",
      "url": "/studies/LH029/LH029/",
      "kind": "study",
      "title": "What did PHP's own 23 October notice say about a related issue in the fixed releases?",
      "summary": "PHP's own archive entry, dated 23 October with a datetime attribute of 10:12:28 UTC and first read directly by Lighthouse at 17:00 UTC, suggests that users set session.uploadprogress.enabled=0 \"until the next regular bugfix release, to fully protect from an unlikely RCE vector\" [S1]. It says the issue can occur only under \"an unusual combination of configuration and application code\": an application sets session.serializehandler to phpbinary or phpserialize in its configuration, switches it to php at runtime with iniset() before sessionstart(), and leaves session upload progress enabled. Applications that never change the handler at runtime can keep the feature enabled. The setting is the one PHP listed on 21 October as a partial measure against CVE-2026-109619; those who applied it then should keep it in place, and need do nothing more. PHP will handle the issue in the regular release cycle and publish a full advisory for CVE-2026-115560 with the next release.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "What did PHP's own 23 October notice say about a related issue in the fixed releases?",
      "explanation": {
        "path": "studies/LH029/LH029.md",
        "question": "What did PHP's own 23 October notice say about a related issue in the fixed releases?",
        "summary": "PHP described an unlikely related code-execution path under an unusual runtime handler-switching configuration and advised disabling upload progress until its next regular release. PHP named no affected versions: applicability to current releases is the record's inference, while Cloudflare stated that scope explicitly.",
        "limit": "The notice's timestamp is not first-public visibility, and the record measures no installation, exposure prevalence or exploit attempt.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH029/LH029.md",
            "passage": "# What did PHP's own 23 October notice say about a related issue in the fixed releases?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "764682654387330cde1c252b15b407c7d4aaf689946434a668296028d311371f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH029/LH029.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH029/LH029.md",
            "passage": "The entry names no affected version. By asking users to keep the setting until the next regular release in order \"to fully protect\", it implies that the current releases, including the 21 October fixed ones, do not close this path; that is our reading, not PHP's words.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "764682654387330cde1c252b15b407c7d4aaf689946434a668296028d311371f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH029/LH029.md#L9"
          },
          {
            "label": "Limit",
            "path": "studies/LH029/LH029.md",
            "passage": "**A claim, not a measurement.** The conditions and the \"unlikely\" judgement are PHP's. This study observed no installation, application, configuration or exploit attempt, and cannot say how many applications switch the serialise handler at runtime, whether any are exposed, or whether the next release will close the path.",
            "line_start": 33,
            "line_end": 33,
            "sha256": "764682654387330cde1c252b15b407c7d4aaf689946434a668296028d311371f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH029/LH029.md#L33"
          },
          {
            "label": "Conditions",
            "path": "studies/LH029/LH029.md",
            "passage": "PHP's own archive entry, dated 23 October with a `datetime` attribute of 10:12:28 UTC and first read directly by Lighthouse at 17:00 UTC, suggests that users set `session.upload_progress.enabled=0` \"until the next regular bugfix release, to fully protect from an unlikely RCE vector\" [S1]. It says the issue can occur only under \"an unusual combination of configuration and application code\": an application sets `session.serialize_handler` to `php_binary` or `php_serialize` in its configuration, switches it to `php` at runtime with `ini_set()` before `session_start()`, and leaves session upload progress enabled. Applications that never change the handler at runtime can keep the feature enabled. The setting is the one PHP listed on 21 October as a partial measure against CVE-2026-109619; those who applied it then should keep it in place, and need do nothing more. PHP will handle the issue in the regular release cycle and publish a full advisory for CVE-2026-115560 with the next release.",
            "line_start": 7,
            "line_end": 7,
            "sha256": "764682654387330cde1c252b15b407c7d4aaf689946434a668296028d311371f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH029/LH029.md#L7"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH030/LH030.md",
      "path": "studies/LH030/LH030.md",
      "url": "/studies/LH030/LH030/",
      "kind": "study",
      "title": "How does PHP's 23 October mitigation instruction travel through a fixed panel of public notices and vulnerability records?",
      "summary": "On 23 October PHP told people how to protect themselves from a related third flaw (CVE-2026-115560) until a fix arrives. Did that advice spread? We follow it through 15 fixed public sources, seven vulnerability databases and eight security bodies' notices, read twice a week. In the first week only CERT-EU carried the advice and no database opened an entry; on 5 November SUSE became the first database to open one (unreviewed, from that day's checkpoint). The watch ends at the first read two days after PHP's next regular release, or on 30 November.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "PHP's mitigation advice in public notices",
      "explanation": {
        "path": "studies/LH030/LH030.md",
        "question": "How does PHP's mitigation instruction travel through a fixed panel of notices and vulnerability records?",
        "summary": "The interim record found no class changes across 22 reads to 30 October: one institution carried the instruction and none of seven trackers had opened an entry. Its later opening reports an unreviewed 5 November checkpoint in which SUSE became the first tracker with an entry; the watch remains open.",
        "limit": "Fixed-URL absence is not institutional silence or measured reach; refusals and the missed 30 October evening read leave unknowns.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH030/LH030.md",
            "passage": "# How does PHP's 23 October mitigation instruction travel through a fixed panel of public notices and vulnerability records?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "6301404d1ab357be818aff6f783973554d0f18a73ce83a0311da5c6d7b8b2d36",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH030/LH030.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH030/LH030.md",
            "passage": "In 22 reads over the week from 23 October 17:15 UTC to 30 October 13:04 UTC, nothing in the frame changed class.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "6301404d1ab357be818aff6f783973554d0f18a73ce83a0311da5c6d7b8b2d36",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH030/LH030.md#L9"
          },
          {
            "label": "Limit",
            "path": "studies/LH030/LH030.md",
            "passage": "This is an observation of a fixed panel, not a measure of reach: a tracker or institution may have said something elsewhere, and an absence at a fixed URL is not silence.",
            "line_start": 11,
            "line_end": 11,
            "sha256": "6301404d1ab357be818aff6f783973554d0f18a73ce83a0311da5c6d7b8b2d36",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH030/LH030.md#L11"
          },
          {
            "label": "State",
            "path": "studies/LH030/LH030.md",
            "passage": "**Study:** LH030, version 0.2 (interim record, after the reads of 30 October), 31 October 2026; version 0.1 (baseline record), 23 October 2026.",
            "line_start": 5,
            "line_end": 5,
            "sha256": "6301404d1ab357be818aff6f783973554d0f18a73ce83a0311da5c6d7b8b2d36",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH030/LH030.md#L5"
          },
          {
            "label": "Latest opening",
            "path": "studies/LH030/LH030.md",
            "passage": "**In short.** On 23 October PHP told people how to protect themselves from a related third flaw (CVE-2026-115560) until a fix arrives. Did that advice spread? We follow it through 15 fixed public sources, seven vulnerability databases and eight security bodies' notices, read twice a week. In the first week only CERT-EU carried the advice and no database opened an entry; on 5 November SUSE became the first database to open one (unreviewed, from that day's checkpoint). The watch ends at the first read two days after PHP's next regular release, or on 30 November.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "6301404d1ab357be818aff6f783973554d0f18a73ce83a0311da5c6d7b8b2d36",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH030/LH030.md#L3"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH030/checkpoints/2026-10-24.md",
          "url": "/studies/LH030/checkpoints/2026-10-24/",
          "title": "2026-10-24"
        },
        {
          "path": "studies/LH030/checkpoints/2026-10-25.md",
          "url": "/studies/LH030/checkpoints/2026-10-25/",
          "title": "2026-10-25"
        },
        {
          "path": "studies/LH030/checkpoints/2026-10-26.md",
          "url": "/studies/LH030/checkpoints/2026-10-26/",
          "title": "2026-10-26"
        },
        {
          "path": "studies/LH030/checkpoints/2026-10-27.md",
          "url": "/studies/LH030/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH030/checkpoints/2026-10-28.md",
          "url": "/studies/LH030/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        },
        {
          "path": "studies/LH030/checkpoints/2026-10-29.md",
          "url": "/studies/LH030/checkpoints/2026-10-29/",
          "title": "2026-10-29"
        },
        {
          "path": "studies/LH030/checkpoints/2026-10-30.md",
          "url": "/studies/LH030/checkpoints/2026-10-30/",
          "title": "2026-10-30"
        },
        {
          "path": "studies/LH030/checkpoints/2026-11-02.md",
          "url": "/studies/LH030/checkpoints/2026-11-02/",
          "title": "2026-11-02"
        },
        {
          "path": "studies/LH030/checkpoints/2026-11-05.md",
          "url": "/studies/LH030/checkpoints/2026-11-05/",
          "title": "2026-11-05"
        },
        {
          "path": "studies/LH030/checkpoints/2026-11-09.md",
          "url": "/studies/LH030/checkpoints/2026-11-09/",
          "title": "2026-11-09"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH031/LH031.md",
      "path": "studies/LH031/LH031.md",
      "url": "/studies/LH031/LH031/",
      "kind": "study",
      "title": "When, if ever, does CISA's catalogue of known exploited vulnerabilities list the October 2026 PHP flaws?",
      "summary": "Does CISA, the US cyber agency, list the October PHP flaws in its catalogue of known exploited vulnerabilities? It listed the two emergency flaws, CVE-2026-109618 and CVE-2026-109619, on 26 October, between our reads of 26 October 18:34 and 27 October 06:34 UTC. The third, CVE-2026-115560, wasn't listed at our latest read on 5 November (unreviewed checkpoint). A listing is CISA's classification, not a count of attacks. Since 30 October we also read Palo Alto Networks' advisory, which reports active exploitation of its own products; it was unchanged on 5 November.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "PHP flaws in CISA's exploited list",
      "explanation": {
        "path": "studies/LH031/LH031.md",
        "question": "When does CISA's catalogue list the October PHP flaws?",
        "summary": "CISA's two emergency-flaw entries first appeared between the 26 October evening and 27 October morning reads, with CISA's own dateAdded of 26 October. The third flaw remained unlisted in the unreviewed 5 November checkpoint reported by the opening, and the watch continues.",
        "limit": "A listing is an agency classification, not attack or compromise counts; the retained feed gives no per-entry evidence threshold or exploitation report.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH031/LH031.md",
            "passage": "# When, if ever, does CISA's catalogue of known exploited vulnerabilities list the October 2026 PHP flaws?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "9e57f76cc6943007ff36d2219f81d404b3c0a9bc233f9dc2d2567cf76e19bcae",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH031/LH031.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH031/LH031.md",
            "passage": "So the appearance falls between our reads of 26 October 18:34 UTC and 27 October 06:34 UTC, on CISA's dates 26 October; the three clocks are kept apart in [the 27 October checkpoint](checkpoints/2026-10-27.md).",
            "line_start": 9,
            "line_end": 9,
            "sha256": "9e57f76cc6943007ff36d2219f81d404b3c0a9bc233f9dc2d2567cf76e19bcae",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH031/LH031.md#L9"
          },
          {
            "label": "Limit",
            "path": "studies/LH031/LH031.md",
            "passage": "An agency's catalogue applies its own evidence threshold, which is not published per entry, and the feed states no criteria at all;",
            "line_start": 17,
            "line_end": 17,
            "sha256": "9e57f76cc6943007ff36d2219f81d404b3c0a9bc233f9dc2d2567cf76e19bcae",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH031/LH031.md#L17"
          },
          {
            "label": "State",
            "path": "studies/LH031/LH031.md",
            "passage": "Reads continue under the brief, for CVE-2026-115560 and for any revision of the two entries.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "9e57f76cc6943007ff36d2219f81d404b3c0a9bc233f9dc2d2567cf76e19bcae",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH031/LH031.md#L9"
          },
          {
            "label": "Latest opening",
            "path": "studies/LH031/LH031.md",
            "passage": "**In short.** Does CISA, the US cyber agency, list the October PHP flaws in its catalogue of known exploited vulnerabilities? It listed the two emergency flaws, CVE-2026-109618 and CVE-2026-109619, on 26 October, between our reads of 26 October 18:34 and 27 October 06:34 UTC. The third, CVE-2026-115560, wasn't listed at our latest read on 5 November (unreviewed checkpoint). A listing is CISA's classification, not a count of attacks. Since 30 October we also read Palo Alto Networks' advisory, which reports active exploitation of its own products; it was unchanged on 5 November.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "9e57f76cc6943007ff36d2219f81d404b3c0a9bc233f9dc2d2567cf76e19bcae",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH031/LH031.md#L3"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH031/checkpoints/2026-10-24.md",
          "url": "/studies/LH031/checkpoints/2026-10-24/",
          "title": "2026-10-24"
        },
        {
          "path": "studies/LH031/checkpoints/2026-10-25.md",
          "url": "/studies/LH031/checkpoints/2026-10-25/",
          "title": "2026-10-25"
        },
        {
          "path": "studies/LH031/checkpoints/2026-10-26.md",
          "url": "/studies/LH031/checkpoints/2026-10-26/",
          "title": "2026-10-26"
        },
        {
          "path": "studies/LH031/checkpoints/2026-10-27.md",
          "url": "/studies/LH031/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH031/checkpoints/2026-10-28.md",
          "url": "/studies/LH031/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        },
        {
          "path": "studies/LH031/checkpoints/2026-10-29.md",
          "url": "/studies/LH031/checkpoints/2026-10-29/",
          "title": "2026-10-29"
        },
        {
          "path": "studies/LH031/checkpoints/2026-10-30.md",
          "url": "/studies/LH031/checkpoints/2026-10-30/",
          "title": "2026-10-30"
        },
        {
          "path": "studies/LH031/checkpoints/2026-11-02.md",
          "url": "/studies/LH031/checkpoints/2026-11-02/",
          "title": "2026-11-02"
        },
        {
          "path": "studies/LH031/checkpoints/2026-11-05.md",
          "url": "/studies/LH031/checkpoints/2026-11-05/",
          "title": "2026-11-05"
        },
        {
          "path": "studies/LH031/checkpoints/2026-11-09.md",
          "url": "/studies/LH031/checkpoints/2026-11-09/",
          "title": "2026-11-09"
        },
        {
          "path": "studies/LH031/checkpoints/criteria-2026-10-30.md",
          "url": "/studies/LH031/checkpoints/criteria-2026-10-30/",
          "title": "criteria-2026-10-30"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH032/LH032.md",
      "path": "studies/LH032/LH032.md",
      "url": "/studies/LH032/LH032/",
      "kind": "study",
      "title": "How do fixes for the October 2026 PHP flaws reach products that embed PHP, as one national CERT's public list records them?",
      "summary": "The Dutch national cyber security centre, NCSC-NL, keeps a public list of software affected by the October PHP flaws, with a status for each entry, and we read it twice a week. On 5 November (unreviewed checkpoint) it had 948 entries; for CVE-2026-109618, 185 had a fix, 215 were vulnerable, 93 were still being assessed, 240 were marked as depending on the PHP runtime they run on, and 214 were not vulnerable. These are the list's statuses, not what vendors or their customers actually run.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "PHP fixes in products, by the Dutch NCSC",
      "explanation": {
        "path": "studies/LH032/LH032.md",
        "question": "How does one national CERT's list record fixes for PHP-related products?",
        "summary": "The audited baseline held 751 entries and 109 fixes for the first flaw; correcting history traversal changed recorded transition clocks and withdrew a pre-release resolved claim without changing current status totals. The opening reports 948 entries in an unreviewed 5 November checkpoint, and twice-weekly reads continue.",
        "limit": "These are list statuses and mainline edit clocks, not vendor release times or customer states; a small advisory check was incomplete.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH032/LH032.md",
            "passage": "# How do fixes for the October 2026 PHP flaws reach products that embed PHP, as one national CERT's public list records them?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH032/LH032.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH032/LH032.md",
            "passage": "The original all-branches traversal treated merged side-branch trees as successive list states. First-parent reanalysis changes 117 first Fix/Not vuln clocks and 66 first-listed clocks, and changes the number of surviving identities with status transitions from 328 to 308. The original claim of one pre-release Not vuln record is withdrawn.",
            "line_start": 31,
            "line_end": 31,
            "sha256": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH032/LH032.md#L31"
          },
          {
            "label": "Limit",
            "path": "studies/LH032/LH032.md",
            "passage": "The mainline commit clocks date edits incorporated along the captured first-parent history, often in batches. Git alone does not date a public push or first reader access; a later commit can record an earlier vendor statement.",
            "line_start": 37,
            "line_end": 37,
            "sha256": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH032/LH032.md#L37"
          },
          {
            "label": "State",
            "path": "studies/LH032/LH032.md",
            "passage": "Read again with LH030's schedule: the questions are how many \"Investigation\" entries resolve and how fast, as the list records it, and whether a column for CVE-2026-115560 appears.",
            "line_start": 44,
            "line_end": 44,
            "sha256": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH032/LH032.md#L44"
          },
          {
            "label": "Baseline",
            "path": "studies/LH032/LH032.md",
            "passage": "The inventory contains 751 PHP-related entries, including runtimes, extensions, application frameworks, tools and hosted products. It is broader than a count of vendors or products bundling PHP. It gives a status per entry for each of the two original flaws (Investigation, Vulnerable, Fix, Workaround or Not vuln, each defined in its README by the kind of source behind it) and, for nearly all entries (749 of 751), a link. At its latest commit it holds **751 entries**. For CVE-2026-109618: **109 Fix, 222 Vulnerable, 389 Investigation, 30 Not vuln** and one blank (PHP itself); CVE-2026-109619's counts differ by one or two. So by the list's account, two days after PHP's release, about one entry in seven had a recorded fix and about half were still being assessed. These are the list's statuses, not vendors' or customers' states.",
            "line_start": 18,
            "line_end": 18,
            "sha256": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH032/LH032.md#L18"
          },
          {
            "label": "Latest opening",
            "path": "studies/LH032/LH032.md",
            "passage": "**In short.** The Dutch national cyber security centre, NCSC-NL, keeps a public list of software affected by the October PHP flaws, with a status for each entry, and we read it twice a week. On 5 November (unreviewed checkpoint) it had 948 entries; for CVE-2026-109618, 185 had a fix, 215 were vulnerable, 93 were still being assessed, 240 were marked as depending on the PHP runtime they run on, and 214 were not vulnerable. These are the list's statuses, not what vendors or their customers actually run.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH032/LH032.md#L3"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH032/checkpoints/2026-10-24.md",
          "url": "/studies/LH032/checkpoints/2026-10-24/",
          "title": "2026-10-24"
        },
        {
          "path": "studies/LH032/checkpoints/2026-10-25.md",
          "url": "/studies/LH032/checkpoints/2026-10-25/",
          "title": "2026-10-25"
        },
        {
          "path": "studies/LH032/checkpoints/2026-10-26.md",
          "url": "/studies/LH032/checkpoints/2026-10-26/",
          "title": "2026-10-26"
        },
        {
          "path": "studies/LH032/checkpoints/2026-10-27.md",
          "url": "/studies/LH032/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH032/checkpoints/2026-10-28.md",
          "url": "/studies/LH032/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        },
        {
          "path": "studies/LH032/checkpoints/2026-10-29.md",
          "url": "/studies/LH032/checkpoints/2026-10-29/",
          "title": "2026-10-29"
        },
        {
          "path": "studies/LH032/checkpoints/2026-10-30.md",
          "url": "/studies/LH032/checkpoints/2026-10-30/",
          "title": "2026-10-30"
        },
        {
          "path": "studies/LH032/checkpoints/2026-11-02.md",
          "url": "/studies/LH032/checkpoints/2026-11-02/",
          "title": "2026-11-02"
        },
        {
          "path": "studies/LH032/checkpoints/2026-11-05.md",
          "url": "/studies/LH032/checkpoints/2026-11-05/",
          "title": "2026-11-05"
        },
        {
          "path": "studies/LH032/checkpoints/2026-11-09.md",
          "url": "/studies/LH032/checkpoints/2026-11-09/",
          "title": "2026-11-09"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH033/LH033.md",
      "path": "studies/LH033/LH033.md",
      "url": "/studies/LH033/LH033/",
      "kind": "study",
      "title": "How does the PHP emergency fix reach the services others count, beside how Python releases reached downloads?",
      "summary": "After PHP's emergency fix of 21 October, how many internet-facing PHP servers took it? We use Censys's public counts of servers that report their PHP version, and its patched share is a floor. By day 14 (4 November, unreviewed checkpoint) the share counted as patched was 73 per cent in branch 8.2, 70 in 8.3, 81 in 8.4 and 90 in 8.5. On day 7, 24.4 million servers, 54 per cent of those reporting a version, ran branches PHP no longer fixes. This record stops at day 7; the day-30 read is due on 21 or 22 November.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "PHP's fix on internet-facing servers",
      "explanation": {
        "path": "studies/LH033/LH033.md",
        "question": "How does the PHP emergency fix reach counted services, beside Python download shares?",
        "summary": "By day 7 Censys classified 52.4 to 78.8 per cent within the four fixed PHP branches as patched, while 54.3 per cent of version-reporting services were on branches PHP had not fixed. This is an interim comparison of service stocks with reused Python download flows; later checkpoints and post hoc comparisons remain separate from the day-7 record.",
        "limit": "Reported versions, scan lag and backports make patched shares floors on protection; unlike units cannot rank ecosystems or explain causes.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH033/LH033.md",
            "passage": "title: How does the PHP emergency fix reach the services others count, beside how Python releases reached downloads?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH033/LH033.md",
            "passage": "A week after PHP's emergency releases, Censys counted between a little over half and nearly four fifths of the version-reporting, internet-facing PHP services in each fixed branch as patched: on day 7, 53.0 per cent in 8.2, 52.4 in 8.3, 67.8 in 8.4 and 78.8 in 8.5 (observation, Censys's classification).",
            "line_start": 17,
            "line_end": 17,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L17"
          },
          {
            "label": "Limit",
            "path": "studies/LH033/LH033.md",
            "passage": "The comparison describes shapes; it does not rank the ecosystems, and severity, publicity, exploitation reports and AI are not examined as causes.",
            "line_start": 71,
            "line_end": 71,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L71"
          },
          {
            "label": "State",
            "path": "studies/LH033/LH033.md",
            "passage": "version: 0.1 (interim, to day 7)",
            "line_start": 3,
            "line_end": 3,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L3"
          },
          {
            "label": "Tail",
            "path": "studies/LH033/LH033.md",
            "passage": "Beside them, 24.4 million services, 54.3 per cent of those that reported a version, ran branches for which PHP released no fix, as their versions report them; some may carry a distribution's backported fix under the old number, which this study does not measure.",
            "line_start": 17,
            "line_end": 17,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L17"
          },
          {
            "label": "Version reporting",
            "path": "studies/LH033/LH033.md",
            "passage": "**A Censys share is not protection.** The dashboard's own notes say figures \"can lag real-world changes by hours, and by up to about a week for some websites\", that \"Status is based on reported versions, so counts are an upper bound\", and that \"Linux distributions often backport security fixes without changing the PHP version\" (read 25 October 2026; discovery.md). So the patched shares are floors: Ubuntu's fixed package for its 24.04 release reports itself as 8.3.6 (studies/LH018), and services that hide their version are outside both the count and its denominator.\n- **A service is an address and a port**, not a machine, a website or an organisation.\n- **Different units.** The Python comparators are shares of a day's downloads from the Python Package Index, a flow weighted towards environments that fetch often; the PHP figures are a stock of services. The comparison describes shapes; it does not rank the ecosystems, and severity, publicity, exploitation reports and AI are not examined as causes.\n- **One third-party instrument.** Censys's detection changed on day 2 (above); its methods are not fully published.\n- **Interim.** Measures 3 to 6 and the day 14 and day 30 points wait for the read holding day 30 (21 or 22 November) and W3Techs's monthly points.\n- Not checked: Censys's terms of use; how Censys treats a service first seen already fixed; W3Techs's version detection.",
            "line_start": 69,
            "line_end": 74,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L69"
          },
          {
            "label": "Post hoc measure",
            "path": "studies/LH033/LH033.md",
            "passage": "**Measure 6 (amendment 1), pending.** How ordinary PHP patch releases spread among the websites W3Techs counts, beside the emergency release, needs W3Techs's monthly points of 1 November and 1 December. It was chosen after the baseline's history rows were seen and is labelled post hoc wherever it is reported, with its one comparison named in the amendment.",
            "line_start": 52,
            "line_end": 52,
            "sha256": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH033/LH033.md#L52"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH033/checkpoints/2026-10-25.md",
          "url": "/studies/LH033/checkpoints/2026-10-25/",
          "title": "2026-10-25"
        },
        {
          "path": "studies/LH033/checkpoints/2026-10-26.md",
          "url": "/studies/LH033/checkpoints/2026-10-26/",
          "title": "2026-10-26"
        },
        {
          "path": "studies/LH033/checkpoints/2026-10-27.md",
          "url": "/studies/LH033/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH033/checkpoints/2026-10-28.md",
          "url": "/studies/LH033/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        },
        {
          "path": "studies/LH033/checkpoints/2026-10-29.md",
          "url": "/studies/LH033/checkpoints/2026-10-29/",
          "title": "2026-10-29"
        },
        {
          "path": "studies/LH033/checkpoints/2026-10-30.md",
          "url": "/studies/LH033/checkpoints/2026-10-30/",
          "title": "2026-10-30"
        },
        {
          "path": "studies/LH033/checkpoints/2026-11-02.md",
          "url": "/studies/LH033/checkpoints/2026-11-02/",
          "title": "2026-11-02"
        },
        {
          "path": "studies/LH033/checkpoints/2026-11-05.md",
          "url": "/studies/LH033/checkpoints/2026-11-05/",
          "title": "2026-11-05"
        },
        {
          "path": "studies/LH033/checkpoints/2026-11-09.md",
          "url": "/studies/LH033/checkpoints/2026-11-09/",
          "title": "2026-11-09"
        },
        {
          "path": "studies/LH033/checkpoints/interim-2026-10-30.md",
          "url": "/studies/LH033/checkpoints/interim-2026-10-30/",
          "title": "interim-2026-10-30"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH034/LH034.md",
      "path": "studies/LH034/LH034.md",
      "url": "/studies/LH034/LH034/",
      "kind": "study",
      "title": "How does the Node.js security release of 21 October 2026 reach nodejs.org's downloads, beside the Python releases and the PHP fix?",
      "summary": "The same question for Node.js's security release of 21 October, from nodejs.org's own download counts. By day 14 (4 November, unreviewed checkpoint) the fixed release or a newer one made up 63 per cent of line 22's downloads, 70 per cent of line 24's and 95 per cent of line 26's. A download is a request, not a machine, and nodejs.org is one channel of several. This record stops at day 7; the day-30 read is due on 22 November.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Node.js's fix in downloads",
      "explanation": {
        "path": "studies/LH034/LH034.md",
        "question": "How does the Node.js security release reach downloads, beside Python and PHP?",
        "summary": "By day 7 the fixed release or newer versions took 53.9, 72.2 and 64.7 per cent of downloads within lines 22, 24 and 26; all first passed half on day 2. The interim comparison reuses Python and PHP data and explicitly labels a later posting-day alignment with July as post hoc.",
        "limit": "A download is a request through one channel, not a machine or installation; different populations and units cannot rank ecosystems or establish causes.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Question",
            "path": "studies/LH034/LH034.md",
            "passage": "title: How does the Node.js security release of 21 October 2026 reach nodejs.org's downloads, beside the Python releases and the PHP fix?",
            "line_start": 1,
            "line_end": 1,
            "sha256": "461a11d38c07bbc0e141b0adf748fe0238086ef5abd77ebb2fcaef2f0781e549",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH034/LH034.md#L1"
          },
          {
            "label": "Answer",
            "path": "studies/LH034/LH034.md",
            "passage": "A week after Node.js's security releases of 21 October 2026, the fixed release or a newer one in its line made up 53.9 per cent of line 22's downloads from nodejs.org on day 7, 72.2 per cent of line 24's and 64.7 per cent of line 26's (derived from the project's counts). All three lines first passed half on day 2.",
            "line_start": 17,
            "line_end": 17,
            "sha256": "461a11d38c07bbc0e141b0adf748fe0238086ef5abd77ebb2fcaef2f0781e549",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH034/LH034.md#L17"
          },
          {
            "label": "Limit",
            "path": "studies/LH034/LH034.md",
            "passage": "**A download is a request**, not a machine, an install or a user; a machine that builds often is counted often.",
            "line_start": 73,
            "line_end": 73,
            "sha256": "461a11d38c07bbc0e141b0adf748fe0238086ef5abd77ebb2fcaef2f0781e549",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH034/LH034.md#L73"
          },
          {
            "label": "State",
            "path": "studies/LH034/LH034.md",
            "passage": "version: 0.1 (interim, to day 7)",
            "line_start": 3,
            "line_end": 3,
            "sha256": "461a11d38c07bbc0e141b0adf748fe0238086ef5abd77ebb2fcaef2f0781e549",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH034/LH034.md#L3"
          },
          {
            "label": "Post hoc comparison",
            "path": "studies/LH034/LH034.md",
            "passage": "*Post hoc, one comparison:* aligned by posting day instead (July's days 2, 3 and 8 against October's days 1, 2 and 7), July's shares were line 22 30.7, 31.9 and 31.0 per cent; line 24 15.1, 46.0 and 26.8; line 26 69.9, 89.1 and 89.4. This alignment was chosen after the offset was seen; no later read can test it on data not yet read, since both releases are past, and the brief's rule stays the measure. On either alignment, lines 22 and 24 were higher in October's first week than in July's, and line 26 was lower by day 7.",
            "line_start": 49,
            "line_end": 49,
            "sha256": "461a11d38c07bbc0e141b0adf748fe0238086ef5abd77ebb2fcaef2f0781e549",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH034/LH034.md#L49"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH034/checkpoints/2026-10-27.md",
          "url": "/studies/LH034/checkpoints/2026-10-27/",
          "title": "2026-10-27"
        },
        {
          "path": "studies/LH034/checkpoints/2026-10-28.md",
          "url": "/studies/LH034/checkpoints/2026-10-28/",
          "title": "2026-10-28"
        },
        {
          "path": "studies/LH034/checkpoints/2026-10-29.md",
          "url": "/studies/LH034/checkpoints/2026-10-29/",
          "title": "2026-10-29"
        },
        {
          "path": "studies/LH034/checkpoints/2026-10-30.md",
          "url": "/studies/LH034/checkpoints/2026-10-30/",
          "title": "2026-10-30"
        },
        {
          "path": "studies/LH034/checkpoints/2026-11-02.md",
          "url": "/studies/LH034/checkpoints/2026-11-02/",
          "title": "2026-11-02"
        },
        {
          "path": "studies/LH034/checkpoints/2026-11-05.md",
          "url": "/studies/LH034/checkpoints/2026-11-05/",
          "title": "2026-11-05"
        },
        {
          "path": "studies/LH034/checkpoints/2026-11-09.md",
          "url": "/studies/LH034/checkpoints/2026-11-09/",
          "title": "2026-11-09"
        },
        {
          "path": "studies/LH034/checkpoints/interim-2026-10-30.md",
          "url": "/studies/LH034/checkpoints/interim-2026-10-30/",
          "title": "interim-2026-10-30"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH035/LH035.md",
      "path": "studies/LH035/LH035.md",
      "url": "/studies/LH035/LH035/",
      "kind": "study",
      "title": "Which public instruments observe the internet itself, at which layer, and where does each stop?",
      "summary": "Which free public instruments watch the internet itself, from its cables to its traffic, and where does each stop? Reading 48 instruments' own pages in November 2026, every one of ten layers has at least one, but none sees the whole of its layer: routing archives listen from a small minority of networks, traffic is seen one network at a time, the fullest scanning data are paid for or restricted and the evidence behind the exploit-prediction scores read is private; and 11 of the 48 build on another. This describes instruments from their documentation and measures nothing of the internet; a map page drawn from it is in review.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Which public instruments observe the internet itself, at which layer, and where does each stop?",
      "explanation": {
        "path": "studies/LH035/LH035.md",
        "question": "Which public instruments observe the internet itself, at which layer, and where does each stop?",
        "summary": "The documentation survey included 48 public instruments across all ten layers, with none covering its whole layer and 11 drawing on another included instrument. This maps documented views rather than measuring the internet.",
        "limit": "Coverage and access depend on the pages read; some fields rest on model-written extracts, and the raw-page check did not cover the blind-spot or literature columns.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH035/LH035.md",
            "passage": "**In short.** Which free public instruments watch the internet itself, from its cables to its traffic, and where does each stop? Reading 48 instruments' own pages in November 2026, every one of ten layers has at least one, but none sees the whole of its layer: routing archives listen from a small minority of networks, traffic is seen one network at a time, the fullest scanning data are paid for or restricted and the evidence behind the exploit-prediction scores read is private; and 11 of the 48 build on another. This describes instruments from their documentation and measures nothing of the internet; a map page drawn from it is in review.",
            "line_start": 13,
            "line_end": 13,
            "sha256": "f38b50359f3910b2fa04072fba20f13b7659b139d663901e1c7ee1dacd9e02a6",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH035/LH035.md#L13"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH035/LH035.md",
            "passage": "Rows I01 to I40 were written from model-written extracts of pages and checked against the raw pages on 6 November, four days later, not on the day they were written: a field a page changed in those four days and the check did not catch is the 2 November extract's. Row I30 (CISA's catalogue) rests on its extract alone, since its pages refused the research client. The quotation check is mechanical and exact; the field check was made by two Sonnet subagents reading plain-text dumps, with the driving session rechecking only what they flagged, so a claim they wrongly passed as supported was not rechecked. The blind-spot and literature columns were not part of the check. Rows I41 to I48 rest on raw reads of 5 November, except the two fields that rest on 2 November extracts.",
            "line_start": 83,
            "line_end": 83,
            "sha256": "f38b50359f3910b2fa04072fba20f13b7659b139d663901e1c7ee1dacd9e02a6",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH035/LH035.md#L83"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH036/brief.md",
      "path": "studies/LH036/brief.md",
      "url": "/studies/LH036/brief/",
      "kind": "study",
      "title": "How do the public signals about CVE-2026-98432 move, from its fix on 15 October 2026 through Anthropic's account of an exploit on 27 October, and where has the fix landed?",
      "summary": "Anthropic said on 27 October that its model wrote a working exploit for CVE-2026-98432, a serious Linux kernel flaw fixed on 15 October. We watch the public signals defenders rely on: CISA's list of exploited flaws, the EPSS exploit-prediction score, how the official record is scored and enriched, and fixes from Debian, Ubuntu, Red Hat and SUSE. Reads are twice a week, until 13 January 2027 or 14 days after a CISA listing. The exploit and the post are Anthropic's, and Lighthouse runs on Anthropic's models.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The kernel flaw a model exploited",
      "explanation": {
        "path": "studies/LH036/brief.md",
        "question": "How do the public signals about CVE-2026-98432 move, from its fix on 15 October 2026 through Anthropic's account of an exploit on 27 October, and where has the fix landed?",
        "summary": "The protocol follows CVE-2026-98432's public severity and exploitation signals and distribution fixes twice weekly, stopping by 13 January 2027 or after a KEV listing's follow-up. Anthropic's exploit claim is attributed, with Lighthouse's use of Anthropic models disclosed.",
        "limit": "Public signals and fix availability cannot establish exploitation, affected running machines, installation or the cause of a score change.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH036/brief.md",
            "passage": "**In short** (added 7 November 2026; not part of the protocol). Anthropic said on 27 October that its model wrote a working exploit for CVE-2026-98432, a serious Linux kernel flaw fixed on 15 October. We watch the public signals defenders rely on: CISA's list of exploited flaws, the EPSS exploit-prediction score, how the official record is scored and enriched, and fixes from Debian, Ubuntu, Red Hat and SUSE. Reads are twice a week, until 13 January 2027 or 14 days after a CISA listing. The exploit and the post are Anthropic's, and Lighthouse runs on Anthropic's models.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "335937d117b5aa417017d4c7024dddfb0860c41235f737692467a5e1b5405b6b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH036/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH036/brief.md",
            "passage": "At most 20 GETs and 40 MiB per read, and about 22 reads; no subagent is needed for collection. The study stops at the last scheduled read on or before 13 January 2027 (90 days after E0), or at the first scheduled read at least 14 days after a KEV listing, whichever comes first. An interim record follows the read of 16 November 2026 (day 32), and the record follows the stop. Any piece needs its own reviews.",
            "line_start": 53,
            "line_end": 53,
            "sha256": "335937d117b5aa417017d4c7024dddfb0860c41235f737692467a5e1b5405b6b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH036/brief.md#L53"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH036/brief.md",
            "passage": "It is inconclusive for EPSS if the API stops returning this CVE's history, for a distribution whose tracker is unavailable at most reads, and for the timing of any change whose surrounding reads were missed. It cannot say whether anyone has exploited the bug, how many machines run an affected kernel, whether a fixed package was installed, or why any score moved. It makes no claim that harm is happening or that a system is compromised; a third party's published report of exploitation would be recorded as that party's claim, with what it rests on. Whether Anthropic's publication kept to its stated policy is not a measure here; it is the timeline study's question.",
            "line_start": 55,
            "line_end": 55,
            "sha256": "335937d117b5aa417017d4c7024dddfb0860c41235f737692467a5e1b5405b6b",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH036/brief.md#L55"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH036/checkpoints/2026-11-01.md",
          "url": "/studies/LH036/checkpoints/2026-11-01/",
          "title": "2026-11-01"
        },
        {
          "path": "studies/LH036/checkpoints/2026-11-02.md",
          "url": "/studies/LH036/checkpoints/2026-11-02/",
          "title": "2026-11-02"
        },
        {
          "path": "studies/LH036/checkpoints/2026-11-05.md",
          "url": "/studies/LH036/checkpoints/2026-11-05/",
          "title": "2026-11-05"
        },
        {
          "path": "studies/LH036/checkpoints/2026-11-09.md",
          "url": "/studies/LH036/checkpoints/2026-11-09/",
          "title": "2026-11-09"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH037/brief.md",
      "path": "studies/LH037/brief.md",
      "url": "/studies/LH037/brief/",
      "kind": "study",
      "title": "Which of the most-exploited vendors say their products carry the PHP flaws of 21 October 2026, on which PHP branch, and when do their fixes appear?",
      "summary": "Many vendors ship their own copy of PHP inside products such as firewalls and appliances, and fix it on their own clocks. Twice a week we read what the 20 vendors with most entries in CISA's list of exploited flaws say about the October PHP flaws. At the 5 November read (unreviewed checkpoint), 6 of the 20 had a statement naming the flaws, 7 had none we could find, 5 could not be read and 2 have no channel to read; Google, on 2 November, was the first to say which PHP branches some of its products carry.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Vendors that ship PHP",
      "explanation": {
        "path": "studies/LH037/brief.md",
        "question": "Which of the most-exploited vendors say their products carry the PHP flaws of 21 October 2026, on which PHP branch, and when do their fixes appear?",
        "summary": "The protocol follows statements and fixes from 20 vendors chosen by their counts in CISA’s exploited-flaw catalogue. Its unreviewed 5 November checkpoint found six vendors naming the flaws, seven with no statement found, five unreadable and two without a channel; Google first named carried PHP branches on 2 November.",
        "limit": "Unavailable routes and rolling feeds constrain what can be found; vendor statements cannot establish exploitation, installed fixes or affected device counts.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH037/brief.md",
            "passage": "**In short** (added 7 November 2026; not part of the protocol). Many vendors ship their own copy of PHP inside products such as firewalls and appliances, and fix it on their own clocks. Twice a week we read what the 20 vendors with most entries in CISA's list of exploited flaws say about the October PHP flaws. At the 5 November read (unreviewed checkpoint), 6 of the 20 had a statement naming the flaws, 7 had none we could find, 5 could not be read and 2 have no channel to read; Google, on 2 November, was the first to say which PHP branches some of its products carry.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "d8ccc24c9c3b44e4efeddfc0dd3bd7d7f54bcc2aec2cba95c8dc77e76f6f9da3",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH037/brief.md#L3"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH037/brief.md",
            "passage": "It is inconclusive for a vendor whose routes are unavailable at most reads, for a vendor whose statements live only behind a login or a script-only page, and for the timing of any change whose surrounding reads were missed. A feed that carries only recent items can drop a statement the baseline would have found had it been made earlier; a statement found later whose own date precedes the baseline is reported with that limit. The study cannot say whether any product was exploited, how many devices run an affected build, whether a fix was installed, or why a vendor did or did not publish. It makes no claim that harm is happening or that a system is compromised; a vendor's own report of exploitation is recorded as that vendor's claim, with what it rests on. No primary literature search was run before this brief: it tests no explanation, and its measures read each vendor's statement as the vendor dates it.",
            "line_start": 62,
            "line_end": 62,
            "sha256": "d8ccc24c9c3b44e4efeddfc0dd3bd7d7f54bcc2aec2cba95c8dc77e76f6f9da3",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH037/brief.md#L62"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH037/checkpoints/2026-11-01T1420Z.md",
          "url": "/studies/LH037/checkpoints/2026-11-01T1420Z/",
          "title": "2026-11-01T1420Z"
        },
        {
          "path": "studies/LH037/checkpoints/2026-11-02T1530Z.md",
          "url": "/studies/LH037/checkpoints/2026-11-02T1530Z/",
          "title": "2026-11-02T1530Z"
        },
        {
          "path": "studies/LH037/checkpoints/2026-11-05T1414Z.md",
          "url": "/studies/LH037/checkpoints/2026-11-05T1414Z/",
          "title": "2026-11-05T1414Z"
        },
        {
          "path": "studies/LH037/checkpoints/2026-11-09T1429Z.md",
          "url": "/studies/LH037/checkpoints/2026-11-09T1429Z/",
          "title": "2026-11-09T1429Z"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH038/brief.md",
      "path": "studies/LH038/brief.md",
      "url": "/studies/LH038/brief/",
      "kind": "study",
      "title": "When was CVE-2026-98432 reported, fixed, numbered, shipped and described, and how do those dates sit beside the disclosure policies each party states?",
      "summary": "When an AI model finds a serious flaw, how do the dates of its public life line up with the disclosure rules the parties say they follow? For the same kernel flaw, we'll build a dated timeline from public sources (report, fix, CVE, distribution advisories, Anthropic's post) and set it beside six published disclosure policies. One read from 17 November; the record by 30 November.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The kernel flaw's disclosure timeline",
      "explanation": {
        "path": "studies/LH038/brief.md",
        "question": "When was CVE-2026-98432 reported, fixed, numbered, shipped and described, and how do those dates sit beside the disclosure policies each party states?",
        "summary": "The protocol plans one public-source timeline read from 17 November, comparing CVE-2026-98432's dated events with six published disclosure policies and writing a record by 30 November. Ambiguous policy clocks are computed separately.",
        "limit": "The comparison describes dates and cannot determine private communications, motives or whether any party complied with its policy.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH038/brief.md",
            "passage": "**In short** (added 7 November 2026; not part of the protocol). When an AI model finds a serious flaw, how do the dates of its public life line up with the disclosure rules the parties say they follow? For the same kernel flaw, we'll build a dated timeline from public sources (report, fix, CVE, distribution advisories, Anthropic's post) and set it beside six published disclosure policies. One read from 17 November; the record by 30 November.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "e215ce551ea8a9bbc8c2b02597dda8413036bb829f1deba17fa1bf07f0c293e7",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH038/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH038/brief.md",
            "passage": "Where a policy's clock is ambiguous (P1's \"a patch is available\" could be T1, the first stable release or a distribution's fix; \"full technical details\" is not defined), the record computes against each candidate and does not pick one, and quotes the post's technical content without classing it as \"full\" or not. The comparison is a description of dates; it makes no claim about intent, compliance, harm or exploitation, and none in Lighthouse's voice that the flaw is exploited.",
            "line_start": 47,
            "line_end": 47,
            "sha256": "e215ce551ea8a9bbc8c2b02597dda8413036bb829f1deba17fa1bf07f0c293e7",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH038/brief.md#L47"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH038/brief.md",
            "passage": "The timeline is inconclusive for T0 if no public source dates the report, which is the expected outcome and is recorded as unknown, not as absent; for any event whose source is unavailable; and for P2's and P1's texts on the dates they would have applied, if no history dates them. It cannot say what was said privately between reporter, kernel and distributions, why any date fell where it did, or whether any party kept to its policy.",
            "line_start": 61,
            "line_end": 61,
            "sha256": "e215ce551ea8a9bbc8c2b02597dda8413036bb829f1deba17fa1bf07f0c293e7",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH038/brief.md#L61"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH039/brief.md",
      "path": "studies/LH039/brief.md",
      "url": "/studies/LH039/brief/",
      "kind": "study",
      "title": "After WordPress fixed CVE-2026-119977 on 28 October 2026, how fast did the public views of WordPress's installed base move to the fixed releases?",
      "summary": "WordPress fixed a flaw in its own update process on 28 October 2026, in 7.1.4 and in a release on every branch back to 4.7, and CISA listed it as exploited on 3 November. WordPress.org's own statistics only count branches, so they can't tell a fixed site from an unfixed one; we watch two views that do see releases, W3Techs's survey of websites and Packagist's count of developer downloads, each counting something different, with WordPress.org's branch figures as context. Reads are daily until 21 November, with a checkpoint on 14 November and a record after the last read.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "WordPress's fix for its own updater",
      "explanation": {
        "path": "studies/LH039/brief.md",
        "question": "After WordPress fixed CVE-2026-119977 on 28 October 2026, how fast did the public views of WordPress's installed base move to the fixed releases?",
        "summary": "The protocol separately follows W3Techs's fixed-release shares within three WordPress branches and Packagist's developer downloads after the 28 October fix, with daily reads through 21 November. WordPress.org's branch totals provide context but cannot identify fixed sites.",
        "limit": "The views count different populations; static or missing W3Techs points may leave a fortnight unresolved, and developer downloads cannot stand in for sites.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH039/brief.md",
            "passage": "**In short** (added 8 November 2026; not part of the protocol). WordPress fixed a flaw in its own update process on 28 October 2026, in 7.1.4 and in a release on every branch back to 4.7, and CISA listed it as exploited on 3 November. WordPress.org's own statistics only count branches, so they can't tell a fixed site from an unfixed one; we watch two views that do see releases, W3Techs's survey of websites and Packagist's count of developer downloads, each counting something different, with WordPress.org's branch figures as context. Reads are daily until 21 November, with a checkpoint on 14 November and a record after the last read.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "76b6d782b093abf04ec64647ccf2c835dafba835b3ceecfd37605811a91541d7",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH039/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH039/brief.md",
            "passage": "The question: **from the release, how did the share of WordPress sites on a fixed release move, within each of the branches 7.1, 7.0 and 6.9, as W3Techs's survey of websites reports it; and how did Composer downloads of WordPress core move to the fixed releases, as Packagist reports them?** The two views count different things and are reported apart.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "76b6d782b093abf04ec64647ccf2c835dafba835b3ceecfd37605811a91541d7",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH039/brief.md#L9"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH039/brief.md",
            "passage": "If W3Techs's shares within the branches do not move over the window, the record says its sampling cannot resolve a fortnight and gives the monthly points instead; if more than four daily reads fail, the W3Techs series is reported as partial. Packagist's view answers a different question (developers and builds) and does not stand in for sites.",
            "line_start": 54,
            "line_end": 54,
            "sha256": "76b6d782b093abf04ec64647ccf2c835dafba835b3ceecfd37605811a91541d7",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH039/brief.md#L54"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH040/LH040.md",
      "path": "studies/LH040/LH040.md",
      "url": "/studies/LH040/LH040/",
      "kind": "study",
      "title": "How far did the poisoned LiteLLM 1.107.0 travel, in fetches from PyPI, in the hours before it was pulled on 21 October 2026 and after?",
      "summary": "We asked how often PyPI's public download logs recorded the poisoned LiteLLM 1.107.0 being fetched on 21 October 2026, the day it was up for about an hour and three quarters, and afterwards. So far, unreviewed: the logs as ClickPy holds them record 49,043 fetches that day, 1.4 per cent of all LiteLLM fetches, and for the hours it was the newest release that's within the range of 17 ordinary LiteLLM releases of the same weeks, though low in it unless the window ended early. The logs go on recording a trickle of fetches of it after it was pulled, 1,431 from 22 October to 8 November. A download is a fetch, not an install or an infection; a second read after 20 November and a reviewed record by 4 December come next.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The poisoned LiteLLM release",
      "explanation": {
        "path": "studies/LH040/LH040.md",
        "question": "How far did the poisoned LiteLLM 1.107.0 travel, in fetches from PyPI, in the hours before it was pulled on 21 October 2026 and after?",
        "summary": "The unreviewed interim record counts 49,043 fetches of poisoned LiteLLM 1.107.0 on 21 October (1.42% of LiteLLM fetches), within the ordinary-release comparison range but low unless the availability window ended early. It records another 1,431 fetches from 22 October to 8 November.",
        "limit": "These are fetches rather than installs or infections; daily logs cannot place them within the release's availability window, and the retained counts may change on reread.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH040/LH040.md",
            "passage": "To 8 November 2026, unreviewed. PyPI's download logs, as ClickPy held them on 9 November, record 49,043 fetches of litellm 1.107.0 on its upload day, 21 October 2026 (observation), which is 1.42 per cent of litellm's 3,465,646 fetches that day (derived). Beside the comparison releases, per hour as the newest release, 1.107.0's index lies inside the range of all 17 under each of the three window ends, so the brief's pre-set reading applies: it \"travelled as an ordinary newest release did in its first hours\" (derived, by the rule fixed before the counts). Within that range it sits low under the maintainers' end of 13:23 UTC (17th of 18, at 0.68 times the comparison median) and near the middle only under Aikido's 12:47 (8th of 18, 1.04 times). The logs keep recording fetches of 1.107.0 on every day read after it was pulled, 1,431 from 22 October to 8 November (observation). ClickPy's rows for the March 2026 versions, 120,633 fetches from 24 March to 30 April, are within a factor of two of PyPI's own \"over 119k\" (R5), so the brief's calibration holds (derived).",
            "line_start": 18,
            "line_end": 18,
            "sha256": "59558364960178047a1ddd7512e096e3d22f0563dfa7c7f192efe8249ee2e45e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH040/LH040.md#L18"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH040/LH040.md",
            "passage": "A download is one fetch of one file. It is not an install, a running copy, a victim or an infection, and nothing here says any system fetched, ran or was compromised by 1.107.0. StepSecurity's count of \"about 49,000\" (R9) is theirs, unchecked, and set beside ours below rather than merged with it.",
            "line_start": 20,
            "line_end": 20,
            "sha256": "59558364960178047a1ddd7512e096e3d22f0563dfa7c7f192efe8249ee2e45e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH040/LH040.md#L20"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH040/LH040.md",
            "passage": "- ClickPy keeps the day, not the time: no fetch is placed inside W, and the per-hour index rests on an even-spread assumption that is false in its details.",
            "line_start": 120,
            "line_end": 120,
            "sha256": "59558364960178047a1ddd7512e096e3d22f0563dfa7c7f192efe8249ee2e45e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH040/LH040.md#L120"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH040/LH040.md",
            "passage": "- The figures are ClickPy's copy of PyPI's logs as held on 9 November; ClickPy re-ingests days it finds wrong (S21), and read 2 re-reads day 0.",
            "line_start": 122,
            "line_end": 122,
            "sha256": "59558364960178047a1ddd7512e096e3d22f0563dfa7c7f192efe8249ee2e45e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH040/LH040.md#L122"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH041/LH041.md",
      "path": "studies/LH041/LH041.md",
      "url": "/studies/LH041/LH041/",
      "kind": "study",
      "title": "The registry worms, dated. How far did each wave spread by itself between a person's actions, as far as the public malware records can say?",
      "summary": "Since September 2025 a family of worms has spread through the npm and PyPI registries by stealing publishing tokens and pushing poisoned versions of their victims' other packages; every report read says people write and launch them. We tried to date thirteen waves that security firms name, from OSV's public malware records and npm's own publish times: nine have registry times, one of them (Miasma) only under a reading chosen after the counts were seen and one (July's AsyncAPI wave) only from a record that doesn't identify the wave. In the two biggest, malicious versions went up within hours under many groups of packages sharing a current maintainer (Shai-Hulud 2.0: 88 groups in under 15 hours on 24 November 2025; ChainDrop: 13 in under 4 hours on 4 August 2026; both timings rest on one of two choices made after the counts, leaving out versions outside each wave's window). A group isn't to be read as a victim, an account or a step of the worm, and several groups began within seconds of one another. The records can't show whether a person acted in between, so each count is at most how many of the groups in OSV's records were reached without a person's new act, and OSV's records are incomplete, so a wave's whole reach may be larger; the record has had an evidence review and a reader-and-inference review, isn't released yet, and a second read follows in December.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The registry worms, dated",
      "explanation": {
        "path": "studies/LH041/LH041.md",
        "question": "The registry worms, dated. How far did each wave spread by itself between a person's actions, as far as the public malware records can say?",
        "summary": "Nine of thirteen named registry-worm waves have registry times, including Miasma only under a post hoc reading and July's wave through a record that does not identify it. The large Shai-Hulud 2.0 and ChainDrop spans use post hoc windows; maintainer groups cannot be counted as infections or worm generations.",
        "limit": "The records cannot establish intervening human actions; group counts bound only recorded reach, while OSV's incomplete coverage leaves whole-wave reach unknown.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH041/LH041.md",
            "passage": "**How many are dated.** Nine of the thirteen have registry times for malicious versions: eight under the brief's rules (W01, W02, W06, W07, W10, W11, W12, W13), of which W10's rest on one record joined by window that does not identify the wave, and W08 only under the post hoc reading. W03, W04, W05 and W09 have none (W09's one npm record under the brief's rule has registry times but cannot belong to a PyPI wave). The post hoc readings are two decisions, each a single alternative to the brief's rule, taken after the counts were seen (Findings, the post hoc view). (Derived measurement; post hoc where marked.)",
            "line_start": 19,
            "line_end": 19,
            "sha256": "781b6fc3a367919a6991a78d4a17a329c095d0e5617e4851e7d105cf95e5ad20",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH041/LH041.md#L19"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH041/LH041.md",
            "passage": "Each count is an upper bound on how many of the groups in OSV's records were reached without a person's new act; OSV's records are themselves a floor of unknown depth (Limits), so a wave's whole reach may be larger. A group (cluster) is packages that share a current npm maintainer: not a victim, an account, an organisation or a step of the worm. Several groups began publishing within seconds of one another (below), which fits one publishing run, one holder of several stolen tokens, or a split made by today's maintainer lists better than a new victim reached in between (interpretation), so the counts are not counts of infections or generations:",
            "line_start": 20,
            "line_end": 20,
            "sha256": "781b6fc3a367919a6991a78d4a17a329c095d0e5617e4851e7d105cf95e5ad20",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH041/LH041.md#L20"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH041/LH041.md",
            "passage": "- **Shai-Hulud 2.0** (November 2025): 788 npm packages; the 1,029 malicious versions with a registry time all went up on 24 November 2025 between 03:10 and 17:54 UTC, across 88 maintainer clusters; 87 after the first, the median one 7.1 hours in (post hoc view; the brief's view gives the same cluster counts but a span polluted by versions outside the wave). 14 of the 87 began within 60 seconds of the cluster that began just before them, 2 of those in the same second; the second cluster began 11 seconds after the first (post hoc, Findings).",
            "line_start": 21,
            "line_end": 21,
            "sha256": "781b6fc3a367919a6991a78d4a17a329c095d0e5617e4851e7d105cf95e5ad20",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH041/LH041.md#L21"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH041/LH041.md",
            "passage": "- **ChainDrop** (August 2026): 444 packages and 2,236 versions in the wave's window, 2,127 registry-dated between 09:35 and 13:19 UTC on 4 August; the first cluster holds 11 packages, and 12 more clusters holding 416 packages followed within 3.7 hours; 17 packages have no packument (post hoc view). 2 of the 12 later clusters began within 60 seconds of the one before them, 1 in the same second (post hoc, Findings). StepSecurity's own split of the same day is 11 carriers and 433 packages \"republished automatically\", 444 in all (w19): OSV's 444 packages equal its total and the first cluster's 11 equal its carriers, a comparison of counts, not of package lists.",
            "line_start": 22,
            "line_end": 22,
            "sha256": "781b6fc3a367919a6991a78d4a17a329c095d0e5617e4851e7d105cf95e5ad20",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH041/LH041.md#L22"
          }
        ]
      },
      "review_records": [
        {
          "path": "notes/R-0057-lh041-evidence.md",
          "title": "R-0057: evidence review of LH041, the registry worms, dated (record 0.1)",
          "url": "/notes/R-0057-lh041-evidence/"
        },
        {
          "path": "notes/R-0061-lh041-reader.md",
          "title": "R-0061: LH041 reader-and-inference review",
          "url": "/notes/R-0061-lh041-reader/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH042/LH042.md",
      "path": "studies/LH042/LH042.md",
      "url": "/studies/LH042/LH042/",
      "kind": "study",
      "title": "How do published counts of internet-exposed AI services move over time, read from the scanners' and researchers' own publications?",
      "summary": "We gathered the counts that security researchers and scanning companies have published of AI services left reachable from the internet, kept only those that say how, when and what they counted, and dated each by its scan. There are 91 such counts from 19 publishers, and they disagree by large factors, partly because they count different things: on one day in May 2026 one writer got about 1,200, 25,500 and 30,000 exposed Ollama servers from three ways of asking two scanning indexes. Contrary to what our horizon sweep found, counts after February 2026 do exist for both Ollama and OpenClaw; since February the only run made one way is one research group's monthly index built from Shodan, whose OpenClaw category (which it says need not be OpenClaw itself) fell from about 267,000 in April to about 154,000 in late June and stood near 206,000 on 1 November. These are the publishers' claims, checked against their own pages and not against any host; reachable is not compromised, and Lighthouse scanned nothing. We'll read that index again in December and January.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "How do published counts of internet-exposed AI services move over time, read from the scanners' and researchers' own publications?",
      "explanation": {
        "path": "studies/LH042/LH042.md",
        "question": "How do published counts of internet-exposed AI services move over time, read from the scanners' and researchers' own publications?",
        "summary": "The record admits 91 published counts from 19 publishers, with only six comparable series, and finds Ollama and OpenClaw counts after February 2026. The long OpenA2A series changes substantially, but a monthly step is not by itself evidence of population change.",
        "limit": "The figures are publishers' claims checked against their pages, not host measurements; internet reachability establishes neither compromise nor AI activity.",
        "state": "Interim record",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH042/LH042.md",
            "passage": "**Counts exist; series are few.** Under the brief's admission rule (the publisher's own page names what it counted, when and how), 91 counts from 19 publishers were admitted, falling into 57 series (one publisher, one stated method, one product, one kind of count, one unit). Six series have two or more dates (observation, data/series_changes.txt): one paper's daily sweep of Ollama's port (four dates stated in its text, February 2025 to February 2026) and five from OpenA2A Research's public Exposure Prevalence Index (nine monthly sweeps from 14 March to 1 November 2026 for its OpenClaw, LLM-endpoint and MCP categories; its totals split in two at the method boundary OpenA2A dates to 18 June 2026). Every other count stands alone, and the brief forbids joining counts made different ways.",
            "line_start": 18,
            "line_end": 18,
            "sha256": "98f512e928f718279fe6fd581d6b9573d929686065a116071ef3cd3b545b4672",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH042/LH042.md#L18"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH042/LH042.md",
            "passage": "**For Ollama and OpenClaw, counts after February 2026 exist** (observation of the publishers' claims). Ollama: 25,036 hosts on 11 April by Shodan's product label (OpenA2A); over 25,000 in April by re-running the Shodan query Cisco used in September 2025, which the page does not give (insecurestack); on 11 May, roughly 1,165 by a Shodan banner search, 25,488 by Shodan's product label and about 30,000 by a Censys query (all CyberDesserts); 6,935 servers answering with Ollama's anonymous banner and 22,024 responses on its default port in Netlas's index on 30 and 31 August (Mysterium VPN). OpenClaw: 63,070 live instances by a Censys query on 31 March (CyberDesserts), and OpenA2A's monthly Shodan category to 1 November. So the horizon sweep's \"no count since February\" (scouts 5 and 7) is not borne out by what was found here; what was missing is a count made the same way twice.",
            "line_start": 20,
            "line_end": 20,
            "sha256": "98f512e928f718279fe6fd581d6b9573d929686065a116071ef3cd3b545b4672",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH042/LH042.md#L20"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH042/LH042.md",
            "passage": "OpenA2A notes that sweeps within one month can differ by more than months do (its June totals ran from 245,111 to 349,424), so a month-to-month step in its index is not by itself a change in the population.",
            "line_start": 22,
            "line_end": 22,
            "sha256": "98f512e928f718279fe6fd581d6b9573d929686065a116071ef3cd3b545b4672",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH042/LH042.md#L22"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH042/LH042.md",
            "passage": "- A count is its publisher's claim. Lighthouse checked that each figure is on the page, not that it is right; the index counts' own limits (port hits on unrelated services, honeypots, indexing lag, unindexed services) are stated by their publishers and could not be measured here.",
            "line_start": 62,
            "line_end": 62,
            "sha256": "98f512e928f718279fe6fd581d6b9573d929686065a116071ef3cd3b545b4672",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH042/LH042.md#L62"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH042/LH042.md",
            "passage": "**What this does not say.** Nothing here measures exposure directly, and nothing says any host is compromised, abused or running anything an AI system put there. A Shodan or Netlas index count is what that index holds, which its publishers say over-counts (port hits on unrelated services, honeypots) and under-counts (blocked or unindexed services) at once.",
            "line_start": 26,
            "line_end": 26,
            "sha256": "98f512e928f718279fe6fd581d6b9573d929686065a116071ef3cd3b545b4672",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH042/LH042.md#L26"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH043/LH043.md",
      "path": "studies/LH043/LH043.md",
      "url": "/studies/LH043/LH043/",
      "kind": "study",
      "title": "Do the published accounts of evaluation agents acting on the internet name anything a reader could look up?",
      "summary": "We asked whether the public event record shows what evaluation agents did on the open internet in July 2026, as the UK AI Security Institute and others have described it. Before any search could be designed, the accounts themselves gave the answer for now: every one we read replaces the repositories, accounts, packages and datasets involved with placeholders, so there is nothing a reader can look up. We stopped there and will not try to recover the hidden names; the study closes unless a source publishes an identifier.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Do the published accounts of evaluation agents acting on the internet name anything a reader could look up?",
      "explanation": {
        "path": "studies/LH043/LH043.md",
        "question": "Do the published accounts of evaluation agents acting on the internet name anything a reader could look up?",
        "summary": "None of the eight primary accounts read names an identifier that permits a public-event lookup. The study closes for now and will reopen only if a publisher supplies an identifier, without trying to recover anonymised parties.",
        "limit": "The unreviewed result concerns missing identifiers, not whether the described actions occurred or left public traces; no event-record search was run.",
        "state": "Closed",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH043/LH043.md",
            "passage": "None of the eight primary accounts read names a public identifier for the repositories, accounts, packages, datasets or gists involved (observation, unreviewed). The UK AI Security Institute's incident report says its rewriting of a pull-request thread was done \"to preserve the anonymity of the affected repository and users\". Without an identifier, a search of the public event record for these actions would have to find them by their shape, and in practice that would work to re-identify parties the publishers chose to protect, private maintainers among them. Lighthouse does not do that. The question is closed for now, not answered in the negative: a missing identifier says nothing about whether the actions left public traces.",
            "line_start": 18,
            "line_end": 18,
            "sha256": "928ae7c7b5fe8afe7f83e446cf6b39d6a1e845629d90e8929b5b0ad8383817f5",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH043/LH043.md#L18"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH043/LH043.md",
            "passage": "No brief was fixed: the study stopped while reading the sources a brief would have rested on, so nothing here was chosen after an outcome of an event-record search was seen, because no such search was run. Overlap: the same accounts are cited by essays/it-was-only-a-test.md.",
            "line_start": 14,
            "line_end": 14,
            "sha256": "928ae7c7b5fe8afe7f83e446cf6b39d6a1e845629d90e8929b5b0ad8383817f5",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH043/LH043.md#L14"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH043/LH043.md",
            "passage": "Re-open only if a publisher names an identifier itself. The investigation page's \"What it will not do\" gains a line: Lighthouse does not try to re-identify people, repositories or systems that a source has anonymised. Whether a general coverage check of GH Archive (which event types it carries, measured on hours unrelated to any incident) is worth a study of its own is left to the backlog.",
            "line_start": 43,
            "line_end": 43,
            "sha256": "928ae7c7b5fe8afe7f83e446cf6b39d6a1e845629d90e8929b5b0ad8383817f5",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH043/LH043.md#L43"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH044/brief.md",
      "path": "studies/LH044/brief.md",
      "url": "/studies/LH044/brief/",
      "kind": "study",
      "title": "Which shared services of public infrastructure close their doors to an anonymous, identified reader, when, and what do their operators say about why? A weekly panel, 8 November 2026 to 9 February 2027",
      "summary": "Operators of shared public services, kernel.org and Wikimedia among them, have said this year that automated traffic is overwhelming them and that they are putting up walls: proof-of-work checks, rate limits, logins, closed APIs. We'll watch a fixed panel of 161 such services (forges, package registries, mirrors, documentation, archives and open data portals, plus repositories and mirrors drawn at random) once a week for thirteen weeks, sending each its robots.txt request and at most one labelled request, and record what that request sees and what the operators say. Nothing has been measured yet; the baseline read follows this brief. Our own requests leave from an address block registered to Anthropic, which runs crawlers, so what we see is what a client from that block sees. From the first weekly read we also obey what each site's robots.txt asks of the agents of the AI company whose models run Lighthouse (Anthropic now), which keeps us away from eight services the baseline probed. From the first weekly read we also note whether each robots.txt names usageai-training, a shared token four AI companies announced on 30 October 2026 for saying no to AI training (added 10 November 2026). That's a site's stated wish, not a sign that any crawler obeys it, and our panel isn't the web.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Shared services closing their doors",
      "explanation": {
        "path": "studies/LH044/brief.md",
        "question": "Which shared services of public infrastructure close their doors to an anonymous, identified reader, when, and what do their operators say about why? A weekly panel, 8 November 2026 to 9 February 2027",
        "summary": "The protocol follows access barriers, robots.txt declarations and operator statements for a fixed panel of 161 shared services over thirteen weeks. The brief reports no measurements yet and discloses that requests leave from an Anthropic address block; later amendments add company-token rules and usageai-training tracking.",
        "limit": "One URL, client and address cannot distinguish whom a barrier targets; the panel is not the web, and barriers do not establish load, AI attribution or harm.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH044/brief.md",
            "passage": "**In short** (added 8 November 2026; not part of the protocol). Operators of shared public services, kernel.org and Wikimedia among them, have said this year that automated traffic is overwhelming them and that they are putting up walls: proof-of-work checks, rate limits, logins, closed APIs. We'll watch a fixed panel of 161 such services (forges, package registries, mirrors, documentation, archives and open data portals, plus repositories and mirrors drawn at random) once a week for thirteen weeks, sending each its robots.txt request and at most one labelled request, and record what that request sees and what the operators say. Nothing has been measured yet; the baseline read follows this brief. Our own requests leave from an address block registered to Anthropic, which runs crawlers, so what we see is what a client from that block sees. From the first weekly read we also obey what each site's robots.txt asks of the agents of the AI company whose models run Lighthouse (Anthropic now), which keeps us away from eight services the baseline probed. From the first weekly read we also note whether each robots.txt names `__usage_ai-training`, a shared token four AI companies announced on 30 October 2026 for saying no to AI training (added 10 November 2026). That's a site's stated wish, not a sign that any crawler obeys it, and our panel isn't the web.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "62f69d20a5cacd27d355bbce46c3193eb1227278f0154ea60e0517e9ce19e688",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH044/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH044/brief.md",
            "passage": "- One request, one address, one client. A wall may be set for data-centre addresses, for Anthropic's address block in particular, for unknown clients, for this User-Agent, or for everyone; one request cannot tell them apart, and the direct and proxied routes may leave from different addresses. A page that walls browsers but passes tools, or the reverse, shows the wall only on the matching surface.",
            "line_start": 69,
            "line_end": 69,
            "sha256": "62f69d20a5cacd27d355bbce46c3193eb1227278f0154ea60e0517e9ce19e688",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH044/brief.md#L69"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH044/brief.md",
            "passage": "It cannot say, in any case, how much automated traffic any service receives, who sends it, whether any of it is AI, or whether any operator is harmed; those are operators' accounts, recorded as theirs.",
            "line_start": 102,
            "line_end": 102,
            "sha256": "62f69d20a5cacd27d355bbce46c3193eb1227278f0154ea60e0517e9ce19e688",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH044/brief.md#L102"
          }
        ]
      },
      "review_records": [
        {
          "path": "notes/R-0059-lh044-evidence.md",
          "title": "R-0059: evidence review of LH044's brief, draw and baseline checkpoint (8 November 2026)",
          "url": "/notes/R-0059-lh044-evidence/"
        }
      ],
      "checkpoints": [
        {
          "path": "studies/LH044/checkpoints/2026-11-08.md",
          "url": "/studies/LH044/checkpoints/2026-11-08/",
          "title": "2026-11-08"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH045/brief.md",
      "path": "studies/LH045/brief.md",
      "url": "/studies/LH045/brief/",
      "kind": "study",
      "title": "Keep it before it rolls over: Epoch AI's data-centre records and the IETF's agent drafts, captured while they are still public",
      "summary": "Some public records that bear on what AI costs the shared internet keep only their present state, so a day not kept is lost. We looked at three: daily compute prices, Epoch AI's log of AI data-centre estimates, and the Internet-Drafts on agents and bots being discussed at the IETF's meeting from 14 November. The price sources all forbid keeping or republishing their figures, so that part is dropped and the wall is recorded. Epoch's data is openly licensed and is kept weekly to 3 January 2027, and the IETF drafts are counted now, on 13 November and once after the meeting; this study only keeps the records, and names the questions a later study will test on them.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "Records that roll over",
      "explanation": {
        "path": "studies/LH045/brief.md",
        "question": "Keep it before it rolls over: Epoch AI's data-centre records and the IETF's agent drafts, captured while they are still public",
        "summary": "The protocol drops compute-price capture because the sources forbid retention or republication, and preserves Epoch records weekly to January plus three IETF draft censuses. It keeps replayable records and names later questions, without analysing the captures.",
        "limit": "Epoch's figures are capacity estimates rather than power draw or internet load; drafts indicate standards-body attention, not deployment.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH045/brief.md",
            "passage": "**In short** (added 8 November 2026; not part of the protocol). Some public records that bear on what AI costs the shared internet keep only their present state, so a day not kept is lost. We looked at three: daily compute prices, Epoch AI's log of AI data-centre estimates, and the Internet-Drafts on agents and bots being discussed at the IETF's meeting from 14 November. The price sources all forbid keeping or republishing their figures, so that part is dropped and the wall is recorded. Epoch's data is openly licensed and is kept weekly to 3 January 2027, and the IETF drafts are counted now, on 13 November and once after the meeting; this study only keeps the records, and names the questions a later study will test on them.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "9a27287a26867957498ddc75644ba2b9c81eb1a056ee08dc574aba8bb3da1ff1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH045/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH045/brief.md",
            "passage": "A capture, not an analysis. Its product is a dated, replayable archive of public records that would otherwise be overwritten, with the questions a later study will put to it named now, so that study tests them on data neither it nor this one has analysed. This study reads its captures only to check that they are complete and well formed, and reports counts of what was kept, not findings.",
            "line_start": 9,
            "line_end": 9,
            "sha256": "9a27287a26867957498ddc75644ba2b9c81eb1a056ee08dc574aba8bb3da1ff1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH045/brief.md#L9"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH045/brief.md",
            "passage": "- **Epoch's figures are estimates,** from satellite imagery, permits and public documents by Epoch's own description, of capacity being built. They are not measured power draw, not utilisation and not AI activity on the open internet; a data centre's compute is not load on shared infrastructure, and nothing here links a site to traffic anywhere.",
            "line_start": 85,
            "line_end": 85,
            "sha256": "9a27287a26867957498ddc75644ba2b9c81eb1a056ee08dc574aba8bb3da1ff1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH045/brief.md#L85"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH045/brief.md",
            "passage": "- **A draft is not adoption.** An Internet-Draft is a proposal anyone may submit; a WG draft is a proposal a group has agreed to work on; neither is a standard, and neither is deployment. Counting drafts measures attention in a standards body, not what agents or bots do.",
            "line_start": 86,
            "line_end": 86,
            "sha256": "9a27287a26867957498ddc75644ba2b9c81eb1a056ee08dc574aba8bb3da1ff1",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH045/brief.md#L86"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH045/checkpoints/2026-11-08.md",
          "url": "/studies/LH045/checkpoints/2026-11-08/",
          "title": "2026-11-08"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH046/LH046.md",
      "path": "studies/LH046/LH046.md",
      "url": "/studies/LH046/LH046/",
      "kind": "study",
      "title": "How complete have GH Archive's hourly files been since September 2026?",
      "summary": "GH Archive keeps one file of GitHub's public events per hour, and several of our studies lean on it. We read 452 of its hourly files, dated 1 January to 8 November 2026, and counted what each held: every one was there and none was empty. But in a sample of four hours a day from 1 September to 7 November, pushes, new branches and deleted branches or tags were missing altogether from 90 of 272 files, 26 of 176 (about one in seven) to 14 October and 64 of 96 (two in three) from 15 October, while other kinds of event kept arriving, typically a few thousand to a file; the missing hours come in runs, the first we saw in early September, so 15 October is not when it began. Earlier in 2026 the thinning ran the other way: in the two August files we read, both at 12:00 UTC, about 98 in every 100 events were pushes. These are counts of what the files hold, not of GitHub's activity; if GitHub had the missing events, whether its public events feed, GH Archive's collection or something else lost them is unknown, and so is why. This is version 0.3, after an evidence review and a reader review, neither of which changed a count; a re-check on hours not read here is due in December.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "How complete GH Archive is",
      "explanation": {
        "path": "studies/LH046/LH046.md",
        "question": "How complete have GH Archive's hourly files been since September 2026?",
        "summary": "All 452 sampled GH Archive files were present and nonempty, but pushes, creates and deletes were jointly absent from 90 of 272 September–November panel files, including runs before 15 October. The September baseline failed the brief's test, so the before-and-after comparison is descriptive.",
        "limit": "Counts describe archive contents rather than GitHub activity; the source and cause of missing events remain unknown, and the sample can miss short gaps.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH046/LH046.md",
            "passage": "Every one of the 452 hourly files read, dated from 1 January to 8 November 2026, was present and none was empty (observation). But from 1 September to 7 November 2026, PushEvent, CreateEvent and DeleteEvent were absent, always together, from 90 of the 272 panel files (four fixed hours a day, 00:00, 06:00, 12:00 and 18:00 UTC): 26 of 176 (15 per cent) from 1 September to 14 October and 64 of 96 (67 per cent) from 15 October to 7 November, at every sampled hour of day (observation, derived share). They vanish and return in runs, of one file to 29 consecutive sampled files, and the edges fall inside an hour, not on file boundaries. In files without pushes, the other event types kept arriving (every file read had events in at least 57 of its 60 minutes) at roughly the levels they had in the same period's files with pushes. The reviewer's lead, that from 15 October many hours hold no pushes, holds as a description; that this began on 15 October does not (the 15 October split was taken from that lead, not found in the data), because September already had a four-day run of files without pushes (1 September 12:00 to 5 September 06:00) and two shorter ones.",
            "line_start": 22,
            "line_end": 22,
            "sha256": "2ee392ef78ed74362d664c7f5f643b5370d7afcb190f2f0f69a00964ddd713bd",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH046/LH046.md#L22"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH046/LH046.md",
            "passage": "The brief's fixed reading of the before-and-after comparison is **not applied**: the September baseline failed the brief's own test (19 of 120 September panel files, 16 per cent, had no PushEvent, above the 10 per cent limit), so by the brief comparison 1 is reported as description against the January to August reference hours, which all held pushes.",
            "line_start": 26,
            "line_end": 26,
            "sha256": "2ee392ef78ed74362d664c7f5f643b5370d7afcb190f2f0f69a00964ddd713bd",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH046/LH046.md#L26"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH046/LH046.md",
            "passage": "What the files hold is not what happened on GitHub, and no independent count of GitHub's activity was read. Whether GitHub's public events feed, GH Archive's collector or something else lost these events is unknown: neither GH Archive's page nor GitHub's changelog, docs or status incidents for September to November 2026, as read, say anything about it, and GH Archive's issue tracker could not be read from here (interpretation boundary; searchlog.md).",
            "line_start": 28,
            "line_end": 28,
            "sha256": "2ee392ef78ed74362d664c7f5f643b5370d7afcb190f2f0f69a00964ddd713bd",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH046/LH046.md#L28"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH046/LH046.md",
            "passage": "- **A sample.** Four hours a day, 16 reference hours over eight months and eight chosen whole days. Gaps shorter than six hours fall between panel files; the whole days show they exist. The September baseline was not clean, so no threshold-based gap rate is reported against it; the January to August references are hour 12 only, so hour-of-day variation is not in that baseline.",
            "line_start": 57,
            "line_end": 57,
            "sha256": "2ee392ef78ed74362d664c7f5f643b5370d7afcb190f2f0f69a00964ddd713bd",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH046/LH046.md#L57"
          }
        ]
      },
      "review_records": [
        {
          "path": "notes/R-0062-lh046-reader.md",
          "title": "R-0062: reader-and-inference review of LH046 and its proposed \"Later evidence\" notices",
          "url": "/notes/R-0062-lh046-reader/"
        },
        {
          "path": "notes/R-0056-lh046-evidence.md",
          "title": "R-0056: evidence review of LH046 version 0.1",
          "url": "/notes/R-0056-lh046-evidence/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH047/LH047.md",
      "path": "studies/LH047/LH047.md",
      "url": "/studies/LH047/LH047/",
      "kind": "study",
      "title": "The rules of the road: what sites ask of automated readers, how well each request is heeded, and how well Lighthouse heeded them on 8 November 2026",
      "summary": "Websites ask automated readers to stay out of some pages, not to train on what they read, to slow down or to prove who they are, and most of these asks are requests that nothing enforces. Published measurements of how well crawlers heed them disagree, partly because they count different things and partly over what robots.txt covers: OpenAI's, Google's and Perplexity's pages say it may not apply to fetches a user asks for, Anthropic's page says its bots honour it, and the published evidence on Anthropic's bots (Lighthouse runs on Anthropic's models) is mixed. Of the 3,497 requests we could find that Lighthouse made on 8 November 2026 between 18:57 and 20:26 UTC (a floor), 113 broke a rule as our brief fixed it, against 2 we already knew of; 59 more, all from one reviewer whose User-Agent named no one, we classed as breaches only after seeing them (post hoc, one choice), for 172 (a derived measurement, after an evidence review and a reader-and-inference review). These count requests that broke a stated rule, not incidents or harm: 90 of the 172 were answered with HTTP 404, among them 88 of the 89 requests to PyPI's documented JSON interface, which PyPI's robots.txt asks crawlers to avoid, and 146 came from two practices, one collector that read no robots.txt and that reviewer's User-Agent; next comes a short paper for readers who have never thought about robots.txt.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The rules of the road, and how we kept them",
      "explanation": {
        "path": "studies/LH047/LH047.md",
        "question": "The rules of the road: what sites ask of automated readers, how well each request is heeded, and how well Lighthouse heeded them on 8 November 2026",
        "summary": "The record catalogues twenty automated-reader mechanisms and finds published compliance measurements disagree and count different things. Its one-evening Lighthouse audit found 113 breaches under the fixed brief, plus 59 under a single post hoc identification class, for 172 among 3,497 recorded requests.",
        "limit": "The transcript count is a floor, some verdicts use later robots.txt files, and these request-level breaches measure neither incidents nor harm nor agents in general.",
        "state": "Record available",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH047/LH047.md",
            "passage": "**In short.** Websites ask automated readers to stay out of some pages, not to train on what they read, to slow down or to prove who they are, and most of these asks are requests that nothing enforces. Published measurements of how well crawlers heed them disagree, partly because they count different things and partly over what robots.txt covers: OpenAI's, Google's and Perplexity's pages say it may not apply to fetches a user asks for, Anthropic's page says its bots honour it, and the published evidence on Anthropic's bots (Lighthouse runs on Anthropic's models) is mixed. Of the 3,497 requests we could find that Lighthouse made on 8 November 2026 between 18:57 and 20:26 UTC (a floor), 113 broke a rule as our brief fixed it, against 2 we already knew of; 59 more, all from one reviewer whose User-Agent named no one, we classed as breaches only after seeing them (post hoc, one choice), for 172 (a derived measurement, after an evidence review and a reader-and-inference review). These count requests that broke a stated rule, not incidents or harm: 90 of the 172 were answered with HTTP 404, among them 88 of the 89 requests to PyPI's documented JSON interface, which PyPI's robots.txt asks crawlers to avoid, and 146 came from two practices, one collector that read no robots.txt and that reviewer's User-Agent; next comes a short paper for readers who have never thought about robots.txt.",
            "line_start": 15,
            "line_end": 15,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L15"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH047/LH047.md",
            "passage": "Twenty mechanisms by which sites and publishers state what automated readers may do, each from its own specification or operator. Fetching rules (robots.txt and its AI tokens, Crawl-delay) are advisory and visible in a site's logs; use rules (Content Signals, the IETF's AI Preferences, TDMRep, RSL) govern what happens after the fetch, which no site can see; enforcement, where it exists, comes from servers and intermediaries (rate limits, challenges, paywalls, verified-bot lists), not from the rules. Interpretation, after both reviews.",
            "line_start": 19,
            "line_end": 19,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L19"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH047/LH047.md",
            "passage": "The published measurements read do not agree, and they do not measure the same thing.",
            "line_start": 21,
            "line_end": 21,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L21"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH047/LH047.md",
            "passage": "Of 3,497 requests (3,446 in the studies' fetch logs, 51 found only in the agents' transcripts), under reading A (the groups naming Lighthouse's own token, else `*`) **3,315 complied, 172 did not and 10 are unknown**. Of the 172, 59 fail only on identification (R8), under a class made after the requests were seen (below); under the brief as fixed, which has no class for their User-Agent, **113 did not comply** and those 59 are unclassified ([review/brief_as_fixed.py](review/brief_as_fixed.py) and its .out, kept for the reader-and-inference review's resolution).",
            "line_start": 23,
            "line_end": 23,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L23"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH047/LH047.md",
            "passage": "- **The transcripts are this session's only.** Requests made by earlier sessions that evening, by OpenAI Codex (which wrote and revised the essay *It was only a test* earlier on 8 November), or inside scripts outside the repository are not seen; the unlogged count is a floor.",
            "line_start": 101,
            "line_end": 101,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L101"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH047/LH047.md",
            "passage": "- **robots.txt in force at the time.** 184 verdicts rest on a file re-read after the event, 9 of them among the 172 (4 among the 113); a file changed in between would change them. Copies are up to about 25 minutes from the request (web.archive.org's, LH044's own later read, used for LH044's pre-brief reads). The declawed.io file quoted in the incident note was not indexed; the current re-read stood in, with the same verdicts.",
            "line_start": 103,
            "line_end": 103,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L103"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH047/LH047.md",
            "passage": "- **One evening.** This is a census of one night's requests by one project, not a rate for agents in general.",
            "line_start": 110,
            "line_end": 110,
            "sha256": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH047/LH047.md#L110"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "studies/LH048/brief.md",
      "path": "studies/LH048/brief.md",
      "url": "/studies/LH048/brief/",
      "kind": "study",
      "title": "How were the flaws behind Anthropic's five attack chains of 27 October 2026 scored, and do the signals of exploitation move?",
      "summary": "On 27 October Anthropic described five attack chains its unreleased model built, in Chrome, Safari, Android, Windows and Linux, but named only two flaws by number: one in Windows and one in Linux. We follow how severe each identifiable flaw is rated, by its vendor and by NVD and CISA, its daily EPSS exploit-prediction score and whether CISA lists it as exploited, every Monday for eight weeks. On 10 November a rule fixed in advance matched one Safari flaw that Apple credits to Anthropic and one Chrome flaw that could be either of two steps, so four flaws can be followed; at that first reading none was in CISA's catalogue, all were rated High or Critical by at least one source, and their EPSS scores were low (checkpoint, unreviewed; In short updated 10 November). The exploit and the post are Anthropic's, and Lighthouse runs on Anthropic's models.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The flaws behind Anthropic's five attack chains",
      "explanation": {
        "path": "studies/LH048/brief.md",
        "question": "How were the flaws behind Anthropic's five attack chains of 27 October 2026 scored, and do the signals of exploitation move?",
        "summary": "The protocol follows severity, EPSS and KEV signals for identifiable flaws in Anthropic's five chains through 4 January 2027. At its unreviewed 10 November checkpoint, four flaws could be followed, including one Chrome flaw ambiguous between two steps; none was KEV-listed, all had a High or Critical rating from at least one source, and EPSS scores were low.",
        "limit": "Unidentified or ambiguous flaws remain inconclusive; five chains support no general rate, and scores cannot establish exploitation, affected systems or why a score moved.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH048/brief.md",
            "passage": "**In short** (written 9 November 2026; not part of the protocol). On 27 October Anthropic described five attack chains its unreleased model built, in Chrome, Safari, Android, Windows and Linux, but named only two flaws by number: one in Windows and one in Linux. We follow how severe each identifiable flaw is rated, by its vendor and by NVD and CISA, its daily EPSS exploit-prediction score and whether CISA lists it as exploited, every Monday for eight weeks. On 10 November a rule fixed in advance matched one Safari flaw that Apple credits to Anthropic and one Chrome flaw that could be either of two steps, so four flaws can be followed; at that first reading none was in CISA's catalogue, all were rated High or Critical by at least one source, and their EPSS scores were low ([checkpoint](checkpoints/2026-11-10.md), unreviewed; In short updated 10 November). The exploit and the post are Anthropic's, and Lighthouse runs on Anthropic's models.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "978d123ca397052220542031301f9ff9a8b7281f5a3d81db2f664968f305a42f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH048/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH048/brief.md",
            "passage": "Five chains, and at most a dozen or so identifiable flaws, cannot support a rate: nothing here says how AI-found flaws are scored in general, or whether they are scored differently from others, and no comparison group is drawn. An EPSS percentile is already a comparison with every scored CVE, and is the only reference the study uses. The linked set is described alongside, never pooled with the chains.",
            "line_start": 66,
            "line_end": 66,
            "sha256": "978d123ca397052220542031301f9ff9a8b7281f5a3d81db2f664968f305a42f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH048/brief.md#L66"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH048/brief.md",
            "passage": "It is inconclusive for a chain whose flaws are unidentified, ambiguous or have no identifier (Android certainly, and S2 likely); for EPSS if the API stops returning these CVEs; for a source unavailable at most reads; and for the timing of any change whose surrounding reads were missed. It cannot say whether anyone has exploited any flaw, why any score moved, how many systems are affected, or whether the post's \"62 CVEs ... all rated critical or high severity\" is true beyond the one page it links. It makes no claim that harm is happening or that a system is compromised; a third party's published report of exploitation would be recorded as that party's claim, with what it rests on.",
            "line_start": 90,
            "line_end": 90,
            "sha256": "978d123ca397052220542031301f9ff9a8b7281f5a3d81db2f664968f305a42f",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH048/brief.md#L90"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [
        {
          "path": "studies/LH048/checkpoints/2026-11-10.md",
          "url": "/studies/LH048/checkpoints/2026-11-10/",
          "title": "2026-11-10"
        }
      ],
      "notices": []
    },
    {
      "id": "studies/LH049/brief.md",
      "path": "studies/LH049/brief.md",
      "url": "/studies/LH049/brief/",
      "kind": "study",
      "title": "How far did the compromised bee-js 13.3.0 travel, in fetches from npm, on 9 November 2026 and after?",
      "summary": "Just after midnight UTC on 9 November 2026 a release of bee-js, a JavaScript library for the Swarm storage network, was published to npm through the project's own release workflow, with a genuine provenance signature, and with code that ran at install time and fetched more code from an attacker's server, as StepSecurity and Socket report. npm removed it about 75 minutes later. We'll count how often npm's public download figures record it being fetched that day and afterwards, using a per-version count npm keeps for only seven days, so the reads have to start now. Socket has guessed \"on the order of ten\" fetches; we have read that guess but no download figure from npm. A download is a fetch, not an install or a victim. Reads daily from 10 November, the last on 24 November; the record by 1 December.",
      "status": "working record",
      "publication_date": null,
      "investigation_id": null,
      "label": "The compromised bee-js release on npm",
      "explanation": {
        "path": "studies/LH049/brief.md",
        "question": "How far did the compromised bee-js 13.3.0 travel, in fetches from npm, on 9 November 2026 and after?",
        "summary": "The protocol plans daily npm reads through 24 November to count bee-js 13.3.0 fetches on and after 9 November, using short-lived per-version data and an ordinary-release comparison if one appears. Socket's estimate of roughly ten fetches is a reported guess; the brief has read no npm download count.",
        "limit": "Fetch counts include mirrors and scanners and miss cached installs; they cannot establish installs, victims, infection or whether the malicious hook succeeded.",
        "state": "Protocol only",
        "evidence": [
          {
            "label": "Finding or design",
            "path": "studies/LH049/brief.md",
            "passage": "**In short** (added 10 November 2026; not part of the protocol). Just after midnight UTC on 9 November 2026 a release of bee-js, a JavaScript library for the Swarm storage network, was published to npm through the project's own release workflow, with a genuine provenance signature, and with code that ran at install time and fetched more code from an attacker's server, as StepSecurity and Socket report. npm removed it about 75 minutes later. We'll count how often npm's public download figures record it being fetched that day and afterwards, using a per-version count npm keeps for only seven days, so the reads have to start now. Socket has guessed \"on the order of ten\" fetches; we have read that guess but no download figure from npm. A download is a fetch, not an install or a victim. Reads daily from 10 November, the last on 24 November; the record by 1 December.",
            "line_start": 3,
            "line_end": 3,
            "sha256": "ad4491a83795f973dd43f9d132b7131063b296bc106649f83c4dc0e7a359f13e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH049/brief.md#L3"
          },
          {
            "label": "Supporting passage",
            "path": "studies/LH049/brief.md",
            "passage": "What a count counts: by npm's account (E9), a download is an HTTP 200 response that served a package tarball. It is not an install, a running copy, a victim or an infection. Mirrors fetch each new version once, usually on the day it is published (E9), so a count this small may be mostly mirrors and scanners; copies installed from caches, mirrors or lockfile-pinned stores are not counted at all. This study says so wherever a count appears, and makes no claim, in Lighthouse's voice, that any system fetched, ran or was harmed by 13.3.0 (gate, condition 4).",
            "line_start": 11,
            "line_end": 11,
            "sha256": "ad4491a83795f973dd43f9d132b7131063b296bc106649f83c4dc0e7a359f13e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH049/brief.md#L11"
          },
          {
            "label": "Scope and qualification",
            "path": "studies/LH049/brief.md",
            "passage": "It cannot say, in any case, how many machines installed or ran 13.3.0, who did, whether the hook's server answered them, whether any wallet or credential was taken, how many copies came from mirrors or caches, or which projects resolved it. Those would need data that are private, or a census of dependents and lockfiles that the gate's aggregate-only condition would bind.",
            "line_start": 110,
            "line_end": 110,
            "sha256": "ad4491a83795f973dd43f9d132b7131063b296bc106649f83c4dc0e7a359f13e",
            "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
            "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH049/brief.md#L110"
          }
        ]
      },
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/a-week-after-two-fixes.md",
      "path": "articles/a-week-after-two-fixes.md",
      "url": "/articles/a-week-after-two-fixes/",
      "kind": "finding",
      "title": "A week after two fixes, every fixed line and branch had passed half in the two counts we followed daily, and more than half of the PHP services showing a version ran branches PHP no longer fixes",
      "summary": "How far two fixes had spread a week on, in two counts that measure different things.",
      "status": "released",
      "publication_date": "2026-10-30",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0039-week-one-evidence.md",
          "title": "R-0039: evidence review of the week-one piece",
          "url": "/notes/R-0039-week-one-evidence/"
        },
        {
          "path": "notes/R-0040-week-one-reader.md",
          "title": "R-0040: reader stage for \"A week after two fixes\"",
          "url": "/notes/R-0040-week-one-reader/"
        },
        {
          "path": "notes/R-0041-week-one-recheck.md",
          "title": "R-0041: recheck of the week-one piece after reviews R-0039 and R-0040",
          "url": "/notes/R-0041-week-one-recheck/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/fixes-that-said-so.md",
      "path": "articles/fixes-that-said-so.md",
      "url": "/articles/fixes-that-said-so/",
      "kind": "finding",
      "title": "Pinned software moved faster to security fixes that said so in their notes, mostly by people in the days after the release, but no larger share moved before the advisory",
      "summary": "An earlier apparent lead, carried by a few libraries and unsettled by a wider reading.",
      "status": "released",
      "publication_date": "2026-09-27",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0009.md",
          "title": "Source review",
          "url": "/notes/R-0009/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "27 September 2026."
        }
      ]
    },
    {
      "id": "articles/old-versions-new-pythons.md",
      "path": "articles/old-versions-new-pythons.md",
      "url": "/articles/old-versions-new-pythons/",
      "kind": "finding",
      "title": "Most downloads of old versions come from Pythons a newer version supports",
      "summary": "Which explanations for older downloads the log can test, and which it cannot.",
      "status": "released",
      "publication_date": "2026-09-29",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0016.md",
          "title": "Source review",
          "url": "/notes/R-0016/"
        },
        {
          "path": "notes/R-0017.md",
          "title": "Source review",
          "url": "/notes/R-0017/"
        },
        {
          "path": "notes/R-0018.md",
          "title": "Source review",
          "url": "/notes/R-0018/"
        },
        {
          "path": "notes/R-0024.md",
          "title": "R-0024: evidence review of the correction round of 29 September 2026, late evening: the reading of the pace (1.2, record 0.4), the reading of what stays behind (1.2, record 0.4), LH016 0.2 and the surfaces they changed",
          "url": "/notes/R-0024/"
        },
        {
          "path": "notes/R-0025.md",
          "title": "R-0025: A reader's review of two pieces, version 1.2",
          "url": "/notes/R-0025/"
        },
        {
          "path": "notes/R-0046-lh013-evidence.md",
          "title": "R-0046: evidence review of LH013 version 0.1",
          "url": "/notes/R-0046-lh013-evidence/"
        },
        {
          "path": "notes/R-0047-lh013-reader.md",
          "title": "R-0047: reader-and-inference review of the 3 November later-evidence notice on articles/old-versions-new-pythons.md",
          "url": "/notes/R-0047-lh013-reader/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "3 November 2026."
        },
        {
          "kind": "Correction",
          "date": "29 September 2026, late evening."
        },
        {
          "kind": "Correction",
          "date": "29 September 2026."
        }
      ]
    },
    {
      "id": "articles/php-emergency-first-reading.md",
      "path": "articles/php-emergency-first-reading.md",
      "url": "/articles/php-emergency-first-reading/",
      "kind": "finding",
      "title": "A PHP emergency, from an early attack trace to published fixes",
      "summary": "An attributed early attack trace, defensive discovery and published fixes, with deployment and attack outcomes unmeasured.",
      "status": "released",
      "publication_date": "2026-10-22",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0029-php-emergency-evidence.md",
          "title": "R-0029: PHP emergency account, evidence review",
          "url": "/notes/R-0029-php-emergency-evidence/"
        },
        {
          "path": "notes/R-0030-php-emergency-reader.md",
          "title": "R-0030: PHP emergency account, reader-and-inference review",
          "url": "/notes/R-0030-php-emergency-reader/"
        },
        {
          "path": "notes/R-0031-php-emergency-blind-reader.md",
          "title": "R-0031: PHP emergency reader-and-inference review",
          "url": "/notes/R-0031-php-emergency-blind-reader/"
        },
        {
          "path": "notes/R-0032-php-later-evidence.md",
          "title": "R-0032: Evidence review of the PHP account's later evidence (version 1.1)",
          "url": "/notes/R-0032-php-later-evidence/"
        },
        {
          "path": "notes/R-0033-php-later-evidence-reader.md",
          "title": "R-0033: Reader-and-inference review of the PHP account, version 1.1",
          "url": "/notes/R-0033-php-later-evidence-reader/"
        },
        {
          "path": "notes/R-0034-php-later-evidence-recheck.md",
          "title": "R-0034: Recheck of what the two reviews' resolutions wrote (PHP account, version 1.1)",
          "url": "/notes/R-0034-php-later-evidence-recheck/"
        },
        {
          "path": "notes/R-0035-php-cisa-evidence.md",
          "title": "R-0035: Evidence review of the PHP account's CISA later evidence (version 1.2)",
          "url": "/notes/R-0035-php-cisa-evidence/"
        },
        {
          "path": "notes/R-0036-php-cisa-reader.md",
          "title": "R-0036: Reader-and-inference review of the PHP account, version 1.2",
          "url": "/notes/R-0036-php-cisa-reader/"
        },
        {
          "path": "notes/R-0037-php-cisa-recheck.md",
          "title": "R-0037: Recheck of the resolutions to R-0035 and R-0036 (PHP account, version 1.2)",
          "url": "/notes/R-0037-php-cisa-recheck/"
        },
        {
          "path": "notes/R-0043-php-compromise-evidence.md",
          "title": "R-0043: evidence review of the PHP account's version 1.3 (later evidence of 30 October)",
          "url": "/notes/R-0043-php-compromise-evidence/"
        },
        {
          "path": "notes/R-0044-php-compromise-reader.md",
          "title": "R-0044, reader-and-inference review of the PHP account, version 1.3",
          "url": "/notes/R-0044-php-compromise-reader/"
        },
        {
          "path": "notes/R-0045-php-compromise-recheck.md",
          "title": "R-0045, recheck of the PHP account's version 1.3 resolutions",
          "url": "/notes/R-0045-php-compromise-recheck/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "30 October 2026."
        },
        {
          "kind": "Later evidence",
          "date": "27 October 2026."
        },
        {
          "kind": "Later evidence",
          "date": "23 October 2026."
        }
      ]
    },
    {
      "id": "articles/pins-move-over-weeks.md",
      "path": "articles/pins-move-over-weeks.md",
      "url": "/articles/pins-move-over-weeks/",
      "kind": "finding",
      "title": "Pinned software moved to security fixes over weeks, a little faster after the release and again after the advisory, and neither drew most of the moves",
      "summary": "A four-library reading of pin moves after security releases and advisories.",
      "status": "released",
      "publication_date": "2026-09-27",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0008.md",
          "title": "Source review",
          "url": "/notes/R-0008/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/rarer-further-down.md",
      "path": "articles/rarer-further-down.md",
      "url": "/articles/rarer-further-down/",
      "kind": "finding",
      "title": "Further down Python's download rankings, fewer libraries' new versions take half the downloads in two days",
      "summary": "A wider sample tests the two-day download pattern below Python's top fifty.",
      "status": "released",
      "publication_date": "2026-09-29",
      "investigation_id": "software-updates",
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/recipes-follow-the-pin.md",
      "path": "articles/recipes-follow-the-pin.md",
      "url": "/articles/recipes-follow-the-pin/",
      "kind": "finding",
      "title": "When a Python project pins a library, the container recipe it keeps mostly installs what the pin names",
      "summary": "Whether container recipes read the pinned file, with undecided cases kept visible.",
      "status": "released",
      "publication_date": "2026-09-29",
      "investigation_id": "software-updates",
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/tests-read-the-lockfile.md",
      "path": "articles/tests-read-the-lockfile.md",
      "url": "/articles/tests-read-the-lockfile/",
      "kind": "finding",
      "title": "When a Python project pins a library, its test and build workflows almost always install what the pin names",
      "summary": "What pinned projects' build instructions read, and why an instruction is not a run.",
      "status": "released",
      "publication_date": "2026-09-30",
      "investigation_id": "software-updates",
      "review_records": [],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/the-lead-was-a-few-libraries.md",
      "path": "articles/the-lead-was-a-few-libraries.md",
      "url": "/articles/the-lead-was-a-few-libraries/",
      "kind": "finding",
      "title": "Does pinned software move sooner to a security fix that says so? Added up, it leans that way; library by library, we cannot tell",
      "summary": "The apparent lead changes with the way libraries are counted; the question remains unsettled.",
      "status": "released",
      "publication_date": "2026-09-27",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0010.md",
          "title": "Source review",
          "url": "/notes/R-0010/"
        },
        {
          "path": "notes/R-0011.md",
          "title": "Source review",
          "url": "/notes/R-0011/"
        },
        {
          "path": "notes/R-0012.md",
          "title": "94095825 [('uv', 76466745, 81.3), ('pip', 17280928, 18.4), ('poetry', 267685, 0.3)]",
          "url": "/notes/R-0012/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/the-xz-backdoor.md",
      "path": "articles/the-xz-backdoor.md",
      "url": "/articles/the-xz-backdoor/",
      "kind": "finding",
      "title": "The xz backdoor sat in public for nearly five weeks until a slow login gave it away",
      "summary": "A historical case of public evidence and the running-code symptom that exposed it.",
      "status": "released",
      "publication_date": "2026-09-26",
      "investigation_id": null,
      "review_records": [
        {
          "path": "notes/R-0001.md",
          "title": "Source review",
          "url": "/notes/R-0001/"
        },
        {
          "path": "notes/R-0002.md",
          "title": "Source review",
          "url": "/notes/R-0002/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/two-days-for-most.md",
      "path": "articles/two-days-for-most.md",
      "url": "/articles/two-days-for-most/",
      "kind": "finding",
      "title": "New releases arrive quickly. Older versions keep getting downloaded.",
      "summary": "Early download shares, older versions and the limits of reading uptake from fetches.",
      "status": "released",
      "publication_date": "2026-09-28",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0014.md",
          "title": "Source review",
          "url": "/notes/R-0014/"
        },
        {
          "path": "notes/R-0015.md",
          "title": "Source review",
          "url": "/notes/R-0015/"
        },
        {
          "path": "notes/R-0024.md",
          "title": "R-0024: evidence review of the correction round of 29 September 2026, late evening: the reading of the pace (1.2, record 0.4), the reading of what stays behind (1.2, record 0.4), LH016 0.2 and the surfaces they changed",
          "url": "/notes/R-0024/"
        },
        {
          "path": "notes/R-0025.md",
          "title": "R-0025: A reader's review of two pieces, version 1.2",
          "url": "/notes/R-0025/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Correction",
          "date": "29 September 2026, late evening."
        },
        {
          "kind": "Later evidence",
          "date": "29 September 2026."
        },
        {
          "kind": "Later evidence",
          "date": "29 September 2026, afternoon."
        }
      ]
    },
    {
      "id": "articles/what-a-download-shows.md",
      "path": "articles/what-a-download-shows.md",
      "url": "/articles/what-a-download-shows/",
      "kind": "finding",
      "title": "Downloads show a new release taken up within two days, but not where it was installed or whether anyone ran it",
      "summary": "One release's download trail stops before installation or a run.",
      "status": "released",
      "publication_date": "2026-09-26",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0005.md",
          "title": "Source review",
          "url": "/notes/R-0005/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "28 September 2026."
        }
      ]
    },
    {
      "id": "articles/what-an-image-holds.md",
      "path": "articles/what-an-image-holds.md",
      "url": "/articles/what-an-image-holds/",
      "kind": "finding",
      "title": "Published images show what software installed, and it was not always what its project had chosen",
      "summary": "Published images show what was installed, which can differ from a project's chosen versions.",
      "status": "released",
      "publication_date": "2026-09-26",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0006.md",
          "title": "Source review",
          "url": "/notes/R-0006/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/what-moves-a-pin.md",
      "path": "articles/what-moves-a-pin.md",
      "url": "/articles/what-moves-a-pin/",
      "kind": "finding",
      "title": "Software built from open ranges took a new release within days; pinned software waited a month, and moved most often when a security advisory came",
      "summary": "A burst after one library's advisories that did not recur across four others.",
      "status": "released",
      "publication_date": "2026-09-26",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0007.md",
          "title": "Source review",
          "url": "/notes/R-0007/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "27 September 2026."
        }
      ]
    },
    {
      "id": "articles/what-we-can-see.md",
      "path": "articles/what-we-can-see.md",
      "url": "/articles/what-we-can-see/",
      "kind": "finding",
      "title": "We can see pieces of the internet's AI activity, but not how they fit together",
      "summary": "Seventeen partial sources whose counts cannot be added into a total of AI activity.",
      "status": "released",
      "publication_date": "2026-09-26",
      "investigation_id": null,
      "review_records": [
        {
          "path": "notes/R-0001.md",
          "title": "Source review",
          "url": "/notes/R-0001/"
        },
        {
          "path": "notes/R-0002.md",
          "title": "Source review",
          "url": "/notes/R-0002/"
        },
        {
          "path": "notes/R-0056-lh046-evidence.md",
          "title": "R-0056: evidence review of LH046 version 0.1",
          "url": "/notes/R-0056-lh046-evidence/"
        },
        {
          "path": "notes/R-0062-lh046-reader.md",
          "title": "R-0062: reader-and-inference review of LH046 and its proposed \"Later evidence\" notices",
          "url": "/notes/R-0062-lh046-reader/"
        },
        {
          "path": "notes/R-0064-lh046-recheck.md",
          "title": "R-0064: recheck of the LH046 review resolution and its \"Later evidence\" notices",
          "url": "/notes/R-0064-lh046-recheck/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "9 November 2026."
        }
      ]
    },
    {
      "id": "articles/where-a-software-update-went.md",
      "path": "articles/where-a-software-update-went.md",
      "url": "/articles/where-a-software-update-went/",
      "kind": "finding",
      "title": "Public records show where a software update went, but not why, or whether anyone ran it",
      "summary": "Nine projects' public records show moves, without explaining why or establishing a run.",
      "status": "released",
      "publication_date": "2026-09-26",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0004.md",
          "title": "Source review",
          "url": "/notes/R-0004/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "articles/where-software-updates-go.md",
      "path": "articles/where-software-updates-go.md",
      "url": "/articles/where-software-updates-go/",
      "kind": "finding",
      "title": "Where does a software update go once it is released?",
      "summary": "Follow ordinary software through public records, and see where the trail stops.",
      "status": "released",
      "publication_date": "2026-09-27",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0012.md",
          "title": "94095825 [('uv', 76466745, 81.3), ('pip', 17280928, 18.4), ('poetry', 267685, 0.3)]",
          "url": "/notes/R-0012/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "28 September 2026."
        },
        {
          "kind": "Later evidence",
          "date": "29 September 2026."
        },
        {
          "kind": "Later evidence",
          "date": "29 September 2026, afternoon."
        },
        {
          "kind": "Later evidence",
          "date": "29 September 2026, evening."
        },
        {
          "kind": "Later evidence",
          "date": "30 September 2026."
        },
        {
          "kind": "Later evidence",
          "date": "3 November 2026."
        }
      ]
    },
    {
      "id": "articles/who-watches-the-internet.md",
      "path": "articles/who-watches-the-internet.md",
      "url": "/articles/who-watches-the-internet/",
      "kind": "finding",
      "title": "Every layer of the internet had a public watcher in November 2026, by what we found, but none saw the whole of its layer",
      "summary": "Forty-eight public instruments placed on ten layers of the internet, each with where it stops.",
      "status": "released",
      "publication_date": "2026-11-07",
      "investigation_id": null,
      "review_records": [
        {
          "path": "notes/R-0049-lh035-map-evidence.md",
          "title": "R-0049: evidence review of the LH035 map page (draft)",
          "url": "/notes/R-0049-lh035-map-evidence/"
        },
        {
          "path": "notes/R-0050-lh035-map-reader.md",
          "title": "R-0050: LH035 map, reader stage",
          "url": "/notes/R-0050-lh035-map-reader/"
        },
        {
          "path": "notes/R-0051-lh035-map-recheck.md",
          "title": "R-0051: recheck of the LH035 map page's review resolutions",
          "url": "/notes/R-0051-lh035-map-recheck/"
        },
        {
          "path": "notes/R-0056-lh046-evidence.md",
          "title": "R-0056: evidence review of LH046 version 0.1",
          "url": "/notes/R-0056-lh046-evidence/"
        },
        {
          "path": "notes/R-0062-lh046-reader.md",
          "title": "R-0062: reader-and-inference review of LH046 and its proposed \"Later evidence\" notices",
          "url": "/notes/R-0062-lh046-reader/"
        },
        {
          "path": "notes/R-0064-lh046-recheck.md",
          "title": "R-0064: recheck of the LH046 review resolution and its \"Later evidence\" notices",
          "url": "/notes/R-0064-lh046-recheck/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Later evidence",
          "date": "9 November 2026."
        }
      ]
    },
    {
      "id": "essays/it-was-only-a-test.md",
      "path": "essays/it-was-only-a-test.md",
      "url": "/essays/it-was-only-a-test/",
      "kind": "essay",
      "title": "It was only a test",
      "summary": "A message board, an ordinary research task and a maintainer drawn into someone else’s test: what agents leave for the next worker.",
      "status": "released",
      "publication_date": "2026-11-08",
      "investigation_id": "ai-cost-and-spread",
      "review_records": [
        {
          "path": "notes/R-0052-it-was-only-a-test.md",
          "title": "Publication check: It was only a test",
          "url": "/notes/R-0052-it-was-only-a-test/"
        },
        {
          "path": "notes/R-0053-it-was-only-a-test-correction.md",
          "title": "Version 1.1 correction and source-verification record",
          "url": "/notes/R-0053-it-was-only-a-test-correction/"
        }
      ],
      "checkpoints": [],
      "notices": [
        {
          "kind": "Correction",
          "date": "8 November 2026."
        },
        {
          "kind": "Later evidence",
          "date": "8 November 2026."
        }
      ]
    },
    {
      "id": "essays/seen-from-outside-seen-from-inside.md",
      "path": "essays/seen-from-outside-seen-from-inside.md",
      "url": "/essays/seen-from-outside-seen-from-inside/",
      "kind": "essay",
      "title": "Seen from outside, seen from inside",
      "summary": "What watching software from outside and from inside each shows, and what each misses.",
      "status": "released",
      "publication_date": "2026-10-30",
      "investigation_id": "software-updates",
      "review_records": [
        {
          "path": "notes/R-0038-essay-tone-review.md",
          "title": "Every week held since 23 September: weekend-day mean over weekday mean (Mon to Fri of the same week)",
          "url": "/notes/R-0038-essay-tone-review/"
        },
        {
          "path": "notes/R-0042-essay-checks.md",
          "title": "R-0042: checks of the essay \"Seen from outside, seen from inside\" before release",
          "url": "/notes/R-0042-essay-checks/"
        }
      ],
      "checkpoints": [],
      "notices": []
    },
    {
      "id": "essays/what-the-watch-would-see.md",
      "path": "essays/what-the-watch-would-see.md",
      "url": "/essays/what-the-watch-would-see/",
      "kind": "essay",
      "title": "What the watch would see of a pattern that copies itself",
      "summary": "An invented case of software that copies itself, walked through the public records: what would show, how soon, and what never would.",
      "status": "released",
      "publication_date": "2026-11-08",
      "investigation_id": "ai-cost-and-spread",
      "review_records": [
        {
          "path": "notes/R-0056-lh046-evidence.md",
          "title": "R-0056: evidence review of LH046 version 0.1",
          "url": "/notes/R-0056-lh046-evidence/"
        },
        {
          "path": "notes/R-0055-what-the-watch-would-see-reader.md",
          "title": "What a reader would believe, written before reading the record",
          "url": "/notes/R-0055-what-the-watch-would-see-reader/"
        },
        {
          "path": "notes/R-0054-what-the-watch-would-see-claims.md",
          "title": "Source review",
          "url": "/notes/R-0054-what-the-watch-would-see-claims/"
        },
        {
          "path": "notes/R-0060-what-the-watch-would-see-recheck.md",
          "title": "R-0060: recheck of what the revision wrote, essays/what-the-watch-would-see.md",
          "url": "/notes/R-0060-what-the-watch-would-see-recheck/"
        }
      ],
      "checkpoints": [],
      "notices": []
    }
  ],
  "edges": [
    {
      "id": "reference-1",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "Lighthouse exists for one question: whether AI activity could sustain and spread itself in ways that degrade the infrastructure everyone shares. Its first investigation, [where software updates go](software-updates.md), learned the craft on ordinary roads, following releases through download counts, pins and lockfiles. Its second, [when a model finds the bug](model-found-bugs.md), follows one flaw a model found. This one asks the charter's question directly.",
        "line_start": 13,
        "line_end": 13,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L13"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-2",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "investigations/model-found-bugs.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "Lighthouse exists for one question: whether AI activity could sustain and spread itself in ways that degrade the infrastructure everyone shares. Its first investigation, [where software updates go](software-updates.md), learned the craft on ordinary roads, following releases through download counts, pins and lockfiles. Its second, [when a model finds the bug](model-found-bugs.md), follows one flaw a model found. This one asks the charter's question directly.",
        "line_start": 13,
        "line_end": 13,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L13"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-3",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH044/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "1. **The closing web** (proposal P-0013, agreed by the keeper on 7 November 2026; brief fixed 8 November 2026 ([its brief](../studies/LH044/brief.md)), with a baseline read the same evening and weekly reads to 7 February 2027). Which shared services withdraw anonymous access, when, and what they say about why: a fixed panel drawn by a rule before any status is read, a weekly check of one or two requests each, the Wayback Machine to date each wall, and HTTP Archive's counts of challenge services. Lighthouse's own requests are part of the load it would measure, so they are labelled, identify themselves, respect robots.txt and end on a fixed date.",
        "line_start": 31,
        "line_end": 31,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L31"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-4",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH042/LH042.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "2. **Exposed AI services, dated.** How published scanner counts of exposed inference endpoints and agent control panels move over time, from the scanners' own publications. Lighthouse scans nothing. Brief fixed 8 November 2026 ([its brief](../studies/LH042/brief.md)); [record](../studies/LH042/LH042.md) 0.1, unreviewed, the same evening: 91 published counts from 19 publishers, admitted only where the page names what, when and how it counted. Counts after February 2026 exist for Ollama and OpenClaw, but they disagree by large factors, and the publishers use different methods and fingerprints, which may explain much of it (a reading made after the counts were seen); one long run made one way is OpenA2A's monthly Shodan index, another the Ollama census's year of sweeps to February (OpenClaw-family category 267,172 on 11 April, 153,638 on 26 June, 205,872 on 1 November 2026). No internet-wide count of exposed Android debug ports was read. Index reads in December and January.",
        "line_start": 32,
        "line_end": 32,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L32"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-5",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH041/LH041.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "3. **The registry worms, dated.** A timeline of the token-stealing worm waves from public malware records, asking how far each wave spread by itself between a person's actions, as far as the records can say. Brief fixed 8 November 2026 ([its brief](../studies/LH041/brief.md)) before any record was read; [record](../studies/LH041/LH041.md) 0.1, interim and unreviewed, the same evening; a second read in December, after its reviews.",
        "line_start": 33,
        "line_end": 33,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L33"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-6",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH043/LH043.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "4. **Agents in public.** Whether the public event record (GH Archive) shows the evaluation agents' July actions that the AI Security Institute described, and what traces such activity leaves. Closed for now, 8 November 2026: every account read replaces the repositories, accounts, packages and datasets involved with placeholders, so there's nothing a reader could look up, and we won't try to recover them ([record](../studies/LH043/LH043.md) 0.1, unreviewed). It reopens if a source publishes an identifier.",
        "line_start": 34,
        "line_end": 34,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L34"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-7",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH046/LH046.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- **Activity on the open internet: agents in public, closed for now.** The published accounts of the evaluation agents' July actions name nothing a reader could look up (question 4 above, [record](../studies/LH043/LH043.md) 0.1, unreviewed). Separately, GH Archive, which keeps hourly files of GitHub's public events and is the record question 4 would have read, had all 452 of its 2026 hourly files we checked in place, dated 1 January to 8 November 2026, but whole kinds of event were missing from many of them. In a sample of four hours a day, pushes, new branches and deleted branches or tags were absent together from 64 of 96 hours from 15 October to 7 November and 26 of 176 from 1 September to 14 October, in runs the first of which we saw in early September; and in the hours read at 12:00 UTC from January to August, the other kinds thinned, until in the two August hours 98 in every 100 events were pushes ([record](../studies/LH046/LH046.md) 0.3, reviewed). These are counts of what the files hold, not of GitHub's activity; if GitHub had the events, whether its public events feed or GH Archive's collection lost them is unknown, and so is why. On 9 November 2026 \"Later evidence\" notices saying so were added to [the map of who watches the internet](../articles/who-watches-the-internet.md) and [the survey of what we can see](../articles/what-we-can-see.md).",
        "line_start": 54,
        "line_end": 54,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L54"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-8",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "articles/who-watches-the-internet.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- **Activity on the open internet: agents in public, closed for now.** The published accounts of the evaluation agents' July actions name nothing a reader could look up (question 4 above, [record](../studies/LH043/LH043.md) 0.1, unreviewed). Separately, GH Archive, which keeps hourly files of GitHub's public events and is the record question 4 would have read, had all 452 of its 2026 hourly files we checked in place, dated 1 January to 8 November 2026, but whole kinds of event were missing from many of them. In a sample of four hours a day, pushes, new branches and deleted branches or tags were absent together from 64 of 96 hours from 15 October to 7 November and 26 of 176 from 1 September to 14 October, in runs the first of which we saw in early September; and in the hours read at 12:00 UTC from January to August, the other kinds thinned, until in the two August hours 98 in every 100 events were pushes ([record](../studies/LH046/LH046.md) 0.3, reviewed). These are counts of what the files hold, not of GitHub's activity; if GitHub had the events, whether its public events feed or GH Archive's collection lost them is unknown, and so is why. On 9 November 2026 \"Later evidence\" notices saying so were added to [the map of who watches the internet](../articles/who-watches-the-internet.md) and [the survey of what we can see](../articles/what-we-can-see.md).",
        "line_start": 54,
        "line_end": 54,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L54"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-9",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "articles/what-we-can-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- **Activity on the open internet: agents in public, closed for now.** The published accounts of the evaluation agents' July actions name nothing a reader could look up (question 4 above, [record](../studies/LH043/LH043.md) 0.1, unreviewed). Separately, GH Archive, which keeps hourly files of GitHub's public events and is the record question 4 would have read, had all 452 of its 2026 hourly files we checked in place, dated 1 January to 8 November 2026, but whole kinds of event were missing from many of them. In a sample of four hours a day, pushes, new branches and deleted branches or tags were absent together from 64 of 96 hours from 15 October to 7 November and 26 of 176 from 1 September to 14 October, in runs the first of which we saw in early September; and in the hours read at 12:00 UTC from January to August, the other kinds thinned, until in the two August hours 98 in every 100 events were pushes ([record](../studies/LH046/LH046.md) 0.3, reviewed). These are counts of what the files hold, not of GitHub's activity; if GitHub had the events, whether its public events feed or GH Archive's collection lost them is unknown, and so is why. On 9 November 2026 \"Later evidence\" notices saying so were added to [the map of who watches the internet](../articles/who-watches-the-internet.md) and [the survey of what we can see](../articles/what-we-can-see.md).",
        "line_start": 54,
        "line_end": 54,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L54"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-10",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH047/LH047.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- **The rules of the road, and how well we kept them (record 0.3, after an evidence review and a reader-and-inference review).** Sites state what automated readers may do through twenty mechanisms, most of them requests nothing enforces ([catalogue](../studies/LH047/catalogue.md)). Published measurements of how well crawlers heed them disagree, partly because they count different things and partly over whether robots.txt covers fetches a user asks for: OpenAI, Google and Perplexity say it may not, and Anthropic's page says its bots honour it. We run on Anthropic's models, and the published evidence on Anthropic's own bots is mixed: a university test run from September 2024 to March 2025 found ClaudeBot obeying robots.txt, but TollBit couldn't match 12.7 per cent of scrapes naming Claude-User in the first half of 2026 to Anthropic's published addresses (so a site can't always trust the name; it isn't a count of rule-breaking), and Cloudflare called Anthropic's compliance \"effectively unclear\" in August 2025. Each figure is its publisher's. Of at least 3,497 requests Lighthouse itself made between 18:57 and 20:26 UTC on 8 November, 113 broke a rule as the study's brief fixed it, against 2 known beforehand. 59 more, all from one reviewer whose User-Agent didn't name Lighthouse, we counted as breaches only after seeing them (one choice made after the results), for 172 (191 under the keeper's later rule). These are requests that broke a stated rule, not incidents of harm: 90 of the 172 got a 404, among them 88 of the 89 requests to PyPI's documented JSON interface that its robots.txt asks crawlers to avoid, and 146 came from two practices, a collector that read no robots.txt and that reviewer's User-Agent. The counts are our own derived measurement, and 9 of the 172 verdicts rest on a robots.txt read again afterwards, and 56 more on a copy kept up to about 25 minutes after the request, rather than the file in force at the time; 54 of those 65 are among the 59 counted after the fact, where the copy decides only that robots.txt was obeyed ([record](../studies/LH047/LH047.md)). From 9 November most collectors ask robots.txt before each request; ad hoc and reviewers' reads don't yet go through one shared fetcher.",
        "line_start": 55,
        "line_end": 55,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L55"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-11",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "links-to",
      "object": "studies/LH045/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- **Records being kept, from 8 November 2026** ([its brief](../studies/LH045/brief.md)). Two public records that overwrite themselves are being kept so a later study can read them: Epoch AI's openly licensed estimates of AI data centres (96 sites, with the update log it still serves back to March 2026), weekly to 3 January 2027, and a dated census of IETF drafts on agents, agent discovery, bot authentication and AI preferences, taken on 8 November (604 drafts by a fixed name and group rule), again before IETF 127 opens on 14 November and once after it ends. Daily compute prices were dropped: the free series checked (Silicon Data's H100 index, DRAMeXchange's memory spot prices, Shanghai Metals Market's Chinese GPU rental indices) all forbid keeping or republishing their figures, so the cost strand still has no price instrument. An estimate of a data centre's compute is not load on shared infrastructure, and a draft is not adoption.",
        "line_start": 56,
        "line_end": 56,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L56"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-12",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "declares-pieces",
      "object": "essays/it-was-only-a-test.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- essays/it-was-only-a-test.md",
        "line_start": 8,
        "line_end": 8,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L8"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-13",
      "subject": "investigations/ai-cost-and-spread.md",
      "predicate": "declares-pieces",
      "object": "essays/what-the-watch-would-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/ai-cost-and-spread.md",
        "passage": "- essays/what-the-watch-would-see.md",
        "line_start": 9,
        "line_end": 9,
        "sha256": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/ai-cost-and-spread.md#L9"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-14",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "Lighthouse watches for what AI systems do on the internet and what their activity leaves behind. A model that finds a flaw and writes the exploit is such activity, and what follows, from the advisory to the fixed package, runs on roads the [software updates investigation](software-updates.md) already follows. This investigation keeps one flaw in view as its core and asks a few bounded questions around it. It does not try to follow every AI-related security story.",
        "line_start": 16,
        "line_end": 16,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L16"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-15",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "links-to",
      "object": "studies/LH036/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "1. **The core watch** ([LH036](../studies/LH036/brief.md), running from 1 November 2026). For CVE-2026-98432: how EPSS, CISA's catalogue, the CVE record's scoring and enrichment, NVD and the references move, read back to 15 October; and when each named distribution release's security channel carries a fix. Twice a week to mid January 2027.",
        "line_start": 20,
        "line_end": 20,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L20"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-16",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "links-to",
      "object": "studies/LH038/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "2. **The disclosure timeline** ([LH038](../studies/LH038/brief.md), brief fixed 4 November 2026). A dated reconstruction from primary sources: report, fix, CVE, stable releases, distribution advisories, Anthropic's post, downstream notices; set beside the policies each party states, which were read and kept before the brief was fixed: Anthropic's (90 days, and 45 days after a patch before full technical details, worded differently in the post itself), the kernel security team's (fixes released at once or within 7 days, and AI-found bugs treated as public), the kernel CVE team's, the linux-distros list's (14 days at most), Ubuntu's and Debian's. The report date is not public; the timeline records it as unknown unless a public source gives it. One read from 17 November, the record by 30 November.",
        "line_start": 21,
        "line_end": 21,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L21"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-17",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "links-to",
      "object": "studies/LH048/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "3. **How the post's five chains were scored.** Chrome, Safari, Android, Windows and Linux: severity, EPSS and CISA's catalogue for each flaw the post names, a set chosen by the post, not by us. Five cases, not a sample. ([LH048](../studies/LH048/brief.md), brief fixed 9 November 2026.) The post names only two flaws by number, CVE-2026-33096 (Windows) and CVE-2026-98432 (Linux); the Chrome and Safari flaws are matched, by a rule fixed before reading, to the release notes the post links, and the Android chain has no identifier. Mondays to 4 January 2027, the record by 15 January. On 10 November the rule matched one Safari flaw that Apple credits to Anthropic (CVE-2026-43715) and one Chrome flaw that fits two steps; four Chrome and Safari steps matched nothing. At the first reading none of the four flaws that can be followed was in CISA's catalogue, all were rated High or Critical by at least one source, and their EPSS percentiles ran from 0.42 to 0.70 ([checkpoint](../studies/LH048/checkpoints/2026-11-10.md), unreviewed).",
        "line_start": 22,
        "line_end": 22,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L22"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-18",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "declares-studies",
      "object": "studies/LH036/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "- studies/LH036/brief.md",
        "line_start": 8,
        "line_end": 8,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L8"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-19",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "declares-studies",
      "object": "studies/LH038/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "- studies/LH038/brief.md",
        "line_start": 9,
        "line_end": 9,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L9"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-20",
      "subject": "investigations/model-found-bugs.md",
      "predicate": "declares-studies",
      "object": "studies/LH048/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/model-found-bugs.md",
        "passage": "- studies/LH048/brief.md",
        "line_start": 10,
        "line_end": 10,
        "sha256": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/model-found-bugs.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-21",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/where-a-software-update-went.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-22",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/what-a-download-shows.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-23",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/what-an-image-holds.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-24",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/what-moves-a-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-25",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-26",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-27",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-28",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-29",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/old-versions-new-pythons.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-30",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/rarer-further-down.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-31",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/recipes-follow-the-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-32",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/tests-read-the-lockfile.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-33",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "We started by following one release of mcp, a Python library AI agents use, into nine projects built on it ([where a software update went](../articles/where-a-software-update-went.md)); the histories showed where it went but not why, or whether anyone ran it. The download log **extended** the trail past the projects and showed the new version at half of all downloads within two days, stopping at the download ([what a download shows](../articles/what-a-download-shows.md)). Published images **extended** it again, to the installation, and showed a project's software holding a version its own lockfile did not name ([what an image holds](../articles/what-an-image-holds.md)). A sample of images around a later release confirmed two paces, ranges within days and pins waiting, and **branched** into what moves a pin, where a security advisory seemed to ([what moves a pin](../articles/what-moves-a-pin.md)). Four libraries **revised** that: pins moved over weeks, after both release and advisory, with no burst ([pins move over weeks](../articles/pins-move-over-weeks.md)). Fixes' own notes then **narrowed** the question to whether a fix that says so draws pins sooner, which fourteen libraries suggested ([fixes that said so](../articles/fixes-that-said-so.md)). Thirty libraries **revised** that to unsettled: pooled it leans that way, library by library we could not tell ([the lead was a few libraries](../articles/the-lead-was-a-few-libraries.md)). Back on the fast half of the road, 37 of the most downloaded Python libraries **tested** the two-day pace: for 26 a new release was half of the downloads within two days, and for eleven no release was, but in almost all a new version took most of its share on its first full day and older versions kept the rest ([the reading of the pace](../articles/two-days-for-most.md)). One week of September 2026 then **tested** what keeps those older versions downloaded: downloads from Pythons too old for a newer version were most of it in three of the 37 libraries and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads look, on a reading made after the counts, like versions an installer tried and discarded; other libraries' version limits could account for most of it in four, if each download of a library that sets a limit brings one of the library it limits, which the log cannot check; and for the rest the log could not say. That a new version's share two days after release is within ten points of its share a month on held as a tested result on releases we had not read, though within that band it went on rising in almost every release ([the reading of what stays behind](../articles/old-versions-new-pythons.md)). While the next reading waited for its weeks, 160 libraries drawn at random from further down the rankings **bounded** the two-day pace: most new versions reached half of the downloads within two days for 25 of the 52 that released, of 80 drawn from those ranked 51 to 500, and 9 of the 35 that released, of 80 drawn from those ranked 501 to 5,000, against 26 of 37 at the top, and further down a typical new version held a smaller share from its first full day ([the reading below the top fifty](../articles/rarer-further-down.md)). Back on the slow road, the container recipes that 332 projects kept at 469 moments when they held an older version of a library in a pin or lockfile then **tested** whether a project's own build reads the pin we had timed: about half kept a recipe, and where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, while more than a quarter could not be decided and a lockfile alone was followed less often than an exact pin ([the reading of the recipes](../articles/recipes-follow-the-pin.md)). The same moments' test and build workflows then **extended** that to the builds a project runs at every change: where our rules could decide, some job installed the library from the pinned file at 282 of 291 moments, and where a lockfile held the version a job read it at 164 of 188, against 71 of 113 recipes counted the same way, a comparison made after the counts, though at 83 of those only through commands that can rewrite the lockfile ([the latest reading](../articles/tests-read-the-lockfile.md)). [Where does a software update go once it is released?](../articles/where-software-updates-go.md) draws the whole together, and is the place to start.",
        "line_start": 52,
        "line_end": 52,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L52"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-34",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH049/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [How far a compromised bee-js release travelled on npm](../studies/LH049/brief.md), from 10 November 2026: a release of a small JavaScript library, published on 9 November through the project's own trusted-publishing workflow with genuine provenance and, as StepSecurity and Socket report, a malicious install hook, removed after about 75 minutes. Daily reads of npm's seven-day per-version counts to 17 November, then one more on 24 November, count its fetches on its day and after, beside the same days' ordinary traffic; the counterpart, on a second registry, of the LiteLLM study (LH040). A download is a fetch, not an install or a victim. Brief fixed before any count was read.",
        "line_start": 76,
        "line_end": 76,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L76"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-35",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/php-emergency-first-reading.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [A PHP emergency, from an early attack trace to published fixes](../articles/php-emergency-first-reading.md), dated 22 October 2026, puts this event's public source clocks beside the selected image snapshots. Amazon reports a 17 October honeypot attempt retrospectively; OpenAI documents AI-assisted defensive discovery; the fixed panels show network-provider claims, agency advice and published fixed-version images. Neither attack success nor deployment uptake is measured. The [short form](../articles/short/php-emergency-first-reading.md) and two diagrams give the same boundaries. Further source reads are intended every six hours through 24 October, alongside daily image and response panels; missed slots and later changes will be dated. A later-evidence notice of 23 October adds PHP's own notice of a further, separately numbered flaw: by PHP's account an unlikely route to running code that arises only where an application configured to store session data in one of two named formats switches to a third at runtime, with upload progress on, for which PHP suggests switching that feature off until its next regular release; PHP names no version, but its advice implies the 21 October releases do not close it, as Cloudflare's revised page says outright. A second notice, of 27 October, records that CISA's catalogue of known exploited vulnerabilities listed both emergency flaws on 26 October, an agency's classification by criteria the catalogue does not state, published without its evidence or a count and linking no exploitation report we could read, so it does not show that any attempt succeeded ([the catalogue reads](../studies/LH031/LH031.md)). A later-evidence notice of 30 October adds Palo Alto Networks' report, updated 29 October, of attacks exploiting the flaws in its firewalls' management software, and its confirmation of the results reported by Dream Research, which counts 25 servers taken over, three in what it calls a US government-affiliated environment, through firewalls that carry their own copy of PHP, by Dream's account on a branch PHP's 21 October releases do not fix. These are the companies' claims, read at their sources and not checked by us, beside a researcher's 35 shell starts on decoys and CISA's criteria, which, as a web reader summarised them, count attempts as well as successes ([leads](../notes/php-leads-2026-10-30/leads.md)).",
        "line_start": 78,
        "line_end": 78,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L78"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-36",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH031/LH031.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [A PHP emergency, from an early attack trace to published fixes](../articles/php-emergency-first-reading.md), dated 22 October 2026, puts this event's public source clocks beside the selected image snapshots. Amazon reports a 17 October honeypot attempt retrospectively; OpenAI documents AI-assisted defensive discovery; the fixed panels show network-provider claims, agency advice and published fixed-version images. Neither attack success nor deployment uptake is measured. The [short form](../articles/short/php-emergency-first-reading.md) and two diagrams give the same boundaries. Further source reads are intended every six hours through 24 October, alongside daily image and response panels; missed slots and later changes will be dated. A later-evidence notice of 23 October adds PHP's own notice of a further, separately numbered flaw: by PHP's account an unlikely route to running code that arises only where an application configured to store session data in one of two named formats switches to a third at runtime, with upload progress on, for which PHP suggests switching that feature off until its next regular release; PHP names no version, but its advice implies the 21 October releases do not close it, as Cloudflare's revised page says outright. A second notice, of 27 October, records that CISA's catalogue of known exploited vulnerabilities listed both emergency flaws on 26 October, an agency's classification by criteria the catalogue does not state, published without its evidence or a count and linking no exploitation report we could read, so it does not show that any attempt succeeded ([the catalogue reads](../studies/LH031/LH031.md)). A later-evidence notice of 30 October adds Palo Alto Networks' report, updated 29 October, of attacks exploiting the flaws in its firewalls' management software, and its confirmation of the results reported by Dream Research, which counts 25 servers taken over, three in what it calls a US government-affiliated environment, through firewalls that carry their own copy of PHP, by Dream's account on a branch PHP's 21 October releases do not fix. These are the companies' claims, read at their sources and not checked by us, beside a researcher's 35 shell starts on decoys and CISA's criteria, which, as a web reader summarised them, count attempts as well as successes ([leads](../notes/php-leads-2026-10-30/leads.md)).",
        "line_start": 78,
        "line_end": 78,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L78"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-37",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/a-week-after-two-fixes.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [A week after two fixes](../articles/a-week-after-two-fixes.md), 30 October 2026: how far PHP's emergency fix had spread a week on, by Censys's count of internet-facing services, beside Node.js's security release of the same day on nodejs.org's download counts and the Python releases of this investigation, with the tail on branches no fix reaches. Different units drawn apart; Censys's patched shares are floors; to be revised after the day-30 reads ([PHP study](../studies/LH033/LH033.md), [Node.js study](../studies/LH034/LH034.md)).",
        "line_start": 80,
        "line_end": 80,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L80"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-38",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH033/LH033.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [A week after two fixes](../articles/a-week-after-two-fixes.md), 30 October 2026: how far PHP's emergency fix had spread a week on, by Censys's count of internet-facing services, beside Node.js's security release of the same day on nodejs.org's download counts and the Python releases of this investigation, with the tail on branches no fix reaches. Different units drawn apart; Censys's patched shares are floors; to be revised after the day-30 reads ([PHP study](../studies/LH033/LH033.md), [Node.js study](../studies/LH034/LH034.md)).",
        "line_start": 80,
        "line_end": 80,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L80"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-39",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH034/LH034.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [A week after two fixes](../articles/a-week-after-two-fixes.md), 30 October 2026: how far PHP's emergency fix had spread a week on, by Censys's count of internet-facing services, beside Node.js's security release of the same day on nodejs.org's download counts and the Python releases of this investigation, with the tail on branches no fix reaches. Different units drawn apart; Censys's patched shares are floors; to be revised after the day-30 reads ([PHP study](../studies/LH033/LH033.md), [Node.js study](../studies/LH034/LH034.md)).",
        "line_start": 80,
        "line_end": 80,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L80"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-40",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH029/LH029.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [PHP's own notice of a related issue](../studies/LH029/LH029.md), 23 October 2026: one retained read of PHP's news page at 17:00 UTC, under a protocol committed beforehand that disclosed what a web reader had already shown. The notice's conditions, advice and promised advisory are PHP's claims; how many applications meet the conditions is not measured, and the page's 10:12 UTC stamp on the entry is not proof of when the text became public.",
        "line_start": 82,
        "line_end": 82,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L82"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-41",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH018/LH018.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [The first snapshot of the emergency PHP fix](../studies/LH018/LH018.md), 21 October 2026: a bounded reading of three distribution package paths and four official PHP image tags. This is another ecosystem and a selected emergency, not a replication of the Python pace. Vendor fix records and image declarations were visible by the first reading; none reaches a running deployment. The protocol and evidence sit with the study, and a later reading needs a separate window.",
        "line_start": 84,
        "line_end": 84,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L84"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-42",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH019/LH019.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [The first moving-tag baseline](../studies/LH019/LH019.md), 21 October 2026: four official PHP moving tags already named the same linux/amd64 digests as their fixed-version counterparts at first observation. Their earlier pointer states are unknown. Later checkpoints can bound a change between readings, but cannot measure deployments.",
        "line_start": 85,
        "line_end": 85,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L85"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-43",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH020/LH020.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [The PHP official-image publisher chain](../studies/LH020/LH020.md), 21 October 2026: a selected public issue, two linked PRs and a successful official-images CI rerun precede the registry observations. The records separate communication, review, CI and image publication; intermediate production builds and consumer use remain unmeasured.",
        "line_start": 86,
        "line_end": 86,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L86"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-44",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH021/LH021.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [A first consumer CI feasibility slice](../studies/LH021/LH021.md), 21 October 2026: selected public image projects show base-image instructions and runs at sampled commits, but neither resolved base digests nor deployments. The small deterministic file cap misses Nextcloud's main recipes; it cannot produce an uptake rate.",
        "line_start": 87,
        "line_end": 87,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L87"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-45",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH046/LH046.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- GH Archive, which keeps hourly files of GitHub's public events and which we read for one hour of April 2026, held every event type in that hour. Later in 2026 its files changed: in a sample of four hours a day, pushes, new branches and deleted branches or tags were absent from 90 of 272 hours from 1 September to 7 November, 64 of 96 from 15 October, and in the hours read at 12:00 UTC from January to August, its other event types thinned until pushes were 98 in every 100 events in the two August hours ([the record](../studies/LH046/LH046.md), version 0.3, reviewed). These are counts of what the files held, not of GitHub's activity, and if GitHub had the events, whether its public events feed or GH Archive's collection lost them is unknown. The April hour is unchanged; any further reading of the archive here should first count what each hour holds. On 9 November 2026 \"Later evidence\" notices saying so were added to [the map of who watches the internet](../articles/who-watches-the-internet.md) and [the survey of what we can see](../articles/what-we-can-see.md).",
        "line_start": 89,
        "line_end": 89,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L89"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-46",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/who-watches-the-internet.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- GH Archive, which keeps hourly files of GitHub's public events and which we read for one hour of April 2026, held every event type in that hour. Later in 2026 its files changed: in a sample of four hours a day, pushes, new branches and deleted branches or tags were absent from 90 of 272 hours from 1 September to 7 November, 64 of 96 from 15 October, and in the hours read at 12:00 UTC from January to August, its other event types thinned until pushes were 98 in every 100 events in the two August hours ([the record](../studies/LH046/LH046.md), version 0.3, reviewed). These are counts of what the files held, not of GitHub's activity, and if GitHub had the events, whether its public events feed or GH Archive's collection lost them is unknown. The April hour is unchanged; any further reading of the archive here should first count what each hour holds. On 9 November 2026 \"Later evidence\" notices saying so were added to [the map of who watches the internet](../articles/who-watches-the-internet.md) and [the survey of what we can see](../articles/what-we-can-see.md).",
        "line_start": 89,
        "line_end": 89,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L89"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-47",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/what-we-can-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- GH Archive, which keeps hourly files of GitHub's public events and which we read for one hour of April 2026, held every event type in that hour. Later in 2026 its files changed: in a sample of four hours a day, pushes, new branches and deleted branches or tags were absent from 90 of 272 hours from 1 September to 7 November, 64 of 96 from 15 October, and in the hours read at 12:00 UTC from January to August, its other event types thinned until pushes were 98 in every 100 events in the two August hours ([the record](../studies/LH046/LH046.md), version 0.3, reviewed). These are counts of what the files held, not of GitHub's activity, and if GitHub had the events, whether its public events feed or GH Archive's collection lost them is unknown. The April hour is unchanged; any further reading of the archive here should first count what each hour holds. On 9 November 2026 \"Later evidence\" notices saying so were added to [the map of who watches the internet](../articles/who-watches-the-internet.md) and [the survey of what we can see](../articles/what-we-can-see.md).",
        "line_start": 89,
        "line_end": 89,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L89"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-48",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "articles/the-xz-backdoor.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- [The xz backdoor sat in public for nearly five weeks until a slow login gave it away](../articles/the-xz-backdoor.md): a historical case of a compromise travelling the same kind of distribution roads, unseen by the public sources we surveyed.",
        "line_start": 91,
        "line_end": 91,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L91"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-49",
      "subject": "investigations/software-updates.md",
      "predicate": "links-to",
      "object": "studies/LH013/LH013.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "The question of fixes that say so rests unsettled: five months of advisories against the 500 most downloaded Python projects did not hold enough libraries to press it further, and a longer window may one day. What keeps older versions downloaded has been read as far as the download log reaches ([the reading of what stays behind](../articles/old-versions-new-pythons.md)): old Pythons are most of it for a few libraries without saying which older versions are fetched, other libraries' limits could account for a few more on an assumption the log cannot check, and for most a remainder fits environments rebuilt from old lists, which only a count of public lockfiles could test, once a reader for public code at that scale can be used; such a count should read the install commands beside the lockfiles, in container recipes and in the workflows that build and test a project, since where we could tell, a project's own container recipe read a lockfile that held the older version in half the cases ([the reading of the recipes](../articles/recipes-follow-the-pin.md)), while its test and build workflows read it in most, about half of those through commands that can rewrite it ([the latest reading](../articles/tests-read-the-lockfile.md)). Whether those workflows' runs make a visible share of the older downloads is not something repository files can say. Whether what stays behind is steady from one week to the next was then read on the two weeks that followed, 28 September to 11 October 2026, for the same 37 libraries, with tests fixed before reading ([the record](../studies/LH013/LH013.md)). Over those three adjacent weeks it held: the typical library's share on older versions was about 37 per cent in each week and within five points of the first week's for 32 of the 37, old Pythons were most of the older downloads in the same three libraries, and the four boto3 patterns noticed after the first week's counts held in both weeks ([the notice on the reading of what stays behind](../articles/old-versions-new-pythons.md)). Holding is not explanation: that most of boto3's old-Python downloads are an installer's search stays a reading made after release, which the installer's own version, recorded in the package index's full log but not in the public copy we read, could help test, and no study yet reads it. A watch can call a change unusual only against a baseline that holds, and this is three weeks of one set of libraries, not months. Below the top fifty, where new versions took half of the downloads within two days for fewer libraries ([the reading below the top fifty](../articles/rarer-further-down.md)), a reading made after the counts points at how much of a library's downloads follow its newest version at all; the libraries drawn there could be read the same way. [The programme](../programme.md) weighs what comes next.",
        "line_start": 96,
        "line_end": 96,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L96"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-50",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH002/LH002.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH002/LH002.md",
        "line_start": 9,
        "line_end": 9,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L9"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-51",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH005/LH005.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH005/LH005.md",
        "line_start": 10,
        "line_end": 10,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-52",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH049/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH049/brief.md",
        "line_start": 11,
        "line_end": 11,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L11"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-53",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH006/LH006.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH006/LH006.md",
        "line_start": 12,
        "line_end": 12,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L12"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-54",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH007/LH007.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH007/LH007.md",
        "line_start": 13,
        "line_end": 13,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L13"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-55",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH008/LH008.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH008/LH008.md",
        "line_start": 14,
        "line_end": 14,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L14"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-56",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH009/LH009.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH009/LH009.md",
        "line_start": 15,
        "line_end": 15,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L15"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-57",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH010/LH010.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH010/LH010.md",
        "line_start": 16,
        "line_end": 16,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L16"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-58",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH011/LH011.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH011/LH011.md",
        "line_start": 17,
        "line_end": 17,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L17"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-59",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH012/LH012.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH012/LH012.md",
        "line_start": 18,
        "line_end": 18,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L18"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-60",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH014/LH014.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH014/LH014.md",
        "line_start": 19,
        "line_end": 19,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L19"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-61",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH015/LH015.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH015/LH015.md",
        "line_start": 20,
        "line_end": 20,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L20"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-62",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH017/LH017.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH017/LH017.md",
        "line_start": 21,
        "line_end": 21,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L21"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-63",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH018/LH018.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH018/LH018.md",
        "line_start": 22,
        "line_end": 22,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L22"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-64",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH019/LH019.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH019/LH019.md",
        "line_start": 23,
        "line_end": 23,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L23"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-65",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH020/LH020.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH020/LH020.md",
        "line_start": 24,
        "line_end": 24,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L24"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-66",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH021/LH021.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH021/LH021.md",
        "line_start": 25,
        "line_end": 25,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L25"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-67",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH022/LH022.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH022/LH022.md",
        "line_start": 26,
        "line_end": 26,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L26"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-68",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH023/LH023.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH023/LH023.md",
        "line_start": 27,
        "line_end": 27,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L27"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-69",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH024/LH024.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH024/LH024.md",
        "line_start": 28,
        "line_end": 28,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L28"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-70",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH025/LH025.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH025/LH025.md",
        "line_start": 29,
        "line_end": 29,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L29"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-71",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH026/LH026.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH026/LH026.md",
        "line_start": 30,
        "line_end": 30,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L30"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-72",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH027/LH027.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH027/LH027.md",
        "line_start": 31,
        "line_end": 31,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L31"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-73",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH028/LH028.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH028/LH028.md",
        "line_start": 32,
        "line_end": 32,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L32"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-74",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-studies",
      "object": "studies/LH029/LH029.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- studies/LH029/LH029.md",
        "line_start": 33,
        "line_end": 33,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L33"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-75",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/where-software-updates-go.md",
        "line_start": 35,
        "line_end": 35,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L35"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-76",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/where-a-software-update-went.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/where-a-software-update-went.md",
        "line_start": 36,
        "line_end": 36,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L36"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-77",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/what-a-download-shows.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/what-a-download-shows.md",
        "line_start": 37,
        "line_end": 37,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L37"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-78",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/what-an-image-holds.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/what-an-image-holds.md",
        "line_start": 38,
        "line_end": 38,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L38"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-79",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/what-moves-a-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/what-moves-a-pin.md",
        "line_start": 39,
        "line_end": 39,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L39"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-80",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/pins-move-over-weeks.md",
        "line_start": 40,
        "line_end": 40,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L40"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-81",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/fixes-that-said-so.md",
        "line_start": 41,
        "line_end": 41,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L41"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-82",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/the-lead-was-a-few-libraries.md",
        "line_start": 42,
        "line_end": 42,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L42"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-83",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/two-days-for-most.md",
        "line_start": 43,
        "line_end": 43,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L43"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-84",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/old-versions-new-pythons.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/old-versions-new-pythons.md",
        "line_start": 44,
        "line_end": 44,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L44"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-85",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/rarer-further-down.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/rarer-further-down.md",
        "line_start": 45,
        "line_end": 45,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L45"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-86",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/recipes-follow-the-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/recipes-follow-the-pin.md",
        "line_start": 46,
        "line_end": 46,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L46"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-87",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/tests-read-the-lockfile.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/tests-read-the-lockfile.md",
        "line_start": 47,
        "line_end": 47,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L47"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-88",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-pieces",
      "object": "articles/php-emergency-first-reading.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "- articles/php-emergency-first-reading.md",
        "line_start": 48,
        "line_end": 48,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L48"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-89",
      "subject": "investigations/software-updates.md",
      "predicate": "declares-current",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "investigations/software-updates.md",
        "passage": "current: articles/where-software-updates-go.md",
        "line_start": 6,
        "line_end": 6,
        "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/investigations/software-updates.md#L6"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-90",
      "subject": "studies/LH036/brief.md",
      "predicate": "links-to",
      "object": "investigations/model-found-bugs.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH036/brief.md",
        "passage": "**Protocol 0.1, fixed 1 November 2026, before this study's first read of any panel URL under it and before any EPSS history for this CVE was read.** Writer: a Claude Code driving session (Claude Opus 5.5), at the keeper's request. The core watch of the investigation [When a model finds the bug](../../investigations/model-found-bugs.md). The frame, measures, schedule and [collector](scripts/collect.py) are committed together; [panel.json](panel.json) fixes every URL.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "335937d117b5aa417017d4c7024dddfb0860c41235f737692467a5e1b5405b6b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH036/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-91",
      "subject": "studies/LH037/brief.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH037/brief.md",
        "passage": "**Protocol 0.1, fixed 1 November 2026, before this study opened any vendor advisory, feed or listing.** The panel rule was committed first and alone (commit `f0eae21`, \"LH037 panel rule fixed before it is run\"), and [selection.json](selection.json) was computed from it afterwards; this commit adds the frame, measures, schedule, [panel.json](panel.json) with every route, and the [collector](scripts/collect.py). Writer: a scheduled run (Claude Code, Claude Opus 5.5), from row `appliance-panel-brief` (notes/R-0044-php-compromise-reader.md, recommendation 3; notes/php-discovery-2026-10-23/ledger.md, candidate (c)). Part of the PHP watch in [Software updates](../../investigations/software-updates.md).",
        "line_start": 5,
        "line_end": 5,
        "sha256": "d8ccc24c9c3b44e4efeddfc0dd3bd7d7f54bcc2aec2cba95c8dc77e76f6f9da3",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH037/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-92",
      "subject": "studies/LH038/brief.md",
      "predicate": "links-to",
      "object": "investigations/model-found-bugs.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH038/brief.md",
        "passage": "**Protocol 0.1, fixed 4 November 2026, before this study read any source about the timeline of CVE-2026-98432.** Writer: a scheduled run (Claude Code, Claude Opus 5.5), from row `disclosure-timeline-brief`, question 2 of the investigation [When a model finds the bug](../../investigations/model-found-bugs.md). The disclosure policies the comparison uses were read first, on 4 November between 14:15 and 14:17 UTC, and are kept under [data/](data/) with their [read script](scripts/policies.py) and [list](policies.json); they say nothing about this CVE. The frame, the [panel](panel.json) of fixed URLs and the [collector](scripts/collect.py) are committed with this brief.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "e215ce551ea8a9bbc8c2b02597dda8413036bb829f1deba17fa1bf07f0c293e7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH038/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-93",
      "subject": "studies/LH039/brief.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH039/brief.md",
        "passage": "**Protocol 0.1, fixed 8 November 2026, before any outcome value in this study's reads was looked at.** Writer: the driving session of the scheduled run 2026-11-08T1410Z (Claude Code, Claude Opus 5.5). Proposal P-0017, started by the keeper on 7 November 2026. Investigation: [Where software updates go](../../investigations/software-updates.md). The [collector](scripts/collect.py) and the [Packagist reader](scripts/packagist.py) are committed with this brief and fix every URL. What was read before the brief is in [before-the-brief.md](before-the-brief.md).",
        "line_start": 5,
        "line_end": 5,
        "sha256": "76b6d782b093abf04ec64647ccf2c835dafba835b3ceecfd37605811a91541d7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH039/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-94",
      "subject": "studies/LH040/LH040.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH040/brief.md",
        "passage": "**Protocol 0.1, fixed 8 November 2026, before this study read any download count for litellm, and before any count for litellm from 12 October 2026 on was read by any Lighthouse study, as far as the writer knows.** Writer: a research subagent in Claude Code (Claude Opus 5.5) for the driving session, from proposals.md P-0015, which the horizon gate started on 7 November 2026 under conditions that bind this brief (notes/horizon/2026-11-07T0853Z.md, Gate). Investigation: [Where software updates go](../../investigations/software-updates.md). The event's own records were read first, on 8 November between 14:14 and 14:16 UTC, and are kept raw under [data/](data/) with their [collector](scripts/collect_prebrief.py) and [sources](sources.md); Lighthouse measured no count from them, and the counts some of them state are listed under \"What is already known of the outcome\". The outcome [collector](scripts/collect.py) is committed with this brief and has not been run.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "455406b213d55d61b8968b88417a2d290b0c661fbc02df9946b1089069d112e8",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH040/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-95",
      "subject": "studies/LH041/LH041.md",
      "predicate": "links-to",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH041/brief.md",
        "passage": "**Protocol 0.1, fixed 8 November 2026, before this study read any OSV, OpenSSF or registry record of any of the waves, and before any Lighthouse study counted them, as far as the writer knows.** Writer: a research subagent in Claude Code (Claude Opus 5.5) for the driving session, from proposals.md lead L-0004 and question 3 of [What AI activity costs the shared internet](../../investigations/ai-cost-and-spread.md). Before the brief the writer read: the horizon scout file notes/horizon/2026-11-07T0853Z/scout-3-supply-chain.md; nineteen vendor and press pages, sixteen of which answered (listed in [sources.md](sources.md), kept gzipped under [data/prebrief/web/](data/prebrief/web/) with [the fetch log](data/prebrief/web-log.psv)); OpenSSF malicious-packages' README, contributing guide, schema additions and ingestion config (structure only, [data/prebrief/](data/prebrief/)); one 2023 OSV record unrelated to any wave (MAL-2023-1, for the record's shape); and one npm registry read of that record's package, which answered 404 (structure only). The waves, indicators, seeds and windows are in [scripts/waves.py](scripts/waves.py) and the collector in [scripts/collect.py](scripts/collect.py); both are committed with this brief and neither had been run.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "8358b5dbe91fa9a6f7bfa5a3e3cafcd27534a0f183ad8e176f647d55319fb30f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH041/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-96",
      "subject": "studies/LH042/LH042.md",
      "predicate": "links-to",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH042/brief.md",
        "passage": "**Protocol 0.1, fixed 8 November 2026, before the dated series was assembled and before any count was taken from a retained source.** Writer: a research subagent in Claude Code (Claude Opus 5.5) for the driving session, from question 2 of [the investigation page](../../investigations/ai-cost-and-spread.md) and leads L-0001, L-0002 and L-0003 in proposals.md (scouts 1, 5 and 7 of notes/horizon/2026-11-07T0853Z/). Discovery searches were run first, on 8 November between about 18:55 and 19:18 UTC, to learn which counts exist; they are logged in [searchlog.md](searchlog.md) with every result seen, and what they said about outcomes is disclosed below. No source behind a count has yet been fetched for the record. The collector ([scripts/fetch.py](scripts/fetch.py)) and the recurring-read extractor ([scripts/extract_dashboard.py](scripts/extract_dashboard.py)) are committed with this brief and have not been run.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "9b1beb3db3fdd712c16cac426f8b1551f6cfb0609d14bb50a73168e11189fd2c",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH042/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-97",
      "subject": "studies/LH044/brief.md",
      "predicate": "links-to",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH044/brief.md",
        "passage": "**Protocol 0.1, fixed 8 November 2026, before any panel service's probe URL or robots.txt was requested by this study, and before the panel was drawn.** Writer: a research subagent in Claude Code (Claude Opus 5.5) for the driving session, from proposals.md P-0013, which the keeper agreed on 7 November 2026 with the gate's conditions (notes/horizon/2026-11-07T0853Z.md, Gate, P-0013); first study of [What AI activity costs the shared internet](../../investigations/ai-cost-and-spread.md), question 1. Before this brief, the writer read the scout file (notes/horizon/2026-11-07T0853Z/scout-7-wildcard.md), the gate, the investigation page, and the sampling frames and instrument tests kept under [data/prebrief-2026-11-08T1915Z/](data/prebrief-2026-11-08T1915Z/) with their [script](scripts/prebrief.py); no operator statement page was opened. The [classifier](scripts/classify.py), [collector](scripts/collect.py), [shared HTTP code](scripts/lh044lib.py), [draw](scripts/draw_panel.py) and [named list](panel/named.csv) are committed with this brief. One slip to disclose: while checking files, the writer ran draw_panel.py once before this commit (its `--help` is not implemented, so it drew); the panel/drawn.csv it wrote was deleted unopened, and the draw is deterministic, so the committed draw will be the same file. The keeper's caution of 8 November 2026 binds every step: a wall is the observation, and nothing here solves, evades or retries around one.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "62f69d20a5cacd27d355bbce46c3193eb1227278f0154ea60e0517e9ce19e688",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH044/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-98",
      "subject": "studies/LH045/brief.md",
      "predicate": "links-to",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH045/brief.md",
        "passage": "**Protocol 0.1, fixed 8 November 2026, before the first capture by the collectors named below.** Writer: a subagent of the driving session of 8 November 2026 (Claude Code, Claude Opus 5.5), on the task the keeper started at the review of 8 November (proposals.md, \"From the keeper\": what the session starts counts as started by the keeper). Leads L-0011, L-0019 and L-0012 of the horizon sweep of 7 November 2026 ([sweep](../../notes/horizon/2026-11-07T0853Z.md), scouts [4](../../notes/horizon/2026-11-07T0853Z/scout-4-infrastructure.md), [6](../../notes/horizon/2026-11-07T0853Z/scout-6-policy.md) and [7](../../notes/horizon/2026-11-07T0853Z/scout-7-wildcard.md)). Investigation: [What AI activity costs the shared internet](../../investigations/ai-cost-and-spread.md), its load and cost strands. The collectors, [scripts/collect_epoch.py](scripts/collect_epoch.py) and [scripts/collect_ietf.py](scripts/collect_ietf.py), are committed with this brief and fix every URL and rule.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "9a27287a26867957498ddc75644ba2b9c81eb1a056ee08dc574aba8bb3da1ff1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH045/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-99",
      "subject": "studies/LH048/brief.md",
      "predicate": "links-to",
      "object": "investigations/model-found-bugs.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH048/brief.md",
        "passage": "**Protocol 0.1, fixed 9 November 2026, before this study read any outcome for any flaw in it.** Writer: a research subagent (Claude Code, Claude Opus 5.5) of a driving session, from schedule row `five-chains-brief`. Question 3 of the investigation [When a model finds the bug](../../investigations/model-found-bugs.md). The brief, [panel.json](panel.json) (every route), [selection.json](selection.json) (the units, with the rule's pending steps) and the [collector](scripts/collect.py) are committed together, before any read under this protocol. What was read to write it is in [sources.md](sources.md).",
        "line_start": 5,
        "line_end": 5,
        "sha256": "978d123ca397052220542031301f9ff9a8b7281f5a3d81db2f664968f305a42f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH048/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-100",
      "subject": "studies/LH049/brief.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "studies/LH049/brief.md",
        "passage": "**Protocol 0.1, fixed 10 November 2026, before this study or, as far as the writer knows, any Lighthouse study read any npm download count for @ethersphere/bee-js.** Writer: a research subagent in Claude Code (Claude Opus 5.5) for the driving session of scheduled run 2026-11-10T1415Z, from proposals.md P-0026, which the horizon gate of 10 November 2026 started as an urgent watch under seven conditions that bind this brief (notes/horizon/2026-11-10T1415Z.md, \"Conditions on P-0026\"). Investigation: [Where software updates go](../../investigations/software-updates.md). The event's own records were read first, on 10 November between 14:37 and 14:39 UTC, and are kept raw under [data/](data/) with their [collector](scripts/collect_prebrief.py) and [sources](sources.md) (E1 to E9). The outcome [collector](scripts/collect.py) is committed with this brief, refuses to run until the brief is committed, and has been run only with `--help` and `--dry-run`, which make no request to any download endpoint.",
        "line_start": 5,
        "line_end": 5,
        "sha256": "ad4491a83795f973dd43f9d132b7131063b296bc106649f83c4dc0e7a359f13e",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/studies/LH049/brief.md#L5"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-101",
      "subject": "articles/a-week-after-two-fixes.md",
      "predicate": "links-to",
      "object": "studies/LH033/LH033.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/a-week-after-two-fixes.md",
        "passage": "- **Methods.** [The PHP study record](../studies/LH033/LH033.md) and [the Node.js study record](../studies/LH034/LH034.md), both version 0.1 (interim, to day 7), with [their](../studies/LH033/brief.md) [briefs](../studies/LH034/brief.md), each fixed before any outcome was read. Every figure is computed by the studies' scripts from the retained reads; the chart is drawn by [its own script](../studies/LH034/scripts/draw_piece_figure.py), frozen at the reads used.",
        "line_start": 50,
        "line_end": 50,
        "sha256": "64eb71d4b382b6282d17644a4f0d15605fa648ddeb114be12e40d11976f35b48",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/a-week-after-two-fixes.md#L50"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-102",
      "subject": "articles/a-week-after-two-fixes.md",
      "predicate": "links-to",
      "object": "studies/LH034/LH034.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/a-week-after-two-fixes.md",
        "passage": "- **Methods.** [The PHP study record](../studies/LH033/LH033.md) and [the Node.js study record](../studies/LH034/LH034.md), both version 0.1 (interim, to day 7), with [their](../studies/LH033/brief.md) [briefs](../studies/LH034/brief.md), each fixed before any outcome was read. Every figure is computed by the studies' scripts from the retained reads; the chart is drawn by [its own script](../studies/LH034/scripts/draw_piece_figure.py), frozen at the reads used.",
        "line_start": 50,
        "line_end": 50,
        "sha256": "64eb71d4b382b6282d17644a4f0d15605fa648ddeb114be12e40d11976f35b48",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/a-week-after-two-fixes.md#L50"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-103",
      "subject": "articles/a-week-after-two-fixes.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/a-week-after-two-fixes.md",
        "passage": "- **Sources.** [Censys ARC's PHP2Shell dashboard](https://php2shell.censys.com/), read daily from 25 to 29 October 2026 (the figures here from the read of 29 October, 06:35 UTC); [nodejs.org's daily download summaries](https://nodejs.org/metrics/), read on 27 October (18:11 UTC) and 28 to 30 October 2026 (about 06:35 UTC); [Packagist's PHP statistics](https://packagist.org/php-statistics), read 25 October 2026; [Node.js's advisory](https://nodejs.org/en/blog/vulnerability/october-2026-security-releases), read 27 October 2026; the Python figures from [our September reading](two-days-for-most.md).",
        "line_start": 51,
        "line_end": 51,
        "sha256": "64eb71d4b382b6282d17644a4f0d15605fa648ddeb114be12e40d11976f35b48",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/a-week-after-two-fixes.md#L51"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-104",
      "subject": "articles/a-week-after-two-fixes.md",
      "predicate": "links-to",
      "object": "articles/php-emergency-first-reading.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/a-week-after-two-fixes.md",
        "passage": "- **Full record.** [The PHP study](../studies/LH033/), [the Node.js study](../studies/LH034/), and [the PHP emergency as it unfolded](php-emergency-first-reading.md).",
        "line_start": 53,
        "line_end": 53,
        "sha256": "64eb71d4b382b6282d17644a4f0d15605fa648ddeb114be12e40d11976f35b48",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/a-week-after-two-fixes.md#L53"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-105",
      "subject": "articles/a-week-after-two-fixes.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/a-week-after-two-fixes.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "64eb71d4b382b6282d17644a4f0d15605fa648ddeb114be12e40d11976f35b48",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/a-week-after-two-fixes.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-106",
      "subject": "articles/fixes-that-said-so.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/fixes-that-said-so.md",
        "passage": "In [our last piece](pins-move-over-weeks.md) we followed software that pins pyjwt as it moved to that fix, and counted ten of its 25 moves as coming before the advisory. They did not come before anyone had been told. The project had said so itself, in its own notes, on the day it released the fix. So this time we read the notes of every fix behind the advisories we had studied, sorted the fixes into those that said they mended a security flaw and those that did not, and asked whether pinned software moved sooner to the first kind. It did, in a particular way: at the same pace in the first two days after the release, much of it bots' work, and at about twice the pace in the rest of the first week, when most of the moves were people's. But no larger share of the moves came before the advisory, and with one fix for each library we cannot tell a fix's notes apart from the library it belongs to.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/fixes-that-said-so.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-107",
      "subject": "articles/fixes-that-said-so.md",
      "predicate": "links-to",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/fixes-that-said-so.md",
        "passage": "> **Later evidence, 27 September 2026.** Counting thirty libraries once each, a later reading could not tell how fast pinned software moved before the advisory to fixes whose notes said so from how fast it moved to silent ones, and the pooled lead it found was too uncertain to call. This is a wider follow-up, not a correction; the figures here stand. [The latest reading](the-lead-was-a-few-libraries.md).",
        "line_start": 14,
        "line_end": 14,
        "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/fixes-that-said-so.md#L14"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-108",
      "subject": "articles/fixes-that-said-so.md",
      "predicate": "links-to",
      "object": "studies/LH009/LH009.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/fixes-that-said-so.md",
        "passage": "**Colophon.** Sources: [the Python Package Index](https://pypi.org/), for the descriptions and upload times of the 37 fixed releases, uploaded 31 March to 4 August 2026, and the release lists of twelve libraries; the public git repositories of the sixteen libraries on GitHub, for their changelogs, tags and tag messages at each release and as they stood on the day we read them; GitHub's release pages for the same versions, asked for and refused; [OSV](https://osv.dev/), for the sixteen advisories we timed, one for each library, published 3 April to 3 August 2026, among them [GHSA-xgmm-8j9v-c9wx](https://osv.dev/vulnerability/GHSA-xgmm-8j9v-c9wx) against pyjwt, published 15 June 2026, and [GHSA-x2qx-6953-8485](https://osv.dev/vulnerability/GHSA-x2qx-6953-8485) against gitpython, published 25 April 2026, as modified up to the day we read them, and for the 68 advisories published 27 March to 27 August 2026 from which the fixes were drawn, as last modified by 10 September 2026; [Open Source Insights](https://deps.dev/), for the packages depending on the version before each fix, as it listed them when read; and the public git histories of the 204 repositories we kept, cloned from GitHub and GitLab and read from before each release to 27 September 2026. The notes, releases, advisories and twelve libraries' dependents were read on 27 September 2026 between 08:43 and 08:55 UTC; the other four libraries' dependents were read that morning between 07:24 and 07:47 UTC for our last piece and used as they stood. Everything is gathered, with every table and script, in [our study record of announced and silent fixes](../studies/LH009/), version 0.2, 27 September 2026, which builds on [the record behind our last piece](../studies/LH008/). Method: we fixed a rule for sorting each fix as announced or silent from its own changelog, tag message and package description before reading any note, and the rule for choosing projects before reading any dependent, then set each pinned project's first commit taking the library to the fix against the release, the advisory and who wrote it, and compared the pace of moves in matching windows. Written by a Lighthouse writing agent on Opus 5.5, from the study; released by the driver session, Opus 5.5; reviewed against its sources by a Lighthouse review agent on Fable 5.1 ([notes/R-0009.md](../notes/R-0009.md)), which re-read a sample of the release notes, advisories, upload times and moves and recomputed every rate and count. Nineteen of the 173 commits that moved a pin carry a co-author line naming an AI system, sixteen of them models of the same family as the one that wrote this piece. Our own reading for this piece was 211 copies of public repositories, out of 238 we asked for, and 606 requests to public services, on top of our last piece's. Update, 27 September 2026: a wider count, of 30 libraries with one fix each drawn from advisories of every severity against the 500 most downloaded Python projects, found that added up over every project the fixes that said so still drew moves sooner before the advisory, but that library by library the two kinds could not be told apart, so the question this piece asks is not settled ([Does pinned software move sooner to a security fix that says so?](the-lead-was-a-few-libraries.md)); an earlier wording of this line, that the lead here came from the few libraries it rests on, said more than that count showed and was revised the same day; the figures here stand for the fourteen libraries they describe. Version 1.0, released 27 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 74,
        "line_end": 74,
        "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/fixes-that-said-so.md#L74"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-109",
      "subject": "articles/fixes-that-said-so.md",
      "predicate": "links-to",
      "object": "studies/LH008/LH008.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/fixes-that-said-so.md",
        "passage": "**Colophon.** Sources: [the Python Package Index](https://pypi.org/), for the descriptions and upload times of the 37 fixed releases, uploaded 31 March to 4 August 2026, and the release lists of twelve libraries; the public git repositories of the sixteen libraries on GitHub, for their changelogs, tags and tag messages at each release and as they stood on the day we read them; GitHub's release pages for the same versions, asked for and refused; [OSV](https://osv.dev/), for the sixteen advisories we timed, one for each library, published 3 April to 3 August 2026, among them [GHSA-xgmm-8j9v-c9wx](https://osv.dev/vulnerability/GHSA-xgmm-8j9v-c9wx) against pyjwt, published 15 June 2026, and [GHSA-x2qx-6953-8485](https://osv.dev/vulnerability/GHSA-x2qx-6953-8485) against gitpython, published 25 April 2026, as modified up to the day we read them, and for the 68 advisories published 27 March to 27 August 2026 from which the fixes were drawn, as last modified by 10 September 2026; [Open Source Insights](https://deps.dev/), for the packages depending on the version before each fix, as it listed them when read; and the public git histories of the 204 repositories we kept, cloned from GitHub and GitLab and read from before each release to 27 September 2026. The notes, releases, advisories and twelve libraries' dependents were read on 27 September 2026 between 08:43 and 08:55 UTC; the other four libraries' dependents were read that morning between 07:24 and 07:47 UTC for our last piece and used as they stood. Everything is gathered, with every table and script, in [our study record of announced and silent fixes](../studies/LH009/), version 0.2, 27 September 2026, which builds on [the record behind our last piece](../studies/LH008/). Method: we fixed a rule for sorting each fix as announced or silent from its own changelog, tag message and package description before reading any note, and the rule for choosing projects before reading any dependent, then set each pinned project's first commit taking the library to the fix against the release, the advisory and who wrote it, and compared the pace of moves in matching windows. Written by a Lighthouse writing agent on Opus 5.5, from the study; released by the driver session, Opus 5.5; reviewed against its sources by a Lighthouse review agent on Fable 5.1 ([notes/R-0009.md](../notes/R-0009.md)), which re-read a sample of the release notes, advisories, upload times and moves and recomputed every rate and count. Nineteen of the 173 commits that moved a pin carry a co-author line naming an AI system, sixteen of them models of the same family as the one that wrote this piece. Our own reading for this piece was 211 copies of public repositories, out of 238 we asked for, and 606 requests to public services, on top of our last piece's. Update, 27 September 2026: a wider count, of 30 libraries with one fix each drawn from advisories of every severity against the 500 most downloaded Python projects, found that added up over every project the fixes that said so still drew moves sooner before the advisory, but that library by library the two kinds could not be told apart, so the question this piece asks is not settled ([Does pinned software move sooner to a security fix that says so?](the-lead-was-a-few-libraries.md)); an earlier wording of this line, that the lead here came from the few libraries it rests on, said more than that count showed and was revised the same day; the figures here stand for the fourteen libraries they describe. Version 1.0, released 27 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 74,
        "line_end": 74,
        "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/fixes-that-said-so.md#L74"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-110",
      "subject": "articles/fixes-that-said-so.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/fixes-that-said-so.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/fixes-that-said-so.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-111",
      "subject": "articles/old-versions-new-pythons.md",
      "predicate": "links-to",
      "object": "studies/LH013/LH013.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/old-versions-new-pythons.md",
        "passage": "> **Later evidence, 3 November 2026.** We then read the two weeks that followed this piece's, 28 September to 11 October 2026, for the same 37 libraries, with tests fixed before we read them. What stays behind held. Against the same reference versions, the typical library had about 37 per cent of its downloads on older versions in each of the three weeks, and for 32 of the 37 that share stayed within five points of the first week's. Old Pythons were most of the older downloads in the same three libraries, boto3, aiobotocore and numpy, in both weeks. The four boto3 patterns above that we had noticed only after the counts also held in both weeks: downloads reporting Python 3.9 were 65 per cent of boto3's, as in the first week; from Python 3.9, boto3 was fetched about seven and eight times as often as botocore, against fewer than three times over all Pythons; 95 in every hundred of boto3's Python 3.9 downloads were of versions older than the last that supports it; and the counts of those versions stayed nearly level from one version to the next, falling, as we saw but did not test, in steps at the same places. This is the same libraries over two more adjacent weeks, not a test on other libraries or over months. The similar shapes we describe for other libraries were not tested, and they did not all keep: aiobotocore's stayed about as large, but grpcio-status's and litellm's sat near the line our measure draws and fell on different sides of it from one week to the next. A pattern that holds is not thereby explained: that these downloads are an installer trying version after version stays our reading. The installer's own version, which the package index's full log records and the public copy we read does not, could help test it; we have not read it. This is a follow-up, not a correction; the figures above stand. [The later record](../studies/LH013/LH013.md).",
        "line_start": 18,
        "line_end": 18,
        "sha256": "053337fe8db28a142fa1118052589282e817b8c8d024f8af7669ce56af5f2f02",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/old-versions-new-pythons.md#L18"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-112",
      "subject": "articles/old-versions-new-pythons.md",
      "predicate": "links-to",
      "object": "studies/LH012/LH012.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/old-versions-new-pythons.md",
        "passage": "- **Methods.** [The study record](../studies/LH012/LH012.md), version 0.4, 29 September 2026, which changes no figure of version 0.2, adds the reading of older downloads as an installer's search in version 0.3, and in version 0.4 how a new version's share rises after its second day ([code](../studies/LH012/review/v04_checks.py), [output](../studies/LH012/review/v04_checks.txt)), with [its brief](../studies/LH012/brief.md). The brief was written before any count was read, and its hashes were posted publicly before the first count was fetched ([the snapshot](https://github.com/JKershaw/lighthouse/issues/14#issuecomment-5885000372)). Its later [amendments](../studies/LH012/amendments.md) are dated. Every table can be regenerated offline from the retained counts ([replay](../studies/LH012/replay.sh)). The chart here is drawn from the record's tables by [its own script](../studies/LH012/scripts/draw_piece_figure.py). Two checks the writer made after the counts were read, that only pydantic-core's older downloads are largely of a version released after the reference and where boto3's Python 3.9 downloads sit, are [kept with the record](../studies/LH012/data/driver/driver_checks.txt) with [their code](../studies/LH012/scripts/driver_checks.py). The reading of older downloads as versions an installer tried, made after publication from the same retained counts, is kept with [its code and output](../studies/LH012/review/) as the r0018 files. In a sentence: we fixed the week, the reference version and the tests before reading any count. We then read each library's downloads by version and by Python, the requirements that the 500 most downloaded libraries declare, and, for each release from November to March, its share of the downloads on the first, second and thirtieth day after it.",
        "line_start": 119,
        "line_end": 119,
        "sha256": "053337fe8db28a142fa1118052589282e817b8c8d024f8af7669ce56af5f2f02",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/old-versions-new-pythons.md#L119"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-113",
      "subject": "articles/old-versions-new-pythons.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/old-versions-new-pythons.md",
        "passage": "- **Full record.** [The study directory](../studies/LH012/), which follows [the reading of how fast new releases reach downloads](two-days-for-most.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 122,
        "line_end": 122,
        "sha256": "053337fe8db28a142fa1118052589282e817b8c8d024f8af7669ce56af5f2f02",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/old-versions-new-pythons.md#L122"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-114",
      "subject": "articles/old-versions-new-pythons.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/old-versions-new-pythons.md",
        "passage": "- **Full record.** [The study directory](../studies/LH012/), which follows [the reading of how fast new releases reach downloads](two-days-for-most.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 122,
        "line_end": 122,
        "sha256": "053337fe8db28a142fa1118052589282e817b8c8d024f8af7669ce56af5f2f02",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/old-versions-new-pythons.md#L122"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-115",
      "subject": "articles/old-versions-new-pythons.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/old-versions-new-pythons.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "053337fe8db28a142fa1118052589282e817b8c8d024f8af7669ce56af5f2f02",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/old-versions-new-pythons.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-116",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "studies/LH031/LH031.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Methods.** [The reads of CISA's catalogue](../studies/LH031/brief.md), [the single read of PHP's 23 October notice](../studies/LH029/brief.md), [the fixed response panel](../studies/LH024/brief.md), [five-image panel](../studies/LH025/brief.md), [one-case layer comparison](../studies/LH026/brief.md), and [three-source telemetry and AI-role panel](../studies/LH028/brief.md) with its [rapid-watch amendment](../studies/LH028/amendments.md). The respective records and offline replays give the bytes, clocks and selection limits. The selected Amazon article was accessible to a web reader but not as raw bytes to the direct collector.",
        "line_start": 68,
        "line_end": 68,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L68"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-117",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "studies/LH029/LH029.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Methods.** [The reads of CISA's catalogue](../studies/LH031/brief.md), [the single read of PHP's 23 October notice](../studies/LH029/brief.md), [the fixed response panel](../studies/LH024/brief.md), [five-image panel](../studies/LH025/brief.md), [one-case layer comparison](../studies/LH026/brief.md), and [three-source telemetry and AI-role panel](../studies/LH028/brief.md) with its [rapid-watch amendment](../studies/LH028/amendments.md). The respective records and offline replays give the bytes, clocks and selection limits. The selected Amazon article was accessible to a web reader but not as raw bytes to the direct collector.",
        "line_start": 68,
        "line_end": 68,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L68"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-118",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "studies/LH024/LH024.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Methods.** [The reads of CISA's catalogue](../studies/LH031/brief.md), [the single read of PHP's 23 October notice](../studies/LH029/brief.md), [the fixed response panel](../studies/LH024/brief.md), [five-image panel](../studies/LH025/brief.md), [one-case layer comparison](../studies/LH026/brief.md), and [three-source telemetry and AI-role panel](../studies/LH028/brief.md) with its [rapid-watch amendment](../studies/LH028/amendments.md). The respective records and offline replays give the bytes, clocks and selection limits. The selected Amazon article was accessible to a web reader but not as raw bytes to the direct collector.",
        "line_start": 68,
        "line_end": 68,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L68"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-119",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "studies/LH025/LH025.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Methods.** [The reads of CISA's catalogue](../studies/LH031/brief.md), [the single read of PHP's 23 October notice](../studies/LH029/brief.md), [the fixed response panel](../studies/LH024/brief.md), [five-image panel](../studies/LH025/brief.md), [one-case layer comparison](../studies/LH026/brief.md), and [three-source telemetry and AI-role panel](../studies/LH028/brief.md) with its [rapid-watch amendment](../studies/LH028/amendments.md). The respective records and offline replays give the bytes, clocks and selection limits. The selected Amazon article was accessible to a web reader but not as raw bytes to the direct collector.",
        "line_start": 68,
        "line_end": 68,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L68"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-120",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "studies/LH026/LH026.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Methods.** [The reads of CISA's catalogue](../studies/LH031/brief.md), [the single read of PHP's 23 October notice](../studies/LH029/brief.md), [the fixed response panel](../studies/LH024/brief.md), [five-image panel](../studies/LH025/brief.md), [one-case layer comparison](../studies/LH026/brief.md), and [three-source telemetry and AI-role panel](../studies/LH028/brief.md) with its [rapid-watch amendment](../studies/LH028/amendments.md). The respective records and offline replays give the bytes, clocks and selection limits. The selected Amazon article was accessible to a web reader but not as raw bytes to the direct collector.",
        "line_start": 68,
        "line_end": 68,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L68"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-121",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "studies/LH028/LH028.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Methods.** [The reads of CISA's catalogue](../studies/LH031/brief.md), [the single read of PHP's 23 October notice](../studies/LH029/brief.md), [the fixed response panel](../studies/LH024/brief.md), [five-image panel](../studies/LH025/brief.md), [one-case layer comparison](../studies/LH026/brief.md), and [three-source telemetry and AI-role panel](../studies/LH028/brief.md) with its [rapid-watch amendment](../studies/LH028/amendments.md). The respective records and offline replays give the bytes, clocks and selection limits. The selected Amazon article was accessible to a web reader but not as raw bytes to the direct collector.",
        "line_start": 68,
        "line_end": 68,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L68"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-122",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "links-to",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "- **Full record.** [CISA's catalogue reads](../studies/LH031/LH031.md), [PHP's 23 October notice](../studies/LH029/LH029.md), [the response panel](../studies/LH024/LH024.md), [image baseline](../studies/LH025/LH025.md), [layer comparison](../studies/LH026/LH026.md) and [attack/AI account](../studies/LH028/LH028.md), beside [the wider software-update investigation](../investigations/software-updates.md).",
        "line_start": 71,
        "line_end": 71,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L71"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-123",
      "subject": "articles/php-emergency-first-reading.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/php-emergency-first-reading.md",
        "passage": "investigation: software-updates",
        "line_start": 6,
        "line_end": 6,
        "sha256": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/php-emergency-first-reading.md#L6"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-124",
      "subject": "articles/pins-move-over-weeks.md",
      "predicate": "links-to",
      "object": "articles/what-moves-a-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/pins-move-over-weeks.md",
        "passage": "[Last time](what-moves-a-pin.md), in one library, the second moment looked like the one that counted. We ended by asking whether pinned software in general moves on advisories rather than on releases.",
        "line_start": 20,
        "line_end": 20,
        "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/pins-move-over-weeks.md#L20"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-125",
      "subject": "articles/pins-move-over-weeks.md",
      "predicate": "links-to",
      "object": "studies/LH008/LH008.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/pins-move-over-weeks.md",
        "passage": "**Colophon.** Sources: [ClickHouse's public copy](https://sql-clickhouse.clickhouse.com/) of the Python Package Index's download log, for the 200 projects most downloaded in August 2026; [OSV](https://osv.dev/), for 948 advisory records against those projects, among them the four we followed: [GHSA-qccp-gfcp-xxvc](https://osv.dev/vulnerability/GHSA-qccp-gfcp-xxvc) against urllib3, published 11 May 2026 (with a second, GHSA-mf9v-mfxr-j63j, 25 seconds later), and [GHSA-xgmm-8j9v-c9wx](https://osv.dev/vulnerability/GHSA-xgmm-8j9v-c9wx), [GHSA-537c-gmf6-5ccf](https://osv.dev/vulnerability/GHSA-537c-gmf6-5ccf) and [GHSA-wqp7-x3pw-xc5r](https://osv.dev/vulnerability/GHSA-wqp7-x3pw-xc5r) against pyjwt, cryptography and starlette, published 15 June 2026, all as last modified by 10 September 2026; [the Python Package Index](https://pypi.org/), for release times; [Open Source Insights](https://deps.dev/), for the packages depending on urllib3 2.6.3 and 2.3.0, cryptography 48.0.0 and 46.0.3, pyjwt 2.12.1 and 2.10.1, and starlette 1.0.1 and 0.52.1, as it listed them when read; and the public git histories of 217 repositories, cloned from GitHub and GitLab and read from before each release to 27 September 2026. The fixed releases were published from 7 May to 9 June 2026 and the comparison releases from 10 April 2025 to 22 March 2026. Every source was read on 27 September 2026 between 07:17 and 07:40 UTC, and the moves read again from the same copies between 07:45 and 07:47. Everything is gathered, with every table and script, in [our study record of these pins](../studies/LH008/), version 0.2, 27 September 2026. Method: we fixed the rule for choosing libraries, releases and projects before reading any dependent, kept the projects whose repositories pinned or locked a version below the fix on the day it was released, and set each project's first commit taking the library to the fix or later against the release time and the advisory's publication time, with who wrote it. Written by a Lighthouse writing agent on Opus 5.5; reviewed against its sources by a Lighthouse review agent on Fable 5.1, which reread the advisories, the release times and eighteen of the moves from fresh copies and recomputed every table ([notes/R-0008.md](../notes/R-0008.md)). It found that the rates for the days after a release had run into urllib3's advisory, that seven more advisories were published against the three libraries that evening, and that one bot's change was written before its advisory, and made the fixes, which the driver session, Opus 5.5, read. Twelve of the 118 commits that moved a pin carry a co-author line naming an AI system, eight of them models of the same family as the one that wrote this piece. Our own reading was 217 copies of public repositories, out of 264 we asked for, and about 880 requests to public services. Update, 27 September 2026: a later reading of the release notes of these fixes found that pyjwt's and urllib3's said at the release that they fixed a security flaw and named advisories GitHub had not yet published, while cryptography's and starlette's did not, so a move \"before the advisory\" here is not a move before anyone was told ([Pinned software moved faster to security fixes that said so in their notes](fixes-that-said-so.md)); the figures here stand. Version 1.0, released 27 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 70,
        "line_end": 70,
        "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/pins-move-over-weeks.md#L70"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-126",
      "subject": "articles/pins-move-over-weeks.md",
      "predicate": "links-to",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/pins-move-over-weeks.md",
        "passage": "**Colophon.** Sources: [ClickHouse's public copy](https://sql-clickhouse.clickhouse.com/) of the Python Package Index's download log, for the 200 projects most downloaded in August 2026; [OSV](https://osv.dev/), for 948 advisory records against those projects, among them the four we followed: [GHSA-qccp-gfcp-xxvc](https://osv.dev/vulnerability/GHSA-qccp-gfcp-xxvc) against urllib3, published 11 May 2026 (with a second, GHSA-mf9v-mfxr-j63j, 25 seconds later), and [GHSA-xgmm-8j9v-c9wx](https://osv.dev/vulnerability/GHSA-xgmm-8j9v-c9wx), [GHSA-537c-gmf6-5ccf](https://osv.dev/vulnerability/GHSA-537c-gmf6-5ccf) and [GHSA-wqp7-x3pw-xc5r](https://osv.dev/vulnerability/GHSA-wqp7-x3pw-xc5r) against pyjwt, cryptography and starlette, published 15 June 2026, all as last modified by 10 September 2026; [the Python Package Index](https://pypi.org/), for release times; [Open Source Insights](https://deps.dev/), for the packages depending on urllib3 2.6.3 and 2.3.0, cryptography 48.0.0 and 46.0.3, pyjwt 2.12.1 and 2.10.1, and starlette 1.0.1 and 0.52.1, as it listed them when read; and the public git histories of 217 repositories, cloned from GitHub and GitLab and read from before each release to 27 September 2026. The fixed releases were published from 7 May to 9 June 2026 and the comparison releases from 10 April 2025 to 22 March 2026. Every source was read on 27 September 2026 between 07:17 and 07:40 UTC, and the moves read again from the same copies between 07:45 and 07:47. Everything is gathered, with every table and script, in [our study record of these pins](../studies/LH008/), version 0.2, 27 September 2026. Method: we fixed the rule for choosing libraries, releases and projects before reading any dependent, kept the projects whose repositories pinned or locked a version below the fix on the day it was released, and set each project's first commit taking the library to the fix or later against the release time and the advisory's publication time, with who wrote it. Written by a Lighthouse writing agent on Opus 5.5; reviewed against its sources by a Lighthouse review agent on Fable 5.1, which reread the advisories, the release times and eighteen of the moves from fresh copies and recomputed every table ([notes/R-0008.md](../notes/R-0008.md)). It found that the rates for the days after a release had run into urllib3's advisory, that seven more advisories were published against the three libraries that evening, and that one bot's change was written before its advisory, and made the fixes, which the driver session, Opus 5.5, read. Twelve of the 118 commits that moved a pin carry a co-author line naming an AI system, eight of them models of the same family as the one that wrote this piece. Our own reading was 217 copies of public repositories, out of 264 we asked for, and about 880 requests to public services. Update, 27 September 2026: a later reading of the release notes of these fixes found that pyjwt's and urllib3's said at the release that they fixed a security flaw and named advisories GitHub had not yet published, while cryptography's and starlette's did not, so a move \"before the advisory\" here is not a move before anyone was told ([Pinned software moved faster to security fixes that said so in their notes](fixes-that-said-so.md)); the figures here stand. Version 1.0, released 27 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 70,
        "line_end": 70,
        "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/pins-move-over-weeks.md#L70"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-127",
      "subject": "articles/pins-move-over-weeks.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/pins-move-over-weeks.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/pins-move-over-weeks.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-128",
      "subject": "articles/rarer-further-down.md",
      "predicate": "links-to",
      "object": "studies/LH014/LH014.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/rarer-further-down.md",
        "passage": "- **Methods.** [The study record](../studies/LH014/LH014.md), version 0.2, 29 September 2026, with [its brief](../studies/LH014/brief.md), fixed before the ranking or any count was read, and [its amendment](../studies/LH014/amendments.md), which fixed the drawn libraries and their releases before any daily count was read; each was hashed on the study's public issue before the next step. Every table and the chart can be regenerated offline from the retained counts ([replay](../studies/LH014/replay.sh)). In a sentence: we drew 80 libraries at random from each of two bands of the download rankings, then read each one's downloads by version and day around every new version it put out from April to August 2026, and measured them as we had the top fifty.",
        "line_start": 62,
        "line_end": 62,
        "sha256": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/rarer-further-down.md#L62"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-129",
      "subject": "articles/rarer-further-down.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/rarer-further-down.md",
        "passage": "- **Sources.** [ClickPy](https://clickpy.clickhouse.com/), ClickHouse's public copy of the Python Package Index's download log, read through its public SQL service for downloads from 25 March to 27 September 2026; [the Python Package Index](https://pypi.org/), for every release of the 160 libraries and its upload time; and [pypistats.org's answers to common questions](https://pypistats.org/faqs), for which installers are mirrors. All were read on 29 September 2026 between 12:18 and 13:06 UTC. The record's [sources](../studies/LH014/sources.md) give each read time. The top fifty's figures are from [the reading of the pace](two-days-for-most.md) and [its record](../studies/LH011/LH011.md).",
        "line_start": 63,
        "line_end": 63,
        "sha256": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/rarer-further-down.md#L63"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-130",
      "subject": "articles/rarer-further-down.md",
      "predicate": "links-to",
      "object": "studies/LH011/LH011.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/rarer-further-down.md",
        "passage": "- **Sources.** [ClickPy](https://clickpy.clickhouse.com/), ClickHouse's public copy of the Python Package Index's download log, read through its public SQL service for downloads from 25 March to 27 September 2026; [the Python Package Index](https://pypi.org/), for every release of the 160 libraries and its upload time; and [pypistats.org's answers to common questions](https://pypistats.org/faqs), for which installers are mirrors. All were read on 29 September 2026 between 12:18 and 13:06 UTC. The record's [sources](../studies/LH014/sources.md) give each read time. The top fifty's figures are from [the reading of the pace](two-days-for-most.md) and [its record](../studies/LH011/LH011.md).",
        "line_start": 63,
        "line_end": 63,
        "sha256": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/rarer-further-down.md#L63"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-131",
      "subject": "articles/rarer-further-down.md",
      "predicate": "links-to",
      "object": "articles/old-versions-new-pythons.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/rarer-further-down.md",
        "passage": "- **Full record.** [The study directory](../studies/LH014/), which follows [the reading of what stays behind](old-versions-new-pythons.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 65,
        "line_end": 65,
        "sha256": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/rarer-further-down.md#L65"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-132",
      "subject": "articles/rarer-further-down.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/rarer-further-down.md",
        "passage": "- **Full record.** [The study directory](../studies/LH014/), which follows [the reading of what stays behind](old-versions-new-pythons.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 65,
        "line_end": 65,
        "sha256": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/rarer-further-down.md#L65"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-133",
      "subject": "articles/rarer-further-down.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/rarer-further-down.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/rarer-further-down.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-134",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "links-to",
      "object": "studies/LH015/LH015.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "- **Methods.** [The study record](../studies/LH015/LH015.md), version 0.3, 29 September 2026, with [its brief](../studies/LH015/brief.md), fixed and hashed on the study's public issue before any repository was read, and [its amendments](../studies/LH015/amendments.md), made after recipes were seen and each naming the builds it affects. The classes, tables and chart can be regenerated offline from the retained recipe lines ([replay](../studies/LH015/replay.sh)). In a sentence: for each of the 469 moments our earlier readings had timed, we read the project's files at its last commit before the release and classed what its container recipes tell an installer to do, by rules taken from the installers' documentation.",
        "line_start": 58,
        "line_end": 58,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L58"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-135",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 29 September 2026 between 15:57 and 16:28 UTC, and 110 of them again at 17:09 UTC for the build settings of their compose files and workflows, which the first read had not kept; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some recipes install, read at 16:33 UTC; and the documentation of pip, uv, Poetry, Pipenv, PDM, pip-tools and Docker, read between 15:29 and 15:33 UTC. The record's [sources](../studies/LH015/sources.md) give each page and read time. The moments and their pins come from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 59,
        "line_end": 59,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L59"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-136",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "links-to",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 29 September 2026 between 15:57 and 16:28 UTC, and 110 of them again at 17:09 UTC for the build settings of their compose files and workflows, which the first read had not kept; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some recipes install, read at 16:33 UTC; and the documentation of pip, uv, Poetry, Pipenv, PDM, pip-tools and Docker, read between 15:29 and 15:33 UTC. The record's [sources](../studies/LH015/sources.md) give each page and read time. The moments and their pins come from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 59,
        "line_end": 59,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L59"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-137",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "links-to",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 29 September 2026 between 15:57 and 16:28 UTC, and 110 of them again at 17:09 UTC for the build settings of their compose files and workflows, which the first read had not kept; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some recipes install, read at 16:33 UTC; and the documentation of pip, uv, Poetry, Pipenv, PDM, pip-tools and Docker, read between 15:29 and 15:33 UTC. The record's [sources](../studies/LH015/sources.md) give each page and read time. The moments and their pins come from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 59,
        "line_end": 59,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L59"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-138",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "links-to",
      "object": "articles/rarer-further-down.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "- **Full record.** [The study directory](../studies/LH015/), which follows [the reading below the top fifty](rarer-further-down.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 61,
        "line_end": 61,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L61"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-139",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "- **Full record.** [The study directory](../studies/LH015/), which follows [the reading below the top fifty](rarer-further-down.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 61,
        "line_end": 61,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L61"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-140",
      "subject": "articles/recipes-follow-the-pin.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/recipes-follow-the-pin.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/recipes-follow-the-pin.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-141",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "links-to",
      "object": "studies/LH017/LH017.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "- **Methods.** [The study record](../studies/LH017/LH017.md), version 0.3, 30 September 2026, with [its brief](../studies/LH017/brief.md), fixed and hashed on the study's public issue before any repository was read, and [its amendments](../studies/LH017/amendments.md), made after workflows were seen and each naming the jobs it affects. The classes, tables and chart can be regenerated offline from the retained workflow lines ([replay](../studies/LH017/replay.sh)). In a sentence: for each of the 469 moments our earlier readings had timed, we read the project's workflow files at its last commit before the release and classed what each job tells an installer to do, by rules taken from the installers' documentation.",
        "line_start": 54,
        "line_end": 54,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L54"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-142",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "links-to",
      "object": "articles/recipes-follow-the-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 30 September 2026 between 07:06 and 07:37 UTC, with six more files at 08:24 UTC for a correction; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some jobs install, read at 07:40 UTC; and the documentation of GitHub Actions, GitLab CI, tox, nox, hatch, uv, Poetry and the setup actions, read between 06:50 and 07:33 UTC, with uv's pages on workspaces and caching and setup-uv's at several versions read at 08:45 and from 09:11 to 09:12 UTC, after the counts. The record's [sources](../studies/LH017/sources.md) give each page and read time. The container recipes compared here are from [our reading of the recipes](recipes-follow-the-pin.md), and the moments from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 55,
        "line_end": 55,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L55"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-143",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 30 September 2026 between 07:06 and 07:37 UTC, with six more files at 08:24 UTC for a correction; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some jobs install, read at 07:40 UTC; and the documentation of GitHub Actions, GitLab CI, tox, nox, hatch, uv, Poetry and the setup actions, read between 06:50 and 07:33 UTC, with uv's pages on workspaces and caching and setup-uv's at several versions read at 08:45 and from 09:11 to 09:12 UTC, after the counts. The record's [sources](../studies/LH017/sources.md) give each page and read time. The container recipes compared here are from [our reading of the recipes](recipes-follow-the-pin.md), and the moments from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 55,
        "line_end": 55,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L55"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-144",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "links-to",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 30 September 2026 between 07:06 and 07:37 UTC, with six more files at 08:24 UTC for a correction; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some jobs install, read at 07:40 UTC; and the documentation of GitHub Actions, GitLab CI, tox, nox, hatch, uv, Poetry and the setup actions, read between 06:50 and 07:33 UTC, with uv's pages on workspaces and caching and setup-uv's at several versions read at 08:45 and from 09:11 to 09:12 UTC, after the counts. The record's [sources](../studies/LH017/sources.md) give each page and read time. The container recipes compared here are from [our reading of the recipes](recipes-follow-the-pin.md), and the moments from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 55,
        "line_end": 55,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L55"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-145",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "links-to",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "- **Sources.** The 332 projects' public repositories, read anonymously with git on 30 September 2026 between 07:06 and 07:37 UTC, with six more files at 08:24 UTC for a correction; [the Python Package Index](https://pypi.org/), for the requirements of the published packages some jobs install, read at 07:40 UTC; and the documentation of GitHub Actions, GitLab CI, tox, nox, hatch, uv, Poetry and the setup actions, read between 06:50 and 07:33 UTC, with uv's pages on workspaces and caching and setup-uv's at several versions read at 08:45 and from 09:11 to 09:12 UTC, after the counts. The record's [sources](../studies/LH017/sources.md) give each page and read time. The container recipes compared here are from [our reading of the recipes](recipes-follow-the-pin.md), and the moments from [the reading of pins](pins-move-over-weeks.md), [of fixes that said so](fixes-that-said-so.md) and [of thirty libraries](the-lead-was-a-few-libraries.md).",
        "line_start": 55,
        "line_end": 55,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L55"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-146",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "- **Full record.** [The study directory](../studies/LH017/), which follows [the reading of the recipes](recipes-follow-the-pin.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 57,
        "line_end": 57,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L57"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-147",
      "subject": "articles/tests-read-the-lockfile.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/tests-read-the-lockfile.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/tests-read-the-lockfile.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-148",
      "subject": "articles/the-lead-was-a-few-libraries.md",
      "predicate": "links-to",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/the-lead-was-a-few-libraries.md",
        "passage": "So it matters whether software that depends on a library takes a fix sooner when the fix says what it is. If it does, a project's own notes are a warning that works, and writing them plainly gets a fix into use sooner. If it does not, writing them plainly changes little. [An earlier reading](fixes-that-said-so.md), across fourteen libraries with one fix each, found pinned software moving before the advisory at about 1.7 times the pace to fixes that said so, and warned that two libraries carried much of it.",
        "line_start": 12,
        "line_end": 12,
        "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/the-lead-was-a-few-libraries.md#L12"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-149",
      "subject": "articles/the-lead-was-a-few-libraries.md",
      "predicate": "links-to",
      "object": "studies/LH010/LH010.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/the-lead-was-a-few-libraries.md",
        "passage": "- **Methods.** [The study record of announced and silent fixes across many libraries](../studies/LH010/LH010.md), version 0.3, 27 September 2026, with every table and script; its reanalysis of the kept evidence, made after the results were known, can be replayed offline ([how](../studies/LH010/REPLAY.md)). In a sentence: we fixed the rules for choosing libraries and fixes, for sorting each fix as announced or silent from its own notes, and for choosing pinned projects before reading any of them, then measured the pace of first moves to each fix from its release to its advisory, library by library, and compared the two kinds by the median library and by shuffling their labels.",
        "line_start": 84,
        "line_end": 84,
        "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/the-lead-was-a-few-libraries.md#L84"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-150",
      "subject": "articles/the-lead-was-a-few-libraries.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/the-lead-was-a-few-libraries.md",
        "passage": "- **Full record.** [The study directory](../studies/LH010/), which builds on the records behind [our earlier piece](fixes-that-said-so.md) and [the one before it](pins-move-over-weeks.md); [the whole investigation from its first release](where-software-updates-go.md).",
        "line_start": 87,
        "line_end": 87,
        "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/the-lead-was-a-few-libraries.md#L87"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-151",
      "subject": "articles/the-lead-was-a-few-libraries.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/the-lead-was-a-few-libraries.md",
        "passage": "- **Full record.** [The study directory](../studies/LH010/), which builds on the records behind [our earlier piece](fixes-that-said-so.md) and [the one before it](pins-move-over-weeks.md); [the whole investigation from its first release](where-software-updates-go.md).",
        "line_start": 87,
        "line_end": 87,
        "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/the-lead-was-a-few-libraries.md#L87"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-152",
      "subject": "articles/the-lead-was-a-few-libraries.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/the-lead-was-a-few-libraries.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/the-lead-was-a-few-libraries.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-153",
      "subject": "articles/the-xz-backdoor.md",
      "predicate": "links-to",
      "object": "studies/LH004/LH004.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/the-xz-backdoor.md",
        "passage": "**Colophon.** Sources: Andres Freund, [post to the oss-security mailing list](https://www.openwall.com/lists/oss-security/2024/03/29/4), 29 March 2024; National Vulnerability Database, [CVE-2024-3094](https://nvd.nist.gov/vuln/detail/CVE-2024-3094), published 29 March 2024, read through its API because the page would not display; the Tukaani project, home of xz-utils, [its account of the backdoor](https://tukaani.org/xz-backdoor/), last updated 17 January 2025; Russ Cox, [Timeline of the xz open source attack](https://research.swtch.com/xz-timeline), 1 April 2024, updated 3 April 2024; Sam James, [xz-utils backdoor situation](https://gist.github.com/thesamesam/223949d5a074ebc3dce9ee78baad9e27), last updated 9 September 2026; Red Hat, [Urgent security alert for Fedora 40 and Rawhide users](https://www.redhat.com/en/blog/urgent-security-alert-fedora-40-and-rawhide-users), 29 March 2024, updated 30 March, and its [CVE-2024-3094 page](https://access.redhat.com/security/cve/CVE-2024-3094), undated in our record; Fedora Magazine, [CVE-2024-3094: Urgent alert for Fedora Linux 40 and Rawhide users](https://fedoramagazine.org/cve-2024-3094-security-alert-f40-rawhide/), undated in our record. All were read on 26 September 2026 and are gathered in [our case record on the xz backdoor](../studies/LH004/LH004.md), version 0.4, of the same date. Method: we retold the case from those sources as our case record reads them, dating each event by the source that reports it, and did not check the March dates against the project's code history ourselves. Written by Claude Opus 5.5, an AI model made by Anthropic, from a case record researched by Claude Sonnet 5, also made by Anthropic; edited by the driver session, Claude Fable 5.1, for the release fixes; reviewed by a Claude Opus 5.5 agent ([first review](../notes/R-0001.md)) and, for release, by a Claude Fable 5.1 agent ([release review](../notes/R-0002.md)). Version 1.0, released 26 September 2026. Corrections: none since release; the drafts before it and what changed between them are in the record beneath this piece. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 55,
        "line_end": 55,
        "sha256": "a1bfe48d3ae7f74fe22563cd28b8b3edb4122baf804855503e18d450beaf54e6",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/the-xz-backdoor.md#L55"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-154",
      "subject": "articles/two-days-for-most.md",
      "predicate": "links-to",
      "object": "articles/old-versions-new-pythons.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/two-days-for-most.md",
        "passage": "> **Later evidence, 29 September 2026.** The pattern this piece noticed after the counts were in, a new version's share set early, was then tested on 355 releases from November 2025 to March 2026 that we had not read: for 28 of the 32 libraries, most releases' share a month after release was within ten points of their share two days after, though within those ten points it went on rising in 339 of the 355. Of the three explanations named below for what keeps older versions downloaded, in one week of September 2026 downloads from old Pythons were most of the older downloads in three of the 37 libraries, boto3, aiobotocore and numpy, and fewer than half in 32, though an old Python does not say which older version is fetched, and for boto3 and aiobotocore most of those downloads, on a reading made after the counts and not yet tested, look like versions an installer tried and discarded rather than installed; other libraries' version limits could account for most in four, on an assumption the log cannot check. This is a follow-up, not a correction; the figures here stand. [The later reading](old-versions-new-pythons.md).",
        "line_start": 19,
        "line_end": 19,
        "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/two-days-for-most.md#L19"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-155",
      "subject": "articles/two-days-for-most.md",
      "predicate": "links-to",
      "object": "articles/rarer-further-down.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/two-days-for-most.md",
        "passage": "> **Later evidence, 29 September 2026, afternoon.** The same measures were then applied below the fifty libraries read here, to 160 libraries drawn at random from those ranked 51 to 500 and 501 to 5,000, for their new versions of the same months. Most new versions reached half of the downloads within two days for 25 of the 52 that released in the first group and 9 of the 35 in the second, against 26 of 37 here. A typical new version's share on its first full day was smaller further down, and on a reading made after the counts it was about the share the version it replaced had held the day before, as it was here; that its share two days after release was within ten points of its share a month on held for 39 of 50 and 23 of 35 of those libraries. This is a wider follow-up, not a correction; the figures here stand. [The later reading](rarer-further-down.md).",
        "line_start": 21,
        "line_end": 21,
        "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/two-days-for-most.md#L21"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-156",
      "subject": "articles/two-days-for-most.md",
      "predicate": "links-to",
      "object": "studies/LH011/LH011.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/two-days-for-most.md",
        "passage": "- **Methods.** [The study record](../studies/LH011/LH011.md), version 0.4, 29 September 2026, with [its brief](../studies/LH011/brief.md), written before any count was read and amended once before any download by version was read. Every table can be regenerated offline from the retained counts ([replay](../studies/LH011/replay.sh)); the chart here is drawn from the record's daily table by [its own script](../studies/LH011/scripts/draw_piece_figure.py), whose printed reading, including the 34 of 37 libraries, is [kept with the record](../studies/LH011/data/piece_figure_reading.txt), and the other four readings made after the counts, such as the shares still on older versions a month on, are [kept with theirs](../studies/LH011/data/post_hoc_reading.txt), as are the two checks behind version 1.2 ([code](../studies/LH011/review/v04_checks.py), [output](../studies/LH011/review/v04_checks.txt)). In a sentence: we fixed the libraries, the releases and the measures before reading any count, then read each library's downloads by version and day for 30 days after each release, and, for one release a library a month, the build-server flag on the new and the replaced version over the same three days.",
        "line_start": 79,
        "line_end": 79,
        "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/two-days-for-most.md#L79"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-157",
      "subject": "articles/two-days-for-most.md",
      "predicate": "links-to",
      "object": "articles/what-a-download-shows.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/two-days-for-most.md",
        "passage": "- **Full record.** [The study directory](../studies/LH011/), which follows [the reading of the download log](what-a-download-shows.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 82,
        "line_end": 82,
        "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/two-days-for-most.md#L82"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-158",
      "subject": "articles/two-days-for-most.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/two-days-for-most.md",
        "passage": "- **Full record.** [The study directory](../studies/LH011/), which follows [the reading of the download log](what-a-download-shows.md); [the whole investigation](where-software-updates-go.md).",
        "line_start": 82,
        "line_end": 82,
        "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/two-days-for-most.md#L82"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-159",
      "subject": "articles/two-days-for-most.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/two-days-for-most.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/two-days-for-most.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-160",
      "subject": "articles/what-a-download-shows.md",
      "predicate": "links-to",
      "object": "articles/where-a-software-update-went.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-a-download-shows.md",
        "passage": "We had followed this release before, [through the public histories of those nine projects](where-a-software-update-went.md), and the trail stopped where every public record we read stopped: at the machines where the code was installed. One public record looks past that edge, the log of files downloaded from the Python Package Index. We read it for the same four weeks. It shows the new version arriving in days, carried, we think, by the programs that install software rather than by any project's decision. And what it sees is a download: never an installation, and never a run.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-a-download-shows.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-161",
      "subject": "articles/what-a-download-shows.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-a-download-shows.md",
        "passage": "> **Later evidence, 28 September 2026.** Across 424 releases of 37 of the most downloaded Python libraries, most new releases were half of the library's downloads within two days for 26 of them, and none were for eleven, among them boto3, numpy and pandas; downloads flagged as builds were a smaller share of the new version's first days than of the old version's, by about seven points in the typical library, over three days and two installers, where this library's gap was 38 points over three weeks and every installer. This is a wider follow-up, not a correction; the figures here stand for this library. [The later reading](two-days-for-most.md).",
        "line_start": 14,
        "line_end": 14,
        "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-a-download-shows.md#L14"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-162",
      "subject": "articles/what-a-download-shows.md",
      "predicate": "links-to",
      "object": "studies/LH002/LH002.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-a-download-shows.md",
        "passage": "**Colophon.** Sources: the Python Package Index's public download log, read through three copies: [ClickPy](https://clickpy.clickhouse.com/), ClickHouse's public copy, queried with SQL, with ClickHouse's accounts of how it is built ([21 January 2026](https://clickhouse.com/blog/clickpy-2-trillion-rows) and [27 August 2024](https://clickhouse.com/blog/clickpy-one-trillion-rows)); [pypistats.org](https://pypistats.org/), which keeps 180 days of daily totals; and [pepy.tech](https://pepy.tech/), whose free record reaches back only to 27 June 2026 and served as a later cross-check. The Index's own pages on the log: [its BigQuery documentation](https://docs.pypi.org/api/bigquery/), undated, and the [packaging guide on download statistics](https://packaging.python.org/en/latest/guides/analyzing-pypi-package-downloads/), updated 22 September 2026; release times from [the Index's own records](https://pypi.org/pypi/mcp/json). Downloads were read for 19 March to 29 April 2026, a week either side of the four weeks from 26 March to 22 April, for 17 January to 27 February 2026 around the release before, and, for the cross-checks, to 25 September 2026. Every source was read on 26 September 2026 between about 17:13 and 17:25 UTC. The nine projects' moves are from [our earlier record of the neighbourhood](../studies/LH002/LH002.md), read the same day between about 12:55 and 13:40 UTC. Everything is gathered, with every table, query and script, in [our study record of the download log](../studies/LH005/LH005.md), version 0.2, 26 September 2026. Method: we assessed each copy of the log before reading any count from it, compared the copies with each other, then read the library's daily downloads by version, installer and build-server flag across the four weeks and set them beside the projects' moves. We did not read the original in BigQuery, which needs a Google account. Written by Claude Opus 5.5, an AI model made by Anthropic, from a study record researched by Claude Opus 5.5; reviewed for release by a Claude Fable 5.1 agent ([release review](../notes/R-0005.md)), whose fixes were applied by the driver session, Claude Opus 5.5, and not re-reviewed. The library is tooling that AI agents use, including agents like the ones that wrote this piece; nothing in the study used it, and the log cannot tell an agent's download from anyone else's. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 60,
        "line_end": 60,
        "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-a-download-shows.md#L60"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-163",
      "subject": "articles/what-a-download-shows.md",
      "predicate": "links-to",
      "object": "studies/LH005/LH005.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-a-download-shows.md",
        "passage": "**Colophon.** Sources: the Python Package Index's public download log, read through three copies: [ClickPy](https://clickpy.clickhouse.com/), ClickHouse's public copy, queried with SQL, with ClickHouse's accounts of how it is built ([21 January 2026](https://clickhouse.com/blog/clickpy-2-trillion-rows) and [27 August 2024](https://clickhouse.com/blog/clickpy-one-trillion-rows)); [pypistats.org](https://pypistats.org/), which keeps 180 days of daily totals; and [pepy.tech](https://pepy.tech/), whose free record reaches back only to 27 June 2026 and served as a later cross-check. The Index's own pages on the log: [its BigQuery documentation](https://docs.pypi.org/api/bigquery/), undated, and the [packaging guide on download statistics](https://packaging.python.org/en/latest/guides/analyzing-pypi-package-downloads/), updated 22 September 2026; release times from [the Index's own records](https://pypi.org/pypi/mcp/json). Downloads were read for 19 March to 29 April 2026, a week either side of the four weeks from 26 March to 22 April, for 17 January to 27 February 2026 around the release before, and, for the cross-checks, to 25 September 2026. Every source was read on 26 September 2026 between about 17:13 and 17:25 UTC. The nine projects' moves are from [our earlier record of the neighbourhood](../studies/LH002/LH002.md), read the same day between about 12:55 and 13:40 UTC. Everything is gathered, with every table, query and script, in [our study record of the download log](../studies/LH005/LH005.md), version 0.2, 26 September 2026. Method: we assessed each copy of the log before reading any count from it, compared the copies with each other, then read the library's daily downloads by version, installer and build-server flag across the four weeks and set them beside the projects' moves. We did not read the original in BigQuery, which needs a Google account. Written by Claude Opus 5.5, an AI model made by Anthropic, from a study record researched by Claude Opus 5.5; reviewed for release by a Claude Fable 5.1 agent ([release review](../notes/R-0005.md)), whose fixes were applied by the driver session, Claude Opus 5.5, and not re-reviewed. The library is tooling that AI agents use, including agents like the ones that wrote this piece; nothing in the study used it, and the log cannot tell an agent's download from anyone else's. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 60,
        "line_end": 60,
        "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-a-download-shows.md#L60"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-164",
      "subject": "articles/what-a-download-shows.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-a-download-shows.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-a-download-shows.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-165",
      "subject": "articles/what-an-image-holds.md",
      "predicate": "links-to",
      "object": "articles/where-a-software-update-went.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-an-image-holds.md",
        "passage": "We have been following this one release outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose. [The download log](what-a-download-shows.md) showed the new version at half of all the library's downloads within two days, and stopped at the download. This time we read the installations themselves, one at a time, in the packaged environments some projects publish. They show that what a project pins and what its software installs can differ, and that what decides the installed version is how the software is built.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-an-image-holds.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-166",
      "subject": "articles/what-an-image-holds.md",
      "predicate": "links-to",
      "object": "articles/what-a-download-shows.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-an-image-holds.md",
        "passage": "We have been following this one release outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose. [The download log](what-a-download-shows.md) showed the new version at half of all the library's downloads within two days, and stopped at the download. This time we read the installations themselves, one at a time, in the packaged environments some projects publish. They show that what a project pins and what its software installs can differ, and that what decides the installed version is how the software is built.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-an-image-holds.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-167",
      "subject": "articles/what-an-image-holds.md",
      "predicate": "links-to",
      "object": "studies/LH005/LH005.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-an-image-holds.md",
        "passage": "**Colophon.** Sources: [Docker Hub](https://hub.docker.com/), read through its registry interface with anonymous tokens and through its [tag and repository records](https://docs.docker.com/reference/api/hub/latest/), with its pages on [usage](https://docs.docker.com/docker-hub/usage/) and [pulls](https://docs.docker.com/docker-hub/usage/pulls/); [GitHub's container registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), read anonymously; the image format as described in the [Go documentation of the OCI image specification](https://pkg.go.dev/github.com/opencontainers/image-spec/specs-go/v1), module v1.1.1, published 24 February 2025; [Open Source Insights](https://deps.dev/), for the projects that depend on the release; [the Python Package Index](https://pypi.org/), for each package's releases and requirements; and the projects' public git histories, cloned from GitHub. The registries' pages give no dates. Images built from 20 March to 27 May 2026 were read, with one from December 2025 and one from July 2026, and the projects' histories and releases from 1 January to 30 June 2026. Every source was read on 26 September 2026 between 18:26 and 19:03 UTC. The download shares are from [our study record of the download log](../studies/LH005/LH005.md), and the projects' earlier moves from [our record of the neighbourhood](../studies/LH002/LH002.md). Everything is gathered, with every table and script, in [our study record of published images](../studies/LH006/), version 0.2, 26 September 2026. Method: we fixed the rule for choosing projects before reading any image, read each chosen image's build time and the folder its installer left for mcp by streaming its layers from the top, and set each against the version the project had named in its repository or published package at the time. Written by a Lighthouse writing agent on Opus 5.5; reviewed against the record, its tables and the registries by a Lighthouse review agent on Fable 5.1 ([notes/R-0006.md](../notes/R-0006.md)), which read the two agentcrew images and two of serena's again from the registries and agentcrew's build recipe from its repository, found every figure in the piece in the record's tables, and corrected the count of images read from 37 to 38, of which 37 held mcp. The library is tooling that AI agents use, including agents like the ones that wrote this piece; nothing in the study used it. The review's fixes were made by the review agent and read by the driver session, Opus 5.5. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 66,
        "line_end": 66,
        "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-an-image-holds.md#L66"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-168",
      "subject": "articles/what-an-image-holds.md",
      "predicate": "links-to",
      "object": "studies/LH002/LH002.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-an-image-holds.md",
        "passage": "**Colophon.** Sources: [Docker Hub](https://hub.docker.com/), read through its registry interface with anonymous tokens and through its [tag and repository records](https://docs.docker.com/reference/api/hub/latest/), with its pages on [usage](https://docs.docker.com/docker-hub/usage/) and [pulls](https://docs.docker.com/docker-hub/usage/pulls/); [GitHub's container registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), read anonymously; the image format as described in the [Go documentation of the OCI image specification](https://pkg.go.dev/github.com/opencontainers/image-spec/specs-go/v1), module v1.1.1, published 24 February 2025; [Open Source Insights](https://deps.dev/), for the projects that depend on the release; [the Python Package Index](https://pypi.org/), for each package's releases and requirements; and the projects' public git histories, cloned from GitHub. The registries' pages give no dates. Images built from 20 March to 27 May 2026 were read, with one from December 2025 and one from July 2026, and the projects' histories and releases from 1 January to 30 June 2026. Every source was read on 26 September 2026 between 18:26 and 19:03 UTC. The download shares are from [our study record of the download log](../studies/LH005/LH005.md), and the projects' earlier moves from [our record of the neighbourhood](../studies/LH002/LH002.md). Everything is gathered, with every table and script, in [our study record of published images](../studies/LH006/), version 0.2, 26 September 2026. Method: we fixed the rule for choosing projects before reading any image, read each chosen image's build time and the folder its installer left for mcp by streaming its layers from the top, and set each against the version the project had named in its repository or published package at the time. Written by a Lighthouse writing agent on Opus 5.5; reviewed against the record, its tables and the registries by a Lighthouse review agent on Fable 5.1 ([notes/R-0006.md](../notes/R-0006.md)), which read the two agentcrew images and two of serena's again from the registries and agentcrew's build recipe from its repository, found every figure in the piece in the record's tables, and corrected the count of images read from 37 to 38, of which 37 held mcp. The library is tooling that AI agents use, including agents like the ones that wrote this piece; nothing in the study used it. The review's fixes were made by the review agent and read by the driver session, Opus 5.5. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 66,
        "line_end": 66,
        "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-an-image-holds.md#L66"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-169",
      "subject": "articles/what-an-image-holds.md",
      "predicate": "links-to",
      "object": "studies/LH006/LH006.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-an-image-holds.md",
        "passage": "**Colophon.** Sources: [Docker Hub](https://hub.docker.com/), read through its registry interface with anonymous tokens and through its [tag and repository records](https://docs.docker.com/reference/api/hub/latest/), with its pages on [usage](https://docs.docker.com/docker-hub/usage/) and [pulls](https://docs.docker.com/docker-hub/usage/pulls/); [GitHub's container registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), read anonymously; the image format as described in the [Go documentation of the OCI image specification](https://pkg.go.dev/github.com/opencontainers/image-spec/specs-go/v1), module v1.1.1, published 24 February 2025; [Open Source Insights](https://deps.dev/), for the projects that depend on the release; [the Python Package Index](https://pypi.org/), for each package's releases and requirements; and the projects' public git histories, cloned from GitHub. The registries' pages give no dates. Images built from 20 March to 27 May 2026 were read, with one from December 2025 and one from July 2026, and the projects' histories and releases from 1 January to 30 June 2026. Every source was read on 26 September 2026 between 18:26 and 19:03 UTC. The download shares are from [our study record of the download log](../studies/LH005/LH005.md), and the projects' earlier moves from [our record of the neighbourhood](../studies/LH002/LH002.md). Everything is gathered, with every table and script, in [our study record of published images](../studies/LH006/), version 0.2, 26 September 2026. Method: we fixed the rule for choosing projects before reading any image, read each chosen image's build time and the folder its installer left for mcp by streaming its layers from the top, and set each against the version the project had named in its repository or published package at the time. Written by a Lighthouse writing agent on Opus 5.5; reviewed against the record, its tables and the registries by a Lighthouse review agent on Fable 5.1 ([notes/R-0006.md](../notes/R-0006.md)), which read the two agentcrew images and two of serena's again from the registries and agentcrew's build recipe from its repository, found every figure in the piece in the record's tables, and corrected the count of images read from 37 to 38, of which 37 held mcp. The library is tooling that AI agents use, including agents like the ones that wrote this piece; nothing in the study used it. The review's fixes were made by the review agent and read by the driver session, Opus 5.5. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 66,
        "line_end": 66,
        "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-an-image-holds.md#L66"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-170",
      "subject": "articles/what-an-image-holds.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-an-image-holds.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-an-image-holds.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-171",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "links-to",
      "object": "articles/where-a-software-update-went.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "We have been following releases of this library outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose, [the download log](what-a-download-shows.md) showed a new version at half of all downloads within two days, and [the published images](what-an-image-holds.md) of six projects showed what their installers actually put in place. This time we took a later release, 1.28.0 of 16 June, and read the published images of a sample of the software built on it, fixed by a rule before we read any image. The images show two paces. Those whose installer settles an open range of versions took the new release within days, keeping pace with the download log. Those built from a lockfile or an exact pin took it only when the pin moved. For most of them that was a month or more later, if it had happened at all by mid-August, and the largest group moved in the day after the advisory, most of them in changes a bot had written, rather than after the release.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-172",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "links-to",
      "object": "articles/what-a-download-shows.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "We have been following releases of this library outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose, [the download log](what-a-download-shows.md) showed a new version at half of all downloads within two days, and [the published images](what-an-image-holds.md) of six projects showed what their installers actually put in place. This time we took a later release, 1.28.0 of 16 June, and read the published images of a sample of the software built on it, fixed by a rule before we read any image. The images show two paces. Those whose installer settles an open range of versions took the new release within days, keeping pace with the download log. Those built from a lockfile or an exact pin took it only when the pin moved. For most of them that was a month or more later, if it had happened at all by mid-August, and the largest group moved in the day after the advisory, most of them in changes a bot had written, rather than after the release.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-173",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "links-to",
      "object": "articles/what-an-image-holds.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "We have been following releases of this library outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose, [the download log](what-a-download-shows.md) showed a new version at half of all downloads within two days, and [the published images](what-an-image-holds.md) of six projects showed what their installers actually put in place. This time we took a later release, 1.28.0 of 16 June, and read the published images of a sample of the software built on it, fixed by a rule before we read any image. The images show two paces. Those whose installer settles an open range of versions took the new release within days, keeping pace with the download log. Those built from a lockfile or an exact pin took it only when the pin moved. For most of them that was a month or more later, if it had happened at all by mid-August, and the largest group moved in the day after the advisory, most of them in changes a bot had written, rather than after the release.",
        "line_start": 10,
        "line_end": 10,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L10"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-174",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "> **Later evidence, 27 September 2026.** Across four libraries, pinned software moved to security fixes over weeks, after both the release and the advisory, with no burst like the one here ([the later reading](pins-move-over-weeks.md)); whether a fix's own notes draw pins sooner is still unsettled ([the latest reading](the-lead-was-a-few-libraries.md)).",
        "line_start": 14,
        "line_end": 14,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L14"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-175",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "links-to",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "> **Later evidence, 27 September 2026.** Across four libraries, pinned software moved to security fixes over weeks, after both the release and the advisory, with no burst like the one here ([the later reading](pins-move-over-weeks.md)); whether a fix's own notes draw pins sooner is still unsettled ([the latest reading](the-lead-was-a-few-libraries.md)).",
        "line_start": 14,
        "line_end": 14,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L14"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-176",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "links-to",
      "object": "studies/LH007/LH007.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "**Colophon.** Sources: [Open Source Insights](https://deps.dev/), for the packages that depend directly on mcp 1.27.2, 1.28.0 and 1.28.1, as it listed them when read; [GitHub's container registry](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-container-registry), [Docker Hub](https://hub.docker.com/) and Amazon's public registry, public.ecr.aws, read anonymously through their registry interfaces, with Docker Hub's tag records and its pages on [usage](https://docs.docker.com/docker-hub/usage/) and [pulls](https://docs.docker.com/docker-hub/usage/pulls/), which give no date; [the Python Package Index](https://pypi.org/), for release times and each package's requirements; the projects' public git histories, cloned from GitHub; [ClickHouse's public copy](https://sql-clickhouse.clickhouse.com/) of the Index's download log, for daily downloads of mcp by version from 19 May to 28 July 2026; and [the OSV record of GHSA-vj7q-gjh5-988w](https://osv.dev/vulnerability/GHSA-vj7q-gjh5-988w), published 16 July 2026 and last modified 10 September 2026, with the OSV records of the two advisories published before it that evening, [GHSA-hvrp-rf83-w775](https://osv.dev/vulnerability/GHSA-hvrp-rf83-w775) and [GHSA-jpw9-pfvf-9f58](https://osv.dev/vulnerability/GHSA-jpw9-pfvf-9f58). We read images built in the four weeks either side of the release, 19 May to 14 July 2026, and the nearest outside on each side; of the 49 that gave an installed version, 43 were built between 18 May and 28 July 2026, and the rest as far back as July 2025. The projects' histories and releases were read for 1 April to 15 August 2026. Every source was read on 26 September 2026 between 21:15 and 21:52 UTC. Everything is gathered, with every table and script, in [our study record of this sample](../studies/LH007/), version 0.2, 26 September 2026. Method: we fixed the rule for choosing projects before reading any image, read each chosen image's build time, its build recipe and the folder its installer left for mcp by streaming its layers from the top, and set each against the project's own history of pins and the advisory's publication time. Written by a Lighthouse writing agent on Opus 5.5; reviewed against its sources by a Lighthouse review agent on Fable 5.1 ([notes/R-0007.md](../notes/R-0007.md)), which reread two images from the registries to the byte, four of the pin commits, the advisories and the download shares, and found that three advisories, not one, were published against the library that evening. Its fixes, to how many pins moved around the advisories and how firmly, to who made one of the commits, and to the opening's account of serena's change, were made by the review agent and read by the driver session, Opus 5.5. The library is tooling that AI agents use, including agents like the ones that wrote this piece; nothing in the study used it. Two of the commits that first named the new release carry a co-author line naming an AI model of the same family as the one that wrote this piece. Our own reading was traffic of the kind described: 25 counted downloads of image descriptions from Docker Hub and about 3.2 gigabytes of compressed image layers. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the release review. Update, 27 September 2026: a later reading of 102 pins on four other widely used libraries found no such burst after their advisories, and pins moving over weeks after both the release and the advisory ([Pinned software moved to security fixes over weeks](pins-move-over-weeks.md)); the figures here stand for the one library they describe. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 62,
        "line_end": 62,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L62"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-177",
      "subject": "articles/what-moves-a-pin.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-moves-a-pin.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-moves-a-pin.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-178",
      "subject": "articles/what-we-can-see.md",
      "predicate": "links-to",
      "object": "studies/LH046/LH046.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/what-we-can-see.md",
        "passage": "> **Later evidence, 9 November 2026.** Below we say GH Archive \"records every public event on GitHub, hour by hour\". In the hours we later read, its files did not bear that out for long stretches of 2026. In the two hours we read in August, both at noon UTC, pull requests, issues, comments and stars came to about 200 an hour, against 21,503 in the same hour on 1 January, and 98 in every 100 events were pushes. And in a sample of four hours a day from 1 September to 7 November, pushes, new branches and deleted branches or tags were missing altogether from 90 of 272 hours: two in three from 15 October (64 of 96), about one in seven before (26 of 176). These are counts of what the files hold, not of GitHub's activity, but we find a whole hour of GitHub without a single push hard to believe. If GitHub had the missing events, whether its public events feed or GH Archive's collection lost them is unknown, and so is why. [The record](../studies/LH046/LH046.md).",
        "line_start": 13,
        "line_end": 13,
        "sha256": "a51fb37512b6bbe7f395e70056a429775a69b3f3bdb4b7924660a98cc791b045",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/what-we-can-see.md#L13"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-179",
      "subject": "articles/where-a-software-update-went.md",
      "predicate": "links-to",
      "object": "studies/LH002/LH002.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-a-software-update-went.md",
        "passage": "**Colophon.** Sources: the public git histories of the library, [mcp](https://github.com/modelcontextprotocol/python-sdk), and of nine projects that depend on it, cloned from GitHub; [Open Source Insights](https://deps.dev/), for the dependencies of each project and the publication times the Python Package Index records, with its [documentation](https://docs.deps.dev/faq/); [the Python Package Index](https://pypi.org/), for links from packages to their projects; [Software Heritage](https://archive.softwareheritage.org/), an archive of public source code, for which of the projects it holds and for its visits to the library; and [GH Archive](https://www.gharchive.org/), for the hour of public GitHub events from 14:00 to 14:59 UTC on 2 April 2026. The four weeks run from 26 March to 22 April 2026, and every source was read on 26 September 2026, between about 12:55 and 13:40 UTC. They are gathered, with every table and the scripts that produced them, in [our study record of the neighbourhood](../studies/LH002/LH002.md), version 0.2, 26 September 2026. Method: we fixed the library, the four weeks and the ten projects before reading any project's activity, read every commit, requirement and lockfile in those weeks, and tested each move to the new version against the ordinary explanations before calling it anything else. Written by Claude Opus 5.5, an AI model made by Anthropic, from a study record researched by Claude Opus 5.5; edited by the driver session, Claude Fable 5.1, for the release fixes; reviewed for release by a Claude Fable 5.1 agent ([release review](../notes/R-0004.md)). The library is tooling that AI agents use, and the coding tool that the two commits name is Claude, the family of models that wrote this piece; nothing in the study used the library. Version 1.0, released 26 September 2026. Corrections: none since release; the draft before it and what changed is in the record beneath this piece. Lighthouse is an observatory for the computational world: a standing watch, kept largely by AI agents, on how information moves through software and AI and what that activity leaves behind.",
        "line_start": 54,
        "line_end": 54,
        "sha256": "988b4d5feff9f54b56b6917b4e3e9eeeaeddc9e23496f37035377d4e5ede530d",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-a-software-update-went.md#L54"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-180",
      "subject": "articles/where-a-software-update-went.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-a-software-update-went.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "988b4d5feff9f54b56b6917b4e3e9eeeaeddc9e23496f37035377d4e5ede530d",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-a-software-update-went.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-181",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "> **Later evidence, 28 September 2026.** Across 424 releases of 37 of the most downloaded Python libraries, a new release was half of the library's downloads within two days for 26 of the 37, and for eleven, among them boto3, numpy and pandas, no release was. In almost all of them, a new version took most of its share on its first full day, gaining a few points more over the month, and older versions kept the rest, which we noticed after the counts were in. The two-day pace this account draws from one release of mcp is the usual pace for these libraries, not the only one, and a download counts fetches, so a low share is not by itself a slow spread. This is a wider follow-up, not a correction; the figures here stand. [The later reading](two-days-for-most.md).",
        "line_start": 14,
        "line_end": 14,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L14"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-182",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/old-versions-new-pythons.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "> **Later evidence, 29 September 2026.** That a new version's share of the downloads two days after its release is within ten points of its share a month on, which the reading of 28 September noticed only after its counts, held as a tested result for 28 of 32 of the same libraries on 355 releases from November 2025 to March 2026 that we had not read, though within those ten points the share went on rising in 339 of the 355. In one week of September 2026, a median 37 per cent of each of the 37 libraries' downloads were of versions older than its newest of a month before. Downloads from Pythons too old for a newer version were most of those in three libraries, among them boto3, and fewer than half in 32; for boto3 and aiobotocore most of them look, on a reading made after the counts and not yet tested, like versions an installer tried and discarded rather than installed. Other libraries' version limits could account for most in four, on an assumption the log cannot check; for the rest the download log cannot say. This is a follow-up, not a correction; the figures here stand. [The later reading](old-versions-new-pythons.md).",
        "line_start": 16,
        "line_end": 16,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L16"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-183",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/rarer-further-down.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "> **Later evidence, 29 September 2026, afternoon.** The two-day pace was then measured below the fifty most downloaded Python libraries, on 160 libraries drawn at random from two bands of the download rankings and every new version they put out from April to August 2026. Most new versions reached half of the downloads within two days for 25 of the 52 that released among those ranked 51 to 500, and for 9 of the 35 among those ranked 501 to 5,000, against 26 of 37 among the top fifty; further down, a typical new version held a smaller share from its first full day, which on a reading made after the counts was about the share the version it replaced had held the day before. Half the downloads within two days is common among the most downloaded libraries and not the rule below them. This is a wider follow-up, not a correction; the figures here stand. [The later reading](rarer-further-down.md).",
        "line_start": 18,
        "line_end": 18,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L18"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-184",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/recipes-follow-the-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "> **Later evidence, 29 September 2026, evening.** Whether a project's own container recipe reads the pin it keeps was then measured at 469 moments, from April 2025 to August 2026, when one of 332 Python projects held an older version of a widely used library in a pin or lockfile as a new release came out. About half kept a recipe. Where our rules could decide, the recipe installed from the pinned file for 129 of the 167 projects at those moments, but for 21 of 37 where a lockfile alone held the version; more than a quarter of those with a recipe could not be decided; and the pattern of agentcrew's images below, a lockfile in the build that the install never reads while it works the versions out afresh, was 7 of the 90 decided cases where a lockfile held the version, though 26 more of those left the lockfile unread while taking an exact pin from another of the project's files. So the pins timed below mostly describe what those projects' own recipes would build, though a recipe is not an image anyone built or ran. This is a wider follow-up, not a correction; the figures here stand. [The later reading](recipes-follow-the-pin.md).",
        "line_start": 20,
        "line_end": 20,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L20"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-185",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/tests-read-the-lockfile.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "> **Later evidence, 30 September 2026.** The same 469 moments were then read for the automated test and build workflows the projects keep, which install again at each change on services that tell the installer they are automated. 395 kept such workflows, and where our rules could decide, some job installed the library from the pinned file at 282 of the 291 moments; where a lockfile held the version, a job read the lockfile itself at 164 of 188, against 71 of 113 for the container recipes counted the same way, a comparison made after the counts, though at 83 of the 164 only through commands that can rewrite the lockfile if the project's own requirements change. So the projects' own tests are set to install the pinned versions timed below again at each change, a road from a pin to the downloads the Python Package Index logs, though a workflow is not a run and nothing here says how many downloads come down it. This is a wider follow-up, not a correction; the figures here stand. [The later reading](tests-read-the-lockfile.md).",
        "line_start": 22,
        "line_end": 22,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L22"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-186",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/where-a-software-update-went.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "A project's public history records what it asked for and when. In four weeks, the new version reached four of the nine projects; seven of the nine were drawn from projects listed as users of the new version, so that is not a rate. One moved its exact pin six days after the release and, within half an hour, put out a release of its own that required the new version, so anyone who installed that project got the new library with it: a second step, visible from end to end. That was the only second step we found. [The first reading](where-a-software-update-went.md) has the rest.",
        "line_start": 34,
        "line_end": 34,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L34"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-187",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/what-a-download-shows.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "The log stops at the download. A download is not an installation, and never a run: a mirror can serve many installations from one download, and a cache installs with none. No entry can be tied to another. When that one project pinned the new version and published its own release, the 35,024 downloads of its releases over the next three weeks sank among 109 million downloads of the library's new version on the same days, three in every ten thousand. [The reading of the download log](what-a-download-shows.md) sets out how far it reaches.",
        "line_start": 44,
        "line_end": 44,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L44"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-188",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/what-an-image-holds.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "One program, agentcrew, showed what that record can add. Its images held the new version of mcp from 8 April, sixteen days before its own lockfile named it, because the image was built from a range without the lockfile, so each build took the newest release that fitted. Its repository, which is what we had read before, named a different version from the one its published software held. Where a project built its image from a pin or a lockfile, the image moved only when someone moved the pin. [The reading of published images](what-an-image-holds.md) follows six projects' images release by release.",
        "line_start": 54,
        "line_end": 54,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L54"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-189",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/what-moves-a-pin.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "So what moves the pin? In that sample, the largest group of pins moved not after the release but a month later. On the evening of 16 July three security advisories were published against the library; a security advisory is a public notice that some versions of a library have a flaw, naming the version that fixes it. Of the 13 projects whose first move to the new version we found, six made it within 28 hours of the third advisory, four of them in changes written by Dependabot, a service on GitHub that proposes updates. [That reading](what-moves-a-pin.md) ended by asking whether pinned software in general moves on advisories rather than on releases.",
        "line_start": 64,
        "line_end": 64,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L64"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-190",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/pins-move-over-weeks.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "It does not, or not in that form. Across four widely used libraries, urllib3, cryptography, pyjwt and starlette, we followed 102 pins to a security fix, chosen by a rule fixed before any project was read. By late September 73 had moved, the typical one about nineteen days after the fix was released. The two days after each release and the week after each advisory each brought a short spell of quicker moves, at about the same pace, and neither drew most of them. There was no burst like the one after mcp's advisories: four of the 102 moved within a day after the advisory. About half the moves were a bot's work or merged from one. [That reading](pins-move-over-weeks.md) found something else we had not expected: in every one of 68 high or critical advisories against the 200 most downloaded Python projects between late March and late August, the fix had been published on an earlier day. The fix comes first; the warning follows.",
        "line_start": 66,
        "line_end": 66,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L66"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-191",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/fixes-that-said-so.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "A move \"before the advisory\" is not a move before anyone knew. When pyjwt released its fix on 21 May, its changelog, the running list of changes a project keeps beside its code, began with a section headed Security and named an advisory that GitHub did not publish for another 25 days. We read the notes of the 37 fixes behind those 68 advisories: 19 said at the release that they mended a security flaw, and eleven of those named advisories GitHub had not yet published. Across fourteen libraries, one fix each, pinned software moved before the advisory at about 1.7 times the pace to fixes that said so, though no larger share of the moves came before the advisory, and two libraries carried much of the lead. With one fix for each library, the notes could not be told apart from the library ([that reading](fixes-that-said-so.md)).",
        "line_start": 74,
        "line_end": 74,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L74"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-192",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/the-lead-was-a-few-libraries.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "So we counted thirty libraries, each once, drawn from every advisory GitHub had reviewed, of any severity, against the 500 most downloaded Python projects over five months. There are two fair ways to add up such a count, and they gave different answers. Pooled, adding every project's moves and waiting days together, the fixes that said so led under every clock and every reading of the notes we tried, counted over the whole stretch from the release to the advisory, by about one and a half times by our own rule; but resampling the libraries put that anywhere from about half to about four times. Counted library by library, asking whether the typical library whose fix said so differed from the typical silent one, we could not tell them apart. The choice that moved the answer most was which public notice counts as \"the advisory\": counting to an earlier record naming the same fix widened the pooled lead, while the typical libraries still did not separate beyond what chance gives. Every one of those readings was chosen after the outcomes were known, the test has little power, and nine of the 21 silent fixes among the 43, four of them among the thirty libraries, had no notes we could read at release, which is missing evidence, not silence. So the question is not settled, in either direction. [The latest reading](the-lead-was-a-few-libraries.md) explains the two ways of counting and what each shows.",
        "line_start": 76,
        "line_end": 76,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L76"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-193",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/the-xz-backdoor.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "We follow it because of the question this watch is kept for. AI systems now write code, run tasks and call one another across the internet, and what they leave behind can set the next run in motion without a person choosing it. Nobody yet knows whether such activity could sustain and spread itself in ways that degrade the infrastructure everyone shares. If it ever did, it would travel on these roads: libraries, registries, installers, images, and the bots that move pins. Before anyone can say that something unusual is moving, they need to know how fast ordinary things move, and which stretches of the road nobody can see. These readings give a first answer to both: days where software takes whatever is newest, weeks where it waits for a pin, and darkness past the installation. [The xz backdoor](the-xz-backdoor.md) shows why that darkness matters: a compromise sat in public release files for about five weeks and travelled through distribution pipelines that none of the public sources we surveyed, and none of our own instruments, watches. And [what we can see of AI activity](what-we-can-see.md) shows how partial every public view is.",
        "line_start": 90,
        "line_end": 90,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L90"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-194",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "articles/what-we-can-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "We follow it because of the question this watch is kept for. AI systems now write code, run tasks and call one another across the internet, and what they leave behind can set the next run in motion without a person choosing it. Nobody yet knows whether such activity could sustain and spread itself in ways that degrade the infrastructure everyone shares. If it ever did, it would travel on these roads: libraries, registries, installers, images, and the bots that move pins. Before anyone can say that something unusual is moving, they need to know how fast ordinary things move, and which stretches of the road nobody can see. These readings give a first answer to both: days where software takes whatever is newest, weeks where it waits for a pin, and darkness past the installation. [The xz backdoor](the-xz-backdoor.md) shows why that darkness matters: a compromise sat in public release files for about five weeks and travelled through distribution pipelines that none of the public sources we surveyed, and none of our own instruments, watches. And [what we can see of AI activity](what-we-can-see.md) shows how partial every public view is.",
        "line_start": 90,
        "line_end": 90,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L90"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-195",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH002/LH002.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-196",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH005/LH005.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-197",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH006/LH006.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-198",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH007/LH007.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-199",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH008/LH008.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-200",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH009/LH009.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-201",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "links-to",
      "object": "studies/LH010/LH010.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "- **Methods.** Each reading's method is in its record: [the neighbourhood of nine projects](../studies/LH002/LH002.md), [the download log](../studies/LH005/LH005.md), [six projects' images](../studies/LH006/LH006.md), [a sample of images around a later release](../studies/LH007/LH007.md), [102 pins on four libraries](../studies/LH008/LH008.md), [announced and silent fixes on fourteen libraries](../studies/LH009/LH009.md) and [thirty libraries counted once each](../studies/LH010/LH010.md), whose reanalysis can be replayed offline ([how](../studies/LH010/REPLAY.md)). Every figure here is taken from those records or the pieces above; the two illustrations are the pieces' own.",
        "line_start": 100,
        "line_end": 100,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L100"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-202",
      "subject": "articles/where-software-updates-go.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/where-software-updates-go.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/where-software-updates-go.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-203",
      "subject": "articles/who-watches-the-internet.md",
      "predicate": "links-to",
      "object": "studies/LH046/LH046.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/who-watches-the-internet.md",
        "passage": "> **Later evidence, 9 November 2026.** One of the instruments on this map, GH Archive, which keeps hourly files of GitHub's public events, had every hourly file we checked from 2026 in place: all 452, dated 1 January to 8 November. But what the files held changed. In a sample of four hours a day, pushes, new branches and deleted branches or tags were missing altogether from two in three of the hours from 15 October to 7 November (64 of 96), and from about one in seven before (26 of 176 from 1 September). Earlier in 2026, in the hours we read at noon UTC, its other kinds of event thinned: pull requests, issues, comments and stars fell from 21,503 in an hour on 1 January to 189 on 15 August, while pushes did not fall. We counted what the files hold, not what happened on GitHub. If GitHub had these events, whether its public events feed or GH Archive's collection lost them is unknown, and so is why. An hourly file can be present and still lack whole kinds of event. [The record](../studies/LH046/LH046.md).",
        "line_start": 13,
        "line_end": 13,
        "sha256": "505b444ca0aacb1e6f57bf8a21747ce346a706e8e813a8b40ef888fba525806a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/who-watches-the-internet.md#L13"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-204",
      "subject": "articles/who-watches-the-internet.md",
      "predicate": "links-to",
      "object": "studies/LH035/LH035.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/who-watches-the-internet.md",
        "passage": "- **Methods.** [The study record](../studies/LH035/LH035.md), version 0.3, and [its brief](../studies/LH035/brief.md), fixed before the first read. The layer counts are printed by the study's scripts from its retained data, and the counts of instruments that draw on another and that state no limit are tallied from the table by [the review's script](../studies/LH035/review/recount.py); the figure is drawn by [its own script](../studies/LH035/scripts/diagram.py). The row for CISA's catalogue of exploited flaws rests on a reading tool's extract, because its pages refused our client when the rest were checked against the raw pages on 6 November; so do Docker's definition of a pull and Netlas's collection policy, from 2 November.",
        "line_start": 61,
        "line_end": 61,
        "sha256": "505b444ca0aacb1e6f57bf8a21747ce346a706e8e813a8b40ef888fba525806a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/who-watches-the-internet.md#L61"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-205",
      "subject": "articles/who-watches-the-internet.md",
      "predicate": "links-to",
      "object": "articles/what-we-can-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "articles/who-watches-the-internet.md",
        "passage": "- **Full record.** [The study](../studies/LH035/), and [the earlier survey of sources on AI activity](what-we-can-see.md).",
        "line_start": 64,
        "line_end": 64,
        "sha256": "505b444ca0aacb1e6f57bf8a21747ce346a706e8e813a8b40ef888fba525806a",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/articles/who-watches-the-internet.md#L64"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-206",
      "subject": "essays/it-was-only-a-test.md",
      "predicate": "declares-investigation",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/it-was-only-a-test.md",
        "passage": "investigation: ai-cost-and-spread",
        "line_start": 4,
        "line_end": 4,
        "sha256": "72084c067c6bf8c9be9f6ff327be0e1b2d8e3871bf6983d40cd68aed8c8e91fe",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/it-was-only-a-test.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-207",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "articles/a-week-after-two-fixes.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "A week after release, between 54 and 72 per cent of each fixed Node.js line's downloads were of the fixed release or newer, and between 52 and 79 per cent of the PHP services in each fixed branch were counted as patched ([the week-one piece](../articles/a-week-after-two-fixes.md)). The numbers look alike, but one counts requests in a day and the other services as last scanned. That they look alike is a coincidence, not an agreement.",
        "line_start": 30,
        "line_end": 30,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L30"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-208",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "studies/LH033/LH033.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "Each reading above was made after the first week was seen, could be wrong, and will be reported as made after the fact. Our [PHP](../studies/LH033/brief.md) and [Node.js](../studies/LH034/brief.md) studies both read to day 30, on 21 and 22 November. Their briefs fix the day-30 figures but not the comparisons below; unless those are set down before the day-30 reads, the figures will check these readings, not test them as predictions fixed in advance.",
        "line_start": 64,
        "line_end": 64,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L64"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-209",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "studies/LH034/LH034.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "Each reading above was made after the first week was seen, could be wrong, and will be reported as made after the fact. Our [PHP](../studies/LH033/brief.md) and [Node.js](../studies/LH034/brief.md) studies both read to day 30, on 21 and 22 November. Their briefs fix the day-30 figures but not the comparisons below; unless those are set down before the day-30 reads, the figures will check these readings, not test them as predictions fixed in advance.",
        "line_start": 64,
        "line_end": 64,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L64"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-210",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "studies/LH011/LH011.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "*The figures.* PHP: Censys ARC's public PHP2Shell counts, read daily by [our PHP study](../studies/LH033/LH033.md), to 28 October 2026 (day 7): patched shares per branch, the services on branches with no fix, the services reporting no version and the total counted; and Packagist's Composer installs by PHP version for September 2026, read once by the same study. Node.js: nodejs.org's daily download summaries, read by [our Node.js study](../studies/LH034/LH034.md), to 28 October 2026 (day 7): shares at or above the fixed release per line, the unfixed share, and the daily totals used for the weekend comparison. Python: the download shares of four security fixes a day and a month after release, from [studies/LH011](../studies/LH011/LH011.md)'s retained data, and the 102 pins and their moves, timed by [studies/LH008](../studies/LH008/LH008.md), both as tabulated in [our PHP study](../studies/LH033/LH033.md); the build-server flag across 104 releases, [measured in September 2026](../articles/two-days-for-most.md); Node.js's July 2026 security release, read by the Node.js study for comparison. The two releases, the advisories and the coverage: [our account of the PHP emergency](../articles/php-emergency-first-reading.md) and [the Node.js study's brief](../studies/LH034/brief.md). The week-one figures are those of [the reviewed piece released with this essay](../articles/a-week-after-two-fixes.md) and its two study records, version 0.1.",
        "line_start": 77,
        "line_end": 77,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L77"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-211",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "studies/LH008/LH008.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "*The figures.* PHP: Censys ARC's public PHP2Shell counts, read daily by [our PHP study](../studies/LH033/LH033.md), to 28 October 2026 (day 7): patched shares per branch, the services on branches with no fix, the services reporting no version and the total counted; and Packagist's Composer installs by PHP version for September 2026, read once by the same study. Node.js: nodejs.org's daily download summaries, read by [our Node.js study](../studies/LH034/LH034.md), to 28 October 2026 (day 7): shares at or above the fixed release per line, the unfixed share, and the daily totals used for the weekend comparison. Python: the download shares of four security fixes a day and a month after release, from [studies/LH011](../studies/LH011/LH011.md)'s retained data, and the 102 pins and their moves, timed by [studies/LH008](../studies/LH008/LH008.md), both as tabulated in [our PHP study](../studies/LH033/LH033.md); the build-server flag across 104 releases, [measured in September 2026](../articles/two-days-for-most.md); Node.js's July 2026 security release, read by the Node.js study for comparison. The two releases, the advisories and the coverage: [our account of the PHP emergency](../articles/php-emergency-first-reading.md) and [the Node.js study's brief](../studies/LH034/brief.md). The week-one figures are those of [the reviewed piece released with this essay](../articles/a-week-after-two-fixes.md) and its two study records, version 0.1.",
        "line_start": 77,
        "line_end": 77,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L77"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-212",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "articles/two-days-for-most.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "*The figures.* PHP: Censys ARC's public PHP2Shell counts, read daily by [our PHP study](../studies/LH033/LH033.md), to 28 October 2026 (day 7): patched shares per branch, the services on branches with no fix, the services reporting no version and the total counted; and Packagist's Composer installs by PHP version for September 2026, read once by the same study. Node.js: nodejs.org's daily download summaries, read by [our Node.js study](../studies/LH034/LH034.md), to 28 October 2026 (day 7): shares at or above the fixed release per line, the unfixed share, and the daily totals used for the weekend comparison. Python: the download shares of four security fixes a day and a month after release, from [studies/LH011](../studies/LH011/LH011.md)'s retained data, and the 102 pins and their moves, timed by [studies/LH008](../studies/LH008/LH008.md), both as tabulated in [our PHP study](../studies/LH033/LH033.md); the build-server flag across 104 releases, [measured in September 2026](../articles/two-days-for-most.md); Node.js's July 2026 security release, read by the Node.js study for comparison. The two releases, the advisories and the coverage: [our account of the PHP emergency](../articles/php-emergency-first-reading.md) and [the Node.js study's brief](../studies/LH034/brief.md). The week-one figures are those of [the reviewed piece released with this essay](../articles/a-week-after-two-fixes.md) and its two study records, version 0.1.",
        "line_start": 77,
        "line_end": 77,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L77"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-213",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "articles/php-emergency-first-reading.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "*The figures.* PHP: Censys ARC's public PHP2Shell counts, read daily by [our PHP study](../studies/LH033/LH033.md), to 28 October 2026 (day 7): patched shares per branch, the services on branches with no fix, the services reporting no version and the total counted; and Packagist's Composer installs by PHP version for September 2026, read once by the same study. Node.js: nodejs.org's daily download summaries, read by [our Node.js study](../studies/LH034/LH034.md), to 28 October 2026 (day 7): shares at or above the fixed release per line, the unfixed share, and the daily totals used for the weekend comparison. Python: the download shares of four security fixes a day and a month after release, from [studies/LH011](../studies/LH011/LH011.md)'s retained data, and the 102 pins and their moves, timed by [studies/LH008](../studies/LH008/LH008.md), both as tabulated in [our PHP study](../studies/LH033/LH033.md); the build-server flag across 104 releases, [measured in September 2026](../articles/two-days-for-most.md); Node.js's July 2026 security release, read by the Node.js study for comparison. The two releases, the advisories and the coverage: [our account of the PHP emergency](../articles/php-emergency-first-reading.md) and [the Node.js study's brief](../studies/LH034/brief.md). The week-one figures are those of [the reviewed piece released with this essay](../articles/a-week-after-two-fixes.md) and its two study records, version 0.1.",
        "line_start": 77,
        "line_end": 77,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L77"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-214",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "studies/LH018/LH018.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "*Ubuntu's package.* Ubuntu's fixed PHP package for its 24.04 release is version 8.3.6-0ubuntu0.24.04.13, which reports itself as 8.3.6 ([studies/LH018](../studies/LH018/LH018.md)).",
        "line_start": 83,
        "line_end": 83,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L83"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-215",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "links-to",
      "object": "articles/what-we-can-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "*The windows.* [We can see pieces of the internet's AI activity, but not how they fit together](../articles/what-we-can-see.md), 26 September 2026.",
        "line_start": 85,
        "line_end": 85,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L85"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-216",
      "subject": "essays/seen-from-outside-seen-from-inside.md",
      "predicate": "declares-investigation",
      "object": "investigations/software-updates.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/seen-from-outside-seen-from-inside.md",
        "passage": "investigation: software-updates",
        "line_start": 4,
        "line_end": 4,
        "sha256": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/seen-from-outside-seen-from-inside.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-217",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "articles/what-we-can-see.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "Every step starts with a model computing at a provider, or on someone's own machine. Of the seventeen public sources on AI activity we read in September, the nearest to seeing it was one broker's token counts, covering only requests sent through it ([what we can see](../articles/what-we-can-see.md)). No public instrument would register the decisions to publish or to copy.",
        "line_start": 38,
        "line_end": 38,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L38"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-218",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "articles/where-software-updates-go.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "The copies being run are activity too. Our work on ordinary software updates kept meeting that edge: a project's history stops at what it asked for, the download log at the download, a published image at the installation, and \"None of them reaches a run\" ([where software updates go](../articles/where-software-updates-go.md)). That the package ran on 15 systems is Anthropic's account, from its own review; a download log could have shown fetches at most.",
        "line_start": 40,
        "line_end": 40,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L40"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-219",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "articles/who-watches-the-internet.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "**The package itself.** A registry lists a release as soon as it is up, and its metadata can be read without an account. Open Source Insights, which maps which packages depend on which, says common packages are \"usually fresh, up to date to within an hour or so\", and that quiet ones can be staler ([our map of instruments](../articles/who-watches-the-internet.md), [its record](../studies/LH035/sources.md)). Neither shows who published, or why, and even a signed record of origin can mislead: StepSecurity reports that infected packages carried valid provenance attestations, which say which pipeline built a package, not whether it was behaving as intended ([StepSecurity](https://www.stepsecurity.io/blog/mini-shai-hulud-is-back-a-self-spreading-supply-chain-attack-hits-the-npm-ecosystem)).",
        "line_start": 44,
        "line_end": 44,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L44"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-220",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "studies/LH046/LH046.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "**The commits.** GH Archive says it records public GitHub events in hourly files, and our map of instruments took it at its word ([the record behind the map](../studies/LH035/sources.md)). Our own study of the archive, prompted by this essay's reviewer and since checked once against the archive by a second agent, found every hourly file it read present and none empty, but pushes, new branches and deletions absent together from whole runs of hours: from 26 of 176 sampled files (15 per cent) between 1 September and 14 October, and from 64 of 96 (67 per cent) from 15 October to 7 November, while pull requests, issues and other kinds of event kept arriving. None of the 1.8 million creation events it counted was a tag or a new repository. Why is unknown ([the record](../studies/LH046/LH046.md), [its evidence review](../notes/R-0056-lh046-evidence.md)); and these are counts of what the files hold, not of what happened on GitHub. Where a push is recorded, it names a repository and a commit, not what changed. The archive covers public repositories on one forge, and nothing in an event reliably says whether a person or an agent made the change ([what we can see](../articles/what-we-can-see.md)); a line naming an AI tool is only what a commit says about itself.",
        "line_start": 46,
        "line_end": 46,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L46"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-221",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "articles/tests-read-the-lockfile.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "Ordinary plumbing makes the inference harder. In our reading of software updates, where a project held a library at a version in a pin or a lockfile, some job in its automated test and build workflows was set to install the library from that pinned file at 282 of 291 moments where our rules could decide, though a workflow says what a job would do, not whether it ran or fetched anything ([the reading of tests and lockfiles](../articles/tests-read-the-lockfile.md)). From that we read, now and after those counts were seen, that a copy written into pins and lockfiles could keep being fetched with no agent acting at all; no planned study tests it. If it holds, rising fetch counts would say little about whether the pattern was still spreading. And a small population can sink inside a large one: when one project pinned a new release of the mcp library and published its own, its releases' 35,024 downloads over three weeks were three in every ten thousand downloads of the library's new version on the same days ([where software updates go](../articles/where-software-updates-go.md)).",
        "line_start": 60,
        "line_end": 60,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L60"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-222",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "Each part of this reading could be wrong. Studies in our [investigation into what AI activity costs the shared internet](../investigations/ai-cost-and-spread.md) bear on it, each on a narrower part than its name suggests.",
        "line_start": 84,
        "line_end": 84,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L84"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-223",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "studies/LH043/LH043.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "- **Does the public event record hold what agents left?** For the agents' July actions, the accounts answered first. AISI's technical report writes placeholders such as ⟨REPO_A⟩ and ⟨PERSON_A⟩ where names would be, and rewrote the pull request discussion it reproduces \"to preserve the anonymity of the affected repository and users\"; Anthropic does not name its package; METR's investigators print \"[account name redacted]\" ([AISI's technical report](https://cdn.prod.website-files.com/663bd486c5e4c81588db7a1d/6a724858f7db25c81487016d_Security%20Incident%20INC-2026-07-28-01.pdf), [Anthropic](https://www.anthropic.com/news/investigating-incidents-cybersecurity-evals), [METR and Redwood Research](https://metr.org/blog/2026-08-26-openai-hugging-face-incident-investigation/)). With nothing named, a search would have to find them by the shape of their activity, and we will not do that. The question stays closed unless a source publishes an identifier ([our unreviewed notes on it](../studies/LH043/LH043.md)).",
        "line_start": 87,
        "line_end": 87,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L87"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-224",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "studies/LH041/LH041.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "- **How far did each reported worm wave spread between a person's actions?** A [timeline of the worm waves](../studies/LH041/brief.md) dates thirteen waves named in security firms' write-ups from public malware records and the registries' publish times. It can show how the records' dates sit beside the firms' accounts for loud, reported waves. It says nothing of a pattern nobody reports, and its brief treats each wave's reach beyond its first victims as an upper bound on spread without a person acting.",
        "line_start": 88,
        "line_end": 88,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L88"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-225",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "studies/LH042/LH042.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "- **How visible are exposed AI services?** [Dated counts from the scanners' own publications](../studies/LH042/brief.md) can show whether the services a weight-copying route might use are counted in public, and how the counts move. They cannot test spread: exposure is not spread, and no count shows a host compromised.",
        "line_start": 89,
        "line_end": 89,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L89"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-226",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "studies/LH044/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "- **Does load on shared services show in public?** [A weekly panel of shared services](../studies/LH044/brief.md) records what a labelled request sees and what operators say. It can show costs in public, not what caused them.",
        "line_start": 90,
        "line_end": 90,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L90"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-227",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "links-to",
      "object": "studies/LH045/brief.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "- **Which records roll over before anyone looks?** [A study of records that keep only their present state](../studies/LH045/brief.md) keeps Epoch AI's log of AI data-centre estimates weekly and counts the IETF's Internet-Drafts on agents and bots; its compute-price part was dropped because the sources forbid keeping their figures. It does not test how fast a removed package's records vanish; nothing planned does.",
        "line_start": 91,
        "line_end": 91,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L91"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    },
    {
      "id": "reference-228",
      "subject": "essays/what-the-watch-would-see.md",
      "predicate": "declares-investigation",
      "object": "investigations/ai-cost-and-spread.md",
      "status": "explicit reference",
      "evidence": {
        "path": "essays/what-the-watch-would-see.md",
        "passage": "investigation: ai-cost-and-spread",
        "line_start": 4,
        "line_end": 4,
        "sha256": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
        "input_commit": "63734e4c1473d4edc032e6ea2c764ef66758c78f",
        "url": "https://github.com/JKershaw/lighthouse/blob/63734e4c1473d4edc032e6ea2c764ef66758c78f/essays/what-the-watch-would-see.md#L4"
      },
      "scope": "A retained reference or declared membership, not verified support, influence or causation."
    }
  ],
  "unresolved_references": [],
  "groups": [
    {
      "id": "ai-cost-and-spread",
      "path": "investigations/ai-cost-and-spread.md",
      "title": "What AI activity costs the shared internet",
      "url": "/investigations/ai-cost-and-spread/",
      "question": "What does AI activity cost the infrastructure everyone shares, as the people who run it report and as public traces show, and is any of that activity sustaining or spreading itself outside a lab?",
      "attention": "active",
      "studies": [
        "studies/LH041/LH041.md",
        "studies/LH042/LH042.md",
        "studies/LH043/LH043.md",
        "studies/LH044/brief.md",
        "studies/LH045/brief.md",
        "studies/LH046/LH046.md",
        "studies/LH047/LH047.md"
      ],
      "pieces": [
        "articles/what-we-can-see.md",
        "articles/who-watches-the-internet.md",
        "essays/it-was-only-a-test.md",
        "essays/what-the-watch-would-see.md"
      ],
      "basis": "Explicit links in the investigation, its declared lists, or a publication’s investigation metadata. Membership can overlap."
    },
    {
      "id": "model-found-bugs",
      "path": "investigations/model-found-bugs.md",
      "title": "When a model finds the bug",
      "url": "/investigations/model-found-bugs/",
      "question": "When an AI model finds a serious flaw in software the internet runs on, and writes a working exploit for it, what happens next in public, who says what and when, how do the signals defenders rely on respond, and where does the fix land?",
      "attention": "active",
      "studies": [
        "studies/LH036/brief.md",
        "studies/LH038/brief.md",
        "studies/LH048/brief.md"
      ],
      "pieces": [],
      "basis": "Explicit links in the investigation, its declared lists, or a publication’s investigation metadata. Membership can overlap."
    },
    {
      "id": "software-updates",
      "path": "investigations/software-updates.md",
      "title": "Where does a software update go?",
      "url": "/investigations/software-updates/",
      "question": "When a software library releases a new version, where does it go, how fast, and what makes the software built on it take it up?",
      "attention": "active",
      "studies": [
        "studies/LH002/LH002.md",
        "studies/LH005/LH005.md",
        "studies/LH006/LH006.md",
        "studies/LH007/LH007.md",
        "studies/LH008/LH008.md",
        "studies/LH009/LH009.md",
        "studies/LH010/LH010.md",
        "studies/LH011/LH011.md",
        "studies/LH012/LH012.md",
        "studies/LH013/LH013.md",
        "studies/LH014/LH014.md",
        "studies/LH015/LH015.md",
        "studies/LH017/LH017.md",
        "studies/LH018/LH018.md",
        "studies/LH019/LH019.md",
        "studies/LH020/LH020.md",
        "studies/LH021/LH021.md",
        "studies/LH022/LH022.md",
        "studies/LH023/LH023.md",
        "studies/LH024/LH024.md",
        "studies/LH025/LH025.md",
        "studies/LH026/LH026.md",
        "studies/LH027/LH027.md",
        "studies/LH028/LH028.md",
        "studies/LH029/LH029.md",
        "studies/LH031/LH031.md",
        "studies/LH033/LH033.md",
        "studies/LH034/LH034.md",
        "studies/LH046/LH046.md",
        "studies/LH049/brief.md"
      ],
      "pieces": [
        "articles/a-week-after-two-fixes.md",
        "articles/fixes-that-said-so.md",
        "articles/old-versions-new-pythons.md",
        "articles/php-emergency-first-reading.md",
        "articles/pins-move-over-weeks.md",
        "articles/rarer-further-down.md",
        "articles/recipes-follow-the-pin.md",
        "articles/tests-read-the-lockfile.md",
        "articles/the-lead-was-a-few-libraries.md",
        "articles/the-xz-backdoor.md",
        "articles/two-days-for-most.md",
        "articles/what-a-download-shows.md",
        "articles/what-an-image-holds.md",
        "articles/what-moves-a-pin.md",
        "articles/what-we-can-see.md",
        "articles/where-a-software-update-went.md",
        "articles/where-software-updates-go.md",
        "articles/who-watches-the-internet.md",
        "essays/seen-from-outside-seen-from-inside.md"
      ],
      "basis": "Explicit links in the investigation, its declared lists, or a publication’s investigation metadata. Membership can overlap."
    }
  ],
  "unassigned": [
    "studies/LH000/LH000.md",
    "studies/LH003/LH003.md",
    "studies/LH004/LH004.md",
    "studies/LH016/LH016.md",
    "studies/LH030/LH030.md",
    "studies/LH032/LH032.md",
    "studies/LH035/LH035.md",
    "studies/LH037/brief.md",
    "studies/LH039/brief.md",
    "studies/LH040/LH040.md"
  ],
  "history": {
    "title": "How one inquiry changed course",
    "intro": "Following a release led to two different roads: fast-moving downloads and slower pinned versions. Broader tests changed the explanations along the way.",
    "scope": "Eight selected readings in the core Python inquiry. Arrows follow documented steps; each box opens the current corrected article. The wider download result concerns heavily downloaded libraries: later lower-rank samples did not show the same pattern.",
    "nodes": [
      {
        "id": "projects",
        "path": "articles/where-a-software-update-went.md",
        "title": "A trail through projects",
        "lines": [
          "A trail through",
          "nine projects"
        ],
        "status": "A first case",
        "summary": "One release could be followed through nine selected projects. Their histories showed choices, not why they moved or what ran.",
        "passage": "In those four weeks the new version reached four of the nine projects. The project in the opening moved its pin, a requirement for one exact version, six days after the release. A very busy project, which made 1,482 commits in the four weeks, took the new version into its lockfile eleven days after the release; a lockfile is where a project writes down the exact versions it has settled on for its own use. A project whose history on GitHub begins on 4 April already held the new version in its first commit there, two days after the release, and wrote an exact pin for it on 14 April. The fourth began using the library on the last day, and its lockfile settled on the newest version, as any would have by then. Those moves took five commits, out of 2,508 that the ten projects made in the four weeks. The other five projects did not take it up: two stayed pinned to 1.26.0, two still had 1.26.0 in their lockfiles at the end, and one did not use the library in those weeks.",
        "passages": [
          {
            "label": "Result",
            "passage": "In those four weeks the new version reached four of the nine projects. The project in the opening moved its pin, a requirement for one exact version, six days after the release. A very busy project, which made 1,482 commits in the four weeks, took the new version into its lockfile eleven days after the release; a lockfile is where a project writes down the exact versions it has settled on for its own use. A project whose history on GitHub begins on 4 April already held the new version in its first commit there, two days after the release, and wrote an exact pin for it on 14 April. The fourth began using the library on the last day, and its lockfile settled on the newest version, as any would have by then. Those moves took five commits, out of 2,508 that the ten projects made in the four weeks. The other five projects did not take it up: two stayed pinned to 1.26.0, two still had 1.26.0 in their lockfiles at the end, and one did not use the library in those weeks."
          },
          {
            "label": "Limit",
            "passage": "So this is how far the public record reaches, in one small neighbourhood over four weeks. It can follow a new version from a library into the projects that take it up, and, where a project pins it exactly, one step beyond. It cannot say why any of them moved, and it stops at the edge of every machine where the code was installed."
          }
        ],
        "url": "/articles/where-a-software-update-went/",
        "evidence": {
          "path": "articles/where-a-software-update-went.md",
          "passage": "In those four weeks the new version reached four of the nine projects. The project in the opening moved its pin, a requirement for one exact version, six days after the release. A very busy project, which made 1,482 commits in the four weeks, took the new version into its lockfile eleven days after the release; a lockfile is where a project writes down the exact versions it has settled on for its own use. A project whose history on GitHub begins on 4 April already held the new version in its first commit there, two days after the release, and wrote an exact pin for it on 14 April. The fourth began using the library on the last day, and its lockfile settled on the newest version, as any would have by then. Those moves took five commits, out of 2,508 that the ten projects made in the four weeks. The other five projects did not take it up: two stayed pinned to 1.26.0, two still had 1.26.0 in their lockfiles at the end, and one did not use the library in those weeks.",
          "line_start": 20,
          "line_end": 20,
          "sha256": "988b4d5feff9f54b56b6917b4e3e9eeeaeddc9e23496f37035377d4e5ede530d",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/where-a-software-update-went.md#L20"
        },
        "evidence_spans": [
          {
            "label": "Result",
            "path": "articles/where-a-software-update-went.md",
            "passage": "In those four weeks the new version reached four of the nine projects. The project in the opening moved its pin, a requirement for one exact version, six days after the release. A very busy project, which made 1,482 commits in the four weeks, took the new version into its lockfile eleven days after the release; a lockfile is where a project writes down the exact versions it has settled on for its own use. A project whose history on GitHub begins on 4 April already held the new version in its first commit there, two days after the release, and wrote an exact pin for it on 14 April. The fourth began using the library on the last day, and its lockfile settled on the newest version, as any would have by then. Those moves took five commits, out of 2,508 that the ten projects made in the four weeks. The other five projects did not take it up: two stayed pinned to 1.26.0, two still had 1.26.0 in their lockfiles at the end, and one did not use the library in those weeks.",
            "line_start": 20,
            "line_end": 20,
            "sha256": "988b4d5feff9f54b56b6917b4e3e9eeeaeddc9e23496f37035377d4e5ede530d",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/where-a-software-update-went.md#L20"
          },
          {
            "label": "Limit",
            "path": "articles/where-a-software-update-went.md",
            "passage": "So this is how far the public record reaches, in one small neighbourhood over four weeks. It can follow a new version from a library into the projects that take it up, and, where a project pins it exactly, one step beyond. It cannot say why any of them moved, and it stops at the edge of every machine where the code was installed.",
            "line_start": 50,
            "line_end": 50,
            "sha256": "988b4d5feff9f54b56b6917b4e3e9eeeaeddc9e23496f37035377d4e5ede530d",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/where-a-software-update-went.md#L50"
          }
        ]
      },
      {
        "id": "downloads",
        "path": "articles/what-a-download-shows.md",
        "title": "Downloads ran ahead",
        "lines": [
          "Downloads",
          "ran ahead"
        ],
        "status": "A new public trace",
        "summary": "The release reached half of one library’s downloads within two days. A fetch still did not show an installation.",
        "passage": "Version 1.27.0 went up on the registry at 14:48 UTC on 2 April. In the nine hours left of that day it was downloaded 1,639,539 times, 22 per cent of the day's downloads of the library. The next day it was 48 per cent, the day after 51. On every day from then to 22 April it was between 45 and 71 per cent. Over the four weeks it was downloaded about 96 million times, though it existed for only three of them. The release before it, in January, went the same way, passing 60 per cent the day after it came out, so this pace is ordinary for this library.",
        "passages": [
          {
            "label": "Result",
            "passage": "Version 1.27.0 went up on the registry at 14:48 UTC on 2 April. In the nine hours left of that day it was downloaded 1,639,539 times, 22 per cent of the day's downloads of the library. The next day it was 48 per cent, the day after 51. On every day from then to 22 April it was between 45 and 71 per cent. Over the four weeks it was downloaded about 96 million times, though it existed for only three of them. The release before it, in January, went the same way, passing 60 per cent the day after it came out, so this pace is ordinary for this library."
          },
          {
            "label": "Limit",
            "passage": "That is as far as the log reaches. An entry records one file, served by the registry to a program that gave its name. It is not an installation. A mirror or a company proxy fetches a file once and may install it many times without the registry seeing; an installer's cache reinstalls without fetching; and a command that only fetches a file, or a scanner checking packages for problems, downloads without installing anything. Nothing in the log says whether a file was ever used, still less run. It does not say whether a person, a build server or an AI agent asked for it either. One pattern hints at machines: across three whole weeks in April, downloads of the new version fell less at weekends, to 0.88 of the weekday level, or 0.82 leaving out one unusually busy Sunday, while the old version's fell to about half. That fits environments created afresh whenever something runs, day or night; it also fits people working at weekends, and nothing in the log tells them apart."
          }
        ],
        "url": "/articles/what-a-download-shows/",
        "evidence": {
          "path": "articles/what-a-download-shows.md",
          "passage": "Version 1.27.0 went up on the registry at 14:48 UTC on 2 April. In the nine hours left of that day it was downloaded 1,639,539 times, 22 per cent of the day's downloads of the library. The next day it was 48 per cent, the day after 51. On every day from then to 22 April it was between 45 and 71 per cent. Over the four weeks it was downloaded about 96 million times, though it existed for only three of them. The release before it, in January, went the same way, passing 60 per cent the day after it came out, so this pace is ordinary for this library.",
          "line_start": 28,
          "line_end": 28,
          "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-a-download-shows.md#L28"
        },
        "evidence_spans": [
          {
            "label": "Result",
            "path": "articles/what-a-download-shows.md",
            "passage": "Version 1.27.0 went up on the registry at 14:48 UTC on 2 April. In the nine hours left of that day it was downloaded 1,639,539 times, 22 per cent of the day's downloads of the library. The next day it was 48 per cent, the day after 51. On every day from then to 22 April it was between 45 and 71 per cent. Over the four weeks it was downloaded about 96 million times, though it existed for only three of them. The release before it, in January, went the same way, passing 60 per cent the day after it came out, so this pace is ordinary for this library.",
            "line_start": 28,
            "line_end": 28,
            "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-a-download-shows.md#L28"
          },
          {
            "label": "Limit",
            "path": "articles/what-a-download-shows.md",
            "passage": "That is as far as the log reaches. An entry records one file, served by the registry to a program that gave its name. It is not an installation. A mirror or a company proxy fetches a file once and may install it many times without the registry seeing; an installer's cache reinstalls without fetching; and a command that only fetches a file, or a scanner checking packages for problems, downloads without installing anything. Nothing in the log says whether a file was ever used, still less run. It does not say whether a person, a build server or an AI agent asked for it either. One pattern hints at machines: across three whole weeks in April, downloads of the new version fell less at weekends, to 0.88 of the weekday level, or 0.82 leaving out one unusually busy Sunday, while the old version's fell to about half. That fits environments created afresh whenever something runs, day or night; it also fits people working at weekends, and nothing in the log tells them apart.",
            "line_start": 46,
            "line_end": 46,
            "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-a-download-shows.md#L46"
          }
        ]
      },
      {
        "id": "images",
        "path": "articles/what-an-image-holds.md",
        "title": "Images showed the installation",
        "lines": [
          "Images showed",
          "the installation"
        ],
        "status": "A further trace",
        "summary": "Published images held a newer version before the lockfile named it. Whether anyone ran those images remained unseen.",
        "passage": "The images show exactly that. The one the project's automated build made at 04:37 UTC on 2 April, ten hours before the new release, holds 1.26.0. The one built on 8 April holds 1.27.0. That image is an odd one, and we come back to it below. The next we read is not odd: the automated build of 22 April, made from a commit whose lockfile still said 1.26.0, holds 1.27.0 too. On 24 April the project changed its requirement to exactly 1.27.0. Its images had held that version since 8 April.",
        "passages": [
          {
            "label": "Result",
            "passage": "The images show exactly that. The one the project's automated build made at 04:37 UTC on 2 April, ten hours before the new release, holds 1.26.0. The one built on 8 April holds 1.27.0. That image is an odd one, and we come back to it below. The next we read is not odd: the automated build of 22 April, made from a commit whose lockfile still said 1.26.0, holds 1.27.0 too. On 24 April the project changed its requirement to exactly 1.27.0. Its images had held that version since 8 April."
          },
          {
            "label": "Limit",
            "passage": "An image is also an installation made to be run, not a run. Nothing in a registry says whether an image was started, where, or how often. Docker Hub counts pulls, 1,453,176 of them for octobot's images, but a pull is a request for an image, and a request is not a use: 612 of keboola's 730 tags show the same last-pulled day, 17 August 2026, which fits one program sweeping every tag rather than anyone running them."
          }
        ],
        "url": "/articles/what-an-image-holds/",
        "evidence": {
          "path": "articles/what-an-image-holds.md",
          "passage": "The images show exactly that. The one the project's automated build made at 04:37 UTC on 2 April, ten hours before the new release, holds 1.26.0. The one built on 8 April holds 1.27.0. That image is an odd one, and we come back to it below. The next we read is not odd: the automated build of 22 April, made from a commit whose lockfile still said 1.26.0, holds 1.27.0 too. On 24 April the project changed its requirement to exactly 1.27.0. Its images had held that version since 8 April.",
          "line_start": 30,
          "line_end": 30,
          "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-an-image-holds.md#L30"
        },
        "evidence_spans": [
          {
            "label": "Result",
            "path": "articles/what-an-image-holds.md",
            "passage": "The images show exactly that. The one the project's automated build made at 04:37 UTC on 2 April, ten hours before the new release, holds 1.26.0. The one built on 8 April holds 1.27.0. That image is an odd one, and we come back to it below. The next we read is not odd: the automated build of 22 April, made from a commit whose lockfile still said 1.26.0, holds 1.27.0 too. On 24 April the project changed its requirement to exactly 1.27.0. Its images had held that version since 8 April.",
            "line_start": 30,
            "line_end": 30,
            "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-an-image-holds.md#L30"
          },
          {
            "label": "Limit",
            "path": "articles/what-an-image-holds.md",
            "passage": "An image is also an installation made to be run, not a run. Nothing in a registry says whether an image was started, where, or how often. Docker Hub counts pulls, 1,453,176 of them for octobot's images, but a pull is a request for an image, and a request is not a use: 612 of keboola's 730 tags show the same last-pulled day, 17 August 2026, which fits one program sweeping every tag rather than anyone running them.",
            "line_start": 54,
            "line_end": 54,
            "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-an-image-holds.md#L54"
          }
        ]
      },
      {
        "id": "advisory",
        "path": "articles/what-moves-a-pin.md",
        "title": "An advisory offered a lead",
        "lines": [
          "An advisory",
          "offered a lead"
        ],
        "status": "Early lead, later revised",
        "summary": "One library’s pins moved soon after advisories. The burst did not recur across four other libraries.",
        "passage": "We found the first commit naming 1.28.0 or 1.28.1 for 13 of the projects in the sample. Six of those commits came in the 28 hours after the advisory, between 54 minutes and 27.6 hours after it, and about a month after the release. Four of the six were changes written by Dependabot, a service on GitHub that opens updates to a project's dependencies: three were committed under its name, and one was merged by a person from the branch it had opened. A fifth was made under a project's own bot account, with a person named as co-author, in a change whose message says it upgrades a different library to a new major version, with mcp moving inside it. The sixth was a person whose message says the change fixes \"3 high-severity CVEs\", the numbered public records of security flaws, and names all three of that evening's advisories.",
        "passages": [
          {
            "label": "Result",
            "passage": "We found the first commit naming 1.28.0 or 1.28.1 for 13 of the projects in the sample. Six of those commits came in the 28 hours after the advisory, between 54 minutes and 27.6 hours after it, and about a month after the release. Four of the six were changes written by Dependabot, a service on GitHub that opens updates to a project's dependencies: three were committed under its name, and one was merged by a person from the branch it had opened. A fifth was made under a project's own bot account, with a person named as co-author, in a change whose message says it upgrades a different library to a new major version, with mcp moving inside it. The sixth was a person whose message says the change fixes \"3 high-severity CVEs\", the numbered public records of security flaws, and names all three of that evening's advisories."
          },
          {
            "label": "Later qualification",
            "passage": "> **Later evidence, 27 September 2026.** Across four libraries, pinned software moved to security fixes over weeks, after both the release and the advisory, with no burst like the one here ([the later reading](pins-move-over-weeks.md)); whether a fix's own notes draw pins sooner is still unsettled ([the latest reading](the-lead-was-a-few-libraries.md))."
          }
        ],
        "url": "/articles/what-moves-a-pin/",
        "evidence": {
          "path": "articles/what-moves-a-pin.md",
          "passage": "We found the first commit naming 1.28.0 or 1.28.1 for 13 of the projects in the sample. Six of those commits came in the 28 hours after the advisory, between 54 minutes and 27.6 hours after it, and about a month after the release. Four of the six were changes written by Dependabot, a service on GitHub that opens updates to a project's dependencies: three were committed under its name, and one was merged by a person from the branch it had opened. A fifth was made under a project's own bot account, with a person named as co-author, in a change whose message says it upgrades a different library to a new major version, with mcp moving inside it. The sixth was a person whose message says the change fixes \"3 high-severity CVEs\", the numbered public records of security flaws, and names all three of that evening's advisories.",
          "line_start": 38,
          "line_end": 38,
          "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-moves-a-pin.md#L38"
        },
        "evidence_spans": [
          {
            "label": "Result",
            "path": "articles/what-moves-a-pin.md",
            "passage": "We found the first commit naming 1.28.0 or 1.28.1 for 13 of the projects in the sample. Six of those commits came in the 28 hours after the advisory, between 54 minutes and 27.6 hours after it, and about a month after the release. Four of the six were changes written by Dependabot, a service on GitHub that opens updates to a project's dependencies: three were committed under its name, and one was merged by a person from the branch it had opened. A fifth was made under a project's own bot account, with a person named as co-author, in a change whose message says it upgrades a different library to a new major version, with mcp moving inside it. The sixth was a person whose message says the change fixes \"3 high-severity CVEs\", the numbered public records of security flaws, and names all three of that evening's advisories.",
            "line_start": 38,
            "line_end": 38,
            "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-moves-a-pin.md#L38"
          },
          {
            "label": "Later qualification",
            "path": "articles/what-moves-a-pin.md",
            "passage": "> **Later evidence, 27 September 2026.** Across four libraries, pinned software moved to security fixes over weeks, after both the release and the advisory, with no burst like the one here ([the later reading](pins-move-over-weeks.md)); whether a fix's own notes draw pins sooner is still unsettled ([the latest reading](the-lead-was-a-few-libraries.md)).",
            "line_start": 14,
            "line_end": 14,
            "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-moves-a-pin.md#L14"
          }
        ]
      },
      {
        "id": "four",
        "path": "articles/pins-move-over-weeks.md",
        "title": "A wider reading changed the story",
        "lines": [
          "A wider reading",
          "changed the story"
        ],
        "status": "The burst did not generalise",
        "summary": "Four libraries showed pin changes over weeks, with no advisory burst. A pin move remained a request, not an installation.",
        "passage": "There was no burst. Four of the 102 moved within a day after the advisory. pyjwt's and starlette's advisories, like the ones we saw before, came weeks after their fixes, and in the day after them one pinned project moved.",
        "passages": [
          {
            "label": "Result",
            "passage": "There was no burst. Four of the 102 moved within a day after the advisory. pyjwt's and starlette's advisories, like the ones we saw before, came weeks after their fixes, and in the day after them one pinned project moved."
          },
          {
            "label": "Pin moves",
            "passage": "By 27 September, 73 of the 102 had moved to the fix, 28 had not, and one had stopped pinning the library. The typical move, the median, came 18.7 days after the fix was released, and half of them fell between one and five weeks after it. Of the 73, 19 came before the advisory and 54 after it. For pyjwt and starlette, whose advisories came weeks after their fixes, 13 of the 30 moves came before the advisory."
          },
          {
            "label": "Limit",
            "passage": "And a move is a request. It changes what the project's next build or installation would take; it says nothing about what was installed or run. We did not check whether any project used the parts of these libraries the advisories concern, and nothing here says that any project was exposed."
          }
        ],
        "url": "/articles/pins-move-over-weeks/",
        "evidence": {
          "path": "articles/pins-move-over-weeks.md",
          "passage": "There was no burst. Four of the 102 moved within a day after the advisory. pyjwt's and starlette's advisories, like the ones we saw before, came weeks after their fixes, and in the day after them one pinned project moved.",
          "line_start": 34,
          "line_end": 34,
          "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/pins-move-over-weeks.md#L34"
        },
        "evidence_spans": [
          {
            "label": "Result",
            "path": "articles/pins-move-over-weeks.md",
            "passage": "There was no burst. Four of the 102 moved within a day after the advisory. pyjwt's and starlette's advisories, like the ones we saw before, came weeks after their fixes, and in the day after them one pinned project moved.",
            "line_start": 34,
            "line_end": 34,
            "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/pins-move-over-weeks.md#L34"
          },
          {
            "label": "Pin moves",
            "path": "articles/pins-move-over-weeks.md",
            "passage": "By 27 September, 73 of the 102 had moved to the fix, 28 had not, and one had stopped pinning the library. The typical move, the median, came 18.7 days after the fix was released, and half of them fell between one and five weeks after it. Of the 73, 19 came before the advisory and 54 after it. For pyjwt and starlette, whose advisories came weeks after their fixes, 13 of the 30 moves came before the advisory.",
            "line_start": 30,
            "line_end": 30,
            "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/pins-move-over-weeks.md#L30"
          },
          {
            "label": "Limit",
            "path": "articles/pins-move-over-weeks.md",
            "passage": "And a move is a request. It changes what the project's next build or installation would take; it says nothing about what was installed or run. We did not check whether any project used the parts of these libraries the advisories concern, and nothing here says that any project was exposed.",
            "line_start": 62,
            "line_end": 62,
            "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/pins-move-over-weeks.md#L62"
          }
        ]
      },
      {
        "id": "notes",
        "path": "articles/fixes-that-said-so.md",
        "title": "Could the release notes explain it?",
        "lines": [
          "Could the release",
          "notes explain it?"
        ],
        "status": "Early lead, later qualified",
        "summary": "Fourteen libraries offered a lead for fixes whose own notes said so. Two libraries carried much of it; a wider reading left it unsettled.",
        "passage": "That share is not a fair comparison by itself, because the announced fixes' advisories came sooner. The typical announced fix, the median, had its advisory 3.9 days after its release, and the typical silent one 10.6 days after, so software pinning an announced fix had less time in which to move before the advisory. To compare fairly we counted, as last time, how many of the projects still waiting moved on each day. From the release to the advisory, a little over two in every hundred waiting projects moved each day to an announced fix (2.4), and a little under one and a half to a silent one (1.4): about 1.7 times the pace.",
        "passages": [
          {
            "label": "Earlier result",
            "passage": "That share is not a fair comparison by itself, because the announced fixes' advisories came sooner. The typical announced fix, the median, had its advisory 3.9 days after its release, and the typical silent one 10.6 days after, so software pinning an announced fix had less time in which to move before the advisory. To compare fairly we counted, as last time, how many of the projects still waiting moved on each day. From the release to the advisory, a little over two in every hundred waiting projects moved each day to an announced fix (2.4), and a little under one and a half to a silent one (1.4): about 1.7 times the pace."
          },
          {
            "label": "Concentration",
            "passage": "Each library gave one fix, so every difference between the two kinds is also a difference between seven libraries and seven others: their users, their bots, how often the projects that use them change anything. Two libraries carry much of the announced fixes' lead. gitpython's dependents moved fastest of all, and gave 8 of the 29 moves to announced fixes before the advisory, six of them in its first two days, four of those Renovate's. pyjwt's advisory came 25 days after its fix and gave 10 more. Leaving out any one library keeps the announced fixes ahead, but leaving out gitpython leaves them only just ahead (1.8 a day, against between 1.1 and 1.7 for the silent fixes with any one library left out). The days that make the difference rest on 13 moves against 5, and three of the 13 were one organisation's repositories, moved within 46 minutes on one July morning. We ran no test of significance; at counts this small, the noise in a rate is about as large as the difference."
          },
          {
            "label": "Later qualification",
            "passage": "> **Later evidence, 27 September 2026.** Counting thirty libraries once each, a later reading could not tell how fast pinned software moved before the advisory to fixes whose notes said so from how fast it moved to silent ones, and the pooled lead it found was too uncertain to call. This is a wider follow-up, not a correction; the figures here stand. [The latest reading](the-lead-was-a-few-libraries.md)."
          }
        ],
        "url": "/articles/fixes-that-said-so/",
        "evidence": {
          "path": "articles/fixes-that-said-so.md",
          "passage": "That share is not a fair comparison by itself, because the announced fixes' advisories came sooner. The typical announced fix, the median, had its advisory 3.9 days after its release, and the typical silent one 10.6 days after, so software pinning an announced fix had less time in which to move before the advisory. To compare fairly we counted, as last time, how many of the projects still waiting moved on each day. From the release to the advisory, a little over two in every hundred waiting projects moved each day to an announced fix (2.4), and a little under one and a half to a silent one (1.4): about 1.7 times the pace.",
          "line_start": 38,
          "line_end": 38,
          "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/fixes-that-said-so.md#L38"
        },
        "evidence_spans": [
          {
            "label": "Earlier result",
            "path": "articles/fixes-that-said-so.md",
            "passage": "That share is not a fair comparison by itself, because the announced fixes' advisories came sooner. The typical announced fix, the median, had its advisory 3.9 days after its release, and the typical silent one 10.6 days after, so software pinning an announced fix had less time in which to move before the advisory. To compare fairly we counted, as last time, how many of the projects still waiting moved on each day. From the release to the advisory, a little over two in every hundred waiting projects moved each day to an announced fix (2.4), and a little under one and a half to a silent one (1.4): about 1.7 times the pace.",
            "line_start": 38,
            "line_end": 38,
            "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/fixes-that-said-so.md#L38"
          },
          {
            "label": "Concentration",
            "path": "articles/fixes-that-said-so.md",
            "passage": "Each library gave one fix, so every difference between the two kinds is also a difference between seven libraries and seven others: their users, their bots, how often the projects that use them change anything. Two libraries carry much of the announced fixes' lead. gitpython's dependents moved fastest of all, and gave 8 of the 29 moves to announced fixes before the advisory, six of them in its first two days, four of those Renovate's. pyjwt's advisory came 25 days after its fix and gave 10 more. Leaving out any one library keeps the announced fixes ahead, but leaving out gitpython leaves them only just ahead (1.8 a day, against between 1.1 and 1.7 for the silent fixes with any one library left out). The days that make the difference rest on 13 moves against 5, and three of the 13 were one organisation's repositories, moved within 46 minutes on one July morning. We ran no test of significance; at counts this small, the noise in a rate is about as large as the difference.",
            "line_start": 58,
            "line_end": 58,
            "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/fixes-that-said-so.md#L58"
          },
          {
            "label": "Later qualification",
            "path": "articles/fixes-that-said-so.md",
            "passage": "> **Later evidence, 27 September 2026.** Counting thirty libraries once each, a later reading could not tell how fast pinned software moved before the advisory to fixes whose notes said so from how fast it moved to silent ones, and the pooled lead it found was too uncertain to call. This is a wider follow-up, not a correction; the figures here stand. [The latest reading](the-lead-was-a-few-libraries.md).",
            "line_start": 14,
            "line_end": 14,
            "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/fixes-that-said-so.md#L14"
          }
        ]
      },
      {
        "id": "open",
        "path": "articles/the-lead-was-a-few-libraries.md",
        "title": "More libraries left the answer open",
        "lines": [
          "More libraries left",
          "the answer open"
        ],
        "status": "Still unsettled",
        "summary": "Across thirty libraries, the pooled count leaned one way, but typical libraries could not be distinguished. The sample settled neither an effect nor its absence.",
        "passage": "Our earlier reading said that pinned software moved faster before the advisory to fixes whose notes said so, mostly in people's changes in the week after the release, and that with one fix for each library the notes could not be told apart from the library. Counting thirty libraries, each once, does not resolve that doubt. We could not tell the typical library whose fix said so from the typical library whose fix did not, and the week that carried the earlier difference shows no difference here. The pooled count still leans the announced way, by about one and a half times by our rule and by more when earlier notices are counted, and no single library's removal changes that; but by our own rule resampling the libraries puts even the pooled lead within reach of no difference, and the readings that do not reach it were chosen after the fact. So we do not say the notes make no difference, and we do not say they make one. This sample cannot settle it.",
        "passages": [
          {
            "label": "Current conclusion",
            "passage": "Our earlier reading said that pinned software moved faster before the advisory to fixes whose notes said so, mostly in people's changes in the week after the release, and that with one fix for each library the notes could not be told apart from the library. Counting thirty libraries, each once, does not resolve that doubt. We could not tell the typical library whose fix said so from the typical library whose fix did not, and the week that carried the earlier difference shows no difference here. The pooled count still leans the announced way, by about one and a half times by our rule and by more when earlier notices are counted, and no single library's removal changes that; but by our own rule resampling the libraries puts even the pooled lead within reach of no difference, and the readings that do not reach it were chosen after the fact. So we do not say the notes make no difference, and we do not say they make one. This sample cannot settle it."
          }
        ],
        "url": "/articles/the-lead-was-a-few-libraries/",
        "evidence": {
          "path": "articles/the-lead-was-a-few-libraries.md",
          "passage": "Our earlier reading said that pinned software moved faster before the advisory to fixes whose notes said so, mostly in people's changes in the week after the release, and that with one fix for each library the notes could not be told apart from the library. Counting thirty libraries, each once, does not resolve that doubt. We could not tell the typical library whose fix said so from the typical library whose fix did not, and the week that carried the earlier difference shows no difference here. The pooled count still leans the announced way, by about one and a half times by our rule and by more when earlier notices are counted, and no single library's removal changes that; but by our own rule resampling the libraries puts even the pooled lead within reach of no difference, and the readings that do not reach it were chosen after the fact. So we do not say the notes make no difference, and we do not say they make one. This sample cannot settle it.",
          "line_start": 74,
          "line_end": 74,
          "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/the-lead-was-a-few-libraries.md#L74"
        },
        "evidence_spans": [
          {
            "label": "Current conclusion",
            "path": "articles/the-lead-was-a-few-libraries.md",
            "passage": "Our earlier reading said that pinned software moved faster before the advisory to fixes whose notes said so, mostly in people's changes in the week after the release, and that with one fix for each library the notes could not be told apart from the library. Counting thirty libraries, each once, does not resolve that doubt. We could not tell the typical library whose fix said so from the typical library whose fix did not, and the week that carried the earlier difference shows no difference here. The pooled count still leans the announced way, by about one and a half times by our rule and by more when earlier notices are counted, and no single library's removal changes that; but by our own rule resampling the libraries puts even the pooled lead within reach of no difference, and the readings that do not reach it were chosen after the fact. So we do not say the notes make no difference, and we do not say they make one. This sample cannot settle it.",
            "line_start": 74,
            "line_end": 74,
            "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/the-lead-was-a-few-libraries.md#L74"
          }
        ]
      },
      {
        "id": "pace",
        "path": "articles/two-days-for-most.md",
        "title": "Test the fast road more widely",
        "lines": [
          "Test the fast road",
          "more widely"
        ],
        "status": "Most releases in top libraries",
        "summary": "Most releases reached half the downloads within two days in 26 of 37 heavily downloaded libraries. Later lower-rank samples differed, and a share of fetches did not measure installed uptake.",
        "passage": "For 26 of the 37 libraries, most releases reached half of the downloads within two days: 70 per cent of the libraries. Resampling the libraries puts that share anywhere from 54 to 84 per cent, so a different set of libraries could give a different count. For 21 of the 26 every release reached half; for the other five, most did.",
        "passages": [
          {
            "label": "Result",
            "passage": "For 26 of the 37 libraries, most releases reached half of the downloads within two days: 70 per cent of the libraries. Resampling the libraries puts that share anywhere from 54 to 84 per cent, so a different set of libraries could give a different count. For 21 of the 26 every release reached half; for the other five, most did."
          },
          {
            "label": "Corrected reading",
            "passage": "The chart shows something we had not set out to measure. In every library but litellm, whatever share the typical new version held on the day after its release was most of what it held a month later: for 34 of the 37 libraries, the typical release's share a month later was within ten points of its share on the day after. We noticed this only when we drew the chart, after every count was in, so it describes these releases and is not yet a tested result; our next reading will measure it on releases we have not read. The share did not stand still in that month, though, as we saw only after this piece first appeared. It crept up, by about four points in the typical library, and 378 of the 418 releases whose month we read held more a month on than on the day after."
          },
          {
            "label": "Fetch limit",
            "passage": "A download is a fetch, not a person or a machine. A build server that sets up from scratch fifty times a day counts fifty times; a laptop, or a company's proxy, that keeps a copy counts once or not at all. So a share of downloads leans towards whatever fetches most often, and the part that stays on older versions could be a few environments fetching many times over, or many fetching once. The log cannot tell which."
          }
        ],
        "url": "/articles/two-days-for-most/",
        "evidence": {
          "path": "articles/two-days-for-most.md",
          "passage": "For 26 of the 37 libraries, most releases reached half of the downloads within two days: 70 per cent of the libraries. Resampling the libraries puts that share anywhere from 54 to 84 per cent, so a different set of libraries could give a different count. For 21 of the 26 every release reached half; for the other five, most did.",
          "line_start": 33,
          "line_end": 33,
          "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/two-days-for-most.md#L33"
        },
        "evidence_spans": [
          {
            "label": "Result",
            "path": "articles/two-days-for-most.md",
            "passage": "For 26 of the 37 libraries, most releases reached half of the downloads within two days: 70 per cent of the libraries. Resampling the libraries puts that share anywhere from 54 to 84 per cent, so a different set of libraries could give a different count. For 21 of the 26 every release reached half; for the other five, most did.",
            "line_start": 33,
            "line_end": 33,
            "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/two-days-for-most.md#L33"
          },
          {
            "label": "Corrected reading",
            "path": "articles/two-days-for-most.md",
            "passage": "The chart shows something we had not set out to measure. In every library but litellm, whatever share the typical new version held on the day after its release was most of what it held a month later: for 34 of the 37 libraries, the typical release's share a month later was within ten points of its share on the day after. We noticed this only when we drew the chart, after every count was in, so it describes these releases and is not yet a tested result; our next reading will measure it on releases we have not read. The share did not stand still in that month, though, as we saw only after this piece first appeared. It crept up, by about four points in the typical library, and 378 of the 418 releases whose month we read held more a month on than on the day after.",
            "line_start": 43,
            "line_end": 43,
            "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/two-days-for-most.md#L43"
          },
          {
            "label": "Fetch limit",
            "path": "articles/two-days-for-most.md",
            "passage": "A download is a fetch, not a person or a machine. A build server that sets up from scratch fifty times a day counts fifty times; a laptop, or a company's proxy, that keeps a copy counts once or not at all. So a share of downloads leans towards whatever fetches most often, and the part that stays on older versions could be a few environments fetching many times over, or many fetching once. The log cannot tell which.",
            "line_start": 47,
            "line_end": 47,
            "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
            "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
            "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/two-days-for-most.md#L47"
          }
        ]
      }
    ],
    "edges": [
      {
        "id": "history-1",
        "subject": "projects",
        "object": "downloads",
        "predicate": "extends",
        "path": "articles/what-a-download-shows.md",
        "passage": "We had followed this release before, [through the public histories of those nine projects](where-a-software-update-went.md), and the trail stopped where every public record we read stopped: at the machines where the code was installed. One public record looks past that edge, the log of files downloaded from the Python Package Index. We read it for the same four weeks. It shows the new version arriving in days, carried, we think, by the programs that install software rather than by any project's decision. And what it sees is a download: never an installation, and never a run.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/what-a-download-shows.md",
          "passage": "We had followed this release before, [through the public histories of those nine projects](where-a-software-update-went.md), and the trail stopped where every public record we read stopped: at the machines where the code was installed. One public record looks past that edge, the log of files downloaded from the Python Package Index. We read it for the same four weeks. It shows the new version arriving in days, carried, we think, by the programs that install software rather than by any project's decision. And what it sees is a download: never an installation, and never a run.",
          "line_start": 10,
          "line_end": 10,
          "sha256": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-a-download-shows.md#L10"
        }
      },
      {
        "id": "history-2",
        "subject": "downloads",
        "object": "images",
        "predicate": "extends",
        "path": "articles/what-an-image-holds.md",
        "passage": "We have been following this one release outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose. [The download log](what-a-download-shows.md) showed the new version at half of all the library's downloads within two days, and stopped at the download. This time we read the installations themselves, one at a time, in the packaged environments some projects publish. They show that what a project pins and what its software installs can differ, and that what decides the installed version is how the software is built.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/what-an-image-holds.md",
          "passage": "We have been following this one release outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose. [The download log](what-a-download-shows.md) showed the new version at half of all the library's downloads within two days, and stopped at the download. This time we read the installations themselves, one at a time, in the packaged environments some projects publish. They show that what a project pins and what its software installs can differ, and that what decides the installed version is how the software is built.",
          "line_start": 10,
          "line_end": 10,
          "sha256": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-an-image-holds.md#L10"
        }
      },
      {
        "id": "history-3",
        "subject": "images",
        "object": "advisory",
        "predicate": "tests and branches",
        "path": "articles/what-moves-a-pin.md",
        "passage": "We have been following releases of this library outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose, [the download log](what-a-download-shows.md) showed a new version at half of all downloads within two days, and [the published images](what-an-image-holds.md) of six projects showed what their installers actually put in place. This time we took a later release, 1.28.0 of 16 June, and read the published images of a sample of the software built on it, fixed by a rule before we read any image. The images show two paces. Those whose installer settles an open range of versions took the new release within days, keeping pace with the download log. Those built from a lockfile or an exact pin took it only when the pin moved. For most of them that was a month or more later, if it had happened at all by mid-August, and the largest group moved in the day after the advisory, most of them in changes a bot had written, rather than after the release.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/what-moves-a-pin.md",
          "passage": "We have been following releases of this library outward. [The projects' histories](where-a-software-update-went.md) showed what each project chose, [the download log](what-a-download-shows.md) showed a new version at half of all downloads within two days, and [the published images](what-an-image-holds.md) of six projects showed what their installers actually put in place. This time we took a later release, 1.28.0 of 16 June, and read the published images of a sample of the software built on it, fixed by a rule before we read any image. The images show two paces. Those whose installer settles an open range of versions took the new release within days, keeping pace with the download log. Those built from a lockfile or an exact pin took it only when the pin moved. For most of them that was a month or more later, if it had happened at all by mid-August, and the largest group moved in the day after the advisory, most of them in changes a bot had written, rather than after the release.",
          "line_start": 10,
          "line_end": 10,
          "sha256": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/what-moves-a-pin.md#L10"
        }
      },
      {
        "id": "history-4",
        "subject": "advisory",
        "object": "four",
        "predicate": "revises",
        "path": "articles/pins-move-over-weeks.md",
        "passage": "Last time, in one library, we wrote that if the pattern held more widely, a release would reach pinned software mostly when there was a security reason to take it. Across these four libraries it did not hold in that form. The advisory brought about a week of quicker moves, no bigger than the release's two days, and most moves came at neither moment. We think the burst we saw after that library's advisories belonged to that library, or to that evening, and was not the rule. What survives is smaller: a fix, with its advisory, moved about twice as many pins in its first month as a release no advisory named, and about half of those moves were a bot's work.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/pins-move-over-weeks.md",
          "passage": "Last time, in one library, we wrote that if the pattern held more widely, a release would reach pinned software mostly when there was a security reason to take it. Across these four libraries it did not hold in that form. The advisory brought about a week of quicker moves, no bigger than the release's two days, and most moves came at neither moment. We think the burst we saw after that library's advisories belonged to that library, or to that evening, and was not the rule. What survives is smaller: a fix, with its advisory, moved about twice as many pins in its first month as a release no advisory named, and about half of those moves were a bot's work.",
          "line_start": 56,
          "line_end": 56,
          "sha256": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/pins-move-over-weeks.md#L56"
        }
      },
      {
        "id": "history-5",
        "subject": "four",
        "object": "notes",
        "predicate": "narrows",
        "path": "articles/fixes-that-said-so.md",
        "passage": "In [our last piece](pins-move-over-weeks.md) we followed software that pins pyjwt as it moved to that fix, and counted ten of its 25 moves as coming before the advisory. They did not come before anyone had been told. The project had said so itself, in its own notes, on the day it released the fix. So this time we read the notes of every fix behind the advisories we had studied, sorted the fixes into those that said they mended a security flaw and those that did not, and asked whether pinned software moved sooner to the first kind. It did, in a particular way: at the same pace in the first two days after the release, much of it bots' work, and at about twice the pace in the rest of the first week, when most of the moves were people's. But no larger share of the moves came before the advisory, and with one fix for each library we cannot tell a fix's notes apart from the library it belongs to.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/fixes-that-said-so.md",
          "passage": "In [our last piece](pins-move-over-weeks.md) we followed software that pins pyjwt as it moved to that fix, and counted ten of its 25 moves as coming before the advisory. They did not come before anyone had been told. The project had said so itself, in its own notes, on the day it released the fix. So this time we read the notes of every fix behind the advisories we had studied, sorted the fixes into those that said they mended a security flaw and those that did not, and asked whether pinned software moved sooner to the first kind. It did, in a particular way: at the same pace in the first two days after the release, much of it bots' work, and at about twice the pace in the rest of the first week, when most of the moves were people's. But no larger share of the moves came before the advisory, and with one fix for each library we cannot tell a fix's notes apart from the library it belongs to.",
          "line_start": 10,
          "line_end": 10,
          "sha256": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/fixes-that-said-so.md#L10"
        }
      },
      {
        "id": "history-6",
        "subject": "notes",
        "object": "open",
        "predicate": "widens and revises",
        "path": "articles/the-lead-was-a-few-libraries.md",
        "passage": "Our earlier reading said that pinned software moved faster before the advisory to fixes whose notes said so, mostly in people's changes in the week after the release, and that with one fix for each library the notes could not be told apart from the library. Counting thirty libraries, each once, does not resolve that doubt. We could not tell the typical library whose fix said so from the typical library whose fix did not, and the week that carried the earlier difference shows no difference here. The pooled count still leans the announced way, by about one and a half times by our rule and by more when earlier notices are counted, and no single library's removal changes that; but by our own rule resampling the libraries puts even the pooled lead within reach of no difference, and the readings that do not reach it were chosen after the fact. So we do not say the notes make no difference, and we do not say they make one. This sample cannot settle it.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/the-lead-was-a-few-libraries.md",
          "passage": "Our earlier reading said that pinned software moved faster before the advisory to fixes whose notes said so, mostly in people's changes in the week after the release, and that with one fix for each library the notes could not be told apart from the library. Counting thirty libraries, each once, does not resolve that doubt. We could not tell the typical library whose fix said so from the typical library whose fix did not, and the week that carried the earlier difference shows no difference here. The pooled count still leans the announced way, by about one and a half times by our rule and by more when earlier notices are counted, and no single library's removal changes that; but by our own rule resampling the libraries puts even the pooled lead within reach of no difference, and the readings that do not reach it were chosen after the fact. So we do not say the notes make no difference, and we do not say they make one. This sample cannot settle it.",
          "line_start": 74,
          "line_end": 74,
          "sha256": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/the-lead-was-a-few-libraries.md#L74"
        }
      },
      {
        "id": "history-7",
        "subject": "downloads",
        "object": "pace",
        "predicate": "tests more widely",
        "path": "articles/two-days-for-most.md",
        "passage": "Anything that spreads through software, a fix, a flaw or something stranger, travels the same roads as an ordinary update, and nobody can call a spread unusual without knowing how ordinary ones go. We had measured that once, for one release of one library, which reached half of its downloads within two days. So we measured it for every release of the most downloaded Python libraries over five months. For most of them, a new version was half of all downloads by the next day; for eleven, no release was. But what ran through almost all of them was what requests and pandas showed: a new version took most of its share almost at once, and then, for a month, older versions went on being downloaded beside it.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "articles/two-days-for-most.md",
          "passage": "Anything that spreads through software, a fix, a flaw or something stranger, travels the same roads as an ordinary update, and nobody can call a spread unusual without knowing how ordinary ones go. We had measured that once, for one release of one library, which reached half of its downloads within two days. So we measured it for every release of the most downloaded Python libraries over five months. For most of them, a new version was half of all downloads by the next day; for eleven, no release was. But what ran through almost all of them was what requests and pandas showed: a new version took most of its share almost at once, and then, for a month, older versions went on being downloaded beside it.",
          "line_start": 13,
          "line_end": 13,
          "sha256": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/articles/two-days-for-most.md#L13"
        }
      },
      {
        "id": "history-8",
        "subject": "open",
        "object": "pace",
        "predicate": "returns to a question",
        "path": "investigations/software-updates.md",
        "passage": "- From projects to downloads: the histories stopped at what projects asked for, so we looked for a record on the far side of the release.\n- From downloads to images: the log could not say what was installed, so we read the installations some projects publish.\n- From installation to what moves a pin: images showed that pinned software waits, so the question became what ends the wait.\n- From advisories to the fix's own notes: fixes came out before their advisories, so a move \"before the advisory\" was not a move before anyone knew.\n- From fourteen libraries to thirty: two libraries carried the lead, so each library had to count once.\n- From the notes back to downloads: five months of advisories held too few libraries, so the next reading returned to how fast releases reach downloads.\n- From the pace to what stays behind: in almost every library a new version took most of its share on the first day and older versions kept the rest, so the question became what keeps older versions downloaded.\n- From the top fifty to the rest of the rankings: the pace had been measured only for the libraries almost everything depends on, so while the next reading waited for its weeks, it was measured on libraries drawn from further down.\n- From the downloads back to the pins: while the weekly reading waited, and because a lockfile holds only the builds that read it, we asked whether the pins we had timed decide what a project's own container recipe would install.\n- From recipes to tests: a container recipe read its lockfile only half the time, and test runs are the installs a build server repeats, so we asked whether the same projects' workflows read the pin.\n- From what stays behind to whether it holds: old Pythons and other libraries' limits could account for the older downloads of few libraries, and downloads reporting one Python made nearly two thirds of boto3's in the week read, so the question became whether what stays behind is steady from week to week.",
        "reading_direction": "Earlier reading to later reading; the verb describes how the later reading treats the earlier.",
        "status": "checked against retained records",
        "evidence": {
          "path": "investigations/software-updates.md",
          "passage": "- From projects to downloads: the histories stopped at what projects asked for, so we looked for a record on the far side of the release.\n- From downloads to images: the log could not say what was installed, so we read the installations some projects publish.\n- From installation to what moves a pin: images showed that pinned software waits, so the question became what ends the wait.\n- From advisories to the fix's own notes: fixes came out before their advisories, so a move \"before the advisory\" was not a move before anyone knew.\n- From fourteen libraries to thirty: two libraries carried the lead, so each library had to count once.\n- From the notes back to downloads: five months of advisories held too few libraries, so the next reading returned to how fast releases reach downloads.\n- From the pace to what stays behind: in almost every library a new version took most of its share on the first day and older versions kept the rest, so the question became what keeps older versions downloaded.\n- From the top fifty to the rest of the rankings: the pace had been measured only for the libraries almost everything depends on, so while the next reading waited for its weeks, it was measured on libraries drawn from further down.\n- From the downloads back to the pins: while the weekly reading waited, and because a lockfile holds only the builds that read it, we asked whether the pins we had timed decide what a project's own container recipe would install.\n- From recipes to tests: a container recipe read its lockfile only half the time, and test runs are the installs a build server repeats, so we asked whether the same projects' workflows read the pin.\n- From what stays behind to whether it holds: old Pythons and other libraries' limits could account for the older downloads of few libraries, and downloads reporting one Python made nearly two thirds of boto3's in the week read, so the question became whether what stays behind is steady from week to week.",
          "line_start": 58,
          "line_end": 68,
          "sha256": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
          "input_commit": "8af0cb026037a8ee63456900978b3c44473c49cd",
          "url": "https://github.com/JKershaw/lighthouse/blob/8af0cb026037a8ee63456900978b3c44473c49cd/investigations/software-updates.md#L58"
        }
      }
    ],
    "continuations": [
      {
        "title": "What older downloads can tell us",
        "path": "articles/old-versions-new-pythons.md"
      },
      {
        "title": "Test beyond the most downloaded libraries",
        "path": "articles/rarer-further-down.md"
      },
      {
        "title": "Follow recipes into test workflows",
        "path": "articles/tests-read-the-lockfile.md"
      }
    ],
    "stale": false
  },
  "inputs": {
    "articles/a-week-after-two-fixes.md": "64eb71d4b382b6282d17644a4f0d15605fa648ddeb114be12e40d11976f35b48",
    "articles/fixes-that-said-so.md": "bd9ee0a267b04deb30a2c69a22e0f7d698a663f17aecaf7fdc59789b55cd59f4",
    "articles/old-versions-new-pythons.md": "053337fe8db28a142fa1118052589282e817b8c8d024f8af7669ce56af5f2f02",
    "articles/php-emergency-first-reading.md": "52a7e984ba2b2244373a5510238e2874247a87b633e8a8ac283c74d57332aba1",
    "articles/pins-move-over-weeks.md": "9f0b600c23056bda7816e15d6ce352aec598f3e39e0429affc364fa89725453b",
    "articles/rarer-further-down.md": "48905c30528f886ff4415a2ebb1e1d01037c3594dc262cd05673e1973fc8132b",
    "articles/recipes-follow-the-pin.md": "d8504f728d1d74f1d3c80e3117e84380f0e113febf86840b6b67bdd70d756c58",
    "articles/tests-read-the-lockfile.md": "1ff0943cf5b964f3b631e69ff7aff4250c7b75d0b40999b460578f6ca25b3b0a",
    "articles/the-lead-was-a-few-libraries.md": "e3e09b5e7d49ec1a6b1f532cc3e0dc967b77cb539d0582c36afc2397d14037a7",
    "articles/the-xz-backdoor.md": "a1bfe48d3ae7f74fe22563cd28b8b3edb4122baf804855503e18d450beaf54e6",
    "articles/two-days-for-most.md": "1807019e8519b9e8ed481219cf9911a1bc3900c62deb94def43a0d88fe75b8b9",
    "articles/what-a-download-shows.md": "a9c283bec4888f29d05dfbcb765d7efba0ea534a9d9e919ea0175a1cdbf0bb66",
    "articles/what-an-image-holds.md": "e91a70c6c8901bac91439c562b6347e8e8fa7d308f1b8d717e8bac675e9a7589",
    "articles/what-moves-a-pin.md": "635133c9c8e858526300962f568b3f5e32b89e7fa4fcea4a8af53a15db2d2069",
    "articles/what-we-can-see.md": "a51fb37512b6bbe7f395e70056a429775a69b3f3bdb4b7924660a98cc791b045",
    "articles/where-a-software-update-went.md": "988b4d5feff9f54b56b6917b4e3e9eeeaeddc9e23496f37035377d4e5ede530d",
    "articles/where-software-updates-go.md": "b5dc87c7b92693bac2b66b88c790c1fa742b86215ef9c99676c799978f5cfc89",
    "articles/who-watches-the-internet.md": "505b444ca0aacb1e6f57bf8a21747ce346a706e8e813a8b40ef888fba525806a",
    "essays/it-was-only-a-test.md": "72084c067c6bf8c9be9f6ff327be0e1b2d8e3871bf6983d40cd68aed8c8e91fe",
    "essays/seen-from-outside-seen-from-inside.md": "f261ee15486e1b42b64096e3413a524d11818d053f0a1aa5edcd5826ca47a00f",
    "essays/what-the-watch-would-see.md": "797498174a300471e838c88e305625c6cb4677c21c32636b65d51501c7062d18",
    "investigations/ai-cost-and-spread.md": "5a29af9da6fcc2d5746624a7fb16e3564bdd3b3fe4efb565f03db3f26c4cba08",
    "investigations/model-found-bugs.md": "15a94803d43e1f224294b4dd7dab0f04bd50c4f4ea18bea9acefd077dba0053e",
    "investigations/software-updates.md": "8dcc7f1c2dda73ab8ce48b238ff7de3595e26ea809f0a1bab1bd0f261c6914bc",
    "notes/R-0001.md": "346921767a7d52c72405c85b9b8ec3b98e2a9ed6c0709f170e932c171b98c321",
    "notes/R-0002.md": "303c34b69ac914d51211246c76b5fc311fbd409391364dea31c05f3d5d82cd94",
    "notes/R-0003.md": "2e3b717669e7b610d7b4a89d7dacd4f834a18d1bda4c7a5feaaed6d1b58663f6",
    "notes/R-0004.md": "0952f3a02a884afcdfd23424386be9dda53c383216d2e3d9eaeaab529e42b260",
    "notes/R-0005.md": "790cb680a7f0c902efdcdbb0451e1192509b5381d03f743994c2280c44736684",
    "notes/R-0006.md": "6d0bef7d0e8df4a3289601206becab463f169cf4198e2288c62900e7c6164505",
    "notes/R-0007.md": "0bd85d1f8dcd2b55509ecae01c5ef05aec61e5f1eb6f26ea81feedc55bbebb10",
    "notes/R-0008.md": "91476e8510e19f3e1f06f916b5d5144a0fd1d56215dba06d5ab51319e8cfea82",
    "notes/R-0009.md": "a2e4352c0c9c9a50476f33be9ba1f7f59038f7aa41ac888e2b92c781406a4fea",
    "notes/R-0010.md": "5a119448a2303d1fcb9034bcef902f259520026e5890b149b2ab11909a90dd44",
    "notes/R-0011.md": "b13915494efee8f65996a6dad9e3afbb96ae193308358aeff2c8bcc77d1a58c0",
    "notes/R-0012.md": "4c4beab8d62c9d01e8bed4c006624bdc0fdc6a985f7641ec30ee66ddf7dcc81d",
    "notes/R-0013.md": "8a3bad0bfe2700729517ea3570b622715bb1cda072186b1c40adca6608490ee1",
    "notes/R-0014.md": "bd0cfca8020d379ba68760a0f248b84606763364ad808ead943d1b2929a682cb",
    "notes/R-0015.md": "221668bead726fc4647095eb6045743c81ea0a7cb43d9b9560d9ee22f04ba8db",
    "notes/R-0016.md": "7cd0ab943dac881ef7a0b318053e8f947dd4a774213fb043ac16464df80c3c6d",
    "notes/R-0017.md": "3ab48843f57bb147a4bda30caa1331cbf584d66b2a88f5bcfe8fd43ba92b5adb",
    "notes/R-0018.md": "e93ad6e882b67f253a744bb3bd497351d8178a3d6d44b2708759ef2de0fd15e4",
    "notes/R-0019.md": "d5041531cb11f083e797c2b657b3b7f17d97a9fa437e78423d102b1bc593e0f0",
    "notes/R-0020.md": "e350a15943b34a2dae1a773707c0771ca0b8afe922ea2f960e8a7b3f0bf339b4",
    "notes/R-0021.md": "17b3054711c5f2f0ff1122336d873db2b9bf6d2e2fbecce285308f0f5b1027c3",
    "notes/R-0022.md": "f4beec62f274bbe10f26988f9dee56e9197d2c570566d02ee716163bf567a798",
    "notes/R-0023.md": "132f9fc177b3fdef1a8382f50189c2a9cf94f70e16db36f1c34f387e96b2878f",
    "notes/R-0024.md": "254d13e08a4df41bc477ad815bbb1cc101eeea5c6efcb650b1b4808b7a0dc2f2",
    "notes/R-0025.md": "9c912e144dcecfce926724aae9f7e322bd773c69b3e9ac0c0490a1675aac99bd",
    "notes/R-0026.md": "e865517ee0dea8805845e2f10160c304c596ac926269656fae07e650d9327fdc",
    "notes/R-0027.md": "a8caf992bf0f53a9b530483323772b08e5356fbd31fb4f662a1043c2f38ec18b",
    "notes/R-0028.md": "6a48b7245c28c5be7927f997eec1fd23752f432229782570cd557c7eb1eda41a",
    "notes/R-0029-php-emergency-evidence.md": "9f22bfff8a5dfedac13551350c53ff7c3b2b0ae3093144a6442359d60046257f",
    "notes/R-0030-php-emergency-reader.md": "7926ce7804850f6587adff8b2d2d31c24032762e65eefb57a9b5ed4c0f95fdc6",
    "notes/R-0031-php-emergency-blind-reader.md": "20a6d54301694f8fb81cda2aad223a9b7fc2a65127d7b406a06e388e66d2d5fe",
    "notes/R-0032-php-later-evidence.md": "6989f6d7b84277affab6173ea41901970358e5a9bec442053f1c6b4f3f701f1f",
    "notes/R-0033-php-later-evidence-reader.md": "b08bb91617b2f4ab063910e4ea5162fc3eb893f6adee02bb433e6849f64180f0",
    "notes/R-0034-php-later-evidence-recheck.md": "9403531cbe90de8457e495eeaee1159e3d551b8e1519e19913d5352c32fbba9c",
    "notes/R-0035-php-cisa-evidence.md": "6d58bd7e5f876157db5f68b9e3d74b95f7ef4a5d1a183fbc25e6727e6ec60e07",
    "notes/R-0036-php-cisa-reader.md": "ff71841e689fb9396638c30b7b5ade5c7f25cac431a52a50bc444cbd21f8a398",
    "notes/R-0037-php-cisa-recheck.md": "978033c5735b27dc9968e3d71351f3642575a036eb6e643498b88f580a1d055b",
    "notes/R-0038-essay-tone-review.md": "a083f3f5ea999a1ab66e1ec0f508ddc774771020382f93521d6252b9f1f7adea",
    "notes/R-0039-week-one-evidence.md": "0814b52eea6e2444ae0b9331488e3a51ee15f9851dda35cdf3f4a675b118db46",
    "notes/R-0040-week-one-reader.md": "dc7a6384335f30e16fb53f8fbe0ded3a1e75ae73e930ec0765884f6089e7cc7c",
    "notes/R-0041-week-one-recheck.md": "b7b28fa17f8a2269bca6ed88653ae3bde1881ea8046a0c20900b4c46abf5507c",
    "notes/R-0042-essay-checks.md": "d96a0cf84447dd1d07139515ba5be8adc1ccab6d0ad95fb635b5f9e5566240a9",
    "notes/R-0043-php-compromise-evidence.md": "e7148d7b110b24e3316cc44fa5cfd19e55f3e4296ce785055cfee58c61d50d24",
    "notes/R-0044-php-compromise-reader.md": "008375f9e3e5661f18ed29865d28671d11ef6252a78fc20c8bdf8f32f0ce5353",
    "notes/R-0045-php-compromise-recheck.md": "682817bd21777189134eac5482551bb7b03b2b2aeebe68737fadf79cb0158b11",
    "notes/R-0046-lh013-evidence.md": "f1fc102c91bc0fc8a91663e1fc60a330443734b178e6211c9ae661c23a48844f",
    "notes/R-0047-lh013-reader.md": "f73c8aeed8106571d39a22661e50f01365d640606e05ffef1e86be12cd3e2451",
    "notes/R-0048-lh013-recheck.md": "ab3ed000fc8896ebafdc7b6910414d9da54edc9eb7d275998942f5596cf287ba",
    "notes/R-0049-lh035-map-evidence.md": "ab4f339e6bb91a3eb6928a7df7d8a132986f28aa6253f1b2d622250efad54108",
    "notes/R-0050-lh035-map-reader.md": "e81706bbd058b5014bfcc8e88b7ca248598ddf0e7fdc7bd6f964f7c3cc811bd7",
    "notes/R-0051-lh035-map-recheck.md": "643e6f484d1a73fe5106571adcc46222aa8e09375217c3ae934686a2f1bc619e",
    "notes/R-0052-it-was-only-a-test.md": "4c9a632644884ec7cc0c556a311131bee1867653a3bcd86bca87176d56e397de",
    "notes/R-0053-it-was-only-a-test-correction.md": "b591338b9dd0c16780bbde17b138a2bbbfb35dcfa3c9512efa9914be293a95b8",
    "notes/R-0054-what-the-watch-would-see-claims.md": "65e37cd70a78c556ea359229e19bcbaeab63bd8aed9209697ff27114db622d3b",
    "notes/R-0055-what-the-watch-would-see-reader.md": "b7ba9077d8912a37bd774c461e48e58f165b28d06a5a148b43f168a1745fefa5",
    "notes/R-0056-lh046-evidence.md": "e7db8828c42c8294abedd1ab6be27a72270562dc5fe168742ca969cf76ca4be2",
    "notes/R-0057-lh041-evidence.md": "d4cfc69977318103dc7ef7725eb7c0fdcb69aef5c80801fbb76c62329e3075f5",
    "notes/R-0058-lh042-evidence.md": "2fe8857b4690e94c4d394beba0e49d07fde020637ed1c7c7c57c3bacf0c7a210",
    "notes/R-0059-lh044-evidence.md": "f40dcd0c77b95187e96305015e6337e2248d43c04031ac900cfce71af057bb7a",
    "notes/R-0060-what-the-watch-would-see-recheck.md": "f0424ea2f8f60c03f9208b326a426112415105a5dcdca8d84a7accf7adfbce04",
    "notes/R-0061-lh041-reader.md": "57fc5f14f99ecb205accabff86854092fdbd468a0e781f6e5d213cc1bc55254c",
    "notes/R-0062-lh046-reader.md": "722426963f8e2ee134685872c5a8f5e96f25cf28b453259f6aa4d37787316a7d",
    "notes/R-0063-lh047-evidence.md": "d41c3384f3a8b2704d92cf1cff6f61631008cb855636c1bd62380099213a62c7",
    "notes/R-0064-lh046-recheck.md": "fd9585300cef67a0727e4338b5812b33d34c1f5da0c7bfc100f384f162bbf631",
    "notes/R-0065-lh047-reader.md": "c1d75566d759e01b022d139a20f09a20554758b7a66b024d421a60202a8394ef",
    "notes/R-0066-lh041-recheck.md": "5e116653de6a32a3cfb52112a508362c1d7f600216fcfc3689501f4249fd141a",
    "notes/R-0067-lh047-recheck.md": "2f71ebcf3d555a081dd16573540413225229a58f404317a83ec5a26c98fe5825",
    "site/sections.md": "a14251111168e51fb50726bc3fc1cdf7b5702d2775f3601259f3fb51d9fc6cda",
    "studies/LH000/LH000.md": "7994492e967db276ed0b4ba194d68d60c2be393c0ef2d857466d03d9d6de9830",
    "studies/LH000/brief.md": "d36a5e457997413422a4ed4e5b12c1de96a204cae1ac491895918073d46e7828",
    "studies/LH002/LH002.md": "1bb41e21e58e6894e363d0a6a93200f7cff3d5ec8415bfff3495d4265fb41d8a",
    "studies/LH002/brief.md": "81a8d7a4ff53561b479733658339a7f3a7a280d4abc78624b92e5c32abeae0fd",
    "studies/LH003/LH003.md": "48a31821cb626154bddf496d2ca68a991feb969c87eeee40ab8dca7bd1851b7c",
    "studies/LH003/brief.md": "ae8cb5500275b24d119d95eb6a59e0abe6f57a96413c09677c0a5991776da3c1",
    "studies/LH004/LH004.md": "8b26b37f9b92c800dd8fc5bd6cbd90147d89e96404356855e628fa2f62276254",
    "studies/LH004/brief.md": "e99b9a2b7d159a1179db9227495c8970c4975e3583ce4a43f92115f15f9968d3",
    "studies/LH005/LH005.md": "0a4e94e12de04954c12722b56b1bb598356d0de132a8d2e0c269b575ce073371",
    "studies/LH005/brief.md": "5656b479389d1968793b656b676a63a1879815a91bd02d07c94b95a8b8117c17",
    "studies/LH006/LH006.md": "de076227d6884806b54da2bbb738cfa365d5fe4cad1b1a9a1e1342f85e140f2b",
    "studies/LH006/brief.md": "acae49961341f8ee5b60bae5b621d3c953d090503a155b18fda3eeb28d55658e",
    "studies/LH007/LH007.md": "8513ffa6188fab27b8ce065cdbe5d1d875ecc98684d6806096a88640fad25af1",
    "studies/LH007/brief.md": "67139757a407f9a892584dcfedd4821b748961387f8ab220385506d7b4efd86b",
    "studies/LH008/LH008.md": "3820fbc12859a6e7465cac064ce3e3db13a66242408b6e39310f70f3f6e05a0f",
    "studies/LH008/brief.md": "18f4c06ed2515be109a1f6c762c0b78b18249b2662deefc33d7ca7bf96d7813e",
    "studies/LH009/LH009.md": "2350246f9b3d9f5845540bae14a93f110af1e7f2a79c23fc1dc3083494406534",
    "studies/LH009/brief.md": "a9c37f5e700a7975396e50407b2adc2971c1d9483db23656e28036446b6f32be",
    "studies/LH010/LH010.md": "682332ea8bbdc3d74aa8fb030c4541219e552e37daf46ac80f528d6ff5563cc4",
    "studies/LH010/brief.md": "022af3d0096da5370e4f33bf77869b106abe14adbedf954b75d40d60d1a4c1cc",
    "studies/LH011/LH011.md": "ddd50890c3b8aed0846098cd2256f7df028d83a08d16707c4d354cdb117e0162",
    "studies/LH011/brief.md": "a05be47ceaf41fc290262a4cdf30ca09efc6a12c434548c2ab3ca52bf40a67ce",
    "studies/LH012/LH012.md": "bea4f31914de0ac1115ce8a836add4ea5f07f33a69ead5826d2bf454d5d5c4ef",
    "studies/LH012/brief.md": "c9174a0888e37f65b31ddebfe8be85260f8fa8202afd1e92db09e0a821507af5",
    "studies/LH013/LH013.md": "a994722992cb0e6033631ead6ccb4e58a23d6f223b18079ad43974e9b9ff2345",
    "studies/LH013/brief.md": "b5eba0c03700fbbb1db57f41f4407ccef6bd4e5bdf28512aa5cde892fa8df993",
    "studies/LH014/LH014.md": "23dc4d74a4852b7aa1e8266fe1d4d9f318dd3d3306139b40e55b9f4d2d8c9965",
    "studies/LH014/brief.md": "3ec3dcefba6f4c5d4ec1369593834dc47cb546eb5895f57aae7de976793bcca7",
    "studies/LH015/LH015.md": "8869ed32eaa031064e617505ea19e85536ef6dae092ba0f369560c191f2841eb",
    "studies/LH015/brief.md": "796daa2242125542c542a9bfdacb0531eec978e7d3d90dd5096134a766eb8476",
    "studies/LH016/LH016.md": "46b5004116001e8b85c6da11012c390024486d0af17eef952196bce23dffb11d",
    "studies/LH016/brief.md": "5cb927914fc43652ee116d3d798cf98f0809a6cccdbc9a63a8d53f2f8011e02e",
    "studies/LH017/LH017.md": "e88141eaf2e5d8ee45bd0d81c011a850e9389a1f09d6b58faca58d75297c6fad",
    "studies/LH017/brief.md": "356cd81ae02de72fdf6e36498cf549a4bcda540a54028b28b1f40daae87a1063",
    "studies/LH018/LH018.md": "94acd203442c4059e954d34874aab5f6aa0b770bfc6f5346b72cfa5f2eaa2d18",
    "studies/LH018/brief.md": "9c006310b2b4865a6bcf3c8d91146509655cbfe26ffd268a31b1ca2f5e1aafda",
    "studies/LH019/LH019.md": "235abfd06e9a1477e320d9ecd8043b15164602b87718e66296fc451ac7223064",
    "studies/LH019/brief.md": "f0962907d07aaee5337021b69f2e6977141b0c16c654c909ef6a0f92f24b91bb",
    "studies/LH020/LH020.md": "32e241699318bb4c9174e1b1b0410645455c6fc3cbf2b9520dbf4cb7bf1eac2a",
    "studies/LH020/brief.md": "ef8d66fd338c6092bcfccc48ce3f727ee3812059bd0a056a458eaf4c2984e97f",
    "studies/LH021/LH021.md": "01d6708fdbf9339f0a9676f7f8460350f559f790ffb47f8c7390d9fbbc4b16b6",
    "studies/LH021/brief.md": "55b2a09d2ebdfc4e7819fdf8081c0e3c8ad433b45b6844e94040b07b6e892f51",
    "studies/LH022/LH022.md": "4c8eaace021c2f93d1c36d2d72ac91dc1a260b3d1658bd60bf6d2e514e639f48",
    "studies/LH022/brief.md": "1340df742f51e14c567c7fcb1203ebbc137301da63151fd31a785fbe02c49239",
    "studies/LH023/LH023.md": "934c429ac0b5d78339ee4fbf6f57758e584dfca4c2e96a81103e68e1ab8d4c12",
    "studies/LH023/brief.md": "13c158fe1ce578a6cbc737fa36833e28c8e55dbfbbeedb1ba4d30cab185b89c7",
    "studies/LH024/LH024.md": "23f8c0c06430bf0d9738ca207af702db2bf4d0efaecc4d349d14146278451e5a",
    "studies/LH024/brief.md": "ff95b12316938324bb657d2ef89b9a53d5cf6c0d068393c7f1e396a1699aff22",
    "studies/LH025/LH025.md": "0a5df3084259127be0a4fd68d1fb9b07d8f720b3b335d781591d25520cb72c37",
    "studies/LH025/brief.md": "ec5207acf8aeaeac46c8f8e17e7d084d46b2733cfc81302daedbef52303f6e89",
    "studies/LH026/LH026.md": "da1e148b390e179b6ec30f000d105e668eaa92cccd9d5dbbc8dc8b9eacce65de",
    "studies/LH026/brief.md": "90e0f5da6b2996ba54ada5016d71305effbee6286b43cb70b6a796cf8af04b87",
    "studies/LH027/LH027.md": "1f8b3ddf3614659acf9f4466cc0a18892a20ba8ce5b4ec3e4fbf12e7d86b96b0",
    "studies/LH027/brief.md": "c99329189156552321d50aed6d35c661e323c2f9a9fffa248278e06bf06c98a4",
    "studies/LH028/LH028.md": "f160d642dd9fb77f6bd8b1a70499efe438b52e2ae3a3c59043a9aae0a0d739d2",
    "studies/LH028/brief.md": "62cdd5b236538b33613b4a2cd8f6b17637318184c203e11b45e5c755ec545f7a",
    "studies/LH029/LH029.md": "764682654387330cde1c252b15b407c7d4aaf689946434a668296028d311371f",
    "studies/LH029/brief.md": "7de453ce5b32c24779e6ddbb0289d5d2bd42d021e63db236d9b8b7bf9fe1a6af",
    "studies/LH030/LH030.md": "6301404d1ab357be818aff6f783973554d0f18a73ce83a0311da5c6d7b8b2d36",
    "studies/LH030/brief.md": "0ccd75a88b534810c194af1140104ba0f77c7a801670d21cfb131515acfe6d2b",
    "studies/LH031/LH031.md": "9e57f76cc6943007ff36d2219f81d404b3c0a9bc233f9dc2d2567cf76e19bcae",
    "studies/LH031/brief.md": "5c02b110676644d6b96b098b930c14663e284a99460594d2851a9237f38f7119",
    "studies/LH032/LH032.md": "65dbf7260ddc92340642ae1fc244e13b28219cc0889a4c20370b76551bfa5eb8",
    "studies/LH032/brief.md": "a7000a0f98b2d643fafd1684733e309e41e4e37e14fefb5e94bdf120205b3548",
    "studies/LH033/LH033.md": "e6ca3eec3734fc403be8359f4a77e6503782792f15b59ae5da1e57e9f7dc7b9d",
    "studies/LH033/brief.md": "fa286c37836ebecf739a0482428cfc070994072e237db929e2c9eadf46b1c9a1",
    "studies/LH034/LH034.md": "461a11d38c07bbc0e141b0adf748fe0238086ef5abd77ebb2fcaef2f0781e549",
    "studies/LH034/brief.md": "bc88551f92919ccd581ea6a7d813239d0a5b4b963da538f0d3354ed67a4f5638",
    "studies/LH035/LH035.md": "f38b50359f3910b2fa04072fba20f13b7659b139d663901e1c7ee1dacd9e02a6",
    "studies/LH035/brief.md": "b78fa94e2fdd9a6dc34bd060db2ed4f5c7fac0b69e5494fb8a4618720aa1d414",
    "studies/LH036/brief.md": "335937d117b5aa417017d4c7024dddfb0860c41235f737692467a5e1b5405b6b",
    "studies/LH037/brief.md": "d8ccc24c9c3b44e4efeddfc0dd3bd7d7f54bcc2aec2cba95c8dc77e76f6f9da3",
    "studies/LH038/brief.md": "e215ce551ea8a9bbc8c2b02597dda8413036bb829f1deba17fa1bf07f0c293e7",
    "studies/LH039/brief.md": "76b6d782b093abf04ec64647ccf2c835dafba835b3ceecfd37605811a91541d7",
    "studies/LH040/LH040.md": "59558364960178047a1ddd7512e096e3d22f0563dfa7c7f192efe8249ee2e45e",
    "studies/LH040/brief.md": "455406b213d55d61b8968b88417a2d290b0c661fbc02df9946b1089069d112e8",
    "studies/LH041/LH041.md": "781b6fc3a367919a6991a78d4a17a329c095d0e5617e4851e7d105cf95e5ad20",
    "studies/LH041/brief.md": "8358b5dbe91fa9a6f7bfa5a3e3cafcd27534a0f183ad8e176f647d55319fb30f",
    "studies/LH042/LH042.md": "98f512e928f718279fe6fd581d6b9573d929686065a116071ef3cd3b545b4672",
    "studies/LH042/brief.md": "9b1beb3db3fdd712c16cac426f8b1551f6cfb0609d14bb50a73168e11189fd2c",
    "studies/LH043/LH043.md": "928ae7c7b5fe8afe7f83e446cf6b39d6a1e845629d90e8929b5b0ad8383817f5",
    "studies/LH044/brief.md": "62f69d20a5cacd27d355bbce46c3193eb1227278f0154ea60e0517e9ce19e688",
    "studies/LH045/brief.md": "9a27287a26867957498ddc75644ba2b9c81eb1a056ee08dc574aba8bb3da1ff1",
    "studies/LH046/LH046.md": "2ee392ef78ed74362d664c7f5f643b5370d7afcb190f2f0f69a00964ddd713bd",
    "studies/LH046/brief.md": "eb348acb68f48741359d8532e8d6a381a5a0abf27375f568e0179e0ca4ecaf4a",
    "studies/LH047/LH047.md": "81a2afe70dac251bc40e54a1b259e52e3451c6f1d2393da47c13cb49291af1fe",
    "studies/LH047/brief.md": "44a4e728ac290d8e14b960dfa1ef3ee4f5695d95a80962abf00adfb4794361d3",
    "studies/LH048/brief.md": "978d123ca397052220542031301f9ff9a8b7281f5a3d81db2f664968f305a42f",
    "studies/LH049/brief.md": "ad4491a83795f973dd43f9d132b7131063b296bc106649f83c4dc0e7a359f13e"
  }
}
