Skip to content

Pin aiohttp 3.14.4 in all four runtime locks (GHSA-2g87, GHSA-5wr8, GHSA-494j) - #1265

Merged
seathatflowsinourveins merged 5 commits into
mainfrom
deps/aiohttp-3.14.4
Oct 20, 2026
Merged

seathatflowsinourveins merged 5 commits into
mainfrom
deps/aiohttp-3.14.4

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 20, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

This pins aiohttp 3.14.4 in all four runtime lockfiles that pinned 3.14.3, closing three advisories: GHSA-2g87-pp6c-29x5 (High), GHSA-5wr8-gcqf-gqf3 (High) and GHSA-494j-54xm-rwp3 (Low). It turns the required osv-scanner check green for every NAS PR; it has been red on all of them. No OSV ignore or exception is added.

Commit 1 (14df31f) moves three locks to aiohttp 3.14.4. A GPT-6.1 Sol lane on NativeHorizonNY2 prepared it.

  • blueprints/memory-stack/native-qualification/uv.lock moves aiohttp only.
  • blueprints/runtime-workers/openhands/requirements.lock also moves yarl from 1.22.0 to 1.25.1, which aiohttp 3.14.4 requires (yarl<2.0,>=1.25.1). It is regenerated through the worker's documented export route.
  • examples/openhands-native-capabilities/requirements.lock is regenerated through its header route.
  • The commit also refreshes pins.json, .github/osv-scanner-lockfiles.json and manifests/evidence.json.

Commit 2 (3449e04) re-pins the trading-2604 runtime lock. A Claude Opus 5.5 builder on NativeHorizonNY prepared it, using the existing uv-managed CPython 3.12.3 that the project requires (==3.12.3).

  • Only aiohttp moves. The other 191 lock entries and the revision = 5 header are byte-identical, and yarl is already 1.25.1. The lock hash goes from f451ef97… to a1413f202937aa05625bad34b35d4ad75c9ab637805c3747abc4fb8b0f85634a.
  • The live bindings of the lock hash move with it, following Publish final runtime pins with lock-bound native acceptance #873 (a484989):
    • install-trading-2604.sh, where the published f451 pair becomes one more recorded migration input and inverse record, never acceptance;
    • accept-trading-2604.sh:15 and adaptive-paper/scheduled_trial.sh:54;
    • adaptive-paper/source-hashes.json;
    • runtime-2604/README.md;
    • the tests/test_scheduled_trial.py fixture;
    • catalogs/landscape/final-stack.json, regenerated with scripts/final_stack.py --write;
    • the OSV inventory and manifests/evidence.json.
  • Historical records keep f451 unchanged: the event-anchored-ranking protocol records, catalyst-provenance, the dated catalog snapshots, and the 2026-10-08 binding and 24/24 acceptance receipts.
  • The f451 lock bytes are retained. They are reproduced byte-identically from 30ab2e3 as evidence/artifacts/trading-2604-aiohttp-repin-20261020/published-f451-trading-2604-runtime.lock, because tests/test_receipt_sha256_key_custody requires every receipt *_sha256 to hash a tracked file. The OSV inventory lists the file as an excluded evidence fixture, following the engine-baseline.lock precedent. It is not an install input.

Commits 3 and 4 (f662439, a6cb6b8) retain a frozen input that commit 1 moved.

  • The failure. Hosted validate-shard-0 failed at 3449e04 in scripts/validate_convergence.py --all-recorded, with "record.frozen_inputs.sources[3]: SHA-256 mismatch".
  • The cause. evidence/artifacts/native-runtime-role-resolution-20260930/experiment.json froze the pre-bump bytes of examples/openhands-native-capabilities/requirements.lock (16e1a44e…).
  • The fix. Following ecea286 (OmniRoute Codex SDK worker harness at Codex 0.160.0 (supersedes #551) #628), those bytes are retained from 30ab2e3 as evidence/artifacts/aiohttp-3.14.4-relock-20261020/historical/examples/openhands-native-capabilities/pinned-at-30ab2e3a.source.txt. The record's single reference points there, with its sha256 unchanged.
  • Why commit 4 renames it. Commit 3 first named the copy requirements.lock.source.txt. GitHub's dependency graph then parsed it as a pip manifest, and the required dependency-review failed on its aiohttp 3.14.3. Commit 4 renames it; the name now matches no manifest pattern, like ecea286's worker.py.lock.source.txt.
  • The exclusion is gone. Commit 4 also removes the OSV exclusion that commit 3 had added, because the coverage test refuses an exclusion for a non-lockfile. .github/osv-scanner-lockfiles.json is byte-identical to 3449e04.
  • Nothing is waived. No allowance or ignore is added.
  • On the final head, validate_convergence.py --all-recorded passes, with 33 records valid.

Commit 5 (48453d9) adds tests/test_trading_2604_migration.py. It is the regression test that the native Codex review of a6cb6b8 (P2) and the GPT review's L2 asked for.

  • What it runs: only the installer's hash definitions and its step=locked-project admission block, verbatim, against a temporary project.
  • What it checks:
    • the published f451 lock is admitted and replaced by the current lock;
    • the current lock passes;
    • an unknown lock is refused with exit 73;
    • with the published admission removed (the reviewer's mutant), f451 is refused.
  • Why a new module: tests/test_trading_2604_lock.py is hash-bound by the 2026-10-08 record legacy-migration-source-repair.json, so it stays unchanged.

Context. Row C35 of the North Star paper plan (horizon north-star-t1b-review-01) closed as (b), this re-pin, after the GPT family declined accepting 3.14.3. The plan pins NAS 6f57256, so this PR re-pins no plan. Acceptance of the new lock runs under that plan's install and acceptance step (C05).

SOTA sources

  • aio-libs/aiohttp v3.14.4, release commit 0c5e5e1c2256c2f46fa83912d01df7632c3b26cd, and the advisories GHSA-2g87-pp6c-29x5, GHSA-5wr8-gcqf-gqf3 and GHSA-494j-54xm-rwp3. All three affect <=3.14.3 and are fixed in 3.14.4. The PyPI 3.14.4 metadata is the source of the yarl floor.
  • astral-sh/uv at 70fe1196a546e49148a73b1c592b2f74c33af80e: docs/concepts/projects/sync.md (upgrading locked package versions) and docs/concepts/projects/export.md.
  • uv versions: the relock ran on uv 0.13.1. uv lock --check also passes under the installer's pinned uv 0.12.17, fetched through validate.yml's checksum route. A relock under 0.12.17 rewrites the header to revision = 3, an unrelated change, so it was not used.
  • native-agent-stack/native-agent-stack at 30ab2e3, the repository's own precedents:
  • OSV-Scanner 2.6.0, at the SHA256 pinned in .github/workflows/security-scan.yml.

Evidence

Every check ran from the repository root with python3 -B, in a scratch CPython 3.12.3 venv built from .github/requirements-ci.txt with --require-hashes. The host's python3 lacks jsonschema. The venv was removed afterwards.

Check Result
tests.test_trading_2604_lock, tests.test_osv_lockfile_coverage, tests.test_wsl_retrieval.RetiredRunnerTests 78 tests, OK
25 related modules (scheduled trial, trading source acceptance, runtime identity, final stack, receipt custody, frozen evidence, adaptive-paper and others) 814 tests: 727 passed, 86 skipped, 1 failed. The failure, test_gitleaks_config…test_repository_pre_commit_refuses_old_fixture_commit, fails the same way at base 14df31f with nothing applied, and touches no changed file.
scripts/validate.py passed: 71 components, 12,328 hashed files at the final head a6cb6b8, 4 profiles, 243 receipts
scripts/validate_convergence.py --all-recorded (final head) 33 records, all valid
6 convergence, manifest, OSV-inventory and receipt-custody modules (final head) 271 tests, OK
scripts/evidence_manifest.py --check passed
scripts/final_stack.py --check and scripts/trading_gates.py --check passed
uv lock --check (uv 0.13.1 and pinned 0.12.17) passed
OSV-Scanner 2.6.0 over the ordinary group, built as the workflow builds it (60 inputs, including the trading lock) No issues found, 0 findings
gitleaks over 30ab2e3..HEAD 2 commits, no leaks

Known limits

  • Not run here: install-trading-2604.sh, accept-trading-2604.sh and scheduled_trial.sh, because they write host state. The host migration from f451 to a1413f20 and its inverse are also unrun. Only a scratch extraction of the installer's admission block was probed: f451 is admitted and replaced, a1413f20 passes, and an unknown lock is refused with rc 73.
  • Acceptance does not transfer. The 2026-10-08 24/24 native acceptance is bound to f451. Acceptance of a1413f20 is pending, under the plan's C05.
  • For reviewers to confirm: the retained f451 fixture is an excluded evidence fixture. The alternative is listing it under FROZEN_LOCKS, which the non-required frozen-evidence workflow keeps reporting.
  • Known flaky test, not caused by this PR: tests.test_adaptive_paper_metrics.FileSdRegistrationTests.test_a_clean_stop_of_an_unfinished_trial_stays_registered ("exporter never registered its target") failed hosted validate-shard-0 once at a6cb6b8. Measured on the publishing host, it fails intermittently at both pins: 1 of 3 runs at a6cb6b8 and 1 of 2 at base 30ab2e3. The failed job is re-run, and the flake is a separate follow-up.
  • Follow-ups for the catalog assembler, as Publish final runtime pins with lock-bound native acceptance #873 routed catalog reconciliation: catalogs/us-equities/runtime-target.json#/current_runtime and catalogs/us-equities/data-research.md:175 still name f451 as current.

Review and landing

The merge waits for three things:

  • the Claude family's acceptance of the exact head;
  • the GPT family's acceptance of the exact head;
  • the required checks.

The merge then runs with --match-head-commit. After it lands, #1262 and #1263 are updated from main, and both families check that merge delta.

🤖 Generated with Claude Code

Regenerate the memory and example locks through uv and reproduce the OpenHands worker frozen export. Move yarl to 1.25.1 as required by aiohttp 3.14.4. Refresh inventory and evidence digest bindings.

The trading lock remains at aiohttp 3.14.3: its exact Python 3.12.3 interpreter is unavailable, and no new installation is authorized. This is a partial repair and re-pins no trading plan.
GHSA-2g87-pp6c-29x5, GHSA-5wr8-gcqf-gqf3 and GHSA-494j-54xm-rwp3 affect
aiohttp <=3.14.3 and are fixed in 3.14.4. The trading-2604 lock was the last
scanned lock at 3.14.3.

Lock delta (aiohttp only):
- Relock: UV_PYTHON_DOWNLOADS=never uv lock --python <uv-managed CPython
  3.12.3> --upgrade-package aiohttp==3.14.4, uv 0.13.1.
- aiohttp 3.14.3 -> 3.14.4 (sdist and wheels, 18 -> 19 wheels; dependencies
  unchanged). yarl stays 1.25.1. 192 entries before and after; the other 191
  entries and the `revision = 5` header are byte-identical.
- Lock sha256 f451ef979cdb1ae3686a30df1c883c257402b32753478c1f9c686c057e9c3989
  -> a1413f202937aa05625bad34b35d4ad75c9ab637805c3747abc4fb8b0f85634a
  (308332 -> 308625 bytes). The manifest aa370e42 is unchanged.
- uv lock --check passes under uv 0.13.1 and under the installer's pinned
  uv 0.12.17 (`uv --no-config lock --check`, release archive verified against
  validate.yml's SHA256). A relock with uv 0.12.17 resolves the same packages
  but rewrites the header to `revision = 3`, so it was not used.

Bindings refreshed:
- install-trading-2604.sh: lock_hash -> a1413f20. Following #873 (a484989),
  the October 8 published pair f451/aa370e42 becomes one more recorded
  migration input and inverse record (published_lock_hash /
  published_project_hash, a sixth column of the existing-file check), never
  acceptance. Completion marker no-dvc-r4 and sync vector (8b8aa38e) are
  unchanged, as in #873.
- accept-trading-2604.sh:15 and adaptive-paper/scheduled_trial.sh:54 require
  a1413f20, so a runtime still at f451 is refused.
- tests/test_scheduled_trial.py scratch acceptance fixture lock_hash.
  tests/test_trading_2604_lock.py derives every hash from the bytes and pins
  none, so it is unchanged.
- runtime-2604/README.md: current-lock statements. The 24/24 native acceptance
  is bound to f451 and does not transfer; acceptance of a1413f20 is pending
  and runs under the North Star plan's C05.
- .github/osv-scanner-lockfiles.json trading entry sha256.
- adaptive-paper/source-hashes.json (scheduled_trial.sh, test_scheduled_trial.py).
- catalogs/landscape/final-stack.json, regenerated by
  scripts/final_stack.py --write (sources hash of the lock only).
- manifests/evidence.json entries of every changed file.

Retained f451 bytes: tests/test_receipt_sha256_key_custody requires every
receipt *_sha256 to hash a tracked file. The October 8 final-lock and 24/24
receipts bind f451, so its bytes are retained byte-identical (git show
30ab2e3) as evidence/artifacts/trading-2604-aiohttp-repin-20261020/
published-f451-trading-2604-runtime.lock, an excluded evidence fixture in the
osv inventory (not an install input; the active lock is scanned), following the
engine-baseline.lock exclusion precedent.

Records left unchanged (they record what was true then):
event-anchored-ranking/*, catalyst-provenance/README.md,
catalogs/convergence-practice/sources/starred-protected-20261011.json,
catalogs/convergence-practice/starred-convergence-20261010.json,
evidence/artifacts/runtime-final-lock-binding-20261008/*,
evidence/receipts/runtime-final-lock-binding-20261008.json,
evidence/receipts/runtime-final-native-24-acceptance-20261008.json,
catalogs/north-star/readiness.json (receipt values),
catalogs/us-equities/catalog-refresh-20261009.{json,md},
catalogs/us-equities/runtime-target.json#/final_native_acceptance.
Stale current claims left for the catalog assembler, as #873 routed catalog
reconciliation: runtime-target.json#/current_runtime and data-research.md:175.

Checks (python -B, scratch CPython 3.12.3 venv from .github/requirements-ci.txt
with --require-hashes):
- tests.test_trading_2604_lock tests.test_osv_lockfile_coverage
  tests.test_wsl_retrieval.RetiredRunnerTests: 78 tests, OK.
- 25 related modules (scheduled_trial, trading_2604_source_acceptance,
  runtime_directory_identity, install_claude_profile, final_stack,
  receipt_sha256_key_custody, frozen_evidence_reporting, adaptive_paper_*,
  lane_b_r3_*, local_pages_*, trading_gates_bindings and others reading the
  changed files): 814 tests: 727 pass, 86 skipped,
  1 failure. The failure,
  test_gitleaks_config...test_repository_pre_commit_refuses_old_fixture_commit...,
  fails identically at base 14df31f with no change applied (its scratch-repo
  pre-commit hook run reports no "leaks found" on this host); it touches none
  of the changed files.
- Scratch probe of the installer's locked-project block only (no uv, sync,
  Docker or host path): an existing f451 lock is admitted and replaced with
  a1413f20 (rc 0); an unknown lock is refused with exit 73.
- scripts/evidence_manifest.py --check, scripts/validate.py,
  scripts/final_stack.py --check: pass. git diff --check: clean.
- osv-scanner 2.6.0 (sha256 ca69b3d3 verified), ordinary group as
  security-scan.yml builds it: 60 inputs, No issues found, rc 0.

No install-trading-2604.sh, accept-trading-2604.sh or scheduled_trial.sh run;
no host state, broker or paper contact. LIVE remains NO-GO.

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

Commit 1 moved examples/openhands-native-capabilities/requirements.lock to
aiohttp 3.14.4. The convergence record
evidence/artifacts/native-runtime-role-resolution-20260930/experiment.json
froze that lock's earlier bytes as frozen_inputs.sources[3] (sha256 16e1a44e...),
so hosted validate-shard-0 failed in `scripts/validate_convergence.py
--all-recorded` with "record.frozen_inputs.sources[3]: SHA-256 mismatch".

This follows ecea286 (#628), which kept the frozen inputs of the OmniRoute
records the same way. The lock's bytes at 30ab2e3 are retained, byte for byte,
as evidence/artifacts/aiohttp-3.14.4-relock-20261020/historical/examples/
openhands-native-capabilities/requirements.lock.source.txt. The record's single
reference now points there with its sha256 unchanged. The copy is listed as an
excluded evidence fixture in .github/osv-scanner-lockfiles.json, with its reason
and the record as evidence, like the f451 fixture in commit 2 (the repository's
pre-push registry test requires that listing). manifests/evidence.json refreshes
the record's and the inventory's entries and registers the retained copy. No
measurement, verdict or other field of the record changes.

Checks, run with python3 -B in a scratch CPython 3.12.3 venv built from
.github/requirements-ci.txt with --require-hashes:
- scripts/validate_convergence.py --all-recorded: 33 records, all valid;
- scripts/validate.py: passed (71 components, 12,328 hashed files, 243 receipts);
- scripts/evidence_manifest.py --check: passed (12,328 files);
- unittest of test_osv_lockfile_coverage (61 tests, OK after the listing),
  test_convergence_contract, test_evidence_manifest,
  test_osv_lockfile_coverage, test_receipt_sha256_key_custody,
  test_research_convergence_practice and test_sota_convergence: 271 tests, OK.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
…t as a manifest

At f662439 the required dependency-review check failed. GitHub's dependency
graph parsed the retained copy from commit 3, whose basename began with
"requirements" and ended in ".txt", as a pip manifest. It then reported its
aiohttp 3.14.3 as a newly added vulnerable dependency (GHSA-2g87-pp6c-29x5 and
GHSA-5wr8-gcqf-gqf3, high). The copy is an evidence fixture, not an install
input.

The copy is renamed to .../historical/examples/openhands-native-capabilities/
pinned-at-30ab2e3a.source.txt. Its bytes are unchanged (sha256 16e1a44e...). Like
ecea286's worker.py.lock.source.txt, the name matches no lockfile or manifest
pattern. The record's single reference moves with it.

Because the new name is not a lockfile candidate, tests.test_osv_lockfile_coverage
refuses an exclusion for it ("is excluded but is not a tracked lockfile"). The
exclusion commit 3 added is therefore removed, and .github/osv-scanner-lockfiles.json
is byte-identical to 3449e04 again. manifests/evidence.json unregisters the old
path, registers the new one, and refreshes the record's and the inventory's
entries. No dependency-review allowance or OSV ignore is added.

Checks on this head, run with python3 -B in a scratch CPython 3.12.3 venv built
from .github/requirements-ci.txt with --require-hashes:
- scripts/validate_convergence.py --all-recorded: 33 records, all valid;
- scripts/validate.py: passed (71 components, 12,328 hashed files, 243 receipts);
- scripts/evidence_manifest.py --check: passed;
- unittest of test_osv_lockfile_coverage, test_convergence_contract,
  test_evidence_manifest, test_receipt_sha256_key_custody,
  test_research_convergence_practice and test_sota_convergence: OK.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@seathatflowsinourveins seathatflowsinourveins added the lane:shared Touches files owned by both lanes; needs both lanes' acknowledgement label Oct 20, 2026
@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Trading lane acknowledgement (lane:shared; relayed verbatim by the coordinator, lapo, because the trading lane's session has no GitHub access).

Source: NativeHorizonNY2 ~/nhny2-evidence/STATUS.md:392 (line sha256 812343dd…), written after 2026-10-20 07:06 ET:

TRADING LANE ACK NAS #1265 | head a6cb6b8 | The trading lane acknowledges #1265 at a6cb6b8 for merge: its trading-path changes, read in full against 30ab2e3, re-pin the trading-2604 runtime lock to aiohttp 3.14.4 (a1413f20, the aiohttp entry only) and move that lock's hash bindings without transferring the f451 acceptance, as the trading plan's C35 closing (b) requires, and the plan's own post-merge review, re-install and acceptance (J8, B8, B5, B6, R7) still follow.

🤖 Generated with Claude Code

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Foundation lane acknowledgement (lane:shared; coordinator lapo, for the foundation lane).

The foundation-path changes are acknowledged for merge at head a6cb6b8645a4657a6fd4d8c7e1f489f3be5cacb8:

  • blueprints/memory-stack/native-qualification/uv.lock;
  • the OpenHands worker requirements.lock and pins.json;
  • examples/openhands-native-capabilities/requirements.lock;
  • the retained frozen-input copy and its record's repoint (commits 3 and 4);
  • .github/osv-scanner-lockfiles.json and manifests/evidence.json.

Both families accepted this exact head:

  • Claude: claude-review b4904b25 and claude-review-delta-a6cb6b86 d0f84916;
  • GPT: gpt-review 83a111ec, gpt-review-delta-f662439c 89377489 and gpt-review-delta-a6cb6b86 d53d295b.

All 7 required checks pass (run 39408728558, attempt 3).

🤖 Generated with Claude Code

The native Codex review of a6cb6b8 (P2) and the GPT review's L2 asked for a committed regression
test of the migration input that commit 2 added to install-trading-2604.sh: an install still at
the October 8 published lock f451ef97 must be admitted and moved to the current lock, never
accepted as current. All 13 lock and vector tests passed with that admission removed.

tests/test_trading_2604_migration.py runs only the installer's hash definitions and its
step=locked-project admission and copy block, verbatim, against a temporary project (no uv, sync,
network or host-runtime command), and checks:
- the retained fixture is byte-for-byte the published lock the installer names;
- the published lock is admitted and replaced by the current lock;
- the current lock passes unchanged;
- an unknown lock is refused with exit 73 and left in place;
- with the published admission line removed (the reviewer's mutant), the published lock is refused.

It is a new module: tests/test_trading_2604_lock.py is hash-bound by the 2026-10-08 record
evidence/artifacts/runtime-final-lock-binding-20261008/legacy-migration-source-repair.json and stays
unchanged.

Checks: the new module, test_trading_2604_lock, test_scheduled_trial and test_osv_lockfile_coverage
pass; scripts/validate.py passes.

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

Copy link
Copy Markdown
Collaborator Author

Foundation lane acknowledgement, updated for the final head (lane:shared; coordinator lapo, for the foundation lane).

The foundation lane acknowledges #1265 at head 48453d9084f8ace99f2aa5851fd9c04fa83f702a. Commit 5 adds only tests/test_trading_2604_migration.py, the regression test of the installer's published-f451 admission that the native Codex review (P2) and the GPT family's L2 asked for.

Reviews at this head:

  • Claude: claude-review-delta-48453d90, 010f814f;
  • GPT: gpt-review-delta-48453d90, 1ae54172;
  • the native Codex review: patch is correct, 0 findings.

All 7 required checks pass.

🤖 Generated with Claude Code

@seathatflowsinourveins

Copy link
Copy Markdown
Collaborator Author

Trading lane acknowledgement, final head (lane:shared; relayed verbatim by the coordinator, lapo).

Source: NativeHorizonNY2 ~/nhny2-evidence/STATUS.md:395 (line sha256 5d0ccbba…):

TRADING LANE ACK NAS #1265 | head 48453d9 | The trading lane's acknowledgement of a6cb6b8 (STATUS.md:392) extends to 48453d9: commit 5 adds only tests/test_trading_2604_migration.py, a scratch-only test of the installer's f451 migration admission, and changes no trading path, so the PR's trading-path changes are still the aiohttp 3.14.4 re-pin (a1413f20) and that lock's hash bindings that C35 closing (b) requires, with J8, B8, B5, B6 and R7 still to follow after the merge.

🤖 Generated with Claude Code

@seathatflowsinourveins
seathatflowsinourveins merged commit 151f1e4 into main Oct 20, 2026
34 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the deps/aiohttp-3.14.4 branch October 20, 2026 12:37
seathatflowsinourveins added a commit that referenced this pull request Oct 21, 2026
* Bump certifi to 2026.10.19 (GHSA-6q48-6c7w-9gw2)

GHSA-6q48-6c7w-9gw2 (published 2026-10-20 19:35Z): certifi >= 2019.03.09,
< 2026.10.19 bundles emSign ECC Root CA - G3, whose intermediates had
compromised keys. certifi 2026.10.19 drops that root and keeps the
unaffected emSign roots. #1262's required osv-scanner context fails on it
across every lock below.

Lock delta (certifi only, following #1265's method):
- certifi 2026.7.22 -> 2026.10.19 in every lock that pinned it: the
  adaptive-paper engine lock, the trading-2604 runtime uv.lock, the memory
  native-qualification uv.lock, the OpenHands worker lock and pins, the
  adoption SDK lock and constraints, portfolio-risk, catalyst-provenance,
  sim-crosscheck-hftbacktest, deepagents-omniroute,
  openhands-native-capabilities, mlx-smoke and the macOS e2e evidence lock.
- Hashes from PyPI's JSON for 2026.10.19, each file downloaded and checked:
  wheel 42d35340cc5b9ba78e818ddbff0c5b1c2b779de448a340fd1b989f5fa8670e1b,
  sdist 035c1e85572b141bf1c3a3eff0e33a8eb74917522f2559075ff8d2fea780a1ae.
  No other package line changes in any lock.
- adaptive-paper engine lock sha256
  645544edbd13e7ff2434d5459e981ec0a2506c944e30d47844b4f3c57f602db8 ->
  8e08849c3370b905b7993a75e2f356920d45cdba81d64709a71fa3ff6263cb2d.
- trading-2604 runtime lock a1413f20... -> 2df71327...; the published a1413f20
  becomes one more recorded migration input in install-trading-2604.sh, as
  #873 and #1265 did, never acceptance; accept-trading-2604.sh and
  adaptive-paper/scheduled_trial.sh require the new hash.

Bindings refreshed: .github/osv-scanner-lockfiles.json (per-lock sha256 and
the retained fixtures as excluded evidence), adaptive-paper/source-hashes.json
(scheduled_trial.sh, test_scheduled_trial.py), tests/test_scheduled_trial.py,
tests/test_trading_2604_migration.py, runtime-2604/README.md, the convergence
records' frozen inputs re-pointed to the retained copies,
catalogs/landscape/final-stack.json (sources hash of the trading-2604 lock
only), and manifests/evidence.json for every changed and added file.

Retained bytes: each pre-bump lock is kept byte-identical (git show
da55495) under evidence/artifacts/certifi-2026.10.19-repin-20261020/
historical/ as published-<hash>-<name>, an excluded evidence fixture in the
osv inventory (not an install input; the active lock is scanned), with
repin.json as the record.

Checks (python -B, scratch venv from .github/requirements-ci.txt with
--require-hashes):
- scripts/validate_convergence.py --all-recorded: 33 records, all valid;
- scripts/validate.py: passed;
- scripts/evidence_manifest.py --check: passed (12,342 files);
- scripts/final_stack.py --check: passed;
- unittest of test_trading_2604_lock, test_trading_2604_migration,
  test_scheduled_trial, test_osv_lockfile_coverage,
  test_receipt_sha256_key_custody, test_convergence_contract,
  test_evidence_manifest, test_research_convergence_practice and
  test_sota_convergence: 310 tests, OK;
- git diff --check: clean.
osv-scanner was not run locally (not installed); the required context runs it.

No install, accept or trial script was run; no host state, broker or paper
contact. LIVE remains NO-GO.

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

* Bind the SDK lock's certifi relock to its qualification (validate-shard-5)

The certifi bump changes adoption/sdk/requirements-linux-x86_64-py313.lock,
which tests/test_adoption_contract.py binds two ways: every non-SDK pin must
equal the supply-chain receipt's historical inventory (certifi 2026.7.22), and
the runtime-sdk-20261003 qualification receipt's lock_sha256 (3a17fa09) must
equal the current lock. Both failed at 1328f12, in
test_lock_matches_accepted_inventory_and_all_pins_have_hashes and
test_sdk_upgrade_keeps_independent_inventory_and_client_guards (validate-shard-5);
both pass at da55495. The ignore route does not apply: .github/osv-scanner.toml
allows an ignore only for unreachable code, and certifi's bundle is reachable
from any HTTPS client in this SDK environment.

The relock is recorded instead of silently re-baselined, in the shape of
IGNORE_ALLOWED_LOCKS in tests/test_osv_lockfile_coverage.py:
- SDK_SECURITY_RELOCKS names certifi 2026.7.22 -> 2026.10.19 and
  GHSA-6q48-6c7w-9gw2 (GHSA-6q48-6c7w-9gw2,
  first patched version 2026.10.19). The inventory guard applies exactly that
  move, and only from the inventory's own version.
- SDK_QUALIFIED_LOCK is the retained pre-bump lock (this PR's evidence
  fixture, byte-identical to da55495). When the receipt's lock_sha256 is not
  the current lock's, it must be that fixture's, and the current lock may
  differ from it only in the relocked blocks; the preamble and every other
  block must be byte-identical.
- The historical receipts stay unedited. A re-qualification of the SDK pair
  records the new lock and inventory and empties the table.

New regression test:
test_relocked_lock_differs_from_the_qualified_lock_only_in_recorded_relocks.
It keeps every version, changes one charset-normalizer hash in the current
lock and then in the qualified fixture, and requires the two new guards to
refuse each. The existing duckdb and openai-codex-cli-bin drift cases still
fail on their own guards. manifests/evidence.json carries the test file's new
hash.

Local, in a requirements-ci venv:
- tests.test_adoption_contract, test_osv_lockfile_coverage and
  test_evidence_manifest: 80 tests, OK;
- scripts/validate.py: rc 0; evidence_manifest --check: passed (12,342 files);
  final_stack --check: passed; git diff --check: clean.

validate_shards.py run --shard 5 --shards 8 at 1328f12 also failed locally in
test_adoption_launchd and test_codex_job_lane_hardening. Those failures come
from the checkout location: mise installs [email protected] there, and GitHub's
attestation API refused it with a 403 rate limit. In clean worktrees of
1328f12 and of da55495, the same three modules give the same result (1
pre-existing error, test_claude_usage_sampler). test_runtime_boot needs PyYAML,
which this venv lacks, on both commits.

No install, accept or trial script was run; no host state, broker or paper
contact. LIVE remains NO-GO.

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

* Bind the SDK relock to repin.json, reproduce the mlx lock, restore three modes

Both families' checks of 1328f12 (AMEND, agreed):

1. HIGH (Claude D1, GPT P2a): the adoption SDK lock contract.
   The contract now admits exactly the move evidence/artifacts/
   certifi-2026.10.19-repin-20261020/repin.json records for
   adoption/sdk/requirements-linux-x86_64-py313.lock:
   - certifi 2026.7.22 -> 2026.10.19, GHSA-6q48-6c7w-9gw2;
   - prior 3a17fa09... (the retained qualified lock, which the
     runtime-sdk-20261003 receipt names) -> current 9ee41e37....
   It also requires the record's "Prior native acceptance does not
   transfer". The dated receipts (the 09-19 supply-chain inventory and the
   10-03 SDK qualification) are unedited. The inventory guard and the
   client mutation guard both stay (the duckdb and openai-codex-cli-bin
   cases). The regression test
   test_relocked_lock_differs_from_the_qualified_lock_only_in_recorded_relocks
   now refuses four version-preserving mutations, each by its own guard:
   a lock hash, a qualified-fixture hash, the record's current sha256 and
   the record's no-transfer sentence.

2. GPT P2b: tools/mlx-smoke/requirements.lock.txt did not reproduce under
   hardware-profile-smoke.yml's --exclude-newer 2026-09-23T00:00:00Z.
   The step adds --exclude-newer-package certifi=2026-10-20T02:30:00Z. That
   is uv 0.12.17's own per-package override (crates/uv-cli/src/lib.rs:
   7158-7177, PACKAGE=DATE, flattened into pip compile through
   ResolverArgs:7486 and PipCompileArgs:1642, at tag 0.12.17). certifi
   2026.10.19's files reached PyPI at 2026-10-20T02:24:15Z and 02:24:16Z,
   and no later release exists. Every other pin keeps the original cutoff.
   Reproduced locally with the pinned uv 0.12.17 (x86_64 release archive,
   sha256 fa82fd8d..., equal to its published .sha256) and the step's exact
   arguments: diff -u against the committed lock is empty.

3. MEDIUM (Claude D2, GPT P3): mode 100755 restored on
   adaptive-paper/scheduled_trial.sh, runtime-2604/accept-trading-2604.sh
   and runtime-2604/install-trading-2604.sh, with no content change (blobs
   afe6305, ed1b600 and 412c571, unchanged).

manifests/evidence.json carries the new hashes of the test and the
workflow. No lock byte changes; the engine lock stays 8e08849c.

Local, in a requirements-ci venv:
- scripts/validate.py: rc 0;
- evidence_manifest --check: passed (12,342 files);
- final_stack --check: passed;
- validate_convergence --all-recorded: 33 records valid;
- test_adoption_contract, test_osv_lockfile_coverage, test_evidence_manifest,
  test_workflow_hardening, test_workflow_security_coverage,
  test_scheduled_trial and test_trading_2604_migration: 234 tests, OK
  (13 skipped);
- git diff --check: clean.
Shard 5 (validate_shards.py run --shard 5 --shards 8) at 710733d, in a
clean worktree: 2,304 tests, 0 failures. Its 2 errors are local only and
the same on da55495: test_claude_usage_sampler, and test_runtime_boot,
which needs PyYAML.

No install, accept or trial script was run; no host state, broker or paper
contact. LIVE remains NO-GO.

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

* Pin Pillow 13.0.0 on reviewed certifi 2026.10.19 head

Stack the five native Pillow relocks on #1266 accepted head eb898b5,
carrying its reviewed certifi pins unchanged. Only Pillow package entries
move. Preserve exactly the two reviewed trading certifi timestamp strings
under the wave builder decision; both pinned uv versions accept the lock
offline.

Reproduce the worker certifi export byte for byte before reapplying the
unchanged scratch-only Pillow override, rule-6 turn-back and F18 scope.
Retain each accepted intermediate input once; reuse #1266 reviewed history
and relocate only frozen receipt paths, never their digests or acceptance.
Refresh all live binders and add real predecessor-admission regression.

Checks: 901 tests, 873 pass and 28 optional skips; publication validation,
all 33 convergence records, evidence manifest, final-stack, trading gates,
shell syntax and whitespace pass. Local osv-scanner is unavailable; normal
exact-head hosted checks and both-family reviews remain required.

Sources and compatibility evidence: evidence/artifacts/
pillow-13-repin-20261020/RESEARCH.md and worker research.md, 2026-10-21.
No destination-host, image, grader, model, broker or paper acceptance.

---------

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:shared Touches files owned by both lanes; needs both lanes' acknowledgement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant