Add Consumer Loop State Reporting

Base directory for this skill: /Users/nodo/.claude/skills/progress
Daily #progress update
Builds the daily update for #progress (C09MB3TPBFF, entireio.slack.com) from evidence,
in Andrea's voice, and stops for review.
Hard rule: never post. Never call slack_send_message or slack_schedule_message for
this channel. The only write allowed is slack_send_message_draft, and only after the user
has seen the text and said yes. A draft lands in Slack's Drafts & Sent where they edit and
send it themselves.
1. Pick the window
Find the last update Andrea posted in the channel:
Ignore short replies and thread messages, look for the last real bulleted update. The window
runs from that message to now. If there's a multi-day gap (weekend, OOO), cover the gap and
lead with - Catch-up, which is what he does.
Times are Europe/Rome. Get "now" from the shell (date), never assume.
2. Gather evidence
Run these together, they're independent.
Trails (the primary source, most bullets link one). Repos live in /Users/nodo/work/entire/*.
For each repo with a .git:
Keep trails whose created_at/updated_at/merged_at fall in the window. Useful fields:
url, title, status (draft/open/merged/closed), phase, branch.
Commits, which catch work with no trail and unpushed work:
--all matters: trail work sits on branches, so plain git log (HEAD only) misses it.
Cross-repo backstop, covering repos not cloned locally and pushes from elsewhere:
get_entire_my_activity(scope="commits", since=..., until=...) on entire-prod-us.
This returns full commit bodies and is very verbose. Read repo_full_name and
commit_subject, skip the rest. commit_message is null for native repos, local git
fills those in.
Linear, which gives each item its ticket ID and title:
(-P3D or wider for a catch-up. Note: identifier is not a valid field, the ID comes back
as id.)
Incidents / firefighting: incident_list(assigned_to=["me"], created_after=..., include=["summary"]).
Also worth a look: alerts he chased in #alerts-production (C0B1Y3Y6PFD).
His own words elsewhere. He often links a thread he wrote in another channel rather than re-explaining:
Grab permalinks for substantial design or decision messages. Skip chit-chat.
3. Write it
Read style.md in this skill directory before writing. It has the rules and real examples.
Two rules matter most: no em dashes, and be concise.
Group the evidence into 2 to 6 themes, not a flat dump of every commit. Twelve commits refactoring one thing is one bullet with the theme as the headline. Judge by what a reader cares about, not by diff size.
State what changed and why it mattered, not what you touched. "Fixed a tricky bug when a github mirror changes ownership" beats "updated mirror teardown logic".
Every claim needs evidence from step 2 behind it. Don't infer that something shipped because a
trail exists, check status. Don't invent ticket IDs. If a trail is still open, say in
progress or put it under In progress. Leave out anything you can only guess at. A shorter
honest update is the right outcome on a quiet day.
4. Review, then draft
Save it to /Users/nodo/work/entire/progress/<YYYY-MM-DD>.md, one file per update. That also
builds a local archive of past posts to check tone against.
Show the full text in the terminal and ask whether to create the Slack draft. Offer that it's easy to adjust: wrong emphasis, a missing meeting, something that shouldn't be public.
Only when they approve:
Then tell them it's waiting in Drafts & Sent in #progress, unsent.
If it returns draft_already_exists, say so. Slack allows one draft per channel, so they need
to send or delete the existing one first. Don't work around it by posting.
Notes
- Slack user ID:
U0AJ0FHDXFW. Channel:C09MB3TPBFF. - Meetings, reviews, design discussions and OOO notices count as progress. Engineering output is most of it, but a day of unblocking others is worth saying.
- If the day genuinely produced little, a one-liner is fine and in character
(
- Working on making NATS more robust :thinkies:).