PMAT-3704 / ONT-4c3: pc_extract draws one planted defect per implemented extractor — parity-receipt, json and pv-contract gain their controls, and the set is tied to Σ - #3706
Merged
Conversation
…and the gate must report the parity-receipt control Two tests, both red on main: the lib test ties extract_controls() to contracts/ontology.yaml (4 controls vs 7 implemented types: json, parity-receipt and pv-contract have none), and the CLI test asks the same question ONT-001 v4.10's ONT-4c3 probe asks, .pc_extract["parity-receipt"] == "fired", at the top level of the report. Pmat-Ticket: PMAT-3704 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…d extractor, every run extract_controls() was a hand-written array of four (gguf, apr-model, code, lean) beside a Σ that implements seven. It now carries all seven, keyed by entity type: - parity-receipt: the control #3600 wrote and only a unit test called, drawn on control_sample() (a minimal apr-parity-receipt/v2 record; a sample that does not parse is Null and cannot fire); - json: in memory, through the same post-read path extract_into now shares (extract_text) — a mapped nested key extracts typed by its class, and an unmapped one is refused naming the key; - pv-contract: a contract with metadata.kind and a depends_on relation yields ont:kind and the edge, and the copy without metadata yields no ont:kind — nothing is inferred. On aprender's contracts/: verdict Pass, pc_extract 7/7 fired, by_entity_type["parity-receipt"] = 7 — the ONT-4c3 probe's gate conjunct, rc 0. Both RED tests from the previous commit pass unedited. Pmat-Ticket: PMAT-3704 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… the diff docs/audits/impl-PMAT-3704-receipt.md: how the defect was found (the ONT-4c3 ledger carrier's own first check), five whys, the verification table, four mutants each RED with the gate declining by name, and the two refused dispatches (paiml/paiml-implement#326). Pmat-Ticket: PMAT-3704 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
Contributor
Author
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3704",
"head": "18108846f222382d69a6242a77066add2c688e6b",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 7
},
{
"lane": 2,
"verdict": "PASS",
"findings": 9
},
{
"lane": 3,
"verdict": "NO-VERDICT",
"findings": 0
}
]
} |
Contributor
Author
|
quorum-review (AD-04): NOT agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3704",
"head": "18108846f222382d69a6242a77066add2c688e6b",
"width": 3,
"executor": "agy",
"agreed": false,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 0
},
{
"lane": 2,
"verdict": "NO-VERDICT",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 0
}
]
} |
Contributor
Author
|
quorum-review (AD-04): three PASS — agreed (auto_merge: checked=true was_armed=false disarmed=false) {
"ticket": "PMAT-3704",
"head": "18108846f222382d69a6242a77066add2c688e6b",
"width": 3,
"executor": "agy",
"agreed": true,
"auto_merge": {
"checked": true,
"was_armed": false,
"disarmed": false,
"note": "auto-merge not armed"
},
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 0
},
{
"lane": 2,
"verdict": "PASS",
"findings": 0
},
{
"lane": 3,
"verdict": "PASS",
"findings": 0
}
]
} |
gemini-3.1-pro-high / gemini-3.1-pro-low / gemini-3.6-flash-low, three distinct measured models, partial:false. Rounds 1 and 2 were NOT AGREED on a NO-VERDICT lane each (gemini-3.7-flash-high, then 3.8-flash-high: status SUCCESS, no verdict object), both other lanes PASS in each. Pmat-Ticket: PMAT-3704 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
noahgift
enabled auto-merge
September 21, 2026 15:08
noahgift
added a commit
that referenced
this pull request
Sep 21, 2026
…d as the union The only conflict was docs/roadmaps/roadmap.yaml: PMAT-3696 (batch-1) and PMAT-3704 (#3706) were inserted at the same spot. Both entries are kept whole, in id order. check_roadmap_sorted / ids_unique / diff_additive all PASS; the merge adds 21 lines relative to batch-1's head, all of them the PMAT-3704 entry. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
noahgift
added a commit
that referenced
this pull request
Sep 21, 2026
…ved batch branch release/0.70-batch-1 has since merged main (#3706, PMAT-3704); taking its roadmap.yaml brought an entry whose fragment this tree does not have. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
noahgift
added a commit
that referenced
this pull request
Sep 21, 2026
…ease-evidence gets its own control The one real conflict (the extract import in shapes_gate.rs) is textual; the semantic one is #3706's every_implemented_entity_type_in_sigma_has_an_extract_control_and_it_fires: release-evidence was implemented in Σ with no pc_extract control, so the merged tree would have gone RED. release_evidence::positive_control(), drawn every gate run with no release subject and no file: a sample cell with one fresh Pass row and a planted cell with none go through the real build(); it fires iff the planted cell is still a release:Cell node with ZERO rows (absence materialized for minCount 1). extract() is now file reading plus a pure build(Inputs). Mutant measured: emit only cells that have rows -> pv lint --gate shapes exit 2, 'positive control pc_extract.release-evidence did not fire'. Also moves receipts.rs's strings() helper above the test module (clippy items_after_test_module). Refs #3715, #3704 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This was referenced Sep 21, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #3704. Refs #3577 (ONT-4c3), #3624.
The defect.
pv lint contracts/ --gate shapesreportedpc_extract = {apr-model, code, gguf, lean}while Σ (contracts/ontology.yaml) marks seven entity types implemented.parity_receipt::positive_control(#3600) had one caller — a unit test — so the gate never drew it, andjson(#3516) andpv-contracthad no control at all. ONT-001 R-3 requires "pc_extract(one planted defect per registered extractor, every run)", and the infra ONT-4c3 probe asks.pc_extract["parity-receipt"]=="fired": the row was RED on main whatever the ledger said.extract_controls()is byte-identical on #3600's head, the #3669 squash and225b2a9ab— never wired, not dropped.The fix is the tie, not the missing entry. A lib test makes
extract_controls()'s key set EQUAL Σ's implemented entity types (a non-empty set, every valuefired), so the next extractor cannot ship without its control. Then the three controls it demands:parity-receipt— the existing control, drawn oncontrol_sample()(a minimal v2 record; fails closed toNull);json— in memory throughextract_text(), the post-read pathextract_intonow shares: a mapped nested key extracts typed by its class, an unmapped one is refused naming the key;pv-contract—metadata.kindand adepends_onrelation come out asont:kindand the edge; the copy withoutmetadatacarries noont:kind.Measured (pv from this tree, aprender
contracts/):verdict=Pass,pc_extract7/7fired,by_entity_type["parity-receipt"]=7— the probe's gate conjunct rc 0 (rc 1 on main). RED commitd542db3cd(4 keys vs 7; no parity key), GREEN9f6b2e02c, both tests unedited.Mutations, each RED: parity drops the comparator edge / json infers a class for an unmapped key / pv-contract defaults
metadata.kindtokernel→ the Σ-tie test fails AND the gate declines exit 2 naming exactlypc_extract.<that key>; dropping a control key → the Σ-tie test fails on its assertion.make gaterc 0; clippy-D warningsand fmt clean; all 11tests/ont*.rspass (95). Receipt:docs/audits/impl-PMAT-3704-receipt.md.ont-delta: none — adds pc_extract positive controls for three already-implemented extractors (pv-contract, json, parity-receipt); no entity type, shape, relation or verdict reason is added or changed
keep-open: #3577 closes only when paiml/infra binds ONT-4c3 in the ONT-001 ledger from this PR's squash (the binding is infra's row, not a change here); #3624 is the by_entity_type sibling list, which this PR does not change.
🤖 Generated with Claude Code