1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
|
# MiniRoute Roadmap
Status: **v0.1.0 released** (2026-08-29) · next: **v0.2.0 hardening**
Issue tracking: beads — the epics below are live in the database (`bd ready`,
`bd show <id>`). Full issue IDs carry a `miniroute-` prefix (e.g. `miniroute-uhs`).
## Version policy
- **0.x era** — the contract is still settling. Breaking changes are allowed
at minor bumps (`0.2`, `0.3`); patches (`0.1.1`) are for fixes within a
minor. Every behavior change lands in `CHANGELOG.md`.
- **1.0** — API freeze. From `v1.0.0` on: strict SemVer (major = breaking,
minor = feature, patch = fix). The freeze review is `miniroute-18h.1`.
## v0.1.0 — Initial kernel [released]
Attribute routes, deterministic matching (literal beats `{param}` regardless
of registration order), onion middleware pipeline, resolver seam, thin HTTP
contracts. Closed via epic `miniroute-c5e` (children 1–6; 7–8 completed the
release ceremony: tag + cgit publish).
## v0.2.0 — Hardening (epic `miniroute-uhs`)
Fix the failure modes confirmed by the stress test; each fix flips a baseline
in `tests/Regression/KnownIssuesTest.php` from "v0.1.0 behavior" to desired:
| Bead | Fix | Current (v0.1.0) behavior |
|---|---|---|
| `uhs.1` | Validate param names (unique, `[A-Za-z_][A-Za-z0-9_]*`) at registration → `RouteRegistrationException` | Duplicate params = dead route + preg warning; malformed `{a-b}` degrades to literal |
| `uhs.2` | 405 detection: path-only fallback → `MethodNotAllowedException` with `allowed()`; app renders 405 + `Allow` | Wrong method = plain 404 |
| `uhs.3` | HEAD → GET mapping (matcher); app's response layer suppresses body | HEAD = 404 |
| `uhs.4` | Fail loud: route attribute on non-public method → `RouteRegistrationException` | Non-public methods silently skipped |
| `uhs.5` | Lazy single sort in `Router` (dirty flag, sort at first dispatch) | `usort` per add: 600 routes ≈ 770ms registration |
| `uhs.6` | Memoize compiled patterns in `RouteMatcher` | Regex recompiled per route per match |
Gate: `composer check` green with baselines flipped; bench shows registration
cost collapse at 600 routes. Middleware singleton-state rule is a *usage
contract*, documented in v0.3.0 ADRs (`k4i.3`), not a kernel change.
## v0.3.0 — API completeness (epic `miniroute-k4i`)
- `k4i.1` — `RequestInterface::input()` / `query()` so real middleware (CSRF)
reads form/query data through the contract instead of `$_GET` or narrowing.
- `k4i.2` — `match(): ?ResponseInterface` (or richer result) so fall-through
composition doesn't need try/catch.
- `k4i.3` — ADRs: middleware ordering contract (group/class/method onion),
singleton-middleware state rule, exception hygiene (sessions closed in
`finally`), and the rejected decision on `{id:\d+}` param constraints
(controllers already validate; don't add scope).
## v0.4.0 — parsonwebsite integration (epic `miniroute-g3j`)
- `g3j.1` — Port `RequireAdmin` / `RequireCSRF` / `AdminSession` onto
`MiddlewareInterface` (the per-route closures become `/admin` groups).
- `g3j.2` — App `Request`/`Response` implement the interfaces directly
(drop `ToyRequest`/`ToyResponse`; add `Response::status()`).
- `g3j.3` — Full route table behind the existing flag; old router as fallback
until green, then cut over.
Gate: the realistic stress section passes against the real controllers.
## v1.0.0 — Release (epic `miniroute-18h`)
- `18h.1` — API freeze review of the public surface (attributes, interfaces,
exceptions, `Router` methods).
- `18h.2` — Dogfood via Composer: parsonwebsite consumes the package from the
published VCS remote.
- `18h.3` — CI benchmark gates: full-table registration < 5ms, dispatch
< 0.1ms, full suite green.
- `18h.4` — Tag `v1.0.0`, publish, strict-SemVer policy from here.
## Cross-cutting infrastructure
- Test suite epic `miniroute-4dh` — regression/integration coverage:
realistic route table (`4dh.1`), known-issue baselines (`4dh.2`), router
boundary cases (`4dh.3`), benchmark script (`4dh.4`).
- `miniroute-ouq` — changelog + roadmap + agent docs (this file,
`CHANGELOG.md`, `AGENTS.md`/`CLAUDE.md`).
- `miniroute-br6` — configure a beads Dolt remote for issue sync/backup.
|