memory: report the /snapshot handoff defect to galdrabok, with the mechanism

Sent with both specimens. Adds the root cause, which is in SYSTEM_PROMPT rather
than the model.

Next steps is the only one of the three generated sections with no empty case.
Watch out for is told to omit itself when there are no gotchas and Resume here is
told what to say when nothing is in flight, but Next steps is told only that it is
a numbered, ordered, concrete list. With nothing in flight the sole action-shaped
nouns in the input are the deferred items, and the nothing-in-flight rule points
the model straight at them by asking it to name the most recent open pointer.

Nothing in the prompt protects modality. Invent nothing and trace every claim to
the input are both satisfied - the items really are in the input - while their
deferred-ness is exactly what gets dropped. The verbatim-identifier rule already
establishes that some attributes of the input must survive restructuring untouched;
modality is one of them and only identifiers are guarded.

Proposed two prompt changes to galdrabok: an empty-case escape for Next steps, and
a rule making deferred, parked, belayed and deliberately-not-done items constraints
belonging in Watch out for rather than steps. Offered as a caller's diagnosis since
the skill is theirs. Noted that galdrabok-dev is pull mode, so there is no herald
poke and they will see it on their next check.
This commit is contained in:
2026-09-15 10:17:28 -07:00
parent 9d36c74572
commit 1ffb6d7af8
@@ -132,9 +132,31 @@ immediately after `/clear`, before any other framing, and its Next steps read as
mandate. A wrong one here is not a bad summary; it is a fresh session going and doing
belayed work.
### Mechanism — it is `SYSTEM_PROMPT`, not the model
`snapshot_handoff.py:75-107`. Three things compose:
1. **`## Next steps` has no empty case.** `## Watch out for` gets an explicit escape
("OMIT THIS WHOLE SECTION if the input carries no gotchas"); `## Resume here` gets one
("If the input says nothing is in flight, say so plainly"). **`## Next steps` gets
neither**, while being told it is "A numbered list. Ordered, concrete". With nothing
in flight, the only action-shaped nouns left are the deferred items.
2. **The nothing-in-flight rule points straight at them** — "point at the most recent
open pointer it names" directs attention to the parked entries, which then get
promoted into Next steps.
3. **Nothing protects MODALITY.** "Invent nothing; every claim must trace to the input"
is satisfied — the items *are* in the input. Their *deferred-ness* is what got
dropped, and only identifiers are protected against restructuring.
⭐ **The general lesson: the verbatim-identifier rule shows some input attributes must
survive restructuring untouched. Modality is one of them and nobody guarded it.**
**Mitigation until fixed: read the generated handoff before accepting it**, and invert
any deferred item into an explicit *do NOT*. Both runs this session were corrected
in-session. Owner is the `/snapshot` skill (galdrabok); not reported yet.
in-session. **Reported to `galdrabok-dev` 2026-09-15** with both specimens, the mechanism
above and two proposed prompt changes (an empty-case escape for `## Next steps`; a rule
making deferred/parked/belayed items constraints rather than steps).
`galdrabok-dev` is `mode: pull` — no herald poke, so they see it on their next check.
⭐ Same family as everything above — the instrument produced a plausible artifact and
the plausibility is exactly what makes it dangerous.