--- phase: 04-input-sources plan: 01 subsystem: build-system tags: [dependencies, bootstrap, wave-0] requires: [] provides: - go-git/v5 module available for git history traversal - atotto/clipboard module available for cross-platform clipboard - golang.org/x/exp/mmap available for memory-mapped large file reads affects: - go.mod - go.sum tech-stack: added: - github.com/go-git/go-git/v5 v5.17.2 - github.com/atotto/clipboard v0.1.4 - golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 patterns: [] key-files: created: [] modified: - go.mod - go.sum decisions: - Ran go get + go mod download (not go mod tidy) so unused modules remain pinned until Wave 1 imports them - Accepted `// indirect` markers on all three modules — they will be promoted to direct requires when plans 04-02/04-03/04-04 add imports metrics: duration: "~1 min" completed: 2026-04-05 tasks_completed: 1 files_modified: 2 --- # Phase 4 Plan 1: Dependency Bootstrap Summary Added three external Go modules (go-git/v5, atotto/clipboard, x/exp/mmap) that Phase 4 input-source plans require, so Wave 1 parallel work can compile cleanly without dependency resolution thrash. ## Objective Resolve and record the three external Go dependencies needed for Phase 4 input sources — git history (INPUT-02), clipboard (INPUT-05), and memory-mapped large file reads (CORE-07) — in go.mod/go.sum so downstream plans compile on first attempt. ## What Was Built ### Task 1: Add go-git, clipboard, x/exp/mmap (commit 0f30c0d) Resolved the three modules via `go get` at `@latest`: | Module | Version | Purpose | | ------------------------------- | ---------------------------------------- | ------------------------------------ | | `github.com/go-git/go-git/v5` | v5.17.2 | Git history traversal (INPUT-02) | | `github.com/atotto/clipboard` | v0.1.4 | Cross-platform clipboard (INPUT-05) | | `golang.org/x/exp` | v0.0.0-20260312153236-7ab1446f8b90 | `mmap` subpackage for CORE-07 | Transitive additions pulled in by go-git: `dario.cat/mergo`, `Microsoft/go-winio`, `ProtonMail/go-crypto`, `cloudflare/circl`, `cyphar/filepath-securejoin`, `emirpasic/gods`, `go-git/gcfg`, `go-git/go-billy/v5`, `golang/groupcache`, `jbenet/go-context`, `kevinburke/ssh_config`, `pjbgf/sha1cd`, `sergi/go-diff`, `skeema/knownhosts`, `xanzy/ssh-agent`, `gopkg.in/warnings.v0`. All three target modules are listed in `go.mod` under the indirect require block; they will be promoted to direct requires automatically by `go mod tidy` when Wave 1 plans add import statements. ## Verification Results - `go build ./...` — exit 0 - `go vet ./...` — exit 0 - `grep -c "go-git/go-git/v5\|atotto/clipboard\|golang.org/x/exp" go.mod` → 3 - `go.sum` contains checksums for all three modules and their transitive deps ## Deviations from Plan ### [Rule 3 - Blocking] Skipped `go mod tidy` - **Found during:** Task 1 verification - **Issue:** The plan's step sequence ended with `go mod tidy`, but tidy removes modules with no importing source file. Running it erased all three target modules from go.mod entirely (not even indirect), failing the acceptance criteria (`grep "github.com/go-git/go-git/v5" go.mod` returned nothing). - **Fix:** Re-added the three modules with `go get`, then ran `go mod download` (which populates go.sum without pruning unused modules) instead of `go mod tidy`. All three modules are now recorded as `// indirect` in go.mod — they will be auto-promoted to direct requires by the first Wave 1 plan that imports them. - **Files modified:** go.mod, go.sum - **Commit:** 0f30c0d - **Rationale:** The plan explicitly stated "If `go mod tidy` moves a module to indirect, that is acceptable only if no source file yet imports it" — so indirect status is an allowed outcome. `go mod download` achieves the same checksum registration while keeping the modules in go.mod. ## Decisions Made 1. **Skip `go mod tidy` for bootstrap commits** — Use `go mod download` instead when adding deps ahead of their consumers, so modules stay pinned in go.mod. 2. **Accept indirect status** — Wave 1 plans will promote these three modules to direct requires when they add import statements; no manual edit needed now. ## Files Modified - `go.mod` — 3 target modules + 16 transitive modules added - `go.sum` — checksums for all new modules ## Known Stubs None. This plan only touches module declarations; no source code, no stubs. ## Metrics | Metric | Value | | --------------- | ------------------------------ | | Tasks completed | 1/1 | | Commits | 1 (0f30c0d) | | Files modified | 2 (go.mod, go.sum) | | Duration | ~1 minute | | Deviations | 1 (Rule 3 — skip `mod tidy`) | ## Next Steps Wave 1 plans (04-02 git source, 04-03 url source, 04-04 clipboard source, plus CORE-07 mmap reader) can now import from these modules without running their own `go get`. `go mod tidy` will naturally promote them to direct requires as their first import lands. ## Self-Check: PASSED - FOUND: go.mod contains `github.com/go-git/go-git/v5 v5.17.2` - FOUND: go.mod contains `github.com/atotto/clipboard v0.1.4` - FOUND: go.mod contains `golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90` - FOUND: commit 0f30c0d in git log - VERIFIED: `go build ./...` exits 0 - VERIFIED: `go vet ./...` exits 0