{
  "version": "0.6.1",
  "notes": "简体中文\n\n本次补丁发布让桌面更新在安装前后都可核对：设置页保留历史更新，stable 更新源携带对应版本的更新日志，并用有界、脱敏的本地应用日志记录更新与路由失败。领证流程不再把 GitCode 授权问题一律报成网络或服务故障。\n\n### 新增\n\n- 设置页在「检查更新」旁新增「历史更新」，列出本构建包含的各版本并按 Markdown 渲染对应更新日志；GitHub 标志打开公开发布页。stable 更新源现在把每个版本的中英文更新日志作为 `notes` 发布；有可用更新时，会在安装前按当前界面语言展示该说明，并在确认对话框中再展示一次。没有附带说明的更新仍可安装，设置页会提示无法核对改动。\n- 桌面在 `mtls-router-logs/app.log` 写入有界、脱敏的应用事件日志（JSON Lines，达到 5 MiB 轮转为 `app.log.1`、`app.log.2`）。记录启动、退出、更新检查与安装失败、路由启停、设置变更和桌面命令失败；字段为封闭白名单，绝不包含 API key、token、私钥、证书、请求或响应正文以及文件内容，也不会上传。日志页可展示这些事件，并按组件与级别筛选；「导出日志包」会包含该文件。\n\n### 修复\n\n- GitCode 领证现在区分真实原因：缺少 `all_user`/`read_groups` scope 或授权过期时要求重新授权；已确认非组织成员时返回 `ORG_MEMBERSHIP_REQUIRED`；服务不可达时返回 `IDENTITY_NETWORK_UNAVAILABLE`；供应商故障或未确认的成员查询返回 `CERT_SERVICE_UNAVAILABLE`，提示为服务端问题。只有明确的非活跃成员身份才会撤销设备；`invalid_client`/`unauthorized_client` 等应用凭据故障保持服务错误，不再引导用户重新授权；提示也不再写死默认组织名。\n- 日志页保持安装证据可见：身份状态仅在阶段变化时记录；来源或组件切换后忽略迟到的响应；延迟退出前先持久化 `update.succeeded`。\n- 桌面并行测试不再共用进程级应用日志 sink 与 simplify 默认值，更新与模型目录测试结果稳定。\n\nEnglish\n\nThis patch release makes desktop updates auditable before and after install. Settings keeps a bundled release history and the stable update feed now carries each version's changelog, while a bounded local application log records update and router failures for support. Enrollment now separates GitCode authorization problems from service outages instead of reporting every failure as a network or server problem.\n\n### Added\n\n- Settings adds **Release history** beside Check for updates. It lists every version bundled with this build and renders that changelog as Markdown; a GitHub mark opens the public releases page. The stable update feed now publishes each version's bilingual changelog as `notes`, and an available update shows those notes in the selected language before install and again in the confirmation dialog. An update without notes can still be installed, and Settings says the changes could not be reviewed.\n- The desktop writes a bounded, redacted application event log at `mtls-router-logs/app.log` (JSON Lines, rotated at 5 MiB to `app.log.1` and `app.log.2`). It records startup, quit, update checks and install failures, router start and stop, settings changes, and failed desktop commands; fields are a closed allowlist and never include API keys, tokens, private keys, certificates, request or response bodies, or file contents. Nothing is uploaded. The Logs page shows these events and filters them by component and level, and **Export support bundle** includes them.\n\n### Fixed\n\n- GitCode enrollment reports the actual failure: a missing `all_user`/`read_groups` scope or expired authorization asks for reauthorization, a confirmed non-member account reports `ORG_MEMBERSHIP_REQUIRED`, an unreachable service reports `IDENTITY_NETWORK_UNAVAILABLE`, and a provider outage or unconfirmed membership lookup reports `CERT_SERVICE_UNAVAILABLE` as a server problem. Only an explicit inactive membership revokes the device, invalid or unauthorized enroll-app credentials stay a service error instead of sending the user through reauthorization, and the message no longer names the default organization.\n- The Logs page keeps install evidence visible: identity status is recorded only when its phase changes, a late response is ignored after the source or component changes, and `update.succeeded` is persisted before the deferred quit.\n- Parallel desktop test runs no longer share the process-wide application-log sink or the process-wide simplify default, so updater and model-catalog tests are deterministic.\n",
  "pub_date": "2026-10-27T00:00:00Z",
  "platforms": {
    "linux-x86_64": {
      "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVURTgxRUhWbS9zb0Y0V3QzRnZVZlM4a0NpTysrbzdRSGZWWCtwSkZmZXowaDh5ZzM4L09qb2c0R2VKbGhvZUJKNDJwcHZjODc4K1NJempiZ1ZWc1BFZnJxUzdKUTNFUWdzPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkzMDMzOTIyCWZpbGU6Q29kZWFzaWVyUm91dGVyXzAuNi4xX2FtZDY0LkFwcEltYWdlCk5nQVpLdFBXT213ckhtbXNBcGVQaldrSTJxbUt4SUhYYldTZGpUb3llclJZck9naGtaWVVMYURHclhtcXkxN3hDL294RnVFU0d6ckpzU0hHQk1JN0J3PT0K",
      "url": "https://release.codeasier.top/mtls-router/v0.6.1/CodeasierRouter-linux-amd64.AppImage"
    },
    "linux-aarch64": {
      "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVURTgxRUhWbS9zb0pTRnFQM3huVmsxV2pPMjNtQjNyNWJWRE1uSk5xQng3QVM0c1JlUU9iTDhrNDBzbFk5VmlEN1MxaDZ0OTNIaW90dXVka2lGcmF6MTVTdDF1ZEo5QWd3PQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkzMDMzOTI1CWZpbGU6Q29kZWFzaWVyUm91dGVyXzAuNi4xX2FhcmNoNjQuQXBwSW1hZ2UKWWdsS0FHRk5zSmp1ci9hdVZNOFJobHNBWHJlNkk5NDZSdDBSb0tGcnZTK2xvdlNSOTBTalVmdzA5SVNvenRGRVhLYm42Ymp0RVd2bkVER20yZzJmQUE9PQo=",
      "url": "https://release.codeasier.top/mtls-router/v0.6.1/CodeasierRouter-linux-arm64.AppImage"
    },
    "windows-x86_64": {
      "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVURTgxRUhWbS9zb0EyTWtSa3kra2pCMTY3WFlIQUJzYTB1elJFcCs4aiszNHZGRTRZZENkeDdkeDJ1VThKU1duVFlFaHRTd3ozTUFTNjdDblJtSzBKYnFHdVc2Y2ltamdrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkzMDM0MTE5CWZpbGU6Q29kZWFzaWVyUm91dGVyXzAuNi4xX3g2NC1zZXR1cC5leGUKWjRmQXIzcGF0NVplQXg1U1U5WnBsTHBWT0hSbTJlbXJ3RkhKV1ZBeEtMQXJmQVJyS282bUxKU0dCK1V2WDZSMXZMdjNJTTk5aE9iSktoTWF3YmcrQlE9PQo=",
      "url": "https://release.codeasier.top/mtls-router/v0.6.1/CodeasierRouter-windows-amd64.exe"
    },
    "darwin-x86_64": {
      "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVURTgxRUhWbS9zb05OOWFUaDVKUWNjYWE3Tzc0aDBqWG9DQVFFbjA3ZmhjUnRITnhGYzJGbi9iencvb2dzM2ljU1pIM1kzZ1d5RFdlckRlTkQ3OW4yVWhqSlFrdWI2endvPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkzMDM0NzcxCWZpbGU6Q29kZWFzaWVyUm91dGVyLmFwcC50YXIuZ3oKSXZ6NndJNjJqT3NtczZBSU1hdHRXNVdaNlByTlhGV05qRzNHTTNjSFk4d0xmdjI1SXl5SmJlcFpJK3JxZTVpTE1RR2tMUEdFRWlpb09WcG4vMlNGQWc9PQo=",
      "url": "https://release.codeasier.top/mtls-router/v0.6.1/CodeasierRouter-darwin-amd64.app.tar.gz"
    },
    "darwin-aarch64": {
      "signature": "dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVURTgxRUhWbS9zb09YYXBYQTJ5ZzhXalFpOUZlenlzejYybEZnaUdPVm5UdWVzWFhNbDlnanQxbjB6THdJakxYWUc0bjlPaWZEbklkOWZ5REQyQzZEd3NTRnN1SzBXVFFrPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzkzMDM0NTI3CWZpbGU6Q29kZWFzaWVyUm91dGVyLmFwcC50YXIuZ3oKTU1OaEdpUXJlNlNwOWJFWjVPSE8xU0pFTzJtMFFKVHp3U3RyM1NqY2ZQQ1JoU283QjhhWFl0K0lYR1pMOStxVUpxSGNjZmJDd25kR21mbXZ2OVVTRFE9PQo=",
      "url": "https://release.codeasier.top/mtls-router/v0.6.1/CodeasierRouter-darwin-arm64.app.tar.gz"
    }
  }
}
