fix(uninstall): named gstack-memorable arm, vendor-consent notice, honest kept config

The identity sweep already removed the Memorable bridge hook as an
unnamed stray. It now has a named arm like every other source, so the
summary says what went, and says plainly that Memorable's own consent
(if the user granted it) is theirs to revoke. Under --keep-state the kept
config is set memorable_recall=off so it never claims a hook that is
gone. The canonical-paths pins cover the sixth KNOWN_HOOKS row and the
new uninstall source.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
Garry Tan
2026-09-08 17:53:57 +00:00
co-authored by Claude Fable 5.1
parent 6aa9cd9e35
commit ae706a6168
3 changed files with 57 additions and 2 deletions
+4 -2
View File
@@ -143,13 +143,14 @@ describe('gstack-settings-hook: shared prelude (dedupe key == prune predicate)',
expect(prelude).not.toContain('`');
});
test('KNOWN_HOOKS table carries all five identities with source+event+relpath', () => {
test('KNOWN_HOOKS table carries all six identities with source+event+relpath', () => {
for (const [name, source, event] of [
['question-log-hook', 'plan-tune-cathedral', 'PostToolUse'],
['question-preference-hook', 'plan-tune-cathedral', 'PreToolUse'],
['auq-error-fallback-hook', 'auq-error-fallback', 'PostToolUse'],
['timeline-stop-hook', 'gstack-timeline-stop', 'Stop'],
['gstack-session-update', 'gstack-session-update', 'SessionStart'],
['memorable-user-prompt-hook', 'gstack-memorable', 'UserPromptSubmit'],
]) {
const rowStart = hookBinSrc.indexOf(`"${name}":`);
expect(rowStart).toBeGreaterThan(-1);
@@ -173,10 +174,11 @@ describe('gstack-uninstall: hook cleanup runs before install-root deletion', ()
expect(cleanup).toBeLessThan(rootDelete);
});
test('uninstall removes all three sources and sweeps untagged strays', () => {
test('uninstall removes every named source and sweeps untagged strays', () => {
expect(uninstallSrc).toContain('remove-source --source plan-tune-cathedral');
expect(uninstallSrc).toContain('remove-source --source auq-error-fallback');
expect(uninstallSrc).toContain('remove-source --source gstack-timeline-stop');
expect(uninstallSrc).toContain('remove-source --source gstack-memorable');
expect(uninstallSrc).toContain('prune-stale --all');
});
});