v0.4.1
Four fixes from a field A/B: the same 11-step scenario driven through the 0.2.0 CLI and the 0.4.0 MCP server. The data agreed — an FTS query byte-identical, forwards and reactions equal to the unit — so every fix here is about what a summary says, which is the only channel an agent reads.
The heading says which channel again
# Group summary: fastnewsdev is @fastnewsdev once more. The @ is stripped for identity — @chan and chan are one channel, and the database filename comes off the stripped form — but a heading is display, so it gets the sigil back. Five headings had lost it.
Only username-shaped labels are touched: a group title, an invite link and a numeric id are left as they are.
A join count now says where it came from
- Joins: 20 (added 20) | Leaves: 2 (self 2) used to render identically whether or not the admin log could be read, and the two mean different things. Without admin rights the numbers come from service messages alone — which Telegram suppresses during a join burst, i.e. exactly when a CTA post is working — so they are a floor, not a total.
The summary now states its source on the line carrying the numbers, and says outright when the counts are a floor.
Ranking by a rate has a rule
Two runs of one question can pick different second places, because each row was measured whenever its post was last scraped and a staler row is the smaller one. references/analysis.md now says to refresh a window before ranking it by a rate.
Server startup is quiet
pydantic-settings warned about the MCP SDK's own Settings model on every start, into the stderr the server's own logs share. Resolved at the boundary; startup writes nothing before its first log line.
Also: the agent-facing docs lost the half a lookup already answers — CLAUDE.md 461 lines → 175, README.md 157 → 115 — keeping the rules, pins and gotchas that no tool confesses.
Upgrading from 0.4.0 needs nothing beyond the install: uv tool install --force slop-writer, then slop-writer install to refresh the skill.