Release ph-curves v0.3.0 - #64
Conversation
… selector maps stay inspectable without interpolating or dropping description-only members. Co-authored-by: Cursor <cursoragent@cursor.com>
[gen] Add validated generic transfer families and explicit undefined gaps
… can supply truth without a plugin ABI. Co-authored-by: Cursor <cursoragent@cursor.com>
…on-boundary [gen] Expose a host-only transfer inspection and extension boundary
Host evaluation now uses u = count * scale / 1e6 from the integer product so inclusive applicability bounds and half-quantum ties are not lost to pre-rounding scale/1e6. Family members keep shared coefficients and required per-member scale; standalone definitions carry their own. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
[gen] Add scaled-polynomial models with exact scaled-input arithmetic
…ries Forward conversion classifies one declared code before ordinary below/above policy. Error returns RejectedObservation rather than AboveDomain; clamp returns the output at domain_max. Inverse conversion is unchanged. TOML keeps the user-facing saturation table; host IR and runtime use observation-guard names. The guarded code must sit strictly above the fitted domain and is not added to polynomial fitting. Metadata is an adjacent optional constant so TransferMetadata literals stay additive. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
Let-chains keep convert and family validation fail-closed without triggering collapsible_if under -D warnings. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
…rd-e8c5 Add an explicit observation-code guard independent of transfer boundaries
Replace accepted-but-inert member scale and model_input with a source capability matrix: formula and points use observation applicability, NTC uses physical range, and scaled_polynomial requires an explicit rational input_transform. Remove interpolate_selectors, rename description-only statuses, require reasons, and allow mixed curve and family documents while keeping dense LUT generation curve-only. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
…members-c97a [gen] Make transfer-family member semantics source-aware and effectful
Host callers can now audit every emitted transfer without parsing Rust. Optional family max_total_knots and max_table_bytes fail closed after per-member success. Existing String-returning generate helpers run the same pipeline so a budget cannot be bypassed. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
Source-backed families now require a citation (identity plus optional revision, locator, URL, and note). Members inherit it unless they override; host inspection and generated rustdoc keep citation, representation, and policy separately labeled. Runtime transfers do not retain citation strings. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
Families must declare a selector universe (Cartesian axes or an explicit non-Cartesian set). Every expected identity is occupied by exactly one member or a selector-addressed family-scoped gap, so an omitted combination is no longer indistinguishable from an intentional hole. Validated IR exposes the universe, family-scoped gaps, typed identities, and completeness. Global named gaps remain and do not satisfy occupancy. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
…eteness-002b [gen] Add selector-space completeness and family-scoped gaps
…ovenance-5965 [gen] Preserve structured source provenance separately from generation policy
…amily-budgets-d44f [gen] Return structured generation reports and family resource budgets
Expose units, shared source, resolved observation domain, and emitted stems on the validated family graph so callers do not need DefinitionsFile. Add FamilySpec construction with TOML-equivalent generation, optional member emitted_name, a pre-fit emission manifest, and family/selector rustdoc. Closes #41 and unblocks remaining #42 provenance parity. Co-authored-by: Steven Giacomelli <swgiacomelli@users.noreply.github.com>
…ed-identity-f102 [gen] Complete the family host IR and stabilize emitted member identity
…ial-review Address v0.3.0 adversarial release review
Adversarial review dispositionEvery item in the aggregate review now has an explicit ship-or-fix decision backed by reproduced behavior and regression evidence. The fixes landed through #65 and #66; refreshed release head Blockers
High
Medium
Aggregate evidenceThe exact #66 tree equals release merge tip
The original review's passed-contract list was also re-audited; no regression or new actionable finding remains. PR #64 intentionally remains open and unmerged for final release review. |
|
Second adversarial-review status, with evidence:
Do not merge #64 yet. First merge and validate #68 into |
…ial-review-2 fix: resolve remaining v0.3.0 adversarial review findings
|
Release evidence refreshed after #68 merged into
The PR body now records this evidence and the #67 diagnostic-span deferral. PR #64 remains open and unmerged. The remaining release-PR gate is a human approving review on |
|
Mechanical release safeguards are now active in addition to the evidence recorded above:
PR #64 now reports |
Clarify v0.3.0 value and restructure documentation
There was a problem hiding this comment.
Pull request overview
Promotes release/0.3.0 into main for the ph-curves v0.3.0 release, integrating the full runtime + generator feature set, updated compatibility/security/release-process documentation, and expanded CI/fixture coverage appropriate for a pre-1.0 minor release.
Changes:
- Bump crate version to
0.3.0, tighten MSRV-related dependency bounds, and update release/security/compatibility documentation and process gates. - Expand host-side generator capabilities (transfer families, reports, fail-closed schema markers) and add/refresh fixtures + acceptance tests (including no-std/core-only compile gates).
- Add/adjust runtime APIs and behavior (standalone
AffineTransform,u32temporal support, tickless deadline correctness, observation guards, 16-bit-pointer target hardening).
Reviewed changes
Copilot reviewed 58 out of 61 changed files in this pull request and generated 1 comment.
Show a summary per file
| File | Description |
|---|---|
| tests/support/family_oracle.rs | Adds an independent quadratic oracle used by family acceptance tests. |
| tests/post_conversion_pipelines.rs | Adds integration tests demonstrating explicit post-conversion pipelines and affine overflow boundaries. |
| tests/observation_guards.rs | Adds runtime tests validating observation-guard precedence and invariants. |
| tests/ntc_transfer.rs | Updates NTC fixture tests (including guard companion presence and calibrated setpoint example). |
| tests/generation_report.rs | Adds tests asserting generator report output matches emitted metadata/guards. |
| tests/fixtures/observation_guards_generated.rs | Adds generated fixture covering standalone + family observation guards. |
| tests/fixtures/ntc_generated.rs | Refreshes generated NTC fixture (including guard companion constant). |
| tests/fixtures/family_acceptance_generated.rs | Adds generated fixture for device-neutral transfer-family acceptance. |
| tests/family_acceptance.rs | Adds runtime acceptance tests for transfer families against an independent oracle. |
| src/tickless.rs | Fixes tickless deadline computation and termination behavior (incl. zero-duration handling). |
| src/tests.rs | Extends internal tests for tickless scheduling, quantization boundaries, and u16 inverse lerp edge cases. |
| src/stabilize.rs | Extends temporal primitives to u32, adds docs and tests, and adds Hysteresis<u32>::new. |
| src/round.rs | Updates crate-level rounding documentation to include AffineTransform and u32 temporal math. |
| src/math.rs | Hardens inv_lerp_u16 against out-of-span quantized targets; adds quantization boundary helpers for tests. |
| src/lib.rs | Exposes new APIs (AffineTransform, observation guards), adds docs/examples, and cfg-gates 65536 LUT aliases on 16-bit pointers. |
| src/gen/transfer/model.rs | Adds scaled-polynomial model support and supporting helpers for family expansion and evaluation. |
| src/gen/transfer/adaptive.rs | Makes measure_error available within the crate for broader generator/report usage. |
| src/gen/rustdoc.rs | Introduces Markdown/rustdoc-safe escaping utilities for generated documentation. |
| src/gen/mod.rs | Expands gen module exports (IR/report types) and documents generator/IR/report scope. |
| src/gen/api.rs | Adds report-producing generation APIs and makes curve LUT option validation conditional on [curves] presence. |
| src/curve.rs | Documents LUT invariants, adds explicit panic messages for undersized LUT lookups, and cfg-gates 65536 aliases on 16-bit pointers. |
| src/bin/gen/main.rs | Converts generator CLI to clean error returns with proper exit codes; adds CLI tests. |
| src/affine.rs | Adds the standalone invertible i32 AffineTransform runtime API with tests. |
| SECURITY.md | Updates supported-version policy to “newest published minor line only”, keyed to actual publication. |
| scripts/local-ci.ps1 | Aligns local CI with stricter warning policy, packaging checks, MSRV probe, and fixture/core-only example builds. |
| RELEASING.md | Documents release-branch PR integration requirements, MSRV downstream validation, packaging requirements, and publish steps. |
| examples/no_std_generated_fixtures.rs | Adds a no_std example compiled across no-std/core-only target matrix to guard against std/alloc/float creep. |
| docs/README.md | Adds documentation index and authority guidance; clarifies packaging boundaries. |
| docs/guides/tickless-scheduling.md | Adds tickless scheduling guide covering rollover model and quantization/repeat semantics. |
| docs/guides/README.md | Adds user-guide index routing to topic guides. |
| docs/guides/physical-transfer-generation.md | Adds guide for transfer generation, boundary/guard semantics, and schema markers. |
| docs/guides/measurement-pipelines.md | Adds guide for composing affine + temporal primitives into caller-owned pipelines. |
| docs/guides/curve-generation.md | Adds guide for curve generation and notes 16-bit-pointer constraints for full-domain u16 LUTs. |
| docs/design/transfer-families.md | Adds design record for transfer families, selector universes, gaps, provenance, and budgets. |
| docs/design/README.md | Adds design-record index and reading guidance. |
| docs/design/host-transfer-ir.md | Adds design record for host IR layers, inspection/extension APIs, and overlays. |
| docs/design/gen-build-api.md | Updates generator build-API design record for 0.3.0 report/IR surface and options behavior. |
| docs/design/decision-primitives.md | Updates design record to reflect u32 support in temporal sample usage. |
| docs/design/affine-calibration.md | Updates design record to reflect AffineTransform integration and clarified affine offset semantics. |
| docs/compatibility.md | Adds 0.3.0 compatibility/migration policy and detailed schema/target/MSRV boundary records. |
| CONTRIBUTING.md | Updates contribution guidance to include release-branch integration rules. |
| Cargo.toml | Bumps version to 0.3.0, constrains fixed for Rust 1.92 MSRV, and registers new feature-gated tests/example. |
| Cargo.lock | Updates lockfile package version to 0.3.0. |
| assets/observation-guards.toml | Adds generator input fixture for observation-guard lowering. |
| assets/family-acceptance.toml | Adds device-neutral transfer-family acceptance fixture with provenance, gaps, budgets, and guards. |
| assets/curves-u16.toml | Adds resolution-neutral u16 curve definitions for documentation/examples. |
| AGENTS.md | Updates repository agent guidance to reflect new invariants and fixture regeneration paths. |
| .github/workflows/ci.yml | Extends CI with MSP430 core-only builds, downstream MSRV probe, packaging checks, std-link invariants, and fixture example builds. |
| .github/ISSUE_TEMPLATE/bug_report.yml | Updates issue template version placeholder and supported target list (incl. MSP430). |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Make generated rustdoc angle brackets HTML-safe
Make review policy honest for solo maintenance
Freeze the rustdoc fix into 0.3.0
|
I reviewed the aggregate ph-curves 0.3.0 release diff at e05794c. I reviewed and dispositioned the automated and adversarial findings, confirmed all review conversations are resolved, and reviewed the exact-head CI, embedded-target, packaging, dry-run publication, compatibility, and release-checklist evidence. I accept the remaining ordinary release risk and will address discovered defects through patch releases where appropriate. I authorize this release PR to be merged into main; tagging and publication remain separate post-merge actions. |
Release
Promote the
release/0.3.0branch tomainas ph-curves 0.3.0. This pull request is the mandatory aggregate release-integration gate; the branch will not be integrated directly.This pull request is intentionally non-draft but remains open and unmerged pending the sole-maintainer current-head attestation. The aggregate review is complete, required checks are green, and every review conversation is resolved.
Current gate: the final release head is
e05794c. All 20 leaf jobs plus aggregateciare green and all 16 review conversations are resolved. During the repository's single-maintainer phase, branch protection honestly requires zero approvals because GitHub does not permit the author to approve their own pull request. Before merge, the maintainer must record the current-head attestation required byRELEASING.md. Do not merge this pull request before that attestation.Highlights
i32AffineTransformand shared checked affine arithmetic (Add a standalone invertible i32 AffineTransform #60)u32temporal primitives plus 16-bit-pointer target hardening and an MSP430 core-only gate (Implement TemporalSample for u32 across temporal primitives #59, Harden the runtime for 16-bit pointer targets #61)u16inverse interpolation, terminalOnceemission, and zero-durationRepeat/PingPongtermination (Fix tickless deadlines, Once terminal value, and zero-duration spin #65)u16assets, and embedded runtime smoke coverage (fix: resolve remaining v0.3.0 adversarial review findings #68)Unreleasedsection (Freeze the rustdoc fix into 0.3.0 #72)Compatibility and migration
This is the required pre-1.0 minor release rather than a patch release:
TransferErrormust handle the newRejectedObservationvariant<NAME>_OBSERVATION_GUARD; colliding transfer names must be renamed[transfer_families]declarestransfer_families_v1, causing released 0.2.1 readers to reject the document instead of silently emitting header-only outputSee
CHANGELOG.mdanddocs/compatibility.mdfor the complete contract and migration details. Key-level source spans for errors raised by the custom transfer/family TOML deserializers are a diagnostic-usability enhancement tracked in #67; current parsing remains fail-closed and reports the exact semantic path.Release validation
The exact release-branch head
e05794c7398acf0feef10d1e328b6bcf7cb28d98(treee1f24d8b66cc224a60b1681e6b9a3b39c5c3dd8e) was validated with:cipassing on that exact headfixed1.30.0cargo deny --all-features checkcargo packageandcargo publish --dry-runfrom a clean detached worktreecargo package --listreporting 55 files, including the full-u16source asset and all three generated fixtures, with repository-only CI, scripts, and design documents excludedWindows Application Control blocked one generated CLI test executable hash during the monolithic
scripts/local-ci.ps1run (os error 4551). The same three CLI tests passed when built and invoked directly,Unblock-Fileconfirmed the restriction was host policy rather than a test assertion, and every remaining command from the script passed independently. Post-0.3.0 issue #73 tracks a staged/resumable local-CI design; this host-policy interruption does not weaken the exact-head GitHub matrix or the independently completed local commands.The manifest and lockfile both resolve to 0.3.0.
Unreleasedis empty, the changelog is frozen for 2026-08-17 UTC, the security transition is publication-triggered, and nov0.3.0tag currently exists. Refresh the changelog date before merge if the actual publication date changes.Publication sequence
Merging this pull request only integrates the release into
main. After it merges and the resultingmainCI is green, the owner will create and push the annotatedv0.3.0tag, publish the crate, create the GitHub release, and perform post-publish verification. No tag or publication is part of this pull request.Closes #23