diff --git a/CHANGELOG.md b/CHANGELOG.md index 51c76e0..0f1f4bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,7 @@ this project adheres to [Semantic Versioning](https://semver.org/). - **Action-items prioritization + task-query hardening** (`phases/core/action-items.md`) — two rules upstreamed from accumulated instance experience: a **Deadline-Distance Ceiling** (urgency is *capped* by deadline distance — 30+ days → 🟢 max, 7–30 → 🟡 max, <7 → eligible for 🔴, <3 → 🔴 when the next action is the user's; evaluate the real deadline, never the source's alarm-word tone; deprecation notices stay 🟢 until ~2–3 weeks out), and a **terminal-status filter on the ontology task query** (`query --type task --exclude-status "completed,cancelled"` instead of a bare query, so completed/cancelled task entities stop resurfacing as open work; documents the supported `--domain` / `--status` / `--deadline-before` filters). - **KB-management hardening** (`phases/core/kb-management.md`) — three rules upstreamed from accumulated instance experience: **Never Guess a Name or Acronym Expansion** (cite the full form from a primary source or leave it abbreviated `[unverified]` — never invent a plausible expansion, which reads as fact and propagates); an **entity-creation trigger** (mint a new entity file when a person/org/technology recurs across 3+ independent sources — enriching existing files is not a substitute for creating missing ones); and **staleness-observability + search-depth** freshness rules (every file carries a machine-readable `last_updated:` so a scan can rank and a driver can queue stale files — opportunistic-only refresh lets the long tail rot; and don't scope completeness searches to a fixed channel set / `from:me` filters — a known-to-exist fact your scan missed is a search-depth miss, not an absence). - **Granola deliverable-invention gate** (`phases/connectors/granola.md`) — a rule upstreamed from accumulated instance experience: a dated commitment or deliverable extracted from a transcript needs a **verbatim source quote** or it's dropped — never attach an urgency marker ("due Friday", "committed to X") the transcript doesn't literally contain; ship without the marker or route to the review queue. Guards two invention traps: topic conflation (don't fuse two adjacent meeting topics into one dated item) and one-off-as-standing (a single mention is not a recurring cadence). +- **Slack notification refinements** (`phases/connectors/slack.md`) — two rules upstreamed from accumulated instance experience: **lead the briefing wrap-DM with a "Today's Focus" continuity line** (open with the throughline from recent work to today, before the counts — counts say *how much*, not *what to care about first*); and a **Slack-renderable link refinement** to the existing DM-legibility rule (Slack does not auto-linkify custom URL schemes like `obsidian://` / `file://` — wrap them in mrkdwn angle-bracket form ``; GFM `[label](url)` also fails for custom schemes — a clickable-link fix only lands when the link renders in the destination's markup dialect). ## [0.7.2] - 2026-06-22 diff --git a/phases/connectors/slack.md b/phases/connectors/slack.md index 04421a8..70c614d 100644 --- a/phases/connectors/slack.md +++ b/phases/connectors/slack.md @@ -216,6 +216,7 @@ Slightly more detail. Example format: ``` Scout morning briefing ready. +*Today's focus:* [the 1–2 things today is really about — the throughline from recent work to now] - Today's meetings: [count] ([first meeting time]) - Action items: X urgent, Y to-do, Z watching - New since yesterday: [brief summary of new items] @@ -223,6 +224,8 @@ Scout morning briefing ready. - Review queue: [count] items pending your review ``` +**Lead the briefing DM with a continuity line.** A briefing wrap-DM must **open with a one-line "Today's Focus" continuity statement** that connects recent work to what matters today — *before* the counts and lists. Counts ("3 urgent, 5 to-do") tell {{USER_NAME}} *how much* without telling him *what to care about first*; the action-items file already carries this throughline, and the DM is where it most needs to surface. Lead with the one or two things today is really about, then the breakdown. + ### Sources-Checked Footer End every consolidation/briefing notification with a one-line transparency footer stating what was actually scanned, so coverage is auditable and "quiet" claims are backed by evidence: @@ -238,7 +241,7 @@ Only count sources you genuinely queried this run. A "quiet window" claim must b Applies to every wrap DM. Two parts: 1. **No bare internal `#SHORTCODE` tags in the user-facing DM.** Action-items use `#SHORTCODE` tags as an *internal* continuity-keying convention (they match an item across daily files); they mean nothing to the reader as bare tokens. Either **expand inline** — `*semantic-layer weekly update* (#TAG)` or just the plain-English label — or **drop the tag from the DM**. A DM line whose only handle on an item is a bare `#CODE` is forbidden: the reader must understand it from plain English. The file-side `#SHORTCODE` machinery is untouched — this is presentation-layer only. -2. **Link the action-items file.** Any wrap DM that references "today's list" / action items must include a clickable link to today's file — an Obsidian URI `obsidian://open?vault={{INSTANCE_NAME}}&file=action-items%2Faction-items-` and/or a `file://{{SCOUT_DIR}}/action-items/action-items-.md` — so a tap opens the list. +2. **Link the action-items file — and write the link so Slack renders it.** Any wrap DM that references "today's list" / action items must include a clickable link to today's file. **Slack does not auto-linkify custom URL schemes** (`obsidian://`, `file://`) — a bare `obsidian://open?…` pasted into a DM renders as inert text, not a link. Wrap it in Slack mrkdwn angle-bracket syntax with a label: `|Today's list>` (or `.md|Today's list>`). GitHub-flavored `[label](url)` **also** fails for custom schemes in the Slack renderer; only `http(s)://` / `mailto:` auto-link when bare. The principle generalizes: a "make it clickable" fix is only delivered when the link actually renders clickable in the **destination surface's markup dialect** — Slack mrkdwn ≠ GFM ≠ bare-URL auto-linking. ### Notification Rules