Plan-tune cathedral T11. Bin that applies a single user-approved proposal
from distillation-proposals.json to the right surface:
- memory-nugget → appended to ~/.gstack/free-text-memory.json (durable
local source-of-truth; gbrain is mirror when configured).
- preference → routed through gstack-question-preference --write
with source=plan-tune (clears the user-origin gate).
- declared-nudge → atomic update to developer-profile.json declared dim,
small=0.05, medium=0.10, large=0.15, clamped to [0, 1].
Why a separate bin (not inline in the skill template): /plan-tune's apply
step needs to be invokable from any host (Claude, Codex, etc) and must
write to multiple state files atomically. A bin centralizes the schema
+ clamp logic; the skill template just calls it after user Y.
gbrain coordination: --gbrain-published true marks the nugget so /plan-tune
stats can show "12 nuggets, 8 mirrored to gbrain". The skill template
invokes mcp__gbrain__put_page / extract_facts / add_tag in the same turn
(those are MCP tools, not CLI-callable) before calling this bin. Local file
remains canonical so the PreToolUse hook injection path (T12) doesn't
depend on gbrain availability.
Subcommands:
gstack-distill-apply --list # show pending proposals
gstack-distill-apply --proposal <N> # apply, file fallback
gstack-distill-apply --proposal <N> --gbrain-published true
Applied proposals get applied_at + gbrain_published stamped on them so
re-running --list shows only unconsumed ones.
11 unit tests cover --list (all three kinds + quotes), memory-nugget
append + non-clobber, preference routing through the gate-respecting bin,
declared-nudge math (medium=0.10, small=0.05, large=0.15, clamp at [0,1]),
proposal mark-applied with gbrain flag, and error paths (bad index, missing
--proposal).
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>