Initial scaffold: tooling, plan, task briefs
- pnpm 10 workspace + TypeScript strict + ESLint flat + Prettier - CLAUDE.md as canonical brief - docs/tasks/ — 22 task briefs broken out by phase for sub-sessions - docs/decisions/ — ADR scaffold Implements task 01 (repo-init).
This commit is contained in:
@@ -0,0 +1,26 @@
|
||||
# 22 — Activity log
|
||||
|
||||
## Goal
|
||||
|
||||
Generic activity feed every module writes to and the dashboard reads from.
|
||||
|
||||
## Depends on
|
||||
|
||||
- 10, 11, 12
|
||||
|
||||
## Scope
|
||||
|
||||
- Schema: `activity_log` (`id`, `household_id`, `entity_type`, `entity_id`, `actor_id`, `action`, `payload` jsonb, `created_at`). Index on `(household_id, created_at desc)`.
|
||||
- `_core` exports `logActivity({ entityType, entityId, action, payload })`. Reads `householdId` and `actorId` from current session.
|
||||
- Calendar/lists/notes modules call it on create/update/delete.
|
||||
- Dashboard widget `core.activity` shows last 20 entries with human-readable rendering. Each entity type's manifest provides a `renderActivity(entry)` function.
|
||||
|
||||
## Out of scope
|
||||
|
||||
- Per-user activity filters.
|
||||
- Retention / pruning (no growth concerns at two-user scale).
|
||||
|
||||
## Acceptance criteria
|
||||
|
||||
- [ ] Every CRUD across the three core modules writes a row.
|
||||
- [ ] Widget renders entries via the registry — no `if (entityType === ...)` branches in the widget itself.
|
||||
Reference in New Issue
Block a user