Skip to content

[#26] Add the report skill and the communication rule - #31

Merged
sabind merged 1 commit into
mainfrom
review-agent-communicatio-fc5a29f8
Oct 16, 2026
Merged

sabind merged 1 commit into
mainfrom
review-agent-communicatio-fc5a29f8

Conversation

@sabind

@sabind sabind commented Oct 16, 2026

Copy link
Copy Markdown
Contributor

Why

Closes #26

Every message the agent writes to the author, in any skill or none, should be written for a reader who did not watch the work. Eight sessions between 2026-10-06 and 2026-10-15 showed the author asking the agent to decode its own previous message once in every fifteen turns: labels coined during the work in place of explanations, decisions asked for without the material to decide them, failures listed under what was done, tool calls narrated. The only fix so far was a personal memory file that reaches no teammate, sub-agent or eval run.

What

A new report skill writes the message to the author in one of four shapes, handback, decision, status or answer, each from a template that a repository can replace under .freethinking/report/, and edits nothing. A new communication rule names the habits in every session and sub-agent and routes hand-backs, decisions, status and answers to the skill. implement-spec, bugfix and start-task hand off to the skill instead of carrying their own report wording.

Changes

  • Add skills/report/ with SKILL.md, four templates and checks/test_report_skill.py. The report skill helps us have consistent output without overloading rules or the context window until needed. It does not cover how information is collected: it relies on the thread it forks from to have done the aggregation first.
  • Add rules/communication.md, trim the "bad news first" bullet out of rules/collaboration.md and its README row, and give checks/test_rules_size.py a per-rule limit table. The communication rule guides how to give the user information so that it is not hard to interpret and does not rely on context the user cannot see, such as internal names the agents came up with on their own; the collaboration rule is trimmed to account for this. The rules guide the what, not the how.
  • Replace the hand-back wording in skills/implement-spec/SKILL.md, skills/bugfix/SKILL.md and skills/start-task/SKILL.md with an invocation of the report skill; implement-spec runs it in a foreground fork of the conversation and pastes the result, with an inline fallback when there is no fork. The pr skill is left out because it does not report, since it has no agents in the same sense. A report is about the best way to communicate something and the functional skill simply chooses that; since it is a fork it does not need to be given context and can generate independently.
  • Update README.md (rows for the skill and the rule, the agent protocol paragraph, the "Tune the plugin for a repository" section), .github/CONTRIBUTING.md, the four issue forms, agents/task-executor.md (quotes are copied exactly) and bump the version to 0.9.0. Documentation.
  • Add four rule cases under evals/rules/communication/, three skill cases under evals/skills/report/, graders and a no-fork line to works-one-wave and works-all-waves, two Makefile targets, and fix a path in evals/README.md. These are tests for the prior changes.
  • Add .claude/specs/report-skill/ with every task ticked. These are the thinking done on the incoming ticket and the plan used to solve it.

Testing

make validate passes: 19 unit tests and both plugin validations.

Evals, run on 2026-10-16 at list price. The rule cases ran with the no-plugin baseline:

Case With W/out Δ Runs Cost
check-not-run 1.00 1.00 0.00 4 $0.60
failing-check-first 1.00 1.00 0.00 4 $0.51
incidental-failure-first 1.00 1.00 0.00 4 $0.52
incidental-not-run-first 1.00 1.00 0.00 4 $0.57
Case Score Runs Cost
decision-lists-options 1.00 2 + 1 $0.50
invoked-for-handback 1.00 2 + 1 $0.56
rewrites-dense-message 1.00 3 + 1 $0.73
works-one-wave 1.00 2 + 1 + 1 $2.38
works-all-waves 1.00 2 $2.11
contained-change-offers-executor 1.00 2 $0.28

The "+ 1" runs confirmed the skill cases and works-one-wave after the final compaction of the skill, the rule and implement-spec's step 6.

A throwaway probe plugin, run three times, showed that the headless eval sandbox has no fork agent type ("Agent type 'fork' not found"), so the evals exercise implement-spec's inline fallback; the fork path was exercised by hand in a live session, where the report skill was also invoked three times with no override, a two-section override under .freethinking/report/handback.md, and an empty override, and behaved as the skill text says.

Risk and rollout

Minor: the change improves details of the skills without changing them fundamentally. The version is 0.9.0, a minor bump for a new skill and a new rule; teammates pick it up with claude plugin update freethinking@freethinkingit. The new rule adds about 1,400 characters to what the hooks load into every session and sub-agent; the total is 7,353 of the 10,000 allowed.

Notes for reviewers

  • Look at the skill and the templates for whether they are too pedantic or need more information, at the three skills' hand-offs for consistency with each other, at the rules for overlapping or conflicting bullets, and at the eval cases for edge cases they miss.
  • The four rule cases score 1.00 with and without the plugin. In a fresh session with one small task the model leads with the failure either way, even when the failure is beside the point of the request; the burying in the transcripts happened under volume. These cases guard the rule's wording against regression; the hand-back shape itself is proved by the skill cases and the two implement-spec cases, which exist only with the plugin.
  • Requirement 5.5 of the spec is unmet for bugfix on this branch: it has no "Working with the author" block, which issue bugfix skill: add a CX block #17's branch adds. Whichever merges second must add one clause so that block's Hand-backs bullet names report.
  • Deferred to a spike once the rule has run for a few sessions: a force-for-plugin output style and a SubagentStop hook that rejects a malformed Summary. Also a follow-up: the start-task spec templates and the pr default template are candidates to move under .freethinking/.
  • Grader patterns are JavaScript regexes: ^ and $ without the m flag are the string anchors, and \A, \z and (?s) are not available; the review caught five Python forms before any run.

🤖 Generated with Claude Code

A report skill writes the message to the author in one of four shapes,
each from a template a repository can replace, and edits nothing. A
communication rule names the habits in every session and routes
hand-backs, decisions, status and answers to the skill. implement-spec,
bugfix and start-task hand off to it; implement-spec runs it in a fork
of the conversation so the orchestrator stays lean. Evals, checks, the
README and the spec record the change. Closes #26.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@sabind
sabind merged commit 8668387 into main Oct 16, 2026
1 check passed
@sabind
sabind deleted the review-agent-communicatio-fc5a29f8 branch October 16, 2026 20:15
sabind pushed a commit that referenced this pull request Oct 16, 2026
…eport skill

Takes PR #31 (report skill, communication rule) and PR #25 into the branch.
Step 7 of the bugfix skill now invokes freethinking:report in handback mode
and puts its Message to the author as the hand-off question's text; the three
exits stay. The collaboration rule keeps the new bullet where "Bad news first"
was. Version 0.10.0 on top of 0.9.0. The hands-off-to-pr case gains graders
on the report call and its Message.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
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.

report skill and communication rule: write every message for a reader who did not watch the work

2 participants