feat(heute): ungeplant Erledigtes nachtragen (ENTWICKLUN-7)
ci / quality (push) Failing after 43s
ci / build (push) Has been skipped
deploy / deploy (push) Successful in 53s

Drive-by-Aufgaben ("btw, Yevgen-Security-Fix hab ich auch noch gemacht")
strukturiert erfassen statt nur im Freitext. Neues Feld todo.unplanned +
Endpoint dayEntry.addUnplanned: legt sofort ein erledigtes, als „ungeplant"
markiertes ToDo an.

- Schnell-Eingabe „Ungeplant erledigt" auf Heute (Mid-Day) und in der
  Reflexion (End-of-Day-Recall).
- "ungeplant"-Badge in Heute, Reflexion und Historie.
- historyForDate liefert das unplanned-Flag mit.
- Reflexions-Freitext bleibt für die Tages-Story.

Migration 0012 (todo.unplanned).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
dejanandClaude Opus 4.8 committed 2026-06-06 18:09:38 +02:00
1 parent 516b35bf15
commit 66adc49e2c
9 files changed
+3431 -3

No files matched your search

@@ -0,0 +1 @@
ALTER TABLE "todo" ADD COLUMN "unplanned" boolean DEFAULT false NOT NULL;
File diff suppressed because it is too large. Load diff
@@ -85,6 +85,13 @@
"when": 1780754557002,
"tag": "0011_lead_project_link",
"breakpoints": true
},
{
"idx": 12,
"version": "7",
"when": 1780761840614,
"tag": "0012_todo_unplanned",
"breakpoints": true
}
]
}
+2
View File
@@ -261,6 +261,8 @@ export const todo = pgTable(
.notNull()
.default('open'),
dropReason: text('drop_reason'),
// Ungeplant dazugekommen & erledigt (Drive-by, „btw das habe ich heute auch gemacht").
unplanned: boolean('unplanned').notNull().default(false),
carriedOver: boolean('carried_over').notNull().default(false),
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
completedAt: timestamp('completed_at', { withTimezone: true }),
+8
View File
@@ -65,6 +65,14 @@ export const addTodoInput = z.object({
});
export type AddTodoInput = z.infer<typeof addTodoInput>;
// Ungeplant dazugekommenes & bereits erledigtes Item nachtragen (Drive-by).
export const addUnplannedInput = z.object({
title: z.string().min(1).max(200),
bezugKind: bezugKindSchema.optional(),
bezugId: z.string().uuid().optional(),
});
export type AddUnplannedInput = z.infer<typeof addUnplannedInput>;
export const historyForDateInput = z.object({
date: z
.string()