Skip to content

feat(timeline): milestone dates, zoom, pan, sorting + profile-gated landing - #3

Merged
huhn511 merged 1 commit into
mainfrom
timeline-milestones
Jun 20, 2026
Merged

feat(timeline): milestone dates, zoom, pan, sorting + profile-gated landing#3
huhn511 merged 1 commit into
mainfrom
timeline-milestones

Conversation

@huhn511

@huhn511 huhn511 commented Jun 20, 2026

Copy link
Copy Markdown
Contributor

What

Timeline milestones become first-class dated lanes, plus zoom/pan/sort. All six items came from live discovery feedback and were browser-verified against the local pod.

Timeline

  • Epic datesEpic gains optional startDate/endDate (parsed mindp:/ekai:-tolerant). Undated milestones render as a muted dashed future ghost with an INACTIVE badge + legend entry instead of a blank lane.
  • Auto-start — moving a milestone's first task to In progress stamps mindp:startDate = today in epics.ttl via the pod write backend (setEpicStartDate). Verified live: the lane loses INACTIVE and grows an active bar starting at Today.
  • Merged Runtime/Done bar — one bar: green fill = work done, vertical marker = where elapsed time says we should be. Fill behind the marker = behind schedule.
  • Zoom + pan — Quarter / Month / Week toggle; track widens at finer zooms inside a horizontally-scrollable pane with a frozen label column, ‹ / Today / › nav, and auto-centring on today.
  • Sorting — by start (default; undated sink to the bottom), by name, by progress.

Landing / i18n

  • Profile-gate the assistant + partners sections so the default OSS build doesn't advertise Chat or render an empty partners list.
  • Moved the login-callback string into the i18n table (loginCompleting, en + de).

Demo seeds

  • Both seed scripts (CSS + mind-node) ship three milestones — Discovery (dated, active), Launch (undated → inactive), Audit (dated, done) — so the timeline showcases every state.

Verification

  • npx tsc --noEmit → clean.
  • Browser-driven (Playwright MCP) against local mind-node pod: merged bar, inactive ghost, live auto-start, all three zooms with auto-center, pan with frozen labels, and a real sort reorder.

🤖 Generated with Claude Code

…anding

Timeline now models milestones as first-class dated lanes:
- Epic gains optional startDate/endDate (parsed mindp:/ekai:-tolerant);
  undated milestones render as a muted dashed future ghost + INACTIVE badge.
- Moving a milestone's first task to In progress stamps its startDate=today
  in epics.ttl via the pod write backend (setEpicStartDate).
- Merged Runtime/Done into one bar: green fill = work done, vertical marker =
  where elapsed time says we should be (behind/ahead at a glance).
- Quarter/Month/Week zoom with a horizontally-scrollable track, frozen label
  column, prev/Today/next pan, and auto-centring on today.
- Lane sorting: by start (default, undated last), by name, by progress.

Landing: gate the assistant/partners sections so the default OSS build doesn't
advertise Chat or empty partner lists. Callback string moved into the i18n table.

Demo seeds (CSS + mind-node) ship three milestones (Discovery/Launch/Audit) so
the timeline showcases dated, undated, and completed states.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@huhn511

huhn511 commented Jun 20, 2026

Copy link
Copy Markdown
Contributor Author

Self-review (can't approve own PR)

Data modelEpic.startDate/endDate parse is mindp:/ekai:-tolerant for back-compat reads. setEpicStartDate is a pure string rewrite in the same idiom as rewriteIssue: matches the epic block, replaces-or-inserts after a mc:Epic ;, prepends mindp:/xsd: prefixes if absent — safe no-op when the block isn't found.

Auto-startmaybeStartEpic is best-effort: skips silently with no epics doc, on a non-ok GET, or when the milestone already has a start date; only PUTs when the rewrite changes the TTL. Gated on state === "in-progress" so it fires exactly when a milestone's first work begins.

Timeline — frozen-label pattern (sticky bg-card cells + scaled inner width + auto-center effect) is sound; started/ghost logic cleanly separates active bars from inactive dashed ghosts. Sort comparators fall back to epic.number for stability.

Landing — profile-gating consistent; Eyebrow index numbering shifts correctly when the assistant section is hidden.

Typecheck clean, browser-verified end-to-end.

@huhn511
huhn511 merged commit 32c6cf1 into main Jun 20, 2026
1 check passed
@huhn511
huhn511 deleted the timeline-milestones branch June 20, 2026 19:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant