v0.8.0 remediation execution plan
- Status: Completed
- Finalized: 2026-08-17
- Target release: v0.8.0
- Umbrella issue: #35
- Final qualification: #33
- Audit contract: v0.8.0 historical audit and remediation record
- Final execution state: R1–R9 complete and accepted; post-R9
COPYINGdistribution correction complete and accepted
Source snapshot audited: e4cef21b66d0e22661307a3fc7e246e71611517a
Companion audit and issue contracts: v0.8.0 historical audit and remediation record
Plan date: 2026-07-28
Status: completed historical execution plan
This document supersedes pyvoro2-v0.8-remediation-batches.md and its
first-pass addendum as the canonical execution plan used during remediation.
The older documents and the preserved instructions below remain audit history.
The companion issue backlog contains the final evidence, full paste-ready issue
bodies, and acceptance criteria.
Final status amendment
R1–R9 were completed and independently accepted. The post-R9 correction that
makes wheel and sdist distributions carry and verify the mandatory COPYING
payload was also completed and accepted. One exact final source commit is
independently reviewed and frozen; issue #33 qualifies that exact commit and
its artifacts before the public tag is created. Any tracked correction changes
the candidate hash and requires renewed review and qualification, and no source
edit is expected after #33. v0.8.0 uses the project Git tag, GitHub Release, and
PyPI distribution process and intentionally creates no new pyvoro2 Zenodo
software-version record; existing historical records remain valid.
The plan is designed for the following workflow:
- the maintainer reviews and approves scientific/API decisions;
- a Chat/Codex Extra High reasoning session turns one approved issue into an exact implementation prompt;
- Codex Extra High implements that one issue on the current branch;
- the resulting patch is reviewed against the issue contract before merging.
The issue text is intentionally precise about observable outcomes and stop conditions, while leaving ordinary internal implementation details to Codex.
The accepted R9 baseline includes ADR 0017. The final handoff is the exact source commit accepted after finalization and independent review; issue #33 qualifies that frozen commit rather than any earlier remediation baseline.
1. Executive plan
Use one umbrella tracker with nine child issues, R1–R9, followed by the separate final qualification and release issue #33. Work linearly unless a specific parallel branch is worth the added review cost.
R1 objective contract
↓
R2 certified scalar proximal solver
↓
R3 strict inputs, immutable values, native preconditions
↓
R4 certified periodic image geometry
↓
R5 non-optional generator and duplicate safety
↓
R6 observation/result/report identity
↓
R7 atomic active-set final state
↓
R8 severity-complete diagnostics
↓
post-remediation polish audit
↓
R9 public API/docs/distribution synchronization
↓
#33 clean release qualification
The strict dependency graph is slightly less linear:
R1 ──> R2
R1,R2 ──> R3 (recommended sequencing to avoid option churn)
R3 ──> R4 ──> R5
R3,R4 ──> R6
R1,R2,R6 ──> R7
R3,R5 ──> R8
R1–R8 ──> R9 ──> close #35 ──> #33
For a single maintainer, the recommended linear order is safer than exploiting possible parallelism. It keeps every later prompt based on the current merged source and avoids resolving the same conflict in several branches.
2. Why the work is represented as nine remediation issues plus #33
The plan deliberately avoids both extremes: one unreviewable mega-issue and a large collection of tiny validation tickets.
Issues that must remain separate
- R1 and R2: R2’s algorithm is defined by R1’s formulas. Combining them would let implementation choices silently determine the objective contract.
- R3 and R4: strict input/native safety is broad but mechanical; certified closest-lattice-vector geometry is a distinct numerical algorithm requiring independent oracles.
- R4 and R5: R5 consumes R4’s minimum-image primitive, but duplicate and containment policy is a separate public safety contract.
- R6 and R7: observation/row identity must exist before an active-set state can prove that all of its layers share one origin.
- R8: diagnostic severity and strictness are externally visible and should not be hidden inside forward-safety implementation.
- R9 and #33: documentation/distribution source must be corrected before a clean release run can qualify it. Issue #33 starts only after umbrella #35 is closed; it is evidence, not a place to decide API policy.
Work intentionally grouped
- R3 groups exact-type validation, finite checks, immutable ownership, and native preconditions because they are manifestations of one invariant: invalid or mutable public values must not reach numerical/native code. Because the patch is broad, R3 may use two sequential PRs/prompts under one GitHub issue.
- R9 groups naming, current documentation, licensing, and release-note synchronization because all depend on the final corrected behavior and are cheapest to audit together.
This structure is stable under step-by-step execution. Earlier issues may remove individual examples from later scopes, but they should not change the purpose or acceptance contract of a later issue.
3. GitHub organization
3.1 Umbrella tracker
Create one umbrella issue, for example:
Complete v0.8.0 pre-release correctness and safety remediation
Current checklist:
- [x] R1 — Correct and freeze the separator inverse objective contract
- [x] R2 — Replace the scalar proximal loop with a certified bounded solver
- [x] R3 — Harden public inputs, immutable value objects, and native preconditions
- [x] R4 — Implement certified periodic nearest-image and minimum-image geometry
- [x] R5 — Make forward generator containment and duplicate safety non-optional
- [x] R6 — Bind observations, fits, realizations, and reports to canonical source data
- [x] R7 — Make the active-set final state atomic and self-consistent
- [x] R8 — Make diagnostics and strict validation severity-complete
- [ ] R9 — Synchronize the public API, documentation, distribution, and release contract
The umbrella issue records status only. Do not duplicate every child issue’s technical contract in comments. After all nine items are complete, close #35; only then begin final qualification under issue #33.
3.2 Child issues and pull requests
Normally use one issue and one focused PR per R-number.
Exception:
- R3 may have R3-A and R3-B PRs under the same issue:
- R3-A: validators and native precondition guards;
- R3-B: adoption and immutable ownership.
The first PR must not close R3. The issue closes only after both parts and the full regression matrix pass.
3.3 Suggested branch names
fix/v080-r1-objective-contract
fix/v080-r2-certified-prox
fix/v080-r3a-native-preconditions
fix/v080-r3b-input-ownership
fix/v080-r4-periodic-images
fix/v080-r5-generator-safety
fix/v080-r6-observation-identity
fix/v080-r7-active-final-state
fix/v080-r8-diagnostic-semantics
fix/v080-r9-public-release-contract
release/v080-qualification
Create each branch from the latest merged dev, not from the original audited
snapshot.
4. Working rules for every issue
Every implementation issue must require:
- Reproduce before fixing. Add or preserve a failing regression probe where practical.
- Use an independent oracle. Backend agreement is not sufficient for mathematical code. Use analytic solutions, direct objective recomputation, finite differences, KKT/stationarity checks, exhaustive bounded lattice enumeration, or subprocess exit behavior as appropriate.
- Freeze policy first. Public formulas, defaults, severity, schemas, and identity rules belong in the approved issue/prompt, not in Codex’s improvisation.
- Make the smallest coherent change. Do not pull later issues into the current PR merely because a nearby file is open.
- Test in layers. Run the new focused tests first, then the relevant subsystem, then the full deterministic suite. Run fuzz/property tests when geometry, input parsing, or topology changes.
- Update current documentation with behavior. Add
[Unreleased]changelog entries for user-visible corrections. Do not make final release claims before #33. - Report evidence. Codex must list changed files, commands, results, compatibility implications, and remaining uncertainty.
- No release actions. Implementation prompts must forbid merging, tagging, publishing, or GitHub release actions.
- Stop rather than invent. If implementation needs a public decision not present in the issue, Codex must stop and request it.
5. Preparing the working checkout
5.1 Local review materials
The audit and remediation plan are source-controlled under docs/development/.
Place only bulky or environment-specific probe output outside version control or under
a locally excluded local-review/ directory:
local-review/
├── pyvoro2-v0.8-audit-probes.txt
├── pyvoro2-final-review-new-probes.log
├── pyvoro2-final-review-init-mem-cases.log
├── pyvoro2-final-review-triclinic-random-audit.log
└── native-donor/ # optional; never a release input
Prefer .git/info/exclude for this local directory. Do not add donor binaries
or private review artifacts to the public package accidentally.
5.2 Source authority
For every new issue/PR:
- current source and tests define implemented behavior;
- current guides/reference define documented public behavior;
- accepted ADRs and the active v0.8 plan define durable policy;
- the approved child issue defines the remediation outcome;
- the audit files provide evidence, not independent API authority.
The original e4cef21 zip is evidence for the initial defect only. After R1,
all implementation and review must use the latest branch/commit.
6. Chat-to-Codex workflow for each issue
Step 1 — Open a design/review Chat
Give the Chat/Codex Extra High reasoning model:
- the current repository or current branch;
- the one child issue body;
- only the relevant audit probe/output;
- the relevant accepted ADR/API inventory sections;
- the manuscript section only when mathematical semantics require it.
Do not attach every historical planning file to every issue. Extra unrelated context makes it easier to follow obsolete decisions.
Ask the reasoning model to:
- reproduce and explain the finding;
- identify maintainer-level decisions;
- recommend an exact contract;
- analyze compatibility and issue boundaries;
- stop before code editing.
Step 2 — Approve the contract
Discuss the recommendations until the issue contains concrete decisions. For R1, R2, R4, R5, R6, and R8, this step is mandatory.
Record durable decisions in one or more of:
- the GitHub issue;
- an ADR when the decision extends beyond this bug;
- the API inventory;
- a short issue-scoped decision section.
Do not rely on private chat history as the only authority.
Step 3 — Generate the Codex Extra High implementation prompt
Ask the reasoning model to produce one paste-ready prompt for Codex Extra High. The prompt must include:
- current issue and exact approved contract;
- in-scope and out-of-scope files/behavior;
- regression oracles;
- stop conditions;
- required commands and handoff report.
Review the prompt before running it. In particular, remove any instruction to “fix all related issues” or make opportunistic API improvements.
Step 4 — Run Codex Extra High
Run Codex in the current issue branch. It may inspect the whole repository but must implement only the current issue.
Step 5 — Independent post-implementation review
Provide the updated source/commit and the approved issue contract to a fresh review session. Ask it to:
- inspect every changed file;
- reproduce the original defect;
- verify the independent oracle;
- search for scope creep and new defects;
- run targeted and full tests;
- return a merge/no-merge verdict.
A green Codex self-summary is not the review.
Step 6 — Merge and update the ledger
After review passes:
- merge into
dev; - close or update the child issue;
- check the umbrella item;
- add issue/PR/test references to the draft R9 release-note ledger;
- start the next branch from the new
dev.
7. Generic design-Chat prompt
Use this template for issues with unresolved policy:
We are preparing pyvoro2 v0.8 remediation issue [R-ID — TITLE].
Read, in this order:
1. AGENTS.md and the active v0.8 plan/ADR.
2. The complete [R-ID] issue body in
docs/development/audits/v0.8-pre-release.md.
3. The relevant source and tests listed below.
4. Only the audit probe(s) named below.
5. [Optional] the specified manuscript section.
Relevant source/tests:
[PASTE ISSUE-SPECIFIC PATHS]
Relevant audit evidence:
[PASTE FILENAMES OR THE SMALL REPRODUCTION]
Do not edit files, create branches, or perform GitHub actions.
First:
- verify the finding against the current branch rather than assuming the old
snapshot still behaves identically;
- explain the defect and its user/scientific impact;
- identify every maintainer-level formula, default, schema, severity, or
compatibility decision;
- recommend one exact contract and alternatives;
- determine whether the current issue boundary remains coherent;
- list independent regression oracles and likely affected public docs.
Present decisions for maintainer review. Do not generate an implementation
prompt until I approve the complete contract.
After approval, produce:
1. the final issue-scoped decision record;
2. one paste-ready Codex Extra High implementation prompt;
3. a post-implementation review checklist.
8. Generic Codex Extra High implementation prompt
Implement only pyvoro2 v0.8 remediation issue [R-ID — TITLE] on the current
branch.
Read:
- AGENTS.md;
- docs/development/plans/v0.8.md;
- relevant accepted ADRs and API-inventory sections;
- the approved [R-ID] issue contract below.
Approved contract:
[PASTE THE FINAL DECISIONS, NOT A CHAT SUMMARY]
In scope:
[PASTE THE ISSUE SCOPE]
Out of scope:
[PASTE THE ISSUE NON-GOALS]
Required independent regression oracles:
[PASTE THE ISSUE ORACLES]
Requirements:
1. Reproduce the current defect before or while adding the regression test.
2. Do not treat agreement between existing backends as the sole oracle.
3. Make the smallest coherent implementation change.
4. Preserve unrelated public API and numerical behavior.
5. Add current documentation and an Unreleased changelog entry for
user-visible behavior.
6. Run focused tests, relevant subsystem tests, then the full deterministic
suite; run fuzz/property or subprocess tests where required.
7. Follow generated-file rules from AGENTS.md.
8. Stop and report if implementation requires a public decision not contained
in this contract, a new mandatory dependency, a vendored Voro++ change, or
an unexplained numerical change.
9. Do not merge, tag, publish, or perform GitHub actions.
At handoff report:
- defect reproduction;
- implementation summary;
- files changed;
- tests/oracles added;
- exact commands and results;
- public compatibility/migration effect;
- remaining uncertainty or follow-up.
9. Generic post-Codex review prompt
Review the current pyvoro2 branch after implementation of [R-ID — TITLE].
Do not modify files.
Use the approved [R-ID] issue and decision record as the contract. Read AGENTS.md,
the active v0.8 plan, the relevant ADR/API inventory sections, and the original
focused audit evidence.
Please:
1. inspect every changed file and the complete diff;
2. reproduce the original defect on the corrected branch;
3. verify every independent regression oracle rather than trusting backend
agreement or Codex’s report;
4. check public API, docs, changelog, generated files, and compatibility;
5. look for scope creep, duplicated validation, stale state, unsafe native
paths, and newly introduced edge cases;
6. run focused, subsystem, full deterministic, and required fuzz/subprocess
tests;
7. list findings by severity;
8. return a clear MERGE or DO NOT MERGE verdict with required follow-up.
10. Issue-specific execution cards
R1 execution card — objective contract
Approved child issue: #36
Accepted decisions:
- ADR 0007 — separator objective and universal quadratic certification
- ADR 0008 — separator solver and linear-backend selection
Context for the design Chat
Read:
src/pyvoro2/inverse/separator/model.py;src/pyvoro2/inverse/separator/problem.py;src/pyvoro2/inverse/separator/solver.py;- objective/result fields in
types.pyandreport.py; - current inverse theory/guide pages;
- objective-related tests;
- manuscript Sections 4.1–4.3 only.
Provide the ADMM parity and reciprocal finite-difference excerpts from
pyvoro2-v0.8-audit-probes.txt.
Approved decisions copied into the implementation prompt
- squared mismatch and the Huber quadratic branch are
0.5 * residual**2; - L2 is
0.5 * strength * ||weights - reference||**2, retaining the normal systemL_obs + strength * I; - reciprocal penalties use the finite convex tangent continuation in ADR 0007;
- zero-strength penalties are exact no-ops for evaluation, coupling, backend selection, and operator availability;
- hard bounds use the shared float64 absolute-plus-relative policy and expose
hard_max_tolerance; - successful statuses require finite reported soft objectives, and supported analytic warm-start failure falls back safely; and
- weighted mismatch/L2 evaluation preserves finite binary64 results and checks exact zero terms before forming dangerous intermediates;
- quadratic rows are constructed directly as
rho = confidence * alpha**2andq = confidence * alpha * (target - beta), without reconstructingqfromrho * z_obs; - the measurement-space hard accepted interval is mapped into Bellman–Ford difference bounds without reapplying measurement tolerance in different units;
- reciprocal values and derivatives use separate scale-safe evaluation, and hard-constrained ADMM success requires final hard-row satisfaction;
- residual and ADMM convergence summaries use stable norm and RMS reductions; and
- the corrections have no legacy scaling mode or public tolerance option.
- all quadratic paths certify the final public binary64 weights through one backend-independent exact-zero or forward objective-gap contract;
- bounded exact helpers may generate a rounded candidate, but they do not
introduce an objective over the binary64 lattice or an output-resolution
floor: an unrepresentable continuous zero optimum may therefore return
numerical_failure; - private exact-helper thresholds may affect recovery, never the meaning of
optimal; - completed ADMM iterations remain visible in
n_iterwhen post-iteration final certification fails; - final active-set alignment is permitted only on a true zero-L2 gauge and only when exact binary64-input arithmetic proves that every fitted difference is unchanged;
- the public API separates
solver='direct'|'admm'fromlinear_backend='dense'|'sparse'and defaults to direct+dense; auto,analytic, and the solver valuesparseare removed without compatibility shims;- explicit ADMM actually executes ADMM whenever a component solve is required, and dense paths never import or switch to SciPy;
- sparse direct and sparse ADMM explicitly require SciPy; and
- results and reports record solver method and linear backend separately.
Expected implementation output
- coherent scalar objective implementation;
- scale-safe objective, quadratic-row, affine-prediction, and reduction helpers;
- corrected ADMM coefficients and hard-success termination;
- derivative, extreme-scale, accepted-set, and backend parity oracles;
- exact formula documentation;
- inspectable ADMM iteration metadata on certification failure;
- certified active-set final-state packaging that cannot change a positive-L2 objective or a binary64 component contrast;
- no proximal-algorithm replacement or ADMM-default tuning yet.
Merge gate
Do not merge if any backend/report still evaluates a differently scaled objective, if finite-difference tests avoid branch neighborhoods, if a private size threshold weakens success certification, if ADMM loses completed iteration metadata on final certification failure, if active-set final alignment changes a certified objective or fitted difference, or if dense calls silently acquire SciPy. The 16/17, 256/257, and 512/513 regressions are explicit merge gates.
R2 execution card — certified proximal solver
Context
Use the approved R1 formulas, solver.py, scalar penalty evaluation code, and
the two source-controlled reproductions plus independently generated coverage.
Do not reopen R1 unless a contradiction is found.
Decisions
- complete-expression arithmetic and one compiled objective kernel;
- rigorous one-sided derivative enclosures, exact point signs, and adjacent numeric-binary64 bracketing;
- twofold balls with derived physical and base-two-scaled outward bounds;
- certified
ln(2)range reduction and bounded-polynomial exponential work; - direct branch-partitioned endpoint differences and bounded ambiguity fallback;
- vectorized heterogeneous ordinary rows, scalar routing for unresolved rows, and structured failure mapping.
Expected implementation output
- directly testable bounded scalar solver;
- safeguarded sign-bracket convergence with no tolerance-based point success;
- shared public/private/report objective semantics;
- independent scalar, ball-primitive, exponential, forwarding, generated- audit, and performance oracle tests;
- end-to-end ADMM status/objective checks.
Merge gate
No exhaustion path may return the last iterate as success. Every point success must prove the exact KKT signs, and every ordinary non-point success must end in an adjacent numeric-binary64 sign bracket. Private/public objective paths must agree on complete source expressions, terminal candidates must be selected by direct differences, and the frozen identical and heterogeneous 1/10/100/1000-row performance gates must pass with zero fallbacks on the canonical benchmark. Compensated centers, vector proposals, and unproved heuristic radii have no sign authority.
Implementation status
Issue #37 implements the corrected contract in ADR 0009 after two review rounds found split exponential objectives, cancellation-driven false point success, fixed high-precision transcendental work on the ADMM hot path, and then an invalid double-double enclosure that admitted a false bracket and wrong terminal endpoint. The revised implementation carries derived twofold-ball bounds through the scalar and heterogeneous batch paths and routes unresolved rows to the bounded scalar fallback. A subsequent remediation review tightened the batch boundary: reciprocal rows are excluded before array arithmetic, caller NumPy exception policy cannot change results, and exceptional lanes cannot suppress certificates for ordinary neighbors. Scalar and batch success now retain common derivative, direct-difference, selection, localization, and fallback-provenance evidence. The independent audit checks containment and endpoint decisions for all generated cases, and benchmark routing is measured at the actual batch/scalar entry points. The public solver/backend surface and ADMM decomposition remain unchanged. Maintainer review and the plan-wide release gates remain pending.
R3 execution card — validation, ownership, native safety
Part A prompt
Focus on:
- new small validators;
cpp/bindings.cppandcpp/bindings2d.cppprecondition guards;init_mem, blocks, finite native arrays/parameters;- subprocess tests.
Use pyvoro2-final-review-init-mem-cases.log and the vendored 2D allocation
logic as evidence.
Part B prompt
Focus on:
- IDs, shifts, options, masks, tolerances;
- models and retained arrays;
- all domain classes and
from_points; - immutable canonical ownership;
- periodic flags, remapping, handedness, resource guard.
Decisions
- accepted exact Boolean/NumPy scalar types;
- left-handed-cell policy;
- block/resource limit policy;
- zero-allowed tolerance matrix.
Expected output
- one coherent validation module or small set of responsibility-specific helpers;
- no lossy conversion before validation;
- safe direct native calls;
- mutation and invalid-input matrices.
Merge gate
R3-A may merge independently, but R3 does not close until R3-B passes. After R3-A changes C++, the old native donor is no longer compatible.
Current implementation status (2026-08-09): R3-A and R3-B are complete.
The integrated R3 review and regression gate were accepted. The completed
reviewed R3 baseline is
555228cbf8f2179391a981ab59f005edb9e300b4; R4 starts from that baseline.
R4 execution card — certified periodic images
Context
Read:
src/pyvoro2/_internal/spatial/domain_geometry.py;- planar geometry adapter;
inverse/separator/constraints.py;- duplicate modules;
- periodic-cell transforms and tests.
Provide both the concrete wrong-image example and the randomized audit log.
Decisions
- exact/certified algorithm;
image_searchlifecycle/meaning;- deterministic ties;
- ill-conditioned-cell behavior;
- explicit-shift authority.
Expected output
- one internal minimum-image primitive;
- exact/certified triclinic behavior;
- exhaustive randomized oracle tests;
- use by inverse resolution and by duplicate distances when current periodic wrapping is enabled, while preserving the unwrapped Cartesian check when it is disabled.
Merge gate
Increasing the default cube size is not acceptable. Any uncertified result must fail explicitly rather than warn and continue.
Current implementation status (2026-08-09): issue #40 replaces the bounded
cube with the exact dyadic/proof-box contract recorded in ADR 0012. Separator
inference and evaluated periodic duplicate-pair distances share the primitive
when wrapping is enabled (wrap=True, or duplicate_wrap=True in forward
operations); disabling wrapping preserves the established unwrapped Cartesian
check. Explicit shifts and the R5 candidate-scanner and mandatory-safety
boundary independent of duplicate_wrap are preserved. The dedicated
independent mathematical/numerical review was approved. The final reviewed R4
baseline is 64324efbba9ba0b77194f7aab78bf51f415e6d7a; R5 starts from this
state.
R5 execution card — generator safety
Context
Read both forward APIs, duplicate modules, domain adapters, inverse realization and active-set entry points, and the native insertion behavior. Provide the outside-site, exact-duplicate, periodic-process-exit, and threshold-bypass reproductions.
Decisions
- mandatory native-safety floor;
- semantics of
off,warn,raise,threshold, andwrap; - half-open containment convention;
- error type and message fields.
Expected output
- centralized generator preparation;
- safety independent of optional policy;
- all forward/inverse entry points covered;
- subprocess non-termination regression tests;
- current documentation updates.
Merge gate
No combination of public duplicate options may reproduce a Voro++ process exit. Every generator omitted by the native half-open rule must instead be rejected before native insertion.
R6 execution card — source identity and reports
Context
Read:
constraints.py,solver.py,realize.py,types.py,report.py;- observation/result/report API-contract tests;
- API inventory and result lifecycle docs.
Provide geometry-reuse, malformed-constructor, and unrelated-record probes.
Decisions
- constructor/factory policy;
- geometry and row identity/equivalence;
- report schema/provenance;
- serialized discriminator naming.
Expected output
- canonical immutable observation data;
- one equivalence/origin check used everywhere;
- report schema tests and JSON round trips;
- no shape-only association.
Merge gate
Equivalent copies must work under the approved policy, while unrelated same-shape data must fail. Codex may not invent schema fields.
R7 execution card — active final state
Implementation issue: #43
Decision: ADR 0015
Context
Use the merged R6 identity contract. Read active.py, active result types,
report builders, and path/termination tests.
Expected output
- one internal accepted-final-state structure;
- explicit handling of every final-refit status;
- no stale realization/records;
- optional weights-dependent layers and strict-JSON null report semantics;
- characterization tests for cycle/max/failure outcomes.
Merge gate
For every test result, mask, observations, weights, realization, records, and termination must be traceable to one final state.
R8 execution card — diagnostics
Implementation issue: #44
Decision: ADR 0016
Context
Read spatial and planar diagnostics/validation/normalization modules and public
tessellation_check paths. Provide missing-ID, malformed-measure, non-finite
normalization-tolerance, stale-flag, and planar warning-only reproductions.
Decision
Approve the exact relationship among issue severity, mode invariants, overall
ok, and strict validation.
Expected output
- centralized severity-complete
ok; - expected-ID rules by mode;
- explicit malformed/non-finite issues;
- reset annotations;
- cross-dimensional warning semantics.
The approved mode matrix treats absent standard IDs as errors, absent power IDs as informational hidden/empty sites, and absent IDs with undeclared mode as warnings. Required reciprocity findings are errors; optional inspection remains informational or warning-level. Strict and public compute wrappers consume the completed diagnostic rather than rebuilding a partial policy.
Merge gate
No error-level issue may coexist with ok=True, and warning-only findings may
not fail unless explicitly promoted by the approved policy.
R9 execution card — public/distribution contract
Implementation issue: #45
Start with a short polish audit
After R1–R8 merge, run a bounded static review of:
- docs, README source, examples, notebooks, generated pages;
- API inventory, changelog, ADRs, active plan, release notes;
powerfit/PowerFitoccurrences;- package metadata, notice/license packaging, distribution checks;
- current workflows and release scripts.
The polish audit may add small R9 checklist items. It must not silently reopen approved mathematical or API contracts.
Frozen decisions
PowerFitBounds,PowerFitPredictions,PowerFitObjectiveBreakdown, andSelfConsistentPowerFitResultremain current advanced public names;- report schema
pyvoro2.inverse.separator.report, version 1, and all three retained report kinds remain unchanged; - weight-first locate/ghost parity is a candidate v0.9 stabilization workstream, not v0.8 implementation;
- ADR 0017 fixes v0.9 functional stabilization, the stable 1.0 core, v1.1 prescribed measures, and v1.2 mixed fitting;
- one-repository/one-distribution through 1.0 and a formal no-persistent- functional-Voro++-fork rule remain open pre-1.0 decisions.
Expected output
- synchronized current documentation;
- full legacy-vocabulary classification;
- actual Voro++ license in distributions and enforced checks;
- pending release notes with issue/PR/test ledger;
- roadmap-visible later candidates without prematurely freezing their issue grouping.
Merge gate
No final qualification claim is allowed yet. All generated files must be synchronized and every retained legacy term intentional.
Issue #33 execution card — final qualification
Historical execution card — superseded. The operative v0.8 handoff is defined by the final status amendment: all tracked source changes precede the frozen candidate, and issue #33 qualifies the exact post-finalization commit accepted after independent review. v0.8.0 creates no new Zenodo software-version record. The card below is preserved as development history.
Context
Begin only after all R1–R9 children have independent acceptance and umbrella issue #35 is closed. Reconcile issue #33's older named-deferral wording with ADR 0017 before work starts. Use only the exact clean accepted R9 commit and current release scripts/workflows. Do not use donor binaries.
Expected output
- any final tooling/workflow patch needed for complete installed-wheel tests, sanitizer coverage, licensing, or provenance;
- one complete 21-distribution qualification run;
- machine-readable manifest and human release checklist;
- final release notes updated only after evidence exists.
Merge/release gate
A failed platform, missing artifact, missing license, donor contamination, untraceable build, or absent regression oracle blocks the release. Do not rebuild artifacts after qualification without rerunning the complete gate.
11. Regression ledger
Maintain a small table in the umbrella issue or release qualification record as work merges:
| Contract | Owning issue | Suggested test area | Required oracle |
|---|---|---|---|
| ADMM/L2 objective parity | R1 | tests/inverse/separator/ |
analytic objective and backend parity |
| Scalar penalty derivatives | R1 | inverse separator tests | finite differences |
| Certified scalar prox | R2 | inverse separator tests | independent bounded scalar minimizer/KKT |
init_mem/native preconditions |
R3 | forward spatial/planar subprocess tests | process survives with Python exception |
| Exact IDs/shifts/options | R3 | forward common + inverse tests | strict type matrix |
| Immutable domains/models | R3 | domain/model tests | caller-mutation tests |
| Triclinic nearest image | R4 | inverse periodic tests | exhaustive bounded lattice oracle |
| Periodic minimum distance | R4 | duplicate tests | exhaustive/analytic oracle |
| Non-periodic containment | R5 | forward 2D/3D tests | half-open boundary cases |
| Mandatory duplicate safety | R5 | subprocess forward tests | no native exit under any public mode |
| Geometry/row identity | R6 | inverse result tests | mismatch/equivalent-copy matrix |
| Report schema/provenance | R6 | report/API-contract tests | exact JSON schema/round trip |
| Atomic active final state | R7 | active tests | state-origin invariants |
| Severity-complete diagnostics | R8 | planar/spatial diagnostic tests | explicit error/warning matrix |
| Distribution license/content | R9/#33 | tooling/installed-wheel tests | archive member inspection |
| Artifact provenance | #33 | release tooling | exact manifest/hash checks |
Do not mark a row complete because a general test happens to pass. Point to the specific regression test and the independent oracle.
12. Native donor rules during remediation
The existing CPython 3.13 manylinux donor may accelerate Python-only work, but its validity is tied to the old native interface and implementation.
| Issue | Donor use |
|---|---|
| R1 | Allowed if no native file/interface changes |
| R2 | Allowed if no native file/interface changes |
| R3-A | Not allowed after C++ changes begin; compile fresh native modules |
| R3-B | Use the fresh R3-A native build, or create a new documented donor from that exact native contract |
| R4–R9 | Use fresh native modules compatible with the latest merged source; do not assume the original donor remains valid |
| #33 | Donor use forbidden; build all native artifacts from the clean candidate commit |
After any change to cpp/, CMake, native signatures, returned native records,
or the Python/native precondition contract, regenerate the donor if continued
fast testing is needed. Record its native-source commit/fingerprint and never
place it in release directories.
13. Replanning and stop conditions
Pause the current Codex task and return to maintainer/design review when:
- a finding no longer reproduces after an earlier issue;
- implementation would change a public signature, default, serialized field, or documented numerical result beyond the approved contract;
- a new mandatory dependency appears necessary;
- a vendored Voro++ modification appears necessary;
- an independent oracle disagrees with both old and proposed implementations;
- a paper/reproducibility benchmark changes unexpectedly;
- a supposedly local issue requires reopening a merged issue’s scientific decision;
- sanitizer output reveals a separate native defect;
- issue scope becomes too broad for one reviewable PR.
The correct response is not to “finish anyway.” Update the issue, create a small dependent issue if necessary, and regenerate the exact Codex prompt.
14. Timing of the small-issue audit
Do not spend another broad audit cycle on spelling, presentation, and optional performance before R1–R8. Those corrections will change the relevant APIs and documentation, making early polish inefficient.
After R8:
- run repository-wide static searches and documentation/link checks;
- inspect packaging metadata and generated artifacts;
- classify remaining naming and wording inconsistencies;
- add only release-relevant small fixes to R9;
- preserve release-relevant deferrals in the roadmap or existing issues without freezing future issue grouping prematurely.
This is the intended place to catch minor issues without diluting the critical remediation.
15. Final release sequence
Historical sequence — superseded. The numbered sequence below records the original remediation plan. The operative release sequence is defined by the final status amendment.
After R9 merges:
- confirm all nine R1–R9 children are complete and close umbrella issue #35;
- begin separate final qualification issue #33;
- create the clean release-candidate commit;
- run local/source qualification and sanitizer jobs;
- run the complete CI source matrix;
- build and test all 20 wheels plus the sdist;
- validate installed packages, licensing, metadata, report schema, and removed surfaces;
- generate the provenance manifest and artifact hashes;
- complete the release-note issue/PR/test ledger;
- review the evidence manually;
- tag the exact qualified commit;
- publish the already-qualified artifacts to PyPI/GitHub and archive the same release on Zenodo.
Do not rebuild after tagging or publication unless the complete artifact gate is rerun and a new release candidate is created.
16. Definition of done
The remediation is complete when:
- R1–R9 are merged with independent review;
- the regression ledger is complete;
- all release-relevant deferrals are documented, with exact future issue grouping allowed to remain for later planning under ADR 0017;
-
33 passes from one clean exact commit after #35 is closed;
- every artifact is traceable and includes required third-party licensing;
- release notes describe evidence rather than plans;
- no donor binary participates in the release build;
- the released package cannot reproduce any confirmed P0/P1 safety or correctness defect from the final audit.