Originally created by: Akarsh-Hegde
Promotion of pre-main into main (21 commits, ~72 files). Raised for review + merge by a maintainer.
There is one merge conflict: services/pyproject.toml.
pre-main = 1.64.0main = 1.67.01.66.2, live staging runtime = 1.63.0services/pyproject.toml version is the MLX-runtime version, and the app's runtime auto-upgrade is an equality check against the published channel. If this merge lands main at 1.64.0, that is below the live production runtime 1.66.2, so:
Resolve the conflict by keeping 1.67.0 (or higher). Same applies to Cargo.toml / ui/package.json if they conflict — keep the main (higher) version. Normally set-version.sh enforces this in lockstep at release; this is a manual promotion, so reconcile by hand.
This promotion only carries the WORKLOG_SYSTEM worklog fix if #365 (worklog fix → pre-main) is merged into pre-main before this PR merges. If you need production worklogs restored, confirm the fix is present in worklog.py on the merge result (from agents.worklog_pipeline.prompts.worklog import SYSTEM as WORKLOG_SYSTEM) — otherwise main keeps the bug.
Publish a runtime off main with a version > 1.66.2 (e.g. runtime-v1.67.0) so stuck 1.66.2 machines auto-upgrade and drain the pending worklog hours.
🤖 Generated with Claude Code
https://claude.ai/code/session_01CT9wnEUuQeoBeufqTh46JC
Originally posted by: coderabbitai[bot]
No actionable comments were generated in the recent review. 🎉
ℹ️ Recent review info
⚙️ Run configuration
**Configuration used**: Organization UI **Review profile**: ASSERTIVE **Plan**: Pro Plus **Run ID**: `c58c321c-524f-4645-be5e-31d1187e6119`📥 Commits
Reviewing files that changed from the base of the PR and between [057477] and d03a9445be15087057fb48cad66790003cfd1117.📒 Files selected for processing (1)
* `services/pyproject.toml`📜 Recent review details
⚠️ CI failures not shown inline (6)
**GitHub Actions: PR `#371` / 0_Analyze (rust).txt**: PR `#371` Conclusion: `failure` [View job details](https://api.github.com/repos/Meridiona/meridian/check-runs/76784839546/annotations) :::text ##[group]Extracting rust [command]/opt/hostedtoolcache/CodeQL/2.25.6/x64/codeql/codeql database trace-command --use-build-mode --working-dir /home/runner/work/meridian/meridian /home/runner/work/_temp/codeql_databases/rust Running command in /home/runner/work/meridian/meridian: [/opt/hostedtoolcache/CodeQL/2.25.6/x64/codeql/rust/tools/autobuild.sh] [] [build-stderr] Scanning for files in /home/runner/work/meridian/meridian... [] [build-stderr] /home/runner/work/_temp/codeql_databases/rust: Indexing files in in /home/runner/work/meridian/meridian... [] [build-stderr] Running command in /home/runner/work/meridian/meridian: [/opt/hostedtoolcache/CodeQL/2.25.6/x64/codeql/rust/tools/index-files.sh, /home/runner/work/_temp/codeql_databases/rust/working/files-to-index18405270784628430353.list] [] [build-stdout] [] [build-stdout] [32m INFO[0m configuration: { [] [build-stdout] [] [build-stdout] scratch_dir: "/home/runner/work/_temp/codeql_databases/rust/working", [] [build-stdout] [] [build-stdout] trap_dir: "/home/runner/work/_temp/codeql_databases/rust/trap/rust", [] [build-stdout] [] [build-stdout] source_archive_dir: "/home/runner/work/_temp/codeql_databases/rust/src", [] [build-stdout] [] [build-stdout] diagnostic_dir: "/home/runner/work/_temp/codeql_databases/rust/diagnostic/extractors/rust", [] [build-stdout] [] [build-stdout] cargo_target_dir: None, [] [build-stdout] [] [build-stdout] cargo_target: None, [] [build-stdout] [] [build-stdout] cargo_features: [], [] [build-stdout] [] [build-stdout] cargo_cfg_overrides: [], [] [build-stdout] [] [build-stdout] cargo_extra_env: {}, [] [build-stdout] [] [build-stdout] cargo_extra_args: [], [] [build-stdout] [] [build-stdout] cargo_all_targets: false, [] [build-stdout] [] [build-stdout] logging_flamegraph: None, [] [build-stdout] [] [build-stdout] logging_verbosity: Some( [] [build-stdout] [] [build-stdout] "progress", [] [build-stdout] [] ... --- **GitHub Actions: PR `#371` / Analyze (rust)**: PR `#371` Conclusion: `failure` [View job details](https://api.github.com/repos/Meridiona/meridian/check-runs/76784839546/annotations) :::text ##[group]Extracting rust [command]/opt/hostedtoolcache/CodeQL/2.25.6/x64/codeql/codeql database trace-command --use-build-mode --working-dir /home/runner/work/meridian/meridian /home/runner/work/_temp/codeql_databases/rust Running command in /home/runner/work/meridian/meridian: [/opt/hostedtoolcache/CodeQL/2.25.6/x64/codeql/rust/tools/autobuild.sh] [] [build-stderr] Scanning for files in /home/runner/work/meridian/meridian... [] [build-stderr] /home/runner/work/_temp/codeql_databases/rust: Indexing files in in /home/runner/work/meridian/meridian... [] [build-stderr] Running command in /home/runner/work/meridian/meridian: [/opt/hostedtoolcache/CodeQL/2.25.6/x64/codeql/rust/tools/index-files.sh, /home/runner/work/_temp/codeql_databases/rust/working/files-to-index18405270784628430353.list] [] [build-stdout] [] [build-stdout] [32m INFO[0m configuration: { [] [build-stdout] [] [build-stdout] scratch_dir: "/home/runner/work/_temp/codeql_databases/rust/working", [] [build-stdout] [] [build-stdout] trap_dir: "/home/runner/work/_temp/codeql_databases/rust/trap/rust", [] [build-stdout] [] [build-stdout] source_archive_dir: "/home/runner/work/_temp/codeql_databases/rust/src", [] [build-stdout] [] [build-stdout] diagnostic_dir: "/home/runner/work/_temp/codeql_databases/rust/diagnostic/extractors/rust", [] [build-stdout] [] [build-stdout] cargo_target_dir: None, [] [build-stdout] [] [build-stdout] cargo_target: None, [] [build-stdout] [] [build-stdout] cargo_features: [], [] [build-stdout] [] [build-stdout] cargo_cfg_overrides: [], [] [build-stdout] [] [build-stdout] cargo_extra_env: {}, [] [build-stdout] [] [build-stdout] cargo_extra_args: [], [] [build-stdout] [] [build-stdout] cargo_all_targets: false, [] [build-stdout] [] [build-stdout] logging_flamegraph: None, [] [build-stdout] [] [build-stdout] logging_verbosity: Some( [] [build-stdout] [] [build-stdout] "progress", [] [build-stdout] [] ... --- **GitHub Actions: CI / 1_Migrations append-only.txt**: promote: pre-main → main Conclusion: `failure` [View job details](https://api.github.com/repos/Meridiona/meridian/check-runs/76784850245/annotations) :::text ##[group]Run base='8a5a7b9fd961ea1aac69c2c51b51aa1ccb7ddaf3' [36;1mbase='8a5a7b9fd961ea1aac69c2c51b51aa1ccb7ddaf3'[0m [36;1mviolations=$(git diff --name-status "$base"...HEAD -- src/migrations \[0m [36;1m | grep -E '^(M|D|R)' || true)[0m [36;1mif [ -n "$violations" ]; then[0m [36;1m echo "::error::Shipped migrations are immutable. Add a NEW numbered migration in src/migrations/ — never modify, rename, or delete an existing one (it changes the sqlx checksum and breaks every database that already applied it)."[0m --- **GitHub Actions: CI / screenpipe MIT pin**: promote: pre-main → main Conclusion: `failure` [View job details](https://api.github.com/repos/Meridiona/meridian/check-runs/76784850245/annotations) :::text ##[group]Run expected="0.4.6" [36;1mexpected="0.4.6"[0m [36;1mfail=0[0m [36;1m# install.sh no longer installs screenpipe (capture is in-process in[0m [36;1m# the tray since v1.64.0). install-from-bundle.sh still uses it for[0m [36;1m# the legacy npm-based install path — the pin must stay there.[0m [36;1mfor f in scripts/install-from-bundle.sh; do[0m [36;1m v=$(grep -E '^SCREENPIPE_VERSION=' "$f" | head -1 | cut -d'"' -f2)[0m [36;1m if [ "$v" != "$expected" ]; then[0m [36;1m echo "::error file=$f::SCREENPIPE_VERSION='$v' but must be '$expected' — the last MIT npm release. screenpipe >= 0.4.17 is Commercial-licensed; bumping the pin ships users a commercial dependency. Changing this requires legal review (and editing this guard). See the LICENSE PIN comment at the pin."[0m --- **GitHub Actions: CI / Migrations append-only**: promote: pre-main → main Conclusion: `failure` [View job details](https://api.github.com/repos/Meridiona/meridian/check-runs/76784850245/annotations) :::text ##[group]Run base='8a5a7b9fd961ea1aac69c2c51b51aa1ccb7ddaf3' [36;1mbase='8a5a7b9fd961ea1aac69c2c51b51aa1ccb7ddaf3'[0m [36;1mviolations=$(git diff --name-status "$base"...HEAD -- src/migrations \[0m [36;1m | grep -E '^(M|D|R)' || true)[0m [36;1mif [ -n "$violations" ]; then[0m [36;1m echo "::error::Shipped migrations are immutable. Add a NEW numbered migration in src/migrations/ — never modify, rename, or delete an existing one (it changes the sqlx checksum and breaks every database that already applied it)."[0m --- **GitHub Actions: CI / 3_screenpipe MIT pin.txt**: promote: pre-main → main Conclusion: `failure` [View job details](https://api.github.com/repos/Meridiona/meridian/check-runs/76784850245/annotations) :::text ##[group]Run expected="0.4.6" [36;1mexpected="0.4.6"[0m [36;1mfail=0[0m [36;1m# install.sh no longer installs screenpipe (capture is in-process in[0m [36;1m# the tray since v1.64.0). install-from-bundle.sh still uses it for[0m [36;1m# the legacy npm-based install path — the pin must stay there.[0m [36;1mfor f in scripts/install-from-bundle.sh; do[0m [36;1m v=$(grep -E '^SCREENPIPE_VERSION=' "$f" | head -1 | cut -d'"' -f2)[0m [36;1m if [ "$v" != "$expected" ]; then[0m [36;1m echo "::error file=$f::SCREENPIPE_VERSION='$v' but must be '$expected' — the last MIT npm release. screenpipe >= 0.4.17 is Commercial-licensed; bumping the pin ships users a commercial dependency. Changing this requires legal review (and editing this guard). See the LICENSE PIN comment at the pin."[0m🧰 Additional context used
🧠 Learnings (1)
📓 Common learnings
Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Do what has been asked; nothing more, nothing less Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Never create files unless absolutely necessary; prefer editing existing files Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Never create documentation files unless explicitly requested Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Always read a file before editing it Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Never commit secrets, credentials, or `.env` files Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Keep files under 500 lines; split when a file grows beyond that Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Validate all input at system boundaries (config load, DB open, frame parsing) Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Never run `git reset`, `git push --force`, or delete local code Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Never merge a PR automatically; leave the merge to a human reviewer Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Never push directly to `main`; always use a separate feature branch and raise a PR Learnt from: CR Repo: Meridiona/meridian Timestamp: 2026-06-30T10:04:31.876Z Learning: Always use a separate branch per feature/fix, with branch names in `type/short-description` format🔇 Additional comments (1)
📝 Walkthrough
## Walkthrough This PR adds timed and scheduled capture pausing, proposed-ticket drafting and review, local-hour handling across worklog and coding-agent flows, and updated observability plus runtime publishing tooling. ## Changes **Core product flows** |Layer / File(s)|Summary| |---|---| |**Schema, settings, and time helpers**`src/migrations/050_proposed_task_worklog.sql`, `src/migrations/051_tracking_pause_gaps.sql`, `meridian-core/src/settings.rs`, `meridian-core/src/util/date.rs`, `services/agents/time_utils.py`, `src/coding_agent_session_ingest/segment.rs`, `ui/lib/settings.ts`|Proposed-task and gap storage are extended, runtime work-hours settings are added, and shared local-time conversion helpers are introduced in Rust and Python.| |**Tray pause state and work-hours enforcement**
`tray/src-tauri/src/state.rs`, `meridian-core/src/capture.rs`, `src/db/meridian.rs`, `tray/src-tauri/src/commands/daemon.rs`, `tray/src-tauri/src/poll/mod.rs`, `tray/src-tauri/src/lib.rs`, `ui/components/views/SettingsView.tsx`, `tray/src/app.js`, `tray/src/index.html`, `tray/src/style.css`, `ui/components/DayTimeline.tsx`|Tray state gains pause metadata and cancellation senders, timed pause/resume persistence is added, work-hours checks pause and resume capture, and the tray UI renders pause controls, status, and paused timeline bands.| |**Coding-agent hour-boundary and summariser changes**
`src/coding_agent_session_ingest/segment.rs`, `src/coding_agent_session_ingest/indexer.rs`, `src/coding_agent_session_ingest/db.rs`, `src/coding_agent_session_ingest/summariser/...`, `services/skills/coding-agent/session-summary/SKILL.md`, `src/etl/extractor.rs`, `src/etl/runner.rs`, `src/etl/session_builder.rs`, `tests/etl_coding_agent_skip.rs`|Segmenting, sealing, and summarising coding-agent sessions now follow local clock-hour boundaries, the summariser drops blockers and adds per-source backoff, and ETL filtering skips coding-agent terminal titles in VSCode-like apps.| |**Worklog pipeline and session distiller local-time migration**
`src/worklog_pipeline.rs`, `services/agents/session_distiller.py`, `services/agents/worklog_pipeline/db.py`|The worklog driver, session distiller, and worklog DB queries switch from UTC hour buckets and string slicing to local-hour labels and UTC ranges, while payload composition gains reasoning support.| |**Proposed-ticket drafting pipeline**
`services/agents/worklog_pipeline/models.py`, `services/agents/worklog_pipeline/prompts/propose_ticket.py`, `services/agents/worklog_pipeline/worklog.py`, `services/agents/worklog_pipeline/pipeline.py`, `services/agents/worklog_pipeline/workflow.py`, `services/agents/worklog_pipeline/db.py`|Proposal schema, prompt, worklog drafting, tracing, and persistence are extended so approved proposals carry reasoning, a drafted worklog payload, and local-hour window metadata.| |**Proposed-ticket readers, commands, and UI**
`meridian-core/src/readers/proposed.rs`, `meridian-core/src/readers/worklogs.rs`, `meridian-core/src/lib.rs`, `tray/src-tauri/src/commands/worklogs.rs`, `tray/src-tauri/src/lib.rs`, `ui/lib/api-types.ts`, `ui/components/views/WorklogsView.tsx`, `ui/components/views/TodayView.tsx`|Core reader APIs, Tauri commands, and worklog UI render proposed tickets inline with editable title/body, approval actions, and new proposed-item metadata.| |**Approved proposal ticket creation**
`src/pm_worklog/create.rs`, `src/pm_worklog/db.rs`, `src/pm_worklog/post.rs`, `src/pm_worklog/mod.rs`|Approved proposals are fetched, converted into provider tickets, persisted as worklogs, and marked created through a new multi-provider creation path.| |**Provider and ticket-update integrations**
`src/intelligence/providers/linear/...`, `src/intelligence/ticket_update/...`, `tray/src-tauri/src/commands/integrations.rs`, `tray/src-tauri/src/commands/triage.rs`, `ui/components/IntegrationConnect.tsx`, `ui/components/HygieneDialog.tsx`|Linear grouping changes, ticket-update helper tests, Trello credential handling, OAuth prompting, subprocess working-directory fixes, and dialog error handling are updated together.| **Observability, dashboards, and release tooling** |Layer / File(s)|Summary| |---|---| |**Tracing, dashboards, and service observability**
`services/agents/observability.py`, `services/agents/server.py`, `services/agents/routes/...`, `services/observability/dashboards/*`|OpenTelemetry setup changes to direct OTLP export and agno tracing, service tracers are renamed, routes add richer span/log metadata, and new dashboards are added for activity, worklog-hour, and session-distiller views.| |**Runtime gates, release workflow, and docs**
`.github/workflows/*`, `scripts/*`, `CLAUDE.md`, `services/pyproject.toml`, `scripts/README.md`, `dev-start.sh`, `install.sh`, `.cargo/config.toml`, `.gitignore`|Runtime version gating, publishing scripts, release workflows, and supporting developer docs/configuration are added or updated together.| ## Estimated code review effort 🎯 5 (Critical) | ⏱️ ~120 minutes ## Possibly related PRs - [[Meridiona/meridian#324](https://github.com/Meridiona/meridian/issues/324)](https://github.com/Meridiona/meridian/pull/324): It touches the tray capture wiring and engine startup path that this PR extends with pause/resume and schedule control. - [[Meridiona/meridian#324](https://github.com/Meridiona/meridian/issues/324)](https://github.com/Meridiona/meridian/pull/324): It touches the tray capture wiring and engine startup path that this PR extends with pause/resume and schedule control. ## Poem > 🐇 Hoppity-hop, the clock knows local time now, > Pauses and proposals both know when and how. > Dashboards glow softly, the trail stays in view, > A bunny left carrots of code, shiny and new.
🚥 Pre-merge checks | ✅ 4 | ❌ 1
### ❌ Failed checks (1 warning) | Check name | Status | Explanation | Resolution | | :---------------: | :--------- | :------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------- | | Description check | ⚠️ Warning | The description is on-topic but misses most required template sections, especially testing, checklist, and related issues. | Add the required sections: what the PR does, how it was tested, checklist items, and related issue references. |✅ Passed checks (4 passed)
| Check name | Status | Explanation | | :------------------------: | :------- | :----------------------------------------------------------------------------------- | | Title check | ✅ Passed | The title accurately summarizes the main change: promoting pre-main into main. | | Docstring Coverage | ✅ Passed | Docstring coverage is 100.00% which is sufficient. The required threshold is 80.00%. | | Linked Issues check | ✅ Passed | Check skipped because no linked issues were found for this pull request. | | Out of Scope Changes check | ✅ Passed | Check skipped because no linked issues were found for this pull request. |✨ Finishing Touches
🧪 Generate unit tests (beta)
- [ ] Create PR with unit tests - [ ] Commit unit tests in branch `pre-main`Comment
@coderabbitai helpto get the list of available commands.Originally posted by: Akarsh-Hegde
Promotion review pass — complete ✅
Worked through all 49 review threads (CodeRabbit + code-quality bot) and the merge conflict.
Merge conflict — resolved. Merged
mainintopre-main; the only conflict wasservices/pyproject.toml, resolved to1.67.0(> liveruntime-latest1.66.2) so the auto-publish gate fires on promotion. TheWORKLOG_SYSTEMre-export survived the merge.Threads — all 49 resolved:
worklog.py:11 "WORKLOG_SYSTEM unused"is a re-export consumed bypipeline.py; removing it would reintroduce the bug this promotion fixes.pyproject.tomlversion (the 1.67.0 fix above).Net: the conflict is gone and every conversation is resolved. The only thing this promotion changes beyond the cumulative feature work is the version bump to 1.67.0. Follow-ups live in [#376].
Related
Tickets: #376
Ticket changed by: Akarsh-Hegde