refactor(todos): isolate canonical lifecycle callers from the source writer - #5739
Conversation
Signed-off-by: LoopX Agent <[email protected]>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; effort=xhigh
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
维护退役路径的开发者在 canonical Goal 上运行 Todo CLI 时会遇到此问题。 一次性包中移除旧行写入模块后,基线 CLI 在分派前崩溃;此版本仍能完成创建、更新、结算和归档。 已验证 canonical 生命周期不再依赖旧模块的存在,provider 失效仍拒绝写入。 本 PR 不删除仍服务未迁移 Goal 的 writer,也不修改默认值、备份或回执格式。 完整旧 writer/capture 退役仍需对应调用方迁移及 outbox 处置。
改动思路
复用现有 Todo facade 和 provider-first 路由。canonical 指已选定 provider 的权威状态;创建与更新的提前返回、终态装饰器负责调用既有 TS 事务,并通过原回执和永久 Markdown 投影返回结果。旧源 writer 只承担未迁移路径的源 IO。这里移动四个实际旧路径的导入,并保留真实 facade 调用方的四个历史符号;不建立新 provider、决策 owner 或通用加载框架。仅删除顶层导入却不补旧调用方会破坏支持路径;直接删除整个 writer 也没有满足迁移条件。
具体改动
Head: 72108a08ab87e23f08f67644aa5c568f6753bf43。生产文件 29 增/6 删,95 行测试,文档 20 增/1 删;三类内容服务同一可独立验证的调用隔离边界。
关键代码讲解
loopx/todos.py:147的__getattr__只接受四个既有导出名,显式导入仍返回原函数对象,未知名抛出 AttributeError。它不是业务状态分类器,也不授予执行权限。loopx/todos.py:799的update_goal_todo保留 canonical 提前返回,以及不支持的 operation/lease 请求先拒绝的顺序;仅旧源分支加载apply_todo_update_to_lines。loopx/todos.py:1302的complete_goal_todo在原 provider-first 装饰器之后为旧主体加载更新及 successor 链接函数。add_todo_to_lines和supersede_goal_todo同样保持原实现和输入语义,只将各自实际使用的依赖放回调用主体。
测试通过真实子进程和真实 File/SQLite 初始化跨越 CLI 注册、写入、结算、归档与独立读取,物理移除旧模块,并验证历史导出身份。文档同步中英文边界,同时移除过时的 event adapter 表述。
规范:docs/architecture/rfcs/ledger/shared-goal-authority-state-provider-v0/2026-09-28-retirement-cadence.md,接受基线 cf1f686cc517e844a164ac0f45fda7132d9c82b2。Deletion proof 在本调用方边界落实:隔离包的物理缺失、真实生命周期及历史创建回执重试均执行。Writable Markdown Todo branches 的完整删除保持 deferred:未迁移调用方仍在,支持升级/outbox/备份义务继续由原退役计划承担;没有用新文档改写旧验收。
对主干的风险
没有发现阻塞项。最强反例是 canonical 模块缺失时仍启动失败,或局部导入破坏旧终态回调。前者在基线复现三项失败,后者通过现有源码 fixture、原 facade smoke 和安装包旧路径验证。26 项同输入基线/新版本的命令结果一致,四个完整错误/decision 投影只规范化一次性目录后相等;八个旧创建回执重试/变更意图拒绝保持 canonical 快照不变。回执重试可以补交当前投影,因此不能把 Markdown 字节变化误判为重复权威写入。
91 项聚焦测试通过,最终新增测试在归档/导出断言补齐后再次三项通过;ruff、配置内 mypy19、语义全树检查、预算 smoke、公开边界及原生 premerge19 均通过。初始 fixture 的参数/actor/结算说明和终态 note 假设错误、构建资产与开发依赖缺失、质量结果的证据引用错误均保留并修正;没有通过降低生产规则或测试要求放行。CI 按本 Goal 的评审契约未查询。未测完整 GUI/Lark、Windows、PostgreSQL 和 soak;这批没有修改这些 provider/store 或 UI 契约,亦不将独立 wheel 视为生产安装采用。
我的整体评价
APPROVE,判断为 justified_increment:long_horizon preserved,user_experience improved。已有生命周期与后续重试保持同一权威,新版本消除了无关模块导致的 CLI 启动耦合,没有增加用户输入或手动同步。改动量与可复现的调用依赖问题相称;四个导入名仍是本地既有兼容词汇,不新增共享协议。保留旧 writer 的真实调用和恢复价值,完整退役/默认采用继续开放。最小回滚是恢复导入布局,无需状态转换;按仓库规则,控制面 PR 交维护者合并。
English verdict: APPROVE - 72108a0; canonical Todo lifecycle no longer eagerly imports the source writer, while supported legacy calls and historic exports remain. Real File/SQLite absence, baseline/head negative/replay comparisons, focused tests and native premerge passed. Full writer retirement and production/default adoption remain outside this increment.
Signed-off-by: LoopX Agent <[email protected]>
Signed-off-by: LoopX Agent <[email protected]>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; effort=xhigh
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
维护退役路径的开发者在 canonical Goal 上运行 Todo CLI 时会遇到此问题。 一次性安装包移除旧行写入模块后,基线的新 Goal 创建在 CLI 分派前崩溃;此版本完成创建、后续 Todo 与原创建操作恢复。 已验证缺失旧模块时的 canonical 新 Goal 和 Todo 生命周期,以及显示丢失、默认值变化和 provider 失效后的安全恢复。 本 PR 不删除仍有调用方的 writer、备份或原回执读取,也不晋升生产默认值。 完整 writer/capture/outbox 退役、支持升级及生产默认采用保留原验收。
改动思路
canonical 是选定 provider 的权威状态。继续复用已有 typed 创建/更新/终态 owner,由原事务、回执与永久显示投影完成操作;Python 保留未迁移源 IO。四个实际源调用方各自加载旧依赖,窄兼容入口保留真实历史导出。直接删除旧 writer 会损失仍受支持的调用与恢复价值;仅删顶层导入则会破坏这些调用方。没有新增 provider、权限、配置、调度或决策 owner。
具体改动
Head: 47fdc42。全 PR 为生产代码29增/6删、测试163增、文档25增/1删。同上轮72108相比,生产导入隔离一致;本轮合入既有主干并为同一边界新增68行创建/恢复测试及双语说明。审查覆盖当前全PR,没有继承旧APPROVE。
关键代码讲解
- loopx/todos.py:147 的 getattr 仅接受四个历史符号,返回原函数对象;未知名抛 AttributeError。它是既有本地导出词汇,不是状态分类器或执行授权。
- loopx/todos.py:1038 的局部导入处于 canonical 提前返回及不支持意图拒绝之后。complete_goal_todo:1340、supersede_goal_todo:1667 处于现有 provider-first 装饰器的旧主体内;add_todo_to_lines:198 同样只在实际源调用时加载。
- 共用 fixture 物理删除一次性包里的 line_update.py,真实 File/SQLite CLI 跨越新Goal创建、后续Todo、原创建恢复与生命周期。显示缺失及设备默认变化后,恢复保留原provider/创建receipt和后来Todo/current revision;所选provider离线要求restore,恢复后仍读回同一状态。
规范:docs/architecture/rfcs/ledger/shared-goal-authority-state-provider-v0/2026-09-28-retirement-cadence.md,接受版本 a64fffb。Deletion proof 在本调用方隔离边界 implemented:物理缺失下运行真实新Goal、生命周期及恢复。Writable Markdown Todo branches 的完整删除仍 deferred:受支持旧调用方、备份/原回执与outbox退出尚未全部资格化,保留现有退役计划;没有重写正式验收来宣称完成。
对主干的风险
没有发现阻塞项。最强反例是只有已晋升Todo测试通过,新Goal仍不能启动,或原创建恢复覆盖后来工作。固定5ad83d19b278998708631649261241665adbdeb2基线的两项新Goal测试在CLI注册阶段因缺失module失败;当前源码137项和独立wheel5项通过,34次CLI均核验包来源。恢复比较完整Todos及当前authority revision,且显式验证原创建receipt;provider离线不重建源/backend。当前结果不是全输出字节等价或生产安装采用。
上轮cf1/72108的26组成对结果、10次旧终态及8次回执反例仅保留为注明来源的历史证据。当前生产隔离hunk相同,合入主干的相邻规则由当前137项覆盖;不把旧执行重标为当前head。当前历史导出身份测试、ruff、mypy19、语义全树、公开边界、资产/wheel构建和同固定base的预算检查通过。最终原生premerge19项全部通过、CQR匹配准确3文件范围。初次预算差分误读移动origin/main,固定既有base/main参数后原检查及整套premerge通过;没有修改预算、负载或生产规则,原失败保留。
初始测试路径和wheel fixture根错误、过期生成资产及错误验证base均已修正且保留失败记录。未测完整App/Lark、PostgreSQL、Windows、生产更新和持续soak;未改provider/store或UI交互契约。CI按managed策略未查询。这些限制不关闭完整writer/default验收。
我的整体评价
APPROVE;justified_increment,long_horizon preserved,user_experience improved。完整创建/恢复边界增加可独立复现的退役证据,运行仍由原typed owner维护身份、状态与回执,没有增加用户输入或同步。相关future-facing pass应用在实际导入与共享fixture,完整删除延后至真实最后调用方;不是并行决策源或新框架。最小回滚恢复导入布局,无需转换数据。控制面PR按仓库规则交维护者合并。
English verdict: APPROVE - 47fdc42. Canonical new Goal/Todo CLI runs without eager source-writer imports; original creation recovery preserves later work and refuses source recreation on provider outage. Current source137 and independent-wheel5/34-child provenance qualify this caller boundary. Supported writers, recovery obligations, full retirement and production/default adoption remain open.
Signed-off-by: LoopX Agent <[email protected]>
Signed-off-by: LoopX Agent <[email protected]>
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; gpt-6.1-sol; OpenAI; runtime_reported; effort=xhigh
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
维护退役路径的开发者在 canonical Goal 上运行 Todo CLI 时会遇到此问题。 一次性安装包移除旧行写入模块后,基线无法读取 canonical 工作并完成准入;此版本完成创建、修改、租约工作写回与原 Turn 结算重试。 已验证缺失旧模块时的 canonical 创建与恢复,以及缺租约和 provider 失效拒绝、一次结算和新 Turn 的原生工作或重规划。 本 PR 保留仍有调用方的 writer、备份和原回执读取,不切换生产默认值。 完整 writer/capture/outbox 退役、用户升级迁移、App 与默认采用保留原验收。
改动思路
canonical 表示已经选定的权威 provider。现有 typed owner 继续负责状态、准入和回执,Python 只保留源 IO。四个真实源调用方实际需要时才加载行写入器,历史显式导入仍返回原函数对象。直接删除旧实现会伤害尚未迁移的调用方;增加另一套切换规则也没有必要。做法是隔离实际依赖,并用真实 CLI 在物理缺失的安装包中走完整生命周期。
具体改动
精确 head 16a54e3,作者范围仅3文件:运行29增/6删、测试257增、文档30增/1删。相较上一评审,增加94行现有 fixture 测试和5行双语边界说明,生产导入 hunk 一致;全部当前PR重新审查,未继承旧批准。
关键代码讲解
- loopx/todos.py:147 的 getattr 精确接受四个历史名字并返回原函数;未知名字仍抛 AttributeError。这是本地导出兼容,不是状态分类或权限规则。
- update_goal_todo:1038 的局部导入在 canonical 提前返回和不支持意图拒绝之后;complete_goal_todo:1340、supersede_goal_todo:1667 的导入只在 provider-first 装饰器进入旧主体后发生。add_todo_to_lines:198 保留源写入实现。
- 现有物理缺失 fixture 覆盖新Goal创建、后续Todo和原操作恢复;新增 hard-lease 链验证准入、拒绝未租约修改、合法编辑、provider离线/恢复、有效vision、原返回argv结算与重试。同一Turn已结算后quiet,新Turn使用当前工作或原生replan。
规范:docs/architecture/rfcs/ledger/shared-goal-authority-state-provider-v0/2026-09-28-retirement-cadence.md,接受版本 9f6a87f。Deletion proof 在调用方隔离边界 implemented,证据是真实File/SQLite源码和独立wheel链路。Writable Markdown Todo branches 完整删除仍 deferred:支持升级、旧调用方和outbox退出须继续按既有计划证明。永久显示、私有验证、Host IO、备份与原回执读取仍有价值,未按语言或行数删除。
对主干的风险
没有发现阻塞项。最强反例是创建smoke通过,但准入或结算仍依赖旧模块,或删除时丢掉租约拒绝、重试幂等和后继质量重规划。固定9f6基线的两项同fixture在quota collection失败;独立同包导入确认缺失eager line_update依赖。当前源码7项隔离加161项相邻规则、独立wheel7项通过,60次CLI均有删除旧模块的包来源,6次非零退出均是预期负例。
验证比较完整当前Todo记录、原Turn身份、一次扣额和原创建操作,不把decision相同当兼容证明。缺provider时没有新增准入、扣额、backend或改写已有显示,恢复后仍可继续原操作。新Turn遇到未证明vision时允许并验证原生replan,未修改规则逼它执行旧Todo。初版测试对显示重建、首个vision和fresh选择的假设错误已修正,失败保留为测试作者错误,不报产品通过。
Ruff、mypy19、语义advisory/全树、公开边界、资产/wheel构建通过。native premerge19项检查全部通过;首轮gate拒绝旧CQR范围,新base/head原生prepare/record后当前CQR匹配3文件并重验完整gate。没有改预算、数据或准入规则。旧R24/R25比较仅作为注明原revision的历史证据。未验完整GUI/Lark、PostgreSQL、Windows、生产安装默认与持续soak;未变更store或新UI操作,不能据此结算完整迁移。CI按managed策略未查询。
我的整体评价
APPROVE;justified_increment,long_horizon preserved,user_experience improved。用户沿原入口执行,不新增配置或确认;新包在缺失无关源模块时能到达既有权威,长期状态、结算和replan依旧受原规则约束。future-facing pass复用现有fixture和owner,缩小导入边界;更大的writer/capture删除留给真实最后调用方,不新增框架或平行owner。状态词汇复用现有typed契约,四个导出名保持本地。最小回滚恢复导入布局,无需转换数据。控制面PR交维护者合并。
English verdict: APPROVE - 16a54e3. Real File/SQLite canonical creation, recovery and leased settlement work without the source line writer. Current168 source checks and independent-wheel7/60 CLI provenance preserve lease/provider rejection, one debit, exact retry and a fresh work/replan frontier. Supported source/recovery obligations, full retirement and default adoption remain open.
Canonical Goal and Todo commands currently load the unpromoted Markdown line writer before reaching their selected provider. This keeps an unrelated old implementation on the canonical startup path. Load it at the four actual source callers, while preserving the four historic explicit imports as the same function objects.
Physical-absence tests run real File/SQLite new Goal creation, later Todo edits and original creation recovery. They also run hard-lease admission, rejected unleased edits, provider outage/restore, material vision writeback, once-only settlement, exact retry and a fresh work/replan frontier. Permanent display rebuild is preserved and cannot become fallback authority.
Validation: 7 absence cases plus161 adjacent source cases; 7 independent-wheel cases with60 package-attributed CLI children; Ruff, configured mypy19, semantic advisory/full-tree smoke, public-boundary scan, asset/wheel build and native premerge19 passed. The accepted-main counterfactual fails both leased-delivery absence cases. Current exact3-path change-quality receipt is verified.
Supported source writers, capture/outbox, backup and original-receipt readers, private validation and Host IO remain. This stage does not qualify complete writer retirement, full GUI/Lark, production upgrade/default adoption or sustained soak. No provider, ownership policy, scheduler, CLI option or UI operation changes.
中文:canonical Goal/Todo 入口按选定 provider 执行,旧行写入器只在四个真实源调用方需要时加载,四个历史显式导入仍返回原函数。真实 File/SQLite 隔离安装包在物理缺失旧模块时完成创建、原操作恢复和租约工作写回/结算;缺租约与 provider 失效拒绝、一次扣额、原 Turn 重试及新 Turn 工作/重规划均有证据。源码168项、独立wheel7项/60次CLI和原生premerge19项通过。仍有价值的旧源、显示投影、验证、Host IO、备份/回执恢复保持;完整退役、用户迁移和正式默认采用继续保留既有验收。