Daily rituals stop doing the same work twice (release v1.97.19) - #741
Conversation
A user timed a day of Dex: about fifteen minutes of gathering before the first question, the evening worst. Most of it was duplicated or oversized work in the three heavy rituals, so this trims what they do, not what they ask. - daily-review no longer runs /process-meetings from the conversation and then again inside its helper; the helper's catch-up window is the one pass of the evening. - daily-plan Step 0 asks the session-start sweep for a count before running a seven-day meeting pass. meeting-queue-check.cjs gains --count, which bypasses the notice throttle and writes nothing. - The gathering helpers for daily-plan, daily-review and process-meetings are called with model: sonnet; the frontmatter's fast-tier routing was declared but never wired. - The three AGENT_INSTRUCTIONS briefs get explicit batching preambles so independent reads go out in one turn instead of one after another. - process-meetings verifies only the task IDs, stamped notes and created pages the helper names in a new Touched block, instead of re-reading Tasks.md and every note. - doctor.py gains --only CHECK_ID; daily-plan's email step runs --deep --only mail.apple-search instead of every live probe, and a narrowed run never replaces the health snapshot. Portable adapters and the plugin package are regenerated; the daily-plan portability entry replaces the hook command with a host-neutral fallback; Lens registry pins are refreshed for the three edited skills. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0113icGZrCbSBmwomv7e49bH
…n-utmjv0 # Conflicts: # core/lens-catalog/registry.json
858e630 to
979d23f
Compare
What this pull request touches
Gates that will judge this change
Based on 35 changed files. |
…rator CI's manifest-current check compares core/harnesses/portability.json to scripts/generate-harness-portability.py output. The previous commit edited the JSON by hand, so the check failed. The daily-plan rule (replace the meeting-queue-check --count block with a host-neutral fallback) now lives in the generator, and the regenerated manifest is byte-identical to the one already committed. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0113icGZrCbSBmwomv7e49bH
|
CI status on this PR, for the record:
Generated by Claude Code |
|
What fails: Why: #744 ( So this is not only the historic v1.51.0 journey: any release built from current main would be refused by every existing vault's No fix exists on main yet. Two candidate fixes, both outside this PR's scope:
Until one lands, merging this PR is safe (main already carries the regression), but tagging v1.97.19 is not. Generated by Claude Code |


Linked Issue
What Changed
daily-reviewStep 1.5 no longer runs/process-meetings todayin the conversation; the helper's Step 0 catch-up (every unprocessed meeting since the last processed one) is the evening's only pass.daily-planStep 0 first asksnode .claude/hooks/meeting-queue-check.cjs --countand only runs the seven-day pass when the count is above zero (no output or failure is treated as unknown, not zero).meeting-queue-check.cjs --count. New count-only mode: bypasses the 30-minute notice throttle, never writes the throttle marker, prints one integer.daily-plan,daily-reviewandprocess-meetingspassesmodel: "sonnet". The frontmatter'smodel_routing.steps.data-gathering: fastwas declared but nothing wired it.AGENT_INSTRUCTIONS.mdbriefs: independent reads go out in one turn, then per-meeting enrichment, then writes. Every existing step, gate and post-condition is unchanged.Touchedblock (task IDs, stamped notes, created pages); the conversation verifies exactly those instead of re-readingTasks.mdand every note.doctor.py --only CHECK_ID(repeatable). daily-plan's email step runs--deep --only mail.apple-searchinstead of the whole live registry; Google Workspace needs no local probe. A narrowed run never replaces the health snapshot; an unknown id is an error..agents/skills) and the plugin package regenerated;core/harnesses/portability.jsongives daily-plan a host-neutral replacement for the hook command; Lens registry pins refreshed for the three skills.scripts/release.sh patchwith the CHANGELOG entry in house style. The tag is created on the merge commit after this lands.Test Plan
--count(throttle bypass, no marker write, zero case, CLI output); three doctor tests for--only(narrowing, order, snapshot not published, unknown id rejected); one instruction-contract test pinning the single-probe wording in daily-plan.--onlywith an out-of-registry or unknown id returns exit 1 with no JSON;--countreturns 0, not a notice, when nothing is waiting.npm run test:hooks(278 pass),npm run test:scripts(194 pass withDEX_PYTHONset), the 18 instruction-contract / doctor / Lens / portable-contract suites (773 pass),python3 scripts/check-instructed-tools.py,generate-agents-skills.py --check,generate-portable-plugin.py --check,ruff check core/, portable-contract / architecture-inventory / path-consistency / founder-content / PII / security gates. Full pytest before the merge: 5372 pass; 18 failures all environmental in this sandbox (root reads "unreadable" files, shallow history, process-group timeouts) and reproduced identically on the untouched tree.Ralph Wiggum Loop
Quality Gates
Risk & Rollback
--count,--only). The one behavioural change with a failure mode is daily-plan skipping the meeting pass on a zero count; the evening catch-up window still covers any note the sweep does not count, and any non-integer answer falls back to the old behaviour./dex-rollbackto v1.97.18, or revert the release and feature commits.Docs Impact
CHANGELOG.md(v1.97.19 entry),docs/UPDATE-RESCUE.md(version bump by the release script).🤖 Generated with Claude Code
https://claude.ai/code/session_0113icGZrCbSBmwomv7e49bH