Details (original message): Implement the intent core, conformance suite, catalog alignment, examples, and the intentctl diagnostics CLI.
5.1 KiB
5.1 KiB
Agent-Intent v0.1.0 实现与验证记录
对应设计方案:2026-09-29-agent-intent-design.md(决策 D1–D7 按推荐执行,经用户批准)。 范围:P0–P3 全部完成;P4(消费方接入 PR)按方案另立任务,不在本仓。
交付内容
intent核心包:spec 定义与校验(id 分段格式、正则/槽位/数量上限)、RegistryBuilder / Registry / 不可变 Snapshot(atomic.Pointer 原子替换)、JSON overlay 加载合并(新增/覆盖需版本递增/禁用/保护域拒绝/未知字段拒绝)、四级漏斗识别器(guard → expectation → rules → adjudicate)、槽位抽取(必填缺失记录于MissingRequiredSlots)、Snapshot.Explain裁决轨迹、Snapshot.Conflicts共享词条诊断、RuleSegmenter规则分句、Classifier/ExpectationProvider扩展接口、错误码鸭子方法 + logsys 可选注入。conformance:消费方行为验收套件(分支/Top/槽位断言 + 确定性 + 并发冒烟)。catalogcheck:intent.*/ 复用的sys.invalid_argument常量与错误码库目录逐个相等。cmd/intentctl:lint(校验 + 冲突报告 + 来源清单)、explain(分支/候选/槽位/两阶段轨迹)、eval(评测集跑批,退出码承载失败)。examples:守卫 Go 内置(保护域)+ 业务 JSON embed 的端到端示例。- 测试:spec 校验表测、loader 合并语义与来源定位、registry 快照/Reload 保留旧快照、识别器全分支(守卫短路、挂起预期、模式加成、歧义、分类器成败、必填槽位缺失、大小写折叠、空输入、超长输入、nil 快照)、确定性深比较、
-race并发识别 + Reload、评测集回归。
与方案的偏差
- 执行顺序:P1(Error-Code-System 上游
intent域)先于 P0 完成,使本仓首个提交直接 pin ECS 新提交28fa06ea,避免一次 pin 漂移。ECS 变更为追加式(新域 3 码 + 目录 JSON + 映射文档),不影响既有消费方。 - id 格式:实现采用点分段
^[a-z][a-z0-9_-]{0,63}$(首段=domain),支持多级记忆名(demo.run.status_query);方案原文的单段记忆名正则不含层级,属笔误级修正。 - 计分舍入:得分固定四位小数舍入,避免浮点噪声进入结果与 margin 比较(方案未规定,实现补齐并写入 README)。
- intentctl eval 的守卫用例:CLI 只加载 JSON 配置,宿主 Go 内置守卫的用例只能在宿主测试/conformance 中验证(README 已说明)。模块自带评测集的 guard 用例由 Go 测试路径覆盖。
- Result 顶层 Slots:方案便捷字段未实现,槽位在
Top.Slots;语义等价,避免双份状态。
验证证据
| 验收条件(方案验收表) | 结果 |
|---|---|
| 同输入+同快照→同结果(含 Explain) | 通过:TestRecognizeDeterministic 深比较 |
| guard 保护域不可被 overlay 禁用/覆盖 | 通过:TestBuildFSProtectedDomain(两种尝试均 intent.spec_protected) |
| 配置错误定位到字段与来源 | 通过:TestValidateSpecRejections、TestLoadOverlaysUnknownField、TestBuildFSOverrideMustIncreaseVersion(fields 含 file/source/field) |
| 合并语义(新增/覆盖/禁用/版本递增/位置保持) | 通过:TestBuildFSMergeSemantics、TestLoadOverlaysFileOrder |
| 无匹配=Fallback 非错误 | 通过:TestRecognizeExcludedTermFallsBack、TestRecognizeEmptyInputFallsBack |
| Reload 失败保留旧快照;并发识别不受影响 | 通过:TestReloadSwapsAndKeepsOldOnFailure、TestConcurrentRecognizeAndReload(-race) |
| 硬负例语料(否定写+只读、排除词、近义混淆) | 通过:TestEvalCorpus(10 用例,含 negated_write_readonly) |
| 错误码与上游 intent 域逐个相等 | 通过:catalogcheck.TestIntentCodesAlignWithCatalog |
| 零第三方依赖 | 通过:go list -m all 仅 error-code-system / logging-system(本地 replace) |
| 消费方可按生态范式接入 | 通过:examples.TestEndToEnd(embed 配置 → 守卫/匹配/槽位/元数据/诊断) |
| intentctl 只读诊断 | 通过:cmd/intentctl 三个命令单测 + 手工冒烟(lint/explain/eval 输出见会话) |
命令与结果(2026-09-29,本机 go1.27.1 linux/amd64)
GOWORK=off go vet ./... # 通过,无输出
GOWORK=off go test -count=1 ./... # ok:catalogcheck / cmd/intentctl / conformance / examples / intent
GOWORK=off go test -count=1 -race ./... # 同上,全部 ok
GOWORK=off go list -m all # agent-intent + 两个生态子模块
scripts/submodule-consistency.sh # 见提交时输出(三个 ok)
组合与回退
- 本仓 pin:development-guidelines
26b562d2、error-code-system28fa06ea(含 intent 域)、logging-system2c5716fd;与 Agent-Squad / Agent-Native 当前组合一致(ECS 为追加式前进)。 - 消费方回退:普通 PR 恢复旧 gitlink 即回退本模块;ECS 的
intent域为纯追加,回退本仓不需要回退 ECS。