Files
commitea/docs/PLAN.md
Croissant Le Doux 9920634e74 docs: settle open design items + dogfood backlog
Resolve the five design-session open items from PLAN.md:
- decisions.md: soft write-path, poll-only sync (NAT), lognormal
  cold-start priors, purity test binds the SQLite cache
- pm-state.md: sidecar layout + directive/capacity/calibration
  schemas + lifecycle inference table
- agent-tools.md: query_project read tool + three write tools

Also gitignore .env.* (protect the gitea PAT) and record the P0
actual: 10 labels, 5 milestones, 34 tracer-bullet issues + 51
dependencies filed on christian/commitea as the first managed project.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-08 11:30:23 -04:00

6.8 KiB
Raw Permalink Blame History

CommiTea — AI-PM on Gitea

Plan file. Created 2026-07-07 from brainstorm session. Status: pre-design — design session next, phases below get actuals as they complete.

Concept

Lightweight project tracking/management system. Gitea = core engine for milestones/tickets. Local-ish LLM agent acts as project manager: captures work via interview, maps capacity, forecasts deadlines, adjusts priorities on directives. Electron app, one window, "tell me what to do" experience.

Goals (numeric where possible)

  1. Forecast honesty: milestone forecasts as Monte Carlo cones (e.g. "80% land Mar 312"), never point dates. Calibration curve active after ≥20 closed issues with estimates.
  2. Capture speed: braindump → approved ticket set (estimates, deps, milestone) in < 2 min via agent interview.
  3. Responsiveness: full gitea reconcile < 5 s @ 500 issues; scheduler + Monte Carlo run < 1 s @ 200 open issues; webhook-driven updates visible < 2 s.
  4. Agent economy: hot context ≤ 2k tokens; works with a 4B local model for prose/ritual tasks (bigger model only for decomposition/negotiation).
  5. Zero pollution: managed work repos gain only human-meaningful labels (est/*, p/*, deadline/hard) — no bot comments, no body frontmatter, no synthetic issues.

Core architecture decisions (settled in brainstorm)

  • Purity rule: gitea holds human-authored intent (issues, milestones + due dates, dependencies, assignees, labels, comments). Sidecar holds machine-derived state (forecasts, calibration, inferred lifecycle timestamps, capacity, agent memory). Test: delete sidecar → resync → no truth lost.
  • pm-state repo in gitea = shared sidecar store. Versioned files; directive log is append-only JSONL (merges conflict-free). Local SQLite is a rebuildable cache/index only.
  • Estimates/priority visible in gitea as fixed label sets: est/1d 2d 3d 5d 8d, p/1..4; deadline/hard label on milestones (agent asks hard/soft at creation). Estimate unit = days.
  • LLM never does math. Deterministic scheduler (code) computes forecasts, critical path, next-unit-of-work from estimates + deps + capacity + priority. Evidence-based scheduling: Monte Carlo over the team's own estimate-vs-actual history. LLM captures/negotiates inputs and explains outputs.
  • Lifecycle inference, no manual time tracking: issue opened → diagnosis; labeled/milestoned → triage; first branch/commit ref → work start; PR merged → deploy; closed → complete. Timestamps from gitea events feed actuals.
  • Directives are first-class: append-only log entry (who/when/what/why) → scheduler re-run → agent presents consequence diff ("X today, milestone Y +6d — accept?"). Directive-giver is a role; v1 = one PM (Stephen).
  • Model layer: OpenAI-wire-protocol client, base-URL + model per role. Router: small local (gemma-4b class) for summaries/standup prose; big model (remote LM Studio box or OpenAI API) for decomposition/estimate negotiation. Few, fat tools (e.g. one query_project) so small models survive.
  • Agent conduct: interview > dumping for capture; propose-approve for destructive ops, direct-act for additive; morning-standup ritual (drift report, today's plan, stale-blocker nagging).
  • Memory: hot (charter + active directives + focus snapshot, ≤2k tok) / warm (append-only event log, weekly digests) / cold (gitea + sidecar via tools — ticket data never copied into memory). No graph in v1.
  • Sync: per-instance gitea webhooks while running + full reconcile on launch + light poll fallback.
  • Multi-contributor v1: gitea users as identities; per-person capacity = hours/day × focus factor + standing allocation slices (dev/compliance/ pilots). Multi-writer (concurrent directive-givers) deferred.
  • Repos: CommiTea source lives in its own repo (commitea) on gitea.stephenmann.io; targets N work repos via config (v1: one). Dogfood: CommiTea's own backlog is the first managed project.
  • Stack: Electron + React + Tailwind (novelpad patterns), one window.

UI (to be designed — design session)

  • Hero: Now/Next/Later focus card — scheduler-picked next unit, agent's one-line rationale.
  • Burn-up with forecast cone (ahead/behind as geometry), runway view (capacity vs milestone dates).
  • Secondary drill-ins: dependency graph / Gantt, kanban.
  • Chat = write-path (mutations via agent), UI = read-path. Exact split to be settled in design session.

Phases

Deliverables per phase; replace TBD with actuals at phase close.

  • P0 — Scaffold — repo, Electron shell, gitea API client + token auth, pm-state repo bootstrap. Actual (2026-07-08): yarn4 workspaces + electron shell + @commitea/core label schema + design system mirrored. Dogfood backlog filed on christian/commitea: 10 labels (est/p/deadline, exclusive scopes), 5 phase milestones, 34 tracer-bullet issues with 51 native dependencies. pm-state repo bootstrap still pending (P1-6 / P5-1).
  • P1 — Sync + data model — read mirror into SQLite cache, webhook listener + reconcile-on-launch, lifecycle inference from event stream, label schema applied. Actual: TBD
  • P2 — Scheduler + Monte Carlo — deterministic forecast engine, capacity model, calibration store (cold-start: default distributions until n≥20), directive log + consequence diff. Actual: TBD
  • P3 — UI views — focus card, burn-up cone, runway, drill-ins. Actual: TBD
  • P4 — Agent — model router, fat tools, capture interview, propose- approve loop, standup ritual, memory layers. Actual: TBD
  • P5 — Dogfood + polish — manage CommiTea with CommiTea; calibrate. Actual: TBD

(Order note: P3 before P4 so the agent has something to point at; thin vertical slices within phases where possible.)

Not doing (v1)

  • Google Calendar capacity import (phase 2: free/busy read-only per member)
  • Phone/push notifications
  • Agent code review / PR content reading (PR events are in for lifecycle)
  • Graph-structured agent memory
  • PTO/meeting calendars
  • Concurrent multi-PM directive writing
  • Cloud LLM as requirement (it's a config option, not a dependency)

Open items for design session — RESOLVED 2026-07-08

Settled in decisions.md, pm-state.md, agent-tools.md:

  • Chat-as-only-write-path → soft, split by semantics (decisions.md D1)
  • pm-state file formats → directive/capacity/calibration schemas (pm-state.md)
  • Fat query_project tool schema → one read tool + three write tools (agent-tools.md)
  • Webhook mechanics → poll + reconcile only in v1 (NAT), behind a ChangeSource interface (decisions.md D2)
  • Cold-start distributions → lognormal per-bucket priors in code (decisions.md D3)