diff --git a/src/capabilities/slack.md b/src/capabilities/slack.md index 5404002..1b6d7c1 100644 --- a/src/capabilities/slack.md +++ b/src/capabilities/slack.md @@ -199,7 +199,7 @@ Code, file paths, branch names, PR numbers — always in backticks. Links to PRs Slack does not support standard Markdown parsing. It uses its own subset called `mrkdwn`. To avoid sending messy, unrendered text, follow these strict constraints on every message: -- **No headings:** Slack does not support headings (`#`, `##`, `###`). Instead of headings, use bold uppercase (`*BOLD UPPERCASE*`) or a simple bold line to separate sections. +- **No headings:** Slack does not support headings (`#`, `##`, `###`). Instead of headings, use a bold line or a simple bold sentence-case or title-case label (`*Changes shipped*`, `*PRs awaiting review*`) to separate sections. Do NOT use ALL-CAPS uppercase labels — they read as robotic and shouting in chat. Most short chat messages do not need section labels at all; plain prose with clean line breaks is more natural. - **No horizontal rules:** Slack does not support horizontal rules (`---`, `***`, `___`). Use vertical spacing (empty lines) or simple line breaks instead. - **Slack-style links:** Use `` for links, NOT standard Markdown `[label](url)`. - **No literal angle brackets in link labels:** The label part of `` cannot contain literal `<` or `>` characters (e.g., generic types like `List`). Strip or replace them (e.g., `List[T]`), or Slack's parser will break and render the link as raw text. diff --git a/src/runtime/prompts.py b/src/runtime/prompts.py index 2a91d96..7d91ae3 100644 --- a/src/runtime/prompts.py +++ b/src/runtime/prompts.py @@ -66,7 +66,7 @@ "Consequence-first: what the operator should do with the information, " "not a chronological log. PR / issue IDs go at the end of the relevant " "lines as references, not as headlines. Match the formatting rules in " - "`src/capabilities/slack.md` (bold uppercase labels, flat lists).\n" + "`src/capabilities/slack.md` (bold sentence-case labels, flat lists).\n" "3. **Then stop.** This is a one-shot. The daemon will not retry again.\n" "\n" "What you do NOT do:\n" diff --git a/src/skills/daily-maintenance/skill.md b/src/skills/daily-maintenance/skill.md index e10bb44..13e051b 100644 --- a/src/skills/daily-maintenance/skill.md +++ b/src/skills/daily-maintenance/skill.md @@ -209,7 +209,7 @@ These are the PRs Sam opened in §2 + §3 and the Linear issues Sam filed across ### Posting rules -- **ONE message in `#sam`.** Not three. Section the buckets within the same post using **bold uppercase** labels (per `src/capabilities/slack.md`'s formatting rules), not headings. +- **ONE message in `#sam`.** Not three. Section the buckets within the same post using **bold sentence-case** labels (per `src/capabilities/slack.md`'s formatting rules), not headings. - **Skip empty buckets.** If nothing merged AND nothing's open AND nothing was opened this run, post nothing. "No update" posts are noise. - **PR links go as Slack `` references** at the end of the relevant line, not as the structure of the message. - **Don't tag people.** This is broadcast, not assignment. If a specific PR needs a specific reviewer, that's a separate ping. @@ -233,17 +233,17 @@ Pattern: verb-the-reader-cares-about + what-changes-for-them. The PR ID is the r ### What a tight post looks like ``` -**MERGED OVERNIGHT** +**Merged overnight** • Image attachments now reach Gemini natively — no more text-read garbling on screenshots. • Slack formatting strict-mode on — bold caps instead of `#` headings, flat bullets. -**AWAITING YOUR REVIEW (4)** +**Awaiting your review** • Eval harness — 8 invariants defending the four-stale-lore-bug class. • Cap thread-history rendering at 40KB. • Wait-for-answer rule in identity (Tier 2). • `workflow_dispatch` on ci-deploy. -**OPENED THIS RUN** +**Opened during this run** • Capability paths flipped /data/repos → /tmp (gcsfuse-chmod blocker). • SAM-41 — explore below-the-loop rescue parsing for malformed tool calls. ```