Skip to content

feat(reconcile): surface indeterminate rows for review - #2893

Merged
vavallee merged 2 commits into
vavallee:mainfrom
kevinatlee:codex/reconcile-surface-indeterminate
Oct 2, 2026
Merged

vavallee merged 2 commits into
vavallee:mainfrom
kevinatlee:codex/reconcile-surface-indeterminate

Conversation

@kevinatlee

Copy link
Copy Markdown
Contributor

Summary

Surface every catalogue-reconciliation row kept because provider or profile evidence is incomplete. The response now separates informational indeterminateRows from removal candidates, and the modal renders each kept title with its provider and evidence reason. Closes #2892.

Safety invariant

Incomplete provider/profile evidence never becomes deletion evidence. Indeterminate rows remain absent from candidates, have no selection control, do not affect the removal count, and are never sent by the UI to Apply. Apply still recomputes candidates and intersects the requested IDs with the current candidate set, so submitting an indeterminate ID directly does not delete it.

Behavior before / after

Before, the API and modal exposed only summary.indeterminate, leaving users unable to audit which local rows were protected.

After, indeterminateRows reports the local book ID, title, metadata provider, and one of five display-only reasons:

  • language_unknown
  • language_evidence_lookup_failed
  • edition_evidence_unavailable
  • partial_catalogue
  • unmatched_cross_provider

The existing deletion-candidate reasons and candidate algorithm remain separate and unchanged in substance.

Jenny Han reproduction

For the English-only Hardcover case described in #2892, the modal now makes the protected rows auditable from reconciliation evidence rather than asking users to infer them from titles. The implementation does not assume that the six named titles are the six protected rows; it reports whichever local rows actually correlate to incomplete language/provider evidence at preview time.

Checklist

  • Tests added or updated
  • Doc-update gate cleared (README.md, API docs, user guide, and changelog fragment)
  • Wiki page updated for the user-facing behavior

Tests / verification

  • Focused reconciliation Go tests
  • go vet ./...
  • golangci-lint run ./... (v2.11.4; 0 issues)
  • cd web && npm run lint (0 errors; 7 pre-existing warnings)
  • cd web && npm run typecheck
  • cd web && npm run build
  • cd web && npm test (105 files, 1,175 tests)
  • git diff --check
  • go test ./cmd/... ./internal/... — attempted on Windows; unrelated existing platform assumptions fail in telemetry/ABS/path, POSIX permission, symlink, and hardlink tests. The telemetry failure passed when rerun in isolation, and all focused reconciliation tests pass.

Signed-off-by: kevinatlee <kevin.atlee@live.ca>
@github-actions github-actions Bot added the bindery-notified Discord notification already sent for this PR label Oct 1, 2026
@codecov

codecov Bot commented Oct 1, 2026 •

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016fJcCVbNnKsmj2MAAMwWj9
Signed-off-by: vavallee <vavallee@protonmail.com>
@vavallee
vavallee merged commit a9ae254 into vavallee:main Oct 2, 2026
41 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bindery-notified Discord notification already sent for this PR

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Reconcile catalogue: surface indeterminate rows for manual review

2 participants