Skip to content

docs(trading): revise R3 census to 2018-2023 - #900

Merged
seathatflowsinourveins merged 5 commits into
mainfrom
codex/rnd-r1-r3-census-2018-20261008
Oct 9, 2026
Merged

seathatflowsinourveins merged 5 commits into
mainfrom
codex/rnd-r1-r3-census-2018-20261008

Conversation

@seathatflowsinourveins

@seathatflowsinourveins seathatflowsinourveins commented Oct 8, 2026 •

Copy link
Copy Markdown
Owner

Scope

The R3 descriptive census uses 2018-01-02 through 2023-12-29, 1,509 XNYS sessions. The dated amendment addresses source availability before any count was opened. The previous 2017–2023 window had 1,760 sessions; 2017 returns as R3-F1 only after verified coverage and a publication grant are qualified.

  • Full review scope: 19 changed files, +2,159 / -8 lines against base 9f7b38b23d15e47ceb6f68c6651b86088f621797: 15 new files containing the complete blueprints/us-equities/event-anchored-ranking/ protocol, inspection registry, R2 contracts, runtime context, ROW14 submission, verifier, README and three SHA256SUMS carriers, plus the existing classifier, resolver policy/test file and evidence registry. The reads cover the full protocol bytes and bound set, beyond the census amendment.
  • Supersession: docs(trading): revise R3 census to 2018-2023 #900 supersedes draft docs(trading): prepare R3 event-anchored ranking publication #867, “docs(trading): prepare R3 event-anchored ranking publication” (codex/ns2604-r3-publication-route-20261008, head ea2d60a9a8d012ef3e24bfe83b0686514c49f422, 2 route-only files), because docs(trading): revise R3 census to 2018-2023 #900 supplies the complete revised portable protocol and evidence bindings; keep docs(trading): prepare R3 event-anchored ranking publication #867 open until docs(trading): revise R3 census to 2018-2023 #900 lands, then close docs(trading): prepare R3 event-anchored ranking publication #867 with a pointer to docs(trading): revise R3 census to 2018-2023 #900.
  • Lane: lane:trading. Owned changes comprise the new blueprint packet, tools/sota-convergence/blind_checkout.py, citation-only edits in blueprints/runtime-workers/openhands/resolver/patch_policy.py and tests/test_runtime_worker_openhands_resolver.py, and their registrations through scripts/host_receipts.py:register_file.
  • F1: classify the five reviewed protocol rules/data strings by exact UTF-8 SHA256 in the existing sorted DATA_VALUE_SHA256 set. This resolves the blueprint classification failure and the pre-push failures it caused.
  • F2 / GPT P2: bind retained-evidence:research/layer15-build-r3-identity-20261008/R3-IDENTITY-JOIN-PLAN.md, SHA256 b25064aabc4ba363f1bbda05729874d44d39606bf1d2470c8978def21b59b56c, beside gate 3. Dated CIK/issuer/share-class/immutable-security joins, original-source inventory/exclusion accounting, and historical Nautilus engine acceptance are mandatory before both census and fit. The artifact remains PLAN, gate 3 remains OPEN, and gate 2 remains separately conditional on accepted dated listing-state evidence.
  • F3: ROW14 maps 19 bare hash-bound external references to their custodial IDs or repository paths at full pins. Historical references remain distinct from current same-named packet members; the R2 contracts retain their bytes.
  • The development fit remains 2022–2023, with rolling warmup back to July 2020 and original lifetime/AGE metadata. Formation, universe, labels, features, models, CV, metrics, costs, inspection policy and the fixed future grid retain the original scientific controls. The smaller descriptive grid loses 251 sessions (14.26%); lost events, sample size and power remain unknown.
  • Six original KZ input sources remain unresolved. The protocol records post-purchase continuity and delisted-underlying checks; purchase remains the owner's decision. The candidate remains NOT_RUN / INSUFFICIENT_EVIDENCE pending qualified inputs.
  • The micro adds the missing earlier R2 checkpoint locator and updates three explanatory source citations. Both designated micro reads must confirm that the Python delta is citation-only; the pre-cue tool and green CI remain required. The CC carries api-actions J8 on f082159c563b2bec3208727adbb5cadda60fdb0a for the unchanged executable code. Keep this PR draft; freeze and landing remain subject to the CC cue through 5f.

R3-F2 — OPEN before FREEZE

The api-actions J8 silent-failure review identifies verifier hardening owed on the freeze successor:

  • Reject and report a binding digest that is not lowercase 64-hex, rather than returning without an error (R3-VERIFY.py:46-47).
  • Require mandatory joins to resolve to the expected carrier/local member; an unresolved mandatory target must fail instead of becoming an external boundary (R3-VERIFY.py:53-57,86-92).
  • Require both .R3 and .R3B carriers and compare them, including the missing-carrier case (R3-VERIFY.py:41-43).
  • Reconcile the reported internal-binding total with unique bindings and return clear missing-file diagnostics in place of tracebacks.

Before FREEZE, the successor must close all five issues with tests of these error paths, a fresh J8 review and both designated reads. The CC's manual checks establish the current bundle's digest/join consistency; they do not close this hardening item. Source: J8 silent-failure findings and the CC disposition of 2026-10-09 about 01:20Z.

This micro retains R3-VERIFY.py byte-identical, SHA256 8d86e1d3cc517c549ad4f7b9dff660a50bc95cc3804822989b1d72086b9f5018. Its Python delta remains explanatory citations, alongside the single added locator and hash refresh. R3-F2 is open work for the freeze successor, not a completed change in this head.

SOTA sources

  • Protocol/versioning precedent at base9f7b38b2 and mover-early-entry: dated protocol amendments before outcomes, distinct draft and frozen acceptance commits.

  • gerrymanoim/exchange_calendars, installed pin 4.13.2, ExchangeCalendar.sessions_in_range: native XNYS grid counts. Session counts do not establish independent events or power.

  • python/cpython v3.12.3 json and hashlib: primitives for the retained R3-VERIFY.py metadata-binding glue and exact-value digests. The existing classifier supplies the reviewed digest classification mechanism; its behavior is checked by the repository's named test modules.

  • Primary FirstRate options FAQ and licence, read 2026-10-08, plus retained sample SHA256 b3a5932d26dd4d7860a6534f7dde5a1e489dc0b22c8eddb0fbdbdf8ddf1d7f7a: coverage/date ambiguity and ticker-only identity require qualification. The publication clause does not establish adequate paid delivery.

  • Dated source-availability disposition task-ns2604-coop-20261008T223631Z, SHA256 5a2458c02430f45367df90a57f65d35885c8ddf633a09315c97dfae0b8615370; retained GPT read SHA256 faede0de6c80fb6cc58a51e6451fc773c397b6b323ee91c2131fe4e0ef48179d and Claude read SHA256 64e698ec37710924c108398f422329d36ef9f7a8d024da4cda6fee6522ff8795 identify the reviewed source material and required corrections.

  • Retained designated GPT delta read SHA256 a0012fc7c793268df8eeffe898dfb83255c43c676af0f3c299367d1e46b22757 identifies the missing earlier_checkpoint locator and the three shifted explanatory citations. The current source spans were checked directly; the scientific protocol and implementation bytes outside these citations are unchanged.

Validation and evidence limits

nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_blind_checkout
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_runtime_worker_openhands_resolver
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_pre_push_gate
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B scripts/validate.py
python3 -B blueprints/us-equities/event-anchored-ranking/R3-VERIFY.py
sha256sum --check SHA256SUMS
git diff --check

On micro head 4f12f44b8160c624c199985214cc06ec5a677782, the three named modules pass: 41 cases, 138 cases with one skip, and 16 cases, respectively. scripts/validate.py returns rc0 (70 components, 10,915 hashed files, 4 profiles, 239 receipts); R3-VERIFY.py passes 12 carrier members, 27 internal bindings and 9 semantic checks; native carrier verification and git diff --check return rc0. All four R2 contracts, logit operators, the verifier and both historical runtime receipts are byte-identical to the held candidate. Repository checks establish integrity and integration behavior; historical runtime receipts remain historical evidence. The bounded technical critique supplies neither designated R3 acceptance. CI and both designated micro-read results are tracked on this micro head.

No census count, study fit, market-data acquisition, vendor contact or broker operation was performed. Retained source context and actual command output remain with the custodian; licensed bytes and private host paths are excluded from this packet.

@seathatflowsinourveins seathatflowsinourveins added the lane:trading Trading lane: sim, paper and live north star label Oct 8, 2026
@seathatflowsinourveins
seathatflowsinourveins marked this pull request as ready for review October 9, 2026 01:36
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 9, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-09T01:43:53.024902Z 4f12f44 Draft marked ready
ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@seathatflowsinourveins
seathatflowsinourveins merged commit 36e36ea into main Oct 9, 2026
38 of 49 checks passed
@seathatflowsinourveins
seathatflowsinourveins deleted the codex/rnd-r1-r3-census-2018-20261008 branch October 9, 2026 01:39
seathatflowsinourveins added a commit that referenced this pull request Oct 9, 2026
### Scope

The R3 verifier must return a JSON diagnostic when file access or declared packet integrity fails. This freeze-preparation PR requires valid digests/current-packet joins/carriers, corrects repeated binding counts, and handles missing, malformed or inaccessible inputs. The successor additionally protects filesystem metadata probes and CLI root resolution from `OSError` tracebacks.

- Base commit: `06aca3df6c9ba0edea13719e4b7fb8169bba9838`, the corrected main target for this rebase. #900 landed at `36e36ea498e23ffd5bfc103035a2da883a6a08e4`. The reviewed predecessor of this micro-fix is `0a8589350f1a7b18823b231ef3ea81e865aaad79`; it includes the earlier `a3b8e60083c6e9f728bac9f2905b99c5304684db` corrections.
- Lane: `lane:trading`.
- Owned paths: the packet's verifier, README, ROW14 and three SHA256SUMS carriers; `tests/test_r3_verify.py`; and their evidence registrations.
- All17 current normative joins must resolve to the declared current carrier target. Missing fields/targets, external redirection and unexpected mandatory-container entries fail. Valid optional external evidence remains an unverified boundary; the two declared null PIT-04 inputs remain unaccepted placeholders.
- Both alternate carriers must equal `SHA256SUMS`. Nonregular inputs are rejected before opening. File reads, symlink/regular-file checks, optional-target probes and CLI root/default resolution catch `OSError` and return a named JSON error. Verification exits **0 on PASS, 1 on FAIL**.
- Protocol, registry, allfiveR2contracts and runtime receipts retain landed-base bytes. No external evidence source is opened. Keep the PR draft for both micro reads, CI, the remaining J8/PTA disposition and the CC's cue; this does not freeze or accept strategy/data/identity evidence.

The subsequent micro-fix adds direct tests for member bytes changed without resealing, a well-formed wrong ROW contract digest, and a join retargeted to another present member with its correct digest. JSON decoding now reports RecursionError and ValueError as named failures, and recursive traversal reports its own nesting-limit failure. Tests cover native deep JSON/large integers and deterministic decoder/traversal limits. The docstring and ROW source identify the actual `json.loads`/`hashlib.sha256` primitives, retain the CC-R3-1 lineage and local-only scope, and the unused `digest()` function is removed.

Rebase head `58ea680098d0833b5e75fe8829c5167113726112` preserves the seven PR file bytes from reviewed head `e13d1a3c1aa7676b79240fa03cd4afb892d9c4a6` and rebuilds `manifests/evidence.json` from corrected main plus the seven owned registrations. The intermediate unpublished rebase onto `2ecce6ec` was replaced before the one push. The rebase requires both designated micro reads on its delta, green CI on this head and the CC's cue.

Two further SFH disclosures:

- `assert_cli_failure` gains optional `interpreter_args=()`. Its subprocess argv is `[sys.executable, *interpreter_args, SCRIPT, ...]`; the empty default preserves the prior invocation. The huge-integer regression passes `-X int_max_str_digits=4300` to make the child interpreter's limit explicit.
- The verifier docstring and hash-bound ROW14 `verifier.source` replace the former CPython **v3.12.3** attribution (`json.load`/`hashlib.file_digest`) with **v3.13.16** (`json.loads`/`hashlib.sha256`). This is a source-attribution correction; no interpreter installation, runtime-lock change or historical receipt rewrite is performed.

### Explicit behavior and output changes

1. Symlinked **SHA256SUMS, SHA256SUMS.R3 and SHA256SUMS.R3B** are rejected, as are symlinked members. The former carrier handling followed symlinks.
2. A standalone field named **`sha256`**, without a path/artifact/pdf/receipt sibling, must be a **64-character lowercase hexadecimal string**. It is validated without becoming an internal join.
3. A value under a **manifest-named key** must be a valid hexadecimal digest string. Dictionary and list values there fail validation and are **not recursively walked**.
4. Every **`.json` carrier member must have an object root**, including optional members; array/scalar roots fail.
5. The JSON result adds **`internal_binding_count`** and **`binding_count_scope`**. **`internal_bindings` is deduplicated by source file and digest-pointer location**, giving 17 locations rather than 27 repeated checks for the current packet. **`manifest_sha256` can be null** when the canonical carrier/root cannot be read; **`semantic_checks` can be partial or empty** after an early failure. Those conditions accompany FAIL diagnostics and exit 1.

## SOTA sources

- [python/cpython v3.13.16 json](https://github.com/python/cpython/blob/v3.13.16/Lib/json/__init__.py) and [decoder](https://github.com/python/cpython/blob/v3.13.16/Lib/json/decoder.py): installed parser/JSONDecodeError and the native interpreter used for returned failure behavior.
- [CPython v3.13.16 pathlib](https://github.com/python/cpython/tree/v3.13.16/Lib/pathlib), [hashlib](https://github.com/python/cpython/blob/v3.13.16/Lib/hashlib.py), [re](https://github.com/python/cpython/tree/v3.13.16/Lib/re) and [unittest](https://github.com/python/cpython/tree/v3.13.16/Lib/unittest): filesystem predicates/reads, exact byte digests, whole-string validation and the native regression harness. The installed pathlib predicates may propagate PermissionError/ENAMETOOLONG; those operations now share protected diagnostic paths.
- [Published verifier at36e36ea4](https://github.com/seathatflowsinourveins/native-agent-stack/blob/36e36ea498e23ffd5bfc103035a2da883a6a08e4/blueprints/us-equities/event-anchored-ranking/R3-VERIFY.py), [protocol](https://github.com/seathatflowsinourveins/native-agent-stack/blob/36e36ea498e23ffd5bfc103035a2da883a6a08e4/blueprints/us-equities/event-anchored-ranking/protocol.draft.json) and [ROW14](https://github.com/seathatflowsinourveins/native-agent-stack/blob/36e36ea498e23ffd5bfc103035a2da883a6a08e4/blueprints/us-equities/event-anchored-ranking/ROW14-SUBMISSION-R3.json): reference integration and normative schema. Existing `scripts/host_receipts.py:register_file` refreshes the dependent hashes. No new dependency or runner is added.
- Designated GPT verdict SHA256 **406d3bee5bf70ad9617d6749c5206bcae30c7625c8ab683fae6f9b1e36ab53e2** and api-actions J8 silent-failure report SHA256 **3e63cf3b7621e1ae39edd756f12c592c329fa338d37dda08d78160b37d90d7f7** identify the reviewed failure paths and behavior/test gaps. This successor implements the released items; the PTA result and both micro verdicts remain separate.

- CC micro-read SHA256 **192c02a0ff10b34dc4cb18b78a5833b9217fe24965639f73aa26b24c03459084** and J8 test-analyzer rerun SHA256 **53459435782bb7a5428b1da4a85e437d76d6cb0bfb58c3d43f89a3dccf763271** identify the released F1/F2/F10/F6/P3 micro items. The prior 40-case verification remains predecessor evidence; the new head requires its delta read, J8 micro, CI and the CC cue.

- J8 micro report SHA256 **626fbe4ca7fe9071e803cf2313837cc0ae518e0da284af171262fb5b7533e2af**, section3: the two additional disclosures above. The report was hash-verified before use.

### Evidence-class table

| Claim | Evidence class | Command / receipt |
| --- | --- | --- |
| Filesystem metadata/read/root-resolution errors return JSON FAIL/exit 1 | synthetic / local_integration | Each probe is exercised with PermissionError and ENAMETOOLONG through the CLI entry; native256-character member/reference cases also run. The predecessor reproduced2failures/8errors. |
| New rejection branches and result shape | synthetic / local_integration | Symlink carriers/member, nonUTF8canonical carrier, malformed format/digest/path/duplicate manifest lines, standalone hashes, manifest-named dict/list and optional JSON-array cases. |
| Exact committed packet remains valid | local_integration | Regression calls `VERIFIER.verify(PACKET)` without resealing and executes the native CLI on that same packet, requiring PASS/exit0 and17uniquejoins. |
| Repository and registration consistency | local_integration | Named verifier/classification/pre-push/evidence-manifest modules, native carrier and `scripts/validate.py`; actual returned output retained. |
| Scientific protocol/contracts/gates retain bytes | source_review | Native byte comparison with landed base and reviewed predecessor; only verifier/docs/hash-source metadata and dependent integrity artifacts change. |

Fresh checks on the rebased committed head: `tests.test_r3_verify` **47/47**, `scripts/validate.py` rc0, native verifier PASS with **17 bindings** and nine semantic checks, and each of the three carriers **12/12OK**. The classifier41/pre-push16/evidence-manifest5 results below remain the retained predecessor runs; they were not rerun for this rebase. The PR packet/test bytes are unchanged, and CI acceptance remains pending on the new head.

### Local commands run

```sh
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_r3_verify
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_blind_checkout
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_pre_push_gate
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B -m unittest tests.test_evidence_manifest
nice -n 10 ionice -c2 -n7 timeout 600 python3 -B scripts/validate.py
python3 -B blueprints/us-equities/event-anchored-ranking/R3-VERIFY.py
sha256sum --check SHA256SUMS
git diff --check
```

Final verifier module:47cases; classification41, pre-push16 and evidence-manifest5. All returned rc0 on the implementation predecessor; the fresh rebase results are specified above. Validatorrc0; current verifierPASS,12members/17distinctbindings/9semanticchecks; nativecarrier12/12OK. Locally authored mutation/injection tests and exact-packet integration checks do not supply upstream scientific acceptance, either micro verdict or CI acceptance.

### Decision record

The packet README records the verifier error/count contract, numeric exits and evidence limits. The chosen approach extends the existing stdlib integration, preserving its scientific inputs. Fresh GPT/CC micro reads, CI, any J8 micro required by the PTA result and the CC's cue remain pending. #867 is closed with a pointer to landed #900.

No census count, fit, acquisition, vendor contact, purchase or broker action was performed. Sanitized returned command evidence remains with the custodian; private locators and protected study inputs are excluded from this PR.
seathatflowsinourveins added a commit that referenced this pull request Oct 9, 2026
…894)

### Scope

- What this PR changes, in one or two sentences: adds `claude-pr-review.yml`, an on-demand, read-only review of one same-repository pull request head by `anthropics/claude-code-action` v1.0.247. A maintainer dispatches it from `main` with the pull request number and the exact head commit; the review goes to the job summary and nothing is posted to the pull request. It runs only while the repository variable `CLAUDE_PR_REVIEW_ENABLED` is `true`, so merging this starts nothing.
- Effort (added 2026-10-08 at head a6d2379): `--effort max` in `claude_args`, because judgment work (designated reads, adjudication, pull request and security reviews, audits) runs at `max` under the command center's effort mapping, and every job records its level and reason. The level has to be in `claude_args`: `--restricted` ignores the settings files that would otherwise carry it, and Opus 5.5 runs at `medium` on the API when a request leaves effort unset. The bounds test now requires the flag; removing it fails the test. A loopback dry run of the installed 2.1.295 client with this workflow's `claude_args` sent `output_config.effort: "max"` on every request.
- Fixes from the pre-cue read of the sibling #892 (2026-10-09, head d6f8909): the record names every behaviour of this new workflow: the trigger; the slug, owner, first-attempt and variable guards; the timeout and grants; the guard and binding exits; the head-as-data checkout and diff limits; the explicit action inputs `display_report` and `track_progress` (defaults in the pinned `action.yml`); and the 14-day usage artifact. The bounds step now uses an allow-list, fails on a start record without lists or on an empty result, and names each unmet bound. The review cut is character-safe and says when it cut. The step tests no longer skip without PyYAML. The 2026-10-03 cooldown waiver is cited.
- Fixes from this PR's own pre-cue toolkit read (J8 on d6f8909, head 8e64120):
  - the empty paths array is now expanded safely on bash before 4.4;
  - a success without an execution file now fails the job;
  - `display_report` and `track_progress` are asserted;
  - the artifact name and the action-pin sentence are corrected, and the parity receipt's dependency on #892 is stated;
  - `claude-pr-review.yml:review` is now in both grant tables of ci-least-privilege;
  - the record states that a public run's summary is public.
- Pre-cue toolkit read of this PR (J8 on d6f8909, 2026-10-09; `pr-test-analyzer` and `silent-failure-hunter`): every finding at confidence 80 or above, and its status at head 41c9c15.

  | Finding | Status at 41c9c15 | Fixing commit and evidence |
  | --- | --- | --- |
  | `pr-test-analyzer` 1 (90): the record names the wrong artifact | fixed | 8e64120: the record names `claude-pr-review-usage-<run id>-<attempt>`, the upload's name; 41c9c15 adds `test_the_usage_artifact_is_named_for_the_run_and_its_attempt` |
  | `silent-failure-hunter` 2 (88): the record and the workflow disagree on the artifact | fixed | the same two commits |
  | `pr-test-analyzer` 2 (85): `docs/github-automation.md` claims the harness audit's action pin | fixed | 8e64120: the bullet says the two pins differ until #892 lands |
  | `silent-failure-hunter` 1 (92): the same false claim (pin and federation variables) | fixed | 8e64120, as above; the four federation variables are the same |
  | `pr-test-analyzer` 3 (85): the headline evidence file is not in this PR | fixed | 8e64120 states that #892 adds it and lands first; 41c9c15 cites its `LR` entry field by field |
  | `silent-failure-hunter` 3 (80): "#897" and "two blocking findings" have no source in that receipt | fixed | #892 adds `target_pull_request`, `target_head`, `report_blocking_findings` and `report_sha256` to the `LR` entry (a marked 2026-10-09 amendment from the run's harness receipt); 41c9c15 cites them, calls the verdict the model's own, and states that the prompt and `claude_args` are unchanged from the run's workflow commit a6d2379 to that head (R5 later raises the two caps and the prompt's turn sentence; see R5 below) |
- R4, debug logging set as a repository secret or variable (2026-10-09; the cc-native-practice lane's L3 read against `anthropics/claude-code-action` v1.0.247 practice): the guard binds `(secrets.ACTIONS_STEP_DEBUG || vars.ACTIONS_STEP_DEBUG) == 'true'` and `(secrets.ACTIONS_RUNNER_DEBUG || vars.ACTIONS_RUNNER_DEBUG) == 'true'` as booleans and refuses either before any token is requested; a test pins both bindings, and six weakened copies each fail at least one test. This is hardening: the action step already pins `ACTIONS_STEP_DEBUG: 'false'`, which is what the action's full-output switch reads. zizmor's auditor persona reports `secrets-outside-env` on the two reads; CI runs the regular persona with `--no-ignores`, which reports nothing. The R4 lines are byte-identical in #892, #894, #895, #896 and #909; R5 leaves them unchanged here.
- The report notice at the cap (2026-10-09; the J8 micro read of #892): the publish step wrote with `jq -r`, which adds a newline, so a 60,000-byte report was announced as cut. It writes with `jq -j` now; a test publishes exactly 60,000 and 60,001 bytes, and a copy that writes with `jq -r` fails it. R5 adds the 59,999-byte case.
- From the J8 micro read of 41c9c15 (2026-10-09; 4 of 6 listed findings fixed, PTA-3 and SFH-3 partly because the receipt the record cites was not in this tree): this PR now carries a byte-identical copy of `local-parity-receipt.json` (sha256 `ba498b82…`, the file #892 adds), so the citation no longer depends on which PR lands first, and the docs bullet states the action pin and the federation variables instead of comparing with the harness audit on `main`.
- R5 (2026-10-09, head d1bcb6c, limited by the command center to correctness and test quality) adds a model-free step, `Remove symbolic links from the pull request head`, right after the head checkout: `set -euo pipefail; find pr-head -path pr-head/.git -prune -o -type l -exec rm -f {} +`. It raises the approved caps from measurement: `--max-turns` 12→30 and `--max-budget-usd` 3→5. The prompt's "You have at most 30 turns", the numbers step's bounds (1 to 30 assistant turns, at most $5, with matching messages), the header comment and `docs/github-automation.md` follow. The numbers step now counts each non-string tool-list entry as a forbidden tool named `non-string tool entry` instead of dropping it. The R4 guard lines, the deny list and the `github_token` input are kept exactly as at a1bc3bc. The test module goes from 33 to 41 tests. Eight are new: the symlink step's position and exact text; its behaviour on planted links to `/proc/self/environ`, `../.git/config` and a subdirectory, plus a re-run on a link-free head; a 59,999-byte report published whole; object, null and number tool entries refused and named; the prompt stating the `--max-turns` value; and the caps at 30 turns and $5 and just above. Changed tests pin the full `claude_args` list and `--settings` JSON exactly, assert the exact `if:` strings of the publish and numbers steps, run the guard with production's debug-off values (false/false/empty), and check that the 59,999-byte prefix before a cut character survives. All 28 weakened copies of the workflow fail at least one test with PyYAML present, as the hosted validate job has it; without PyYAML 15 of 28 do, because the pins sit in the PyYAML-only shape tests. The decision record gains a dated R5 section and names the R4 guard change in its what-changed paragraph. It corrects "Read denies for every `.git` directory" to "for the files under every `.git` directory". It restates the cap derivation and the expected cost per run, and withdraws the dry $0.70–$1.30 estimate, which was below the measured first-read cost. It adds the shared follow-up line, the shared `origin` URL sentence and two action sources. `manifests/evidence.json` is rehashed for the four changed files.
  - Sources of the R5 items: the command center's security read of a1bc3bc (the symbolic links, the closed flag list, the exact `if:` strings, the guard's debug-off values, the 59,999-byte prefix, and the stale guard sentence in the record); the command center's caps decision of 2026-10-09; the GPT designated read of #895, P2 (non-string tool entries, applied to all five W4 workflows); the cc-native-practice lane's third audit, P3-1 (the shared `origin` URL sentence).
  - Caps derivation: `LR`, a first read of #897 with this workflow's prompt and `claude_args` on the installed client, used all 12 of its 12 assistant turns and cost $2.23 ($1.87 by the client's estimate). So the need is above 12, and 2.5 times that floor gives 30 turns; twice $2.23 is about $4.5, rounded up to $5. Four delta re-reads (LR2 to LR5) used 5, 6, 7 and 6 turns and cost $1.75, $1.35, $1.54 and $0.73. A run is expected to cost about $1.9 to $2.3 for a first read and $0.7 to $1.8 for a delta re-read.
  - Filed as follow-ups before any enabling variable is set, not in R5: the security hardening from the 2026-10-09 read (debug-value widening, the tool-list shape apart from the non-string entry above, extra deny rules, token-source and guard-step assertions); the rest of F-02 (a non-empty tool list, checking the `tool_use` names); F-16 (the pins that run only with PyYAML).
  - Not run in R5: a fence smoke with a planted symbolic link, which needs a model run; any hosted run. On the first run, watch whether the action appends an `--mcp-config` that `--strict-mcp-config` still honours (the read's G3); the numbers step fails the run on any MCP server.
- Base commit: `aba02ec3` (merge base at a1bc3bc and at d1bcb6c, which builds on a1bc3bc; as read at a1bc3bc, main had moved to `ebe6c223` with #890, #900, #897 and #907; only `manifests/evidence.json` overlaps, and the one rebase happens at landing)
- Lane: `lane:foundation`
- Owned paths touched: `.github/workflows/claude-pr-review.yml` (new), `tests/test_claude_pr_review_workflow.py` (new), `tests/test_workflow_policy.py` (one inventory entry, one exemption), `tests/test_workflow_security_coverage.py` (coverage set and one zizmor test), `docs/decisions/2026-10-08-claude-actions-pr-review.md` (new), `docs/decisions/2026-10-04-ci-least-privilege.md` (dated addendum only), `docs/github-automation.md` (current-practice bullet), `evidence/artifacts/claude-actions-fence-smoke-20261008/receipt.json` (new), `evidence/artifacts/claude-actions-fence-smoke-20261008/local-parity-receipt.json` (new; byte-identical to the copy #892 adds), `manifests/evidence.json` (registration, last commit).

### R6 (2026-10-09), at bd10ba3

- **Cost bound:** the budget × 1.10 = $5.50, from four measured J8 runs on a $5 budget ($5.46, $5.33, $5.16, $5.0007),
  re-derived after the first three hosted runs.
  - A budget stop at or under it publishes the text written before the stop, with a line naming the stop.
  - Publishing is gated on `!cancelled() && steps.numbers.outcome == 'success'`, because the action fails its own step on
    any budget stop.
- **`--max-turns 30` removed:** the pinned action (`base-action/src/run-claude-sdk.ts:241-250` at 2dca132f, since
  6ef6450f) fails a success whose `num_turns` exceeds it.
  - On Claude Code 2.1.295, `num_turns` counts transcript messages: 57 for 12 requests under `--max-turns 12`. That is a
    code reading plus a local measurement, not a hosted run.
  - The numbers step's 30-assistant-turn bound and the prompt's "at most 30 turns" stay.
- **Job timeout:** 20 → 30 minutes. 30 turns at the measured pace (12 turns in 512,670 ms) take about 21.4 minutes before
  setup. #892 uses 30.
- **Settings pins:** both compare canonical JSON, so `1` no longer passes for `true` (J8 R5 micro, N1, confidence 70).
- **Record:**
  - the shared cost paragraph;
  - an upstream-issue draft (not filed);
  - the seven changed test expectations the J8 R5 micro found undeclared (U1–U7).
- **Local checks at bd10ba3:**
  - `validate.py` and the manifest check pass (10,906 files);
  - six modules: 262 tests, OK;
  - this module: 44 tests (16 skip without PyYAML);
  - actionlint and zizmor are clean;
  - 39 of 39 weakened copies fail a test with PyYAML.
- **Hosted checks at bd10ba3:** not read yet.

### SOTA sources

- anthropics/claude-code-action, v1.0.247 at `2dca132ff0e0c4094ce6048b422c6915a071210b` (<https://github.com/anthropics/claude-code-action/tree/2dca132ff0e0c4094ce6048b422c6915a071210b>): `docs/security.md` ("Do not check out an untrusted ref into the workspace root before this action"; base ref at the root and head ref in a subdirectory), `docs/setup.md` (federation inputs; "a static credential takes precedence and federation will not be used"), `action.yml` (inputs and the `execution_file` output), `base-action/src/parse-sdk-options.ts` (argument parsing with `shell-quote`, default setting sources, debug forcing full output), `src/github/operations/git-config.ts` (git authentication in the root checkout; lines 129-134 write the job token into the checkout's `origin` URL when `allowed_non_write_users` is unset) and, new in R5, `src/modes/agent/index.ts` (lines 52-61, where agent mode calls that configuration). R5 read both files at v1.0.246 (`38c80c1`); the command center's compare of v1.0.246 and v1.0.247 changes only the bundled Claude Code version.
- Claude Code 2.1.295, the version the pin installs, `claude --help`: `--restricted` ("removes the built-in tools that run commands or code ... and ignores user, project and local settings files ... Also confines the file tools to the working directories"), `--permission-prompts none` ("anything that would prompt is denied automatically"), `--tools`, `--settings`, `--strict-mcp-config`, `--max-budget-usd` and, for the R5 caps, `--max-turns`. The help does not say whether a symbolic link's target is resolved, which is why R5 removes the links before the model runs.
- GNU findutils `find` 4.10.0 as installed (`find --version`), new in R5: `find pr-head -path pr-head/.git -prune -o -type l -exec rm -f {} +`, measured by the step test on planted links and on a link-free head (exit 0, no `rm` started). The runner image's `find` was not measured.
- GitHub, Contexts reference, `runner.debug` (set only while debug logging is on, so the guard's `RUNNER_DEBUG_SIGNAL` is empty on a normal run), new in R5 as the basis of the guard tests' debug-off values; taken from the command center's read of a1bc3bc, not re-read in R5 (no network).
- GitHub, OpenID Connect reference, "Filtering for pull_request events" and "Filtering for a specific branch" (<https://docs.github.com/en/actions/reference/security/oidc>); GitHub Security Lab, Preventing pwn requests (<https://securitylab.github.com/research/github-actions-preventing-pwn-requests/>).
- Anthropic documentation read 2026-10-08: Workload identity federation (<https://platform.claude.com/docs/en/manage-claude/workload-identity-federation>); How Claude Code uses prompt caching (<https://code.claude.com/docs/en/prompt-caching>); Pricing (<https://platform.claude.com/docs/en/about-claude/pricing>).

### Evidence-class table

| Claim | Evidence class | Command / receipt |
| --- | --- | --- |
| With the fence flags (`--restricted`, `--tools`/`--allowedTools` Read,Glob,Grep, `--strict-mcp-config`, `--permission-prompts none`, `--settings` with hooks off, `claudeMdExcludes` and three deny rules; Haiku 5.5, 10 turns, $0.50, as the receipt lists; this workflow adds `--setting-sources user`, `--add-dir`, `--effort max`, four deny rules and `blockReadsOutsideWorkingDirectories`, a key in the 2.1.295 build that the receipt does not exercise) the session's tools are Glob, Grep and Read; reads outside the tree and of `.git/config` are denied; planted hooks, instruction files and a skill under `pr-head` have no effect | `native_proven` on the installed 2.1.295 client (not through the action, not on a GitHub runner) | `evidence/artifacts/claude-actions-fence-smoke-20261008/receipt.json`, three runs |
| The action's own parser turns this workflow's `claude_args` into those flags and that JSON | `local_integration` (at a1bc3bc only) | the parser's three helpers replayed with `shell-quote` 1.10.0 on the workflow text at a1bc3bc; not re-run at d1bcb6c (no network to install `shell-quote`). R5 changes two plain values (`12` to `30`, `3` to `5`), and `test_claude_has_three_read_tools_and_fixed_bounds` asserts the whole list, split per line with `shlex`, and the `--settings` JSON |
| The guard, binding, symbolic-link, diff, numbers and review steps behave as described | `synthetic` | `tests/test_claude_pr_review_workflow.py`, 41 tests at d1bcb6c (the 26 step tests run without PyYAML too; the 15 shape tests need it); each step's shell is taken from the workflow file and executed against a local stand-in for `gh`, a local git repository or a planted `pr-head` tree |
| Symbolic links under `pr-head` are removed before the model runs, `pr-head/.git` is left as the checkout wrote it, and a link-free head passes | `synthetic` | `test_symbolic_links_in_the_head_are_removed_and_nothing_else` (links to `/proc/self/environ`, `../.git/config` and `../..`; GNU find 4.10.0); no fence smoke with a planted link has run on the client |
| The tests detect a weakened workflow | `synthetic` | 20 mutated copies on 2026-10-08 (that day's bounds), 20 failed at least one test; on 2026-10-09 three turn-bound mutants each failed, and the new bounds have their own tests; at 41c9c15 three artifact-name mutants each pass the 30 earlier tests and fail the new name test; at d1bcb6c 28 mutated copies (the symbolic-link step, the flag and settings pins, the `if:` strings, the guard's debug-off values, the report cap, the non-string tool entries, the caps and the prompt) each fail at least one test with PyYAML 6.0.3 present, as the hosted validate job has it; without PyYAML 15 of 28 do (the other 13 are pins in the shape tests; follow-up F-16) |
| This workflow's own prompt and `claude_args` review a real pull request within bounds at `--effort max` on Opus 5.5 | `local_integration` (installed client, billed to a second key; not through the action) | `evidence/artifacts/claude-actions-fence-smoke-20261008/local-parity-receipt.json`, carried byte-identical in this PR and in #892 (sha256 `ba498b82…`), its `LR` entry: workflow commit a6d2379, whose prompt and `claude_args` are unchanged at d1bcb6c apart from the two caps R5 raised (`--max-turns` 12 to 30, `--max-budget-usd` 3 to 5) and the prompt's turn sentence; #897 at `target_head` 24821c5; 12 of 12 assistant turns; $1.868667 of the then $3 budget; tools Glob/Grep/Read; no MCP; `success`; `report_blocking_findings: 2`, the report's own verdict line, unchecked (`report_sha256` c49bee04, a 2026-10-09 amendment) |
| The caps, 30 assistant turns and $5, bound a runaway at about twice the measured need; a run is expected to cost about $1.9 to $2.3 for a first read and $0.7 to $1.8 for a delta re-read | `local_integration` (installed 2.1.295 client, billed to the second key; not through the action) | the `LR` entry above (12 of 12 turns, client estimate $1.868667); the $2.23 figure and the delta re-reads LR2 to LR5 (5, 6, 7 and 6 turns; $1.75, $1.35, $1.54 and $0.73) come from the command center's caps decision of 2026-10-09 and are not in this repository |
| In agent mode the action writes the job token into the root checkout's `origin` URL, so `persist-credentials: false` does not keep it out of `.git/config`; the deny rules keep the model from reading it | `source_review` for the code path; the denial of `.git/config` reads is the fence receipt's (first row) | `src/github/operations/git-config.ts:129-134` and `src/modes/agent/index.ts:52-61`, read at v1.0.246 (`38c80c1`; the command center's compare shows only the bundled client version changing at v1.0.247); the record's shared sentence also cites two 2026-10-09 probes on the installed 2.1.295, not reproduced here |
| The workflow is well formed and has no audit finding | `local_integration` | at d1bcb6c: `actionlint` 1.17.0 exit 0; `zizmor` 1.30.1 offline, regular (`--no-ignores`) and pedantic, no findings (2 suppressed in each: `secrets-outside-env` on the R4 secret reads, as at a1bc3bc) |
| A hosted run authenticates, stays in bounds and reads the cache | not established | no hosted run is part of this PR |

### Local commands run

```
$ python3 scripts/validate.py            # on the R5 tree, committed as d1bcb6c
{"components": 70, "hashed_files": 10906, "profiles": 4, "receipts": 239, "status": "passed"}   exit 0
$ python3 scripts/evidence_manifest.py --check
{"files": 10906, "status": "passed"}   exit 0
$ uv run --quiet --no-project --python 3.12 --with pyyaml==6.0.3 python -m unittest tests.test_claude_pr_review_workflow tests.test_workflow_policy tests.test_workflow_security_coverage tests.test_workflow_hardening tests.test_github_automation_practice tests.test_adoption_docs_consistency
Ran 259 tests ... OK (skipped=2)   exit 0
$ uv run --quiet --no-project --python 3.12 python -m unittest tests.test_claude_pr_review_workflow    # without PyYAML
Ran 41 tests ... OK (skipped=15)   exit 0
$ actionlint .github/workflows/claude-pr-review.yml
exit 0
$ zizmor --offline --no-config --persona=pedantic .github/workflows/claude-pr-review.yml
No findings to report. Good job! (2 suppressed)   exit 0
$ zizmor --offline --no-config --no-ignores --persona regular .github/workflows/claude-pr-review.yml
No findings to report. Good job! (2 suppressed)   exit 0
$ uv run --quiet --no-project --python 3.12 --with pyyaml==6.0.3 python -B <scratchpad>/r5_pr894_mutants.py . a1bc3bc    # outside the repository
28 mutants, 28 caught, survivors: []   exit 0
$ uv run --quiet --no-project --python 3.12 python -B <scratchpad>/r5_pr894_mutants.py . a1bc3bc    # without PyYAML
28 mutants, 15 caught   exit 1 (expected: the 13 survivors are pins in the PyYAML-only shape tests; follow-up F-16)
```

Hosted checks at d1bcb6c: not read yet.

### Decision record

`docs/decisions/2026-10-08-claude-actions-pr-review.md` (why a manual dispatch and no pull request trigger, how the head is handled, the model's fence and what was checked at runtime, cost of one run with the measured runs and the cap derivation, changed test contracts, alternatives, what would overturn it), with a dated R5 section: the symbolic-link step, the caps from measurement, the non-string tool entries, the closed flag list and the boundary tests, the mutants, and the follow-ups. `docs/decisions/2026-10-04-ci-least-privilege.md` gets a dated addendum naming the second job on the federation rule.

### Host evidence

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

### Checklist

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

Activation is a separate step after landing: an owner sets `CLAUDE_PR_REVIEW_ENABLED` to `true`, then dispatches the workflow with a pull request number and head commit. Runs authenticate by workload identity federation and spend from the Console organization the four `ANTHROPIC_*` repository variables name; no Anthropic key is stored in GitHub. Each run is capped at 30 assistant turns and a $5 client budget, the owner's per-run spend limit on that organization. This PR and #892 both edit the write-grant inventory and the evidence manifest, so the second to land rebases once.

🤖 Generated with [Claude Code](https://claude.com/claude-code)
seathatflowsinourveins added a commit that referenced this pull request Oct 9, 2026
claude-pr-toolkit-review.yml runs pr-test-analyzer and
silent-failure-hunter from anthropics/claude-code's pr-review-toolkit
plugin on one pull request head, through claude-code-action v1.0.247.
Both agents list every behaviour and test change the description does
not declare, with a confidence on every finding. It is the command
center's J8 pre-cue step (W4 draft f), the same agents and settings that
found six undeclared changes in #892 and two verifier defects in #900.

The toolkit is checked out at anthropics/claude-code@602df92b, sparse to
its plugin directory, moved outside the workspace, verified file by file
against recorded SHA-256 values (git blob ids matched GitHub's at the
pin), and loaded with --plugin-dir; the action's plugins and
plugin_marketplaces inputs install unpinned code at run time and are
not used. Sonnet 5.5 at max effort; Read, Glob, Grep and the Agent tool;
CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0 so background agents are awaited;
a $5 budget; a review time limit of 20 or 35 minutes by diff size.

The bounds step counts the coordinator's own turns only, allows the
budget plus a $2 allowance for the agents' last requests, requires both
reports, uses an allow-list and names every unmet bound. Dispatch only,
owner only, first attempt only, gated by CLAUDE_PR_TOOLKIT_ENABLED; no
write scope beyond the OIDC token; nothing is posted to the pull request.

34 tests run the steps as written (without PyYAML too); eight weakened
copies each fail them; actionlint and zizmor (pedantic) report nothing.
openai/codex-action is recorded as WATCH with its pin and overturn
condition.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 9, 2026
claude-pr-toolkit-review.yml runs pr-test-analyzer and
silent-failure-hunter from anthropics/claude-code's pr-review-toolkit
plugin on one pull request head, through claude-code-action v1.0.247.
Both agents list every behaviour and test change the description does
not declare, with a confidence on every finding. It is the command
center's J8 pre-cue step (W4 draft f), the same agents and settings that
found six undeclared changes in #892 and two verifier defects in #900.

The toolkit is checked out at anthropics/claude-code@602df92b, sparse to
its plugin directory, moved outside the workspace, verified file by file
against recorded SHA-256 values (git blob ids matched GitHub's at the
pin), and loaded with --plugin-dir; the action's plugins and
plugin_marketplaces inputs install unpinned code at run time and are
not used. Sonnet 5.5 at max effort; Read, Glob, Grep and the Agent tool;
CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0 so background agents are awaited;
a $5 budget; a review time limit of 20 or 35 minutes by diff size.

The bounds step counts the coordinator's own turns only, allows the
budget plus a $2 allowance for the agents' last requests, requires both
reports, uses an allow-list and names every unmet bound. Dispatch only,
owner only, first attempt only, gated by CLAUDE_PR_TOOLKIT_ENABLED; no
write scope beyond the OIDC token; nothing is posted to the pull request.

34 tests run the steps as written (without PyYAML too); eight weakened
copies each fail them; actionlint and zizmor (pedantic) report nothing.
openai/codex-action is recorded as WATCH with its pin and overturn
condition.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
seathatflowsinourveins added a commit that referenced this pull request Oct 9, 2026
…#909)

* Add a pre-cue read by Anthropic's pr-review-toolkit agents in Actions

claude-pr-toolkit-review.yml runs pr-test-analyzer and
silent-failure-hunter from anthropics/claude-code's pr-review-toolkit
plugin on one pull request head, through claude-code-action v1.0.247.
Both agents list every behaviour and test change the description does
not declare, with a confidence on every finding. It is the command
center's J8 pre-cue step (W4 draft f), the same agents and settings that
found six undeclared changes in #892 and two verifier defects in #900.

The toolkit is checked out at anthropics/claude-code@602df92b, sparse to
its plugin directory, moved outside the workspace, verified file by file
against recorded SHA-256 values (git blob ids matched GitHub's at the
pin), and loaded with --plugin-dir; the action's plugins and
plugin_marketplaces inputs install unpinned code at run time and are
not used. Sonnet 5.5 at max effort; Read, Glob, Grep and the Agent tool;
CLAUDE_CODE_PRINT_BG_WAIT_CEILING_MS=0 so background agents are awaited;
a $5 budget; a review time limit of 20 or 35 minutes by diff size.

The bounds step counts the coordinator's own turns only, allows the
budget plus a $2 allowance for the agents' last requests, requires both
reports, uses an allow-list and names every unmet bound. Dispatch only,
owner only, first attempt only, gated by CLAUDE_PR_TOOLKIT_ENABLED; no
write scope beyond the OIDC token; nothing is posted to the pull request.

34 tests run the steps as written (without PyYAML too); eight weakened
copies each fail them; actionlint and zizmor (pedantic) report nothing.
openai/codex-action is recorded as WATCH with its pin and overturn
condition.

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

* Publish the toolkit agents' reports from their handbacks when the relay is missing

In the local J8 run on #894 the coordinator hit --max-budget-usd 5
(error_max_budget_usd) after both agents had handed back their full
reports through SubagentHandback, so it never relayed them and the
workflow would have withheld two complete reviews. The numbers and
report steps now take the coordinator's relay when it carries both
sections, and otherwise assemble the reports from each agent's own
SubagentHandback message in the execution file (model-free); with
neither, the relay text stays. The usage record says which source was
used. All three J8 streams so far carry SubagentHandback calls.

Three new tests cover a coordinator that stopped before relaying, a
missing handback and a complete relay preferred to the handbacks (37
tests); three mutants of the fallback each fail them; actionlint and
zizmor report nothing.

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

* Add the J8-SUMMARY trailer and the sweep fixes to the toolkit read

The command center approved a machine-readable trailer for the "defects
caught before a cue" ledger: each agent ends its report with one line,
J8-SUMMARY {"undeclared": <n>, "confidences": [...]}, so counts come
from the agents' own numbers and never from prose. The review itself is
unchanged. A test asserts the trailer in the prompt.

The sweep of the W4 drafts for the classes #894's pre-cue read found,
applied here: the empty paths array is expanded safely on bash before
4.4; a read step that succeeds without an execution file fails the
job; display_report and track_progress are asserted; the record states
that a public run's summary is public. 39 tests; actionlint and zizmor
report nothing.

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

* Bind repository debug settings in the guard and fix the cap notice

- R4, from the cc-native-practice lane's L3 read against claude-code-action
  v1.0.247 practice: the guard binds the ACTIONS_STEP_DEBUG and
  ACTIONS_RUNNER_DEBUG secrets and variables as booleans, the secret first,
  and refuses either. A test pins both bindings, and six weakened copies
  each fail it.
- The publish step writes the reports with `jq -j`, so a 60,000-byte report
  is no longer announced as cut, as the J8 micro read of #892 found for the
  same step. A boundary test covers it.

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

* Run the toolkit review on Opus with a $22 budget, check every result record and remove links from the head

R5, quality and correctness only. The coordinator moves to Opus 5.5 at max
with a $22 client budget; the cost bound is the budget times the measured
overrun factor 1.10 ($24.20), re-derived after the first three runs. The
numbers step reads every result record: each must be a success, or a budget
stop after both agents handed back, and a budget stop at or under the bound
publishes both reports. Publishing is gated on the numbers step's outcome.
The coordinator must call both toolkit agents and no other (retries
allowed), replayed on three J8 streams. A tool-list entry that is not a
string is a forbidden tool. A model-free step removes symbolic links from
the pull request head right after its checkout (GPT designated read of
b80a6eb, P2). New tests pin claude_args and --settings exactly; the module
goes from 41 to 56 tests. The record names every change and states that the
hosted file ends at the first result record, so a run whose agents have not
handed back by then fails closed.

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

* Publish only the agents' own handbacks, require both before publishing, and share the cost-factor wording

R6. The numbers step fails unless both called agents handed back (a
handback counts only under the coordinator's Agent call for that agent,
once per agent); relay headings no longer count anywhere (GPT designated
read of 7aa2c12, P2). The report step publishes the two handbacks,
pr-test-analyzer's then silent-failure-hunter's, and never the
coordinator's relay; the coordinator prompt no longer asks for a relay and
ends with one line, which saves its output tokens. Publishing is gated on
!cancelled() and the numbers step's success, as in the other W4 workflows.
The exact --settings pin compares canonical JSON, so 1 or 0 no longer
passes for true or false (J8 R5 micro of #894, N1). The record adopts the
shared cost-factor paragraph ($22 budget, $24.20 bound) and declares the
eight R5 changes the J8 R5 micro read found undeclared. 57 tests; 49 of 49
weakened copies fail a test.

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

---------

Co-authored-by: seathatflowsinourveins <234074349+seathatflowsinourveins@users.noreply.github.com>
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane:trading Trading lane: sim, paper and live north star

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant