fix(pv): an empty corpus is refused with exit 2, never reported as PASS (PVL-1, PMAT-1099) - #3093
Open
noahgift wants to merge 20 commits into
Open
fix(pv): an empty corpus is refused with exit 2, never reported as PASS (PVL-1, PMAT-1099)#3093noahgift wants to merge 20 commits into
noahgift wants to merge 20 commits into
Conversation
PVL-001 row EV-1 (PMAT-1099). PV-LEAN-AUDIT-001 measured on 2026-09-10 with the in-tree pv 0.66.0: `pv lint /nonexistent-path` exit 0 `Result: PASS` over 0 contracts; `pv lint <empty dir>` exit 0; `pv proof-status <empty dir>` exit 0 `Proof Status (0 contracts)`; `pv verify-pipeline <empty dir>` "No contracts found", exit 0. A gate that measures nothing and reports PASS — the fleet's signature defect, and the one aprender's Makefile records as its former release-gate defect. tests/pvl_zero_contracts.rs, 15 cases: every reporting subcommand (lint, proof-status, coverage, graph, lean-status, verify-pipeline) must exit 2 with `error: 0 contracts under <path>` on a missing path, an empty directory, or a sidecar-only directory; a --kind filter that empties the corpus is refused and named; two controls require exit 0 AND a printed count of ONE for a real contract given as a directory and as a single file (lint, coverage and graph used to read_dir a file path, find nothing, and pass). Measured at HEAD 43b8d8e with this file and no implementation: cargo test -p aprender-contracts-cli --test pvl_zero_contracts -> test result: FAILED. 1 passed; 14 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.34s (rc=0) Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…SS (PVL-1) contract_walk: ZeroContracts / collect_corpus / require_contracts / exit_code_for — one definition of "empty" and one exit code: 2 is "nothing was measured" (clap's usage-error code — the invocation was wrong), 1 stays "measured and failed". lib.rs maps a ZeroContracts dispatch error to exit 2. lint: refuse_empty_corpus() reads the gate NAMED `validate` (its count is parsed + parse errors) — `duplicate-stems` reuses the Validate detail shape with zeros, so a shape-only match refused every VALID corpus (measured, then fixed). The lint loader treats a single file as a one-contract corpus (no cache beneath a file); coverage and graph do the same. proof-status: --kind filtering to zero is refused and named. lean-status and verify-pipeline: same walker, same refusal (plan-grill finding; verify-pipeline printed "No contracts found" and returned 0, and a process::exit there killed the crate's unit-test binary — it returns the error). Measured on this commit: cargo test -p aprender-contracts-cli (every target) -> 204 passed, 0 failed cargo test -p aprender-contracts --lib -> 1501 passed target/debug/pv lint contracts/ -> Result: PASS, 1766 contracts, exit 0 scripts/check_contract_test_binding.sh -> PASS, 539 refs resolved make gate -> rc=0 Jidoka (.pmat/jidoka.jsonl): pmat complexity flagged lint::run cognitive 30 > 25 with the guard inline; extracted refuse_empty_corpus() and moved the single-file cache rule into build_config(). Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…h measured RED then GREEN kind: pattern. Three equations (empty corpus refused; one file is one contract; --kind filtering to zero refused), three obligations, five falsification tests citing tests/pvl_zero_contracts.rs by filter. Every if_fails carries the mutation actually run on 1ca5d39 (see the file): the walker guard, the lint guard, the exit code, an always-refusing guard against the controls, and the post-filter guard — each turned its predicted cases RED and only those, and went GREEN on restore. pv validate: 0 errors. scripts/check_contract_test_binding.sh: PASS. Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…MAT-1099) Refs PMAT-1099 Review quorum on #3093 (3 agy lanes, 3/3 FAIL): `lint::run` returned into `run_watch` and `run_diff_check` BEFORE `refuse_empty_corpus`, so `pv lint --watch <empty>` printed "Result: PASS" over 0 contracts every 5 s and `pv lint --diff HEAD <empty>` said "Nothing to lint" at exit 0. Both are the vacuous pass PVL-1 exists to end. - run_watch: the same guard after every run_lint tick (exit 2 at the first tick over an empty corpus; a corpus emptied mid-watch ends the watch at 2). - run_diff_check: "nothing changed" is only said over a non-empty corpus (collect_corpus, the one definition of empty; exit 2 otherwise). RED (guard stashed, tests present): cargo test -p aprender-contracts-cli --test pvl_zero_contracts -- lint_watch_empty_dir_is_refused lint_diff_empty_dir_is_refused -> FAILED. 0 passed; 2 failed (watch: killed at 20 s after repeated "Result: PASS" over 0 contracts, code -1; diff: exit 0) GREEN: cargo test -p aprender-contracts-cli --test pvl_zero_contracts -> ok. 17 passed; 0 failed Not changed (recorded for the next run): exit 2 is shared with clap usage errors - all three lanes call that an ambiguity; PVL-001 row EV-1 mandates 2. `changed_contracts` diffs the literal `contracts/` path, not <dir> (diff.rs:22). Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…, not re-reviewed, STOP(andon) Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…a broken file is measured not dropped (PVL-1, PMAT-1099) Refs PMAT-1099 Second review quorum on #3093 (3 agy lanes, 3/3 FAIL): the walker in contract_walk.rs used a private file rule and silently DROPPED files that failed to parse, so a directory of only broken YAML was "0 contracts" (exit 2) to proof-status and `lint --diff` while `lint` measured the same directory as `contracts: 1, errors: 1` (exit 1). The private rule also skipped every `*playbook*` stem, and the corpus holds real contracts named that way (apr-page-examples-*-playbook*-v1.yaml): proof-status counted fewer contracts than lint over the same tree. - `provable_contracts::lint::collect_yaml_files` (is_contract_yaml + the skipped sidecar dirs) is now public and is THE file rule; the walker, coverage (its private duplicate walker deleted) and the diff-mode probe all use it. Over contracts/: lint 1767, proof-status 1767, coverage 1767. - A contract file that fails to parse is ParseErrors (exit 1, every file named, "N of M contract files under <path> failed to parse"), never a silent skip and never "0 contracts". - `lint --diff <ref>` with nothing changed probes for contract files without parsing (has_contract_files): exit 0 in 31 ms over contracts/ (the previous fix parsed the whole corpus on that path). - The sidecar fixture: a `*playbook*` file is not a sidecar (it is a contract name in the corpus); the test now uses a dot-prefixed file. Falsifiers (contracts/work/PMAT-1099.yaml v1.1.0, each measured): 006 watch guard removed + diff probe neutralised -> `cargo test -p aprender-contracts-cli --test pvl_zero_contracts lint_` FAILED. 2 passed; 2 failed (lint_watch_…, lint_diff_…) -> restored ok. 4 passed 007 walker drops parse failures again -> `… pvl_zero_contracts -- unparsable_only mixed_dir` FAILED. 0 passed; 2 failed -> restored ok. 2 passed 002 re-measured: guard call in lint::run deleted -> 2 passed; 2 failed -> ok. 4 passed cargo test -p aprender-contracts-cli: 74+1+64+34+8+19+8 passed, 0 failed; aprender-contracts lib 1501 passed; make gate rc 0. Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
… quorum 3 PASS 3/3, artifact Refs PMAT-1099 Docs only (docs/audits/**): the code reviewed by the third quorum is 3f573c3. Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…e-reader no workflow ran (PMAT-1099) Refs PMAT-1099 guard-cargo on a81d1e5 (BSE-17 self-test rows 8/9): `scripts/tree_reader_unwired_baseline.txt drifted — > aprender-contracts-cli --test pvl_zero_contracts` — the new falsifier reads contracts/softmax-kernel-v1.yaml, so it is a tree-reader, and the full tier runs `--workspace --lib` only: no workflow would ever have executed it. Ledgering it as "reads the tree and nothing runs it" would make PVL-1's gate a test that never runs; it is wired into the same `cargo test -p X --test Y` chain as pv_surface_gate instead, and the derived registry is regenerated with `scripts/check_tree_reader_tests.sh --update` (never hand-edited). Local: `check_tree_reader_tests.sh` rc 0; `ci_test_tier.sh --self-test` 15 checks, 0 failed. This PR now touches .github/workflows/ci.yml: STOP(workflow-merge: aprender PR 3093) per PVL-001 §4.5 — operator merge once gate and workspace-test are green. Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
…rst 'Host layout' step exports CI_TARGETS_ROOT / CI_CARGO_ROOT / SCCACHE_HOST_DIR / CI_REGISTRY / IMAGE with the intel clean-room defaults, 33 hardcoded sites read them; byte-identical on intel (#3100) Also: check_runner_labels.sh accepts the `build` pool label. No job changes where it runs yet (BP-3). Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> (cherry picked from commit 77038f4)
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
…pool (operator direction 2026-09-10) (PMAT-1099) Cherry-picked byte-identical from #3098/#3101 (-x); the ci.yml delta to #3098 is the pvl_zero_contracts wiring only. Receipt records the verbatim direction and the local guard results. Pmat-Ticket: PMAT-1099 Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ontract, so the generated count moves 1817 -> 1818 (PMAT-1099) guard-cargo FALSIFY-README-002 is an EQUALITY, not a ratchet: the block is generated by scripts/readme_sync.sh, so a generated number may not lag the merge tree. `make readme-sync` wrote both blocks; check_readme_claims.sh now PASSes (1818 agrees with merge tree). G-11 does not bind: this is not an agent/<row> branch. Pmat-Ticket: PMAT-1099 Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… ANY x86 box carrying `build`" on this row (PMAT-1099) MEASURED, not assumed: every job that landed on a yoga box today died in `actions/checkout` before a single step ran — EACCES rmdir on a root-owned _work/aprender/aprender/target. On this branch that took workspace-test, guard-tree, guard-cargo and pr-review-shadow (yoga-build) and vendored-schemas (yoga-eph); on #3098 it took guard-tree. workspace-test alone burned 10 attempts on yoga-build between 16:35 and 16:45. The pre-checkout EACCES self-heal does not save it: the docker-inspect branch is TAKEN and the chown reaches a different filesystem view than the containerized runner workspace, while `2>/dev/null || true` keeps the step green. This revert is branch-local and nets to zero against a main that later carries BP-3, so it cannot regress the pool. BP-1 (the host-layout env indirection) is KEPT. Undo this commit once the yoga _work trees are swept. Pmat-Ticket: PMAT-1099 Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…e yoga checkout EACCES (not mine, escalated) (PMAT-1099) Pmat-Ticket: PMAT-1099 Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…ox" on this row (PMAT-1099)
BP-1 rewrites GUARD_TARGET_DIR from the literal `run-${{ github.run_id }}-guards` env key into an `echo ... >> $GITHUB_ENV` form, and scripts/tests/guard_tree_test.sh asserts the literal: the case row "guard-cargo has its own target dir suffix (run-<RUN_ID>-guards)" reports `matches=0` and guard-tree goes RED — measured on intel-clean-room-3, so this is BP-1, not the yoga host gaps. The same row will go red on #3101, which carries BP-1 on its own.
With BP-3 already reverted, BP-1 buys this row nothing, so both come off and the ci.yml delta to origin/main is exactly the pvl_zero_contracts wiring.
Pmat-Ticket: PMAT-1099
Claude-Session: https://claude.ai/code/session_01DkwPBrLHuPJrJeUbaFBu7P
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…stderr line (PVL-1, PMAT-1099) The third review quorum on #3093 (3 lanes, 3 FAIL) found `pv validate` unguarded: it reads one artifact and never went through the walker, so a nonexistent path was exit 1 `No such file or directory` and an empty directory exit 1 `Is a directory (os error 21)` — while the spec row names validate beside lint, proof-status, coverage and graph. Guarded first; a directory now validates every file lint would walk with an accumulator. `pv lint /nonexistent` leaked `cannot create /.pv` ahead of the refusal (two lines, three under --diff): the corpus check moves ahead of the cache dir, the diff probe and the watcher (a helper, so lint::run keeps cognitive 25 — the hook ceiling), and assert_refused asserts exactly one stderr line. The prefix names the verdict class: `decline:` for exit 2, `error:` for exit 1 — the vocabulary in PVL-001 §0 and the row's own RED text. verify_pipeline's unit tests ignored `run`'s Result (this PR made it fallible; clippy --all-targets -D warnings: 3 errors → 0). Mutation FALSIFY-PVL-1-008 measured RED (empty dir → exit 0, the vacuous PASS) then GREEN. Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F6j8JyVRA7yDHTjgDbviW4
…, decline: prefix all re-measured (PMAT-1099) Second review quorum of this session, three independent agy lanes, writes=false, on the head that carries the validate fix. Every lane re-measured the three findings of the 3/3 FAIL quorum on 77187ac as closed, the directory walk as correct, the decline: prefix as harmless to the other suites, and the ci.yml delta as the one-line wiring. Artifact bound to head + diff_sha256 so pmat-merge can read it; partial=true is only lane 1's benign stderr note ("root agent idle; waiting for 1 background task"). Lane models unreported by agy (EV-17). Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01F6j8JyVRA7yDHTjgDbviW4
noahgift
enabled auto-merge
September 11, 2026 07:31
…contracts # Conflicts: # docs/roadmaps/roadmap.yaml
Contributor
Author
|
quorum-review (AD-04): three PASS — agreed {
"ticket": "PMAT-1099",
"head": "5f6acd76b376606a8365a770903f462484ce15cb",
"width": 3,
"executor": "agy",
"agreed": true,
"lanes": [
{
"lane": 1,
"verdict": "PASS",
"findings": 5
},
{
"lane": 2,
"verdict": "PASS",
"findings": 3
},
{
"lane": 3,
"verdict": "PASS",
"findings": 5
}
]
} |
… after #3089) Refs PMAT-1099 Pmat-Ticket: PMAT-1099 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
noahgift
disabled auto-merge
September 12, 2026 09:47
…dditive guard read the 0.67.0 train squash as deletions on this branch (PMAT-980 remedy, #2874) python3 scripts/lib/roadmap_diff.py trim --base origin/main --file docs/roadmaps/roadmap.yaml --write Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
noahgift
enabled auto-merge
September 12, 2026 16:39
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.
PVL-1 (PMAT-1099):
pvrefuses to report over ZERO contractsSpec: paiml/infra
docs/specifications/PVL-001-pv-lean-gate.md§2 row EV-1. Ground truth: PV-LEAN-AUDIT-001 (2026-09-10 10:47Z).Facts re-verified at HEAD 43b8d8e (genchi genbutsu)
pv lint /nonexistent-path→ rc 0,Result: PASSover 0 contractsscripts/pv_bin.sh[V]pv lint <empty dir>→ rc 0pv proof-status <empty dir>→ rc 0,Proof Status (0 contracts)pv verify-pipeline <empty dir>→ "No contracts found", rc 0verify_pipeline.rs:26-29)contract_walk::collect_contractsused by graph, proof-status, lean-status, verify-pipeline; lint and coverage walk on their ownpmat query --literal "contract_walk::")Change
contract_walk.rs:ZeroContracts { path, filter }(Display0 contracts under <path>),ZERO_CONTRACTS_EXIT = 2,collect_corpus()(dir walked · single file = one-contract corpus · missing path = empty),require_contracts(),exit_code_for().lib.rs: aZeroContractsdispatch error exits 2 (nothing was measured — clap's usage-error code); every other error keeps exit 1 (measured, failed).lint.rs:refuse_empty_corpus()reads the gate namedvalidate(count = parsed + parse errors) before any report is printed. A shape-only match was measured refusing every VALID corpus, becauseduplicate-stemsreuses theValidatedetail with zeros.lint/gates.rs: a single file is linted as a one-contract corpus (no cache beneath a file).coverage.rs,graph.rs,proof_status.rs(--kindfiltering to zero is refused and named),lean_status.rs,verify_pipeline.rs(returns the error instead ofprocess::exit, which had killed the crate's unit-test binary).contracts/work/PMAT-1099.yaml(kind: pattern): 3 equations, 3 obligations, 5 falsifiers — everyif_failscarries the mutation actually run.RED → GREEN (measured)
cargo test -p aprender-contracts-cli --test pvl_zero_contracts→FAILED. 1 passed; 14 failed(a9db650) [V]ok. 15 passed; 0 failed;cargo test -p aprender-contracts-cli(every target) → 204 passed / 0 failed;cargo test -p aprender-contracts --lib→ 1501 passed [V]target/debug/pv lint contracts/→Result: PASS, validatecontracts: 1766, errors: 0, rc 0 [V]scripts/check_contract_test_binding.sh→ PASS, 539 refs resolved, ratchet unchanged [V]make gate(post-commit; touched crates aprender-contracts + aprender-contracts-cli → selection 4 > cap 3 → fullcargo check --workspace --tests) → rc 0, 41 checks / 0 failed, 436 s [V]. NOTE: run before the commits it reportedno files touched vs origin/main — nothing to select— it reads commits, so a pre-commit gate run measures nothing there."$PV" lint /nonexistent-pvl-path; test $? -ne 0) in this worktree → rc 2 [V]. It reads~/src/aprender's checkout, so it turns green on merge, not before.Mutations (each applied on 1ca5d39, measured, reverted;
git statusclean after each) [V]require_contractsremoved fromcollect_corpus7 passed; 8 failed— exactly those 8lint_*RED0 passed; 2 failed(filterlint_)exit_code_for→ always 1*_is_refusedRED, controls GREEN0 passed; 13 failed(filteris_refused)require_contracts→ always Err0 passed; 2 failed(filtercontrol_)--kindguard removed0 passed; 1 failed15 passedevery time.Jidoka
make gateRED once: pmat complexity,lint::runcognitive 30 > 25 with the guard inline (HEAD was already at 25). Extractedrefuse_empty_corpus()and moved the single-file cache rule intobuild_config()→runback to 25. Logged in.pmat/jidoka.jsonl.Review lanes
/teamwork-preview, conversation8006e793-4cdc-4a41-bcc5-d571e5eccd58): PASS-with-changes — keep exit 2; add single-file handling (elsepv_surface_gategoes red for the wrong reason); include lean-status + verify-pipeline; no fixture or caller depends on an empty dir passing; the!= 2control was vacuous → controls now require exit 0 AND a printed count of 1. All adopted.docs/audits/PVL-1-receipt.md.Routing
route=agy-plan w=1.00 basis=absent effort=1[U]route=agy-goal w=1.00 basis=absent note=fable-binding effort=1[U]route=agy-quorum w=1.00 basis=absent effort=1[U]route=self w=100.00 basis=absentNot changed / findings not asked for
apr pvembedsdispatch(); its own exit mapping is untouched (exit code there [U]).duplicate-stemsreusing theValidatedetail shape with zeros is what made a shape-only guard wrong — a dedicated variant would remove the trap [A].pmat work startre-serialiseddocs/roadmaps/roadmap.yaml(816+/1469−); the diff was trimmed to the one added entry (G-6) [V].gateandworkspace-testpass; the non-requiredpresentcheck fails as it did before [V].Refs PMAT-1099
Pre-merge review quorum (3 agy lanes) → 3/3 FAIL → fixed in cf2967d
--watchbypasses the guard (run_watchloopsrun_lint+print_report, lint.rs:344); measured a report over 0 contractscontracts: 0, errors: 0confirmed as the right emptiness signal--watch(lint.rs:46) AND--diff HEAD <empty>→ exit 0 "Nothing to lint" (lint.rs:72)Verified at HEAD by the orchestrator
[V]:lint::runreturns intorun_watchat :46-65 and intorun_diff_checkat :72-76, both beforerefuse_empty_corpusat :101. Fixed in cf2967d — guard after every watch tick;--diffsays "nothing changed" only over a non-empty corpus.RED→GREEN
[V](guard stashed withgit stash push -- src/commands/lint.rs, tests present):Lane dissent NOT acted on (spec-mandated, escalated in the receipt): all three lanes say exit 2 is ambiguous with clap's usage error. PVL-001 row EV-1 says "0 contracts → exit 2". Kept at 2. Lane models: not recorded by agy
[U]. This fix commit has NOT been re-reviewed by a quorum (session budget at andon) — the PR stays unmerged until the next PVL run re-quorums it.Second review quorum (3 agy lanes on 8bb0c29) → 3/3 FAIL → fixed in 3f573c3
0 contracts(exit 2) in--diff, exit 1 inlint; contract lacks watch/diff falsifier; receipt count 1767 vs 1766proof-status;--diffnothing-changed path parsed the whole corpus; FALSIFY-002 harness stale (4 tests, not 2)lintreports (exit 1) over an unparsable-only dir — that is "measured and failed", kept; receipt line numbers were cited at f99b9b6 (stated in the row)Verified at HEAD by the orchestrator
[V]:collect_contractsskippedErrfromparse_contract(contract_walk.rs, pre-fix :128) and every*playbook*stem (:125) —contracts/apr-page-examples-qwen-qa-playbook-v1.yamland…-state-machine-playbooks-v1.yamlare real contracts lint parses. Fixed in 3f573c3: ONE file rule (provable_contracts::lint::collect_yaml_files, now public) for the walker, coverage and the diff probe; a broken file isParseErrors(exit 1, named);lint --diffprobes without parsing.Measured
[V](target/debug/pv … contracts/): lintcontracts: 1767, errors: 0; proof-statusProof Status (1767 contracts)rc 0; coverageContracts: 1767;lint --diff HEAD contracts/rc 0 in 31 ms.Mutations
[V](contracts/work/PMAT-1099.yaml v1.1.0, exact commands in eachif_fails): 006 →FAILED. 2 passed; 2 failed(watch, diff) →ok. 4 passed; 007 →FAILED. 0 passed; 2 failed(unparsable_only, mixed_dir) →ok. 2 passed; 002 re-measured →2 passed; 2 failed→ok. 4 passed.Not acted on: the exit-2/clap ambiguity (spec-mandated, escalated in the receipt). A third 3-lane quorum runs on 3f573c3 before any merge.
Third review quorum (3 agy lanes on 3f573c3) → 3/3 PASS
contracts/; broken-only and mixed scratch dirs exit 1 naming the file for every command;--diffover an empty dir exits 2; no caller depends on the old skiphas_contract_filesis the lint engine's rule; 20 s watch deadline soundlane-reduce.sh --width 3 --not-before <launch>→agreed: true; artifactdocs/audits/quorum-PMAT-1099.json, session receiptdocs/audits/PVL-1-receipt.md(commit a81d1e5, docs only). Non-blocking note from all three lanes: thecollect_from_real_contracts_dirunit test cannot see a walker that drops broken files (the corpus has none) — the integration falsifiers (FALSIFY-PVL-1-007) do.guard-cargo on a81d1e5 → wired in 7bb3ee0 →
STOP(workflow-merge)BSE-17's self-test (rows 8/9) refused the PR:
scripts/tree_reader_unwired_baseline.txt drifted … > aprender-contracts-cli --test pvl_zero_contracts— the falsifier copiescontracts/softmax-kernel-v1.yaml, so it is a tree-reader, and the full tier runs--workspace --libonly: no workflow would ever have executed it. Ledgering it as "reads the tree and nothing runs it" would ship PVL-1's gate as a test CI never runs, so it is wired into the samecargo test -p X --test Ychain aspv_surface_gate(ci.yml, one line) and the derived registry is regenerated withscripts/check_tree_reader_tests.sh --update. Local:check_tree_reader_tests.shrc 0,ci_test_tier.sh --self-test15/15[V].This PR now touches
.github/workflows/ci.yml. Per PVL-001 §4.5 it ends inSTOP(workflow-merge: aprender PR 3093): operator merge from the web UI oncegateandworkspace-testare green. The code under review is unchanged since the third quorum's 3/3 PASS (3f573c3); the wiring commit is orchestrator-owned and is verified by CI itself.🤖 Generated with Claude Code