fix(repair): classify migrate_value as a repair proposal and correct the report contract - #133
Conversation
Orchestrator verification — local CI equivalence for head
|
| ci.yml job | Local equivalent | Result |
|---|---|---|
| Build + fmt + lint | just check |
gofmt clean, golangci-lint 0 issues., go build ./... OK |
| Test | just test (go test ./... -race) |
14/14 packages ok |
| Coverage (85% floor) | just coverage-check |
TOTAL 89.6%, lowest package cmd/rootline 86.9% — no package below floor |
| Tidy | go mod tidy + git diff --exit-code go.mod go.sum |
clean, no drift |
| docs-validate | branch-built binary, rootline validate --all docs/roadmap/ |
total 127, valid 127, invalid 0, errors_count 0 |
| gitleaks | gitleaks detect --source . |
1022 commits scanned, no leaks found |
| release / installer-smoke | push-gated — never run on a PR | N/A |
Commit hygiene: exactly one commit (437345f), subject identical to the PR title, no ! marker (this widens what repair apply accepts and breaks no documented contract), no AI attribution, no Co-Authored-By trailer. The pre-push cmd/rootline/ double gate is satisfied — the diff changes docs/analyze.md + docs/fix.md and .claude/skills/rootline/SKILL.md.
Merge order: #131 (slice A, base master) → #133 (slice B) → slice C (which will carry Closes #66). Retarget each child to master before merging its parent — gh pr merge --delete-branch on the base of a stacked PR closes the child, and GitHub refuses to reopen it.
Conflict watch: this diff adds a hunk adjacent to the same os.WriteFile(tgt.abs, ...) call in internal/fix/repair.go that PR #126 converts to an atomic write. Expect a textual conflict if #126 lands first; the resolution is to keep #126's atomic write and re-apply the InsertWikiLinksBeforeHeading line above it.
Reconcile this branch with master after its former parent (#127, the --output format contract) was squash-merged, alongside the validate envelope (#124) and the repair-surface contract (#133). All conflicts were additive: CHANGELOG.md, CLAUDE.md, docs/graph.md and .claude/skills/rootline/ref-query.md keep both sides, and cmd/rootline/staged_test.go keeps master's new TestGetStagedFilesIgnoresAmbientGitScope next to the existing empty-index assertions. The resulting diff against master is exactly this PR's own change: field-name validation for --where (warning) and --sort (error).
Summary
Slice B of issue #66 repairs the proposal/report boundary:
migrate_valueas a repair proposal and preserves WikiLinks while applying it;rootline/proposalsrepair contract.Verification
The orchestrator independently verified this exact tree with
just check,just test -race,just coverage-check,go mod tidy, documentation validation, and gitleaks. All checks passed; total coverage was 89.6%.Chained PR context
This PR is slice B and targets the slice A branch. It references #66 without closing it; slice C will close the issue.
GitHub issue #130 documents the current zero-check blind spot for stacked PRs whose base is not
master, so an empty check rollup is expected for this PR.