Menu

#532 Rebuild daily summary with modern UI and planned/actual tracking

closed
nobody
None
2026-07-22
2026-07-21
Anonymous
No

Originally created by: adityaharishch

Summary

Completely rebuilt Meridian's daily summary screen to provide a modern, aesthetic interface that handles both planned and unplanned days. Replaced Vega-based charting with custom SVG components and established a two-layer system where database facts lock task outcomes while AI fills gaps and identifies workstreams.

Key Changes

Core Logic

  • Two-layer task matching: database facts (posted worklogs, linked tickets) are deterministic and lock outcomes; AI model fills gaps and points at relevant workstreams
  • New Adherence type with achievement percentage: (earned * 100 + planned) / (planned * 2) with proper rounding
  • 30-minute minimum threshold applied consistently across frontend, backend, and themes
  • Staleness-triggered auto-refresh (regenerates summaries older than 20 minutes on open)

Schema & Database

  • Migration 068: dropped panels_json, added headline, plan_json, adherence_json, themes_json, evidence_at
  • New types: DaySummaryInsight (text + learned flag), PlanVerdict, Adherence, DayTheme
  • Prompt rewritten with tone contract (no "drifted"/"failed"/"wasted"), **emphasis** formatting, locked pre-matches rule

UI Components (all new)

  • AchievementRing: signature visualization of plan adherence with done/partial/not-touched segments and percentage
  • PlanLedger: detailed ledger of planned tasks with outcome glyphs, evidence, time, and certainty indicators
  • DayShape: no-plan hero showing inferred themes as proportional bands
  • Insights: unlabelled insight rows with learned items in a separate "Picked up along the way" card
  • Workstreams: task list filtered to ≥30 minutes with proportional bars and duration
  • Composing: full-screen generation state with animated progress and step captions

Layout

  • Modal card over dimmed blurred backdrop (house overlay pattern)
  • Structured sections with labels and proper spacing using new Section component
  • Boxed presentation for lists (plan ledger, workstreams); unboxed for prose (insights, hero)
  • Escape-to-close and detail dialog accessible from within the card

Test & Build Status

  • npm run build: clean
  • bun test: 332 pass / 0 fail
  • No Vega references remain in codebase
  • Verified end-to-end on both planned (6→2 done, 2 partial, 2 untouched) and unplanned days

Commits

  • c679adb0 - feat(summary): rebuild the daily summary around planned vs actual
  • c3ec7791 - feat(summary): give composing its own screen instead of one static line
  • 76fe559b - refactor(summary): put the daily summary in a card with real structure

🤖 Generated with Claude Code

Discussion

  • Anonymous

    Anonymous - 2026-07-21

    Originally posted by: coderabbitai[bot]

    [!IMPORTANT]

    Review skipped

    Auto reviews are disabled on base/target branches other than the default branch.

    Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.


    ⚙️ Run configuration

    Configuration used: Organization UI

    Review profile: ASSERTIVE

    Plan: Pro Plus

    Run ID: 37c42fe9-b56e-4245-ac01-3cf8616ba690

    You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

    Use the checkbox below for a quick retry:
    - [ ] 🔍 Trigger review

    ✨ Finishing Touches
    🧪 Generate unit tests (beta) - [ ] Create PR with unit tests - [ ] Commit unit tests in branch `feat/daily-summary-rebuild`

    Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

    ❤️ Share - [X](https://twitter.com/intent/tweet?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A&url=https%3A//coderabbit.ai) - [Mastodon](https://mastodon.social/share?text=I%20just%20used%20%40coderabbitai%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20the%20proprietary%20code.%20Check%20it%20out%3A%20https%3A%2F%2Fcoderabbit.ai) - [Reddit](https://www.reddit.com/submit?title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&text=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code.%20Check%20it%20out%3A%20https%3A//coderabbit.ai) - [LinkedIn](https://www.linkedin.com/sharing/share-offsite/?url=https%3A%2F%2Fcoderabbit.ai&mini=true&title=Great%20tool%20for%20code%20review%20-%20CodeRabbit&summary=I%20just%20used%20CodeRabbit%20for%20my%20code%20review%2C%20and%20it%27s%20fantastic%21%20It%27s%20free%20for%20OSS%20and%20offers%20a%20free%20trial%20for%20proprietary%20code)

    Comment @coderabbitai help to get the list of available commands.

     
  • Anonymous

    Anonymous - 2026-07-22

    Originally posted by: adityaharishch

    Thanks for the strict review - addressed all of it in f99fe5b1 (plus a merge of pre-main in 598abfcc that resolved the conflicts). Summary by finding:

    Blockers

    1. escalate.rs idempotency - the non-idempotent tracker call now runs behind a claim on the personal task row (escalation_attempt_at + escalation_ticket_key, migration 073), mirroring the day-task worklog's begin_create/mark_created: a concurrent escalation is refused, a stale claim is re-takeable, and a retry reuses the created/posted key instead of filing a second ticket / posting a second comment. graduate_local_task is now #[instrument]'d with per-query spans and a summary log, and there are 5 new unit tests (claim won-once/stale-retake/clear, graduate create + match).
    2. Escape closes nested dialog - Escape now backs out of selected first, only closing the overlay when no ticket detail is open.
    3. planned derivation - dropped the && summary.plan.length AND; it's sc?.planned ?? false now, so a day planned after compose gets the plan screen (the ledger may lag one recompose, which is the right screen vs. the no-plan one).
    4. stale-response race - generate/generateNow now capture the day and bail before every setState if the user navigated away (via a dayRef), plus a shared composing re-entry guard.

    Design concern

    1. Unbounded daily_plan retention - kept intentional, now documented explicitly in providers/mod.rs: scoping to a recency window would break historical plan/worklog title resolution for older tickets, and the growth is human-paced (planned tasks/day), not ticket-churn-driven. Confirmed as the intended tradeoff rather than silently unbounded.

    Migration must-fixes (done while unreleased - these migrations were also renumbered above pre-main's 068/069, which otherwise collided after the merge and would break the sqlx migrator)

    1. insights_json comment fixed to {title, text}.
    2. themes_json comment now says it's unused/wire-back-compat only; plan_json corrected to binary done/not_touched.

    Minors

    • board.rs snapshot fallback now warn!s at the failure boundary instead of .ok().flatten().
    • task_detail.rs doc updated - local_worklog_text is also carried onto a real ticket on escalation.
    • EscalateResponse moved to api-types.ts.
    • Dead hovered state removed; orphaned CleanupModal import + cleanupIssueCount destructure commented out alongside the disabled feature.
    • Cargo.toml native-tls comment corrected (it no longer claims native-tls is purged workspace-wide; it isn't - just kept off our OTLP/reqwest path). Left the dep change in place rather than splitting, since reverting it would reintroduce the native-tls-via-otlp path.
    • Stale docs refreshed: main.rs day-summary CLI + DAILY_SUMMARY prompt doc.
    • "Generate now" double-fire is covered by the shared composing re-entry guard from [#4].

    Not changed (informational): DatePicker.tsx has no live entry point because Board Cleanup is intentionally hidden this release - flagging as expected, not manually verifiable end-to-end until that re-enables.

    All green locally: fmt + clippy (workspace + tray), full cargo test, ui build, and bun test (348 pass). Pre-push suite passed on the push.

     

    Related

    Tickets: #4

  • Anonymous

    Anonymous - 2026-07-22

    Ticket changed by: adityaharishch

    • status: open --> closed
     

Log in to post a comment.