Files
FabledScribe/tests/test_reporting_back_skill.py
T
bvandeusenandClaude Opus 5 b4dbc495fe
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 16s
CI & Build / integration (push) Successful in 52s
CI & Build / TypeScript typecheck (push) Successful in 54s
CI & Build / Python tests (push) Successful in 1m36s
CI & Build / Build & push image (push) Successful in 14s
feat(409): the reporting-back skill shapes the reply the operator reads (#4011)
Step 2 of milestone 409 "Response shapes". A reply written in the order the
work happened is accurate and still unreadable to someone who was not there.
The new bundled skill shapes it around where the work stands.

- Fires when an agent is about to report completion, hand off, ask the
  operator something, answer "where are we", or propose an approach.
- Every reply: conclusion first, one topic per section, visible priority,
  the ask in bold at the end, plain words, the work placed in Scribe.
- Placement is taken from the placement block step 1 returns (#4010), not
  recalled; untracked work is said to be untracked.
- Four families of shapes: Reports, Asks, Answers, Proposals, with the
  completion report written out in full.
- Domain-neutral: the worked example is a backup job, evidence is "what you
  could open to check it". Written as practices, and naming no instance rule.
- A structural guard pins the completion sections, the from-the-record
  placement, and the absence of software-only vocabulary.

Listed in the plugin README and manifest description; version minted.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-14 10:06:45 -04:00

56 lines
2.2 KiB
Python

"""The reporting-back skill keeps its shape (milestone 409 step 2).
WHY THIS EXISTS
The skill is what turns a reply written in the order the work happened into
one the operator can read: where the work sits, what changed, what needs
them, what is next. Its value is in its SECTIONS, and a later tidy-up that
folds them into prose would leave a skill that still loads and no longer
shapes anything.
WHAT THIS PINS, AND WHAT IT DOES NOT
Structure, never wording — the same reason test_create_tools_disambiguate
gives: a test that punishes rewriting gets deleted. It pins that the
completion report keeps its five sections, that placement is taken from the
record rather than recalled, and that the shipped shapes stay domain-neutral.
Whether the guidance is any good is milestone 409's last step, read against
real replies, not something a test can see.
"""
import pathlib
import re
SKILL = pathlib.Path(__file__).resolve().parents[1] / "plugin/skills/reporting-back/SKILL.md"
def _text() -> str:
return " ".join(SKILL.read_text().split())
def test_the_skill_names_itself_as_its_directory():
front = re.search(r"^---\s*\nname:\s*(\S+)", SKILL.read_text())
assert front and front.group(1) == "reporting-back"
def test_the_completion_report_keeps_its_sections():
text = _text()
for section in ("Where this sits", "What now works", "How / why", "Needs you", "Next"):
assert section in text, f"the completion report lost its {section!r} section"
def test_placement_comes_from_the_record():
"""The failure this milestone started from: a placement written from memory
reads exactly like a real one when it is wrong."""
text = _text().lower()
assert "placement" in text and "take the placement from the record" in text
def test_the_shipped_shapes_assume_no_particular_domain():
"""Scribe is domain-neutral: a home-infrastructure or writing project reads
these too. Software-specific evidence belongs in an operator's own
preferences, never in the product default."""
text = _text()
dev_only = [w for w in (r"\bCI\b", r"\bcommit", r"\bpull request", r"file:line", r"\bpytest\b")
if re.search(w, text, re.IGNORECASE)]
assert not dev_only, f"software-only vocabulary in a product-wide shape: {dev_only}"