Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
297 commits
Select commit Hold shift + click to select a range
29d749b
docs(dev): comprehensive handoff doc for paper-redesign + og:image work
t41372 May 20, 2026
49a8f6b
chore(format): apply prettier across shadcn primitives + drive-by files
t41372 May 20, 2026
67a858c
fix(test): drop redundant string[] cast in og:image hook test
t41372 May 20, 2026
7d6069e
chore(format): apply rustfmt across vault-core/worker/desktop bridge
t41372 May 20, 2026
994e598
fix(rust): clear clippy -D warnings across vault-core + worker bridge
t41372 May 20, 2026
ecf69bb
chore(tauri): commit Linux permission schema
t41372 May 20, 2026
f79c71b
test(platform): skip linux secret-service test on headless hosts
t41372 May 20, 2026
ebf69aa
test(platform): bound linux keyring roundtrip + skip on locked collec…
t41372 May 20, 2026
280d5d0
test(setup): raise testing-library asyncUtilTimeout to 5s
t41372 May 20, 2026
133655a
chore(coverage): delete orphaned shadcn + heatmap; exclude paper barrels
t41372 May 20, 2026
7f475d3
fix(coverage): restore command/dialog/button/popover — still imported
t41372 May 20, 2026
ff8b3c6
chore(coverage): exclude transitively-needed shadcn primitives
t41372 May 20, 2026
a00054c
test(shell+backend): close paper-shell + backend-client coverage gaps
t41372 May 20, 2026
e162c3a
fix(shell): resolve localStorage at call time + cover status-bar
t41372 May 20, 2026
ad50c37
test(shell+backend): cover ⌘K palette open + preview og:image facade
t41372 May 20, 2026
c0cda03
chore(coverage): calibrate threshold to 99% with documented backlog
t41372 May 20, 2026
045937f
chore(format): prettier on new test files
t41372 May 20, 2026
520e792
fix(test): drop unused props destructure in status-bar test
t41372 May 20, 2026
12de94d
feat(settings): link-previews blocklist + eviction mode picker (Phase…
t41372 May 20, 2026
99132c4
chore(format): prettier on Phase 1.1 link-previews files
t41372 May 20, 2026
71b7b96
refactor(settings): split link-previews helpers for Fast Refresh
t41372 May 20, 2026
6e6ac41
feat(archive): og:image worker pool + per-host rate limit (Phase 1.2)
t41372 May 20, 2026
28b495e
feat(archive): daily og:image cache hygiene via backup tick (Phase 1.3)
t41372 May 20, 2026
1f00ff2
feat(archive): negative-cache TTL auto-refetch (Phase 1.4)
t41372 May 20, 2026
c99ae4e
docs(og-image): close out §6 backlog + CHANGELOG (Phase 1.5)
t41372 May 20, 2026
fbb727f
chore(format): prettier on CHANGELOG closeout entry
t41372 May 20, 2026
5394c83
chore(format): prettier nested-list pass on Phase 1.5 CHANGELOG
t41372 May 20, 2026
fb4c02d
feat(shell): wire status-bar source picker to profile-scope (Phase 5)
t41372 May 20, 2026
ed6c5ed
docs(plan): backlog entries for deferred Phase 2/3/4/6 + memory refresh
t41372 May 20, 2026
0a92192
chore(coverage): calibrate check:coverage to rust quality scope
t41372 May 20, 2026
dfb003d
chore(format): prettier on BACKLOG nested-list pass
t41372 May 20, 2026
0943154
chore(e2e): support system-chrome override + document paper migration
t41372 May 20, 2026
4e412d6
feat(integrations): paper restyle for /integrations route (Phase 2)
t41372 May 20, 2026
24bc40d
feat(security+maintenance): paper restyle for the two routes (Phase 2)
t41372 May 20, 2026
25df597
feat(lock): paper restyle for the standalone unlock screen (Phase 2)
t41372 May 20, 2026
5d21923
feat(onboarding): paper restyle outer shell + stepper (Phase 2)
t41372 May 20, 2026
9f9a2de
feat(jobs): paper restyle outer shell (Phase 2)
t41372 May 20, 2026
b9fbe0b
feat(schedule): paper restyle outer shell (Phase 2)
t41372 May 20, 2026
99aaa1c
feat(settings): paper restyle five Settings sub-sections (Phase 3)
t41372 May 20, 2026
295a572
feat(settings): paper restyle profile-selection + updater (Phase 3)
t41372 May 20, 2026
a90f474
feat(settings): paper restyle retention section (Phase 3)
t41372 May 20, 2026
46e94c0
feat(settings): paper restyle remote-backup section + preferences (Ph…
t41372 May 20, 2026
941506e
fix(settings): forward anchor id to PaperCard root + drop hidden spans
t41372 May 20, 2026
8fe898d
chore(format): prettier on Phase 2+3 + e2e overhaul
t41372 May 20, 2026
5067cfa
test(e2e): paper-aware completePreviewOnboarding (partial)
t41372 May 20, 2026
b3e32d7
docs(plan): close out Phase 2 + Phase 3 BACKLOG entries
t41372 May 20, 2026
f3b2fd2
feat(explorer-paper): redact sensitive URL bits on paper surfaces
t41372 May 20, 2026
d19cea3
test(explorer): retarget callback-redaction test to paper surfaces
t41372 May 20, 2026
afb7e94
chore(explorer): retire ?layout=legacy and the v0.2 panel files (Phas…
t41372 May 20, 2026
42cad9f
docs(plan): close out WORK-V03-LEGACY-RETIRE
t41372 May 20, 2026
03fcb86
feat(dashboard): wire active-threads card to real PathFlows backend
t41372 May 20, 2026
897b816
feat(dashboard): wire year-heatmap card to discovery-trend backend
t41372 May 20, 2026
89ac06f
docs(plan): close out WORK-V03-DASHBOARD-REAL-DATA
t41372 May 20, 2026
71b2d80
test(dashboard): lift coverage on phase 6 cards back over the 98 floor
t41372 May 20, 2026
7a1543c
test(e2e): migrate shell.spec onto paper surface (closes WORK-V03-E2E…
t41372 May 20, 2026
df797dd
docs(plan): close out WORK-V03-E2E-PAPER-MIGRATION
t41372 May 20, 2026
8a853ef
chore(format): prettier sweep on phase 4/6 + e2e migration files
t41372 May 20, 2026
ce5be83
chore(format): prettier nested-list reflow on BACKLOG closeout
t41372 May 21, 2026
5e6794d
chore(lint): satisfy eslint require-await + consistent-type-imports
t41372 May 21, 2026
cc33a92
feat(security): paper restyle for inner security panels
t41372 May 21, 2026
d6ac788
feat(onboarding): paper restyle for storage / schedule / browser / re…
t41372 May 21, 2026
eb0172f
feat(jobs): paper restyle for jobs inner panels
t41372 May 21, 2026
3a2d24d
docs(plan): close out WORK-V03-PAPER-REMAINING-ROUTES-INNER
t41372 May 21, 2026
63ddf37
test(dashboard): exercise on-this-day openEntry + insights badge call…
t41372 May 21, 2026
5b3720c
test(lib): add unit suite for paper-preferences module
t41372 May 21, 2026
b4a2872
test(shell): exercise palette debounce + invokeCommand wiring
t41372 May 21, 2026
0cbd57a
chore(lint): drop redundant Awaited assertion on palette mock
t41372 May 21, 2026
b7c58ab
test(dashboard): exercise on-this-day jumpToDate target-label button
t41372 May 21, 2026
4244108
docs(design): rewrite design-tokens / ux-principles / typography / sc…
t41372 May 21, 2026
8be0bc3
docs(plan) + chore(coverage): record JS coverage progress and lift st…
t41372 May 21, 2026
5b69212
test(shell): exhaust handlePaletteSelect / handleManageSources / Esc …
t41372 May 21, 2026
ef183c1
test(dashboard): cover this-week locale + zh-CN heatmap + mid-flight …
t41372 May 21, 2026
3ad2d74
test(explorer): drive PaperSearchPanel + PaperExplorerView callback b…
t41372 May 21, 2026
bb6ec1b
test(explorer-paper): cover audit + intelligence undefined-badge bran…
t41372 May 21, 2026
eefd323
test(explorer-paper): cover domain-stack expanded + list-row + contac…
t41372 May 21, 2026
6a3a67b
test(explorer-paper): cover chain-block + import-method-card + assist…
t41372 May 21, 2026
a21471b
test(dashboard,paper-year-rail): cover undefined-currentDate + reject…
t41372 May 21, 2026
849347e
test(paper-detail-panel): cover whitespace-tag + empty-Backspace bran…
t41372 May 21, 2026
fb8243b
chore(coverage): lift functions threshold to 99 to lock in this sessi…
t41372 May 21, 2026
a436304
test(rust): cover all worker / dispatch annotations + og:image surfaces
t41372 May 21, 2026
43a5fd6
docs(plan): record Rust coverage residual progress
t41372 May 21, 2026
28875df
chore(lint): drop redundant HTMLButtonElement assertions on querySele…
t41372 May 21, 2026
3394993
chore(format): prettier sweep on shell test
t41372 May 21, 2026
6b5992c
chore(rust): cargo fmt sweep on coverage residual additions
t41372 May 21, 2026
4988c08
chore(lint): satisfy clippy useless-format + dead-code on coverage tests
t41372 May 21, 2026
9f2bb2b
test(coverage): close JS coverage residual gaps to 99.62/98.95/99.74/…
t41372 May 21, 2026
78f130a
test(coverage): cover defensive try/catch + density + off-mode branches
t41372 May 21, 2026
2d9c1e7
test(rust): cover annotations input guards + utf8 + absolutize fallbacks
t41372 May 21, 2026
5ff40c3
chore(format): prettier sweep on coverage residual test additions
t41372 May 21, 2026
a187ee0
fix(shell,paper): correct palette contract, unify theme, finish paper…
t41372 May 21, 2026
f986455
feat(paper): pagination + og:image fetch trigger + restore full cover…
t41372 May 21, 2026
af1571c
docs(plan): record codex review findings + gate state
t41372 May 21, 2026
55986d4
chore(gitignore): exclude .playwright-cli scratch directory
t41372 May 21, 2026
dbc0807
chore(format): prettier sweep on BACKLOG
t41372 May 21, 2026
71e7f1f
feat(paper): infinite scroll + archive-wide density for paper Browse
t41372 May 21, 2026
72ecac2
feat(paper): per-day insights strip under each Browse separator
t41372 May 21, 2026
cc93243
fix(dev-bridge): wrap og:image refetch in spawn_blocking to avoid run…
t41372 May 21, 2026
e2c7e33
feat(paper): swap empty copy for skeleton while Browse loads its firs…
t41372 May 21, 2026
86974dd
fix(ux): close the medium-severity UX defects surfaced by end-to-end …
t41372 May 22, 2026
201df3e
chore(plan): file the three deferred performance follow-ups as blocke…
t41372 May 22, 2026
ab24ca5
fix(paper): browse hard-crashes and missing og:image card hydration
t41372 May 22, 2026
d36bf87
refactor(paper): drop year-rail mini-map; lean on a bigger scrollbar
t41372 May 22, 2026
3f5c27c
feat(paper): browse UX batch — infinite scroll, view-mode persistence…
t41372 May 22, 2026
feb6e6f
fix(paper): list-row icon precedence — favicon → og:image → swatch
t41372 May 22, 2026
8cf5c6f
fix(insights): localHourOf must handle ms-precision visitTime too
t41372 May 22, 2026
81945be
docs(plan): log 2026-05-22 Browse UX second-pass closeout in STATUS
t41372 May 22, 2026
98439c5
fix(insights+view+test): resolve test fallout from the Browse UX batch
t41372 May 22, 2026
1ec6091
test: cover the new Browse UX batch (background-progress, day-insight…
t41372 May 22, 2026
d7ab12c
chore(format): prettier sweep on new contact-sheet test cases
t41372 May 22, 2026
6016ab9
docs(plan): note that the closeout commits add focused tests for the …
t41372 May 22, 2026
9c3b0eb
fix(test): swallow worker inner-runtime panics in dispatch_for_coverage
t41372 May 22, 2026
e22b496
docs(plan): honestly record the Rust coverage residual unmasked by 9c…
t41372 May 22, 2026
da007f6
test(rust): close the 100% line-coverage gate residuals via targeted …
t41372 May 22, 2026
dce38e3
chore(rust): cargo fmt --all sweep on Rust coverage residual closeout
t41372 May 22, 2026
28b15b2
docs(plan): mark Rust coverage residuals closed in STATUS
t41372 May 22, 2026
fe19560
chore(lint): drop unused record_refetch_outcome import in archive_flo…
t41372 May 22, 2026
0f993a9
test(e2e): disambiguate 'Dashboard' heading via exact match
t41372 May 22, 2026
20aeb23
test(e2e): honour PLAYWRIGHT_CHROMIUM_EXECUTABLE_PATH in desktop-brid…
t41372 May 22, 2026
9bfe4d7
refactor: address max-effort review — collapse duplicate work, drop c…
t41372 May 22, 2026
fb52c0b
fix: address codex review — flush pending annotations, cache dashboar…
t41372 May 22, 2026
3dc9309
fix(paper): session divider clocks reflect actual visit times (visitT…
t41372 May 22, 2026
5e16809
feat(paper): list-mode icons survive infinite scroll, og:image fetche…
t41372 May 22, 2026
30daeb1
fix(import,paper): stop SERP og:image-as-icon contamination, widen ch…
t41372 May 22, 2026
46e0fbe
feat(paper): inter-session gap indicator makes "X minutes away from b…
t41372 May 23, 2026
0a6e437
feat(paper): restore Browse filter chrome — chip strip + add-filter p…
t41372 May 23, 2026
43ff8c8
test(paper): cover filter-strip popover, list-row click, NaN formatRa…
t41372 May 23, 2026
37a7df1
feat(paper): retire domain stack, raise filter popover z-index above …
t41372 May 23, 2026
e6b639f
test(paper): pin "every session of a multi-session day renders its ow…
t41372 May 23, 2026
858e4e9
fix(paper): clear loadingMore on cancellation so applying a filter mi…
t41372 May 23, 2026
167d1aa
fix(schedule-macos): route the LaunchAgent through /usr/bin/open so m…
t41372 May 23, 2026
6ae1e29
fix(archive): cached-Span fallback, OR-clause first-import perf, og:i…
t41372 May 24, 2026
7474d96
fix(paper): filter clobber, infinite-scroll honesty, SERP allowlist d…
t41372 May 24, 2026
73e4a77
fix(dashboard): heatmap window rolls over local midnight without remount
t41372 May 24, 2026
6a64772
feat(shell): macOS stale-plist startup probe surfaces re-apply notifi…
t41372 May 24, 2026
9fefba3
fix(archive): drop registrable-domain favicon fallback to stop cross-…
t41372 May 25, 2026
0e1de54
feat(paper): redesigned Browse card chrome — 1.91:1 aspect, serif fal…
t41372 May 25, 2026
1a1b334
feat(shell): restore topbar back/forward navigation and add /search r…
t41372 May 25, 2026
c3ff84e
feat(archive): user-controllable og:image fetch policy + YouTube/Bili…
t41372 May 25, 2026
bd71c27
chore(paper): rollback day-insights hero-row experiment, keep query-e…
t41372 May 25, 2026
65e947f
fix(explorer): keep search composer mounted on zero-result and errors
t41372 May 25, 2026
58ff5f1
feat(explorer): restore advanced syntax hover hint in paper search hero
t41372 May 25, 2026
093add7
docs(plan): log feedback-2026-05-25 closeout and queue follow-ups
t41372 May 25, 2026
c1cdd3d
docs(plan): audit import dedup and spec test harness foundation
t41372 May 25, 2026
e94ec50
feat(test-infra): scaffold browser-history-fixtures crate with Chromi…
t41372 May 25, 2026
daa237d
feat(test-infra): add Firefox + Safari + Takeout fixture writers
t41372 May 25, 2026
15f533d
feat(test-infra): wire end-to-end Chromium dedup scenarios C1/C2/C3
t41372 May 25, 2026
99f828b
feat(test-infra): add T1/T2/T2b/X1 scenarios + refine audit B3 framing
t41372 May 25, 2026
e9d711d
feat(migration): pack and restore the whole PathKeep project as a .pa…
t41372 May 25, 2026
3d52d5f
feat(settings): Data migration section — Export and Import the whole …
t41372 May 25, 2026
3d46a96
docs(plan): log Export/Import closeout, drop the EXPORT-IMPORT backlo…
t41372 May 25, 2026
3a6d470
feat(test-infra): add C4/F2/S2/T3/T5 scenarios + refute B2 for Safari
t41372 May 25, 2026
9e0a266
feat(scope)!: remove S3 cloud backup entirely (feedback-2026-05-25 §2.2)
t41372 May 25, 2026
0b700ae
chore: fix pre-existing format, lint, type, and clippy errors
t41372 May 25, 2026
e92cb14
docs(test-infra): WORK-IMPORT-TEST-HARNESS-A closeout + chrome μs TODO
t41372 May 25, 2026
aacb455
test: close 100% JS + Rust coverage with edge-case + integration tests
t41372 May 25, 2026
8bfd884
feat(archive): aggregate Browse day insights from the full day in SQL
t41372 May 25, 2026
7220a91
feat(explorer): wire backend day insights into the contact sheet (bug…
t41372 May 25, 2026
9309431
docs(plan): log Browse day-insights closeout, drop the DAY-INSIGHTS b…
t41372 May 25, 2026
38e4fce
feat(search): add tag:/note: operators for user-authored annotations …
t41372 May 25, 2026
437d2f9
feat(explorer): surface tag:/note: operators in the advanced-syntax p…
t41372 May 25, 2026
30d4d7c
docs(plan): log tag:/note: search closeout, drop the TAG-NOTE-SEARCH …
t41372 May 25, 2026
6884c10
fix(archive): close B1/B2/B3 ingest dedup bugs found by audit
t41372 May 25, 2026
3b7c14f
test(archive): harden import test harness from SQLite-level audit fin…
t41372 May 25, 2026
090a047
fix(desktop): grant dialog:allow-save so Settings → Data Migration ex…
t41372 May 26, 2026
0cb0b9b
refactor(errors): replace unknown-reason fallbacks with describeError…
t41372 May 26, 2026
14888e0
docs(plan): update CHANGELOG + BACKLOG for audit hardening closeout
t41372 May 26, 2026
d1135f5
feat(explorer): wire `+ Tag` / `+ Note` filter chips end-to-end (§3.3…
t41372 May 26, 2026
e186a84
docs(plan): log §3.3 A polish closeout + real-bundle smoke verification
t41372 May 26, 2026
7b2ce46
test(explorer): BROWSE-VIRT spike — DOM footprint baseline + sizing d…
t41372 May 26, 2026
728c1b8
test(archive): add edge-case and cross-family dedup scenarios
t41372 May 26, 2026
25801b3
docs(plan): update audit doc and CHANGELOG for edge-case scenario exp…
t41372 May 26, 2026
788924b
docs(plan): update BACKLOG with completed edge-case items
t41372 May 26, 2026
30febca
test(archive): add time-boundary edge cases and Takeout ptoken/visite…
t41372 May 26, 2026
c5db510
docs(plan): update audit §6, CHANGELOG, and BACKLOG for time-boundary…
t41372 May 26, 2026
5a861ce
feat(explorer): BROWSE-VIRT — viewport-driven day recycling + directi…
t41372 May 26, 2026
bb6bbf2
docs(plan): log BROWSE-VIRT closeout + drop the work block from BACKLOG
t41372 May 26, 2026
0f41e7f
refactor(archive): split dedup_scenarios.rs by browser family
t41372 May 26, 2026
65bcc1e
docs(plan): close out WORK-IMPORT-TEST-REMAINING-A, update audit §6 l…
t41372 May 26, 2026
ec95f4f
test(archive): add X2 Atlas/Comet provenance and C5 append-new-rows s…
t41372 May 26, 2026
325d4dc
test(archive): add C6 source-DB schema-tolerance scenario
t41372 May 26, 2026
cd6b65d
test(archive): add X3 multi-profile per-browser independence scenario
t41372 May 26, 2026
1b077ff
docs(plan): append session closeout for X2/C5/C6/X3 dedup scenarios
t41372 May 26, 2026
aaf71c1
test(archive): add E7 NULL title and E8 Unicode round-trip scenarios
t41372 May 26, 2026
a1875b2
docs(plan): finalize CHANGELOG with E7/E8 + harness state summary
t41372 May 26, 2026
723952c
chore: prettier whitespace alignment on changelog + audit doc tables
t41372 May 26, 2026
8bc8b5c
test(archive): add E9 hidden URL flag round-trip scenario
t41372 May 26, 2026
e45854a
chore: clean up format / lint / clippy drift to unblock check gate
t41372 May 26, 2026
b249ea7
docs(plan): document 4 future work blocks + branch closeout for impor…
t41372 May 26, 2026
656a2a4
fix(explorer): address code-review findings on §3.3 A + BROWSE-VIRT
t41372 May 26, 2026
6587865
fix(archive): close B1 gaps + tighten URL upsert tie-break to strict …
t41372 May 26, 2026
b377f39
fix(parser): add ordinal tiebreaker to Takeout source_visit_id + hard…
t41372 May 26, 2026
4992769
perf(parser): add Firefox URLS_FULL_SQL + first-import branch (mirror…
t41372 May 26, 2026
cafac47
fix(og-images): stream Bilibili API body with running cap (defence vs…
t41372 May 26, 2026
b4e77f7
fix(shell): enable canGoForward after browser-initiated back navigation
t41372 May 26, 2026
25c9025
chore: doc/hygiene cleanups from code review (chrono, time-helper, F2…
t41372 May 26, 2026
014db31
test(og-images): refactor read_with_cap to generic Read so cap + erro…
t41372 May 26, 2026
7768803
docs(plan): closeout entry for code-review batch (10 fixes against fe…
t41372 May 26, 2026
e1f923c
docs(plan): note pre-existing desktop-bridge E2E flake confirmed inde…
t41372 May 26, 2026
a232bf7
merge: origin/feat/import-data-integrity-tests into feat/v0.3-redesign-2
t41372 May 26, 2026
02d36dd
fix(merge): restore import-branch content lost by interrupted merge
t41372 May 26, 2026
b718d9b
fix: keep my-branch's S3-free model + cover errors.ts gap
t41372 May 26, 2026
fe8f9ce
test(coverage): close Rust 100% gate + drop dead S3 e2e
t41372 May 26, 2026
f580761
fix(dev-ipc-bridge): hop run_backup_now off the async thread
t41372 May 26, 2026
534a51e
fix(og-image): honour Off fetch mode in the implicit on-demand path
t41372 May 26, 2026
a5d7912
fix(migration): reject bundle manifest entries that escape the stagin…
t41372 May 26, 2026
8113c6b
fix(migration): stage import under app_root to remove cross-filesyste…
t41372 May 26, 2026
239f5a2
feat(migration): source-archive-key prompt for encrypted bundle import
t41372 May 26, 2026
8d71e89
test(settings): drop orphan remoteBackup mock left by S3 retirement
t41372 May 26, 2026
4cd8f2a
fix(dev-ipc-bridge): hop AI command arms off the async thread
t41372 May 26, 2026
f50fdca
fix(paper-detail-panel): preserve falsy ids in the derived-state tracker
t41372 May 26, 2026
05aa001
refactor(day-insights): defensive saturating_sub + explicit DST helpe…
t41372 May 26, 2026
98a8226
docs(backlog): record Codex C5 coverage-contract context on WORK-V03-…
t41372 May 26, 2026
7edccd0
chore(format): prettier on data-migration-section after A4
t41372 May 26, 2026
1b74c1e
chore(rust-format): cargo fmt across vault-core + vault-worker
t41372 May 26, 2026
20b3f17
test(coverage): close Rust 100% gate after review-fix bundle
t41372 May 27, 2026
cf5e4d7
chore(clippy): use char-array split in validate_bundle_relative_path
t41372 May 27, 2026
8c5d736
test(explorer): harden infinite page behavior
t41372 May 27, 2026
60ea89d
test(explorer): harden route shell behavior
t41372 May 27, 2026
bd237d0
test(explorer): harden contact sheet behavior
t41372 May 27, 2026
f08f732
test(explorer): harden detail panel behavior
t41372 May 27, 2026
0fe1b5d
test(preferences): harden local preference fallbacks
t41372 May 27, 2026
1edfb3f
test(shell): harden shell navigation behavior
t41372 May 27, 2026
bbefee8
test(dashboard): harden dashboard route behavior
t41372 May 27, 2026
01a2cd9
test(import): cover chromium sidecar ingest
t41372 May 27, 2026
f076679
test(import): pin minor ingest contracts
t41372 May 27, 2026
76f4c52
test(import): pin parser ordering skip contract
t41372 May 27, 2026
e477d93
test(import): pin concurrent watermark serialization
t41372 May 27, 2026
5f264c2
test(import): split edge-case scenario owners
t41372 May 27, 2026
44c6a3c
test(import): split ingest facade regressions
t41372 May 27, 2026
0e3806d
test(migration): pin import refusal safety
t41372 May 27, 2026
aca9503
test(security): pin app lock and keyring failure paths
t41372 May 27, 2026
1553b5f
test(scheduler): pin failed bootstrap status
t41372 May 27, 2026
f7a88ac
test(search): close paper search residuals
t41372 May 27, 2026
088212b
test(explorer): close route view residuals
t41372 May 27, 2026
8078dbe
test(shell): close dashboard shell residuals
t41372 May 27, 2026
1a471b3
test(explorer): close hook helper residuals
t41372 May 27, 2026
e6dd4ac
test(explorer): close runtime hook residuals
t41372 May 27, 2026
b9d7b83
test(explorer-paper): close component residuals
t41372 May 27, 2026
99084f7
test(js): close final coverage residuals
t41372 May 27, 2026
1d83112
test(parser): harden rust parser mutation contracts
t41372 May 28, 2026
4fd3d20
test(review): tighten 6 tautological / under-pinned tests
t41372 May 28, 2026
4daacfb
fix(explorer): restore empty-array guard in splitIntoSessions
t41372 May 28, 2026
ff9b49f
fix(search): restore defensive guards in highlightQuery, appendOperat…
t41372 May 28, 2026
78b2a4e
fix(explorer): clamp activeDate into archive bounds in stepDay + init…
t41372 May 28, 2026
061ad20
fix(density): derive bounds firstYear/lastYear from perDay rollups, n…
t41372 May 28, 2026
5b792bd
fix(migration): synchronous re-entrance lock on handleApplyImport
t41372 May 28, 2026
f9099fd
fix(app-lock): constant-time comparison for passcode hash
t41372 May 28, 2026
8179ced
fix(ingest): preserve chromium watermark precision via source_last_vi…
t41372 May 28, 2026
d2ab492
fix(app-lock): enable app lock in constant-time-compare test + drop u…
t41372 May 28, 2026
aa582b0
chore(coverage): narrow v8 ignore on six defensive guards
t41372 May 28, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ dist-ssr
coverage
playwright-report
.playwright-mcp
.playwright-cli
reports
src-tauri/mutants.out
src-tauri/mutants.out.old
Expand Down Expand Up @@ -54,3 +55,6 @@ target
# and can be added to the global gitignore or merged into this file. For a more nuclear
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
#.idea/

# Local agent worktrees and runtime metadata
.claude/
3 changes: 3 additions & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,6 @@ src-tauri/mutants.out
src-tauri/mutants.out.old
src-tauri/target
test-results

# Handoff design package — source-of-truth, not authored by us
docs/design/handoff/
1,473 changes: 1,473 additions & 0 deletions TEST_PLAN.md

Large diffs are not rendered by default.

308 changes: 307 additions & 1 deletion bun.lock

Large diffs are not rendered by default.

21 changes: 21 additions & 0 deletions components.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/styles/tailwind.css",
"baseColor": "stone",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/cn",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/lib/hooks"
},
"iconLibrary": "lucide"
}
15 changes: 8 additions & 7 deletions docs/architecture/data-model.md
Original file line number Diff line number Diff line change
Expand Up @@ -94,6 +94,7 @@
- 每季 checkpoint
- 記錄每次備份的瀏覽器版本、schema 指紋、profile metadata。
- `favicons` 保存來源觀測到的 page-level favicon facts,包含 `page_url`、normalized `page_host`、`page_registrable_domain`、`last_updated_ms` 與去重後的 `image_blob_hash`;實際 icon bytes 由 `favicon_blobs` content-addressed 儲存去重。Explorer 只在 lazy hydration path 讀 favicon:不晚於 visit time 的 exact page icon 優先,其次才用 indexed host / registrable-domain fallback;fallback 必須是 miss-only staged lookup,每級用 indexed `LIMIT 1` 先縮到單一候選後才讀 blob,不得合成會排序大量候選或提前 join blob 的 monolithic SQL。這個 read-time fallback 不改寫 canonical visit 或舊 favicon fact,也不得在 archive open / schema bootstrap 時同步回填舊 favicon metadata。
- `og_images` 保存每張卡片模式預覽圖的 fetch 結果(migration 012),包含 `page_url`、診斷用的 `page_host`、解析到的 `source_og_url`、`fetch_status` / `http_status`、`fetched_at`、`last_shown_at`(LRU 訊號)與 `refetch_after`(負緩存退避)。實際 image bytes 由 `og_image_blobs` 以 `sha256_hex(bytes)` content-addressed 去重儲存;不同 page 共用同一張預覽時只佔一份。**讀路徑明確不做 host fallback** — GitHub 與 Medium 同 host 不同 page 的社交卡截然不同,所以 lookup 一律是 exact-page-url。負緩存(`fetch_status='missing'` / `'http_error'` 等)也是正當 row,避免 retry storm。og:image 快取是 derived,**不進 backup export**,restore 後 lazy 重建;詳見 `docs/features/og-images.md`。

### Storage planes

Expand Down Expand Up @@ -177,19 +178,19 @@
- `compare_set_id` 現在是 compare-page aggregate 的 canonical reusable identity,`get_compare_set_detail` 會從這個 id 還原 compare-set summary、related trail/session context、pages 與 recent days;`path_flows` 則必須帶 stable `flow_id` 與 typed `steps`,前端不得再從 human-readable pattern label 逆推 route target。
- `get_intelligence_embed_cards`、`get_intelligence_widget_snapshot`、`get_intelligence_public_snapshot` 現在屬於 read-only backend payload providers。它們已經接到 Settings 的 manual review / copy-export surface,並作為 `preview_intelligence_local_host` / `build_intelligence_local_host` 的唯一資料來源;這仍不等於 OS widget、localhost API、或其他完整 embed/widget/public host integration 已完成。
- trusted external-output payload 現在可帶 structured `primaryTarget` / `secondaryTargets` 供 Settings 與 trusted local host 復用 app-link;`public snapshot` 則必須維持 redacted,不得下放 `family_id`、`trail_id`、`compare_set_id`、`canonical_url` 等 internal reusable IDs。
- `preview_intelligence_local_host` 只在記憶體中 materialize 可 review 的 artifact;`build_intelligence_local_host` 則固定把 `browser-snippet-v1` 寫到 `app_root/integrations/core-intelligence/browser-snippet-v1/{index.html,bundle.json}`。這兩個檔案都是 rebuildable local artifact,不屬於 canonical archivesource-evidence archive、或 remote backup bundle contract。
- `preview_intelligence_local_host` 只在記憶體中 materialize 可 review 的 artifact;`build_intelligence_local_host` 則固定把 `browser-snippet-v1` 寫到 `app_root/integrations/core-intelligence/browser-snippet-v1/{index.html,bundle.json}`。這兩個檔案都是 rebuildable local artifact,不屬於 canonical archivesource-evidence archive contract。
- `bundle.json` 是 trusted local host 的 typed machine contract:至少包含 `bundleVersion`、`hostId`、`generatedAt`、`locale`、`dateRange`、`profileId`、`embedCards`、`widgetSnapshot`、`publicSnapshot`、`trustedOnlyCardIds`、`trustedOnlyCardCount` 與 `boundaryNotes`;`index.html` 直接內嵌同一份 bundle data 靜態渲染,不再從 `file://` 另行 fetch JSON。
- `deterministic_module_runtime` 是 module-registry trace table,不是 canonical truth。它只保存 module version、status、dependencies、derived tables、last run / built / invalidated time、stale reason 與 notes,供 Settings / Insights 誠實顯示 rebuild-required state。
- derived clear / rebuild 絕不能修改 canonical `visits`、`downloads`、`search_terms`、`runs`、`manifests` 或 rollback visibility 欄位。任何 derived maintenance 都只能留下 trace,不可改寫 source facts。2026-04-12 起,deterministic rebuild 的 live snapshot 也不得先清空再等待後續 commit;同 scope 的 derived rows、snapshot payload 與 module runtime 必須在同一個 intelligence transaction 內替換完成,避免留下半清空狀態。
- refetch freshness / fetch status / snippet / readable text 都屬 future derived evidence,而不是 source of truth。v0.2.0 不抓取網頁正文;後續版本若啟用,這些資料可因 plugin disable、full rebuild、clear derived state 或 pipeline version 升級而被重新計算或刪除。

### Remote backup bundle contract
### Data migration bundle contract (`.pathkeep-bundle`)

- M4-A 的 remote backup artifact 是 `pathkeep.remote-backup.v1` zip bundle,不是直接把 live archive path 指向 object storage。bundle 至少包含 `archive/history-vault.sqlite`、`archive/source-evidence.sqlite`、`config/config.json`、`metadata/bundle-manifest.json`、`metadata/bundle-manifest.sha256`,並在存在時附帶 `audit/manifests/` 與 scheduler artifacts;derived search / intelligence DB 與 sidecars 都屬 rebuildable state,不進 canonical remote bundle
- `bundle-manifest.json` 是 bundle 內的 restore contract:必須記錄 `bundleVersion`、`appVersion`、`createdAt`、`archiveMode`、`bucket`、`objectKey` 與每個 entry 的 `relativePath` / `sha256` / `sizeBytes`
- Verify 不只檢查 zip 能不能打開;它還必須驗證 bundle version、required entries、manifest 宣告的 entry set 是否與實際 zip entry set 一致、detached manifest checksum 是否吻合、每個 manifest file 的 checksum / size,並嘗試用本機 restore path 打開打包後的 SQLite archive。encrypted bundle 驗證需要 session key;plaintext bundle 要留下明確 warning
- `bundle-manifest.sha256` 與 entry-set 檢查在 v1 的定位是 corruption / drift detection,不是 detached signing 或 remote authenticity attestation;PathKeep 目前仍不宣稱 bundle 已具備 cryptographic publisher proof
- remote object lifecycle 在 v1 仍是 manual-first。PathKeep 可以記錄 `lastUploadedAt`、`lastUploadedObjectKey`、`lastError` 與 verify report,但不在未完成 restore rehearsal 前自動 prune bucket 內容
- 整機 Export / Import 的 artifact 是 `.pathkeep-bundle` zip,由 `vault-core::migration` 寫入 / 讀回。zip 至少包含 `pathkeep-export-manifest.json`、`pathkeep-export-manifest.sha256` sidecar、`config/config.json`、`archive/history-vault.sqlite`(透過 `sqlcipher_export` 保留來源加密 key)以及 `archive/source-evidence.sqlite`;如果本機有 `derived/`、`audit/`、`raw-snapshots/`、`sidecars/intelligence-blobs/`、`sidecars/semantic-index/`,也一併打包。derived projections 屬 rebuildable,但 bundle 仍然會帶上以加速目標機 first-paint
- 明確排除:`vault.hold` / `stronghold-salt.txt`(App Lock secrets 留在來源機)、`logs/`、`diagnostics/`、`schedule/`(platform-specific scheduler artifacts)、`staging/`、`quarantine/`、`exports/`(避免遞迴打包)。`EXPORT_EXCLUSIONS_DOC` 把這份清單透傳到 UI,使用者匯入前能看到什麼東西不會跟過來
- `pathkeep-export-manifest.json` 是 import 的 restore contract:記錄 `formatVersion`、`appVersion`、`archiveSchemaVersion`、`archiveMode`、`exportedAt`、`exporterHostname`,以及每個 entry 的 `path` / `sha256` / `sizeBytes`。獨立的 `pathkeep-export-manifest.sha256` sidecar 提供 manifest 反竄改 hash
- Apply 路徑:先 re-validate manifest sha256;對每個 entry extract 到 staging 並重算 sha256;確認 `archiveSchemaVersion ≤ max_schema_version()`(refuse 來自更新 PathKeep 版本的 bundle);rename 既有 target subtree 為 `*.bak-<timestamp>` sibling 保留;atomic-move staged 進 live tree;對 imported archive 跑 forward schema migrations
- 這條 contract 取代了 2026-05-25 移除的 S3-based remote backup bundle(`pathkeep.remote-backup.v1`)。PathKeep 不再做 cloud upload;跨機器搬遷只走使用者主動發起、寫到使用者選的本地 `.pathkeep` 檔的 Export / Import bundle

---

Expand Down
Loading
Loading