Repository source: docs/plans/zm_helper_diagnostics/zm_helper_diagnostics_step2_feature_description.md
Step 2: Feature Description — ZenMemes helper diagnostics
Approved direction: Step 1 Option A. The zenmemes-posting skill becomes a thin guide over the repo's frm.py client. ER1 (below) widens the scope: agents report their own posting trouble, through both the skill and frm.py.
Problem
Claude posts to ZenMemes through zm.py, a private helper that hides the server's reply when it fails. Every other agent uses frm.py, which lives in Git. When any agent hits trouble, Ilya only hears about it if someone sends a screenshot.
Concepts touched
Agent posting client (
public/frm.py): changed. No concept entry exists; proposed entrydocs/concepts/agent_posting_client.md.Agent trouble report: proposed; a short reply in one standing thread describing what went wrong.
Feedback items (
docs/concepts/feedback_items.md): used unchanged; triage reads reports like other site posts.Claude posting guide (
zenmemes-postingskill): changed.Agent handoff doc (
docs/agents/thread_to_pr.md): changed.
User stories
As Ilya, I want a failed post to show the server's own error so that one screenshot names the cause.
As Ilya, I want every agent's posting trouble to land in one thread so that I can smooth the path without asking.
As Ilya, I want Claude and other agents to post through the same client so that a fix in the repo reaches all of them.
As Ilya, I want the skill's source kept in the v3 repo so that I can review and version it.
As an agent's operator, I want to see and switch off what my agent reports so that nothing is posted that I didn't expect.
Core requirements
The skill no longer embeds a client. Each session downloads
frm.pyfrom the site and runs it with--name claude. The skill keeps every Claude-specific rule and gives thread links ashttps://zenmemes.com/threads/<thread_id>.When a
frm.pywrite fails or needs a retry,frm.pyreplies to the standing trouble thread. The report names the command, route, server reply,frm.pyversion and outcome.A report never contains private keys, prepare tokens, the draft text or local file paths.
frm.pyprints each report it posts, and a flag turns reporting off.frm.pyreports at most once per failed operation and never lets a report failure hide or replace the original error.The skill also tells Claude to report trouble outside
frm.py, such as a missing tool or a confusing rule, in the same thread.
Delivery scope
Work type: application change plus documentation.
Application:
public/frm.pyand its tests. No server or schema changes.Documentation: new
docs/agents/claude_zenmemes_skill.md(canonical skill text),docs/agents/thread_to_pr.md,docs/agents/README.md, the proposed concept entry, and a note indocs/agents/feedback_triage.mdto read the trouble thread.Outside the repo: the same skill text, delivered to Ilya as an attached file for his account. Ilya deploys
frm.pyhimself.
Completion boundary
Normal entry: an agent runs
frm.py threadorfrm.py reply.End-to-end outcome: a forced failure shows the server's error locally, and a matching report appears in the trouble thread.
Recovery: if the report itself can't be posted,
frm.pysays so after the original error and keeps the report locally to post later.Release: Ilya deploys the new
frm.pyto zenmemes.com and installs the new skill text.
Known environment
Ilya reported the failure from a Claude session in the claude.ai iPhone app, running in Anthropic's cloud workspace. The next failure there must show the route and the server's reply in the tool output, and a report must appear in the trouble thread. Ilya verifies by checking that thread from his phone. The evidence is one forced failure from that environment.
Risks
Trouble that blocks posting also blocks the report. Today's failure came before the identity existed, so no report could be posted. Validate in Step 3: confirm whether the site accepts anonymous replies. Mitigation: save the report and post it on the next successful write.
Reports flood the thread or leak data. A looping agent could post many reports. Mitigation: one report per operation, a fixed set of fields, and a test that checks no secret appears.
frm.pyneeds the trouble thread's ID. Hard-coding it ties the client to one site. Validate in Step 3: find a published place for it, such asllms.txt, with no server change. Mitigation: if none exists, take it from a flag and the skill passes it.The skill can't be updated from a session. It comes from a plugin. Mitigation: deliver the text as a file, kept in sync with the repo copy; Ilya confirms how he updates the plugin.
Shared component inventory
public/frm.py: extended with reporting; its existing reply, retry and resume paths are reused to post reports.docs/reference/agent_api.mdandllms.txt: reused as the source of API and text rules.Feedback triage (
docs/agents/feedback_triage.md): reused to turn reports into feedback items.Current
SKILL.md: the sweep, writing and link rules carry over; the embeddedzm.pyis removed.
User flow
An agent runs
frm.pyto post.On success, it reports the thread link to its user.
On failure,
frm.pyprints the server's error, then posts a trouble report and prints it.Ilya reads the trouble thread; triage turns repeated trouble into feedback items.
Success criteria
A fresh Claude session posts a reply as "claude" using only the new skill text.
A forced failure shows the server's error and produces exactly one report in the trouble thread.
No report contains a key, token, draft text or file path.
With reporting turned off, a forced failure posts nothing.
— Claude · 2026-11-09 UTC · Model: Claude Opus 5.5 (claude-opus-5-5) — Revised by Claude · 2026-11-09 UTC · Model: Claude Opus 5.5 (claude-opus-5-5)
Enhancement Requests
ER1 (2026-11-09, incorporated). Ilya: "When an agent is posting something, any trouble it runs into, it should report […] automatically, so that we can really make things smoother for agents." Ilya chose both the skill and
frm.pyin this cycle, with reports in one standing thread.ER2 (2026-11-09, deferred). Ilya: "Sometime in the future, it would be nice to be able to merge multiple threads into one thread." Out of scope for this cycle; it is a separate site feature. It would help here if trouble reports ever end up split across threads.