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>
133 lines
6.8 KiB
Markdown
133 lines
6.8 KiB
Markdown
# 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 3–12"), 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)
|