You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit a129a27
Browse filesBrowse the repository at this point in the historyBrowse files
Copy file name to clipboardExpand all lines: docs/ROADMAP.md
+3-162Lines changed: 3 additions & 162 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# Roadmap: plann
2
2
3
-
**This document is a draft** - it was generated by Claude Opus 5.0. As of 2026-08-25 significant parts of it has been reviewed and edited by Tobias Brox. In any case, **an estimate is an estimate** - the only way to know for sure how much time a task will take is to actually do it.
3
+
**This document is a draft** - it was generated by Claude Opus 5.0. Parts of it has still not been through human scrutiny. In any case, **an estimate is an estimate** - the only way to know for sure how much time a task will take is to actually do it.
4
4
5
5
## Funding
6
6
@@ -35,9 +35,7 @@ task list, the code references and the acceptance criteria, and is kept current
35
35
the work proceeds.
36
36
37
37
This document holds what an issue tracker is bad at: the shape of the whole, why the
38
-
hours are distributed the way they are, what depends on what, what gets released
39
-
when, and what is deliberately *not* funded. Where this document and an issue
40
-
disagree on a detail, the issue wins.
38
+
hours are distributed the way they are, what depends on what, and what is deliberately *not* funded. Where this document and an issue disagree on a detail, the issue wins.
41
39
42
40
Every item has a status: `[x]` done, `[ ] wip` partly done (the text around the
43
41
table says what is left), `[ ]` not started. The hours are the estimates as made
@@ -110,7 +108,7 @@ config file.
110
108
111
109
| Status | Item | Deliverable | h | € | Issue |
112
110
|---|---|---|---|---|---|
113
-
|[] wip| 1.0 Release v1.2.0 | The `[Unreleased]` work finished, [PR #43](https://github.com/pycalendar/plann/pull/43) landed, changelog closed, released to PyPI | 10 | 500 ||
111
+
|[x]| 1.0 Release v1.2.0 | The `[Unreleased]` work finished, [PR #43](https://github.com/pycalendar/plann/pull/43) landed, changelog closed, released to PyPI | 10 | 500 ||
114
112
|[]| 1.1 CalDAV server compatibility | Fixes, or a documented verdict that the fault is `caldav`'s or the server's, with issues filed there | 8 → **4**| 200 |[#25](https://github.com/pycalendar/plann/issues/25), [#26](https://github.com/pycalendar/plann/issues/26)|
115
113
|[]| 1.2 Multi-calendar mass-edit | Mass-editing that is correct across calendars, or refuses to run when it cannot be | 4 → **3**| 150 |[#48](https://github.com/pycalendar/plann/issues/48)|
116
114
|[] wip | 1.3 Improving the configuration helper logic |`interactive update-config` resolved one way or the other (it was dropped in v1.2.0 rather than implemented), a `plann configure` without its "here be dragons" warning, and documented non-plaintext credential options | 4 → **3**| 150 |[#49](https://github.com/pycalendar/plann/issues/49)|
@@ -252,28 +250,6 @@ duck.
252
250
253
251
---
254
252
255
-
## Release plan
256
-
257
-
| Release | Contents | After |
258
-
|---|---|---|
259
-
| 1.2.0 | Code-review fixes, the config-delegation refactor, community patches - the baseline everything else is measured against | 1.0 |
The 2.0 number is reserved for the `calendaring-client` migration because that is
267
-
where a backward-incompatible change is most likely - and because
268
-
[`CHANGELOG.md`](../CHANGELOG.md) commits to "not breaking backward compatibility
269
-
unless I really have to (and then under a 2.0-release)".
270
-
271
-
Note what the reordering costs: the migration now gates every release after 1.3.0.
272
-
If Phase 3 slips (see Risks), Phases 2 and 5 still ship - as 1.4.0 - but time
273
-
tracking and reporting do not ship at all.
274
-
275
-
---
276
-
277
253
## Effort summary
278
254
279
255
Per-item hours are in the phase tables above.
@@ -287,141 +263,6 @@ Per-item hours are in the phase tables above.
287
263
| 5 - Documentation | 42 | 2100 | 29% |
288
264
|**Total**|**144**|**7200**||
289
265
290
-
### Changes from the original five-bucket plan
291
-
292
-
The original plan was 156 hours (7800 EUR). It is now **144 hours (7200 EUR)**: 600
293
-
EUR was moved to the `calendaring-client` grant to fund the library work that 1.3 and
294
-
4.1 shed. The total across the two grants is unchanged.
295
-
296
-
| Original bucket | Was | Now | Why |
297
-
|---|---|---|---|
298
-
| Bug fixes and downstream improvements | 12 | 20 | Two open user-reported server-compatibility bugs, an unmerged community PR, a multi-calendar data-integrity bug found during this review, and the configuration/credentials path - which is where a new user meets plann and where an advertised command raises `NotImplementedError`. The v1.2.0 release is now charged here too, at 10 hours, which is why the four bug-fixing items are funded at 10 against a 20-hour estimate |
299
-
| QA | 48 | 48 | Unchanged in the end, and still the largest bucket by a wide margin: coverage is 50%, there are no type annotations at all, and two of the 88 TODO comments turned out to be unreported bugs. It was briefly raised to 54 before 300 EUR - six hours - moved to the sibling grant |
300
-
| Migration to calendaring-client | 16 | 16 | Unchanged in size, but moved ahead of the time-tracking work, which now depends on it. The library-side APIs that plann became a consumer of are funded in the `calendaring-client` grant rather than here. It buys a partial port and a design critique, not a completed migration |
301
-
| Milestone reporting | 32 | 18 | The iCalendar representation of "time spent" is library work, not plann's. And the report itself is an export format over an aggregated task list rather than a feature of its own - once the aggregation groups a selection into budget lines and totals each one, the rendering is a template |
302
-
| Documentation | 48 | 42 | Six hours moved to Phase 1. Documentation is still the second-largest block |
303
-
304
-
---
305
-
306
-
## Risks
307
-
308
-
### Phase 3 depends on a sibling project that does not exist yet - and now Phase 4 does too
309
-
310
-
`calendaring-client` currently consists of a README and a roadmap. No code has
311
-
been written. Its own funded scope is 248 hours and its CalDAV backend lands at
312
-
roughly hour 100 of that plan.
313
-
314
-
This is the largest scheduling risk in this roadmap. The two projects' estimates
315
-
for the same work also disagree: `calendaring-client`'s roadmap budgets 6 hours for
316
-
its side of the port while estimating the full migration at 24-40 hours in its
317
-
"beyond the funded scope" table.
318
-
319
-
That disagreement is an artefact of the two plans having been written months apart,
320
-
not a structural problem. **Neither roadmap is final, and `calendaring-client` has
321
-
not started, so it can still be reprojected** - including moving hours from this
322
-
grant to that one where the work turns out to belong there. See the scope note
323
-
below.
324
-
325
-
**This risk grew when time tracking was made to depend on the migration.** The
326
-
migration was originally last and load-bearing for nothing; it is now a prerequisite
327
-
for all 18 hours of Phase 4. That puts **34 hours - 24% of the grant** behind an
328
-
external project that has not yet written a line of code, and it removes the release
329
-
valve: dropping the migration now drops time tracking and milestone reporting with
330
-
it.
331
-
332
-
**Mitigation:** Phase 3 is scheduled as early as its dependency allows, and Phases 1,
333
-
2 and 5 (110 hours, 76%) are deliberately independent of it, so the grant keeps
334
-
delivering while it is blocked. Its own deliverable stays defined as *evidence and a
335
-
critique* rather than a finished port, so partial delivery is still delivery.
336
-
337
-
**Contingency, to be decided rather than discovered:** if `calendaring-client` is not
338
-
usable once Phases 1 and 2 are done, Phase 4 is implemented against the `caldav`
339
-
library as it stands and ported afterwards. That costs rework, but 4.1's core
340
-
question - how to represent time spent in iCalendar - is a data-model decision rather
341
-
than a backend one, and the chosen storage format survives the port even when the
342
-
plumbing does not. The alternative, waiting, risks the grant ending with neither the
343
-
migration nor the feature it now blocks.
344
-
345
-
### Work shed upstream needs a home in the upstream budget
346
-
347
-
Two items here concluded that logic belongs in the library rather than in plann:
348
-
1.3 (configuration and credentials) and 4.1 (the iCalendar representation of time
349
-
spent). That is the right call on the merits - see guiding constraint 2 - but it
350
-
moves work rather than removing it, and the receiving budget has to actually have
351
-
room for it.
352
-
353
-
-**Configuration and credentials is already funded upstream.**
354
-
`calendaring-client`'s item 1.4 (8 hours) covers config format, discovery, and
355
-
"credential handling: keyring integration, and never requiring secrets in
356
-
plaintext config". Nothing needs to move; the scope just needs confirming.
357
-
-**Time-tracking storage is not.** Only the *research* is funded, inside
358
-
`calendaring-client`'s item 0.1, whose task-model survey covers "time estimate and
359
-
time spent". There is no implementation line for a time-tracking API, and 4.1
360
-
depends on one existing.
361
-
362
-
**Resolved:**`calendaring-client` has been reprojected, with an explicit
363
-
"Time-tracking model and API" item (12 h), funded by moving 600 EUR from this grant.
364
-
plann's scope drops from 156 to 144 hours accordingly, and the total across the two
365
-
grants is unchanged. The work is the same work; which grant pays for it was an
366
-
accounting question rather than a technical one.
367
-
368
-
The failure mode this avoids is both roadmaps assuming the other is paying - which is
369
-
how 4.1 would have ended up blocked on an API nobody had budgeted to write.
370
-
371
-
### Milestone reporting has an audience of one
372
-
373
-
Phase 4.3 is 9% of the funded period spent on a feature whose most obvious user is
374
-
the author, producing reports for this very grant.
375
-
376
-
**Mitigation:** the aggregation layer (3.2) is generic and useful on its own, and
377
-
the NLnet layout is a template on top of it rather than hard-coded logic. Anyone
378
-
who bills by the hour gets the same feature. If it turns out otherwise, the item
379
-
is at least self-evaluating: the milestone reports for this grant are produced with
380
-
it, so a failure is visible immediately rather than at the end.
381
-
382
-
### Time tracking rests on a standard that does not support it
383
-
384
-
[`NEXT_LEVEL.md`](../NEXT_LEVEL.md) is explicit that iCalendar has no place to
385
-
record time spent: a VJOURNAL cannot carry a DURATION, and the three candidate
386
-
workarounds (an illegal DTEND on a journal, `PARTSTAT=X-ATTENDED`, or a new
387
-
`VTIMESPENT` component) are all compromises. Whatever Phase 4 picks, other
388
-
calendaring tools will not understand it.
389
-
390
-
**Mitigation:** the representation is documented (3.1) so that it is at least
391
-
*legible* to another implementation, and the `timewarrior` export path is kept so
392
-
users who need interoperable time tracking have somewhere to go. This is a known
393
-
gap in the standards, not a defect in plann, and saying so plainly in the
394
-
documentation is part of the deliverable.
395
-
396
-
### The QA phase has no visible output
397
-
398
-
Forty-six hours of tests, annotations and TODO triage produce nothing a user can
399
-
see. It is the item most likely to be cut when time runs short, and the item whose
400
-
absence caused the fifteen correctness bugs that Phase 1 is releasing fixes for.
401
-
402
-
**Mitigation:** it is scheduled early, its deliverables are numeric (coverage
403
-
thresholds, mypy in CI, TODO counts) rather than subjective, and CI enforcement
404
-
means the gains cannot silently erode afterwards.
405
-
406
-
### Maintainer bandwidth
407
-
408
-
The primary maintainer has several packages to juggle - several of them NLnet-funded -
409
-
as well as other priorities and concerns in life. It is a real risk that time will
410
-
run out before the allocated funds do.
411
-
412
-
**Mitigation:** Phases 1, 2 and 5 are independent of everything else,
413
-
so partial delivery is meaningful in any order. Phase 1 alone leaves users better
414
-
off than today. There are other developers in the pycal pool who may pick up
415
-
pieces.
416
-
417
-
### Peer review is a dependency on other people
418
-
419
-
Phase 5.5 requires reviewers who are not the author, and the most valuable reviewer
420
-
is someone who has never used plann.
421
-
422
-
**Mitigation:** approach reviewers during Phase 1, not when the documentation is
0 commit comments