Skip to content

Relock OpenHands onto oauthlib 4.0.0 and delete the expired oauthlib ignores - #1060

Merged
seathatflowsinourveins merged 3 commits into
mainfrom
foundation/osv-oauthlib-relock-20261013
Oct 13, 2026
Merged

seathatflowsinourveins merged 3 commits into
mainfrom
foundation/osv-oauthlib-relock-20261013

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 13, 2026 •

Copy link
Copy Markdown
Collaborator

Scope

  • What this PR changes, in one or two sentences: Relocks the live OpenHands recipe lock from oauthlib 3.3.1 to 4.0.0 (the first patched release of GHSA-hj66-6f7g-4r5v and GHSA-xpv3-w29h-x7cv) through the recipe's own paired uv relock, and deletes the two oauthlib ignores whose ignoreUntil = 2026-10-13 has failed the required osv-scanner check on every run since 2026-10-13T00:00Z, with their IGNORE_SCOPES rows and the lock's IGNORE_ALLOWED_LOCKS entry. From the review it also deletes the two unused nltk and setuptools ignores, which would have failed the check the same way on 2026-12-24, so the ordinary OSV config holds no ignore. No other pin moves; the hash-bound Lumibot lock is untouched.
  • Base commit: c63c83a822f2687c3e7aed2d3b3ede0413119c9b (rebased from 738fdf70; main's one new commit, Rule text: converged candidates by multi-angle convergence, models only through a converged harness #1049, overlapped only in manifests/evidence.json). Commits: 8d459ce9 (the relock) and 4b23521c (the review fixes).
  • Lane: lane:foundation
  • Owned paths touched: blueprints/runtime-workers/openhands/requirements.lock, blueprints/runtime-workers/openhands/pins.json (requirements_sha256), blueprints/runtime-workers/openhands/research.md, blueprints/runtime-workers/openhands/evidence/relock-2026-10-13-oauthlib.* (new), .github/osv-scanner.toml, tests/test_osv_lockfile_coverage.py, docs/decisions/2026-09-22-github-automation-closure.md, evidence/receipts/osv-openhands-oauthlib-relock-20261013.json (new), manifests/evidence.json, and the receipt's registration: its exact architecture_receipt grant in tools/local-pages/source_policy.json and its POST_PIN_RECEIPT_GRANTS ledger row in tests/test_local_pages_policy_grants.py (the Register Harbor 0.24.0 as a container harness with a measured install, smoke and route-b probe #1047 pattern; without them the Architecture build refuses a registered receipt); and tests/test_receipt_sha256_key_custody.py (new, the regression test of the review fix below).

Review fixes (Claude read and GPT read of e393356)

  • P1, correction 2026-09-24 community sweep: effort-guard SessionStart notice, working plugin-install commands, dated dispositions #161 (Claude read, CHANGES_REQUESTED): the first head published the sha256 of the two scratch uv.lock files, control and new: receipt reproduction.control_uv_lock_sha256 and reproduction.new_uv_lock_sha256, two relock.txt lines, and the uv.lock argument of the relock script's sha256sum. Those files are not in the repository. All of these are deleted; uv_lock_diff and uv_change_list_delta carry the claim without a digest. The rule is docs/decisions/2026-10-12-harbor-parallel-runtimes.md, "Custody of the run originals". The receipt records the correction. A re-run of the corrected script reproduced the committed lock (cmp exit 0), and its output equals relock.txt except four timestamps and two resolver timings.
  • Regression test: tests/test_receipt_sha256_key_custody.py checks every evidence/receipts key ending in _sha256. Each must be the sha256 of a tracked file or name a public artifact: an https URL under url or under a key of its own prefix (<prefix>_url, <prefix>_published_source), or the same digest in a tracked pin record (pins.json, pins-*.json, a workflow). The 99 older receipts that carry the shape are frozen by count (702 keys); the frozen list only shrinks. Digests of earlier versions of a tracked file, such as a relock receipt's previous_sha256, stay frozen: the check reads the current checkout, not history. The test fails at e3933560 (and at the rebased pre-fix commit) on exactly reproduction.control_uv_lock_sha256 and reproduction.new_uv_lock_sha256, and passes after the fix.
  • P3 (Claude read): the grant reason in tests/test_local_pages_policy_grants.py and the receipt's cross_family_review now cite Relock OpenHands onto oauthlib 4.0.0 and delete the expired oauthlib ignores #1060 and both reads by name instead of a pending read.
  • Follow-up 1 (GPT read, ACK with no blockers): the next calendar failure. The nltk (GHSA-8mgp-746c-j5xp) and setuptools (GHSA-h35f-9h28-mq5c) ignores of 2026-09-26 expire on 2026-12-24, and OSV-Scanner already reported both unused: their only allowed lock, the Lumibot lockcheck, left the inventory on 2026-10-06. Before the deletion, ignore_entry_problems with the date 2026-12-24 returned "ignoreUntil has expired" for both, and affected_pins over the 60 ordinary inputs returned no pin either would hide. Both ignores and their IGNORE_SCOPES rows are deleted; the guard's own mutation tests keep the two scopes as GUARD_FIXTURE_SCOPES, which grant nothing. After it, the ordinary config parses to an empty table, ignore_entry_problems returns nothing with the date 2026-12-24, and the scan step exits 0 with "No issues found" and no unused ignore. The receipt (unused_ignores_removed) and the decision record's supersession record it.

Refs #518 (its oauthlib half; the PyJWT 2.15.1 half is deferred, so #518 stays open).

SOTA sources

Evidence-class table

Claim Evidence class Command / receipt
The required check fails since 2026-10-13T00:00Z on the two expired ignores native_proven (hosted runs; one log read) runs 38325995985, 38326624900, 38326740785; log of 38326740785
The control reproduces the committed lock byte for byte; the new lock differs in oauthlib lines 389-391 only; no forced change local_integration relock-2026-10-13-oauthlib.relock.sh.txt, .relock.txt
The committed lock is the resolver output, not a hand edit local_integration cmp with u3/new/requirements.lock.repro, exit 0 (first run and the corrected-script re-run)
Both lock hashes are PyPI's oauthlib 4.0.0 wheel and sdist, not yanked local_integration relock-2026-10-05-fsspec.hash-check.py.txt (unchanged) with oauthlib, exit 0
Hashed install of 178 packages, uv pip check, SDK/tools and oauthlib imports pass local_integration relock-2026-10-13-oauthlib.install-check.sh.txt, exit 0
requests-oauthlib 2.0.0's own tests: same 72 passed / 2 timing failures under 3.3.1 and 4.0.0 local_integration relock-2026-10-13-oauthlib.requests-oauthlib-tests.sh.txt
No installed package imports oauthlib's endpoints, grant types or servers (where 4.0.0 breaks) source_review (static search) relock-2026-10-13-oauthlib.oauthlib-importers.py.txt
The workflow's scan step exits 1 at the base and 0 here; the ordinary OSV scan exits 1 (two oauthlib findings) and 0 local_integration relock-2026-10-13-oauthlib.osv-scan-step.sh.txt, .osv-before/after/final.ordinary.txt
The Lumibot lock is outside every scan (inventory excluded) and unchanged source_review .github/osv-scanner-lockfiles.json; sha256 a8dce0af...
No receipt key ending in _sha256 publishes a digest no one can check, beyond the frozen older receipts local_integration tests/test_receipt_sha256_key_custody.py: fails at e3933560 on the two scratch uv.lock keys, passes after the fix
The unused nltk and setuptools ignores go with no affected pin left and no calendar failure on 2026-12-24 local_integration affected_pins over the 60 ordinary inputs (none); ignore_entry_problems with the date 2026-12-24, before (both expired) and after (none); .osv-final.ordinary.txt
No hosted run of this head has been observed yet (unobserved) this PR's checks

Local commands run

$ bash .../relock-2026-10-13-oauthlib.relock.sh.txt <scratch> <worktree> rtk uv   # uv 0.12.22
control reproduces the committed lock byte for byte; new requirements.lock sha256 32bc1534...; exit 0
$ cmp <scratch>/u3/new/requirements.lock.repro blueprints/runtime-workers/openhands/requirements.lock
exit 0
$ python3 -I .../relock-2026-10-05-fsspec.hash-check.py.txt blueprints/runtime-workers/openhands/requirements.lock oauthlib
hash-check exit: 0 (2 hashes; unlisted supported artifacts: none)
$ bash .../relock-2026-10-13-oauthlib.install-check.sh.txt <scratch> <worktree> rtk uv
Checked 178 packages; All installed packages are compatible; SDK/tools 1.49.6 imports passed; done, status 0
$ bash .../relock-2026-10-13-oauthlib.requests-oauthlib-tests.sh.txt ... base | new
2 failed, 72 passed (base, oauthlib 3.3.1) | 2 failed, 72 passed (new, oauthlib 4.0.0); same two timing tests
$ bash .../relock-2026-10-13-oauthlib.osv-scan-step.sh.txt <osv 2.6.0> <tree> ...   # TZ=UTC, WRITE_SARIF=false
base 738fdf70: workflow scan step exit: 1; ordinary scan exit: 1 (2 oauthlib findings)
the relock:    workflow scan step exit: 0; ordinary scan exit: 0 ("No issues found", 60 inputs)
$ TZ=UTC python3 -m unittest tests.test_osv_lockfile_coverage tests.test_openhands_lock_binding tests.test_frozen_macos_variant_no_use
base: Ran 74 tests, FAILED (failures=4), exit 1 | the relock: Ran 74 tests, OK, exit 0
$ TZ=UTC python3 -m unittest <the 19 openhands-named test modules + wsl_retrieval, workflow_security_coverage, starred_convergence, ecosystem_manifest>
Ran 1855 tests in 716.294s; OK (skipped=43); exit 0
# review fixes, on 8d459ce9 plus 4b23521c (TZ=UTC)
$ python3 -m unittest tests.test_receipt_sha256_key_custody   # the new test, copied into clones at e3933560 and 8d459ce9
FAILED (failures=2), exit 1: {'evidence/receipts/osv-openhands-oauthlib-relock-20261013.json': ['reproduction.control_uv_lock_sha256', 'reproduction.new_uv_lock_sha256']}
$ <ignore_entry_problems with the date 2026-12-24; affected_pins for the nltk and setuptools advisories>
before: ['GHSA-8mgp-746c-j5xp: ignoreUntil has expired', 'GHSA-h35f-9h28-mq5c: ignoreUntil has expired']; affected pins over 60 inputs: []
after:  config {}; ignore_entry_problems (real date and 2026-12-24): []
$ python3 -m unittest tests.test_receipt_sha256_key_custody tests.test_provenance_digest_custody tests.test_published_digest_privacy tests.test_osv_lockfile_coverage tests.test_openhands_lock_binding tests.test_frozen_macos_variant_no_use tests.test_local_pages_policy_grants tests.test_local_pages_architecture_landscape_exclusions tests.test_workflow_hardening tests.test_workflow_security_coverage tests.test_wsl_retrieval
Ran 319 tests in 34.553s; OK (skipped=2); exit 0
$ python3 scripts/evidence_manifest.py --check && python3 scripts/validate.py
{"files": 11872, "status": "passed"} / {"components": 71, "hashed_files": 11872, "profiles": 4, "receipts": 240, "status": "passed"}
$ bash .../relock-2026-10-13-oauthlib.osv-scan-step.sh.txt <osv 2.6.0> <worktree> ...
workflow scan step exit: 0 (Ran 23 tests, OK; OSV primary exit code: ordinary=0); ordinary scan exit: 0 ("No issues found", no unused ignore)
$ gitleaks git --staged --redact .   |   privacy_scan.sh <fix and PR added lines> <this body>
no leaks found  |  clean

Decision record

docs/decisions/2026-09-22-github-automation-closure.md, new section "oauthlib relock and the end of the oauthlib ignores (2026-10-13)" with its paragraph on the nltk and setuptools ignores, plus a dated supersession line in its ignore list. It supersedes, for the Lumibot lock, the 2026-09-29 and 2026-09-30 Expiry sentences (renew the oauthlib ignores for that lock alone, or delete it), and the Expiry sentences of the 2026-09-26 entries and the 2026-09-27 allowlist (relock onto a fixed nltk release, or renew). The Lumibot lockchecks have been excluded from the inventory since the 2026-10-06 ruling, so no scan reads them and their bytes stay unchanged. Recipe record: blueprints/runtime-workers/openhands/research.md "Runtime lock oauthlib relock (2026-10-13)". Receipt: evidence/receipts/osv-openhands-oauthlib-relock-20261013.json. Overturn: an advisory for oauthlib 4.0.0 that only a later release fixes, an OpenHands run that fails with 4.0.0 and passes with 3.3.1, a scanned lock pinning oauthlib below 4.0.0 again, or a new ordinary ignore (it needs its own reachability review and IGNORE_SCOPES row).

Host evidence

Not applicable: no file under evidence/hosts/ changes.

Checklist

  • New/changed GitHub Actions are pinned to a full commit SHA with a
    version comment (no floating tags). No workflow changes.
  • New/changed workflows declare top-level permissions: {} and grant each job
    only what it needs (contents: read, or an explicitly justified addition). No workflow changes.
  • No secrets are printed, logged or committed; no new required secret was
    added without a documented owner.
  • No new paid hosting, subscription or billing surface was introduced.
  • Peer-owned untracked files and worktrees were preserved (not deleted,
    moved or overwritten).

Follow-ups

  • An early-warning check before any future ignoreUntil, as its own PR. Both calendar failures here (the oauthlib pair on 2026-10-13, and the nltk and setuptools pair that would have failed on 2026-12-24) surfaced first as a failed required check. A scheduled or preflight warning ahead of each expiry would raise them while the fix can still be planned.
  • GPT read follow-up 2: primary-source and replay gaps. The read's packet had no captures of oauthlib and requests-oauthlib (both unmirrored), the SDK archive at fcc102a6, the uv 0.12.22 tag, the advisory records or the three CI runs. So the release-note, PyPI metadata, resolver-replay and upstream-test claims are retained evidence, not results that read reproduced. Supply the pinned source, metadata and artifact captures and rerun the native checks.
  • GPT read follow-up 3: stale inherited numeric citations. For example docs/decisions/2026-09-28-community-sweep.md:298 cites lines 1626-1631 of the automation-closure record, which no longer hold the cited policy; it was already wrong before this PR. Bind historical references to their commit, or move live references to stable section anchors.
  • GPT read follow-up 4: host-name hygiene in unchanged lines. The read found nine occurrences of the host name in unchanged lines of manifests/evidence.json and tools/local-pages/source_policy.json, none added here; normalize them when those records are next maintained.
  • PyJWT 2.15.1 (the other half of Relock OpenHands onto oauthlib 4.0.0 / PyJWT 2.15.1 by 2026-10-08 (osv ignores from #517 expire 2026-10-13) #518): left to a change of its own; PyJWT 2.15.0 has no advisory in this scan.
  • blueprints/runtime-workers/openhands/README.md still says the lock carries "five dependency upgrades" (stale since the urllib3 relock; ten with this one).

🤖 Generated with Claude Code

@seathatflowsinourveins seathatflowsinourveins added the lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers label Oct 13, 2026
…ignores

From 2026-10-13T00:00Z the required osv-scanner check failed on every run:
the two oauthlib ignores (GHSA-hj66-6f7g-4r5v, GHSA-xpv3-w29h-x7cv) carried
ignoreUntil = 2026-10-13, and the scan step's unittest preflight rejects an
expired ignore (CI run 38326740785).

- Relock blueprints/runtime-workers/openhands/requirements.lock from oauthlib
  3.3.1 to 4.0.0, the first patched release of both advisories, with the
  recipe's paired uv 0.12.22 relock: the fsspec relock's nine version-pinned
  upgrades plus --upgrade-package oauthlib==4.0.0. The control reproduces the
  committed lock byte for byte; the new lock differs in the three oauthlib
  lines only, and both hashes are PyPI's 4.0.0 wheel and sdist. No other pin
  moves.
- Delete both ignores, their IGNORE_SCOPES rows and the lock's
  IGNORE_ALLOWED_LOCKS entry. The Lumibot lock they also covered has been
  excluded from the inventory since 2026-10-06 and is unchanged.
- Record it: research.md section, a dated supersession in the automation
  closure decision, receipt
  evidence/receipts/osv-openhands-oauthlib-relock-20261013.json, returned
  outputs under the relock-2026-10-13-oauthlib prefix, the pins.json digest,
  the receipt's Architecture grant and post-pin ledger entry, and
  manifests/evidence.json.

Checks: the workflow's own scan step exits 1 at 738fdf7 and 0 here; its
ordinary OSV-Scanner 2.6.0 scan exits 1 (the two oauthlib findings) and 0;
TZ=UTC unit runs of the coverage modules go from 4 failures to OK; the
hashed install, uv pip check, SDK import and requests-oauthlib 2.0.0's own
tests pass on the new lock.

Refs #518

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…delete the unused ignores

From the Claude read of e393356 (CHANGES_REQUESTED) and the GPT read of
e393356 (ACK, no blockers):

- P1, correction #161: delete the sha256 of the two scratch uv.lock files
  from the receipt (control_uv_lock_sha256, new_uv_lock_sha256), from
  relock.txt and from the relock script's sha256sum; uv_lock_diff and
  uv_change_list_delta carry the claim. Add
  tests/test_receipt_sha256_key_custody.py: every evidence/receipts key
  ending in _sha256 must hash a tracked file or name a public artifact
  (an https URL under url or a key of its own prefix, or a tracked pin
  record); 99 older receipts are frozen by count (702 keys). It fails at
  e393356 on exactly those two keys.
- P3: the post-pin grant reason and the receipt's cross_family_review
  cite #1060 and both reads.
- GPT read follow-up 1: delete the unused nltk and setuptools ignores
  (GHSA-8mgp-746c-j5xp, GHSA-h35f-9h28-mq5c), which would have failed the
  scan step's preflight on 2026-12-24, and their IGNORE_SCOPES rows; the
  guard's own tests keep the two scopes as GUARD_FIXTURE_SCOPES. No
  ordinary input pins a version they affect, and the ordinary config now
  holds no ignore.

Checks: validate.py passed (11872 hashed files); 11 modules under
TZ=UTC, 319 tests OK; the workflow's scan step exits 0, No issues found;
ignore_entry_problems with the date 2026-12-24 returns nothing.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
The organization transfer reset CodeQL default setup; it was restored at
2026-10-13T04:53Z, and default setup analyzes a pull request only on a push.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins
seathatflowsinourveins merged commit dbe7a8d into main Oct 13, 2026
31 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the foundation/osv-oauthlib-relock-20261013 branch October 13, 2026 05:53
seathatflowsinourveins added a commit that referenced this pull request Oct 15, 2026
CI run 38799026807 failed validate-shard-4 at 191f6c6, and the command
center's read of 191f6c6 found the same P1:
tests.test_local_pages_architecture_landscape_exclusions refused the new
registered receipt ("Architecture role/path has no independent approval:
architecture_receipt"). Every registered evidence/receipts/*.json needs an
exact grant, as #1060 added for its relock receipt.

- tools/local-pages/source_policy.json: the exact architecture_receipt grant.
- tests/test_local_pages_policy_grants.py: its POST_PIN_RECEIPT_GRANTS row.
- manifests/evidence.json: the two rows re-hashed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 15, 2026
…HSA-qhrr-8q5h-9q3h) (#1178)

* fix(trading): relock the LEAN Alpaca adapter onto MessagePack 3.1.9

GHSA-qhrr-8q5h-9q3h (CVE-2026-92707), published 2026-10-15T18:35:46Z,
affects MessagePack >= 3.0.0, < 3.1.9. The Alpaca adapter lock pinned
3.1.7, so the required osv-scanner check failed on every run after
main's 16:47Z pass.

The Alpaca source patch now also raises the adapter's direct MessagePack
reference to 3.1.9 (vendor dotnet add, native git diff -U0). The pinned
.NET SDK 10.0.401 regenerated the lock: MessagePack, MessagePack.Annotations
and MessagePackAnalyzer move to 3.1.9, nothing else changes, and the 22
LEAN locks stay byte-identical. A fresh adapter clone restores the
published patch and lock in locked mode and builds with zero errors.
No ignore entry is added.

Receipt: evidence/receipts/osv-alpaca-messagepack-relock-20261015.json.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Grant the MessagePack relock receipt to the Architecture reader

CI run 38799026807 failed validate-shard-4 at 191f6c6, and the command
center's read of 191f6c6 found the same P1:
tests.test_local_pages_architecture_landscape_exclusions refused the new
registered receipt ("Architecture role/path has no independent approval:
architecture_receipt"). Every registered evidence/receipts/*.json needs an
exact grant, as #1060 added for its relock receipt.

- tools/local-pages/source_policy.json: the exact architecture_receipt grant.
- tests/test_local_pages_policy_grants.py: its POST_PIN_RECEIPT_GRANTS row.
- manifests/evidence.json: the two rows re-hashed.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 15, 2026
)

GHSA-84m7-p3x7-pcfv (CVE-2026-59951: unbounded session accumulation in
the MCP Python SDK's Streamable HTTP transport; CVSS 3.1 7.5, GitHub
severity field medium) affects mcp >= 1.8.0, < 1.30.0 and >= 2.0.0,
< 2.2.0; the recipe lock pinned mcp 1.28.1. Sources, read 2026-10-15:
- gh api /advisories/GHSA-84m7-p3x7-pcfv (published 20:13:13Z, updated
  20:13:14Z, read 20:55:51Z), and the repository advisory it cites,
  GHSA-84m7-p3x7-pcfv
  (published 2026-09-30T20:53:30Z, the same ranges);
- the v1.30.0 release, gh api
  repos/modelcontextprotocol/python-sdk/releases/tags/v1.30.0: tag
  commit 8c2fa6eabacde869d75568e33b9d466b58c2f512; body lines 13-17
  ("Idle Streamable HTTP sessions now expire (#3426)"), 33 and 38 name
  the fix, #3426 at 92120b4b0f50385af096592d7cee932fc1d994e7;
- OSV.dev's record, modified 20:30:08Z, after the hosted osv-scanner
  job at 5561321 had passed (run 38801792191, job 116652403677,
  20:25:18Z to 20:25:41Z).

- Relock blueprints/runtime-workers/openhands/requirements.lock with
  the recipe's own paired uv 0.12.22 relock, #1060's procedure: the
  control, #1060's ten version-pinned upgrades on a fresh extraction of
  the pinned SDK archive, reproduces the committed lock byte for byte,
  and the new run adds one upgrade:

    uv lock --upgrade-package anyio==4.14.2 --upgrade-package click==8.5.0
      --upgrade-package pypdf==6.19.0 --upgrade-package soupsieve==2.9.2
      --upgrade-package pyjwt==2.15.0 --upgrade-package urllib3==2.8.0
      --upgrade-package litellm==1.93.2 --upgrade-package fsspec==2026.6.0
      --upgrade-package multidict==6.9.1 --upgrade-package oauthlib==4.0.0
      --upgrade-package mcp==1.30.0
    uv export --frozen --format requirements.txt --no-header
      --no-annotate --package openhands-tools --no-emit-workspace

  The flags at astral-sh/uv 0.12.22 (tag commit
  70fe1196a546e49148a73b1c592b2f74c33af80e):
  docs/concepts/projects/sync.md:157-182 (lock --upgrade-package
  <package>==<version>) and :35-50 (lock --check);
  docs/concepts/projects/export.md:43-55 (requirements.txt);
  crates/uv-cli/src/lib.rs:7506-7509 (--upgrade-package, in
  ResolverArgs, flattened into LockArgs at 4157-4158), 4102-4110
  (--check), 4757-4764 (--format), 4776-4780 (--package), 4811-4813
  (--no-annotate), 4818-4820 (--no-header), 4900-4913
  (--no-emit-workspace) and 4982-4986 (--frozen); the kept workspace
  settings at docs/concepts/resolution.md:142-173 (environments),
  303-309 (preferences), 846-852 (exclude-newer-package) and 891-921
  (the relative exclude-newer).
- Moved: mcp 1.28.1 -> 1.30.0, and nothing else. uv's change list
  differs from the control's by "Updated mcp v1.28.1 -> v1.30.0" only,
  uv.lock by the mcp entry only and the export by lines 365-367 only;
  both hashes are PyPI's 1.30.0 wheel and sdist (uploaded 2026-09-07,
  outside the 7-day exclude-newer window). 1.30.0 declares the same
  requirements as 1.28.1, and the lock's two dependents admit it:
  fastmcp 3.2.0 (mcp<2.0,>=1.24.0) and browser-use 0.11.9
  (mcp>=1.10.1). fastmcp's <2.0 keeps the 2.x fix out of reach.
- pins.json requirements_sha256: a3303759da2895ecb87e0a9fa7e45878bb2588208615e6a6059704a98e71e396
  (was 32bc153428aaef2018adcdca53337e4a74b464ca94a96b9905e1bc6174503400).

Fail-first: security-scan.yml's own "Scan every listed lockfile and
manifest" step (extracted at 5561321, bash --noprofile --norc -eo
pipefail, TZ=UTC, WRITE_SARIF=false, RUNNER_TEMP holding OSV-Scanner
2.6.0 checked against OSV_SCANNER_SHA256 ca69b3d3...) exits 1 with
exactly GHSA-84m7-p3x7-pcfv on requirements.lock at 5561321
(2026-10-15T20:58:30Z) and at main's a93ba0b (21:23:15Z, a detached
worktree, removed), and exits 0 on this change (21:25:47Z, preflight
23 tests OK, ordinary=0, No issues found over the 60 ordinary inputs).
A scan of this lock alone exits 1, then 0.

Tests, TZ=UTC, on this change's final tree (21:32:48Z to 21:39:30Z):
tests.test_osv_lockfile_coverage with
tests.test_wsl_retrieval.RetiredRunnerTests, 65 tests OK; the 16
modules that name the recipe or its lock outside local pages, with
tests.test_provenance_digest_custody, 950 tests OK (55 skipped); the 32
tests/test_local_pages*.py modules, tests.test_local_pages_policy_grants
among them, 547 tests OK. After the receipt's and the summary's last
edits, tests.test_receipt_sha256_key_custody,
tests.test_provenance_digest_custody and the 32 local-pages modules ran
again: 578 tests OK. validate.py passed (12148 hashed files);
evidence_manifest.py --check passed; git diff --check is clean. The
isolated hashed install (CPython 3.13.16), uv pip check (178
packages), the SDK import, an mcp 1.30.0 check (StreamableHTTPSessionManager
defaults session_idle_timeout 1800, max_sessions 10000) and a fastmcp
3.2.0 in-memory client smoke pass; the PyPI hash check exits 0;
resolver.py --help and run --help exit 0. Not run: run-e2e.sh and
e2e/ (the installed prefix, images, gateway and model calls) and
install.sh (a host install).

Record: the research.md section; the receipt
evidence/receipts/osv-openhands-mcp-relock-20261015.json, with its
exact architecture_receipt grant in tools/local-pages/source_policy.json
and its POST_PIN_RECEIPT_GRANTS row in
tests/test_local_pages_policy_grants.py; the returned outputs under the
relock-2026-10-15-mcp prefix beside the recipe; manifests/evidence.json.

The NuGet-digest P3 from the GPT read of #1178 lands in the next
commit, as the command center's 20:58Z ruling directs.

Co-authored-by: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 17, 2026
adoption/platforms/linux-wsl2-new-distro.md:1247 keeps the raw stage-1
transcript private and never committed, and :1240-1274 prescribe a
stage-1 receipt filled from adoption/templates/wsl/stage1-receipt.example.json
instead. So this commit:

- removes evidence/artifacts/live-distro-stage1-logs-20261017/ (the three
  redacted transcripts and their receipt.json) and its four files[] rows;
- adds one receipt per distribution under evidence/receipts/:
  wsl-new-distro-stage1-nativestack2604-20261002,
  wsl-new-distro-stage1-nativehorizonny-20261015 and
  wsl-new-distro-stage1-nativehorizonny-r1-20261015, each filled only
  from its own private transcript, with the template's 212 recipe steps,
  null where the transcript holds no record, and source_transcript giving
  the original's path, size and sha256 on Z:;
- registers the three files through scripts/host_receipts.py register_file
  and adds their receipts[] rows (same id, kind, component_ids, claim and
  limitations, plus path), as the recipe's Contribute step says.

Sanitizing follows :1248-1250 and <win-host>; the transcripts hold no GUID.

The Architecture build refuses a registered receipt that has no exact
grant (tests.test_local_pages_architecture_landscape_exclusions failed in
CI run 39001649622, validate-shard-6, at b72d3d6). Following the post-pin
grant precedent (#1047, #1060, #1178, #1191), this commit adds one exact
architecture_receipt row per new receipt to tools/local-pages/source_policy.json
and one POST_PIN_RECEIPT_GRANTS entry each, with its reason, to
tests/test_local_pages_policy_grants.py. Both files are re-registered
through register_file.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
seathatflowsinourveins added a commit that referenced this pull request Oct 17, 2026
…onNY's rehearsal (#1235)

* Harvest the live distros' Stage-1 transcripts as sanitized evidence (cleanup H01)

Add evidence/artifacts/live-distro-stage1-logs-20261017/ with sanitized copies
of the three Stage-1 PowerShell transcripts that existed only on Z:
(NativeStack2604, NativeHorizonNY and NativeHorizonNY-r1). Add receipt.json,
which gives each original's path, size, sha256 and mtime and lists every
redaction by line. The originals stay on Z: unchanged.

Sanitizing follows adoption/platforms/linux-wsl2-new-distro.md:1248-1250 and
docs/decisions/2026-10-09-host-name-scan.md:160-161. The placeholders are
<win-host>, <win-user>, %USERPROFILE% and <WSL_USER>, replaced inside lines
only: 66 lines change, and no line is added or removed. CRLF becomes LF
per .gitattributes:2. The four files are registered in manifests/evidence.json
through scripts/host_receipts.py register_file.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Rework H01 into stage-1 receipts per the WSL recipe's documented form

adoption/platforms/linux-wsl2-new-distro.md:1247 keeps the raw stage-1
transcript private and never committed, and :1240-1274 prescribe a
stage-1 receipt filled from adoption/templates/wsl/stage1-receipt.example.json
instead. So this commit:

- removes evidence/artifacts/live-distro-stage1-logs-20261017/ (the three
  redacted transcripts and their receipt.json) and its four files[] rows;
- adds one receipt per distribution under evidence/receipts/:
  wsl-new-distro-stage1-nativestack2604-20261002,
  wsl-new-distro-stage1-nativehorizonny-20261015 and
  wsl-new-distro-stage1-nativehorizonny-r1-20261015, each filled only
  from its own private transcript, with the template's 212 recipe steps,
  null where the transcript holds no record, and source_transcript giving
  the original's path, size and sha256 on Z:;
- registers the three files through scripts/host_receipts.py register_file
  and adds their receipts[] rows (same id, kind, component_ids, claim and
  limitations, plus path), as the recipe's Contribute step says.

Sanitizing follows :1248-1250 and <win-host>; the transcripts hold no GUID.

The Architecture build refuses a registered receipt that has no exact
grant (tests.test_local_pages_architecture_landscape_exclusions failed in
CI run 39001649622, validate-shard-6, at b72d3d6). Following the post-pin
grant precedent (#1047, #1060, #1178, #1191), this commit adds one exact
architecture_receipt row per new receipt to tools/local-pages/source_policy.json
and one POST_PIN_RECEIPT_GRANTS entry each, with its reason, to
tests/test_local_pages_policy_grants.py. Both files are re-registered
through register_file.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Fold both families' reads of c4c5242 into the three stage-1 receipts

The three receipts are rebuilt by the same transcript-line generator, and
their files[] and receipts[] rows are re-registered.

Claude family:
- P2-1 (two real-run receipts, the 29 R1 rows): rows the transcript does
  not record keep the template's text, so no R1 row names a production
  distribution (linux-wsl2-new-distro.md:167-168, :172, :1269-1270). The
  steps[] limitation states the R1 exception; in the r1 receipt only the
  recorded R1 rows carry its own name.
- P3-1 (nativestack2604 steps 90, 91, 94, 95): the unlabeled '0' lines are
  no longer read as exits; those exits are null and the excerpts say so.
- P3-2 (creation_path_basis and the 24 W6 excerpts): no "--from-file"
  claim; the basis is W3's '#cloud-config' output and the absent W6 block.
- P3-3 (nativehorizonny rehearsal block, its limitation and the 29 R1
  excerpts): the R1 identity is hedged as "taken as".
- P3-4 (r1 rehearsal.basis): cites
  docs/decisions/2026-10-15-new-wsl-clean-install-plan.md:914-915, whose
  18:37:42Z removal equals the transcript's last End time, and drops the
  "every proof held" implication.
- P3-5 (every null field): each receipt names every null field with its
  reason, and the generator asserts none is left unnamed.
- P3-6 (nativestack2604 rehearsal limitation): points to
  evidence/artifacts/new-wsl-rehearsal-20261002/ and says those records
  name StackRehearsal2604 and its e1, r2 and r3 runs, not NativeStack2604.

Muse family:
- P2 (nativehorizonny :15), P2 (nativehorizonny-r1 :15) and P2
  (nativestack2604 :15), with their manifest copies: covered by the full
  null-field naming above.
- P2 (nativestack2604 :19): the rehearsal block is described as present
  with null fields.
- P3 (each receipt :14): the sanitizing note lists only the placeholders
  in copied values, keeps the template's own placeholders apart, and says
  why <win-user> and <win-host> do not appear.
- P3 (nativehorizonny :20): same fix as Claude P3-3.

13 of 13 findings covered.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* Cleanup H01 fold: move three 2604 null fields to the no-line bucket, correct the sanitizing note

Closes both findings of the CC verdict on 39ab807
(/var/tmp/cc-cc-work/nas1235-micro/CC-DELTA-39ab8072.md, CHANGES_REQUESTED;
full read /var/tmp/cc-cc-work/nas1235-micro/MICRO-delta-39ab8072.md).

P3-A: in the NativeStack2604 stage-1 receipt, first_launch.user_prompt_marker,
first_launch.oobe_failed_marker and first_launch.systemd_user_session_warning
sat in the "shows the source command but not the output" null bucket (:17).
The transcript has no line for the W5 launch command (its W5 block shows only
an unlabeled '0' before its first labeled command, as the receipt's own launch
row says), so the three fields move to the "no line for the source command"
bucket (:18). The manifest row matches. The NativeHorizonNY receipts keep
their buckets: their launch is labeled.

P3-B: the sanitizing note (:14 of each of the three receipts) said the Windows
user name and computer name occur only in transcript header lines the receipt
does not copy. They also occur in transcript body paths and in the Host
Application header, of which each receipt copies a sanitized run-from path
(deviations[0] in 2604, deviations[1] in the NativeHorizonNY receipts). The
note now says so and names the replacements that remove them. The three
manifest copies match word for word.

The three receipt rows in manifests/evidence.json are re-registered with
host_receipts.register_file (sha256 and bytes). validate.py and
evidence_manifest.py --check pass.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

* Cleanup H01 fold 4: give each receipt's sanitizing note the facts its own transcript supports

Closes P3-1 of the CC verdict on 5ed31f6
(/var/tmp/cc-cc-work/nas1235-micro/CC-DELTA-5ed31f69.md, CHANGES_REQUESTED;
full read /var/tmp/cc-cc-work/nas1235-micro/MICRO-delta-5ed31f69.md).

The previous fold copied one sentence into all three receipts' :14 note. It
was true only for the Windows user name in the NativeStack2604 receipt. The
verdict records that the sentence came from the CC's earlier verdict.

NativeStack2604 receipt: the Windows user name appears in body paths, in the
Host Application header (copied only as the sanitized run-from path at
deviations[0]) and in the Username and RunAs User headers, and the listed
replacements remove it. The computer name appears only in the Username,
RunAs User and Machine headers, which the receipt does not copy.

NativeHorizonNY and r1 receipts: the user name appears in two body lines
(the user-data name line and the default= line, rendered <WSL_USER>) and in
the Username and RunAs User headers. The computer name appears only in the
Username, RunAs User and Machine headers. The Host Application header carries
neither name, and deviations[1] copies its run-from directory as it stands.

The three manifest copies (manifests/evidence.json, the limitations of each
receipt row) match the receipts word for word, and the three file rows are
re-registered with host_receipts.register_file (sha256 and bytes). No other
line changes.

Co-Authored-By: Claude Sonnet 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:foundation Foundation lane: Claude/Codex setup, hosts, memory, RAG, research, workers

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant