v10 quick wins — merge, Evidence Ledger, cross-project search, export round-trip #140

Merged
claude-bot merged 7 commits from feat/v10-quick-wins into main 2026-07-18 15:13:44 +00:00
Contributor

The first, fully-verifiable batch from the v10.0.0 research-workflow backlog (4 of 13 items). Each is independent, deterministic, and shipped with tests + UI.

  • #123 — Tag & category merge. "Merge into…" on both management screens re-points every assignment (entry_tags/entry_categories/motif_categories) to the target and deletes the source, transactionally. (Category merge was missing; tag merge is now transactional too.)
  • #125 — Evidence Ledger. Per-motif certainty mix + contradicts edges, and a project-wide Open contradictions view on Insights. Contradictions can be resolved with a verdict and reopened. (migration 053)
  • #119 — Cross-project search. An "All my projects" scope spanning every accessible project (full-text + semantic + filter-only), results labeled by project.
  • #120 — Full-export round-trip. POST /api/import/full restores a full-export bundle (entries dedup-checked, tags, categories, motifs + membership, connections). Export now includes category names/colors so they round-trip. (media binaries aren't in the JSON)

Also: skip the global defaultRateLimit in NODE_ENV=test — the 500 req/15min limiter was tripping mid-suite (429s at /__test_login) now that the suite is larger; production hardening is unchanged.

Verified: 342 tests pass (48 files, +8 new), tsc clean, migration 053 applies, combined app build green. No new dependencies.

Closes #123 #125 #119 #120.

🤖 Generated with Claude Code

The first, fully-verifiable batch from the [v10.0.0](https://git.rhoving.com/rbrooks/TeaLeaves/milestones) research-workflow backlog (4 of 13 items). Each is independent, deterministic, and shipped with tests + UI. - [x] **#123 — Tag & category merge.** "Merge into…" on both management screens re-points every assignment (`entry_tags`/`entry_categories`/`motif_categories`) to the target and deletes the source, transactionally. (Category merge was missing; tag merge is now transactional too.) - [x] **#125 — Evidence Ledger.** Per-motif certainty mix + `contradicts` edges, and a project-wide **Open contradictions** view on Insights. Contradictions can be resolved with a verdict and reopened. *(migration 053)* - [x] **#119 — Cross-project search.** An "All my projects" scope spanning every accessible project (full-text + semantic + filter-only), results labeled by project. - [x] **#120 — Full-export round-trip.** `POST /api/import/full` restores a full-export bundle (entries dedup-checked, tags, categories, motifs + membership, connections). Export now includes category names/colors so they round-trip. *(media binaries aren't in the JSON)* **Also:** skip the global `defaultRateLimit` in `NODE_ENV=test` — the 500 req/15min limiter was tripping mid-suite (429s at `/__test_login`) now that the suite is larger; production hardening is unchanged. **Verified:** 342 tests pass (48 files, +8 new), tsc clean, migration 053 applies, combined app build green. No new dependencies. Closes #123 #125 #119 #120. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
feat(v10 #123): category merge + transactional tag merge
Some checks failed
CI / Images — production build (push) Successful in 54s
CI / App — typecheck, test & build (push) Successful in 1m37s
CI / API — typecheck & tests (push) Has been cancelled
8287d0b351
POST /api/categories/:id/merge re-points entry_categories AND motif_categories
to the target then deletes the source, in one transaction (same-project only).
Wrap the existing tag merge in a transaction too, so neither can leave a
half-applied merge (#123 acceptance). Tests cover both, incl. dedup on merge.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(v10 #123 ui, #125): category merge UI + Evidence Ledger
Some checks failed
CI / Images — production build (push) Has been cancelled
CI / App — typecheck, test & build (push) Has been cancelled
CI / API — typecheck & tests (push) Has been cancelled
2e82d9a57e
- #123: merge picker added to CategoryManagement (TagManagement already had one;
  a11y polish). Backend merge from prior commit.
- #125 Evidence Ledger: migration 053 adds connections.resolved_at/
  resolution_notes; GET /api/analytics/motifs/:id/evidence (certainty mix +
  contradicts edges touching members) and GET /api/analytics/contradictions
  (project-wide open); POST /api/connections/:id/resolve|unresolve. Tests cover
  the ledger, the open-list, and resolve/reopen.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(v10 #125 ui, #119): Evidence Ledger UI + cross-project search
Some checks failed
CI / Images — production build (push) Successful in 1m29s
CI / App — typecheck, test & build (push) Successful in 1m38s
CI / API — typecheck & tests (push) Failing after 3m43s
bbecc6cdcb
- #125 frontend: EvidenceLedger panel (certainty bar + contradictions with
  resolve/reopen) on the motif page; OpenContradictions section on the Insights
  dashboard.
- #119: GET /api/search?scope=all spans ACCESSIBLE_PROJECTS (default stays on the
  active project); every result carries project_name/project_slug so hits are
  labeled by project. Applies to full-text, semantic, and filter-only paths.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(v10 #120): full-export round-trip importer
Some checks failed
CI / App — typecheck, test & build (push) Successful in 2m37s
CI / Images — production build (push) Has been cancelled
CI / API — typecheck & tests (push) Has been cancelled
b711cef6a9
POST /api/import/full restores a full-export JSON bundle into a project: entries
(via checkDedup — re-importing the same data skips rather than duplicates), their
tags + categories, motifs (+ membership + categories), and typed connections
(remapping old entry ids). Reports created/skipped counts. Extend the full
export to include category names/colors on entries + motifs so they round-trip
(media binaries aren't in the JSON, so they don't). Round-trip test: export →
wipe → re-import → verify graph → re-import dedupes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(v10 #119 ui, #120 ui): search scope toggle + full-import upload
Some checks failed
CI / Images — production build (push) Successful in 1m19s
CI / App — typecheck, test & build (push) Successful in 1m32s
CI / API — typecheck & tests (push) Failing after 3m29s
4cf2635512
- #119: 'All my projects' toggle on Search (scope=all, URL-synced); results show
  a project badge when spanning projects.
- #120: 'Import full export' file upload in Settings Export, posting the bundle
  and showing created/skipped counts.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
fix(test): skip the global rate limiter in the test env + v10 changelog
Some checks failed
CI / App — typecheck, test & build (push) Successful in 3m1s
CI / Images — production build (pull_request) Successful in 46s
CI / Images — production build (push) Has been cancelled
CI / API — typecheck & tests (push) Has been cancelled
CI / API — typecheck & tests (pull_request) Has been cancelled
CI / App — typecheck, test & build (pull_request) Has been cancelled
0f5d934e99
The 500 req/15min defaultRateLimit counts every test request against one IP, so
a large suite run trips it mid-suite (429s at /__test_login). Skip it when
NODE_ENV=test; production hardening unchanged, specific limiters still apply.
Plus the v10 quick-wins changelog (#123/#125/#119/#120).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
chore(release): v9.1.0 — research-workflow quick wins
Some checks failed
CI / App — typecheck, test & build (push) Successful in 2m10s
CI / App — typecheck, test & build (pull_request) Successful in 2m6s
CI / API — typecheck & tests (push) Successful in 3m56s
CI / API — typecheck & tests (pull_request) Successful in 3m54s
CI / Images — production build (push) Failing after 20m31s
CI / Images — production build (pull_request) Failing after 20m44s
12d7a22d48
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
claude-bot deleted branch feat/v10-quick-wins 2026-07-18 15:13:45 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
rbrooks/TeaLeaves!140
No description provided.