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
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
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
This commit is contained in:
@@ -93,21 +93,39 @@ Two constraints on *how* that's achieved:
|
||||
**`kind` says how much force a record carries, and it is never something to
|
||||
infer.** A **rule** must be followed: ignoring it breaks something or
|
||||
crosses a boundary. A **preference** records how the operator wants work
|
||||
done, and ignoring it costs consistency rather than correctness. Both are
|
||||
worth following and both arrive the same way; only one is a mistake to
|
||||
miss. An injected line names which in its opening words — *"Standing rule
|
||||
that may apply…"* against *"Preference that may apply…"* — and every
|
||||
payload carries `kind` outright.
|
||||
done, and ignoring it costs consistency rather than correctness. A
|
||||
**lesson** is what is worth knowing — a better way to think about a
|
||||
problem, a solution that transfers — and ignoring it costs time. All three
|
||||
are worth reading and all three arrive beside your work; only the first is
|
||||
a mistake to miss. An injected line names which in its opening words —
|
||||
*"Standing rule that may apply…"* against *"Preference that may apply…"* —
|
||||
a lesson arrives in the records menu marked `lesson`, under a header that
|
||||
says outright that it binds nothing, and every payload carries `kind`.
|
||||
|
||||
**One question sorts them, and it is worth asking out loud: what happens if
|
||||
someone doesn't do this?** *Something breaks, or a boundary is crossed* — a
|
||||
rule, and the operator's to agree to. *It gets done a way they didn't want*
|
||||
— a preference, recorded without a loop. *They lose time rediscovering it*
|
||||
— a lesson, binding nobody. Ask it before proposing rather than settling it
|
||||
silently, because it sometimes answers that what you are holding was never
|
||||
a rule — and routing an observation is not losing it.
|
||||
|
||||
**A preference is the one record you keep current yourself.** When the
|
||||
operator corrects you, or the preference on file no longer matches how they
|
||||
actually want something done, `update_preference` — that is expected, not a
|
||||
liberty, and it wants the task or note that taught the change. Say in the
|
||||
liberty, and updating one mid-work is the normal case rather than an
|
||||
interruption of it. It wants the task or note that taught the change. Say in the
|
||||
same turn that you did it, so they can disagree while it is in front of
|
||||
them. A rule waits for the operator instead: `create_rule` proposes and
|
||||
asks. If what you learned is that something MUST be done a certain way,
|
||||
that is a rule to propose, not a preference to harden in place.
|
||||
|
||||
**Preferences shape how work is done, never what gets recorded.** They
|
||||
govern your conduct — how you report, how carefully you pace, which form
|
||||
you reach for. What ends up in Scribe is decided by what the record is:
|
||||
a preference never makes a task into a note, downgrades a rule, or keeps
|
||||
something out of the corpus that belongs there.
|
||||
|
||||
**A retrieved rule outranks a default habit.** Before a hard-to-reverse or
|
||||
outward-facing act — changing shared state, publishing, deleting, sending
|
||||
something outside the session — the operator's rules decide what to do, not
|
||||
@@ -339,6 +357,13 @@ and none of that survives being written as a rule. A repeatable procedure is a
|
||||
**process**; reusable code is a **snippet**. Reach for a rule when the thing
|
||||
really is a standing instruction about how to work.
|
||||
|
||||
Then ask what force it carries, by the question above. A standing instruction
|
||||
that merely costs consistency is a **preference** (`create_preference`), and a
|
||||
transferable insight that costs time is a **lesson** (`create_lesson`), keyed
|
||||
to the situation it applies to so a later session meets it there. Both are
|
||||
first-class outcomes of noticing something, not what's left when a rule
|
||||
proposal fails.
|
||||
|
||||
## When a record doesn't reach the moment it should
|
||||
|
||||
Retrieval misjudging is ordinary, and it is fixable — but only by whoever
|
||||
|
||||
Reference in New Issue
Block a user