Skip to content

Bind published artifact hashes to authenticated source commits - #382

Merged
samovers merged 5 commits into
mainfrom
delivery/source-artifact-publication
Sep 11, 2026
Merged

samovers merged 5 commits into
mainfrom
delivery/source-artifact-publication

Conversation

@samovers

@samovers samovers commented Sep 8, 2026

Copy link
Copy Markdown
Owner

Outcome and Delivery

Closes #381; Tracking Epic #167. This separate prerequisite for #379 / PR #380 implements one evidence-publication custody correction. The trusted publisher now compares verified-artifact claims with proven file bytes at the authenticated execution commit. Correct changed-source hashes pass; stale or fabricated claims refuse. PR #380's kernel changes remain separate.

Current implementation head: 1b057a9af2658b9c985a3c3cc7bd86af6b83ef5c. Reviewed Phase A v0.2 records the contract, threat model and verification plan. The PR remains draft and unmerged. Exact-head review, local and hosted checks, trusted publication and the final receipt have passed. Final task-user acceptance and later exact-head merge authorization remain required.

Approval, authority and scope

Decision OFARM2-SOURCE-ARTIFACT-PUBLICATION-001 version 2 received the entire exact user approval in the same Codex task on 2026-09-11. The original complete card (msg_0d813f8071772f9a016aa306cc501887d29bc6376ae2502097) and later user message (msg_01a08f35-cbed-7060-8fe7-31a47249fdb6) were directly retrieved in order from task 01a07cc8-4157-7b33-a0ca-becb772e0e8b. This paragraph is navigation only; the original task-user message owns authority. Version 1 remains withdrawn. The attribution-only correction required no semantic version change.

The user retains final quality acceptance and later exact-head merge authority. Trusted default configuration chooses paths and policy inputs; the existing admission/source/ticket chain chooses repository and execution coordinates; authenticated GitHub metadata proves selected object kind; trusted publisher policy checks evidence; final receipts establish publication custody. Producer evidence and source bytes remain untrusted. Compromise of trusted policy, publisher credentials or GitHub/TLS is outside this bounded threat model. The main risk is a producer presenting self-consistent false hashes or non-file metadata as artifact bytes; independent file proof and exact comparisons contain it.

Scope stayed within evidence-publication custody. No kernel semantics, credentials, database roles/transactions, runtime activation, capability/provisioning manifests, ActiveArtifactSet, canonical/contracts, deployment or release changes. The existing verifier-currentness sidecar is mechanically refreshed as described below; its schema, status, receipt/identity links and validation rules are unchanged. No cross-boundary exception, source checkout/execution, historical evidence rewrite, workflow-attempt rerun or receipt bypass.

Implementation and invariants

  • P01: Trusted configuration alone selects paths/order. Producer-added, omitted, duplicate, changed or reordered entries refuse and cannot select fetched objects.
  • P02: The shared inventory/artifact reader resolves the exact commit, walks selected nonrecursive tree entries and accepts only regular blobs in string modes 100644/100755. Parents require tree/040000. Selected links, submodules and directory terminals refuse, as do malformed/truncated metadata and mismatching identities, sizes or blob hashes.
  • P03: One ordered SHA-256 list from proven raw bytes is a required validator argument for both producer runs and both staged revalidations. The previous policy-checkout artifact calculation is deleted without fallback.
  • P04: Source bytes remain inert. Each response retains authentication, strict decoding, an 8 MiB bound and 30-second timeout. Source redirects refuse before a follow-up request; archive redirect behavior remains unchanged. Configuration, locks and schema remain policy-owned.
  • P05: Existing admission/revocation, source run/attempt/ticket, archive identities/digests, safe extraction, test outcomes/inventory, comparison, native reauthentication and final receipt checks remain intact.
  • P06: Both configured artifacts, four policy-owned input files and source test inventory are byte-identical to base ff092c414db9fa24dbd6ab86c7722db89e0c95b5. This prerequisite must obtain its own receipt from existing trusted default policy before merge; candidate tests cannot substitute for that publisher.

Both mechanical pins are refreshed: publisher policy → evidence-publication.ymlconformance.yml. Workflow behavior and permissions are unchanged. The complete staging fixture is shared by success and refusal cases; its Git responses dispatch only on exact URLs. Matching false metadata hashes in both envelopes with recomputed comparison still refuse specifically at file proof before output. Tests also cover stale policy hashes against changed source, different source hashes, executable-mode and metadata-looking regular files, preserved policy inputs, raw-byte substitution and transport failures.

The first admitted source run 34571981032, attempt 1, refused at tenant migration preflight: checked tenant native-verifier authority is invalid or stale. Both baselines and comparison were skipped; both native architecture jobs passed, but handoff was skipped and no receipt exists. The failure is preserved and the new head revokes its admission; no attempt was rerun.

The conformance workflow is a whole-file input to the existing currentness manifest. Following the accepted native CLI RFC v0.2 §9.4, the unchanged offline generator produced fresh temporary output, which was exactly reviewed before checked-file replacement. Only the workflow SHA-256 and resulting aggregate digest changed (sidecar SHA-256 c147c2706c13ca468b16ae472ad5a997d1b32ec976cad8b5e9b8db7c859eef13). All other fields and bytes, all native rules, the frozen receipt and release identity remain unchanged. This satisfies the existing currentness check for the already-reviewed pin bytes; it introduces no independent authority decision or capability. Under AGENTS.md's generated-evidence discovery rule, it is an additional mechanical companion within the approved boundary, requiring no new decision version. The existing provisioning identity test confirms unchanged tenant manifest bytes/digest.

Code excellence and changed areas

The implementation changes six paths: publisher policy, existing conformance unittest file, baseline documentation, two workflow pins and the existing generated verifier-currentness sidecar. Design history adds the two RFC paths to the complete PR. No kernel root test changed, so no root inventory regeneration is indicated.

EXC-001/002: one source reader and expected list, no duplicate authority or persistent cache. EXC-003: P01-P06 trace to complete staging/reader tests, preserved-input comparison and existing pin enforcement. EXC-004: remove the old Contents source path and local artifact-hash calculation. EXC-005: one bounded transport helper serves commit/tree/blob reads; its small source-only redirect handler enforces the approved no-follow rule without altering archive handling. EXC-006: a selected component walk proves parent-link refusal without checkout, a recursive repository scan or a generic resolver. No new registry, signing authority or durable state. Preferences remain non-blocking.

Executed checks and honest limits

Local CPython 3.12.13 on Darwin ARM64, dedicated task environment, fictional fixtures and temporary directories. The 49 baseline dependency versions and checker version are repository-pinned; native wheel identities are recorded separately and are not locked Linux baseline equivalence. All database DSNs used for the pin check were explicitly invalid; no database was created or accessed.

  • Publication/admission unittest module: 81 methods passed in 21.702 seconds (11 added methods; source/staging tables exercise 103 cases, as counted by their author).
  • Existing test_evidence_publication_policy_is_transitively_authenticated: 1 passed in 0.15 seconds, checking both hashes and workflow enforcement.
  • After the generated companion: 20 targeted currentness/provisioning/pin cases passed in 0.26 seconds (198 deselected), including stale/missing sidecar refusals, deterministic/no-clobber generation and unchanged provisioning identity. Tenant migration preflight: PASS, authenticating 11 migrations without a database.
  • Package contract: PASS, 0 failures, including architecture, before both implementation commits. Prior policy Ruff and current whitespace: PASS.
  • Initial test development run: 1 failure and 14 subtest errors, caused by two fixture mistakes (comparison output already existed; substitution length mismatch). Fixed and retained alongside subsequent passing logs. No old-reader red run is claimed. Four expected non-equivalent producer controls print comparison FAIL while their refusal tests pass; the full unittest result is OK.
  • Extraction consistency: FAIL, 2 existing missing review records, for conformance/review_baseline_test_inventory.json and kernel/tests/test_rewrite_architecture_check.py. The checker and extraction records are unchanged; execution/reporting does not waive any applicable gate.
  • Scope verification: all policy AST nodes outside the five owned definitions remain unchanged; seven bootstrap inputs match base bytes.

The complete version-2 design review and narrow attribution repair were reviewed to zero Blockers before user approval. Prior review 5172228902, review 5172232108, and attribution disposition are design/history, not acceptance of this implementation. Agent-assisted content reviews through the PR-author account do not supply independent-account approval or task-user intent.

Hosted and published evidence

Fresh admission5630765525 remains unedited. Source 34572760216, attempt1, passed: 4,269 tests per baseline, clean-run equivalence, 23 platform checks, both native architectures and sealed handoff. The exact expected Starlette warning inventory matched; no baseline skips, failures or deselections occurred. Hosted CPython3.12.13 / Linux x86_64 / PostgreSQL17.10 used three distinct isolated server identities. Current-head lightweight34572641519 also passed.

Trusted publisher 34575188363, attempt1, passed under existing default policy ff092c414db9fa24dbd6ab86c7722db89e0c95b5. Final receipt10189355421 archive SHA-256 is 98798e236cdde712772da57066627cf81a5fa5931018dae388139a0b73d02de3. Its downloaded bytes match that digest; all four source and five published artifact references match live metadata. It binds this head, execution merge 100eeeb051c149c5d032942e3c6b7bc59bbd3afa, source/publisher attempts and the live unedited admission. The downloaded published baseline archive also matches its digest; both report hashes, test summaries and equivalence agree. Native bytes were reauthenticated by the trusted publisher; no downloaded content was executed locally.

Final scope/excellence recheck: eight paths,1,461 additions/234 deletions; no independent capability or boundary added. Both worktrees are clean. No new review or revocation arrived during verification. Historical policy-owned config/lock/schema revision handling remains a separate follow-up; no new scoped Follow-ups or Preferences. Preserved local extraction diagnostics do not waive any applicable requirement.

Remaining human acceptance

All required scoped technical and publication gates have passed. The final packet must be presented in the same Codex task and followed by a later exact-head user authorization before merge. No merge or deployment authority exists. All work remains provisional repository development; deployment requires independently human-controlled approval. Changed capability, authorities, invariants, supported-file policy, named PR or production posture requires a new decision.

PR #380 stays draft at d71c1d4cc304a50efc3983a77906f74686ff0946 and needs its own fresh applicable verification after this prerequisite is merged with user authorization. No workflow attempt was rerun and no candidate publisher was substituted for trusted policy.

Next: final task-user acceptance and later exact-head authorization for PR #382, then its normal merge rechecks.

Describe the separate evidence-publication custody correction, exact source binding, refusal invariants, focused staging tests and prerequisite publication constraint. This is Phase A for Delivery #381; implementation remains pending its own same-task semantic approval.

Package contract PASS (0 failures); existing publication and admission tests 70 PASS. No runtime, policy, workflow or artifact bytes changed.
@samovers

samovers commented Sep 8, 2026

Copy link
Copy Markdown
Owner Author

Phase A design review — Delivery #381 / PR #382 at f08cd7d711617c5635cca2f8de1a9852f61976ec

Two bounded AI reviews of the concrete RFC reported zero design Blockers, zero added Follow-ups and zero Preferences. Both reviewed RFC SHA-256 d9e6fe369317098eaccbc05341dd2d68a86b474211ae5b7cd7001b3bdd2861ca, confirmed against the committed file. This is design review only; no implementation acceptance or baseline admission is asserted.

The review checked the high-risk floor and P01-P06: trusted path ownership, exact authenticated execution-commit reads through the existing reader, one required ordered expected hash list for both source runs and staged revalidation, no fallback or execution of fetched content, unchanged custody gates, and the main-based prerequisite preserving configured artifact bytes. The bootstrap constraint permits this PR's own evidence to be published by existing default policy; candidate policy cannot substitute for trusted publication.

Code excellence: one existing reader, one required validator input, deletion of the wrong-revision calculation, no duplicate source or durable state, and focused staging tests using valid complete fictional envelopes. Scope stays within evidence-publication custody, separate from PR #380.

Actual cheap checks at the design source: package contract PASS, 0 failures, including architecture; whitespace PASS; existing publication/admission suite 70 tests PASS in the local CPython 3.12.13 environment, using fictional fixtures and temporary directories. No database was used. The 70 unchanged tests characterize existing behavior and do not demonstrate that the unimplemented correction works.

The sole source change is the 190-line RFC. Policy, workflow, configured artifacts, baseline inputs and runtime remain unchanged. No expensive admission or hosted baseline has been requested for this Phase-A-only head. Semantic decision OFARM2-SOURCE-ARTIFACT-PUBLICATION-001 version 1 still requires a complete card and later exact same-task user approval before implementation.

Next: obtain that distinct same-task approval, implement the complete slice in this same PR, then follow all existing review, admission, publication and final human acceptance gates.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #382 — Phase A review

Verdict: changes required before semantic approval. One in-scope design blocker.

Reviewed head: f08cd7d711617c5635cca2f8de1a9852f61976ec
Base: ff092c414db9fa24dbd6ab86c7722db89e0c95b5

The PR is draft and design-only: its sole change is the 190-line authenticated-source-artifact publication RFC. No publisher implementation or new tests exist at this head. This is a content/design review, not semantic approval, baseline admission, implementation acceptance, merge authorization or deployment authority.

B1 — The proposed reader reuse does not establish that the authenticated response is a source file

Priority: P2 — must resolve in Phase A.
Affected design: RFC's proposed custody sequence, steps 3–4, and invariants P02/P03.
Owning implementation: _download_authenticated_source_file() in conformance/evidence_publication_policy.py.

The design instructs staging to reuse the existing reader and hash its returned bytes as the expected artifact content. However, that reader establishes only a checked request, HTTP 200, unchanged final URL, and a nonempty bounded response. It does not establish the repository object's kind or distinguish raw file content from an API metadata response.

Sources: proposed RFC and existing reader/publisher.

That distinction matters for this endpoint. GitHub's Contents API serves both files and directories; its documented responses include directory listings, metadata for unresolved symlinks, and submodule descriptions. Requesting a trusted pathname at an exact commit does not, by itself, prove that the pathname resolves to the expected kind of file. See GitHub's Contents API documentation.

The resulting source-level counterexample is:

A configured artifact path is replaced by a directory at the admitted commit.
The Contents API returns nonempty directory metadata.
The existing reader accepts those response bytes.
The proposed implementation hashes that metadata as the expected artifact.
Both producer envelopes claim that same hash.
Exact hash-list equality does not establish that an artifact file existed.

This falls within the RFC's declared threat model: source content and producer envelopes are untrusted, and an author may fabricate internally consistent claims. It does not require compromising trusted publisher policy, credentials or GitHub.

The reader's existing use for the test inventory does not establish safety for this new use. Inventory bytes subsequently undergo _load_source_test_inventory() validation against the expected inventory document. The proposed verified-artifact path instead treats the bytes solely as hash input, so that downstream structural check does not protect it.

Evidence: I executed the copied reader against three synthetic HTTP-200 responses representing a directory listing, unresolved-symlink metadata and submodule metadata. It accepted all three unchanged. This confirms the missing distinction in the reader; it is not a live GitHub response capture or an end-to-end publication exploit. The isolated reader probe ran on Python 3.13.5, not the pinned Python 3.12.13 environment. Supplemental probe source and results were supplied in the originating review conversation; no repository test execution is claimed by these probes.

Smallest controlled correction: amend the design to require an authenticated, commit-bound proof that each configured path resolves to a supported source-file object before its content becomes an expected artifact hash. Define the symlink policy explicitly and refuse unsupported directories, submodules and unresolved links. Keep this within the existing source-reading path and the same repository/commit authority; do not introduce checkout, source execution or a fallback.

Do not solve this by rejecting bodies merely because they look like metadata: the actual artifacts are JSON. The distinction must come from authenticated object information or an equivalent provider guarantee, not a content-shape guess. The current configured artifacts are the capability manifest and ActiveArtifactSet JSON files.

Add a complete staging negative in which both producer envelopes contain matching hashes of the non-file response and their comparison has been recomputed. It must refuse specifically because the source object is unsupported—not because another envelope field is invalid. Adjust the "exactly one read per path" test requirement if obtaining the necessary object proof requires additional bounded metadata reads.

The underlying correction is otherwise well targeted

The reported revision mismatch is real in the code. The producer hashes ROOT / path; the publisher currently hashes POLICY_ROOT / path. Replacing only the latter expectation with an independently established hash of the executed source is the correct direction. Keeping path selection and ordering under trusted configuration avoids handing the producer a new path-selection authority.

The execution coordinate already reaches the correct boundary. The publication workflow supplies steps.publisher-start.outputs.execution_merge_sha to stage-conformance, rather than taking a revision from the producer envelope. The design can preserve that existing authenticated source chain.

One required expected list is preferable to parallel calculations. Reusing it for both producer validations and staged revalidation preserves one comparison rule. Deleting the old policy-root calculation, without a fallback, prevents the original defect from surviving in a secondary path. The current staging function has both validation call sites that the RFC identifies.

The bootstrap plan avoids the dependency loop. Keeping this prerequisite based on main, with both configured artifact files and policy-owned baseline inputs unchanged, permits its own evidence to go through the existing publisher. Importing #380's changed manifest here would recreate the known failure. Candidate tests must prove the changed-source behavior; the prerequisite's eventual receipt must still come from trusted default policy.

Required implementation companion — refresh the transitive workflow pin

There is one mechanical dependency beyond the publisher's own policy-file hash:

evidence_publication_policy.py changes
  → policy hash in evidence-publication.yml changes
  → workflow hash in conformance.yml changes

conformance.yml pins the publisher workflow's bytes, and kernel/tests/test_postgresql_native_evidence.py checks that relationship. Updating only the policy hash inside evidence-publication.yml would leave the transitive pin stale.

This is not a second design blocker or separate Delivery. It is a required mechanical companion within the same custody correction. The RFC already treats expected paths as predictions and requires the existing workflow/pin checks.

Verification and disposition

I inspected the RFC, current producer/publisher paths, authenticated reader, staging fixture, configuration, workflow bindings and current-head lightweight job results. Lightweight run 34250261926 completed successfully. I did not rerun repository tests, the package checker or a hosted baseline.

The reported 70 passing publication/admission tests are unchanged tests: they characterize the existing implementation, not the proposed fix. The PR's design-review record makes that distinction.

Resolve B1 in the source-file contract, then re-review the affected design before presenting the semantic-approval card. This is an implementation/evidence-policy correction; no active OFARM baseline-law amendment is needed. Keep #380's kernel changes and its eventual fresh verification sequence separate.

No semantic approval, implementation acceptance, baseline admission, merge authorization or publication bypass is supplied by this review.

Withdraw the version-1 card after review B1 and preserve its design as history. Define version 2 with exact commit/tree/blob proof, explicit no-symlink policy, bounded shared source reading, complete non-file staging negatives and both transitive workflow pins.

Design-only revision for Delivery #381 and PR #382. Publisher implementation still requires later exact same-task version-2 approval. Package contract PASS (0 failures); unchanged publication/admission tests 70 PASS; prior environment failure and existing extraction FAIL (2) retained.
@samovers

Copy link
Copy Markdown
Owner Author

Scoped Phase A repair review — PR #382 at 3d3b28924b19d813d36e9b5e663a2b89c0882f4d

Review 5168801319 correctly identified B1. Version 1 and its card are withdrawn. The original RFC text remains unchanged below its withdrawal notice; RFC v0.2 is the proposed replacement.

The revised design closes B1 at the contract level: one shared reader proves exact commit → selected nonrecursive trees → terminal regular blob, rejecting all selected parent/terminal symlinks, submodules and directory terminals. It validates metadata identity/shape, mode and size, then fetched bytes against the proved blob length and Git object ID. Metadata-looking regular JSON stays valid. HTTP bounds, strict decoding, authenticated source authority and exact comparisons remain; no parallel reader, checkout or fallback.

Two bounded AI reviews checked that correction and affected invariants against provider documentation, current reader/staging code and both transitive workflow pins. They confirmed the committed v2 hash 0437519d885e89803608142c4a16f23a62c613a7fbde725f89884f1f173d8409: zero design Blockers, no new Follow-ups or Preferences. This is design review only, not implementation acceptance or baseline admission. The full audit was not restarted.

Focused evidence requirements now include complete staging negatives with matching non-file metadata hashes in both envelopes and a recomputed comparison; parent and terminal symlinks; submodules; missing/ambiguous/truncated/malformed object information; byte-size/object-ID mismatches; exact bounded requests; and lawful regular metadata-looking blobs. All tests remain fictional and local before hosted gates.

Both required mechanical pins are explicit: evidence_publication_policy.pyevidence-publication.ymlconformance.yml. The prerequisite still preserves both configured artifact files and policy-owned inputs so its own receipt must come from existing trusted default policy.

Actual checks: package contract PASS, 0 failures, including architecture, before commit; whitespace PASS; 70 unchanged publication/admission tests PASS in 1.916 seconds, with no database. Initial package FAIL (2) from a disappeared temporary environment (missing jsonschema/Ruff) is preserved. A new task-owned CPython 3.12.13 environment with repository-version-pinned checker dependencies passed pip check and the package rerun. Native wheel records are supplemental, not locked Linux equivalence. Extraction still reports its two existing missing review records; no applicability or gate is waived.

Only design documents changed. Publisher implementation and new regression code do not exist yet. The decision is OFARM2-SOURCE-ARTIFACT-PUBLICATION-001 version 2 and requires a complete same-task card plus later exact user approval. No new admission, expensive baseline, receipt waiver or merge authority is supplied here. Scope remains evidence-publication custody; PR #380 remains separate.

Next: obtain version-2 semantic approval, implement the complete slice in this same draft, then follow all existing review, publication and final human acceptance gates.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #382 — Phase A review of RFC v0.2 at 3d3b289

Verdict: one Blocker, all of it in the document's own evidence reporting. The
version-2 security contract itself holds — I could not break it in 26 cases.

Reviewed head: 3d3b28924b19d813d36e9b5e663a2b89c0882f4d
Base / current main: ff092c414db9fa24dbd6ab86c7722db89e0c95b5 (confirmed live)
RFC v0.2 SHA-256: 0437519d885e89803608142c4a16f23a62c613a7fbde725f89884f1f173d8409
RFC v0.1 SHA-256 at f08cd7d: d9e6fe369317098eaccbc05341dd2d68a86b474211ae5b7cd7001b3bdd2861ca
RFC v0.1 SHA-256 at this head: 6aa2e8fa604c4c13fe5a8d9f9016fdb228f083b361fd30ead3490664e201b8cc

All five digests recomputed from a fresh anonymous clone plus
git fetch origin refs/pull/382/head, not from the working checkout. The first two
reproduce the digests claimed in the PR's two design-review comments exactly.

How this pass is positioned

This is the first review object on 3d3b289. Review
B1 was
submitted against f08cd7d, the version-1 head. Two further design reviews are
recorded only as issue comments
(5588353325
at v1,
5624362132
at v2), both reporting zero design Blockers. I read those after measuring, and
this pass reaches a different conclusion on one point.

All reviews on this PR, including this one, are authored by samovers, who is also
the PR author. GitHub refuses APPROVE and REQUEST_CHANGES from the author (422),
so every one of them is a COMMENT. A self-review almost certainly does not satisfy
an independent-review gate.
Do not let the count of reviews here stand in for
independent standing.

Diff at this head: two files, +485/-0, both under docs/rfcs/. 3d3b289 adds
v0.2 (290 lines) and prepends a 5-line withdrawal banner to v0.1 — the v1 body is
otherwise byte-identical, as comment 5624362132 states. No implementation, tests,
workflow pins, kernel, manifest or database changes exist at this head.

Blocker 1 — the RFC states a probe environment that the review it cites explicitly denies

Violated rule: AGENTS.md §8 — "Honest reporting: failing tests are reported as
failing; design fixtures are never presented as executed evidence; skipped steps are
named."

Location: RFC v0.2, "Version-2 correction to the withdrawn design", paragraph 1.

The RFC writes:

The local Python 3.12.13 reader probe accepted three fictional
directory/link/submodule metadata responses; this was not a live provider capture
or an end-to-end publication exploit.

Review B1, which is the cited source of that probe, writes the opposite:

The isolated reader probe ran on Python 3.13.5, not the pinned Python 3.12.13
environment.

3.12.13 is the interpreter pinned in conformance/review_baseline_config.json
(requiredEnvironment.pythonVersion, and knownGreenBaseline.observedInRun). The
RFC therefore promotes a probe that its own source flagged as off-pin into a
probe on the pinned environment. B1 also noted the probe used a copied reader, not
the module.

This is small in words and large in kind. The document's entire subject is what may
be presented as evidence and under whose authority; it is the artifact a semantic
approval binds. A design that upgrades the provenance of its own supporting evidence
by one sentence is exactly the failure mode the custody correction exists to prevent.
Every other factual claim in this RFC that I checked reproduced (see the table below),
which is why this one stands out rather than blending in.

Smallest acceptable fix — pick one:

  1. Restate the sentence as B1 wrote it: an isolated copied-reader probe on Python
    3.13.5, explicitly not the pinned environment; or
  2. cite a real 3.12.13 run.

For (2), I have now produced one, so no new work is needed to take that route. I
built CPython 3.12.13 from the upstream tag (v3.12.13, ./configure --prefix=…,
make -j4, make install; the interpreter self-reports
Python 3.12.13 (main, Sep 10 2026, 20:32:53) [GCC 11.4.0]) and drove the real
module at this head
conformance/evidence_publication_policy.py imported by
path, no copied code — through its own response_factory seam:

interpreter: 3.12.13 (main, Sep 10 2026, 20:32:53) [GCC 11.4.0]
module: …/pr382/conformance/evidence_publication_policy.py
MAX_SOURCE_INPUT_BYTES: 8388608

ACCEPTED directory listing: 264 bytes, sha256=cae4cfa35c7a0d2479b4c61421a1abb02a939ad8508fee2dbc680473bba29bd4
ACCEPTED unresolved symlink metadata: 242 bytes, sha256=08df3a2d740b60d030a488e9c18bacf3aed8b6df7399df8621b0821db9aa25c7
ACCEPTED submodule metadata: 286 bytes, sha256=5a9795bb98c81efb8607782b51120f3f7eb0e4c3cc0cefef0ee41ede1089f19f
ACCEPTED ordinary regular file (positive control): 49 bytes, sha256=660acb61abcd92104e4c6ec6e9b51ff6249663d654785b5a0c5bd5903a400e55

Byte-identical digests on 3.12.3 beforehand, so the interpreter was never
load-bearing for the conclusion. B1's finding is correct and reproduces on the pinned
interpreter against the real module.
The defect is the reporting, not the claim.
Caveats that must travel with any citation of the above: the payload shapes come
from GitHub's Contents API documentation, not a live capture; the run went through
the injected response_factory, so no TLS, redirect handler or real HTTP was
exercised; and my build ran on linux-aarch64, while the pinned baseline is
x86_64 / ubuntu-24.04.

Does version 2 actually close B1? Yes — 26/26, including B1's own counterexample

I did not want to assess the supported-file contract by reading it. I implemented it
literally — steps 1–4 of "Supported-file contract within the existing reader" — as a
reviewer's oracle, reusing this head's real _checked_api_url, _checked_repository,
_checked_source_path, _decode_json_object, _object, _array,
DOWNLOAD_CHUNK_BYTES and MAX_SOURCE_INPUT_BYTES, and drove it with fictional
commit/tree/blob responses dispatched by exact request URL. On Python 3.12.13:

--- positive controls (must be ACCEPTED) ---
[ok ] ACCEPTED regular file 100644, changed source bytes                          (reads=4)
[ok ] ACCEPTED executable file 100755 treated only as data                        (reads=4)
[ok ] ACCEPTED regular JSON blob whose bytes look like directory metadata          (reads=4)

--- RFC's declared negatives (must be REFUSED) ---
[ok ] REFUSED  directory terminal (B1's counterexample): selected terminal object is not a file
[ok ] REFUSED  submodule terminal 160000: selected terminal object is not a file
[ok ] REFUSED  terminal symlink 120000, unresolved: not a regular file
[ok ] REFUSED  terminal symlink 120000 whose target is a real in-repo file: not a regular file
[ok ] REFUSED  parent component is a symlink: selected parent component is not a directory
[ok ] REFUSED  parent component is a submodule: selected parent component is not a directory
[ok ] REFUSED  selected terminal name missing: selected tree entry is missing or duplicated
[ok ] REFUSED  duplicate selected entries with the same name: missing or duplicated
[ok ] REFUSED  truncated root tree: source tree response is truncated or unproven
[ok ] REFUSED  root tree response omits truncated: truncated or unproven
[ok ] REFUSED  commit object returns a different sha: source execution commit identity differs
[ok ] REFUSED  tree object returns a different sha: source tree identity differs
[ok ] REFUSED  mode 100644 but type is tree: selected terminal object is not a file
[ok ] REFUSED  terminal size is boolean True: selected terminal size is not an integer
[ok ] REFUSED  terminal size is zero (empty regular file): size is out of range
[ok ] REFUSED  declared size differs from raw byte count
[ok ] REFUSED  raw blob bytes substituted (same declared size): object identity differs
[ok ] REFUSED  blob fetch redirected to another final URL
[ok ] REFUSED  blob fetch returns HTTP 404 / fails at transport
[ok ] REFUSED  oversized tree metadata (> 8 MiB)
[ok ] REFUSED  malformed tree metadata (JSON array, not object)
[ok ] REFUSED  duplicate JSON keys in tree metadata: JSON contains a duplicate object key

26/26 cases matched the RFC's stated outcome

Four results are worth naming individually.

  • B1's exact counterexample dies before any hashing. A directory at the configured
    artifact path refuses at the tree entry, three reads in, before the blob request —
    so no bytes ever reach the expected list, and matching producer envelopes cannot
    rescue it.
  • A symlink whose target is an ordinary in-repository file also refuses. This is
    the case the Contents API silently dereferences and the one the RFC promises to
    refuse; the mode check on the terminal entry is what makes the promise real.
  • The "regular JSON blob whose bytes look like API metadata" positive control
    passes.
    The contract discriminates on provider object information, never content
    shape — the constraint B1 attached to the fix is satisfied.
  • The substituted-blob case refuses at Git object identity, not at size. This is
    the check that makes the raw fetch inert: the reader would rather fail than return
    bytes it did not prove.

Read budget reproduces exactly. A depth-2 path spends four reads:

…/git/commits/1111111111111111111111111111111111111111
…/git/trees/2222222222222222222222222222222222222222
…/git/trees/3333333333333333333333333333333333333333
…/git/blobs/034ba4751a2bba8d345cbb5e95eb3cf10b570463
depth-2 path spends 4 reads -> three configured paths spend 12

The three trusted paths — conformance/review_baseline_test_inventory.json and the
two verifiedArtifacts — are all two-component, so d+2 = 4 each and 12 total.
The RFC's correction of the withdrawn three-read assertion is arithmetically right.

Every fictional tree entry and tree response in my fixture carried a
"url": "https://evil.invalid/…" field. None was ever requested: all 12 URLs were
constructed locally from the checked API URL, repository and validated object IDs.
The RFC's no-response-URL-following rule is not just stated, it is structurally
unavoidable in the shape it specifies.

Follow-up 1 — the same wrong-revision comparison survives for four other inputs

Deleting the POLICY_ROOT calculation for verifiedArtifacts does not remove the
defect class from _validate_baseline_evidence. At this head, expected_inputs
(lines 1071–1094) still hashes four more paths out of the publisher's own checkout:

config              POLICY_ROOT / conformance/review_baseline_config.json
dependencyLock      POLICY_ROOT / requirements-review-baseline.lock
packageManagerLock  POLICY_ROOT / requirements-review-pip.lock
schema              POLICY_ROOT / kernel/schema.sql

while the producer (conformance/run_review_baseline.py:784-787) hashes each under
ROOT, i.e. the executed source. testInventory is already exempt: its expectation
is source_inventory_sha256. So after this correction, a PR that lawfully changes
kernel/schema.sql or either lock file reproduces this PR's refusal in a different
field.

This is not a Blocker and not scope for this PR. P04 declares those checks
policy-owned and preserved, and there is a principled reason: a producer that could
move its own lockfile or schema expectation would be choosing its own verification
environment, whereas verifiedArtifacts are attested data. But the RFC never states
that criterion, and its problem statement is written generally ("A legitimate change
to a verified artifact therefore prevents publication"). One sentence naming the
rule — policy-owned inputs stay pinned to the trusted checkout; attested source
artifacts bind to the execution commit — would keep the next reader from concluding
the class was fixed.
Record the residual refusal class as separate Delivery work if
and when it bites.

It does not block PR #380. I pulled #380's file list: 14 files, of which
profile_si_ffs/OFARM_Capability_Manifest_si_ffs_pilot_v0_1.json (+3/-2) is a
configured verifiedArtifact — the exact blocked case — and
conformance/review_baseline_test_inventory.json (+682/-2) is the already-exempt
inventory path. #380 touches none of the four paths above. So this prerequisite is
sufficient for the refusal it was written for.

Preferences (non-blocking under EXC-007)

P1 — P01's stated observable is no longer producible. The invariant table's
evidence column for P01 reads "Recorded requests contain only trusted paths."
Under version 2 every request is object-ID addressed; my instrumented run recorded
0 of 12 request URLs containing a repository path. The RFC's test plan already
specifies the correct replacement ("assert the exact bounded request sequence"), so
nothing is lost — but the sentence is carried over from version 1 and, taken
literally, asks an implementer to assert something that cannot be asserted. It also
names a live assertion that must change:
conformance/test_review_baseline_admission.py:1546-1550 asserts
len(source_requests) == 1 and the exact Contents URL string. Restating P01's
observable as the selected component names and the ordered expected list would
close it.

P2 — name the provider fields, not their English descriptions. The contract says
"exactly one child with the exact component name", but the Git tree API returns
no name field; the field is path, and it is a basename only because the
recursive parameter is omitted — the very thing the contract forbids two sentences
earlier. Likewise mode is a JSON string ("040000", "100644"), and 040000
is not a writable integer literal in Python. Naming path and quoting the modes
removes both traps and makes the "omit recursive" requirement self-evidently
load-bearing rather than incidental.

P3 — v0.1 stays in the tree with no compatibility duty. This PR leaves both
versions under docs/rfcs/. Across 62 RFC files at this head, this is the only
duplicated document stem: every other version bump in the repository landed at its new
version with no predecessor ever committed (OFARM2_Proportional_Delivery_Workflow_RFC_v0_2.md,
OFARM_Native_Evidence_GitHub_CLI_Pin_Execution_RFC_v0_2.md,
…_Elapsed_Time_Correction_RFC_v0_3.md, …_Decision_Log_Evidence_Amendment_RFC_v0_2.md
were all added directly at v0_2/v0_3). EXC-004 asks for obsolete owned material to go
unless a time-bounded compatibility duty and deletion trigger are explicit; none is
stated. The counter-argument is real and I think it is close: the withdrawal banner
removes any ambiguity about which document is live, and EXC-004 enumerates code,
shims, flags and fallbacks, not documents. But v0.1 has never been merged, so
"preserved as history" is doing no work that commit f08cd7d and review B1 do not
already do permanently. If maintainers read EXC-004 as covering owned documents,
this becomes a Blocker; I have classified it as a Preference.

P4 — rewrap the late edits. v0.2 wraps prose at ~80 columns except four lines that
run 100–498 characters, all in passages edited after the v1 text was written. Cosmetic.

RFC claims I checked against the code and the live repository

RFC claim Result
Publisher recomputes artifact hashes under its own policy checkout Confirmedevidence_publication_policy.py:1128 hashes POLICY_ROOT / path
Producer hashes under the executed source root Confirmedrun_review_baseline.py:786 hashes ROOT / path
Refusal string review baseline verified artifacts differ Confirmed present at evidence_publication_policy.py:1132
Source run 34149023176, attempt 1, passed Confirmedreviewed-head baseline gate, attempt 1, completed success
Publisher run 34151241570, attempt 1, refused, no receipt Confirmedevidence-publication, attempt 1, completed failure; the failing step is #14 "Rebuild authoritative conformance claims with trusted policy", i.e. stage-conformance. Job logs require authentication; I did not read the refusal string from the log
Historical head 64d3cbd6… Confirmed — commit resolves, single parent 28235614
stage_conformance_evidence, _download_authenticated_source_file, _validate_baseline_evidence all exist and are the right seams Confirmed — reader has exactly one production call site (:1208, inventory) plus three in conformance/test_review_baseline_admission.py; the validator has exactly two call sites (:1228 producer runs, :1263 staged revalidation), both inside one function with source_commit already in scope
Existing 8 MiB limit and 30-second timeout ConfirmedMAX_SOURCE_INPUT_BYTES = 8 * 1024 * 1024, timeout=30
Publication workflow already supplies the execution commit Confirmedevidence-publication.yml:333 sets SOURCE_COMMIT from steps.publisher-start.outputs.execution_merge_sha
Three two-component paths → twelve reads Confirmed by execution (see above)
kernel/tests/test_postgresql_native_evidence.py already checks both pin relationships Confirmed:4005-4090; and both pins are currently exact: policy file SHA-256 3ca8d543… equals OFARM_EVIDENCE_PUBLICATION_POLICY_SHA256, and evidence-publication.yml SHA-256 0e0f661e… equals the value pinned at conformance.yml:64
Current main is ff092c4… Confirmed live via git ls-remote
Both configured artifact files preserved (P06) Confirmed — the diff is two files, both under docs/rfcs/
Both v1 and v2 digests claimed in the PR comments Both reproduce from fresh extraction
"The original RFC text remains unchanged below its withdrawal notice" Confirmedgit diff f08cd7d..3d3b289 on v0.1 is +5/-0
Probe ran on Python 3.12.13 False as written — see Blocker 1

Checked and decided were not findings

  • Fork-network object sharing does not undermine the commit read. GET /git/commits/{sha} resolves objects across a fork network, so a 200 there is not by
    itself proof of repository membership. It does not need to be: _bound_merge in
    conformance/review_baseline_admission.py:336-370 derives execution_merge_sha from
    the live refs/pull/{n}/merge ref and refuses unless the merge commit's parents are
    exactly [base_sha, reviewed_head_sha]. The execution commit is bound to this
    repository's own PR merge and to the reviewed head before the reader ever sees it.
    The RFC's delegation of that authority is sound.
  • The SHA-1 blob identity is not being asked to carry security weight. The RFC says
    so itself ("verifies Git's existing object binding; it does not replace SHA-256
    evidence hashes or create signing authority"), and the attacker in scope can already
    put whatever bytes it likes in the file lawfully. A collision buys nothing.
  • The inventory does not acquire a second wrong-revision comparison.
    _load_source_test_inventory passes the fetched document to
    run_review_baseline._inventory_document, which is a pure normaliser over the
    entries it is given — it does not walk POLICY_ROOT/kernel/tests. So growing
    the test set (as #380 does, +682 lines of inventory) does not produce a second
    refusal behind the one this RFC fixes. This was my main "is there another wall right
    behind this one" hypothesis; it is wrong.
  • The 8 MiB ceiling has room. The inventory is the largest source input at
    1,327,623 bytes / 4,269 entries — 15.8% of the limit. The artifacts are 6,798
    and 2,199 bytes. The RFC is right not to raise the limit.
  • truncated will not fire on the current paths. Non-recursive trees on the walk
    are 41 (root), 21 (profile_si_ffs) and 17 (conformance) entries. GitHub truncates
    around 100,000 entries or 7 MB; there is no realistic path to a truncation refusal
    here, so refusing on truncated is not False costs nothing.
  • Refusing size 0 narrows nothing in practice. The contract's 1..MAX range refuses
    an empty regular file, but the existing reader already refuses empty payloads
    ("source input is empty"), so this is not new behaviour.
  • No cache is a defensible cost. With deduplication the 12 reads would be 7 (one
    commit, one root tree, two subtrees, three blobs). All three paths share the commit
    and root tree. The RFC forbids a cache; against a per-repo GITHUB_TOKEN budget,
    five extra bounded reads per publication is not worth the state, and objects are
    immutable so consistency is not at risk either way.
  • The URL-dispatching fixture the RFC asks for is achievable. The existing seam
    (source_response_factory, test_review_baseline_admission.py:1531) returns one
    payload for any URL; I built the dispatching version the RFC specifies and it works,
    so that test requirement is not aspirational.
  • The enabling-PR rule is satisfied. AGENTS.md:185-187 forbids a separate PR that
    merely enables another with no independently usable and testable outcome. This
    correction is independently testable at the staging boundary and the PR body says so
    explicitly.
  • The package contract check does not regress at this head.
    conformance/ofarm_pkg_contract_check.py on the CPython 3.12.13 I built returns
    RESULT: FAIL (2 failures) — and returns the identical two failures at base
    ff092c4
    : ModuleNotFoundError: No module named 'jsonschema' reached through
    kernel/runtime_bundle.py:16, and "repository-pinned Ruff formatter is
    unavailable"
    . Both are missing tooling in my environment, not head defects; parse,
    digest, instance-validation, temporal-candidate, temporal-decision-log and
    architecture checks all executed and reported clean. I could not install the
    locked jsonschema==4.26.0: my interpreter has no ssl module (no OpenSSL headers
    on the build host) and bootstrap.pypa.io is not reachable from it.
  • Neither RFC file contains trailing whitespace or tabs.

What my method made easier than production

  • My reference implementation is my reading of the RFC, not repository code. It
    shows the contract is expressible, self-consistent and sufficient against 26 cases.
    It proves nothing about the implementation that has not been written. A conforming
    design can still be implemented wrongly, and the implementation review must repeat
    these cases against the real reader.
  • Every provider response was fictional and locally dispatched. Field names,
    shapes and modes came from GitHub's documentation, not from a live capture. If the
    Git tree API's actual response differs from the documented shape in any respect the
    design leans on — truncated semantics, size presence on blob entries, mode
    spelling — my probes would not have noticed. A single live capture against a real
    commit would retire this blind spot cheaply, and I would rather the implementation
    PR carry one than not.
  • Neither probe crossed a network. Both went through the injected
    response_factory, so the real opener, _HttpsOnlyRedirectHandler, TLS, GitHub's
    actual status codes and any rate-limit behaviour were never exercised.
  • I ran no repository test suite, no PostgreSQL, no hosted baseline, no admission
    and no publication.
    The only repository gate I ran is the package contract check,
    and it did not complete cleanly for environmental reasons stated above.
  • My interpreter is linux-aarch64; the pinned baseline is x86_64 /
    ubuntu-24.04.
    For a pure-Python probe this is very unlikely to matter, but it is
    not the pinned platform, and I would rather say so than imply otherwise — which is,
    after all, the subject of Blocker 1.
  • I could not read the publisher job log for run 34151241570; it needs
    authentication. I confirmed the run failed and which step failed, not the refusal
    string it printed.

Disposition

Fix Blocker 1 — a one-sentence correction, and the corrected evidence already exists
above if you want the stronger version of it. The version-2 supported-file contract
needs no design change on anything I could find: it closes B1, it survived every
hostile case I could construct against it, and its read-budget, custody and bootstrap
claims all reproduce.

After that correction, this Phase A looks ready for the same-task version-2 semantic
approval card, subject to the standing caveat that no review on this PR — including
this one — comes from an independent account.

No semantic approval, implementation acceptance, baseline admission, merge
authorization or publication bypass is supplied by this review.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #382 — scoped Phase A re-review, version 2

Verdict: B1 is resolved in the revised design. Zero new in-scope design blockers or follow-ups. Ready for the version-2 semantic-approval decision—not implementation acceptance or merge.

Reviewed head: 3d3b28924b19d813d36e9b5e663a2b89c0882f4d
Previous reviewed head: f08cd7d711617c5635cca2f8de1a9852f61976ec
Base: ff092c414db9fa24dbd6ab86c7722db89e0c95b5

The PR remains draft and design-only. This revision adds the 290-line version-2 RFC and a five-line withdrawal notice above the preserved version-1 text. Publisher code, tests, workflows and configured artifacts remain unchanged. This is a bounded re-review of B1, its repair and affected invariants, not a restarted audit.

Sources: version-2 design and revision delta.

1. B1 — Authenticated response versus supported file: resolved at design level

The revised contract establishes the missing chain:

Authenticated execution commit
  → matching root tree
  → exact selected path components
  → supported regular-file blob
  → matching byte count and Git blob identity
  → SHA-256 artifact expectation

Selected parent components must be trees with mode 040000; the terminal must be a blob with mode 100644 or 100755. Directory terminals, submodules and all symlinks on the selected path—including links to ordinary files—are explicitly refused. The reader must also reject missing or duplicate selected entries, truncated metadata and inconsistent object identifiers. This removes the ambiguity behind B1 rather than merely adding another response-body check.

The raw bytes must then match both the terminal's declared size and its Git blob identifier. The specified calculation correctly includes the blob <byte-length>\0 header; SHA-256 remains the separate evidence hash. GitHub documents raw-blob retrieval, and Git documents the object-ID construction.

The distinction is now object-based, not content-based. A real regular file containing JSON that resembles API metadata remains valid data. Conversely, matching producer hashes cannot turn a directory listing into a supported artifact. Applying the same strengthened reader to the inventory and both verified artifacts also avoids retaining an untyped secondary read path.

2. The provider contract and traversal bounds are executable

The proposed commit/tree/blob sequence matches the documented APIs. The commit response identifies its root tree; tree entries expose the name, mode, type and object identifier needed for component-by-component selection. These reads use the existing Contents: read permission class rather than requiring additional write authority.

The RFC correctly requires omitting recursive entirely. GitHub documents that supplying that parameter with any value—including "false"—enables recursion. This is a meaningful implementation detail, not cosmetic wording.

The revised request budget is coherent: a path with d components requires one commit request, d tree requests and one blob request. The three current two-component paths therefore require 12 bounded reads, replacing the withdrawn three-read assumption. The existing 8 MiB response limit and 30-second request timeout remain, with no recursive repository scan, cache or fallback.

I also inspected live commit and nonrecursive tree metadata at the reviewed head. The inventory, capability manifest and ActiveArtifactSet are each 100644 blobs beneath 040000 parents; their reported sizes are below the proposed limit. That supports compatibility with the current inputs, although it is not execution of the proposed reader.

Object metadata inspected: commit, root tree, conformance tree, and profile tree.

3. The verification plan now targets the actual counterexample

The strongest addition is the complete staging negative: both producer envelopes claim the same non-file metadata hash, their comparison is recomputed, and staging must refuse specifically at supported-file proof before authoritative output exists. That prevents an unrelated envelope inconsistency from concealing a missing file-kind check.

The planned controls cover the important distinctions:

Verification area Required distinction
Object proof Directory, submodule, terminal-link and parent-link refusals; an inventory non-file case proves both consumers use the strengthened reader.
Content binding Wrong object IDs, byte counts and blob hashes refuse independently of producer-list equality.
Legitimate content Changed and unchanged regular files pass with matching hashes; executable-mode files and metadata-looking JSON remain inert data.

The RFC also retains malformed/truncated metadata, boolean-size, transport-failure, response-URL substitution and exact request-sequence tests. These are implementation acceptance requirements already in the revised plan, not new scope from this review.

4. Scope, workflow pins and bootstrap remain controlled

The transitive pin dependency identified previously is now explicit:

evidence_publication_policy.py
  → policy hash in evidence-publication.yml
  → workflow hash in conformance.yml

Both updates belong to this same custody correction, with workflow behavior unchanged. The design still removes the old policy-root artifact calculation and supplies one required expected list to both producer validations and staged revalidation. No producer-selected path authority or alternate verification path is introduced.

The bootstrap remains separate from #380: preserve this prerequisite's configured artifact bytes and policy-owned baseline inputs so its own evidence can pass through the existing trusted default publisher. Candidate tests prove the new behavior; candidate publisher code must not substitute for trusted publication before merge. This preserves the existing evidence boundary without creating a dependency loop.

Verification and remaining limits

I independently checked the revised design, its delta from version 1, the relevant provider documentation, live repository object metadata and current-head lightweight job results. Workflow 34520864613 completed successfully, including publication/admission tests, lint, package/architecture and whitespace steps. I inspected job-step results, not a full baseline execution.

I did not run local repository tests, implement or execute the proposed reader, fetch and re-hash its raw blobs, or run hosted baseline/publication workflows. The reported 70 passing tests exercise the unchanged implementation and do not establish that version 2 works. The PR retains the initial environment failure and two existing extraction-consistency failures as disclosed evidence; this review does not waive any applicable gate.

Disposition

No further Phase A changes required from this review. Mark B1 resolved for the version-2 design at 3d3b28924b19d813d36e9b5e663a2b89c0882f4d, then proceed to the complete same-task decision card for OFARM2-SOURCE-ARTIFACT-PUBLICATION-001, version 2. Version 1 remains withdrawn, and implementation still requires the later valid approval.

This remains an implementation/conformance and repository evidence-policy RFC. No active OFARM baseline-law files need amendment. It does not yet resolve #380's publication hold; that depends on the implemented prerequisite and its own required verification and receipt.

This COMMENT supplies content-review findings only. It is not semantic approval, baseline admission, implementation acceptance, final quality acceptance, merge authorization or deployment authority.

Attribute review B1's copied-reader probe to its stated Python 3.13.5 environment. Preserve the separate local reproduction record and leave the version-2 publication contract unchanged. Addresses review 5172228902 on PR #382; Delivery #381.
@samovers

Copy link
Copy Markdown
Owner Author

Scoped evidence-attribution correction — PR #382 at dc32be55e0a5908df46e76daf3ff50961b0b9c94

Review 5172228902 identified ambiguous attribution in RFC v0.2. The paragraph is now explicit: original B1 used a copied reader on Python 3.13.5, outside the pinned interpreter, with fictional responses. It was supplemental probe evidence, not a live capture, end-to-end publication exploit or repository test run. Correction changes only that paragraph: 5 added / 3 removed lines.

The earlier Python 3.12.13 sentence referred to a separate local reproduction, whose preserved record is reproduced below for provenance. It did not describe B1's probe. The corrected paragraph now attributes only the cited B1 evidence, so the two runs cannot be conflated. No historical test result or original review was rewritten.

Retained local reproduction: unmodified imported conformance.evidence_publication_policy._download_authenticated_source_file at f08cd7d711617c5635cca2f8de1a9852f61976ec; interpreter 3.12.13 (main, Mar 3 2026, 12:39:30) [Clang 21.0.0 (clang-2100.0.123.102)]. This used three fictional responses, no network and no database. It was neither a live provider capture nor an end-to-end publication exploit and does not establish full locked-baseline equivalence. These are historical results; no probe or publication test suite was rerun for this paragraph correction.

Retained local case Result Payload SHA-256
directory-metadata accepted unchanged 13c61e2c2c1fd1c98de6b6bc2a737befe2a8148c9aded7f7cc1abffbe5ca6ad5
symlink-metadata accepted unchanged 20d160ba87a6b65177838f3cc03b4219c2eda5589fe7451b2f96956d8feb46a7
submodule-metadata accepted unchanged 86e6d4729cf5574a79fdf8c2f71185f6e7385f0f0600724642336c482c6a8645

The preserved local JSON record has SHA-256 5293286867c5411910ae6115896597ec5774539268197177c4e203bfd5d6bbf7. This run is also separate from review 5172228902's later Linux ARM64 reproduction and its 26-case reviewer oracle; neither oracle cases nor these reader probes execute the proposed repository implementation.

Bounded exact-head review: the AI reviewer probe_attribution_fix_review reports zero Blockers, Follow-ups or Preferences at dc32be55e0a5908df46e76daf3ff50961b0b9c94, confirming RFC SHA-256 248c5564ef13b4e7b37f81bc891373259a43f6f24a52e907853f688669fc5674 and a clean worktree. It checked only the attribution repair and affected honest-reporting invariant. Capability, authorities, P01-P06 and decision version 2 are unchanged. No broader audit was restarted. This is agent-assisted content review posted through the PR-author account, not independent-account approval.

Checks actually run: package contract PASS (0 failures), including architecture, before commit in the dedicated CPython 3.12.13 environment; whitespace PASS. No publication suite rerun was needed for this documentation-only correction. The earlier 70 passing tests remain historical checks of the unchanged implementation. The two existing extraction review-record failures remain disclosed; this correction changes no extraction inputs or applicability. No publisher implementation, database, admission, hosted baseline, publication rerun, merge or deployment was initiated.

The policy-owned input follow-up and wording preferences remain non-blocking; no additional authority or cross-boundary change is appended. Scope remains evidence-publication custody, separate from PR #380. Its kernel changes remain untouched.

Decision OFARM2-SOURCE-ARTIFACT-PUBLICATION-001 version 2 remains unapproved. The existing complete same-task card remains semantically unchanged; the attribution repair requires no version 3. This comment supplies no semantic approval, admission or merge authority.

Next: obtain the later exact same-task version-2 approval, then implement the bounded correction and follow the existing verification and publication gates.

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #382 — scoped re-review of the attribution correction

Verdict: the evidence-attribution blocker is resolved. Zero new in-scope blockers or follow-ups. No further Phase A changes required.

Reviewed head: dc32be55e0a5908df46e76daf3ff50961b0b9c94
Previous reviewed head: 3d3b28924b19d813d36e9b5e663a2b89c0882f4d
Base: ff092c414db9fa24dbd6ab86c7722db89e0c95b5

The PR remains draft and design-only, awaiting version-2 semantic approval. This revision changes one paragraph in the version-2 RFC: five added lines and three removed lines. No implementation, test, workflow or artifact changes were introduced. See the exact revision comparison.

Evidence attribution: corrected

The RFC at the reviewed head now accurately describes B1's original evidence as an isolated copied-reader probe on Python 3.13.5, explicitly distinguishing it from the pinned Python 3.12.13 environment. It also states that the probe was supplemental evidence—not a live provider capture, end-to-end publication exploit or repository test run.

I checked that wording against the retained original probe results in the review conversation. The interpreter, copied-code method and three accepted synthetic metadata responses agree. The same limits are recorded in the original B1 review.

My previous version-2 re-review missed this attribution mismatch. The finding in review 5172228902 was valid. The current patch fixes it without substituting that reviewer's separate Python 3.12.13 imported-module reproduction for the original evidence. That separate reproduction remains separately reported evidence; I have not independently rerun it.

The version-2 design is unchanged

The exact commit comparison contains no changes to the supported-file contract, trusted path ownership, commit/tree/blob validation, selected-path symlink refusal, expected hash-list handling, workflow-pin dependencies or bootstrap conditions. The earlier resolution of the source-file-proof design blocker therefore stands. This is a reporting correction, not a semantic change requiring another decision version.

That remains a design-level conclusion. The shared reader and publication correction have not been implemented, and this paragraph edit does not resolve #380's publication hold.

Verification and limits

I confirmed that current-head lightweight workflow 34530118986 completed successfully and inspected its job-step results. The admission tests, publication-policy lint, package-validator tests, baseline-outcome tests, package/architecture check and whitespace check all report success. This is current-head lightweight evidence, not a full hosted baseline or publication receipt.

I did not rerun local tests, probes, the package checker or the extraction diagnostic. The PR continues to disclose the two historical extraction-consistency failures and distinguishes earlier test results from checks performed for this attribution-only edit. No applicable gate is waived by this review.

Disposition: mark the attribution finding resolved at dc32be55e0a5908df46e76daf3ff50961b0b9c94. The version-2 design is ready for the semantic-approval decision; implementation still requires valid same-task approval. No active OFARM baseline-law amendment is needed, and no implementation acceptance, baseline admission or merge authorization is given.

Submitted as COMMENT. This is content review through the connected account, not independent-account approval or task-user semantic approval.

Resolve trusted artifact paths through the authenticated execution commit and Git trees, accept only regular blobs, and verify content identity before hashing. Share one required artifact expectation across producer and staged validation. Add complete fictional staging and malformed-proof regressions, preserve policy-owned inputs, and refresh both workflow pins. Delivery #381; approved OFARM2-SOURCE-ARTIFACT-PUBLICATION-001 version 2.
@samovers

Copy link
Copy Markdown
Owner Author

Implementation content review — PR #382 at 0db4baa1bc32bb32a7114d82b3fc62fa65a0498b

Zero Blockers, Follow-ups or Preferences in one divided implementation review pass. review_reporting_disposition covered reader/transport and P02/P04; publication_integration_checks covered staging/validator integration, complete fixtures, pins and bootstrap under P01/P03/P05/P06. Both independently confirmed this full committed SHA and clean worktree. This is agent-assisted content review through the PR-author account, not task-user or independent-account approval.

The existing shared reader proves exact execution commit → selected nonrecursive tree entries → regular blob → exact length/Git object identity. It refuses selected parent/terminal links, submodules, directory terminals, malformed/truncated metadata and substituted bytes. One bounded authenticated transport retains response limits and timeout; the source-only redirect handler refuses follow-up requests without changing archive handling. Fetched artifact bytes remain inert.

Trusted configuration builds one ordered expected SHA-256 list, required by both producer validations and both staged revalidations. The obsolete policy-root artifact calculation and Contents read path are deleted. Complete fictional staging negatives use matching false metadata hashes in both envelopes and a recomputed comparison, then assert specific file-proof refusal and no output. Controls cover changed/unchanged artifacts, stale policy hashes, regular metadata-looking JSON and executable-mode inert bytes. Reader tests cover object identity, path depth, strict JSON, bounds and each transport stage.

Both workflow edits contain only their required hash-pin replacement. All seven bootstrap inputs match base ff092c414db9fa24dbd6ab86c7722db89e0c95b5. Configuration/locks/schema stay policy-owned; admission/revocation, inventory/outcomes, comparisons, archive/native and receipt safeguards remain. No kernel or extraction-record changes, no source checkout/execution, fallback, cache or new durable state. Scope stayed inside evidence-publication custody.

Confirmed SHA-256 values:

  • Policy: 4794754420cf1083af51f844fb122373502fe10a7bed632d36e45150d4f593da
  • Tests: 239cf2f3a7564b2679a108a5adaabe2d51c5b0627ccec7ea214853ce34828b87
  • Publication workflow: fa52c97e7273dd91adbcc9fb623085ea9a87f95058f7e1baf45c9fb640638f7c
  • Conformance workflow: bc32f0b6e947fe7c6b228c9c76e0d2a01509d5461ff1d2e8be5831a5c5efd8e3

Executed local checks: 81 publication/admission methods passed in 21.702s; 1 existing pin/enforcement test passed in 0.15s; package contract PASS0 including architecture before commit; Ruff and whitespace PASS. Tests used fictional fixtures/temporary directories and no database. Native CPython3.12.13 tooling is supplemental, not locked Linux equivalence. The initial 1failure/14subtesterrors were fixture mistakes subsequently fixed; all logs retained. Extraction remains FAIL2 existing missing review records, disclosed with unchanged applicability. The reviewers inspected code/tests and identities without rerunning the already-passing tests or accessing a database.

Same-task semantic approval for decision OFARM2-SOURCE-ARTIFACT-PUBLICATION-001 version2 was directly verified against the original complete card and later exact user message. That authorizes implementation and existing admission coordination, not merge or deployment. Historical design reviews do not substitute for this implementation review; this review supplies no admission trigger by itself.

Next: create one fresh exact-head admission through the existing default-branch gate, then obtain required hosted/native/publication evidence and final receipt before the final task-user acceptance packet.

@samovers

Copy link
Copy Markdown
Owner Author

Request fresh baseline admission for PR #382 after completed exact-head implementation review with zero Blockers. Same-task version-2 semantic approval is valid. Local publication/admission tests, pin enforcement, package and lint checks passed; existing extraction-record failures remain disclosed. Preserve all live admission, execution, publication and receipt gates. This technical trigger grants no merge or deployment authority.

OFARM2_BASELINE_ADMISSION
head=0db4baa1bc32bb32a7114d82b3fc62fa65a0498b
blockers=0

Use the existing offline generator after the approved publication hash pins are final. Only the conformance workflow digest and derived authority-input digest change; preserve the frozen receipt, release identity, native rules and tenant provisioning identity. This mechanical companion closes the preflight refusal observed in run 34571981032 for Delivery #381.
@samovers

Copy link
Copy Markdown
Owner Author

Bounded correction review at exact head 1b057a9af2658b9c985a3c3cc7bd86af6b83ef5c: zero Blockers, Follow-ups or Preferences. Remote head verified; worktree clean. This pass reviews only the generated currentness fix and affected P05/native/preflight invariants, building on the completed implementation review at 0db4baa1bc32bb32a7114d82b3fc62fa65a0498b.

The earlier source run34571981032, attempt1, refused at tenant migration preflight because the approved conformance workflow pin changed a whole-file input in existing verifier currentness. Both baselines and comparison were skipped. Both native jobs passed, but handoff was skipped; no receipt exists. The new head revokes the prior admission. No workflow attempt was rerun.

The unchanged offline generator produced fresh temporary output; exact review confirmed only the conformance workflow SHA and resulting aggregate digest changed. Committed sidecar SHA-256: c147c2706c13ca468b16ae472ad5a997d1b32ec976cad8b5e9b8db7c859eef13. All other sidecar bytes, receipt and identity links, frozen receipt, release identity, native rules, provisioning identity and preceding implementation bytes are unchanged. The accepted CLI RFC v0.2 §9.4 prescribes this refresh; AGENTS.md permits discovered mechanical evidence within the approved boundary. This adds no independent authority decision or capability and preserves version2 scope.

Existing targeted tests: 20 passed,198 deselected,0.26s; covers deterministic/no-clobber generation, wrong binding/stale/missing/unsafe record refusals, exact tenant identity and workflow-pin enforcement. Tenant preflight PASS, authenticating the unchanged11-migration set; no migration execution or database access. Package PASS0 before commit; whitespace PASS. Earlier81 publication methods and policy Ruff are unchanged implementation evidence. The two existing extraction review-record failures remain disclosed with unchanged applicability.

Reviewer review_reporting_disposition independently confirmed the exact head, clean state and exact preview-to-commit match, and inspected the logs; no tests were rerun by that reviewer. This is content review through the connected PR-author account, not independent-account approval or user acceptance. Ready for one fresh existing admission; all hosted/publication and final user gates remain.

Next: fresh admission for this head, existing baselines/native/publication and receipt, then the final user packet.

@samovers

Copy link
Copy Markdown
Owner Author

Fresh admission after zero-blocker review of the generated currentness companion. The prior source attempt's failure is preserved; this head supersedes its admission. This technical trigger supplies no merge or deployment authority.

OFARM2_BASELINE_ADMISSION
head=1b057a9af2658b9c985a3c3cc7bd86af6b83ef5c
blockers=0

@samovers samovers left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR #382 — implementation re-review

Verdict: zero demonstrated in-scope blockers. Zero new follow-ups. No required code changes identified. Ready for final exact-head human acceptance—not automatic merge.

Reviewed head: 1b057a9af2658b9c985a3c3cc7bd86af6b83ef5c
Previously reviewed design head: dc32be55e0a5908df46e76daf3ff50961b0b9c94
Base: ff092c414db9fa24dbd6ab86c7722db89e0c95b5

The PR now contains the implementation, tests, workflow pins and generated currentness companion across eight changed files. It remains draft and unmerged. This is no longer the design-only state assessed previously. The head was checked again before posting and remains the reviewed SHA.

1. The source-file-proof blocker is resolved in the implementation

_download_authenticated_source_file() implements the approved chain: exact execution commit → matching root tree → uniquely selected path components → supported regular-file blob → matching byte count and Git blob identity. Parents require tree/040000; terminals require blob with string mode 100644 or 100755. Selected symlinks, submodules, directory terminals, ambiguous entries and truncated trees refuse before their content can become an artifact expectation.

The raw-byte binding is correctly separate from evidence hashing. The reader verifies the Git blob identifier using the blob <length>\0 header, then staging calculates SHA-256 over the returned bytes. It does not mistake metadata-looking content for a non-file: object kind comes from the selected tree entry. The chosen raw-blob media type and mode distinctions match GitHub's documented blob and tree interfaces.

The transport change is also appropriately bounded. A source-only redirect handler refuses before a follow-up request, while the archive redirect handler is unchanged. Authentication, exact final-URL checking, the 8 MiB response limit and 30-second timeout remain. No response-provided URL, checkout, source execution or fallback reader is introduced.

2. The wrong-revision comparison is removed without trusting producer claims

Staging obtains the paths from trusted configuration, constructs one ordered expected artifact-hash list, and supplies it as a required argument to both producer validations and both staged revalidations. The former POLICY_ROOT / path artifact calculation is deleted rather than retained as a fallback. Artifact retrieval and producer validation occur before authoritative output creation.

Configuration, dependency locks and schema remain policy-owned. Their existing checks are not silently converted into producer-selected expectations. The baseline documentation now states that distinction, and the tests preserve those refusal cases. This fixes the verified-artifact boundary—not every possible future change to verification-policy inputs.

3. The tests exercise the actual failure conditions

The strongest regression is present in the publication/admission test module: both producer envelopes contain the same false metadata hash, their comparison is recomputed, and the real staging function must refuse specifically at supported-file proof with no authoritative output. Directory, submodule, resolved-link, unresolved-link, parent-link and inventory-directory cases are covered. This avoids “passing” a negative test because an unrelated envelope field was invalid.

The complementary tests distinguish lawful changed-source bytes from stale policy hashes and invented other-revision hashes, including false claims in either run separately and in both runs together. They also test added, omitted, duplicated, changed and reordered artifact entries while checking that requests remain confined to trusted selections. Positive controls preserve executable-mode files and metadata-looking JSON as inert data.

The shared fixture is justified here: it supplies complete envelopes and exact-URL Git responses to existing staging consumers. It does not replace the validation decisions with mocks or introduce a general Git framework.

4. The generated currentness companion is acceptable

Both anticipated pin updates are present:

publisher policy
  → policy hash in evidence-publication.yml
  → publisher-workflow hash in conformance.yml

The workflow diffs contain the hash replacements, not changes to execution behavior or permissions.

Those bytes also affect the existing verifier-currentness manifest. I checked the additional sidecar diff: only the conformance-workflow hash and resulting aggregate digest change. Its schema, status, release-identity binding and frozen-receipt binding remain unchanged. The retained correction review records that the first source run correctly refused the stale sidecar rather than bypassing it.

The existing native-evidence RFC §9.4 expressly provides deterministic generation to a fresh temporary path, exact review and replacement through an ordinary repository diff. On this patch, the sidecar is a required mechanical companion—not a new provisioning identity, receipt rewrite or currentness-policy redesign.

5. The publication hold is cleared for this prerequisite

I inspected the current-head lightweight execution log and downloaded the final receipt and published baseline archives. The evidence now goes beyond PR-description claims:

Evidence examined Result
Current-head publication/admission unittest execution 81 tests passed; overall result OK
Lightweight package/architecture, lint and whitespace checks PASS
Both published baseline result sets 4,269 passed each, one warning each; no failures, skips, deselections or unavailable tests
Baseline report integrity Result-file bindings and both raw envelope hashes match
Clean-run comparison Reports equivalent; independent comparison found equality outside the declared volatile fields
Native verification Both architecture jobs report success; publisher reauthentication steps report success
Final publication Receipt issued successfully by the existing trusted default publisher

Publisher run 34575188363 completed authoritative staging, native reauthentication, final admission checks and receipt upload—not merely provisional artifact creation.

I independently confirmed that:

  • The receipt ZIP and baseline ZIP digests match live GitHub artifact metadata.
  • All four source and five published artifact references in the receipt match the retrieved metadata.
  • The receipt identifies this head, admission comment 5630765525, and execution merge 100eeeb051c149c5d032942e3c6b7bc59bbd3afa.
  • That merge commit has exactly the stated base and reviewed head as parents.

The supplemental offline evidence-check record is retained in the review conversation as implementation_evidence_check.json; it is not a repository artifact or an additional authoritative publication receipt.

The bootstrap distinction remains important: publisher run 34575188363 used existing default policy ff092c414db9fa24dbd6ab86c7722db89e0c95b5. The new reader's changed-source behavior is exercised by the candidate tests; this receipt does not demonstrate the new reader operating as the trusted production publisher. That is the intended pre-merge sequence, not an evidence substitution.

Limits and disposition

I did not execute repository tests locally, independently reauthenticate the native binary archives, rerun the sidecar generator, or retrieve the original task-user approval messages. A local clone attempt failed because the container could not resolve GitHub; source review continued through the connected GitHub tools. The offline work here checked downloaded evidence bytes and internal consistency, not runtime behavior.

The two disclosed extraction-consistency failures remain failures, and policy-owned configuration/lock/schema revision handling remains a separate follow-up. Neither is silently closed or waived by this review.

Recommendation: proceed to the final exact-head acceptance packet without further implementation changes. This remains an implementation/conformance and repository evidence-policy correction; no active OFARM baseline-law amendment is needed. After authorized merge, PR #380 still requires its own fresh applicable verification and publication—it does not inherit this PR's receipt.

Submitted as COMMENT. This is content review through the connected account, not independent-account approval, task-user final acceptance, a baseline-admission trigger or merge authorization.

@samovers
samovers marked this pull request as ready for review September 11, 2026 08:10
@samovers
samovers merged commit 70025a9 into main Sep 11, 2026
4 checks passed
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.

Bind published artifact hashes to authenticated source commits

1 participant