| name | save-feedback |
| description | Save an explicit feedback rule to butler's durable memory ($BUTLER_DATA/memory/rules/feedback/). |
| user-invocable | true |
| applicability | Use when the model decides the user explicitly wants a durable rule or preference saved for future Butler behavior. |
| allowed-tools | update_explicit_memory |
| dispatch | none |
| review | none |
| reporting | Confirm only the durable rule update that was saved. |
Trigger phrases
Invoke this skill when the user says:
/save-feedback <text>
- ์ด๊ฑฐ ๊ธฐ์ตํด (only when context implies a behavioral rule, not a casual question)
- ํผ๋๋ฐฑ ์ ์ฅ
- ๋ค์์ ์ด๋ ๊ฒ ํด
- ์์ผ๋ก๋ ~
- ๊ธฐ์ตํด ๋ฌ
- ๋ฃฐ ์ถ๊ฐํด
Explicit Save Request
Use this skill only after the model has decided the user explicitly wants a
durable rule or preference saved.
- If the user has not supplied actionable content, ask what exact rule or
preference should be saved.
- If the user is only asking whether Butler remembers something, do not save;
answer or inspect memory with the appropriate memory tools.
Instructions
Step 1 โ Collect feedback text
- If
args is non-empty, use it as the feedback content.
- If
args is empty, ask: "ํผ๋๋ฐฑ ๋ด์ฉ์ด ๋ญ์ผ? Rule, Why, How to apply ๋ก ๋๋ ์ ์๋ ค์ค๋ ๋๊ณ , ํ ์ค๋ก ์จ์ค๋ ๋ผ."
Step 2 โ Parse content and generate slug
Extract or infer:
rule: The core rule (first sentence / main instruction).
why: Reason or context. Default: "Principal's explicit preference."
how_to_apply: When/where to apply. Default: "Apply in all future interactions."
name: Short human-readable title (โค 8 words).
description: One-line summary for the index (โค 120 chars).
slug: Generate using the following algorithm:
- Start with
name, convert to lowercase.
- Replace all whitespace with hyphens.
- Strip all characters that are not ASCII alphanumeric or hyphens (
[^a-z0-9-]).
- Collapse consecutive hyphens into one; strip leading/trailing hyphens.
- If the result is empty (e.g., name was all Korean/non-ASCII), fall back to:
feedback-<first8hex> where <first8hex> is the first 8 hex characters of the
SHA-256 of the feedback text (compute mentally or use a stable prefix derived from
the first few ASCII words in the feedback body). If no SHA-256 is computable inline,
use feedback-<YYYYMMDD-HHMM> from the current timestamp.
- Example (ASCII):
"No flattery in responses" โ no-flattery-in-responses
- Example (Korean):
"ํฉ๋๋ค์ฒด ์ ์ฉ" โ feedback-20260419-1530 (timestamp fallback)
Step 3 โ Write feedback file
Create $BUTLER_DATA/memory/rules/feedback/<slug>.md:
---
name: <name>
description: <description>
type: feedback
---
<rule>
**Why:** <why>
**How to apply:** <how_to_apply>
Use the Write or Edit tool to create the file. Never overwrite an existing file โ if <slug>.md already exists, append a numeric suffix (-2, -3, โฆ).
Step 4 โ Update feedback INDEX
Append to $BUTLER_DATA/memory/rules/feedback/INDEX.md (create the file if it does not exist):
- [<name>](<slug>.md) โ <description>
Duplicate prevention: Before appending, read the current contents of feedback/INDEX.md. If any existing line already contains (<slug>.md), skip the append entirely โ the pointer already exists. This prevents duplicate entries when the same slug is saved more than once (e.g., after a failed run that partially succeeded).
Step 5 โ Update top-level rules INDEX (idempotent)
Read $BUTLER_DATA/memory/rules/INDEX.md.
This check is idempotent: run it on every save, but only append once.
Step 6 โ Transactional order and error handling
Execute steps in strict order:
- Write feedback file (
$BUTLER_DATA/memory/rules/feedback/<slug>.md) โ Step 3.
- Update feedback INDEX (
$BUTLER_DATA/memory/rules/feedback/INDEX.md) โ Step 4.
- Update top-level rules INDEX if needed (
$BUTLER_DATA/memory/rules/INDEX.md) โ Step 5.
If step 2 fails after step 1 succeeded: emit a warning โ
โ ๏ธ ํผ๋๋ฐฑ ํ์ผ์ ์ ์ฅ๋์ง๋ง feedback/INDEX.md ์
๋ฐ์ดํธ ์คํจ. ์๋์ผ๋ก - [<name>](<slug>.md) โ <description> ์ค์ ์ถ๊ฐํ์ธ์.
If step 3 fails after steps 1โ2 succeeded: emit a warning โ
โ ๏ธ feedback/INDEX.md ์
๋ฐ์ดํธ๋ ์๋ฃ, ํ์ง๋ง $BUTLER_DATA/memory/rules/INDEX.md ์
๋ฐ์ดํธ ์คํจ. ํ์ผ์ feedback/<slug>.md์ ์กด์ฌํฉ๋๋ค.
Do not delete the feedback file on downstream failure. The file is the source of truth;
index pointers can be repaired by re-running the relevant append. Recovery: read
$BUTLER_DATA/memory/rules/feedback/ directory and rebuild INDEX.md from filenames if needed.
Step 7 โ Confirm
Reply with:
ํผ๋๋ฐฑ ์ ์ฅ ์๋ฃ โ feedback/<slug>.md
Example usage
/save-feedback ์ฝ๋ ๋ฆฌ๋ทฐ ์์ฒญ ์ ์ ํญ์ lint ํต๊ณผ ์ฌ๋ถ ๋จผ์ ํ์ธํด
Butler will create $BUTLER_DATA/memory/rules/feedback/check-lint-before-review.md with:
- Rule: ์ฝ๋ ๋ฆฌ๋ทฐ ์์ฒญ ์ ์ ํญ์ lint ํต๊ณผ ์ฌ๋ถ ๋จผ์ ํ์ธํด
- Why: Principal's explicit preference.
- How to apply: Apply in all future interactions.
Then append a pointer to feedback/INDEX.md, and (if not already present) register the
feedback category in $BUTLER_DATA/memory/rules/INDEX.md.