feat(409): the reporting-back skill shapes the reply the operator reads (#4011)
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
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
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>
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
"""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}"
|
||||
Reference in New Issue
Block a user