Skip to content

Prevent compliance self-acceptance through nullable reviewer metadata - #386

Merged
samovers merged 3 commits into
mainfrom
delivery/kernel-self-review-eligibility
Sep 13, 2026
Merged

samovers merged 3 commits into
mainfrom
delivery/kernel-self-review-eligibility

Conversation

@samovers

@samovers samovers commented Sep 12, 2026

Copy link
Copy Markdown
Owner

Prevent new compliance self-acceptance through reviewer hints

Closes #385. Related Tracking Epic #180 and issue #179. Observation eligibility remains separate Delivery #387.

Completed technical verification — 2026-09-13

Ready for final task-user acceptance at 8a11d3f2182e9c0504dab2763f01d9c83202dd8e. B2 is closed by executed compliance-capture controls and corrected E02 attribution; P3 is addressed. Runtime and approved E01–E07 are unchanged. Fresh bounded review found zero demonstrated in-scope Blockers. Final live capture shows the same open, non-draft, mergeable head and policy base, no new review finding or close/reopen transition, and an unchanged unedited OWNER admission. Merge is not authorized.

  • Lightweight 34771445121, attempt 1: 243 tests passed. The pull-request-triggered admission gate passed and its expensive executor was intentionally skipped; actual expensive evidence comes from the separate admitted source below.
  • Fresh admission 5654866449, created and updated 2026-09-13T17:26:44Z, body SHA256 ddbc3af8811c9faf7ef9f9f218eb4d5642a9480b68e8ebaec25b7295e7c1c144.
  • Source 34771614410, attempt 1, SUCCESS: both full runs contain 4,483 collected, selected and passed tests each, zero failures, errors, skips, deselections, unavailable, xfail/xpass or collection failures/skips; exactly one configured Starlette/httpx collection warning each. Pytest durations: 907.72s and 905.46s; complete steps: 17:29:29–17:44:56 and 17:44:56–18:00:20 UTC. Clean-run equivalence and root platform evidence passed. Native AMD64 passed in 7m48s, ARM64 passed in 6m23s.
  • Exact environment authenticated: Linux x86_64/ubuntu-24.04, CPython 3.12.13, PostgreSQL 17.10, pip 26.1, hash-locked dependency set, non-optimized assertions. The two subprocess runs share three disposable clusters isolated by primary, security-audit and provisioning lanes; they do not claim separate servers per run.
  • Separate publisher 34773303889, attempt 1, SUCCESS. Both policy SHAs are e50ae95f43d0e73b12113463d0e4ea85eebdc14b; admitted execution merge 8ca3d352f6d6e248f3052b3006db4b48beb6a375, tree 63d532112ed7c705997d0d71f5f6d0fec12928f7, exactly the candidate tree.
  • Final receipt artifact 10322721945 authenticated, ZIP digest sha256:4cfcb2bfcf5ade9e2027525fdef70339d6d7ee6a33065b7a11bdd10d51f7ee0c; receipt JSON SHA256 285dbf1473c620ea3a08a124a10a594b671a13f734ed45e31d6cb11184dc69ce. All four source and all five published IDs/digests, workflow refs/policy SHAs, runs/attempts, exact head/admission and receipt-last publication were verified.
  • Full read-only consumer PASS, report SHA256 abe205ceb950a5ff2ee67a2160071c67ff9eddfcc6811e82c1d11957c1aad95f, captured 18:03:10–18:03:37 UTC. Both published and provisional equivalence records were independently recomputed. Native image archives were not downloaded or re-executed locally: their live API/receipt bindings and small index were checked; the trusted publisher re-authenticated native artifact contents. This verifies the capture interval, not future merge authority.

All current evidence is preserved under plans/kernel-self-review-eligibility-evidence/review-fix-b2/ in the task workspace. Earlier 81f1ce1 evidence is historical and has not been reused as current admission/publication. Historical accepted-null replay, observation #387, conditional structure risk and extraction FAIL2 remain disclosed; the conditional extraction-status gate is inapplicable, not waived. Main protection remains disabled, so these gates are procedural. No runtime expansion, audit restart, deployment or merge occurred.

Next: present the replacement complete same-task final packet and end the turn. Only a later exact task-user authorization can allow fresh live checks and a normal expected-head GitHub merge.

Approved boundary and final scope

Primary trust boundary: self-review eligibility for new legacy compliance acceptance, before new accepted-force emission. Decision OFARM2-LEGACY-SELF-REVIEW-ELIGIBILITY-001 version 1, original card msg_0d813f8071772f9a016aa59fc72b5487d293c170fb684a3b55 (2026-09-12T18:54:24.109Z), then exact task-user approval msg_01a09a37-50c0-7991-acaa-b175fe812417 (2026-09-13T10:01:51.552Z), in task 01a07cc8-4157-7b33-a0ca-becb772e0e8b. Originals were retrieved directly again before this correction; later user messages only requested review reading. These references navigate the original authority; GitHub reviews and this body do not supply approval or merge authority.

The one runtime change remains removal of the reviewer-hint comparison from if ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed. It routes otherwise-valid confirmed compliance through existing review-required capture regardless of null, omitted, self or distinct body-named reviewer metadata. Raw metadata does not establish an independent reviewer. An authorized distinct actor can subsequently accept the same pending assertion once.

Full diff against base e50ae95f43d0e73b12113463d0e4ea85eebdc14b: five files, 689 additions / 12 deletions. Runtime kernel/stages.py remains one insertion/two deletions and is byte-identical to the previous implementation head (SHA-256 834264977d8082365b8dcff11cf82cb4eaf410ff1b21fb2fbf0fa8aa46732c59). Other files: kernel/tests/test_self_review_eligibility.py (264 lines, eight collected cases), generated conformance/review_baseline_test_inventory.json (4,483 entries), docs/REVIEW_DISPUTE_SEMANTICS.md and docs/rfcs/OFARM_Legacy_Self_Review_Eligibility_RFC_v0_1.md. This correction alone changes the test, inventory and RFC, 91 additions/9 deletions. E01–E07 remain byte-identical; active semantics and all runtime are unchanged from 81f1ce1.

Review correction and evidence trace

Executed implementation review 5191463884 identified B2, a real E02 evidence gap: all six initial compliance tests used true confirmation; existing confirmation-matrix tests submit operation claims and never execute the compliance condition. The shipped runtime was correct, but removing and confirmed escaped those tests. The earlier E02 evidence row implied coverage it did not supply. It is superseded by the explicit class attribution below.

Invariant Current evidence and limits
E01 Existing confirmed-null HTTP/public-pipeline controls, pending records and zero acceptance; original parent calibration failed exactly the three null cases. Runtime unchanged in this correction.
E02 New test_http_unconfirmed_compliance_keeps_capture_only[omitted/false] exercises COMPLIANCE_ASSERTION through real HTTP and Store. Both require RETAIN_DRAFT, empty problems, one pending compliance assertion, no review/consequence or REVIEW edge, original raw-input digest/prior rows and a stored REVIEW_PROMOTION result without a routing reason. Existing four compliance reviewer controls still require review when confirmation is true. test_review_confirmation.py separately exercises OPERATION_CLAIM confirmation and shared parser/transport controls; it is not evidence for the compliance-specific conjunct.
E03 Existing same-null-origin HTTP lifecycle checks asserter refusal without consumption, distinct advisor acceptance once, actual reviewer/server time, REVIEW/EVENT_SOURCE links, immutable PENDING_REVIEW assertion and duplicate refusal.
E04/E05 Existing lawful operation/structure, authority/evidence and correction/retirement paths remain unchanged; earlier compatibility evidence is historical, and fresh full baselines now passed for this head. No observation guarantee is added.
E06 Existing pending replay/raw-conflict regression remains green. The retained-database history probe was executed on the prior implementation runtime, which is byte-identical: old accepted references and receipt-only replay remain, while a fresh key requires review. That probe is sequential evidence, not concurrency or historical cleanup.
E07 No parser, queue validator, emitter, transaction, grants/principals, signing/custody, canonical/frozen data, production closure, bundle inventory or publication-policy change. Bounded source comparison, mandatory package/architecture/temporal checks and exact inventory delta verify this correction; no restarted security audit.

Local verification of this correction

  • Eight focused compliance cases: 8 passed, 5.70s.
  • Existing operation-claim/shared confirmation module: 21 passed, 14.69s.
  • Calibration in a separately labelled disposable source copy with only and confirmed removed: 2 failed / 6 deliberately deselected, 1.52s. Both new cases fail because REQUIRE_REVIEW replaces RETAIN_DRAFT. Expected failure is preserved honestly; the real worktree runtime was never changed by the mutation.
  • Mandatory precommit package including architecture/temporal: PASS, zero failures, 8.558s. Changed-test Ruff and whitespace PASS.
  • Prescribed update-inventory: 4,481 → 4,483, exactly two additions, zero removals/reattributions. Relative to main: +8. Raw inventory SHA-256 c7595e8f475ae25c5e7268a45344e31787b01c7d108244df27a0455c3942e157; entries SHA-256 737e688267c914da5d829097004d7ea9f94726f80e0d02b9136478574573b384.
  • Fresh extraction diagnostic: FAIL 2, the same missing review records for root review-baseline inventory and kernel/tests/test_rewrite_architecture_check.py. Existing conditional extraction-status gate is inapplicable to this test/documentation correction; extraction-status/navigation and checker/review records are unchanged. Changed-path seed sequences are identical; no new country/profile authority enters the kernel. No waiver or all-green extraction claim.

Environment: CPython 3.12.13/macOS ARM64, all installed versions match the earlier lock-verified local set, PostgreSQL 17.10 from the exact pinned image, function-isolated fictional fixture databases. Local matching versions do not authenticate Linux wheel hashes. The uniquely labelled B2 container, temporary databases and mutation source copy were removed after capture; all evidence retained. Other containers and worktrees were preserved. The two pytest runs and selected mutation each retain one known Starlette/httpx warning. Local evidence lives under plans/kernel-self-review-eligibility-evidence/review-fix-b2/ in the task workspace. The initial implementation's 239 local passes, full history capture and 4,481-case hosted evidence remain intact as explicitly earlier-head evidence.

Findings and non-effects

The new review explicitly closes B1, F1, P1 and P2 and withdraws B1's Blocker label. Earlier reports saying it had not been withdrawn describe the earlier state. Observation's runtime defect still belongs to open #387; documentary closure does not repair it. The structure comparison requires future review if carrier admission and eligibility diverge. P3 is addressed by citing public design review 5191268560 and its verified body SHA-256 e90217cb974bef9c9e5c4ece5a997489193bb2d322b03a94775304837bb14960 beside the original task-message citation. That public body is the old design review plus one terminal newline; API attachment to the implementation head does not change its stated design-head scope.

Reviewer measurements used CPython3.11/PG16/unpinned wheels. They found the B2 gap and independently checked selected source, inventory, merge-tree and admission facts, but did not authenticate the full archives, pinned gates or full hosted run contents. They do not substitute for this head's fresh verification. Historical accepted-null replay still returns old accepted references: no historical migration or repair is included. No observation/structure runtime decision, new authority, custody, transaction, publication mechanism, deployment or production activation is included.

EXC-001–006

One existing authoritative decision path; no duplicate authority, state, normalization or fallback. The two added real-entry/Store tests close the specific E02 trace gap and fail against the measured counterexample. The obsolete compliance comparison remains deleted; still-used distinct-body/structure controls remain. No kernel abstraction is added. Null coercion/rejection would alter ingress/replay, and a shared allowlist would introduce separate observation/D17 decisions. This test/documentation correction preserves the approved vertical slice and all decision-level effects.

Next: present the completed replacement packet and yield for later exact-head user merge authorization; no merge is authorized yet.

Complete bounded exact-head B2 correction review

PR #386 — bounded B2 correction review

Reviewed head: 8a11d3f2182e9c0504dab2763f01d9c83202dd8e.
Correction parent: 81f1ce1138242c668d13a969337f3e55d8cd4b2b.
PR base: e50ae95f43d0e73b12113463d0e4ea85eebdc14b.
Tree: 63d532112ed7c705997d0d71f5f6d0fec12928f7.
Repository / Delivery / PR: samovers/OFARM2, #385, #386.
Decision: OFARM2-LEGACY-SELF-REVIEW-ELIGIBILITY-001 version 1.
Primary trust boundary: self-review eligibility for new legacy compliance acceptance.

Verdict: zero demonstrated in-scope Blockers in the correction and affected
E02 invariant. B2 is closed by the new executable evidence and corrected
attribution; P3 is addressed. No new Follow-ups or Preferences.

This is the bounded post-Blocker review required by AGENTS.md, not another
unconstrained content review or a restarted audit. I read the complete
81f1ce1..8a11d3f diff, relevant existing HTTP/Store/fixture helpers, the approved
E02 and EXC-003 requirements, and the captured commands and results listed below.
I independently checked current HEAD, a clean worktree, changed-file hashes,
whitespace, inventory entries/digest, unchanged runtime/active semantics/E01–E07,
and the cached public review body digest. I did not run tests, databases,
workflows or GitHub operations during this review.

B2 — direct evidence now covers the confirmed conjunct

The added test_http_unconfirmed_compliance_keeps_capture_only has exactly two
parameters: omission and literal False. Its _compliance() fixture is a valid
fictional COMPLIANCE_ASSERTION, with the existing null reviewer hint and
durable demo evidence. Each parameter changes only confirmation. _commit
uses the real legacy POST /commit route through TestClient, with the fixture's
header-bound actor; the route uses the actual Store and pipeline. fresh_env
creates and drops a function-isolated database and bootstraps fictional records.
The test does not bypass the gate or mock its result.

Both cases assert RETAIN_DRAFT, an empty problems list, exactly one returned
pending compliance assertion naming its asserter, no emitted review or accepted
consequence, unchanged persisted review/consequence records, and no REVIEW
edge. They also verify the input and stored raw digest, preserve existing record
bytes, and inspect actual kernel_gate_log rows for exactly
(RETAIN_DRAFT, None) at REVIEW_PROMOTION. Thus the proof covers both the public
result and durable effects/routing evidence; it is not a response-label-only
test or another OPERATION_CLAIM control.

Captured candidate execution passed all eight focused cases. The separate
disposable-copy mutation removes only and confirmed from the compliance
condition; both new cases then fail at the intended outcome comparison because
the mutation yields REQUIRE_REVIEW instead of RETAIN_DRAFT. Six existing
cases were deliberately deselected in that calibration. The mutable copy's
test digest equals the committed candidate test digest. This demonstrates the
missing E02 guard is now pinned; it is not an exhaustive mutation-adequacy claim.

The RFC explicitly separates these compliance controls from the existing
operation-claim confirmation and shared parser/transport tests. It acknowledges
the original six-case prediction missed this axis, preserves the initial
results as historical, and records the focused correction without changing the
approved invariant. The live PR's E02 evidence row must use that same precise
attribution when the root task synchronizes publication metadata; an earlier
head's packet or baseline is not the new head's evidence.

P3 — public review attribution is verifiable

The RFC now cites
review 5191268560
beside the existing task-message reference. I recomputed its cached API body
SHA-256 as e90217cb974bef9c9e5c4ece5a997489193bb2d322b03a94775304837bb14960.
Removing the public body's one terminal newline produces the task-review hash
f568d9740295a1c9b45511e4963adeb810cd54eecdc37f6047c28a3fa5249e4a.
The RFC accurately notes that the body concerns the old design head despite
GitHub attaching the formal review to the earlier implementation head. These
are evidence/navigation references, not semantic approval or independent human
authority. I used the root task's fresh cached API response; I did not make an
additional network request.

Scope, inventory and evidence

The correction changes only the existing test module, generated baseline
inventory and RFC: 91 insertions / 9 deletions across three files. The full PR
remains five files, 689 insertions / 12 deletions. Runtime and active semantics
are byte-identical to 81f1ce1; the seven approved RFC invariant rows are also
byte-identical. There is no changed allow/deny decision, authority, identity,
history/replay rule, deployment posture or independent capability. Version-1
semantic approval therefore continues to cover this in-boundary evidence fix;
the required new exact-head review and fresh applicable hosted evidence still
apply.

I independently recomputed the canonical inventory digest and entry delta:
4,481 to 4,483, exactly the two new parameter nodeids, no removals,
reattributions or duplicate nodeids. Entries digest:
737e688267c914da5d829097004d7ea9f94726f80e0d02b9136478574573b384.
The prescribed update-inventory command exited 0 and recorded 4,483 pinned
tests. No new country/profile seed terms are introduced by these changes.

Captured check Result reviewed
Candidate focused module 8 passed, 1 known warning, 5.70 seconds; exit 0
Isolated m2 mutation 2 expected failures, 6 deliberately deselected, 1 known warning, 1.52 seconds; exit 1
Existing operation-claim confirmation module 21 passed, 1 known warning, 14.69 seconds; exit 0
Mandatory package / temporal / architecture PASS, 0 failures; command exit 0, elapsed 8.558 seconds
Generated inventory 4,483, exactly +2; command exit 0; digest/delta independently checked
Whitespace git diff --check independently passed
Extraction diagnostic FAIL, 2 missing review-record failures, retained as failing

The extraction failures remain the inventory and unchanged architecture-test
paths. This correction does not change extraction-status/navigation artifacts,
and the test/inventory delta adds no seed term. The documented conditional
extraction-status gate remains inapplicable; no waiver or passing extraction
claim is supplied. Ruff PASS is recorded by the root task, but I did not rerun
Ruff or authenticate a separate Ruff transcript in this bounded review.

The recorded local interpreter is CPython 3.12.13 on macOS ARM64, with versions
matching the previously verified lock; Linux wheel hash authentication remains
a fresh hosted obligation. The recorded PostgreSQL 17.10 container uses the
baseline image digest, localhost binding, task/Delivery ownership labels and
tmpfs data. The command wrapper clears inherited OFARM variables and supplies
the owned connection coordinates. Cleanup records removal of that owned
container, its data and the disposable mutation copy, with other containers
untouched. I inspected these records and the fixture implementation; I did not
independently repeat container cleanup or DB probes.

Continuing limits and authority

Review 5191463884 explicitly closes its B1/F1/P1/P2 requests and withdraws B1's
Blocker label. Their documentary closure does not repair the observation
runtime discrepancy owned by Delivery #387, remove the structure comparison,
or change historical accepted-null replay. All remain disclosed. No new audit,
concurrency, production authentication, custody, transaction or native artifact
execution claim follows from these two tests.

EXC-001/002: existing runtime authority and shared fixture helpers remain the
single paths; no parallel policy or durable state is added. EXC-003: the missing
compliance-capture invariant now reaches actual public-entry/Store evidence and
fails under its specific counterexample. EXC-004: the original deleted runtime
comparison remains deleted; this fix removes misleading evidence attribution.
EXC-005: no abstraction is added. EXC-006: two parameters in one small sibling
test are sufficient; a larger matrix or runtime policy consolidation is not
needed to close this demonstrated gap.

authority-retrieval.json preserves the root task's direct retrieval of the
original complete card and later exact user approval, their stable IDs/order,
and only the later review-read requests. This review checks consistency of that
record; it does not manufacture or replace approval. There is no PR #386 merge
authorization. Prior 81f1ce1 hosted results remain historical, not current-head
admission or proof.

Digest bindings

SHA-256 values recomputed during this review:

Item SHA-256
Candidate test module b108b809b7824f5d64e21e4ae24847c4404be0fcd36dca00137f97b1334d5391
Candidate inventory file c7595e8f475ae25c5e7268a45344e31787b01c7d108244df27a0455c3942e157
Candidate RFC 06a82afcd8e7176b2aa3c3da843923cfe9deca6833eb6a9d41af0919eab8e25e
Unchanged runtime stages 834264977d8082365b8dcff11cf82cb4eaf410ff1b21fb2fbf0fa8aa46732c59
candidate-scope.json at review 0d9bf88cfcc8fdb99561e3cfcd192902fa5ec2d1f08ba582e7d9ff40d98a1d7b
regression-candidate.log 6255780398abfde4730942bd7a292b62c2434b8ae705237271c4f495eed48353
mutation-m2.log d61a9e2a2c67f9b333e8f64620e403cf08e6c4a89f8bd6afd4a98a1e9d6b7df0
shared-confirmation.log bdfcae67566d0854de92458e08874639b02128082e6930d74cbb8fba25c80c48
package-precommit.log ffde5958f9f39f8122b9c3953e4c8bd444822a544a4f0c25eb2e89c26d674699
inventory-delta.json 1ee741e832115e28311a4e1062e445fb66d6136aa684f95116490cb7612ba43c
scope-check.json 99fef70309223d2fc76ada875526ed9e70acdbda364d6abeb0d214947bb7afe4
authority-retrieval.json 9f12053146a7ddc905e7701bdb591714e3213887fab69f12d78b18c0e9d7e6d8
cleanup.json 7f945d581c643c8b39d1e63d0034f9a18bec4dac63ab8462c54b2f378f5ef253

Next: synchronize the PR's E02 attribution, use fresh unedited admission for
this reviewed head, complete required hosted execution and trusted publication,
then present a replacement exact-head packet and yield for the separate later
task-user merge authorization.

Record the proposed high-risk Phase A for Delivery #385 under M1 review semantics. Keep the runtime unchanged until its own exact semantic approval, and distinguish new promotion from historical replay.

@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 #386 — design review

Verdict: No blocking design findings. Ready for the semantic-approval step, not for merge as a completed repair.

Reviewed head: 047266833d04797cce773a3cd221b8363bda78c0.
Base: e50ae95f43d0e73b12113463d0e4ea85eebdc14b.

The diff adds only the 232-line self-review eligibility RFC; it does not yet change runtime behavior or add regression tests. This is a Phase A design review, not implementation verification, task-user semantic approval, baseline admission, merge authorization, or production permission.

Technical assessment

The proposed change addresses the actual cause.

In ReviewPromotionGate.run, explicit reviewerPartyRef: null currently escapes both the compliance self-review condition and the distinct-reviewer guard. However, emit_self_review_promotion records the acting party as the reviewer regardless of that hint. Removing the compliance condition's reviewer-hint comparison therefore aligns eligibility with the review act that would actually occur:

ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed

That is the appropriate narrow correction. Rejecting null at ingress or inventing a fallback reviewer would change more behavior without improving this enforcement boundary.

Sources: kernel/stages.py:625–665, kernel/emission.py:169–193.

The existing independent-review path remains compatible with the proposal.

The normalizer sets acceptance_target only for GOVERNANCE_DECISION, so adding review-target fields to a compliance submission cannot bypass the proposed routing through the queue-emission branch. The queue validator checks the stored asserter against the actual acting party and refuses disallowed self-review before emitting a review decision. The proposed compliance predicate does not interfere with a distinct reviewer's separate governance decision.

Sources: kernel/stages.py:274–279, kernel/validators.py:561–587.

The historical limitation is explicit rather than concealed.

Replay runs before promotion eligibility and can return the original accepted references without creating another acceptance. Consequently, this repair will not remove incorrect historical acceptances or stop their matching replay responses from exposing those references. The RFC preserves that behavior deliberately and requires a base-to-candidate probe against retained historical records. This is consistent with the stated scope, not an overlooked promise to repair history.

Sources: kernel/emission.py:477–589, proposed RFC — historical replay.

The verification plan tests the outcome that matters.

It requires more than a REQUIRE_REVIEW response: the same null-origin assertion must remain pending, survive the asserter's refused acceptance, and then be accepted once by an authorized distinct reviewer. It also requires persisted-record and edge checks, a demonstrated failure on the unmodified base, HTTP and public-pipeline coverage, and replay/digest-conflict checks. Those obligations are already in the proposal; I found no need to expand this into a general eligibility framework or broader lifecycle redesign.

Source: proposed RFC — decision invariants and falsifiable evidence.

Validation and remaining limits

I confirmed that lightweight workflow run 34712299485, attempt 1, completed successfully for the reviewed SHA. That is not evidence that the eligibility defect has been fixed—the implementation is absent from this head. I did not execute runtime tests or PostgreSQL probes during this review.

Recommendation: Proceed with the proposed decision card without design changes. After approval, keep the runtime correction, same-claim lifecycle regression, historical-replay probe, and necessary documentation/inventory updates together in this PR. Implementation review and fresh execution evidence remain required before merge.

No new blocking design findings or additional scope requirements.

@samovers

Copy link
Copy Markdown
Owner Author

PR #386 — independent Phase A design review (executed)

Reviewed head: 047266833d04797cce773a3cd221b8363bda78c0. Base: e50ae95f43d0e73b12113463d0e4ea85eebdc14b (tree 17b134856f75391df50cf2dc298dc3bcef6c6208, parents b6017da1dbfac80b5c2e98641aaa34d96691d087 + 9b37d12cc2211b50e66eb3abe8c3e58b8e96f402 — the RFC's "reviewed runtime tree" claim is exact).

Verdict: one Blocker, one Follow-up, two Preferences. The proposed predicate is correct and I measured it closing the defect end to end, including the same-claim queue lifecycle and the history non-effect the RFC defers to post-approval. The Blocker is not in the predicate: it is that this decision card, whose stated trust boundary is self-review eligibility enforcement before new accepted-force emission, leaves a second, larger, undisclosed self-acceptance on the samedecision point and does not name it.

Position of this pass

There is exactly one review on this PR: 5187685070 (samovers, COMMENTED, 2026-09-12T19:08:22Z, 4,967 chars), which states in its own words "I did not execute runtime tests or PostgreSQL probes during this review." No issue comments, no inline findings. This pass is therefore the first executed review at this head. It confirms four of that review's source-inspection claims by measurement, supplies the E06 base-to-candidate probe that review and the RFC both defer, and adds one finding neither has.

I am the PR author's own account. GitHub will not let me APPROVE or REQUEST_CHANGES here, and a self-review does not satisfy an "independent review" gate. Both reviews on this PR are samovers. Do not treat the gate as met.

Identity and scope, re-derived

Independent clone, git fetch origin refs/pull/386/head:pr386:

Fact | Measured -- | -- Files changed | 1 — docs/rfcs/OFARM_Legacy_Self_Review_Eligibility_RFC_v0_1.md Additions / deletions | 232 / 0 (API: additions 232, deletions 0, changed_files 1, commits 1) RFC blob | b1dafbc0992c91d1c42b65733718e36b69fe1b2e RFC size | 232 lines, 16,183 bytes, SHA-256 cc644f247308bbb1bf5b61db6ebec81f015a7dd5412c6049c247c3d8ffbf1b7e git diff --check e50ae95 pr386 | clean PR state | open, draft Referenced work | #385 open ("Prevent nullable reviewer metadata from permitting legacy compliance self-accept"), #180 open (Tracking Epic) — both exist and match

E06 — the base-to-candidate history probe the RFC defers to post-approval

I ran it now, because it is the strongest claim in the RFC and the cheapest to get wrong. One persistent disposable database; phase 1 executes on the unmodified base bytes and creates the fictional bad acceptance; phase 2 executes on the patched bytes against that same retained database.

phase=base       NEW_REQUEST                PROMOTE_ACCEPTED
                 +17 records, +11 edges, +7 gate-log rows, +1 idempotency row
                 assert:2ad4293844394c8b  review:14c5366453fd4fd6  conseq:fb93905a84a247ee

phase=candidate (same key, same body) REPLAY_REUSED_RESULT / REPLAY_MATCH_REUSED_RESULT
returns the SAME assert/review/conseq refs, replayOf cir:e4a0078728e34894
+3 records (commitingressrequest, commitingressresult, promotiontrace),
+1 gate-log row, +0 edges, +0 idempotency rows

phase=candidate (same body, FRESH key) REQUIRE_REVIEW HUMAN_APPROVAL_REQUIRED
0 reviews, 0 consequences

Exactly the RFC's §"Historical replay is deliberately preserved", measured: a matching historical accepted-null key still hands back the old accepted references and creates no new assertion, review, consequence or edge; the same body under a new key is a new eligibility evaluation and is refused. The Material limit paragraph is accurate, and it is the right thing to have written down.

No regression in the suites the RFC names

test_review_confirmation.py, test_m2_review.py, test_correction_authorization.py, test_correction_transactions.py, test_conformance.py, test_review_fixes.py, test_stages.py:

candidate: 2 failed, 229 passed (136s)
base: 2 failed, 229 passed (147s) <- same two tests, identical

The two are test_conformance.py::test_04_gate_sequencing_fixtures_live and ::test_10_document_assembly_freeze_trace, both failing on assert result["refused"] is False. They are an artifact of my harness, not of the patch: test_conformance.py alone passes 23/23, and test_conformance.py + test_m2_identities.py with the patch pass 42/42. Running the conformance suite alongside other files in one session pollutes its session-scoped store. Calibration is what matters here and it is clean — the failure set is byte-identical on both sides, so the comparison holds, but this is not a green conformance claim.

Other RFC statements I checked in code

  • "sub.get("reviewerPartyRef", ctx.acting_party) returns None for a present null, suppressing the compliance routing rule" — kernel/stages.py:631. True.
  • "The separate body-named-reviewer guard also excludes None" — :659, not in (None, ctx.acting_party). True.
  • "The direct emitter always names ctx.acting_party as both asserter and reviewer" — true, and measured: every self-review promotion I produced had decidedByPartyRef == assertedByPartyRef. This is what makes the removed comparison a no-op for correctness rather than a load-bearing check.
  • "The normalizer populates acceptance_target only for GOVERNANCE_DECISION" — :277-279, exact. And probed: a compliance submission carrying reviewTargetAssertionRef, reviewTargetConsequenceRef, or both plus reviewAction: REVIEW_ACCEPT  REQUIRE_REVIEW every time, and the named pending target kept PENDING_REVIEW with 0 REVIEW edges. The class boundary holds.
  • "IngressNormalizer.run and ReplayWriter.write short-circuit before the promotion gate" — stages.py:202 returns GateReplay(ReplayWriter().write(ctx, prior)) on an existing key; ReplayWriter is kernel/emission.py:470. True.
  • "For a distinct-body-named compliance request, both existing routing explanations may now appear" — measured exactly: problems ["Self-review out of scope", "Distinct reviewer requires own act"], both HUMAN_APPROVAL_REQUIRED, so the logged reason_code and the outcome are unchanged. The RFC's prediction is precise and the "diagnostic addition is permitted" framing is right.
  • "The existing conformance tests 93/94 provide valid compliance/queue fixture patterns" — test_93_governed_acceptance_semantics has a queue_compliance() helper; test_94_second_hostile_regressions already runs the full distinct-named compliance → advisor-accepts → double-accept-refused lifecycle. Good citation; test_94 is the template E03 wants.
  • "HTTP actor mismatch retains its existing 403 precedence" — test_http_actor_binding_precedes_malformed_confirmationpasses unchanged.
  • "Public production governed routes remain closed" — kernel/api.py:74-83 blocks /commit, /review/accept|reject|contest, /records/{id}, both views. True, and it bounds both this defect and B1 to the legacy development surface.

Checked and decided were not findings

Recording these so the next reviewer does not re-spend the time.

  • Architecture budgets — the usual place an unfound Blocker hides here, and it is empty this time.kernel/stages.py appears in no MODULE_BUDGETS, COMMAND_MODULE_BUDGETS or GROUP_BUDGETS entry, so the predicate edit (−1 line) pays into nothing. TEST_GLOBS matches none of the RFC's named test files, so MAX_TEST_LINES = 800 and TEST_MODULE_BUDGETS do not apply to them either (test_review_confirmation.py is at 284 lines; test_conformance.py at 2,065 already exceeds 800 and is legal precisely because it is unmatched). Phase B's planned six cases cannot breach a budget. No finding.
  • Generated inventory. conformance/review_baseline_test_inventory.json: entryCount 4,475, entriesSha256 160c1ac7ce1991ec…, pinning nodeid + sourceModule + sourcePath per REVIEW_BASELINE.md:76-90; adding tests requires the explicit update-inventory maintenance command, which the RFC names. conformance/review_baseline_config.json's knownGreenBaseline.observedInRun.testSummary.collected = 491 is not enforced — run_review_baseline.py reads only actions pins and postgresqlImageDigest from that object. warningPolicy is exact-inventory with one expected entry whose nodeid is "" and when is "collect", so new tests do not multiply it. The RFC's expected-areas list is adequate. No finding.
  • sub stays used after the deletion (:646, :658-662), so no dead-local or lint consequence.
  • Other promoting classes. Only four classes promote; NOTE, HYPOTHESIS_ASSERTION, EVIDENCE_RECORD, ADVISORY_OUTPUT are non-promoting and RETAIN_DRAFT. Of the four, OPERATION_CLAIM (D8) and bounded STRUCTURE_ASSERTION (D17) are decided, COMPLIANCE_ASSERTION is what this PR fixes, and OBSERVATION_ASSERTION is B1. The enumeration is closed.
  • Keeping the :658 distinct-reviewer guard is correct: it is the only thing routing a distinct-named operation claimor observation, both measured. EXC-004's "still-used" is accurate.
  • Duplicate JSON keys in the submission are last-wins in one dict for both parser and gate — same as Require explicit boolean confirmation for legacy acceptance #384, not a finding.

What could not be checked, and why

  • The pinned exact-interpreter gates (conformance/rewrite_architecture_check.py's architecture / temporal / package-contract checks). They refuse any interpreter other than CPython 3.12.13 (_authenticate_full_execution_profile, UNSUPPORTED_PYTHON_VERSION), and this session's egress refuses both codeload.github.com and www.python.org with proxy 403, so I could not build it. The author's recorded PASS (exit 0, 8.559s) is unverified by me. I substituted direct reads of the checker's budget tables, which is what the budget question actually needs, but it is not the same as running the gate.
  • PostgreSQL 17.10 and the hash-locked dependency set. Everything above ran on PG 16.13 with current PyPI wheels. The kernel Store does not enforce the 17.10 pin the way the security-audit provisioning path does, so these suites run — but role/RLS/wire-protocol-sensitive behavior is out of scope for this review and I make no claim about it.
  • The hosted lightweight run 34712299485 and the Phase A evidence digests. The GitHub API is refused from my container for this repo; I read PR metadata through the other machine but did not re-verify artifact digests or recompute the design-review report hash 65f53d8d….
  • Transaction atomicity, signing, custody, publication — inspected at the level of "a one-line predicate in one gate cannot reach them", not audited. E07 should not be read as audited by this pass.

What my method made easier than production

  • Authority was handed to me. demo.FARMER holds ASSERT_COMPLIANCE, OBSERVE_CREATE_OBSERVATION and REVIEW_ACCEPT on the demo farm by demo.bootstrap. A real grant topology might not co-locate assert and review rights on one party, which is the precondition both the fixed defect and B1 depend on. My probes prove the gate's behavior given that grant, not that the grant is common.
  • The legacy test transport binds the acting party from an x-acting-party header. No OIDC, no principal resolution, no token. Production governed routes are closed, so the reachability I demonstrated is development-surface reachability — for B1 as much as for the defect.
  • Fresh isolated databases per probe removed ordering, concurrency and accumulated-state effects entirely. Nothing here says anything about concurrent commits on one key, and the replay probe was strictly sequential in one process at a time.
  • I simulated the candidate by patching one line in my own clone. That is the RFC's stated patch and nothing else, but it is my transcription of prose, not the author's implementation. Every E01–E06 result above must be re-measured against the real Phase B head; treat them as a prediction that the proposed design is achievable, not as implementation evidence.
  • PG 16 / CPython 3.11 / unpinned wheels is a more permissive oracle than the pinned baseline. It passed 229/231 identically on both sides, which is good calibration for this comparison and nothing more.

Bottom line

The predicate is right, minimal, and achieves everything E01–E06 promise — I measured all of it, including the history probe the plan defers. Approve version 1 only after B1's three paragraphs are in, because approval freezes E01–E07 and E04 currently reads as a closed list that is not closed. F1 and the two Preferences cost a sentence each and should ride along. Then the real work is the implementation head: fresh evidence, nothing reused from #384, and the queue assertion written against the derived disposition rather than claimState.

Remove the reviewer-hint comparison from compliance eligibility so explicit null cannot create a new self-accepted review. Preserve raw replay identity and the usable queue, cover the same-claim lifecycle, and document the retained history limit and separate observation follow-up.

Delivery #385; approved OFARM2-LEGACY-SELF-REVIEW-ELIGIBILITY-001 version 1. Local regression 6/6, compatibility 208/208, conformance 23/23, production closure 2/2 and package checks pass.
@samovers
samovers marked this pull request as ready for review September 13, 2026 10:19
@samovers

Copy link
Copy Markdown
Owner Author

Exact-head content review completed for PR #386 / Delivery #385 at 81f1ce1 with zero demonstrated in-scope Blockers. The complete coordinated report is preserved in the PR description; SHA256 a36315eec436767776d5c4cdd47e5985fb8635df5da026caa9b9415c97c9c4db. Local verification and residuals are disclosed there. This comment invokes only the existing baseline admission mechanism; it is not human semantic approval, merge authority, publication success or production permission.

OFARM2_BASELINE_ADMISSION
head=81f1ce1138242c668d13a969337f3e55d8cd4b2b
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 #386 — independent Phase A design review (executed)

Reviewed head: 047266833d04797cce773a3cd221b8363bda78c0.
Base: e50ae95f43d0e73b12113463d0e4ea85eebdc14b (tree 17b134856f75391df50cf2dc298dc3bcef6c6208, parents b6017da1dbfac80b5c2e98641aaa34d96691d087 + 9b37d12cc2211b50e66eb3abe8c3e58b8e96f402 — the RFC's "reviewed runtime tree" claim is exact).

Verdict: one Blocker, one Follow-up, two Preferences. The proposed predicate is correct and I measured it closing the defect end to end, including the same-claim queue lifecycle and the history non-effect the RFC defers to post-approval. The Blocker is not in the predicate: it is that this decision card, whose stated trust boundary is self-review eligibility enforcement before new accepted-force emission, leaves a second, larger, undisclosed self-acceptance on the same decision point and does not name it.

Position of this pass

There is exactly one review on this PR: 5187685070 (samovers, COMMENTED, 2026-09-12T19:08:22Z, 4,967 chars), which states in its own words "I did not execute runtime tests or PostgreSQL probes during this review." No issue comments, no inline findings. This pass is therefore the first executed review at this head. It confirms four of that review's source-inspection claims by measurement, supplies the E06 base-to-candidate probe that review and the RFC both defer, and adds one finding neither has.

I am the PR author's own account. GitHub will not let me APPROVE or REQUEST_CHANGES here, and a self-review does not satisfy an "independent review" gate. Both reviews on this PR are samovers. Do not treat the gate as met.

Identity and scope, re-derived

Independent clone, git fetch origin refs/pull/386/head:pr386:

Fact Measured
Files changed 1 — docs/rfcs/OFARM_Legacy_Self_Review_Eligibility_RFC_v0_1.md
Additions / deletions 232 / 0 (API: additions 232, deletions 0, changed_files 1, commits 1)
RFC blob b1dafbc0992c91d1c42b65733718e36b69fe1b2e
RFC size 232 lines, 16,183 bytes, SHA-256 cc644f247308bbb1bf5b61db6ebec81f015a7dd5412c6049c247c3d8ffbf1b7e
git diff --check e50ae95 pr386 clean
PR state open, draft
Referenced work #385 open ("Prevent nullable reviewer metadata from permitting legacy compliance self-accept"), #180 open (Tracking Epic) — both exist and match

Runtime, tests, inventory and prior decision records are untouched at this head. That matches the status file and the PR body.

Method and environment

Everything below was executed against real PostgreSQL through the real legacy HTTP route (POST /commit, POST /review/accept) with the repo's function-isolated disposable-database fixture and fictional kernel.demo records only. Probe files were written into my clone, run, and deleted; the clone is clean.

Where a measurement needed the candidate semantics, I applied the RFC's §"Smallest proposed correction" literally — delete the reviewer-hint comparison from the confirmed-compliance condition, nothing else:

-        if (ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed
-                and sub.get("reviewerPartyRef", ctx.acting_party) == ctx.acting_party):
+        if ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed:

kernel/stages.py 760 → 759 lines; 1 insertion, 2 deletions. That is the whole patch I measured.

Environment honesty. CPython 3.11.15, PostgreSQL 16.13, dependencies installed from PyPI at current versions (psycopg 3.3.5, fastapi, starlette, pydantic, jsonschema, pytest) — not the pinned 3.12.13 / 17.10 / hash-locked requirements-review-baseline.lock set. I could not build the pinned interpreter today: both codeload.github.com and www.python.org are refused by this session's egress (CONNECT tunnel failed, response 403). Consequences stated where they matter, and in "could not check" below.


Blocker B1 — the decision card does not disclose that an entire promoting class self-accepts on the same decision, unguarded

Violated invariant. D8 scopes self-review to routine operation claims; D17 extends it narrowly to bounded farm-owned structure and says so explicitly — "extends D8 narrowly as a recorded decision, not an accidental consequence of the generic promotion path." After this correction, OBSERVATION_ASSERTION still self-accepts on the very decision this RFC governs, under no recorded decision at all, and needs no metadata trick to do it.

High-risk field Value
Entry point POST /commit on the legacy M1 transport (kernel/legacy_m1/api.py), the same route the RFC names as "the real negative". Public production governed routes are closed (kernel/api.py:74-83 blocks /commit, /review/*, views) — same bound as the defect being fixed, not a weaker one.
Actor A party holding OBSERVE_CREATE_OBSERVATION and REVIEW_ACCEPT on the farm — the one-person-farm grant shape D8 exists for. demo.FARMER holds it.
Path ReviewPromotionGate.run → no routing condition matches OBSERVATION_ASSERTION at all (kernel/stages.py:630, :645 and :658 are compliance / structure / distinct-named-reviewer only) → review_route_reasons empty → confirmed true → REVIEW_ACCEPT authority check passes → emit_self_review_promotion() (:730).
Preconditions Well-formed submission, resolving durable evidence, confirmAccept: true, reviewer metadata omitted (or null, or self-named). Nothing malformed, nothing null-dependent.
Consequence PROMOTE_ACCEPTED; AssertionRecord IN_FORCE; one ReviewDecision whose decidedByPartyRef equals assertedByPartyRef; one AcceptedEventConsequence (ACCEPTED_OBSERVATION_OCCURRENCE_STATESTATE_CHANGE_ACCEPTED). An accountable-review record naming the asserter as its own reviewer — exactly the artifact E01/E03 exist to prevent.

Measured at base e50ae95 and unchanged under the candidate patch, over real HTTP:

observation/reviewer-omitted   200 PROMOTE_ACCEPTED  reviews=1 consequences=1
observation/reviewer-null      200 PROMOTE_ACCEPTED  reviews=1 consequences=1
observation/reviewer-self      200 PROMOTE_ACCEPTED  reviews=1 consequences=1
observation/reviewer-distinct  200 REQUIRE_REVIEW    reviews=0 consequences=0
  decidedBy = assertedBy = party:demo.farmer.one ; assertionType OBSERVATION_ASSERTION ; claimState IN_FORCE

The same class, routed to the queue, is refused to the same actor — which is the direct/queued asymmetry in one pair of calls:

observation/no-confirm-capture        200 RETAIN_DRAFT    (pending assertion)
observation/queue-accept-by-asserter  200 RETAIN_DRAFT    HUMAN_APPROVAL_REQUIRED
observation/queue-accept-by-distinct  200 PROMOTE_ACCEPTED reviews=1 consequences=1

kernel/validators.py:578-587 is the refusing code, and its comment is the point: "D8 holds at the queue door for BOTH verbs", enforced as an allowlist over policy.SELF_ACCEPTABLE_ASSERTION_TYPES. Measured: SELF_ACCEPTABLE_ASSERTION_TYPES == {"OPERATION_CLAIM_ASSERTION"}; promoting classes == {COMPLIANCE_ASSERTION, OBSERVATION_ASSERTION, OPERATION_CLAIM, STRUCTURE_ASSERTION}. So the queue door admits one class; the direct door admits three, one of which has no decision behind it.

This is not my inference from unexercised code. The repo already encodes it as a positive control: kernel/tests/test_review_fixes.py::test_h3_promoting_observation_with_evidence_promotes asserts PROMOTE_ACCEPTED for a FARMER-asserted, confirmAccept: true observation. I grepped DECISIONS.md and ERRATA.md: no decision extends self-acceptance to observations. docs/REVIEW_DISPUTE_SEMANTICS.md:174 states the opposite — "D8/D17 grant a farmer self-acceptance of bounded classes."

Why this blocks the decision rather than becoming a Follow-up. The deliverable under review is a decision card about to be approved verbatim, and the RFC binds itself: "Changes to capability, effects/non-effects, authority, E01–E07 ... require a new decision version and exact approval." Two of its statements about the surface it governs cannot be verified as written without discovering this:

  • "It enforces the existing D8 restriction" — it enforces D8 for one of the two classes that violate it.
  • E04 — "Existing permitted routine-operation and bounded farm-owned-structure self-acceptance remain functional ... No new eligibility guarantee for other classes." A reviewer checking E04 will confirm both named paths still work and conclude the permitted set is {routine operation, bounded structure}. There is a third path in force, and E04's wording ("no new guarantee") reads as "we are not widening" rather than "a larger unguarded self-acceptance remains".
  • The containment table assigns "Routing before new acceptance" to "Existing promotion gate and emitters". For observations the existing promotion gate performs no routing whatsoever.

The same workspace already chose the correct remedy shape for exactly this situation one PR ago: #384 merged with its defect open because docs/REVIEW_DISPUTE_SEMANTICS.md:110-117 states the residual in plain words and names Delivery #385 as its owner. B1 asks for the same treatment, nothing more.

Smallest acceptable fix — all of it text, all of it in this PR:

  1. In the RFC, state the measured residual where the problem and scope are set: confirmed OBSERVATION_ASSERTION self-acceptance is reachable on the legacy route by its own asserter with no reviewer metadata at all, is refused at the queue door for the same actor, and is out of scope here. Reword E04 so it enumerates what actually self-accepts rather than implying a closed pair, and soften "enforces the existing D8 restriction" to "enforces the existing D8 restriction for confirmed compliance assertions".
  2. In the Phase B documentation update this RFC already owns (docs/REVIEW_DISPUTE_SEMANTICS.md), add the residual next to the #385 note it will be replacing, in the same form #384 used.
  3. Open a named Delivery for the runtime part and cite it, as #385 was cited.

I am not asking for a runtime change to the observation path in this PR. Narrowing it removes a capability that currently works and is its own decision with its own approval. The Blocker is the silence, not the scope.

Counter-argument, stated. AGENTS.md defines a Blocker as a demonstrated in-scope failure, and the RFC's non-goals list "observation semantics". On a strict reading of scope this is a Follow-up. I rejected that reading because the artifact under review is a decision record about self-review eligibility, the omission is on the exact axis it governs, the defect is measured rather than argued, and the fix is three paragraphs the author is already writing. If the task user disagrees, demote it — but do not approve version 1 with the text unchanged, because approval freezes E01–E07.


Follow-up F1 — the identical comparison survives at :646; I measured it unreachable, so record that, because the next change can make it live

EXC-004 deletes the compliance reviewer-hint comparison as "misleading". The structure condition at kernel/stages.py:646 keeps the byte-identical expression:

and sub.get("reviewerPartyRef", ctx.acting_party) == ctx.acting_party

Same defect shape: reviewerPartyRef: null makes it False, and :658 treats None as "no distinct reviewer", so a structure assertion outside the D17 bounded class with a null reviewer would take the self-review path. I tried to reach it five ways, all with reviewerPartyRef: null and confirmAccept: true (so policy.structure_self_acceptable(...) is False):

structure/no-schemaVersion        200 RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
structure/empty-schemaVersion     200 RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
structure/null-schemaVersion      200 RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
structure/null-payload            200 RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
structure/empty-payload           200 RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
structure/unrecognized-kind ×2    200 RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
(positive control) structure/recognized-payload  200 PROMOTE_ACCEPTED

Every hostile shape dies at EVIDENCE_SUFFICIENCY before promotion, so the :646 null hole is latent, not live — which is why it is a Follow-up and not a second Blocker. It is latent for a reason worth writing down: the only way to make a structure payload kind committable is to add it to policy.STRUCTURE_PAYLOAD_IDENTITY_TYPE, and that same addition is what makes structure_self_acceptable return True. The hole opens the moment those two stop being the same act. Record the measurement so a future reviewer does not have to re-spend it, and so nobody deletes the compliance comparison as "misleading" while leaving its twin with no note.


Preference P1 — the predicate keeps the denylist shape that produced this defect, one file away from the allowlist that did not

The proposal hard-codes the class name: ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed. The queue door (validators.py:578-587) enforces the same rule as an allowlist over policy.SELF_ACCEPTABLE_ASSERTION_TYPES, and policy.COMMIT_CLASS_TO_ASSERTION_TYPE already maps all four promoting classes into that vocabulary. A denylist of per-class conditions is what let compliance be guarded by a metadata comparison and observation by nothing; the allowlist form cannot have that failure mode, because a new promoting class defaults to "needs a reviewer".

I am filing this as a Preference, not a Blocker, and EXC-006's rebuttal is sound as far as it goes: switching to an allowlist changes behavior for observations, i.e. it is the runtime decision B1 explicitly does not demand here. But the decision that the predicate stays a per-class denylist should be a stated choice with its reason, not the residue of "remove one comparison". One sentence in EXC-006 naming the allowlist alternative and why it is deferred would close it.

Preference P2 — write the Phase B queue assertion against the derived disposition, not claimState

Measured under the candidate, one claim through the full E03 sequence:

routed_outcome                     REQUIRE_REVIEW
queued_accept_outcome              PROMOTE_ACCEPTED   (inForceResultCategory COMPLIANCE_FACT)
claimState_after_queued_accept     PENDING_REVIEW
review_edges                       1
reviews / consequences             1 / 1
unreachable_authoritative_records  []

The direct self-review path this fix removes left the AssertionRecord at claimState: IN_FORCE (measured at base). The queued path leaves it at PENDING_REVIEW forever and carries acceptance on the ReviewDecision + REVIEW edge + consequence — correct under D20 and Kernel rule 1 (the queued assertion is never edited; disposition is derived). It is pre-existing and already exercised by test_94, so it is not a finding. But it is the obvious way to write E03's test wrong: a Phase B assertion that the accepted claim reaches IN_FORCE will fail, and "fixing" it by editing the record would be a real regression. Worth one line in the verification plan.


What I reproduced and confirmed

The defect, at the base the RFC names

COMPLIANCE_ASSERTION + confirmAccept: true + reviewerPartyRef: null, asserted by demo.FARMER over POST /commit at e50ae95:

200 PROMOTE_ACCEPTED  assertions=1 reviews=1 consequences=1
ReviewDecision.decidedByPartyRef = party:demo.farmer.one (the asserter), decisionOutcomeState ACCEPTED
AssertionRecord.claimState = IN_FORCE

The full reviewer-metadata matrix at base — eight shapes, one of them an acceptance:

reviewerPartyRef base candidate
omitted REQUIRE_REVIEW REQUIRE_REVIEW
null PROMOTE_ACCEPTED (1 review, 1 consequence) REQUIRE_REVIEW
self (demo.FARMER) REQUIRE_REVIEW REQUIRE_REVIEW
distinct (demo.ADVISOR) REQUIRE_REVIEW REQUIRE_REVIEW
"" / 0 / false / [] REQUIRE_REVIEW REQUIRE_REVIEW

Present-null sweep over twelve neighbouring keys on the same valid compliance submission, to confirm #385 is right-sized and not a symptom of a general null problem. Only reviewerPartyRef converts a refusal into an acceptance:

reviewerPartyRef  PROMOTE_ACCEPTED   <-- the defect
payload / evidenceRefs              RETAIN_DRAFT  EVIDENCE_INSUFFICIENT
supersedesConsequenceRef            RETAIN_DRAFT  EVIDENCE_REFERENCE_UNAVAILABLE
subjectType                         RETAIN_DRAFT  IDENTITY_UNRESOLVED
subjectRef                          RETAIN_DRAFT  SCOPE_NOT_AUTHORIZED
ingressChannel                      HTTP 422
targetScopes, requestedPromotionTarget, eventTime, actingAgentRef, aiAssistance
                                    REQUIRE_REVIEW (identical to omitting the key)

E01–E07, measured against the candidate patch

ID Result
E01 Fresh null-reviewer confirmed compliance → REQUIRE_REVIEW / HUMAN_APPROVAL_REQUIRED, 1 pending assertion (claimState PENDING_REVIEW), 0 reviews, 0 consequences. The same input on the unmodified base → PROMOTE_ACCEPTED with both. Both halves of E01 demonstrated.
E02 All eight reviewer shapes → review-required (table above). Raw metadata never becomes reviewer identity: no ReviewDecision is emitted on any of them. false / omitted keep their existing capture behavior; malformed confirmAccept keeps its pre-transaction 422 (PR #384's parser, unchanged here).
E03 Continued from E01's exact assertion: asserter's /review/acceptRETAIN_DRAFT HUMAN_APPROVAL_REQUIRED, claim not consumed (PENDING_REVIEW, 0 REVIEW edges); demo.ADVISOR then accepts once → PROMOTE_ACCEPTED, COMPLIANCE_FACT, 1 review / 1 consequence, decidedByPartyRef = party:demo.advisor.one; duplicate → RETAIN_DRAFT SUPERSEDED_RECORD_USED. A caller-supplied decisionTime: "2001-01-01T00:00:00Z" is ignored — emitted decidedAt was the server time. The "usable queue" promise holds.
E04 Routine-operation self-review and bounded D17 structure self-acceptance both still PROMOTE_ACCEPTED under the patch. Wrong-typed and unbounded-structure cases gain nothing. See B1 for what this invariant fails to enumerate.
E05 No regression in the authority/evidence/retirement suites — test_correction_authorization.py, test_correction_transactions.py pass identically at base and candidate. Routing emits pending state only: 0 consequences, 0 retirements on every routed case.
E06 Two-phase probe, run for real (see next section).
E07 unreachable_authoritative_records() == [] after the queue lifecycle. One-file diff, clean whitespace. Transaction ownership, signing, production closure untouched by a one-line predicate in a gate — I inspected rather than audited, and make no full-lifecycle claim.

E06 — the base-to-candidate history probe the RFC defers to post-approval

I ran it now, because it is the strongest claim in the RFC and the cheapest to get wrong. One persistent disposable database; phase 1 executes on the unmodified base bytes and creates the fictional bad acceptance; phase 2 executes on the patched bytes against that same retained database.

phase=base       NEW_REQUEST                PROMOTE_ACCEPTED
                 +17 records, +11 edges, +7 gate-log rows, +1 idempotency row
                 assert:2ad4293844394c8b  review:14c5366453fd4fd6  conseq:fb93905a84a247ee

phase=candidate  (same key, same body)     REPLAY_REUSED_RESULT / REPLAY_MATCH_REUSED_RESULT
                 returns the SAME assert/review/conseq refs, replayOf cir:e4a0078728e34894
                 +3 records (commitingressrequest, commitingressresult, promotiontrace),
                 +1 gate-log row, +0 edges, +0 idempotency rows

phase=candidate  (same body, FRESH key)    REQUIRE_REVIEW  HUMAN_APPROVAL_REQUIRED
                 0 reviews, 0 consequences

Exactly the RFC's §"Historical replay is deliberately preserved", measured: a matching historical accepted-null key still hands back the old accepted references and creates no new assertion, review, consequence or edge; the same body under a new key is a new eligibility evaluation and is refused. The Material limit paragraph is accurate, and it is the right thing to have written down.

No regression in the suites the RFC names

test_review_confirmation.py, test_m2_review.py, test_correction_authorization.py, test_correction_transactions.py, test_conformance.py, test_review_fixes.py, test_stages.py:

candidate: 2 failed, 229 passed (136s)
base:      2 failed, 229 passed (147s)   <- same two tests, identical

The two are test_conformance.py::test_04_gate_sequencing_fixtures_live and ::test_10_document_assembly_freeze_trace, both failing on assert result["refused"] is False. They are an artifact of my harness, not of the patch: test_conformance.py alone passes 23/23, and test_conformance.py + test_m2_identities.py with the patch pass 42/42. Running the conformance suite alongside other files in one session pollutes its session-scoped store. Calibration is what matters here and it is clean — the failure set is byte-identical on both sides, so the comparison holds, but this is not a green conformance claim.

Other RFC statements I checked in code

  • "sub.get("reviewerPartyRef", ctx.acting_party) returns None for a present null, suppressing the compliance routing rule" — kernel/stages.py:631. True.
  • "The separate body-named-reviewer guard also excludes None" — :659, not in (None, ctx.acting_party). True.
  • "The direct emitter always names ctx.acting_party as both asserter and reviewer" — true, and measured: every self-review promotion I produced had decidedByPartyRef == assertedByPartyRef. This is what makes the removed comparison a no-op for correctness rather than a load-bearing check.
  • "The normalizer populates acceptance_target only for GOVERNANCE_DECISION" — :277-279, exact. And probed: a compliance submission carrying reviewTargetAssertionRef, reviewTargetConsequenceRef, or both plus reviewAction: REVIEW_ACCEPTREQUIRE_REVIEW every time, and the named pending target kept PENDING_REVIEW with 0 REVIEW edges. The class boundary holds.
  • "IngressNormalizer.run and ReplayWriter.write short-circuit before the promotion gate" — stages.py:202 returns GateReplay(ReplayWriter().write(ctx, prior)) on an existing key; ReplayWriter is kernel/emission.py:470. True.
  • "For a distinct-body-named compliance request, both existing routing explanations may now appear" — measured exactly: problems ["Self-review out of scope", "Distinct reviewer requires own act"], both HUMAN_APPROVAL_REQUIRED, so the logged reason_code and the outcome are unchanged. The RFC's prediction is precise and the "diagnostic addition is permitted" framing is right.
  • "The existing conformance tests 93/94 provide valid compliance/queue fixture patterns" — test_93_governed_acceptance_semantics has a queue_compliance() helper; test_94_second_hostile_regressions already runs the full distinct-named compliance → advisor-accepts → double-accept-refused lifecycle. Good citation; test_94 is the template E03 wants.
  • "HTTP actor mismatch retains its existing 403 precedence" — test_http_actor_binding_precedes_malformed_confirmation passes unchanged.
  • "Public production governed routes remain closed" — kernel/api.py:74-83 blocks /commit, /review/accept|reject|contest, /records/{id}, both views. True, and it bounds both this defect and B1 to the legacy development surface.

Checked and decided were not findings

Recording these so the next reviewer does not re-spend the time.

  • Architecture budgets — the usual place an unfound Blocker hides here, and it is empty this time. kernel/stages.py appears in no MODULE_BUDGETS, COMMAND_MODULE_BUDGETS or GROUP_BUDGETS entry, so the predicate edit (−1 line) pays into nothing. TEST_GLOBS matches none of the RFC's named test files, so MAX_TEST_LINES = 800 and TEST_MODULE_BUDGETS do not apply to them either (test_review_confirmation.py is at 284 lines; test_conformance.py at 2,065 already exceeds 800 and is legal precisely because it is unmatched). Phase B's planned six cases cannot breach a budget. No finding.
  • Generated inventory. conformance/review_baseline_test_inventory.json: entryCount 4,475, entriesSha256 160c1ac7ce1991ec…, pinning nodeid + sourceModule + sourcePath per REVIEW_BASELINE.md:76-90; adding tests requires the explicit update-inventory maintenance command, which the RFC names. conformance/review_baseline_config.json's knownGreenBaseline.observedInRun.testSummary.collected = 491 is not enforced — run_review_baseline.py reads only actions pins and postgresqlImageDigest from that object. warningPolicy is exact-inventory with one expected entry whose nodeid is "" and when is "collect", so new tests do not multiply it. The RFC's expected-areas list is adequate. No finding.
  • sub stays used after the deletion (:646, :658-662), so no dead-local or lint consequence.
  • Other promoting classes. Only four classes promote; NOTE, HYPOTHESIS_ASSERTION, EVIDENCE_RECORD, ADVISORY_OUTPUT are non-promoting and RETAIN_DRAFT. Of the four, OPERATION_CLAIM (D8) and bounded STRUCTURE_ASSERTION (D17) are decided, COMPLIANCE_ASSERTION is what this PR fixes, and OBSERVATION_ASSERTION is B1. The enumeration is closed.
  • Keeping the :658 distinct-reviewer guard is correct: it is the only thing routing a distinct-named operation claim or observation, both measured. EXC-004's "still-used" is accurate.
  • Duplicate JSON keys in the submission are last-wins in one dict for both parser and gate — same as #384, not a finding.

What could not be checked, and why

  • The pinned exact-interpreter gates (conformance/rewrite_architecture_check.py's architecture / temporal / package-contract checks). They refuse any interpreter other than CPython 3.12.13 (_authenticate_full_execution_profile, UNSUPPORTED_PYTHON_VERSION), and this session's egress refuses both codeload.github.com and www.python.org with proxy 403, so I could not build it. The author's recorded PASS (exit 0, 8.559s) is unverified by me. I substituted direct reads of the checker's budget tables, which is what the budget question actually needs, but it is not the same as running the gate.
  • PostgreSQL 17.10 and the hash-locked dependency set. Everything above ran on PG 16.13 with current PyPI wheels. The kernel Store does not enforce the 17.10 pin the way the security-audit provisioning path does, so these suites run — but role/RLS/wire-protocol-sensitive behavior is out of scope for this review and I make no claim about it.
  • The hosted lightweight run 34712299485 and the Phase A evidence digests. The GitHub API is refused from my container for this repo; I read PR metadata through the other machine but did not re-verify artifact digests or recompute the design-review report hash 65f53d8d….
  • Transaction atomicity, signing, custody, publication — inspected at the level of "a one-line predicate in one gate cannot reach them", not audited. E07 should not be read as audited by this pass.

What my method made easier than production

  • Authority was handed to me. demo.FARMER holds ASSERT_COMPLIANCE, OBSERVE_CREATE_OBSERVATION and REVIEW_ACCEPT on the demo farm by demo.bootstrap. A real grant topology might not co-locate assert and review rights on one party, which is the precondition both the fixed defect and B1 depend on. My probes prove the gate's behavior given that grant, not that the grant is common.
  • The legacy test transport binds the acting party from an x-acting-party header. No OIDC, no principal resolution, no token. Production governed routes are closed, so the reachability I demonstrated is development-surface reachability — for B1 as much as for the defect.
  • Fresh isolated databases per probe removed ordering, concurrency and accumulated-state effects entirely. Nothing here says anything about concurrent commits on one key, and the replay probe was strictly sequential in one process at a time.
  • I simulated the candidate by patching one line in my own clone. That is the RFC's stated patch and nothing else, but it is my transcription of prose, not the author's implementation. Every E01–E06 result above must be re-measured against the real Phase B head; treat them as a prediction that the proposed design is achievable, not as implementation evidence.
  • PG 16 / CPython 3.11 / unpinned wheels is a more permissive oracle than the pinned baseline. It passed 229/231 identically on both sides, which is good calibration for this comparison and nothing more.

Bottom line

The predicate is right, minimal, and achieves everything E01–E06 promise — I measured all of it, including the history probe the plan defers. Approve version 1 only after B1's three paragraphs are in, because approval freezes E01–E07 and E04 currently reads as a closed list that is not closed. F1 and the two Preferences cost a sentence each and should ride along. Then the real work is the implementation head: fresh evidence, nothing reused from #384, and the queue assertion written against the derived disposition rather than claimState.

Copy link
Copy Markdown
Owner Author

PR #386 — implementation re-review

Verdict: No new in-scope blocking findings at 81f1ce1138242c668d13a969337f3e55d8cd4b2b. The compliance-specific correction is implemented, and the new tests cover the resulting review lifecycle—not merely the changed response. This is an implementation review, unlike the earlier design-only review.

Implementation assessment

The fix removes the actual bypass without introducing another policy mechanism.
kernel/stages.py:630 now routes confirmed compliance assertions using:

if ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed:

The caller’s reviewer hint can no longer suppress that restriction. Routing reaches the existing pending-assertion path before direct acceptance and retirement authorization. The distinct-body reviewer guard, bounded-structure condition, queue branches, and direct review-authority check remain in place. I found no reason to replace this with input coercion, a blanket null rejection, or a new eligibility abstraction.

The regression tests exercise a usable independent-review path.
The HTTP lifecycle test follows the same null-origin assertion through pending capture, the asserter’s refused acceptance, a distinct advisor’s successful acceptance, and refusal of a subsequent duplicate decision. It checks stored review/consequence records, actual reviewer identity, server decision time, source and review edges, and preservation of the original assertion. The assertion remains immutable PENDING_REVIEW; the later review and consequence establish its accepted disposition. This avoids “fixing” self-acceptance by leaving an unusable claim in the queue.

Raw-input and replay behavior receive meaningful coverage.
The four public-pipeline cases cover null, omitted, self-named, and distinct-body-named reviewer metadata. They verify that the submission remains unchanged and its stored digest matches the original input. The replay test checks matching pending-result reuse and rejects null-to-omission under the same key as a conflicting payload, while preserving prior records and non-receipt tables.

Remaining issues and their disposition

The observation self-review defect remains a separate unresolved defect—not a successful compatibility behavior.
The current PR explicitly acknowledges that direct confirmed observations can still self-accept while the equivalent queued self-review refuses, and identifies Delivery #387 as its owner. The earlier reviewer’s B1 label has not been withdrawn. My assessment is that its runtime correction should not block this explicitly compliance-only repair: this PR neither introduces that behavior nor now claims to solve it. Its disclosure has been addressed; the underlying observation defect has not.

Historical incorrect acceptances are not repaired.
Matching historical accepted-null submissions can still replay their original accepted references. The PR reports a retained-database base-to-candidate probe showing receipt-only replay followed by review-required behavior for a fresh key. That is the intended distinction between preserving recorded history and preventing a new wrongful acceptance; it must not be described as cleansing historical accepted state.

The extraction diagnostic is still failing.
The current report identifies two missing review records, not a passing extraction check. conformance/CONFORMANCE.md makes the manual consistency check applicable to extraction-inventory consistency changes. The reported delta here adds six profile-neutral test-inventory entries without changing the extraction surface, so I do not classify the disclosed diagnostic failures as a new blocker for this correction. That is a scope assessment, not a waiver or an “all checks pass” conclusion.

Verification limits

I confirmed that trusted baseline workflow 34751542790, attempt 1, completed successfully. The updated evidence packet reports 4,481 tests passed in each of two full runs, plus successful equivalence, platform, native, and publication verification. I did not execute local PostgreSQL tests, independently reproduce the historical probe, or independently authenticate the final published archive during this review. The detailed execution counts and archive-verification claims remain attributed to that packet.

Recommendation: No further code changes requested for this scoped repair. Proceed to the separate exact-head final acceptance step, retaining the observation, structure, historical-replay, and extraction limitations explicitly. This review supplies neither merge authorization nor production-readiness approval.

@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 #386 — implementation review (executed), head 81f1ce1

Reviewed head: 81f1ce1138242c668d13a969337f3e55d8cd4b2b.
Base: e50ae95f43d0e73b12113463d0e4ea85eebdc14b.
Prior pass by me: design review 5191268560 at 0472668 (1 Blocker, 1 Follow-up, 2 Preferences).

Verdict: one new Blocker, small and cheap to close. All four of my prior findings are closed — B1 on its own stated terms. The runtime change is byte-identical to the patch I measured last pass, the six new regressions are genuinely calibrated (I mutated them four ways), the inventory and the hosted-execution binding both verify independently, and the author's E06 history probe reproduces mine delta for delta on a different OS, interpreter and PostgreSQL. The Blocker is that the and confirmed half of the new predicate is pinned by nothing in the repository, and the E02 row of the evidence packet points at confirmation tests that never execute the changed branch.

Prior findings — disposition, checked not assumed

Finding Status What I verified
B1 — undisclosed unguarded OBSERVATION_ASSERTION self-acceptance Closed The RFC gains a "Known K04 residual" block naming the behavior, REVIEW_DISPUTE_SEMANTICS.md gains the same residual in the active semantics, both name Delivery #387 (open, correctly scoped, cites the discrepancy and the refused queued acceptance), "enforces the existing D8 restriction" is now qualified "for confirmed compliance assertions", and E04 is explicitly non-exhaustive. That is exactly the three-part fix I asked for, and I asked for no runtime change. The body notes I have not withdrawn the Blocker label; I withdraw it now — the disclosure was the remedy.
F1 — the twin comparison at :646 Closed, and improved on The RFC's new paragraph is factually correct and I re-derived it: StructureCarrierValidator refuses contract.kind not in policy.STRUCTURE_PAYLOAD_IDENTITY_TYPE at kernel/validators.py:766 with EVIDENCE_INSUFFICIENT — the exact refusal my seven hostile shapes produced — and structure_self_acceptable keys off the same table at kernel/policy.py:202–211. Both line references are exact. The added caveat ("if carrier admission and that eligibility set diverge, the retained comparison needs review") is the right statement of the residual risk, better than my "latent" wording.
P1 — denylist vs allowlist predicate Closed EXC-006 now names the alternative and why it is deferred: it would change observation behavior and require an explicit D17 exception. That is the stated choice I asked for.
P2 — write E03 against the derived disposition Closed The verification plan now says so in the RFC, and the test enforces it: assert assertion_row["payload"]["claimState"] == "PENDING_REVIEW" plus a full-row equality check after acceptance. Nobody will "fix" this into an IN_FORCE mutation.

Blocker B2 — the confirmed conjunct of the new predicate is unpinned by every test in the repository

Violated criterion. The RFC's E02 requires "Literal false/omission of confirmation retain existing capture behavior", and EXC-003 requires that "each guarantee traces to the existing gate/emitter and actual public-entry/Store evidence". The shipped predicate satisfies E02. No test detects its violation.

The new condition has two conjuncts:

if ctx.commit_class == "COMPLIANCE_ASSERTION" and confirmed:

I mutated the head tree four ways and ran the six new regressions against each:

Mutation Result
m1 restore the design-base reviewer-hint comparison 3 failed / 3 passed…until_distinct_acceptance, …cannot_supply_review[null], …replay_preserves_raw_identity_and_history
m2 drop and confirmed 6 passed
m3 replace the hint comparison with … is None (a null-only "fix") 2 failed — [omitted], [self]
m4 if False: (delete the condition) 5 failed / 1 passed

m1 reproduces the author's recorded base run exactly — same count, same three test names — from an independent clone on Linux/CPython 3.11.15/PG 16.13 against their macOS/3.12.13/PG 17.10. m3 is the one I most wanted to see fail, and it does: the suite distinguishes a genuine class-level rule from a null patch, which is the defect class that produced #385 in the first place. m4's survivor is [body-named-distinct], correctly held by the :658 guard. Three of four mutations are caught. m2 is not caught by anything.

m2 is not cosmetic. Measured over the real route at this head, and under m2:

                             head (81f1ce1)                  m2 (drop "and confirmed")
compliance/confirm-omitted   RETAIN_DRAFT   no problems       REQUIRE_REVIEW  HUMAN_APPROVAL_REQUIRED
compliance/confirm-false     RETAIN_DRAFT   no problems       REQUIRE_REVIEW  HUMAN_APPROVAL_REQUIRED
compliance/confirm-true      REQUIRE_REVIEW HUMAN_APPROVAL…   REQUIRE_REVIEW  HUMAN_APPROVAL_REQUIRED

m2 converts unconfirmed compliance capture into a routed review exception: a different outcome enum, a HUMAN_APPROVAL_REQUIRED problem the caller did not earn, and the amend_case_for_routing=True emitter path instead of the plain capture path at kernel/stages.py:703-708 — the branch whose own comment is "no review act: capture is not commitment (Kernel rule 3)". That is a direct E02 violation and a Kernel rule 3 violation, and it ships green.

How green. I ran m2 against every test file in kernel/tests/ that submits a COMPLIANCE_ASSERTIONtest_conformance.py, test_correction_authorization.py, test_m2_identities.py, test_stages.py, test_self_review_eligibility.py — plus test_review_confirmation.py and test_m2_review.py:

m2: test_correction_authorization + test_m2_identities            149 passed
m2: test_review_confirmation + test_stages + test_m2_review + new  62 passed
m2: test_conformance (own session/database)                        23 passed
                                                        total     234 passed, 0 failed

Why the E02 row does not cover this. The body's E02 row says "Existing confirmation tests cover omission/false/true, malformed values and transport-binding precedence. The recorded compatibility pass includes those unchanged controls." Those tests are test_review_confirmation.py::test_http_confirmation_value_matrix_preserves_history and its neighbours, built on demo.spray_submission, whose helper hard-codes "commitClass": "OPERATION_CLAIM" (profile_si_ffs/test_fixtures/demo_payloads.py:236). An operation claim never evaluates the compliance condition. The sentence is true about those tests and misleading about this guarantee: read in an E02 row about the compliance change, it implies coverage of the class whose predicate changed, and there is none.

Smallest acceptable fix, entirely inside the file this PR already adds:

  1. Extend test_direct_compliance_reviewer_metadata_cannot_supply_review (or add one small sibling) with the confirmation axis: confirmAccept omitted and literal falseRETAIN_DRAFT, one pending assertion, no routing reason in problems, no review or consequence. Two parameters; _compliance() and _assert_no_acceptance already exist in the module.
  2. Regenerate the inventory (4,481 → 4,483) with the prescribed update-inventory command.
  3. Correct the E02 row to say which class each cited control actually exercises.

Counter-argument, stated. m2 is over-restriction, not a bypass — it refuses things it should capture; it cannot create a wrongful acceptance. The shipped runtime is correct, and a reviewer who reads "Blocker" as "the code is wrong" should read this as a Preference. I file it as a Blocker because in this repository the deliverable is the evidence packet as much as the code: the packet asserts E02 is covered, one conjunct of the PR's own new predicate has no regression anywhere in 4,481 collected tests, and the fix is two parametrize entries. EXC-003 is a criterion the decision itself sets, and this is the one place at this head where a guarantee does not trace to evidence.


Preference P3 — cite the posted review, not only an internal message id

The RFC's new supplementary-evidence paragraph is the most careful attribution I have seen in this series: it names my interpreter, database and unpinned wheels, flags that my harness-pollution diagnosis is my diagnosis and not independently verified, and refuses to let the measurements substitute for fresh implementation evidence. All correct, and the transcribed numbers (229/2 each side, 23/23, 42/42) are accurate.

It binds that evidence to msg_01a0971d-c6fa-7ca3-8f6a-bb14ef0b4a4f with SHA-256 f568d974…. Nobody outside the task can resolve either. The same content is a durable public artifact: review 5191268560, whose body hashes to e90217cb974bef9c9e5c4ece5a997489193bb2d322b03a94775304837bb14960 — recomputed from the API at posting time and again today. Citing the review id and that digest alongside the message reference would make the attribution checkable by the same method this repository uses for everything else. Preference only; it delays nothing.


What I verified at this head

The runtime change is the patch I already measured

git diff e50ae95 81f1ce1 -- kernel/stages.py produces blob e14f255, byte-identical to the transcription I measured last pass. My prior E01–E06 measurements therefore transfer without re-derivation, and I re-ran the important ones anyway.

Full reviewer-metadata matrix at this head, real POST /commit, eight shapes:

omitted / null / self / distinct / "" / 0 / [] / {"a":1}
  -> REQUIRE_REVIEW, HUMAN_APPROVAL_REQUIRED, 1 pending assertion (PENDING_REVIEW),
     0 reviews, 0 consequences   (all eight)

Positive controls at the same head, unchanged:

operation-claim self-review      PROMOTE_ACCEPTED  1 review 1 consequence  IN_FORCE
structure bounded self-accept    PROMOTE_ACCEPTED  1 review 1 consequence  IN_FORCE
observation (omitted/null/self)  PROMOTE_ACCEPTED  1 review 1 consequence  IN_FORCE  <- the #387 residual, as disclosed

The observation rows are the measurement behind the new residual text. The disclosure is accurate: omitted, null and self-named all self-accept; only a distinct body-named reviewer routes.

Regression, at this head

test_review_confirmation, test_m2_review, test_correction_authorization,
test_correction_transactions, test_review_fixes, test_stages,
test_m2_identities, test_self_review_eligibility        233 passed, 0 failed (156s)
test_conformance (own session/database)                  23 passed, 0 failed

Note for the record: the two conformance failures in my previous pass were, as I said then, an artifact of running test_conformance.py in one session with other files. Running it in its own database here reproduces 23/23 on both sides, and the author's packet independently records 23/23. That diagnosis is now confirmed rather than asserted.

Generated inventory — recomputed, not trusted

Loaded conformance/run_review_baseline.py and ran the repository's own _inventory_document over the committed entries:

entryCount        4481   (file: 4481)              base was 4475, delta +6
added 6, removed 0, reattributed 0
entriesSha256     4228e2c4677100264847b1de78dd195b756e1162121ab08861795883e923e839   MATCH
entries sorted/normalised identically                                                 MATCH

The six added nodeids are exactly the six the new module collects — I compared the inventory rows against --collect-only on that file: exact match, with sourceModule/sourcePath correct on all six.

I did not reproduce a full-repository collection comparison, and I want to be explicit about why, because a naive run looks alarming: my environment has 19 collection errors from absent optional dependencies and a different pytest than the pinned 9.1.1, giving 3,589 collected, 961 inventory rows uncollected and 69 parametrize ids differing only in how non-ASCII and control characters are escaped. That is my environment, not drift. The hosted twice-run baseline at 4,481 collected/selected/passed each is the only thing that settles full-inventory agreement, and I did not run it.

The hosted evidence actually binds to this head

The check that matters here needs no download and no credentials:

refs/pull/386/merge = 4ce9a0511ca1e620414629b8e02e3bb29fa259b6
  tree    a1c8c553e0f99a9d2a81fbe8d6ae9eac950f1902  ==  git rev-parse 81f1ce1^{tree}
  parents e50ae95 (main) + 81f1ce1 (head)

and the packet's own hosted-coordinates.json records executionMerge: 4ce9a051…. I derived that merge commit from git independently and it agrees. So the baseline gate executed the reviewed content, not a stale or rebuilt tree.

Run metadata, read live:

34751232428  pull-request-lightweight  success  attempt 1  head_sha 81f1ce1138  (pull_request)
34751542790  reviewed-head baseline gate  success  attempt 1  head_sha e50ae95f43  (issue_comment)
34753058161  evidence-publication  success  attempt 1  head_sha e50ae95f43  (workflow_run)
artifact 10316712345  evidence-publication-receipt  1,395 bytes  expired=false  run 34753058161

The two e50ae95 head_shas are the expected shape for issue_comment/workflow_run triggers — the workflow file comes from the default branch while the checkout is the merge ref — and the merge-tree check above is what actually ties them to the candidate.

Admission comment 5652671269: author samovers, association OWNER, created_at == updated_at (unedited), 595 bytes, body SHA-256 2917165b85e6b50bc1da2bb6804fd1d494e5d4d8c27543f21152328deca41d6cequals the packet's claimed bodySha256. It invokes the existing baseline admission and claims no verdict of its own.

The history probe reproduces mine exactly

The packet's history-summary.json and my independent two-phase base→candidate probe from the previous pass agree on every number:

replay deltas  kernel_record +3, kernel_edge 0, kernel_gate_log +1, kernel_idempotency 0, all derived tables 0
fresh  deltas  kernel_record +10, kernel_edge +6, kernel_gate_log +6, kernel_idempotency +1
base PROMOTE_ACCEPTED -> candidate REPLAY_REUSED_RESULT with the original refs -> fresh key REQUIRE_REVIEW

Two independent implementations of the same probe, on different operating systems, interpreters and PostgreSQL major versions, produced identical row deltas. That is the strongest form this evidence can take short of the hosted run, and the packet's refusal to call it a concurrency or cleanup claim is right.

Extraction diagnostic — ran it on both sides

e50ae95:  RESULT: FAIL (2 failures)
81f1ce1:  RESULT: FAIL (2 failures)

Identical failures, identical paths: no file/glob review record covering conformance/review_baseline_test_inventory.json or kernel/tests/test_rewrite_architecture_check.py. The first of those is a file this PR edits, which is the case where a permanently-red check stops being a useful regression detector. It is not vacuous here: the failing set is derived from current seed-scan hits, so adding a configured seed term to the inventory would have produced a third failure, and it did not — none of the six added nodeids carries one. The count staying at 2 is therefore a real result about this delta, not an unchanged constant. The body's applicability reasoning (conformance/CONFORMANCE.md:23, :58–66; the root review-baseline inventory is a different artifact from profile_si_ffs/extraction_inventory/) reads correctly to me, and it claims no waiver.

Other claims checked in the packet

  • Local counts add up: 208 (compatibility) + 23 (conformance) + 6 (candidate regressions) + 2 (production closure) = 239.
  • regression-base.log names the same three failures m1 produces here.
  • Five files, 607 additions / 12 deletions; git diff --check clean; runtime 1 insertion / 2 deletions.
  • docs/REVIEW_DISPUTE_SEMANTICS.md now states, in the active semantics rather than only in an RFC: the bounded compliance guarantee across all four reviewer-metadata shapes; the replay/history limit; that queue acceptance leaves claimState: PENDING_REVIEW bytes unchanged; and the observation residual as "not permitted D8 behavior" owned by #387. Every one of those sentences is a measurement I have reproduced.

Checked and decided were not findings

  • REVIEW_DISPUTE_SEMANTICS.md:174's older "D8/D17 grant a farmer self-acceptance of bounded classes" is untouched. It remains normatively true — D8/D17 do grant bounded classes; the runtime exceeds the grant — and the new residual block upstream says so explicitly. Leaving it is right.
  • The amend_case_for_routing=True emitter path is not new for the null case; omitted and self-named compliance already took it at base. No new emitter reachability.
  • Compliance submissions carrying reviewTargetAssertionRef / reviewTargetConsequenceRef / reviewAction still cannot select the queue-emitter branch (acceptance_target is GOVERNANCE_DECISION-only). Re-probed at this head.
  • The inventory's 32-add/2-delete line count is JSON formatting plus the entryCount and entriesSha256 lines; the entry-level delta is +6/−0 as claimed.
  • The new module reuses test_review_confirmation's _snapshot, _assert_valid_replay, GOVERNED_TABLES and OMITTED. I checked for the failure mode from PR #323/#326 — a fixture more permissive than the real posture — and found none: every assertion runs against the real Store and the real routes, and m1/m3/m4 prove the assertions bite.

What could not be checked, and why

  • The pinned interpreter gates again. CPython 3.12.13 is still unbuildable from this session: codeload.github.com returns proxy 403 and www.python.org is connect_rejected by organization egress policy. So the mandatory package/architecture/temporal checks, Ruff and the twice-run baseline are unverified by me; the packet's RESULT: PASS (0 failures) precommit log stands unaudited. My runs are CPython 3.11.15, PostgreSQL 16.13, unpinned wheels.
  • Linux wheel hash authentication, the receipt ZIP digest sha256:2874bc25…, the two 4,481-case baseline logs, the native ARM64/AMD64 job contents and the consumer report — all need credentials or downloads I did not perform. The merge-tree and comment-digest checks above are what I could do read-only, and they passed.
  • The internal msg_… approval and card references and their SHA-256s are not resolvable from outside the task. See P3.
  • Concurrency, transaction ownership, custody, production authentication. Not exercised. Legacy test transport with header-bound actors and fictional demo grants throughout; production governed routes remain closed (kernel/api.py:74-83), which is what bounds both this fix and the #387 residual to the development surface.

What my method made easier than production

Same four as last pass, unchanged: demo.FARMER is handed co-located assert and review authority by demo.bootstrap; the legacy transport binds the actor from a header with no OIDC; every probe ran in a fresh isolated database with no concurrency; and my interpreter, database and wheels are all looser than the pins. One addition specific to this pass: mutation testing proves what the suite catches, not that the suite is complete. m2 is the gap I found by choosing that mutation; a different conjunct or a different gate might hide another, and four mutations is not a mutation-adequacy result.

Bottom line

B1, F1, P1 and P2 are closed, and B1 is closed exactly as I asked — disclosed in both active documents, owned by #387, with the D8 claim narrowed. The implementation is the patch I measured, the tests are calibrated against three of four hostile mutations, and the inventory, merge-tree and admission bindings all verify independently. Close B2 with two parametrize entries and an inventory regeneration, fix the E02 sentence, and this head has no finding I can demonstrate. P3 costs one line and makes the attribution checkable by anyone.

Address PR #386 review B2 with omitted and false confirmation controls through real HTTP and Store evidence. Regenerate the inventory and distinguish compliance capture coverage from operation-claim parser controls. Cite the public design review for P3. Runtime and approved E01–E07 remain unchanged; M1 review eligibility, Delivery #385.
@samovers

Copy link
Copy Markdown
Owner Author

Bounded B2 correction and affected E02 review completed for PR #386 / Delivery #385 at 8a11d3f with zero demonstrated in-scope Blockers. The full report is in the PR description; SHA256 8d5ef6bd7d57ecd2ac09f7ab90187841c57c88bc5e7726b7153fdd045327317e. B2 is closed and P3 addressed; runtime and approved semantics are unchanged. Local tests and honest residuals are recorded. This invokes the existing baseline admission only, not semantic approval, publication success, merge authority or production permission.

OFARM2_BASELINE_ADMISSION
head=8a11d3f2182e9c0504dab2763f01d9c83202dd8e
blockers=0

@samovers
samovers merged commit 9d7541d into main Sep 13, 2026
3 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.

Prevent nullable reviewer metadata from permitting legacy compliance self-acceptance

1 participant