Skip to content

routines: house style v2 (quiet Discord), research-synthesis v3, grant-scout partnership lens - #54

Merged
Oba-One merged 1 commit into
mainfrom
claude/routines-quiet-v2
Aug 1, 2026
Merged

routines: house style v2 (quiet Discord), research-synthesis v3, grant-scout partnership lens#54
Oba-One merged 1 commit into
mainfrom
claude/routines-quiet-v2

Conversation

@Oba-One

@Oba-One Oba-One commented Jul 31, 2026

Copy link
Copy Markdown
Member

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:

  • One message per post — ~900 chars target, ~1,500 ceiling, never chunk; cut content instead (it all lives in the linked artifact).
  • Lede first — 1-2 conversational sentences saying what the run means, then at most ~5 bullets.
  • Quiet run = exactly one line in the home channel ({emoji} {Routine} · {date}: all clear). Public #community gets signal or silence, never a heartbeat. Failures still post loudly.
  • Minimal emoji, numbers only when they moved, · over em dashes, teammate voice.

Per-spec changes

  • guild-weekly-synthesis — council digest goes minimal (lede / 🔴 Needs you / ⚙️ Moved / 🗓️ Ahead / memo link, ONE message; it was allowed 2-3). Teams fold, 🔬 Research, and 🎨 Design blocks move to the Drive memo. #community post trimmed to lede + 3 bullets + conditional Come along. Fixes the phantom "📊 Metrics context" section reference.
  • research-synthesis v3 — inverted: the RESR corpus (issue bodies, comments, linked docs) becomes the primary input, the channel secondary. Adds a bounded verified insight-gathering pass on the active cycle theme, cross-workstream connections, and completion assists (≤3 comments, ≤1 draft Google Doc, ≤1 issue per run; comment-over-create; fail-closed Linear preflight; grant-scout-grade existence verification on every outside source). Model → claude-fable-5, spec de-prescribed for the Fable tier per the model-tier rationale.
  • guild-grant-scout — reframed as the funding and partnership scout: new Phase 1.7 partnership pass (call notes + #funding + Linear → PARTNERS ledger 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.
  • delivery-hygiene-pulse — lede + whole-digest cap of 8 items (Linear comments already reach every owner); all-clear is one line.
  • stipend-ledger / scorecard-pulse — quiet variants aligned to the one-line form.
  • profile-refresh — fixes the two-vs-three marker-block inconsistency.

Live wiring notes (post-merge, handled outside this PR)

  • All affected triggers are thin wrappers reading this repo's main; changes go live on their next fire after merge.
  • The research-synthesis trigger's model flips to claude-fable-5 via 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).
  • Note (pre-existing): the repo link-check script flags the literal [text](url) example inside backticks in guild-grant-scout.md; it exists on main today and is untouched here.

🤖 Generated with Claude Code

…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>
@coderabbitai

coderabbitai Bot commented Jul 31, 2026

Copy link
Copy Markdown

Review Change Stack

📝 Walkthrough

Summary by CodeRabbit

  • New Features
    • Added partnership discovery and tracking alongside grant opportunities.
    • Expanded research synthesis with broader source review, continuity notes, and concise reporting.
    • Added support for managing a third profile marker block.
  • Improvements
    • Standardized Discord digests with clearer formatting, ranked-item limits, overflow notices, and streamlined quiet-period messages.
    • Consolidated weekly updates into concise single-message summaries with improved content selection.
    • Improved partnership reporting, joint-pursuit alerts, and link handling.
  • Bug Fixes
    • Corrected scorecard and stipend-ledger notifications to use required formatting and include relevant document links.

Walkthrough

The PR updates Claude routine specifications for corpus-first research, partnership scouting, house-style Discord reporting, three-block profile refreshes, and exact quiet-period notifications.

Changes

Claude routine portfolio

Layer / File(s) Summary
Corpus-first research synthesis
routines/claude/research-synthesis.md, routines/claude/README.md
Research synthesis now uses claude-fable-5, reads Linear and Drive research sources, performs bounded web research, applies gated contributions, posts a compact synthesis, and records continuity data.
Partnership discovery and pipeline integration
routines/claude/guild-grant-scout.md
Grant scouting now maintains a sourced partner ledger, discovers partnership signals, pairs partners with verified programs, reports joint pursuits, and stores partnership data in memos.
House-style Discord output contracts
routines/claude/README.md, routines/claude/delivery-hygiene-pulse.md, routines/claude/guild-weekly-synthesis.md, routines/claude/scorecard-pulse.md, routines/claude/stipend-ledger.md
Discord outputs now use compact single-message formats, revised caps, consolidated content, overflow handling, and exact quiet-period wording.
Managed profile marker scope
routines/claude/profile-refresh.md
Profile refresh now manages and validates three marker blocks, including team-shipping.

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
Loading

Possibly related PRs

Poem

A rabbit reviews the research trail,
While partner paths join grant detail.
Discord speaks in tidy lines,
Three profile blocks hold their signs.
“Hop approved!” the ledger sings.

🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title clearly summarizes the main changes: house style v2, research-synthesis v3, and partnership-focused grant scouting.
Description check ✅ Passed The description directly explains the routine changes and their objectives, including Discord output, research synthesis, and partnership scouting updates.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch claude/routines-quiet-v2

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.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 11

🧹 Nitpick comments (2)
routines/claude/research-synthesis.md (1)

126-152: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Add languages to the Markdown fences.

Specify a fence language such as text for the digest examples at Lines 126 and 150. This resolves the reported MD040 warnings.

🤖 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 win

Add a language identifier to both fenced blocks.

markdownlint-cli2 reports MD040 for Lines 368 and 395. Mark these Discord templates as text or 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

📥 Commits

Reviewing files that changed from the base of the PR and between f555e6d and f501b44.

📒 Files selected for processing (8)
  • routines/claude/README.md
  • routines/claude/delivery-hygiene-pulse.md
  • routines/claude/guild-grant-scout.md
  • routines/claude/guild-weekly-synthesis.md
  • routines/claude/profile-refresh.md
  • routines/claude/research-synthesis.md
  • routines/claude/scorecard-pulse.md
  • routines/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.md
  • routines/claude/profile-refresh.md
  • routines/claude/stipend-ledger.md
  • routines/claude/delivery-hygiene-pulse.md
  • routines/claude/README.md
  • routines/claude/guild-weekly-synthesis.md
  • routines/claude/research-synthesis.md
  • routines/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 filenames

Do not reintroduce the former dev-guild PM URL or old migration language for project-management state

Files:

  • routines/claude/scorecard-pulse.md
  • routines/claude/profile-refresh.md
  • routines/claude/stipend-ledger.md
  • routines/claude/delivery-hygiene-pulse.md
  • routines/claude/README.md
  • routines/claude/guild-weekly-synthesis.md
  • routines/claude/research-synthesis.md
  • routines/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 & Integration

Define 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!

Comment on lines +118 to +135
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) …

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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-L184
  • routines/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.

```

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📐 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-L142
  • routines/claude/guild-weekly-synthesis.md#L188-L188
  • routines/claude/guild-weekly-synthesis.md#L205-L205
  • routines/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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Comment on lines +348 to +351
### 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Comment on lines +315 to 316
- **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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🔒 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' || true

Repository: 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:


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.

Comment thread routines/claude/README.md
| `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)) |

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Comment on lines +98 to +101
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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Comment on lines +103 to +109
## 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.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Suggested change
## 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.

Comment on lines +124 to +143
**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>}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🗄️ 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.

Comment on lines 158 to +165
## 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**.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🎯 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.

Suggested change
## 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.

Oba-One added a commit to greenpill-dev-guild/green-goods that referenced this pull request Jul 31, 2026
…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)
@Oba-One
Oba-One merged commit f6113f0 into main Aug 1, 2026
4 checks passed
Oba-One added a commit to greenpill-dev-guild/green-goods that referenced this pull request Aug 1, 2026
…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)
@Oba-One Oba-One mentioned this pull request Aug 3, 2026
12 tasks
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant