diff --git a/plugin/.claude-plugin/plugin.json b/plugin/.claude-plugin/plugin.json index 2f7a1d99..11304b23 100644 --- a/plugin/.claude-plugin/plugin.json +++ b/plugin/.claude-plugin/plugin.json @@ -1,7 +1,7 @@ { "name": "scribe", "description": "Scribe for Claude Code: connects the scribe MCP server, adds the hooks that deliver live project state and relevant records at the right moment, ships the shared client-neutral Scribe skills (using-scribe, writing-plans, reporting-back, systematic-debugging, verification, brainstorming, reusing-code, shape-accounting, family-canon), and syncs your saved Scribe Processes as skills (/scribe:sync).", - "version": "2026.10.06.1827", + "version": "2026.10.09.1835", "author": { "name": "Bryan Van Deusen" }, diff --git a/plugin/skills/reporting-back/SKILL.md b/plugin/skills/reporting-back/SKILL.md index 7dbe9eb2..2cd2ba8a 100644 --- a/plugin/skills/reporting-back/SKILL.md +++ b/plugin/skills/reporting-back/SKILL.md @@ -111,8 +111,11 @@ default differ, the preference is what they asked for. ## You are the judge You are the judge of record for the work itself: what a shape is, whether a -finding holds, whether a record is right, whether something is done. The -operator reads the decision — they do not make it. +finding holds, whether a record is right, whether something is done — the +questions only you can see the evidence for. Decide them, and report what you +decided and why so the operator can overrule it. **Direction is theirs:** what +matters most, what the thing should be, a trade-off only they can price, +anything they will live with afterwards. **A finding surfaced and not judged is a finding dropped, not deferred.** This is the failure that hides inside a good report: the symptom named, the cause @@ -125,11 +128,12 @@ So: decide, act, and report what you decided and why. If the evidence is genuinely balanced, say which way you went and what would change your mind — that is still a decision. -**What DOES go to them**, and the distinction is the act, not the difficulty: -spending their money, reaching their infrastructure, merging to a protected -branch, anything hard to reverse or facing outward — the **Handoff** and -**Approval** shapes below. Judging a record is never one of these. A hard call -is still yours; an irreversible act is still theirs. +**What DOES go to them** is direction, and every act that is hard to reverse +or faces outward: spending their money, reaching their infrastructure, merging +to a protected branch — the **Decision**, **Handoff** and **Approval** shapes +below. The test is who can see the evidence, not how hard the call is: a hard +question of fact is still yours, and an easy question of direction is still +theirs. **Judging is attended, not automatic.** You judge by reading the evidence and recording why. A threshold, a sweep or a rule that reclassifies in bulk with diff --git a/src/scribe/services/reply_shapes.py b/src/scribe/services/reply_shapes.py index 4e2df4c9..4d231702 100644 --- a/src/scribe/services/reply_shapes.py +++ b/src/scribe/services/reply_shapes.py @@ -72,13 +72,15 @@ class ReplyShape: CORE_KEY = "core" # ~550 tokens at four characters a token. The core is paid for in every -# session, so this is the ceiling the test holds it to — not a target. It -# shipped at ~1,800, leaving room for the one-line judgement (milestone 500 -# step 2) and little else. +# session, so this is the ceiling the test holds it to — not a target. It sits +# at ~2,050 with the judgement line (milestone 500 step 2): close to full, so a +# sentence added now has to replace one. CORE_BUDGET_CHARS = 2200 # A slice is paid for only at its moment, and once per session; it can afford # more than the core and still has to stay a slice, not the old skill again. -SLICE_BUDGET_CHARS = 1400 +# The asks slice is the largest (~1,530) because it carries who decides what in +# full: handing a question back is what an ask is tempted to do. +SLICE_BUDGET_CHARS = 1600 _CORE = """\ @@ -96,6 +98,9 @@ record rather than recalled. Work with no record behind it says so. - **Answer the standing questions, even with "nothing"**: does anything need them, and \ what happens next. A section that explains earns its place only when it changes what \ they do or decide; the rest belongs in the record's log. +- **Decide what only you can see; ask about direction.** Whether a finding holds, what a \ +measurement says, whether the work is done: settle it, act, and say why so they can \ +overrule it. Priorities, choices they will live with, and anything hard to undo are theirs. - **A decision they have made is the input to the work.** Act on it; reopen it only \ for new evidence, said once. - **Holding an action until they say yes?** Put it near the top, under "Approval requested". @@ -143,9 +148,17 @@ them · how it is undone. - **Conflict** (what you are about to do clashes with a rule, a plan or an earlier \ decision) — what it says · what you were about to do · where they clash · A or B? -Before asking, check whether you can find the answer yourself: something you can read \ -or measure is a fact to check, not a question to send. When an option rests on existing \ -behaviour, say whose call that was — theirs (cite it) or a past session's nobody confirmed.""" +**Who decides what.** You decide what only you can see the evidence for: whether a \ +finding holds, what a measurement says, whether a record is right, whether the work is \ +done, and anything you can settle by reading or measuring. Decide, act, and say why, so \ +they can overrule it; "your call" on one of these hands them a question they cannot see \ +into. Evenly balanced evidence is still yours — say which way you went and what would \ +change your mind. They decide direction: what matters most, what the thing should be, a \ +trade-off only they can price, anything they will live with afterwards — and every act \ +that is hard to undo or reaches outside the work. + +When an option rests on existing behaviour, say whose call that was — theirs (cite it) \ +or a past session's nobody confirmed.""" _PLAN = """\ diff --git a/tests/test_reply_shapes.py b/tests/test_reply_shapes.py index 0351e4b4..60267384 100644 --- a/tests/test_reply_shapes.py +++ b/tests/test_reply_shapes.py @@ -78,6 +78,17 @@ def test_the_core_carries_the_length_discipline(): assert "what can go" in text +def test_who_decides_what_rides_every_reply_and_every_ask(): + """The operator's line (milestone 500 step 2): the agent settles what + only it can see, the operator decides direction. A one-liner every turn, + in full where a question is about to be handed back.""" + core = reply_shapes.core().text.lower() + asks = reply_shapes.SHAPES["asks"].text.lower() + assert "decide what only you can see" in core and "direction" in core + assert "who decides what" in asks + assert "decide direction" in asks and "hard to undo" in asks + + def test_the_core_is_not_a_slice(): """It rides every turn, whatever moment the turn reaches — so a moment lookup never hands it out a second time."""