routines: house style v2 (quiet Discord), research-synthesis v3, grant-scout partnership lens - #54
Conversation
…t-scout partnership lens - README: house style v2 contract - one message per post (~900 target / ~1500 ceiling), conversational lede first, one-line all-clear on quiet runs, minimal emoji, artifact carries the detail - guild-weekly-synthesis: both posts single-message minimal digests; teams / research / design blocks move to the Drive memo; quiet-week one-liner for the council, no quiet-week post to #community; fixes the phantom Metrics context reference - research-synthesis v3: corpus-first (reads open RESR issues in full), bounded verified insight-gathering pass, cross-workstream connections, completion assists (<=3 comments, <=1 draft doc, <=1 issue); model to claude-fable-5; de-prescribed for the Fable tier - guild-grant-scout: partnership pass + PARTNERS ledger, joint-pursuit prospects (Grant: X (with Partner)), peer-funder hop, Cluster F Web2 philanthropy monthly sweep; digest to house style v2 with a 🤝 section - delivery-hygiene-pulse: lede + 8-item digest cap; one-line all-clear - stipend-ledger / scorecard-pulse: one-line quiet variants aligned - profile-refresh: fix two-vs-three marker-block inconsistency Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
📝 WalkthroughSummary by CodeRabbit
WalkthroughThe PR updates Claude routine specifications for corpus-first research, partnership scouting, house-style Discord reporting, three-block profile refreshes, and exact quiet-period notifications. ChangesClaude routine portfolio
Estimated code review effort: 3 (Moderate) | ~20 minutes Sequence Diagram(s)sequenceDiagram
participant ResearchSynthesis
participant Linear
participant Drive
participant Web
participant Discord
ResearchSynthesis->>Linear: Load RESR issues
ResearchSynthesis->>Drive: Load linked documents and memos
ResearchSynthesis->>Web: Gather verified sources
ResearchSynthesis->>Linear: Submit gated contributions
ResearchSynthesis->>Discord: Post research synthesis
Possibly related PRs
Poem
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out. Comment |
There was a problem hiding this comment.
Actionable comments posted: 11
🧹 Nitpick comments (2)
routines/claude/research-synthesis.md (1)
126-152: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd languages to the Markdown fences.
Specify a fence language such as
textfor the digest examples at Lines 126 and 150. This resolves the reportedMD040warnings.🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@routines/claude/research-synthesis.md` around lines 126 - 152, Add an explicit language identifier, such as text, to every Markdown code fence in the Research Synthesis template examples, including the main digest format and the quiet-week format, so the fences satisfy MD040.Source: Linters/SAST tools
routines/claude/guild-grant-scout.md (1)
368-384: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick winAdd a language identifier to both fenced blocks.
markdownlint-cli2reports MD040 for Lines 368 and 395. Mark these Discord templates astextor another intentional language.Also applies to: 395-397
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@routines/claude/guild-grant-scout.md` around lines 368 - 384, Add an explicit language identifier, preferably text, to both fenced Discord template blocks in the grant scout document, including the blocks containing the weekly output template and the pipeline template, so they no longer use unlabeled fences.Source: Linters/SAST tools
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@routines/claude/delivery-hygiene-pulse.md`:
- Line 120: Add the text language identifier to every affected fenced code
block: use ```text at routines/claude/delivery-hygiene-pulse.md lines 120-120
and 142-142, and at routines/claude/guild-weekly-synthesis.md lines 188-188,
205-205, and 230-230.
- Around line 118-135: Align all Discord bullet caps with the shared
approximately five-bullet house style: in
routines/claude/delivery-hygiene-pulse.md lines 118-135, reduce the digest cap
from 8 items to approximately 5; in routines/claude/guild-weekly-synthesis.md
line 184, retain the existing approximately five-bullet contract with no direct
change; and in routines/claude/guild-weekly-synthesis.md line 324, replace the
separate 3 + 4 + 3 section caps with one combined cap of approximately five
bullets.
In `@routines/claude/guild-grant-scout.md`:
- Line 88: Update the PARTNERS ledger schema to include cooling in its warmth
enum, alongside discussed, warm, and active, so it accepts the state assigned by
Phase 1.7 and persisted by Phase 6.
- Around line 348-351: Update the “Joint pursuits (partnership-backed
prospects)” workflow to apply the PARTNERS.md fit gate: when a partner has a
concrete product, research, funding, or implementation thread, create or link
the appropriate Linear item and record the relationship there, while retaining
partner-only relationships without a qualifying thread in the PARTNERS ledger
and digest.
In `@routines/claude/guild-weekly-synthesis.md`:
- Around line 315-316: Update the Discord payload guidance around the
allowed_mentions configuration so it uses allowed_mentions.users rather than
parse:["users"]. Include DISCORD_USER_ID_AFO only when an action is required;
otherwise provide an empty users list, ensuring synthesized or copied user
mentions cannot notify unintended users.
In `@routines/claude/profile-refresh.md`:
- Line 23: Update the managed-section count in the routine description from “two
auto-managed sections” to “three auto-managed sections” so it matches the three
marker blocks handled by the profile refresh routine, including team-shipping.
In `@routines/claude/README.md`:
- Line 17: Update the stipend-ledger destination references in the README so the
channel is consistent and uses the actual destination, replacing `#lead-council`
with `#scope-review` wherever this workflow is documented, including the entries
near lines 17 and 99.
In `@routines/claude/research-synthesis.md`:
- Around line 124-143: Update the “House style v2, one message” template to
allow no more than five bullets total across two or three sections, reducing or
consolidating the current four-section, ten-bullet structure. Preserve the
existing content priorities and omit empty sections; alternatively, document
this template as an explicit exception in README.md.
- Around line 98-101: Update the source-verification guidance in the research
synthesis instructions so failed-fetch sources are excluded from the digest
entirely. Remove the “unverified” inclusion exception in the cited section and
the repeated guidance around the source-handling section, preserving only
sources successfully fetched during the current run.
- Around line 158-165: Update the Guardrails section’s Discord restriction to
permit exactly the single guarded REST POST to `#research` required by the scope
contract, while keeping Discord replies, reactions, and all other writes
prohibited.
- Around line 103-109: Update the “Phase 5: Contribute (gated writes)” guidance
to distinguish Linear writes from Google Drive draft creation: route comments
and issues through the Linear connector, while permitting the single eligible
draft document through the Drive connector. Clarify that `research-synthesis`
signing applies to Linear writes and preserve the existing limits, folder,
title, and linking requirements for drafts.
---
Nitpick comments:
In `@routines/claude/guild-grant-scout.md`:
- Around line 368-384: Add an explicit language identifier, preferably text, to
both fenced Discord template blocks in the grant scout document, including the
blocks containing the weekly output template and the pipeline template, so they
no longer use unlabeled fences.
In `@routines/claude/research-synthesis.md`:
- Around line 126-152: Add an explicit language identifier, such as text, to
every Markdown code fence in the Research Synthesis template examples, including
the main digest format and the quiet-week format, so the fences satisfy MD040.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro Plus
Run ID: e5ff7675-b20a-4739-964e-82b76e4af782
📒 Files selected for processing (8)
routines/claude/README.mdroutines/claude/delivery-hygiene-pulse.mdroutines/claude/guild-grant-scout.mdroutines/claude/guild-weekly-synthesis.mdroutines/claude/profile-refresh.mdroutines/claude/research-synthesis.mdroutines/claude/scorecard-pulse.mdroutines/claude/stipend-ledger.md
📜 Review details
⏰ Context from checks skipped due to timeout. (1)
- GitHub Check: Analyze (javascript-typescript)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.md
📄 CodeRabbit inference engine (CLAUDE.md)
Link to the issue-creation flow in docs that ask someone to "open" an issue or RFC, not just the source template file
**/*.md: Do not introduce guild-wide Season framing in documentation
Do not describe the dev guild as the entire Greenpill Network in documentation
Avoid growth-hacking and trend-chasing voice in documentation: no FOMO, virality, leaderboards, streaks, or AI-first framing
Files:
routines/claude/scorecard-pulse.mdroutines/claude/profile-refresh.mdroutines/claude/stipend-ledger.mdroutines/claude/delivery-hygiene-pulse.mdroutines/claude/README.mdroutines/claude/guild-weekly-synthesis.mdroutines/claude/research-synthesis.mdroutines/claude/guild-grant-scout.md
**/*.{md,yml,yaml}
📄 CodeRabbit inference engine (CLAUDE.md)
Search for and retire stale terms:
app.charmverse.io,greenpill.network/dev-guild,FOMO,virality,leaderboards,streaks,AI-first, former dev-guild PM URL, retired funded-work file names, old GitHub grant lifecycle labels, and retired Claude routine filenamesDo not reintroduce the former dev-guild PM URL or old migration language for project-management state
Files:
routines/claude/scorecard-pulse.mdroutines/claude/profile-refresh.mdroutines/claude/stipend-ledger.mdroutines/claude/delivery-hygiene-pulse.mdroutines/claude/README.mdroutines/claude/guild-weekly-synthesis.mdroutines/claude/research-synthesis.mdroutines/claude/guild-grant-scout.md
🪛 LanguageTool
routines/claude/README.md
[uncategorized] ~19-~19: The official name of this software platform is spelled with a capital “H”.
Context: ...md| active | Mon 20:00 | GitHub PR on.github` | Opens a PR refreshing the three auto...
(GITHUB)
[grammar] ~84-~84: Ensure spelling is correct
Context: ...silent no-op run rather than an error. Rollout watchlist for the Fable routines, since...
(QB_NEW_EN_ORTHOGRAPHY_ERROR_IDS_1)
routines/claude/guild-weekly-synthesis.md
[style] ~244-~244: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...s of commits / PRs / issues / releases. For Drive, run the content-scoped query and...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
[style] ~244-~244: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...the reject step to every candidate doc. For Calendar, query the next 7 days of even...
(ENGLISH_WORD_REPEAT_BEGINNING_RULE)
🪛 markdownlint-cli2 (0.23.1)
routines/claude/delivery-hygiene-pulse.md
[warning] 120-120: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 142-142: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
routines/claude/README.md
[warning] 18-18: Table column count
Expected: 5; Actual: 3; Too few cells, row will be missing data
(MD056, table-column-count)
routines/claude/guild-weekly-synthesis.md
[warning] 188-188: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 205-205: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 230-230: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
routines/claude/research-synthesis.md
[warning] 126-126: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 150-150: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
routines/claude/guild-grant-scout.md
[warning] 368-368: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
[warning] 395-395: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🔇 Additional comments (12)
routines/claude/README.md (2)
13-16: LGTM!Also applies to: 19-44
79-89: LGTM!Also applies to: 100-100
routines/claude/research-synthesis.md (2)
8-8: LGTM!
17-34: LGTM!Also applies to: 36-97, 111-113, 144-149, 153-157, 166-168
routines/claude/profile-refresh.md (1)
73-73: LGTM!routines/claude/guild-grant-scout.md (5)
118-118: 🗄️ Data Integrity & IntegrationDefine how person-only signals enter
PARTNERS.This rule accepts an external organization or person, but the ledger schema at Line 88 only defines
org. Add an entity name/type field, or define the required normalization when a person has no organization.
31-33: LGTM!
162-187: LGTM!
442-444: LGTM!
460-461: LGTM!routines/claude/scorecard-pulse.md (1)
87-87: LGTM!routines/claude/stipend-ledger.md (1)
95-95: LGTM!
| One message, **house style v2** ([README](README.md#house-style-v2-applies-to-every-posting-routine)): open with a 1-sentence lede (what needs attention, in plain words), bold headers, blank lines between blocks, lead with what needs a human, per-team sections only for teams that have items, omit every empty section, wrap issue URLs in `<...>`, `·` over em dashes. **Cap the whole digest at the 8 highest-ranked items across all buckets** (🔴/⏰ first, then 🟠, 🟡, 🔍, 🆕) and close with "plus {n} more · full sweep in Linear" when over — the Linear comments already reached every owner, so the digest is a summary, not the full list. `@`-afo only in the 🔴 lead block, and only when it is non-empty. | ||
|
|
||
| ``` | ||
| **🧭 Delivery Hygiene — {YYYY-MM-DD}** | ||
| **🧭 Delivery Hygiene · {YYYY-MM-DD}** | ||
|
|
||
| {Lede: 1 sentence, e.g. "Two briefs are past due and GROW has one item waiting on its panel."} | ||
|
|
||
| 🔴 **Needs you** <@${DISCORD_USER_ID_AFO}> | ||
| - {past-due and ⏰ SLA-breached items, ranked: ⚠️③ struck-out first, then past-due; ID · title · <@owner> (tagged) · due date · <url>} | ||
| - ⚠️③ {ID} {title} — 3+ nudges in 30d, steward decision: re-scope / re-date / reassign / cancel · <@owner> <{url}> | ||
| - ⚠️③ {ID} {title} · 3+ nudges in 30d, steward decision: re-scope / re-date / reassign / cancel · <@owner> <{url}> | ||
|
|
||
| **{Team}** | ||
| 🟠 {ID} {title} — stalled, last update {date}, {owner} <{url}> | ||
| 🟡 {ID} {title} — due {date}, not started, {owner} <{url}> | ||
| 🆕 {ID} {title} — {state or "due {date}"}, unscoped, {owner or unassigned} <{url}> | ||
| 🔍 {ID} {title} — scoped, awaiting {Team} panel, due {date} <{url}> | ||
| 🟠 {ID} {title} · stalled, last update {date}, {owner} <{url}> | ||
| 🟡 {ID} {title} · due {date}, not started, {owner} <{url}> | ||
| 🆕 {ID} {title} · {state or "due {date}"}, unscoped, {owner or unassigned} <{url}> | ||
| 🔍 {ID} {title} · scoped, awaiting {Team} panel, due {date} <{url}> | ||
|
|
||
| … (repeat only for teams with items) … | ||
| … (repeat only for teams with items, 8 items max across everything) … |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Align all Discord bullet caps with the shared house style.
The local caps exceed the shared approximately five-bullet limit.
routines/claude/delivery-hygiene-pulse.md#L118-L135: reduce the digest cap from 8 items to the shared limit.routines/claude/guild-weekly-synthesis.md#L184-L184: retain the approximately five-bullet contract.routines/claude/guild-weekly-synthesis.md#L324-L324: replace the 3 + 4 + 3 section caps with a combined cap of approximately five bullets.
🧰 Tools
🪛 markdownlint-cli2 (0.23.1)
[warning] 120-120: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
routines/claude/delivery-hygiene-pulse.md#L118-L135(this comment)routines/claude/guild-weekly-synthesis.md#L184-L184routines/claude/guild-weekly-synthesis.md#L324-L324
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/delivery-hygiene-pulse.md` around lines 118 - 135, Align all
Discord bullet caps with the shared approximately five-bullet house style: in
routines/claude/delivery-hygiene-pulse.md lines 118-135, reduce the digest cap
from 8 items to approximately 5; in routines/claude/guild-weekly-synthesis.md
line 184, retain the existing approximately five-bullet contract with no direct
change; and in routines/claude/guild-weekly-synthesis.md line 324, replace the
separate 3 + 4 + 3 section caps with one combined cap of approximately five
bullets.
| One message, house style: bold headers, blank lines between blocks, lead with what needs a human, per-team sections only for teams that have items, omit every empty section, wrap issue URLs in `<...>`. Cap 🆕 needs-scoping at the **10** most recent overall (add "plus {n} more unscoped" if over). `@`-afo only in the 🔴 lead block, and only when it is non-empty. | ||
| One message, **house style v2** ([README](README.md#house-style-v2-applies-to-every-posting-routine)): open with a 1-sentence lede (what needs attention, in plain words), bold headers, blank lines between blocks, lead with what needs a human, per-team sections only for teams that have items, omit every empty section, wrap issue URLs in `<...>`, `·` over em dashes. **Cap the whole digest at the 8 highest-ranked items across all buckets** (🔴/⏰ first, then 🟠, 🟡, 🔍, 🆕) and close with "plus {n} more · full sweep in Linear" when over — the Linear comments already reached every owner, so the digest is a summary, not the full list. `@`-afo only in the 🔴 lead block, and only when it is non-empty. | ||
|
|
||
| ``` |
There was a problem hiding this comment.
📐 Maintainability & Code Quality | 🟡 Minor | ⚡ Quick win
Add language identifiers to every changed fenced block.
routines/claude/delivery-hygiene-pulse.md#L120-L120: use```text.routines/claude/delivery-hygiene-pulse.md#L142-L142: use```text.routines/claude/guild-weekly-synthesis.md#L188-L188: use```text.routines/claude/guild-weekly-synthesis.md#L205-L205: use```text.routines/claude/guild-weekly-synthesis.md#L230-L230: use```text.
🧰 Tools
🪛 markdownlint-cli2 (0.23.1)
[warning] 120-120: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
📍 Affects 2 files
routines/claude/delivery-hygiene-pulse.md#L120-L120(this comment)routines/claude/delivery-hygiene-pulse.md#L142-L142routines/claude/guild-weekly-synthesis.md#L188-L188routines/claude/guild-weekly-synthesis.md#L205-L205routines/claude/guild-weekly-synthesis.md#L230-L230
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/delivery-hygiene-pulse.md` at line 120, Add the text language
identifier to every affected fenced code block: use ```text at
routines/claude/delivery-hygiene-pulse.md lines 120-120 and 142-142, and at
routines/claude/guild-weekly-synthesis.md lines 188-188, 205-205, and 230-230.
Source: Linters/SAST tools
| - `STALE_PROSPECTS` — prospects open >30 days without movement (for Phase 5 surfacing) | ||
| - `PROGRAM_CYCLES` — a forward calendar of recurring funders and their cadence. For every program seen this run or in prior memos (open, closed, or dismissed for timing), record `{program, cadence (annual | quarterly | rolling | one-off), last deadline seen, next expected open/deadline, best-fit project}`. Recurring funders (NLnet batches, Gitcoin/SCF/Celo rounds, UNICEF/GSMA/AECF/USADF annual cohorts) belong here **even when currently closed** — this is how the routine stops discovering great-fit programs a cycle too late. | ||
| - `REOPEN_WATCH` — strong-fit near-misses (closed before we could apply) whose next cycle is within ~8 weeks. Phase 4 pre-stages these as prospects so a draft is ready before the window opens. | ||
| - `PARTNERS` — the partnership ledger, carried forward and updated every run like `PROGRAM_CYCLES`: `{org, who/last touchpoint (call, channel, or issue that names them), context (what they do, what they want), collaboration angle (joint funding | distribution | integration | evidence), warmth (discussed | warm | active), suggested next step}`. Every entry cites its source (Drive note URL, Discord message, or Linear issue) — the ledger records what the guild has actually discussed, never invented relationships. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Add cooling to the PARTNERS warmth enum.
Phase 1.7 assigns cooling after 60 days, and the Phase 6 memo persists that state at Line 443. The Phase 0 schema must include cooling so it represents every valid ledger state.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/guild-grant-scout.md` at line 88, Update the PARTNERS ledger
schema to include cooling in its warmth enum, alongside discussed, warm, and
active, so it accepts the state assigned by Phase 1.7 and persisted by Phase 6.
| ### Joint pursuits (partnership-backed prospects) | ||
|
|
||
| When a Phase 1.7 pairing is concrete — a named program (existence-verified like any other opportunity) plus a named partner plus a real reason the pairing wins — create the prospect titled `Grant: {Program Name} (with {Partner})`, on GROW with the normal `funding:prospect` machinery. The body carries an extra `## Partner` block: the org, the touchpoint source (call note / message / issue URL), what they bring, what we bring, and the suggested next step. Dedupe on funder URL as usual; if a solo prospect for the program already exists, **comment the partnership angle onto it** rather than opening a parallel issue. A partner with no concrete program attached stays in the `PARTNERS` ledger and the 🤝 digest section — relationships are not pipeline items until a program is. | ||
|
|
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | 🏗️ Heavy lift
Route qualifying partnership work through Linear.
This section keeps every partner without a concrete program only in the PARTNERS ledger. However, PARTNERS.md:29-35 requires a real product, research, funding, or implementation thread to be captured in an appropriate Linear item. Add the fit gate and create or link that item when the thread qualifies.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/guild-grant-scout.md` around lines 348 - 351, Update the
“Joint pursuits (partnership-backed prospects)” workflow to apply the
PARTNERS.md fit gate: when a partner has a concrete product, research, funding,
or implementation thread, create or link the appropriate Linear item and record
the relationship there, while retaining partner-only relationships without a
qualifying thread in the PARTNERS ledger and digest.
| - **One message each (house style v2):** both posts must fit in a single Discord message — hard ceiling ~1,500 chars, target under ~900. If a draft overflows, cut content (the memo has it all) rather than chunking. Never split a post across messages. | ||
| - **`allowed_mentions.parse:["users"]`** lets the single `<@${DISCORD_USER_ID_AFO}>` council ping resolve while blocking accidental `@everyone`/`@here`/role pings. |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
echo "== locate file =="
fd -a 'guild-weekly-synthesis\.md$' . || true
echo "== lines 280-340 =="
sed -n '280,340p' routines/claude/guild-weekly-synthesis.md
echo "== search for allowed_mentions / users list / any_action_required/discord =="
rg -n "allowed_mentions|parse:\[\"users\"\]|users.*\[|DISCORD_USER_ID_AFO|any_action_required|Discord|discord" routines/claude/guild-weekly-synthesis.md routines -g '*.md' || trueRepository: greenpill-dev-guild/.github
Length of output: 50385
🌐 Web query:
Discord REST API allowed_mentions users parse user mentions content message notification
💡 Result:
The allowed_mentions field in the Discord REST API is used to control whether specific user, role, or "@everyone/@here" mentions in your message content trigger notifications [1][2]. It is an optional object that allows you to specify exactly which entities should be pinged, preventing unwanted or accidental notifications [1][3]. Key points regarding its usage: How it works - The field is a security and utility feature that determines if a mention in the content of your message results in a notification [1][2]. - Even if a user mention (e.g., <@123456789012345678>) is present in your message, it will only trigger a notification if you have explicitly allowed it via allowed_mentions [1][3]. If not allowed, the mention will still be visually highlighted as a clickable link in the Discord client but will be "silent" [4][3]. - Note that allowed_mentions is validated against your bot's permissions and the actual mentions present in the message; you cannot "phantom ping" someone who is not mentioned in the content [1]. Allowed Mentions Object Structure The allowed_mentions object contains the following properties [1][5]: - parse: An array of allowed mention types to parse from the content. Accepted values are "users", "roles", and "everyone" [1][3]. - users: An array of specific user IDs to ping [1][5]. - roles: An array of specific role IDs to ping [1][5]. - replied_user: A boolean indicating whether to mention the author of the message being replied to (defaults to false) [1][5]. Important Constraints - Mutually Exclusive: The parse field is mutually exclusive with the users and roles fields [1][3]. For example, if you include "users" in the parse array, you cannot also provide a list of specific IDs in the users property [3]. If you attempt to do both, the API will return a 400 error [3]. - Surgical Control: For precise control, use the users or roles arrays to target specific IDs instead of the blanket parse functionality [3]. Important Note on Notifications Setting the allowed_mentions field does not guarantee a push notification will be sent [1]. Other factors, such as the recipient's personal notification settings, server-wide notification settings, suppressions, or whether the user is currently looking at the channel, may still prevent a push notification from being delivered [1].
Citations:
- 1: https://docs.discord.com/developers/resources/message
- 2: [New Feature] Allowed mentions discord/discord-api-docs#1396
- 3: https://discord-webhook.com/en/blog/discord-webhook-mentions/
- 4: Discord: Bot mentions do not trigger notifications (missing allowed_mentions) openclaw/openclaw#45803
- 5: https://discord.js.org/docs/packages/discord-api-types/main/APIAllowedMentions:Interface
Allow only the intended Afo mention.
allowed_mentions.parse:["users"] permits any <@USER_ID> in the message content to trigger. Build the payload with allowed_mentions.users containing ${DISCORD_USER_ID_AFO} when an action is required, and an empty users list otherwise so copied or synthesized <@USER_ID> text cannot notify unintended users.
[security和_privacy]
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/guild-weekly-synthesis.md` around lines 315 - 316, Update the
Discord payload guidance around the allowed_mentions configuration so it uses
allowed_mentions.users rather than parse:["users"]. Include DISCORD_USER_ID_AFO
only when an action is required; otherwise provide an empty users list, ensuring
synthesized or copied user mentions cannot notify unintended users.
| | `network-steward-intent-pulse.md` | active | Tue 16:00 | Linear only | Initiative status update on `Network Presence`; no Issues or Customer Needs | | ||
| | `guild-grant-scout.md` | active | Thu 02:00 (= Wed 19:00 PT) | `#funding` + Drive memo | The `funding:*` lifecycle on the **Growth team** (unprojected + saved views); awards stay on GROW, delivery links to Product | | ||
| | `guild-grant-scout.md` | active | Thu 02:00 (= Wed 19:00 PT) | `#funding` + Drive memo | Funding **and partnership** scout: the `funding:*` lifecycle on the **Growth team** (unprojected + saved views) plus the PARTNERS ledger (call-note + Linear partnership signal); awards stay on GROW, delivery links to Product | | ||
| | `stipend-ledger.md` | active | 1st of month 09:00 | `#lead-council` + one Linear Document | Monthly claims-review pack: accepted work per contributor across all five teams; no dollar math (see the [compensation playbook](../scoped-work-compensation.md)) | |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Reconcile the stipend-ledger channel.
Line 17 lists #lead-council, but Line 99 lists #scope-review. Update both references to the actual destination. An operator could otherwise send the monthly claims pack to the wrong channel.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/README.md` at line 17, Update the stipend-ledger destination
references in the README so the channel is consistent and uses the actual
destination, replacing `#lead-council` with `#scope-review` wherever this workflow
is documented, including the entries near lines 17 and 99.
| Bring back **2 to 4 items maximum**, each with: the link, one sentence on what it is, and one sentence on how it bears on a named issue or domain. Quality bar: | ||
|
|
||
| For each theme write 1–3 sentences capturing the through-line. Cite underlying messages. Do not force structure that isn't there; no diagrams. | ||
| - **Verify existence before citing.** Fetch the page this run. Never cite a source you could not fetch; if something looks promising but the fetch failed (paywall, 403), include it only with an explicit `unverified` tag and the URL. Never fabricate a title, author, finding, or quote: a wrong source in a research digest poisons the well. | ||
| - **Advance, not decorate.** An interesting find with no bearing on open work is parking-lot material at best. If nothing found this week clears the bar, say so in the memo and bring nothing; an empty-handed pass is a correct pass. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Make the source gate fail closed.
Line 100 says never cite a source that could not be fetched, but then permits including it as unverified. Line 163 repeats that exception. Omit failed-fetch sources instead, or define them as non-citations that cannot enter the digest.
Also applies to: 160-164
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/research-synthesis.md` around lines 98 - 101, Update the
source-verification guidance in the research synthesis instructions so
failed-fetch sources are excluded from the digest entirely. Remove the
“unverified” inclusion exception in the cited section and the repeated guidance
around the source-handling section, preserving only sources successfully fetched
during the current run.
| ## Phase 5: Contribute (gated writes) | ||
|
|
||
| For in-domain themes only, propose concrete next moves. Each bullet ends with `— {project}, {owner or 'open'}` and, where it applies, the RESR issue it would extend. Prefer **"comment on the existing issue"** over "create a new issue" whenever an open RESR issue already covers the ground. | ||
| Leave the useful pieces where the work lives. All writes go through the Linear connector; sign everything `research-synthesis` and skip any issue this routine already commented on within 6 days. | ||
|
|
||
| ## Phase 4: Post to #research | ||
| - **Comments (≤3 per run, the default write).** On the issue they serve: gathered sources with the why-it-matters sentence, a cross-issue connection the owner should know about, or a completion assist (a drafted paragraph, a source list, a summary of channel discussion that answers the issue's open question). A comment should save its reader real work, not restate the digest. | ||
| - **Draft doc (≤1 per run, for contributions bigger than a comment).** When an assist outgrows a comment (a literature scan, a draft section, a comparison table), create ONE Google Doc in `Greenpill Dev Guild / Research Synthesis /` titled `YYYY-MM-DD draft: {topic}`, and link it from the comment on the issue it serves. Drafts are inputs for humans to merge into the real artifacts; never edit a human's document directly. | ||
| - **New issue (≤1 per run, rare).** Only when an insight is in-domain (active cycle theme or an open domain), not covered by any open RESR issue (dedupe on title and body theme; if covered, comment instead), concrete (a knowable resolution and a suggested first step beyond "investigate"), and cycle-compatible (in-domain but off-theme goes to the digest for next cycle's planning instead). Title `Research: {short action title}` · team Research · state `Backlog` · labels `activity:research`, `ai:routine`, relevant `protocol:*` (pass to `save_issue` as bare child names, e.g. `["research", "routine", "green-goods"]` — one unresolvable entry rejects the whole array) · unprojected · body per the [Brief shape](../../docs/linear-templates.md#brief) with sources and the corpus hook (`Extends: {RESR-x / cycle theme}`). Most runs file nothing; the panel gate applies downstream. |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Separate Linear writes from Drive writes.
Line 105 says all writes use the Linear connector, but Line 108 requires creating a Google Doc. Clarify the connector and signing rules so the routine does not skip the required draft document or violate its own scope.
Proposed wording
-All writes go through the Linear connector; sign everything `research-synthesis`
+Linear comments and issues go through the Linear connector and are signed
+`research-synthesis`; draft documents and continuity memos use Drive.📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ## Phase 5: Contribute (gated writes) | |
| For in-domain themes only, propose concrete next moves. Each bullet ends with `— {project}, {owner or 'open'}` and, where it applies, the RESR issue it would extend. Prefer **"comment on the existing issue"** over "create a new issue" whenever an open RESR issue already covers the ground. | |
| Leave the useful pieces where the work lives. All writes go through the Linear connector; sign everything `research-synthesis` and skip any issue this routine already commented on within 6 days. | |
| ## Phase 4: Post to #research | |
| - **Comments (≤3 per run, the default write).** On the issue they serve: gathered sources with the why-it-matters sentence, a cross-issue connection the owner should know about, or a completion assist (a drafted paragraph, a source list, a summary of channel discussion that answers the issue's open question). A comment should save its reader real work, not restate the digest. | |
| - **Draft doc (≤1 per run, for contributions bigger than a comment).** When an assist outgrows a comment (a literature scan, a draft section, a comparison table), create ONE Google Doc in `Greenpill Dev Guild / Research Synthesis /` titled `YYYY-MM-DD draft: {topic}`, and link it from the comment on the issue it serves. Drafts are inputs for humans to merge into the real artifacts; never edit a human's document directly. | |
| - **New issue (≤1 per run, rare).** Only when an insight is in-domain (active cycle theme or an open domain), not covered by any open RESR issue (dedupe on title and body theme; if covered, comment instead), concrete (a knowable resolution and a suggested first step beyond "investigate"), and cycle-compatible (in-domain but off-theme goes to the digest for next cycle's planning instead). Title `Research: {short action title}` · team Research · state `Backlog` · labels `activity:research`, `ai:routine`, relevant `protocol:*` (pass to `save_issue` as bare child names, e.g. `["research", "routine", "green-goods"]` — one unresolvable entry rejects the whole array) · unprojected · body per the [Brief shape](../../docs/linear-templates.md#brief) with sources and the corpus hook (`Extends: {RESR-x / cycle theme}`). Most runs file nothing; the panel gate applies downstream. | |
| ## Phase 5: Contribute (gated writes) | |
| Leave the useful pieces where the work lives. Linear comments and issues go through the Linear connector and are signed | |
| `research-synthesis`; draft documents and continuity memos use Drive. | |
| - **Comments (≤3 per run, the default write).** On the issue they serve: gathered sources with the why-it-matters sentence, a cross-issue connection the owner should know about, or a completion assist (a drafted paragraph, a source list, a summary of channel discussion that answers the issue's open question). A comment should save its reader real work, not restate the digest. | |
| - **Draft doc (≤1 per run, for contributions bigger than a comment).** When an assist outgrows a comment (a literature scan, a draft section, a comparison table), create ONE Google Doc in `Greenpill Dev Guild / Research Synthesis /` titled `YYYY-MM-DD draft: {topic}`, and link it from the comment on the issue it serves. Drafts are inputs for humans to merge into the real artifacts; never edit a human's document directly. | |
| - **New issue (≤1 per run, rare).** Only when an insight is in-domain (active cycle theme or an open domain), not covered by any open RESR issue (dedupe on title and body theme; if covered, comment instead), concrete (a knowable resolution and a suggested first step beyond "investigate"), and cycle-compatible (in-domain but off-theme goes to the digest for next cycle's planning instead). Title `Research: {short action title}` · team Research · state `Backlog` · labels `activity:research`, `ai:routine`, relevant `protocol:*` (pass to `save_issue` as bare child names, e.g. `["research", "routine", "green-goods"]` — one unresolvable entry rejects the whole array) · unprojected · body per the [Brief shape](../../docs/linear-templates.md#brief) with sources and the corpus hook (`Extends: {RESR-x / cycle theme}`). Most runs file nothing; the panel gate applies downstream. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/research-synthesis.md` around lines 103 - 109, Update the
“Phase 5: Contribute (gated writes)” guidance to distinguish Linear writes from
Google Drive draft creation: route comments and issues through the Linear
connector, while permitting the single eligible draft document through the Drive
connector. Clarify that `research-synthesis` signing applies to Linear writes
and preserve the existing limits, folder, title, and linking requirements for
drafts.
| **House style v2, one message** (~900 chars target, ~1,500 ceiling; cut content rather than chunk). Wrap source URLs in `<...>` to suppress embeds, except up to 2 bare URLs for the week's best new sources (they earn previews). Omit any empty section. Shape: | ||
|
|
||
| ``` | ||
| 📋 **From the board** — {cycle name}, {n} open issues | ||
| • Needs input: {RESR-x} {short title} — {what kind of input} <{url}> | ||
| • In review: {RESR-y} {short title} — awaiting {panel/reviewer} <{url}> | ||
| • Due soon: {RESR-z} {short title} — due {date}, {owner} <{url}> | ||
| • Landed this month: {1-line roll-up of recently Done titles} | ||
| ``` | ||
| **🔬 Research Synthesis · week of {YYYY-MM-DD}** | ||
|
|
||
| Caps: 5 bullets total, ranked needs-input → in-review → due-soon → landed. Omit bullet types with nothing to show; if the whole board is quiet, one line: `📋 **From the board** — {cycle name}: {n} open issues, nothing blocked or due this week.` | ||
| {Lede: 1–2 sentences on where the guild's research stands this week and the single most useful thing in this post.} | ||
|
|
||
| ### Silent-week message (mode = silent) | ||
| **🧭 Where it stands** | ||
| {≤3 bullets · one per active domain that moved or matters this week, substance not activity counts. Fold in nearest-to-done: "RESR-x needs only {the missing piece} to close." Issue URLs in <...>.} | ||
|
|
||
| ``` | ||
| **🔬 Research Synthesis — week of {YYYY-MM-DD}** | ||
| **🔗 Connections** | ||
| {≤2 bullets · cross-workstream links worth acting on. Omit when none are real — most weeks this section is small or absent.} | ||
|
|
||
| Silent week in `#research` (0 substantive messages). | ||
| **📥 New input** | ||
| {≤3 bullets · Phase 4 sources: link · what it is · which issue/domain it feeds. Mark any `unverified`.} | ||
|
|
||
| {📋 From-the-board block} | ||
| **🧪 Explore next** | ||
| {≤2 bullets · questions the corpus points toward, for humans to pick up or ignore.} | ||
|
|
||
| Drop a paper, tool, or thread to keep the loop running. | ||
| 📋 {cycle name} · {n} open issues{ · needs input: RESR-x, RESR-y}{ · filed/commented: <links>} |
There was a problem hiding this comment.
🗄️ Data Integrity & Integration | 🟠 Major | ⚡ Quick win
Align the digest shape with house style v2.
README.md requires at most five bullets across two or three sections. This shape permits up to ten bullets across four sections. Cap the total output here, or explicitly document an exception in README.md.
🧰 Tools
🪛 markdownlint-cli2 (0.23.1)
[warning] 126-126: Fenced code blocks should have a language specified
(MD040, fenced-code-language)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/research-synthesis.md` around lines 124 - 143, Update the
“House style v2, one message” template to allow no more than five bullets total
across two or three sections, reducing or consolidating the current
four-section, ten-bullet structure. Preserve the existing content priorities and
omit empty sections; alternatively, document this template as an explicit
exception in README.md.
| ## Guardrails | ||
|
|
||
| - **Stay in lane.** Input = `#research`. Output = `#research` + at most 1 created Issue + 2 comments + the memo. | ||
| - **The corpus gates creation.** No Issue outside the active research domains, ever. The parking lot is where adjacent signal lives until a human promotes it. | ||
| - **Bi-directional every run.** The 📋 From-the-board block appears in all three modes — on a silent week it IS the post. | ||
| - **Synthesis, not capture.** Vague "we should look into X" stays in the digest. | ||
| - **Comment > create.** Extending an open issue beats filing a new one. | ||
| - **Read-only on Discord.** No replies, no reactions. | ||
| - **No PRs, no GitHub Issues, no diagrams.** (Mermaid generation retired in v2 as creation noise.) | ||
| - **Cite sources.** Every theme references the underlying messages/docs. | ||
| - **Mode is determined by message count, not by mood.** 0 = silent, 1–4 = sparse, 5+ = active. | ||
| - **Always write the Phase 6 memo.** | ||
| - **Linear via the OAuth connector only, fail closed:** if the connector is unauthenticated, post the digest WITHOUT the From-the-board block plus one line ("⚠️ Linear connector needs re-authorization — board state omitted, no Issues filed") and skip all Linear writes. | ||
| - **Reject WEFA / personal / unrelated-client content** on every Drive/Calendar read. Same WEFA discipline as other guild routines. | ||
| - **Stay in lane.** Inputs and outputs exactly as the scope contract names them. | ||
| - **The corpus gates creation; adjacent signal parks.** No issue outside the active domains, ever. | ||
| - **Comment over create; contribute over summarize.** Extending an open issue beats filing a new one; giving an owner something usable beats describing what they should do. | ||
| - **Never fabricate.** Every outside source fetched this run or tagged `unverified`; every corpus claim cites its issue. This discipline is identical to grant-scout's existence gate and is non-negotiable. | ||
| - **Caps: 1 post · 3 comments · 1 issue · 1 draft doc.** Zero of each is a valid run. | ||
| - **Read-only on Discord** (no replies, no reactions) · **no PRs, no GitHub issues, no diagrams** · **no edits to human documents**. |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Allow the required Discord post.
Line 165 declares Discord read-only, but Lines 111-113 require a guarded REST POST to #research. Change the guardrail to allow exactly that one post; otherwise a strict executor can suppress the primary deliverable.
Proposed wording
-- **Read-only on Discord** (no replies, no reactions)
+- **Read-only on Discord except for the single guarded post to `#research`**
+ (no replies, no reactions, and no other channel writes)📝 Committable suggestion
‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.
| ## Guardrails | |
| - **Stay in lane.** Input = `#research`. Output = `#research` + at most 1 created Issue + 2 comments + the memo. | |
| - **The corpus gates creation.** No Issue outside the active research domains, ever. The parking lot is where adjacent signal lives until a human promotes it. | |
| - **Bi-directional every run.** The 📋 From-the-board block appears in all three modes — on a silent week it IS the post. | |
| - **Synthesis, not capture.** Vague "we should look into X" stays in the digest. | |
| - **Comment > create.** Extending an open issue beats filing a new one. | |
| - **Read-only on Discord.** No replies, no reactions. | |
| - **No PRs, no GitHub Issues, no diagrams.** (Mermaid generation retired in v2 as creation noise.) | |
| - **Cite sources.** Every theme references the underlying messages/docs. | |
| - **Mode is determined by message count, not by mood.** 0 = silent, 1–4 = sparse, 5+ = active. | |
| - **Always write the Phase 6 memo.** | |
| - **Linear via the OAuth connector only, fail closed:** if the connector is unauthenticated, post the digest WITHOUT the From-the-board block plus one line ("⚠️ Linear connector needs re-authorization — board state omitted, no Issues filed") and skip all Linear writes. | |
| - **Reject WEFA / personal / unrelated-client content** on every Drive/Calendar read. Same WEFA discipline as other guild routines. | |
| - **Stay in lane.** Inputs and outputs exactly as the scope contract names them. | |
| - **The corpus gates creation; adjacent signal parks.** No issue outside the active domains, ever. | |
| - **Comment over create; contribute over summarize.** Extending an open issue beats filing a new one; giving an owner something usable beats describing what they should do. | |
| - **Never fabricate.** Every outside source fetched this run or tagged `unverified`; every corpus claim cites its issue. This discipline is identical to grant-scout's existence gate and is non-negotiable. | |
| - **Caps: 1 post · 3 comments · 1 issue · 1 draft doc.** Zero of each is a valid run. | |
| - **Read-only on Discord** (no replies, no reactions) · **no PRs, no GitHub issues, no diagrams** · **no edits to human documents**. | |
| ## Guardrails | |
| - **Stay in lane.** Inputs and outputs exactly as the scope contract names them. | |
| - **The corpus gates creation; adjacent signal parks.** No issue outside the active domains, ever. | |
| - **Comment over create; contribute over summarize.** Extending an open issue beats filing a new one; giving an owner something usable beats describing what they should do. | |
| - **Never fabricate.** Every outside source fetched this run or tagged `unverified`; every corpus claim cites its issue. This discipline is identical to grant-scout's existence gate and is non-negotiable. | |
| - **Caps: 1 post · 3 comments · 1 issue · 1 draft doc.** Zero of each is a valid run. | |
| - **Read-only on Discord except for the single guarded post to `#research`** | |
| (no replies, no reactions, and no other channel writes) · **no PRs, no GitHub issues, no diagrams** · **no edits to human documents**. |
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@routines/claude/research-synthesis.md` around lines 158 - 165, Update the
Guardrails section’s Discord restriction to permit exactly the single guarded
REST POST to `#research` required by the scope contract, while keeping Discord
replies, reactions, and all other writes prohibited.
…per surface) (#682) **Mirror of the develop PR onto `main`, which the live bug-intake / health-watch / growth-pulse / qa-triage wrappers actually read** — without this, the changes (and the #641/#664/#666 improvements stranded on develop since mid-July: Opus 5 models, OAuth-only Linear, the growth-pulse unchanged-week fold, health-watch cadence text, the qa-triage Engineering Sync extension, and `docs/routines/posthog-questions.md`) never reach the running routines. Same dual-PR pattern as #553/#554. `docs/routines/` only — no code paths. After both PRs merge, these files are byte-identical on develop and main, so the next release promote is clean. `main`'s legacy `.claude/skills/posthog-questions/SKILL.md` copy is left in place (its removal is part of develop's #660 skills consolidation and promotes with the release); the specs now reference the `docs/routines/` copy. Part of the 2026-07-30 quiet-Discord routine revamp (pairs with greenpill-dev-guild/.github#54, which defines house style v2: one message per post, a conversational lede, one-line all-clears on quiet runs). **What changes for each routine's Discord surface:** - **bug-intake** — standalone per-capture ack messages retired (they were up to 8 messages/run; the biggest single noise source at ~9-15 msgs/week). Discord-source reporters keep the in-thread `Tracked ->` reply + ✅ reaction on their own message; Telegram/Drive captures surface as item lines in the digest. The digest itself becomes item-led (lede + up to 3 notable items) and posts only when something was captured; a quiet run is one line. - **health-watch** — an all-green run posts exactly one line; the per-check breakdown appears only when a check is non-green or state changed (new/updated Issue, recovery). Mention rules unchanged (red only). - **growth-pulse** — the #growth post becomes a lede (what the week means) + only the metrics that moved (max 3 bullets) + watch/anomaly lines + the full-digest link; a steady week is one line. The full tables stay in the Linear initiative status update, unchanged. - **qa-triage-pulse** — item-led summary with a lede and a `/qa-triage` CTA; the always-on 6-line surface-breakdown count block is dropped; a no-sync Wednesday is one line instead of a skeleton. - **release-prep** — two-message budget (decision surface + copy); the full commit enumeration is linked as the live GitHub compare view instead of pasted into Discord. - **README** — channel map and portfolio rows updated; house style v2 pointer. Net effect across the portfolio: roughly 18-25 routine messages/week drops to ~8-11, about half of them one-liners. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
…cks, moved-metrics growth digest (#681) Part of the 2026-07-30 quiet-Discord routine revamp (pairs with greenpill-dev-guild/.github#54, which defines house style v2: one message per post, a conversational lede, one-line all-clears on quiet runs). **What changes for each routine's Discord surface:** - **bug-intake** — standalone per-capture ack messages retired (they were up to 8 messages/run; the biggest single noise source at ~9-15 msgs/week). Discord-source reporters keep the in-thread `Tracked ->` reply + ✅ reaction on their own message; Telegram/Drive captures surface as item lines in the digest. The digest itself becomes item-led (lede + up to 3 notable items) and posts only when something was captured; a quiet run is one line. - **health-watch** — an all-green run posts exactly one line; the per-check breakdown appears only when a check is non-green or state changed (new/updated Issue, recovery). Mention rules unchanged (red only). - **growth-pulse** — the #growth post becomes a lede (what the week means) + only the metrics that moved (max 3 bullets) + watch/anomaly lines + the full-digest link; a steady week is one line. The full tables stay in the Linear initiative status update, unchanged. - **qa-triage-pulse** — item-led summary with a lede and a `/qa-triage` CTA; the always-on 6-line surface-breakdown count block is dropped; a no-sync Wednesday is one line instead of a skeleton. - **release-prep** — two-message budget (decision surface + copy); the full commit enumeration is linked as the live GitHub compare view instead of pasted into Discord. - **README** — channel map and portfolio rows updated; house style v2 pointer. Net effect across the portfolio: roughly 18-25 routine messages/week drops to ~8-11, about half of them one-liners. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Part of the 2026-07-30 routine review: Discord is too loud (~18-25 routine messages/week, ~7-9 of them guaranteed no-information posts), the posts are dense report-dumps rather than human reads, research-synthesis digests chat instead of synthesizing research, and grant-scout has no partnership dimension.
House style v2 (
routines/claude/README.md)One contract for every posting routine:
{emoji} {Routine} · {date}: all clear). Public#communitygets signal or silence, never a heartbeat. Failures still post loudly.·over em dashes, teammate voice.Per-spec changes
#communitypost trimmed to lede + 3 bullets + conditional Come along. Fixes the phantom "📊 Metrics context" section reference.claude-fable-5, spec de-prescribed for the Fable tier per the model-tier rationale.#funding+ Linear →PARTNERSledger carried run-to-run), joint-pursuit prospects (Grant: {Program} (with {Partner})on GROW), a 🤝 digest section, a peer-funder hop, and a monthly Cluster F Web2 philanthropy/CSR deep sweep. Digest on house style v2 with a one-line quiet week.Live wiring notes (post-merge, handled outside this PR)
main; changes go live on their next fire after merge.claude-fable-5via a job-config re-emit after this merges; its first Sat fire should be checked in the routines UI (a Fable decline is a silent no-op).[text](url)example inside backticks in guild-grant-scout.md; it exists onmaintoday and is untouched here.🤖 Generated with Claude Code