Details (original message): Implement the intent core, conformance suite, catalog alignment, examples, and the intentctl diagnostics CLI.
53 lines
5.1 KiB
Markdown
53 lines
5.1 KiB
Markdown
# Agent-Intent v0.1.0 实现与验证记录
|
||
|
||
对应设计方案:[2026-09-29-agent-intent-design.md](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、评测集回归。
|
||
|
||
## 与方案的偏差
|
||
|
||
1. **执行顺序**:P1(Error-Code-System 上游 `intent` 域)先于 P0 完成,使本仓首个提交直接 pin ECS 新提交 `28fa06ea`,避免一次 pin 漂移。ECS 变更为追加式(新域 3 码 + 目录 JSON + 映射文档),不影响既有消费方。
|
||
2. **id 格式**:实现采用点分段 `^[a-z][a-z0-9_-]{0,63}$`(首段=domain),支持多级记忆名(`demo.run.status_query`);方案原文的单段记忆名正则不含层级,属笔误级修正。
|
||
3. **计分舍入**:得分固定四位小数舍入,避免浮点噪声进入结果与 margin 比较(方案未规定,实现补齐并写入 README)。
|
||
4. **intentctl eval 的守卫用例**:CLI 只加载 JSON 配置,宿主 Go 内置守卫的用例只能在宿主测试/conformance 中验证(README 已说明)。模块自带评测集的 guard 用例由 Go 测试路径覆盖。
|
||
5. **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)
|
||
|
||
```bash
|
||
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-system `28fa06ea`(含 intent 域)、logging-system `2c5716fd`;与 Agent-Squad / Agent-Native 当前组合一致(ECS 为追加式前进)。
|
||
- 消费方回退:普通 PR 恢复旧 gitlink 即回退本模块;ECS 的 `intent` 域为纯追加,回退本仓不需要回退 ECS。
|