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>
56 lines
2.2 KiB
Python
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}"
|