Files
qinglong/docs/adr/ADR-0517-strong-local-console-task-authoring-lease.md
T

6.6 KiB
Raw Blame History

ADR-0517:强认证 Local Console Task authoring lease

  • 状态:Accepted
  • 日期:2026-08-29
  • 对应 RFC 切片:D-422
  • 关联:ADR-0256、ADR-0377、ADR-0512、ADR-0516

背景

ADR-0516 已让 Local Console 以 request-scoped credential fence 和本机一次性 proof 创建 Task,但 bounded Task read 有意隐藏完整 spec。直接用该投影编辑会静默删除环境变量、Secret bundle、工作目录或未来 schema 字段;把完整定义放进普通 Bearer read 又会扩大单因子凭据的读取能力。HTTP update 虽已存在,也必须防止调用方拿旧快照或其他 credential 读取的内容发起修改。

本切片要补齐可实际试用的 Web update,同时保持低配路由设备无后台成本、默认 headless 零增量、Cluster authority 独立。

决策

1. 完整定义只通过强认证 authoring read 交付

Local API 新增固定路由:

POST /api/v3/projects/:projectId/tasks/:taskId/authoring

请求无 body。Bearer 必须解析为 User credential,并先通过 task.update Policy。第一次请求只发布 ADR-0516 的 owner-private POSIX presence challenge;验证 proof 前不读取或返回完整定义。proof 验证后形成短生命周期 local_console principal,服务同时重新授权 task.readtask.update,并要求两项决定的 Project/RoleBinding fence 完全一致。

读取后再次确认 exact credential authority,再记录独立的 durable task.authoring.read allowed audit。不存在与跨 Project 继续按既有边界收敛;任何 Policy、credential、SQLite 或 audit 不可用均失败关闭。

2. 返回一次性、内容绑定的编辑租约

成功响应返回完整 TaskDefinitionRecord,以及 10 分钟内有效的不透明 authoring lease。服务只保存 lease presentation 的 SHA-256,不保存明文;绑定包含:

  • Project ID、Task ID、revision 与 content digest
  • credential ID/version
  • User subject。

lease 只允许消费一次。Edge 最多 8 个,Standalone 最多 32 个;过期项在请求进入时惰性清理,关闭 Local API 时清零 digest。实现不增加数据库表、migration、连接池、timer、watcher、daemon 或网络 listener。

3. update 需要 authoring lease 与第二份内容 proof

PUT /api/v3/projects/:projectId/tasks/:taskId 的 create 继续不需要 authoring lease,并拒绝调用方夹带 lease。update 必须同时提交 exact lease。服务在发布保存 proof 前检查当前 revision/content/credential 仍与 lease 相同;调用方完成第二次本机 presence 后,再次读取当前定义并原子消费 lease,随后进入 ADR-0516 已有的 credential-fenced Task administration transaction。

authoring proof 证明“允许读取完整旧定义”,保存 proof 证明“操作者确认这份新内容”,两者不得复用。租约检查不能替代事务内 expectedRevision、Policy、credential、RoleBinding 与 audit fence;检查和写入之间的竞争仍由已有 CAS/事务 authority 拒绝。

4. Console 只修改它明确展示的字段

Console 对内建 command + qinglong/command@v1 + argv 提供“编辑任务”。Task ID 只读;名称、说明、file、逐行 args 与 enabled 可修改。保存时以强认证快照为基底,只替换这些可见字段,labels 与 config 中未展示的 environment、Secret bundle、working directory 及未来兼容字段原样保留。无法严格识别的 kind/schema 继续使用受信 CLI,不提供有损编辑器。

页面仍只把 credential、proof、完整快照与 lease 保存在当前内存,不使用 Cookie、Web Storage、URL、日志或遥测。刷新、断开、关闭编辑器或取消 presence 会丢弃内存状态。

5. 部署档位保持分层

  • 默认 Edge/Standalone headless 不加载 Local API、Console 或 lease manager
  • opt-in Edge Console 的 8 项上限避免低内存设备被长会话拖住;Standalone 为 32
  • Cluster 不接受 Local POSIX proof 或内存 lease。多节点 Task authoring 必须由 Cluster Control 的 TLS、RBAC、共享持久 authority 与独立管理面设计完成。

不采用的方案

  • 不扩大 bounded Task read:普通列表/详情不应泄漏完整执行配置。
  • 不让 Bearer 单独取得完整定义:这会把 strong User 降级为浏览器持有单因子 secret。
  • 不只用 lease 直接写:读取授权不等于确认新内容,保存仍需要第二份 exact proof。
  • 不让 Console 重新构造整个 command config:未展示字段会被静默删除。
  • 不建立持久 Web session、轮询或 lease 清理 timer:当前显式操作与惰性清理足够,低配设备不承担常驻成本。
  • 不抽象成 Local/Cluster 共用插件:单机 POSIX owner 与多节点身份、审批、HA 不是同一种 authority。

结果与验证边界

定向验证覆盖完整定义只在 proof 后返回、两次 credential confirm、read/update Policy fence 一致、durable audit、lease 的 credential/revision/content 绑定、一次性消费、过期与 Edge 容量;PUT 覆盖缺失/过期/漂移 lease 在生成保存 proof 前拒绝,以及 proof 后再检查并消费。真实 SQLite/loopback 旅程覆盖 authoring challenge → 完整 spec/labels → lease → 保存 challenge → revision 2 → bounded read 不泄漏 spec → 新 revision/content fence 启动。

本地 Local API 为 64/6418-package clean build/test 为 3,038 total / 3,016 pass / 22 conditional、platform 或 external-service skip / 0 fail。package boundary 保持 18 packages 且无 single-source/shallow packageCluster dependency 与 122-module Edge import audit 均 compatible。默认 Edge 为 2,737,205 bytes/329 files/58 modulesopt-in Edge/Standalone Console 为 4,077,890/4,078,034 bytes、473 files、12 packages、95 modulesRSS delta 16,269,312/16,318,464 bytes,均低于既有门。三资产合计 69,723 bytes。真实 Chromium 已完成双 proof 更新到 revision 2,并以 409 模拟断言验证未展示 config/labels 与 lease header 不得丢失;390×844 无横向溢出。

本 ADR 已由提交 f28bf74d1bd29e9b8a8727915de19509f4bda9cf 的远端主 CI 33236204273、Kubernetes deployment 33236204254 与显式 Local Console milestone 33237026187 闭合。新 run 生成独立的 amd64/arm64 Console Trial Kit 与 milestone index;下载索引通过 SHA256SUMS 和仓库离线 auditor,返回 compatible=true。因此 D-422 已升级为新的可下载阶段产物;D-421 archive 仅保留为不含 Web 编辑能力的历史实物,没有被改名复用。该结论不把 Alpha 扩大为公开 release、2.x 生产升级或长期支持版本。