Slack Report
Overview
Create a Slack report for a named stream such as super-agent by scanning the requested Slack channels, collecting only messages newer than the last successful check, merging the findings into that day’s report file, writing a short top-level summary, and writing the new watermark only after the report is complete. When the user asks for a Google Doc version, also write the report into a persistent Google Doc and reuse that same doc on later runs.
The report input is:
title: report title, used for the watermark file name
channels: Slack channels to scan
topic: the subject to prioritize while reading
categories (optional): ordered buckets such as announcements, updates, feedback
output (optional): markdown by default; when the user asks for a Google Doc or gdoc, write both the markdown report and the Google Doc
Report File
- Resolve
$DOCS_ROOT from the environment when set.
- Default
$DOCS_ROOT to ~/code/openai/0/notes when the environment variable is unset.
- Default report root:
$DOCS_ROOT/report
- Per-report folder:
$DOCS_ROOT/report/[report-title]/
- Daily file:
$DOCS_ROOT/report/[report-title]/[yyyy-mm-dd].md
- Use the normalized report-title slug for the folder name so paths stay stable across runs.
- When the same report is run multiple times on the same local calendar day, update the existing daily file instead of creating a second file.
- Keep a
## Update Log section at the end of the report and append one line for each successful write or merge.
Use the helper script for deterministic report-path handling:
python3 ./scripts/report_state.py report-path --title "<report-title>"
report-path prints JSON with the resolved docs root, report directory, report file path, and local report date.
State File
- Watermark directory:
~/.llm/skills/slack-report/
- Watermark file:
~/.llm/skills/slack-report/[report-title]_last_updated
- Google Doc URL state file:
~/.llm/skills/slack-report/[report-title]_gdoc_url
- If the watermark file exists, scan only messages created after that timestamp.
- If the watermark file does not exist, look back 24 hours from now.
- If the Google Doc URL state file exists, reuse that exact URL instead of creating a new doc.
- If the Google Doc URL state file does not exist and the user asked for a Google Doc, create one named
KL {Report Title} and persist its URL only after the first successful write.
- Store the watermark only after a successful report run.
Use the helper script for deterministic timestamp handling:
python3 ./scripts/report_state.py window --title "<report-title>"
python3 ./scripts/report_state.py report-path --title "<report-title>"
python3 ./scripts/report_state.py gdoc-url --title "<report-title>"
python3 ./scripts/report_state.py write --title "<report-title>" --timestamp "<end-iso>"
python3 ./scripts/report_state.py write-gdoc-url --title "<report-title>" --url "<google-doc-url>"
window prints JSON with the state file path, the effective start/end ISO timestamps, and Slack-compatible oldest_ts / latest_ts values. gdoc-url prints JSON with the persisted Google Doc URL, if any.
Workflow
- Resolve the scan window with
./scripts/report_state.py window --title "<report-title>".
- Resolve the target report file with
./scripts/report_state.py report-path --title "<report-title>".
- If the user asked for a Google Doc, resolve the existing doc URL with
./scripts/report_state.py gdoc-url --title "<report-title>".
- If the user asked for a Google Doc and no URL is stored yet, create a new Google Doc named
KL {Report Title}, then persist its URL with ./scripts/report_state.py write-gdoc-url --title "<report-title>" --url "<google-doc-url>" after the first successful write.
- If the daily report file already exists, read it first and merge into it instead of starting over.
- Search or read only the requested channels.
- Prefer
slack_read_channel when the channel list is known and bounded.
- Prefer
slack_search_public when keyword filtering will substantially reduce noise.
- Use
slack_search_public_and_private only when the user explicitly wants private coverage or has already consented.
- Keep only messages created within the computed window.
- Expand threads only for messages that look directly relevant to the topic or a requested category.
- Summarize the strongest items into the requested categories.
- If categories are provided, use them in the user-supplied order.
- If categories are omitted, infer a small set of useful headings from the messages.
- Omit empty categories unless the user explicitly wants them shown.
- When merging into an existing same-day report:
- de-duplicate entries by Slack permalink
- keep the existing section order when possible
- append genuinely new items into the correct category
- rewrite the
## Summary section so it reflects the merged report, not just the newest delta
- preserve prior write history in the
## Update Log section
- Write a
## Summary section near the top of the daily markdown report before the category sections.
- Always generate the summary via a dedicated
froge subagent when froge is available in the current Codex session.
- Pass the merged report content to
froge and request a short 2-4 sentence summary that is opinionated, technically informed, entertaining, and still genuinely useful.
- If
froge is unavailable or fails, write a direct high-signal summary yourself in a normal voice and note that fallback in your run notes.
- When the summary references specific updates that already appear as headings lower in the file, prefer local Markdown anchor links to those headings.
- If the user asked for a Google Doc, keep a cumulative doc with the newest report day prepended near the top using this exact outer structure:
# [Report title]
- [last updated time]
## [today report]
## [yesterday report]
- In the Google Doc, treat each dated section such as
## 2026-03-11 Report as a daily block that contains that day's summary, categories, and items. Insert the newest day's block immediately after the title and last-updated line so the doc reads newest-to-oldest.
- When updating an existing Google Doc:
- replace the single
- [last updated time] line with the current run time
- replace that day’s existing
## [date] Report block if it already exists, otherwise insert a new block at the top
- preserve older dated sections below it
- Append a new
## Update Log line at the end of the markdown daily file, for example - 2026-02-27 11:10 PST: merged 4 new items from 2026-02-27 09:00 PST to 2026-02-27 11:10 PST.
- After the markdown report and optional Google Doc are successfully written, advance the watermark with
./scripts/report_state.py write.
Categorization Rules
announcements: launches, milestones, invitations, trackers, POR changes, enablement notices
general feedback: bugs, UX complaints, reliability issues, approval friction, connector mismatches
gmail feedback: Gmail-specific auth, scope, send-email, write-action, or connector behavior
tips: how-to advice, settings, workarounds, model overrides, recommended prompts
usecases: real workflows, demos, success stories, examples of value
If a message fits multiple categories, place it in the most decision-useful one and mention the overlap in the description when needed.
Output Template
Use this Markdown shape for each dated report section:
## Summary
[2-4 sentence summary of the current report]
## [yyyy-mm-dd Report]
## [category]
### [title]
- source: [Slack permalink](https://openai.slack.com/archives/...)
- time: [posted timestamp]
[description]
When the user asks for a Google Doc, the cumulative doc should start with:
# [Report title]
- [last updated time]
End each markdown daily file with:
## Update Log
- 2026-02-27 10:54 PST: created report from 2026-02-26 10:54 PST to 2026-02-27 10:54 PST
Descriptions should be short and concrete:
- what happened
- why it matters for the topic
- key reply or resolution when a thread adds important context
The summary should be short and decision-useful:
- lead with the main takeaway from the full merged report
- use
froge subagent output when available; otherwise use concise direct fallback text
- if it cites specific items below, link to them with local Markdown anchors when practical
Notes
- Treat the report as incremental. Do not repeat items older than the stored watermark.
- If this is the first run, state that the scan window used the last 24 hours.
- Store the report in the daily file under
$DOCS_ROOT/report/[report-title]/.
- Reuse the same file for same-day reruns and merge in new items instead of replacing the file.
- Recompute the summary after each same-day merge so it describes the whole file as it stands now.
- When a Google Doc is requested, always write the markdown daily file first, then sync the cumulative Google Doc from that merged result.
- Use the Google Docs tools to create or update the doc; do not create duplicate docs for the same report title once a URL has been persisted.
- When the requested channels are noisy, bias toward fewer high-signal entries instead of exhaustively listing every message.
- Preserve Slack permalinks for every item.
- Write
source values as explicit Markdown links, not bare URLs. This preserves clickability in downstream conversions such as Markdown -> HTML -> Google Docs, where plain URLs may not be auto-linked.
- When descriptions mention additional URLs that should stay clickable, prefer explicit Markdown links there too.
1---2name: slack-report3description: Generate incremental Slack digests for channels, topics, and categories.4---56# Slack Report78## Overview910Create a Slack report for a named stream such as `super-agent` by scanning the requested Slack channels, collecting only messages newer than the last successful check, merging the findings into that day’s report file, writing a short top-level summary, and writing the new watermark only after the report is complete. When the user asks for a Google Doc version, also write the report into a persistent Google Doc and reuse that same doc on later runs.1112The report input is:1314- `title`: report title, used for the watermark file name15- `channels`: Slack channels to scan16- `topic`: the subject to prioritize while reading17- `categories` (optional): ordered buckets such as `announcements`, `updates`, `feedback`18- `output` (optional): `markdown` by default; when the user asks for a Google Doc or `gdoc`, write both the markdown report and the Google Doc1920## Report File2122- Resolve `$DOCS_ROOT` from the environment when set.23- Default `$DOCS_ROOT` to `~/code/openai/0/notes` when the environment variable is unset.24- Default report root: `$DOCS_ROOT/report`25- Per-report folder: `$DOCS_ROOT/report/[report-title]/`26- Daily file: `$DOCS_ROOT/report/[report-title]/[yyyy-mm-dd].md`27- Use the normalized report-title slug for the folder name so paths stay stable across runs.28- When the same report is run multiple times on the same local calendar day, update the existing daily file instead of creating a second file.29- Keep a `## Update Log` section at the end of the report and append one line for each successful write or merge.3031Use the helper script for deterministic report-path handling:3233```bash34python3 ./scripts/report_state.py report-path --title "<report-title>"35```3637`report-path` prints JSON with the resolved docs root, report directory, report file path, and local report date.3839## State File4041- Watermark directory: `~/.llm/skills/slack-report/`42- Watermark file: `~/.llm/skills/slack-report/[report-title]_last_updated`43- Google Doc URL state file: `~/.llm/skills/slack-report/[report-title]_gdoc_url`44- If the watermark file exists, scan only messages created after that timestamp.45- If the watermark file does not exist, look back 24 hours from now.46- If the Google Doc URL state file exists, reuse that exact URL instead of creating a new doc.47- If the Google Doc URL state file does not exist and the user asked for a Google Doc, create one named `KL {Report Title}` and persist its URL only after the first successful write.48- Store the watermark only after a successful report run.4950Use the helper script for deterministic timestamp handling:5152```bash53python3 ./scripts/report_state.py window --title "<report-title>"54python3 ./scripts/report_state.py report-path --title "<report-title>"55python3 ./scripts/report_state.py gdoc-url --title "<report-title>"56python3 ./scripts/report_state.py write --title "<report-title>" --timestamp "<end-iso>"57python3 ./scripts/report_state.py write-gdoc-url --title "<report-title>" --url "<google-doc-url>"58```5960`window` prints JSON with the state file path, the effective start/end ISO timestamps, and Slack-compatible `oldest_ts` / `latest_ts` values. `gdoc-url` prints JSON with the persisted Google Doc URL, if any.6162## Workflow63641. Resolve the scan window with `./scripts/report_state.py window --title "<report-title>"`.652. Resolve the target report file with `./scripts/report_state.py report-path --title "<report-title>"`.663. If the user asked for a Google Doc, resolve the existing doc URL with `./scripts/report_state.py gdoc-url --title "<report-title>"`.674. If the user asked for a Google Doc and no URL is stored yet, create a new Google Doc named `KL {Report Title}`, then persist its URL with `./scripts/report_state.py write-gdoc-url --title "<report-title>" --url "<google-doc-url>"` after the first successful write.685. If the daily report file already exists, read it first and merge into it instead of starting over.696. Search or read only the requested channels.70- Prefer `slack_read_channel` when the channel list is known and bounded.71- Prefer `slack_search_public` when keyword filtering will substantially reduce noise.72- Use `slack_search_public_and_private` only when the user explicitly wants private coverage or has already consented.737. Keep only messages created within the computed window.748. Expand threads only for messages that look directly relevant to the topic or a requested category.759. Summarize the strongest items into the requested categories.76- If categories are provided, use them in the user-supplied order.77- If categories are omitted, infer a small set of useful headings from the messages.7810. Omit empty categories unless the user explicitly wants them shown.7911. When merging into an existing same-day report:80- de-duplicate entries by Slack permalink81- keep the existing section order when possible82- append genuinely new items into the correct category83- rewrite the `## Summary` section so it reflects the merged report, not just the newest delta84- preserve prior write history in the `## Update Log` section8512. Write a `## Summary` section near the top of the daily markdown report before the category sections.86- Always generate the summary via a dedicated `froge` subagent when `froge` is available in the current Codex session.87- Pass the merged report content to `froge` and request a short 2-4 sentence summary that is opinionated, technically informed, entertaining, and still genuinely useful.88- If `froge` is unavailable or fails, write a direct high-signal summary yourself in a normal voice and note that fallback in your run notes.89- When the summary references specific updates that already appear as headings lower in the file, prefer local Markdown anchor links to those headings.9013. If the user asked for a Google Doc, keep a cumulative doc with the newest report day prepended near the top using this exact outer structure:9192```md93# [Report title]94- [last updated time]9596## [today report]9798## [yesterday report]99```10010114. In the Google Doc, treat each dated section such as `## 2026-03-11 Report` as a daily block that contains that day's summary, categories, and items. Insert the newest day's block immediately after the title and last-updated line so the doc reads newest-to-oldest.10215. When updating an existing Google Doc:103- replace the single `- [last updated time]` line with the current run time104- replace that day’s existing `## [date] Report` block if it already exists, otherwise insert a new block at the top105- preserve older dated sections below it10616. Append a new `## Update Log` line at the end of the markdown daily file, for example `- 2026-02-27 11:10 PST: merged 4 new items from 2026-02-27 09:00 PST to 2026-02-27 11:10 PST`.10717. After the markdown report and optional Google Doc are successfully written, advance the watermark with `./scripts/report_state.py write`.108109## Categorization Rules110111- `announcements`: launches, milestones, invitations, trackers, POR changes, enablement notices112- `general feedback`: bugs, UX complaints, reliability issues, approval friction, connector mismatches113- `gmail feedback`: Gmail-specific auth, scope, send-email, write-action, or connector behavior114- `tips`: how-to advice, settings, workarounds, model overrides, recommended prompts115- `usecases`: real workflows, demos, success stories, examples of value116117If a message fits multiple categories, place it in the most decision-useful one and mention the overlap in the description when needed.118119## Output Template120121Use this Markdown shape for each dated report section:122123```md124## Summary125126[2-4 sentence summary of the current report]127128## [yyyy-mm-dd Report]129130## [category]131### [title]132- source: [Slack permalink](https://openai.slack.com/archives/...)133- time: [posted timestamp]134135[description]136```137138When the user asks for a Google Doc, the cumulative doc should start with:139140```md141# [Report title]142- [last updated time]143```144145End each markdown daily file with:146147```md148## Update Log149- 2026-02-27 10:54 PST: created report from 2026-02-26 10:54 PST to 2026-02-27 10:54 PST150```151152Descriptions should be short and concrete:153154- what happened155- why it matters for the topic156- key reply or resolution when a thread adds important context157158The summary should be short and decision-useful:159160- lead with the main takeaway from the full merged report161- use `froge` subagent output when available; otherwise use concise direct fallback text162- if it cites specific items below, link to them with local Markdown anchors when practical163164## Notes165166- Treat the report as incremental. Do not repeat items older than the stored watermark.167- If this is the first run, state that the scan window used the last 24 hours.168- Store the report in the daily file under `$DOCS_ROOT/report/[report-title]/`.169- Reuse the same file for same-day reruns and merge in new items instead of replacing the file.170- Recompute the summary after each same-day merge so it describes the whole file as it stands now.171- When a Google Doc is requested, always write the markdown daily file first, then sync the cumulative Google Doc from that merged result.172- Use the Google Docs tools to create or update the doc; do not create duplicate docs for the same report title once a URL has been persisted.173- When the requested channels are noisy, bias toward fewer high-signal entries instead of exhaustively listing every message.174- Preserve Slack permalinks for every item.175- Write `source` values as explicit Markdown links, not bare URLs. This preserves clickability in downstream conversions such as Markdown -> HTML -> Google Docs, where plain URLs may not be auto-linked.176- When descriptions mention additional URLs that should stay clickable, prefer explicit Markdown links there too.