Originally created by: Akarsh-Hegde
doctorThis branch builds the foundation for evaluating Meridian in the wild — making the question "why was this session misclassified?" answerable, instead of silently blaming the model. It has two complementary halves.
The classifier's quality is only measurable if user corrections are captured. The worklog review surface is the natural source — every approve/reject/edit is a free label — but those actions were being thrown away.
POST /api/worklogs/:id (approve / reject / unapprove) writes an immutable pm_worklog_feedback row, atomically with the state change (previously only edit was captured; state transitions were lossy).031 adds corrected_task_key + corrected_to_untracked to pm_worklog_feedback; the "Dismiss" button opens a "Where should this time have gone?" picker (candidate tickets from /api/tasks, plus Untracked / Not sure). A rejection now yields a real ground-truth correction, not just a weak negative.Files: src/migrations/031_worklog_reject_attribution.sql, ui/app/api/worklogs/[id]/route.ts, ui/components/views/WorklogsView.tsx.
meridian doctorThe principle: before a misclassification can be blamed on the AI, rule out that the pipeline was broken. Faults form a ladder; attribute to the earliest broken rung:
meridian doctor grew from a flat bash checklist into a comprehensive, colourised, by-daemon health engine covering every dependency the product needs to run. All checks are content-free (counts, timestamps, statuses, reachability — never screen content), so the same engine is safe to run on a design partner's machine.
system · meridian daemon · screenpipe · mlx-server · jira · worklog · coding-agent · ui · mcp · observability · config
Highlights:
subprocess_error sentinel count/health reachability + /info model-loaded readiness (liveness ≠ readiness — the gap the old TCP preflight missed)/myself auth that distinguishes 401-expired / 403-scope, sync freshness, candidate completenessMERIDIAN_DB vs MERIDIAN_DB_PATH, the settings.json split-brain, dead env vars)▸ daemon table, severity glyphs in colour (gated on IsTerminal), redundant prefixes stripped, → remedy lines under every failure, a ⚠ N items need attention header, and a ✓/·/⊘/✗ counts footer. Exits non-zero on any critical.meridian doctor --fix, the team, or a claude hand-off.meridian doctor — the on-demand sweep. The meridian CLI wrapper now delegates to the daemon binary's report (perl-alarm-guarded so a stale binary can't hang the terminal), with a minimal bash fallback. A --porcelain TSV mode is available for tooling.A src/health/ module per subsystem (capture, daemon, mlx, jira, worklog, codingagent, observability, contracts, platform, diagnose) returning Vec<Check>; run_all assembles the grouped report. ~1,800 lines.
Running this against a live machine immediately surfaced real issues a flat checklist hid:
settings.json split-brain — ~/.meridian/settings.json (UI-written) is not read by the daemon (a real latent config bug, confirmed)which, derive_healthz, contract expansion; diagnosis correlation).cargo fmt + clippy -D warnings clean.4 pre-existing eval/classifier commits already on the branch (deepeval goldens, ExtractThenClassify experiment config, SKILL_PATH override, real hand-labeled golden runs) — the experimentation side of the same feedback effort.
meridian doctor --fix (auto + guided-with-confirm remediation, escalation bundle / claude hand-off) — next increment.🤖 Generated with Claude Code
Ticket changed by: Akarsh-Hegde