Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions SPEC.md
Original file line number Diff line number Diff line change
Expand Up @@ -4959,6 +4959,7 @@ Active development with stable core, continuous tool expansion, and web API in p

| Date | Version | Changes |
| ---- | ------- | ------- |
| 2026-08-17 | 1.17.18 | docs(rate-of-closure): bring `src/rate_of_closure/AGENT_HANDOFF.md` back under the `CLAUDE.md` handoff policy. The file had grown to 2,205 lines across 140 dated entries — the same append-only drift the root handoff already recorded and corrected for itself at 2,708 lines. Those entries move verbatim to `docs/agent_handoff_archive/2026-08_rate_of_closure_handoff_log.md`, matching the existing root-log archive convention, and the live document is rewritten as 103 lines of current state: what the tool is, where the PyQt6 and React surfaces and the `swing_sim` physics packages live, why PR #4466 cannot be merged by any strategy (measured — `-X theirs` gives 47 failures and 40 errors, `-X ours` gives 19 collection errors), the four files where the source branch is *older* than `main` and would silently revert shipped work, what remains of #4466 by area, and the local-environment traps that cost real debugging time (mypy 1.13 crashing on Python 3.13 for multi-file sets, the two-tier `tools_core` capability, and PowerShell rewrites normalising `SPEC.md` to CRLF). No source or test behaviour changes. |
| 2026-08-16 | 1.17.15 | feat(swing-sim, rate-of-closure, #4103): land the `swing_sim.flight` slice of `consolidated/rate-closure-remainder-2026-08-13` with its React counterpart, so the Python and TypeScript sides of the ball-flight contract move together. Adds 21 `swing_sim/flight/**` modules (capability observation/evaluator, ground transfer and bounce execution, regional ground pipeline, surface simulation, spin-axis convention, cancellation) plus `spinAxisConvention.ts`, `capabilityFlightEvaluator.ts`, and the `capability_flight_evaluator_parity_v1` fixture. Unifies the spin-axis tilt convention on fade/right-positive: `spin_axis_tilt` becomes `positive_right` with `atan2(-omega_y,omega_z)` in both `result_catalog_data.py` and `ballFlightMetricContract.ts`, `deliveryDiagnostics` now reuses the shared `spinAxisTiltDeg` helper instead of an inlined formula, and `ball_flight_metrics_golden_v1.json` is regenerated for the new sign. Repairs a ground-crossing defect in `web/src/model/flight.ts`: the interpolation guard tested only the next point's height, so a descending launch — which starts at height 0 and is skipped on the first step by `t > dt` — interpolated from an already-below-ground point, producing a negative fraction and a trajectory time before zero. The metric contract then rejected it, surfacing a descending launch as a `RangeError` instead of the nonconverged result it is. The guard now also requires the previous point to be above ground. `tests/test_wind.py` deliberately keeps `main`'s 1e-9 parity tolerance; the source branch still carries the 1e-12 value that fails on Linux (see #4513). Verified: 1,163 `swing_sim` tests and 1,095 React tests pass, `tsc --noEmit` and `eslint` are clean. |
| 2026-08-16 | 1.17.14 | fix(ci, tests): enforce the two-tier Python floor instead of letting the 3.10 lane run code that requires 3.11. The root distribution declares `requires-python = ">=3.11"` while ten sub-packages and Rust crates declare `>=3.10` and ship 3.10 wheels, so the 3.10 matrix lane is intentional — but it was running the whole suite, including root-package code. That produced failures that looked like defects and were not: a bare `tomllib` import aborting collection, and an `asyncio.wait_for` timeout in the p1am e-stop shutdown test whose cancellation semantics changed in 3.11. `conftest.py` now reads each package's own `requires-python` (regex-parsed, since `tomllib` is unavailable on the interpreter the guard must run on) and skips collection of anything above the running interpreter; it is a strict no-op on 3.11+, verified by identical collection counts. `CLAUDE.md` previously advertised a flat “Python 3.10+” that the root distribution rejects and now states the real two-tier contract. New `tests/test_python_version_contract.py` locks `requires-python`, the mypy target, the classifiers, the CI matrix, and `CLAUDE.md` together so the declarations cannot drift apart silently again. The `ci-standard` matrix drops to `["3.11", "3.12"]`: that job runs the root-package suite (`core_tests` is entirely `tests/**` and `src/shared/python/**`), so a 3.10 lane there collected nothing once the floor guard was correct. The ten sub-packages declaring >=3.10 are gated on 3.10 by their own maturin build + parity workflows, which is verified by a new contract test. |
| 2026-08-16 | 1.17.13 | feat(swing-sim, #4103): land the `swing_sim.ground` skid/roll/bounce module as a self-contained slice of `consolidated/rate-closure-remainder-2026-08-13` against current `main`, rather than merging that branch wholesale. Adds 92 `swing_sim/ground/**` files, `swing_sim/canonical_numeric_json.py`, and the 10 shared Python/TypeScript ground golden fixtures under `src/rate_of_closure/web/src/model/__fixtures__/`. Ground's three other dependencies (`flight/result_metrics`, `solver/spatial_targets`, `solver/target_serialization`) were already byte-identical on `main`, so the module needed no other source changes. Repairs six tests that fail on the source branch itself: four `test_skid_roll_passivity` cases never passed `SurfaceRun`'s `active_surface` argument (added with regional-surface support) and raised `TypeError` before asserting any passivity property; `test_bounce_cancellation_is_typed_and_retains_request_identity` hardcoded a termination time and elapsed span that violate `RepeatedBounceResult`'s chronology invariants; and `ground/__init__.py` eagerly imported `to_ground_model_result`, leaking the explicitly unqualified compatibility adapter into the package namespace despite its exclusion from both `__all__` and the lazy-import map. 321 ground tests pass. |
Expand Down
Loading
Loading