`oxmpl` - sprint-002
Sprint 002 — Release 0.8.0 "Toolchain refresh"
- Dates: Thu 2026-10-08 → Wed 2026-10-28 (three weeks)
- Epic: E3 (TaskNotes epic task — tags #oxmpl, #oxmpl/epic)
- Goal: v0.8.0 published on crates.io, PyPI and npm — every dependency and tool current, all resulting breakages resolved, publishing tokenless on all three registries.
- Owner availability (stated at planning): 1–3 sessions over the first two weeks.
Commitment
The stories committed this sprint (live status in TaskNotes under tag #oxmpl/sprint/002):
- S3.1 — Rust core: edition 2024, rand 0.10, getrandom 0.4 (size-M)
- S3.2 — Python bindings: PyO3 0.29, maturin 1.15, Python 3.11+ (size-M; after S3.1)
- S3.3 — JS bindings and tooling: wasm-pack 0.15, vitest 5, eslint 10 (size-M; after S3.1)
- S3.4 — CI and publishing: current actions, Trusted Publishing, Dependabot (size-M; after S3.1–S3.3)
- S3.5 — Dev environment and docs refresh (size-S; after S3.4)
- S3.6 — Release 0.8.0 (size-S; after all)
Order: S3.1 → S3.2 / S3.3 (either order) → S3.4 → S3.5 → S3.6. One sprint = one release.
Owner-only prerequisites (before S3.6): register trusted publishers on pypi.org (oxmpl-py) and crates.io (oxmpl, oxmpl-py, oxmpl-js) for the exact workflow files and job names.
Capacity risk (flagged at planning)
The commitment is 4×M + 2×S against 1–3 stated sessions in the first two weeks. Sprint-001 ran 2.4× its plan with 2×M. The owner chose all of E3 over three weeks. Checkpoint Wed 2026-10-21: if S3.1–S3.3 are not done by then, the PM will put up one replan sitting (per oxmpl - planning § Mid-sprint scope changes). The likely cut is S3.4–S3.6 into sprint-003, with the goal reduced to "all three bindings green on current dependencies".
Progress log
-
2026-10-08 — Sprint planned and committed. Epics E3 (0.8.0, this sprint) and E4 (0.9.0, S4.1–S4.10, uncommitted) created from the senior-engineer grilling; release line re-planned to 0.8.0 Toolchain → 0.9.0 Validation → 0.10.0 Path Quality. E2 superseded: S2.1 → S4.1, S2.2 → S4.3/S4.4, S2.3 → backlog; all cancelled, sprint-002 tags removed. Gates wired: S3.1 is the only unblocked story; E4 is blocked on E3. Release-please PR #32 (0.7.1) is folded into 0.8.0. Work not yet started.
-
2026-10-08 — Release 0.9.0 scaffolded on owner request: provisional pages sprint-003 → sprint-006 (S4.1–S4.10, target ~2027-01-20; uncommitted, no sprint tags). E4 scheduled 2026-10-29 → due 2027-01-20 with a TaskNotes reminder on 2026-10-28 to run this sprint's retro and plan sprint-003.
-
2026-10-08 — Provisional pages sprint-003 → sprint-006 expanded into a full regeneration spec (owner request): each holds the TaskNotes frontmatter,
blockedBygates and fulldetails(intent, decisions, acceptance criteria, tasks with file/line pointers, risks) for its E4 stories; sprint-003 also holds the E4 epic spec and the full gate table. Live tickets S4.1–S4.10 and E4 synced to the same bodies. -
2026-10-09 — Board reconciliation: TaskNotes has S3.1 and E3 as in-progress (set 2026-10-09 05:51). This corrects the 10-08 "work not yet started" entry. No S3.1 checklist items are ticked yet, and no commits have landed on the branch since planning. S3.2–S3.6 are open and gated. No time is tracked.
-
2026-10-09 — S3.1 done (commit
a79e10fontoolchain-refresh,build(deps)!). All 5 acceptance criteria were verified on the staged snapshot: Rust 91/91 (seeded-RNG 5/5), Python 34/34, JS 30/30, clippy and fmt clean, WASM build OK. Two items were folded in under the scope-change rule as same-code and small: theRngWrapperadaptor and the no-op.cargo/config.tomlwere both deleted. The story took one day against its M size. Gates now open: S3.2 and S3.3 are unblocked (either order). Carried to S3.6: the release notes must state the MSRV raise to 1.85, which the commit footer omits. Environment note: the shell's staleVIRTUAL_ENV(deleted~/Documents/casual/oxmpl/.venv) breaks barecargofor oxmpl-py; re-enter the worktree via direnv. -
2026-10-09 — S3.2 started (owner moved it to in-progress). The S3.1 gate is satisfied and S3.3 stays open, unblocked. Pending owner decision: a senior-engineer suggestion to fold in reverting the
cargo fix --editionif let→matchrewrites in the two oxmpl-pycompound_state*.rsfiles. It is the same code S3.2 touches, so it is small and behaviour-neutral. -
2026-10-09 —
if letrevert declined (owner): thecargo fixmatchrewrites stay. -
2026-10-09 — S3.2 done (commit
2946808, pushed toorigin/toolchain-refresh). The gate was re-run on HEAD after thegil_usedchange:just build-pyinstalls,just test-py34/34 on pytest 9, clippy and fmt clean, Rust 91/91. Folded in under the scope-change rule as same-file and small: theextension-modulefeature was removed (the release wheel still does not link libpython),#[pymodule(gil_used = true)]keeps 0.7 GIL behaviour, and 3.11–3.13 classifiers were added. Same-day close, again against an M size. Notes:- The S3.2 footer reads
BREAKING:, notBREAKING CHANGE:. The subject's!still marks it breaking for release-please. It is pushed, so it is left as-is unless the owner amends. - S3.1's commit was rewritten before push:
a79e10fbecame08dadb6, and the S3.1 ticket is corrected. - A trial
pypi.ymlregeneration was done early (senior engineer, at the owner's request) and recorded in S3.4's details, including two acceptance criteria that drifted. No S3.4 work is committed.
S3.4 now waits only on S3.3.
- The S3.2 footer reads
Review & retro
At sprint end: done / carried over / dropped, what was over- or underestimated, and at most one process change for the next sprint.