From df9a8c01fa9343e2237ac97565cea133056b79d8 Mon Sep 17 00:00:00 2001 From: thang Date: Wed, 2 Sep 2026 12:27:36 +0700 Subject: [PATCH 1/6] release: prepare KakeFlow v1.3.0 --- .github/ISSUE_TEMPLATE/bug_report.yml | 2 +- CHANGELOG.md | 29 +++++++++++++++++++++++++++ README.md | 12 +++++------ docs/OPERATIONS.md | 12 +++++------ docs/README.md | 3 ++- docs/index.html | 10 ++++----- docs/kakeflow-page.js | 12 +++++------ docs/releases/v1.3.0.md | 29 +++++++++++++++++++++++++++ package-lock.json | 4 ++-- package.json | 2 +- src-tauri/Cargo.lock | 2 +- src-tauri/Cargo.toml | 2 +- src-tauri/tauri.conf.json | 2 +- 13 files changed, 90 insertions(+), 31 deletions(-) create mode 100644 docs/releases/v1.3.0.md diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml index ea8831e..f47e28c 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.yml +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -21,7 +21,7 @@ body: id: version attributes: label: KakeFlow version - placeholder: 1.2.1 + placeholder: 1.3.0 validations: required: true - type: textarea diff --git a/CHANGELOG.md b/CHANGELOG.md index 3640c60..34362c7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,35 @@ No changes yet. +## 1.3.0 — 2026-09-02 + +### English + +- Added a read-only Connector Control Center that inventories native sources and makes account bindings an explicit posting-authorization boundary. +- Added durable refresh batches with per-source cursors, backoff, version and generation fencing, fail-closed recovery, and redacted operational summaries. +- Hardened the isolated macOS ARM64 release wrapper with canonical path checks, atomic physical-path locks, source/resource identity digests, and packaged artifact verification. +- Removed two test-only CodeQL data flows at their source and documented the remaining generated-macro false positive; the Linux-only `glib` advisory remains disclosed. +- Kept connector provider clients and credentials out of the PWA. This release does not claim direct bank aggregation or Money Forward parity. +- Published the macOS ARM64 desktop build as an ad-hoc-signed, non-notarized community artifact; the account-free PWA remains the no-Gatekeeper option. + +### Tiếng Việt + +- Bổ sung Connector Control Center chỉ đọc để kiểm kê nguồn native và dùng account binding làm ranh giới cấp quyền ghi sổ rõ ràng. +- Bổ sung refresh batch bền vững với cursor/backoff theo nguồn, version/generation fencing, khôi phục fail-closed và summary vận hành đã che dữ liệu nhạy cảm. +- Củng cố wrapper release macOS ARM64 cô lập bằng kiểm tra canonical path, khóa nguyên tử theo physical path, digest nhận dạng source/resource và xác minh artifact đã đóng gói. +- Loại hai data flow CodeQL chỉ xuất hiện trong test và ghi lại false positive còn lại từ macro sinh mã; advisory `glib` chỉ áp dụng Linux vẫn được công khai. +- Không đưa provider client hoặc credential connector vào PWA. Bản này không tuyên bố kết nối ngân hàng trực tiếp hay tương đương Money Forward. +- Phát hành desktop macOS ARM64 dưới dạng community artifact được ký ad-hoc và chưa notarize; PWA không cần account vẫn là lựa chọn không gặp Gatekeeper. + +### 日本語 + +- native source を一覧化し、account binding を明示的な記帳承認境界として扱う read-only Connector Control Center を追加しました。 +- source ごとの cursor/backoff、version/generation fencing、fail-closed recovery、秘匿化済み運用 summary を備えた durable refresh batch を追加しました。 +- canonical path 検査、physical path 単位の atomic lock、source/resource identity digest、packaged artifact 検証により、分離された macOS ARM64 release wrapper を強化しました。 +- test のみに存在した CodeQL data flow を 2 件除去し、生成 macro に残る false positive を記録しました。Linux のみ該当する `glib` advisory は引き続き開示します。 +- PWA には connector provider client と credential を含めません。本 release は銀行への直接接続や Money Forward 同等性を主張しません。 +- macOS ARM64 desktop build を ad-hoc 署名済み・未公証の community artifact として公開しました。account 不要の PWA は Gatekeeper を必要としない選択肢です。 + ## 1.2.1 — 2026-08-25 ### English diff --git a/README.md b/README.md index 901fd87..fb95aad 100644 --- a/README.md +++ b/README.md @@ -4,9 +4,9 @@ Local-first household finance for desktop and the browser, built for Japan. -Version 1.2.1 is the current stable desktop milestone. +Version 1.3.0 is the current stable desktop milestone. -[Download v1.2.1](https://github.com/thangldw/kakeflow/releases/tag/v1.2.1) · [Open the PWA](https://thangldw.github.io/kakeflow/app/) · [Product website](https://thangldw.github.io/kakeflow/) · [PWA evidence](docs/assets/demo/kakeflow-receipt-to-provenance.mp4) · [Documentation](docs/README.md) · [Changelog](CHANGELOG.md) +[Download v1.3.0](https://github.com/thangldw/kakeflow/releases/tag/v1.3.0) · [Open the PWA](https://thangldw.github.io/kakeflow/app/) · [Product website](https://thangldw.github.io/kakeflow/) · [PWA evidence](docs/assets/demo/kakeflow-receipt-to-provenance.mp4) · [Documentation](docs/README.md) · [Changelog](CHANGELOG.md) ```mermaid %%{init: {"theme":"base","themeVariables":{"background":"#FFFFFF","fontFamily":"Arial, sans-serif","lineColor":"#667085","primaryTextColor":"#172B4D"}}}%% @@ -33,7 +33,7 @@ Receipt images are processed locally with bundled PP-OCRv5 models. The receipt n The PWA foundation provides an account-free encrypted browser vault, household and account setup, local receipt OCR, source comparison, explicit approval, balanced double-entry posting, provenance, offline reload, and authenticated encrypted export/restore. IndexedDB stores encrypted events and projections; OPFS stores encrypted evidence where available, with an encrypted IndexedDB fallback. It does not yet provide desktop connectors, multi-device sync, native backup compatibility, or the complete desktop feature set. -Version 1.2.1 checks the signed stable update channel after startup and also exposes a manual check in Settings. Release QA includes synthetic receipt images and the local `/ocr-regression.html` PP-OCRv5 model gate. The [public landing page](https://thangldw.github.io/kakeflow/) presents one synthetic Tanaka-family journey from receipt review through budgets and investments, with separate Japanese, English and Vietnamese animations. +Version 1.3.0 adds a read-only Connector Control Center and durable, fail-closed refresh recovery for native sources; the PWA does not contain provider clients or credentials. It checks the signed stable update channel after startup and also exposes a manual check in Settings. Release QA includes synthetic receipt images and the local `/ocr-regression.html` PP-OCRv5 model gate. The [public landing page](https://thangldw.github.io/kakeflow/) presents one synthetic Tanaka-family journey from receipt review through budgets and investments, with separate Japanese, English and Vietnamese animations. Requirements: Node.js 20.19+ or 22.12+, Rust 1.97 and Tauri 2 platform dependencies. @@ -47,7 +47,7 @@ npm run test:pwa:e2e cd src-tauri && cargo fmt --all -- --check && cargo clippy --all-targets -- -D warnings && cargo test ``` -KakeFlow does not initiate payments or treat extracted records as confirmed accounting. Ambiguous or unsupported data remains blocked for human review. This repository is the only canonical source and release location; verified downloads are published through [GitHub Releases](https://github.com/thangldw/kakeflow/releases/tag/v1.2.1). +KakeFlow does not initiate payments or treat extracted records as confirmed accounting. Ambiguous or unsupported data remains blocked for human review. This repository is the only canonical source and release location; verified downloads are published through [GitHub Releases](https://github.com/thangldw/kakeflow/releases/tag/v1.3.0). ## Tiếng Việt @@ -57,7 +57,7 @@ KakeFlow nhập dữ liệu ngân hàng, thẻ, ví, chứng khoán, bảng tín PWA foundation có vault trình duyệt mã hóa, không cần account; hỗ trợ tạo household/account, OCR biên lai local, đối chiếu nguồn, duyệt rõ ràng, bút toán kép cân bằng, provenance, reload offline và export/restore mã hóa có xác thực. Event/projection được mã hóa trong IndexedDB; evidence dùng OPFS khi có và fallback sang IndexedDB mã hóa. PWA chưa có connector desktop, đồng bộ đa thiết bị, tương thích backup native hoặc toàn bộ tính năng desktop. -Bản v1.2.1 tự kiểm tra kênh cập nhật ổn định có chữ ký sau khi khởi động và cho phép kiểm tra thủ công trong Cài đặt. QA release có ảnh biên lai tổng hợp cùng trang `/ocr-regression.html` chạy trực tiếp PP-OCRv5. [Landing page chính thức](https://thangldw.github.io/kakeflow/) trình bày một hành trình giả lập của gia đình Tanaka từ duyệt biên lai đến ngân sách và đầu tư, với GIF riêng cho Nhật, Anh và Việt. +Bản v1.3.0 bổ sung Connector Control Center chỉ đọc và cơ chế refresh native bền vững, khôi phục fail-closed; PWA không chứa provider client hoặc credential. Ứng dụng tự kiểm tra kênh cập nhật ổn định có chữ ký sau khi khởi động và cho phép kiểm tra thủ công trong Cài đặt. QA release có ảnh biên lai tổng hợp cùng trang `/ocr-regression.html` chạy trực tiếp PP-OCRv5. [Landing page chính thức](https://thangldw.github.io/kakeflow/) trình bày một hành trình giả lập của gia đình Tanaka từ duyệt biên lai đến ngân sách và đầu tư, với GIF riêng cho Nhật, Anh và Việt. Ứng dụng không thực hiện thanh toán và không coi dữ liệu trích xuất là bút toán đã xác nhận. Dữ liệu mơ hồ hoặc chưa hỗ trợ luôn bị khóa để người dùng duyệt. Repo này là nguồn mã và nơi phát hành canonical duy nhất. Dùng các lệnh ở phần English để kiểm thử và build. @@ -69,7 +69,7 @@ KakeFlow は、ユーザーが提供した銀行、カード、ウォレット PWA foundation は account 不要の暗号化 browser vault、household/account 設定、端末内 receipt OCR、原本比較、明示的承認、貸借一致の複式記帳、provenance、offline reload、認証付き暗号化 export/restore を提供します。event/projection は IndexedDB、evidence は利用可能な場合 OPFS、fallback は暗号化 IndexedDB に保存します。desktop connector、multi-device sync、native backup 互換、desktop 全機能は未対応です。 -v1.2.1 は起動後に署名済み stable update channel を確認し、設定画面からの手動確認にも対応します。release QA には合成レシート画像と、PP-OCRv5 を直接実行する `/ocr-regression.html` を含みます。[公式 landing page](https://thangldw.github.io/kakeflow/) は、田中家の合成シナリオをレシート確認から予算・投資まで、日本語・英語・ベトナム語別 GIF で紹介します。 +v1.3.0 は read-only Connector Control Center と、fail-closed recovery を備えた durable native refresh を追加しました。PWA に provider client と credential は含まれません。起動後に署名済み stable update channel を確認し、設定画面からの手動確認にも対応します。release QA には合成レシート画像と、PP-OCRv5 を直接実行する `/ocr-regression.html` を含みます。[公式 landing page](https://thangldw.github.io/kakeflow/) は、田中家の合成シナリオをレシート確認から予算・投資まで、日本語・英語・ベトナム語別 GIF で紹介します。 支払いを開始せず、抽出結果を確定仕訳として扱いません。曖昧または未対応のデータは人による確認までブロックされます。本 repository が唯一の canonical source/release location です。テストとビルドには English セクションのコマンドを使用してください。 diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index 657ced5..a0ae099 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -16,7 +16,7 @@ On macOS, `npm run desktop:release` and `npm run desktop:build:mac:ci` must use There is no automatic stale-lock recovery. Every existing lock path fails closed—whether its recorded PID is live, absent, reused, or malformed—and acquisition never renames, deletes, or temporarily vacates it; the legacy `KAKEFLOW_RECOVER_STALE_BUILD_LOCK` environment flag has no effect. After independently verifying that no build process remains, inspect the reported canonical path and owner metadata, remove only that exact lock directory out of band, and retry normally. Normal release validates the complete owner token, removes `owner.json` while the live lock directory still blocks contenders, then uses successful `rmdir` as the final and only unlock point. Any failure before that `rmdir` leaves an occupied, fail-closed path; release never renames/restores the shared path and performs no fallible cleanup after it becomes absent. Non-macOS `desktop:release` continues to dispatch directly to Tauri. -Existing v1.2.0 installations query a retired release endpoint and therefore cannot receive automatic updates. Users on v1.2.0 must install v1.2.1 manually from the canonical releases page; v1.2.1 and later builds query this repository directly. Do not recreate a separate release repository. +Existing v1.2.0 installations query a retired release endpoint and therefore cannot receive automatic updates. Users on v1.2.0 must install v1.2.1 or later manually from the canonical releases page; v1.2.1 and later builds query this repository directly. Do not recreate a separate release repository. For OCR release QA, start the local preview and open `/ocr-regression.html`. The page must report that every synthetic PP-OCRv5 case passed. The fixtures contain only invented, anonymized receipt data; their expected date, total, tax and item values are also covered by `npm test`. @@ -24,7 +24,7 @@ Treat temporary ports, comparison copies and release worktrees as disposable loc GitHub Pages uses **GitHub Actions** as its source. `.github/workflows/pages.yml` builds the production PWA, copies `docs/` to the artifact root and mounts `dist/` at `app/`; do not commit the generated 148 MB build. After each merge, wait for the exact commit's Pages workflow and verify the landing page plus `/kakeflow/app/` online and offline. -The v1.2.1 macOS community binary is ad-hoc signed and not notarized. Do not describe it as a frictionless production installer. A paid Apple Developer Program membership is not maintained, so preserve the explicit ad-hoc/not-notarized disclosure and direct users who want no Gatekeeper installation path to the account-free PWA. Publish future desktop versions only after substantive dependency, test, or release changes pass every gate. +The v1.3.0 macOS community binary is ad-hoc signed and not notarized. Do not describe it as a frictionless production installer. A paid Apple Developer Program membership is not maintained, so preserve the explicit ad-hoc/not-notarized disclosure and direct users who want no Gatekeeper installation path to the account-free PWA. Publish future desktop versions only after substantive dependency, test, or release changes pass every gate. Delete only merged or strict-ancestor feature branches. Keep release tags, changelog entries, migration files and compatibility readers that are required to install, restore or open previously supported data. @@ -44,7 +44,7 @@ Trên macOS, `npm run desktop:release` và `npm run desktop:build:mac:ci` phải Không có automatic stale-lock recovery. Mọi lock path đã tồn tại—dù PID được ghi nhận còn chạy, đã dừng, bị reuse hoặc metadata hỏng—đều fail closed; acquisition code không rename, xóa hay tạm thời tạo khoảng trống, và legacy env `KAKEFLOW_RECOVER_STALE_BUILD_LOCK` không có tác dụng. Sau khi xác minh độc lập rằng không còn build process, operator phải kiểm tra canonical path và owner metadata được báo, xóa out of band đúng lock directory đó rồi retry bình thường. Release bình thường xác thực toàn bộ owner token, xóa `owner.json` khi live lock directory vẫn chặn contender, rồi dùng `rmdir` thành công làm điểm unlock cuối cùng và duy nhất. Mọi lỗi trước `rmdir` đều để path tồn tại và fail closed; release không rename/restore shared path và không chạy cleanup có thể lỗi sau khi path biến mất. Trên nền tảng khác, `desktop:release` vẫn gọi Tauri trực tiếp. -Các bản v1.2.0 hiện tại truy vấn một endpoint release đã ngừng hoạt động nên không thể tự động cập nhật. Người dùng v1.2.0 phải cài thủ công v1.2.1 từ trang release chính thức; các build từ v1.2.1 trở đi truy vấn trực tiếp repo này. Không tạo lại repo release riêng. +Các bản v1.2.0 hiện tại truy vấn một endpoint release đã ngừng hoạt động nên không thể tự động cập nhật. Người dùng v1.2.0 phải cài thủ công v1.2.1 hoặc mới hơn từ trang release chính thức; các build từ v1.2.1 trở đi truy vấn trực tiếp repo này. Không tạo lại repo release riêng. Để QA OCR trước khi release, chạy bản xem trước local và mở `/ocr-regression.html`. Trang phải báo toàn bộ case PP-OCRv5 tổng hợp đã pass. Fixture chỉ chứa dữ liệu biên lai giả lập, đã ẩn danh; ngày, tổng tiền, thuế và giá từng món cũng được kiểm tra trong `npm test`. @@ -52,7 +52,7 @@ Các bản port tạm, thư mục so sánh và release worktree chỉ là dữ l GitHub Pages dùng **GitHub Actions** làm source. `.github/workflows/pages.yml` build PWA production, copy `docs/` vào root artifact và mount `dist/` tại `app/`; không commit build 148 MB đã generate. Sau mỗi lần merge, chờ Pages workflow của đúng commit rồi kiểm tra landing page và `/kakeflow/app/` cả online lẫn offline. -Binary cộng đồng macOS v1.2.1 được ký ad-hoc và chưa notarize; không mô tả đây là installer production frictionless. Dự án không duy trì gói Apple Developer Program trả phí, vì vậy phải giữ disclosure rõ ràng và hướng người dùng muốn tránh Gatekeeper sang PWA không cần account. Chỉ phát hành desktop version tiếp theo sau khi thay đổi dependency, test hoặc release thực chất vượt qua mọi gate. +Binary cộng đồng macOS v1.3.0 được ký ad-hoc và chưa notarize; không mô tả đây là installer production frictionless. Dự án không duy trì gói Apple Developer Program trả phí, vì vậy phải giữ disclosure rõ ràng và hướng người dùng muốn tránh Gatekeeper sang PWA không cần account. Chỉ phát hành desktop version tiếp theo sau khi thay đổi dependency, test hoặc release thực chất vượt qua mọi gate. Chỉ xoá feature branch đã merge hoặc là ancestor của `main`. Giữ release tag, changelog, migration và compatibility reader cần thiết để cài đặt, restore hoặc mở dữ liệu từng được hỗ trợ. @@ -72,7 +72,7 @@ macOS の `npm run desktop:release` と `npm run desktop:build:mac:ci` は、同 automatic stale-lock recovery はありません。記録 PID が稼働中、停止済み、reuse の可能性あり、または metadata 不正のいずれでも、既存 lock path は必ず fail closed し、acquisition code は rename、削除、一時的な空き状態の作成を行いません。旧 `KAKEFLOW_RECOVER_STALE_BUILD_LOCK` 環境変数も無効です。build process が残っていないことを独立に確認した後、報告された canonical path と owner metadata を調査し、その lock directory だけを out-of-band で削除して通常どおり retry します。通常 release は完全な owner token を検証し、live lock directory が contender を遮断したまま `owner.json` を削除して、成功した `rmdir` を最後かつ唯一の unlock point とします。`rmdir` 前の失敗では path が残って fail closed し、shared path の rename/restore や path 消失後の fallible cleanup は行いません。macOS 以外の `desktop:release` は Tauri を直接呼び出します。 -既存の v1.2.0 は廃止された release endpoint を参照するため、自動更新を受信できません。v1.2.0 の利用者は canonical release page から v1.2.1 を手動でインストールする必要があります。v1.2.1 以降の build は本 repository を直接参照します。別の release repository は再作成しません。 +既存の v1.2.0 は廃止された release endpoint を参照するため、自動更新を受信できません。v1.2.0 の利用者は canonical release page から v1.2.1 以降を手動でインストールする必要があります。v1.2.1 以降の build は本 repository を直接参照します。別の release repository は再作成しません。 OCR の release QA では local preview を起動し、`/ocr-regression.html` を開きます。匿名の合成 receipt を使うすべての PP-OCRv5 case が passed になることを確認してください。日付・合計・税・品目金額の期待値は `npm test` でも検証されます。 @@ -80,6 +80,6 @@ OCR の release QA では local preview を起動し、`/ocr-regression.html` GitHub Pages の source は **GitHub Actions** です。`.github/workflows/pages.yml` が production PWA を build し、`docs/` を artifact root、`dist/` を `app/` に配置します。生成済み 148 MB build は commit しません。merge ごとに exact commit の Pages workflow を待ち、landing page と `/kakeflow/app/` を online/offline で確認します。 -macOS v1.2.1 community binary は ad-hoc 署名済み・未公証で、frictionless production installer と表現しません。有料 Apple Developer Program は維持していないため、この disclosure を明示し、Gatekeeper の install path を避けたい利用者には account 不要の PWA を案内します。今後の desktop version は、実質的な dependency/test/release 変更が全 gate を通過した場合だけ公開します。 +macOS v1.3.0 community binary は ad-hoc 署名済み・未公証で、frictionless production installer と表現しません。有料 Apple Developer Program は維持していないため、この disclosure を明示し、Gatekeeper の install path を避けたい利用者には account 不要の PWA を案内します。今後の desktop version は、実質的な dependency/test/release 変更が全 gate を通過した場合だけ公開します。 削除する feature branch は merge 済み、または `main` の strict ancestor に限ります。過去に対応したデータの install/restore/open に必要な release tag、changelog、migration、compatibility reader は保持します。 diff --git a/docs/README.md b/docs/README.md index e144679..26f9922 100644 --- a/docs/README.md +++ b/docs/README.md @@ -9,7 +9,8 @@ This directory contains the current project documentation for the canonical repo | [PWA storyboard](demo/KakeFlow-90-second-storyboard.md) | Timing and claim boundary for the reviewed receipt-to-provenance video. | | [Operations](OPERATIONS.md) | Build, release, updater, Pages and repository maintenance procedures. | | [Security](SECURITY.md) | Supported versions, private reporting and prohibited data. | -| [v1.2.1 release notes](releases/v1.2.1.md) | Current installation, release scope and verification evidence. | +| [v1.3.0 release notes](releases/v1.3.0.md) | Current installation, connector-control scope and verification evidence. | +| [v1.2.1 release notes](releases/v1.2.1.md) | Historical PWA foundation and installation evidence. | | [v1.2.0 release notes](releases/v1.2.0.md) | Historical installation and updater boundary. | Project-wide policies remain at the repository root: [README](../README.md), [Contributing](../CONTRIBUTING.md), [Code of Conduct](../CODE_OF_CONDUCT.md), [Changelog](../CHANGELOG.md) and [MIT License](../LICENSE). diff --git a/docs/index.html b/docs/index.html index f650d49..bd36975 100644 --- a/docs/index.html +++ b/docs/index.html @@ -37,7 +37,7 @@ - v1.2.1 + v1.3.0 @@ -46,13 +46,13 @@
-

v1.2.1 公開中 · AIトークン不要

+

v1.3.0 公開中 · AIトークン不要

LOCAL-FIRST · OPEN SOURCE · PRIVATE

家計を、
あなたの端末で。

レシートOCR、予算、取引、投資を一つに。データを外部AIへ送らず、数字の根拠まで追跡できるデスクトップ家計簿です。

macOS ARM64 対応。現在のバイナリはアドホック署名済み・未公証です。

    @@ -154,7 +154,7 @@

    田中家 · 4人世帯

    OPEN SOURCE · LOCAL-FIRST · REVIEWABLE

    今日から、
    自分のデータで始める。

    diff --git a/docs/kakeflow-page.js b/docs/kakeflow-page.js index f80cadf..5bffd7d 100644 --- a/docs/kakeflow-page.js +++ b/docs/kakeflow-page.js @@ -2,8 +2,8 @@ const translations = { ja: { skip: '本文へ移動', menu: 'メニュー', navUseCase: 'ユースケース', navDemo: 'デモ', navFeatures: '機能', navPrivacy: 'プライバシー', support: '応援する', - status: 'v1.2.1 公開中 · AIトークン不要', heroTitle: '家計を、
    あなたの端末で。', heroLede: 'レシートOCR、予算、取引、投資を一つに。データを外部AIへ送らず、数字の根拠まで追跡できるデスクトップ家計簿です。', - download: 'macOS ARM64 版をダウンロード', releaseNotes: 'v1.2.1 リリースノートを見る', releaseBoundary: 'macOS ARM64 対応。現在のバイナリはアドホック署名済み・未公証です。', trustLocal: '家計データは端末内で処理', trustOcr: '日本語レシートをローカル解析', trustReview: '確認前に台帳へ記帳しない', tourCaption: '田中家の家計確認からOCR取込、予算、投資までを約11秒で紹介。', tourAlt: '田中家の家計確認、OCR取込、予算、投資をたどるKakeFlowデモ', + status: 'v1.3.0 公開中 · AIトークン不要', heroTitle: '家計を、
    あなたの端末で。', heroLede: 'レシートOCR、予算、取引、投資を一つに。データを外部AIへ送らず、数字の根拠まで追跡できるデスクトップ家計簿です。', + download: 'macOS ARM64 版をダウンロード', releaseNotes: 'v1.3.0 リリースノートを見る', releaseBoundary: 'macOS ARM64 対応。現在のバイナリはアドホック署名済み・未公証です。', trustLocal: '家計データは端末内で処理', trustOcr: '日本語レシートをローカル解析', trustReview: '確認前に台帳へ記帳しない', tourCaption: '田中家の家計確認からOCR取込、予算、投資までを約11秒で紹介。', tourAlt: '田中家の家計確認、OCR取込、予算、投資をたどるKakeFlowデモ', useCaseTitle: '一枚のレシートから、
    家計全体の判断まで。', useCaseIntro: '共働き・子ども2人の田中家が、買い物後の記帳から月次予算、長期資産までを外部AIへ送信せずに確認するシナリオです。', useCaseBadge: '合成デモデータ', useCasePersona: '田中家 · 4人世帯', useCaseContext: '給与、銀行、カード、日常支出と投資をJPYで一元管理。氏名、金額、口座番号はすべて架空です。', useCaseInputLabel: '入力', useCaseInput: '日本語レシート', useCaseRuleLabel: 'ルール', useCaseRule: '確認後に記帳', useCaseStorageLabel: '保存先', useCaseStorage: '端末内台帳', useCaseStep1Title: '家計全体を確認', useCaseStep1Body: '今月の収支、予算、未確認項目から今日の優先事項を把握。', useCaseStep2Title: 'レシートを取り込む', useCaseStep2Body: '端末内OCRで日付、合計、税、品目を抽出し、原本と照合。', useCaseStep3Title: '確認して予算へ反映', useCaseStep3Body: '候補を承認後だけ台帳へ記帳し、超過と貯蓄目標を再評価。', useCaseStep4Title: '資産形成まで確認', useCaseStep4Body: '日常の家計と投資評価額・損益・配分を同じ流れで確認。', useCaseOutcomeLabel: '結果', useCaseOutcome: '一つの確認済みローカル台帳から、日々の支出、月次計画、長期資産を説明できます。', benefitOcrTitle: '日本語レシートOCR', benefitOcrBody: 'PP-OCRv5で日付、合計、税、品目を端末内で読み取ります。', benefitBudgetTitle: '予算とアラート', benefitBudgetBody: '月次予算、貯蓄目標、超過と変化を一画面で確認。', benefitInvestTitle: '資産と投資', benefitInvestBody: '保有、評価損益、配当、資産配分を家計と分けて管理。', demoTitle: '見るだけでなく、
    根拠まで確かめる。', demoBody: '実際のKakeFlow画面です。タブを切り替えて、OCR取込、予算管理、投資ポートフォリオを確認できます。', pwaDemoTitle: 'レシートから来歴まで、85秒。', pwaDemoBoundary: '合成データのみ。アカウント不要で、端末内OCR、明示的な承認、複式記帳、オフライン復旧、暗号化バックアップを実行します。', tabOcr: 'OCR取込', tabOcrDetail: '候補と原本をレビュー', tabBudget: '予算', tabBudgetDetail: '超過と目標を追跡', tabInvest: '投資', tabInvestDetail: '評価額と配分を確認', ocrCaption: '抽出結果は候補として表示し、人が確認した後だけ台帳へ反映します。', budgetCaption: '予算消化率、超過、貯蓄目標を同じ月次画面で確認します。', investCaption: '評価額、含み損益、保有銘柄、資産配分をスナップショットとして管理します。', @@ -13,8 +13,8 @@ }, en: { skip: 'Skip to content', menu: 'Menu', navUseCase: 'Use case', navDemo: 'Demo', navFeatures: 'Features', navPrivacy: 'Privacy', support: 'Support', - status: 'v1.2.1 available · No AI token required', heroTitle: 'Your finances,
    on your device.', heroLede: 'Receipt OCR, budgets, transactions, and investments in one desktop app. Keep data off external AI services and trace every number back to its source.', - download: 'Download for macOS ARM64', releaseNotes: 'View v1.2.1 release notes', releaseBoundary: 'For macOS ARM64. The current binary is ad-hoc signed and not notarized.', trustLocal: 'Financial data stays on device', trustOcr: 'Japanese receipts read locally', trustReview: 'Nothing posts before review', tourCaption: 'An 11-second journey from household review to OCR, budgets, and investments.', tourAlt: 'KakeFlow demo following the Tanaka family through household review, OCR import, budgets, and investments', + status: 'v1.3.0 available · No AI token required', heroTitle: 'Your finances,
    on your device.', heroLede: 'Receipt OCR, budgets, transactions, and investments in one desktop app. Keep data off external AI services and trace every number back to its source.', + download: 'Download for macOS ARM64', releaseNotes: 'View v1.3.0 release notes', releaseBoundary: 'For macOS ARM64. The current binary is ad-hoc signed and not notarized.', trustLocal: 'Financial data stays on device', trustOcr: 'Japanese receipts read locally', trustReview: 'Nothing posts before review', tourCaption: 'An 11-second journey from household review to OCR, budgets, and investments.', tourAlt: 'KakeFlow demo following the Tanaka family through household review, OCR import, budgets, and investments', useCaseTitle: 'From one receipt
    to the whole financial picture.', useCaseIntro: 'Follow the dual-income Tanaka family with two children from post-purchase bookkeeping through monthly planning and long-term assets—without sending data to external AI.', useCaseBadge: 'Synthetic demo data', useCasePersona: 'Tanaka family · 4 people', useCaseContext: 'Salary, bank, card, daily spending, and investments managed in JPY. Every name, amount, and account number is fictional.', useCaseInputLabel: 'Input', useCaseInput: 'Japanese receipt', useCaseRuleLabel: 'Rule', useCaseRule: 'Review before posting', useCaseStorageLabel: 'Storage', useCaseStorage: 'On-device ledger', useCaseStep1Title: 'Review household health', useCaseStep1Body: 'Use cash flow, budgets, and pending items to identify today’s priorities.', useCaseStep2Title: 'Import a receipt', useCaseStep2Body: 'Extract the date, total, tax, and items on device, then compare them with the source.', useCaseStep3Title: 'Review and update the budget', useCaseStep3Body: 'Post only approved candidates, then reassess overspending and savings goals.', useCaseStep4Title: 'Connect daily finance to wealth', useCaseStep4Body: 'Review household cash flow with portfolio value, gains, and allocation.', useCaseOutcomeLabel: 'Outcome', useCaseOutcome: 'One verified local ledger explains daily spending, monthly plans, and long-term assets.', benefitOcrTitle: 'Japanese receipt OCR', benefitOcrBody: 'PP-OCRv5 reads dates, totals, taxes, and items entirely on device.', benefitBudgetTitle: 'Budgets and alerts', benefitBudgetBody: 'See monthly budgets, savings goals, overspending, and changes in one place.', benefitInvestTitle: 'Assets and investments', benefitInvestBody: 'Track holdings, gains, dividends, and allocation separately from daily spending.', demoTitle: 'See the numbers.
    Verify the source.', demoBody: 'These are real KakeFlow screens. Switch tabs to explore OCR import, budget planning, and the investment portfolio.', pwaDemoTitle: 'Receipt to provenance in 85 seconds', pwaDemoBoundary: 'Synthetic data only. No account: on-device OCR, explicit approval, double-entry posting, offline recovery, and encrypted backup.', tabOcr: 'OCR import', tabOcrDetail: 'Review candidates and sources', tabBudget: 'Budgets', tabBudgetDetail: 'Track limits and goals', tabInvest: 'Investments', tabInvestDetail: 'Review value and allocation', ocrCaption: 'Extracted data stays a candidate and reaches the ledger only after human review.', budgetCaption: 'Review budget use, overspending, and savings goals in one monthly workspace.', investCaption: 'Manage value, unrealized gains, holdings, and allocation as dated snapshots.', @@ -24,8 +24,8 @@ }, vi: { skip: 'Bỏ qua đến nội dung', menu: 'Menu', navUseCase: 'Use case', navDemo: 'Demo', navFeatures: 'Tính năng', navPrivacy: 'Riêng tư', support: 'Ủng hộ', - status: 'Đã có v1.2.1 · Không cần AI token', heroTitle: 'Tài chính của bạn,
    ngay trên thiết bị.', heroLede: 'OCR biên lai, ngân sách, giao dịch và đầu tư trong một ứng dụng desktop. Không gửi dữ liệu tới AI bên ngoài, mọi con số đều truy ngược được về chứng từ.', - download: 'Tải cho macOS ARM64', releaseNotes: 'Xem ghi chú phát hành v1.2.1', releaseBoundary: 'Dành cho macOS ARM64. Bản hiện tại được ký ad-hoc và chưa notarize.', trustLocal: 'Dữ liệu tài chính ở trên thiết bị', trustOcr: 'Đọc biên lai Nhật ngay trên máy', trustReview: 'Chỉ ghi sổ sau khi kiểm tra', tourCaption: '11 giây từ kiểm tra tài chính gia đình đến OCR, ngân sách và đầu tư.', tourAlt: 'Demo KakeFlow theo hành trình gia đình Tanaka từ tổng quan, nhập OCR, ngân sách đến đầu tư', + status: 'Đã có v1.3.0 · Không cần AI token', heroTitle: 'Tài chính của bạn,
    ngay trên thiết bị.', heroLede: 'OCR biên lai, ngân sách, giao dịch và đầu tư trong một ứng dụng desktop. Không gửi dữ liệu tới AI bên ngoài, mọi con số đều truy ngược được về chứng từ.', + download: 'Tải cho macOS ARM64', releaseNotes: 'Xem ghi chú phát hành v1.3.0', releaseBoundary: 'Dành cho macOS ARM64. Bản hiện tại được ký ad-hoc và chưa notarize.', trustLocal: 'Dữ liệu tài chính ở trên thiết bị', trustOcr: 'Đọc biên lai Nhật ngay trên máy', trustReview: 'Chỉ ghi sổ sau khi kiểm tra', tourCaption: '11 giây từ kiểm tra tài chính gia đình đến OCR, ngân sách và đầu tư.', tourAlt: 'Demo KakeFlow theo hành trình gia đình Tanaka từ tổng quan, nhập OCR, ngân sách đến đầu tư', useCaseTitle: 'Từ một biên lai
    đến toàn cảnh tài chính.', useCaseIntro: 'Theo dõi gia đình Tanaka gồm hai người đi làm và hai con, từ ghi nhận chi tiêu sau mua sắm đến kế hoạch tháng và tài sản dài hạn—không gửi dữ liệu tới AI bên ngoài.', useCaseBadge: 'Dữ liệu demo tổng hợp', useCasePersona: 'Gia đình Tanaka · 4 người', useCaseContext: 'Quản lý lương, ngân hàng, thẻ, chi tiêu hằng ngày và đầu tư bằng JPY. Mọi tên, số tiền và số tài khoản đều là hư cấu.', useCaseInputLabel: 'Đầu vào', useCaseInput: 'Biên lai tiếng Nhật', useCaseRuleLabel: 'Quy tắc', useCaseRule: 'Duyệt trước khi ghi sổ', useCaseStorageLabel: 'Lưu trữ', useCaseStorage: 'Sổ cái trên thiết bị', useCaseStep1Title: 'Kiểm tra sức khỏe tài chính', useCaseStep1Body: 'Dùng dòng tiền, ngân sách và việc chờ xử lý để xác định ưu tiên hôm nay.', useCaseStep2Title: 'Nhập biên lai', useCaseStep2Body: 'Trích xuất ngày, tổng tiền, thuế và mặt hàng ngay trên máy rồi đối chiếu chứng từ.', useCaseStep3Title: 'Duyệt và cập nhật ngân sách', useCaseStep3Body: 'Chỉ ghi sổ đề xuất đã duyệt, sau đó đánh giá lại khoản vượt ngưỡng và mục tiêu.', useCaseStep4Title: 'Nối chi tiêu với tài sản', useCaseStep4Body: 'Xem dòng tiền gia đình cùng giá trị, lãi lỗ và phân bổ danh mục đầu tư.', useCaseOutcomeLabel: 'Kết quả', useCaseOutcome: 'Một sổ cái local đã xác minh giải thích được chi tiêu ngày, kế hoạch tháng và tài sản dài hạn.', benefitOcrTitle: 'OCR biên lai tiếng Nhật', benefitOcrBody: 'PP-OCRv5 đọc ngày, tổng tiền, thuế và mặt hàng hoàn toàn trên thiết bị.', benefitBudgetTitle: 'Ngân sách & cảnh báo', benefitBudgetBody: 'Theo dõi ngân sách tháng, mục tiêu tiết kiệm, vượt ngưỡng và biến động tại một nơi.', benefitInvestTitle: 'Tài sản & đầu tư', benefitInvestBody: 'Theo dõi danh mục, lãi lỗ, cổ tức và phân bổ tách biệt với chi tiêu hằng ngày.', demoTitle: 'Không chỉ xem số.
    Còn kiểm tra được nguồn.', demoBody: 'Đây là màn hình thật của KakeFlow. Chuyển tab để xem OCR, quản lý ngân sách và danh mục đầu tư.', pwaDemoTitle: 'Từ biên lai đến provenance trong 85 giây', pwaDemoBoundary: 'Chỉ dùng dữ liệu tổng hợp. Không cần tài khoản: OCR trên thiết bị, duyệt rõ ràng, ghi sổ kép, khôi phục offline và backup mã hóa.', tabOcr: 'Nhập bằng OCR', tabOcrDetail: 'Kiểm tra đề xuất và chứng từ', tabBudget: 'Ngân sách', tabBudgetDetail: 'Theo dõi ngưỡng và mục tiêu', tabInvest: 'Đầu tư', tabInvestDetail: 'Xem định giá và phân bổ', ocrCaption: 'Dữ liệu trích xuất chỉ là đề xuất và chỉ được ghi sổ sau khi bạn xác nhận.', budgetCaption: 'Theo dõi mức sử dụng ngân sách, khoản vượt ngưỡng và mục tiêu tiết kiệm theo tháng.', investCaption: 'Quản lý định giá, lãi lỗ chưa thực hiện, danh mục và phân bổ theo từng ảnh chụp.', diff --git a/docs/releases/v1.3.0.md b/docs/releases/v1.3.0.md new file mode 100644 index 0000000..452eaaa --- /dev/null +++ b/docs/releases/v1.3.0.md @@ -0,0 +1,29 @@ +# KakeFlow v1.3.0 + +Released 2026-09-02. + +## What changed + +- Added a read-only Connector Control Center for native source inventory, health and refresh operations. +- Made connector account bindings an explicit posting-authorization boundary, with version and generation fencing against stale or ABA updates. +- Added durable refresh batches, per-source cursors and backoff, fail-closed recovery, and redacted operational summaries. +- Hardened the isolated macOS ARM64 release path with canonical physical paths, atomic locks, source/resource identity digests, and packaged artifact verification. +- Removed two test-only CodeQL data flows at their source and recorded the generated Tauri macro finding separately as a false-positive candidate pending exact-head analysis. + +## Install + +- PWA: [thangldw.github.io/kakeflow/app](https://thangldw.github.io/kakeflow/app/) +- macOS Apple Silicon: download `KakeFlow_1.3.0_aarch64.dmg` from the [canonical GitHub release](https://github.com/thangldw/kakeflow/releases/tag/v1.3.0). +- Verify the downloaded file against `SHA256SUMS.txt` before opening it. + +The macOS community binary is ad-hoc signed and not notarized. The account-free PWA is the supported no-Gatekeeper path. + +## Evidence and boundaries + +- Frontend, release-contract, Rust, PWA, Poppler and CodeQL gates must pass for the exact release commit before publication. +- Connector tests use synthetic adapters and records. This release does not claim a production bank pilot, direct bank aggregation or Money Forward parity. +- The PWA intentionally has no desktop provider clients, connector credentials or native backup compatibility. +- The documented medium-severity `glib` advisory remains in the Linux Tauri GTK dependency path; the shipped macOS ARM64 artifact does not exercise that path. +- Poppler provides automated visual QA artifacts, not human visual approval. + +See [Security](../SECURITY.md), [Operations](../OPERATIONS.md), and the [CodeQL triage record](../evidence/codeql-triage-2026-08-31.md) for the maintained evidence boundary. diff --git a/package-lock.json b/package-lock.json index cfbf3cf..de07dec 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "kakeflow", - "version": "1.2.1", + "version": "1.3.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "kakeflow", - "version": "1.2.1", + "version": "1.3.0", "license": "MIT", "dependencies": { "@paddleocr/paddleocr-js": "^0.4.2", diff --git a/package.json b/package.json index e25ea63..a9d278f 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "kakeflow", "private": true, - "version": "1.2.1", + "version": "1.3.0", "license": "MIT", "type": "module", "engines": { diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 8dba372..a9e6d4f 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -2605,7 +2605,7 @@ dependencies = [ [[package]] name = "kakeflow" -version = "1.2.1" +version = "1.3.0" dependencies = [ "argon2", "base64 0.22.1", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 04e358b..fadd72d 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kakeflow" -version = "1.2.1" +version = "1.3.0" description = "Local-first household finance desktop application" authors = ["KakeFlow contributors"] license = "MIT" diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index b5afb59..e4c4705 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,7 +1,7 @@ { "$schema": "../node_modules/@tauri-apps/cli/config.schema.json", "productName": "KakeFlow", - "version": "1.2.1", + "version": "1.3.0", "identifier": "app.kakeflow.desktop", "build": { "frontendDist": "../dist", From 9e6c678e6a82324519b0ed6d7dde406ec5235b1e Mon Sep 17 00:00:00 2001 From: thang Date: Fri, 11 Sep 2026 01:03:43 +0700 Subject: [PATCH 2/6] release: rotate lost updater key and document manual migration --- CHANGELOG.md | 8 ++++++- README.md | 2 ++ docs/OPERATIONS.md | 4 +++- docs/index.html | 1 + docs/releases/v1.3.0.md | 9 +++++++- packaging/update-channel.json | 2 +- scripts/verify-v121-migration.mjs | 37 +++++++++++++++++++++++++++++++ src-tauri/tauri.conf.json | 2 +- 8 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 scripts/verify-v121-migration.mjs diff --git a/CHANGELOG.md b/CHANGELOG.md index 34362c7..add37d7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,10 +4,12 @@ No changes yet. -## 1.3.0 — 2026-09-02 +## 1.3.0 — 2026-09-11 ### English +- Rotated the updater key after loss of the previous private key. All earlier desktop versions, including v1.2.1, require one manual installation of v1.3.0; future releases use the new trust root. Application identity and data locations are unchanged by the rotation. + - Added a read-only Connector Control Center that inventories native sources and makes account bindings an explicit posting-authorization boundary. - Added durable refresh batches with per-source cursors, backoff, version and generation fencing, fail-closed recovery, and redacted operational summaries. - Hardened the isolated macOS ARM64 release wrapper with canonical path checks, atomic physical-path locks, source/resource identity digests, and packaged artifact verification. @@ -17,6 +19,8 @@ No changes yet. ### Tiếng Việt +- Đổi khóa updater do mất private key cũ. Mọi bản desktop trước đó, kể cả v1.2.1, cần cài v1.3.0 thủ công một lần; các bản tiếp theo dùng khóa mới. Việc đổi khóa giữ nguyên định danh ứng dụng và vị trí dữ liệu. + - Bổ sung Connector Control Center chỉ đọc để kiểm kê nguồn native và dùng account binding làm ranh giới cấp quyền ghi sổ rõ ràng. - Bổ sung refresh batch bền vững với cursor/backoff theo nguồn, version/generation fencing, khôi phục fail-closed và summary vận hành đã che dữ liệu nhạy cảm. - Củng cố wrapper release macOS ARM64 cô lập bằng kiểm tra canonical path, khóa nguyên tử theo physical path, digest nhận dạng source/resource và xác minh artifact đã đóng gói. @@ -26,6 +30,8 @@ No changes yet. ### 日本語 +- 旧秘密鍵の紛失により updater 鍵を更新しました。v1.2.1 を含む旧 desktop 版からは v1.3.0 の手動インストールが一度必要です。以降の更新は新しい鍵を使用し、今回の鍵更新によるアプリ識別子とデータ保存先の変更はありません。 + - native source を一覧化し、account binding を明示的な記帳承認境界として扱う read-only Connector Control Center を追加しました。 - source ごとの cursor/backoff、version/generation fencing、fail-closed recovery、秘匿化済み運用 summary を備えた durable refresh batch を追加しました。 - canonical path 検査、physical path 単位の atomic lock、source/resource identity digest、packaged artifact 検証により、分離された macOS ARM64 release wrapper を強化しました。 diff --git a/README.md b/README.md index fb95aad..5487e66 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # KakeFlow +> **v1.3.0 manual upgrade / Nâng cấp thủ công / 手動更新:** The old updater private key was lost. Users of v1.2.1 and earlier must install v1.3.0 manually once; subsequent updates use the new key. [Upgrade instructions and data-preservation precautions](docs/releases/v1.3.0.md#install). + [English](#english) · [Tiếng Việt](#tiếng-việt) · [日本語](#日本語) Local-first household finance for desktop and the browser, built for Japan. diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index a0ae099..f40ec37 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -1,5 +1,7 @@ # KakeFlow operations / Vận hành / 運用 +> **v1.3.0 key recovery / Khôi phục khóa / 鍵の復旧:** The previous updater private key is lost. Every older desktop installation, including v1.2.1, needs a manual upgrade to v1.3.0. Mọi bản desktop cũ cần cài v1.3.0 thủ công một lần. v1.2.1 を含む旧版は v1.3.0 の手動インストールが必要です。This requirement supersedes the historical v1.1.1/v1.2.0 upgrade notes below. [Migration instructions](releases/v1.3.0.md#install). + ## English Canonical project endpoints: @@ -10,7 +12,7 @@ Canonical project endpoints: Run `npm ci`, `npm run lint`, `npm test -- --run`, `npm run build`, then Rust format, clippy and tests. Desktop candidates must pass OCR resource verification and packaged smoke tests. Release artifacts are published to `thangldw/kakeflow` under a versioned tag with SHA-256 checksums. The protected `main` branch requires the frontend/release-contract and Rust CI checks. -The stable desktop channel uses signed Tauri updater archives. Keep the private updater key outside the repository and inject `TAURI_SIGNING_PRIVATE_KEY` opaquely from the operator or CI environment while building; its storage mechanism and location must stay outside tracked documentation. Publish the generated updater archive plus its `.sig` file. Run `npm run release:update:manifest -- --version X.Y.Z --artifacts packaging/release/vX.Y.Z` and upload the resulting `latest.json` beside the installers. Never publish or commit the private key. Existing v1.1.1 installations require one manual upgrade to a build that contains the updater; subsequent releases are checked automatically after startup and can also be checked from Settings. +The stable desktop channel uses signed Tauri updater archives. Keep the private updater key outside the repository and inject `TAURI_SIGNING_PRIVATE_KEY` opaquely from the operator or CI environment while building; its storage mechanism and location must stay outside tracked documentation. Publish the generated updater archive plus its `.sig` file. Run `npm run release:update:manifest -- --version X.Y.Z --artifacts packaging/release/vX.Y.Z` and upload the resulting `latest.json` beside the installers. Never publish or commit the private key. The previous private key was lost: all desktop versions before v1.3.0 require a manual installation of v1.3.0 to trust the replacement key. See the [migration instructions](releases/v1.3.0.md#install). Future updates from v1.3.0 are checked after startup and from Settings. Before publishing with a new key, verify a signature against the configured public key and keep a recoverable backup outside the build machine. On macOS, `npm run desktop:release` and `npm run desktop:build:mac:ci` must use the isolated arm64 wrapper because the packaged OCR resource contains exactly one arm64 slice. The wrapper canonicalizes the checkout and target to physical paths, rejects personal-root target links and symlink cleanup traversal, and locks one physical checkout/target atomically. It invalidates identity before removing only the resolved app/updater/DMG outputs. Its source digest covers effective tracked inputs plus ignored staged Paddle/Tesseract resources with sorted type/path/mode/length/hash records. `kakeflow-build-identity.json` is valid only after complete success and final lock cleanup; packaged and DMG smokes reject missing, stale-source, or byte-mismatched identities. diff --git a/docs/index.html b/docs/index.html index bd36975..6bba840 100644 --- a/docs/index.html +++ b/docs/index.html @@ -47,6 +47,7 @@

    v1.3.0 公開中 · AIトークン不要

    +

    v1.2.1 以前は手動更新が必要です。 · Earlier versions require a manual upgrade. · Bản cũ cần nâng cấp thủ công. Upgrade instructions / Hướng dẫn / 手順

    LOCAL-FIRST · OPEN SOURCE · PRIVATE

    家計を、
    あなたの端末で。

    レシートOCR、予算、取引、投資を一つに。データを外部AIへ送らず、数字の根拠まで追跡できるデスクトップ家計簿です。

    diff --git a/docs/releases/v1.3.0.md b/docs/releases/v1.3.0.md index 452eaaa..7a639af 100644 --- a/docs/releases/v1.3.0.md +++ b/docs/releases/v1.3.0.md @@ -1,6 +1,6 @@ # KakeFlow v1.3.0 -Released 2026-09-02. +Release candidate prepared 2026-09-11; publication requires verified signed artifacts. ## What changed @@ -12,6 +12,12 @@ Released 2026-09-02. ## Install +**Manual upgrade required from every earlier desktop version, including v1.2.1.** The previous updater private key was lost. v1.3.0 embeds a new public key, so an earlier installation cannot authenticate this release through its updater. This is a recovery rotation, not evidence of a key compromise. + +Before upgrading, export a backup using the existing application and keep its backup password. Quit KakeFlow, download the official v1.3.0 DMG, and replace only `KakeFlow.app` in Applications. Do not delete application data or Keychain entries. The bundle identifier remains `app.kakeflow.desktop`; this key rotation does not change database paths, schemas or credential identifiers. Validate the upgrade on a disposable profile before claiming data-preservation evidence. + +Once manually installed, v1.3.0 can authenticate future updates signed by the new key. It cannot retroactively repair automatic updates in older installations. Public key ID: `348EFBA1FBABBCD5` (previous: `4BDDD1FCDA53215A`). + - PWA: [thangldw.github.io/kakeflow/app](https://thangldw.github.io/kakeflow/app/) - macOS Apple Silicon: download `KakeFlow_1.3.0_aarch64.dmg` from the [canonical GitHub release](https://github.com/thangldw/kakeflow/releases/tag/v1.3.0). - Verify the downloaded file against `SHA256SUMS.txt` before opening it. @@ -21,6 +27,7 @@ The macOS community binary is ad-hoc signed and not notarized. The account-free ## Evidence and boundaries - Frontend, release-contract, Rust, PWA, Poppler and CodeQL gates must pass for the exact release commit before publication. +- `node scripts/verify-v121-migration.mjs` (Node with `node:sqlite`, full checkout including tag `v1.2.1`) verifies the unchanged 69 historical migrations, applies migrations 70–72, preserves synthetic household/account rows, and checks database integrity and foreign keys. It also compares the bundle identifier and key-store source with v1.2.1. This is SQL-level evidence, not SQLCipher, Keychain, document-vault or installed-upgrade proof; that acceptance check remains required. - Connector tests use synthetic adapters and records. This release does not claim a production bank pilot, direct bank aggregation or Money Forward parity. - The PWA intentionally has no desktop provider clients, connector credentials or native backup compatibility. - The documented medium-severity `glib` advisory remains in the Linux Tauri GTK dependency path; the shipped macOS ARM64 artifact does not exercise that path. diff --git a/packaging/update-channel.json b/packaging/update-channel.json index e7fb7f6..902fc18 100644 --- a/packaging/update-channel.json +++ b/packaging/update-channel.json @@ -4,5 +4,5 @@ "status": "ENABLED", "reason": null, "endpoint": "https://github.com/thangldw/kakeflow/releases/latest/download/latest.json", - "publicKey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDRCREREMUZDREE1MzIxNUEKUldSYUlWUGEvTkhkUzNnZFVXbDVTYm9DOGEwWEhHUE5ranpJdVE0MkNRMTZXS3JGUldXMGZXdFEK" + "publicKey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDM0OEVGQkExRkJBQkJDRDUKUldUVnZLdjdvZnVPTk9qcXRSRW1GWEZLSlp6cFBBdm42dFZLUUpyWlVTQzZ4aXEveDhXZWtyVXkK" } diff --git a/scripts/verify-v121-migration.mjs b/scripts/verify-v121-migration.mjs new file mode 100644 index 0000000..56d320a --- /dev/null +++ b/scripts/verify-v121-migration.mjs @@ -0,0 +1,37 @@ +// SQL-level compatibility evidence only; this does not exercise Keychain or an installed upgrade. +import assert from 'node:assert/strict' +import { execFileSync } from 'node:child_process' +import { readFileSync, readdirSync } from 'node:fs' +import { DatabaseSync } from 'node:sqlite' + +const git = (...args) => execFileSync('git', args, { encoding: 'utf8' }) +const oldFiles = git('ls-tree', '-r', '--name-only', 'v1.2.1', 'src-tauri/migrations').trim().split('\n').filter(p => p.endsWith('.sql')).sort() +assert.equal(oldFiles.length, 69) +const db = new DatabaseSync(':memory:') +try { + // Historical migrations edit writable_schema, as the native migration runner permits. + db.enableDefensive?.(false) + db.exec('PRAGMA foreign_keys=ON') + for (const file of oldFiles) { + const oldSql = git('show', `v1.2.1:${file}`) + assert.equal(readFileSync(file, 'utf8'), oldSql, `Historical migration changed: ${file}`) + db.exec(oldSql) + } + db.exec("INSERT INTO households(id,name) VALUES('rotation-fixture','Upgrade fixture'); INSERT INTO accounts(id,household_id,name,account_kind,account_subtype) VALUES('rotation-account','rotation-fixture','Fixture bank','ASSET','BANK')") + const before = JSON.stringify({ households: db.prepare('SELECT * FROM households ORDER BY id').all(), accounts: db.prepare('SELECT * FROM accounts ORDER BY id').all() }) + const additions = readdirSync('src-tauri/migrations').filter(p => p.endsWith('.sql') && Number(p.slice(0,4)) > 69).sort() + assert.equal(additions.length, 3) + for (const file of additions) db.exec(readFileSync(`src-tauri/migrations/${file}`, 'utf8')) + const after = JSON.stringify({ households: db.prepare('SELECT * FROM households ORDER BY id').all(), accounts: db.prepare('SELECT * FROM accounts ORDER BY id').all() }) + assert.equal(after, before, 'Existing household/account rows changed') + assert.deepEqual(db.prepare('PRAGMA foreign_key_check').all(), []) + assert.equal(db.prepare('PRAGMA integrity_check').get().integrity_check, 'ok') + const oldConfig = JSON.parse(git('show', 'v1.2.1:src-tauri/tauri.conf.json')) + const newConfig = JSON.parse(readFileSync('src-tauri/tauri.conf.json', 'utf8')) + assert.equal(newConfig.identifier, oldConfig.identifier) + assert.equal(readFileSync('src-tauri/src/key_store.rs', 'utf8'), git('show', 'v1.2.1:src-tauri/src/key_store.rs')) + console.log('PASS: unchanged 69 historical migrations; 70–72 preserve synthetic household/account rows; integrity and foreign keys valid; app identifier and key-store source unchanged.') + console.log('LIMIT: SQL fixture test, not SQLCipher, OS Keychain, document vault, or full installer upgrade proof.') +} finally { + db.close() +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e4c4705..97bca39 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -52,7 +52,7 @@ }, "plugins": { "updater": { - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDRCREREMUZDREE1MzIxNUEKUldSYUlWUGEvTkhkUzNnZFVXbDVTYm9DOGEwWEhHUE5ranpJdVE0MkNRMTZXS3JGUldXMGZXdFEK", + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDM0OEVGQkExRkJBQkJDRDUKUldUVnZLdjdvZnVPTk9qcXRSRW1GWEZLSlp6cFBBdm42dFZLUUpyWlVTQzZ4aXEveDhXZWtyVXkK", "endpoints": [ "https://github.com/thangldw/kakeflow/releases/latest/download/latest.json" ], From 7de023f8d23da4f1b22111b3d44a078d4d1065ed Mon Sep 17 00:00:00 2001 From: thang Date: Sun, 13 Sep 2026 14:16:03 +0700 Subject: [PATCH 3/6] docs: keep manual upgrade instructions on product page --- docs/index.html | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/index.html b/docs/index.html index 6bba840..55b1e0d 100644 --- a/docs/index.html +++ b/docs/index.html @@ -47,7 +47,7 @@

    v1.3.0 公開中 · AIトークン不要

    -

    v1.2.1 以前は手動更新が必要です。 · Earlier versions require a manual upgrade. · Bản cũ cần nâng cấp thủ công. Upgrade instructions / Hướng dẫn / 手順

    +

    v1.2.1 以前は手動更新が必要です。 · Earlier versions require a manual upgrade. · Bản cũ cần nâng cấp thủ công. Upgrade instructions / Hướng dẫn / 手順

    LOCAL-FIRST · OPEN SOURCE · PRIVATE

    家計を、
    あなたの端末で。

    レシートOCR、予算、取引、投資を一つに。データを外部AIへ送らず、数字の根拠まで追跡できるデスクトップ家計簿です。

    @@ -159,6 +159,16 @@

    田中家 · 4人世帯

+
+ +