Memories / 文档

本页目录

验证记录

本地开发构建。各节注明结果日期;较早的产物哈希仅适用于与其一同记录的构建。 命令示例采用当前项目名称;历史产物哈希并不代表更名后的二进制文件。 这些结果描述实际执行过的检查;CI 配置不能证明远程 CI 已成功运行,也不代表独立安全审计。

SaaS 账户与可配置注册(2026-10-14)

版本 20261014-83aca4d86199 已部署到 ldny。Linux 二进制文件 SHA-256: 83aca4d86199718587da2fe812471bffb6ea7aefd499c52ed53e6566a7dd4c73。 账户界面部署: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 上通过。Linux memories-center 发布构建使用锁定的依赖图通过构建,并在下文所述与生产兼容的 Ubuntu 容器中完成测试。
  • Center 测试:79 项通过,包括七项账户/配置测试,覆盖用户名注册、规范化身份、邮箱验证/过期/重复使用、SMTP 传输失败、向回环 SMTP 测试装置实际投递、密码哈希、有界的认证工作量/请求、跨账户读写拒绝、管理员修改/删除、退出登录、重启持久化以及失败时关闭访问的成员写入。
  • Web 客户端与 API 代理 Node 测试:13 项通过。文档生成验证了 32 个 HTML 页面中的本地链接和锚点。
  • 真实 Chromium 对隔离的 Center 完成注册/登录并创建记忆。邮箱表单转换使用模拟 API 响应检查;这些浏览器检查没有发送邮件。后端邮件投递通过本地 SMTP 测试装置单独检查,未使用外部服务商。
  • 与生产完全相同的镜像通过了隔离 ldny 容器中的金丝雀测试,覆盖两个账户、独立保险库、跨账户拒绝、退出登录、重启持久化以及关闭注册时的登录。金丝雀容器及其合成数据已删除。该测试未使用生产数据。
  • 生产重启后,通过公共域名确认原有所有者的保险库身份与成员令牌得以保留。现有 PostgreSQL 容器和 cloudflared 服务持续运行。内嵌 /app/ 资源与公共 Pages 资源一致。公共桌面/移动页面无浏览器控制台错误,在 390px 下无横向溢出。
  • 生产环境在 /etc/memories-center/auth.toml 中选择邮箱模式。2026-10-14 配置了腾讯企业邮箱 SMTP,使用端口 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 运行器必须提供可用且已解锁的用户钥匙串,允许无界面创建/读取/删除。 未添加钥匙串解锁、认证界面、ACL 弱化、全局钥匙串更改或密码注入。 钥匙串缺失或锁定会导致失败,而非静默跳过或回退。若原生删除失败,测试失败,其合成条目可能留在临时运行器中。 较早的格式/lint/测试失败可能阻止执行到这些步骤。

这些步骤配置用于未来的 push/pull-request CI 运行,并非已执行的原生证据。 没有触发工作流,也没有在本地运行 Windows 或 macOS 原生测试:该实现环境为 Linux,未配置原生主机。 实际原生执行以及锁定/需要批准时的无界面验证仍是发布门槛;仅接入 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 与安全指纹保持不变。
  • 格式、带 -D warnings 的工作区/全部目标 Clippy、优化构建以及不启用可选原生嵌入功能的核心构建通过。现有依赖未来兼容性警告与原生链接器提示仍存在。
  • 未调用真实客户 Gemini/生成/重排服务;协议验证使用合成 HTTP 测试装置。此处未执行 macOS/Linux 运行时或移动原生构建。移动 FFI 提供词法检索,但拒绝模型支持的操作。未修改 Flutter 界面。

模型修订:onnx-community/embeddinggemma-300m-ONNX 的 5090578d9565bb06545b4552f76e6bc2c93e4a66。 日志为 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 回归也针对最终源码单独通过(两项桌面集成测试)。
  • 格式、带 -D warnings 的工作区/全部目标 Clippy 和优化工作区构建在 Rust 1.98.1 MSVC 上通过。现有依赖未来兼容性警告与 FFI 链接器提示仍存在。
  • 回归覆盖能力/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、带 -D warnings 的工作区/全部目标 Clippy 和 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 格式、带 -D warnings 的工作区/全部目标 Clippy 和 cargo build --workspace --release --locked 通过。现有依赖未来兼容性提示仍存在。
  • Flutter 分析、Dart 格式以及全部 36 项 Flutter 测试通过。
  • 发布 CLI 版本/密码学帮助、relay 帮助以及使用临时数据库的真实发布 DLL 冒烟测试(初始化、锁定、解锁、全部锁定、关闭)通过。
  • GitHub 报告账户付款或消费限额限制,GitHub Actions 无法启动。这些是本地结果,并非远程 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 manifest;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 与临时密钥环。使用 crates/cli/tests/crypto_jobs.rs 中列出的 MEMORIES_TEST_* 工具路径,以及 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、带 -D warnings 的工作区/全部目标 Clippy、Rust 格式、diff 空白以及更新后技能的 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 集成测试)。覆盖用户/项目目录、配置覆盖、重复目标、共享覆盖路径、dry-run、幂等性、显式替换、冲突预检、无效输入、同级文件保留以及五语言帮助。测试使用临时目录,不启动守护进程或初始化 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 格式与 diff 空白检查通过。更新后的 CLI、IPC 和 FFI 路径在最终更改后也通过针对性运行检查。
  • 四项核心功能回归通过:精确替换、安全投影、本地提权/MCP 隔离、元数据拒绝(包括转义文本)、受保护卡片复制、二进制/NUL 拒绝、同步、持久化与独立备份恢复。另一项针对性运行验证:凭据准备完成后,若替换使文档超出正文大小限制,则进行原子回滚。已签名历史内容有意保持不变。
  • 真实 CLI/守护进程 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 项通过,八项子进程辅助工具有意忽略。持久化测试对临时 home 启动独立 CLI 进程,验证保存/替换偏好、启动与帮助选择、按 home 隔离、临时覆盖、清除设置、格式错误的设置以及写入失败清理。
  • Flutter 测试:31 项通过。新回归验证实时系统语言区域变更会更新界面与字体回退,而不写入偏好。已保存选择保持固定;重置为系统默认在重启后仍有效。
  • Flutter 分析、带 -D warnings 的工作区/全部目标 Clippy、Rust/Dart 格式以及 diff 空白检查通过。未测试原生设备。
  • 日志: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 更改的 CLI 本地化测试也通过。
  • Flutter widget/单元测试:29 项通过,包括五种系统语言、英文回退、语言选择持久化、保留已解锁会话、手机宽度对话框、复数计数和受保护预览脱敏。
  • Flutter 分析、Rust/Dart 格式、带 -D warnings 的工作区/全部目标 Clippy 和 diff 空白检查通过。现有 Rust 依赖未来兼容性提示仍存在。
  • 使用实际二进制文件测试了 CLI 帮助、嵌套帮助、语言区域优先级和本地化非交互错误。JSON 字段和错误码保持稳定。widget 截图以 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 上显式将已接受 socket 置为阻塞模式;否则它们可能继承监听器的非阻塞模式,在请求字节到达前重置连接。 内存测试装置在模拟不完整发布时,现在同时从列表和直接下载中隐藏对象。

本次后续改进未使用真实云账户或 Android/iOS 原生设备。下文记录的平台与发布验收限制仍适用。

可靠性与移动云功能后续改进(2026-09-17)

主机:Windows x86_64,Rust 1.98.1 MSVC,Flutter 3.44.2 / Dart 3.12.2。 全程使用合成秘密与临时数据库。

  • Rust 工作区测试通过,包括真实守护进程的停滞客户端/锁定回归。针对性测试还验证了云 HTTP 请求阻塞时仍允许锁定、拒绝同一服务商并发运行,以及迟到确认不能恢复已失效会话。
  • 云回归覆盖正常 OneDrive 下载重定向且不转发 Bearer 令牌、重定向循环/不安全目标、按服务商入队与重连、超过旧 256/4096 限制的已完成队列压缩,以及暂时缺失对象在退避后重试。已撤销接收者不再阻止为活动设备准备数据,也不再使保险库永久处于待同步状态。HTTP 测试装置现在持续运行直至所有者停止,而非 30 秒后过期。
  • Windows FFI 测试验证繁忙与空闲句柄上的待处理后台锁定,以及通过原生云工作线程分派。原生 OAuth 验证在网络 I/O 前拒绝不安全回调和格式错误的 PKCE。
  • Rust 格式和带 -D warnings 的工作区/全部目标 Clippy 通过。现有 russh/proc-macro-error2 未来兼容性提示仍存在。
  • Flutter 分析及全部 16 项 widget 测试通过,包括账户状态和同步请求进行期间手动锁定。Rust 访问/刷新令牌从不返回 Dart;AppAuth 提供授权码/验证器。
  • 发布版存储基准使用 10、100 和 1000 条合成记录运行。结果与指标定义见性能。审计追加不再为每个先前条目重复派生相同设备公钥。
  • 在本地检查工作流 YAML、内嵌签名配置 Python、Unicode Java 属性转义、Markdown 链接/围栏和 diff 空白。

尝试安装 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/守护进程/FFI 冒烟检查:原生初始化/写入/备份、守护进程解锁/读取、MEMORIES_HOME 选择、CLI 读取与锁定/解锁、原生备份恢复,以及 memories_lock_all 导出锁定活动原生句柄。
  • Dart 格式与 flutter analyze:通过。Flutter widget 测试:14 项通过。首次 widget 运行因主机 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/守护进程针对 Ubuntu 22.04 WSL 中的临时 OpenSSH 8.9p1、PostgreSQL 14.24、MySQL 8.0.46 和 Redis 6.0.16 服务器执行测试。 服务器软件包解压至私有临时目录,使用独立数据、证书与合成账户;未安装系统服务。 测试守护进程使用临时 --home。随后停止全部测试服务器,删除其数据/私钥。

  • 工作区回归:88 项通过,十项子进程辅助工具有意忽略。命令:cargo test --workspace --locked -j 1 -- --test-threads=1。
  • 后续短 ID 修复通过全部九项远程测试和真实守护进程 IPC 场景。最终关闭修复通过四项代理测试、两项 IPC 场景,以及额外的立即停止/锁定回归,测试客户端没有关闭 sleep/join。这些针对性运行在完整工作区运行之后执行。
  • 最终带 -D warnings 的工作区/全部目标 Clippy、Rust 格式和 diff 空白检查通过。russh 与 proc-macro-error2 的现有依赖未来兼容性提示仍存在;未抑制任何 lint 错误。
  • cargo build --workspace --release --locked -j 2 通过。重建 CLI 的版本/帮助与 relay 帮助命令成功运行。未替换已安装守护进程和用户数据。
  • 使用 scripts/test-proxy-e2e.py 针对重建的发布二进制完成 11 项真实服务 E2E 检查。OpenSSH 和 SFTP 客户端、psycopg2、PyMySQL 与 redis-py 无需上游秘密即可连接守护进程创建的回环代理。

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,且没有云账户。

新增由守护进程持有的 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 适配器、守护进程 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/守护进程 IPC 的拒绝。
  • 延迟 HTTP profile 测试装置确认 OAuth 网络延迟不会延长访问令牌有效期。现有服务商交换和锁定/退出登录取消回归通过。relay WebSocket 测试现在包含 Ping/Pong;控制回复与排队数据使用相同十秒发送超时。未进行 socket 饱和持久压力测试。
  • 带 -D warnings 的工作区/全部目标 Clippy、Rust/Dart 格式、diff 空白以及本地 Markdown 链接/围栏检查通过。Flutter 分析报告无问题;全部 14 项 widget 测试通过。
  • 重建 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 格式以及 diff 空白检查通过。最终非阻塞浏览器启动调整后,再次运行 CLI 云测试、Clippy 以及全新 CLI/FFI 构建。
  • 两种 OAuth 服务商均使用本地 HTTP 测试装置测试:PKCE、state、账户身份、作用域检查、刷新令牌缺失、响应限制、拒绝重定向以及不反射秘密的通用错误。
  • 真实回环 socket 测试拒绝无关回调并接受匹配回调,不将其授权码反射至 HTTP 响应。
  • 核心回归检查调用者/服务商绑定、重放、锁定/退出登录取消、加密持久化、审计/MCP 隔离,以及解密后的备份和同步负载不含云令牌。
  • 使用合成令牌的临时 Windows FFI 测试装置通过关闭/重开后的授权持久化、memories_lock_all 取消以及退出登录检查。随后删除测试装置。
  • 未提供已注册客户端配置或真实云账户,因此真实 Microsoft/Google 同意与令牌签发仍未验证。未上传云文件。没有连接 Android 设备/模拟器;此次更改未验证 Android/iOS 原生执行与移动登录界面。
  • 已构建本地开发二进制文件;未替换已安装 CLI/守护进程二进制文件,不声称远程 CI 或发布结果。

推送前验证(2026-09-09)

  • Rust 工作区回归:30 项通过;两项 IPC 子进程辅助工具仍由父场景显式调用。包含短 ID 碰撞、历史、受保护引用与授权往返。
  • 带 -D warnings 的工作区/全部目标 Clippy 和 Rust 格式通过。短 ID 奇偶检查更新为 is_multiple_of;这一等价 lint 修正后,两项 ID 单元测试再次通过。
  • Dart 格式、Flutter 分析及全部 14 项 widget 测试通过。
  • 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 项 widget 测试通过,包括使用空密码和单字符密码初始化,同时保留确认步骤。
  • 重建 Windows CLI/FFI 并重启本地守护进程。单独的临时测试装置针对发布 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 项 widget 测试:通过。覆盖手机尺寸图谱、有向反向链接、脱敏预览、私有 OTP 授权、过期以及后台/锁定时关闭 OTP 对话框。
  • 重建 Windows 发布工作区。真实发布 CLI 使用临时加密存储,记录 Python 3.13.1 及其可执行目录,将保险库标记为仅本地,并通过卡片搜索找到该观察记录。检查后删除测试装置与守护进程。
  • 重建 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 守护进程测试覆盖解锁、终端 sudo、凭据读取拒绝、可执行文件摘要批准、子进程输出抑制、签名审计、MCP 作用域与锁定。 真实 WebSocket 测试检查实时路由以及断开连接后的房间清理。

Windows 命名管道实现使用阻塞分帧。尝试的 PIPE_NOWAIT 实现未通过真实守护进程回归,已被替换; 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 项 widget 测试通过
ARM64 与 x86_64 Android Rust FFI 发布构建 通过
Android API 35 x86_64 模拟器原生集成测试 通过
普通 Android APK 安装与界面冒烟流程 通过

widget 测试验证:原生启动失败时库保持锁定;进入后台会关闭内容对话框并清除授权状态;空闲过期也会关闭已经打开的内容对话框。 移动授权代次变更后,迟到异步响应被拒绝。 原生集成测试使用设备上的临时数据库,而非模拟后端。它初始化真实 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 home 中的 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 覆盖这些路径的单元和集成测试。