Task #420 — answers the user request "وين خيار اضيف list to do?".
Schema (lib/db/src/schema/notes.ts):
- notes + note_recipients gain `kind` (varchar(16) default 'text')
and `items` (jsonb<ChecklistItem[]> nullable). Snapshot copy on
note_recipients keeps delivered checklists immutable across sender
edits/deletes.
- Drizzle push applied; lib/db .d.ts rebuilt.
API (artifacts/api-server/src/routes/notes.ts):
- ChecklistItem type + bounded parser (≤200 items, id ≤64, text ≤500).
- parseNoteInput normalizes items↔kind on create and on PATCH that
carries `kind`; PATCH handler additionally coerces items-only
patches against the note's existing kind so a text note can never
end up with checklist items (and vice versa).
- POST/PATCH/send/loadRecipientsForNote/received/thread responses and
the realtime `note_received` payload all carry kind+items, with the
thread response falling back to the recipient snapshot.
Client (artifacts/tx-os/src/lib/notes-api.ts + pages/notes.tsx):
- Note/ReceivedNote/NoteThread/SentNoteRecipient extended with
kind+items.
- New `ChecklistEditor`, `ChecklistView`, and `KindToggle` components.
- Composer and EditNoteDialog gain the to-do toggle (ListTodo icon)
and switch between Textarea and ChecklistEditor; saves send
kind+items, with empty-checklist auto-discard mirroring the existing
empty-text behaviour.
- NoteCard, inbox list, sent list, and ThreadDialog body render the
checklist (read-only on snapshots; owner cards can toggle done via
PATCH with stopPropagation so the edit dialog doesn't open).
i18n: notes.checklist.{toggle,addItem,itemPlaceholder,emptyHint,
removeItem,progress} added to en.json + ar.json.
Tests: new artifacts/tx-os/tests/notes-checklist.spec.mjs covers
composer→persist→reload→toggle, items-only PATCH normalization on
both kinds, and checklist delivery to recipient snapshot. All 3 pass.
Architect review (evaluate_task) flagged one real issue: items-only
PATCH normalization. Fixed in the PATCH handler and locked in by the
new normalization test.
Pre-existing executive-meetings.ts tsc errors are unchanged and
unrelated to this task.