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

133 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 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](./decisions.md), [pm-state.md](./pm-state.md),
[agent-tools.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)