feat(500): reporting-back becomes the long-form reference behind the delivered shapes
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Successful in 15s
CI & Build / TypeScript typecheck (push) Successful in 57s
CI & Build / integration (push) Successful in 1m17s
CI & Build / Python tests (push) Successful in 1m59s
CI & Build / Build & push image (push) Successful in 23s

The reply shapes are server product now, delivered at their moments, so the
skill stops restating them. Gone from it: the "Every reply" list, the
per-kind tables, and "The operator's own shapes come first" (preferences
arrive beside the shape on the same moments). It opens by saying where the
shapes come from (list_reply_shapes, the delivered core's header) and keeps
the reasoning: sections chosen not filled, a settled decision acted on,
placement from the record, who decides what, the assumptions an option
carries, the completion report worked in full, and the second pass. 13.5k to
10.7k characters.

The core gains the Finding kind the skill's table carried (2,150 of 2,200).
Tests follow the content: the kind and Approval-row pins move to the shapes,
a new test holds the worked example and the completion shape to the same
sections, and the guidance-ownership registry reads the delivered shapes as a
surface, owning the preference-wins and length topics there. using-scribe
points at the delivery and list_reply_shapes. #5496.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-09 15:55:02 -04:00
co-authored by Claude Opus 5.5
parent f68b73f922
commit b00dc7c4c2
8 changed files with 107 additions and 100 deletions
+20 -3
View File
@@ -71,6 +71,14 @@ def _live_session_context_source() -> str:
return src[start:start + 1 + nxt.start()] if nxt else src[start:]
def _delivered_shapes() -> str:
"""Every reply shape as a session receives it in full. Rendered rather than
read as source: the header a shape arrives under is guidance too."""
from scribe.services import reply_shapes
return "\n\n".join(reply_shapes.render(s, full=True) for s in reply_shapes.SHAPES.values())
def delivered_surfaces() -> dict[str, str]:
"""Every surface a session receives as guidance, by label.
@@ -81,6 +89,8 @@ def delivered_surfaces() -> dict[str, str]:
- `static` — the Claude Code adapter's static session context
- `commands` — the Claude Code adapter's slash commands
- `live` — the live session context the server builds
- `shapes` — the reply shapes the server delivers at their moments,
in the full form a session first sees (milestone 500)
"""
server = (ROOT / "src/scribe/mcp/server.py").read_text()
match = re.search(r'_INSTRUCTIONS = """(.*?)"""', server, re.S)
@@ -91,6 +101,7 @@ def delivered_surfaces() -> dict[str, str]:
"static": (ROOT / "plugin/hooks/scribe_static_context.md").read_text(),
"commands": "".join(p.read_text() for p in sorted((ROOT / "plugin/commands").glob("*.md"))),
"live": _live_session_context_source(),
"shapes": _delivered_shapes(),
}
# A skill is SKILL.md plus the reference files it links (#4398): one
# owner, however many files it is split across.
@@ -243,9 +254,15 @@ TOPICS: tuple[Topic, ...] = (
"you are the one who knows what the code you just wrote is"),
Topic("report back where the work stands", "skill:reporting-back", ("reporting-back", "placement"),
"take the placement from the record"),
Topic("the operator's own reply shapes come first", "skill:reporting-back",
("reply_preferences", 'content_type="rule"'),
"the operator's own shapes come first"),
# Milestone 500: the default shapes are server product, delivered at their
# moments with the operator's preferences mounted beside them — so the
# rule that a preference wins is stated where the shape arrives.
Topic("a preference beside a delivered shape is what the operator asked for", "shapes",
("preference", "reply shape"),
"where an operator preference shown beside it differs"),
Topic("every reply leads with its conclusion and stays short", "shapes",
("conclusion first", "the shortest reply that carries the answer", "what can go"),
"length is work handed back to the reader"),
# Milestone 409 step 7: the sections were being FILLED rather than chosen,
# so a reply could satisfy every heading and still be unreadable. These
# three are the discipline around the scaffold, not the scaffold itself.