Skip to content

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.projects rows gain Color / Start / Target / Description (lazy ensureProjectsProps).
  • tasks.db gains Start (Gantt left edge) and Blocked By (self-relation, dependencies).
  • Custom fields = user-added collection props on tasks.db beyond the code-owned core set (CORE_TASK_PROPS in lib/tasks.ts). Exposed as CleanTask.fields keyed by prop id.
  • CleanTask extended additively: start, blockedBy, fields. TaskPatch + /api/tasks/[id] accept start, blockedBy, fields.
  • Audit trail: updateTask now logs props_edited activity 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

  1. Sidebar tree is Workspace -> Project only (no Folder/List hierarchy yet).
  2. Timeline: no auto-shift of dependents when a predecessor slips; arrows render, critical path not computed.
  3. Assignee picker only offers the current workspace's roster; cross-workspace rows read-only.
  4. Filter bar is session-state (not persisted like Tasks' prefs).
  5. 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/