驗證紀錄
本機開發建置。各節皆標註結果日期;較舊的產物雜湊僅適用於與其一同記錄的建置。 命令範例使用目前的專案名稱;歷史產物雜湊不代表重新命名後的二進位檔。 這些結果描述實際執行過的檢查;CI 設定不能證明遠端 CI 已成功執行,也不代表獨立安全稽核。
SaaS 帳號與可設定的註冊功能 (2026-10-14)
版本 20261014-83aca4d86199 已部署至 ldny。Linux 二進位檔 SHA-256:
83aca4d86199718587da2fe812471bffb6ea7aefd499c52ed53e6566a7dd4c73。
帳號 UI 部署:908a7085.memories-ap4.pages.dev。
cargo fmt --all --check、cargo clippy --workspace --all-targets --locked -- -D warnings與cargo test --workspace --locked已在 Windows 通過。現有依環境而定的選用測試維持其宣告的忽略狀態。cargo build --workspace --release --locked已在 Windows 通過。Linuxmemories-center發行版使用鎖定的相依性圖建置成功,並於下述相容於正式環境的 Ubuntu 容器中測試。- Center 測試:79 項通過,包括七項帳號/設定測試,涵蓋使用者名稱註冊、正規化身分、電子郵件驗證/到期/重複使用、 SMTP 傳輸失敗、實際傳送至本機回送 SMTP 測試環境、密碼雜湊、受限的驗證工作量/請求、跨帳號讀寫拒絕、 管理員變更/刪除、登出、重新啟動後持久保存,以及錯誤時拒絕成員寫入。
- Web 用戶端與 API 代理 Node 測試:13 項通過。文件產生程序驗證了 32 個 HTML 頁面的本機連結與錨點。
- 實際 Chromium 對隔離的 Center 註冊/登入並建立記憶。電子郵件表單轉換使用模擬 API 回應檢查; 這些瀏覽器檢查未寄送郵件。後端電子郵件傳送另外透過本機 SMTP 測試環境檢查,未使用外部供應商。
- 與正式環境完全相同的映像通過了隔離 ldny 容器的 Canary 測試,包含兩個帳號、不同保管庫、跨帳號拒絕、登出、 重新啟動後持久保存,以及關閉註冊時登入。Canary 容器及其合成資料已移除。該測試未使用正式環境資料。
- 正式環境重新啟動後,透過公開網域確認現有擁有者的保管庫身分與成員權杖仍獲保留。
現有 PostgreSQL 容器與 cloudflared 服務持續執行。內嵌
/app/資源與公開 Pages 資源一致。 公開桌面/行動頁面在 390px 下沒有瀏覽器主控台錯誤或水平溢位。 - 正式環境在
/etc/memories-center/auth.toml選用電子郵件模式。SMTP 於 2026-10-14 設定, 使用騰訊企業郵箱,在連接埠 465 透過憑證驗證的隱式 TLS 連線。供應商驗證通過,服務成功重新啟動,公開設定顯示註冊已啟用。 公開註冊請求在將驗證郵件提交給供應商後傳回 200,並附有verification_required: true。 收件匣是否收到郵件,以及使用者最後提交驗證碼/密碼的步驟仍未驗證。密碼僅保存在儲存庫外受保護的設定中。 - 受保護的一致性備份:
/var/backups/memories-center/20261014-before-accounts-83aca4d86199/state-and-config.tar.gz。 證據、原始碼修補檔與建置收據:dist/saas-accounts-20261014/。 修補檔可套用至記錄的乾淨基準;Git 會正規化文字換行。
ldny 上的託管 SaaS (2026-10-14,首次部署)
memories.ivjn.us 現在透過 Cloudflare Worker 與現有的 ldny Tunnel 提供託管 Center API。
靜態網站、Web 用戶端及獨立文件仍位於 Pages。ldny 在 Ubuntu 24.04 Podman 容器中執行 Linux 發行版,
持久保存的加密資料位於映像之外,啟動/重新啟動由 systemd 管理。
- 公開
/health傳回ok;/v1/public-key識別為memories-saas。 匿名/v1/session傳回 401,具範圍限制的成員/授權則傳回已授權工作階段。API 回應使用Cache-Control: no-store。 - 合成內容在服務重新啟動後仍保留。實際 Chromium 透過
https://memories.ivjn.us建立、編輯、重新開啟記憶,然後刪除。 最終容器發行版以新建的持久測試項目通過連續兩次 systemd 重新啟動。 透過公開 API 上傳/下載的 1 MiB 二進位檔案 SHA-256 一致;唯讀授權以 403 拒絕寫入。 - 桌面與 390px 行動瀏覽器檢查沒有水平溢位或主控台錯誤。瀏覽器儲存空間不含權杖/內容。 QA 內容已清除,暫時授權已撤銷。現有擁有者權杖在最終升級後仍可使用;已保留受保護的升級前狀態/設定備份。
- Web API 與邊緣代理的全部 10 項 Node 測試通過。Linux 發行版建置,以及本機 Linux 驗證/持久保存/內嵌資源冒煙檢查通過。
服務配置與復原方式請參閱儲存庫的 deploy/README.md。
機密在伺服器上產生,未放入儲存庫。這些檢查不代表獨立安全認證或公開自助帳號註冊。
本機證據位於 dist/saas-ldny-20261014/。
Memories Web (2026-10-14,首次前端部署)
已在 /app/ 新增靜態 Center 用戶端,並將相同資源封裝至 memories-center。
這是託管 Center 用戶端,並非離線瀏覽器保管庫。此次首次前端部署早於上方記錄的 SaaS 上線。
- 完整 Rust 檢查順序皆通過:格式檢查、將警告視為錯誤的工作區/所有目標 Clippy、 鎖定相依性的工作區測試,以及鎖定相依性的工作區發行版建置。Center 測試套件包含明確來源驗證與 CORS 範圍/驗證測試。
node --test scripts/tests/web-client.test.mjs:6 項通過,涵蓋權杖來源綁定、重新導向/Cookie/快取限制、 部分更新、取消與過期回應、失敗的連線競態、一般化錯誤與二進位編碼。- 實際 Chromium 將連接埠 8097 的靜態網站連至連接埠 9297 的可拋棄託管 Center。 記憶建立/編輯/重新開啟、卡片建立/刪除、檔案上傳與下載皆通過。10,240 位元組二進位下載的 SHA-256 與來源一致。 讀取者授權停用修改操作;僅寫入授權建立的記憶可由擁有者授權獨立讀取,且已刪除的卡片不存在。
- 已檢查桌面與 390px 行動工作區版面配置。明確中斷連線會清除可見內容與權杖欄位;也已觀察到五分鐘閒置鎖定。 localStorage 與 sessionStorage 均不含權杖或內容。
- 發行版 Center 提供的全部七個封裝資源逐位元組符合網站來源。其
/app/頁面載入時沒有瀏覽器主控台錯誤或警告, 並已檢查 CSP/安全標頭。
僅使用合成保管庫資料與可拋棄授權。這些檢查不代表已連接正式環境保管庫、獨立安全稽核,或與原生用戶端功能相同。
證據保留於本機的 dist/site-update-7647166/output/playwright/ 與 dist/web-client-qa/。
網站用戶端更新 (2026-10-14)
網站後續更新:下載卡片現在共用雜湊、主要按鈕及中繼資料連結的網格列。
/docs/ 的獨立文件包含 29 個產生頁面,具備導覽、標題連結與行動版可摺疊選單。
python scripts/build-website-docs.py 會驗證全部 30 個 HTML 頁面的本機連結與片段目標。
兩個網站指令碼皆通過 node --check。瀏覽器檢查涵蓋首頁、文件入口、英文與中文指南及設定,
在 390px、900px 與 1440px 下沒有頁面水平溢位或主控台錯誤。
四張桌面卡片的下載按鈕、雜湊與 BUILD-INFO 連結垂直位置一致。
來源基準:7647166a6d97e59e9a466fec5ead287892b428af(main,已與 origin/main 同步)。
Windows 與 Linux 套件使用此已提交原始碼。Android 另包含下述本機 R8 建構子保留修正;
其 BUILD-INFO.json 記錄了 source_dirty: true 與已發布的原始碼修補檔。
| 已發布產物 | 位元組 | SHA-256 |
|---|---|---|
| Windows x86_64 v0.1.7 ZIP | 51646344 | 755663b54323bfcf4ba9bef474c10599542372416ac6b50dcc4bd0d3f75fdcad |
| Linux x86_64 v0.1.7 tar.gz | 44817901 | 2a58ab5702e82baa4dc7fcc30a42b4ca01811d3a9312facf5429d444b0f64b7d |
| Android v0.1.7,versionCode 8 APK | 146722216 | 74256790a248ea17b0f9ad60aa74be311da7ef77b243023fa8d4490b76a1d24d |
公開基底網址為 https://r2.ivjn.us/memories/7647166/windows/、
https://r2.ivjn.us/memories/7647166/linux/ 與
https://r2.ivjn.us/memories/7647166/android-cc5ac4b5/。三個套件與其發布的中繼資料均已重新下載,並符合本機 SHA-256 雜湊。
Android SOURCE.patch 的 SHA-256 為
cc5ac4b57ced3bc87738d51da5ded84822627b5f05f8db024d323bde98dda4c2;
對乾淨基準工作目錄執行的 git apply --check 已通過。
已執行的驗證:
- Windows 上的 Rust 1.98.0:
cargo fmt --all --check、cargo clippy --workspace --all-targets --locked -- -D warnings、cargo test --workspace --locked與cargo build --workspace --release --locked皆通過。設定為忽略的測試仍維持忽略;相依性的未來相容性警告仍存在。 - Windows 套件:47 個資訊清單檔案與封存項目皆已驗證;解壓縮後 CLI 的
--version傳回memories 0.1.7,relay 的--help通過。 - Linux 套件:在乾淨 WSL GNU 工作目錄中以
bash scripts/package-linux.sh建置(glibc 2.39、OpenSSL 3)。 全部 45 個資訊清單檔案、封存項目與執行權限皆已驗證。解壓縮後 CLI 的--version與file exec --help通過;ldd解析了全部相依性。 - Flutter 3.44.2 / Dart 3.12.2:
flutter pub get、dart format --output=none --set-exit-if-changed lib test integration_test、flutter analyze與flutter test通過(126 項測試)。 - 重新建置 ARM64/x86_64 Rust FFI 程式庫,並在 Android API 35 x86_64 上成功執行
flutter test integration_test/native_smoke_test.dart -d emulator-5680。 已將過時的八字元 ID 斷言更新為符合核心的偶數長度 6-16 十六進位字元契約。 隨後重新建置一般偵錯 APK,並驗證其原生程式庫。 - 以
flutter build apk --release --target-platform android-arm64,android-x64 --build-number 8建置發行版 APK,對齊後使用AGENTS.md所記錄的外部設定簽署。apksigner verify通過,使用的現有發行版憑證 SHA-256 為d637a37d5dd77aa5753722eccf53ab1b84baed2189e603cef9c34dbf354948f8。 兩種 ABI 的來源、合併、移除符號及封裝 FFI 程式庫皆已檢查。 - 實際簽署發行版測試發現 R8 啟動當機:Room 透過反射建構
androidx.work.impl.WorkDatabase_Impl, 但其公開無參數建構子已被移除。已新增範圍有限的保留規則、重新建置,並驗證兩次冷啟動及進入 Standalone 模式, 沒有 AndroidRuntime 嚴重例外。失敗的候選版本已在網站部署前撤回;其公開 APK URL 傳回 HTTP 404。 - 網站 JavaScript 語法及本機 HTML 資源、ID 與片段目標檢查通過。 1440px 與 390px 的本機瀏覽器雙語切換檢查通過,沒有水平溢位或主控台錯誤。
Cloudflare Pages 正式部署已完成,網址為
https://09253fe4.memories-ap4.pages.dev,專案 memories、分支 main,
並附帶未提交來源的中繼資料。https://memories.ivjn.us/ 傳回 HTTP 200,且與本機 website/index.html 逐位元組一致。
全部 12 個下載/中繼資料連結皆傳回 HTTP 200,包括保留的 macOS 連結。
CSP、nosniff、禁止框架、referrer 與 permissions-policy 標頭皆存在。
正式環境瀏覽器檢查在 1440px 與 390px 下通過英文/中文切換,沒有水平溢位,主控台錯誤與警告均為零。
螢幕擷取畫面位於 dist/site-update-7647166/output/playwright/live-*.png。
本機證據與輔助工具位於 dist/site-update-7647166/;Windows 套件位於 dist/v0.1.7/。
簽署機密始終位於工作目錄之外。macOS 仍使用現有 v0.1.3 下載:macOS 主機離線,GitHub Actions 受帳號帳務/支出限制阻擋。
此處不宣稱有新的 macOS 或 iOS 建置、實體 ARM64 執行、商店發布或獨立安全稽核。
上述 Linux 驗證取代了較舊基準對此套件所列的 Linux 限制。
無人值守原生 CI 串接 (2026-10-01;已排程,尚未執行)
.github/workflows/ci.yml 的 Rust 作業系統矩陣現在會在一般工作區測試後排程明確的原生檢查:
- Windows:
cargo test -p memories --lib native_dpapi --locked執行現有的目前使用者 DPAPI 往返與綁定變更拒絕測試。 測試僅使用合成記憶體緩衝區,由原生緩衝區守衛釋放並歸零;從不存取保管路徑預留值。 - macOS:
cargo test -p memories --lib unattended_backend::macos::tests::native_roundtrip_when_keychain_is_unlocked --locked -- --exact --ignored僅執行被忽略的原生 Keychain 往返測試,不執行其他被忽略的測試。 它會建立帶有唯一暫存目錄綁定的合成、不同步項目,然後在檢查讀取結果或斷言相等前,刪除該確切項目。 建立、讀取及清理錯誤皆使測試失敗;建立失敗絕不會觸發刪除既有項目。
macOS 執行器必須提供可用、已解鎖,且允許無 UI 建立/讀取/刪除的使用者鑰匙圈。 未加入鑰匙圈解鎖、驗證 UI、ACL 弱化、全域鑰匙圈變更或密碼注入。 鑰匙圈遺失或鎖定時會失敗,不會默默略過或改用備援。如果原生刪除失敗,測試會失敗,其合成項目可能殘留於可拋棄執行器。 較早的格式/靜態檢查/測試失敗可能導致無法執行這些步驟。
這些步驟設定於未來推送/提取請求的 CI 執行,並非已執行的原生證據。 未派送任何工作流程,也未在本機執行 Windows 或 macOS 原生測試:本次實作環境為 Linux,未設定原生主機。 實際原生執行,以及鎖定/需要核准時的無 UI 驗證仍是發行門檻;僅串接 CI 並不代表已完成。
Linux 建置與封裝指令碼 (2026-09-18)
已從 Windows 工作目錄,在 WSL2 的 Ubuntu 中驗證新的 Linux Shell 指令碼。
兩個指令碼皆通過 bash -n。可拋棄的已提交測試儲存庫與模擬建置工具涵蓋發行版/偵錯版選擇、
在 CARGO_BUILD_TARGET 衝突時明確選擇原生目標、含空白的路徑、自訂 Cargo 目標目錄、x86_64/aarch64 封存配置、
執行權限、追蹤中的文件/授權、來源提交中繼資料,以及全部檔案/封存檢查碼。
錯誤的作業系統、不支援的目標、無效引數、缺少 OpenSSL、建置失敗、未提交變更的工作目錄與既有套件目錄皆如預期遭拒;
既有封存檔保持不變。
WSL 環境沒有 Rust/C 建置工具鏈,因此此處驗證的是使用測試產物的指令碼行為,而非 Linux 編譯或原生執行。 更新後的手動桌面工作流程包含 Linux 相依性安裝、ShellCheck、Rust 檢查、封裝、檢查碼驗證, 以及解壓縮後的 CLI/relay 冒煙命令;本次變更尚未執行該遠端工作流程。 原生 ARM64 與發行版/glibc/OpenSSL 相容性仍未驗證。
Windows v0.1.3 檢索、內嵌模型與六字元 ID (2026-09-18)
v0.1.3 標籤與發行版 BUILD-INFO.json 識別原始碼及封裝檔案。
推論引擎是應用程式的一部分;模型權重以經驗證的資料檔案分別安裝,不由另一個應用程式執行。
- 工作區迴歸測試:158 項通過,零失敗,17 項輔助/工具/模型相依案例刻意忽略。 最終六項檢索測試套件也另外通過,包括工作區測試開始後新增的、進行中公開文件改為私密的迴歸測試。
- 原生 EmbeddingGemma 使用實際固定版本 Q4 模型檔案,在程序內執行。 中文問題將相關的英文狗文件排在無關財務文字之前,向量為 768 維、有限且已正規化。 第二個實際 CLI/常駐程式測試建立向量索引、檢索語意符合項目,並確認鎖定拒絕/快取清除。 兩項選擇啟用的測試皆在建立工作階段前明確停用 ONNX 遙測後通過。
- 最終最佳化 Windows 發行版 CLI 也直接透過實際常駐程式 IPC 測試:六字元 ID、兩份已索引文件、跨語言語意符合與鎖定拒絕皆通過。
報告為
target/rag-release-smoke.json;未使用外部嵌入應用程式。 - 使用實際發行版 CLI,對可拋棄的本機回送鏡像執行模型安裝通過:注入的 HTTP 429 與中斷的模型回應透過重試/範圍恢復 (59 個請求、53 個範圍),全部七個模型檔案皆符合固定 SHA-256。 停止鏡像後重複安裝,會離線重用已驗證檔案。安裝未初始化任何加密儲存區。
- HTTP 測試環境驗證 Gemini/相容負載、要求的維度、嵌入順序/數量/維度檢查、學習式重新排序、引用拒絕、 暫時性重試、不重試的驗證錯誤、取消,以及實際 HTTPS 代理 CONNECT。失敗本文與直接 API 金鑰回顯皆被抑制。
- 搜尋/RAG 迴歸測試涵蓋中文詞彙、any/all/phrase 模式、Unicode 區塊位移、向量快取重用/失效、 隱藏憑證/私密/已刪除內容、鎖定及授權撤銷、跨保管庫拒絕、僅裝置內容的遠端揭露拒絕,以及模型作業期間文件變更。 CLI 與 MCP 在 BM25 模式下無模型也能擷取/檢索。
- 六字元 ID、六/八字元碰撞延伸、舊八字元輸入相容性與具型別參照投影,連同現有授權/儲存/FFI 迴歸測試皆通過。 正規化儲存 ID 與安全指紋保持不變。
- 格式、工作區/所有目標 Clippy 搭配
-D warnings、最佳化建置,以及不含選用原生嵌入功能的核心建置皆通過。 現有相依性的未來相容性與原生連結器資訊警告仍存在。 - 未呼叫實際客戶 Gemini/生成/重新排序服務;通訊協定驗證使用合成 HTTP 測試環境。 此處未測試 macOS/Linux 執行或行動原生建置。行動 FFI 提供詞彙檢索,但拒絕模型支援的操作。未變更 Flutter UI。
模型修訂版:5090578d9565bb06545b4552f76e6bc2c93e4a66,來自
onnx-community/embeddinggemma-300m-ONNX。記錄為 target/rag-*.log,下載/鏡像紀錄位於 target/。
僅使用合成儲存區、文件與憑證。
Windows v0.1.2 桌面狀態與設定 (2026-09-18)
v0.1.2 標籤識別此原始碼。發行版 BUILD-INFO.json 綁定確切提交及每個封裝檔案;
SHA256SUMS 也涵蓋獨立範例設定。Windows 封存包含系統匣執行檔、內嵌 WebUI、全部追蹤中的文件、TOML 範例與封裝字型授權。
cargo test --workspace --locked -- --test-threads=2:144 項通過,零失敗,14 項子程序輔助/外部工具案例刻意忽略。 強化的設定轉送/即時 WebUI 迴歸測試也針對最終原始碼另外通過(兩項桌面整合測試)。- 格式、工作區/所有目標 Clippy 搭配
-D warnings,以及最佳化工作區建置,在 Rust 1.98.1 MSVC 上通過。 現有相依性的未來相容性與 FFI 連結器資訊警告仍存在。 - 迴歸測試涵蓋 capability/Host/Origin/fetch-site 拒絕、沒有修改或一般 IPC 路由、權杖輪替、部分 HTTP 連線下關閉、 被動閒置到期、隱藏鎖定細節與 MCP 拒絕。實際常駐程式/WebUI 整合涵蓋設定、已解鎖計數、鎖定與中斷連線。
- 設定測試涵蓋 CLI/環境/檔案優先順序、相對儲存位置、無儲存區檢查、明確將設定轉送至探測、 在選定 home 中保存語言、relay 預設值、格式錯誤的值、遮蔽錯誤,以及保留既有設定檔案。
- 實際 Windows 發行版 CLI/系統匣程序使用可拋棄 TOML 檔案與合成儲存區啟動。 瀏覽器驗證了鎖定/解鎖狀態與三個合成資料庫、全部五種語言、桌面/390 像素版面配置,沒有水平溢位或瀏覽器錯誤。 系統匣程序保持回應,沒有啟動錯誤。由於自動化介面未提供工作列/系統匣視窗,未驗證原生選單點擊。
cargo package --list包含內嵌資源/字型、設定範本與啟動器來源。 macOS Shell/內嵌 Python 封裝語法檢查通過。此 Windows 主機無法執行 macOS 編譯、選單列執行、簽署/公證及 Linux 執行檢查。- 未變更行動資源或 Flutter 程式碼;本次發行未重複執行 Flutter/原生裝置測試或選擇啟用的外部密碼工具案例。
記錄為 target/desktop-config-*.log 與 target/config-tests.log。
手動 Build desktop packages 工作流程提供 Windows/macOS 套件作業;工作流程定義不能證明 macOS 建置成功。
Windows v0.1.1 文件與密碼 ID 別名 (2026-09-18)
v0.1.1 標籤識別原始碼。此僅限 Windows 的預發行版包含每個追蹤中的 docs/ 檔案,並完整保留目錄結構;
其 BUILD-INFO.json 記錄來源提交及每個封裝檔案的 SHA-256,而 SHA256SUMS 涵蓋封存與建置資訊清單。
cargo test -p memories --locked --test crypto_jobs --test localization: 七項通過,零失敗;三項外部工具測試刻意忽略。迴歸涵蓋確認--password_id、--password與--password-id產生相同的計畫/核准摘要;憑證 ID 變更會改變核准。五種語言的說明會列出這些別名。cargo fmt --all --check、工作區/所有目標 Clippy 搭配-D warnings,以及cargo build --workspace --release --locked在 Rust 1.98.1 MSVC 上通過。 現有相依性的未來相容性與 FFI 連結器通知仍存在。- 發行版 CLI/relay 版本與密碼功能說明冒煙檢查通過。
- 下方完整工作區、外部工具與 Flutter 結果適用於 v0.1.0;此次 CLI 別名/文件更新未重複執行那些較廣泛的套件。 未重新建置行動產物;Flutter 應用程式版本保持不變。
- 可重複的封裝命令為
pwsh -File scripts/package-windows.ps1。 本次執行的記錄位於target/release-0.1.1-*.log。
Windows v0.1.0 預發行版 (2026-09-18)
在 Windows x86_64 本機以 Rust 1.98.1 MSVC 與 Flutter 3.44.2 建置。
v0.1.0 標籤識別原始碼;發行版 BUILD-INFO.json 記錄其完整提交,SHA256SUMS 涵蓋可下載資源。
cargo test --workspace --locked -- --test-threads=2:131 項通過,零失敗,14 項測試刻意忽略。 桌面處於作用中且已解鎖;先前遭螢幕鎖定阻擋的兩項 IPC 測試皆通過,未排除任何項目。- 三項選擇啟用的密碼互通性測試使用合成身分另外通過:S/MIME、OpenPGP 與 Android APK/AAB 格式簽署。
- Rust 格式、工作區/所有目標 Clippy 搭配
-D warnings,以及cargo build --workspace --release --locked通過。現有相依性的未來相容性通知仍存在。 - Flutter 分析、Dart 格式與全部 36 項 Flutter 測試通過。
- 發行版 CLI 版本/密碼功能說明、relay 說明,以及實際發行版 DLL 冒煙測試 (初始化、鎖定、解鎖、全部鎖定、關閉)使用可拋棄資料庫通過。
- GitHub Actions 無法啟動,因為 GitHub 回報帳號付款或支出上限限制。這些是本機結果,並非遠端 CI 結果。
- 產物是未簽署的 Windows 開發二進位檔。Android NDK 設定/下載未完成;本次執行未產生 Android/iOS 產物或原生裝置測試。 Linux/macOS 建置與正式發行驗收仍待完成。
| Windows 產物 | SHA-256 |
|---|---|
memories.exe |
b8c2598e946bf1bcaca0cfb103ab1f4530b4f168579a5788a9ad73d86b252497 |
memories-relay.exe |
a810a647fea9a1a94a67a89e3c53801a38d46e41218f013b8394d176bb008d55 |
memories_ffi.dll |
b18925b45b84c4fdc1dafa16f6db5e4ea226629ff5d971a9289170c1c5cc4375 |
記錄位於 target/release-20260918-*.log。
郵件密碼技術與應用程式簽署 (2026-09-17)
- 三項選擇啟用的互通性測試僅使用產生的身分通過: S/MIME 簽署/驗證與 PKCS#12 加密/解密;OpenPGP 分離式簽署/驗證及加密/解密; Android APK 對齊/簽署/驗證與 AAB 格式 JAR 簽署/驗證。APK 測試環境具有真正的二進位 Android 資訊清單; AAB 測試是合成 JAR 容器,並非可部署的 App Bundle。未使用真實帳號、身分或應用程式。
- 主機工具:Git for Windows OpenSSL 3.5.6、MSYS GnuPG 2.4.9、Adoptium JDK 17、
Android Build Tools 35.0.0 與 Android 36 平台 JAR。GPG 測試使用
--msys-gpg與可拋棄金鑰環。 使用MEMORIES_TEST_*工具路徑(列於crates/cli/tests/crypto_jobs.rs)與cargo test -p memories --locked --test crypto_jobs -- --ignored --test-threads=1執行選擇啟用的測試。 - 核心迴歸測試涵蓋本機權限提升、MCP 拒絕、變造的核准、變更的輸入/工具、既有輸出、不含機密的稽核/結果、 暫時憑證清理、工具執行失敗,以及成功卻未產生輸出的工具。也測試了五語 CLI 說明與非 macOS 的 iOS 拒絕。
- 排除下方兩項依賴螢幕鎖定的 IPC 案例後,工作區執行通過 129 項測試,零失敗,14 項測試刻意忽略
(子程序輔助與另外執行的三項工具測試)。命令為
cargo test --workspace --locked -- --test-threads=2 --skip actual_daemon_enforces_unlock_sudo_and_suppresses_child_secrets --skip catch_cli_stores_secrets_without_disclosure_and_requires_sudo。 cargo build --workspace --locked、工作區/所有目標 Clippy 搭配-D warnings、Rust 格式、差異空白, 以及更新後技能的quick_validate.py檢查皆通過。- 完整工作區執行在 Windows 工作階段中斷連線/鎖定時,遇到兩項既有的實際常駐程式/IPC 失敗
(
query user回報Disc,該工作階段中存在 LogonUI)。常駐程式的螢幕鎖定掛鉤撤銷合成工作階段, 產生LOCKED或遠端工作階段已移除錯誤。循序重複執行這些測試也呈現相同鎖定行為。 它們需要作用中且已解鎖的桌面;未為了測試而停用鎖定保護。 - iOS 簽署已實作,但未在 macOS 上驗證執行。此處未連接 Android 裝置,也未安裝 NDK; 未重新建置行動原生程式庫、APK 或 iOS 產物。行動 FFI 持續拒絕桌面程序作業。 此處不宣稱已完成實體安裝、Apple 佈建驗收、PGP/MIME 郵件用戶端整合或商店發布。
AI 用戶端技能注入 (2026-09-17)
- 推送前,僅包含已暫存技能的快照匯出至隔離目錄,並通過
cargo test -p memories --locked --bin memories --test skill_injection --test localization:25 項通過,零失敗,四項子程序輔助刻意忽略。該處的格式檢查也通過。 - 完整工作目錄驗證,包括既有 Wiki/剪貼簿變更:
cargo test --workspace --locked -- --test-threads=2:127 項通過,零失敗,十項由父情境呼叫的子程序輔助刻意忽略。 現有授權、MCP、儲存、同步、FFI 與 relay 迴歸測試連同新安裝測試皆通過。 - Windows:九項新迴歸測試通過(三項單元測試與六項 CLI 整合測試)。 它們涵蓋使用者/專案目錄、設定覆寫、重複目標、共用覆寫路徑、試執行、冪等性、明確取代、 衝突預先檢查、無效輸入、同層檔案保留與五語說明。測試使用可拋棄目錄,不啟動常駐程式或初始化 Memories 儲存區。
- 另外的 Windows junction 檢查確認
--force會在寫入其他目標前拒絕連結的技能目錄,並保留其原始檔案。 Unix 符號連結迴歸測試已納入,但未在此主機執行。 cargo build --workspace --locked、cargo fmt --all --check、cargo clippy --workspace --all-targets --locked -- -D warnings與git diff --check通過。現有 Rust 相依性的未來相容性與 FFI 連結器資訊警告仍存在。- skill-creator 的
quick_validate.py檢查通過。cargo package -p memories --list --allow-dirty --locked確認封裝的SKILL.md隨 CLI 套件提供。安裝不需要網路存取。 - 已依照目前的 Codex、OpenCode 與 Claude Code 文件檢查探索路徑。 未測試實際用戶端探索/模型行為、Linux/macOS 執行、Claude Desktop/Cowork 或雲端技能上傳。 驗證期間未變更個人技能目錄或用戶端設定。
Wiki 機密參照與剪貼簿 (2026-09-17)
- Windows Rust 工作區:118 項通過,零失敗,十個刻意忽略的子程序輔助測試由上層情境呼叫。工作區建置、Rust 格式與差異空白檢查通過。更新的 CLI、IPC 與 FFI 路徑也在最後修改後進行了針對性檢查。
- 四項核心功能回歸測試通過:精確替換、安全投影、本機權限提升/MCP 隔離、拒絕中繼資料(包含跳脫文字)、受保護卡片複製、拒絕二進位/NUL、同步、持久化與獨立備份復原。額外的針對性測試確認,在憑證已準備好後,若替換使文件超出本文大小限制,會以原子方式回復。已簽署的歷史內容刻意保持不變。
- 真實 CLI/daemon IPC 套件通過(三項測試與四個明確呼叫的子程序輔助測試),涵蓋替換、遮罩讀取與授權複製傳遞。FFI 回歸測試以相同 JSON 操作通過,且在原生鎖定後拒絕複製。所有測試資料皆使用合成機密與可拋棄儲存區;未使用已安裝的儲存區或使用者剪貼簿。
- Flutter:36 項測試通過,包含五個新增案例:隱藏替換輸入、寫入剪貼簿前提升權限、背景鎖定後捨棄延遲回應、複製失敗,以及編輯時保留參照。剪貼簿傳遞使用模擬平台通道。Flutter 分析、Dart 格式,以及使用
-D warnings的工作區/所有目標 Clippy 通過。 - 原生 Windows 剪貼簿呼叫可編譯,但未對互動式剪貼簿執行測試。未執行 Linux/macOS 剪貼簿輔助程式與行動作業系統剪貼簿傳遞。未連接 Android 裝置,設定的 SDK 中也未安裝 NDK;未重新建置 Android 程式庫/APK 與 iOS 產物。
- 記錄:
target/wiki-secret-tests.log、target/wiki-atomic-tests.log、target/wiki-ipc-tests.log、target/wiki-ffi-tests.log、target/wiki-flutter-tests.log、target/wiki-clippy.log、target/wiki-workspace-tests.log與target/wiki-build.log。
已儲存的語言偏好設定 (2026-09-17)
- CLI 測試:19 項通過,八個刻意忽略的子程序輔助測試。持久化測試針對可拋棄主目錄啟動個別 CLI 程序,驗證儲存/取代偏好設定、啟動與說明選擇、主目錄間隔離、暫時覆寫、清除設定、格式錯誤的設定,以及寫入失敗後清理。
- Flutter 測試:31 項通過。新增回歸測試驗證即時系統語系變更會更新介面與字型回退,而不寫入偏好設定。已儲存的選擇保持固定;重設為系統預設值後,重新啟動仍保留此設定。
- Flutter 分析、使用
-D warnings的工作區/所有目標 Clippy、Rust/Dart 格式與差異空白檢查通過。未測試原生裝置。 - 記錄:
target/i18n/persistence-rust.txt與target/i18n/persistence-flutter.txt。
五種語言的用戶端與 CLI (2026-09-17)
主機:Windows x86_64、Rust 1.98.1 MSVC、Flutter 3.44.2 / Dart 3.12.2。
- Rust 工作區測試:112 項通過,十個刻意忽略的子程序輔助測試。CLI 在最後修改後的本地化測試也通過。
- Flutter 元件/單元測試:29 項通過,包含五種系統語言、英語回退、持久化語言選擇、保留已解鎖工作階段、手機寬度對話框、複數計數,以及受保護預覽遮罩。
- Flutter 分析、Rust/Dart 格式、使用
-D warnings的工作區/所有目標 Clippy 與差異空白檢查通過。既有 Rust 相依套件的未來相容性通知仍存在。 - 使用實際執行檔測試了 CLI 說明、巢狀說明、語系優先順序與本地化非互動式錯誤。JSON 欄位與錯誤代碼保持穩定。元件螢幕截圖使用測試載入的字型,以 390 x 844 呈現。
本機記錄位於 target/i18n/。Flutter 的回送測試連線排除了主機 HTTP 代理。本次本地化變更未測試 Android/iOS 裝置、原生檔案選擇器、真實 OAuth 提供者或 Linux/macOS 執行環境。
雲端復原與撤銷後續驗證 (2026-09-17)
主機:Windows x86_64、Rust 1.98.1 MSVC。回歸測試資料僅使用合成資料、暫存加密資料庫與回送 HTTP。
cargo test --workspace --locked -j 2 --no-fail-fast -- --test-threads=2:106 項通過,十個刻意忽略的子程序輔助測試。涵蓋全部 24 項雲端同步/HTTP 整合測試。cargo fmt --all --check與使用-D warnings的工作區/所有目標 Clippy 通過。既有相依套件的未來相容性通知仍存在。
回歸套件涵蓋損壞下載回應後的正常重試、遭拒物件與成功匯入維持區分,以及舊版收據的一次性重新掃描。也檢查收件匣已滿時的相依項目下載、移除無參照的封套緩衝區,以及目錄游標停留在部分接納的頁面。
撤銷測試同時涵蓋絕不可傳送的佇列資料與正在進行的上傳:後者可能完成,但會阻止下一個請求並拒絕過時的確認。Google Drive 測試環境接受重複名稱,只拒絕重複檔案 ID。其重新啟動測試在伺服器接受檔案後中斷工作程序,驗證 ID 已儲存在本機,再確認重試恰好建立一個封套與一個描述元。
HTTP 測試環境在 Windows 上明確將已接受的通訊端設為阻塞模式;否則可能繼承監聽器的非阻塞模式,在請求位元組到達前重設連線。記憶體測試環境現在在模擬未完成發布時,會同時從清單與直接下載中隱藏物件。
此次後續驗證未使用真實雲端帳戶或 Android/iOS 原生裝置。下方記錄的平台與發行驗收限制仍適用。
可靠性與行動雲端後續驗證 (2026-09-17)
主機:Windows x86_64、Rust 1.98.1 MSVC、Flutter 3.44.2 / Dart 3.12.2。 全程使用合成機密與可拋棄資料庫。
- Rust 工作區測試通過,包含真實 daemon 的停滯用戶端/鎖定回歸測試。針對性測試另驗證阻塞的雲端 HTTP 請求仍允許鎖定、拒絕提供者同時執行,以及延遲確認無法恢復已失效的工作階段。
- 雲端回歸測試涵蓋正常 OneDrive 下載重新導向而不轉送 Bearer 權杖、重新導向迴圈/不安全目的地、各提供者的排入佇列與重新連線、超過舊有 256/4096 限制的已完成佇列壓縮,以及暫時缺少的物件在退避後重試。已撤銷接收者不再阻擋為有效裝置準備資料,也不再讓保存庫永遠處於待同步狀態。HTTP 測試環境現在會持續運作直到擁有者停止,而非在 30 秒後到期。
- Windows FFI 測試驗證忙碌與閒置控制代碼上的待處理背景鎖定,以及透過原生雲端工作程序派送。原生 OAuth 驗證會在網路 I/O 前拒絕不安全回呼與格式錯誤的 PKCE。
- Rust 格式與使用
-D warnings的工作區/所有目標 Clippy 通過。既有russh/proc-macro-error2未來相容性通知仍存在。 - Flutter 分析與全部 16 項元件測試通過,涵蓋帳戶狀態,以及同步請求進行中的手動鎖定。Rust 存取/更新權杖絕不回傳至 Dart;AppAuth 提供授權碼/驗證器。
- 發行版儲存基準測試使用 10、100 與 1000 筆合成記錄執行。結果與指標定義見 效能。稽核附加不再為每筆先前項目推導相同裝置公開金鑰。
- 已在本機檢查工作流程 YAML、內嵌簽署設定 Python、Unicode Java 屬性跳脫、Markdown 連結/圍欄與差異空白。
曾嘗試安裝 Android SDK/NDK/模擬器,但大型官方封存檔傳輸過慢,未能在此次執行期間完成。本次變更不宣稱任何 Android APK/原生裝置結果。iOS 建置需要 macOS,因此未執行。新增原生 CI 工作與手動 Android 簽署工作流程尚未在遠端執行。這些是已設定的檢查,而非已驗證的建置產物。
未執行已註冊原生 OAuth 用戶端、真實雲端同意、簽署散布、實體裝置測試或獨立安全審查。Google 原生重新導向支援必須使用所選註冊,分別在 Android 與 iOS 驗證。驗收關卡見 發行檢查清單。未取代已安裝的 memories 執行檔與真實使用者保存庫。
首次發行的專案命名 (2026-09-17)
專案、儲存庫、CLI、Rust 與 Dart 套件、FFI 符號與標頭、Android/iOS 識別碼、儲存名稱、環境變數與密碼學網域現在一致使用 memories。此次首次發行沒有舊名稱別名或遷移路徑。儲存庫位於 https://github.com/mbcc2006/memories。
主機:Windows x86_64、Rust 1.98.1 MSVC、Flutter 3.44.2 / Dart 3.12.2。
cargo test --workspace --locked -j 2 -- --test-threads=2:89 項通過,十個刻意忽略的子程序輔助測試。cargo fmt --all --check與使用-D warnings的工作區/所有目標 Clippy:通過。cargo build --workspace --release --locked -j 2:通過;CLI 版本與 relay 說明均顯示新名稱。- 使用可拋棄資料庫的六項發行版 CLI/daemon/FFI 冒煙檢查通過:原生初始化/寫入/備份、daemon 解鎖/讀取、
MEMORIES_HOME選擇、CLI 讀取與鎖定/解鎖、原生備份還原,以及memories_lock_all匯出鎖定有效原生控制代碼。 - Dart 格式與
flutter analyze:通過。Flutter 元件測試:14 項通過。首次元件測試因主機 HTTP 代理無法連線至本機測試執行器;從該程序移除代理變數並在NO_PROXY加入回送位址後,重新執行通過。
本機證據位於 target/rename-tests.log、target/rename-clippy.log、target/rename-release-build.log、target/rename-e2e.log、target/rename-e2e-report.json、target/rename-flutter-analyze.log 與 target/rename-flutter-tests.log。E2E 報告將結果綁定至 CLI 雜湊。本次重新命名未執行 Android APK/iOS 建置與原生裝置整合測試。下一節的真實服務代理 E2E 結果描述先前建置;本節記錄新發行版的本機冒煙檢查。
| Windows 發行產物 | SHA-256 |
|---|---|
target/release/memories.exe |
3820d6d0d1effb64a98f3672cf7d8235739b22989c16c1c4112a1d2282012e5e |
target/release/memories-relay.exe |
9e92d253572f57256b423dd893dde5d580d711ffd84d22e39e8eceb3f5235221 |
target/release/memories_ffi.dll |
0cefa06d8527b5a9c9003636a1425cd7e2d0708f6b1d380ffaad9fc508b2c9af |
SSH/資料庫代理與發行版 E2E (2026-09-16)
主機:Windows x86_64、Rust 1.98.1 MSVC。發行版 CLI/daemon 在 Ubuntu 22.04 WSL 中,針對可拋棄 OpenSSH 8.9p1、PostgreSQL 14.24、MySQL 8.0.46 與 Redis 6.0.16 伺服器執行測試。伺服器套件解壓至私有暫存目錄,使用獨立資料、憑證與合成帳戶;未安裝系統服務。測試 daemon 使用可拋棄 --home。測試後停止所有測試伺服器並移除其資料/私密金鑰。
- 工作區回歸測試:88 項通過,十個刻意忽略的子程序輔助測試。命令:
cargo test --workspace --locked -j 1 -- --test-threads=1。 - 後續短 ID 修正通過全部九項遠端測試與真實 daemon IPC 情境。最後的關閉修正通過四項代理測試、兩個 IPC 情境,以及額外的立即停止/鎖定回歸測試;測試用戶端未使用關閉等待/join。這些針對性測試在完整工作區測試後執行。
- 最後的使用
-D warnings的工作區/所有目標 Clippy、Rust 格式與差異空白檢查通過。russh與proc-macro-error2的既有相依套件未來相容性通知仍存在;未抑制任何 lint 錯誤。 cargo build --workspace --release --locked -j 2通過。重新建置的 CLI 版本/說明與 relay 說明命令成功執行。未取代已安裝的 daemon 與使用者資料。- 使用
scripts/test-proxy-e2e.py,針對重新建置的發行版執行檔,11 項真實服務 E2E 檢查通過。OpenSSH 與 SFTP 用戶端、psycopg2、PyMySQL 與 redis-py 在不取得上游機密的情況下,連線至 daemon 建立的回送代理。
E2E 涵蓋短 ID 憑證匯入與拒絕機密讀取;拒絕 SSH 主機金鑰不符;轉送 stdout、stderr 與結束狀態;SFTP 上傳/下載;拒絕不受信任的 PostgreSQL TLS;PostgreSQL SCRAM、已驗證 TLS、Unicode 與交易回復;MySQL caching-SHA-256、已驗證 TLS 與四位元組 Unicode;透過 TLS 的 Redis AUTH;MCP 權限提升隔離;明確停止而不中斷其他代理;以及鎖定關閉所有監聽器與已建立的 SSH/資料庫連線。
首次 E2E 執行發現,proxy stop 回傳後,接受迴圈仍可能繼續轉送請求最多 200 ms。服務現在會在確認停止/鎖定前,持有並等待代理工作程序完成。最後 E2E 重跑在回應後立即檢查斷線,且通過。
本機證據:target/proxy-20260916-workspace-tests.log、target/proxy-20260916-remote-tests.log、target/proxy-20260916-shutdown-tests.log、target/proxy-20260916-close-regression.log、target/proxy-20260916-clippy.log、target/proxy-20260916-release-build.log、target/proxy-20260916-e2e.log 與 target/proxy-e2e/results/report.json。報告將 E2E 結果綁定至下方 CLI SHA-256。可重複使用的指令碼需要依其模組文件所述,由外部佈建可拋棄測試環境;它不會安裝伺服器。
| Windows 發行產物 | SHA-256 |
|---|---|
| Windows CLI(歷史建置) | eea9ee3db29ea26e0dbf0d8090475eed05e2653936cc70816ea5147b1240447f |
| Windows relay(歷史建置) | 34d4a15094031e47d1d9086291d52d04419caf509b848dbc1ae41fa57f491c3a |
| Windows FFI 程式庫(歷史建置) | f02e7efaff6fa182e3d9cd047289aad184c3c441277539bbf5920038fb149bfd |
本次桌面代理變更未重新建置 Android/iOS 產物,也未執行原生執行環境測試。未使用正式環境 SSH/資料庫或真實雲端帳戶。
雲端物件同步 (2026-09-16)
新增提供者中立的不可變物件執行器,具有持久寄件匣/收件匣收據。測試涵蓋於 crates/core/src/sync.rs 單元測試與 crates/core/tests/cloud_sync.rs:
- 程序重新開啟後保留完全相同的封套位元組;put 失敗時以相同物件 ID 重試,不重新加密。
- 重複 put 會下載並驗證既有物件,才將工作標記為已上傳。
- 先於封套列出的描述元保持待處理;顯示封套並重新排序/重複列出清單,仍只匯入一次。
- 損壞的下載記錄為
corrupt,不合併保存庫狀態。 - 鎖定與登出遞增同步工作階段,使延遲的
CloudSyncAck無法匯入;未完成寄件匣工作在解鎖後保持加密狀態,直到登出取消。 - 兩個配對裝置透過
MemoryTransport交換並行編輯。 - 僅限本機的保存庫與 MCP 呼叫者無法排入或檢視工作。備份與還原的資料庫具有空的
cloud_sync,且沒有雲端帳戶。
新增 daemon 擁有的 SSH/FTP/TCP 工作階段,支援每個指令的提案/核准/執行(crates/core/src/remote.rs、crates/core/tests/remote.rs)。MySQL、Redis 與 PostgreSQL 工作階段在實際連線上保留狀態,並預設啟用 TLS(主機名稱驗證;可選 PEM CA 憑證)。--no-tls 必須明確指定。未執行真實資料庫 TLS 交握。SSH/TLS 金鑰產生將私密金鑰保留在憑證儲存區;測試確認產生/公開回應不含私密金鑰 PEM。回送 SSH/Redis 代理注入已儲存憑證,讓本機用戶端不取得機密即可連線;鎖定會設定代理停止旗標。未使用真實帳戶。
新增權杖更新、OneDrive/Google Drive 介面卡、daemon CloudSyncRun 與 memories cloud sync。測試涵蓋於 cloud.rs 更新測試與 crates/core/tests/cloud_drive.rs 回送測試環境。未授權真實 Microsoft/Google 帳戶。未新增行動登入/同步介面。
2026-09-16 本機檢查(Windows x86_64、rustc 1.98.1 GNU、MinGW-w64 GCC 16.2.0):
cargo test -p memories-core --locked -j 1 -- --test-threads=1:49 項通過,兩個刻意忽略的子程序輔助測試。cargo clippy -p memories-core --all-targets --locked -- -D warnings:通過。cargo fmt --all:通過。
儲存庫審查 (2026-09-09)
- Windows Rust 工作區:51 項通過,零失敗。十個刻意忽略的子程序輔助測試由上層測試明確啟動。命令:
cargo test --workspace --locked -j 1 -- --test-threads=1。 - 初始化測試在暫存準備後、發布前終止程序,然後成功重新建立/解鎖儲存區。既有目的地(包含初始化期間出現的檔案)保持完整;目的地作業系統鎖定持續持有至發布完成。這未模擬實體斷電。
- 憑證擷取拒絕重複 JSON 鍵,包含巢狀物件與跳脫後等價的名稱。測試保留有效陣列/指標/字串行為、錯誤遮蔽,以及透過實際 CLI/daemon IPC 的拒絕行為。
- 延遲 HTTP 個人資料測試環境確認 OAuth 網路延遲無法延長存取權杖有效期。既有提供者交換與鎖定/登出取消回歸測試通過。Relay WebSocket 測試現在包含 Ping/Pong;控制回覆使用與佇列資料相同的十秒傳送逾時。未執行飽和通訊端長時間測試。
- 使用
-D warnings的工作區/所有目標 Clippy、Rust/Dart 格式、差異空白與本機 Markdown 連結/圍欄檢查通過。Flutter 分析未回報問題;全部 14 項元件測試通過。 - 重新建置的 Windows FFI 通過可拋棄合成資料檢查:初始化成功且無殘留暫存檔、鎖定後拒絕過時票證、重新開啟後加密帳戶持久化、僅中繼資料狀態,以及本機登出。測試環境隨後移除。
- 本機記錄:
target/review-20260909-rust-tests.log、target/review-20260909-clippy.log與target/review-20260909-flutter-tests.log。Rust 使用D:/memories-build-cache/cards,搭配一個建置工作/測試執行緒。 - 本次審查未執行真實 Microsoft/Google 授權、Android/iOS 原生執行或 Linux/macOS 執行環境檢查。未取代已安裝執行檔;未驗證遠端 CI 與發行產物。
雲端授權 (2026-09-09)
- Windows Rust 工作區:47 項測試通過,包含雲端授權與儲存故障回歸測試。九個輔助測試排除於自動探索之外,由上層情境明確啟動。
- 使用
-D warnings的工作區/所有目標 Clippy、Rust 格式與差異空白檢查通過。最後的非阻塞瀏覽器啟動調整之後,執行了 CLI 雲端測試、Clippy 與全新 CLI/FFI 建置。 - 兩個 OAuth 提供者皆使用本機 HTTP 測試環境測試:PKCE、state、帳戶身分、範圍檢查、缺少更新權杖、回應限制、拒絕重新導向,以及不反射機密的一般錯誤。
- 真實回送通訊端測試拒絕無關回呼,並接受相符回呼,而不將其授權碼反射至 HTTP 回應。
- 核心回歸測試檢查呼叫者/提供者綁定、重播、鎖定/登出取消、加密持久化、稽核/MCP 隔離,以及解密備份與同步負載中不存在雲端權杖。
- 使用合成權杖的暫存 Windows FFI 測試環境通過關閉/重新開啟後授權持久化、由
memories_lock_all取消,以及登出。測試環境隨後移除。 - 未提供已註冊用戶端設定或真實雲端帳戶,因此真實 Microsoft/Google 同意與權杖核發仍未驗證。未上傳雲端檔案。未連接 Android 裝置/模擬器;本次變更未驗證 Android/iOS 原生執行與行動登入介面。
- 已建置本機開發執行檔;未取代已安裝 CLI/daemon 執行檔,不宣稱任何遠端 CI 或發行結果。
推送前驗證 (2026-09-09)
- Rust 工作區回歸測試:30 項通過;兩個 IPC 子程序輔助測試仍由上層情境明確呼叫。涵蓋短 ID 碰撞、歷史、受保護參照與授權往返。
- 使用
-D warnings的工作區/所有目標 Clippy 與 Rust 格式通過。短 ID 奇偶檢查更新為is_multiple_of;等價 lint 修正後,兩項 ID 單元測試再次通過。 - Dart 格式、Flutter 分析與全部 14 項元件測試通過。
- Windows 測試使用
D:/memories-build-cache/cards、一個建置工作與一個測試執行緒。造成 LNK1201/LNK1207 的舊 PDB 檔案在重新產生前,以.pre-push-20260909後綴保留。成功工作區記錄為target/push-20260909-rust-tests.log。 - 本次檢查未重新建置發行執行檔與 Android 產物;下方較早的產物雜湊無法驗證新短 ID 協定。遠端 CI 結果另行追蹤。
密碼長度後續驗證 (2026-09-09)
本機與備份密碼不再具有應用程式層級的最小或最大長度政策。接受空輸入。確認、Argon2id 參數、驗證、sudo 範圍與加密儲存仍保留。
- 新增核心回歸測試通過長度 0、1 與 4096:建立儲存區、驗證、解鎖、備份與復原;拒絕錯誤密碼。
- 使用
-D warnings的工作區/所有目標 Clippy 與 Rust 格式通過。 - Flutter 分析與全部 14 項元件測試通過,包含以空密碼與單字元密碼初始化,同時保留確認步驟。
- 重新建置 Windows CLI/FFI 並重新啟動本機 daemon。針對發行版 FFI 的獨立暫存測試環境通過單字元初始化/解鎖/sudo、空備份密碼,以及以單字元密碼保護的復原。
- 重新建置兩種 Android ABI 與一般進入點 APK。來源/合併與移除符號/APK 原生程式庫相等檢查通過。本次僅長度變更未重新執行 Android 執行環境整合;原生測試環境現在使用單字元密碼,供下次裝置測試使用。
這些雜湊取代較早的產物記錄。建置記錄為 target/password-length-android-build.log;詳細 ABI 雜湊位於 target/password-length-artifacts.json。
| 產物 | SHA-256 |
|---|---|
| Windows CLI(歷史建置) | 0b35b8becadccfcb82d41ccca6c231880fa29003f60eb84ac590953ddf4ed10d |
| Windows FFI 程式庫(歷史建置) | 2556e0bc894584520b6b7311e1889680a5cd28bc9c36a180f8b986ce59aca04c |
mobile/build/app/outputs/flutter-apk/app-debug.apk |
4167422819f7ed8ec5cd41faab7e0ac598b26d40e0869cec8f81906de6efc2d3 |
卡片、受保護中繼資料與 OTP 後續驗證
下列功能檢查與產物取代本文後段記錄的基準建置雜湊。驗證期間使用的全部憑證皆為合成資料;未使用提供的帳戶憑證或郵件伺服器。
- Rust 工作區回歸測試:25 項通過。擴充 CLI IPC 情境與 RFC 6238/格式錯誤輸入檢查,也在最後新增測試後通過。兩個輔助測試刻意由自動探索忽略,並由 IPC 情境明確執行(憑證注入與同層程序 sudo)。
- Rust 格式與使用
-D warnings的工作區/所有目標 Clippy:通過。Windows 除錯檢查使用D:/memories-build-cache/cards與-j 2。 - Flutter 分析與全部 12 項元件測試:通過。涵蓋手機尺寸圖譜、有向反向連結、遮罩預覽、私密 OTP 授權、到期,以及背景/鎖定時關閉 OTP 對話框。
- 重新建置 Windows 發行版工作區。使用暫存加密儲存區的真實發行版 CLI 記錄 Python 3.13.1 與其執行檔目錄,將保存庫標記為僅限本機,並透過卡片搜尋找到觀察記錄。檢查後移除測試環境與 daemon。
- 重新建置 ARM64/x86_64 Android FFI 程式庫。API 35 x86_64 模擬器通過真實 FFI 整合測試:卡片/連結/圖譜、dotenv 僅鍵搜尋、TOTP 產生、拒絕憑證讀取、稽核與鎖定/解鎖。記錄:
target/cards-android-native-test.log。 - 整合測試後重新建置並安裝一般進入點開發 APK。啟動、密碼初始化、建立資料庫與開啟新增受保護卡片表單成功。進一步手動帳戶表單提交因模擬器從 ADB 消失而中斷;不將該額外手動情境記錄為通過。啟動 XML:
target/cards-android-startup.xml;建置記錄:target/cards-android-build.log。 - 依 ABI 檢查封裝的原生程式庫:來源等於 Gradle 合併輸出,而移除符號輸出等於 APK 項目。證據與大小:
target/cards-artifacts.json。
核心安全測試涵蓋獨立加密憑證儲存、原子失敗、搜尋/清單/圖譜/MCP/稽核與明文資料庫位元組中不存在機密、拒絕參照替換、主機限制/標頭注入、僅限本機內容排除於配對/同步/備份之外,以及同步/復原後的 OTP 參照。RFC 6238 涵蓋 SHA-1/SHA-256/SHA-512 的全部六個標準時間戳記,以及六位數輸出與拒絕格式錯誤種子/週期。HTTP 標頭測試使用合成值並驗證敏感標頭標記;未向正式環境服務發出已驗證請求。
目前產物(開發建置,未簽署供散布):
| 產物 | SHA-256 |
|---|---|
| Windows CLI(歷史建置) | 9ff3d67b145508935e793dd7ce9b773d9f373549a8b08479de2f9c31a499dbd3 |
| Windows relay(歷史建置) | 4aae7b45fbe9e009a7f118a384d246b3c878f2e43da821110c8e4bb5ef5a091a |
mobile/build/app/outputs/flutter-apk/app-debug.apk |
4551a72acab24cfdfb6279f2e27507ca24a938ee716417fb99e4bad96847a9fe |
已封裝 Rust SHA-256:
| ABI | SHA-256 |
|---|---|
arm64-v8a |
eb8013d2bde1041412d08deb074f3fbbab7a24400e7cdde4cec890398b58f6a9 |
x86_64 |
cf34d3a09ba0c417460625d2f2ddf102cb891241e64de97f09479b63449f1aa9 |
本文末尾的平台限制仍適用。本節記錄本機驗證;此處不宣稱遠端 CI 結果。
基準 Windows Rust 工作區
主機:Windows x86_64、穩定版 Rust 1.98、MSVC 工具鏈、內建 SQLite。
| 檢查 | 結果 |
|---|---|
cargo fmt --all --check |
通過 |
cargo clippy --workspace --all-targets --locked -j 1 -- -D warnings |
通過 |
cargo test --workspace --locked -j 1 -- --test-threads=1 |
18 項通過,1 個刻意忽略的輔助測試 |
cargo build -p memories -p memories-relay --release --locked -j 1 |
通過 |
cargo ndk -t arm64-v8a check -p memories --locked -j 1 |
通過;僅編譯 Unix 條件程式碼 |
忽略的測試是 IPC 測試使用的子執行檔,會在該處於憑證注入下明確執行。它並非略過的安全情境。
測試涵蓋已驗證加密與傳輸竄改、加密 SQLite 狀態、錯誤密碼、檢查點截斷、區塊排序、權限、裝置核准與撤銷、拒絕身分重新授權、共享成員資格、重播、並行修訂、政策分叉解決與獨立備份復原。真實 CLI daemon 測試涵蓋解鎖、終端機 sudo、拒絕憑證讀取、執行檔摘要核准、抑制子程序輸出、已簽署稽核、MCP 範圍與鎖定。真實 WebSocket 測試檢查即時路由與斷線後房間清理。
Windows 具名管道實作使用阻塞式框架處理。嘗試的 PIPE_NOWAIT 實作未通過真實 daemon 回歸測試,因此已取代;同一使用者可用性限制記錄於 SECURITY.md。
基準 Windows 產物(路徑相對於工作副本;Git 忽略建置輸出)。CLI 也通過 --version 與 --help 執行:
| 產物 | SHA-256 |
|---|---|
| Windows CLI(歷史建置) | c9086eb0dfabc0fbdb0ce8ba37a8f82b837c551138aa8d2fe900df2e6d4b7495 |
| Windows relay(歷史建置) | 7a3713068f28d10e4c839a5c0587b85e1502b1a8bc7fe4ef6e42b8c349244b77 |
Flutter 與行動原生程式庫
工具鏈:Flutter 3.44.2 / Dart 3.12.2、Android NDK 28.2.13676358、Android SDK 平台 35、36 與 37.0、Gradle 9.1.0。
| 檢查 | 結果 |
|---|---|
dart format --output=none --set-exit-if-changed lib test integration_test |
通過 |
flutter analyze |
通過,無問題 |
flutter test |
3 項元件測試通過 |
| ARM64 與 x86_64 Android Rust FFI 發行版建置 | 通過 |
| Android API 35 x86_64 模擬器原生整合測試 | 通過 |
| 一般 Android APK 安裝與介面冒煙流程 | 通過 |
元件測試驗證原生啟動失敗會讓資料庫保持鎖定、切換至背景會關閉內容對話框並清除授權狀態,以及閒置到期也會關閉已開啟的內容對話框。行動授權世代變更後,拒絕延遲的非同步回應。原生整合測試使用裝置上的暫存資料庫,而非模擬後端。它初始化真實 Rust 服務、寫入與讀取記憶、要求提升權限才能新增憑證、拒絕憑證讀取、驗證稽核鏈、鎖定全部原生控制代碼,以及解鎖持久化內容而不恢復權限提升。測試後移除測試目錄。
模擬器以唯讀模式執行既有 API 35 x86_64 映像,不儲存快照。測試輸出位於本機 target/android-native-test.log。Android 建置從外掛工具鏈發出舊版 SDK XML 版本警告,但未阻止編譯或原生執行。應用程式的 compile SDK 為 37,以符合安全儲存外掛要求。
最後的一般進入點 APK 在整合測試後重新建置、安裝,並透過 Android 介面自動化測試。下列檢查通過:使用實際安全儲存外掛啟動、密碼初始化、建立資料庫與記憶、讀取該記憶、內容開啟時切換至背景、返回鎖定畫面,以及解鎖後再次讀取持久化內容。這會檢查一般應用程式,而不只整合測試進入點。介面證據儲存於 target/android-ui-startup.xml、target/android-ui-initialized.xml、target/android-ui-memory-saved.xml、target/android-ui-content-open.xml、target/android-ui-background-locked.xml 與 target/android-ui-unlocked-persisted-content.xml。僅使用合成測試資料。驗證後停止唯讀模擬器。
基準 APK:mobile/build/app/outputs/flutter-apk/app-debug.apk,177,630,089 位元組。
SHA-256:1d671906316c139eca786e89a5cca2c5d7895a825c0d58f4c32e71e6ff8be382。
這是除錯簽署的開發 APK,並非商店發行版。
arm64-v8a 與 x86_64 均包含 Flutter 引擎與 Rust FFI 程式庫。來源 JNI 程式庫與 Gradle 合併程式庫相符;Gradle 移除符號的程式庫與最終 APK 內容相符。符號移除解釋了為何直接比較來源與 APK 雜湊會有差異。已封裝 Rust 程式庫 SHA-256 值:
| ABI | SHA-256 |
|---|---|
arm64-v8a |
6475026924b2e0434b1bbb945b21f9fa1684c53760ba228a72e062e519835d8c |
x86_64 |
3a208026380c0cc164f1f80c25de6daad3120857c4f2c9e96bf34e91912e9c1e |
Windows 除錯建置快取移至 D:/memories-build-cache/20260908/windows-debug,以釋放磁碟空間供模擬器驗證。來源檔案與發行產物仍保留在工作副本。Android 建置使用任務專用的 target/gradle-home,避開主機過時的代理設定,並使用本機儲存庫,包含已對照官方 HTTPS 中繼資料驗證的精確 Flutter 引擎 JAR。未修改任何引擎程式碼或外掛快取來源。此 Gradle 主目錄中的 caches、wrapper 與 jdks 目錄是指向主機 Gradle 快取的 junction。
平台與剩餘驗證
- 此 Windows 主機尚未執行 Linux 與 macOS 桌面執行環境檢查。Android 交叉編譯無法證明 Linux 或 macOS 執行環境正確性。
- iOS Xcode 編譯、模擬器/裝置執行、簽署、Keychain 行為與原生 XCTest 需要 macOS 主機,此處尚未執行。
- 尚未執行 Android ARM64 實體裝置測試;僅交叉編譯成功無法證明硬體行為或安全儲存保證。
- CI 定義 Windows/Linux/macOS Rust 檢查與 Flutter 檢查,但不宣稱任何遠端 CI 結果。尚未進行發行簽署或商店發布。
- 尚未進行獨立密碼學審查、滲透測試或大規模資源測試。使用真實機密前請參閱
SECURITY.md。
用戶端預設值與技能產生 (2026-10-01)
memories default set/get/delete在可拋棄--home下完成往返,拒絕未知鍵與無效type值,並在空白時移除defaults.json。- 未指定旗標時,清單命令套用
vault/type/category預設值。 - Persona world/thing/event 命令從
persona/vault預設值解析省略的保存庫/資產(VAULT/ASSET、斜線形式,或搭配保存庫預設值的資產)。 memories skill generate/agents generate在沒有 persona 時離線寫入 AGENTS.md 或技能配置的SKILL.md;沒有--force時拒絕覆寫。cargo test --workspace --locked涵蓋這些路徑的單元與整合測試。