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>
6.8 KiB
6.8 KiB
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)
- Forecast honesty: milestone forecasts as Monte Carlo cones (e.g. "80% land Mar 3–12"), never point dates. Calibration curve active after ≥20 closed issues with estimates.
- Capture speed: braindump → approved ticket set (estimates, deps, milestone) in < 2 min via agent interview.
- Responsiveness: full gitea reconcile < 5 s @ 500 issues; scheduler + Monte Carlo run < 1 s @ 200 open issues; webhook-driven updates visible < 2 s.
- Agent economy: hot context ≤ 2k tokens; works with a 4B local model for prose/ritual tasks (bigger model only for decomposition/negotiation).
- 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-staterepo 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/hardlabel 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-staterepo bootstrap. Actual (2026-07-08): yarn4 workspaces + electron shell +@commitea/corelabel schema + design system mirrored. Dogfood backlog filed onchristian/commitea: 10 labels (est/p/deadline, exclusive scopes), 5 phase milestones, 34 tracer-bullet issues with 51 native dependencies.pm-staterepo 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-statefile formats → directive/capacity/calibration schemas (pm-state.md)- Fat
query_projecttool schema → one read tool + three write tools (agent-tools.md) - Webhook mechanics → poll + reconcile only in v1 (NAT), behind a
ChangeSourceinterface (decisions.md D2) - Cold-start distributions → lognormal per-bucket priors in code (decisions.md D3)