Handoff: CreatorTrack Projects app, FIRST DRAFT built (awaiting review)¶
Date: 2026-07-06
Branch: feat/projects-app (2 commits: 73aca5a data layer + API, 15071b7 UI). NOT merged, NOT deployed.
Worktree: ~/forge-suite-wt-manual/projects-app (NOT under ~/forge-suite-wt, see incident below). Dev server on :3064, DB ct_feat_projects_app.
Preview: http://100.97.43.104:3064 (open the Projects app in Justin's Workspace; demo project "Website Redesign" seeded with 7 tasks, dependencies, and a "Draft Link" custom field).
Architecture¶
Projects is a SYSTEM APP (projects.app node, type projects, App Library card in Essentials, preview flag) that is a second lens over the SAME tasks.db + tasks.projects databases the Tasks app owns. No new tables; everything is collection props:
tasks.projectsrows gain Color / Start / Target / Description (lazyensureProjectsProps).tasks.dbgains Start (Gantt left edge) and Blocked By (self-relation, dependencies).- Custom fields = user-added collection props on
tasks.dbbeyond the code-owned core set (CORE_TASK_PROPSin lib/tasks.ts). Exposed asCleanTask.fieldskeyed by prop id. CleanTaskextended additively:start,blockedBy,fields.TaskPatch+/api/tasks/[id]acceptstart,blockedBy,fields.- Audit trail:
updateTasknow logsprops_editedactivity rows with before/after values per changed field; the task modal renders them as an activity feed.
New files: lib/projects.ts (CleanProject + rollups + CRUD + custom-field defs), /api/projects, /api/projects/[id], /api/projects/fields, components/apps/projects/* (Client shell, Sidebar, Overview cards, ListView table, BoardView on shared KanbanBoard, TimelineView Gantt with drag-move/resize + dependency arrows, TaskModal with PageBody + metadata + activity, FieldsManager + NewProject dialogs).
Verified¶
- tsc clean; API smoke test end-to-end (install, create project, 7 tasks, 4 dep links, custom field def + value, rollups 7/1 done, activity before/after entries).
- Visual pass on Overview / List / Board / Timeline via headless Chrome (screenshots in session).
Known gaps / review points¶
- Sidebar tree is Workspace -> Project only (no Folder/List hierarchy yet).
- Timeline: no auto-shift of dependents when a predecessor slips; arrows render, critical path not computed.
- Assignee picker only offers the current workspace's roster; cross-workspace rows read-only.
- Filter bar is session-state (not persisted like Tasks' prefs).
- Pre-existing app-shell hydration warning (SortableApps) fires right after any fresh app install, not Projects-specific.
Incident: dev-slot reaper killed the slot twice (2026-07-06 18:47 + 19:02)¶
forge_creatortrack_dev_slot_reaper.py over-cap logic (cap 4) reaped feat/projects-app at idle 0m twice, destroying uncommitted work the first time (rebuilt from context). At 19:02 it saw NINE slots and mass-reaped several other agents' brand-new slots too. Two bugs worth fixing:
- Over-cap reaping picks slots with zero idle minutes (brand-new, in-active-development, just no browser tab yet). It should respect a minimum grace window even over cap.
- Teardown's DB drop fails with permission denied to terminate process (needs pg_signal_backend for the admin role), leaving half-torn slots.
This is why the worktree now lives at ~/forge-suite-wt-manual/projects-app (outside the reaper's ~/forge-suite-wt scan). Merge or teardown manually.
URL: https://mkdocs.justinsforge.com/memory/handoffs/creatortrack-projects-app-draft-2026-07-06/