Repository navigation
fix(control-plane): reuse canonical digest validators - #6382
Conversation
Signed-off-by: huangruiteng <huangrt01@163.com>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; runtime_reported; reasoning_effort=xhigh
Exact head: 24932a36813e50d4c4a68ffdbfff9e764ce099ea
动机
Goal amendment 原提案回读、native Turn capture 绑定、Explore review 规范化都需要同一个 SHA-256 格式定义。原基线 4f593d26cd0b3b85a082a91d180fea7ab79460fd 的 owner 检查实际失败,列出的正是这三个重复 matcher。复用已存在的 content_digest.ts 能让下一次格式维护只改一个 owner,同时保留三个入口各自的类型检查、null、错误和写入边界。这里交付的是内部规则归属修复,无新增配置或用户操作。
原基线的 owner 检查实际失败,复用已存在的 content_digest.ts,三个入口各自的类型检查、null、错误和写入边界保留。
新头部71通过、0失败、0跳过;56条完整生产观察base/head完全相同;真实PostgreSQL store349通过。
本评审不授予合并、安装、Goal promotion 或新的工具权限。
完整 hosted CI、安装后的 App/CLI、模型理解未测。
改动思路
沿原 owner 的 BARE_SHA256_PATTERN / ENVELOPED_SHA256_PATTERN 替换三个本地正则,既有格式、协议和存储规则不变。完整 7文件 +30/-3;consumer inventory 只增加三个真实调用者,scanner、例外和原断言均不放宽。规范依据是变更前基线的 content_digest.ts 与完整 content_digest_single_owner.test.ts,不以作者新增文案代替规范。
具体改动
关键代码讲解
readIntent校验已存 proposal 的base_work_digest:先检查完整 proposal 的 hash、Goal、actor、revision,再检查 bare digest;拒绝后不会改变 authority head。bindTurnDecisionCapture使用 enveloped matcher。Goal/Agent、原 observation hash、Turn identity、journal identity 都仍独立核对;绑定只生成引用,不制造 admission 或 quota receipt。normalizeStrideDecision使用 bare matcher,仍把明确的null与缺失、错类型区分开;既有 off-mode、历史读 codec 与启用策略义务保持原顺序。- 新负例覆盖大写、63/65长度、非hex、错误前缀,并对已存 proposal 重新生成合法外层 hash,确保实际检查内层语义,而非仅拒绝坏外层 hash。
正向路径:原有效 proposal 经实际 File/SQLite provider 回读;合法 Turn key 经生产 dispatcher 绑定,重复绑定内容一致、原签名不变;合法 Explore revision/null 经实际 vision dispatcher 保留。反向路径:错误输入在原 owner 边界拒绝,authority head 回读保持完全不变,foreign Goal/Agent 不取得新权限。
对主干的风险
独立执行的同一 server-backed affected suite:基线 69通过/1预期owner失败,新头部 71通过、0失败、0跳过;其中 owner 17通过。真实隔离 PostgreSQL 16.15 的完整 authority-store 349通过、0跳过,自有服务器已移除。Node 24.21.0,两 checkout 的真实 File/SQLite/PG 来源分别记录,未使用 active Goal 数据。
另外运行 56条完整生产 dispatcher/provider 观察:base/head 的完整结果与错误逐项相同,不用排序或删字段掩盖差异。仅在可丢弃源码副本把 canonical matcher 放宽,三个实际入口都检出变化;恢复后的正式 checkout 没有改动。初版私有 corpus 错把合法 prefixed Turn key 当负例,base/head 同时拒绝该预期;已纠正测试输入归类并保留初始诊断,不作为产品失败。
npm run typecheck:control-plane、diff hygiene 通过;开发 advisory 先于完整 semantic/risk canary,3 direct/16 selected 全过,无 advisory failure。无新状态 vocabulary、substring denylist、actor lifecycle、default行为或 guidance/机器义务更改。Stride off 的实际 prepare/qualify 与三 shared surfaces 的同输入 readback 配对一致。UI/Lark/CLI 没有新增发现或操作旅程,首屏没有改动;此内部格式复用不要求另加 UI 开关。未查询、等待CI;完整 hosted CI、安装后的 App/CLI、模型理解未测。source受控结果不等于部署证明。
验证与归属依据:tests/control_plane_ts/content_digest_single_owner.test.ts at 4f593d26cd0b3b85a082a91d180fea7ab79460fd。digest-single-owner implemented;digest-boundary-parity implemented。
Goal amendment 原提案回读、native Turn capture 绑定、Explore review 规范化
原基线的 owner 检查实际失败,复用已存在的 content_digest.ts,三个入口各自的类型检查、null、错误和写入边界保留。
新头部71通过、0失败、0跳过;56条完整生产观察base/head完全相同;真实PostgreSQL store349通过。
本评审不授予合并、安装、Goal promotion 或新的工具权限。
完整 hosted CI、安装后的 App/CLI、模型理解未测。
复用已存在的 TypeScript 格式 owner,三个直接 import 是最小完整改动。
本批交付三个既有消费者的格式规则归属修复,无新增配置或用户操作。
我的整体评价
复用已存在的 TypeScript 格式 owner,三个直接 import 是最小完整改动。
本批交付三个既有消费者的格式规则归属修复,无新增配置或用户操作。
APPROVE。三个既有通用规则归并到 established typed owner,真实入口、负例、no-effect回读与实际 PostgreSQL 覆盖支持这个完整有界结果。近邻重构已在本批应用,无需另建 matcher层、协议或迁移。保留现有非格式 replan/GitOID matcher 的独立语义;本评审不授予合并、安装、Goal promotion 或新的工具权限。
English verdict: APPROVE — 24932a3. The three existing consumers now reuse the established digest owner with identical accepted inputs, errors and effects. Independent real File/SQLite/PostgreSQL qualification passes71 affected and349 store cases; complete56 base/head observations match, and a permissive-owner mutation is detected by all three production paths. Installed/hosted CI remains unverified; no merge authority is granted.
|
This pull request has merge conflicts with Choose the remote for the base repository, not an out-of-date fork. git fetch upstream
git rebase upstream/main
# Resolve each conflict, git add the resolved files, then git rebase --continue.
git push --force-with-lease origin HEADFor a same-repository clone whose Keep the DCO |
…r-digest-owner Keep main's conditional result_pages field rule and this branch's reuse of the canonical BARE_SHA256_PATTERN owner. Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
fix(control-plane): 复用权威 digest 校验器(自修复后复审)
复审对象为冲突解决后的最新 head,commit_id 精确对齐本次推送的 merge 提交
f34d56a20dc1153b76aa61add8de988a3f746544。此前该 PR 与主干冲突且落后 14 个提交,
本次由我完成冲突解决并重新取证,不改变原作者意图。
动机
控制面里 SHA-256 摘要的判定散落在多个模块,各自就地手写正则;一旦标准变化(大小写、
带前缀的 sha256: 形式、长度边界),这些副本会相互漂移,出现同一份凭证在某处通过、
在别处被拒的风险。本 PR 把这三处就地正则替换为既有的权威校验器,让 digest 的口径只
有一个所有者,降低后续契约漂移的概率。
改动思路
复用 loopx/control_plane/content_digest.ts 已经导出的 BARE_SHA256_PATTERN 与
ENVELOPED_SHA256_PATTERN,删除三处就地重写的等价正则,同时把这几个模块登记进
“唯一所有者”测试的权威消费者清单,让守护测试持续约束它们。冲突解决的原则是:主干上
新增的行为规则必须保留,分支上“收敛到权威校验器”的意图也必须保留——两者并不互斥,
因此合并时同时保留。判定语义保持严格等价,只把匹配器的归属从本地副本换成权威定义。
具体改动
goals/goal_amendment_authority.ts 中持久化 proposal 的 base_work_digest 校验、
work_items/stride_policy.ts 中 explore_review.revision 校验,都改用
BARE_SHA256_PATTERN(/^[0-9a-f]{64}$/);quota/turn_envelope.ts 中 turn_key
校验改用 ENVELOPED_SHA256_PATTERN(/^sha256:[0-9a-f]{64}$/)。逐一核对字符类与
锚点后确认,新旧正则在大小写、长度、sha256: 前缀三方面完全等价,故接受输入集合、
仅小写放行、null 表示“不可用”的特殊分支、抛错文本和“先校验后写入(写前失败)”的
次序都未改变。stride_policy.ts 的冲突点在于:主干为 explore_review 增加了条件字段
result_pages(非历史态才要求),分支把本地正则改为权威校验器;解决时保留主干的
条件字段列表 [...(!historical ? ["result_pages"] : [])],同时把该行正则替换为
BARE_SHA256_PATTERN,两侧意图兼得。测试侧同步扩充:content_digest_single_owner
把三个模块加入权威消费者清单;三份用例分别补上 A×64、a×63、a×65、g×64、
sha256: 前缀等边界拒绝,以及“仅小写摘要与 null 各自区分保留”的接受断言。仍在
使用就地正则的 replan-、GitOID 等非 digest 匹配器保持不动,避免扩大改动面。
对主干的风险
风险面较窄且以收敛为主:变更只影响 matcher 的归属,不改判定语义。经对照,新旧正则
等价,因此不会放宽或收紧任何被接受/拒绝的输入。潜在残余风险有两点:一是若后续
content_digest.ts 的权威正则被修改,这三处消费者会随之改变行为,但这正是“唯一所有者”
设计所期望的传播方式,守护测试会在清单层面提示;二是本次未验证已安装/托管的流水线,
仅在本机以真实测试与类型检查取证;同时主干上继承而来的红灯 lane 与本 PR 无关,需在
合并后继续跟踪,不能据此认定本改动引入了回归。合并权限保留在维护者手中,我以管理员
身份合并仅用于绕开依赖主干继承红灯的 merge-gate。
我的整体评价
这是一次边界清晰、可验证的收敛型修复:把分散的 digest 正则统一到权威所有者,并用
守护测试与边界用例把等价性固定下来。冲突解决同时保留了主干的 result_pages 条件规则
与分支的权威校验器复用,未牺牲任一侧意图。本机实际运行四份 TypeScript 用例得 70 项
通过、1 项跳过、0 项失败,typecheck:control-plane 干净,git diff --check 无空白
问题,语义漂移 smoke 与公开边界扫描均通过;仅托管流水线未经核对。综合判断可以合并,
残余项(继承红灯与托管 CI)已在风险一节明确标注。
English verdict: APPROVE
Goal And Delivered Outcome
The digest ownership guard fails on the unchanged baseline because Goal amendment proposal reads, native Turn capture binding and Explore review normalization each redeclare a whole-value SHA-256 matcher. These three production consumers now use the existing
content_digest.tsexports. Bare and prefixed shapes, lowercase-only acceptance, null handling, error messages and fail-before-write behavior are preserved.Outcome basis: reproduced baseline architecture failure, also observed in PR #6378. Intended base:
main; validation baseline4f593d26cd0b3b85a082a91d180fea7ab79460fd.Author Declaration
tests/control_plane_ts/content_digest_single_owner.test.tsat the validation baseline.Self-check: read all changed call sites and the full diff; confirmed the canonical patterns have the same accepted language and no stateful regex flags. Temporary permissive-pattern mutation makes all three entrypoint tests fail, then restoration passes. Latest fetched main and related PRs contain no competing three-consumer fix.
Scope And Continuation
Complete within this source scope. The related refactor consolidates existing format knowledge into its established owner; no new abstraction, schema, API option, authority rule or migration is introduced. Review, hosted CI and installation remain separate; this PR grants no merge authority.
Validation
24932a36813e50d4c4a68ffdbfff9e764ce099ea; the seven changed file fingerprints match the qualified precommit source.npm run -s test:postgresql-authority-store: 349 passes, zero failures/skips; disposable server stopped afterward.npm run -s typecheck:control-plane, diff checks and changed-lines public-boundary scan. No new semantic vocabulary.Focused command:
node --no-warnings --experimental-sqlite --experimental-strip-types --test tests/control_plane_ts/content_digest_single_owner.test.ts tests/control_plane_ts/goal_amendment_authority.test.ts tests/control_plane_ts/stride_policy.test.ts tests/control_plane_ts/turn_envelope.test.ts. Server-backed runs use the repository's disposable PostgreSQL test configuration.Frontend / Visual Evidence
UI impact: none. Existing validation only; frontend, Lark and CLI contracts retain their behavior. No first-screen change.
Type of Change / LoopX Area
Technical Direction
S2/S7 control-plane correctness, using the existing typed digest owner. No shared-authority migration, provider routing or promotion progress is claimed.
Boundary Checklist