A rule proposal has five answers, and three of them route #168

Merged
bvandeusen merged 2 commits from dev into main 2026-09-19 13:34:51 -04:00
Owner

Step 6 of milestone 385 (lessons) and milestone 399 (preferences), written in one pass because #3896 asked for it: two people each adding one branch to a three-way distinction produce a list that does not read as a set.

The routing problem

create_rule's proposal gate (#3557) tells callers to propose readily — correctly; noticing that something has hardened into a standing instruction is valuable work. But it closed with three answers (approve / discuss / no), so every noticed thing that was not a rule landed on "no".

It now opens by asking what happens if someone doesn't do this?

  • something breaks, or a boundary is crossed → a rule, the operator's to agree to
  • it gets done a way the operator didn't want → a preference, recorded without a loop
  • they lose time rediscovering it → a lesson, binding nobody

and closes with five answers instead of three. The middle three are named as first-class outcomes, not places a proposal lands when it fails: a proposal that turns out to be a lesson has been routed, not dropped.

Stated as a practice, not a prohibition (rule 165). #3557's first cut opened "NOT YOURS TO CALL UNPROMPTED" and cost the noticing; nothing here tells a caller to propose less.

Every door says the same thing

create_note gained the preference and lesson branches — its existing rule test ("a mistake, not merely uninformed") turned out to name the lesson exactly. create_lesson names the fifth kind. create_project_rule cites the loop rather than repeating it, so its citation now names the kind question and all five answers.

One owner per topic (#4027)

The force axis is stated in full on using-scribe: all three strengths, the sorting question, that updating a preference mid-work is the normal case, and that preferences shape how work is done and never what gets recorded. _INSTRUCTIONS carries the pointer only — "Rules bind; preferences guide and you keep them current; lessons inform."

That clause cost 41 characters against 14 of headroom (INSTRUCTIONS_BUDGET = 2000, #2562), paid for by trimming atmosphere from three other lines. 1998/2000.

Guards

  • test_rule_creation_asks_first — the preference branch, the lesson branch and the force question, on both rule surfaces. Structure, not wording: each is a family of synonyms.
  • test_guidance_ownership — the three-way force axis (owner using-scribe, shared with the docstrings for the moment a proposal is actually written) and the preference-scope topic.
  • test_instruction_surfaces_agree — a new guard that the index names all three strengths and who keeps the middle one current. Its can-fail case is the omission that actually happens: a kind added to the product while the index still describes the corpus that came before it.

1837 passed — 1829 → 1837 is exactly the eight tests added.

Also here

Plugin minted 2026.09.19.1614. The guidance is plugin content, so without the manifest bump it would reach the repo and stop there (#2209) — CI caught that on the first push.

Tasks #3733 and #3896, work-logs 3545 and 3547. CI green on 1ade956 (run 7053).

🤖 Generated with Claude Code

https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy

Step 6 of milestone 385 (lessons) and milestone 399 (preferences), written in one pass because #3896 asked for it: two people each adding one branch to a three-way distinction produce a list that does not read as a set. ## The routing problem `create_rule`'s proposal gate (#3557) tells callers to propose readily — correctly; noticing that something has hardened into a standing instruction is valuable work. But it closed with three answers (approve / discuss / no), so every noticed thing that was not a rule landed on "no". It now opens by asking **what happens if someone doesn't do this?** - *something breaks, or a boundary is crossed* → a **rule**, the operator's to agree to - *it gets done a way the operator didn't want* → a **preference**, recorded without a loop - *they lose time rediscovering it* → a **lesson**, binding nobody and closes with five answers instead of three. The middle three are named as first-class outcomes, not places a proposal lands when it fails: a proposal that turns out to be a lesson has been routed, not dropped. Stated as a practice, not a prohibition (rule 165). #3557's first cut opened "NOT YOURS TO CALL UNPROMPTED" and cost the *noticing*; nothing here tells a caller to propose less. ## Every door says the same thing `create_note` gained the preference and lesson branches — its existing rule test ("a mistake, not merely uninformed") turned out to name the lesson exactly. `create_lesson` names the fifth kind. `create_project_rule` cites the loop rather than repeating it, so its citation now names the kind question and all five answers. ## One owner per topic (#4027) The force axis is stated in full on `using-scribe`: all three strengths, the sorting question, that updating a preference mid-work is the normal case, and that preferences shape how work is done and never what gets recorded. `_INSTRUCTIONS` carries the pointer only — *"Rules bind; preferences guide and you keep them current; lessons inform."* That clause cost 41 characters against 14 of headroom (`INSTRUCTIONS_BUDGET = 2000`, #2562), paid for by trimming atmosphere from three other lines. **1998/2000.** ## Guards - `test_rule_creation_asks_first` — the preference branch, the lesson branch and the force question, on both rule surfaces. Structure, not wording: each is a family of synonyms. - `test_guidance_ownership` — the three-way force axis (owner `using-scribe`, shared with the docstrings for the moment a proposal is actually written) and the preference-scope topic. - `test_instruction_surfaces_agree` — a new guard that the index names all three strengths and who keeps the middle one current. Its can-fail case is the omission that actually happens: a kind added to the product while the index still describes the corpus that came before it. `1837 passed` — 1829 → 1837 is exactly the eight tests added. ## Also here Plugin minted **2026.09.19.1614**. The guidance is plugin content, so without the manifest bump it would reach the repo and stop there (#2209) — CI caught that on the first push. Tasks #3733 and #3896, work-logs 3545 and 3547. CI green on `1ade956` (run 7053). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy
bvandeusen added 2 commits 2026-09-19 13:34:47 -04:00
feat(instructions): a rule proposal has five answers, and three of them route (#3733, #3896)
CI & Build / Python lint (push) Successful in 3s
CI & Build / Plugin hooks (push) Failing after 10s
CI & Build / integration (push) Successful in 51s
CI & Build / TypeScript typecheck (push) Successful in 55s
CI & Build / Python tests (push) Successful in 1m31s
CI & Build / Build & push image (push) Successful in 24s
0ed8e86cd5
Step 6 of both milestone 385 (lessons) and 399 (preferences). #3896 asked for
the fourth and fifth answers in one pass, because two people each adding one
branch to a three-way distinction produce a list that does not read as a set.

create_rule now opens by asking what kind of thing is being held, with one
question that sorts it — what happens if someone doesn't do this? Something
breaks, a boundary is crossed: a rule. It gets done a way the operator didn't
want: a preference. They lose time rediscovering it: a lesson. The closing
question grew the two matching answers, and they are named as first-class
outcomes rather than places a proposal lands when it fails. An observation
that turns out to be a lesson has been routed, not dropped.

Stated as a practice, not a prohibition (rule 165). #3557's first cut opened
"NOT YOURS TO CALL UNPROMPTED" and cost the noticing; the wanted behaviour
here is still more proposals, and what changes is only which door they go
through.

create_note says the same from its side, so routing does not depend on having
opened create_rule first — and its existing rule test ("a mistake, not merely
uninformed") turned out to name the lesson exactly. create_lesson names the
fifth kind so the set is complete from every door. create_project_rule's
citation of the loop names five answers, since it cites rather than repeats.

The force axis has one owner (decision #4027): using-scribe states all three
strengths, the sorting question, that updating a preference mid-work is the
normal case, and that preferences shape how work is done and never what gets
recorded. _INSTRUCTIONS carries the pointer — "Rules bind; preferences guide
and you keep them current; lessons inform." It had 14 characters of headroom,
so the clause is paid for by trimming atmosphere from three other lines; 1998
of 2000 now.

Guards: the proposal-loop test learns the preference branch, the lesson
branch and the force question, on both rule surfaces; guidance-ownership gains
the force-axis topic (shared with the docstrings, for the moment a proposal is
actually written) and the preference-scope topic; a new guard pins that the
index names all three strengths and who keeps the middle one current, with its
can-fail case being the omission that actually happens — a kind added to the
product while the index still describes the corpus that came before it.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy
chore(plugin): mint 2026.09.19.1614 for the using-scribe force-axis edit
CI & Build / Python lint (push) Successful in 2s
CI & Build / Plugin hooks (push) Successful in 10s
CI & Build / integration (push) Successful in 49s
CI & Build / TypeScript typecheck (push) Successful in 53s
CI & Build / Python tests (push) Successful in 1m32s
CI & Build / Build & push image (push) Successful in 14s
1ade956cd5
The five-answer change touched plugin/skills/using-scribe/SKILL.md, and CI
7052 caught the manifest still reading 2026.09.18.1606. Per #2209 the
marketplace clone self-updates but the cache that actually executes only
refreshes on a version change, so without this the new guidance reaches the
repo and stops there.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01821k5B3Ysecp9fNYs92Kuy
bvandeusen merged commit 1135445e3f into main 2026-09-19 13:34:51 -04:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledScribe#168