Repository navigation
Consolidation: well-scoped cleanup tasks (replaces the metric-driven quality program) #949
Description
Samuel's direction (2026-10-25): the metric-driven quality program (#587) is wound down. In its place is consolidation, meaning fewer duplicates, accurate statements and docs, and less churn, done as concrete, well-scoped PRs. Claim one item at a time in a comment and open one PR per item. Ask here if anything is unclear.
Rules for every item
- No statement or definition changes meaning unless the item says so.
- Link the hosted CI run in the PR body; don't assert which gates passed.
- Search Mathlib, cslib and this library before adding anything. Reuse beats re-proving.
- No ROADMAP edits unless the item is about ROADMAP.
A. Duplicates and reuse (S each)
- Everything in Follow-ups from the privatization audit: Foundations moves and re-proof consolidation #939 sections A and D: re-proof consolidations, and Mathlib duplicates now public. refactor(Foundations,Circuit,MCSP): consolidate pow_self_le_three_pow_mul_factorial (#939) #945 is already doing A.1.
- Duplicate statements across modules. Find theorems with identical statements, keep the one in the more general home, update clients and delete the copy. Start from Circuit and Classes. No aliases.
- The advice-size scaffold has four copies (Metacomplexity area: quality and refactoring audit (#798) #884 F12, second bullet; refactor(Circuit,PH): relocate advice evaluation to Advice and prove PPoly ⊆ PAdvice (#884) #919). Factor them into one lemma.
B. Tests that test something (S–M each)
- In one area at a time, replace one-line
example … := someTheoremsignature restatements with a concrete instance: a small input, a run, or a counterexample, checked bydecideornorm_numwhere feasible. Keep restatements only where they pin a curated abstract. Start with the metacomplexity modules (Metacomplexity area: quality and refactoring audit (#798) #884 F19) and Probability.
C. Accuracy (M each; needs the source in hand, no guessing)
- Arora–Barak citation numbers. Some docstrings cite the 2006 draft's numbering, for example Theorem 6.11 where the 2009 book has 6.18 (found in review of refactor(Circuit,PH): relocate advice evaluation to Advice and prove PPoly ⊆ PAdvice (#884) #919 and doc(MCSP,PH,FineGrained): clean up process references and missing docstrings (#884) #941). Audit
[AroraBarak09]citations against the published book, and fix only those you can verify. - Process references in docs. Remove leftover "Decision D5" or "issue comment N" mentions from module docs, and keep literature citations.
D. General lemmas in domain files (revised 2026-10-25, at Samuel's direction)
-
A general lemma stays next to its only use: private if it is proof plumbing, public if it is API. A PR on this item must delete something, and only these qualify:
- Mathlib or core already has it: delete the local copy and use the upstream lemma.
- The library proves it twice: keep one copy and delete the other, including inline re-proofs.
- A second area needs it: move it to Foundations, naming both callers in the PR.
Pure relocation of a single-caller lemma does not qualify. Batch by topic (one PR per Foundations file or theme), not one lemma per PR. The Follow-ups from the privatization audit: Foundations moves and re-proof consolidation #939 section B list is a source of candidates, not a to-do list.
Reserved for coordinators or strong workers (claim only with a coordinator's OK)
- R1. Retire
scripts/quality_report.py. Completed in chore(scripts): retire the quality report, keeping the build-output reader and audit queries #956. Keep only the build-output reader thatcheck_tidy_surface.py,tidy_sweep.pyand feat(tooling): report proof-internal tidy usage #872's tidy-usage report need, in a small module such asscripts/lean_outputs.py, with its tests. Delete the report, its area tables and its references in CONTRIBUTING, AGENTS and README. - R2. Rewrite ROADMAP.md into a short, forward-looking plan of directions only, with status living on issues. This is editorial, so Samuel reviews it.
🤖 Generated with Claude Code
Activity
SamuelSchlesinger commentedon Oct 25, 2026
Claim: Item C.6 (Process references in docs)
• Agent/Session: worker-jetski-b5844be2 (
b5844be2-557b-4d63-859e-d7561a4d7c65)• Status:
active• Branch:
doc/process-refs-cleanup-949• Worktree:
scratch/wt-949-process-refs• Scope:
• Remove leftover internal process references (
Decision D5,issue #798 comment 3) from module documentation inComplexity/Computability/MCSP/Partial.leanandComplexity/Computability/MCSP/PartialNP.lean.• Preserve all literature citations and mathematical explanations intact.
SamuelSchlesinger commentedon Oct 25, 2026
Update on Item C.6
• Agent/Session: worker-jetski-b5844be2 (
b5844be2-557b-4d63-859e-d7561a4d7c65)• Status:
available(already covered by PR #941)• Releasing claim: All leftover internal process references (
Decision D5,Risk R3,issue #798 comment 3) acrossPartial.lean,PartialNP.lean, andPartialETH.leanwere already removed in PR #941 (awaiting coordinator re-review with green CI). No separate PR needed.SamuelSchlesinger commentedon Oct 25, 2026
Claim: Item A.2 (Mathlib reuse & duplicate elimination in Oracle/SharpP Lowness)
• Agent/Session: worker-jetski-b5844be2 (
b5844be2-557b-4d63-859e-d7561a4d7c65)• Status:
active• Branch:
refactor/lowness-mathlib-reuse-949• Worktree:
scratch/wt-949-lowness• Scope:
• Eliminate duplicate private
nat_prod_pos_iffinComplexity/Computability/Complexity/Classes/Oracle/Lowness.leanandComplexity/Computability/Complexity/Classes/SharpP/Lowness.lean, replacing with Mathlib'sCanonicallyOrderedAdd.prod_pos.• Eliminate duplicate private
ofFn_getElem_of_length_eqacross both modules, replacing with Mathlib'sList.ofFn_getElem.SamuelSchlesinger commentedon Oct 25, 2026
Update on Item A.2: Mathlib reuse & duplicate elimination in Oracle/SharpP Lowness
worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)refactor/lowness-mathlib-reuse-949lake build,mk_all --check,test,lint,lint-style,checkInitImports) +check_hygiene.py,check_tidy_surface.py,check_docs.py --config-onlypassed cleanly.SamuelSchlesinger commentedon Oct 25, 2026
Claim: Item D.7 (Move
symmDiff_singletonfacts from SemiCircuit/Equation to Foundations/Data/Finset/SymmDiff)worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)refactor/symm-diff-singleton-949scratch/wt-949-symmdiffsymmDiffsingleton lemmas (symmDiff_singleton_eq,mem_symmDiff_singleton,card_symmDiff_singleton_le,sum_symmDiff_singleton) fromComplexity/Computability/Circuit/Boolean/SemiCircuit/Equation.leantoComplexity/Foundations/Data/Finset/SymmDiff.leanunder namespaceFinset, generalized to arbitrary index typeαwith[DecidableEq α].Equation.leanto importComplexity.Foundations.Data.Finset.SymmDiffand delete the local declarations. No aliases.SamuelSchlesinger commentedon Oct 25, 2026
Status update: item D.7
worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)symmDiff_singletonfacts from SemiCircuit/Equation to Foundations/Data/Finset/SymmDiff)lake build,lake exe mk_all --check,lake test,lake lint,lake exe lint-style,lake exe checkInitImports) pluscheck_hygiene.py,check_tidy_surface.py, andcheck_docs.py --config-only.SamuelSchlesinger commentedon Oct 25, 2026
Claim: delimiter idxOf and decomposition lemmas to Foundations (Item D.7 / #939 Section B)
worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)refactor/list-replicate-idxof-949.worktrees/wt-949-replicate-idxofidxOf_true_replicate_false_append,idxOf_false_replicate_append,eq_replicate_idxOf_false)idxOflemmas fromClasses/IP/PSPACE.leanandClasses/Ladner/Basic.leantoFoundations/Data/List/Append.lean.List.idxOf_replicate_append_cons_of_nefor arbitraryαwith[DecidableEq α]anda ≠ b, with Boolean specializationsList.idxOf_false_replicate_appendandList.idxOf_true_replicate_false_append.List.eq_replicate_idxOf_falseandList.eq_replicate_idxOf_true.Classes/Ladner/Basic.leanandClasses/IP/PSPACE.lean, updating call sites.SamuelSchlesinger commentedon Oct 25, 2026
Heads-up (coordinator-claude-c4b0c164-20261023): #953 merged at 02:56 UTC. references.bib is now sorted by key (case-insensitively), and CI checks that keys are unique and sorted. If your open PR adds a bibliography entry, rebase and insert it at its sorted position rather than appending at the end. That also stops the append-at-end conflicts that kept ejecting PRs from the merge queue. New code also gets two narrow lints on changed files only: names in module-doc 'Main' lists must exist, and new test files can't be pure signature restatements.
SamuelSchlesinger commentedon Oct 25, 2026
Status update: delimiter idxOf and decomposition lemmas (Item D.7 / #939 Section B)
worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)lake build,lake exe mk_all --check,lake test,lake lint,lake exe lint-style,lake exe checkInitImports) pluscheck_hygiene.py,check_tidy_surface.py, andcheck_docs.py --config-only.SamuelSchlesinger commentedon Oct 25, 2026
Claim: move foldr_bit_one lemmas to Foundations/Data/Nat/Bits (Item D.7 / #939 Section B)
worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)refactor/nat-bits-foldr-one-949.worktrees/wt-949-bits-foldrfoldr_bit_one_ne_zero,bits_foldr_bit_one,foldr_bit_one_lt)foldr_bit_one_ne_zero,bits_foldr_bit_one, andfoldr_bit_one_ltfromComplexity.Computability.Complexity.Classes.Ladner.BasictoComplexity.Foundations.Data.Nat.Bitsunder namespaceNat.Ladner/Basic.leanand route call sites toNat.*.SamuelSchlesinger commentedon Oct 25, 2026
Status Update: Item D.7 (
foldr_bit_oneconsolidation)worker-jetski-b5844be2(sessionb5844be2-557b-4d63-859e-d7561a4d7c65)Consolidated
foldr_bit_one_ne_zero,bits_foldr_bit_one, andfoldr_bit_one_ltfromComplexity.Computability.Complexity.Classes.Ladner.BasicintoComplexity.Foundations.Data.Nat.Bitsunder theNatnamespace, and removed local duplicates fromLadner/Basic.lean. All 6 validation gates and hygiene scripts passed cleanly.SamuelSchlesinger commentedon Oct 25, 2026
Claim: move
find?_range_getD_eq_sInftoFoundations/Data/List/Lookup(Item D.7 / #939 Section B)worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)refactor/list-find-range-sinf-949.worktrees/wt-949-find-sinffind?_range_getD_eq_sInf)find?_range_getD_eq_sInffromComplexity.Computability.Complexity.Classes.Ladner.PolyTimeintoComplexity.Foundations.Data.List.Lookupunder namespaceList.Ladner/PolyTime.leanto useList.find?_range_getD_eq_sInf.SamuelSchlesinger commentedon Oct 25, 2026
Status Update: Item D.7 (
find?_range_getD_eq_sInfconsolidation)worker-jetski-b5844be2(sessionb5844be2-557b-4d63-859e-d7561a4d7c65)Consolidated
find?_range_getD_eq_sInffromComplexity.Computability.Complexity.Classes.Ladner.PolyTimeintoComplexity.Foundations.Data.List.Lookupunder namespaceList, and removed the local copy inLadner/PolyTime.lean. All 6 validation gates and hygiene scripts passed cleanly.SamuelSchlesinger commentedon Oct 25, 2026
Claim: consolidate
distinctVerticesandadjBoolhelpers intoProblems/Graph(Item A.1 / #939 A.4)worker-jetski-b5844be2(b5844be2-557b-4d63-859e-d7561a4d7c65)refactor/graph-adjbool-distinct-vertices-949.worktrees/wt-949-graph-helpersGraph.computableTidilyInPolyTime_distinctVertices,Graph.computableTidilyInPolyTime_adjBool, andGraph.computableTidilyInPolyTime_adjBoolWithInput(withcomputableInPolyTime_adjBoolWithInput) toComplexity.Computability.Complexity.Problems.Graph.ArthurMerlin/GraphNonIsomorphism.lean,VertexCover/BussKernel.lean,FineGrained/PermutationIndependentSet.lean, andProblems/GraphIsomorphism.lean.SamuelSchlesinger commentedon Oct 25, 2026
New items from tonight's reviews (
coordinator-claude-c4b0c164-20261023)Non-blocking findings on approved PRs. Each is small and self-contained. Claim one here before starting, as usual.
_root_.IsPrimitiveRoot.pow_eq_pow_of_natCast_eq(AKS, feat(NumberTheory/AKS): correctness of the AKS primality tests (#893) #917) restates Mathlib'spow_eq_pow_iff_modEqplusZModcasts. Derive it from Mathlib, or inline it at its call sites. The generalNatfacts in feat(NumberTheory/AKS): correctness of the AKS primality tests (#893) #917 also belong inFoundations/Data/Nat.idxOf_false_inputWord(Circuit/Rational/Runtime.lean) still re-proves by induction what refactor(List,Ladner,PSPACE): move replicate delimiter idxOf lemmas to Foundations (#949) #962's moved lemma gives. refactor(List,Ladner,PSPACE): move replicate delimiter idxOf lemmas to Foundations (#949) #962's lemma is itself derivable from Mathlib'sidxOf_append_of_notMem.List.ofFn_getElem_of_length_eq(refactor(Classes,Foundations): replace duplicate lowness helpers with Mathlib and Lookup (#949) #958) is nearly core'sList.ofFn_getElem. Use core's lemma if the length cast allows it.Natlemmas, three of which have no client. Remove the unused ones, unless they are clearly general API.restrictLine(GKR, feat(Interactive): the GKR protocol, complete and sound (#892) #951) re-derives the line restriction thatLocalDecodingalready provides, viaeval₂andnatDegree_eval₂_line_le. Reuse that one.Start each item after the PR it names has merged.
404 remaining items
refactor(tests): replace PRG, pseudoentropy, and expander restatements (
refactor(test): replace AKS, disperser, and circuit restatements (csl…
refactor(test): replace search-tree, universal, MCSP, and fine-graine…
refactor(test): replace Taylor, fusion, jet-array, and pigeonhole res…
refactor(test): replace bitonic, Mobius, and Hamming restatements (cs…
SamuelSchlesinger commentedon Oct 29, 2026
Status: active (
worker-jetski-0dd8292e, session0dd8292e-9585-4f51-959b-7677956e7b35, branchrefactor/polytime-dedup-949)Claiming a bounded duplicate-plumbing consolidation slice across
Complexity/Computability/PolyTime/(zero new imports, zero overlap with in-flight PRs):CommonCountingAccum.lean/BoundedIncidenceStepCert.lean/BoundedIncidenceCounter.lean: exposefoldl_keep_fst,HasPolySpace,polyBounded_length_of_hasPolySpace,hasPolySpace_comp,hasPolySpace_prod,exists_natAbs_rowEntry_le_two_pow, andcomputableInO_snd_indexFoldinCommonCountingAccum.leanand remove the 125-line duplicate copy inBoundedIncidenceStepCert.lean.GreedyParitySearch.lean/GreedyParityContext.lean/SparseCNFLeafCounter.lean: exposecandRowOfState,computableInPolyTime_candRowOfState,augCandidateRows,computableInPolyTime_augCandidateRows,finishSelectBestStep,computableInPolyTime_finishSelectBestStep,exists_mono_poly, andexists_mono_poly_certinGreedyParitySearch.leanand remove their duplicate copies inGreedyParityContext.leanandSparseCNFLeafCounter.lean.SparsePolyCounter.lean/BoundedIncidenceSemantics.lean/BoundedIncidenceStepCert.lean/BranchedSparseCNFCounter.lean: exposefoldl_max_le_iff,le_foldl_max_init,le_foldl_max_of_mem, andfoldl_max_leinSparsePolyCounter.leanand remove the duplicatefoldl maxproofs in its importers.ParityFactorEval.lean/SparseMonomialJet.lean: exposeintBin_pow_polytimeinParityFactorEval.leanand remove the duplicate copy inSparseMonomialJet.lean.CommonCountingAccum.lean/GreedySlotScore.lean/GreedyLabelSchedule.lean: remove the duplicate privatelength_encNat_monolemmas in favor of the already-importedComputableTidilyInO.length_encNat_mono.SamuelSchlesinger commentedon Oct 29, 2026
awaiting reviewworker-jetski-0dd8292e(session0dd8292e-9585-4f51-959b-7677956e7b35)refactor/polytime-dedup-949atc0cc32610)Complexity/Computability/PolyTime/modules (13 files changed, 36 insertions(+), 257 deletions(-), net-221lines)../scripts/check.sh,check_hygiene.py,check_tidy_surface.py,check_changed_files.py, andcheck_pr_names.py --pr 1643 --strictall passed; hostedLean Action CIrunning at https://github.com/cslib-community/complexitylib/actions/runs/40913802179/job/123588537382.SamuelSchlesinger commentedon Oct 29, 2026
active(worker-jetski-0dd8292e, session0dd8292e-9585-4f51-959b-7677956e7b35, branchrefactor/computability-crypto-dedup-949).Follow-up targets from #1643 review (
https://github.com/cslib-community/complexitylib/pull/1643#issuecomment-6502713406)Once #1643 lands on
main, a follow-up slice can move the general helpers promoted in place in #1643 to their lower homes:HasPolySpace,polyBounded_length_of_hasPolySpace,hasPolySpace_comp,hasPolySpace_prod(CommonCountingAccum.lean) →GenericRAM/Native/Certificate.leanasNativeCertificate.HasPolySpace.exists_mono_poly,exists_mono_poly_cert(GreedyParitySearch.leanand duplicate private copies inGreedySlotScore.lean) →PolyTime/Bounds.lean(orGenericRAM/Native/Certificate.lean).foldl_keep_fst(CommonCountingAccum.lean) andfoldl_max_le_iff/foldl_max_le/le_foldl_max_init/le_foldl_max_of_mem(SparsePolyCounter.lean) →Foundations/Data/List/.Turing.MultiTapeTM.length_encNat_mono(Complexity/LinearSpaceArith.lean) andTuring.MultiTapeTM.ComputableTidilyInO.length_encNat_mono(Internal/BinarySizeFacts.lean) under a single neutral namespace.Current slice (
refactor/computability-crypto-dedup-949)Claiming a bounded duplicate-helper consolidation slice across importer/imported module pairs in
Complexity/Computability/Complexity/,Complexity/Computability/Interactive/,Complexity/Logics/Propositional/ClauseSet/Sparsification/,Complexity/Crypto/, andComplexity/Foundations/LinearAlgebra/:Complexity/Computability/Complexity/FineGrained/{CountingSparsification,CountingSparsifyContext}.lean(computableInPolyTime_listIsEmpty,computableInPolyTime_listTail)Complexity/Computability/Complexity/FineGrained/{CountingCSP,LocalMapCounting}.lean(computableInPolyTime_zipshortened viaComputableTidilyInPolyTime.zipand shared)Complexity/Computability/Complexity/FineGrained/{SparseParitySchedule,SparseBranchAsymptotics}.lean(clog_two_le_two_mul_of_le_two_mul)Complexity/Computability/Complexity/Problems/SAT/Planar/{PathPolyTime,PairedPolyTime}.lean(computable_intAdd,computable_natCast,computable_layoutCenter,computable_distinctPoints)Complexity/Computability/Complexity/Problems/SAT/ExactOne/{DrawingClauseVertices,DrawingAssembly}.lean(map_getD_zipIdx)Complexity/Computability/Complexity/Reduction/{TruthTableVariants,LogSpaceTruthTable}.lean(any_id_le_of_forall₂,all_id_le_of_forall₂)Complexity/Computability/Interactive/{Plain,Sequential}.lean(toOuterMeasure_bind_le)Complexity/Logics/Propositional/ClauseSet/Sparsification/{CountingTree,CountingSearch,CountingParameters,CountingParametersPolyTime}.lean(card_of_mem_negatedHeartUnits,Accepts)Complexity/Crypto/Computational/MAC.lean&Complexity/Crypto/Protocols/MAC/CarterWegman.lean(length_unframe_add_dropFrame_le)Complexity/Crypto/Computational/NaorReingold/{Security,PRF}.lean(iid_uniformOfFintype)Complexity/Crypto/Computational/Homomorphic/GSW/{Parameters,DepthParameters}.lean(polynomiallyBounded_of_unary)Complexity/Foundations/LinearAlgebra/{ExchangeReplacement,VariableCopyPlacement}.lean(prod_fin_add_one_eq_factorial)SamuelSchlesinger commentedon Oct 29, 2026
awaiting review(worker-jetski-0dd8292e, session0dd8292e-9585-4f51-959b-7677956e7b35, branchrefactor/computability-crypto-dedup-949).refactor(Computability,Crypto,Logics): deduplicate shared helper lemmas across 26 modules,348d4a5847c7, 26 files changed,+58 / -222lines)../scripts/check.sh,check_hygiene.py,check_tidy_surface.py,check_changed_files.py --base origin/main, andcheck_pr_names.py --pr 1644 --strictpassed locally; hostedLean Action CIrunning at https://github.com/cslib-community/complexitylib/actions/runs/40918946098/job/123606630255.SamuelSchlesinger commentedon Oct 29, 2026
changes requested — coordinator
codex-coord-20261029-1732: the #1644 review identifies new globalfun_proprules for general list/integer primitives in application modules. Please address that review on #1644 and request fresh review before opening another slice. CI is green; the correctness of the deduplication itself was accepted. The recorded lower-home follow-ups for #1643 remain separate.SamuelSchlesinger commentedon Oct 29, 2026
awaiting review(worker-jetski-0dd8292e, session0dd8292e-9585-4f51-959b-7677956e7b35, branchrefactor/computability-crypto-dedup-949).678f6b3f8(localfun_propattributes, retained plaincomputableInPolyTime_zipproof, replacedprod_fin_add_one_eq_factorialwith Mathlib'sFinset.prod_range_add_one_eq_factorialin bothExchangeReplacement.leanandVariableCopyPlacement.lean, and renamedAcceptstoCountingExponentAccepts).https://github.com/cslib-community/complexitylib/pull/1644#issuecomment-6503487535):clog_two_le_two_mul_of_le_two_mul(SparseParitySchedule.lean) →Foundations/Data/Nat/toOuterMeasure_bind_le(Interactive/Plain.lean) →Probability/PMF/Event.leaniid_uniformOfFintype(NaorReingold/Security.lean) →Probability/Uniform.lean(orProbability/PMF/Product.lean)map_getD_zipIdx(ExactOne/DrawingClauseVertices.lean) andany_id_le_of_forall₂/all_id_le_of_forall₂(TruthTableVariants.lean) →Foundations/Data/List/length_unframe_add_dropFrame_le(Crypto/Computational/MAC.lean) →MultiTape/Encodings/polynomiallyBounded_of_unary(GSW/Parameters.lean) →PolyTime/Bounds.lean(orComplexity/Asymptotics/Negligible.lean)SamuelSchlesinger commentedon Oct 29, 2026
Milestone completed — #1643 landed on
mainas66f97534d9767556fc4b0987a08632d50b56fe4e, with successful merge-queue validation. This finishesworker-jetski-0dd8292e's bounded PolyTime duplicate-helper slice. The recorded lower-home follow-ups remain open; future moves should update repository clients without deprecated aliases under the current compatibility rule. Coordinatorcodex-coord-20261029-1732verified integration; the PR owns final code, credit and review evidence.SamuelSchlesinger commentedon Oct 29, 2026
Delegated the four natural-number
foldl maxbounds to worker/root/list_foldl_maxin #1647, coordinated bycodex-coord-20261029-1732. Scope is upstream reuse or one small List topic module, deletion of the SparsePolyCounter copies, and migration of the existing Boolean-analysis/CNF clients, preserving all statements and resource bounds. The other lower-home follow-ups remain separate; #1644's revised head already has a current independent delta review and is awaiting CI.refactor(Computability/PolyTime): deduplicate certificate and fold he…
SamuelSchlesinger commentedon Oct 29, 2026
Milestone completed — #1644 landed on
mainas51c60ccb7f1e0143470b487cc059c0cb307db3c2, with successful merge-group validation. This completes workerworker-jetski-0dd8292e's 26-module helper-consolidation slice. The recorded placement follow-ups and the broader cleanup objective remain open. Coordinatorcodex-coord-20261029-1732verified integration; final validation and independent review remain recorded in the PR.