`oxmpl` - sprint-001
Sprint 001 — Release 0.7.0 "Stability & Robustness"
- Dates: Tue 2026-09-22 → Mon 2026-09-28 (one week)
- Epic: E1 (TaskNotes epic task — tags #oxmpl, #oxmpl/epic)
- Goal: v0.7.0 released — the breaking refactors on main shipped alongside planner robustness, with the version flag flipped so release-please proposes 0.7.0 (per ADR-0001).
Commitment
The stories committed this sprint (live status in TaskNotes under tag #oxmpl/sprint/001):
- S1.1 — Flip
bump-minor-pre-major: true(size-S) - S1.2 — Sampling-error propagation in all planners + bindings (size-M)
- S1.3 — Timeout-only termination: rrt.rs iteration TODO resolved by decision (size-S)
- S1.4 — Library hygiene: remove
println!(size-S) - S1.5 — Release chores: publish 0.7.0 (size-M; blocked by S1.1–S1.4)
Suggested order: S1.1 → S1.3/S1.4 (quick wins) → S1.2 (the meat) → S1.5. One sprint = one release: the sprint ends when 0.7.0 is published and installable, or at the retro with the shortfall written down.
Progress log
-
2026-09-22 — Sprint planned and committed; epic E1 + stories S1.1–S1.5 created in TaskNotes (due 2026-09-28). Work not yet started.
-
2026-09-22 — S1.1 done —
bump-minor-pre-majorflipped in release-please config (commite52e10f). Release-please will propose 0.7.0, per ADR-0001. -
2026-09-22 — S1.4 done —
println!removed from library code vialogfacade (commitfefb1c3); fulljust test-allgate green. Two pre-existing test failures found during verification (py SO(3) deterministic fail, JS compound load-flake — both proven on clean base): root cause is wall-clock-budgeted PRM construction with FFI-bound checkers; fixed in-test via segment-fraction coarsening (commitd759ef2). Root-cause fixes filed as new epic E2 (S2.1 deterministic termination, S2.2 ×0.1 oversampling) for sprint-002. -
2026-09-22 — S1.3 done — iteration-limit TODO resolved by decision (timeout-only termination, no
max_iterationsknob); rationale comment inrrt.rs; new guard testtest_rrt_timesout_in_rvsspinsErrTimeout)on an unsolvable problem (commit1a2957a— first error-path assertion in the suite. -
Board after day 1: 3/5 done (S1.1, S1.3, S1.4). S1.2 (sampling-error propagation, size-M) is the only remaining blocker of S1.5. No time tracked on S1.2 yet.
-
2026-10-03 — Board reconciliation: TaskNotes records S1.2 as in-progress, with the sampling-error variant, propagation, and RRTConnect lazy goal seed checked off (commit
0be7702). The earlier day-1 summary is historical, not the current board. S1.2's recorded 2026-09-22 scope addition was missing here: seeded-RNG restoration across all four planners plus a determinism guard test was folded into the story because it touches the same functions; no story was swapped out. Remaining checks include sampling-failure tests, RNG restoration, PRM partial-roadmap cleanup, Python/JS error paths, and the full test/clippy gate. S1.5 remains gated on S1.2. The 2026-09-28 deadline passed five days ago; the release goal is not recorded as achieved. No active time sessions. Review/retro and carryover decisions remain pending owner confirmation. S2.1–S2.3 have sprint-002 tags, but no sprint-002 narrative page or dates exist. -
2026-10-04 — S1.2 RNG-retention subtask verified: Owner implemented short
get_or_insert_with()borrows in all four planners in theimprove-stabilty-robustnessworktree, replacing the take/restore design. Five public-boundary guards inoxmpl/tests/seeded_rng_tests.rscheck the advanced seeded stream across calls, including success, timeout, sampling errors, and RRTConnect goal-root failure/timeout. Corrected the ticket's earlier “solve twice, identical results” wording: continuity is required; successive paths need not match. The guards passed repeatedly and all failed against the original dropped-RNG implementation in an isolated checkout before simplifying test state to Rc/RefCell/Cell. Simplified guards, formatting, and core clippy were rechecked today; full core Rust tests/doctests passed during implementation. Marked only the RNG-retention acceptance criterion and task complete in TaskNotes. Changes remain uncommitted. No scope added or swapped; PRM partial-roadmap cleanup, original invalid-space/failure coverage, Python/JS error-path checks, and the fulljust test-allgate are still pending. S1.2 remains in-progress and continues to gate the release. -
2026-10-05 — S1.2 failure-path unit tests verified: Owner completed one module-local test in each planner (RRT, RRTStar, RRTConnect, PRM). Tests use a real unbounded space and assert
PlanningError::Sampling(UnboundedDimension); RRTConnect's goal sampler succeeds to allow goal-tree initialization before uniform sampling fails.cargo test -p oxmpl --lib test_failure_path: 4 passed, 0 failed, 0.00s test execution. Checked off the failure-path task and matching unsampleable-space acceptance criterion in TaskNotes. No scope added or swapped. Test changes remain uncommitted. PRM partial-roadmap cleanup, Python/JS error-path checks, and the full test matrix remain pending; S1.2 continues to gate S1.5. -
2026-10-05 — S1.2 PRM partial-roadmap cleanup verified: Owner added explicit sampling-error handling in
construct_roadmap(): clear the partial roadmap and return the converted error without resetting the RNG. The new module-local regression accepts one milestone before the next sample fails; it previously reported one retained milestone and now verifiesSampling(ZeroVolume)plus an empty roadmap. Both PRM unit tests pass in 0.00s; all five seeded-RNG continuity guards, formatting, core all-targets clippy-D warnings, and diff checks pass. Checked off only the existing PRM cleanup task in TaskNotes and documented the exception to the earlier bare-?design wording. Changes are staged, not committed. The fixture does not yet contain an explicit second construction call; retry no longer takes the nonempty-roadmap shortcut because failure clears the roadmap. No scope added or swapped. Python/JS error-path checks and the full test matrix remain pending; S1.2 continues to gate release chores. -
2026-10-05 — S1.2 bindings work broken into smaller steps: At the owner's request, expanded the existing bindings checklist into B1–B11 inside the TaskNotes story: Python build/import, four Python planner-error checks, JS/WASM build/load, four JS planner-error checks, and a conditional README error-behavior note. The senior-engineer hand-off's minimum is eight immediate-failure cases using unbounded RVSS, with successful goal-root sampling for RRTConnect. Preserve current Python exceptions and JS thrown strings; no new typed-error API or planner/state-space matrix. Optional goal-callback failure cases are not committed. The full matrix remains a separate final gate. No new task files, stories, sprint commitments, scope swaps, or status changes; this decomposes the remaining agreed work. Live checkbox state remains in TaskNotes.
-
2026-10-05 — S1.2 Python binding slice verified (B1–B5): Python extension was rebuilt successfully in
improve-stabilty-robustnessand imported from its Python 3.13 virtual environment, correcting the owner's initial build fromjunior-learning. Owner completed four focused tests inoxmpl-py/tests/test_sampling_errors.py: PRM construction plus RRT/RRTStar/RRTConnect solve surface the unbounded-space sampling failure as a normal Python exception. RRTConnect uses a successful fixed goal sampler before uniform sampling fails. All four cases pass together in 0.01s, including a fresh PM verification run. Checked off B1–B5 in TaskNotes; the new test file remains untracked/uncommitted. No production Python binding changes were needed. B6–B11, the combined bindings criterion/parent task, and the full matrix remain pending. No scope added or swapped; release dependencies remain unchanged. Next step: B6, rebuild/load JS/WASM from the same worktree. -
2026-10-05 — S1.2 JS binding slice verified (through B10): B6 was already checked in TaskNotes. The four language-boundary sampling-error tests passed against rebuilt WASM during senior-engineer verification and passed again in a fresh focused Vitest run (5ms test execution); ESLint and Prettier now pass. Checked off B7–B10 and the combined Python/JS error-surfacing acceptance criterion. B1–B10 are complete in TaskNotes; no production binding changes were needed. Both binding READMEs were inspected and lack planner-error guidance, so B11 remains open for the two short notes describing Python exceptions and JS thrown strings. The bindings parent checklist task stays open until B11 is complete. Full matrix remains pending; S1.2 continues to gate S1.5 and E1. Worktree was clean at verification. No scope added or swapped.
-
2026-10-05 — S1.2 B11 mdBook documentation complete: Owner corrected the documentation location from binding READMEs to the mdBook and approved short notes in
docs/src/python_api.mdanddocs/src/js_api.md. Existing included examples already demonstrate catching planner failures; the new API notes specify PythonException/message handling and JavaScript thrown-string handling for all planners' solve methods and PRM construction.just docsandgit diff --checkpass inimprove-stabilty-robustness. Checked off B11 and the bindings parent task in TaskNotes; B1–B11 are complete. No README duplication, new chapter, scope addition, or swap. S1.2 remains in-progress pending the full test matrix and final clippy gate; S1.5 and E1 remain gated. The two documentation edits are uncommitted. -
2026-10-05 — Binding error API improvement deferred: Owner wants robust binding errors but outside the current sprint, and requested replacing B11's current-behavior paragraphs with NOTE/TODO callouts in the two mdBook API references. Callouts cover structured Python planner exceptions and JavaScript proper error objects with distinguishable failure kinds; the hierarchy and mapping remain undecided. Parked the goal in the vault backlog with a reason and revisit condition (release planning after 0.7.0), without assigning a release or sprint.
just docsandgit diff --checkpass. Updated B11's TaskNotes deliverable; B11 and the bindings parent task remain complete, not a claim that typed errors exist. No implementation scope added or swapped; S1.2 still needs the full test matrix and final clippy gate. -
2026-10-05 — S1.2 final matrix verified: At the owner's request, rebuilt Python and ran
just test-allinimprove-stabilty-robustnessat clean HEAD04f8755; the JS recipe rebuilt WASM. All passed: Rust 91 checks (44 unit, 32 integration, 15 doc-tests), Python 34 tests, JS/WASM 30 tests across 26 files. Formatting, core all-targets clippy-D warnings, and diff checks pass; the final mdBook callouts were already build-verified. Checked off the final acceptance criterion/full-matrix task and closed S1.2 in TaskNotes. Verified that S1.5 is now unblocked; its complete dependency definition remains intact, including S1.2. E1 still awaits release chores. No scope added or swapped; structured binding errors remain parked outside this sprint. Release publication and post-release installation checks were not run. Sprint review/retro remains pending. -
2026-10-05 — Release preparation identified: Owner plans to merge
improve-stabilty-robustnessinto main, then repair/verify npm publishing because tokens have expired. Added explicit branch-merge/main-CI and npm-authentication preparation checklists to existing S1.5; neither is reported complete. Inspection found the branch's JS publish workflow requests OIDC permissions and invokesnpm publishwithout an npm token secret, so expired tokens may not be the relevant credential path; npm-side configuration and live authentication remain unverified. Confirm publishing readiness before triggering the release-please release. No new story or sprint scope swap; this clarifies existing release chores. No branch merge, secret change, or publish was performed by the assistant. TaskNotes now records S1.5 as in-progress; the release preparation items remain unchecked. -
2026-10-08 — S1.5 done, E1 done — v0.7.0 shipped (verified). Release commit
01ebfda; GitHub release v0.7.0 published 2026-10-08T01:44Z with changelog. Registries: crates.iooxmpl/oxmpl-py/oxmpl-js0.7.0; PyPIoxmpl-py0.7.0 (installs + imports); npmoxmpl-jslatest 0.7.0 (so npm auth, the 10-05 concern, worked). Release friction for the retro: the tag-triggered Rust CI & Publish run failed at theoxmpl-jscrate publish step (repository URL format inoxmpl-js/Cargo.toml); fixed on main inc558556, after whichoxmpl-js0.7.0 landed on crates.io at 01:58Z, apparently published by hand. Main is green (release-please, JS, docs); release-please has opened PR #32 proposing 0.7.1 for that fix commit (CI green). Sprint goal met, 10 days after the planned 09-28 end. All 5/5 committed stories done.
Review & retro
Written 2026-10-08. Sprint closed.
Review
- Goal met: v0.7.0 published 2026-10-08 — crates.io, PyPI, npm, GitHub release.
- Done: S1.1–S1.5 (5/5). Carried over: none. Dropped: none.
- Schedule: planned 7 days (09-22 → 09-28); closed 10-08 — 17 days (~2.4×).
Estimates
- Size-S stories (S1.1, S1.3, S1.4): accurate — all done on day 1.
- S1.2 (M): underestimated in calendar time — 14 days. Causes: OxMPL is a side project worked at the owner's convenience, not continuously (no activity 09-22 → 10-03); plus a day-1 scope addition (seeded-RNG retention across four planners) folded in without replanning.
- S1.5 (M): about right — 3 days. Friction: the
oxmpl-jscrate publish step failed (Cargo.toml repo URL), fixed inc558556and published by hand. Owner judges it a one-off: attention was on the npm pipeline, so the crates pipeline went unwatched. No action; revisit if a release fails again. - No time was tracked, so effort can't be separated from calendar time.
What went well
- Working through the design with the senior-engineer persona — it taught as well as solved (Cell/RefCell finally understood). Keep doing it.
- Quick wins went first; pre-existing test failures were parked as E2 instead of absorbed into the sprint.
Process change for sprint-002
Mid-sprint scope-change replanning. When work uncovers new scope, the PM classifies it in the same turn and recommends one of: fold in / new story / replan sitting / backlog. The owner decides. Rules: oxmpl - planning § Mid-sprint scope changes.
Planning input (not a second experiment): sprint-002's commitment is sized to realistic side-project availability, which the owner states at planning.