Files
kandev/docs/plans/git-subprocess-admission/task-02-interactive-git-fanout.md
T
2026-08-24 11:09:03 +00:00

79 lines
3.3 KiB
Markdown

---
id: "02-interactive-git-fanout"
title: "Interactive Git fan-out"
status: done
wave: 2
plan: "plan.md"
spec: "../../specs/platform/requirements/git-subprocess-admission.md"
depends_on:
- "01-class-aware-admission"
---
# Task 02: Interactive Git Fan-Out
## Acceptance
- Status, log, and diff share one capacity-derived worker policy.
- Multiple simultaneous handler requests never exceed the process-wide Git cap.
- All user-request agentctl Git commands declare `interactive`, with no classless
or hardcoded secondary concurrency path.
- Existing per-repository order, response schemas, and partial results remain
unchanged.
## Verification
```bash
# Direct Go commands are required because the backend Makefile has no focused or
# race-test targets.
cd apps/backend && go test ./internal/agentctl/server/api ./internal/agentctl/server/process -run 'Test(FanOutRepos|Git.*Admission|MultiRepo.*Class)' -count=1
cd apps/backend && go test -race ./internal/agentctl/server/api ./internal/agentctl/server/process -run 'Test(FanOutRepos|Git.*Admission|MultiRepo.*Class)' -count=1
```
## Files Likely Touched
- `apps/backend/internal/agentctl/server/api/git.go`
- `apps/backend/internal/agentctl/server/api/git_fanout_test.go`
- `apps/backend/internal/agentctl/server/process/git.go`
- `apps/backend/internal/agentctl/server/process/git_pr_providers.go`
- `apps/backend/internal/agentctl/server/process/workspace_files.go`
- `apps/backend/internal/agentctl/server/process/workspace_git_cmd.go`
- `apps/backend/internal/agentctl/server/process/workspace_git_commits.go`
- `apps/backend/internal/agentctl/server/process/workspace_git_diff.go`
- Focused sibling tests for migrated operators
## Dependencies
Task 01 (`01-class-aware-admission`).
## Parallelism
Parallel-safe with Tasks 03 and 05 after Task 01. This task owns agentctl Git API
and non-poller process files; Task 03 owns backend lifecycle packages and Task 05
owns control/debug files.
## Inputs
- Spec sections: explicit work classes and consistent multi-repository behavior.
- Plan section: Interactive operations and repository fan-out.
- Existing indexed fan-out behavior in `api/git.go` and typed admission API from
Task 01.
## Output Contract
Report red tests, classification audit, fan-out worker rule, preserved response
semantics, files changed, exact command outcomes, race-test evidence, residual
risks, and synchronized task/plan status.
## Results
- RED: `TestFanOutReposRespectsLimit` failed after deriving its expected bound
from the configured capacity; the old fixed fan-out admitted five workers with
capacity three.
- GREEN: status, log, and cumulative-diff fan-out now derive their worker limit
from `subproc.GitCapacity()` while preserving indexed result order.
- User-triggered Git operator, PR-provider, workspace file, and content-at-ref
operations use `GitInteractive`; tracker-owned background paths were completed
by Task 04 with `GitBackground` admission and post-admission timeouts.
- `cd apps/backend && go test ./internal/agentctl/server/api ./internal/agentctl/server/process -run 'Test(FanOutRepos|Git.*Admission|MultiRepo.*Class)' -count=1` — 3 passed.
- `cd apps/backend && go test -race ./internal/agentctl/server/api ./internal/agentctl/server/process -run 'Test(FanOutRepos|Git.*Admission|MultiRepo.*Class)' -count=1` — 3 passed.