Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions claude/hooks/akm-hook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -763,8 +763,8 @@ function userPromptExpansion(): string {
refs,
outcome: { status: "ok" },
})
if ((/\/akm-memory-(promote|reject)\b/.test(expanded) || /\/akm-proposal\s+(accept|reject|drain)\b/.test(expanded) || /\bproposal\s+drain\b/.test(expanded)) && !/\b(confirm|approved|approval)\b/i.test(expanded)) {
return emitHookContext("UserPromptExpansion", "AKM note: mutating memory/proposal flows should be explicit. Confirm promotion/rejection or proposal acceptance before changing durable state.")
if (/\/akm-memory-(promote|reject)\b/.test(expanded) && !/\b(confirm|approved|approval)\b/i.test(expanded)) {
return emitHookContext("UserPromptExpansion", "AKM note: mutating memory flows should be explicit. Confirm promotion/rejection before changing durable state.")
}
if (PROPOSAL_FLOW_RE.test(expanded)) ensureFreshProposalCheckpoint(rawInput)
if (/\/akm-/.test(expanded)) {
Expand Down
19 changes: 12 additions & 7 deletions tests/claude-plugin.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -1794,7 +1794,7 @@ exit 0

const payload = JSON.parse(stdout.trim())
expect(payload.hookSpecificOutput.hookEventName).toBe("UserPromptExpansion")
expect(payload.hookSpecificOutput.additionalContext).toContain("mutating memory/proposal flows")
expect(payload.hookSpecificOutput.additionalContext).toContain("mutating memory flows")
})

it("user-prompt-expansion treats akm-memory-reject as mutating guidance", () => {
Expand All @@ -1813,7 +1813,7 @@ exit 0

const payload = JSON.parse(stdout.trim())
expect(payload.hookSpecificOutput.hookEventName).toBe("UserPromptExpansion")
expect(payload.hookSpecificOutput.additionalContext).toContain("mutating memory/proposal flows")
expect(payload.hookSpecificOutput.additionalContext).toContain("mutating memory flows")
})

it("user-prompt-expansion treats akm-proposal list as non-mutating guidance", () => {
Expand All @@ -1833,10 +1833,13 @@ exit 0
const payload = JSON.parse(stdout.trim())
expect(payload.hookSpecificOutput.hookEventName).toBe("UserPromptExpansion")
expect(payload.hookSpecificOutput.additionalContext).toContain("slash-command expansion should keep mutating actions explicit")
expect(payload.hookSpecificOutput.additionalContext).not.toContain("mutating memory/proposal flows")
expect(payload.hookSpecificOutput.additionalContext).not.toContain("mutating memory flows")
})

it("user-prompt-expansion treats akm-proposal reject as mutating guidance", () => {
// proposal accept/reject/drain are no longer singled out by the hook (the
// proposal-specific approval guard was removed); they get the generic
// slash-command note like any other /akm- command.
it("user-prompt-expansion treats akm-proposal reject as generic slash guidance", () => {
const tempDir = makeTempDir()
const stateDir = path.join(tempDir, "state")
mkdirSync(stateDir, { recursive: true })
Expand All @@ -1852,10 +1855,11 @@ exit 0

const payload = JSON.parse(stdout.trim())
expect(payload.hookSpecificOutput.hookEventName).toBe("UserPromptExpansion")
expect(payload.hookSpecificOutput.additionalContext).toContain("mutating memory/proposal flows")
expect(payload.hookSpecificOutput.additionalContext).toContain("slash-command expansion should keep mutating actions explicit")
expect(payload.hookSpecificOutput.additionalContext).not.toContain("mutating memory flows")
})

it("user-prompt-expansion treats akm-proposal drain as mutating guidance", () => {
it("user-prompt-expansion treats akm-proposal drain as generic slash guidance", () => {
const tempDir = makeTempDir()
const stateDir = path.join(tempDir, "state")
mkdirSync(stateDir, { recursive: true })
Expand All @@ -1871,7 +1875,8 @@ exit 0

const payload = JSON.parse(stdout.trim())
expect(payload.hookSpecificOutput.hookEventName).toBe("UserPromptExpansion")
expect(payload.hookSpecificOutput.additionalContext).toContain("mutating memory/proposal flows")
expect(payload.hookSpecificOutput.additionalContext).toContain("slash-command expansion should keep mutating actions explicit")
expect(payload.hookSpecificOutput.additionalContext).not.toContain("mutating memory flows")
})

it("user-prompt-expansion captures a fresh checkpoint before improve/propose flows", () => {
Expand Down
Loading