Conversation
|
§13.11 rung 1 — quorum shadow verdict Shadow mode: this records a verdict and merges nothing. A refusal |
…ived from launched backward kernels, not from the request Pmat-Ticket: PMAT-991
…launch; training_backend_banner derived from it (PMAT-991, #2906) Pmat-Ticket: PMAT-991
…ent, the cuda request on a cpu-only build is a refusal (exit 9) Pmat-Ticket: PMAT-991
…(exit 9); the cuBLAS backward line is printed after training from entrenar's launch counter, never from the request (PMAT-991, #2906) Pmat-Ticket: PMAT-991
…ne's test module (the lib.rs test seam is blocked by pre-existing complexity debt in lib.rs's include graph: dispatch.rs, help_producer_truth.rs); test_run_training_creates_adapter exercises the CPU path it always ran, and says so — 'cuda' on a cpu-only build is now a refusal (PMAT-991) Pmat-Ticket: PMAT-991
… banner is derived from launches, a gpu request the build cannot honour is FeatureDisabled (PMAT-991, #2906) README.md's contract count was already at 1812 on the rebased base (bumped by the G-11 ratchet process since this branch's original base); no README edit needed or made here (row PRs do not write README.md, driver rule). Pmat-Ticket: PMAT-991
… rows Pmat-Ticket: PMAT-991
…unch snapshot, no reset API; a second fine-tune in one process inherits nothing; race-free tests), four more device-side backward launch sites counted (f16->f32 a, NF4 cuBLAS/PTX/tensor-core a), -m lora --gpu-backend cuda is ValidationFailed exit 5 (refuse or train on the GPU), dead gpu_backend_notice removed (PMAT-991, #2906) Pmat-Ticket: PMAT-991
…able-with-changes, lane 1 right on the f16 site, three more NF4 sites found), mutations re-run at a137ba6 Pmat-Ticket: PMAT-991
|
Rebased onto Re-verified at HEAD (
|
|
Auto-merge armed. Currently |
…dogfood `pmat work add` was not used, for the two reasons this ticket exists: 1. It allocates from the roadmap it can see. Max across origin/main and every open pp-066 head is PMAT-1079, and three instances are minting concurrently, so an auto-mint races. 1090 leaves 1080-1089 as headroom. A gap is opaque; a collision is data loss (and 12 duplicate ids on stale heads is what turned `ci / security` red on #3031 and #3001). 2. It re-serialises the whole file — the defect this ticket fixes. The new `--staged` mode judged its own commit, which is the point: $ bash scripts/check_roadmap_diff_additive.sh --staged === roadmap.yaml STAGED diff is additive: base=c04eda87d (merge-base(origin/main, HEAD)) head=8e4ceee37 (index tree) === roadmap-diff: base=818 head=819 added=1 lifecycle=0 reserialised=0 deleted=0 PASS $ git diff --cached --stat docs/roadmaps/roadmap.yaml | 19 +++++++++++++++++++ added=1, reserialised=0, 0 deletions. That is the diff the rule asks for, and `pmat work add` cannot produce it — which is why the remedy script exists and why nothing calling it made the rule unenforceable in practice. Refs #3047, PMAT-1090. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01EeUX4ymyt8XhjXbtTuNH8L
check_roadmap_diff_additive.sh reported base id(s) missing at head: this branch forked before they landed on main, and a plain update takes one side of the file whole. Resolved as main's roadmap plus this branch's own new entries, each at its sorted slot among same-prefix peers. The other three roadmap guards pass on the result. Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
check_roadmap_diff_additive.sh reported base id(s) missing at head: this branch forked before they landed on main, and a plain update takes one side of the file whole. Resolved as main's roadmap plus this branch's own new entries, each at its sorted slot among same-prefix peers. The other three roadmap guards pass on the result. Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…is the answer One conflict, docs/audits/impl-estimates.jsonl. Both sides APPENDED: this branch added four PMAT-991 rows, main added three PMAT-972 rows (via #3006). Taking either side whole deletes measurements nothing else records. Resolved as the union, main's rows first since they are already in main's history. Verified after: 46 rows, every one valid JSON, zero duplicates, no conflict markers. Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…is the answer One conflict, docs/audits/impl-estimates.jsonl. Both sides APPENDED different tickets' rows; taking either side whole deletes measurements nothing else records. Resolved as the union, main's rows first since they are already in main's history — the same resolution #3001 needed an hour ago, for the same reason: a squash-merge from the queue makes every branch carrying this file DIRTY on it. Verified after: every row valid JSON, zero duplicates, no conflict markers. Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
One conflict, docs/audits/impl-estimates.jsonl, append-only, resolved as the union with main's rows first. #3001 at ~07:05Z, #3093 at ~08:35Z, this at ~08:45Z — three identical resolutions in under two hours. #3256 is the fix: `docs/audits/*.jsonl merge=union` in .gitattributes, with a guard holding the scope (149 goldens and datasets must NOT be union-merged). Once that lands this conflict stops existing. Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
… the conflict was right Two conflicts. docs/audits/impl-estimates.jsonl — append-only, resolved as the union with main's rows first. Fourth time today (#3001, #3093, #3005, this); #3256 makes it stop. README.md — the CONTRACT_COUNT block, 1839 on this branch against 1837 on main. Taking either side would have been wrong: the branch ADDS contracts, so the merged tree is neither number. CLAUDE.md's rule for this table is explicit — "the table gives the command, and the value is only a dated sample. If a number here disagrees with its command, the command wins." find contracts -name '*.yaml' | wc -l -> 1840 Set to 1840 at both blocks, and check_readme_claims.sh agrees: PASS FALSIFY-README-002 contract_count: 1840 (CONTRACT_COUNT block, derived by scripts/readme_sync.sh; 1 block(s) agree with the merge tree 259c8f7) A generated value is not a text conflict to pick a side of. It is a question with a command attached. Pmat-Ticket: PMAT-1098 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…the union Both sides only APPEND to docs/audits/impl-estimates.jsonl: main added 3 PMAT-989 rows, this branch added 4 PMAT-991 rows, zero deletions on either side. The textual conflict has no semantic content — the resolution is all 7 rows, and every surviving row was re-parsed as JSON to prove it. It is the only file that changed on both sides (42 base rows -> 49). Pmat-Ticket: PMAT-991
…d the ratchet measures the MERGED tree FALSIFY-README-002 compares the CONTRACT_COUNT block against the merge tree, not against the diff: base=1840 merge=1841 delta=+1, because this branch adds contracts/apr-train-banner-truth-v1.yaml. The block said 1840. Regenerated with `make readme-sync`. check_readme_claims.sh 5/5 PASS. Pmat-Ticket: PMAT-991
…dy wrote (paiml#3256) docs/audits/impl-estimates.jsonl is appended one row per (ticket, phase). Two branches that both append conflict on the last line, so a squash-merge from the queue makes EVERY branch carrying it DIRTY the moment anything merges. Measured 2026-09-14: paiml#3001 at ~07:05Z and paiml#3093 at ~08:35Z — ninety minutes apart, same file, same conflict, and I resolved both identically (take the union, main's rows first, verify every row is valid JSON and no duplicates). Doing that by hand a third time would be the tell I had already missed twice. `union` is git's built-in driver. Proved in a throwaway repo BEFORE writing it here, because an attribute that is declared and does not resolve conflicts is exactly the theater this repo names most often: without .gitattributes a two-sided append leaves 1 conflict marker with merge=union 0 markers, result = base + MAIN + SIDE THE SCOPE IS THE POINT, AND IT IS WHY THIS SHIPS WITH A GUARD RATHER THAN A COMMENT. `*.jsonl merge=union` would be a defect, not a convenience: 149 of the 151 .jsonl files here are GOLDENS and DATASETS — crates/aprender-contrastive-data/tests/goldens/*, datasets/*, evidence/pr-review/*/receipt.intoto.jsonl. A union merge there silently DUPLICATES rows, destroying the byte-identity those files exist to assert. check_append_only_ledgers.sh holds that distinction as a case table, both polarities, and R3 proves the MECHANISM rather than the declaration: R1 the ledger resolves merge=union ok R2 a golden does NOT ok R3a without the attribute a two-sided append CONFLICTS (1 marker) ok R3b with merge=union it does not (0 markers) ok R3c and the result is the UNION, not one side (3 lines) ok Mutation, the one that matters: widening .gitattributes to `*.jsonl merge=union` turns the guard RED with 149 findings — every golden and dataset named. The narrow scope is load-bearing and the guard says so. Measured on this tree: 2 append-only ledgers (impl-estimates.jsonl, impl-routing.jsonl — the latter written by route.sh record-event), 149 other .jsonl correctly excluded. bashrs 0 errors; check_guards_are_wired PASS, unwired baseline did not grow. NOT VERIFIED, and I am not claiming it: whether GitHub's SERVER-SIDE mergeability computation honours `.gitattributes merge=union`. If it does, these PRs stop going DIRTY at all; if it does not, the local resolution becomes a no-op instead of a hand-edit. Either way this is an improvement, but only the local half is proved above. Pmat-Ticket: PMAT-1098 Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
|
No activity since 2026-09-17 13:39Z; 2 release trains have been cut since (v0.68.2, v0.68.1). Age is the only input to this sweep — it is not a judgement on the work, and a train label such as What happens next: if one more train passes while this is still labelled To clear it: push, rebase, or say on the thread what it is waiting for. Any of the three removes the label at the next sweep. If it is blocked on something external, name that here — a blocker with an owner is not sprawl, and it stops the clock. |
|
closed by 0.70 batch triage: no quorum receipt and no live owner; branch kept, reopen with an owner Authority: per operator order (quoted) "yes, clearn up. no sovereign repo can have triage, ticket, branche issues and arbiter shoudl be doing this! tell that agent to get to work" + cop (aprender-cf) ruling on the close criteria (a draft, or >7d old with no live owner, and no quorum receipt). The operator did not select this PR individually. |
PP-066 DAG row R-3 (spec §5 T-6, D-7; epic #2873; ticket PMAT-991; receipt
docs/audits/impl-PMAT-991-receipt.md,status: partialuntil merged).feedback_apr_finetune_lora_cpu_only: the "cuBLAS backward" training banner was printed from the request, before any step, on any build;--gpu-backend cudaon a cpu-only build fell through to the CPU silently. Now the banner is an event and the impossible request is a refusal.What lands
entrenar(crates/aprender-train):backward_kernel_launches()/reset_backward_kernel_launches()— anAtomicU64bumped at every cuBLAS backward launch (cuda_forward/matmul.rsa, a_accumulate, b;matmul_f16.rsa, b);training_backend_banner(requested) -> Option<String>isSomeiffrequested == "cuda"and the counter > 0. RED-first testtests/banner_truth.rs(both feature arms; the cuda arm drives one cuBLAS backward on this box's RTX 4090 and watches the counter move).apr finetune:gpu_backend_decision(requested, build_has_cuda, build_has_wgpu)—cuda/wgpuon a build without the feature isCliError::FeatureDisabled(exit code 9, read fromerror.rs:106);auto/cpunever refuse;pre_training_noticenever says "cuBLAS backward";post_training_bannerprintsentrenar's line after training. Case tablecommands/finetune_gpu_backend_truth_tests.rs(5 tests, both polarities).contracts/apr-train-banner-truth-v1.yaml(kind: pattern, TBT-OB-001..003;pv validatevalid,pv lint0/0). README contract count 1811 → 1812.test_run_training_creates_adapterhard-coded"cuda"and asserted the old silent fallback; it now names the CPU path it always ran.Acceptance, re-run by the orchestrator on eaea476
cargo test -p aprender-train --test banner_truthcargo test -p aprender-train --test banner_truth --features cuda(lambda, sm_89)cargo test -p apr-cli --lib gpu_backend_truthcargo test -p apr-cli --libcargo test -p aprender-train --libprune::snapshot_tests— identical on a pristine origin/main worktree at 65680cd while CI's workspace-test there is green: local insta drift,src/pruneuntouched herecargo fmt --all -- --check·cargo clippy -p {aprender-train,apr-cli} --lib -- -D warningscheck_contract_test_binding.sh·check_contract_enforcement.sh·check_readme_claims.sh·check_no_claim_literals.sh·check_roadmap_diff_additive.shMutations — RED, then restored GREEN
training_backend_bannerreturns Some for "cuda" regardless of the counterbanner_is_none_for_cuda_with_zero_launchesFAILED,cpu_only::cpu_backward_never_increments_the_device_counterFAILED (0 passed, 2 failed) → restored 2 passedgpu_backend_decisionreturnsOk(Cpu)for "cuda" on a build without cudacuda_request_on_cpu_only_build_is_a_refusal_not_a_fallbackFAILED,gpu_backend_decision_case_tableFAILED (3 passed, 2 failed) → restored 5 passedFindings recorded in the receipt
aprender-train, the lib isentrenar(S0-10 class).crates/apr-cli/src/lib.rscannot be committed on this box: the pre-commit complexity hook follows itsinclude!()graph and refuses on pre-existing debt (dispatch.rs:103cognitive 41,dispatch.rs:508cognitive 30,help_producer_truth.rs:51cognitive 73). The integration-test seam was dropped; the case table lives incommands::finetune's own test module. Not discharged with#[allow]or--no-verify.autograd/cuda_backward/— a PTX-only backward would leave the bannerNone(open question for the 3-lane review; the spec names the cuBLAS sites).Review round (3-lane quorum, 2026-09-06 — 3/3 mergeable with changes; applied at a137ba6, re-verified)
training_backend_banner(requested, launches_at_start), snapshot beforetrainer.train(), no reset API); the tests snapshot and compare (race-free under parallel tests).gemm_f16_to_f32_backward_alaunched uncounted; lanes 2/3 said all sites were covered. Lane 1 was right, and three more uncounted device backward launches were found inmatmul.rs(gemm_nf4_backward_a_cublas, the NF4 PTX and tensor-core backward_a — the QLoRA path). Nine launch sites are counted now.-m lora --gpu-backend cudanow REFUSES (ValidationFailed, exit 5) instead of running the CPU path under a GPU flag;auto+ plain LoRA is the CPU path and the notice says so (gpu_backend_decisiongainedmethod_has_cuda_path).gpu_backend_notice/GpuBackendPlan(still holding the request-derived cuBLAS string) and their five tests removed.banner_truth2/2 (default and--features cuda),gpu_backend_truth8/8,cargo test -p apr-cli --lib7211 passed,cargo test -p aprender-train --lib7621 passed + the same three pre-existing prune snapshot failures, clippy/fmt clean,pv validatevalid. Mutations: 1 (banner unconditional) 0/2 passed; 2 (cuda on a cpu-only build → Cpu) 6/8; 3 (plain LoRA + cuda → Cuda, no refusal) 7/8; all restored GREEN.Quorum verdicts and the adjudication are in the receipt. Receipt for this PR itself: advisory, not produced (driver A1).
no-close: #2873 is the epic this row implements one part of; an epic is not closed by one of its rows.