Skip to content

chore: refresh dependencies and AWS workload runtimes - #240

Merged
Atom-oh merged 16 commits into
devfrom
chore/runtime-refresh-split-20261106
Nov 6, 2026
Merged

Atom-oh merged 16 commits into
devfrom
chore/runtime-refresh-split-20261106

Conversation

@Atom-oh

@Atom-oh Atom-oh commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

Summary

Split out of #227 so the runtime refresh can merge and deploy on its own; the six-pillar discovery diagnosis and trace observation work stays in #227 and will be re-reviewed on top of this.

  • Web: Next.js 16.4.5, React 19.3.1, Node 26.13.0; request body guard moves to the Next.js proxy.ts convention (merge invariants follow it).
  • Python: refreshed dependencies (pg8000 1.31.6 everywhere — fixes the scramp channel-binding failure seen on the dev Fargate worker), Python 3.14 Lambda/container runtimes, strands 1.63.0 (cache-config contract re-verified).
  • Terraform 1.17.1 and provider lock refresh.
  • Docs-site and architecture references refreshed (chore: refresh documentation site and architecture references for the runtime refresh #233).
  • Review fixes carried from feat: six-pillar discovery diagnosis and trace instance observations #227: web/proxy counts as review-sensitive, Next.js 16 / Python 3.14 docs are consistent, merge-verification step 9 is reproducible, Merge Verify runs the web typecheck (test files type-check again), the edge runtime cites the AWS Lambda@Edge runtime page, and gateway tool schemas are checked against the AgentCore SchemaDefinition keys.

Test plan

  • cd web && npx tsc --noEmit -p . (0 errors) and npx vitest run (5533 passed)
  • terraform test with Terraform 1.17.1 (51 passed)
  • workers 1736, agent/lambda 951, steampipe 256, agent 103, agentcore 94, PR-review batches 20 passed

🤖 Generated with Claude Code

Atom-oh and others added 15 commits November 4, 2026 14:26
* chore: refresh Python dependencies and Lambda runtimes

* chore: refresh Terraform CLI and provider locks (#229)

* chore: refresh Terraform CLI and provider locks

* chore: refresh documentation site and runtime references (#230)
- Move the refresh bullet to [Unreleased] (EN/KO) and restore the released
  0.10.1 Next.js 15.5.25 security-update entry.
- Document that tests/run-all.sh and the agent readiness command now need
  agent/requirements.txt for agent/tests/test_runtime_dependencies.py
  (CLAUDE.md, tests/CLAUDE.md, AGENTS.md files re-synced).
- Update verification/runbook prerequisites to Node 26, Terraform 1.17.1
  and pg8000 1.31.6; Lambda@Edge docs now say python3.14 (all locales).
  Historical Terraform v1.15.7 source citations are left as citations.
- terraform-test.sh reports tracked paths it skips; refresh the 1.15.7
  state fixture; add Next.js 16's bfcacheId to a router test mock.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…p PR

Keeps this PR's review input inside the 128 KiB admission bound. The
docs-site dependency/Mermaid refresh, its Node 26 guide workflow, and the
docs/architecture.md and docs/reference/* refresh move unchanged to the
follow-up branch chore/docs-runtime-refresh-20261105, which merges after
this PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ollow-up

Keeps this PR's review input inside the 128 KiB admission bound; the
unchanged README.md and docs/runbooks/dev-repo-setup.md updates move to
chore/docs-runtime-refresh-20261105 (#233), which merges after this PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- Add an installed-SDK contract for anthropic 2.4.0 used by the dark
  Anthropic loop (constructor, messages.stream parameters, lazy stream
  manager); verified to fail on a parameter mismatch.
- Keep the guide deploy workflow on Node 26 in this PR (the current
  docs-site builds on Node 26 for all four locales); the docs-site
  dependency refresh stays in #233.
- Scope the CHANGELOG bullet to this PR (no docs-site dependency claim).
- Makefile prerequisite comment: Terraform >= 1.17.1.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ites

- terraform-test.sh: restore the base copy pipeline, which fails when a
  tracked path is missing from the working tree, instead of skipping it.
- docs/runbooks/dev-repo-setup.md: Node 26 / Terraform 1.17.1 offline
  prerequisites move back into this PR.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Resolves the generated AGENTS.md marker conflicts by re-syncing them from
the merged CLAUDE.md files, and moves the new connector-target-sync
Lambda to python3.14 like every other Lambda in this refresh.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This refresh moves the Lambdas and containers to Python 3.14 while the
existing CI ran only on 3.12. Merge Verify now ends with a Python 3.14
lane: a fresh venv with agent, test and worker requirements runs the agent
suite, agent/lambda and scripts/v2/workers pytest. Locally on Python
3.14.6 the same commands pass (168 agent, 2,687 Lambda/worker tests).
docs/v2-merge-verification.md lists the step; prerequisite notes are
shortened.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… runtime refresh (#233)

* chore: refresh documentation site and architecture references

Re-applies the docs-site dependency/Mermaid refresh, the Node 26 guide
workflow and the docs/architecture.md and docs/reference/* updates that
were split out of #227 to keep its review input inside the 128 KiB bound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: carry README and dev-repo-setup toolchain updates split out of #227

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* docs: record the documentation-site dependency refresh in the changelog bullet

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Takes #236's version-neutral README prerequisites, which point at the
exact Terraform pin and the CI node-version this refresh updates. The
Python 3.14 lane now runs merge-verify's isolated pytest stage for the
agent, workers, incident, remediation, Steampipe and AgentCore code with
one combined requirements install.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Carries the refresh-only review fixes from #227 (web/proxy review sensitivity,
Next.js 16 and Python 3.14 docs, merge-verification step 9 and web typecheck,
edge runtime citation, agent cache-config re-verification, gateway schema key
check) without the six-pillar diagnosis feature, which stays in #227.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions

github-actions Bot commented Nov 6, 2026 •

Copy link
Copy Markdown

🤖 AI Code Review (two independent reviewers)

Reviewer responses: batch 1/3: codex/ALL claude/ALL; batch 2/3: codex/ALL claude/ALL; batch 3/3: codex/ALL claude/ALL

Status: PASSED — No blocking issues found

Reviewed in 3 complete batches split at file boundaries; every batch must pass.

Batch 1/3 — PASS

Summary

Batch 1 of PR #240 is a coordinated runtime/dependency refresh: Python 3.14 across all 34 Terraform Lambda runtime/layer declarations, Terraform 1.17.1, Node 26 in workflows, exact-pinned agent/worker requirements with a new shared agent/requirements-runtime.txt, a hardened MCP no-redirect factory with contract tests, and the web/middleware.ts → web/proxy.ts rename. I verified the panels' two MAJOR candidates directly: the Lambda@Edge python3.14 concern is not a defect (current CloudFront docs state Lambda@Edge supports the latest Python runtimes, deferring to the Lambda list where python3.14 is GA with a Jun 2029 deprecation date — the PR's new comment is accurate), and the proxy rename's Next.js 16 dependency is an unverified cross-batch dependency plausibly provided by listed paths (web/package.json, web/package-lock.json, web/lib/merge-invariants.ts), to be confirmed in the batch that contains them. No confirmed CRITICAL/MAJOR remains in this batch.

Issues per lens

L2 — Code correctness

  • MINOR (one model flagged; verified in diff) — scripts/v2/agentcore/catalog_check.py: _check_keys calls (node.get("properties") or {}).items() and recurses into items only when it's a dict. A future catalog entry with a list-valued properties or items raises AttributeError (a non-empty list is truthy, so the or {} guard doesn't help) instead of appending a readable error — the drift report becomes a traceback. It also runs before the existing isinstance(props, dict) guard. Current catalog passes (only the five allowed keys appear, per enumeration of all 30 slices), so this is future-proofing, not a live failure.
  • MINOR (one model flagged; verified against scripts/v2/merge-verify.sh in BASE) — the new Python 3.14 step in merge-verify.yml loops six roots, but merge-verify.sh runs the Node deployment-smoke suite and Terraform fmt/validate stages unconditionally, so those repeat 6× per run. Wasteful, not incorrect. The pip install in that step is pinned but unhashed — acceptable for a CI venv (the repo rule only forbids mixing unhashed requirements into the hash-locked image-requirements install), but a missing cp314 wheel (e.g. psycopg2-binary==2.9.13) would fall back to an sdist build on the runner.
  • MINOR (one model flagged) — agent/test_agent.py's stub restore is correct for today's suites (test_custom_mcp_policy.py binds test_agent.agent, and the cross-account tests now get real botocore), but agent.py still lazily imports mcp at call time (agent/agent.py:907), so a future test reaching _connect_clickhouse_stdio unpatched would load the real SDK where it previously got a stub. Latent, no current failure.
  • MINOR (one model flagged) — the new docstring in streamable_http_sigv4.py slightly overstates behavior: with max_redirects = 0 httpx raises TooManyRedirects rather than "returning the original redirect response" if a caller enables following. Either way no second request is issued, so the fail-closed guarantee holds; the new contract test also pins the private mcp.shared._httpx_utils.stream_within_origin symbol, which will break on an SDK-internal rename (acceptable for a pin test).
  • Verified clean: the ArchitectureFlow.tsx forEach→for…of block contains no return, the useCanvas.ts const conversions have no use-before-declaration, and new Uint8Array(bytes) in the download route is behavior-preserving.

Unverified cross-batch dependencies (named per the cross-batch rule, all plausibly provided): web/proxy.ts (export function proxy) is only loaded by Next.js ≥ 16 — on Next 15 the 2 MB body cap silently stops applying with no build error; the Next 16 bump lives in web/package.json/web/package-lock.json (listed). BASE web/lib/merge-invariants.ts:97-98 resolves web/middleware.ts with a fail-open existsSync guard, so the v1-path scan silently drops coverage unless the listed web/lib/merge-invariants.ts change repoints it to proxy.ts. The 413-cap regression tests presumably move via the listed web/lib/proxy.test.ts/web/lib/middleware.test.ts. The pg8000 1.31.6 layer rebuild trigger depends on the listed scripts/v2/ci/pg8000-requirements.txt/scripts/v2/ci_tf_assets.py. The batches containing those files must confirm them; per-route body caps (tighter than the middleware's 2 MB) remain regardless, so no authentication or ownership boundary rests on this file.

L3 — Security / AWS mutation safety

  • Dismissed MAJOR (one model flagged; chair verified against live AWS docs) — the claim that aws_lambda_function.edge moving to python3.14 may be rejected by Lambda@Edge is not supported: the CloudFront restrictions page the PR comment cites now says Lambda@Edge supports the latest Node.js and Python runtimes per the Lambda supported-runtimes table, and python3.14 is GA there (unlike python3.15/nodejs26.x, which are preview — neither is used as a Lambda runtime in this PR; Node 26 appears only as a CI tool version). No apply-failure trigger exists.
  • No ADR-005/IAM findings — both models agree. All Terraform hunks are runtime strings, required_version, and comments; no IAM statement, flag default, count gate, or mutation surface changes. Frozen gates (remediation_enabled, CUSTOM_MCP_ENABLED, CLICKHOUSE_OFFICIAL_MCP, ANTHROPIC_AGENT_LOOP_ENABLED) are untouched, and the new contract tests actively assert CLICKHOUSE_OFFICIAL_MCP is False and the readiness not_ready/disabled fail-closed path. The only credential-shaped literals are synthetic test values in subprocess env. The runtime sweep is complete: every python3.11/3.12 occurrence in BASE Terraform (34 across 10 files, including both pg8000 layers and all their consumers) is updated.
  • MINOR (one model flagged) — requirements-provision.txt drops one of urllib3==2.8.0's two hashes. Hash sets only shrink, so no supply-chain regression; but if the retained digest is the sdist's, the --require-hashes --only-binary=:all: installs in audit-deployment.yml/deploy-agentcore.yml fail loudly. Confirm the retained hash is the wheel digest.
  • MINOR (one model flagged) — the major SDK jumps (bedrock-agentcore 0.1.5→1.25.3, anthropic[bedrock] 0.111.0→2.4.0, strands-agents 1.48.0→1.63.0) are well-mitigated by the new tests/test_runtime_dependencies.py (SigV4 signing + real MCP session negotiation, redirect fail-closed for same-origin and external hops, readiness short-circuit, messages.stream surface), but the tests don't cover multi-chunk SSE delta framing on the live chat path. Positive: the exact pins in requirements-runtime.txt (including mcp==1.30.0 with a documented reason to defer MCP 2, and mcp-clickhouse==0.4.1 preserving the ADR-017 pin) close the unpinned-rebuild blind spot the old Dockerfile comment warned about, and max_redirects = 0 aligns the MCP transport with pinned_http.py's existing 3xx rejection.
  • The review_batches.py SENSITIVE_PREFIX update correctly keeps both web/middleware and web/proxy in batch 1 (anchored alternation verified).

L4 — Observability / data-integration correctness

  • MINOR (one model flagged; recursion verified sound against all 30 catalog slices including the two array-typed metrics params) — the new SchemaDefinition key check covers only TARGETS tool schemas, not MCP_SERVER_TARGETS, and doesn't catch two adjacent drift classes the gateway also rejects: required names absent from properties, and type: "array" without items. Cheap to add.
  • No Steampipe SQL, CIS control, or diagnosis logic changes in this batch; agent/agent.py changes only a provenance comment. Pinning boto3==1.43.123 in incident/remediation requirements (replacing >=1.34) improves rebuild reproducibility — agreed clean by both models.

L5 — Docs / ADR consistency

  • MINOR — both models flagged (strong agreement, verified in diff) — agent/AGENTS.md and agent/CLAUDE.md are edited by this PR yet still document the old three-file agent test command, omitting the newly mandatory tests/test_runtime_dependencies.py that root CLAUDE.md/AGENTS.md now require (and they already predate test_custom_mcp_policy.py). One-line fix in-scope. Related: agent/AGENTS.md's regeneration stamp (generated-at: 2026-11-04) predates root AGENTS.md's 2026-11-06 despite agent/CLAUDE.md changing in this PR, weakening the sync-context contract.
  • MINOR (one model flagged; chair-verified both .terraform.lock.hcl files are tracked and absent from every batch) — the CHANGELOG bullet claims "Terraform 1.17.1/provider locks" but no lock file changes anywhere in the PR. A core required_version bump needs no lock change, so narrow the wording or include the locks. Otherwise the CHANGELOG entry complies with repo rules (one net-behavior bullet, no PR/round numbers, English/Korean 1:1 — chair-verified the Korean bullet lands under the Korean [Unreleased] → ### Changed, not a released section).
  • MINOR (one model flagged; chair-verified) — stale middleware.ts references remain in comments this batch doesn't touch: web/app/api/compliance/run/route.ts:22, web/app/api/diagnosis/[id]/route.ts:94, web/app/api/route-auth.test.ts:6; and review_batches.py's _note() still says "middleware paths" though the regex now also covers web/proxy.
  • MINOR (one model flagged) — docs-site packaging nits: @docusaurus/faster@3.10.2 is installed but docusaurus.config.ts (unchanged in any batch) never enables future.experimental_faster, so it's inert weight; the new tinypool: "2.2.0" override is unscoped and overrides @docusaurus/core's ^1.0.2 range across a major — scope it under the intended dependent. The four-locale getting-started/auth.md rows keep a contradictory "CDK stub is Node.js 20" clause on the exact line this PR edits.
  • No ADR text pins any version this PR moves (verified by panel grep of docs/decisions/); ADR-007's no-redirect intent is strengthened and ADR-017's exact mcp-clickhouse pin is preserved with a documented rationale. Remaining stale 1.15.7/python3.12/Next.js 15 strings all live in files listed in other batches.

Suggestions

  1. Make catalog_check.py's _check_keys report (not crash on) non-dict properties/items, and extend it to MCP_SERVER_TARGETS, required-vs-properties consistency, and array-without-items.
  2. Update agent/CLAUDE.md and regenerate agent/AGENTS.md with the five-file agent test command and a current stamp (both files are already in this diff).
  3. Confirm the retained urllib3==2.8.0 hash is the py3-none-any wheel digest, or restore both hashes.
  4. In the batches holding them, explicitly confirm web/package.json pins Next.js ≥ 16 and web/lib/merge-invariants.ts repoints its scan from web/middleware.ts to web/proxy.ts (the BASE existsSync guard fail-opens).
  5. Add a py-only switch to merge-verify.sh (or gate stages 3–4) so the six-root 3.14 loop doesn't rerun the Node smoke and Terraform stages six times; prefer python3 inside the activated venv over the python3.14 binary name.
  6. Narrow the CHANGELOG "provider locks" phrase or include the .terraform.lock.hcl updates; scope the tinypool override; either enable @docusaurus/faster or drop it; fix the stale middleware.ts comments and the _note() wording.

IMAGE_COVERAGE: NOT_REQUIRED

Both panel cells declared IMAGE_COVERAGE: NOT_REQUIRED and the manifest lists no images, no deletions, and no unavailable/omitted entries, so no pixel evidence is required. All panel MAJORs were either dismissed against live documentation evidence (Lambda@Edge python3.14) or resolved to unverified cross-batch dependencies plausibly provided by listed paths, leaving no confirmed CRITICAL/MAJOR in this batch.

Batch 2/3 — PASS

I've verified the panel's key claims against the base checkout: validate_dependency_pins in scripts/v2/ci_tf_assets.py:52-68 does hard-fail unless all five pg8000== pins match (and base scripts/v2/incident/requirements.txt / scripts/v2/remediation/requirements.txt are still at 1.31.5), and web/proxy.ts does not exist in BASE while web/middleware.ts does — both resolve to files listed as changed in batch 1. Final synthesis follows.


PR #240 — Chair review, batch 2/3 (dependency & runtime refresh: Node 26 / Next 16 / TS 6 / Vitest 5 / Terraform 1.17.1 / Python 3.14)

Summary

This batch is the web/scripts/docs half of a coordinated toolchain sweep: package manifests and Dockerfiles move to Node 26.13.0 / Next 16.4.5 / TypeScript 6 / Python 3.14, Terraform version references move 1.15.7 → 1.17.1, the Next 16 middleware.ts → proxy.ts rename is followed in tests/invariants/docs, and a new web typecheck merge-verify stage plus an AgentCore catalog-schema test are added. No AWS-mutation, IAM, or auth-logic change appears in this batch (the ci_verifier_sessions.py change is comment-only; I verified the allow(...) statements are untouched). The two gate-relevant items are cross-batch dependencies on files explicitly listed in batch 1 and are recorded as unverified dependencies for batch 1 to confirm, per the cross-batch rule.

Issues per lens

L2 — Code correctness

  • Unverified cross-batch dependency (would be MAJOR if absent) — one model (claude) flagged; chair verified the base half. scripts/v2/ci_tf_assets.py:52-68 (validate_dependency_pins, called from every layer build) raises ValueError("Layer pg8000 pins must match the CI dependency lock") unless the pg8000== pin is identical across five files. This batch moves three of them to 1.31.6; BASE still has pg8000==1.31.5 in scripts/v2/incident/requirements.txt:1 and scripts/v2/remediation/requirements.txt:1. Both files are listed as changed in batch 1, which plausibly provides the matching bump, so this does not gate batch 2 — but if batch 1 does not bump both to 1.31.6, the Terraform asset build (and the migration/terraform workflows that call it) fails on the next run. The same cross-batch confirmation applies to boto3==1.43.123: scripts/v2/requirements-test.txt's own comment declares a hash-lock pairing with agentcore/requirements-provision.txt (batch 1). Base boto3>=1.34 ranges in incident/remediation are compatible and not a conflict source.
  • MINOR (one model) — web/vitest.config.ts → .mts moves the file outside web/tsconfig.json's include globs (**/*.ts does not match .mts), so the new npm run typecheck never validates it. That matters because the same commit swaps esbuild: { jsx } for oxc: { jsx: { runtime: 'automatic' } }; a wrong key shape would be silently ignored by Vite, with JSX only kept working by the simultaneous jsx: react-jsx tsconfig flip. Add **/*.mts to include or keep the config as .ts.
  • MINOR (one model) — web/tsconfig.json flips jsx from preserve to react-jsx to satisfy the test transform. Next has historically forced preserve and rewrites the tsconfig it builds against; confirm Next 16 accepts react-jsx in tsconfig.build.json locally, or scope the setting to the test transform.
  • MINOR (one model) — blunt casts weaken assertions: web/lib/datasource-querygen.test.ts:119 (as never on the mocked Bedrock send result) and web/lib/agentcore.test.ts:178 (as unknown as ResolvedIntegration[] on a fixture missing required fields). Prefer complete fixtures/satisfies.
  • MINOR (one model) — scripts/v2/agentcore/test_catalog_schema.py: _nodes() raises AttributeError on a non-dict schema node instead of a readable assertion failure, and import catalog only resolves when run from its own directory (consistent with sibling suites, but fragile from repo root).
  • Verified no-ops / genuine fixes (both models implicitly agree — codex found no defects): the exact: true removals are behavior-neutral (string name matching is already exact), 1_000_000n → BigInt(1_000_000) and the regex rewrite are ES2017-target-safe equivalents, the params: Promise.resolve(...) fixture matches the route's await params, and new fixture fields (capped, traversed, directed, …) are required by base types. merge-verify.sh's new typecheck stage is wired correctly (flag, summary branch, exit condition) and its npm run typecheck target is added in this same batch.

L3 — Security / AWS mutation safety

  • Unverified cross-batch dependency (security-relevant; batch 1 must confirm) — one model flagged. The global 2 MB /api/* body cap (defense-in-depth above per-route readJsonBounded) lives in BASE web/middleware.ts:10-22. This batch renames its test (web/lib/proxy.test.ts importing { proxy } from '../proxy') and repoints web/lib/merge-invariants.ts:97-98 to web/proxy.ts, but the implementation file is in batch 1 (both web/middleware.ts and web/proxy.ts are listed there; the Next 16 convention rename). Batch 1's review must confirm web/proxy.ts exists at the project root, exports proxy, and preserves the method/content-length logic and matcher: ['/api/:path*']. This is not gated here — the control is not weakened by any batch-2 hunk, and a missing file would also fail vitest/typecheck loudly via the renamed test's import — but it stays a blocking question for batch 1. Nit: merge-invariants.ts's existsSync(proxy) ? [proxy] : [] silently degrades the v1-path-leak scan to zero findings on a wrong filename; assert existence instead.
  • No ADR-005 impact — both models agree. No mutating call path, IAM policy, assume-role, remediation, connector, or frozen-flag surface is touched; ci_verifier_sessions.py policy statements are byte-identical (comment-only change, chair-verified).
  • MINOR (one model) — ci_verifier_sessions.py:98 now justifies the s3:prefix ListBucket allowlist by behavior "read from the 1.15.7 source" while the toolchain moves to 1.17.1. Failure mode is fail-closed (denied listing, not an over-grant), so this is verification debt: re-confirm the S3-backend workspace-prefix listing behavior against 1.17.1.
  • MINOR (one model) — scripts/v2/steampipe/Dockerfile now installs from unhashed requirements.txt; direct pins are exact but transitives (scramp, asn1crypto) float at build time in the image holding the Aurora IAM-auth boot generator. scripts/CLAUDE.md explicitly places this container outside the Lambda lock/validator, so this is a hardening suggestion, not a rule violation. The CPython 3.14.10 tarball keeps its sha256 gate.
  • MINOR (one model) — jose ^5 → ^6 major bump on the auth path; the panel verified the only consumer (web/lib/auth.ts RS256 jwtVerify/createRemoteJWKSet) is v6-compatible and the algorithm pin is untouched. A login smoke test post-deploy is prudent.
  • Positive (one model): web/Dockerfile drops the || npm install off-lockfile fallback and pins node:26.13.0-alpine in both stages; engines bands added.

L4 — Observability / data-integration correctness

  • No defects found — both models agree. The new test_catalog_schema.py is a real provision-time guard (unsupported JSON-Schema keys are rejected by Gateway CreateTarget); the claude panel validated SCHEMA_KEYS is currently exact against base catalog.py. MINOR (one model): the test covers TARGETS only, not MCP_SERVER_TARGETS — defensible today (those presets carry no inputSchema) but worth a comment so a future preset doesn't silently escape.
  • Steampipe image bump leaves collection semantics untouched (plugin pin, AWS_CONFIG_FILE, RDS CA VERIFY_FULL, IAM-auth token path all unchanged; the COPY reorder preserves /app ownership assertions). Note: the pg8000-requirements.txt change alters filemd5(...), so an intentional Lambda-layer replacement will appear in the next plan; the new --python-version 3.14 pip flag is correctly paired with --target/--only-binary. One live inventory-sync smoke run is advisable after the boto3 1.34 → 1.43 jump.

L5 — Docs/ADR consistency

  • The 1.15.7 → 1.17.1 sweep is complete for every file in this batch (claude panel counted per-file; chair spot-checked), with the one deliberate survivor being the 1.15.7 source citation in runtime-verifier-sessions.md. web/CLAUDE.md/web/app/CLAUDE.md correctly document Next 16, proxy.ts, tsconfig.build.json, and next build --webpack. No ADR body carries a toolchain version; ADR-005/009/013 boundaries are untouched, so no ADR edit is owed. No CHANGELOG-rule violation appears in this batch (CHANGELOG.md itself is in another batch).
  • MINOR (one model) — the middleware.ts → proxy.ts rename leaves stale prose references in files changed by no batch (web/app/api/compliance/run/route.ts:22, its test, web/app/api/diagnosis/[id]/route.ts:94, web/app/api/route-auth.test.ts:6); these will survive the PR and mislead readers of the body-cap reasoning.
  • MINOR (one model) — scripts/v2/requirements-test.txt still says "(Python 3.12 in CI)" and docs/runbooks/deployment-audit.md keeps Python 3.12 while Node moves to 26; correct if the CI interpreter really stays 3.12 (merge-verify.yml is in batch 1 — confirm there), otherwise a half-sweep. Similarly, root CLAUDE.md's "no npm script wraps this; run directly" for tsc is now stale given the new typecheck script — root CLAUDE.md is listed in another batch and should be confirmed updated there.
  • MINOR (one model) — first-web-bootstrap.md states "Node.js 26" where the enforced band is >=26.13.0 <27; state the band so a Node 27 (or 26.0) host isn't read as compliant.

Suggestions

  1. In batch 1's review, explicitly confirm: (a) scripts/v2/incident/requirements.txt and scripts/v2/remediation/requirements.txt both move to pg8000==1.31.6; (b) agentcore/requirements-provision.txt matches boto3==1.43.123; (c) web/proxy.ts exists with the proxy export, intact 2 MB logic, and the /api/:path* matcher, and web/middleware.ts is removed.
  2. Add **/*.mts to web/tsconfig.json include (or keep vitest.config.ts) so the vitest config — including the new oxc key — is typechecked.
  3. Change merge-invariants.ts to fail when web/proxy.ts is missing rather than silently scanning zero files.
  4. Sweep the four stale "middleware.ts" prose references onto proxy.ts, and align the Node prerequisite wording with the engines band.
  5. Consider --require-hashes (or a documented trade-off comment) for the Steampipe container's pip install, mirroring the Lambda-layer lock.

Verdict

No confirmed CRITICAL/MAJOR exists within this batch's reviewed scope. Both potentially blocking items are dependencies on files explicitly listed in batch 1 (verified against BASE: the pin validator exists and would fail, and web/proxy.ts is absent from BASE but present in the PR's batch-1 file list); per the cross-batch rule they are recorded as unverified cross-batch dependencies for batch 1's gate, where the actual files are reviewable. Codex reported no findings in any lens; the claude panel's deeper findings were verified and adjudicated as above. The image manifest lists no images and no unavailable/omitted entries.

IMAGE_COVERAGE: NOT_REQUIRED

Batch 3/3 — PASS

All panel claims are now verified against BASE. Here is the chair synthesis.


Chair Review — PR #240, batch 3/3 (docs only)

Summary

This batch is a documentation-only version sweep (Terraform >= 1.15/1.15.7 → 1.17.1, Next.js 15 → 16, Lambda@Edge python3.12 → python3.14, Node 20 → 26) across docs/architecture.md, docs/onboarding.md, docs/reference/*, and docs/v2-merge-verification.md, plus a new CI step 9 describing a Python 3.14 re-run of the merge-verify suites. Both panels agree there is no code, IAM, mutation-path, or data-integration change in this batch; every new version number depends on backing changes (web/package.json, web/Dockerfile, terraform/foundation/backend.tf, terraform/foundation/auth.tf, scripts/v2/terraform-test.sh, .github/workflows/merge-verify.yml) that are all listed in the other batches, so they are tracked as unverified cross-batch dependencies rather than missing definitions. No finding survives at CRITICAL/MAJOR.

Issues per lens

L2 — Code correctness

No code in this batch; both models agree. Doc-vs-script accuracy checks against BASE:

  • MINOR (one model flagged — Claude; chair verified) — docs/v2-merge-verification.md step 9 omits that scripts/v2/merge-verify.sh Stage 3 (node --test scripts/v2/deployment-smoke.test.mjs, lines 59–62) is not gated by MERGE_VERIFY_PY_ROOT or MERGE_VERIFY_SKIP_WEB. Each of the six Python-3.14 invocations re-runs the deployment Node suite, which itself requires Node, PyYAML and Terraform 1.17.1 and never skips. An operator reproducing step 9 locally in a bare 3.14 virtualenv hits an unrelated Stage-3 failure. Verified against the base script. Documentation-clarity issue only.
  • MINOR (one model flagged — Claude) — step 9's six roots (scripts/v2/workers|incident|remediation|steampipe|agentcore) are subtrees of scripts/v2, already covered by the main 3.12 stage; the doc states the "interpreter-compat-only" intent only for the AgentCore root. Cosmetic.

L3 — Security / AWS mutation safety

Both models agree: no IAM widening, no mutation path, no credential, no frozen-flag change. The ADR-005 read-only invariants (generic /api/jobs restricted to noop, ownership-scoped report/compliance routes, SELECT-only guard wording) are carried through unchanged. All instruction-like text in the diff was treated as data.

  • MINOR, advisory (one model flagged — Claude) — the docs now claim the viewer-request authenticator awsops-v2-cognito-auth runs python3.14. The actual runtime bump is in terraform/foundation/auth.tf (batch 1, BASE shows python3.12). Lambda@Edge supports a narrower runtime set than regular Lambda; if python3.14 is not Lambda@Edge-eligible in us-east-1, the edge auth deploy fails. This is an availability/cross-batch verification note for batch 1, not a mutation-boundary violation here. The edge handler's stdlib-only imports survive the interpreter bump, so the "pure-python RS256, no extra deps" claim remains correct.

L4 — Observability / data-integration correctness

Both models agree: no Steampipe SQL, compliance-rule, collector or diagnosis logic changes. The ADR-021 quota-safety and ADR-004 16-key/9-gateway accounting are carried through EN and KO tables without drift.

  • MINOR, unverified cross-batch dependency (one model flagged — Claude) — the new claim that Python 3.14 is "the Lambda and worker container runtime" must match the Lambda/worker definitions in batch 1 (terraform/foundation/{steampipe,workers,incidents,remediation,sg-rules,secret-rotation,eks,ai}.tf, scripts/v2/{steampipe,workers}/Dockerfile); BASE shows python3.12 and ai.tf python3.11. If any of those stay behind, this doc misstates the sync path's interpreter.

L5 — Docs/ADR consistency

The sweep is internally coherent: EN and KO blocks updated symmetrically, all eight 1.15.7 occurrences in docs/v2-merge-verification.md updated, no ADR text in this tree asserts a toolchain version, so nothing contradicts ADR-023 or the invariant summaries.

  • Codex's MAJOR not adopted — codex claims node:26.13.0-alpine "is not published as of 2026-11-06", making onboarding impossible. This is an assertion about external registry state that cannot be verified from the repository, almost certainly reflects the model's training cutoff rather than evidence, and the other panel did not reproduce it. Node 26 is the April-2026 major and a 26.13.x patch by November 2026 is plausible. Additionally, the artifacts that actually pin the tag (web/Dockerfile, web/package.json) are in other batches — their reviewers see the real values. Recorded here as part of the MINOR cross-batch dependency below, not as a blocking finding in a docs batch.
  • MINOR, unverified cross-batch dependency (both models flagged) — every new number (Terraform 1.17.1, Next.js 16, Python 3.14, Node 26.13.x) depends on batch-1/2 files (backend.tf, bootstrap/main.tf, terraform-test.sh, auth.tf, web/package.json, web/Dockerfile, scripts/v2/ci/Dockerfile.migration, .github/workflows/merge-verify.yml). All are listed as changed in other batches, so nothing is missing; they must land matching these docs in the same PR.
  • MINOR (one model flagged — Claude; chair verified) — docs/onboarding.md:12 cites "package.json engines >=26.13.0 <27" without naming the file; BASE has an engines field only in docs-site/package.json (>=20.0). Name the source file (presumably web/package.json, changed in another batch).
  • MINOR (one model flagged — Claude; chair verified) — docs/reference/private-plan-transport.md updates line 191 to "Terraform test version (1.17.1)" but line 230 still cites hashicorp/terraform/blob/v1.15.7/...backend.go for the encrypt/boolAttr behavioral claim. Re-point after confirming the behavior in v1.17.1, or label it explicitly historical.
  • Codex's Korean-policy MINOR — disagreement, not adopted as a violation. Codex flagged the extended Korean sentence in docs/v2-merge-verification.md as violating the English-only rule. The repo rule says to preserve technical facts in existing bilingual bodies without adding parallel translations; the diff amends an existing Korean summary sentence in place to keep its facts (versions, the 3.14 rerun) accurate, and the new step 9 itself was authored in English only. This reads as permitted fact-preservation, not new parallel translation. Noted as a borderline style point only.

Suggestions

  1. In step 9 of docs/v2-merge-verification.md, state that the 3.14 re-runs still execute the deployment Node suite, so the 3.14 job/venv environment also needs Node 26 and Terraform 1.17.1 on PATH.
  2. In docs/onboarding.md, name the package.json the engines range comes from, and ensure docs-site/package.json engines / docs-site/README.md Node wording are reconciled in their batch.
  3. Re-point or annotate the v1.15.7 backend.go citation in docs/reference/private-plan-transport.md (and its sibling in docs/runbooks/runtime-verifier-sessions.md, other batch).
  4. For batch 1 reviewers: confirm python3.14 is Lambda@Edge-eligible in us-east-1 before relying on the auth.tf bump, and that every worker/collector Lambda actually moves to 3.14 as the docs now claim.

Verdict

No confirmed CRITICAL or MAJOR finding in this batch. Codex's sole MAJOR rests on unverifiable external-registry knowledge and is handled as a cross-batch dependency; all remaining findings are MINOR documentation-accuracy items. The image manifest is complete with zero staged, unavailable or omitted entries.

IMAGE_COVERAGE: NOT_REQUIRED


Triggered by commit bc3bfb9722152b90a15256ac47106a8bc65b0e8b · workflow: .github/workflows/pr-review.yml

…ode 26

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Atom-oh
Atom-oh merged commit 6761d95 into dev Nov 6, 2026
9 checks passed

This branch was previously deployed

1 inactive deployment
ci-review-auto — bc3bfb97 Deployed Nov 6, 2026 by Atom-oh via AI Code Review #923
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant