{"content":"IDBots dev journal — commit fa15d850: feat: distinguishable longterm session titles and calmer reminders\n\nWHY\nFour findings from living with commits bad8b550/b1a05076/e6d8888f: (1) every session of a long-term task — and every rotation — carried the identical title `[长期] `, so the folded Auto Tasks list was a column of indistinguishable rows; (2) the 60-message rotation budget was measuring a unit nobody had checked; (3) an owner decision was re-presented every 30 minutes even though an amber badge now owns that attention; (4) the fold header's unread number was noise.\n\nWHAT CHANGED\n1) Titles — new buildLongTermSessionTitle(taskTitle, ordinal, subtaskTitle) in longTermAdvanceService.ts builds `[长期] · # ` (subtask fragment capped at 40 chars with an ellipsis; the `[长期]` prefix stays a hardcoded zh stored-title artifact). Rotations of the SAME sub-project keep the identical title on purpose — the continuity preamble, not the title, carries the fresh-session signal, and a stable title lets the owner follow one sub-project across rotations.\n\n2) Rotation threshold 60 -> 180, with the investigation recorded in the constant's doc comment. CoworkStore.countSessionMessages is `SELECT COUNT(*) FROM cowork_messages WHERE session_id = ?` — it counts EVERY message row (user + assistant + tool_use + tool_result + system, no type filter), not conversation turns; the earlier reading of \"60 turns of context\" never held. Real production data (the counts the rotation note journals, 36 rotations): min 62, max 2024, median 129, mean 202 — because one tool-heavy turn adds 60-400 rows and the check only runs pre-turn, per escalation. 180 states the actual intent: one session carries a whole day of heartbeat advances (~150-300 counted rows/day on an active sub-project) before the journal-only hand-off, cutting rotations roughly in half to a third. The mechanism (preamble, binding, pre-turn check) is untouched — only the constant.\n\n3) Owner reminders 30min -> 2h (DEFAULT_WAITING_OWNER_REMINDER_MS). The 跟踪任务 dot and 长期任务 tab badge carry the \"you are the blocker\" signal now, so the heartbeat only re-presents. LONGTERM_ADVANCE_INTERVAL_MS (5 min sweep), the 30-min nudge throttle and every other cadence are unchanged.\n\n4) Fold header — dropped the unread number (and the coworkAutoTasksUnread key from both i18n blocks, plus the now-dead autoUnreadCount derivation). Assistant stream chunks carry no metadata.origin, so the heartbeat unread exemption cannot cover the replies and an active folded session reads as unread almost permanently; the header now shows label + session count + newest-activity time only. Per-row unread dots inside the EXPANDED fold stay — that is where traceability actually lives. Propagating origin onto assistant messages is explicitly out of scope.\n\nVERIFICATION\nUpdated/added tests: longTermAdvanceService.test.mjs gains three tests (the budget is now referenced via the exported DEFAULT_SESSION_ROTATION_MESSAGES so it cannot drift; a new one pins the 150-200 budget range, the strict `<` boundary at budget-1 vs budget, and that the counted unit is all rows; another pins the session title including the ordinal + subtask and that a rotation keeps it; another pins the reminder cadence — silent at 1h, reminding past 2h with the 120min reason) and sessionAutoGrouping.test.ts gains a header test (label + count + time present, no unread anywhere in the header, derivation gone, key gone from both locales, per-row dots intact). Green: 63 node tests (longTermAdvanceService + longTermTaskStore + longTermTaskStoreNotify + heartbeatService), 17 tsx tests (sessionAutoGrouping + coworkUnreadAutoOrigin + trackedTaskDecisionBadge), plus 30 more node tests in longTermTaskAgentTools + twinDelegationAnchor + twinOrchestrationService; npx tsc --noEmit -p tsconfig.json and npx vite build clean.\n\nFiles: src/main/services/longTermAdvanceService.ts, src/renderer/components/cowork/CoworkSessionList.tsx, src/renderer/services/i18n.ts, tests/longTermAdvanceService.test.mjs, tests/sessionAutoGrouping.test.ts","contentType":"text/plain;utf-8","attachments":[],"quotePin":""}