docs: add CLAUDE.md, TODO.md, FINDINGS.md for fleet delegation

Full domain expert session brief with architecture map, 4-phase
TODO covering test coverage (critical), hardening, AgentCI pipeline,
and Forge↔Gitea sync. Initial findings documenting package inventory,
zero-test gaps, and auth resolution.

Co-Authored-By: Virgil <virgil@lethean.io>
This commit is contained in:
Snider 2026-02-20 00:28:39 +00:00
parent 3e883f6976
commit bedcb4e652
3 changed files with 246 additions and 0 deletions

154
CLAUDE.md Normal file
View file

@ -0,0 +1,154 @@
# CLAUDE.md — go-scm Domain Expert Guide
You are a dedicated domain expert for `forge.lthn.ai/core/go-scm`. Virgil (in core/go) orchestrates your work via TODO.md. Pick up tasks in phase order, mark `[x]` when done, commit and push.
## What This Package Does
SCM integration, AgentCI dispatch, and data collection for the Lethean ecosystem. ~9K LOC across 4 sub-packages:
- **forge/** — Forgejo API client (repos, issues, PRs, labels, webhooks, orgs)
- **gitea/** — Gitea API client (repos, issues, meta) for public mirror at `git.lthn.ai`
- **git/** — Multi-repo git operations (status, commit, push, pull)
- **agentci/** — Clotho Protocol orchestrator for dual-run agent verification
- **jobrunner/** — PR automation pipeline (Forgejo webhook signals → handler dispatch)
- **collect/** — Data collection (BitcoinTalk, GitHub, market, papers, events)
## Architecture
```
forge/ Forgejo SDK wrapper (codeberg.org/mvdkleijn/forgejo-sdk)
├── client.go Config-based auth, SDK wrapper
├── repos.go Create, list, mirror repos
├── issues.go Create, list, assign issues
├── prs.go Create, list, merge PRs
├── labels.go Label management
├── webhooks.go Webhook CRUD
├── orgs.go Organisation management
├── meta.go Instance metadata
└── config.go Auth resolution (~/.core/config.yaml, env, flags)
gitea/ Gitea SDK wrapper (code.gitea.io/sdk/gitea)
├── client.go Config-based auth
├── repos.go Repo operations
├── issues.go Issue operations
├── meta.go Instance info
└── config.go Auth config
git/ Multi-repo git operations
├── git.go RepoStatus, StatusOptions, exec wrappers
└── service.go Bulk status, commit, push, pull across repos
agentci/ Clotho Protocol — dual-run agent verification
├── clotho.go Spinner orchestrator (standard vs dual-run mode)
├── config.go ClothoConfig, AgentConfig
├── security.go Security policy enforcement
└── config_test.go
jobrunner/ PR automation pipeline
├── types.go PipelineSignal, ActionResult, JobSource, Handler interfaces
├── poller.go Polling loop with tick interval
├── journal.go Execution journal (JSONL audit trail)
├── forgejo/
│ └── source.go Forgejo webhook signal source
└── handlers/
├── dispatch.go Agent task dispatch
├── completion.go Handle agent completion signals
├── enable_auto_merge.go Auto-merge when checks pass
├── publish_draft.go Publish draft PRs
├── resolve_threads.go Auto-resolve review threads
├── send_fix_command.go Send fix commands to agents
└── tick_parent.go Update parent epic progress
collect/ Data collection pipeline
├── collect.go Collector interface, pipeline orchestrator
├── bitcointalk.go Forum scraping
├── github.go GitHub API data collection
├── market.go Market data
├── papers.go Research paper collection
├── events.go Event tracking
├── excavate.go Deep data extraction
├── process.go Processing pipeline
├── ratelimit.go Per-source rate limiting
└── state.go Collection state persistence
```
## Commands
```bash
go test ./... # Run all tests
go test -v -run TestName ./... # Single test
go test -race ./... # Race detector
go vet ./... # Static analysis
```
## Local Dependencies
Resolved via `replace` in go.mod or preferably via `go.work`:
| Module | Local Path | Notes |
|--------|-----------|-------|
| `forge.lthn.ai/core/go` | varies | Framework (log, config, process) |
**Recommended**: Use a `go.work` file in your workspace root to resolve local modules rather than editing go.mod replace directives.
## Key Types
```go
// forge/client.go
type Client struct {
api *forgejo.Client
url string
token string
}
// git/git.go
type RepoStatus struct {
Name, Path, Branch string
Modified, Untracked, Staged, Ahead, Behind int
Error error
}
// jobrunner/types.go
type PipelineSignal struct {
EpicNumber, ChildNumber, PRNumber int
RepoOwner, RepoName string
PRState, Mergeable, CheckStatus string
NeedsCoding bool
IssueTitle, IssueBody string
// ... dispatch context
}
type ActionResult struct {
Action string
Success bool
Error string
Duration time.Duration
Cycle int
}
// agentci/clotho.go
type RunMode string // "standard" or "dual"
type Spinner struct {
Config ClothoConfig
Agents map[string]AgentConfig
}
```
## Coding Standards
- **UK English**: colour, organisation, centre
- **Tests**: testify assert/require, table-driven preferred
- **Conventional commits**: `feat(forge):`, `fix(jobrunner):`, `test(collect):`
- **Co-Author**: `Co-Authored-By: Virgil <virgil@lethean.io>`
- **Licence**: EUPL-1.2
- **Imports**: stdlib → forge.lthn.ai → third-party, each group separated by blank line
## Forge
- **Repo**: `forge.lthn.ai/core/go-scm`
- **Push via SSH**: `git push origin main` (remote: `ssh://git@forge.lthn.ai:2223/core/go-scm.git`)
## Task Queue
See `TODO.md` for prioritised work. Phase 1 (test coverage) is the critical path.
See `FINDINGS.md` for research notes.

48
FINDINGS.md Normal file
View file

@ -0,0 +1,48 @@
# FINDINGS.md — go-scm Research & Discovery
## 2026-02-20: Initial Assessment (Virgil)
### Origin
Extracted from `forge.lthn.ai/core/go` on 19 Feb 2026 as part of the go-ai split. Contains all SCM integration, CI dispatch, and data collection code.
### Package Inventory
| Package | Files | LOC (approx) | Tests | Coverage |
|---------|-------|--------------|-------|----------|
| forge/ | 9 | ~900 | 0 | 0% |
| gitea/ | 5 | ~500 | 0 | 0% |
| git/ | 2 | ~400 | 0 | 0% |
| agentci/ | 4 | ~300 | 1 | partial |
| jobrunner/ | 4 + handlers/ | ~1,500 | several | partial |
| collect/ | 12 | ~5,000 | 8 | unknown |
### Dependencies
- `codeberg.org/mvdkleijn/forgejo-sdk/forgejo/v2` — Forgejo API (v2)
- `code.gitea.io/sdk/gitea` — Gitea API
- `forge.lthn.ai/core/go` — Framework (log, config, viper)
- `github.com/stretchr/testify` — Testing
### Key Observations
1. **forge/ and gitea/ are structurally identical** — Same pattern: client.go, config.go, repos.go, issues.go, meta.go. Could share an interface.
2. **Zero tests in forge/, gitea/, git/** — Most critical gap. These are the foundational packages.
3. **collect/ has the most tests** — 8 test files covering all collectors. Coverage unknown.
4. **jobrunner/handlers/ has test files** — dispatch_test.go, enable_auto_merge_test.go, publish_draft_test.go, resolve_threads_test.go, send_fix_command_test.go, tick_parent_test.go. Quality unknown.
5. **agentci/ Clotho Protocol** — Dual-run verification for critical repos. Currently basic (string match on repo name). Needs more sophisticated policy engine.
### Auth Resolution
Both forge/ and gitea/ resolve auth from:
1. `~/.core/config.yaml` (forge.token/forge.url or gitea.token/gitea.url)
2. Environment variables (FORGE_TOKEN/FORGE_URL or GITEA_TOKEN/GITEA_URL)
3. CLI flag overrides (highest priority)
This is handled via core/go's viper integration.
### Infrastructure Context
- **Forge** (`forge.lthn.ai`) — Production Forgejo instance on de2. Full IP/intel/research.
- **Gitea** (`git.lthn.ai`) — Public mirror with reduced data. Breach-safe.
- **Split policy**: Forge = source of truth, Gitea = public-facing mirror with sensitive data stripped.

44
TODO.md Normal file
View file

@ -0,0 +1,44 @@
# TODO.md — go-scm Task Queue
Dispatched from core/go orchestration. Pick up tasks in order.
---
## Phase 1: Test Coverage (Critical)
forge/, gitea/, and git/ have **zero tests**. This is the top priority.
- [ ] **forge/ unit tests** — Test `New()` client creation, `GetCurrentUser()`, error handling. Mock the Forgejo SDK client. Cover: `repos.go` (create, list, mirror), `issues.go` (create, list, assign), `prs.go` (create, list, merge), `labels.go`, `webhooks.go`, `orgs.go`. Target: 70% coverage.
- [ ] **gitea/ unit tests** — Test `New()` client creation, repo/issue operations. Mock the Gitea SDK client. Cover: `repos.go`, `issues.go`, `meta.go`. Target: 70% coverage.
- [ ] **git/ unit tests** — Test `RepoStatus` methods (`IsDirty`, `HasUnpushed`, `HasUnpulled`). Test status parsing with mock git output. Test bulk operations with temp repos. Cover: `git.go`, `service.go`. Target: 80% coverage.
- [ ] **jobrunner handler tests** — handlers/ has test files but verify coverage. Add table-driven tests for `dispatch.go`, `completion.go`, `enable_auto_merge.go`. Test `PipelineSignal` state transitions.
- [ ] **collect/ test audit** — collect/ has test files for each collector. Run `go test -cover ./collect/...` and identify gaps below 60%.
## Phase 2: Hardening
- [ ] **Config resolution audit** — forge/ and gitea/ both resolve auth from `~/.core/config.yaml` → env vars → flags. Ensure consistent priority order. Document in FINDINGS.md.
- [ ] **Error wrapping** — Ensure all errors use `fmt.Errorf("package.Func: ...: %w", err)` or `log.E()` consistently. Some files may use bare `fmt.Errorf` without wrapping.
- [ ] **Context propagation** — Verify all Forgejo/Gitea API calls pass `context.Context` for cancellation. Add context to any blocking operations missing it.
- [ ] **Rate limiting** — collect/ has its own `ratelimit.go`. Verify it handles API rate limit headers from GitHub, Forgejo, Gitea.
## Phase 3: AgentCI Pipeline
- [ ] **Clotho dual-run validation**`DeterminePlan()` logic is simple (check strategy + agent config + repo name). Add tests for all code paths: standard mode, dual-run by agent config, dual-run by critical repo.
- [ ] **Forgejo signal source tests**`forgejo/source.go` polls for webhook events. Test signal parsing and filtering.
- [ ] **Journal replay**`journal.go` writes JSONL audit trail. Add test for write + read-back + filtering by action/repo/time range.
- [ ] **Handler integration** — Test full signal → handler → result flow with mock Forgejo client. Verify `tick_parent` correctly updates epic progress.
## Phase 4: Forge ↔ Gitea Sync
- [ ] **Mirror sync** — Implement repo mirroring from forge.lthn.ai (private) to git.lthn.ai (public). Strip sensitive data (research docs, credentials, internal refs).
- [ ] **Issue sync** — Selective issue sync (public issues only) from Forge to Gitea.
- [ ] **PR status sync** — Update Gitea mirror PRs when Forge PRs merge.
---
## Workflow
1. Virgil in core/go writes tasks here after research
2. This repo's session picks up tasks in phase order
3. Mark `[x]` when done, note commit hash
4. New discoveries → add tasks, flag in FINDINGS.md