| name | memory-manager |
| description | Internal plugin skill. Use this skill when a plugin command directs you to perform a memory operation: log-delegation, resolve-delegation, update-checkin, or query-pending. Called by /schedule, /complete-task, /delegate, /review-week, /today, and /review-org. Do NOT invoke this skill based on user phrases — it is a plugin-internal service.
|
| version | 2.0.0 |
Memory Manager
Single writer for delegation memory CREATE and UPDATE operations in the
claude-eisenhower plugin. DELETE operations are owned by /forget
(commands/forget.md) and write directly to memory/glossary.md and
memory/people/*.md — see issue #42 for the rationale (the destructive
correction loop has different atomicity, confirmation, and PII concerns from
the routine operations below).
This partition is intentional. The schema is shared (see
docs/specs/memory-schema-spec.md), so changes to the row format must update
both this skill AND commands/forget.md's delete logic in the same commit.
Adding a new operation here? If it's CREATE/UPDATE, extend this skill. If it's
DELETE, extend /forget instead.
The backend is local markdown files only — there is no external skill fallback or
primary store. See docs/adrs/single-backend-memory.md for the architectural decision
that retired the prior dual-backend abstraction.
See references/memory-operations.md for local file formats, return shapes, and
failure mode details.
Gotchas
High-signal traps. Read before adding or changing an operation.
- Every CREATE/UPDATE is a DUAL write. Each operation touches BOTH
memory/glossary.md (the ## Stakeholder Follow-ups table) AND
memory/people/[alias-filename].md. Update one without the other and the two
stores desync — /forget and query-pending then read inconsistent state.
- DELETE does not live here. This skill is CREATE/UPDATE only. Deletes are
owned by
/forget (commands/forget.md). Routing a delete through this skill is
wrong; routing a CREATE/UPDATE through /forget is wrong.
- The row schema is shared with
/forget. It is specced in
docs/specs/memory-schema-spec.md. Any change to the row/column format MUST
update this skill AND commands/forget.md's delete logic in the same commit, or
the other writer's reads break.
- Dedup is the CALLER's job.
query-pending returns raw pending rows; the
calling command suppresses entries already in TASKS.md Delegated (TASKS.md is
authoritative). This skill never cross-references TASKS.md itself.
- Alias filename is derived per spec — don't guess it.
memory/people/
filenames follow the derivation rule in the schema spec. An ad-hoc filename
orphans the per-person file from its glossary row.
- Pending-status match is case-insensitive. Filter rows on
Pending
case-insensitively; an exact-case compare silently drops valid entries.
Operations
log-delegation
Purpose: Create a new pending delegation entry when a task is delegated.
Inputs:
alias — delegate's display alias (e.g., "Alex R.")
task_title — title of the delegated task
check_in_date — YYYY-MM-DD date for follow-up
Execution:
- Ensure
memory/people/ directory exists (create if absent).
- Write using the canonical schema in
docs/specs/memory-schema-spec.md:
- Append a new row to the
## Stakeholder Follow-ups table in memory/glossary.md:
| [alias] | [task_title] | [YYYY-MM-DD] | [check_in_date] | Pending |
- Create or append to
memory/people/[alias-filename].md (filename derived per spec):
| [task_title] | [YYYY-MM-DD] | [check_in_date] | Pending | — |
- If the write fails: "Could not record this follow-up ([reason]). Track it manually."
Returns: success | failed
resolve-delegation
Purpose: Mark a pending delegation as resolved when the delegated task is complete.
Inputs:
alias — delegate's display alias
task_title — title of the delegated task
resolved_date — YYYY-MM-DD date of resolution (today)
Execution:
- Find the row matching
alias + task_title in the ## Stakeholder Follow-ups table of memory/glossary.md
- Update its Status cell to:
Resolved — [resolved_date]
- Apply the same status update to the matching row in
memory/people/[alias-filename].md
- If no matching row found: log warning internally, continue (non-blocking).
Returns: success | not-found (non-blocking)
update-checkin
Purpose: Extend a delegation's check-in date when a task is still in progress.
Inputs:
alias — delegate's display alias
task_title — title of the delegated task
new_check_in_date — YYYY-MM-DD new check-in date
Execution:
- Find the row matching
alias + task_title in the ## Stakeholder Follow-ups table of memory/glossary.md
- Update its Check-by cell to
new_check_in_date
- Apply the same check-in update to the matching row in
memory/people/[alias-filename].md
- If no matching row found: log warning internally, continue (non-blocking).
Returns: success | not-found (non-blocking)
query-pending
Purpose: Retrieve pending delegation entries with check-in dates within a given range.
Inputs:
within_business_days — number of business days from today to search (e.g., 5)
Execution:
- Read the
## Stakeholder Follow-ups table in memory/glossary.md.
If the file is missing or unreadable, return [] (non-blocking).
- Parse rows with Status =
Pending (case-insensitive).
- Filter for: Check-by date within
within_business_days business days from today.
Deduplication (caller's responsibility):
Cross-reference results against TASKS.md Delegated records before displaying.
If the same alias + task_title appears in both, suppress the memory-only entry —
TASKS.md is the authoritative source for that record.
Returns: list of entries (see references/memory-operations.md for return shape).
Empty list if memory/glossary.md is missing or unreadable (non-blocking).
Failure Modes
| Scenario | Behavior |
|---|
memory/people/ missing | Create the directory; write new files |
memory/glossary.md missing on read | Return empty result (non-blocking for query-pending) |
| Write fails (permissions, disk) | Surface non-blocking warning; instruct manual tracking |
| Entry not found on resolve/update | Non-blocking; log warning internally |