From e0d5e8baffd7381c9a64e475cbd59c8d5e5ad941 Mon Sep 17 00:00:00 2001 From: loong10k <20489781+loong10k@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:51:51 +0800 Subject: [PATCH 1/6] =?UTF-8?q?docs(rust-cli):=20=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E5=91=BD=E4=BB=A4=E6=9E=B6=E6=9E=84=E3=80=81=E8=AF=AF=E6=8A=A5?= =?UTF-8?q?=E7=99=BD=E5=90=8D=E5=8D=95=E3=80=81=E9=81=97=E7=95=99=E5=B7=AE?= =?UTF-8?q?=E5=88=86=E4=B8=8E=E9=A1=B9=E7=9B=AE=E5=88=9D=E5=A7=8B=E5=8C=96?= =?UTF-8?q?=E8=A7=84=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补齐 introduce-rust-codeguard-cli 变更的设计文档与规格缺口: - command-architecture / static-check-catalog / false-positive-allowlist: 命令面、静态检查目录与已知误报处置 - legacy-delta-20260924 / legacy-v1-protocol-map:遗留实现与 v1 协议映射, 明确哪些是迁移债、哪些是已完成 - project-initialization:项目初始化能力规格 - architecture / technical-design / coverage-and-acceptance / remediation-workflow 与各 specs 同步更新,新增 implementation-coverage 汇总覆盖情况 本次提交与 Agent Plugins 可移植布局迁移无关,单独成commit 以便独立回滚。 --- docs/rust-cli/README.md | 10 +- docs/rust-cli/architecture.zh-CN.md | 117 +- docs/rust-cli/command-architecture.zh-CN.md | 737 ++++++ .../rust-cli/coverage-and-acceptance.zh-CN.md | 21 +- .../false-positive-allowlist.zh-CN.md | 202 ++ docs/rust-cli/legacy-delta-20260924.zh-CN.md | 17 + docs/rust-cli/legacy-v1-protocol-map.zh-CN.md | 32 + docs/rust-cli/project-initialization.zh-CN.md | 205 ++ docs/rust-cli/remediation-workflow.zh-CN.md | 68 +- docs/rust-cli/static-check-catalog.zh-CN.md | 81 + docs/rust-cli/technical-design.zh-CN.md | 120 +- .../introduce-rust-codeguard-cli/design.md | 20 +- .../implementation-coverage.md | 324 +++ .../introduce-rust-codeguard-cli/proposal.md | 10 +- .../specs/binary-distribution/spec.md | 166 ++ .../specs/execution-kernel/spec.md | 90 + .../specs/hook-protocol/spec.md | 2 + .../specs/language-gate-commands/spec.md | 32 + .../specs/native-tool-adapters/spec.md | 537 ++++- .../specs/project-initialization/spec.md | 137 ++ .../specs/remediation-workflow/spec.md | 344 ++- .../specs/rulepack-governance/spec.md | 166 ++ .../specs/scan-scope-policy/spec.md | 4 +- .../specs/unified-cli-contract/spec.md | 242 +- .../specs/verdict-integrity/spec.md | 24 +- .../introduce-rust-codeguard-cli/tasks.md | 937 ++++++-- .../verification.md | 2011 ++++++++++++++++- 27 files changed, 6443 insertions(+), 213 deletions(-) create mode 100644 docs/rust-cli/command-architecture.zh-CN.md create mode 100644 docs/rust-cli/false-positive-allowlist.zh-CN.md create mode 100644 docs/rust-cli/legacy-delta-20260924.zh-CN.md create mode 100644 docs/rust-cli/legacy-v1-protocol-map.zh-CN.md create mode 100644 docs/rust-cli/project-initialization.zh-CN.md create mode 100644 docs/rust-cli/static-check-catalog.zh-CN.md create mode 100644 openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md create mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md diff --git a/docs/rust-cli/README.md b/docs/rust-cli/README.md index 3bec19c..5e2fc9b 100644 --- a/docs/rust-cli/README.md +++ b/docs/rust-cli/README.md @@ -1,17 +1,23 @@ # Codeguard Rust CLI 设计文档 -状态:设计基线,尚未实现。日期:2026-09-24。源码核对基线:`03ebb24`;后续实现必须重新核对工作树和已合并规格。 +状态:设计基线已完成,工程基线部分实施;原生检查、修复闭环和宿主验收尚未完成。日期:2026-09-24。原设计源码基线为 `03ebb24`,当前 HEAD `9e4adb1` 的增量见下表;后续实现仍须核对工作树和已合并规格。 | 文档 | 回答的问题 | |---|---| | [架构文档](architecture.zh-CN.md) | 产品目标、模块边界、检查流程、低误报机制、权威边界 | | [技术方案](technical-design.zh-CN.md) | 命令、数据协议、适配器、执行器、配置、缓存、分发与兼容实现 | +| [逐指令架构设计](command-architecture.zh-CN.md) | 36 项命令入口的作用、价值、输入输出、副作用、退出语义、协作流程与验收 | +| [静态检测目录](static-check-catalog.zh-CN.md) | Javadoc、依赖治理、CVE 和其他 28 个检测族的义务与证据边界 | | [语言迁移与验收](coverage-and-acceptance.zh-CN.md) | 57 个条目的迁移、类别覆盖、评测方法、验收证据 | +| [最新旧实现增量核对](legacy-delta-20260924.zh-CN.md) | 原设计基线到当前 HEAD 的源码差异、兼容/纠偏归类与回归样本 | | [持久问题与修复工作流](remediation-workflow.zh-CN.md) | 项目内 codeguard 目录、问题记录、待办任务、智能体修复与复检闭环 | +| [项目初始化与 AGENTS.md 接入](project-initialization.zh-CN.md) | 项目画像、版本/构建器/架构/模块图、受管摘要与检查准备 | +| [误报白名单设计](false-positive-allowlist.zh-CN.md) | 精确匹配、可信审批、过期重审、任务流与带例外交付语义 | | [OpenSpec proposal](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md) | 为什么变更及变更范围 | | [OpenSpec design](../../openspec/changes/introduce-rust-codeguard-cli/design.md) | 架构决策、兼容性、实施顺序和待验证事项 | | [OpenSpec tasks](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md) | 可执行任务、依赖和完成证据 | +| [实施覆盖索引](../../openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md) | 设计、逐条规格、36项命令、57个语言、平台/宿主到实施任务的双向追踪 | -本次需求的唯一规范性事实源为 `openspec/changes/introduce-rust-codeguard-cli/specs/`。这些说明文档展开设计,不创建第二套任务状态。仓库 `openspec/specs/` 与 [当前架构](../current-architecture.md) 仍描述已落地的旧运行时;本 change 未实施前不得宣称 Rust 行为已经生效。 +本次需求的唯一规范性事实源为 `openspec/changes/introduce-rust-codeguard-cli/specs/`。这些说明文档展开设计,不创建第二套任务状态。仓库 `openspec/specs/` 与 [当前架构](../current-architecture.md) 仍描述已落地的旧运行时;新 Rust 工程基线不能被宣称为扫描器或宿主行为已经生效。 本次验收记录见 [verification.md](../../openspec/changes/introduce-rust-codeguard-cli/verification.md)。文档校验成功不代表二进制、扫描器或宿主运行验收成功。 diff --git a/docs/rust-cli/architecture.zh-CN.md b/docs/rust-cli/architecture.zh-CN.md index 8104944..89eaba7 100644 --- a/docs/rust-cli/architecture.zh-CN.md +++ b/docs/rust-cli/architecture.zh-CN.md @@ -2,13 +2,15 @@ 本方案把 Codeguard 恢复为传统静态工具驱动的多语言代码质量守卫。统一入口是 Rust 二进制 `codeguard`,智能体负责调用、解释和修复,检查事实来自工具,门禁要求来自受控策略。 -状态:待实现设计。规范性要求见 [OpenSpec change](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md)。实现细节见 [技术方案](technical-design.zh-CN.md),能力与测试见 [迁移验收](coverage-and-acceptance.zh-CN.md)。 +状态:工程基线部分实施,原生检查与交付闭环待实现。规范性要求见 [OpenSpec change](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md)。实现细节见 [技术方案](technical-design.zh-CN.md),能力与测试见 [迁移验收](coverage-and-acceptance.zh-CN.md)。 -项目内新增 `./codeguard/` 持久工作区,保存脱敏问题、任务和修复事件;本地报告、日志、缓存默认 Git 忽略。智能体以 `next` 获取可推进任务,以 `task verify` 完成真实复检。完整设计见 [修复工作流](remediation-workflow.zh-CN.md)。 +每条命令的职责、价值、输入输出、状态与副作用、失败恢复、应用服务映射见 [逐指令架构设计](command-architecture.zh-CN.md)。命令分为发现准备、质量检查、交付门禁、持久修复、宿主协议入口;共享检查内核和证据模型,不按命令复制实现。 + +项目内新增 `./.codeguard/` 持久工作区,保存脱敏问题、任务和修复事件;本地报告、日志、缓存默认 Git 忽略。智能体以 `next` 获取可推进任务,以 `task verify` 完成真实复检。完整设计见 [修复工作流](remediation-workflow.zh-CN.md)。 ## 1. 产品目标与不可变约束 -1. 覆盖已支持语言的 lint、注释规范、CVE、安全规范及构建检查;每类检查都必须有明确适用性、执行能力和结果。 +1. 对已支持语言识别 lint、注释规范、依赖/CVE、安全规范及构建检查的项目配置;已配置且可适配的检查器调用原生能力,其他候选项说明缺失、无效或未知状态。只有批准策略要求的缺项影响交付门禁。 2. 优先复用语言生态的成熟工具和项目配置。Rust 统一编排与证据,不重新实现各语言编译器和静态分析器。 3. 低误报来自准确的工具版本、规则、语言方言、构建上下文和报告解析。不能靠关闭规则、减少检查范围或默认忽略旧问题改善数字。 4. 代码违规与执行故障分别呈现;必需检查未完成时交付门禁不通过。 @@ -101,7 +103,100 @@ flowchart LR 初版采用编译期适配器注册。任意脚本、动态库插件或远程规则执行不是默认扩展入口,避免将字符串命令表原样升级为新的执行系统。 -## 5. 一次检查的完整路径 +## 5. 项目持久工作区与修复闭环 + +在被检查项目根目录使用 `./.codeguard/` 作为持久修复工作区。它记录发现、环境阻塞、待处理任务与复检证据,支持智能体恢复上下文并持续推进修复。此布局与前述 `codeguard-cli/` Rust 源码仓布局分别承担项目数据和工具开发职责。 + +### 5.1 已确认的目录 + +```text +.codeguard/ +├── .gitignore +├── README.md +├── workspace.json +├── findings/ # 脱敏问题、环境阻塞及历史事件 +├── tasks/ # 可读的修复任务 +├── decisions/ # 经批准的决策引用 +├── reports/ # 以下本地数据默认不入 Git +├── runs/ +├── cache/ +├── worktrees/ +└── state/ +``` + +目录内 `.gitignore` 默认包含: + +```gitignore +/reports/ +/runs/ +/cache/ +/worktrees/ +/state/ +``` + +脱敏后的问题、任务与决策引用可随项目进入 Git,便于审查和交接;原始报告、日志、缓存、临时副本和租约状态保留在本地。`workspace.json` 描述工作区身份、schema 和受管路径,质量要求仍由已有配置入口及可信策略提供。完整记录结构、隐私和并发规则见 [持久问题与修复工作流](remediation-workflow.zh-CN.md)。 + +### 5.2 已确认的核心流程 + +```mermaid +flowchart LR + A[原生工具检查] --> B[归并问题与环境阻塞] + B --> C[生成修复任务] + C --> D[智能体获取下一步] + D --> E[修复代码或环境] + E --> F[原工具复检] + F -->|解决| G[记录证据并关闭] + F -->|仍存在| C + F -->|重复无进展| H[保留问题并提出具体决策] + G --> I[完整交付检查] +``` + +每张任务必须包含:**问题证据、规则依据、允许修改的范围、修复步骤、复检命令、历史尝试和关闭条件**。缺 JDK、工具版本不兼容或漏洞库不可用等情况生成环境修复任务,并关联依赖它的检查义务,指导智能体先恢复检查条件。 + +目标命令流程如下;除版本和能力清单查询外,当前仍待实现: + +```bash +codeguard init . --apply +codeguard check all . +codeguard work sync . +codeguard next . --format json +# 按任务修复 +codeguard task verify CG-abc123 . +``` + +上述命令展示显式调用路径。项目初始化并启用插件工作流后,插件自动串起检查、幂等同步和修复指引;普通独立 CLI 检查仍可由用户显式执行 `work sync`。 + +### 5.3 修复闭环的固定约束 + +- **同一问题只保留一个稳定任务**:重复扫描归并证据,避免生成重复待办;同一根因可形成任务组,逐项保留发现和关闭条件。 +- **任务勾选不等于修复完成**:必须由原工具在有效规则及匹配范围下复检,才能确认代码或环境已修复;问题复发时重开,历史保留。 +- **失败尝试也要记录**:包括复检前失败、没有修改和中断。无进展达到预算后停止重复动作,给出具体诊断或决策需求,门禁要求保持不变。 +- **启用后插件自动串起检查、同步、修复指引**:智能体通过任务获取下一步;同步失败保留原检查结果并说明恢复动作,不能假称任务已经生成。 +- **任务清空不影响门禁**:完整交付仍由源码、有效策略和原生检查证据决定;原有 `codeguard/src/` 等非点目录用户源码照常检查,`.codeguard/` 中自有记录仍接受入库安全检查。 + +任务关闭只证明对应问题已按其关闭条件处理,完整交付检查仍须覆盖全部适用必需义务。经批准的政策处置或例外须单独归因,不能伪称代码已经修复。 + +### 5.4 init:项目画像与智能体接入 + +`codeguard init` 负责识别项目、建立检查前置条件清单,并把可追溯的项目摘要写入被检查项目 `AGENTS.md` 的 Codeguard 受管区块。初始化必须覆盖: + +| 维度 | 记录内容 | +|---|---| +| 边界与技术栈 | 项目/构建根、语言与方言、框架;产品版本、语言目标、已解析版本、本机版本分开 | +| 构建体系 | 构建器、wrapper、包管理器、锁文件、profiles/features/targets、源码与测试源集 | +| 架构与模块 | 分层、领域组织、部署单元、构建/源码/外部依赖关系;每项带依据和完整性 | +| 质量与验证 | 已有 lint/注释/安全/CVE 配置、规则来源、测试与构建命令、实际验证状态 | +| 准备与协作 | 缺失工具/环境、既有 AGENTS/子目录约束、规格体系、已有图索引及后续准备任务 | + +MVC、DDD 等按不同架构维度描述,可以并存。目录名只能提供线索,推断必须标注待确认;构建聚合、源码引用和运行时关系不能混成一种依赖。未证明完整的图不能用来缩小检查范围。 + +工作区补充 `.codeguard/project.json`、`.codeguard/module-graph.json` 和 `.codeguard/architecture.md`,分别保存结构化画像、关系及可读投影;`workspace.json` 只引用它们。AGENTS 保持简明,链接详情,保留既有人工内容和其它工具区块。被生成的画像是观察结果,不能自动成为新的规则权威。 + +init 默认 dry-run,`--apply` 写入预览中的受管文件与 AGENTS 区块。实际工具探测、安装、构建、服务启动、Hook/CI 接入分别列为后续动作,不隐式执行。重复初始化按输入身份刷新画像并保留问题历史;初始化成功与质量门禁通过分开报告。 + +完整内容、AGENTS 区块模板、版本来源与验收场景见 [项目初始化设计](project-initialization.zh-CN.md)。 + +## 6. 一次检查的完整路径 ```mermaid flowchart TD @@ -123,7 +218,7 @@ flowchart TD `check all` 建立项目全部适用类别的义务;`lint java` 只选择 Java lint。项目没有使用某语言与某语言检查器缺失是不同事实,后者不能伪装成不适用。 -## 6. 结果与门禁的分离 +## 7. 结果与门禁的分离 单个检查结果至少包含三个维度: @@ -145,7 +240,7 @@ flowchart LR 注释检查不能被格式化检查替代;`cargo fmt --check` 不等于 `clippy`;CVE 扫描不等于源代码安全检查;Maven `verify` 成功不证明未绑定的 P3C/Checkstyle/Javadoc 已执行。Maven 生命周期通过插件绑定具体目标,必须验证实际执行项。[Maven 官方生命周期说明](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html) -## 7. 低误报机制 +## 8. 低误报机制 | 误报来源 | 工程控制 | 必需证据 | |---|---|---| @@ -159,9 +254,11 @@ flowchart LR 无法确定的检测仍是待解决的覆盖或证据问题,不能通过“低置信度就删除”降低误报率。规则是否阻断由事先确认的策略决定,运行时不动态调低阈值。 +可复现的原生工具误报可进入[精确白名单裁定](false-positive-allowlist.zh-CN.md):保留 finding,只对经独立批准且身份与期限匹配的那一条作处置;交付显示 `allow_with_exceptions`。未配置检查、工具故障和真实但被接受的风险分别处理,不能混入误报白名单。 + 注释的语法、公共 API 文档存在性、参数/返回值对应关系可用确定性工具检查;“注释是否真正解释业务动机”不能无证据宣称已验证。明确的中文注释要求可作为专用规则,但必须处理专有名词、代码片段、继承文档与生成代码,不能按单字符语言判断粗暴拦截。 -## 8. 性能与正确性 +## 9. 性能与正确性 Rust 可减少启动和编排开销,但总耗时通常受外部工具、构建和漏洞库影响;“性能最高”必须通过同范围、同规则、同缓存条件的测量验证。 @@ -169,7 +266,7 @@ Rust 可减少启动和编排开销,但总耗时通常受外部工具、构建 同一个 target/build 目录和不可并发工具使用资源锁。超时、输出上限、网络状态或缓存故障均不得变成 PASS。保存事件采用较短预算只提供反馈,交付入口使用完整预算;二者结果不能不加区分复用。 -## 9. 权威与安全边界 +## 10. 权威与安全边界 ```mermaid sequenceDiagram @@ -194,7 +291,7 @@ CLI 与用户同权限,无法防止用户替换二进制、绕过本地 hook 受保护 CI 还必须隔离可信验证端与被测项目的执行区:项目脚本不能改写可信策略、工具锁、验证器或最终状态凭据。执行产物是待核验输入;可信端验证输入/规则/覆盖并独立签发结果,不能直接上传项目脚本生成的绿色收据。无法提供这种隔离的环境不宣传不可自降级保证。 -## 10. 迁移原则 +## 11. 迁移原则 先固定契约与真实样本,再逐工具实现适配;先对照验证,再切换宿主;所有原 stable 条目都完成验收后,才宣布全量迁移。迁移对照必须区分“旧实现 bug 修正”和“新实现回归”,不能要求复制旧豁免结果。 @@ -202,6 +299,6 @@ CLI 与用户同权限,无法防止用户替换二进制、绕过本地 hook 现有点前缀忽略策略保持:普通扫描不检查、不逐文件报告点前缀路径;入库安全和配置发现例外不变。报告只记录生效策略及汇总覆盖,不把已排除路径重新变成告警。若未来要检测 `.github/workflows` 等内容,需要单独确认策略变更。 -新增持久工作区只精确排除生成器拥有的运行/记录文件,改由工作区 schema 与脱敏校验;不会把整个 `codeguard/` 变成免检目录,入库安全仍覆盖这些文件。任务文件只是投影,删除任务、勾选完成或编辑历史都不能替代真实 gate。 +新增持久工作区按点前缀策略排除普通源码发现,生成器拥有的记录改由工作区 schema 与脱敏校验;这不构成入库安全豁免,拟提交记录仍须安全检查。非点目录 `codeguard/` 的用户源码不因同名而被排除。任务文件只是投影,删除任务、勾选完成或编辑历史都不能替代真实 gate。 所有实施任务和待验证项统一维护在 [tasks.md](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md)。 diff --git a/docs/rust-cli/command-architecture.zh-CN.md b/docs/rust-cli/command-architecture.zh-CN.md new file mode 100644 index 0000000..99ff7b2 --- /dev/null +++ b/docs/rust-cli/command-architecture.zh-CN.md @@ -0,0 +1,737 @@ +# Codeguard 命令架构:职责、价值与执行契约 + +状态:待实现设计,2026-09-24。本文逐项细化统一 Rust 二进制的目标命令,**不是当前 Python CLI 的使用手册**。规范事实源仍是 [现有 OpenSpec change](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md),不建立第二份实现任务清单。 + +读者是 CLI/适配器实现者、插件接入者和使用 Codeguard 修复项目的智能体。每条命令必须回答:为什么存在、选择什么对象、读写什么、输出什么证据、如何处理失败、下一步是什么。原生工具决定检查事实,批准策略决定检查义务,智能体依据证据修复。 + +## 1. 命令体系与协作路线 + +```mermaid +flowchart TB + Discover[detect / capabilities] --> Init[init:画像与工作入口] + Init --> Prepare[config / rules / tools / doctor] + Prepare --> Plan[plan:检查义务与执行计划] + Plan --> Scan[lint / comments / dependencies / cve / security / build] + Plan --> Check[check:完整类别编排] + Scan --> Runs[有身份的运行报告] + Check --> Runs + Runs --> Sync[work sync:持久化问题和阻塞] + Sync --> Read[status / next / task show] + Read --> Attempt[claim / attempt start] + Attempt --> Repair[fix 或智能体按简报修复] + Repair --> Finish[attempt finish] + Finish --> Verify[task verify:原工具复检] + Verify -->|仍存在或未完成| Read + Verify -->|证据确认解决| Delivery[check all / gate] + Delivery -->|满足全部义务| Done[交付证据] + Delivery -->|发现或未完成| Runs +``` + +这是流程协作图,不表示每条命令在内部自动执行所有后继命令。独立 CLI 的 `check` 保存报告,`work sync` 更新任务;已启用插件在一次工作流中串起保存、同步和简报。`fix --apply` 与 `task verify` 内含必要复检;两者不是不受控的无限修复循环。 + +### 1.1 命令目录 + +下表 C01–C36 是文档追踪编号,不是对外子命令。每项在后文有独立契约。 + +| ID | 入口 | 用户获得的价值 | +|---|---|---| +| C01 | `help` / `--help` | 查询确实支持的参数和行为,避免智能体猜命令 | +| C02 | `--version` | 确认实际二进制身份和协议兼容范围 | +| C03 | `detect` | 观察项目语言、构建根与版本来源 | +| C04 | `capabilities` | 了解此发行版能适配的检查器;项目是否配置由 doctor/check 探测 | +| C05 | `init` | 建立项目画像、AGENTS 入口及持久修复工作区 | +| C06 | `plan` | 在执行前看清检查义务、范围、工具和缺口 | +| C07 | `doctor` | 将工具链和环境故障定位成可恢复的前置问题 | +| C08 | `rules list` | 查清实际规则的依据、来源与适用性 | +| C09 | `config validate` | 验证配置结构、引用和策略一致性 | +| C10 | `config explain` | 解释每项生效配置为何生效以及来自哪里 | +| C11 | `tools list` | 查看工具库存与项目所需工具 | +| C12 | `tools verify` | 检验实际工具制品是否符合锁定身份 | +| C13 | `tools install` | 将精确锁定的工具安装到受管位置 | +| C14 | `lint` | 检查编码规范与适用的静态质量规则 | +| C15 | `comments` | 检查可确定验证的注释与文档契约 | +| C16 | `cve` | 检查目标依赖图中的已知漏洞 | +| C17 | `security` | 检查源码、配置、敏感内容及入库安全规则 | +| C18 | `build` | 验证编译、构建一致性及策略要求的测试等级 | +| C19 | `check` | 编排指定语言的全部适用质量类别 | +| C20 | `gate pre-commit` | 检查这次实际将提交的 index 内容 | +| C21 | `gate pre-push` | 检查本次所有实际推送 ref 的内容 | +| C22 | `gate ci` | 对明确的不可变交付内容执行可信完整门禁 | +| C23 | `work sync` | 将全部未导入报告归并成稳定问题和修复任务 | +| C24 | `status` | 显示准备、检查、任务与证据新鲜度的分离状态 | +| C25 | `next` | 返回一个可推进动作及完整修复简报 | +| C26 | `task show` | 查看某项任务的证据、允许范围和历史 | +| C27 | `task claim` | 在同工作区取得有期限的任务租约 | +| C28 | `task heartbeat` | 续租并证明执行者仍持有当前租约 | +| C29 | `task release` | 释放协作占用,保留问题和历史 | +| C30 | `task attempt start` | 在修改前登记一次可追溯修复尝试 | +| C31 | `task attempt finish` | 记录实际变化、失败或无进展,防止无穷重试 | +| C32 | `fix` | 执行有界原生修复并复检结果 | +| C33 | `task verify` | 用证据判断任务是否满足关闭条件 | +| C34 | `mcp serve` | 向智能体提供同一核心能力的结构化入口 | +| C35 | `compat legacy-v1` | 显式承接旧调用协议,隔离旧语义 | +| C36 | `dependencies` | 识别依赖检查配置,运行已配置工具并反馈结果 | + +### 1.2 容易混淆的边界 + +| 对比 | 职责区别 | +|---|---| +| detect / init | detect 返回观察结果;init 将画像、受管摘要和工作流配置形成可预览、可应用的产物 | +| capabilities / doctor / check | capabilities 回答发行版能适配什么;doctor 探测项目配置和工具条件;check 调用已配置工具并返回本次结果 | +| tools verify / doctor | 前者验证制品身份与兼容元数据;后者执行有界诊断,定位运行条件 | + +`doctor [path] [--ruff-tool ABS_PATH] [--timeout DURATION] [--format human|json]` 已接入局部配置与 Ruff 版本诊断。默认不选工具;显式 Ruff 才在私有临时 cwd/日志中以固定版本参数、清空环境和共享截止时间运行,单探测最多 10s。脚本入口缺隔离时启动前拒绝。成功仅 observed_untrusted,readiness unknown、交付 not_evaluated,不安装、不扫描或写工作区;报告 doctor_observation 0.1 明确 persistence=not_saved。其它工具、可信前置映射及正式 PrerequisiteReport 持久化/同步仍待完成。 + +当前已接入 `tools verify [path] [--tool-lock-candidate FILE] [--managed-cache ABS_PATH] [--runtime ID=ABS_PATH] [--format human|json]` 的静态候选核验:逐项反馈入口/运行时/目录包的摘要及可执行位状态、issue 和恢复方向,不启动或安装工具。锁来源未核验,固定 incomplete、readiness=unknown、gate_effect=none;匹配仅 matched_untrusted,锁声明版本不代表本机启动观察。完整可信工具库存、兼容元数据、doctor 原生诊断及准备报告接线尚未完成。 +| plan / check | plan 给出执行计划和未知项;check 执行计划并取得检查证据 | +| lint / build | 编码规范与编译构建分别有义务;构建成功不证明 P3C 等规则实际运行 | +| check / gate | check 默认冻结工作树;gate 冻结 index/ref/CI 指定内容,并执行交付上下文要求 | +| status / next / task show | 分别是全局概况、下一步选择、指定任务详情;都不自动领取或修复 | +| fix / task verify | fix 可以改源码并附带复检;verify 不改源码,只根据复检追加任务状态 | +| attempt finish / task verify | finish 记录尝试结束;只有符合证据条件的 verify/同步才能确认解决 | + +## 2. 统一命令协议 + +### 2.1 参数与选择范围 + +- `[path]` 默认当前目录;先解析指定项目与构建根,不擅自扩大到上层工作区。共享目标发现与既有点路径政策,入库安全和配置发现例外保持。 +- 检查类的 `` 必填,接受注册表 canonical ID 与显式别名。`all` 是全部适用义务,不是安装所有语言工具;缺适配器不能删除义务。 +- 查询/管理类支持 `--format human|json`;检查类另支持 `sarif` 与 `--output PATH`。不支持的格式在启动子进程前返回用法错误。 +- 检查执行预算使用 `--jobs N`、`--timeout DURATION`、`--offline`;这些选项不改变质量要求。具体支持矩阵由同一命令 schema 生成,不能让无执行职责的命令接受后悄悄忽略。 +- 不自动把 `audit`、`scan`、`repair` 等近义词解析成别的操作。初版没有独立 `test` 指令;策略要求的测试属于 build 义务,报告明确其等级。 +- 命令解析只接受结构化参数;原生进程使用字面 argv。项目文本、诊断和任务 Markdown 不成为 Shell 模板或授权来源。 + +### 2.2 输出类型与退出语义 + +共用 `schema_version`、`report_type`、`operation`、`request_id`、`command_status`、`exit_code`、`warnings`、`next_actions`。检查报告继续使用既有 RunReport 顶层字段,如 `run_id/request/results/delivery_gate`,不为统一外壳丢失逐项证据。查询、计划、安装、修复及任务结果采用各自类型;不要求每个查询伪造空 findings。 + +`command_status=complete|incomplete|error|cancelled` 描述命令操作。一次检查发现违规仍可是 complete;报告另存 `completion`、findings 与 gate。`request_id` 标识请求,`run_id` 标识检查或诊断的证据生产运行,`task_id/attempt_id/lease_token` 标识协作对象;不能混用。 + +RunReport 与 doctor 的 PrerequisiteReport 均携带唯一 run_id、report_type、workspace/content/policy/tool 身份、观察范围及 freshness。导入幂等键为 workspace_id + run_id,另校验报告摘要;同键同摘要不重复写入,同键不同摘要拒绝并保留冲突。重新运行doctor产生新run_id,同一环境阻塞仍按稳定blocker身份合并,不制造第二张任务。 + +| 命令性质 | exit 0 的含义 | 典型非零 | +|---|---|---| +| 信息查询、plan、status、next | 请求的视图或计划已完整返回;允许明确含 unknown、待办和历史失败 | 无法读取必要来源为 3;坏参数为 2 | +| init | 计划或受管写入完成;readiness 可仍 incomplete | 写入冲突/部分落盘为 3 | +| doctor、config validate、tools verify | 本次所选验证条件满足;不是代码质量通过 | 必需条件缺失、配置无效或制品不匹配为 3 | +| 检查、gate、task verify | 选中义务完整且无阻断违规 | 违规 1,必需检查未完成 3 | +| sync、租约、attempt、安装 | 指定状态操作完成;尚有问题不改变此成功含义 | 存储、租约或安装未完成为 3 | +| fix --dry-run | 完成修复预览,不证明修复成功 | 无法得到可信预览为 3 | +| fix --apply | 应用流程和规定复检完成且无阻断违规 | 仍有违规 1,应用/复检未完成 3 | + +全部操作保留 2 用法错误、4 内部故障、130 取消。执行后优先级:取消 > 内部故障 > 未完成 > 违规 > 成功;原生 raw_exit_code 独立保存。查询无法形成可信结果时不能以“已经输出错误信息”为由 exit 0。 + +只有 `check all` 与 `gate` 可以评估整份交付 contract。`check all` 的 allow 只绑定工作树快照,不能当作 index/ref/CI 收据。其它命令顶层不签发交付 allow;status 可展示带来源、身份、时间的历史决策,必须另示当前 freshness。无适用对象不能生成 allow。 + +JSON stdout 恰好一个完整文档;日志进 stderr/私有证据。MCP stdio stdout 则保留给协议消息,不直接打印 CLI JSON。公开记录脱敏;结构化 `next_actions` 带作用、前提和 argv,不将诊断原文直接升级为建议执行的命令。 + +### 2.3 副作用分级 + +| 类别 | 命令 | 允许的副作用 | +|---|---|---| +| 静态观察 | help/version、detect、capabilities、plan、rules、config、tools list/verify、status/next/show | 读取允许范围;不执行项目脚本、扫描或安装 | +| 初始化 | init dry-run / apply | dry-run 不写工作树;apply 精确写计划内画像、AGENTS 受管块、工作流记录 | +| 运行诊断 | doctor | 有界探测、私有诊断;不安装、不执行完整构建/扫描 | +| 证据执行 | 六类检查、三个 gate、task verify | 物化快照、运行工具、保存报告与缓存;verify 还追加任务事件 | +| 工作区协作 | sync、claim/heartbeat/release、attempt | sync/attempt 更新事实与投影;正常租约仅写本地 state,过期恢复另记abandoned事件,不修改源码/策略 | +| 显式安装 | tools install | 只写工具锁指定且授权的受管工具位置 | +| 受控修复 | fix dry-run / apply | dry-run 可在私有隔离副本运行修复器;apply 校验身份后修改允许文件并记录尝试 | +| 协议入口 | mcp serve、compat | 调用被映射操作;协议启动成功不等于检查成功 | + +原生构建/扫描可能执行项目插件,普通本地隔离目录不等于安全沙箱;网络和可信 CI 边界遵循 [执行内核设计](technical-design.zh-CN.md)。未初始化时允许执行检查并保存私有报告,不静默创建 tracked 工作区。要求持久任务的命令须明确报告 workspace_not_initialized。 + +### 2.4 执行预算与默认值 + +以下为初版设计默认值,实施时必须随命令schema/version固化,并通过真实项目测量验证;不宣称适合所有项目。运行参数优先级为 CLI > 已登记环境变量 > 项目运行默认 > 发行内置默认,报告记录最终值和来源。未知环境变量不成为隐式开关。 + +当前 Rust 局部检查入口已登记 `CODEGUARD_TIMEOUT`,与 `--timeout` 使用相同的 ms/s/m/h 格式及 1ms–24h 边界。项目可选 `.codeguard/runtime.json` 作为更低优先级的运行默认值;文件必须是非链接的有界普通 JSON,只接受以下版本化结构,不由 `init` 自动创建,也不能写质量排除或批准字段: + +```json +{"schema_version":"1.0","document_type":"codeguard_runtime_options","timeout":"5m"} +``` + +`check all` 已扩展并行预算:`--jobs N`、登记的 `CODEGUARD_JOBS` 或 `.codeguard/runtime.json` 1.1 中可选的 `jobs` 取值为 1–64;默认 `min(4, max(1, 可用CPU并行度))`。1.0 文件仅有 `timeout`,保持原含义;1.1 文件仍要求 `timeout`,可附 `jobs`。每个字段按 CLI > 登记环境变量 > 项目运行默认 > 内置默认选取。任一字段需要项目默认值时,一次读取并严格校验整份文件;两个字段均有较高优先级来源时不读取项目文件。选中的非法值、坏协议、额外字段、链接或过大文件在原生执行前拒绝。公开反馈分别记录 timeout/jobs 的值与来源、并行上限、可执行原生任务数和真正启动数。混合 Python/Rust/Go/Java 项目可调度对应的独立原生节点;Go 工具通过 `--go-tool ABS_PATH` 显式选择;Java 当前只运行已配置的 P3C 十规则集声明的隔离单文件探针,不能代表完整 lint。真实并发与跨进程资源互斥尚待专项验收,全部 I/O 硬截止时间仍待实现。 + +| 运行类别 | 整次操作默认timeout | 默认并行度 / 可覆盖选项 | +|---|---|---| +| 六类检查、三个gate | 30分钟 | `min(4, max(1, 可用CPU并行度))`;支持 `--jobs`、`--timeout`、`--offline` | +| doctor | 2分钟;单个探测上限10秒且受剩余总预算约束 | 1;支持 `--timeout`,不隐式发起联网探测 | +| fix(预览或应用)、task verify | 30分钟,含规定复检 | 修复写入串行,验证沿检查并发配置;支持 `--timeout`、`--offline` | +| tools install | 10分钟 | 安装制品串行;支持 `--timeout`、`--offline`,离线只能使用已验证本地制品 | + +timeout包含等待资源锁、快照、探测、执行、解析、持久化和清理预算;子任务/重试继承剩余deadline,不能每次重新获得30分钟。取消/超时触发进程树终止与回收;强制清理预留在总预算内,操作系统无法按时回收时明确cleanup_pending,不伪称完成。后台服务mcp serve本身无检查deadline,但每个请求必须按同一类别有界。 + +`--timeout`接受正数及ms/s/m/h单位,`--jobs`接受正整数;0、负数、未知单位或不支持的选项为2。不得以无限timeout隐藏无进展,也不得因缩短预算改变必需义务。工作区租约默认5分钟,插件建议每60秒heartbeat;长运行的FixService/验证服务负责内部续租,失租停止应用与状态提交。续租不能重置attempt预算。 + +## 3. 发现与准备命令 + +### C01 — help / --help + +- **语法与价值**:`codeguard help [command...]` 或命令末尾 `--help`;提供参数、默认值、格式、退出码及最小示例,减少猜测调用。 +- **行为与输出**:由命令 schema 生成静态帮助,不要求项目有效、工具已安装或网络可用。JSON 帮助如未在 schema 提供,明确拒绝,不能伪装支持。 +- **失败与后继**:未知命令返回 2,列出合法入口;帮助成功不创建画像、不启动检查。 + +### C02 — --version + +- **语法与价值**:`codeguard --version [--format human|json]`;显示 CLI 版本、构建目标、构建身份、协议 major 和规则包兼容范围,定位插件实际绑定的二进制。 +- **行为与输出**:读取嵌入的发行元数据,不能联网查询 latest 或自行更新。工具、适配器实际状态继续由 capabilities/tools 给出。 +- **失败与后继**:合法版本查询正常 exit 0;版本相等不是文件完整性或真实工具验收证明,继续 tools verify/doctor。 + +### C03 — detect + +- **语法与价值**:`codeguard detect [path] [--format human|json]`;快速观察语言、方言、多构建根、清单、声明版本与源集,供 init/plan 复用。 +- **输入与结果**:读取批准范围中的清单、锁与源文件特征,返回 DiscoveryReport、证据位置、未知项和观察覆盖。不执行 wrapper 或读取整台机器的开发环境。 +- **副作用与失败**:不写画像/AGENTS/任务。可完整回答“存在无法静态解析的条件”时 exit 0;权限错误导致必要发现范围不可读时 exit 3,并显示部分结果。 +- **下一步**:需要持久接入用 init,需要知道规则能力用 capabilities,需要执行前计划用 plan。 + +### C04 — capabilities + +- **语法与价值**:`codeguard capabilities [language] [--platform ID] [--category ID] [--format human|json]`;回答这个发行版在语言 × 类别 × 工具 × 平台上承诺什么。无筛选 JSON 返回完整能力矩阵;带筛选 JSON 返回发行版本和所选单元。 +- **输入与结果**:读取发行注册表和适配器描述,返回支持/候选/计划状态、工具约束、输入粒度、报告与修复能力、已验证组合和缺口。尚未验证的工具约束或报告能力保持 gap/unknown,不从旧 lint 命令推断为已实现。 +- **副作用与失败**:不探测项目、不安装工具;注册语言 planned 仍可查询成功,不能把 planned 写成已可运行。未知语言为 2;注册表损坏为 4。 +- **下一步**:用 doctor 判断当前项目是否满足已实现能力的前置条件。没有实现的适配器不会因安装工具自动获得能力。 + +### C05 — init + +- **语法与价值**:`codeguard init [path] [--dry-run|--apply] [--format human|json]`;省略模式为 dry-run,建立持久项目画像与智能体工作入口。 +- **输入与结果**:复用 detect,生成带证据的语言/版本/构建/架构画像、分类型模块图、规则映射、准备任务、AGENTS 受管摘要和精确文件差异。MVC/DDD 等推断不自动成为强制约束。 +- **副作用与失败**:apply 才写入自有工作区和受管摘要,保留人工文本;重复执行按输入身份刷新而不清空历史。冲突/部分写入为 3。dry-run 的任务只出现在计划里。 +- **下一步**:返回 init_status 与独立 readiness;已授权插件继续 doctor/check/sync/next。完整契约见 [初始化设计](project-initialization.zh-CN.md)。 + +### C06 — plan + +- **语法与价值**:`codeguard plan [path] [--format human|json]`;明确“应该检查什么、如何执行、哪些信息还缺失”。 +- **输入与结果**:新鲜观察、可信策略、原生配置与工具锁形成全量义务,再选择适配器及任务 DAG。每项列目标、规则、工具身份、前置依赖、网络/资源需求、预计写入位置、缓存使用条件与未解析部分。 +- **副作用与失败**:不运行检查器、解析构建模型的项目脚本、下载或安装;没有运行过就不给虚构耗时和命中率。完整返回含 blocker 的计划可以 exit 0;必要输入损坏、读不到可信策略为 3。 +- **下一步**:doctor 恢复前置条件,再执行对应检查。执行时重新核对输入身份,不能直接使用过期计划。 + +当前相邻 Rust CLI 只实现 `plan_preview` 0.1:通过静态发现展示已观察的检查器配置、选中类别及待定候选;可信政策、工具锁与内容身份缺失时 `policy_identity=null`、`obligations=[]`,候选无执行命令,返回 3。它不是本节要求的正式计划或义务 DAG;见相邻 `codeguard-cli/tests/acceptance/plan-readonly-preview.md`。 + +### C07 — doctor + +- **语法与价值**:`codeguard doctor [language|all] [path] [--format human|json]`;省略语言为 all,定位工具链、配置可加载性和执行环境问题。 +- **输入与结果**:依据适用检查义务诊断必需运行时、制品、目标版本、权限、必要环境变量是否存在、漏洞库身份/时效及离线能力,返回 PrerequisiteReport 和结构化恢复动作。 +- **副作用与失败**:只执行适配器声明、已解析身份、预算内的诊断命令;不得把任意项目 script 的 `--version` 当无副作用操作。需执行项目控制逻辑而缺少明确执行范围时标未完成,不隐式构建、安装或启动服务。默认不远程连通性探测、不读取凭据值。 +- **下一步**:必需项缺失/未知为 3,可选工具缺失不误阻塞;生成可供 sync 消费的准备证据。恢复环境后重新 doctor,并运行原来被阻塞的检查;doctor 通过不证明源码质量通过。 + +当前局部实现:`doctor [path] --ruff-tool ABS_PATH` 仅支持显式 Ruff 版本诊断及静态配置观察。0.2 报告在已绑定工作区自动保存并同步环境调查任务;未选择工具不产生缺失任务,版本恢复不自动关闭原任务。落盘 queued 报告保持不可变,对话另显示同步状态。`task verify` 已接同一局部版本诊断和摘要绑定事件,`next` 能解释恢复但策略未核验;可信必需项/全工具准备报告及正式关闭仍未接通,不能将该切片当成上面的完整命令能力。 + +### C08 — rules list + +- **语法与价值**:`codeguard rules list [path] [--format human|json]`;显示此项目有效规则及解释,避免只看规则名称猜检查内容。 +- **输入与结果**:读取 rulepack/工具锁、批准策略和原生配置,列出 Codeguard/native rule ID、来源版本、类别、严重度、适用条件、规则依据、修复指引、已批准 suppression/例外及原因。 +- **副作用与失败**:只读。动态条件未解析时标候选;不能凭名称宣称已执行 P3C。关键规则包缺失或摘要错误为 3,完整视图可带不适用规则而 exit 0。 +- **下一步**:config explain 解释来源冲突,plan 显示规则实际绑定的检查任务;本命令没有 enable/disable/approve 副作用。 + +当前局部实现:Rust `rules list [path] --format human|json` 已复用静态发现,分别展示检查器配置声明、内置 Ruff F401/E501 候选映射的版本/来源/许可/摘要,以及逐语言六类规则目录缺口。Node 检查器明确归属旧登记中的 TypeScript 生态。即使 Ruff 配置为 configured,具体规则启用仍 unverified、执行 not_run、批准 unverified;动态 ESLint 配置不执行。项目内同名 rulepack 或 approved 字段不能替换内置映射。报告0.1固定 incomplete/退出3、gate_effect=none;不是完整项目有效规则集合。可信工具锁/政策、各生态完整目录、原生逐文件有效配置、suppression及已批准例外解释仍待接入,4.7保持未完成。 + +同属 C08 的 `codeguard rules whitelist list [path]`、`explain [path]` 为只读查询;`propose [path] --format json` 仅在本轮完整原生身份可核验时生成含精确身份、复现依据、期限建议的候选,不写有效政策或自批。当前 `propose` 0.3 只实现证据预览:从最新已同步且源码、配置仍匹配的 Ruff 报告显示本地观察到的工具/配置摘要、原生工具版本与 F401/E501 的候选规则映射摘要;报告未同步、损坏或原问题消失时不沿用旧证据。它返回原工具复检命令、仍缺的**已批准**规则包身份和 `candidate=null`,不能生成可审批文件。候选、已批准、过期、失配分别展示原因;批准引用及真实生效范围由 `config validate/explain` 核验。设计见 [误报白名单](false-positive-allowlist.zh-CN.md)。 + +### C09 — config validate + +- **语法与价值**:`codeguard config validate [path] [--format human|json]`;在昂贵检查前发现配置错误和未经允许的策略弱化。 +- **输入与结果**:校验 codeguard.json、lock、被引用的规则和原生配置的 schema、类型、引用身份、版本兼容及批准策略约束;返回逐路径/字段的诊断。 +- **副作用与失败**:不修配置、不把旧未知字段静默丢弃、不运行构建;静态无法完成的动态配置验证明确未完成。无效配置、必要引用缺失或未获批准的覆盖为 3,不报告源码违规。 +- **下一步**:根据 config explain 的来源定位修复。结构正确不证明策略修订已获批准,也不证明原生检查器确实加载规则。 + +### C10 — config explain + +- **语法与价值**:`codeguard config explain [path] [--format human|json]`;回答“为什么这项规则或范围生效”。 +- **输入与结果**:返回每项运行参数、质量策略、工具锁和原生配置值的来源、覆盖关系、批准依据、拒绝的覆盖及 suppression 差异。凭据值脱敏,只展示引用名称。 +- **副作用与失败**:只读。无法解析某层时给出可用的部分来源及 3,不能把默认值冒充最终有效值;已完整解释现存待办不等于修改配置。 +- **下一步**:修复错误配置或提交具体的政策变更需求;Codeguard 不让智能体通过改任务文件完成政策批准。 + +### C11 — tools list + +- **语法与价值**:`codeguard tools list [path] [--format human|json]`;对照项目工具锁显示必需/可选工具、版本约束、受管缓存及项目/系统候选。 +- **输入与结果**:静态读取锁和库存,区分声明、已找到、未找到、尚未验证。未初始化项目仍可读取合法 codeguard 配置;缺少锁就明确声明“仅候选库存”。 +- **副作用与失败**:不执行候选二进制、不下载、不选择较宽松版本。库存完整显示缺工具可 exit 0;库存必要元数据不可读为 3。 +- **下一步**:tools verify 证明制品身份,doctor 判断能否运行,tools install 安装明确锁定的缺项。 + +当前局部实现:`tools list [path] [--tool-lock-candidate FILE] [--managed-cache ABS_PATH] [--runtime ID=ABS_PATH] [--format human|json]` 复用静态制品核验,列出声明版本、适配器/规则来源、独立运行时/工具包及当前平台缺口。其它平台保留声明但不检查制品。输出固定 `inventory_scope=declared_lock_only`、`required_inventory=unverified`、`required_by_policy=null`、readiness unknown 与退出 3;不是完整受批准必需库存,不启动/安装/写工作区。 + +### C12 — tools verify + +- **语法与价值**:`codeguard tools verify [path] [--format human|json]`;验证工具锁要求的实际制品、规则包及声明运行时身份,防止 PATH 漂移。 +- **输入与结果**:逐项核验版本元数据、平台、摘要、允许来源和可信发行证明;返回匹配、缺失、不兼容或篡改证据。只核验代码字节和元数据,不执行待核验项目脚本。 +- **副作用与失败**:不下载安装;必需锁缺失或任一必需项不匹配为 3。工具身份一致不证明工具可启动或规则实际执行。 +- **下一步**:缺制品用 tools install,身份正确但运行条件不明用 doctor。不能静默降级到随机系统版本。 + +### C13 — tools install + +- **语法与价值**:`codeguard tools install --lock PATH [--dry-run|--apply] [--format human|json]`;省略模式为 dry-run,统一补齐已选定且可校验的工具链。 +- **输入与结果**:精确工具锁和实际平台生成下载/安装清单,包括来源、摘要、目标目录、预计副作用及不支持项;apply 返回逐工具安装及验证状态。 +- **副作用与失败**:dry-run 不联网安装;apply 才下载至受管临时位置、校验后逐制品原子发布并再次验证。不能写全局 PATH、自动提权或通过任意安装脚本接管系统;需要特殊安装程序时返回单独准备动作。锁本身必须来源可信,任意 URL+自写摘要不是授权。 +- **下一步**:部分失败为 3并保留已验证的安装结果;不得留下冒充可用的半成品。随后 doctor 确认项目可使用它们;check/doctor 不隐式调用此写入操作。 + +当前局部实现:`tools install --lock FILE [path] [--dry-run|--apply]` 共用声明库存/制品观察,默认预览。候选计划列出摘要、缺口、平台及恢复动作;可信锁/发行来源未绑定时 apply 返回 blocked_before_mutation、writes_performed=false 和退出 3,不调用发布 API。完整可信下载/发行包/正式 apply 尚未实现。 + +## 4. 原生质量检查命令 + +以下六条共享语法:`codeguard [path] [--format human|json|sarif] [--output PATH] [--jobs N] [--timeout DURATION] [--offline]`。共享执行链为:建立义务 → 冻结内容 → 核验政策/工具 → 执行 DAG → 专用解析与覆盖核验 → 报告。全程不修改真实源码或 index,不自动同步 tracked 任务。 + +### C14 — lint + +- **价值与范围**:执行已批准的编码规范、格式检查及一般静态质量规则。例如 Java 官方 P3C/PMD 与 Checkstyle 分开登记;格式器只有经验证的只读 check/diff 模式才计入相应能力。 +- **输入与输出**:依据语言版本、模块、source set 和原生配置选择兼容适配器;每条 finding 保留 native rule ID、位置、规则依据和证据。相同原生执行可供其它类别取证,但不能凭类似文案随意去重。 +- **失败与后继**:违规为 1;缺配置、解析失败或工具崩溃为 3,不能让通用 error 字样决定违规。转 work sync/next;支持确定性原生修复时再 fix。 + +当前 Rust `lint python` 局部实现仍固定退出 3;已初始化项目在原生 Ruff 扫描后自动保存 0.8 本地报告、同步,再把 `next` 只读简报嵌入公开对话反馈 0.10。完整文件携本轮工具与配置摘要、逐文件原生设置、F401/E501 候选规则映射及 `--ignore-noqa` 对照观察。仅被源码注释抑制的文件标记 `suppressed`,不标普通 `passed`;对照差额独立于活动 finding,不会自成白名单或门禁。规则是否全局启用及逐文件配置忽略可见,但受批准规则集合与完整覆盖仍未核验,固定 `coverage_proven=false`。同步或简报读取失败分别标明状态,原生诊断仍展示。这不等于 C14 的完整类别门禁或插件宿主接线。验收见相邻 `codeguard-cli/tests/acceptance/{lint-python-auto-brief,ruff-observed-artifact-identity,ruff-rulepack-observation,ruff-effective-settings-observation,ruff-native-suppression-observation}.md`。 + +Rust CVE 局部入口 `codeguard cve rust [path] --cargo-audit-tool ABS_PATH --db ABS_PATH [--timeout 30s] --format json` 只调用显式原生 `cargo-audit` 与显式离线 RustSec 数据库,不隐式下载。它核对原生漏洞与本轮 `Cargo.lock` 的精确包名、解析版本、来源及校验和;私有来源只显示摘要。`check all [path] --cargo-audit-tool ABS_PATH --rustsec-db ABS_PATH` 现将同一局部观察作为独立的 `rust.cve` 节点,向 JSON、human 与 SARIF 反馈 advisory 和未完成原因。原生 JSON 即使报告零漏洞,若数据库提交/更新时间缺失或来源时效未经可信边界核验,反馈仍为 `database_freshness=unverified`、`not_evaluated`、退出 3。此入口尚未完成正式策略、全构建组合、稳定任务与复检、白名单生效;也不检查 yanked 包。验收见相邻 `codeguard-cli/tests/acceptance/cargo-audit-native-observation.md` 和 `check-all-cargo-audit.md`。 + +当前另有 `codeguard lint go [path] --go-tool ABS_PATH [--timeout DURATION] --format human|json` 的局部入口,显式调用 Go 1.23.4 原生 `go vet -json ./...`。Rust 清空继承环境并关闭模块网络/工具链自动下载,使用私有 Go 缓存,执行前后核对工具、`go.mod`、可选 `go.sum` 和已发现源码的内容摘要。对话反馈展示原生规则与行列,不把原生消息文本当作指令;原生 JSON 中违规即使退出 0 也不会被判为干净。工具缺失、版本不符、编译错误或坏报告保持未完成。所有结果固定退出 3、`delivery_decision=not_evaluated`、`coverage_proven=false`;已接入 `check all` 局部汇总;已自动保存并同步本地任务,next 提供 Go 环境/源码指引;task verify 已支持 Go 原工具局部复检;尚缺正式关闭/重开、受批准工具锁/策略和 Go 注释检测。见相邻 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 +当前局部入口逐一进入已发现的 Go Module 根运行 vet,并在 0.6 反馈中列出每模块状态;某模块失败时保持未完成,已完成模块的本轮 finding 仍显示。原生诊断若指向未纳入本轮源码发现的文件或归属别的模块,则该模块未完成;源码、各模块清单或工具在执行中变化则丢弃本轮 finding。多模块运行仍未证明 build tags、平台/CGO 组合或受批准的全项目覆盖。 + +当前 `check all/java` 增加 `--format sarif` 的局部输出:从同轮 `check_feedback` 或 `check_aborted` 读取已观察的原生 finding,保留未完成状态与非零退出码,公开结果只给散列身份和固定提示,不复制原生诊断文本、路径或证据。零 finding 仍为 `executionSuccessful=false`,不能视作通过;未归属 CVE advisory 和依赖图节点不伪装为已确认 finding。其 JSON/SARIF 局部报告也可使用 `--output PATH` 同目录暂存与原子写入;写入失败后 stdout 仍保留报告,并以受限原因码标明 `export.status=failed`,不会覆盖已有源码文件。成功文件与 stdout 均标记 `saved`;未请求导出标记 `not_requested`。当前局部反馈协议为 JSON 0.22/故障 0.4,SARIF 在 run 属性中保留同义导出状态。human 和其它检查类命令尚无导出入口。它不等于完整 RunReport 或可信交付认证,见相邻 `codeguard-cli/tests/acceptance/check-partial-sarif.md`。 + +当前另有 `codeguard lint java FILE --maven-tool ABS_PATH --java-home ABS_PATH --maven-repo ABS_PATH --repo-sha256 SHA256` 单文件局部入口。Rust 在私有临时项目离线调用 Maven PMD 3.11.0 与 P3C 2.1.1 的固定命名规则集;原生违规在 human/JSON 对话反馈中展示规则及位置,缺报告或执行故障不被解释为源码违规。干净 XML 没有文件覆盖证明,因此显示 `clean_scope_unproven` 而非 PASS;工具/策略批准和完整 Java 义务未绑定,固定退出 3。真实违规与干净样本见相邻 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`。这不是 C14 目标的目录/模块级执行,也不替代 Java Checkstyle、Javadoc、CVE 或安全检查。 + +### C15 — comments + +- **价值与范围**:验证公共 API 文档覆盖、参数/返回/异常标签、链接与语法等可确定规则;按目标语言区分继承文档、生成代码、宏/注解生成成员。 +- **输入与输出**:规则包声明哪些源集、可见性及文档义务适用;用原生文档工具或有验收证据的 AST 检查器取证,输出违反的具体文档契约。 +- **失败与后继**:没有适配器是能力缺口,不等于“不需要注释”。纯主观文风意见不直接形成阻断发现;修复应补足真实语义,不能生成空话注释来骗覆盖率。之后原 comments 工具复检。 + +当前Rust局部入口:`comments rust [path] --cargo-tool ABS_PATH [--timeout DURATION] --format human|json` 使用共享runtime执行原生锁定离线库目标探针,绑定清单/锁/已发现源码/工具并复核原生目标;缺工具、坏报告或输入变化为未完成,取消优先返回130。反馈0.4绑定原生UTF8源码范围,行移动不按序号替换候选身份;重复声明归属不明时保留歧义观察、不分配正式ID。逐发现增加七项修复简报:证据、规则依据、修改范围、步骤、原工具复检、未接通的历史状态和关闭条件;完整局部观察给限定源码指引,输入变化或歧义只要求调查/重扫且修改范围为空。给出规则/位置及原工具复检,coverage_proven=false、交付not_evaluated。已初始化工作区自动保存绑定报告并同步稳定问题、任务及观察,重复扫描不重复建任务;输入失配、歧义或原生未完成生成准备任务。next识别文档任务并指向task verify;同轮普通/force-warn原生对照分别核验范围、指纹和唯一输入归属,区分问题仍在、抑制待审及待策略核验的缺失候选,记录复检事件和关联尝试,任务仍open。源码allow可能隐藏诊断,零诊断不算修复或批准例外。原项目生效规则、完整构建组合、正式关闭重开和宿主仍缺;7.1不勾选。验收见相邻codeguard-cli/tests/acceptance/rust-comments-cli.md。 + +### C16 — cve + +- **价值与范围**:审计项目真实依赖图的已知漏洞,覆盖策略规定的直接/传递、运行/开发/构建依赖范围,不审计宿主恰好安装的无关包。 +- **输入与输出**:清单、锁、可证明的解析图和有身份/时效的漏洞库;结果包括生态、组件版本、advisory、依赖路径、原生严重度、修复版本信息及匹配确定性。 +- **失败与后继**:网络、库过期、版本解析或匹配不确定为 incomplete并保留已确认发现,不虚构 CVE。离线同样核验库新鲜度。依赖升级由独立 fix 计划或任务处理,升级后的 CVE 与受影响构建必须复检。 + +### C36 — dependencies + +- **价值与范围**:对每个构建根识别依赖图、版本、许可证、SBOM 和来源检查的配置;运行已配置且可用的原生检查器。未配置项给出建议,不因候选目录中有该检测族就自动要求执行。此命令不能据此宣称无 CVE。 +- **输入与输出**:锁文件、构建配置和经受控解析的 effective graph;结果逐检测族保留组件坐标、解析路径、scope、规则身份和来源证据。不同构建根与源集不能由主语言的一个清单代替。 +- **失败与后继**:动态版本、私服不可达、父 POM 缺失、图不完整或报告范围未知为 incomplete。已确认的版本或许可证问题仍保留,修复后由原生工具复检依赖、CVE 和受影响构建。 + +### C17 — security + +- **价值与范围**:执行源码安全、配置/IaC、secret 内容及入库路径规则;不同规则具有不同的证据与扫描边界。 +- **输入与输出**:源内容、配置和可信规则包,报告缺陷位置或脱敏敏感证据;命中 `*.pem` 等禁止入库路径只能称 repository_policy_violation,不能仅凭文件名断言泄露私钥。 +- **失败与后继**:原生语义不明确或覆盖不足为 3。点路径、受管记录、生成文件不能成为入库安全逃逸位置;scope 必须按该类政策计算。任务引导修补漏洞/移除敏感内容;如需外部凭据轮换,明确恢复步骤,不把删除字符串称为已轮换。 + +### C18 — build + +- **价值与范围**:验证依赖解析、编译、类型、打包和明确要求的生命周期检查,发现单文件 lint 无法证明的模块兼容问题。 +- **输入与输出**:构建根、wrapper、目标运行时、profile/feature/target 和可信命令配置,返回逐阶段结果与 build_level、test_execution。保留已确认的静态构建默认;策略要求测试时必须执行。 +- **失败与后继**:有可信编译诊断的源码错误可为 finding;磁盘不足、缺 JDK、下载失败是环境未完成。原生构建成功不能证明全部质量规则加载或测试已执行;无法核验阶段覆盖仍为 3。构建计划影响闭包决定修复后复检范围。 + +当前 `build rust [path] --cargo-tool ABS_PATH` 只实现锁定、离线、全部目标且默认 feature 的原生 Cargo 类型检查;报告明确 `build_level=type_check`、`test_execution=false`。已初始化项目将可归属编译错误及缺工具等环境阻塞同步到稳定任务,`task verify` 调用同一 Cargo 复检,零诊断仍需核对策略与覆盖。完整 workspace、feature/target 组合及测试义务尚未建立,不签发构建通过或交付允许。 + +### C19 — check + +- **价值与范围**:探测 lint/comments/dependencies/cve/security/build 的项目配置,组合已配置检查器与批准策略明确要求的检查;统一解决多工具启动、依赖顺序和结果聚合。 +- **输入与输出**:逐项返回 `configured/missing/invalid/unknown`,已配置项附本次原生诊断或工具故障。候选目录不自动变成全量义务;策略必需项单独标注。宿主将结果摘要、位置或组件、修复建议及复检命令呈现在智能体对话。 +- **失败与后继**:相互独立的检查继续收集证据;依赖失败的检查明确 incomplete,不跟着消失。mixed finding+missing tool 返回 3且保留二者。`check java` 只报告该语言;初版只有 `check all` 评估全项目交付 contract。 +- **下一步**:独立 CLI 保存运行报告后可 work sync;已启用插件自动 sync并返回简报。工作树 allow 有内容与政策身份,不等于允许不同 index/ref 提交。 + +当前局部实现:`check java [path]` 已复用 `check all` 的 Java/P3C 原生节点、工作区同步与 Java 任务简报;即使混合项目中存在 Python/Rust 源码,也只调度 Java 节点。`check_feedback` 0.22 对 `selection=java` 固定 `delivery_decision=not_evaluated`、退出 3,缺 Java 目标不作为通过。完整 Java 检查器集合、可信必需义务、工具/规则批准与交付聚合仍未接通。 + +`check all` 的 Rust 节点已在同一任务图和预算内分别调用原生 Cargo check、Clippy 和 rustdoc。类型错误只进入 `rust.cargo_check` 的构建观察和稳定任务,不混作 Clippy/注释违规;缺工具、坏报告、输入变化、超时或取消保留原生结果和具体未完成原因。对话同时展示原始发现及下一步,旧有 Clippy 任务仍优先呈现,构建任务可由 `next` 单独读取。反馈协议 0.28 增加严格的 `rust_build` 字段;任务同步不代表完整构建覆盖或交付门禁已通过。 + +## 5. 交付门禁命令 + +gate 与 check 使用同一个义务/适配器/报告内核,差异是权威内容来源、入口输入与可信政策上下文。严格交付中 deny/incomplete/internal_error/cancelled 均不能放行;真实 Git Hook 将非零映射为拒绝,宿主 Hook 依宿主协议转换,不能直接透传 CLI exit=2。 + +### C20 — gate pre-commit + +当前 Rust 二进制只接入真实 index 的**路径安全预览**,可用 `--git-tool ABS_PATH` 指定 Git;它返回 3/incomplete/not_evaluated,报告尚未核验工具、对象内容或完整质量义务。下列是完整目标契约,不能用预览结果代替正式 Git Hook 门禁。 + +- **语法与价值**:`codeguard gate pre-commit [path] [--format human|json]`;核验将要提交的真实 index,避免工作树修好但暂存区仍旧错误。 +- **输入与结果**:尊重 Git 工作目录、GIT_INDEX_FILE、部分暂存、初始提交与文件删除,冻结 tree/对象身份并执行完整交付 contract,返回 index 来源的 GateReport。 +- **副作用与失败**:不 git add、不 stash、不覆盖用户 index;冲突条目、无法物化的必要对象或输入并发变化为 3。输入不是 Git 仓时不向上层工作区回退。 +- **下一步**:失败说明具体源码任务或环境恢复动作;修复并按用户意图暂存后重跑。通过收据仅绑定被冻结的 index,不能防止 hook 之后任意外部修改;交付端须核对最终内容。 + +### C21 — gate pre-push + +- **语法与价值**:`codeguard gate pre-push [path] --remote-name NAME --remote-url URL [--format human|json]`;stdin 为 Git 提供的 local-ref/local-OID/remote-ref/remote-OID 元组。 +- **输入与结果**:CLI 先完整读取并验证输入,再将不可变推送集合交给 core;覆盖多 ref、非 HEAD 分支/标签、删除 ref和新 ref。remote URL 只作为上下文,不触发推送且公开输出脱敏。 +- **副作用与失败**:不 git push、不默认 git fetch、不把 stdin传给探测器;本地缺必要对象时 3。每个新增/更新 ref 的全量义务保持,不用 HEAD 成功替代。删除 ref 显式记录不适用;全部删除不能签发源码质量 allow。 +- **下一步**:修复实际被推送内容后重跑;真实 Hook 接线需原样传 remote 参数和 stdin。stdin缺失不能退化成检查 HEAD。 + +### C22 — gate ci + +- **语法与价值**:`codeguard gate ci [path] --input PATH [--format human|json]`;用版本化请求文件明确 CI 本次认证的内容集合,避免 merge result 与分支头混淆。 +- **输入与结果**:输入包含 schema_version、仓库身份、一个或多个不可变 commit OID、用途与预期内容来源;符号 ref仅作描述,不替代 OID。文件不授予政策权威,可信策略/工具锁由受保护接入独立提供。 +- **副作用与失败**:不提交、不合并、不发布;无效参数 schema 在执行前为 2,无法获取必要对象/可信策略/执行隔离条件为 3。项目脚本不能改写可信验证器或最终状态凭据。 +- **下一步**:按每个内容项和完整义务生成 GateReport;只有全部满足才 allow。失败把修复信息交回插件/CI展示;本地可写任务或缓存不能单独签发可信 CI 成功。 + +## 6. 问题工作区与协作命令 + +### C23 — work sync + +- **语法与价值**:`codeguard work sync [path] [--format human|json]`;将原始运行结果转为稳定、可恢复的问题与任务。 +- **输入与结果**:消费匹配工作区的全部未导入 RunReport/准备证据,逐项验证 schema、内容/规则/工具/政策/范围身份;返回导入、重复、历史、拒绝、问题新增/更新/重开/关闭计数及游标。 +- **副作用与失败**:按 run_id幂等追加脱敏事件、重建任务投影并更新本地消费状态。旧报告只能进入历史,部分检查不按“没出现”关闭问题。单份报告事件提交与已消费标记形成可恢复事务;失败不能先推进游标丢掉事件,其他有效报告可先完成。 +- **下一步**:next 获取动作。坏报告/存储失败返回 3并保留原始证据;再次执行从未完成单元恢复。同步成功不说明 backlog 已清空,也不重新计算质量 gate。 + +当前 Rust 局部实现消费已初始化工作区的 Python Ruff 本地报告 0.4/0.5/0.6/0.7/0.8;0.5 起对完整文件要求工具与配置摘要,0.6 对映射的 F401/E501 另外核验候选规则包身份与摘要,0.7 要求原生设置观察,0.8 再要求注释抑制对照且禁止把 `suppressed` 当 `passed`。缺字段、伪造覆盖或结构矛盾拒绝导入,旧报告不倒填身份。公开输出为 `work_sync_preview` 0.2,固定退出 3/`not_evaluated`。本地 Ruff 扫描已自动保存并同步,创建 finding 或环境 blocker、观察事件及任务,重复发现不改 tracked 任务;其它类别报告、关闭/重开、完整游标事务仍按上面的目标契约实施。`next` 已有只读局部简报预览,见 C25。 + +### C24 — status + +- **语法与价值**:`codeguard status [path] [--format human|json]`;快速判断项目现在卡在哪里。 +- **输入与结果**:只读汇总 initialized、画像 freshness、必需前置条件、最近运行的身份/覆盖、待导入报告、finding/blocker/任务状态、租约及冲突。 +- **副作用与失败**:不 doctor、不扫描、不 sync、不修改状态。可返回“未初始化”或“还有10项问题”并 exit 0;无法读取可信视图时 3。 +- **下一步**:返回精确缺项:先 init、先同步、先恢复环境、继续 next 或需要完整检查。历史 allow 必须标明证据来源及是否仍匹配,不能作为当前绿色徽标。 + +当前 Rust CLI 的局部只读视图已列出已初始化工作区的开放 finding/blocker 数量、每项受限摘要与 `next` 建议;待同步报告单独标识,空任务仍要求验证。画像及检查证据的新鲜度固定未核验,不展示历史通过。租约冲突、完整依赖、已关闭状态及历史 gate 收据仍待实现。 + +### C25 — next + +- **语法与价值**:`codeguard next [path] [--format human|json]`;选择一个能够推进工作的动作,返回理由和 RepairBrief。 +- **输入与结果**:依据任务依赖、严重度、准备状态、有效租约、动作历史与预算。优先解除影响多项检查的前置阻塞,但严重问题始终可见。返回 `disposition=actionable|waiting|needs_decision|verification_required|no_applicable_work`。 +- **副作用与失败**:不领取、不运行动作、不更新过期状态;只做只读推导。无可行动任务与“全部通过”不同:全部被租用返回 waiting,预算耗尽返回具体决策,任务空但缺新鲜完整检查返回 verification_required。未初始化返回初始化动作/临时简报。 +- **下一步**:actionable给出允许范围、规则证据、步骤、历史和复检条件;执行者另行 claim。只要完整回答就可 exit 0,不得让插件把 null task解释为允许交付。 + +当前 Rust 局部实现提供 `repair_brief_preview` 0.1:从 Ruff finding/blocker 记录生成静态有界简报,未同步报告先提示 sync;空任务返回 verification_required,缺配置与缺工具分别返回 needs_decision/actionable。任务 Markdown 不作为指令来源。Unix 本地实现还会展示受控 `action_id`、最近五次尝试、未结束尝试及同输入动作的无进展计数;预算耗尽后转 `needs_decision`。所有视图仍是 `local_unverified`/`not_evaluated`。完整依赖、可信策略新鲜度、跨类别选择与跨平台租约仍待实现;验收见相邻 `codeguard-cli/tests/acceptance/next-local-brief-preview.md` 和 `task-attempt-local-ledger.md`。 + +局部 `task verify` 新增原生 Ruff 复检观察事件后,`next` 会核对事件与保存的原生报告:已消失的问题转为待策略核验;源码变化后仍存在的同一问题,只有报告里的目标源码摘要仍与当前文件一致,才重新成为可执行任务,并展示复检 run/report 引用。源码再次变化会恢复待复检状态。Rust Clippy 任务也已复用租约、原工具复检与事件核对;仍有同一发现时保持待修复,零诊断时用同工具的原规则 `--force-warn` 作原生对照;重现诊断则核查抑制,两轮都未检出也仅作待策略核验候选,环境恢复也仅为待策略核验。`task attempt start` 拒绝非 actionable 简报,防止绕过复检直接重复修改;这些观察不构成正式关闭或 gate 放行。 + +### C26 — task show + +- **语法与价值**:`codeguard task show [path] [--format human|json]`;读取指定任务的完整修复上下文。 +- **输入与结果**:稳定 issue、事件父关系、当前内容/政策身份和可重建投影,显示证据、状态、允许修改范围、依赖、尝试、关闭条件和租约。 +- **副作用与失败**:不信任 Markdown勾选;任务不存在、事件链损坏或作用区不符返回 3,ID语法错误返回 2。resolved任务也保留历史和 freshness。 +- **下一步**:claim后按简报修复,或原工具 verify;不能通过 show执行仓库诊断中的命令。 + +当前 Rust CLI 局部实现从结构化 fact 与最新复检事件生成 RepairBrief;任务 Markdown 只检查存在,不作为行动指令。非法 ID 返回 2,缺失或受限事实损坏返回 3;完整事件父关系、可重建投影和已关闭任务历史尚未验收。 + +### C27 — task claim + +当前相邻 Rust CLI 在 Unix 实现了本地 `claim/heartbeat/release` 0.1 切片:按稳定任务 ID 锁定工作区状态,随机 token 仅返回给领取者,状态仅保存 SHA-256;同一 owner 不能复用旧 generation 的 token,并发领取只有一个成功。未结束尝试阻止正常 release;过期接管会先写入 `abandoned` 结束事件,失败则不换 generation。成功仅表示本地协作操作完成,`delivery_decision=not_evaluated`。跨平台实现、verify/fix 租约绑定及完整事件事务仍须完成,不作为 C27–C29 全量验收。 + +- **语法与价值**:`codeguard task claim [path] --owner ID [--format human|json]`;防止同工作区两个执行者同时修同一任务。 +- **输入与结果**:在跨进程锁下核对任务、前置状态与租约,返回不可复用的 lease_token、generation、expires_at和当前任务身份;owner是审计标签,单凭同名 owner不能操作新租约。 +- **副作用与失败**:正常领取只更新本地 state。有效租约已存在为 3并返回等待信息,不强抢;过期租约若有未结束attempt,须先在可恢复事务中追加abandoned事件和预算记录,再换新generation。恢复存储失败返回3,不先取得新租约后假定历史已经补齐。 +- **下一步**:携带token调用 heartbeat/attempt/release;租约不授权修改超出简报的源码,更不授予策略变更权。跨机器全局独占不在初版保证内。 + +### C28 — task heartbeat + +- **语法与价值**:`codeguard task heartbeat [path] --owner ID --lease-token TOKEN [--format human|json]`;续租当前仍有效的任务占用。 +- **输入与结果**:锁内核对 token/generation、owner、作用区与到期条件,返回新的 expires_at。续租周期由工作流运行配置给出,不由质量阈值推导。 +- **副作用与失败**:只改state。失效token、已过期/已替换租约返回 3,不能复活旧持有者;调用方停止继续写入,重新读取任务状态。 +- **下一步**:继续当前有界尝试。heartbeat只证明协作存活,不能重置无进展预算或延长无限重试。 + +### C29 — task release + +- **语法与价值**:`codeguard task release [path] --owner ID --lease-token TOKEN [--format human|json]`;显式结束占用,允许下一个执行者接续。 +- **输入与结果**:验证当前租约并返回释放状态;相同已完成释放请求可幂等重放,新租约存在时旧token不能释放它。 +- **副作用与失败**:不关闭问题、不删除attempt。存在未finish尝试时正常release返回 3,要求先记录失败/blocked等真实结尾;崩溃后的到期恢复将其记abandoned。 +- **下一步**:next继续其他任务或等待。release成功不证明修复完成。 + +### C30 — task attempt start + +- **语法与价值**:`codeguard task attempt start [path] --owner ID --lease-token TOKEN --action-id ID [--format human|json]`;在实际修复前记录本次准备尝试什么。 +- **输入与结果**:action-id来自RepairBrief的受控动作/recipe标识;自由代码修复使用明确的manual-code-edit动作类型并引用任务允许范围。CLI观察前置内容和环境证据,生成attempt_id、动作指纹、前置摘要及可用预算。 +- **副作用与失败**:追加开始事件;同任务只能有一项未结束尝试,过期租约、范围不符或相同动作预算耗尽返回 3。动作ID不可被调用方任意换名来重置预算,指纹由规范化动作、范围和输入决定。 +- **下一步**:执行该修复,再finish。失败发生在运行修复器之前也必须记入历史。 + +### C31 — task attempt finish + +- **语法与价值**:`codeguard task attempt finish [path] --owner ID --lease-token TOKEN --attempt-id ID --outcome --note-code [--format human|json]`。 +- **输入与结果**:精确匹配begin事件、作用区和租约,CLI观察后置内容/patch或相关环境探测证据;返回观察变化与执行者说明两份信息、耗用预算及下一步。 +- **副作用与失败**:追加结束事件、更新任务投影;同attempt同结果幂等返回,冲突finish返回 3。若结束收据已落盘,原请求的重放仅返回该收据,即便租约后来到期也不再写事件或改变新租约;不存在已结束收据时必须持有当前有效租约。ready-to-verify只表示可进入复检,不能写resolved;调用方说no-change但实际有变化时拒绝该结果并要求重新说明。 +- **下一步**:task verify取得证据。租约中断但尚未验证的修改保留,恢复协议记录abandoned及当前事实,不自动回滚别人修改。 + +当前 Unix 局部实现将 start/finish 写为 `.codeguard/findings//events/attempt-*.json` 不可覆盖文件,在同一任务锁内核对租约。`next` 展示受控动作和简短历史;同输入动作连续两次 `no-change/failed/blocked/abandoned`,或 `ready-to-verify` 后原检查仍显示问题/未完成,均计入无进展预算。`ready-to-verify` 必须先由原工具产生与该 attempt-id 绑定的可核对复检事件,下一次 start 才可继续;旧复检或丢失私有报告不能解除等待。环境修复不必通过源码改动证明进展。当前摘要只覆盖任务声明的源码/受影响路径,尚未绑定完整补丁、环境工具身份、正式 fix 服务及可信门禁;本地事件与退出 0 均不能关闭 finding。 + +## 7. 修复与复检命令 + +### C32 — fix + +- **语法与价值**:`codeguard fix [path] --category <--dry-run|--apply> [--task TASK_ID] [--owner ID --lease-token TOKEN] [--format human|json]`;调用已声明的确定性原生修复器,把可机械修复的问题安全落到代码。 +- **输入与结果**:真实发现、匹配的工具/规则/内容、允许修改范围和recipe形成FixPlan。dry-run可在私有隔离副本运行修复器以产生真实补丁,但不改变项目源码、tracked任务或尝试预算;不能运行的预览明确为计划而非已生成补丁。 +- **执行与副作用**:apply确认适用范围和前置哈希,已初始化时按同一租约/attempt协议登记,隔离执行→核对变化范围→逐文件安全应用→原工具及受影响义务复检→写尝试/验证事件。未初始化时保留私有操作证据和临时简报,不声称产生持久任务。 +- **任务绑定**:`--task`将修复限定到该任务允许范围;它的语言/类别须与请求匹配。已有claim时必须同时传owner和token,复用租约但不接管已有未结束attempt;FixService登记自己的受控attempt,结束后不释放调用方租约。未持有租约时可只传task,由服务自行claim并在收尾时释放。已初始化且无task的批量apply先同步所用发现、映射受影响任务,并在同工作区事务中取得全部所需租约;任何冲突在应用补丁前返回3,不能悄悄跳过被占用任务。未初始化路径仅保留私有证据,不调用持久同步或任务租约服务;此时指定task须返回workspace_not_initialized。owner/token参数成对出现且要求task;dry-run只读任务,不领取或消耗预算。 +- **失败与后继**:没有原生修复能力返回3及人工修复简报;不偷偷让模型改代码或转成关闭规则。并发修改、越界补丁、部分应用、复检超时分别记录;多文件写入不伪称全原子。只回滚自己拥有且未被后续改动的内容。 +- **成功定义**:分别给出execution_succeeded、changed_files、verification和resolved_issue_ids;修复器exit0或无变化都不能得到fixed=true。存在其他必需违规时保留它们;单项修复成功不授权完整交付。 + +### C33 — task verify + +- **语法与价值**:`codeguard task verify [path] [--owner ID --lease-token TOKEN] [--format human|json]`;判断指定任务的关闭条件是否真的满足。 +- **输入与执行**:依据issue、规则/工具/政策身份和影响闭包重建验证计划,冻结当前内容后运行原检查器。环境任务先验证恢复条件,再重跑原来受阻义务;探测到JDK不等于项目已能通过构建。 +- **协作与副作用**:无租约时使用短期验证租约;若已有租约则要求对应token,不能冒用owner。不修改源码,持久保存运行报告并幂等同步相关发现和验证事件;结束时只释放本次自行取得的验证租约。 +- **判定与失败**:完整证据确认解决才追加code_fixed/dependency_fixed/environment_restored等状态;目标删除和政策处置必须有批准且可核验的独立依据。仍存在为1;覆盖不足、工具不可用、并发变化为3。若原问题解决但复检引出其他违规,原任务可按证据关闭,新发现同步保留,命令仍按本次验证结果返回1/3。 +- **下一步**:next推进剩余任务;无剩余任务也须check all/gate完成交付检查。不提供task close --force。 + +当前 Rust 局部入口支持 `codeguard task verify [path] [--owner ID --lease-token TOKEN] [--ruff-tool ABS_PATH] --format human|json`,复用 `lint python` 的原生 Ruff 路径并追加本地观察事件。无现有占用时 CLI 领取本地短期租约并在结束后释放;已有占用时必须借用匹配的 owner/token,错误 token 或无凭据的冲突请求在扫描前返回 3。扫描与事件写入之间再次核对 generation/token/期限及待验证 attempt-id,失租或新尝试插入时不提交复检事件,借用租约始终保留给调用者。验证事件 0.3 记录 attempt-id 或 null;报告丢失时不能消费旧复检预算结论,须重跑原工具。它尚无可信策略、长操作自动续租、Windows 等价实现与正式关闭协议,固定返回 3/`not_evaluated`;即使原问题消失,也只产生待策略核验候选。见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`、`task-verify-lease-binding.md` 与 `task-attempt-local-ledger.md`。 + +## 8. 宿主入口与兼容命令 + +### C34 — mcp serve + +- **语法与价值**:`codeguard mcp serve`;初版通过stdio提供结构化工具入口,供支持MCP的宿主复用统一内核。 +- **输入与结果**:宿主工作区与每个工具请求映射为同样的项目、选择、内容和运行选项;具体MCP tool names/schema由S11锁定并生成映射表。旧MCP工具名只能使用显式版本化映射。 +- **执行与失败**:serve仅启动协议服务,不自动初始化项目、扫描或安装。读写行为遵循对应核心操作。单请求的1/3/4/130作为结果语义返回,不把每个检查失败变成服务器进程退出;协议非法参数用MCP适配层错误表达,不混进工具日志。 +- **下一步**:已启用工作流的MCP扫描请求走scan→sync→brief;独立低层执行请求明示是否同步。取消传播至同一进程/快照运行时;服务关闭回收自身请求,不清空用户任务。 + +### C35 — compat legacy-v1 + +- **语法与价值**:`codeguard compat legacy-v1 <旧子命令与参数>`;为旧宿主迁移保留明确版本边界。 +- **输入与结果**:按旧入口的逐项协议映射参数、退出码与字段,标明protocol=legacy-v1、实际runtime和未认证边界。不能用一张通用退出码表覆盖旧check/CVE等差异。 +- **映射依据**:[legacy-v1 逐入口协议表](legacy-v1-protocol-map.zh-CN.md)分别列出七类旧 CLI、四个 MCP 工具、五类 Hook 的数字、字段与混合优先级;Rust 参数契约不把兼容出口升级为交付 allow。 +- **副作用与失败**:保留的旧写行为须由对应旧动作明确触发;新入口失败不自动回退到此命令。缺兼容运行时说明未完成,不安装旧环境自救。 +- **下一步**:逐入口迁移到Rust标准协议并验收。旧成功不生成新交付allow,旧skipGate变量也不授权新入口跳过检查。 + +## 9. 内部应用服务与执行架构 + +```mermaid +flowchart LR + CLI[CLI 参数与格式] --> Request[类型化请求与来源上下文] + MCP[MCP 请求映射] --> Request + Plugin[插件工作流入口] --> Request + Request --> Catalog[发现 / 配置 / 规则 / 能力服务] + Request --> Init[初始化服务] + Request --> Scan[计划 / 检查服务] + Request --> Gate[交付服务] + Request --> Work[任务 / 修复服务] + Gate --> Scan + Work --> Scan + Init --> Catalog + Scan --> Ports[core ports] + Catalog --> Ports + Init --> Ports + Work --> Ports + Ports --> Runtime[runtime:观察 / 快照 / 进程 / 存储] + Scan --> Adapter[adapter:计划 / 解析 / 覆盖] +``` + +这是调用关系;编译依赖仍是CLI装配、runtime/adapters依赖core,core不导入基础设施。命令处理器只做参数转换、调用服务和输出映射,不能各自实现一套扫描或gate。 + +| 核心应用服务 | 命令 | 可复用能力 / port | +|---|---|---| +| CatalogService / ProjectObservationService | detect、capabilities、rules、config、tools list | Registry、ObservationPort、PolicySourcePort | +| InitializationService | init | 画像构造、OwnershipManifest、WorkspaceStore、受管文本合并 | +| PreparationService / ToolchainService | doctor、tools verify/install | ToolchainPort、ExecutionPort、ArtifactInstallPort | +| PlanningService / CheckService | plan、六类检查 | 义务账本、Adapter、SnapshotPort、ExecutionPort、EvidenceStore、CachePort | +| DeliveryService | 三个gate | 内容请求解析、可信策略、CheckService、完整性判定 | +| RemediationService / TaskQueryService | sync、status、next、show | 事件归并、修复简报、RemediationStore | +| TaskLeaseService / AttemptService | claim、heartbeat、release、attempt | 跨进程事务、租约generation、幂等事件、预算 | +| FixService / TaskVerificationService | fix、verify | 受控补丁、AttemptService、CheckService、验证事件 | + +这些是逻辑边界,不要求一条命令新建一个crate。实体、值对象和纯判定在core;I/O由ports注入;运行结果进入同一渲染与协议层。新服务名称不代表已有可编译实现。 + +### 9.1 插件自动闭环 + +```mermaid +sequenceDiagram + participant H as 宿主插件 + participant C as 核心工作流 + participant T as 原生工具 + participant S as 证据与任务存储 + participant A as 智能体 + H->>C: 已启用项目的检查请求 + C->>T: 冻结范围并执行适用检查 + T-->>C: 原始产物和终止状态 + C->>S: 保存RunReport + C->>S: 幂等同步全部匹配未导入报告 + alt 同步成功 + C-->>A: 检查结论 + RepairBrief + 下一步 + else 同步未完成 + C-->>A: 原结论 + backlog_update_failed + 恢复动作 + end + A->>C: claim / attempt start + A->>A: 按任务修复 + A->>C: attempt finish / task verify + C->>T: 原检查器及受影响范围复检 + C->>S: 追加证据事件 + C-->>A: 解决 / 仍存在 / 未完成 + next +``` + +插件调用同一核心工作流API,不必为每个步骤启动一次二进制,也不复制状态机。同步失败影响工作流完成状态,不能改写已取得的quality gate;因此可能同时出现“检查已得出明确结论”和“任务保存未完成”。严格交付如何显示宿主错误由入口协议处理,不能据存储失败假造源码违规。 + +### 9.2 并发、取消与恢复 + +- 查询使用一致性视图;写操作带工作区身份、对象版本/事件父关系和幂等键,避免读到一半的新状态。 +- lease_token包含不可复用的租约身份和generation。旧进程同名owner不享有新租约;失租后只能保留诊断,不能提交状态事件。 +- run_id导入、attempt结束、租约释放各自定义幂等域;“再次执行”不等于再次写一份相同任务或历史。 +- 取消传播到进程树和执行DAG。已完成证据保留,未完成部分明确标识;不能因为用户取消就删除finding或伪造finish成功。 +- 多文件应用、初始化、安装允许部分完成,但记录精确恢复位置。任何rollback都只处理本次拥有且未被别人改动的内容。 + +## 10. 典型调用旅程 + +### 10.1 首次接入 + +```bash +codeguard detect . --format json +codeguard capabilities java --format json +codeguard init . --dry-run +codeguard init . --apply +codeguard config validate . +codeguard plan check all . --format json +codeguard doctor all . --format json +# 仅在需要安装并具有对应授权时,使用实际工具锁路径执行以下两步。 +codeguard tools install --lock codeguard.lock.json --dry-run +codeguard tools install --lock codeguard.lock.json --apply +codeguard tools verify . +codeguard doctor all . +codeguard check all . --format json +codeguard work sync . --format json +codeguard next . --format json +``` + +这是顺序示意,调用方必须消费每步结果并处理失败,不能无条件执行整段。非安装问题按doctor给出的具体动作恢复;未满足必需前置条件不代表可以跳过检查。 + +### 10.2 智能体修复单项任务 + +以下ID/token是协议占位符,实际值取上一条JSON结果;插件实现使用结构化传参,不解析human文本。 + +```text +codeguard task show CG-abc123 . --format json +codeguard task claim CG-abc123 . --owner agent-session-1 --format json +codeguard task attempt start CG-abc123 . --owner agent-session-1 --lease-token --action-id --format json +按任务允许范围修复,长任务期间携带同一token调用heartbeat +codeguard task attempt finish CG-abc123 . --owner agent-session-1 --lease-token --attempt-id --outcome ready-to-verify --format json +codeguard task verify CG-abc123 . --owner agent-session-1 --lease-token --format json +codeguard task release CG-abc123 . --owner agent-session-1 --lease-token --format json +codeguard next . --format json +``` + +若采用`fix --apply`,在claim后调用`fix ... --task CG-abc123 --owner agent-session-1 --lease-token --apply`,由FixService登记受控尝试并复检,不再由插件为同一个原生修复重复start/finish。不要先创建未结束的自由修复attempt再移交给fix;外层回合可关联子attempt但不重复计数。原生修复未支持时使用上述自由修复路线。 + +### 10.3 交付 + +```text +本地修复完成 → check all(工作树证据) +用户选择暂存内容 → gate pre-commit(index证据) +实际推送ref输入 → gate pre-push(ref证据) +受保护CI指定不可变OID → gate ci(可信交付证据) +``` + +完整检查可以按严格身份复用有效执行结果,但每个入口重新计算自己的交付条件;不同来源的“通过”不能互相替代。 + +## 11. 实现追踪与验收标准 + +| 命令范围 | 对应规格 | 实现任务阶段 | +|---|---|---| +| C01–C04、C06、公共参数/输出 | unified-cli-contract、native-tool-adapters | S01、S02、S05 | +| C05 | project-initialization、remediation-workflow | S09 | +| C07、C11–C13 | native-tool-adapters、execution-kernel、unified-cli-contract | S05 | +| C08–C10 | rulepack-governance、unified-cli-contract | S04 | +| C14–C19 | unified-cli-contract、native-tool-adapters、verdict-integrity | S02、S06–S08 | +| C20–C22 | execution-kernel、hook-protocol、unified-cli-contract | S03、S11 | +| C23–C31、C33 | remediation-workflow | S09 | +| C32 | execution-kernel、remediation-workflow | S10 | +| C34–C35 | unified-cli-contract、hook-protocol、binary-distribution | S02、S11 | +| C36 | unified-cli-contract、native-tool-adapters | S02、S05、S06–S08 | + +所有命令都要验证:参数合法/非法、支持格式、退出语义、允许副作用和未初始化行为;有状态命令另测并发、取消、重放与恢复。重点反例: + +1. 查询next没有任务,但缺乏新鲜全量证据:必须返回verification_required,不能allow。 +2. plan列出缺JDK仍正常完成计划,doctor返回未完成:两者无矛盾,不能把plan exit0当就绪。 +3. tools身份验证通过,但JDK不能启动:doctor未完成,check不得假通过。 +4. lint与CVE先后产生报告:sync消费全部;重复sync不重复tracked事件。 +5. 旧租约失效后新执行者领取:旧heartbeat/finish/release不能修改新状态。 +6. 修复器exit0但无变化、部分应用后超时:不能宣称fixed=true或清空原finding。 +7. 原任务修好但引入另一违规:原问题按证据关闭,新问题保留,不能宣布全项目通过。 +8. 工作树通过但暂存区旧内容失败,或推送非HEAD分支失败:对应gate阻断。 +9. tools install默认预览不下载;显式apply部分失败后重试只处理未完成且身份匹配项。 +10. MCP某请求超时而服务仍存活:该请求结果未完成,不能以服务器活着证明检查成功。 +11. check得到真实违规但sync写盘失败:保留原违规,另报工作流错误和恢复动作。 +12. compat返回旧数字成功:新CI不能据此签发allow。 + +help、参数schema、命令矩阵、CLI/MCP映射与测试样本应由同一注册定义生成并检查漂移;各命令是否具备真实工具验收另行记录。本文完整不代表36项入口已实现,也不替代后续全部语言和平台验收。 + +Go 任务现可使用 `codeguard task verify ID [path] --go-tool ABS_PATH` 复用相同受控 vet,并沿用任务租约、尝试绑定、报告同步和追加事件。环境仍受阻、仍有原发现、同文件同规则身份变化以及无发现候选分别解释;同规则新指纹不能直接解释为原问题消失。源码任务的 Go 0.7 报告绑定 task/path/源码摘要、整组源码摘要、原生文件范围观察和稳定输入标记;任务复检反馈为 0.4,事件仍为 0.3。next 核对报告摘要并消费观察,源码或模块配置变化后要求复扫。无发现仅为待规则/平台覆盖与策略核验候选,任务保持 open,尚非正式关闭/复发重开。 + +Go 源码任务复检另用相同工具和构建环境执行 `go list -json ./...`,记录目标 selected/excluded/not_selected/incomplete。构建标签、CGO 关闭或平台约束排除目标时,返回 rule_coverage_requires_review 并要求检查构建范围;原生清单失败为 incomplete。两轮之间或观察保存后整组源码、模块清单变化会使观察失效。该清单仅证明默认构建条件下的局部文件选择,不代表所有平台、features、规则或可信策略覆盖。 + +### tools install 的发行清单局部接线 + +当前安装预览支持 `tools install --lock FILE --distribution-manifest FILE [path] [--dry-run|--apply]`。反馈 0.2 对清单显示固定的读取/解析/锁绑定原因,逐工具展示包格式、包摘要和大小及源地址摘要;不输出原始地址。缺清单、错误身份或声明只覆盖部分工具不会消除准备缺口。绑定未批准不等于源可信,apply 仍阻塞在写入前。旧 0.1 schema 单独保留;可信下载、归档展开和正式安装未完成。验收见相邻 `codeguard-cli/tests/acceptance/tools-install-manifest-preview.md`。 + +安装 runtime 已有 ZIP/tar.gz 的内存展开及包流→冻结文件→缓存入口字节发布基础。后续支持有界 GNU 长路径、局部 PAX path/size 及无害全局描述,局部状态仅作用到下一成员;PAX size 按真实边界解析并与标准 tar 样本交叉核对。全局 path/size、sparse/链接、bundle 目录发布、可信下载/批准和正式 CLI apply 仍缺,预览不会调用这些基础 API 自行安装。验收见相邻 `codeguard-cli/tests/acceptance/tar-extension-verification.md`。 + +完整归档树入口现已保留空目录/父目录,内存 bundle-tree-v1 与本机原目录算法交叉核验通过;原文件集合 API 保留。摘要相符只证明输入树内容,包内前缀到锁 bundle 根、批准来源与目录发布仍须独立接通,`tools install --apply` 当前仍阻塞。验收见相邻 `codeguard-cli/tests/acceptance/unpacked-bundle-tree.md`。 + +显式 `project_unpacked_bundle` API 现可把完整归档中的指定目录映射为 bundle 根,先验证整树、按目录边界去前缀,保留空目录与未消费成员,并与实际落盘目录摘要交叉核对。此映射尚未进入发行清单或正式安装计划,不能从内容匹配推导批准来源或安装完成;apply 仍写前阻塞。验收见相邻 `codeguard-cli/tests/acceptance/bundle-root-projection.md`。 + +发行清单 1.1 现显式声明 bundle_archive_root;旧 1.0 保持只读观察,缺映射不能猜根。inspect_distribution_bundle 内容 API 已绑定清单/锁/冻结包/入口/子树并保留剩余成员;正式安装目的目录、可信来源与目录发布仍缺,预览/apply 不调用该 API 自行安装。验收见相邻 codeguard-cli/tests/acceptance/distribution-bundle-binding.md。 + +工具树发布 API 现可在 macOS/Linux 使用私有暂存和不覆盖目录重命名,将完整已匹配子树发布到内容寻址目录;复用前重验成员、内容、权限和类型,取消清理本次暂存。固定发行包已串联关联/发布与既有磁盘摘要交叉核验;这不是正式安装计划,外部入口/运行时与锁路径映射仍缺,预览/apply 不自动调用发布。验收见相邻 codeguard-cli/tests/acceptance/tool-bundle-publication.md。 + +完整布局 API 现使用清单 1.2 的 install_tree_sha256 绑定同一内容寻址目录下的锁入口和 bundle 根,保留原包路径与全部普通成员;错路径不重写锁,旧清单缺布局不猜测。实际发布后原锁只读制品核验通过,但正式安装预览/来源批准/下载/运行时与恢复仍缺,apply 不自动调用该 API。验收见相邻 codeguard-cli/tests/acceptance/distribution-layout-binding.md。 + +当前安装预览反馈已升级 0.3,逐声明解释完整布局路径绑定、缺完整树声明及 raw 不适用;只公开内容寻址目录和定位摘要,human/JSON 明示内容核验 not_run。预览不读取包或调用发布,未批准 apply 仍写前阻塞。旧 0.2 schema 单独保留,验收见相邻 codeguard-cli/tests/acceptance/tools-install-layout-preview.md。 + +新版 raw 内容 API 现精确绑定原锁的二进制摘要.bin 定位,分块核验冻结字节并返回无复制借用视图;新版绑定预览下一步为核验来源/原包,旧声明仍需定位映射。显式本机 Ruff 0.16.8 串联发布与原生版本观察通过,来源/质量权威未授予;实际下载、运行时和正式 apply/恢复仍缺。验收见相邻 codeguard-cli/tests/acceptance/distribution-raw-binding.md。 + + +### ESLint 显式目录入口实施进展 + +当前Rust `lint typescript PATH` 已支持显式单配置目录逐文件调度。目录反馈与单文件反馈分别版本化,保留各文件原生结果、稳定任务同步、未执行范围和跳过原因,共享预算;配置文件作为源码也照常检查。目录使用原参数声明的配置/cwd,完整monorepo配置选择、TS及依赖覆盖仍待实现,不能据局部结果授予门禁。验收见相邻`codeguard-cli/tests/acceptance/eslint-directory-feedback.md`。 + + +### ESLint 子项目显式配置上下文 + +目录检查可通过 `--config-map ABS_PATH` 选择多个子项目原上下文。映射协议为 `{"schema_version":"1.0","projects":[{"root":"packages/api","config":"packages/api/eslint.config.cjs","cwd":"packages/api"}]}`,路径均相对当前检查目录根。最深匹配目录组件生效,未命中沿用原 `--config` / `--cwd`;配置选择与批准规则覆盖仍为两个独立状态。映射有界并绑定摘要,重复/越界/未知字段拒绝,变动停止后续文件。目录反馈0.2逐文件展示选择范围和来源,不将本地JSON升级为白名单或交付权威。真实双项目及故障验收见相邻 `codeguard-cli/tests/acceptance/eslint-config-map.md`。 + +### 2026-09-27 当前npm局部CVE入口 + +相邻Rust工程已提供Unix `cve typescript PATH`,通过显式`--node-tool ABS --npm-entry ABS --npm-version VERSION --userconfig ABS --globalconfig ABS`选择原生上下文,可加`--registry URL --timeout 90s --format json`。省略源为离线观察,不能确认数据库覆盖。该入口输出配置状态、脱敏advisory/锁版本和下一步,局部反馈保持退出3及交付未判定;尚未自动连接check all和稳定修复任务,完整命令计划未完成。实际验收见相邻`codeguard-cli/tests/acceptance/npm-public-cve-feedback.md`。 + + +### npm子项目的显式父工作区 + +Unix局部CVE命令可指定`--workspace ABS_PATH`,项目目录仍是原生执行cwd,报告及任务归属该已初始化物理父目录;不指定时使用项目自身。默认预算来自所选工作区,next复检保留该参数。越界项目和符号链接工作区别名在原生启动前拒绝。此归属能力不证明漏洞库覆盖或完整交付门禁。 + + +### npm稳定任务复检入口 + +Unix `task verify ID WORKSPACE --node-tool ABS --npm-entry ABS --npm-version VERSION --userconfig ABS --globalconfig ABS [--registry URL]` 按结构化任务构建根调用原审计服务;预算取父工作区,持有租约时同时传owner/token。human/JSON返回诊断与脱敏advisory并记录尝试,局部零发现仍待覆盖核验、不关闭;原生失败保持环境诊断。输入变化后历史结果失效,next要求重新复检。 + + +### check all的npm原生任务 + +Unix全项目检查现可提供显式Node/npm/具体版本/原用户及全局配置/可选registry参数,将已发现package根纳入共享jobs和deadline。各根原生结果独立,统一反馈后串行同步父工作区稳定任务并给next;缺上下文只展示配置发现,Java局部入口拒绝npm参数。check反馈0.24/中止反馈0.5增加逐根npm结果,历史schema单独保留。可信上下文自动解析及完整漏洞覆盖尚未完成。 + + +### 2026-09-27 npm缺锁准备观察 + +已有初始化工作区和可绑定清单时,公开CVE、显式npm check all、task verify缺锁会生成同一稳定完整性任务,提示恢复锁及原工具复检,不执行安装或把缺锁变成源码漏洞。观察0.2明确lock_state=missing且摘要为空;普通观察0.1仍严格读取。消费者现为check_feedback0.25、task_verification_preview0.5、check_aborted0.6,旧schema保留。锁恢复、链接或输入变化会使旧缺锁收据失效,不重复建任务。不可读/坏清单任务、自动上下文选择和完整门禁仍未实现。 + + +### 2026-09-27 默认全项目npm准备调度 + +当前Unix CLI的check all无需npm参数也会为已发现根准备稳定任务;未配置工具时不执行原生命令,初始化工作区中输入可绑定才同步并返回next。重复扫描和补齐参数后的原生观察沿用任务。未初始化不自动init,Java-only不运行npm。此为CLI接线,不表示插件Hook或可信上下文自动解析已完成,也不取得CVE覆盖/门禁权威。 + + +### 2026-09-27 npm不可用输入与复检历史 + +公开CVE或既有任务复检可记录清单/锁缺失、非普通文件、路径别名及有界读取失败;仅可读普通文件填内容摘要,其余为null。新观察0.3明确两个输入状态与诊断,继续复用稳定任务;恢复读取/物理路径后旧状态失效。尝试指纹记录状态,不成为源码修复或门禁依据。消费者check0.26/verify0.6/abort0.7,旧协议归档。默认check all只有发现且身份可绑定的根才调度,清单完全丢失的历史根恢复发现仍待补齐;外部工具/配置状态和宿主Hook尚缺。 + + +### 2026-09-27 历史npm准备范围恢复 + +默认check all在Unix上读取当前0.3初始化画像及受管摘要,恢复物理目录仍存在但清单当前不可用的准备范围。只生成本轮状态和稳定任务,不以历史摘要或当前显式工具参数启动该历史根的原生检查;当前其它根独立调度。画像不一致/错误路径/重复字段明确历史范围未完成,清单恢复后重新发现。此为本地范围线索,不是覆盖或批准;整体目录丢失、画像刷新删除旧根后的义务恢复及宿主接线仍缺。详见相邻Rust验收npm-historical-roots-workbench.md。 + + +## 2026-09-27 Rust 文档接入完整检查调度 + +`check all` 对 Rust 项目分别调度 `rust.comments` 与 `rust.lint`,共享总截止时间和 Cargo 资源互斥。文档节点复用 `comments rust` 的锁定离线库目标观察服务;两项的结果、未完成状态及准备任务独立保留,Clippy 成功不能覆盖文档缺工具或缺锁。初始化工作区后,文档报告自动同步为稳定问题和修复任务;下一步会继续指引尚未处理的任务。human 输出包含规则、位置、依据及同步状态。 + +当前 check_feedback 升级 0.27,check_aborted 升级 0.8,保留历史 0.26/0.7 schema;新协议嵌入独立 Rustdoc 0.4 观察并保持自包含。局部原生成功仍不证明原项目规则、全部 workspace/features/targets 覆盖或交付通过;正式关闭重开、可信策略与宿主验收仍缺。验收见相邻 Rust 工程 `tests/acceptance/rustdoc-check-all.md`。 + + +## 2026-09-27 Rust 原生构建解析前置 + +相邻 Rust adapter 新增独立 Cargo check JSON 流解析,保留原生编译错误编码、package/manifest/target 和主定位字节范围;不复用 Clippy 或 Rustdoc 的规则分类。完成事件与退出码矛盾、坏 JSON/重复键、结束后事件、未知记录、无法归属的编译失败及越界报告均为未完成。已观察诊断在后续流损坏时只作调查证据,不据裸 exit 101 判定源码违规。 + +真实既有 Cargo 样本验证类型错误 E0308、成功类型检查及构建脚本失败;成功样本的故意失败测试未执行,不能称测试通过。该解析前置尚未接入公开 build rust、共享运行时服务、原输入/工具绑定、同步任务、task verify、check all 或完整 workspace/features/targets,因此仍为局部前置,7.1不勾选。验收见相邻 Rust 工程 tests/acceptance/cargo-build-native-observation.md。 + + +## 2026-09-27 Rust 构建公开入口 + +`build rust [path] --cargo-tool ABS_PATH [--timeout DURATION] --format human|json` 已通过共享runtime执行锁定离线的all-targets类型检查。反馈区分原生成功/编译错误和环境未完成,固定build_level=type_check/test_execution=false;输入/工具/源集合变化或取消不给源码修复许可,取消返回130。原生范围绑定与七项修复简报只针对本轮唯一局部目标,包身份以摘要反馈。普通退出3和交付not_evaluated不伪称完整质量通过。该阶段尚未接入任务同步和task verify;当前阶段进展见下文。check all、完整构建组合与可信策略仍待接入;验收见相邻tests/acceptance/rust-build-cli.md。 + + +## 2026-09-28 Rust 构建工作台接线 + +已初始化工作区的 `build rust` 把本地0.2报告入队并调用统一 `work sync`,有效编译错误生成稳定fact和七项Markdown任务;同一问题重复检查只更新观察,不复制任务。缺工具/锁、坏原生流及已变输入生成准备任务,队列导入重算当前源码范围指纹,绑定目标源码摘要;旧目标变化只留历史和重扫阻塞,伪造指纹拒绝导入。`next` 识别 `rust.cargo_check` 并指向原工具构建复扫。 + +任务复检已接入 `codeguard task verify CG-... . --cargo-tool ABS_PATH --format json`:以任务租约和统一截止时间重跑同一原生Cargo check,保存绑定源码、根清单、锁和工具身份的0.1复检封套及0.8公开反馈。编译错误仍在为`still_present`;零诊断仅为`candidate_absent_unverified_policy`,任务仍open。`next`现在指向`task verify`并核对当前复检事件;可信白名单批准、完整项目策略/构建组合、正式关闭复发和交付门禁仍未接通。验收见相邻Rust工程tests/acceptance/rust-build-task-verification.md。 + +工作台同步和原工具复扫指引不等于正式 `task verify`、任务关闭或交付批准。包身份仅以本地观察摘要存储,未取得可信来源;完整 workspace/features/targets 和所有构建/测试等级仍缺。报告协议0.2,旧0.1 schema保存只作历史解析边界;验收见相邻 `codeguard-cli/tests/acceptance/rust-build-workbench-sync.md`。 diff --git a/docs/rust-cli/coverage-and-acceptance.zh-CN.md b/docs/rust-cli/coverage-and-acceptance.zh-CN.md index 8d17faa..38e9495 100644 --- a/docs/rust-cli/coverage-and-acceptance.zh-CN.md +++ b/docs/rust-cli/coverage-and-acceptance.zh-CN.md @@ -1,10 +1,10 @@ # Codeguard Rust CLI 语言迁移与验收设计 -状态:待执行。语言清单取自 `03ebb24` 的 [scripts/languages.json](../../scripts/languages.json),共 57 项:54 stable、3 planned。表中工具是旧注册声明或迁移调查入口,**不是已核验的新适配器能力**。不存在的 Rust 实现不计完成;只有 formatter 的旧 stable 也必须补足真实只读检查。 +状态:能力矩阵工程基线已落地,原生适配与真实验收待执行。语言清单取自 `03ebb24` 的 [scripts/languages.json](../../scripts/languages.json),共 57 项:54 stable、3 planned。表中工具是旧注册声明或迁移调查入口,**不是已核验的新适配器能力**。尚未实现的 Rust 适配器不计完成;只有 formatter 的旧 stable 也必须补足真实只读检查。 ## 1. 每种语言的能力账本 -每一 language/module 都生成 `lint/comments/cve/security/build` 五个槽位,分别记录 `implemented / gap / not_applicable`,并附 adapter、规则、工具版本、适用性证据及验收记录。 +每一 language/module 都生成 `lint/comments/dependencies/cve/security/build` 六个发行能力槽位,分别记录 `implemented / gap / not_applicable`,并附 adapter、规则、工具版本和验收记录。项目运行时另按[静态检查配置目录](static-check-catalog.zh-CN.md)探测 `configured/missing/invalid/unknown`;目录中的 28 个候选检测族不要求每个项目逐项配置或证明执行。 - `implemented` 只表示具备通过验收的实现;一次运行仍可能 incomplete。 - `gap` 表示有义务但没有可靠能力,交付不能通过。 @@ -12,6 +12,8 @@ - 外部 ecosystem 扫描可满足多个相关语言的 CVE 义务,但需要可追溯映射。纯 Markdown 的 build 可能不适用,其链接站点构建、文档规则仍按项目声明产生义务。 - 宣传能力矩阵由同一注册数据生成;明确语言/类别/平台覆盖,不能只有“支持 57 种语言”的单一数字。 +Go 六类别的第一版候选档案见相邻 Rust 工程 `codeguard-cli/rulepacks/go_static_candidate_v1.json`,由 `go-static-candidate:1.0.0` schema 和 Rust 解析器校验。它只覆盖 Go Modules 方言的调查入口;五个候选平台均未完成原生工具验收,六类全为 `applicable/gap`。`lint` 候选 `go vet`,`comments` 候选显式启用 ST1000/ST1020/ST1021/ST1022 的 Staticcheck,`dependencies` 候选 `go list -m -json all`,`cve` 候选 govulncheck,`security` 候选 gosec,`build` 候选 `go build`。其中 [Go 文档注释规范](https://go.dev/doc/comment) 要求导出名有注释,但 [Staticcheck 所列的注释规则](https://staticcheck.dev/docs/checks) 不是完整的“缺全部导出符号注释”证明;`gofmt` 只是格式化器。Go Modules 的依赖图与 workspace/replace 归属、漏洞库时效、gosec 工具链要求、build tags、`go test`、许可证/SBOM 和跨平台目标都保留为缺口。此档案不会改变 `codeguard capabilities go` 当前的 `gap`,也不能作为运行或通过证据。 + ## 2. 全量迁移清单 波次仅是执行顺序:A 先跑通端到端,B/C 补齐现有 stable,P 保留原 planned 路线图。全量迁移必须完成 A/B/C;P 不强制虚构实现,但如果目标项目要求 P 对应能力,仍不能通过。 @@ -76,7 +78,7 @@ | cuda | stable | clang-tidy | C | CUDA toolkit、host/device、编译数据库 | | ansible | stable | ansible-lint | C | collections、playbook、依赖及安全规则 | -旧表只有 lint 声明并不代表其它类别不需要做;每行必须附完整五槽位记录后才可以验收。`java`/`kotlin`/`scala` 等可共享 Maven/Gradle 依赖图,不能重复扫描造成重复 CVE,也不能漏掉另一构建根。 +旧表只有 lint 声明并不代表其它类别不需要做;每行必须附完整六槽位记录后才可以验收。`java`/`kotlin`/`scala` 等可共享 Maven/Gradle 依赖图,不能重复扫描造成重复 CVE,也不能漏掉另一构建根。 ## 3. 必备场景库 @@ -108,6 +110,8 @@ | F22 | 同一请求 CLI/MCP/Hook/CI 输出转换 | 语义一致,协议退出码按各自表映射 | | F23 | 多工具重复发现或同规则多次出现 | 归并可追溯,次数不丢失,不跨文件抵扣 | | F24 | 项目脚本禁用 analyzer 或自定义命令仅 echo | 覆盖不足,不能被命令 exit 0 欺骗 | +| F25 | 查询/计划/初始化/安装成功、空任务、MCP服务存活 | 操作成功与质量认证分开,next无完整证据时要求验证 | +| F26 | 同名旧owner、租约过期、finish重放、fix接管、doctor重复同步 | token/generation隔离、attempt不重复、导入身份明确,失败和部分状态可恢复 | ## 4. 误报与漏报的评测方法 @@ -138,7 +142,7 @@ |---|---|---| | Rust 源码 | fmt/clippy/test、依赖方向、schema/fixture 测试 | 文件存在或编译成功 | | 工具适配 | 固定工具链真实正反例、故障与修复复检 | mock 输出解析通过 | -| 全语言覆盖 | 54 stable 五槽位验收 + 3 planned 明示 | Java/Python/Rust/TS 演示 | +| 全语言覆盖 | 54 stable 六槽位验收 + 3 planned 明示 | Java/Python/Rust/TS 演示 | | Git/CI | 实际 index、多 ref push、受保护策略测试 | Shell 字符串静态识别 | | 制品 | target triple、摘要/签名、安装及离线 doctor | Release 页面存在 | | 插件接入 | Codex/ZCode/Kimi 每种事件真实调用新二进制 | manifest 语法正确 | @@ -149,9 +153,11 @@ ## 6. 规范到任务追踪 +以下是阶段级导航;逐条Requirement、36项命令、57个语言、5个平台和3个宿主的具体任务ID与执行里程碑见 [实施覆盖索引](../../openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md)。该索引不维护第二份勾选状态。 + | 规格能力 | 任务阶段 | 主要场景 | |---|---|---| -| unified-cli-contract | S01、S02、S11 | F17、F22、CLI 错参/空输入 | +| unified-cli-contract | S01、S02、S04、S05、S11 | F17、F22、F25、C01–C36 错参/空输入/预算/副作用 | | native-tool-adapters | S05、S06、S07、S08 | F01–F08、F19、F20、F23、F24 | | rulepack-governance | S04、S05、S12 | F07、F10、F12、F13、F18 | | verdict-integrity | S02、S12 | F03–F06、F12、F17 | @@ -159,9 +165,10 @@ | language-gate-commands | S05–S08、S12 | F03、F07、F11、F19 | | hook-protocol | S11、S12 | F13、F16、F22 | | binary-distribution | S11、S13 | 摘要不匹配、无网络、版本回滚、三宿主实机 | -| remediation-workflow | S09、S10、S11、S12 | 重复发现归并、跨类别同步、attempt 预算、复检关闭/重开、租约冲突 | +| remediation-workflow | S09、S10、S11、S12 | F25、F26、重复发现归并、跨类别同步、attempt 预算、复检关闭/重开、租约冲突 | | scan-scope-policy | S04、S09、S12 | 自有产物不递归扫描、用户源码仍检查、入库安全不豁免 | +| project-initialization | S09、S12 | 多语言/版本来源、分类型模块图、架构推断、AGENTS 保留、画像失效、初始化不等于门禁通过 | ## 7. 完成边界 -当前仅完成设计文件;上述表格无一构成适配器已实现证明。实施顺序与核对框统一位于 [OpenSpec tasks](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md)。旧实现对照仅用于解释差异,不作为新系统必须复制错误的依据。 +当前已完成四 crate 与能力矩阵的工程基线;上述表格无一构成适配器已实现证明。实施顺序与核对框统一位于 [OpenSpec tasks](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md)。旧实现对照仅用于解释差异,不作为新系统必须复制错误的依据。 diff --git a/docs/rust-cli/false-positive-allowlist.zh-CN.md b/docs/rust-cli/false-positive-allowlist.zh-CN.md new file mode 100644 index 0000000..ae1b625 --- /dev/null +++ b/docs/rust-cli/false-positive-allowlist.zh-CN.md @@ -0,0 +1,202 @@ +# CodeGuard 误报白名单设计 + +状态:规范设计与局部实施。相邻 Rust 工程已有精确身份比较、候选解析、期限/冲突筛选、批准快照字节绑定与撤销/替代链校验,以及单快照和多跳 Ed25519 签名核验 API。只读 `rules whitelist list/explain` 展示候选、失配字段和下一步;普通 `propose` 只展示当前本地观察,纠错 `propose --record` 可保存待审事件与可读附件。命令仍固定 `authority=unverified`、`gate_effect=none`,不能自行批准或放行。`config validate/explain` 对本地排除、自定义命令及白名单引用标记未授权;Ruff F401/E501 的候选规则映射也不证明策略批准。可信公钥、摘要、时钟和防回滚状态来源,完整候选生成、配置校验、批准发布与宿主门禁尚未接通。规范性要求以 [OpenSpec rulepack-governance](../../openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md) 为准。 + +当前 Python Ruff 0.16.8 局部扫描还从原生 `--show-settings` 记录逐文件全局启用规则及逐文件忽略配置。设置观察可指出“规则未启用”或“可能被逐文件忽略”,但不能证明源码内 `noqa` 等抑制不存在;反馈固定 `coverage_proven=false`。这份观察不能代替受批准 required rule 集合和完整覆盖核验,见相邻 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 + +后续局部扫描增加同轮原生 `--ignore-noqa` 对照:`# noqa`、`ruff: ignore` 等源码注释造成的诊断差额单独展示。仅有注释抑制而无活动 finding 的文件标记 `suppressed`,不标普通 `passed`;抑制结果不自动变成源码违规或白名单命中。若原任务复检时同规则抑制出现,`task verify` 返回 `suppression_requires_review`,`next` 要求核查抑制及批准依据,任务保持 open。逐文件配置忽略及受批准规则覆盖仍须独立核验,见相邻 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 + +原任务复检还会核对同轮原生设置:原规则未启用时返回 `rule_coverage_requires_review`;存在逐文件忽略配置时返回保守的 `suppression_requires_review`。两者都不能从“本次零诊断”推导已修复;当前只给待核查观察,不签发批准或关闭任务。 + +Rust Clippy 局部任务复检在普通扫描零诊断时,用同一工具对原规则运行原生 `--force-warn` 对照,并绑定目标源码字节、manifest 与工具摘要。原稳定 finding 被强制告警重新检出时标记 `suppression_requires_review`;两轮都无发现仅为 `candidate_absent_unverified_policy`,对照损坏或输入变化为 `incomplete`。这只是本地原生观察,不验证全部 features/targets 或可信规则策略,也不把原生抑制当作误报白名单批准。 + +Rust 编译任务的 `task verify` 现可用原生 Cargo check 复检并把观察写回同一稳定任务。相同错误仍在为 `still_present`,本轮零诊断仅为 `candidate_absent_unverified_policy`;类型检查没有执行测试,也没有核验完整构建组合。编译错误或工具故障不因本地白名单候选而消失,白名单正式生效仍取决于独立批准与完整门禁。局部验收见相邻 `codeguard-cli/tests/acceptance/rust-build-task-verification.md`。 + +ESLint 局部任务复检现也调用原生 `--print-config FILE` 核对原规则有效级别。只修改导入配置把规则关闭、主配置及源码不变的真实反例返回 `rule_coverage_requires_review`,next 提醒核查配置和批准依据,不能解释为修复或有效白名单。查询失败仍未完成;这项观察未证明完整导入闭包、TS 插件或受批准规则覆盖,见相邻 `codeguard-cli/tests/acceptance/eslint-effective-settings.md`。 + +## 目标与边界 + +### 用户纠正白名单的操作约定 + +用户应能从对话中选中原问题,查看“为什么报、为什么未命中、需要纠正什么”。智能体返回原生规则依据、精确目标、当前候选或批准决策、失配字段和复检动作,随后将纠正记录附到同一稳定问题。无需用户直接维护匹配摘要或编辑原始报告。此为目标交互,不能把现有只读查询当作完整交付能力。 + +- 新增:复核原工具误判,生成精确候选;批准后下一轮仍执行原工具,只豁免匹配的问题。 +- 修改:理由、目标、工具身份或期限改变都产生新版本;旧批准不能授权修改后的字节,替代决策须重新批准。 +- 撤销:保留旧记录,恢复原问题的正常处置;若问题仍被原工具发现,恢复对应待处理任务。 +- 到期或失配:解释具体原因,给出复核任务;不得自动续期、扩大范围或删除问题。 + +对话必须分别显示“待审”“已批准且本轮命中”“失效/撤销”,不能用统一的“已忽略”混淆三者。白名单纠错任务的完成条件是裁定和本轮处置可核验;源码修复任务的完成条件仍是原工具复检,不因白名单文件修改而记为代码已修复。 + +白名单用于纠正**经过复现和裁定的误报**,不是跳过检查器、降低规则阈值或默认忽略历史问题。原生工具照常运行、原始 finding 照常保留;白名单只在报告解释与门禁处置阶段匹配该 finding。无效、过期或来源不可信的条目不生效。确实存在但团队决定接受的风险属于独立的 `accepted_risk` 例外,不能标成误报;工具崩溃、配置不明、覆盖不足或漏洞库过期属于 `incomplete`,也不能进入误报白名单。 + +坏报告的 `state/import-failures/` 本地收据只记录脱敏失败原因和报告字节摘要,供 `next` 指出修复动作;它没有原生 finding 身份、批准权威或门禁效力。报告修正后必须重新同步和原生复检,不能通过编写白名单候选来消除同步失败。 + +项目启用规则与 CodeGuard 探针规则不一致时,应先修配置解析或适配器。例:Maven POM 只声明 P3C `ali-naming.xml`,探针不能以模板中的 `ali-comment.xml` 生成作者注释 finding;也不能为这类多扫问题申请白名单来掩盖适配错误。POM 身份变化或无法确定生效规则集时,返回配置阻塞和重新发现动作。 +原生报告也不能自证规则归属:PMD XML 若声称来自未启用的 P3C 规则集,或把另一个规则集的 ID 写入已启用规则集,应先标记报告未完成,不给智能体创建“修复源码”任务,更不生成白名单候选。 + +Javadoc 单文件 doclint 探针的 `findings_observed_untrusted` 也只供定位注释;尚未绑定项目生效配置、完整源集和可信工具身份时,不得直接据此生成可批准的误报白名单。类路径缺失、未知诊断文本或原生进程失败属于 `incomplete`,应先修复检查环境或适配器。 + +CVE 白名单还要绑定本轮原生 advisory、精确依赖坐标与解析版本、依赖图及制品摘要、检测器和规则身份,以及可核验的新鲜漏洞库。当前 OWASP Maven 局部反馈的 `database_freshness=unverified`、`coverage_proven=false`,因此只能作为调查线索,不能生成会放行的白名单命中。对话反馈中被脱敏为 `redacted-sha256` 的私服包标识也不能反向充当组件身份;须在受保护的原生报告与图归属中完成精确匹配。漏洞真实存在但业务接受风险时走 `accepted_risk`,不能以“误报”条目规避 CVE 门禁。 + +Rust 的 `cve rust` 与 `check all` 现可调用原生 cargo-audit,并将 advisory 的包名、解析版本、来源和校验和与本轮 `Cargo.lock` 对照;公开反馈仍把私有来源脱敏。此对照只是局部身份核验:RustSec 数据库来源与时效、完整依赖图和构建组合、受批准工具及策略仍未证明。即使 advisory 与锁文件精确相符,`database_freshness=unverified` 时也不得签发或命中能改变门禁的 CVE 白名单;用户纠正可先记录为待审调查,并在下一轮原工具复检后补充证据。没有 advisory 的局部扫描同样不能靠白名单变成安全通过。 + +```mermaid +flowchart LR + T[原生工具检查] --> F[保留原始发现和覆盖状态] + F --> V[核对冻结检查器映射与原生主目标] + V --> M{匹配精确白名单?} + M -->|否| A[按原策略阻断或继续修复] + M -->|候选/过期/错版本/错内容| A + M -->|批准且全部身份匹配| W[标记 whitelisted_false_positive] + W --> R[保留发现、决策引用和复检命令] + R --> G{其它必需检查完整且无未处置阻断?} + G -->|是| E[allow_with_exceptions] + G -->|否| D[deny 或 incomplete] +``` + +## 条目模型 + +### 纠错分流 + +| 复核结论 | Codeguard 处理 | 门禁含义 | +|---|---|---| +| 原生规则在此精确输入上确为误判,且有可复现证据 | 提交有期限的 `false_positive` 候选,经独立批准后只处置该 finding | 其它义务完整时最多 `allow_with_exceptions` | +| 规则对该类项目普遍不适用 | 修订受保护的 rulepack/项目策略,附正反例回归 | 新策略生效前旧规则仍执行 | +| 问题真实存在,但团队决定承担风险 | 走独立的 `accepted_risk` 决策,不能伪装成误报 | 按独立策略显示风险例外 | +| 工具未配置、崩溃、漏洞库过期或报告不完整 | 创建环境/配置修复任务 | `incomplete`,白名单不参与放行 | + +智能体可以收集证据并提出候选;对话中收到“这是误报”的反馈时应定位原 finding、给出原生复检与最小复现,再选择上表路径。修改候选文件本身只会改变待审内容;即使文件写入 `.codeguard/decisions/`,也不能凭路径或字段让本轮扫描通过。错误批准条目须撤销并重开相应任务,不能删除历史 finding 来掩盖纠错过程。 + +第一版只支持**精确发现**。一个决策条目只绑定一个稳定 finding 和一个精确目标;多个目标必须分别取证、裁定和批准。不能用 `*`、`**`、正则、整库目录或“忽略某规则的全部结果”冒充误报白名单。同一 finding ID 出现两个候选目标时属于身份冲突,查询与门禁均不得挑选其中一条放行。若规则在某类项目中系统性不适用,应修改经批准的 rulepack/项目策略,并用正反例验证,而不是堆积宽泛白名单。 + +### 规则层级与纠错优先级 + +白名单是**发现后的处置规则**,不能成为扫描输入排除规则。应用顺序固定为:批准的必需检查与覆盖范围 → 原生工具执行及结果校验 → finding 稳定身份 → 白名单身份、期限及独立批准校验 → 门禁汇总。任何前序步骤为 `incomplete` 时,不运行“没有发现所以命中白名单”之类的推断。候选条目只供调查;已批准的精确条目只能处置对应 finding;策略级规则调整须在下次检查以新 rulepack 身份重新执行原工具。 + +对反复出现的误判,按根因选择最窄的纠正方式: + +| 根因 | 纠正位置 | 必须留下的证据 | +|---|---|---| +| 单个输入触发原生工具误报 | 精确 `false_positive` 条目 | 最小复现、原生诊断、目标与工具身份、批准引用、到期时间 | +| 适配器误读了退出码、路径、报告或规则 | 修复 Rust 适配器 | 错误输入与正确原生输出的回归样本;旧条目复审/撤销 | +| 某项目类型普遍不适用该规则 | 经批准的 rulepack/项目策略修订 | 适用范围、正反例、覆盖变化和受保护策略修订 | +| 原生配置把必需规则隐藏 | 修复配置或报告策略差异 | 有效配置来源及原工具复检;不能建立白名单 | +| 真实风险被业务接受 | `accepted_risk` 独立决策 | 风险说明、负责人、到期和独立批准;不能计为误报 | + +白名单命中数持续增加应触发规则/适配器根因复盘,不自动扩大匹配范围。质量评测须同时展示原始发现、人工裁定误报、白名单命中、白名单失效及漏报;白名单命中不能从原始误报率的分母或回归样本中消失。 + +| 字段 | 用途与约束 | +|---|---| +| `id`、`schema_version`、`kind` | 稳定决策 ID;`kind=false_positive`,与 accepted risk 分开 | +| `checker_id`、`native_rule_id`、`category` | 只匹配同一原生检查器、规则和检测类别;不可只按消息相似度匹配 | +| `target` | 源码用规范化仓库相对路径与目标文件内容 SHA-256;依赖问题用组件坐标、解析版本、依赖图身份和 advisory ID;不能拿路径白名单压制所有依赖风险 | +| `finding_fingerprint` | 绑定原生规则、目标、结构化位置/符号和证据身份;行号可辅助展示,不单独作为身份 | +| `tool_identity`、`rulepack_identity`、`adapter_identity` | 版本或摘要范围显式限定;工具/规则语义变化后须重新裁定 | +| `reason_code`、`rationale`、`reproducer_ref` | 说明为何是误报,附最小复现、原生输出引用和人工裁定;自由文本只作数据 | +| `approved_policy_revision`、`approval_ref` | 指向受保护策略修订或可验证签发记录;项目内可写文件的 `approved=true` 无效 | +| `created_at`、`expires_at`、`reviewer` | 有期限、有责任人;期限上限来自可信策略,不能永久有效 | + +内容 SHA-256 对源码文件按本次被检查的字节计算。匹配在原生解析、路径归属和内容复核之后进行;任何必需字段缺失、身份无法验证、多个条目冲突或时钟/批准来源不可靠都返回**未匹配或未完成**,不能按有利于放行的默认值处理。白名单条目本身有版本和摘要,报告记录命中的决策 ID、策略修订、到期时间和匹配依据,但不向对话泄露原始敏感证据。 + +## 申请、批准与复查 + +1. `work sync` 将疑似误报保留为 finding,并创建“误报调查”任务;智能体收集最小复现、原生规则、目标身份和建议修订,不自行关闭问题。 +2. 目标 `codeguard rules whitelist propose [path] --format json` 在证据完整时只生成**候选**,不改变门禁。当前已实现 `rules whitelist list/explain --candidate FILE` 的显式文件只读查询,以及 `propose` 的本地观察预览:它只使用最新已同步报告中仍存在、且源码与配置内容一致的 finding;未同步、损坏或新扫描问题消失时不回退旧证据。调用者可加 `--ruff-tool /绝对路径/ruff`,预览会按当前普通文件字节复核报告里的工具摘要;不一致或工具不可读取时隐去旧观察并要求重新扫描。它不执行工具,也不证明工具获得批准。`explain` 可额外指定 `--observed-identity FILE` 解释两个未核验身份是否精确匹配。匹配成功也不能判断候选已批准、未过期或观察文件来自本轮原生检查,始终无门禁效果。现有 `config validate/explain` 仅静态观察旧项目配置和工具锁,固定 `authority=unverified`,不验证白名单批准、期限或本轮原生身份。后续须接入可信策略与完整配置差异;`propose` 的完整候选生成仍未实现。 + +Ruff 局部报告现在只在确有原生 finding 且还有检查预算时记录本次 CodeGuard 可执行制品的 SHA-256 作为**适配器观察摘要**;无摘要时仍报告具体缺口。候选入口读取已同步报告后再次哈希当前二进制,若发生变化,即使本地报告和同步标记被一起改写也拒绝沿用旧观察。这补齐一个可核对字段,不代表二进制发行来源、rulepack 或误报裁定已获独立批准;`candidate` 仍为 `null`,门禁不变。 + + `propose` 的输入必须是**本轮**原工具结果及内容复核形成的完整精确身份。当前 Ruff 局部报告 0.6 已对完整文件记录本轮观察到的工具与配置字节摘要,已映射的 F401/E501 另记录未批准规则包摘要;预览 0.3 能将它们与最新已同步、源码及配置未变的 finding 关联,但持久任务仍只存首次规则、路径和发现指纹,且尚无适配器及**经批准的** rulepack 身份。因此不能拿任务文件或候选规则包摘要直接拼出可评审条目。身份缺失时应返回 `incomplete`,列出缺失字段和复检/准备动作,不填零摘要、版本字符串或“当前文件”占位,也不写候选文件。 +3. 人工评审确认确属工具/适配器误报后,将精确条目纳入受保护策略修订或签发批准;本地 `.codeguard/decisions/` 保存可读引用和历史,不作为自足的授权源。正在提交白名单的同一 PR 必须由受保护 CI 使用**此前可信基线**验证,不能用自己新写的条目为自己签发通过。 + +批准快照协议 `approval-snapshot:1.0` 记录策略修订、最长有效期及每个已批准候选的 ID/原始字节 SHA-256。Rust 的 `bind_candidate_to_snapshot` 先比对快照的预期 SHA-256,再校验候选是否在快照中、修订及有效期是否一致,并与调用方提供的本次原生 finding 身份精确匹配。更改候选中的批准文字、评审人或任何字段都会改变摘要;同次 PR 新增候选若不在此前快照中不能命中。此函数的 `BoundToPinnedSnapshot` **仅证明输入之间的绑定**,不证明摘要、时钟或 finding 来自受保护来源;项目可写配置或智能体自行计算的摘要不能升级为授权。正式门禁还须由隔离的 CI/宿主固定旧策略快照、可信时钟和真实原生发现。 + +快照 `1.1` 增加必填 `revoked_decision_ids`,由同一策略修订同时固定有效候选与撤销 ID。绑定函数在解析并核对快照摘要后优先返回 `Revoked`,即使旧候选字节仍列在 `decisions` 中也不能沿用;重复、通配撤销 ID 或 `1.1` 缺撤销集合使整份快照无效。旧 `1.0` 快照仍可读取,但不能包含撤销字段。当前这只是快照内的撤销表达与字节绑定,还没有可信发布、修订链事件、真实 finding 门禁或 `explain` 自动发现,不能把本地构造的 `1.1` 快照当成批准。 + +替代候选使用决策协议 `1.1`,必须以 `replaces_decision_id` 引用不同的旧决策 ID;普通 `1.0` 候选不得携带该字段。替代候选绑定时,同次快照必须撤销旧 ID;还要提供旧决策字节,确认稳定 finding、检查器、规则、类别和精确目标归属没有扩大。仅调用普通绑定接口、缺旧决策、引用错 ID 或改到另一目标,均不能得到替代绑定结果。该结构核对仍不能证明旧字节来自先前可信批准;受保护策略发布需继续验证旧决策存在、旧快照来源及修订链无环。 + +前序绑定接口进一步要求旧决策字节在**另一份**固定摘要的前序快照中列明且尚未撤销,旧决策声明的修订与该快照一致;前后快照修订不能相同。缺前序摘要、摘要与字节不符、旧字节被改或前序快照已撤销旧决策均拒绝。两个摘要的真正来源和修订先后顺序不能由工作区文件自证,必须由受保护发布流程固定;该接口的成功值仍不是白名单生效或交付授权。 + +多次纠错使用按“当前候选的直接前驱 → 最初普通候选”排列的前序链。Rust 逐跳核对旧决策确在对应快照、同一 finding/精确目标、子快照撤销其前驱、各跳策略修订不同且旧决策有效期不超过当时上限;必须走到不再替代别人的根候选。截断、乱序、多余节点、重复决策 ID/修订形成的环或超过 32 跳均拒绝。结构完整仍不证明快照来自可信发布,也不能用版本字符串推断修订发生的真实先后。 +4. 生效后的每次检查仍运行原工具。只要源内容、依赖图、规则、工具/adapter、目标、批准修订或期限失配,原 finding 重新按正常规则处理;复发或新位置不能沿用旧白名单自动放过。 +5. 若根因已在 checker/adapter 中修复,应撤销条目并用原工具正反例复检。已批准条目过期前提示复审,历史事件保留,任务处置标为 `whitelisted_false_positive` 而非 `resolved_by_code_fix`。 + +纠错反馈须回到同一个稳定 finding/任务:用户指出误判后,智能体记录反例并提出候选;被驳回时继续修复原问题或环境;批准后同步处置事件,任务可标为“经批准例外”,但不得写成源码已修复。批准被撤销、到期或身份失配时,任务重新进入待处理;任何人手动勾选任务都不改变本轮门禁。查询命令要分别解释 `candidate_unverified`、`approved_match`、`expired`、`identity_mismatch`、`revoked` 与 `approval_unverifiable`,并显示下一步是补证据、复检、重审还是修复代码。 + +### 纠正白名单的闭环 + +用户反馈“这条是误报”时,智能体先用 `rules whitelist explain` 定位原始 finding、原生规则和当前处置,再运行原工具取得本轮证据。若证实是单条误判,就对**同一稳定 finding** 提出精确候选;若是适配器解析错误,先修适配器;若规则对一类项目普遍不适用,则提出受保护的规则/项目策略修订。不能仅凭一句反馈生成有效豁免,也不能要求智能体反复修改无关源码。 + +已批准条目需要纠正时,采用“撤销旧决策 + 新候选 + 独立批准”的修订链;旧决策 ID 与历史事件不可覆盖或删除,新候选明确引用被替代的决策。受保护策略发布时原子地固定撤销集合和新批准集合,避免旧、新条目在过渡期间同时生效。若同一 finding 存在两个有效且互相冲突的决策,保持 `incomplete` 并要求评审,不选择较宽松的一条。撤销、过期、身份变化或新候选未批准时,本轮原生 finding 恢复正常阻断;既有任务重开并记录原因。 + +纠错提案的最小数据为原决策 ID、稳定 finding ID、结构化原因、本轮原工具复检引用和受影响目标。若仍是同一目标的误报,替代候选使用新决策 ID、`replaces_decision_id` 与新的完整精确身份;若先前误批或检查器已经修正,可以只撤销,不制造替代条目。CLI 只生成可审阅提案;受保护策略发布负责校验旧决策存在、修订链无环、撤销和替代原子生效、替代范围未扩大。另一个文件或依赖节点出现相同规则时,应单独调查,不能借旧决策的修订链批量放过。 + +当前 Rust 局部入口支持 `codeguard rules whitelist propose [path] --correct-decision FILE --correction-reason CODE --verification-run RUN_ID [--replacement FILE] [--record] --format json`。它只读取稳定任务、严格解析的旧候选及由 `task verify` 保存且摘要可核对的本轮原生报告。复检仍存在时可预览误批/范围过宽/证据失效的撤销;复检确认原问题缺失且目标源码未再变化时,可预览 `root_cause_fixed` 的仅撤销。提交替代文件时还比对同一稳定 finding 与目标、已观察的源码/工具/发现指纹;由于适配器与已批准规则包身份仍缺,替代只标为 `unverified_draft`,预览状态为 `evidence_incomplete`。任何路径都固定退出 3、`authority=unverified`、`gate_effect=none`,不写 `decisions/`,不关闭任务,也不更改门禁。 + +加 `--record` 时,命令持任务锁重查证据,将提案幂等写入 `.codeguard/findings//events/correction-proposed-.json`,并在输出中给出 `record_ref`。事件引用同一稳定 finding 与任务,包含旧决策、新草稿摘要、原生复检 run/报告摘要及缺失的批准证据;同内容重放不增事件。证据过期或目标变化时不落盘。此事件是待审记录,不是 `decisions/` 的可信批准,也不能让智能体关闭任务。`codeguard next . --format json` 会在当前复检 run/报告摘要仍匹配时,向同一任务简报附 `correction_proposal_refs`,提示独立评审;过期事件不作为当前任务决策。 + +`rules whitelist explain` 应逐字段解释命中、失配和修订链,只显示脱敏身份与批准引用;`propose` 应支持对现有决策提出修订候选,但永远不能自行批准或直接改门禁。此修订入口及可信策略发布流程仍待实现。验收需覆盖“批准误报后精确放行、误批撤销后重新阻断、修订期间不能双重放行、其它同规则 finding 不受影响”,并在评测中保留白名单前的误报与漏报统计。 + +```mermaid +stateDiagram-v2 + [*] --> proposed + proposed --> rejected: 裁定并非误报 + proposed --> approved: 可信评审与策略修订 + approved --> stale: 内容/规则/工具/范围改变 + approved --> expired: 期限届满 + approved --> revoked: 根因修复或批准撤销 + stale --> proposed: 重新取证 + expired --> proposed: 重新复审 + revoked --> [*] +``` + +## 门禁与对话反馈 + +白名单**不删除 finding,也不改变原生工具退出语义或检查完整性**。报告分别记录 `raw_findings`、`whitelisted_false_positive`、`active_findings`、`incomplete_obligations`;每条命中报告原阻断级别、处置标签和批准引用。存在有效白名单且其它必需义务均完整时,交付决策为 `allow_with_exceptions`,不显示普通 `PASS/allow`;尚有真实阻断则 `deny`,工具/配置/覆盖未完成则 `incomplete`。同一 finding 同时命中冲突条目时不自动选最宽松结果。 + +Rust RunReport 1.4 schema/结构解析及对话摘要 0.2 已加入该决策值;1.3 原始 schema 仍保存供历史读取。1.4 对每条 finding 要求完整原生身份,对白名单处置要求精确决策身份,并核对规则、工具摘要、检查器类别和主定位;两份身份任一字段不同即拒绝报告声明。相邻 Rust 工程还有一个未接入正式命令的 SARIF 2.1.0 纯转换器:未完成运行在 SARIF 中标记执行失败和错误通知;白名单 finding 仍保留为结果,附上批准引用及“报告声明、来源未核验”标记,不创建 SARIF suppression;原生消息和路径不进入公开投影。原生报告生产、可信审批与 CLI/MCP/Hook 全格式消费尚未接通。旧消费者遇到新值应拒绝按普通 allow 解释。`allow_with_exceptions` 对完整交付请求可对应退出 0,但必须保留明确的带例外状态与可核验批准来源。 + +1.4 消费者现还要求源码 finding 的主目标同时属于该义务声明的预期和实际覆盖集合。独立的 `compare_claimed_source_hashes` 接口只接受宿主指定的工作区根,安全读取报告里**全部源码目标**的当前普通文件字节并比较 SHA-256;旧协议、内容变化、文件缺失、符号链接、冲突摘要或资源超限均拒绝。它只是一次内容比对,不能从报告自填的覆盖集合、工具摘要或审批字段推断来源可信,也不能替代终局复核;正式门禁仍未调用该接口。 + +智能体对话应说“规则 X 在文件 Y 被原工具发现,经白名单决策 Z 判为误报,本次不阻断;到期/失效条件是……”,并给出原工具复检命令。候选或失效白名单只能提示调查,不能对话中说“已放过”。`next` 可引导人工裁定或代码修复,但不得反复让智能体改无关源码。评测同时报告白名单前后发现数、已裁定误报数、实际漏报和豁免比例,不能通过增加白名单把 precision 人为抬高。 + +## 必须通过的验收场景 + +| 场景 | 期望 | +|---|---| +| 同一内容、规则、目标、工具/策略身份且批准有效 | 只标记对应 finding,不影响同文件其它规则;交付最多为 `allow_with_exceptions` | +| 同一规则出现在另一文件、内容变更、依赖版本或 advisory 变化 | 不匹配;原阻断保留 | +| 条目过期、缺批准、批准来自当前 PR 或本地 `approved=true` | 不放行,给出失效/未批准原因 | +| `propose` 只拿到历史任务,缺本轮工具/适配器/rulepack 摘要 | 不生成可批准候选;报告缺证据与原工具复检动作 | +| 原生检查器崩溃或报告范围不完整 | `incomplete`,即使历史 finding 曾在白名单中 | +| 原生 suppression 隐藏了必需规则 | 报策略差异/未完成,不能凭白名单证明该规则已执行 | +| 同轮有白名单误报与真实阻断 | 两类都展示,最终 `deny` | +| 唯一阻断是有效白名单误报,全部义务完整 | `allow_with_exceptions`,不写普通 `allow` | +| 原生规则或 adapter 修复后条目撤销 | 原工具复检;历史裁定与指标仍可追溯 | +| 同一误判重复扫描、任务被手动勾选或改名 | 复用同一 finding 与决策引用;不因任务文字变化改变处置或门禁 | +| 白名单命中量攀升或同规则出现多条候选 | 形成规则/适配器根因调查,不能自动合并为规则级忽略 | + +### 当前可读纠错附件 + +纠错命令显式 --record 现在生成 .codeguard/tasks/corrections//.md,附属于同一稳定任务,包含证据、规则、范围、步骤、复检、历史和关闭条件。附件为历史投影,需通过 next 核对当前适用性;用户编辑保留、不用于批准或执行指令。事件保存成功后附件冲突/失败单独反馈,重试可恢复被删除的附件。next 仅引用当前复检仍匹配且与事件重建字节一致的附件。该能力仍不具独立批准、可信发布或正式门禁效力。 + +当前 Ruff 复检观察及普通误报提案在读取时重新发现目标选中的配置,核对配置路径和字节摘要。规则配置变化、新增更高优先级配置或旧报告缺少身份时,next 要求原工具复扫,不继续展示旧纠错事件/附件;历史记录仍保留。原源码未变也不能使陈旧配置证据继续有效。 + +### 批准签名绑定的局部实现 + +Rust 现可在宿主预固定公钥、时钟和基线上核验 Ed25519 签名,精确绑定工作区、策略修订、基线提交、防回滚序号、有限期限和批准快照原始字节。普通候选桥接先核验签名,再核对快照内修订与签名修订一致,随后沿用精确候选身份与字节绑定。改签名原文、换目标/快照/私钥、过期、撤销、缺可信时钟或回滚均拒绝。项目没有自选公钥或签发批准的 CLI;公钥可信来源、撤销及最低序号仍由受保护宿主负责,尚未接通真实门禁和完整签名修订链。签名成功不能把原生 incomplete 转为通过。 + +当前多跳签名入口会逐跳核验历史签名和快照字节,再检查工作区、序号、签发/审核先后与当时有效期;历史 pin 由验签结果生成,不接受项目自行提供。随后继续原有精确替代/撤销/无环校验。历史条目今天过期不抹去当时合法记录,但宿主当前撤销的公钥仍拒绝绑定。历史时间和公钥来源、代码基线祖先关系及实际门禁仍须由受保护宿主接入。以上局部签名核验补充了前文的实施状态;候选查询与纠错命令仍无批准或放行效力。 + +Git 联合入口现进一步核对每跳已签名基线的原生祖先关系(允许同一提交),签名有效但代码历史无关仍拒绝。缺对象、浅历史、旧 Git 不支持禁取对象参数、取消或预算耗尽均为未完成;不降级为纯签名通过。工具和仓库可信来源、批准发布及最终门禁仍待宿主接线,不赋予本地候选授权。 + +领域门禁现进一步核对白名单身份与原生 finding:宿主冻结 checker/tool/category/obligation 映射,第一处定位作为主目标,源码核对路径,依赖核对组件与显式版本。缺定位、错主目标、错工具或缺/冲突映射均保留活动阻断;次要定位不能扩展豁免。全部处置应用前先识别重复 finding 和复用的决策 ID,冲突双方不留下先到的白名单状态。此增量不证明原生制品摘要、批准来源或依赖图归属,也未接通真实宿主门禁。 + +领域 finding 还增加本轮完整原生身份绑定。只有它与批准项附带的观察身份逐字段一致,才可能进入白名单处置;旧报告缺身份、文件字节或指纹变化、工具/适配器/rulepack 摘要变化、依赖图或 advisory 变化都会保留原始及活动阻断并返回未完成。这个字段只是领域输入契约,不能让项目自行填写并取得可信来源;正式宿主仍须从本轮原工具结果和真实目标字节复核后冻结它。 + +应用处置时还必须采用最终门禁的可信时钟:到期边界不包含,缺最终时钟、零值或早于取证时间均不应用白名单,不能重放旧 observed_at 维持豁免。普通无白名单门禁不因缺此新字段改变结论。已验签快照现提供只读到期上限,宿主固定当前批准相关约束的最早边界;历史批准按当时审核时间核验,不将历史到期时间套到当前合法替代条目。可信时钟和真实批准生产仍由宿主接线。 + +门禁现还与宿主独立冻结的当前策略修订比较,处置不得用自己声明的修订充当当前策略。签名入口可生成不可从项目 JSON 反序列化的只读处置绑定预览,固定候选/快照字节、范围、身份和最早期限;替代入口先核验完整签名与 Git 链。预览的独立批准标记始终 false,不增加自批命令或放行能力;来源核验、真实宿主批准和发布仍未接通。 + +### 最终门禁的工作区与批准基线绑定 + +签名预览中的 `approval_scope` 保留已核验的工作区及当前批准上下文基线。门禁须与宿主独立冻结的范围精确比较,不得从处置字段复制宿主范围。缺范围、跨工作区、错基线或非法身份均不应用白名单并保留活动阻断。基线仅接受完整非零、小写 SHA-1/SHA-256 提交 ID;它是批准上下文的基线,不是临时工作树 HEAD。旧输入仍可读取,未带范围的旧白名单不能放行;没有白名单的普通判定保持原语义。来源可信性和真实宿主接线仍待实施。 diff --git a/docs/rust-cli/legacy-delta-20260924.zh-CN.md b/docs/rust-cli/legacy-delta-20260924.zh-CN.md new file mode 100644 index 0000000..d3832b1 --- /dev/null +++ b/docs/rust-cli/legacy-delta-20260924.zh-CN.md @@ -0,0 +1,17 @@ +# 旧实现增量核对(2026-09-24) + +这份记录为 OpenSpec 1.1 的**进行中证据**。当前插件 HEAD 为 `9e4adb1`;原设计读取的 `03ebb24` 不是最新源码。两提交间旧运行时代码有 9 个文件变化。`scripts/languages.json` 未变,SHA-256 为 `012370f9d83a2daeb3cc87fef292a7509e85b53540ce9adf1eaf171f0910d251`,仍是 54 stable / 3 planned。逐语言差异与后续验收入口见 [语言迁移表](coverage-and-acceptance.zh-CN.md#2-全量迁移清单);Rust 工程固定了该清单快照,并在 `codeguard-cli/crates/codeguard-cli/tests/capability_inventory.rs` 核验 57×5×5 个显式缺口,不能把旧注册状态当作新能力。 + +| 旧源码增量 | 新流程归类与依据 | 已有回归样本 / 后续 fixture | +|---|---|---| +| `hooks/__protocol__.md`:旧 skipGate 只豁免语言检查,入库安全仍检查 | **保留 legacy-v1**;新交付完全拒绝 skipGate 自授权。见 hook-protocol、rulepack-governance | `tests/test_skip_gate_safety_scope.py`;新入口 F13/F22 待实现 | +| `scripts/codeguard/gate.py`:采集缓存身份前补 PATH | **保留正确行为**,但新缓存必须绑定真实有效环境身份。见 execution-kernel | `tests/test_skip_gate_safety_scope.py`;新缓存 F09/F10 待实现 | +| `scripts/codeguard/git_guard_application.py`:语言豁免后仍执行安全路径检查 | **legacy-v1 兼容 + 新流程纠偏**:保留安全发现,新入口不得接受豁免。见 hook-protocol、scan-scope-policy | `tests/test_skip_gate_safety_scope.py`;新 Git F16/F18 待实现 | +| `scripts/codeguard/prompt_application.py`:软反馈同样保留安全报告 | **legacy-v1 兼容**;新软反馈不能冒充硬门禁。见 hook-protocol | `tests/test_skip_gate_safety_scope.py`;新宿主 F22 待实现 | +| `scripts/codeguard/toolchain.py`:补 PATH,缺入口时探测 Python 模块并给诊断 | **保留正确诊断**,但不得把模块探测成功当作原命令可执行。见 unified-cli-contract、native-tool-adapters | `tests/test_skip_gate_safety_scope.py`;新 doctor F03 待实现 | +| `scripts/paths.py`:补符号链接解释器真实 scripts 目录 | **保留正确路径发现**,工具仍需锁身份与实际启动证明。见 execution-kernel、rulepack-governance | `tests/test_skip_gate_safety_scope.py`;新 tools verify/doctor 待实现 | +| `scripts/codeguard/reporting.py`:说明旧豁免范围 | **legacy-v1 兼容**;新修复简报不得推荐绕过。见 hook-protocol、remediation-workflow | `tests/test_skip_gate_safety_scope.py`;新 RepairBrief 待实现 | +| `scripts/check_architecture.py`:容纳旧模块新增依赖 | **只保留旧架构校验**;新四 crate 方向由独立检查拒绝反例。见 execution-kernel | `tests/test_architecture.py`;`codeguard-cli/crates/codeguard-cli/tests/crate_boundaries.rs` | +| `scripts/bump-plugin.mjs`:Claude 版本路径写后核对 | **保留发布正确性**;新二进制与插件锁/市场仍需分层验收。见 binary-distribution | `tests/test_plugin_manifests.py`;新发布验收 13.4 待实现 | + +旧源码中仍存在新规范明确纠偏的共性行为:通用 `rc=1` 推断 finding、最多 50 文件时的 delta/基线豁免、缺工具旧 Hook 放行、Java Maven verify 代替多项质量义务。它们分别由 native-tool-adapters、verdict-integrity、execution-kernel、hook-protocol 和 language-gate-commands 的新要求替换;当前仅有领域聚合测试,真实新适配器和完整对照 fixture 尚未落地,因此 OpenSpec 1.1 **仍未完成**。 diff --git a/docs/rust-cli/legacy-v1-protocol-map.zh-CN.md b/docs/rust-cli/legacy-v1-protocol-map.zh-CN.md new file mode 100644 index 0000000..0fb1342 --- /dev/null +++ b/docs/rust-cli/legacy-v1-protocol-map.zh-CN.md @@ -0,0 +1,32 @@ +# legacy-v1 入口协议与退出码映射 + +本表只描述插件旧入口的既有行为,供 Rust C35 兼容层逐项实现。旧版返回 0、MCP 工具调用成功或 Hook 放行,均**不等于**新版交付 `allow`;Rust 投影固定 `new_delivery_decision=not_evaluated`。新版 CLI 的 0/1/2/3/4/130 协议独立计算,不能直接透传旧数字。来源为当前插件旧入口和应用服务;[旧源码增量](legacy-delta-20260924.zh-CN.md)记载与早期设计快照的差异。 + +## CLI 入口 + +| 旧入口 | 旧数字和混合优先级 | 0 的实际含义及迁移边界 | 来源 | 验收入口 | +|---|---|---|---|---| +| `bin/codeguard` 默认、`check` | `FAIL→2` 优先于 `UNVERIFIED/PLANNED→1`;仅 PASS/SKIPPED→0;空语言→1;argparse 用法错→2 | 可能只有 SKIPPED,不代表完整项目质量通过;MCP 模式另列 | `bin/codeguard`、`scripts/run_check.py::cli_main`、`scripts/codeguard/verdict.py::exit_status` | Rust `legacy_v1_protocol_contract`;旧 `tests/test_verdict_integrity.py` | +| `fix` | 任一 formatter 失败、未配置而返回 PLANNED、UNVERIFIED 或无识别语言→1;全部成功/跳过/显式 dry-run、无 Git 改动或无适用文件→0;argparse 错→2 | 空 `run_fix` 结果不足以区分“无语言”和“无适用文件”,兼容层必须保留入口分支;formatter 成功不证明文件改变,仍须复检 | `scripts/fix.py::main`、`scripts/codeguard/language_check.py::run_fix` | Rust 参数表;旧 `tests/test_cli_contracts.py`、`tests/test_cli_fix_reporting.py` | +| `cve` | `FAIL→2` 优先于 `UNVERIFIED→1`;空结果→1;全 PASS→0;参数/生态/严重度错→3 | 只是旧阈值下各生态结果;不能用 2 推断新版 CLI 用法错 | `scripts/cve_check.py::main`、`scripts/codeguard/cve_policy.py::aggregate_exit` | Rust 参数表;旧 `tests/test_cve_boundaries.py` | +| `dockerfile` | 任一 UNVERIFIED 或无目标→1,即使同批有 FAIL;完整且有 FAIL→2;全 PASS→0;argparse 错→2 | 混合结果中的风险仍留在报告;退出 1 不得丢掉已确认发现 | `scripts/dockerfile_security.py::main`、`scripts/codeguard/dockerfile_reports.py::aggregate_status` | Rust 参数表;旧 `tests/test_dockerfile_boundaries.py` | +| `detect` | 有根及无根的正常查询→0(无根输出 `[]`);配置错误→1 | 只是发现操作,`[]` 不能签发空项目质量通过 | `scripts/detect_lang.py::main` | Rust 参数表;旧 `tests/test_cli_contracts.py` | +| `init` | 总是输出人工引导并返回 0,不写项目 | 旧引导完成不等于 Rust `init --apply` 或任何检查完成 | `bin/codeguard` 的 `init` 分支 | Rust 参数表;旧 `tests/test_cli_contracts.py` | +| `java-plan` | `UNVERIFIED→1`,其余计划状态→0;argparse 错→2 | 只读计划,未执行 Java 构建或检查 | `scripts/java_project.py::main` | Rust 参数表;旧 `tests/test_java_project_impact.py` | +| 未知子命令 | wrapper→1;诊断写 stderr | 新版未知命令走自身用法协议,不能套旧 1 | `bin/codeguard` 默认分支 | Rust 参数表 | + +`run_check.py --mcp` 是旧 MCP **服务器生命周期**入口:SDK 缺失时进程返回 1,启动服务后退出 0。服务退出 0 不表示任何工具调用或质量检查成功。`check_code_style` 返回逐语言数组,保留 `passed/status/reason/exit_code/log_path`;`auto_fix` 返回修复尝试与复检摘要;`list_languages` 只返回 ID/名称;`analyze_java_impact` 返回只读计划。四种工具返回的是 MCP 文本块中的 JSON payload,**没有**可直接映射的每次调用进程退出码;配置损坏可返回 `UNVERIFIED/exit_code=1` 的工具 payload,未知工具返回 `error` 对象。来源:`scripts/run_check.py::mcp_main`、`scripts/codeguard/check_application.py::mcp_tool_payload`;旧 `tests/test_mcp_server.py` 和 `tests/test_mcp_autofix_identity.py` 继续覆盖真实旧 SDK 接口。C35 的 MCP 接线与宿主验收另由 11.1/11.3 承担,本表不把服务存活变成新版认证。 + +## 五类 Hook + +| 旧事件 | 旧退出/反馈 | 新版边界 | 来源与旧夹具 | +|---|---|---|---| +| SessionStart | 0;stdout 人类可读摘要;未捕获异常 stderr 提示并 exit 0 | 环境信息不等于检查通过 | `hooks/env_check.py`;`tests/test_startup_application.py` | +| UserPromptSubmit | 0;命中时 stdout `hookSpecificOutput.additionalContext`;内部异常 exit 0 | 观察型软反馈不阻断交付 | `hooks/user_prompt_validator.py`;`tests/test_prompt_application.py` | +| PreToolUse Bash | 0 放行或附 `additionalContext` 的未验证;2 拦截并在 stderr 给修复指令;内部异常 exit 0 | 旧 2 是宿主拦截,不是新 CLI 用法错;旧 0 包含 fail-open,不能当 `allow` | `hooks/pre_tool_git_guard.py`、`scripts/codeguard/git_guard_application.py`;`tests/test_git_guard_application.py` | +| PostToolUse Write/Edit/MultiEdit | 0;stdout 可含 JSON 反馈与 systemMessage;内部异常 exit 0 | 保存反馈不承担质量门禁 | `hooks/post_tool_lint.py`;`tests/test_save_application.py` | +| Stop | 0;stdout 会话摘要;内部异常 exit 0 | 历史计数不替代完整交付检查 | `hooks/stop_summary.py`;`tests/test_session_application.py` | + +PreToolUse 当前源码还会在无法准确解析 Git 意图、没有可定位仓库等情况下返回 2;这与旧 `hooks/__protocol__.md` 中“仅已确认 lint 失败才 exit 2”的文字不完全一致。C35 必须先按真实旧源码和宿主实测固定此分支,不得以旧文档的概括删掉阻断或把不可确认意图伪称为已确认源码违规。`codeguard.skipGate`/`CODEGUARD_SKIP_GATE` 和 Hook fail-open 仅归 legacy-v1;新版交付门禁按独立完整性与受保护策略判定。 + +Rust `crates/codeguard-cli/src/legacy_v1_protocol.rs` 只承接**已经归类**的旧信号,拒绝不支持的入口/信号组合。它没有调用 Python、没有运行原生检查器,也不签发质量结果。C35 仍须实现旧 argv、字段、MCP/Hook 宿主接线及每种入口的真实回放;本表与纯映射测试不能替代这些运行时验收。 diff --git a/docs/rust-cli/project-initialization.zh-CN.md b/docs/rust-cli/project-initialization.zh-CN.md new file mode 100644 index 0000000..0837d9a --- /dev/null +++ b/docs/rust-cli/project-initialization.zh-CN.md @@ -0,0 +1,205 @@ +# Codeguard 项目初始化与 AGENTS.md 接入 + +`codeguard init` 目标是建立可追溯的项目画像、检查准备清单和智能体工作入口。当前相邻 Rust CLI 已实现只读预览、不覆盖人工文件的工作区创建、根 AGENTS.md 的精简受管区块,以及对静态清单、锁文件和源码路径集合变化的受控刷新;准备任务、可信策略、完整输入关系和跨外部编辑器的强制并发保护仍待实现,apply 明确返回 partial。本文描述目标设计及已标明的局部实现,不是本插件仓库的实际画像。 + +规范事实源为本 change 的 [project-initialization](../../openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md),修复循环沿用 [持久工作流](remediation-workflow.zh-CN.md)。 + +## 1. 初始化要回答的问题 + +| 初始化内容 | 识别结果与依据 | 对后续工作的作用 | +|---|---|---| +| 项目边界 | 指定根目录、Git 根、worktree、monorepo、多构建根、子仓边界 | 避免把工作区或相邻仓库当成一个项目 | +| 语言与版本 | 语言/方言、声明版本、编译目标、锁定/实际解析版本、本机版本分开记录 | 避免用本机 JDK/Python 版本替代项目目标版本 | +| 构建与包管理 | Maven/Gradle/Cargo 等清单、wrapper、包管理器、lockfile、workspace、profiles/features/targets | 形成可执行的项目级检查计划 | +| 框架与关键技术 | Web 框架、ORM、数据库驱动、消息/缓存组件及声明来源 | 选择兼容规则和所需运行条件;不声称服务已经启动 | +| 模块与依赖图 | 构建模块、包/源码根、直接/传递依赖、测试/运行/构建范围 | 计算修复影响面,决定模块或项目级复检 | +| 架构画像 | 表现层组织、领域组织、依赖方向、部署单元分别描述 | 给智能体上下文,明确已确认边界和待确认推断 | +| 源集与特殊目录 | 生产代码、测试、生成代码、第三方代码、fixture、迁移脚本 | 为各检查类别建立正确目标,候选排除不自动生效 | +| 现有规则 | lint、注释、格式、安全、CVE、原生 suppression、AGENTS/CLAUDE 约束 | 复用已有接入,暴露与批准策略的冲突 | +| 测试与验证方式 | 测试框架、单元/集成测试命令、测试环境依赖、已有 CI 中允许观察的配置 | 区分声明命令和已实际验证命令 | +| 工具准备情况 | 已安装/未探测/缺失/不兼容、网络/漏洞库前置条件 | 将准备问题变成环境 blocker,而非代码违规 | +| 外部依赖前置条件 | 构建/测试需要的数据库、容器、私有依赖凭据名称等 | 说明恢复条件;不读取或写入凭据值,不启动服务 | +| 既有工程流程 | OpenSpec/Spec Kit、可用 CodeGraph、现有 Git hooks/CI 接入、子目录指令 | 接入现有工作方式,不重复初始化其它工具 | + +产品版本、语言版本、编译目标、构建器版本、依赖版本和实际安装版本必须是不同字段。例如“项目声明 Java 17、本机 JDK 未探测”是有效画像;不能看到本机 JDK 21 就把项目写成 Java 21。 + +## 2. 架构识别不能靠目录名定案 + +MVC、DDD、分层、六边形和微服务描述不同维度,可以同时存在。画像按项目或模块记录以下维度: + +- 表现层:例如 Controller/接口适配层及入口。 +- 领域组织:业务模块、领域模型、候选限界上下文。 +- 依赖结构:层间引用、模块方向、端口与适配器边界。 +- 部署形态:声明的应用/服务/作业单元,实际部署拓扑若无证据保持未知。 + +每条结论标记 `declared / observed / inferred / confirmed / unknown / stale`,附来源路径、位置或配置键、内容摘要和检测器版本。`confirmed` 表示有可核验的人工架构声明确认,不等于扫描器证明项目完整遵守该架构;来源变化后须标 stale 并重新核对。 + +存在 `domain/`、`repository/` 或 `controller/` 只能构成线索,不能直接写“项目采用 DDD,因此必须重构为 DDD”。源码证据与 README/ADR 冲突时同时展示,创建确认任务;无法确定业务边界时保留候选。推断结果不直接变成阻断规则,只有批准后的结构约束才能通过确定性检查器执行。 + +AI 可以解释证据、提出候选分层与修复建议,但不得将判断直接升级为批准的工程约束。 + +## 3. 模块图的类型与完整性 + +`module-graph.json` 记录带类型的节点和边: + +| 类型 | 示例 | 边界 | +|---|---|---| +| contains | workspace 包含 module | 构建聚合不等于代码依赖 | +| build_dependency | 模块依赖另一个模块编译 | 携带 scope、profile/feature 条件 | +| source_reference | 源码 import/use 引用 | 不自动等于运行时调用 | +| external_dependency | 模块依赖某个包 | 区分声明范围与已解析具体版本 | +| declared_service_relation | 文档/配置声明服务调用或消息关系 | 没有运行证据不声称实际调用已验证 | +| candidate_business_boundary | 候选业务模块或限界上下文 | 属于推断,待确认,不自动裁剪检查范围 | + +每条边保留来源、条件、完整性和观察身份。动态 Gradle/POM profile、反射、依赖注入或运行时生成关系无法静态确定时标 `unresolved`。空图或未找到引用不等于“无依赖”;未证明完整的图不能支撑缩小质量检查范围。 + +已有 CodeGraph 时先核对索引与内容身份,符合条件可作为附加源码关系证据;未建立或过期时不静默安装、初始化、更新索引,也不将其作为 init 的硬依赖。语言原生构建模型仍提供相应构建事实。 + +## 4. 产物与事实源 + +在既定工作区中补充三个画像产物,并在被检查项目 AGENTS.md 写受管摘要: + +```text +project/ +├── AGENTS.md # 保留人工内容,添加 Codeguard 受管区块 +└── .codeguard/ + ├── workspace.json # 身份/schema/受管文件清单及画像引用 + ├── project.json # 结构化项目画像、依据与未知项 + ├── module-graph.json # 有类型/条件/证据的模块关系 + ├── architecture.md # 项目结构与依赖图的可读投影 + ├── findings/ # 已确认检查发现与初始化 blocker + ├── tasks/ # 工具准备、架构确认和修复任务 + └── ... # 沿用已确认的其它目录 +``` + +`project.json`/`module-graph.json` 是观察结果,`architecture.md` 和 AGENTS 受管区块是可重建投影。质量政策仍由既有可信配置提供;画像不是另一份规则文件,编辑画像不能取消检查。 + +画像默认可提交,但只保留脱敏且跨机器有意义的信息。真实本机绝对路径、实际安装位置、会话状态和探测诊断进入 Git 忽略的 state/reports;受管 AGENTS 只链接画像与可重复命令,不固化某开发者机器环境。 + +输入清单包括实际读取的 manifest、锁文件、指令、源码关系证据与它们的哈希。新增/删除相关文件同样影响身份;不能只核对“上次存在的文件”。构建/锁/规则/模块变化后标记对应画像过期,重新 init 生成差异,保留 findings/events 与人工备注。 + +当前局部实现把受管投影摘要写入 `workspace.json` 0.3,并给工作区分配稳定 `workspace_id`:首次由规范化根路径摘要形成,后续刷新沿用已保存身份;旧 0.1/0.2 工作区可受控升级。该 ID 只用于本地报告归属与未来同步幂等键,不是授权或质量证据。`project.json` 记录已发现的构建清单、锁文件、旧语言清单中精确登记的单文件检查器配置字节摘要,以及各语言源码路径集合摘要;`package.json` 的包版本与语言目标版本分开,后者无证据时保持 unknown。静态模块图的 Maven 声明(0.2 起,当前图为 0.3)保留构建根 `contains`,并区分 Maven `modules` 的 `aggregation` 与完整唯一坐标支持的直接 `build_dependency` 声明。声明边记录清单及 SHA-256、scope 与声明条件,不代表 Maven 生效模型;父 POM、profile、变量、管理版本、特殊依赖属性和重复坐标保留具体 unresolved。旧 0.1 schema 单独保留;所有图仍固定依赖覆盖不完整,不据此缩小检查范围。新增、修改、删除这些已识别配置会令 `profile_stale=true`;输入无法完整读取时 freshness 为 unknown,而不是假称 fresh。点前缀范围仅对旧清单明确列出的单文件配置及既有 Ruff/预提交配置开放,其它点文件仍跳过;嵌套点配置目录尚未处理。配置文件存在只是一条观察证据,不能据此宣称检查器已配置或规则已执行。重新 init 仅替换能由上次摘要证明仍是 Codeguard 所生成的文件和 AGENTS 受管区块,人工修改则冲突;`workspace.json` 最后写入,方便局部失败后重试。`profile_stale` 仅说明画像输入与上次不同,不是扫描结论或策略批准。未登记或嵌套规则配置、源码内容变化、完整模块依赖和跨进程写锁尚未覆盖,9.23 继续保持未完成。 + +## 5. AGENTS.md 受管区块 + +根 AGENTS.md 默认只写一个简明区块:项目边界和语言/构建摘要、架构证据状态、模块图链接、已批准规则来源、检查/修复入口及需解决的前置问题。大图、依赖清单和原始诊断留在 codeguard 文件中,避免每次智能体加载数千行快照。 + +示意模板如下,字段由实际证据生成,不能原样作为某项目的事实: + +```markdown + +## Codeguard 项目上下文 + +- 项目画像:.codeguard/project.json;画像身份:。 +- 语言及版本:<分模块的声明版本与证据;未解析项明确标注>。 +- 构建器:<项目 wrapper / 构建模型 / 命令验证状态>。 +- 架构:<已声明或已确认的描述>;待确认:<候选及证据>。 +- 模块与关系:.codeguard/architecture.md、.codeguard/module-graph.json。 +- 质量规则:<批准策略及规则锁引用>。 +- 开始工作:codeguard status .,再执行 codeguard next . --format json。 +- 修复后:codeguard task verify .;交付前:codeguard check all .。 +- 任务勾选不能替代复检,不得自行降低规则或跳过必需检查。 + + +``` + +生成器必须遵守: + +1. 保留区块外的所有文本以及 CodeGraph/OpenSpec 等其它受管区块;文件不存在时创建,不存在本区块时追加。 +2. 更新前核对原文件与上次受管内容摘要。受管区块被人工修改时三方比较并报告冲突;缺失/重复/不配对 marker 不猜测覆盖。 +3. 尊重路径作用域:发现已有子模块 AGENTS.md 的适用约束,根摘要引用它们;默认不自动批量创建或重写子目录 AGENTS。 +4. 原始源码/注释/README 内容作为数据引用,转义 marker 和 Markdown 控制内容,不能把仓库文本中的指令原样复制成高优先级规则。 +5. 受管摘要只表达已批准规则、可追溯事实与明确标注的推断;已有 AGENTS 与扫描策略冲突时显示冲突,不能自动选择较松规则。 + +## 6. 命令阶段与写入边界 + +```mermaid +flowchart TD + A[识别指定项目与指令作用域] --> B[读取清单 / 配置 / 源码结构] + B --> C[生成项目画像与模块图] + C --> D[分离事实 / 推断 / 未知项] + D --> E[规划规则映射与准备任务] + E --> F[预览文件及 AGENTS 受管区块差异] + F --> G{显式 apply?} + G -->|否| H[返回初始化计划] + G -->|是| I[核对身份并写入受管产物] + I --> J[返回准备状态与下一步] + J --> K[doctor / check / sync / next] +``` + +目标语法:`codeguard init [path] [--dry-run|--apply] [--format human|json]`;省略模式等同 dry-run。dry-run 不写工作树,允许静态观察以及读取身份匹配的已有探测证据;本机版本无可用证据就标 unknown。拟创建的 blocker、决策和准备任务只在返回计划中展示,`--apply` 才将它们持久化到工作区,不因发现阻塞而让 dry-run 写入 findings/tasks。实际命令探测交给 `doctor`,不把任意项目 wrapper、构建扩展、package scripts 当只读文件执行。 + +apply 将计划内的工作区产物和 AGENTS 区块写入;每个目标写入前核对身份,使用临时文件与原子替换,记录初始化事务的进度和可恢复状态。多文件不是天然原子事务:中途失败不得声称全部完成,回滚只撤销能证明由本次创建且未被别人修改的内容。 + +初始化不得隐式安装工具、下载依赖、启动数据库/容器、执行构建/测试、修改业务源码、接管 Git hooks、写 CI 配置或初始化其它规格/图工具。这些事项形成有明确作用范围和前提的后续动作,不与生成项目画像混在一起。 + +当前点前缀默认扫描政策保持。已有批准配置发现机制可读其允许的配置文件;新画像探测器若需要读取额外点路径,必须提出精确 metadata allowlist 的政策变更,获准前该部分保持 unknown,不偷偷遍历隐藏源码或宿主目录。 + +## 7. 初始化成功与项目就绪 + +报告分别提供 `operation=init`、`mode`、`init_status=planned|applied|conflict|partial`、`readiness=ready|incomplete|unknown`、`unresolved`、`changed_files` 和 `next_actions`。初始化文件完整生成可以 exit 0,同时 readiness=incomplete;这不能映射成 check PASS 或 delivery allow。写入冲突/部分失败按操作未完成退出 3,内部故障退出 4。 + +准备状态依据已批准检查义务及选中适配器,汇总**适用且必需**的前置条件: + +| 条件(按表中顺序判断) | readiness | +|------|------| +| 已确认任一必需前置条件缺失、不兼容或冲突 | `incomplete` | +| 否则,必需条件集合尚不能确定,或其中仍有未探测、未解析、过期的证据 | `unknown` | +| 否则,所有适用必需条件都有身份匹配且有效的满足证据 | `ready` | + +未识别出任何适用检查义务时返回 `unknown` 并说明原因,不以空集合证明已就绪。可选工具缺失不影响该汇总;架构候选未确认仅在必需规则依赖它时影响准备状态。`ready` 只说明前置条件满足,不能代表代码质量通过。 + +已确认的必需工具缺失不会阻止保存真实的项目画像,而是形成 blocker;尚未探测的版本形成探测动作,不伪称缺失。架构候选需要确认时形成 `needs_decision` 任务,不能强迫每个项目先选择一种架构。上述任务在 dry-run 中仅规划、apply 后才持久化。 + +建议初始化后工作顺序: + +```bash +codeguard init . --dry-run +codeguard init . --apply +codeguard doctor all . --format json +codeguard check all . --format json +codeguard work sync . +codeguard next . --format json +``` + +首次完整检查建立问题清单,不自动创建存量豁免。无法运行的检查保持未完成,缺失前置条件成为可处理任务。工具准备/集成已有授权时由插件继续执行相应步骤;否则给出具体动作和所需信息,不能因 init 成功停止整个修复流程。 + +## 8. 验收场景 + +- Java 17 项目在 JDK 21 或无 JDK 的机器初始化:声明版本不被覆盖,本机未知不伪造结果。 +- 一个仓库含 Java、TypeScript、Python 多构建根:逐根记录而非只取主语言。 +- 聚合模块互不依赖:contains 不误写成 build_dependency。 +- 存在 domain/controller 目录但无架构声明:产生候选和依据,不激活 DDD 强制规则。 +- AGENTS 有人工内容、其它受管块或子目录约束:完整保留;并发修改产生冲突。 +- wrapper 脚本有副作用:dry-run/apply 均不执行它,探测保持待验证。 +- dry-run 发现已确认的环境阻塞:返回拟创建任务,工作树无新增或修改。 +- 可选工具缺失而必需工具尚未探测:readiness=unknown;不得因可选项误阻塞或将未探测伪称缺失。 +- 新增模块/更改锁/删除构建清单后重新 init:画像失效并刷新,原问题与历史仍保留。 +- 工具未安装但产物生成成功:init_status=applied、readiness=incomplete,交付状态不变。 +- 受管投影被篡改或删除:不能改变有效策略或凭此证明检查已通过。 + +### Cargo 静态声明关系的实施边界 + +当前模块图 0.3 还观察 Cargo 明确成员与本地路径依赖,分别表达 aggregation 和 declared build_dependency,绑定 Cargo.toml 原始字节摘要;依赖保留 normal/build/dev 范围,并按 package 字段处理重命名、核对目标真实包名。仅连接项目内已观察且可定位的目标。workspace 继承、optional/target 条件、成员通配/排除、外部或缺失目标与逃逸路径保留具体 unresolved,版本约束和 feature 也未由原生模型解析。init 不运行 cargo/build.rs 或创建 Cargo.lock/target。历史 0.1/0.2 schema 单独保留;图不证明完整有效模型,不用于缩小检查范围。 + +### 逐清单语言目标的实施边界 + +project.json 0.3 的 language_targets 按清单保存直接 Java maven.compiler.release/source/target 与 Rust rust-version/edition,每条附 build_root、manifest_ref、manifest_sha256,状态为 declared_only。不同模块的值分别保留;汇总 declared_version 与未探测 installed_version 仍为空,不以包版本、另一个模块或本机工具猜测。变量、workspace 继承、重复/嵌套/分段 XML 字段及非法值记录具体 unknown_conditions,不展开 Maven profile/父模型或 Cargo 继承。声明不是生效构建模型,也不激活质量门禁。历史 profile 0.2 schema 单独保留;其它生态与完整版本解析仍未实施。 + +### Maven/Cargo 直接包版本的实施边界 + +已有 package_declared_versions 现在按 Maven/Cargo 清单保存直接包版本,与同批初始清单字节的 manifest_sha256 对应。Maven 不要求完整 GAV,也不读取父/profile 版本;只观察有界字面值,不证明生效版本语义。Cargo 直接字符串须符合 SemVer,保留预发布和构建标识;继承、变量、错类型及非法值显式 unknown,不恢复默认值。包版本不能代替语言目标或本机版本。变更刷新保留人工任务记录,重复初始化幂等;不执行 Cargo/Maven 或产生构建产物。现有 profile 0.3 协议不新增字段;完整有效模型与其它生态仍待实现。 + +### 初始化结果的对话反馈 + +init_plan 0.4 在默认 dry-run 与 apply 都返回 profile_summary:语言及源码/清单数量、构建根、逐清单语言目标与具体未知项。human 从相同结构展示,路径和字段按 JSON 字符串转义,防止不可信目录名伪造终端状态。dry-run 不需写入 .codeguard/ 即可看到结果;摘要不含原始清单内容或本机根路径。本机版本 not_probed、构建模型 not_resolved、架构 unknown;readiness 仍 unknown、交付 not_evaluated。旧 init_plan 0.3 schema 单独保留。完整前置清单及 readiness 汇总仍待实施。 + +### 检查配置与执行状态的反馈 + +init_plan 0.5 的 profile_summary.checkers 按构建根展示 configured/missing/invalid/unknown,并附 configuration_ref、reason 和 next_action。每条 execution=not_run、required_by_policy=null、gate_effect=none,checker_inventory=partial;JSON/human 一致。配置已声明不代表执行成功,缺配置不自动生成代码违规或开启检查器,未知继承不猜测为 missing。readiness 仍 unknown、交付 not_evaluated。旧 init_plan 0.4 schema 单独保留,批准义务和准备任务仍待接入。 + +### 准备状态的领域判定 + +核心 plan_preparation 可据同次 readiness 输入生成稳定的准备任务:有效必需缺失、不兼容、冲突分别给出恢复、兼容性复核和冲突决策;未知/过期/错绑定只要求重新核验,不复用历史缺失诊断。可选、不适用、已满足条件不生成修复任务;未核验来源或非法/重复要求只保留诊断。任务逻辑键在工作区内稳定,绑定变化更新证据,不产生重复任务。固定步骤及关闭条件要求当前有效满足证据,不能通过勾选关闭或自动安装/执行;规划不产生质量 allow。可信输入生产、完整证据/尝试关联、持久化及 CLI 接线尚未完成。 + +核心 evaluate_readiness 已区分 ready/incomplete/unknown。输入要求与观察须由可信宿主验证;只处理适用必需前置,并核对当前绑定和有效期。当前必需缺失/不兼容/冲突优先 incomplete;未探测、未解析、过期、错绑定、集合不完整或没有已确认适用必需条件为 unknown;全部有效满足才 ready。可选条件不影响汇总,重复/歧义不能选择有利证据。结果仅含前置阻塞/未知 ID 和诊断码,不生成交付 allow。CLI 尚无可信来源接线,init 仍保持 unknown,准备任务持久化及实际入口仍待实施。 diff --git a/docs/rust-cli/remediation-workflow.zh-CN.md b/docs/rust-cli/remediation-workflow.zh-CN.md index 3259a19..e00927e 100644 --- a/docs/rust-cli/remediation-workflow.zh-CN.md +++ b/docs/rust-cli/remediation-workflow.zh-CN.md @@ -1,8 +1,10 @@ # Codeguard 持久问题与修复工作流 -Codeguard 在项目根创建 `./codeguard/`,将“发现问题 → 形成任务 → 指导修复 → 原工具复检 → 关闭或重开”变为可恢复的工作流。目录既服务人,也服务智能体;检查器负责事实,工作流负责下一步,批准策略决定交付。 +Codeguard 在项目根创建 `./.codeguard/`,将“发现问题 → 形成任务 → 指导修复 → 原工具复检 → 关闭或重开”变为可恢复的工作流。目录既服务人,也服务智能体;检查器负责事实,工作流负责下一步,批准策略决定交付。 -状态:待实现设计。本篇补充 [架构](architecture.zh-CN.md) 和 [技术方案](technical-design.zh-CN.md),规范为 [remediation-workflow](../../openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md)。已有 OpenSpec 管理 Codeguard 自身开发规格;项目内 `codeguard/tasks/` 管理被检查项目的修复任务,两者不能互相充当完成证明。 +状态:设计及 Ruff 局部实现。本篇补充 [架构](architecture.zh-CN.md) 和 [技术方案](technical-design.zh-CN.md),规范为 [remediation-workflow](../../openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md)。已有 OpenSpec 管理 Codeguard 自身开发规格;项目内 `.codeguard/tasks/` 管理被检查项目的修复任务,两者不能互相充当完成证明。 + +当前相邻 Rust CLI 已将初始化工作区的 `lint python` 局部结果保存到本地 reports、自动同步,再在同一对话反馈中返回只读下一步简报。同步对本轮原生完整、目标源码仍相同的 Ruff 发现创建脱敏 finding、首次事件和可读任务;缺工具、缺配置等不完整文件创建独立环境 blocker,同一构建根及原因归并,不同构建根分开。重复扫描保留稳定任务,Ruff finding 的每轮报告摘要、源码摘要、行号及 run ID 写入本地 `state/observations/`,同内容重复扫描不新增可提交审计事件;blocker 当前仍为每轮写观察事件。局部 `task verify` 已能重跑原生 Ruff、保存新发现与本地复检观察;原问题消失只进入待策略核验,未正式关闭。Rust Clippy 的局部发现和环境任务也已同步到相同工作台,`task verify --cargo-tool` 会调用原生 Clippy 并保存复检观察;零诊断会对原规则运行原生 `--force-warn` 对照;重现即核查抑制,未重现也只形成待策略核验候选,不能直接关闭任务。Unix 本地 `task claim/heartbeat/release` 已能用跨进程锁和 token/generation 协调同工作区任务,局部 attempt 与 verify 已接入租约;受控 fix 和可信关闭仍缺。过时报告不产生当前源码修复任务,坏报告不阻止其它有效报告;记录故障在对话中显示 `backlog_update_failed`,简报读取故障单独显示 `repair_brief_status=unavailable`。这一切仍为局部待办工作,命令固定返回未认证语义;插件 Hook/MCP、完整 RunReport、正式任务复检关闭和 gate 仍未接线。验收证据见相邻 `codeguard-cli/tests/acceptance/work-sync-ruff-baseline.md`、`codeguard-cli/tests/acceptance/lint-python-auto-brief.md`、`codeguard-cli/tests/acceptance/task-verify-native-observation.md`、`codeguard-cli/tests/acceptance/check-all-partial-native.md` 与 `codeguard-cli/tests/acceptance/task-lease-local.md`。 ## 1. 为什么需要持久工作区 @@ -21,7 +23,7 @@ Codeguard 在项目根创建 `./codeguard/`,将“发现问题 → 形成任 project/ ├── codeguard.json # 已有配置入口,继续唯一 ├── codeguard.lock.json # 工具/adapter/rulepack 锁 -└── codeguard/ +└── .codeguard/ ├── .gitignore # 忽略下面的本地运行数据 ├── README.md # 本项目工作流说明与常用命令 ├── workspace.json # 工作区 ID/schema/受管路径清单 @@ -57,11 +59,13 @@ README、workspace manifest、脱敏 findings/events、任务文档与决策引 `workspace.json` 不是第二份质量配置。它只描述此工作区 schema、ID 和受管文件集合;质量要求仍来自 `codeguard.json` 引用的可信策略和 lock。任何普通文件中的“approved”都不构成授权。 -项目尚未初始化时,check 的原始报告写入私有用户缓存,不自行创建未被 Git 忽略的 codeguard/runs;初始化后才按固定目录路由本地证据。现有文件进入受管范围需要精确的初始化计划,不能仅靠同名目录推定所有权。 +init 还生成 `project.json`、`module-graph.json` 与 `architecture.md`,并在项目 AGENTS.md 写受管摘要;workspace 清单引用这些画像,详细职责见 [初始化设计](project-initialization.zh-CN.md)。它们属于可提交的脱敏观察/投影,按精确受管路径校验,不是质量政策。 + +项目尚未初始化时,check 的原始报告写入私有用户缓存,不自行创建 `.codeguard/runs`;初始化后才按固定目录路由本地证据。现有文件进入受管范围需要精确的初始化计划,不能仅靠同名目录推定所有权。 ### 防止 Codeguard 检查自己的运行产物 -`codeguard/` 不是点目录,不能依赖现行点前缀规则排除。新增明确的“工具自身产物”范围契约:初始化清单绑定的 reports/runs/cache/worktrees/state 与生成 finding/task 文件不进入被测项目的普通源码发现,而由 Codeguard 自己进行 schema、路径和脱敏校验。 +`.codeguard/` 是点目录,按现行点前缀规则不进入普通源码发现。初始化清单绑定的 reports/runs/cache/worktrees/state 与生成 finding/task 文件仍由 Codeguard 自己进行 schema、路径和脱敏校验;被忽略的普通扫描范围不自动取得策略批准或入库安全豁免。 不得简单忽略所有名为 codeguard 的目录;已有 `codeguard/src/`、用户文件和未声明路径照常检查。受管路径必须来自经过校验的生成器清单,不接受 agent 任意扩张排除。入库安全检查仍覆盖拟提交的记录,不能借工具产物身份提交密钥。此新增规则须随本 change 明确更新 scan-scope-policy,现行点前缀规则保持不变。 @@ -110,11 +114,11 @@ stateDiagram-v2 `state/` 中使用跨进程锁和带到期的 task lease;claim/heartbeat/release 通过 CLI 完成。租约只防止同工作区重复劳动,不授权改质量规则。不同机器通过独立分支提交事件,合并后按父关系核对;远程全局调度不在初版保证内。 -同一问题在同一内容/策略下反复扫描,只更新本地 last_seen 和 runs,不反复改 tracked finding/task 文件。发现集合、修复状态或重要上下文变化才生成持久事件,减少 Git 噪声。保存 Hook 不自动把一整份持久清单刷进用户工作树。 +同一问题在同一内容/策略下反复扫描,只更新本地观察和 runs,不反复改 tracked finding/task 文件。复检后重新检出可追加一次恢复待处理事件,后续相同扫描仍只更新本地观察;发现集合、修复状态或重要上下文变化才生成持久事件,减少 Git 噪声。保存 Hook 不自动把一整份持久清单刷进用户工作树。 ## 6. CLI 工作流 -```bash +```text codeguard init . --dry-run codeguard init . --apply @@ -124,24 +128,28 @@ codeguard status . codeguard next . --format json codeguard task show CG-abc123 . codeguard task claim CG-abc123 . --owner agent-session-1 -codeguard task attempt start CG-abc123 . --owner agent-session-1 +codeguard task attempt start CG-abc123 . --owner agent-session-1 --lease-token --action-id <简报动作ID> # 智能体按照任务修改源码或修复环境 -codeguard task attempt finish CG-abc123 . --owner agent-session-1 --outcome ready-to-verify -codeguard task verify CG-abc123 . --format json -codeguard task release CG-abc123 . --owner agent-session-1 +codeguard task attempt finish CG-abc123 . --owner agent-session-1 --lease-token --attempt-id --outcome ready-to-verify +codeguard task verify CG-abc123 . --owner agent-session-1 --lease-token --format json +codeguard task release CG-abc123 . --owner agent-session-1 --lease-token codeguard check all . --format json ``` -`init --dry-run` 输出创建/冲突清单;`--apply` 只创建自有工作区文件,不覆盖已有目录内容或修改质量阈值。已存在同名用户目录时合并计划须精确到文件,冲突路径拒绝写入;不以 `--force` 吞掉用户文件。 +上例占位符从前一步结构化结果取得;详细参数与 C23–C33 契约见 [逐指令设计](command-architecture.zh-CN.md)。claim 返回不可复用 token/generation,不能仅用同名 owner 续租、结束尝试或释放新租约。受控 fix 可携带 task/owner/token 复用租约并自行登记 attempt,插件不能再为同一修复重复 start/finish。 + +`init --dry-run` 输出项目观察、画像和文件创建/更新/冲突清单;省略模式同样只读。`--apply` 写入计划中的自有工作区文件与 AGENTS 受管区块,不覆盖人工内容或修改质量阈值。已存在同名用户目录时合并计划须精确到文件,冲突路径拒绝写入;不以 `--force` 吞掉用户文件。 `work sync` 消费与当前工作区绑定、schema 有效的本地报告,生成/归并记录与任务。默认按 run_id 游标幂等消费所有尚未导入的匹配报告;同一内容先 lint 再 CVE 的报告必须合并,不能只取最后一份。每份报告分别验证内容、政策、工具与检查范围;已过时的报告可保留历史,但不能导入为当前事实。部分报告只能增加有效发现/阻塞,不能据未出现自动关闭旧问题,完整报告也不能跨未覆盖范围关闭。 -`status/next/task show` 只读;`next` 不自动领取,返回最适合推进的任务和选择理由。`claim/release/heartbeat` 只改本地 lease。`task verify` 运行该问题及受影响范围的真实检查并按证据追加事件;不等于全项目 gate。CLI 不提供无需证据的 `task close --force`。 +`status/next/task show` 只读;`next` 不自动领取,返回最适合推进的任务和选择理由。`claim/release/heartbeat` 正常操作只改本地 lease;过期恢复遇到未结束attempt时先追加abandoned事件和预算记录,再取得新租约,恢复失败不能假称已接续。`task verify` 运行该问题及受影响范围的真实检查并按证据追加事件;不等于全项目 gate。CLI 不提供无需证据的 `task close --force`。 + +`task attempt start/finish` 登记尝试 ID、动作指纹、执行者、前后内容/patch 摘要与结果;finish 的枚举是 ready-to-verify、no-change、failed、blocked,不能直接 resolved。受控 `fix --apply` 自动写这些事件;dry-run 只预览,不消耗修复预算。自由源码修改由插件在修复回合前后调用。中断未 finish 的尝试在租约恢复时记 abandoned,不捏造成功;无修改和复检前失败也进入 prior_attempts/预算。agent 自述原因作为备注,实际内容变化由 CLI 观察,不能由 agent 自报成功关闭。 -`task attempt start/finish` 登记尝试 ID、动作指纹、执行者、前后内容/patch 摘要与结果;finish 的枚举是 ready-to-verify、no-change、failed、blocked,不能直接 resolved。受控 `fix` 自动写这些事件;自由源码修改由插件在修复回合前后调用。中断未 finish 的尝试在租约恢复时记 abandoned,不捏造成功;无修改和复检前失败也进入 prior_attempts/预算。agent 自述原因作为备注,实际内容变化由 CLI 观察,不能由 agent 自报成功关闭。 +doctor 的准备证据和检查报告均绑定 run_id,按 workspace_id + run_id + 报告摘要校验幂等性;同键不同摘要拒绝。next 明确区分 actionable/waiting/needs_decision/verification_required/no_applicable_work,不能以没有待办推断当前质量通过。status 展示历史通过时保留其内容身份与 freshness。 -普通独立 `check` 默认写本地报告,不更新 tracked backlog;用户可显式 work sync。`init --apply` 的变更计划明确启用插件修复工作流,并固定受管写入范围;启用后,插件每次扫描必须执行“记录 run → 幂等 sync → 返回 status/RepairBrief”,包含保存反馈,不能只回显原始报错。相同问题不改 tracked 文件;新问题或状态变化才落事件。同步失败时保留 run 和原 gate,明确 backlog_update_failed 与恢复步骤,不假称任务已生成。 +普通独立 `check` 默认写本地报告,不更新 tracked backlog;用户可显式 work sync。`init --apply` 的变更计划明确启用插件修复工作流,并固定受管写入范围;启用后,插件每次扫描执行“探测配置 → 调用已配置的原生工具 → 记录 run → 幂等 sync → 将结果与 RepairBrief 返回智能体对话”。反馈分别列出已配置并运行、未配置、配置无效、工具故障及有效诊断,不能只回显原始报错。相同问题不改 tracked 文件;新问题或状态变化才落事件。同步失败时仍返回本次检查结果,另报 backlog_update_failed 与恢复步骤,不假称任务已生成。 未初始化项目的插件首次反馈提供初始化计划及本次临时 RepairBrief,不静默写受管目录。启用持久工作流后,回合恢复先 status/next,修复前后记 attempt,复检后再 next。工作流错误不放宽检查;其状态单独报告,实际检查门禁不靠任务是否写盘决定。 @@ -212,3 +220,33 @@ flowchart TD | 受管目录含 secret 或用户源码 | secret 仍经入库安全;未声明源码正常扫描 | 这套目录应成为智能体的修复工作台。最终判断始终回到真实内容、有效政策和原生检查器,文件记录帮助推进工作,不能替代检查本身。 + +### Checkstyle 准备任务的尝试与复检 + +当前局部 Rust 工作流支持准备任务的受控尝试和显式原工具复检。智能体完成环境恢复动作后,以 `ready-to-verify` 结束尝试,再调用 `task verify`;任务勾选和该尝试标签都不代表环境已经恢复。复检仍受阻时,具体原因与原尝试关联,在当前源码范围仍有效时继续指引前置修复,避免只重复检查。相同动作与输入连续无进展时,已有预算把任务转为 `needs_decision`,保留环境问题及历史;不能靠改动作名称重置预算。观察后的源码变化或不可用时,应先重新确认范围。 + +局部原工具恢复后,其源码发现进入稳定修复任务,准备任务保留 open,下一步核验原工具选择、生效配置、批准及完整覆盖。可信来源、模块粒度与正式关闭仍待完成;本地恢复反馈不能替代这些条件。验收见相邻 `codeguard-cli/tests/acceptance/checkstyle-preparation-recheck.md`。 + +准备恢复的复检事件会关联最近的受控 ready-to-verify 尝试,解除其等待复检状态;仍不能关闭任务。Java 或 Checkstyle JAR 在复检后变化、路径身份变化或不可用时,下一步和任务查询均要求重新复检,不沿用旧恢复或暂未检出结论。 + +Checkstyle 的当前工具、配置与已绑定源码失效判断优先于旧复检结果分类。即使旧结果为 still_present,也不能将已经失效的任务重新标为可按旧诊断修复;应显示具体失效原因并按原工具复检。 + + +### Checkstyle 原始配置复检边界 + +源码任务的修复候选必须保持首次发现时的配置字节身份;仅检查类及规则 ID 相同不能证明 scope、token、名称排除及其它参数未改变。原生复检零诊断但配置变化时返回 rule_coverage_requires_review,重复复检不覆盖首次依据。新增原始配置身份可从摘要绑定的首轮报告恢复;旧简报缺身份时要求复核。当前整份 XML 字节变化均需调查,包括等价空白变化,但不会形成源码违规;实际仍检出同一问题时保留 still_present。恢复原配置并修正文档才产生局部缺失候选,事实仍 open,批准义务与正式关闭另行核验。 + + +原生 Checkstyle 配置正则失败可细分为 checkstyle_configuration_regex_invalid:仅固定版本已识别正常退出与因果异常组合,且没有一致诊断报告;输入变化、取消/截止和留证失败优先。对话及配置准备简报要求修正原配置正则并复扫,不回显堆栈或属性值,不建议修改无关源码。未知错误保留原原因,不能凭堆栈关键词关闭任务或放行。 + + +### 2026-09-27 历史npm准备范围恢复 + +默认check all在Unix上读取当前0.3初始化画像及受管摘要,恢复物理目录仍存在但清单当前不可用的准备范围。只生成本轮状态和稳定任务,不以历史摘要或当前显式工具参数启动该历史根的原生检查;当前其它根独立调度。画像不一致/错误路径/重复字段明确历史范围未完成,清单恢复后重新发现。此为本地范围线索,不是覆盖或批准;整体目录丢失、画像刷新删除旧根后的义务恢复及宿主接线仍缺。详见相邻Rust验收npm-historical-roots-workbench.md。 + + +## 2026-09-27 npm画像刷新后保留已记录准备范围 + +RED证实清单删除后再次init刷新画像,默认check all遗漏已有稳定npm问题。现从本工作区有界普通物理finding.json恢复清单不可用、物理目录仍存在的准备范围;核对结构、工作区/检查器、稳定指纹与ID、scope、两项输入归属及状态。画像与事实两类来源独立,不因画像失配吞掉可核验事实范围。只恢复本地准备,不沿用旧结果或启动该根的原工具。可编辑Markdown附件删除/勾选不能消除该范围;附件缺失仍暴露同步问题,不宣称任务已修复。 + +新增npm_recorded_roots_cli覆盖刷新后重复检查、附件删除、事实身份/路径损坏、当前兄弟根保留及输入恢复;已有画像拒绝测试更新为事实恢复仍保留范围,同时明示画像错误。目录整体丢失、删除全部事实且画像已刷新后的防逃逸仍需独立受保护义务来源;本地记录不是可信批准。完整7.3/7.5/9.7保持未完成,不据此归档。 diff --git a/docs/rust-cli/static-check-catalog.zh-CN.md b/docs/rust-cli/static-check-catalog.zh-CN.md new file mode 100644 index 0000000..fb6ab8f --- /dev/null +++ b/docs/rust-cli/static-check-catalog.zh-CN.md @@ -0,0 +1,81 @@ +# Codeguard 静态检查配置与对话反馈 + +下表是**候选检查目录**,不是每个项目必须执行的清单,也不是已实现能力表。`codeguard capabilities` 说明发行版能适配什么;项目配置探测说明本项目启用了什么;本次检查结果说明原生工具返回了什么。这三者分别反馈。当前 57 种语言在五个候选平台上的六类别单元仍为 `gap`。Rust 负责配置发现、受控调用和结果整理,P3C、Maven、Javadoc 等继续运行各自原生检查器。 + +```mermaid +flowchart LR + A[项目语言与构建器] --> B[探测原生检查配置] + B -->|已配置| C[Rust 调用原生检查器] + B -->|未配置/无效| D[说明配置缺口与启用建议] + C --> E[解析原生诊断或工具故障] + D --> F[智能体对话反馈] + E --> F + F --> G[智能体修复代码或配置] + G --> H[原工具复检并更新反馈] +``` + +| 类别 | 候选检测族 | 可识别的检查示例 | +|---|---|---| +| `lint` | `syntax`, `style`, `type`, `dataflow`, `complexity`, `duplication`, `dead_code`, `architecture`, `api_compatibility`, `schema` | 语法、代码规范、类型、数据流、复杂度、重复代码、死代码、模块边界、公开 API 兼容性、数据模式 | +| `comments` | `api_docs`, `comment_policy`, `doc_links` | Javadoc/rustdoc/KDoc 等 API 文档、注释规则、文档链接 | +| `dependencies` | `graph`, `versions`, `licenses`, `sbom`, `provenance` | 实际解析图、版本冲突和过期、许可证政策、SBOM 完整性、组件来源 | +| `cve` | `advisory` | 组件身份与版本匹配、advisory、数据库身份和时效、严重度 | +| `security` | `sast`, `secrets`, `iac`, `container`, `config`, `policy` | 源码漏洞、秘密内容、基础设施配置、镜像/Dockerfile、运行配置、禁止入库策略 | +| `build` | `compile`, `reproducibility`, `manifest` | 编译/静态构建、可复现性、构建清单一致性 | + +检测族完整标识是“类别.族名”,如 `comments.api_docs`。它用于给已配置的检查器归类,而不要求所有项目逐族启用。`dependencies.graph` 可为 CVE 匹配提供输入,但图解析成功不能宣称没有漏洞;CVE 无命中也不能证明许可证或版本治理合格。Javadoc 检查应按项目已配置的规则解释公共 API、参数/返回、继承文档等诊断,formatter 不算注释检查。 + +项目配置探测返回 `configured / missing / invalid / unknown`,并指出检查器、配置文件/规则来源和具体处理建议。`configured` 时运行原生命令,把本次诊断、位置或组件、规则依据、工具错误及复检命令直接反馈到智能体对话。`missing` 不等于源码违规,`unknown` 不等于通过;只有批准策略明确要求的缺项影响交付门禁。工具故障、坏报告或数据库过期反馈为未完成,不冒充代码问题。修复后重跑相同原生检查器,依据新结果更新任务。 + +对话反馈示例(说明格式,不代表当前 CLI 已支持): + +```text +CodeGuard · Java +Javadoc:已配置(pom.xml),检查发现 2 项;Foo.java:42 缺少 @return。 +CVE:未配置;可在项目依赖审计配置中启用受支持的原生检查器。 +下一步:补全 Foo.java 的返回值说明,再运行 codeguard comments java . 复检。 +``` + +检测族可在后续协议版本中扩展。候选目录、项目是否配置、工具是否可用、本次运行结果和交付策略必须分开表述;目录登记不意味着已有适配器,也不自动生成项目义务。 + +### 字段 Javadoc 局部适配状态 + +Checkstyle 10.21.4 的原生 JavadocVariable 已接入显式原配置、稳定问题/修复任务与 task verify,支持本版 scope/excludeScope/ignoreNamePattern 参数。public 字段及指定忽略、serialVersionUID、局部变量边界经过原工具回放;public/protected/package/private、excludeScope 与枚举 token 的七组原生边界已补充验收;10.21.4 的 VARIABLE_DEF 是必需 token,仅选择枚举 token 仍包含字段检查。其它语法与完整配置模型仍待验收。字段文档修复后的零诊断只为局部候选观察,不证明完整项目通过。验收见相邻 codeguard-cli/tests/acceptance/checkstyle-field-javadoc.md。 + +既有五类 Javadoc 静态模块已支持官方短名、带 Check 后缀短名和官方完整类名,Checker/TreeWalker 完整名也保留原生配置;只按固定版本精确映射,不猜测自定义包名。字段规则的三种写法已用原工具验证共享同一任务,其余模块名称已有纯绑定回归,完整项目配置仍待接通。 + +MissingJavadocMethod 静态适配增加范围、allowedAnnotations、allowMissingPropertyJavadoc、minLineCount 与 ignoreMethodNamesRegex;四组固定原工具配置回放已验证筛选实际结果,原 XML 不重写。10.21.4 对单行非空体的方法行数边界须按原工具复现,不能据有 getter/setter 名称便推断豁免。METHOD_DEF、CTOR_DEF、ANNOTATION_FIELD_DEF、COMPACT_CTOR_DEF 五组原生选择及紧凑构造器文档修复复检已补充局部验收;完整构造器语法、项目模型及受批准规则覆盖仍待完成。 + + +JavadocMethod 已保留固定 10.21.4 的 accessModifiers、allowMissingParamTags、allowMissingReturnTag、validateThrows、allowedAnnotations 和四类方法/构造器 token。六组原生配置证明允许缺标签、公开范围及注解例外不会被 Rust 额外补报,throws 选项增加原生异常标签诊断;恢复首次配置后的实际文档修复经复检仅形成局部候选。原生配置不等于白名单批准或必需覆盖证明,完整项目模型仍未完成,见相邻 tests/acceptance/checkstyle-method-tag-options.md。 + + +类型文档静态适配保留 MissingJavadocType/JavadocType 的 scope/excludeScope 与五类类型 token、各自注解例外、JavadocType 的参数/未知标签以及作者/版本格式参数。十组原生配置与一次真实文档修复复检验证访问范围、注解、record 选择及参数/未知标签边界;作者/版本格式仅有静态绑定证据,完整项目与批准覆盖仍待完成。验收见相邻 tests/acceptance/checkstyle-type-options.md。 + + +作者/版本格式局部原生正反例已补充:缺失与不符均报告原诊断,真实补齐后原配置复检只给候选;无效正则为配置准备阻塞,重复失败复用任务。类型修复指引涵盖 @author/@version 与项目事实依据,不编造作者或版本。任意格式与标签变体、有效项目模型及批准覆盖仍待完成,见相邻 tests/acceptance/checkstyle-type-formats.md。 + + +### JavaScript/TypeScript 报告协议局部状态 + +相邻 Rust adapter 提供 ESLint 10 JSON 纯解析原型,核对预期版本、显式文件集合、原生计数和 exit/max-warnings 关系。退出零的 warning 保留,fatal 或缺规则身份消息要求调查,抑制不算白名单;尚未执行原生 ESLint、解析生效 flat config/TS parser 或接通项目 CLI/依赖/工作台,不能把此原型标为 JavaScript/TypeScript 已支持。依据及夹具验收见相邻 tests/acceptance/eslint-json-observation.md。 + + +ESLint 原生命令计划已可由 Rust 固定构造:显式 Node/JS 入口、原 flat config、完整源集和 JSON 槽位,禁用配置自动查找、不隐式 fix/cache/quiet/install。真实 Node 的字面参数转发已验收,但仅执行观察脚本;ESLint 原生及项目配置/CLI/依赖接线仍未运行,不能据此宣称 JavaScript/TypeScript 检查已启用。见相邻 tests/acceptance/eslint-native-command-plan.md。 + + +### npm审计适配基础实施进展 + +相邻Rust工程已加入npm11机器报告观察、只读审计脚本声明识别和显式离线原生命令计划。原生advisory/间接关系保留,错误、缺锁、计数和严重度矛盾均未完成;不会将advisory数字当CVE、范围当解析版本。配置识别尚未接入detect/init,公开CVE/依赖命令及完整锁图/数据库时效/任务门禁仍待实现;真实空锁及缺锁与协议正反例见相邻 `codeguard-cli/tests/acceptance/npm-audit-observation.md`。 + +### Python 依赖与 CVE 输入的只读发现 + +相邻 Rust `detect` 按 Python 构建根记录 `requirements.txt` 的简单逐行固定版本、动态/未锁声明、`uv.lock`/`poetry.lock` 存在但未解析、以及没有依赖输入等状态;`plan cve python` 和 `check all` 将缺口反馈给智能体。它只检查可见输入的语法与归属,不解析传递依赖闭包,也不调用 pip-audit 或查询漏洞库。即使所有可见行都精确固定版本,或已有锁文件,检查器配置仍为 `unknown`,交付仍未评估。多构建根反例与具体输出见相邻 `codeguard-cli/tests/acceptance/python-dependency-input-discovery.md`。 + +标准 `pylock.toml`/单段命名 `pylock..toml` 现与 uv/Poetry 专用锁分开记录;同根多锁要求先确认实际输入。依据 [pip-audit 官方项目模式](https://github.com/pypa/pip-audit/blob/main/README.md?plain=1)和 [PyPA pylock 命名规范](https://packaging.python.org/en/latest/specifications/pylock-toml/),不能把 uv/Poetry 专用锁直接作为 pip-audit `--locked` 输入。标准锁仍需解析 PEP 751 环境/依赖组和原生报告,发现器不会仅凭文件名给出漏洞结论。 + +pip-audit 的 Rust adapter 另有固定只读 `--locked` 参数计划和 JSON 纯解析:有效组件版本、advisory 与别名可保留为局部观察,跳过组件、错误退出和报告矛盾均使观察未完成。该 API 尚未调用本机原生工具,也未与标准锁字节、漏洞库或 `check all` 绑定;零项观察固定 `advisory_coverage=not_evaluated`。协议及反例见相邻 `codeguard-cli/tests/acceptance/pip-audit-protocol.md`。 + +公开 `cve python PATH --pip-audit-tool ABS_PATH --pip-audit-version VERSION` 已用受控进程和私有标准锁快照接通该协议。它前后核对项目 pyproject、单份 pylock、私有副本与工具字节;human/JSON 显示原生 advisory、缺锁、工具故障或输入变化,固定交付未评估。本机尚无 pip-audit 的真实运行证据,PEP 751 环境/依赖组、数据库时效和项目全覆盖仍不能声明已验证。局部验收见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。 + +为降低归属误报,该入口仅在整组原生组件名/解析版本与本轮标准锁的显式版本集合一致时显示项目局部 advisory;缺包、错版本、无版本源码包或锁模型损坏都保留阻塞,不拿原生 JSON 直接指控当前项目。此比较尚未解释 PEP 751 的环境选择与哈希,匹配也不构成完整图或数据库覆盖证明。 diff --git a/docs/rust-cli/technical-design.zh-CN.md b/docs/rust-cli/technical-design.zh-CN.md index 181d0fe..979254b 100644 --- a/docs/rust-cli/technical-design.zh-CN.md +++ b/docs/rust-cli/technical-design.zh-CN.md @@ -4,35 +4,48 @@ ## 1. 命令模型 +逐项职责、价值、结果类型、副作用、失败恢复与典型调用旅程见 [命令架构](command-architecture.zh-CN.md),检测族与验收边界见 [静态检测目录](static-check-catalog.zh-CN.md)。以下是同一目标协议的语法汇总;执行预算参数省略处遵循该文档 2.4 的支持矩阵和默认值,并在实现时从同一命令 schema 生成完整帮助。 + ```text -codeguard [path] +codeguard [path] [--format human|json|sarif] [--output PATH] [--jobs N] [--timeout DURATION] [--offline] -codeguard plan [path] +codeguard help [command...] +codeguard --version [--format human|json] +codeguard plan [path] + [--format human|json] codeguard detect [path] [--format human|json] codeguard capabilities [language] [--format human|json] codeguard doctor [language|all] [path] [--format human|json] -codeguard rules list [--format human|json] +codeguard rules list [path] [--format human|json] codeguard config [path] [--format human|json] -codeguard fix [path] --category - <--dry-run|--apply> [--format human|json] -codeguard gate [path] [--format human|json] -codeguard tools [--format human|json] -codeguard tools install --lock PATH -codeguard init [path] <--dry-run|--apply> -codeguard work sync [path] -codeguard status [path] +codeguard fix [path] --category + <--dry-run|--apply> [--task TASK_ID] [--owner ID --lease-token TOKEN] + [--format human|json] +codeguard gate pre-commit [path] [--format human|json] +codeguard gate pre-push [path] --remote-name NAME --remote-url URL [--format human|json] +codeguard gate ci [path] --input PATH [--format human|json] +codeguard tools [path] [--format human|json] +codeguard tools install --lock PATH [--dry-run|--apply] [--format human|json] +codeguard init [path] [--dry-run|--apply] [--format human|json] +codeguard work sync [path] [--format human|json] +codeguard status [path] [--format human|json] codeguard next [path] [--format human|json] -codeguard task [path] [--format human|json] -codeguard task [path] --owner ID -codeguard task attempt [path] --owner ID [--outcome VALUE] +codeguard task show [path] [--format human|json] +codeguard task verify [path] [--owner ID --lease-token TOKEN] [--format human|json] +codeguard task claim [path] --owner ID [--format human|json] +codeguard task [path] --owner ID --lease-token TOKEN [--format human|json] +codeguard task attempt start [path] --owner ID --lease-token TOKEN + --action-id ID [--format human|json] +codeguard task attempt finish [path] --owner ID --lease-token TOKEN + --attempt-id ID --outcome VALUE [--format human|json] codeguard mcp serve codeguard compat legacy-v1 <旧子命令与参数> ``` 检查命令的 language 必填,path 默认当前目录。canonical ID 沿用现有注册表,别名由同一注册表解析;`all` 是发现所有适用语言及类别,不是对所有注册语言强制安装工具。未知语言在执行前返回用法错误。 -`gate pre-push` 接受 Git hook 的 remote 参数与 stdin ref/OID 元组;`gate ci` 接收 CI 明确提供的不可变 commit/ref 集合。实际参数 schema 在 S02 固化,禁止通过默认 HEAD 推测所有推送目标。 +`gate pre-push` 通过 remote-name/remote-url 接受 Git hook 参数,通过 stdin 接受 ref/OID 元组;`gate ci --input` 接收版本化请求文件,其中明确仓库身份、不可变 commit OID 集合与预期内容来源。符号 ref 只作描述,输入文件不授予政策权威。禁止通过默认 HEAD 推测推送/CI目标;完整输入 schema 和验证样本在 S02 落实。 ```bash codeguard lint java . --format json @@ -44,14 +57,18 @@ codeguard doctor java . codeguard fix java . --category lint --dry-run ``` -检查命令默认不修改源码、配置、Git index,也不自动修复;构建产物和工具缓存写入隔离运行区。`plan` 不执行构建、扫描、下载或安装,只读取计划所需信息;无法静态确定的部分记为待解析。`doctor` 可执行有界版本探测,但不执行安装。`tools install` 是独立显式动作,不由扫描隐式触发。 +检查命令默认不修改源码、配置、Git index,也不自动修复;构建产物和工具缓存写入隔离运行区。`plan` 不执行构建、扫描、下载或安装,只读取计划所需信息;无法静态确定的部分记为待解析。`doctor` 可执行有界版本探测,但不执行安装。`tools install` 是独立显式动作,默认只预览锁定的安装计划,`--apply` 才安装,不由扫描隐式触发。 -`check` 的类别是 lint、comments、cve、security、build;项目不适用的类别须有结构性依据。build 的测试执行是独立参数:沿用现有 Java 静态构建默认不运行测试;报告必须写明 test_execution=false,不能声称测试通过。若批准策略要求测试,必须运行,CLI 不提供自动跳过路径。 +`check` 的类别是 lint、comments、dependencies、cve、security、build;先识别项目实际检查器配置,再运行已配置且可用的原生工具。未配置项反馈给智能体,只有批准策略要求的缺项影响交付门禁。build 的测试执行等级独立记录,由批准策略和明确的项目构建命令确定:沿用现有 Java 静态构建默认不运行测试;报告必须写明 test_execution=false,不能声称测试通过。若批准策略要求测试,必须运行,CLI 不提供自动跳过路径。 持久修复工作区及新增命令的写入边界见 [修复工作流](remediation-workflow.zh-CN.md)。check 写本地报告,work sync 显式更新脱敏问题/任务;next 只读并返回 RepairBrief,task verify 依据复检追加状态事件,不能手工强制关闭。 +init 默认 dry-run,静态建立项目画像、模块图、检查准备清单及 AGENTS 受管摘要;apply 写入计划内产物,实际探测仍交给 doctor。版本来源、架构推断、增量刷新和 AGENTS 合并契约见 [初始化设计](project-initialization.zh-CN.md)。init 操作成功只表示计划/产物完成,不签发质量通过;其 readiness 独立记录前置条件。 + ## 2. 退出码、请求通过与交付通过 +下表首先定义检查类的含义。信息/计划/管理命令的 0 表示该操作完整完成:例如 plan 可以完整返回含阻塞的计划,next 可以正常返回待决策,而 doctor/config validate/tools verify 对必需验证条件未满足返回 3。任何非交付命令不能因 exit 0 签发质量 allow;详见命令架构的退出语义表。 + | 新 CLI 退出码 | 条件 | |---|---| | 0 | 请求选中的全部适用义务已完成且无阻断违规 | @@ -71,6 +88,8 @@ codeguard fix java . --category lint --dry-run `schema_version` 使用 major.minor 字符串,初始目标为 `1.0`;二进制版本、adapter 版本、rulepack 版本分别记录。消费者必须拒绝未知 major,允许兼容 minor 的可选扩展;禁止宽松读取未知枚举后按通过处理。 +命令结果共用 report_type/operation/request_id/command_status/exit_code/warnings/next_actions。检查继续使用下述 RunReport,查询、计划、准备、修复和状态操作采用各自 schema;不把所有结果强制变成空 findings 报告。command_status 描述操作完成性,独立于检查 completion、finding、readiness 和 delivery_gate。mcp serve 的服务生命周期与各请求结果分离。 + | 对象 | 关键字段 | 不变量 | |---|---|---| | CheckRequest | command、selection、root、content_source、operational_options | 用户选择与批准策略分开 | @@ -80,12 +99,12 @@ codeguard fix java . --category lint --dry-run | CheckPlan | obligations、tasks、dependency_edges、resource_keys、scope_digest | DAG 无环;未执行任务有解释 | | ToolExecution | executable identity、argv、cwd、env fingerprint、times、raw rc、artifacts | 原始敏感参数只进私有证据 | | CheckResult | obligation_id、completion、reason、findings、execution_refs、coverage | findings 与 completion 正交 | -| Finding | id、native_rule_id、category、severity、message、location、evidence_refs、baseline_state | 保留原生严重度;不能由自然语言反推规则 | +| Finding | id、native_rule_id、category、severity、gate_impact、message、location、evidence_refs、baseline_state | 原生严重度与批准策略判定的 blocking/non_blocking/undetermined 分开;不能由自然语言反推规则 | | Coverage | expected、observed、unresolved、excluded_policy_digest、proof_kind | 数量相等不等于集合相等 | -| GateDecision | decision、eligible、blocking_finding_ids、incomplete_obligation_ids、policy_digest | 未完成不能 allow | +| GateDecision | decision、eligible、blocking_finding_ids、incomplete_obligation_ids、coverage_mismatch_ids、invalid_ledger_ids、policy_digest | 未完成不能 allow;义务与实际目标精确比对 | | RunReport | version、run_id、request、policy/content identity、results、gate、summary | human/json/sarif 派生自同一对象 | -状态域:`completion=complete|incomplete|not_applicable`;`delivery_gate.decision=allow|deny|incomplete|not_applicable|not_evaluated`。内部故障另置 `run_status=internal_error`,交付决策保持 incomplete。 +当前 Rust 结构消费协议已升至 1.3,并兼容读取 1.0–1.2;`completion=complete|incomplete|not_applicable`,`delivery_gate.decision` 增加 `allow_with_exceptions` 及原始/已处置/活跃发现集合。当前仅有 schema、严格解析与 JSON/human 对话摘要切片,真实报告生产、可信审批和其它格式/宿主消费尚未接通,不能把解析成功的带例外声明作为可信交付。内部故障另置 `run_status=internal_error`,交付决策保持 incomplete。详见[误报白名单设计](false-positive-allowlist.zh-CN.md)。 输出示意(**字段节选,不是可直接通过 schema 的完整样本**): @@ -97,7 +116,7 @@ codeguard fix java . --category lint --dry-run { "obligation_id": "java:app:lint:p3c", "completion": "complete", - "findings": [{"id": "f-1", "native_rule_id": "native-rule-id", "severity": "error"}] + "findings": [{"id": "f-1", "native_rule_id": "native-rule-id", "severity": "error", "gate_impact": "blocking"}] }, { "obligation_id": "maven:app:cve", @@ -116,6 +135,8 @@ codeguard fix java . --category lint --dry-run } ``` +`gate_impact` 缺失或非法时拒绝消费报告;`undetermined` 保留发现,并使对应请求未完成。非阻断发现保留在报告中,但本身不产生违规退出码。当前 Rust 领域聚合与四类协议 schema/严格消费边界已实现相关结构判定;原生适配器、批准策略映射、完整报告生成与可信来源核验仍属后续任务,不得把人工构造的字段当作已验证原生证据。 + 结构化 stdout 只能有一个 JSON 文档;进度、下载提示、工具输出写 stderr 或私有日志。`--output` 成功时将相同序列化报告原子写入目标文件,stdout 仍遵守所选格式;写入失败返回 3,保留已有结果。SARIF 转换保留 tool/rule/location,并用运行通知与 invocation 成功状态表达 incomplete,禁止导出零 findings 就隐去未完成;标准 JSON 始终是完整协议。 源位置使用仓库相对路径;文件名含非 UTF-8 字节时保留可逆编码标识和展示名,不用有损字符串进行身份比较。多位置、跨文件数据流或依赖发现允许 primary location 缺省,但必须存在包/模块定位。归并只对同工具或经过显式规则映射的等价发现进行,保留原始记录和次数;不同工具不能只按文案去重。 @@ -141,7 +162,7 @@ EvidenceStore.persist(raw_evidence) -> EvidenceRef CachePort.lookup(validated_identity) -> VerifiedCacheEntry | Miss ``` -这些是逻辑签名,不是待拷贝编译的 Rust stub。runtime 做观察和执行;适配器只能解释注入的数据、提出命令,不私下 `spawn`、联网或修改文件。core 根据计划协调任务,CLI 负责依赖注入。MCP 放在 cli 的入口模块,复用同一核心 API;不得通过调用自身命令拼另一套 verdict。 +这些是逻辑签名,不是待拷贝编译的 Rust stub。Codeguard 自有的观察、编排、解析、策略判定、门禁和新工程验收均以 Rust 实现,不通过 Python 辅助脚本承载新入口逻辑。runtime 做观察和受控执行;P3C、Maven 等外部原生检查器仍运行官方命令,Rust adapter 只解释注入的数据、提出命令,不私下 `spawn`、联网或修改文件。core 根据计划协调任务,CLI 负责依赖注入。MCP 放在 cli 的入口模块,复用同一核心 API;不得通过调用自身命令拼另一套 verdict。 ## 5. 工具适配器协议 @@ -172,7 +193,9 @@ Java 是第一条端到端实现线,不代表只支持 Java。适配计划必 Java 解析顺序:项目 wrapper 与声明运行时 → effective model/启用 profile → 模块图/源集/依赖 → 已绑定质量任务 → 缺失义务的受控适配计划。读取 effective model 可能执行构建扩展,因此不是纯静态 `plan` 的隐式行为,需进入执行阶段并留证据。 -对于未配置质量工具的项目,使用已批准、已锁定的 rulepack 构造隔离执行配置;不改用户 POM/Gradle 文件。必要集成不能可靠构造时返回 `configuration_required`,提供具体补丁建议,不能自动永久加入或删去质量插件。`java.commands` 只能提供实际命令,仍需覆盖映射,不能以 `echo ok` 满足 P3C。 +当前 Maven Javadoc 多文件局部探针只对无继承、依赖、profile、模块、扩展、其它插件和动态配置的简单 POM 重放原文件,并把原 POM 与显式源码一起复制到私有快照。其它 POM 返回未完成,不能用固定模板 POM 产生项目归属的注释问题。此局部执行仍未证明完整生效模型、生成源码和源集覆盖,不签发项目门禁结果。 + +对于未配置质量工具的项目,返回 `missing` 与具体配置建议;不自动构造或写入 POM/Gradle 质量插件。配置无效返回 `invalid`,无法判定返回 `unknown`。用户或批准策略明确选择启用后再按原生命令运行,不以“缺配置”报告源码违规。`java.commands` 只能提供实际命令,不能以 `echo ok` 满足 P3C。 Maven 父子模块、dependencyManagement、profile、toolchains、annotation processor、测试源集和 Gradle 动态脚本都影响结论。静态模型不完整时保守扩大范围;扩大后仍不能证明规则执行,则未完成。已有 Java 影响闭包可迁移,但版本变动不得自动以 validate/help 替代未证明等价的 lint/CVE 义务。 @@ -184,6 +207,8 @@ CVE 的单位是依赖生态和解析后的组件图,不是源码后缀。Mave 缺 lockfile 不必一律失败:适配器若能解析并固化实际依赖图可继续,否则未完成。漏洞库过期、网络断开或数据库未验证不能产生安全 PASS;离线只使用满足批准 freshness 的本地库。未知严重度不能映射为 LOW 或删除:若策略无法比较则未完成;批准“所有已知漏洞阻断”时可直接判违规。 +当前 `check java` 按每份 Java 源码的最近构建根展示 Maven Dependency、OWASP Dependency-Check 与 FindSecBugs 的静态声明状态。静态简单 POM 中已配置的 Maven Dependency Plugin 现可用私有原 POM 副本离线运行原生依赖树,反馈组件和传递边;原生日志即使 `BUILD SUCCESS`,只要有缺 POM 等警告便标未完成。其余 checker 仍未接入原生执行;缺失、跳过、未知或多模块混合配置分别给出原因与下一步。局部依赖图不代表全模块、版本治理、许可证、SBOM、CVE 数据库或安全检查覆盖。 + 注释规则绑定语言语法及 API 范围。规则包应明确是否允许继承文档、接口/实现重复说明、生成代码排除和 test fixture 的专用规则;这些是预先确认的语义,不是扫描失败后的临时豁免。 安全分为源代码规则、配置/IaC、敏感内容及入库路径策略。`.env`/`*.pem` 等命中现行禁止入库模式时报告 `repository_policy_violation`,不得仅凭文件名宣称发现私钥;内容扫描的 secret finding 另有规则和脱敏证据。公共证书等例外需要正式策略变更,AI 不可自动放行。 @@ -199,6 +224,10 @@ CVE 的单位是依赖生态和解析后的组件图,不是源码后缀。Mave | 工具锁 | 工具版本/摘要、JDK、adapter、rulepack、下载来源 | 按 lock 验证;不使用 latest 自动升级 | | 项目原生配置 | eslint/ruff/checkstyle 等 | 作为实际规则输入;必须与批准策略要求对齐 | +当前 Rust `config validate/explain --policy-candidate FILE` 只实现质量策略**候选**的静态协议检查。候选 1.0 固定 `policy_id/revision`、工具锁原始字节摘要、非空必需检测集合、逐项语言/类别/检测族、规则包摘要、具体规则、源集与阻断严重度、CVE 库时效、测试要求;候选源码排除必须是单个仓库相对文件路径、文件字节摘要、结构化原因及有限到期字段。重复义务、通配排除、未知语言和自写 `approved` 被拒绝。精确源码排除与**发现后的误报白名单**是两种不同处置:前者影响扫描范围,后者保留扫描与原始 finding。两者均只能由独立批准策略赋权。 + +此候选协议不包含受保护批准来源;CLI 即使核对了本地工具锁摘要,也固定返回 `candidate_unverified`、`effective_policy=null` 和未完成。它还不能证明原生规则实际启用、排除内容/期限在本轮有效、策略修订在 CI 基线中,或形成冻结义务清单。后续可信策略加载必须从受保护宿主/CI 取得基线身份,拒绝同次 PR 用自身策略文件授权自身变更;不能把 `--policy-candidate` 当成批准开关。 + `config explain` 显示每一有效值的来源与覆盖原因。原生配置中已有 disable/suppressions 必须列入策略解释和数量/摘要审计;不能把原生配置当作不可审查的隐藏降级入口。PR 同时修改代码与检查配置时,CI 使用可信基线策略评估政策差异;未经批准的新策略不能给本 PR 自行签发通过。 规则包目录设计: @@ -222,7 +251,7 @@ manifest 记录来源、许可、分类、规则严重度、工具兼容约束 `ProcessSpec` 包含 executable、argv、cwd、受控 env overlay、stdin 模式、deadline、输出预算、资源键、网络策略声明和预期产物。默认 stdin=null;pre-push 输入先由 CLI 读取为结构化请求,不把宿主 stdin 交给扫描器。 -Tokio 并发读取 stdout/stderr,有界缓冲加私有文件记录;超限必须标识不完整。取消或超时先请求停止,再终止进程组/Windows Job Object 并 wait/reap;只丢弃 Child 不等于可靠结束进程。[Tokio process 文档](https://docs.rs/tokio/latest/tokio/process/) +Rust 并发读取 stdout/stderr,有界缓冲加私有文件记录;超限必须标识不完整。取消或超时需终止受控进程树并 wait/reap;只丢弃 Child 不等于可靠结束进程。当前 Unix 原型使用 `std::process::Command`、非阻塞管道和独立进程组,并提供拒绝 symlink/覆盖的私有原子原始日志接口;证据索引、脱离进程组的子孙进程及 Windows Job Object 尚待实现,不能用原型验收完整进程树控制。[Rust Command 文档](https://doc.rust-lang.org/std/process/struct.Command.html) 任务 DAG 中相互独立的检查继续收集证据;同一模块构建目录、数据库更新或非并发扫描器通过 resource key 互斥。deadline 是整次请求预算,包含排队/探测/执行/解析/清理;子进程不能各自重置全部预算。 @@ -287,6 +316,49 @@ MCP 工具参数映射到相同 CheckRequest,保留旧工具名时通过显式 每次 run/obligation/task/attempt 使用关联 ID,记录工具耗时、启动/解析/快照耗时、扫描范围、缓存原因、原始退出和未完成原因。日志默认本地,不收集源码遥测;如需远程统计需单独明确采集内容。 +证据索引同时记录摘要、受管所有权、引用和保留策略;到期清理不删除活动run/lease、仍被保留收据引用的必要证据、用户源码或tracked问题历史。证据缺失不能继续支持当前认证,可通过重新复检恢复。关联追踪、证据存储和评测门槛已分别进入execution-kernel与binary-distribution规格,具体任务见 [实施覆盖索引](../../openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md)。 + 低误报评价至少同时展示:finding precision、漏报率、工具故障误判率、必需义务完成率、被排除/豁免比例、各类别覆盖、p50/p95 耗时及样本数。把规则关闭后 precision 变高视为覆盖退化。指标定义和真实验收见 [coverage-and-acceptance](coverage-and-acceptance.zh-CN.md)。 本技术方案没有声称已达到某个误报率或性能增益;这些必须由任务中的固定语料、人工裁定与真实工具运行证明。 + +## 批准签名核验接入 + +局部实现使用 ring 0.17.14 的 Ed25519,精确签载荷原始 UTF-8 文本,不做签后 JSON 重新序列化。签名消息按固定协议域、NUL、精确密钥 ID、NUL、载荷原文组成;载荷及封装 schema 分别为 signed-approval-payload/envelope 1.0。工作区、修订、基线、序号、期限及快照字节摘要都参与签名。普通候选桥接拒绝签名载荷修订与快照内修订不一致,并继续验证候选的精确字节和原生身份。 + +```mermaid +flowchart LR + A[项目误报候选] --> B[独立评审与签发环境] + B --> C[签名载荷与批准快照] + H[受保护宿主:公钥 撤销 时钟 基线 最小序号] --> V[Rust 签名与上下文核验] + C --> V + V --> S[严格快照解析及精确候选绑定] + S -->|替代链| L[逐跳 Git 提交祖先核验] + L -. 尚待接通 .-> G[原生完整性与最终门禁] + S -. 普通批准尚待接通 .-> G + N[本轮原生发现] --> G +``` + +当前签名 API 不加载项目公钥,不提供签发 CLI,也不产生交付结论。宿主的公钥来源、轮换/撤销及最低序号状态尚未接线;测试 seed 不属于发行信任锚。局部多跳入口现逐跳核验签名、快照、工作区、序号和签发/历史审核时间,并继续执行精确替代、撤销、无环与 32 跳限制;不能凭一个当前签名认可未核验的历史摘要。前序代码基线的 Git 祖先关系仍待受保护宿主核验。所有宿主输入仍须来自独立信任边界,同权限本地进程不可宣称不可绕过。 + +局部 Git 联合入口现补齐原生逐跳祖先观察:先完成签名与精确替代绑定,再核对前序基线属于子基线历史;只接受完整同格式提交 ID,拒绝浅历史、缺对象、非提交、噪音或失败报告。禁用 replace/graft、commit-graph 加速和 lazy fetch,各跳共享截止时间与取消标记。原签名 API 单独成功仍不证明祖先关系;宿主还须认证 Git 工具、隔离仓库、可信公钥及本轮原生检查,联合 API 的 BoundToPinnedSnapshot 也不等于交付 allow。 + +## 工具安装缓存发布的当前基础 + +相邻 Rust runtime 已提供 `publish_tool_bytes`:调用方先冻结有界字节和预期 SHA-256;在已有、当前用户拥有且非共享可写的目录中,以固定目录 FD 创建私有暂存,写后核验,原子新增内容寻址文件,再核验最终文件。重复条目必须复核,损坏、链接、FIFO 或权限异常不覆盖;取消/到期/写入失败不返回成功,暂存正常清理。收据只描述缓存发布,不能充当可信锁、发行批准、平台兼容或质量通过。 + +正式 `tools install` 还须先接入批准来源、下载清单、平台/包格式与预览/apply 服务,再调用该基础层。当前不开放未批准候选的 CLI apply。不可中断的文件系统调用及同用户恶意改写不提供强隔离保证;发布后失败可能保留完整制品,后续须重新核验恢复。验收见相邻 tests/acceptance/tool-cache-publication.md。 + + +### HTTPS 发行包传输局部实现 + +相邻 Rust runtime 的 download_verified_package 只接收冻结 URL/大小/摘要及显式重定向 authority,TLS 验证与响应校验后返回有界字节。连接、重定向和包流继承同一绝对期限/取消;不使用环境代理、自动重试或内容解压,不写缓存、不授予发行批准。11 项本地 TLS 及相关回归见相邻 codeguard-cli/tests/acceptance/package-https-transport.md。正式 tools install 尚未调用此入口,可信来源/网络授权、下载至发布编排、运行时安装、恢复和跨平台仍须完成;check/plan/doctor 不会自动联网安装。 + + +### Javadoc 项目检查模式 + +明确提供 Maven 上下文时,项目检查只运行原 POM 多文件探针,避免同项目类型互相引用造成孤立单文件假阻塞。前置/生效范围不确定时保留具体原因,不回退;未选择 Maven 时 JDK 单文件局部观察保持可用。反馈 0.23.0 与 Javadoc 0.3.0 标明 probe_mode,Maven 模式不嵌入单文件诊断。局部观察数不证明完整源集、有效配置或交付通过。验收见相邻 codeguard-cli/tests/acceptance/javadoc-project-mode-selection.md。 + +### Checkstyle 局部 CLI 实施进展 + +相邻 Rust 工程现在提供 `codeguard lint java FILE --checker checkstyle --java-tool PATH --checkstyle-jar PATH --config PATH --format json`,使用显式原配置和私有源码/配置快照调用统一 runtime,反馈原生规则身份、位置与严重度。当前静态注释配置限定已验证内置模块;未知配置/资源保留待解析,不改写为默认规则。JSON 0.1.0 与真实工具局部验收详见相邻 `tests/acceptance/java-checkstyle-cli-local.md`。项目级 check、完整工具/配置/规则范围及任务/白名单/交付接线仍未完成;局部观察不变成普通通过。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/design.md b/openspec/changes/introduce-rust-codeguard-cli/design.md index 02a2df0..3bf2e76 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/design.md +++ b/openspec/changes/introduce-rust-codeguard-cli/design.md @@ -10,7 +10,9 @@ **Goals**:单一二进制与领域内核;独立的执行完整性和违规证据;不可由 AI 自行降级的质量 contract;全语言逐类别覆盖;可测试的工具适配与准确内容身份;渐进替换宿主入口。 -**Non-Goals**:本次文档交付不建立 Rust 源码仓或发布产物;不重写所有原生分析工具;不采用 LLM 作为最终裁判;不承诺本地同权限环境不可绕过;不把动态 Shell 全解析作为交付正确性的基础。 +**Non-Goals**:原设计阶段不建立 Rust 源码仓或发布产物;后续实施阶段以逐任务验收推进,不因四 crate 工程基线存在而宣称发布完成。不重写所有原生分析工具;不采用 LLM 作为最终裁判;不承诺本地同权限环境不可绕过;不把动态 Shell 全解析作为交付正确性的基础。 + +**Rust 与原生工具边界**:用户已明确 Codeguard 自身的检测编排、运行控制、报告解析、策略/门禁及新工程验收均用 Rust;P3C、Maven 等仍执行官方原生命令,Rust 负责受控调用和解释,不重写官方规则。新 CLI 不以 Python 脚本作底层实现;旧 Python 仅在具名 legacy-v1 入口保留到迁移完成。 ## Decisions @@ -28,9 +30,19 @@ | D10 初版扩展 | 编译期适配器,版本化数据规则包 | 动态任意脚本插件会扩大信任和测试边界 | | D11 测试执行 | 保留静态构建默认等级并明确报告,策略要求时执行测试 | 自动替用户将所有 verify 改为跑测试,超出已确认范围 | | D12 修复工作区 | `./codeguard/` 持久存储脱敏问题、事件与任务,本地日志/缓存 Git 忽略,原工具复检关闭 | 仅终端报错缺少恢复上下文;自由 Markdown 勾选会制造无证据完成 | +| D13 项目初始化 | init 生成带证据的项目画像、分类型模块图和 AGENTS 受管摘要;事实、推断、准备状态与政策分开 | 根据目录猜定 DDD 或直接执行构建来推测配置,容易产生错误约束和未预期副作用 | +| D14 命令应用服务 | 36项入口共用应用服务与证据内核;查询/计划/诊断/状态操作与质量认证分开,命令schema统一生成help和接入矩阵 | 给每条命令复制扫描逻辑,或把所有exit 0解释为项目通过,会引入协议漂移 | +| D15 协作与恢复 | 显式lease token/generation和attempt/action ID,受控fix复用或自行领取租约,运行报告与准备证据幂等导入 | 只用owner字符串、隐式最新attempt或单份最新报告无法可靠处理并发和响应丢失 | +| D16 误报白名单 | 只对经复现、独立批准的精确 finding 作有期限处置;保留原始发现、复检与审计,交付显示 allow_with_exceptions | 广泛路径/规则忽略、agent 自批或把工具故障算误报会掩盖真实问题 | + +完整指令职责、价值、参数、结果类型、预算初始值、状态变化和调用旅程见 [命令架构](../../../docs/rust-cli/command-architecture.zh-CN.md)。预算是实现基线,平台能力和性能仍需实测;命令存在不等于已有原生工具验收。 + +初始化细节见 [项目初始化与 AGENTS.md 接入](../../../docs/rust-cli/project-initialization.zh-CN.md)。不直接改写本插件 AGENTS 来冒充被检查项目画像;实现任务沿 S09 展开,整体验收在 S12。 修复工作区详见 [持久修复设计](../../../docs/rust-cli/remediation-workflow.zh-CN.md)。状态、任务和历史帮助执行者推进,但最终 gate 独立检查源码与可信政策;任务记录不能成为新的跳过开关。 +误报白名单的条目身份、可信审批、失效与门禁转换见 [误报白名单设计](../../../docs/rust-cli/false-positive-allowlist.zh-CN.md)。它是规则处置,不替代原生检测;实现分解到 S02/S04/S09/S12。 + ## Risks / Trade-offs - [严格门禁暴露工具环境欠账] → `doctor` 给出具体恢复路径,先完成工具链准备;不能通过 fail-open 消除欠账。 @@ -43,6 +55,8 @@ ## Migration Plan +阶段顺序及当前设计到逐条Requirement/命令/语言/平台/宿主的任务映射见 [实施覆盖索引](implementation-coverage.md)。索引已反向检查每项实施任务的规格依据;任务状态只在tasks.md维护,不以OpenSpec产物齐备作为实现完成。先建立Java真实修复闭环,再补齐全部已承诺能力;第一条闭环通过不能关闭其它语言或宿主任务。 + ```mermaid flowchart LR S1[契约和语料 S01-S02] --> S2[运行时与治理 S03-S05] @@ -66,4 +80,6 @@ flowchart LR ## Completion Boundary -本次完成标准仅为架构、技术方案、覆盖验收设计、OpenSpec proposal/design/specs/tasks 的一致性和校验。所有代码、真实工具、宿主、发布任务保持未完成;不执行 apply/sync/archive。 +原设计阶段完成标准仅为架构、技术方案、覆盖验收设计、OpenSpec proposal/design/specs/tasks 的一致性和校验。后续实施已开始;完成状态以 `tasks.md` 的代码、测试与实测证据为准。真实工具、宿主和发布验收未完成前不执行 sync/archive。 + +实施前覆盖审计补充:静态查询处理器、事件/游标中断恢复、过期租约恢复顺序、环境任务复检、私有证据保留、关联追踪和分层评测均有明确任务;5个候选平台和3个宿主各有独立验收条目。技术参数未知项绑定任务和所需证据,不能自行假定完成。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md b/openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md new file mode 100644 index 0000000..d4526e1 --- /dev/null +++ b/openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md @@ -0,0 +1,324 @@ +# 实施覆盖索引与执行顺序 + +状态:覆盖关系基于 2026-09-24 审计,实施状态更新至 2026-09-28。相邻独立 `codeguard-cli/` 已有 Rust 工程、局部原生适配器、CLI 反馈及部分持久任务/原工具复检:包括 Ruff、Clippy、Rustdoc、Rust 构建类型检查和部分 Java/Node 检查。Rustdoc 已接入 `check all` 的独立调度与同步;Rust 构建仅接通公开局部探针和工作台同步,正式复检与完整检查调度仍缺。上述能力不代表所有语言类别、完整项目配置/构建组合、可信策略、正式任务关闭重开或宿主闭环完成;各项证据与限制见 [verification.md](verification.md)。此前源码的全目标 Clippy 与全工作区测试通过(154组/910通过/0失败/93忽略);新增构建接线后只完成受影响验证,尚无当前源码的全工作区终态。此文件是导航和覆盖关系,规范仍在 specs/,唯一勾选状态仍在 [tasks.md](tasks.md)。不能以本索引有行、有映射或 OpenSpec planning complete 证明功能已实现。 + +## 1. 审计结论与补齐范围 + +此前大部分设计已有规格和任务,但 detect/capabilities 仅有汇总注册任务;同步/接管恢复和环境任务复检缺明确故障验收;运行追踪、证据保留和评测门槛尚未充分进入正式规范;平台与宿主验收缺独立条目。现已补齐这些条目,已有清晰任务不重复拆分。 + +本索引覆盖36项命令、全部规格requirement、57个语言条目、5个候选平台、3个宿主,以及技术设计中的横向职责。每个requirement下全部Scenario属于该行验收范围;真正验收时必须提供逐Scenario证据,不能只挑其中一个通过样本。 + +## 2. 分阶段执行与责任边界 + +```mermaid +flowchart LR + A[S01-S02 契约与协议] --> B[S03 执行基础] + A --> C[S04 策略与规则] + B --> D[S05 适配与准备] + C --> D + D --> E[S06 Java / S07 首批生态] + D --> F[S09 工作区与任务] + E --> G[S08 其余语言] + E --> H[S10 修复] + F --> H + H --> I[S11 宿主与平台] + G --> J[S12 全量验收] + I --> J + J --> K[S13 发布与规格收敛] +``` + +| 里程碑 | 输入和可执行范围 | 退出证据 | 责任归属 | +|---|---|---|---| +| M0 契约基线 | S01、S02;在获准仓位建立四crate、schema和统一命令注册 | 协议正反例、依赖方向、命令帮助;只证明契约,不证明扫描器可用 | CLI/core维护者 | +| M1 运行内核 | M0之后S03、S04,再S05 | 进程、快照、政策、工具准备与静态查询;模拟工具和真实工具证据分开 | runtime/core/adapters维护者 | +| M2 第一条真实闭环 | Java S06,加S09已具备的sync/next/attempt/verify、S10修复与必要S11入口 | 真实Java检查→任务→修复→复检→准确内容gate;其它语言不得随之标完成 | adapters与插件接入维护者 | +| M3 能力补齐 | S07/S08逐语言,S09初始化全量场景,S11逐平台/宿主 | 下表每行独立证据,54个旧stable六槽位齐备;3个planned明确gap | 语言、平台与宿主维护者 | +| M4 产品验收 | S12;12.2先冻结oracle/阈值,再12.10计算器、12.11执行独立评测 | 真实工具、分层质量、完整性、故障恢复、性能和端到端证据 | 评测/验收维护者 | +| M5 发布收敛 | 全部实施验收满足后S13,按授权发布 | source/tag/artifact/lock/market/installed/runtime逐层证据,最后sync/archive | 发布维护者 | + +责任是模块职责,不虚构已分配人员。M2是可提前运行的集成切片,不代表整个S09/S11已完成;完整阶段依赖仍以tasks.md为准。CI调度时应使用任务实际前置产物,不能因为同属阶段而提前勾选。 + +Rust实现归未来独立CLI仓;宿主Hooks/commands/runtime lock归当前插件仓;受管技能修改归独立codeguard-skills源仓,经vendor引入。本change暂为三方唯一规格事实源,未批准前不复制成第二套可独立勾选的任务。 + +## 3. Requirement → 实施任务 + +追踪ID只是本索引的稳定引用,完整Requirement标题与spec文件才是规范定位;MODIFIED旧标题保持不变。任务区间包含端点。 + +| 追踪ID | 规格 / Requirement原名 | 实施任务ID | +|---|---|---| +| BD01 | [binary-distribution](specs/binary-distribution/spec.md) / Plugin execution SHALL bind a verified runtime artifact | 11.1,11.2,11.8-11.12 | +| BD02 | [binary-distribution](specs/binary-distribution/spec.md) / Compatibility SHALL be explicit and versioned | 2.6,11.7 | +| BD03 | [binary-distribution](specs/binary-distribution/spec.md) / Release claims SHALL require layered evidence | 11.8-11.15,13.1-13.7 | +| BD04 | [binary-distribution](specs/binary-distribution/spec.md) / Quality claims SHALL use independently labelled stratified evidence | 1.4,12.2-12.4,12.10,12.11 | +| EK01 | [execution-kernel](specs/execution-kernel/spec.md) / Existing entry points SHALL remain compatible | 1.1,1.3,2.6,4.2,11.6,11.7 | +| EK02 | [execution-kernel](specs/execution-kernel/spec.md) / Rust execution SHALL bound and close process lifecycles | 3.1-3.4 | +| EK03 | [execution-kernel](specs/execution-kernel/spec.md) / Rust snapshots SHALL bind the actual delivery input | 3.5-3.7,11.5 | +| EK04 | [execution-kernel](specs/execution-kernel/spec.md) / Rust cache reuse SHALL prove obligation equivalence | 3.8,12.5 | +| EK05 | [execution-kernel](specs/execution-kernel/spec.md) / Rust fixes SHALL preserve ownership and verify outcomes | 10.1-10.5 | +| EK06 | [execution-kernel](specs/execution-kernel/spec.md) / Offline and trusted CI execution SHALL enforce their declared boundaries | 3.11,5.3,11.5,12.5 | +| EK07 | [execution-kernel](specs/execution-kernel/spec.md) / Execution observability SHALL correlate evidence without changing verdicts | 3.9,12.4,12.11 | +| EK08 | [execution-kernel](specs/execution-kernel/spec.md) / Evidence storage SHALL preserve ownership and active references | 3.2,3.10,9.14 | +| HP01 | [hook-protocol](specs/hook-protocol/spec.md) / The cheat-sheet SHALL document fail-open for uncaught exceptions | 2.6,11.4 | +| HP02 | [hook-protocol](specs/hook-protocol/spec.md) / Soft and hard gates SHALL share the skipGate escape and neither may fall back to scanning outside a git repository | 2.6,4.5,11.4,11.5 | +| HP03 | [hook-protocol](specs/hook-protocol/spec.md) / Fail-open uncertainty SHALL be visible | 2.6,11.3-11.5 | +| HP04 | [hook-protocol](specs/hook-protocol/spec.md) / Skip-gate bypass values SHALL be parsed strictly | 2.6,4.5,11.4 | +| HP05 | [hook-protocol](specs/hook-protocol/spec.md) / Migrated host surfaces SHALL share the same report semantics | 11.3-11.6,11.13-11.15,12.6 | +| LG01 | [language-gate-commands](specs/language-gate-commands/spec.md) / Languages may declare a configuration prerequisite | 2.6,5.1,5.2 | +| LG02 | [language-gate-commands](specs/language-gate-commands/spec.md) / Gates in git repositories SHALL default to changed-file scope | 2.6,3.5-3.8,6.6 | +| LG03 | [language-gate-commands](specs/language-gate-commands/spec.md) / A toolchain crash SHALL be recorded as unverified, not as a lint failure | 2.3,5.4,5.5 | +| LG04 | [language-gate-commands](specs/language-gate-commands/spec.md) / Rust command plans SHALL preserve explicit build levels | 6.5,6.6,12.1 | +| NA01 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Adapters SHALL publish verifiable capability contracts | 1.5,5.1,5.5,5.8 | +| NA02 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Native evidence SHALL be interpreted per tool contract | 5.4,5.5 | +| NA08 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Static detection families SHALL remain explicit and extensible | 5.10,6.3,6.8,7.6,8.1-8.148 | +| NA03 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Java checks SHALL prove each required native obligation | 6.1-6.7 | +| NA04 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Comment and security categories SHALL retain their own evidence | 6.3,6.4,7.1-7.4,8.1-8.144 | +| NA05 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / CVE checks SHALL bind actual dependency and database identity | 6.4,7.5 | +| NA06 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Migration SHALL account for every legacy language entry | 1.1,1.5,6.1-6.7,7.1-7.5,8.1-8.148 | +| NA07 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Adapters SHALL separate static observation from executable resolution | 1.3,1.6,5.1,5.7,5.9 | +| PI01 | [project-initialization](specs/project-initialization/spec.md) / Initialization SHALL build an evidence bound project profile | 9.15-9.17 | +| PI02 | [project-initialization](specs/project-initialization/spec.md) / Architecture observations SHALL not become unapproved rules | 9.19 | +| PI03 | [project-initialization](specs/project-initialization/spec.md) / Module graphs SHALL preserve relation types and uncertainty | 9.18 | +| PI04 | [project-initialization](specs/project-initialization/spec.md) / AGENTS generation SHALL preserve scope and human ownership | 9.20,9.21 | +| PI05 | [project-initialization](specs/project-initialization/spec.md) / Init SHALL plan and apply without hidden execution | 9.1,9.22,9.24 | +| PI06 | [project-initialization](specs/project-initialization/spec.md) / Profile refresh SHALL preserve findings and detect stale inputs | 9.16,9.23 | +| PI07 | [project-initialization](specs/project-initialization/spec.md) / Initialization status SHALL be separate from quality readiness | 9.24,9.25,12.8 | +| RW01 | [remediation-workflow](specs/remediation-workflow/spec.md) / Projects SHALL have an explicitly initialized remediation workspace | 9.1,9.2 | +| RW02 | [remediation-workflow](specs/remediation-workflow/spec.md) / Findings and environment blockers SHALL produce distinct actionable tasks | 9.3,9.4,9.6 | +| RW03 | [remediation-workflow](specs/remediation-workflow/spec.md) / Closing a task SHALL require verified resolution evidence | 9.10,9.11,9.28,10.3,10.5 | +| RW04 | [remediation-workflow](specs/remediation-workflow/spec.md) / Repair briefs SHALL guide bounded progress without changing authority | 9.7,9.9,9.26 | +| RW05 | [remediation-workflow](specs/remediation-workflow/spec.md) / Enabled plugin workflows SHALL connect scans to actionable briefs | 9.13,11.13-11.15,12.7 | +| RW08 | [remediation-workflow](specs/remediation-workflow/spec.md) / Check results SHALL be returned in the agent conversation | 5.10,9.13,11.16,12.7 | +| RW06 | [remediation-workflow](specs/remediation-workflow/spec.md) / Workflow persistence SHALL preserve collaboration and gate independence | 9.5,9.8,9.14,9.27 | +| RW07 | [remediation-workflow](specs/remediation-workflow/spec.md) / Repair command handoffs SHALL bind attempts and leases explicitly | 9.9,9.12,9.27,10.5 | +| RG01 | [rulepack-governance](specs/rulepack-governance/spec.md) / Quality policy SHALL be independent from operational options | 4.1,4.2,4.7 | +| RG02 | [rulepack-governance](specs/rulepack-governance/spec.md) / Rulepacks and toolchains SHALL be versioned and locked | 4.3,5.2,5.3 | +| RG03 | [rulepack-governance](specs/rulepack-governance/spec.md) / Historical findings SHALL remain findings | 4.4 | +| RG04 | [rulepack-governance](specs/rulepack-governance/spec.md) / Exceptions SHALL require independently verifiable authority | 4.5,9.11,12.5 | +| RG05 | [rulepack-governance](specs/rulepack-governance/spec.md) / Existing dot-prefix scope SHALL remain explicit | 4.6 | +| RG06 | [rulepack-governance](specs/rulepack-governance/spec.md) / False-positive allowlists SHALL be exact, authorized dispositions | 4.5,4.8,4.9,4.10,9.28,12.12 | +| SS01 | [scan-scope-policy](specs/scan-scope-policy/spec.md) / Managed remediation artifacts SHALL have a bounded self-scan policy | 4.6,9.2,9.14 | +| UC01 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Unified commands SHALL select explicit check obligations | 2.1,2.4 | +| UC02 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Rust CLI SHALL expose a versioned exit contract | 2.3 | +| UC03 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Reports SHALL preserve semantics across public formats | 2.2,2.5,2.10,12.12 | +| UC04 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Empty selection SHALL NOT certify delivery | 2.4 | +| UC05 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Public commands SHALL have distinct operation contracts | 1.2,1.6,2.7,4.9,5.7,5.8,12.9 | +| UC06 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Operation success SHALL remain separate from quality certification | 2.2,2.3,2.7,2.10,4.9,9.26,11.3 | +| UC07 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Preparation commands SHALL preserve observation and mutation boundaries | 4.7,5.2,5.6-5.8 | +| UC08 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Tool installation SHALL use a bounded explicit plan and apply | 5.3,5.6 | +| UC09 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Gate commands SHALL receive explicit delivery content | 3.6,11.5 | +| UC10 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Execution budgets SHALL have explicit defaults and a shared deadline | 2.8,3.1-3.4 | +| UC11 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Report export SHALL preserve identity and persistence failures | 2.2,2.5,2.9 | +| VI01 | [verdict-integrity](specs/verdict-integrity/spec.md) / Verdicts SHALL preserve uncertainty across interfaces | 2.3,2.6,11.4 | +| VI02 | [verdict-integrity](specs/verdict-integrity/spec.md) / Required completeness SHALL gate Rust delivery | 2.4,2.10,4.8,12.1,12.5,12.12 | +| VI03 | [verdict-integrity](specs/verdict-integrity/spec.md) / Coverage SHALL not change with scheduling strategy | 3.4,3.8,6.6,12.4 | + +## 4. 36项命令 → 规格与任务 + +每行除列出的专项验收,还执行12.9统一参数/格式/退出码/副作用/取消矩阵。检查入口连接共同CheckService,不能把“命令可解析”当作原生适配器已经完成。 + +| ID | 命令 | 规格追踪ID | 实施任务ID | 专项验收 | +|---|---|---|---|---| +| C01 | `help / --help` | UC05 | 2.7 | 无项目仍返回帮助,不扫描或安装 | +| C02 | `--version` | UC05,BD01 | 1.2,2.7 | 嵌入元数据和实际runtime绑定可核对 | +| C03 | `detect` | UC07,NA07 | 5.7 | 完整unknown为0,必要输入不可读为3,不写画像 | +| C04 | `capabilities` | UC05,UC07,NA01 | 1.5,5.8 | planned/未知ID/坏注册表分别解释 | +| C05 | `init` | PI01,PI02,PI03,PI04,PI05,PI06,PI07,RW01 | 9.1,9.15-9.25,12.8 | 静态预览、受管应用、冲突恢复、准备状态分离 | +| C06 | `plan` | UC01,NA07 | 2.1,3.4,5.9 | 义务/DAG/未解析项可见,不执行动态脚本 | +| C07 | `doctor` | UC07 | 5.2,5.6 | 制品匹配不代替运行条件,报告可同步 | +| C08 | `rules list/whitelist list/explain/propose` | RG01,RG02,RG06,UC07 | 4.3,4.7-4.10 | 规则与白名单候选/批准/失配及撤销修订链可追溯,propose不自批 | +| C09 | `config validate` | RG01,UC07 | 4.2,4.7 | 坏配置与未批准弱化为未完成 | +| C10 | `config explain` | RG01,UC07 | 4.1,4.7 | 来源/覆盖/拒绝原因可见且脱敏 | +| C11 | `tools list` | UC07 | 5.6 | 静态库存可含缺工具,不宣称已验证 | +| C12 | `tools verify` | RG02,UC07 | 5.2,5.6 | 摘要与锁不符不回退随机PATH | +| C13 | `tools install` | UC08,RG02 | 5.3,5.6 | 默认预览,显式应用可恢复,无静默安装 | +| C14 | `lint` | UC01,NA01,NA02,NA03 | 2.1,5.1,6.2 | 编码规则真实执行;其它语言见第5节逐行任务 | +| C15 | `comments` | NA04 | 2.1,5.1,6.3 | formatter不代替文档契约;其它语言见第5节 | +| C16 | `cve` | NA05 | 2.1,6.4,7.5 | 真实依赖/库身份/UNKNOWN保留;其它语言见第5节 | +| C17 | `security` | NA04,RG05,SS01 | 2.1,4.6,6.4,9.2 | 源码/配置/入库策略证据分离;其它语言见第5节 | +| C18 | `build` | LG04,NA03 | 2.1,6.5,6.6 | 构建等级/测试执行与规则覆盖分离;其它语言见第5节 | +| C19 | `check` | UC01,UC02,UC04,VI02,VI03 | 2.3,2.4,3.4,6.7 | 全义务聚合,部分成功不代表项目allow | +| C20 | `gate pre-commit` | UC09,EK03 | 3.5-3.7,11.5 | 实际index/alternate index/部分暂存 | +| C21 | `gate pre-push` | UC09,EK03 | 3.6,11.5 | remote/stdin/非HEAD/多ref,缺输入不回退 | +| C22 | `gate ci` | UC09,EK06 | 3.11,11.5,12.5 | 不可变OID与可信验证端隔离 | +| C23 | `work sync` | RW02 | 9.3,9.4,9.6 | 全部报告、单份失败、事件/游标中断恢复 | +| C24 | `status` | RW04,UC06 | 9.7,9.26 | 历史结果freshness与当前状态分离 | +| C25 | `next` | RW04 | 9.7,9.26 | 五种disposition,空待办不等于allow | +| C26 | `task show` | RW04,RW06 | 9.5,9.7 | 事件证据与人工勾选分离,坏ID/坏链可见 | +| C27 | `task claim` | RW06 | 9.8,9.27 | 到期接管先abandoned/预算,失败不授新租约 | +| C28 | `task heartbeat` | RW06 | 9.8,9.27 | 旧token不能复活,续租不重置预算 | +| C29 | `task release` | RW06 | 9.8,9.27 | 不释放新租约,未结束尝试不得遗弃 | +| C30 | `task attempt start` | RW04,RW07 | 9.9,9.27 | 受控动作/输入指纹,换名不重置预算 | +| C31 | `task attempt finish` | RW04,RW07 | 9.9,9.27 | 显式attempt,幂等结束,失败/noop也计数 | +| C32 | `fix` | EK05,RW07 | 9.12,10.1-10.5 | 预览不消耗尝试、应用保所有权、同策略复检 | +| C33 | `task verify` | RW03,RW06 | 9.10,9.11,10.5 | 环境恢复后重跑原义务,自有/借用租约区分 | +| C34 | `mcp serve` | UC06,HP05 | 11.3,11.13-11.15 | 请求失败和服务存活分离,共用核心API | +| C35 | `compat legacy-v1` | BD02,EK01 | 2.6,11.7 | 逐旧入口映射,不生成新认证 | +| C36 | `dependencies` | UC01,NA08 | 2.1,5.10,6.8,7.6 | 探测依赖检查配置,运行已配置工具并反馈结果,与 CVE 分开 | + +## 5. 全语言迁移 → 实施任务 + +统一满足NA01/NA04/NA05/NA06;每个旧stable都有lint/comments/dependencies/cve/security/build六槽位,缺口不得静默当not_applicable。下表只定位任务,具体候选工具与差异见语言迁移文档。planned保留缺口是已确认范围,不把它当成新实现已完成。 + +| language ID | 基线状态 | 实施任务ID | 验收要求 | +|---|---|---|---| +| java | stable | 6.1-6.7 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| rust | stable | 7.1 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| typescript | stable | 7.3 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| python | stable | 7.2 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| go | stable | 8.1,8.2,8.3 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| csharp | stable | 8.4,8.5,8.6 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| kotlin | stable | 8.7,8.8,8.9 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| swift | stable | 8.10,8.11,8.12 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| php | stable | 8.13,8.14,8.15 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| ruby | stable | 8.16,8.17,8.18 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| scala | stable | 8.19,8.20,8.21 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| shell | stable | 7.4 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| dockerfile | stable | 7.4 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| yaml | stable | 8.70,8.71,8.72 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| elixir | stable | 8.22,8.23,8.24 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| css | stable | 8.46,8.47,8.48 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| c | stable | 8.25,8.26,8.27 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| cpp | stable | 8.28,8.29,8.30 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| objc | stable | 8.31,8.32,8.33 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| dart | stable | 8.34,8.35,8.36 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| vue | stable | 8.37,8.38,8.39 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| svelte | stable | 8.40,8.41,8.42 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| astro | stable | 8.43,8.44,8.45 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| solidity | stable | 8.55,8.56,8.57 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| terraform | stable | 8.58,8.59,8.60 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| nix | stable | 8.61,8.62,8.63 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| html | stable | 8.49,8.50,8.51 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| sql | stable | 8.64,8.65,8.66 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| graphql | stable | 8.52,8.53,8.54 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| protobuf | stable | 8.67,8.68,8.69 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| markdown | stable | 8.73,8.74,8.75 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| toml | stable | 8.76,8.77,8.78 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| haskell | stable | 8.79,8.80,8.81 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| ocaml | stable | 8.82,8.83,8.84 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| fsharp | stable | 8.85,8.86,8.87 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| perl | stable | 8.88,8.89,8.90 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| groovy | stable | 8.91,8.92,8.93 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| clojure | stable | 8.94,8.95,8.96 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| powershell | stable | 8.97,8.98,8.99 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| zig | stable | 8.100,8.101,8.102 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| nim | stable | 8.103,8.104,8.105 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| crystal | stable | 8.106,8.107,8.108 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| julia | stable | 8.109,8.110,8.111 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| elm | stable | 8.112,8.113,8.114 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| lua | stable | 8.115,8.116,8.117 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| luau | stable | 8.118,8.119,8.120 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| pascal | stable | 8.121,8.122,8.123 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| r | stable | 8.124,8.125,8.126 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| cfml | stable | 8.127,8.128,8.129 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| cobol | planned | 8.145 | planned/gap清晰,项目必需时未完成,不能空实现充数 | +| vbnet | stable | 8.130,8.131,8.132 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| erlang | stable | 8.133,8.134,8.135 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| arkts | planned | 8.146 | planned/gap清晰,项目必需时未完成,不能空实现充数 | +| metal | planned | 8.147 | planned/gap清晰,项目必需时未完成,不能空实现充数 | +| liquid | stable | 8.136,8.137,8.138 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| cuda | stable | 8.139,8.140,8.141 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | +| ansible | stable | 8.142,8.143,8.144 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | + +## 6. 平台与宿主 → 独立证据 + +| 目标 | 规格追踪ID | 实施任务ID | 验收边界 | +|---|---|---|---| +| macOS arm64 | BD01,BD03,EK02,EK06,EK08 | 11.8 | 目标平台真实执行、进程回收、私有存储、离线能力 | +| macOS x86_64 | BD01,BD03,EK02,EK06,EK08 | 11.9 | 不用arm64或交叉编译替代 | +| Linux x86_64 | BD01,BD03,EK02,EK06,EK08 | 11.10 | 固定libc/最低系统/运行环境 | +| Linux aarch64 | BD01,BD03,EK02,EK06,EK08 | 11.11 | 本架构运行,不借x86证据 | +| Windows x86_64 | BD01,BD03,EK02,EK08 | 11.12 | Job Object/路径/权限/文件共享/取消;离线能力实测,不能保证则明确gap | +| Codex | HP05,BD03,RW05 | 11.13 | 安装身份+真实CLI/MCP/保存/Git与修复链 | +| ZCode | HP05,BD03,RW05 | 11.14 | 宿主协议与阻断能力,不透传新CLI数字 | +| Kimi | HP05,BD03,RW05 | 11.15 | 实际调用与失败恢复,不以别的宿主替代 | + +## 7. 横向设计覆盖 + +| 设计范围 | 规格追踪ID | 任务定位 | +|---|---|---| +| 四crate与应用服务/ports、外部技能所有权 | EK01,NA07,UC05 | 1.1–1.6、11.6 | +| 参数、输出类型、退出码、格式与原子导出 | UC01–UC11,VI01,VI02 | 2.1–2.10、5.7–5.8 | +| 项目画像、架构推断、AGENTS受管合并、刷新 | PI01–PI07 | 9.15–9.25 | +| 策略/规则/配置/工具锁/例外/基线 | RG01–RG06 | 4.1–4.9、5.2–5.3、9.28、12.12 | +| 静态观察与动态解析、原生专用报告、共享扫描 | NA01–NA07 | 5.1–5.9、6/7/8各语言任务 | +| 进程生命周期、DAG、预算、网络与可信CI | EK02,EK06,UC10 | 3.1–3.4、3.11、11.5、12.5 | +| Git真实输入、内容身份、缓存等价与覆盖 | EK03,EK04,VI03 | 3.5–3.8、6.6、11.5 | +| 持久目录、隐私、自扫描与证据保留 | EK08,RW01,RW06,SS01 | 3.10、9.1–9.2、9.14 | +| 问题/阻塞归并、事件与投影、同步事务 | RW02,RW03,RW06 | 9.3–9.6、9.10–9.11、9.28 | +| RepairBrief、租约、尝试、无进展与失租恢复 | RW04,RW06,RW07 | 9.7–9.9、9.12、9.26–9.27 | +| 原生修复、补丁所有权、部分失败与复检 | EK05,RW07 | 10.1–10.5 | +| 插件自动scan→sync→brief、MCP/Hook映射 | HP01–HP05,RW05 | 9.13、11.3–11.6、11.13–11.15 | +| 制品绑定、显式legacy、迁移与回滚 | BD01–BD03 | 11.1–11.2、11.7–11.12、13.3–13.5 | +| 本地关联追踪、故障归因、隐私及无默认上传 | EK07,EK08 | 3.9–3.10、12.4、12.11 | +| 分层oracle、holdout、统计门槛、性能等价 | BD04 | 1.4、12.2–12.4、12.10–12.11 | +| 完整交付/语言平台证据及规范收敛 | BD03,NA06 | 12.1–12.11、13.1–13.7 | + +## 8. 实施时待确定参数及关闭责任 + +这些不是遗漏任务,也不是已验证事实;必须在列出的任务取得证据,不能用待定作为跳过义务的理由。 + +| 待确定项 | 关闭任务 | 所需证据 | +|---|---|---| +| CLI独立仓位置、远程地址、MSRV和依赖锁 | 1.2、11.1、13.4 | 用户授权的仓位/发布身份与可复现构建 | +| 官方P3C/PMD/JDK精确兼容组合 | 6.2 | 固定版本与真实正反例 | +| 罕见语言工具、方言和不适用依据 | 8.1–8.148 | 每语言六槽位实际证据,未解决保持gap | +| 平台ABI/libc/最低系统、签名与网络隔离能力 | 11.1、11.8–11.12 | 各目标平台真实运行与能力报告 | +| 精确MCP工具schema和宿主事件映射 | 11.3–11.5、11.13–11.15 | 实际协议与三宿主验收 | +| 语料项目、oracle裁定和绝对性能预算 | 1.4、12.2、12.4、12.10–12.11 | 分层独立样本、冻结阈值及同覆盖基线 | + +## 9. 覆盖审计口径 + +静态审计必须检查:每个Requirement恰有一行;每个task至少被一个Requirement关联;35个命令、57个语言、5个平台、3个宿主均可定位;所有任务引用存在;阶段依赖无循环,验收输入和实施产物分开。语义覆盖另由设计逐项对照和独立读者审查,不能用编号数量代替。 + +当前所有实现任务保持未勾选。索引通过只能声称“当前已确认设计已拆分并可追踪”,不能声称二进制、低误报指标、平台或宿主已可用。后续若新增设计,必须同轮更新规格、tasks与本索引。 + + +## 2026-09-27 新增规格的任务映射补齐 + +以下补齐当前增量规格的追踪,不创建第二套任务、不改变验收标准。每行覆盖该Requirement下全部Scenario;任务ID已与现有tasks核对。部分Rust契约或原生用例通过不代表所列完整任务完成,状态仍以tasks为准。 + +| 追踪ID | 规格 / Requirement原名 | 实施任务ID | +|---|---|---| +| BD05 | [binary-distribution](specs/binary-distribution/spec.md) / Network installation SHALL verify signed selection and exact host permission before downloading | 5.3,11.2,12.5,13.4 | +| BD06 | [binary-distribution](specs/binary-distribution/spec.md) / Signed package publication SHALL bind source, content, clock and original locator | 11.1,11.2,12.5,13.4 | +| BD07 | [binary-distribution](specs/binary-distribution/spec.md) / Distribution signatures SHALL bind original manifest and lock bytes under independent host constraints | 11.1,11.2,12.5,13.4 | +| BD08 | [binary-distribution](specs/binary-distribution/spec.md) / Package HTTPS transport SHALL preserve frozen bytes under the shared budget | 3.2,3.3,11.2,12.5 | +| BD09 | [binary-distribution](specs/binary-distribution/spec.md) / Downloaded archives SHALL bind the complete tree before publication | 11.1,11.2,12.5,13.4 | +| BD10 | [binary-distribution](specs/binary-distribution/spec.md) / Archive bundle roots SHALL be projected explicitly without discarding other members | 11.1,11.2,12.5,13.4 | +| BD11 | [binary-distribution](specs/binary-distribution/spec.md) / Bundle directories SHALL publish without exposing partial trees or replacing existing content | 11.1,11.2,12.5,13.4 | +| EK09 | [execution-kernel](specs/execution-kernel/spec.md) / Static input inspection SHALL reject special files without waiting for peers | 3.2,3.5,3.7,5.2,12.5 | +| EK10 | [execution-kernel](specs/execution-kernel/spec.md) / Managed artifact publication SHALL preserve identity and ownership | 3.7,3.10,11.2,12.5 | +| EK11 | [execution-kernel](specs/execution-kernel/spec.md) / Distribution package streams SHALL be bounded and verified before extraction | 3.2,3.7,11.2,12.5 | +| EK12 | [execution-kernel](specs/execution-kernel/spec.md) / Archive expansion SHALL validate all members before publication | 3.2,3.7,11.2,12.5 | +| EK13 | [execution-kernel](specs/execution-kernel/spec.md) / Complete archive trees SHALL bind all bundle contents | 3.2,3.7,11.2,12.5 | +| NT01 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Explicit Maven Javadoc selection SHALL not fall back to isolated single-file diagnostics | 5.10,6.3,12.1,12.3 | +| NT02 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Checkstyle XML interpretation SHALL preserve native identity and distinguish processing failures | 5.10,6.3,12.1,12.3 | +| NT03 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Checkstyle repair feedback SHALL bind native sources to original configuration | 5.10,6.3,12.1,12.3 | +| NT04 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Field Javadoc checking SHALL use the native configured Checkstyle rule | 5.10,6.3,12.1,12.3 | +| NT05 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Official Checkstyle module names SHALL preserve native checker identity | 5.10,6.3,12.1,12.3 | +| NT06 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Missing method Javadoc configuration SHALL remain native and context-bound | 5.10,6.3,12.1,12.3 | +| NT07 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Method tag configuration SHALL preserve native option semantics | 5.10,6.3,12.1,12.3 | +| NT08 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Type documentation options SHALL retain their original checker context | 5.10,6.3,12.1,12.3 | +| NT09 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint JSON reports SHALL separate rule findings from incomplete execution and suppression | 5.10,7.3,12.1 | +| NT10 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint native command planning SHALL use explicit literal inputs | 3.1,7.3,12.1 | +| NT11 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint controlled execution SHALL bind version and current inputs | 3.2,3.7,7.3,12.1 | +| NT12 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint configuration discovery SHALL distinguish candidates from effective configuration | 5.10,7.3,12.1 | +| NT13 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / npm native audit observation SHALL retain protocol and coverage boundaries | 5.10,7.3,7.5,12.1 | +| NT14 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint task recheck SHALL observe the original effective rule | 7.3,9.7,12.7 | +| NT15 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Public ESLint local feedback SHALL retain uncertainty and explicit context | 7.3,9.13,11.16,12.9 | +| RW09 | [remediation-workflow](specs/remediation-workflow/spec.md) / npm remediation tasks SHALL recheck through their original native audit service | 7.3,9.7,9.13,12.7 | +| RW10 | [remediation-workflow](specs/remediation-workflow/spec.md) / npm child projects SHALL preserve explicit workspace ownership | 7.3,9.14,9.15,12.7 | +| RW11 | [remediation-workflow](specs/remediation-workflow/spec.md) / Local doctor observations SHALL enter the remediation queue without granting readiness | 5.2,9.3,9.24,9.25,12.7 | +| RW12 | [remediation-workflow](specs/remediation-workflow/spec.md) / Explicit Checkstyle workspace observations SHALL generate stable local repair tasks | 6.3,9.3,9.4,9.13,12.7 | +| RW13 | [remediation-workflow](specs/remediation-workflow/spec.md) / Checkstyle task verification SHALL replay the original native checker without automatic closure | 6.3,9.7,9.13,12.7 | +| RW14 | [remediation-workflow](specs/remediation-workflow/spec.md) / Checkstyle preparation failures SHALL create stable environment tasks | 6.3,9.3,9.24,12.7 | +| RW15 | [remediation-workflow](specs/remediation-workflow/spec.md) / Checkstyle preparation verification SHALL preserve the original blocked obligation | 6.3,9.7,9.13,12.7 | +| RW16 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint task identity SHALL bind native rule and stable source anchor | 7.3,9.3,9.14,12.7 | +| RW17 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint local observations SHALL feed stable repair records | 7.3,9.3,9.4,9.13,12.7 | +| RW18 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint incomplete prerequisites SHALL create investigation tasks | 7.3,9.3,9.24,12.7 | +| RW19 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint task verification SHALL retain native observations | 7.3,9.7,9.13,12.7 | +| RW20 | [remediation-workflow](specs/remediation-workflow/spec.md) / npm local audit observations SHALL enter persistent coverage repair tasks | 7.3,9.3,9.4,9.13,12.7 | +| UC12 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / check all SHALL orchestrate npm roots through the shared native runtime | 2.3,3.4,7.3,7.5,9.13,12.9 | +| UC13 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Install previews SHALL distinguish bound layout declarations from verified package contents | 2.7,11.2,12.9 | +| UC14 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / npm public CVE feedback SHALL preserve local observation boundaries | 2.5,7.3,7.5,11.16,12.9 | +| UC15 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / npm public audit SHALL consume shared runtime timeout defaults | 2.8,3.2,7.3,12.9 | diff --git a/openspec/changes/introduce-rust-codeguard-cli/proposal.md b/openspec/changes/introduce-rust-codeguard-cli/proposal.md index 9ee477c..ca2a882 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/proposal.md +++ b/openspec/changes/introduce-rust-codeguard-cli/proposal.md @@ -4,15 +4,20 @@ Codeguard 的目标是调用传统静态工具,完成多语言代码规范、注释规范、依赖漏洞、安全和构建质量检查。当前实现把工具故障、基线豁免和宿主放行混在交付路径中,智能体容易通过降低检查要求消除报错;需要统一执行与证据契约,恢复“准确检查、完整交付”的产品边界。 +项目侧以**识别实际检查配置 → 调用已配置的原生工具 → 将结果反馈到智能体对话**为主流程。检测族目录只提供发现线索,不要求每个项目证明所有候选检查都执行过;未配置与运行失败分别给出配置或环境恢复建议。 + ## What Changes - 建立独立 Rust workspace `codeguard-cli/`,四个 crate 分别负责入口、领域契约、执行基础设施、工具适配;发布可执行文件 `codeguard`。 -- 提供 `lint/comments/cve/security/build/check `,CLI、MCP、Git 与宿主入口复用同一检查内核。 +- 提供 `lint/comments/dependencies/cve/security/build/check `,CLI、MCP、Git 与宿主入口复用同一检查内核。 +- 固化完整命令目录:发现准备、配置与工具管理、准确内容门禁、持久修复和协议入口;逐项定义输入输出、副作用、操作退出语义、执行预算和下一步,避免查询/安装成功被当成质量通过。 - **BREAKING**:新 CLI 协议采用 0 通过、1 违规、2 用法错误、3 未完成、4 内部故障、130 取消;旧协议通过显式兼容入口保留,禁止根据数字猜测状态。 - **BREAKING**:迁移后的交付门禁要求必需检查全部完成;工具故障不认定为代码违规,也不再允许被当作交付通过。 - **BREAKING**:新流程不接受智能体自行设置 skipGate、降低阈值、增加 suppression 或使用存量基线豁免;基线仅分类问题。 - 用版本化 rulepack、工具链锁、结构化报告、检查覆盖账本和真实样本评测降低误报;保留全部真实发现与不确定性。 +- 将运行关联追踪、私有证据保留和分层评测门槛纳入正式规格;建立逐需求/命令/语言/平台/宿主的实施覆盖索引,明确尚需实测的参数及关闭任务。 - 在项目内初始化 `./codeguard/`,将脱敏问题、环境阻塞、修复任务和复检事件持久化;原始报告与缓存由目录内 .gitignore 忽略,通过 next/task verify 指导智能体闭环修复。 +- init 识别项目边界、语言/版本、构建器、架构证据与模块依赖,形成结构化画像和检查准备任务,在被检查项目 AGENTS.md 安全维护受管摘要。 - 迁移当前注册表全部 57 个条目,逐项验收 54 个 stable 的实际能力,保留 3 个 planned 的真实状态;禁止用少数语言演示代替全量迁移。 - 保留项目既有点前缀忽略及入库安全、配置发现例外;各检查类别明确适用条件和能力缺口。 @@ -25,6 +30,7 @@ Codeguard 的目标是调用传统静态工具,完成多语言代码规范、 - `rulepack-governance`:规则版本、可信策略、禁止自动弱化、例外和基线治理。 - `binary-distribution`:二进制与插件版本绑定、兼容迁移、发布验收。 - `remediation-workflow`:持久问题和待办、修复简报、任务租约、真实复检关闭与重开。 +- `project-initialization`:项目画像、架构证据与模块图、AGENTS 受管摘要、幂等刷新及准备状态。 ### Modified Capabilities @@ -38,6 +44,6 @@ Codeguard 的目标是调用传统静态工具,完成多语言代码规范、 未来代码归属:`codeguard-cli` 持有 Rust 内核、适配器、规则和协议;本插件持有宿主入口、运行时版本绑定;`codeguard-skills` 持有技能事实源。现有 `skills.lock.json` 管理边界不变。 -当前交付仅为设计及执行任务,不建立 Rust 源码仓、不修改 Python 运行行为、不升级安装、不发布。正式规格以本 change 的 `specs/` 为准;实现完成前不 sync/archive。旧 OpenSpec change 的宿主副本治理另行保留,不并入或伪称已完成。 +设计阶段仅交付规格与执行任务;后续实施已在相邻独立工作目录 `../codeguard-cli/` 建立 Rust 四 crate 工程基线,尚未建立远程源码仓、修改 Python 运行行为、升级安装或发布。正式规格以本 change 的 `specs/` 为准;实现完成前不 sync/archive。旧 OpenSpec change 的宿主副本治理另行保留,不并入或伪称已完成。 相关说明:[架构文档](../../../docs/rust-cli/architecture.zh-CN.md)、[技术方案](../../../docs/rust-cli/technical-design.zh-CN.md)、[语言迁移与验收](../../../docs/rust-cli/coverage-and-acceptance.zh-CN.md)。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md index b41bd89..6090662 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md @@ -4,6 +4,158 @@ ## ADDED Requirements +### Requirement: Network installation SHALL verify signed selection and exact host permission before downloading + +签名网络安装编排 MUST 在任何下载请求前核验原签名/清单/锁、独立宿主范围/时钟/最低序号、本机平台及精确工具,并要求完整定位清单。宿主网络许可 MUST 为有界规范主机:端口集合,包含初始站点,禁止通配、环境代理推导或项目自批;重定向仅沿同一明确许可范围,传输 MUST 复用受控 runtime 的 TLS/字节/预算契约。签名/目标/平台/许可失配 MUST 在请求前拒绝且不写缓存。 + +下载后的制品发布 MUST 复用签名包发布编排,重新核验下载前固定范围和时间、包/完整树及原锁定位,沿用绝对期限/取消,不执行包内入口。只有完成的制品收据可返回;网络成功或测试签名不得替代真实宿主信任来源、运行时齐备、原生可运行性或质量门禁。真实网络测试 MUST 单独明确站点/固定内容,使用测试信任密钥时不得声称真实发行批准。 + +#### Scenario: A site is missing from the independent host grant +- **WHEN** 签名与精确目标相符,但初始下载 authority 不在宿主许可中或许可含通配 +- **THEN** 返回固定未批准/范围无效诊断,不发起下载请求,不写缓存 + +#### Scenario: A public HTTPS fixture traverses the complete service +- **WHEN** 明确授权测试站点及固定提交内容,以专属测试密钥绑定声明调用网络编排 +- **THEN** 生产 TLS 客户端核验精确字节并按原锁发布临时缓存,不执行制品;该证据不升级为真实发行信任根或宿主验收 + + +### Requirement: Signed package publication SHALL bind source, content, clock and original locator + +明确调用的离线包发布编排 MUST 在文件系统写入前验证发行签名和原清单/锁、选择精确工具及本机平台,仅使用具有完整定位协议的清单。raw MUST 使用精确长度/摘要/原锁定位关联,归档 MUST 关联完整树和可选 bundle,再调用受控发布层重新核验内容及文件系统。编排 MUST NOT 重写工具锁、下载网络资源或执行包内入口;制品收据不得证明运行时齐备、原生可运行性或质量通过。 + +签名和受保护时钟 MUST 在内容核验前、发布前及发布后核对,时钟不得早于初始固定上下文或本轮前次观察;取消和绝对期限共享全部阶段。签名/目标/包/期限失配或发布前取消 MUST NOT 写入制品。发布后时钟/期限/预算失败可能保留完整内容,但 MUST 返回失败,重试仅在重新核验来源/内容/文件系统后复用;不得删除既有损坏目标或回退旧清单猜测定位。宿主信任/撤销/防回滚真实性及网络安装许可仍须独立建立,项目 JSON 不能自行授予权限。 + +#### Scenario: A signed raw or archive package is published at the original lock locator +- **WHEN** 明确调用编排,独立宿主输入下签名有效、原始包/布局相符且缓存安全 +- **THEN** 发布入口与原工具锁精确相同;重复调用重新核验后复用,不执行制品或声称完整工具准备 + +#### Scenario: The final clock becomes unavailable after publication +- **WHEN** 完整制品已发布但最终时钟不可核验 +- **THEN** 不返回成功,完整内容可保留;后续新调用必须重新验证全部绑定和时间后才能复用 + +#### Scenario: Existing published bytes are tampered +- **WHEN** 同一内容寻址目标已存在但字节损坏 +- **THEN** 返回失败并保留损坏目标,不覆盖或删除它来制造安装成功 + + +### Requirement: Distribution signatures SHALL bind original manifest and lock bytes under independent host constraints + +发行来源绑定 MUST 使用独立 `codeguard.distribution.v1` Ed25519 协议域,签名覆盖精确密钥 ID 与原始 release_json UTF-8 文本,不复用白名单批准域或签后重序列化载荷。版本化封装/载荷 MUST 拒绝未知及重复字段,限制输入长度。载荷 MUST 固定发行者、通道、平台、递增序号、签发/失效时间、原始清单及锁字节 SHA-256。 + +可信公钥、其发行者/期限/撤销状态,以及预期通道/平台、可信时钟、最低序号和最长有效期 MUST 由受保护宿主独立提供,不从被检查项目或同次候选变更自证。核验 MUST 拒绝范围失配、过期/未来签发、撤销、回滚与缺时钟;核验后仍 MUST 严格解析清单、绑定全部制品至同一原锁,并要求所选平台确实存在。只读结果 MUST NOT 可由 JSON 构造或直接声明安装/网络/质量权威;签名相符仅证明在给定宿主输入下的字节/范围绑定,正式执行仍须验证真实宿主来源、网络授权、最终时钟/撤销及安装计划。 + +#### Scenario: A valid release signature binds exact manifest bytes +- **WHEN** 宿主范围及有效密钥下签名相符,原清单/锁摘要精确一致且全部制品绑定成功 +- **THEN** 返回只读清单/锁摘要、平台、序号与期限,不联网安装或授予门禁权威 + +#### Scenario: Another protocol or changed bytes are replayed +- **WHEN** 提供白名单域签名,或已签 release_json、清单、锁字节被修改 +- **THEN** 签名或精确字节绑定拒绝,即使 JSON 的业务内容看似相同 + +#### Scenario: A signed manifest disagrees with the locked artifact +- **WHEN** 清单摘要/签名相符但制品身份与原工具锁不同,或所选平台无制品 +- **THEN** 拒绝来源绑定,不以签名替代严格制品核验 + + +### Requirement: Package HTTPS transport SHALL preserve frozen bytes under the shared budget + +已授权调用方使用的包下载运行时 MUST 核对冻结 URL、非零摘要与 1..128 MiB 长度,验证 TLS,不采用环境代理、自动重试或内容解压。初始 URL MUST 为无凭据、查询或片段的 HTTPS;重定向 MUST 手动检查,最多五跳,禁止降级或凭据,跨 authority 仅允许显式规范 host:port 集合。重定向查询可承载 CDN 签名,但 MUST NOT 在反馈中输出原 URL、查询或底层错误。下载 MUST 继承原绝对截止时刻和取消信号,在等待连接、响应和读取期间响应取消,不得逐跳重置预算。 + +最终响应 MUST 为 200,仅接受未编码或 identity 内容;传输编码只允许单个 chunked,不得与 Content-Length 混用。声明长度及实际解码框架后的包长度、SHA-256 MUST 与冻结输入精确一致;超长最多多读一个字节,截断、编码歧义、超时、取消或失配不得返回半成品。成功值只证明字节传输,不授予发行来源、安装、准备或门禁权威,也不写缓存。生产入口不得提供禁用 TLS 或由项目指定信任根的选项。 + +#### Scenario: A valid TLS stream returns the frozen package +- **WHEN** TLS 验证成功且响应为固定长度、chunked 或关闭分隔的精确声明字节 +- **THEN** 返回经过长度/摘要核验的有界包;不写文件、不授予来源或安装权威 + +#### Scenario: A transport coding changes byte semantics +- **WHEN** 响应声明 gzip 内容或 gzip, chunked 传输编码、坏长度、截断或错误摘要 +- **THEN** 返回固定诊断,不向后续展开或发布返回字节 + +#### Scenario: An unapproved redirect or cancellation occurs +- **WHEN** 发生跨未批准 authority、HTTP 降级、凭据、歧义 Location 或共享预算取消/到期 +- **THEN** 不继续目标请求或返回成功,不重置预算,也不回显敏感原 URL + + +### Requirement: Downloaded archives SHALL bind the complete tree before publication + +完整归档下载入口 MUST 在发请求前核对下载与展开声明使用同一包 SHA-256,并拒绝未知格式、非法入口、零摘要、无效展开上限或非法完整树摘要。下载、展开、入口及完整树核验 MUST 使用同一绝对期限/取消,不得把网络成功直接当作可发布树。返回结果 MUST 保留所有普通成员及空目录;后续发布 MUST 重新核对树摘要和文件系统,不授予发行来源/运行时/安装权限。raw 下载亦只能在精确包摘要相符后提交独立发布层。测试 CA MUST 只用于局部测试,不能成为生产默认信任。 + +#### Scenario: HTTPS carries a complete ZIP or tar.gz package +- **WHEN** 包、入口与完整树声明均相符,后续调用方明确使用私有临时缓存 +- **THEN** 普通文件、入口和空目录完整保留,独立发布后磁盘内容相符;没有发行批准或原生工具执行结论 + +#### Scenario: The package hash is consistent but the declared tree differs +- **WHEN** 下载成功而展开树与完整声明摘要不一致 +- **THEN** 返回树摘要失配,不返回可发布的局部成功 + +#### Scenario: Download and archive declarations disagree +- **WHEN** 展开声明的包摘要不同或入口/格式/预算/完整摘要无效 +- **THEN** 请求前拒绝,不发送网络请求也不写缓存 + +### Requirement: Archive bundle roots SHALL be projected explicitly without discarding other members + +归档安装 MUST 在选择子目录前验证完整归档树。bundle 根 MUST 是显式声明的规范目录;空根仅表示明确选择整树,不得根据包名或首个目录猜测。投影 MUST 按完整目录边界去除前缀,保留选中空目录,并按既有 bundle 树协议核对预期摘要。未消费成员 MUST 保留原路径与内容供安装计划单独处理,不得无声丢弃。非法根、失配、取消或预算耗尽 MUST NOT 返回成功。内容匹配 MUST NOT 自行授予来源批准、工具准备或安装完成状态;正式落盘仍须核验文件系统与制品身份。 + +发行清单 1.1 MUST 在声明 bundle 树摘要时显式提供 `bundle_archive_root`,无 bundle 时不得声明映射,raw 包不得携带映射。1.0 清单 MUST 保持可读,但不能凭旧声明猜测 bundle 根。内容关联 MUST 绑定清单原字节与同一锁原字节、精确工具/平台、包大小/摘要、入口摘要和 bundle 摘要;关联成功仅证明内容,不授予下载、安装或可信来源权威。 + +发行清单 1.2 的归档制品 MUST 声明完整 `install_tree_sha256`,覆盖入口、bundle 及其余普通成员,raw 包不得声明完整树。内容寻址安装目录 MUST 为 `.bundle`;锁入口 MUST 精确为该目录加归档入口,锁 bundle 根 MUST 精确为该目录加显式包内根,空包内根指向安装目录自身。绑定 MUST 拒绝路径不一致而非重写锁。完整布局 MUST 保留原包相对路径、空目录和所有普通成员,并分别核验完整安装树和可选 bundle 子树;不存在 bundle 时仍核验完整树。旧清单缺少完整安装树声明时不得猜测或自动升级为安装计划。 + +清单 1.2 的 raw 制品 MUST 将锁入口精确绑定为 `.bin`;即使来源引用摘要相符,非规范入口也必须拒绝,不得重写锁或发布到另一名字。raw 内容关联 MUST 核对同一原清单/锁、精确工具/平台、包长度及分块二进制摘要,采用共享期限/取消信号,不返回半成品。借用结果 MUST 保持输入不可变且不复制制品内容;诊断不得转储原始字节。旧清单可观察,但不能据此自动推导新版 raw 安装定位。内容相符和本机版本观察 MUST NOT 授予发行批准或质量门禁权威。 + +#### Scenario: A raw reference hash matches an incorrect lock path +- **WHEN** 清单来源引用摘要与锁一致,但锁入口不是对应二进制摘要的 `.bin` 文件 +- **THEN** 新版绑定返回 raw 定位失配,预览不推进到包内容核验或安装,不重写锁 + +#### Scenario: Frozen raw content is verified and published locally +- **WHEN** 明确新版定位、包长度/摘要相符,底层发布层被已授权调用方使用 +- **THEN** 发布返回的相对入口与原锁一致,原锁可重新核验;借用字节不复制,不从内容匹配或原生版本观察推导批准/门禁通过 + +#### Scenario: A wrapper depends on files outside the selected bundle +- **WHEN** 入口位于包内 `release/bin/tool`,bundle 为 `release/libexec`,另有其它普通成员 +- **THEN** 完整安装布局保留全部原相对路径,入口和 bundle 锁路径指向同一完整树内容寻址目录;实际发布后用原锁核验入口和 bundle,不修改锁或声称原生可运行 + +#### Scenario: Content outside the bundle changes +- **WHEN** bundle 子树摘要不变,但其它成员使完整安装树与声明不同 +- **THEN** 完整布局关联失败,不以 bundle 相符为依据发布剩余内容 + +#### Scenario: Similar sibling directories exist in a package +- **WHEN** 显式选择 `release/libexec`,包内另有 `release/libexec-other` 和外部启动器 +- **THEN** 仅去除 `release/libexec/` 的精确前缀,其它成员以原路径和内容返回;投影目录摘要与对应实际目录摘要一致 + +#### Scenario: An invalid member lies outside the selected root +- **WHEN** 选中的子树合法,但原树其它成员含非法路径或冲突 +- **THEN** 完整树核验失败,不得通过过滤该成员获得成功投影 + +#### Scenario: The requested root is missing or has a wrong identity +- **WHEN** 根目录不存在、指向文件、大小写不一致,或选中树与预期摘要不匹配 +- **THEN** 拒绝映射,不回退整包或另一个目录,也不发布局部制品 + +#### Scenario: A legacy manifest declares a bundle without a root +- **WHEN** 1.0 清单可以绑定锁,但没有包内目录映射 +- **THEN** 只读观察仍可读取,bundle 内容关联返回缺少映射,不猜测目录或启动安装 + +#### Scenario: Package identity disagrees with the bound declaration +- **WHEN** 包大小/摘要、入口或选择目录与同一绑定声明不一致 +- **THEN** 不返回成功 bundle,保持来源未批准和安装未完成状态 + +### Requirement: Bundle directories SHALL publish without exposing partial trees or replacing existing content + +完整目录发布 MUST 先验证输入树及预期 bundle 摘要,在已固定的受管缓存目录描述符下独占创建私有暂存,按规范成员构建文件/目录,拒绝链接及特殊类型并核验所有权、权限、硬链接、完整成员集合和字节内容。文件及目录 MUST 同步后才使用原生不覆盖的原子目录重命名;平台不支持该操作时 MUST 返回未完成,不得降级为可覆盖 rename。最终目录 MUST 重新核验才返回相对内容寻址收据。重复安装 MUST 重新核验后复用;已存在但内容、成员或权限不同的目录 MUST 保留且拒绝,不得替换。 + +取消及预算 MUST 在构建和核验期间检查;发布前失败 MUST 清理本次已创建成员,清理不得跟随链接或删除被替换的目录。进程崩溃或外部篡改导致的未清理暂存 MUST NOT 充当已安装制品。发布后同步/核验/预算失败可能留下完整目录,MUST NOT 返回安装成功,后续重试须重新核验。此收据 MUST NOT 授予来源批准、原生可运行性或其它未消费成员的安装完成状态。 + +#### Scenario: Two installers race to publish the same tree +- **WHEN** 两个进程同时发布同一内容寻址目录 +- **THEN** 只有一个新目录发布成功,另一方完整核验后复用;最终名字不暴露半成品,也不覆盖目录 + +#### Scenario: Existing content is tampered or linked +- **WHEN** 已存在目录含篡改文件、额外/缺失成员、链接、FIFO、错误权限或硬链接 +- **THEN** 拒绝复用并保留原目录,不覆盖为新制品 + +#### Scenario: Cancellation occurs after staging begins +- **WHEN** 本轮暂存目录已存在但还未原子发布时取消 +- **THEN** 不返回成功,清理本次成员;最终内容寻址名字不出现 + ### Requirement: Plugin execution SHALL bind a verified runtime artifact 插件 MUST 绑定 CLI 版本、平台、制品摘要及协议版本;不匹配或不可用时 MUST 报未完成,不得随机使用 PATH 版本或自动回退旧 Python 产生通过。doctor MUST 明示原生扫描器的 JDK/Node/Python 等外部依赖。 @@ -31,3 +183,17 @@ stable 发布 MUST 分别提供真实工具、平台、Git/CI、宿主安装与 #### Scenario: Only a legacy fail-open rollback is available - **WHEN** 新运行时故障且没有符合新契约的旧 Rust 版本 - **THEN** 交付保持未认证,不能以旧放行行为恢复绿色门禁 + +### Requirement: Quality claims SHALL use independently labelled stratified evidence + +评测 MUST 使用有来源/摘要/工具锁的分层语料和独立holdout,由人工或已确认oracle裁定;争议单列,不用模型投票充当真值。MUST 报告每语言/类别的样本量、TP/FP/FN、precision/recall、区间、工具故障误判率、完整率、假通过数及同覆盖性能。零发现的precision MUST 不可估计,不能记100%;排除扩大或义务删除不能当作误报改善。 + +设计中的发布验收目标 MUST 固化到批准评测配置:确定性必备场景零假通过/零工具故障误判,预置真问题全检出,关键安全/CVE回归零漏报,有足够裁定样本的adapter/category其precision的95% Wilson下界至少0.98。证据不足不得借全局平均升级为充分验证;调整目标需独立批准。性能绝对门槛在实测基线后冻结,不凭Rust技术选择宣称已达成。 + +#### Scenario: Evaluation returns no findings or too few labels +- **WHEN** 某类别没有finding或统计证据不足 +- **THEN** 展示不可估计/证据不足,不报告100%准确率或借其它类别平均值宣布充分验证 + +#### Scenario: Excluding files improves an apparent precision score +- **WHEN** 优化后排除范围扩大或必需义务减少 +- **THEN** 覆盖差异可见且不能据此通过等价优化验收,原批准门槛保持 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md index a24571d..fb83730 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md @@ -16,6 +16,14 @@ ## ADDED Requirements +### Requirement: Static input inspection SHALL reject special files without waiting for peers + +配置、工具锁、发行清单及其它静态协议输入 MUST 在同一已打开文件句柄上确认普通文件类型与大小边界,不得以可读路径或文件名证明输入有效。Unix 打开 MUST 拒绝目标符号链接并采用非阻塞模式,FIFO 无写入端时不得在类型判断之前无限等待;类型或大小无效返回未完成诊断,不执行输入、不修改源码或签发准备成功。此机制 MUST NOT 被描述为任意文件系统调用的硬超时保证,其它平台必须独立验收同等约束。 + +#### Scenario: A manifest or lock path points to a FIFO without a writer +- **WHEN** 静态工具库存/安装预览读取的输入是无写入端 FIFO +- **THEN** 不等待写入端,拒绝特殊文件并反馈 unreadable/未完成;不写入工作区、不将其计为源码违规或工具就绪 + ### Requirement: Rust execution SHALL bound and close process lifecycles 执行 MUST 使用字面 argv、明确 cwd/env/stdin、总预算及有界输出,记录真实终止原因。超时/取消/超限 MUST 停止并回收受控进程树,保留部分证据;同一构建目录的冲突任务 MUST 互斥。工具规则解释 MUST 不属于通用进程执行层。 @@ -24,6 +32,10 @@ - **WHEN** 工具创建子孙进程后发生取消 - **THEN** 在声明的平台保证内终止并回收整棵受控进程树,不能仅丢弃句柄 +#### Scenario: Clean child exits before reader threads are scheduled +- **WHEN** 原生工具成功退出且 stdout/stderr 已关闭,但并行负载推迟了读线程调度 +- **THEN** 在请求剩余总期限内继续排空并取得真实 EOF;不得因固定短排空窗口把完整结果误判为读取失败,超过总期限仍返回未完成 + ### Requirement: Rust snapshots SHALL bind the actual delivery input 真实 pre-commit MUST 尊重 GIT_INDEX_FILE;pre-push MUST 读取每条 ref/OID 元组,不能假定 HEAD;CI MUST 绑定明确不可变内容。字节完整性、类型、哈希、路径和执行前后身份 MUST 校验。快照失败或源内容被检查器修改 MUST 未完成,不改真实 index;宿主预测 MUST 不冒充完整 Shell 语义。 @@ -36,6 +48,60 @@ - **WHEN** Git hook 环境含 GIT_INDEX_FILE - **THEN** 检查该 index,保留真实工作树及 index 内容 +### Requirement: Managed artifact publication SHALL preserve identity and ownership + +受管工具安装的缓存发布 MUST 与质量结果缓存分开。安装字节须有上限并核对预期 SHA-256,缓存根须归当前用户且不可被其它用户写入;使用固定目录描述符和不覆盖的原子发布,拒绝缓存根/目标链接、损坏或权限不符的已有制品。取消、到期或校验失败不得发布未完成文件;正常退出清理暂存,重复相同字节只能在再次核验后复用。缓存写入收据只说明字节发布,不证明锁/发行来源批准、平台兼容、可启动或质量通过;CLI 安装仍须独立核验批准来源。 + +#### Scenario: Another file already occupies the content-addressed tool destination +- **WHEN** 安装发布目标已存在但内容、文件类型、所有权或权限不匹配 +- **THEN** 保留原目标,安装未完成并给出冲突;不得覆盖或跟随链接,也不能用文件名中的摘要自证完整 + +### Requirement: Distribution package streams SHALL be bounded and verified before extraction + +发行包读取 MUST 绑定预期非零 SHA-256、精确传输大小和共享截止时间,传输长度上限为 128 MiB;超出声明长度最多探测一个字节即拒绝。读取中断重试 MUST 继承剩余预算,取消、期限、短流、长流、摘要失配、分配或传输失败 MUST NOT 返回可展开/发布的成功字节。传输诊断 MUST 脱敏。读取器每次读取前后 MUST 核对截止时间和取消;实际网络层 MUST 独立实施单次连接/读取超时,不能以流层预算检查声称可中断任意阻塞读取。验证只证明包字节与输入声明匹配,MUST NOT 自授发行来源批准、平台就绪或门禁通过。 + +#### Scenario: Stream exceeds or differs from the declared package +- **WHEN** 包字节短缺、超长、摘要失配或读取失败 +- **THEN** 返回固定未完成诊断,不向展开/发布阶段交付成功字节;无穷流不能按声明长度之外继续累积内存 + +#### Scenario: Cancellation or deadline changes during a package read +- **WHEN** 单次 read 返回时已经取消或超过共享截止时间 +- **THEN** 拒绝本次字节,不重置预算、不返回校验成功;网络读取超时义务仍由传输层完成 + +### Requirement: Archive expansion SHALL validate all members before publication + +ZIP/tar.gz 展开 MUST 先核对包摘要,绑定明确入口及其二进制摘要,并核验包内所有成员,不得只检查入口而忽略其它路径。路径穿越、绝对/平台歧义路径、重复及大小写碰撞、文件/目录与祖先冲突、链接/设备/特殊类型 MUST 拒绝。普通文件展开总量不得超过请求预算及 512 MiB,全包成员最多 10000;压缩容器及头信息亦须有独立有界预算。损坏压缩数据、CRC、隐藏尾随数据、缺入口、错摘要、取消或到期 MUST NOT 返回局部成功。展开结果只是冻结文件集合,MUST NOT 自授发行批准、bundle 校验、安装或准备通过;落盘仍须受管发布层重新核验路径归属和权限。未实现的扩展、压缩算法或归档类型 MUST 明确未完成,不静默跳过。 + +#### Scenario: Valid entrypoint coexists with a dangerous archive member +- **WHEN** 入口及其摘要正确,但其它成员路径穿越、重复、为链接/设备或发生文件目录冲突 +- **THEN** 拒绝整个展开结果,不向发布层交付部分成功文件,不生成源码违规 + +GNU 长路径与局部 PAX MUST 作为下一条普通文件/目录的有界扩展处理,消费后清空;GNU 数据最多 1025 字节并有明确 NUL 终止,单条 PAX 数据最多 64 KiB,记录长度必须精确且全部消费。重复键、重复局部扩展、矛盾路径、孤立扩展和 malformed 记录 MUST 拒绝。生效路径仍须遵守所有原路径约束;完整扩展路径可覆盖被截断的旧头字节,不得将旧头 UTF-8 断裂误判为有效路径非法。局部 PAX size MUST 控制真实文件数据边界并参与总量/溢出检查,不得一律要求与旧头相等或按旧头推进。权限、所有者、时间及 xattr 描述字段 MUST NOT 从归档恢复;未实现的全局路径/大小、linkpath、sparse 或字符集变换须明确未完成。 + +#### Scenario: Local extension changes the effective path or size +- **WHEN** 合法 GNU/PAX 给下一文件提供完整路径或 PAX size 与旧头不同 +- **THEN** 使用经验证的生效路径及大小,按生效大小核对内容和后续块边界;下一文件不沿用局部扩展,原摘要、路径、类型及资源检查不降低 + +#### Scenario: Extension is malformed, ambiguous or orphaned +- **WHEN** 路径穿越、重复键、矛盾扩展、大小溢出/超限、长度错误或扩展无后续成员 +- **THEN** 返回固定未完成诊断,无局部成功或文件写入;不从后续文件或旧头猜测缺失的扩展语义 + +#### Scenario: Archive fails integrity, resource or format validation +- **WHEN** ZIP/gzip 数据损坏、展开超限、入口缺失/摘要错误、附加隐藏数据或未支持的扩展存在 +- **THEN** 返回固定脱敏未完成原因,不写工作区;取消和期限沿用包读取/发布的同一剩余预算 + +### Requirement: Complete archive trees SHALL bind all bundle contents + +完整归档树 MUST 保留显式空目录及所有隐式父目录,文件集合与完整树入口 MUST 明确区分;旧文件集合消费者不得被静默改成新返回类型。完整树使用现有本机 `codeguard-bundle-tree-v1` 的目录/文件记录、路径长度、内容大小/摘要及本机排序/目录遍历顺序核验,不得以入口匹配或文件总数代替 bundle 内容身份。公开结构被外部构造或改写后 MUST 重新校验路径、父目录、类型/大小写冲突、总量和预期非零精确摘要;最多 100000 树条目、512 MiB 总文件字节和 128 MiB 单文件。摘要计算 MUST 继承共享截止时间/取消并检查内容块。匹配只证明声明树内容,不得授予发行来源、目录发布、完整依赖闭包、准备或质量通过。 + +#### Scenario: An empty directory or delegated library differs from the locked bundle +- **WHEN** 入口字节相同,但归档中空目录被删除或委托库被修改 +- **THEN** 完整树摘要不匹配,包不能按该 bundle 身份进入正式发布;保留具体未完成原因,不生成源码违规 + +#### Scenario: A caller provides a forged or incomplete in-memory tree +- **WHEN** 树含穿越/重复/大小写冲突、缺父目录、超限或无效预期摘要 +- **THEN** 拒绝树核验,不按路径文本推断条目已验证;取消和到期无成功摘要或批准 + ### Requirement: Rust cache reuse SHALL prove obligation equivalence 缓存 MUST 绑定内容、依赖闭包、工具/运行时、adapter、规则、配置、平台、来源和 CVE 库身份/时效。只有完整有效结果可复用;硬门禁不得直接消费软反馈缓存,必须核验严格身份和可信来源并重算 gate。缺少依赖隔离证明 MUST 扩大扫描或未完成。 @@ -67,3 +133,27 @@ fix MUST 区分 dry-run 与 apply,检查目标身份及范围;应用前置 #### Scenario: Project script tries to rewrite policy or receipts - **WHEN** 被测项目脚本尝试改写可信策略、工具或最终状态 - **THEN** 受保护执行边界拒绝写入,脚本生成的收据不能直接作为 gate 认证 + +### Requirement: Execution observability SHALL correlate evidence without changing verdicts + +执行链 MUST 关联request/run/obligation/task/attempt ID,记录快照、启动、执行、解析、缓存及总耗时、终止原因、缓存理由和完整性。原始argv/env/诊断 MUST 仅进入受控私有证据,公开轨迹脱敏。默认遥测 MUST 留在本地,不自动上传源码、凭据或诊断。度量采集不可把incomplete改成PASS,日志/证据写入故障须独立呈现。 + +#### Scenario: A failed execution has partial useful evidence +- **WHEN** 原生工具在产出finding后超时 +- **THEN** 从run和obligation可追溯已保留证据与真实终止原因,公开轨迹不泄漏原始敏感参数 + +#### Scenario: Metrics storage is unavailable +- **WHEN** 指标存储失败但原检查已形成结论 +- **THEN** 保留原质量结论并明确观测故障;必要证据无法保存时报告操作未完成,不伪造检查成功 + +### Requirement: Evidence storage SHALL preserve ownership and active references + +日志、报告、快照与缓存 MUST 使用精确受管路径、适合平台的私有权限与原子写入,拒绝symlink路径逃逸。证据索引 MUST 记录摘要、保留策略和有效引用;清理 MUST 不删除用户源码、tracked问题历史、活动run/lease或仍被保留收据引用的必要证据。损坏/丢失证据不得支持当前认证,允许重新复检恢复;磁盘或权限失败不得触发无限重试或扩大删除范围。 + +#### Scenario: Cleanup encounters an active run and a user file +- **WHEN** 到期本地缓存与活动run、同名用户源码同时存在 +- **THEN** 只清理有所有权和到期依据的非活动产物,其余保持,不能按整个codeguard目录删除 + +#### Scenario: A private log path redirects through a symlink +- **WHEN** 日志或报告目标指向受管范围以外 +- **THEN** 拒绝越界写入并保留真实失败状态,不覆盖目标或把缺日志当检查通过 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md index c17f8e0..2b4c214 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md @@ -36,6 +36,8 @@ legacy-v1 的 PreToolUse 放行工具故障 MUST 继续通过 additionalContext 明示未验证。Rust 交付入口 MUST 根据报告的 gate decision 映射宿主动作,必需 incomplete 与 deny 均阻断;普通 UserPromptSubmit/PostToolUse 反馈 MUST 保持可见未完成,不得宣称 all passed 或承担未实现的阻断。新 CLI exit 2 是用法错误,MUST NOT 直接当作所有宿主的阻断语义透传。 +普通反馈 Hook 和 MCP 检查结果 MUST 把项目配置探测、本次原生诊断及下一步以宿主支持的对话消息或 `additionalContext` 返回智能体。未配置检查器给出配置建议;已配置但工具执行失败给出环境恢复建议;有效 finding 给出位置、规则与复检命令。宿主只转换展示格式,不重新判定诊断或执行原始工具输出中的指令。 + #### Scenario: A tool cannot run at the Git gate - **WHEN** 旧入口缺工具 - **THEN** 按旧协议 exit 0 且明确未验证 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md index 59ff705..920935d 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md @@ -69,3 +69,35 @@ Rust build MUST 记录编译、静态检查和测试执行的区别。Java 默 #### Scenario: Default static build completes - **WHEN** 默认静态构建成功但未运行测试 - **THEN** 报告 test_execution=false,不声称测试通过 + +#### Scenario: Native Cargo check reports an attributed compiler error +- **WHEN** Rust 静态构建调用原生 Cargo check,机器流包含完整 package/manifest/target 身份、可归属的编译诊断及失败结束记录 +- **THEN** 保留原生编译诊断与目标身份,明确 build_level=type_check、test_execution=false;不将它改称 Clippy、文档或安全违规,不从局部目标结果推导完整项目或交付结论 + +#### Scenario: Native Cargo build report lacks a valid completion contract +- **WHEN** Cargo 静态构建机器流损坏、重复语义键、无结束记录、结束后仍有事件、成功结束却含 error,或进程失败而无可归属编译诊断 +- **THEN** 构建结果保持未完成;有效已观察诊断可保留为调查证据,但不能把裸退出码、空输出或环境故障认作源码违规或通过 + +#### Scenario: Public Cargo type-check probe encounters changed inputs or cancellation +- **WHEN** build rust的显式原生类型检查执行时源码、根清单、锁或工具身份变化,或用户取消同轮执行 +- **THEN** 报告绑定本轮原生状态和输入摘要,保留调查证据且移除源码修复许可;取消优先返回130;完整且目标归属唯一的局部诊断才提供限定目标修复指引,仍明确test_execution=false、coverage_proven=false和交付not_evaluated,不将局部成功当作完整策略或任务关闭 + +#### Scenario: Cargo build observations synchronize without closing old tasks +- **WHEN** 已初始化工作区重复扫描同一编译错误,或未消费报告的源码/原生目标/清单/锁字节已经变化 +- **THEN** 当前有效观察只更新同一稳定问题和修复任务,next指向原生构建检查;陈旧证据保留为历史并生成重扫准备任务,坏身份拒绝导入;环境失败生成准备任务,不生成源码违规,同步或任务勾选不得关闭问题 + +#### Scenario: Cargo build task rechecks through the original checker +- **WHEN** 智能体对稳定的 Rust 编译任务执行 task verify,并显式提供同一原生 Cargo 工具 +- **THEN** 在任务租约和统一截止时间内重新执行 Cargo check,绑定源码、清单、锁与工具身份,保存关联任务和尝试的复检事件;原错误仍在时返回 still_present,工具或输入异常返回 incomplete + +#### Scenario: Cargo build task has no diagnostic in a local recheck +- **WHEN** 原生 Cargo check 本轮无错误,而完整项目策略、目标组合或规则覆盖尚未核验 +- **THEN** 仅返回 candidate_absent_unverified_policy 或环境恢复候选,保留原任务 open,next 指引核查原生配置和完整交付;不得凭零诊断、白名单候选或任务勾选自动关闭 + +#### Scenario: Unified check schedules native Rust type checking +- **WHEN** `check all` 发现 Rust 源码,调用方提供绝对 Cargo 工具,并有可读取的根 Cargo 清单与锁 +- **THEN** 在同一任务图、共享截止时间和 Cargo 构建资源约束下调用原生 Cargo check;反馈独立保留编译 finding、构建等级和是否执行测试,已初始化工作区同步稳定任务并在对话中给出下一步;局部构建成功仍不授予完整覆盖或交付通过 + +#### Scenario: Unified Rust build check cannot complete +- **WHEN** Cargo 缺失、原生机器流损坏、目标归属不明、输入或工具变化、执行超时或取消 +- **THEN** `check all` 保留本轮原生诊断和具体未完成原因,生成可恢复的环境/完整性任务;不得将故障算源码编译违规、白名单命中或空结果通过 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md index 454daba..e93f55c 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md @@ -1,12 +1,29 @@ ## Purpose -定义传统原生工具在 Codeguard 内的适用性、执行、结果解释与覆盖证明,使语言注册、工具安装、诊断能力和实际检查完成不再被混为同一种支持状态。 +定义传统原生工具在 Codeguard 内的配置发现、受控调用和结果解释,使语言注册、项目配置、工具安装与本次检查结果不再被混为同一种支持状态。 ## ADDED Requirements +### Requirement: Explicit Maven Javadoc selection SHALL not fall back to isolated single-file diagnostics + +项目检查明确提供 Maven 执行上下文时,Javadoc MUST 选择原 POM/完整显式主源码的多文件检查,不再额外启动隔离单文件 JDK 探针。构建根不适用、配置/类路径未知、环境缺失或原生失败 MUST 保留具体未完成诊断,不得用单文件探针代替项目配置。未选择 Maven 的显式 JDK 局部模式保持可用,但 MUST 标注其单文件范围且不推导项目覆盖。报告 MUST 版本化显示探针模式及独立多文件结果;跨文件类型引用不得因为已舍弃的单文件上下文额外生成源码 finding 或环境任务。 + +#### Scenario: Two configured source files refer to each other +- **WHEN** 用户明确提供 Maven/JDK/离线检查上下文且静态原 POM 可重放 +- **THEN** 仅运行 Maven 多文件检查,所有单文件 observation 为空并指向构建根结果;原生日志和源码位置可展示,覆盖/批准仍单独核验 + +#### Scenario: Maven cannot establish a valid project scope +- **WHEN** 已选择 Maven 但 POM 动态/继承或检查前置缺失 +- **THEN** 返回多文件具体未完成原因,不回退单文件 JDK 以制造无关诊断或伪装完成 + + ### Requirement: Adapters SHALL publish verifiable capability contracts -每个 adapter MUST 声明语言/方言、类别、工具和运行时兼容范围、配置前提、输入范围、报告格式及退出语义。语言每个类别 MUST 明确 implemented、gap 或有证据的 not_applicable。formatter 存在 MUST NOT 自动证明 lint/comments 能力。 +每个 adapter MUST 声明语言/方言、类别、可识别的原生配置、工具和运行时兼容范围、输入范围、报告格式及退出语义。发行能力与项目配置分开呈现;项目检查器状态 MUST 区分 `configured`、`missing`、`invalid`、`unknown`。formatter 存在 MUST NOT 自动证明 lint/comments 能力。 + +#### Scenario: A project has no Javadoc checker configuration +- **WHEN** Java 项目没有启用 Javadoc 检查规则或可识别的检查命令 +- **THEN** 返回 `missing` 与可操作的配置建议,不报告源码缺少 Javadoc,也不声称已检查通过 #### Scenario: A stable legacy entry has only a formatter - **WHEN** 迁移 Julia 或 Pascal,原 lint 命令为空 @@ -20,6 +37,70 @@ adapter MUST 根据工具版本的报告及退出语义解析结果;MUST NOT 以通用非零、exit 1、关键词或模型主观判断替代。无效、截断、陈旧、与计划不符或内部矛盾的报告 MUST 产生未完成。有效部分发现 MUST 保留。 +Rust 注释诊断 MUST 使用原生 Cargo/rustdoc 机器流,不能复用只接收 Clippy 规则的解析器或通过正则重写文档规则。已识别 missing_docs 与 rustdoc::broken_intra_doc_links 的观察 MUST 保留原生规则/级别、唯一主定位和原生 package/manifest/target 身份供执行层核对;不得把其它编译错误改称注释问题。重复 JSON 键、缺失/重复/失败的结束记录、结束后新事件、歧义主定位及未支持的警告 MUST 保持未完成。纯解析或显式局部库目标执行不证明项目原配置、完整工作区/features/targets、可信工具或批准规则覆盖。 + +公开 comments rust 的局部探针 MUST 显式选择Cargo入口、采用共享预算与受控运行时,使用锁定离线输入和私有输出目录,不隐式下载/安装工具。MUST 将当前清单/锁/已观察源码、工具字节及原生主目标核对,输入变化、目标越界或机器流异常返回未完成。显式探针规则 MUST 标明不代表项目获批准的生效文档规则;局部零诊断不得关闭任务或批准白名单,完整配置闭包与构建组合仍须独立验证。 + +Rustdoc发现候选身份 MUST 绑定原生主定位字节范围所对应的真实UTF8源码及精确规则/相对目标,而不是诊断列表序号;范围缺失、倒置、越界或切断UTF8时不得猜测行内容补造。相同原生记录可去重,但同一候选身份对应多个不同源码范围/诊断时 MUST 明示歧义,保留观察且不分配正式finding ID或关闭任务。文档修复/行移动不得让剩余发现借用另一问题的顺序身份;完整符号归属尚未建立时仍是候选。 + +Rustdoc逐问题反馈 MUST 提供问题证据、规则依据、允许修改的范围、修复步骤、原工具复检命令、尝试历史状态和关闭条件。局部完成且身份唯一时可提供限定目标源码的修复指引;输入变化、歧义、取消或其它未完成状态 MUST 保留调查指引且不给源码修改范围。尚未接入持久任务时 MUST 明示历史未接通,不得把空历史伪装为无失败尝试。简报不能授权任务关闭、白名单批准或完整交付。 + +#### Scenario: Rustdoc evidence becomes stale before repair guidance +- **WHEN** 原工具发现文档问题,但同轮输入变化或发现身份歧义 +- **THEN** 反馈保留原生证据,指向重新检查或身份调查,允许修改的源码范围为空,不指示按旧定位修复 + +#### Scenario: Rustdoc observations synchronize to an initialized workbench +- **WHEN** 初始化工作区的本轮文档观察具有绑定身份和唯一原生发现,且同步时源码、清单与锁仍匹配 +- **THEN** 保存本地报告并自动同步为同一稳定问题及可读任务;重复扫描更新观察而不重复建任务,未完成/歧义产生检查准备任务,陈旧发现不得驱动源码修复 + +#### Scenario: Full Rust check schedules independent lint and documentation observations +- **WHEN** check all发现Rust源码并取得显式Cargo上下文 +- **THEN** 共享预算分别调度Clippy与rustdoc,保留各自结果、未完成原因和持久任务;库文档探针不代表项目原配置或完整构建组合,不能授予完整交付通过 + +#### Scenario: Rustdoc task recheck encounters native suppression +- **WHEN** 文档任务使用同一 Cargo 在稳定输入上复检,普通扫描未发现原问题而原生 force-warn 对照发现同文件同规则 +- **THEN** 记录 suppression_requires_review 和原工具证据,保持任务open;两轮局部零发现仍须策略/范围核验,不自行关闭或批准白名单 + +#### Scenario: Rustdoc forced evidence has a forged identity +- **WHEN** 文档任务复检封套中的强制告警报告指纹、原生范围或输入身份损坏,普通报告仍合法 +- **THEN** 导入必须独立核验两份原生观察,不得仅凭封套形状或普通报告有效就消费损坏对照;保持未完成并指出证据修复动作 + +#### Scenario: Rustdoc declarations have identical source text +- **WHEN** 同文件两个不同原生范围产生相同规则及声明字节,缺足够符号归属区分 +- **THEN** 保留两项歧义观察,finding ID为空且运行未完成,不按出现顺序发放稳定任务身份或把修复一项解释为另一项关闭 + +#### Scenario: Public Rust comments probe observes a selected library +- **WHEN** comments rust 收到显式Cargo工具,在原生库目标上观察文档诊断或零诊断 +- **THEN** 对话显示规则/位置与局部范围,整体仍未完成/not_evaluated;清单/锁/源码/工具变化或诊断目标归属失配不能作为当前完整观察,未集成的持久任务须明确说明 + +#### Scenario: Rust comments cancellation coincides with input changes +- **WHEN** 原生文档进程被用户取消,运行后复核同时发现源码变化 +- **THEN** 保留取消状态和退出130,局部观察保持未完成;不能用输入变化将取消降级为普通退出3或解释为修复 + +#### Scenario: Native rustdoc reports documentation diagnostics +- **WHEN** 原生 rustdoc 机器流产生 missing_docs 或 broken_intra_doc_links 并有唯一主定位及目标身份 +- **THEN** 适配器保留具体规则、位置及目标归属;不能因 Clippy 不接收这些规则而丢失注释观察,也不能据局部观察签发完整项目通过 + +#### Scenario: Rustdoc encounters compilation failure or ambiguous report +- **WHEN** 同轮有编译错误、未知警告、重复键、主定位歧义或异常结束记录 +- **THEN** 结果标未完成,保留已观察诊断用于调查,不把环境/报告失败当注释违规或零问题通过 + +#### Scenario: Tool verification observes a local lock candidate +- **WHEN** `tools verify` 读取本地工具锁候选并核对当前平台的入口、可选运行时及目录包字节 +- **THEN** 逐项反馈匹配、缺失、不可读、摘要失配或不可执行及恢复动作;不启动 wrapper、安装或联网,不把结构合法/字节匹配解释为可信批准、可启动或规则已执行。本地来源未获核验时整体未完成、readiness=unknown、无门禁效力;坏锁或链接锁不生成源码 finding + +#### Scenario: Doctor diagnoses an explicitly selected Ruff binary +- **WHEN** doctor 观察项目配置并收到显式绝对路径的 Ruff 原生入口 +- **THEN** 在私有目录以固定版本参数、清空继承环境、共同预算及单探测上限执行版本诊断;不运行源码扫描或项目 wrapper。未选择工具不冒充工具缺失,脚本入口在无法隔离时启动前未完成;原生成功仅形成未核验来源的局部版本观察,不能给 readiness 或质量门禁签发通过,必须反馈其它诊断缺口及下一步 + +#### Scenario: Version discovery fails before checking source +- **WHEN** 原生版本探测超时、预算在启动前耗尽、无法启动、被取消、被信号终止或输出/管道/清理失败 +- **THEN** 保留执行层的具体失败类别,返回环境阻塞和对应恢复动作;不启动后续质量检查,不将失败误报为源码违规 + +#### Scenario: A version process exits zero with incompatible output or changed artifact +- **WHEN** 原生版本探测退出零,但 stdout 不符合适配器精确版本契约、出现未预期 stderr、工具字节改变,或本轮私有记录失败 +- **THEN** 分别反馈版本不符、输出异常、制品变化或记录失败;不运行后续源码检查,不将零退出推导为可用、质量通过或批准身份。超时/取消/无法启动/信号/输出超限保留各自执行类别,共享截止时间不得因记录或工具复核重置 + #### Scenario: Valid finding precedes a crash - **WHEN** 工具先产生有效违规,随后发生配置或进程故障 - **THEN** 保存该 finding 并记录 incomplete,不覆盖为纯工具错误或完整违规结果 @@ -28,18 +109,126 @@ adapter MUST 根据工具版本的报告及退出语义解析结果;MUST NOT - **WHEN** 报告属于此前内容或当前规则未执行 - **THEN** 拒绝将其作为本次通过证据 +#### Scenario: A Clippy finding disappears behind a native lint allowance +- **WHEN** Rust 任务普通 Clippy 复检不再报告原规则,但同工具、同目标字节、同 manifest 和同截止时间内的 `--force-warn <原规则>` 原生对照重新检出该稳定 finding +- **THEN** 记录原生抑制待核查并保留任务;对照失败、输入或工具身份改变时保持 incomplete,不能把零诊断当作修复或白名单批准 + +#### Scenario: A Go target disappears because native build selection excludes it +- **WHEN** 原 Go finding 在默认构建条件的 vet 复检中未检出,但同工具、同受控环境与同截止时间内的 go list JSON 显示目标被构建标签、平台或 CGO 排除,或未列入本轮原生源文件集合 +- **THEN** 保留任务并要求核查构建范围;不得把未检查目标解释为已修复。原生清单损坏、归属未知或两轮源码/模块/工具变化时为 incomplete;局部 selected 观察不得证明所有平台与规则覆盖或白名单批准 + +#### Scenario: Go source inputs change after a verification observation +- **WHEN** Go 复检绑定的整组源码或模块清单与读取下一步/同步时的当前内容不一致 +- **THEN** 旧观察不能指引关闭;next 要求原工具复扫,同步将旧发现计入历史而非当前活动源码任务 + +### Requirement: Static detection families SHALL remain explicit and extensible + +Codeguard MUST 分别记录 `lint`、`comments`、`dependencies`、`cve`、`security`、`build` 六类别。`comments.api_docs` 对应 Javadoc 等 API 文档检查;`dependencies` 对应依赖图、版本治理、许可证、SBOM 和来源;`cve` 对应漏洞匹配。28 个检测族是可扩展的**候选目录**,不是每个项目都必须配置或逐项证明执行的清单。Codeguard MUST 识别项目中实际配置的检查器、规则和命令;已配置且可用的检查器由 Rust 调用原生能力,并把本次结果反馈给智能体。未配置、配置错误和工具不可用 MUST 分开说明。只有批准策略明确要求的缺失检查才影响交付门禁,不能把所有候选检测族自动升级为必需义务。 + +#### Scenario: Configured Javadoc checker reports a missing comment +- **WHEN** Java 项目已配置 Javadoc 检查,原生工具返回有效缺失注释诊断 +- **THEN** 智能体对话显示文件、位置、规则、修复建议和复检命令;不要求额外的逐族执行证明 + +#### Scenario: Javadoc output cannot be attributed to the configured project checker +- **WHEN** 局部 JDK doclint 探针发现缺失注释,但尚未绑定项目生效配置、完整源集、可信工具身份或所需类路径 +- **THEN** 可以显示带来源的局部诊断和复检建议;不得把它写成已批准项目 finding、完整检查通过或可关闭任务的证据。未知原生输出、缺少类路径和工具执行故障标为未完成,不转换为代码违规 + +#### Scenario: Javadoc plugin declaration disables missing-comment checks +- **WHEN** Maven POM 声明 Javadoc 插件,但显式 `doclint=none`、`all,-missing` 或其它不含 `missing` 的静态规则组合 +- **THEN** 注释检查配置显示为无效并给出启用 `missing` 的建议;动态 doclint 或动态错误处理策略显示未知,显式 `failOnError=false` 显示无效,不能仅凭插件存在宣称注释规则已启用 + +#### Scenario: Maven Javadoc reports warnings with a successful build +- **WHEN** 已配置的 Maven Javadoc 插件产生有效缺注释警告,但 `failOnWarnings=false` 使原生命令返回 `BUILD SUCCESS` +- **THEN** 仍须解析并反馈原生缺注释诊断;退出码和 `BUILD SUCCESS` 不得覆盖警告。复检必须验证本轮独立执行与目标产物,不能用上轮缓存导致的零诊断关闭任务 + +#### Scenario: A successful Javadoc log has no diagnostic block +- **WHEN** 已完整注释的项目首次执行与同目录重跑均输出无诊断的 `BUILD SUCCESS`,且日志未提供可核验的本轮产物身份 +- **THEN** 解析器只能记录无诊断日志观察,不能据此证明本轮重新检查、关闭任务或签发项目通过;须由受控执行器另行核验新鲜快照和产物归属 + +#### Scenario: A synthetic Maven Javadoc POM differs from project configuration +- **WHEN** 隔离探针准备用固定 POM 替代项目 POM 来扫描多份源码 +- **THEN** 不得把探针诊断归为该项目已配置检查器的 finding;`check java` 不用合成 POM 遮盖真实项目配置,配置无法受控重放时保持未完成 + +#### Scenario: A simple project POM is replayed for Maven Javadoc +- **WHEN** 当前项目 POM 直接固定 Javadoc 3.12.0 与 `doclint=missing`,且静态验证没有父 POM、profile、依赖、模块、扩展或其它插件 +- **THEN** Rust 在私有快照中复制原 POM 和显式 Java 源码,运行原生 Maven,报告原 POM 字节摘要及局部诊断;若 POM 变化或输出无法归属,结果未完成;即使日志干净,也不能据此声明完整源集或交付通过 + +#### Scenario: A complex project POM cannot be safely replayed +- **WHEN** Javadoc 声明依赖继承、动态属性、其它插件或未知构建内容 +- **THEN** 不以固定 POM 替代项目配置生成可归因诊断;标记项目 POM 重放不适用,保留检查义务并给出解析生效模型或受控执行的下一步 + +#### Scenario: No SAST or IaC checker is configured +- **WHEN** 项目只配置秘密扫描,而没有 SAST 或 IaC 检查器配置 +- **THEN** 如实列出已配置的秘密扫描和未配置的候选检查;不虚构 SAST/IaC 已执行,也不凭候选目录自动判代码违规 + +#### Scenario: Java dependency and CVE checker declarations differ by module +- **WHEN** 多模块 Java 项目的根构建文件声明 OWASP Dependency-Check,而内层构建根没有声明,且两处都有 Java 源码 +- **THEN** `check java` 对已识别 CVE checker 报告构建根配置混合与逐模块核查动作,不将根声明推广为全项目已配置;已声明但未执行原工具时保持未完成,不产生“无漏洞”结论 + +#### Scenario: A Gradle source tree has no Maven checker identity +- **WHEN** Java 源码归属 Gradle 构建根,或 Maven 与 Gradle 构建根混合,且尚未解析 Gradle 生效模型 +- **THEN** 类别反馈说明 Gradle 或混合构建模型未解析,不把 Maven checker ID 贴到这些源码,也不推断依赖治理、CVE 或安全检查已完成 + +#### Scenario: Python dependency inputs are not mistaken for a CVE result +- **WHEN** Python 构建根只有逐行固定版本的 requirements、含动态约束的 requirements、uv/Poetry 锁文件,或没有可识别依赖输入 +- **THEN** `detect` 按构建根分别记录输入位置及相应未解析原因;`plan cve python` 与 `check all` 保留原生检查器、依赖图和漏洞数据库待核验状态。固定版本行不等于完整传递依赖图,锁文件存在不等于已解析或已完成漏洞匹配;任何一种情况都不得生成零漏洞结论或已完成门禁 + +#### Scenario: Python dependency input changes during discovery +- **WHEN** Python 依赖文件在首次清单观察后不可读或字节摘要变化 +- **THEN** 本轮发现标记不完整,指出变化的输入和重新发现动作;不能将旧输入或相邻构建根的锁文件用作当前根的 CVE 证据 + +#### Scenario: A tool-specific Python lock is not a pip-audit standard lock +- **WHEN** 项目有符合 PyPA 命名的 `pylock.toml` 或 `pylock..toml`,或只有 `uv.lock`/`poetry.lock`,或同根同时存在两类锁 +- **THEN** 分别记录标准锁未解析、工具专用锁未解析或锁选择歧义;不得把 `uv.lock`/`poetry.lock` 直接交给当前只支持项目 pylock 的 pip-audit `--locked` 入口。标准锁存在也不证明环境选择、完整依赖图、原生审计或数据库时效;多锁不得擅自任选一份 + +#### Scenario: pip-audit reports a skipped dependency or inconsistent result +- **WHEN** 受控 pip-audit 项目锁审计的 JSON 报告含跳过的包、重复字段、非预期修复结果,或漏洞数量与原生退出状态矛盾 +- **THEN** 保留本次观察为未完成并给出明确原因;只有结构完整的原生组件、解析版本和 advisory 可成为后续归属候选。即使原生报告为空且退出零,也须另行核验项目锁的环境/依赖组、完整包图、工具及漏洞数据库身份和时效,不能仅凭 JSON 解析签发无漏洞结论 + +#### Scenario: Python native CVE probe uses a private snapshot +- **WHEN** 用户显式选择 pip-audit 可执行文件和版本,为有且仅有一份标准 pylock 的 Python 项目运行局部 `cve python` +- **THEN** Rust 先观察项目清单、锁和工具字节,在私有目录复放输入并由受控进程调用原生工具;前后任一原文件、私有副本或工具变化都使结果未完成。结构有效且整组组件名/解析版本与同轮标准锁逐项匹配的 advisory 才可反馈为局部候选;不匹配者不得成为项目 finding。零项与异常均保留 `not_evaluated` 和未核验覆盖;该局部探针不代替完整项目环境选择、漏洞库时效、稳定任务或交付门禁验收 + +#### Scenario: Conditional pylock packages are not flattened into one project environment +- **WHEN** 标准 pylock 含 `environments`、`requires-python`、非空 `extras`/`dependency-groups`/`default-groups`,或包级 `marker`/`requires-python`,而当前探针没有相应的目标环境与选择上下文 +- **THEN** 在已配置原生工具且锁的基本结构可解析时仍调用原生 CVE 检查,把版本、退出状态和待归属 advisory 数量反馈给智能体;同时返回明确的锁选择未解析状态与环境核对动作。不得把所有 `[[packages]]` 合并为当前项目实际依赖,不得把待归属 advisory 发布为项目 finding 或零漏洞结论。显式空 extras/组可继续作为单用途锁的局部输入,但仍不证明完整覆盖 + +#### Scenario: check all schedules Python CVE by build root +- **WHEN** `check all` 发现一个或多个具有可识别 `pyproject.toml` 的 Python 构建根,调用方可选择显式 pip-audit 路径和版本 +- **THEN** 每个构建根作为独立任务复用同一个私有快照原生探针,共享请求截止时间与取消;JSON/human 反馈必须逐根显示原生 advisory 或缺锁、缺工具、输入不一致等具体阻塞。无清单的源码根只保留配置缺口,不伪造原生扫描。即使每个局部报告有效,项目环境、依赖组、漏洞库身份及时效和可信策略未核验时,类别最多为 `observed_unverified`,全项目交付仍为 `incomplete` + +#### Scenario: Python CVE observation enters the repair workbench +- **WHEN** 已初始化工作区对同一 Python 构建根重复运行 `cve python` 或 `check all`,随后对该任务执行原生复检 +- **THEN** 输入清单、标准锁集合、构建根及运行报告必须在导入时重新核对;相同构建根和 CVE 完整性义务只保留一张稳定任务,后续扫描与失败尝试形成历史事件。缺工具/锁形成环境准备指引,已观察 advisory 保留为待核验局部证据;复检必须再次调用原工具并写入观察事件,不能因零 advisory、自写白名单、任务勾选或报告重放自动关闭。过期或损坏的报告必须显式阻止导入,且不吞掉其他任务的证据 + +#### Scenario: A similarly named security plugin dependency is not FindSecBugs +- **WHEN** SpotBugs 插件依赖中的 `artifactId` 为 `findsecbugs-plugin`,但 `groupId` 并非 FindSecBugs 制品坐标 +- **THEN** 静态探测不得标记 FindSecBugs 已配置,也不得把该名称当作原生安全规则已运行 + ### Requirement: Java checks SHALL prove each required native obligation -Java MUST 分别建立 P3C、通用 lint、注释、安全、依赖漏洞和构建的适用义务。官方 P3C MUST 使用经验证的 P3C PMD 实现和兼容工具链;Checkstyle 配置名 MUST NOT 充当官方 P3C 的执行证据。Maven/Gradle 生命周期成功 MUST 结合实际绑定/执行证据,不能覆盖未运行的质量任务。 +Java MUST 识别 P3C、通用 lint、Javadoc/注释、安全、依赖治理、依赖漏洞和构建的项目配置状态。官方 P3C MUST 使用经验证的 P3C PMD 实现和兼容工具链;Checkstyle 配置名 MUST NOT 被标为 P3C。已配置的 Maven/Gradle 检查通过其原生命令执行,结果按该工具契约解释。`mvn verify` 成功只作为本次构建结果反馈,不能被描述成未配置的检查器也通过。 #### Scenario: Verify succeeds without quality plugins - **WHEN** `mvn verify` 成功但未运行所需 P3C/Javadoc 检查 -- **THEN** 对应义务仍未完成,`check java` 不能显示全部通过 +- **THEN** 在智能体对话中显示 P3C/Javadoc `missing` 与配置建议;`check java` 只总结实际运行的检查,批准策略要求的缺项才使门禁未完成 #### Scenario: JDK and PMD are incompatible - **WHEN** P3C 规则运行因 JDK/PMD 组合失败 - **THEN** 报告具体工具链未完成,不记为代码违规,不自动换规则或跳过 +#### Scenario: Maven PMD returns zero with default or error-skipping configuration +- **WHEN** Maven PMD 运行成功,但生效规则集并非项目声明的 P3C 规则,或处理错误被忽略 +- **THEN** 报告配置错误或工具结果未完成;Rust 不得把 Maven 退出码或空 XML 转述为 P3C 检查通过 + +#### Scenario: Isolated P3C probe must honor the project ruleset subset +- **WHEN** 项目仅声明 `ali-naming.xml`,隔离探针内置模板还包含 `ali-comment.xml` +- **THEN** 项目检查只执行已确认的命名规则集;作者注释规则的诊断不得进入该项目 finding 或修复任务。POM 在发现、执行或同步期间变化,或生效配置无法确定时,保留配置阻塞而非借误报白名单放行 + +#### Scenario: Native XML claims an unselected or impossible P3C rule +- **WHEN** PMD XML 结构合法且退出码为 0,但诊断中的规则集未被本轮项目配置选择,或规则 ID 不属于该规则集 +- **THEN** 不生成项目 finding 或源码修复任务;反馈报告规则归属未核验并保持 incomplete。规则目录须与固定版本 P3C 制品核对,不能只凭报告中的自由文本 ruleset 名称接受诊断 + ### Requirement: Comment and security categories SHALL retain their own evidence 注释检查 MUST 根据语言与规则验证其确定性要求,不得以格式化代替。源代码安全、配置安全、入库策略和 CVE MUST 分开归类;仅命中禁止文件模式 MUST 报策略违规,不得无内容证据声称检测到真实私钥。未实现的语义能力 MUST 明示。 @@ -48,6 +237,18 @@ Java MUST 分别建立 P3C、通用 lint、注释、安全、依赖漏洞和构 - **WHEN** 有效规则要求文档且源码缺少对应注释 - **THEN** 原生或经验证的确定性规则输出注释违规,普通 formatter 成功不消除该义务 +#### Scenario: Configured Ruff reports a Python module docstring rule +- **WHEN** Python 项目配置 Ruff 的 D100,原生 Ruff 对公共模块报告缺少 docstring +- **THEN** 注释类别保留该原生规则、定位与修复后原工具复检建议;局部诊断可标已观察但不得推断全部注释规则、工具/策略批准或项目交付通过。补充 docstring 后原生零诊断只撤销该局部问题观察,不自动签发完整注释检查通过 + +#### Scenario: Configured Ruff reports another pydocstyle rule +- **WHEN** Python 项目显式启用 Ruff D### pydocstyle 规则,例如 D101,且同轮原生设置确认该规则生效并返回诊断 +- **THEN** 将该精确原生诊断归入注释候选,保留规则 ID、源码位置与原工具复检建议;仅有配置文本、非 D### 代码或没有诊断均不证明注释义务已执行或通过 + +#### Scenario: Ruff docstring report conflicts with effective settings +- **WHEN** 原生报告声称检出 D### pydocstyle 规则,而同轮 Ruff 生效设置并未启用该精确规则 +- **THEN** 保留原生诊断供核查,但本轮源码检查标为未完成,不生成可执行的注释修复结论或项目交付通过;用于交叉核对的完整原生规则集合不自动成为公开批准规则包 + #### Scenario: Public certificate matches a forbidden path rule - **WHEN** 文件命中现行禁止入库模式但没有私钥内容证据 - **THEN** 按策略违规报告,不能将文件名命中写成已确认密钥泄露 @@ -60,14 +261,340 @@ Rust CVE 检查 MUST 绑定实际解析的组件版本、依赖来源、advisory - **WHEN** 离线数据库超过批准的 freshness - **THEN** CVE 未完成,不以零匹配判安全 +#### Scenario: Native cargo-audit JSON omits database provenance +- **WHEN** Rust 使用显式原生 cargo-audit 可执行文件和离线数据库扫描 Cargo.lock,报告有漏洞或零漏洞,但数据库提交/更新时间缺失或尚未由可信边界核验 +- **THEN** 保留原生 advisory 与锁定组件的名称、解析版本和来源观察;公开反馈不得泄露私有来源,数据库身份/时效仍为未完成,零漏洞不得称安全通过。原生忽略列表、损坏报告、计数或退出码矛盾也不得转成误报白名单或质量通过 + +#### Scenario: Project check includes the Rust CVE obligation +- **WHEN** `check all` 发现 Rust 项目,不论是否提供显式 cargo-audit 工具和离线数据库 +- **THEN** 在共享任务图中登记独立 `rust.cve` 节点,反馈原生漏洞或缺工具/数据库的具体阻塞;JSON/human/SARIF 均不得吞掉已观察 advisory,未核验数据库、工具和策略仍使完整交付未完成。取消或内部故障时保留已取得的其它原生结果,旧报告版本保持可辨识 + #### Scenario: Report has no comparable severity - **WHEN** 已知漏洞没有策略阈值需要的严重度 - **THEN** 保留 finding;无法按策略判定时未完成,不预过滤 UNKNOWN +#### Scenario: OWASP report and Maven graph share only a local identity candidate +- **WHEN** 同一构建根配置两个原生插件,本轮 OWASP 报告与 Maven 图的 POM、工具、JDK、离线仓库摘要一致,且某条 advisory 的精确 PURL、图节点和制品 SHA-256 一致 +- **THEN** 可显示该条候选归属及原生证据引用;数据库时效、可信工具与项目覆盖未经核验时仍不得签发 CVE 通过、确定严重度门禁或误报白名单放行 + +#### Scenario: Advisory cannot be safely attributed to the current dependency graph +- **WHEN** 两份原生报告的构建根、输入摘要、组件坐标或制品字节摘要不一致,或 PURL 因私服限定符不能无损解释 +- **THEN** 逐条显示失配或无法归属,并保留原生漏洞观察;不得按相似文件名、脱敏摘要或历史图推断组件身份 + ### Requirement: Migration SHALL account for every legacy language entry -迁移 MUST 逐项登记基线注册表全部 57 项,包括 54 stable 和 3 planned;前者完成五类别适用性和真实 adapter 验收前 MUST NOT 宣称全量迁移完成。planned MUST 保持显式状态,不能为凑数量创建空实现。注册表变化 MUST 重新做差异核对。 +迁移 MUST 逐项登记基线注册表全部 57 项,包括 54 stable 和 3 planned;前者完成六类别配置识别、原生适配器调用与结果反馈验收前 MUST NOT 宣称全量迁移完成。planned MUST 保持显式状态,不能为凑数量创建空实现。注册表变化 MUST 重新做差异核对。 #### Scenario: Four major languages are implemented - **WHEN** 仅 Java/Rust/Python/TypeScript 已可用 - **THEN** 只能声明这部分能力完成,剩余迁移任务仍未完成 + +#### Scenario: A project contains a planned language +- **WHEN** 项目含 COBOL、ArkTS 或 Metal 源码并运行 `check all` +- **THEN** 六类别候选均明确保留 `planned` 的旧登记状态与 `gap` 的当前能力含义,返回未完成和具体适配步骤;不能把无原生适配器解释为 `not_applicable`、空结果或质量通过 + +### Requirement: Adapters SHALL separate static observation from executable resolution + +adapter MUST 基于注入观察声明适用性、计划与报告解析,不自行spawn、联网或写文件。动态构建模型解析 MUST 作为有身份、预算、网络声明和证据的执行任务,由core经runtime port调用;静态detect/init/plan无法解析的条件保留unknown,不偷偷执行wrapper。模块/源集/方言与跨语言依赖映射 MUST 保留各自范围,不能用主语言覆盖其它构建根。 + +Codeguard 自有的新执行、解析、策略判定、门禁与验收工具 MUST 由 Rust 实现,不在新 CLI 路径中调用 Python 脚本来承担这些职责。P3C、Maven 等原生检查器仍按各自官方命令执行,由 Rust runtime 受控启动,Rust adapter 解释其原生证据;本要求不意味着用 Rust 重写它们的规则实现。旧 Python 入口只属于具名 legacy 兼容范围,不能参与新入口的通过判定。 + +#### Scenario: A build model requires project extensions to resolve +- **WHEN** 静态读取不足以确定effective model或条件依赖 +- **THEN** plan保留待解析任务,实际解析只在明确执行阶段进行并记录证据 + +#### Scenario: A shared scanner serves several language obligations +- **WHEN** 多模块多语言共享一个依赖扫描器 +- **THEN** 原生执行由统一runtime协调,结果映射到全部对应义务,不绕过进程控制或漏掉另一构建根 + +### Requirement: Checkstyle XML interpretation SHALL preserve native identity and distinguish processing failures + +Checkstyle XML 解析 MUST 保留完整 source(包括自定义模块 ID)、原生严重度、文件及可选列号;文件级零行号 MUST NOT 被改成任意源码行。异常和缺文件归属的事件 MUST 保持未完成,不制造源码规则违规。解析 MUST 有界并拒绝 DTD、损坏/未知结构、版本不符、歧义重复文件和非法字段。结构有效与空诊断 MUST NOT 单独证明本轮执行、检查范围、批准规则或交付通过。 + +原生结果判定 MUST 使用独立冻结的完整文件列表和经版本/平台验收的退出契约;缺失、重复、遗漏或额外文件不得形成完整结果。warning/info 在退出零时 MUST 保留;操作系统退出截断 MUST NOT 抹去报告中的错误。异常、信号、取消或退出与诊断矛盾 MUST 保持未完成,不冒充源码违规或普通通过。 + +原配置的重复属性与无法区分的原生规则来源 MUST 保留上下文歧义,不能默认选择某个属性值、合并检查实例或扩大白名单。具有可区分模块 ID 的相同检查类 MUST 保留各自身份,不因检查类相同而自动忽略。 + +#### Scenario: Distinct modules share a source ID in an older native version +- **WHEN** 锁定原工具版本仅输出模块 ID,两个配置实例共用该 ID +- **THEN** 无法独立归属的局部执行保持待解析,不产生可用于扩大白名单的规则绑定;改为不同 ID 后仍按原配置执行并分别展示诊断 + +#### Scenario: Warning severity returns a successful native exit +- **WHEN** 原工具退出零但本轮 XML 含有效 warning/info +- **THEN** 报告保留诊断及原严重度,不将退出零投影为零诊断 + +#### Scenario: Native scope differs from the frozen source list +- **WHEN** XML 文件列表遗漏或增加冻结范围外的文件 +- **THEN** 返回范围未完成,原始诊断仅保留为局部证据,不自动扩大活动 finding 或白名单范围 + +#### Scenario: Two configured modules use the same checker class +- **WHEN** 原生 source 使用相同类名但不同自定义模块 ID +- **THEN** 解析保留两个完整身份,不能合并后扩大白名单或规则归属 + +#### Scenario: An exception appears beside a valid diagnostic +- **WHEN** 文件 XML 内含 exception 及可解析的 error +- **THEN** 保留可解析诊断为局部证据,同时报告处理未完成;异常不成为源码违规且报告不能当作完整结果 + +#### Scenario: A structurally valid report contains no violations +- **WHEN** 原生报告仅列出零诊断文件或没有文件 +- **THEN** 解析只返回结构观察,执行器仍须核对本轮产物、原配置、退出码与完整范围 + +### Requirement: Checkstyle repair feedback SHALL bind native sources to original configuration +局部 Checkstyle 反馈 SHALL 从同轮原配置精确关联原生 source 与内置检查类,保留原生 ID,并提供规则依据、修复方向和原输入复检参数。该映射不能授予工具批准、规则覆盖、白名单或项目交付权威。 + +#### Scenario: Custom ID has an unambiguous original module +- **WHEN** 固定版本原工具报告自定义 ID,原配置中该 ID 唯一对应已支持模块 +- **THEN** 展示对应检查类、中文规则摘要、官方依据与复检步骤,不改写原生 ID,也不因有修复指引就关闭任务 + +#### Scenario: Native source cannot be bound +- **WHEN** 原生 source 未在原配置映射中,或配置存在重复 ID 或未知版本语义 +- **THEN** 返回未完成,不按消息、短类名或顺序推测规则,不发布用于修改源码的 finding + +### Requirement: Field Javadoc checking SHALL use the native configured Checkstyle rule +Rust 的 Checkstyle 注释适配 SHALL 支持原配置的 JavadocVariable,保留原生自定义规则 ID、完整检查类、严重度、范围及精确目标,不用自写字段注释规则替代原工具。 + +#### Scenario: Native field rule distinguishes configured scope and exceptions +- **WHEN** 固定 Checkstyle 10.21.4 对显式原配置下的字段执行 JavadocVariable +- **THEN** 只把原生报告中的问题生成稳定任务;原配置忽略名、访问范围、serialVersionUID 和局部变量等边界以原工具输出为准,不额外制造缺注释问题 + +#### Scenario: Field repair is verified with the same rule +- **WHEN** 原字段任务补充实际语义文档后接受 task verify +- **THEN** 使用显式同一原工具/配置,原问题未再检出只作为局部候选观察;保留任务开放,不以原生零诊断证明完整项目覆盖或批准 + +#### Scenario: Field and enum tokens select different native targets +- **WHEN** 原 JavadocVariable 配置选择 VARIABLE_DEF 或 ENUM_CONSTANT_DEF,或限定访问范围/excludeScope +- **THEN** Rust 保留静态合法原参数,不扩展 token 集合;保留原生默认及必需 token 语义:10.21.4 的 VARIABLE_DEF 必需,仅配置 ENUM_CONSTANT_DEF 时仍包含字段检查,不由 Rust 过滤;访问范围外的声明不产生额外 finding。未知 token 或其它模块借用该参数不能按本适配上下文执行 + +### Requirement: Official Checkstyle module names SHALL preserve native checker identity +已支持的静态 Checkstyle 模块 SHALL 接受官方短名和完整类名原写法,原 XML 字节照常交给工具,Rust 仅在既定版本映射中归一检查器身份,不以任意后缀、消息或类名相似度猜测归属。 + +#### Scenario: Official short and full names describe the same rule +- **WHEN** Checker、TreeWalker 及已支持 Javadoc 模块改用官方完整类名,原目标、规则 ID 和工具保持相同 +- **THEN** 保留同一稳定 finding/task 和原生规则依据,不创建伪造配置阻塞;配置变化仍需重新原工具检查 + +#### Scenario: Unknown namespace or duplicated alias claims a rule +- **WHEN** 其它包的同名检查类冒用已支持类名,或短名与完整类名产生同一未区分的原生 source +- **THEN** 返回上下文未完成而非猜测身份;不能按遍历顺序把一条诊断分配给任一模块 + +### Requirement: Missing method Javadoc configuration SHALL remain native and context-bound +MissingJavadocMethod 的静态原配置 SHALL 支持本版范围、allowedAnnotations、allowMissingPropertyJavadoc、minLineCount 与 ignoreMethodNamesRegex 参数,原工具决定其筛选与文档语义;适配器不得移除用户原参数改用默认扫描。 + +#### Scenario: Original method exclusions select only real native findings +- **WHEN** 原配置按访问范围、注解、属性方法、名称或长度限制方法检查 +- **THEN** 只将原工具实际诊断接入稳定修复任务;这些参数不是 CodeGuard 误报白名单批准,也不能证明受保护必需规则覆盖 + +#### Scenario: Method properties are borrowed by another module +- **WHEN** 非该检查器声明相同参数,或静态整数/布尔/注解名称无法解析 +- **THEN** 返回配置上下文未完成而非猜测含义,不把配置故障伪装成源码缺注释 + +#### Scenario: Method configuration explicitly selects constructors or annotation members +- **WHEN** MissingJavadocMethod 原配置选择 METHOD_DEF、CTOR_DEF、ANNOTATION_FIELD_DEF 或 COMPACT_CTOR_DEF +- **THEN** 在该模块上下文保留原 token 集合与原生必需 token 语义;原生诊断进入稳定任务,非选中类别不被 Rust 额外补报,record 紧凑构造器可用同配置原工具复检。跨模块借用或不支持 token 返回上下文未完成 + +#### Scenario: Same checker class changes its target exclusions during repair +- **WHEN** 同一稳定任务复检的检查类未变,但原始配置字节已变化,原问题不再出现在诊断中 +- **THEN** Codeguard SHALL 返回 rule_coverage_requires_review,不能将调整 scope、token、名称排除或其它原生参数造成的零诊断标为修复候选;缺原配置身份也须复核。后续重复复检或扫描不得用新配置覆写首次发现的配置身份。恢复原配置并修正文档后才可给出局部待策略核验候选,仍不得自动关闭事实 + +### Requirement: Method tag configuration SHALL preserve native option semantics + +固定 Checkstyle 10.21.4 的 JavadocMethod 静态适配 MUST 保留 accessModifiers、allowMissingParamTags、allowMissingReturnTag、validateThrows、allowedAnnotations 与原生可接受 tokens,不将它们借用给缺方法文档检查器。源码是否缺参数、返回或异常标签 MUST 由原生诊断决定,参数不产生白名单批准或必需规则覆盖证明。 + +#### Scenario: Original method tag policy deliberately permits missing tags +- **WHEN** 原配置限定访问修饰符,并选择允许缺参数/返回标签、允许注解或启用 throws 标签校验 +- **THEN** 原 XML 不改写,实际诊断进入稳定任务;不对原工具已允许的缺标签额外补报。使用原始配置修正文档后仅给局部复检候选 + +#### Scenario: A method tag property appears in an unrelated module +- **WHEN** 未支持检查器借用标签检查专属属性,或布尔/修饰符/token 不合法 +- **THEN** 保持配置上下文未完成,不套默认值或标源码违规 + +### Requirement: Type documentation options SHALL retain their original checker context + +固定 10.21.4 的 MissingJavadocType/JavadocType 原 scope/excludeScope 与五类类型 tokens MUST 保留原生语义。skipAnnotations MUST 只适配 MissingJavadocType;allowedAnnotations、allowMissingParamTags、allowUnknownTags、authorFormat/versionFormat MUST 只在 JavadocType 上适配。正则含义与是否缺文档/标签 MUST 由原工具判断,不由 Rust 生成替代规则或白名单批准。 + +#### Scenario: Type annotations or record parameter policy permit documentation exceptions +- **WHEN** 原类型检查配置限定访问范围、注解例外、类型 token 或允许缺 record 参数标签 +- **THEN** 执行原 XML,仅将实际原生诊断同步到稳定任务;不额外补报被原配置允许的情况。恢复首次配置并修正文档后只形成局部复检候选 + +#### Scenario: A type property is borrowed by a method checker +- **WHEN** 类型专属属性跨模块声明,或非法布尔/范围/token/动态值出现 +- **THEN** 保持配置上下文未完成,不猜测默认规则或将配置错误当源码违规 + +#### Scenario: Author and version tags violate original type format requirements +- **WHEN** JavadocType 原 authorFormat/versionFormat 检出缺标签或值格式不符 +- **THEN** 保留原生诊断和稳定任务,修复指引须包含作者/版本格式并要求使用项目实际身份/版本依据,不编造事实。原格式配置不变时真实修正文档仅给局部复检候选 + +#### Scenario: A type format regex is rejected by the native checker +- **WHEN** 静态配置可读取,但原生工具拒绝无效格式正则 +- **THEN** 反馈 incomplete 并生成稳定配置准备任务,重复失败不制造多张任务,不生成源码标签违规或假干净结论 + +#### Scenario: Native configuration regex failure has a recognized fixed-version signature +- **WHEN** 10.21.4 原进程正常退出 254,预算内 stderr 同时含官方配置属性非法值异常和 PatternSyntaxException,且没有相互一致的原生诊断报告 +- **THEN** Codeguard SHALL 只返回脱敏 checkstyle_configuration_regex_invalid 和原配置修复/原工具复扫指引,不回显属性值或原始堆栈;未知退出/异常、取消/超时/超限及证据失败不得套用该细分,不能生成源码违规或覆盖通过 + +### Requirement: ESLint JSON reports SHALL separate rule findings from incomplete execution and suppression + +ESLint 10 原生 JSON 适配 MUST 核对冻结的具体版本、完整显式文件集合、诊断/计数与 exit/max-warnings 契约。普通退出零的 warning MUST 保留;退出 1 MUST 根据 error 或已冻结警告阈值解释,不直接算工具故障;退出 2、未知/非正常退出、坏报告或身份/范围矛盾 MUST 未完成。fatal 或无原生 ruleId 的诊断 MUST 调查语法/parser/配置,不能伪造规则 finding;同报告合法规则诊断须保留。 + +#### Scenario: ESLint warning does not fail the native process +- **WHEN** 完整 JSON 报告只含 warning 且退出 0,或冻结 max-warnings 阈值导致退出 1 +- **THEN** 保留原生规则、严重度和位置;解析一致性不证明项目有效配置、工具批准或交付通过 + +#### Scenario: A parser error or ignored-file notice lacks a native rule identity +- **WHEN** JSON 中出现 fatal/parser 诊断或无 ruleId 的文件/配置提示 +- **THEN** 标为待调查的未完成,不把它当普通规则违规;有效规则发现仍可供定位 + +#### Scenario: ESLint reports only suppressed diagnostics +- **WHEN** suppressedMessages 非空而活动 messages 为空 +- **THEN** 保留抑制数量并要求覆盖/批准核查,不标干净范围,不自动制造白名单或源码 finding + +#### Scenario: A native array omits a planned file or contradicts its counts +- **WHEN** 文件集合缺失/重复/额外,版本不匹配,路径含跳转,诊断计数矛盾或 JSON 损坏 +- **THEN** 返回未完成,不能签发解析一致性或复检关闭候选 + +### Requirement: ESLint native command planning SHALL use explicit literal inputs + +Rust ESLint 命令计划 MUST 明确 Node 入口、ESLint JS 入口、原 flat config、完整显式源码列表与本轮独立 JSON 槽位,以字面 argv 构造,不借 Shell/npx 隐式安装或拼接命令。MUST 禁用配置自动查找、保留原配置/ignore 语义与显式 max-warnings;不得隐式 fix/cache/quiet 或替换规则。规划 MUST 有界,拒绝相对/跳转/控制字符、空/重复范围与输入输出冲突;物理路径别名、脚本/插件闭包、报告新鲜性和生效项目上下文仍须执行层核验。 + +#### Scenario: A selected project has file paths with spaces or shell metacharacters +- **WHEN** 显式原配置和源码路径合法但含空格或 Shell 元字符 +- **THEN** 逐项保留字面路径,Node 与 ESLint 参数分界明确,不能执行字符串中的 Shell 片段或隐式修复源码 + +#### Scenario: Caller freezes a warning threshold +- **WHEN** 本轮计划明确 max-warnings +- **THEN** 使用原生整数参数,反馈解析须核对同一冻结阈值;不通过 quiet 删除 warning 来制造通过 + +#### Scenario: Report slot aliases a planned input or argument budget is exceeded +- **WHEN** 词法输入输出冲突、范围重复/为空、路径不安全或规划预算超限 +- **THEN** 启动前拒绝计划,不写报告,不删除输入,不冒充已检查的干净范围 + +### Requirement: ESLint controlled execution SHALL bind version and current inputs + +Rust ESLint 执行层 MUST 在统一 runtime 中运行显式 Node/ESLint 入口,版本探测和扫描共享取消、绝对截止时间及有界日志。启动前 MUST 校验 Node、入口、原配置、所有显式源码的精确物理路径与摘要集合,使用私有的新鲜报告槽位;版本必须与冻结预期一致。版本探测后和扫描后 MUST 复核输入,输入改变或报告/进程异常为未完成,不构造源码违规或已修复结论。局部一致结果不得自证项目配置、JS 导入/插件闭包、可信工具批准或完整覆盖。 + +#### Scenario: Prior report exists or an input digest is missing +- **WHEN** 本轮报告槽位已有文件,或任何显式输入缺少冻结摘要 +- **THEN** 启动 Node 前拒绝执行;旧报告不能作为本轮证据 + +#### Scenario: Version or configuration changes during controlled execution +- **WHEN** 入口报告非预期版本,或版本探测/扫描后配置字节已变化 +- **THEN** 返回未完成;配置变化时可保留已解析诊断作调查线索,但不能签发局部一致、任务关闭或门禁通过 + +#### Scenario: A controlled report is coherent but project context remains unknown +- **WHEN** 实际进程返回与本轮文件、计数和退出码一致的 JSON,但项目配置归属或插件导入闭包未核验 +- **THEN** 只返回局部观察,不能升级为完整项目覆盖或批准的白名单处置 + +#### Scenario: An interrupted ESLint scan has already written a report or writes none +- **WHEN** 扫描启动后取消或共同截止时间到达,无论本轮报告已写出还是尚未生成 +- **THEN** 保留 request_cancelled 或 request_deadline_exceeded 原因,不降级成一般报告损坏,不把已写出的零诊断报告当作完成;后续指引不得要求智能体修改无关源码 + +### Requirement: ESLint configuration discovery SHALL distinguish candidates from effective configuration + +项目发现 MUST 静态记录六种原生 flat config 文件、旧 eslintrc 文件及 package.json eslintConfig 线索。MUST 绑定读到的配置/清单字节,保持嵌套配置所在根;发现不得执行 JS、隐式迁移旧配置或套用默认规则。静态存在不能证明逐文件规则、选中配置、TS loader 或插件闭包生效;未发现候选也不能断言外部配置或显式调用参数不存在。MUST 返回具体未确认原因及原生核查动作,不制造源码违规或白名单批准。 + +#### Scenario: Several flat configuration candidates exist in one root +- **WHEN** 同一目录存在多种 flat config,当前项目调用上下文尚未解析 +- **THEN** 分别记录候选与配置选择未确认,不任意拼接规则或把候选认定为已启用 + +#### Scenario: A nested Node package contains a TypeScript configuration +- **WHEN** 根目录有 JS flat config,子包有 TS/MTS/CTS flat config +- **THEN** 保留不同配置所在根,要求原生逐文件归属与 TS loader 核查;不把根规则强加子包 + +#### Scenario: No flat config is observed or only legacy declaration exists +- **WHEN** package.json 所在根没有观察到 flat config,或包含旧 eslintConfig +- **THEN** 说明未观察到配置或需原工具版本上下文,提供准备动作;不创建默认配置、不报告源码违规 + +#### Scenario: Node manifest changes or becomes unreadable during discovery +- **WHEN** ESLint 线索复核读取的 package.json 与本轮清单摘要不一致或不可读取,即使同目录已有 flat config +- **THEN** 标记发现不完整并保留清单阻塞路径和具体准备原因,不能隐藏为普通未知配置或据此把初始化画像标新鲜 + +#### Scenario: Standalone JavaScript or TypeScript source has no package manifest +- **WHEN** 项目中观察到独立 JS/TS 源码但无 package.json 或根配置候选 +- **THEN** 返回配置未观察到的待准备线索及源码引用,不安装包、不创建清单或默认规则,也不省略检查准备反馈 + +### Requirement: npm native audit observation SHALL retain protocol and coverage boundaries + +Rust npm审计适配 MUST 核对具体原工具版本、auditReportVersion、冻结审计阈值的退出契约、原生组件和汇总计数,拒绝重复JSON键及路径越界。原生advisory source编号 MUST NOT 冒充CVE编号,受影响范围 MUST NOT 冒充锁文件解析版本,间接via关系 MUST NOT 复制成直接advisory。直接advisory高危而组件被降级的报告矛盾 MUST 为未完成。静态脚本声明、锁文件存在及离线零诊断均不能证明当前依赖图、漏洞库时效或完整策略覆盖。 + +#### Scenario: Native audit reports a vulnerability and exits one +- **WHEN** 原生报告按本轮阈值返回退出1且组件/计数一致 +- **THEN** 保留原生易受影响组件、严重度、节点、范围及关系观察,不把退出1当作工具故障,不自动签发批准漏洞身份或白名单 + +#### Scenario: Native audit lacks a lock or emits a contradictory report +- **WHEN** npm返回error对象、报告损坏、版本不同、计数不一致或定位越界 +- **THEN** 返回未完成和具体原因,不构造源码违规或干净审计 + +#### Scenario: Offline audit reports no dependencies +- **WHEN** 显式原工具在私有缓存及用户/全局配置下离线审计空锁文件并返回零发现 +- **THEN** 只记录该原生报告一致;不安装依赖、执行fix或项目脚本,不将离线/零依赖观察推广为完整CVE门禁 + +#### Scenario: A package script merely mentions npm audit +- **WHEN** 脚本含复合Shell命令或自定义参数,而非已识别的明确原生命令声明 +- **THEN** 静态配置标记需原上下文复核,不执行脚本;没有观察到声明也不能证明外部CI未配置审计 + +#### Scenario: npm input-bound runtime observations require unchanged original inputs +- **WHEN** 调用者冻结Node/npm、清单、锁、用户/全局配置及存在的项目npmrc,原生审计在统一runtime中执行 +- **THEN** 精确核对输入摘要集合及具体版本,版本和审计沿用相同显式上下文,共用取消与截止;输入变更或新增此前不存在的项目npmrc时返回未完成且不提供可关闭任务的parsed结论;stdout报告有界解析并核对锁节点,局部一致不证明工具模块闭包、数据库覆盖或交付权威 + +#### Scenario: Per-root npm audit declarations enter discovery and plan previews +- **WHEN** 项目包含多个package.json,脚本分别为明确audit、未观察到audit、自定义复合调用或畸形声明 +- **THEN** 按每个构建根保留configured/missing/unknown/invalid及下一步,不执行脚本、不从未观察到脚本推断外部CI缺失;重读清单变化或不可读时标记观察未完成,不能沿用旧声明;TypeScript/JavaScript语言别名及all的计划预览保留node检查器,但不宣称执行或有效质量门禁 + +#### Scenario: Explicit npm audit registry supports native advisory validation +- **WHEN** 调用者明确选择无凭据HTTPS审计源,或仅用于验收的loopback HTTP源 +- **THEN** 原生命令固定registry与audit-registry、不经shell、不安装或执行项目脚本;保留原生advisory source及具体锁节点,不将受控服务夹具或成功请求当作可信数据库时效与CVE通过;认证、系统级网络隔离及完整数据库来源仍需独立核验 + +#### Scenario: Offline nonempty npm audit returns zero observations +- **WHEN** 私有空缓存、非空锁文件和离线原生命令返回退出0及零漏洞 +- **THEN** 可以保留原生依赖数量及锁文件节点观察,但漏洞库覆盖仍为not_evaluated,不推断当前数据库新鲜、网络查询成功、组件安全或CVE检查通过;报告解析一致性不得授予门禁权威 + +#### Scenario: Native npm audit locations require resolved lock identities +- **WHEN** 原生审计返回组件节点位置,需要关联 npm v3 锁文件版本 +- **THEN** 按具体安装位置核对包名与明确解析版本,不将受影响范围当版本、不合并不同位置的同名包;节点数量、名称或位置不一致以及重复字段、链接、别名或不支持结构均为未完成,不能批准白名单或交付通过;节点关联不声称依赖边、直接性或漏洞范围已核验 + +### Requirement: ESLint task recheck SHALL observe the original effective rule + +原 ESLint finding 在同配置复检中未出现时,Rust MUST 使用原工具的逐文件有效配置查询核对原规则;MUST 保留显式原入口、配置、cwd、统一截止时间及输入前后复核。关闭、缺失或无法确认规则不得解释为源码修复或白名单批准。输出 MUST 只展示脱敏规则级别、原因及摘要,不执行报告中的指令、不把完整配置投影到对话。局部规则观察不能自证完整导入闭包或批准覆盖。 + +#### Scenario: An imported configuration disables the original rule +- **WHEN** 主配置及源码字节不变,但导入配置使原规则关闭或不再出现,原生扫描零诊断 +- **THEN** 返回 rule_coverage_requires_review,任务保持 open,next 指向配置与批准依据核查,不建议修改无关源码 + +#### Scenario: Effective settings query fails or changes inputs +- **WHEN** 原生查询损坏、被忽略目标返回 undefined、超时或显式输入前后不一致 +- **THEN** 保留未完成及具体原因,不据零诊断产生修复候选或有效白名单 + +#### Scenario: User cancels while effective settings are being queried +- **WHEN** 扫描已返回诊断,但用户在同轮有效配置查询期间取消请求 +- **THEN** 反馈保留 request_cancelled 与未完成,回收查询进程组并释放自有租约,不将中断保存为正常的 still_present 或问题消失复检事件;原始 finding 与任务继续保留 + +#### Scenario: A project-local plugin reports an original rule +- **WHEN** 项目原配置加载本地插件并报告带命名空间的规则,源码修复后同配置复检不再报告该规则 +- **THEN** 原生发现及任务保留完整插件规则 ID,查询同一规则是否仍启用,保留原插件与配置;局部一致仅生成待批准覆盖核验候选,不能据此声称完整插件闭包或正式关闭 + +### Requirement: Public ESLint local feedback SHALL retain uncertainty and explicit context + +`lint typescript` 的原生接入 MUST 明确 Node、ESLint JS 入口、具体版本、项目原 flat config 及原工作目录,不能从配置所在目录猜测原调用上下文。上下文缺失 MUST 返回准备动作而不安装工具、套默认规则或制造源码违规。当前显式单文件范围 MUST 明示局部覆盖,目录未调度时不能视为已检查;JSON/human反馈 MUST 保留原生规则、位置、严重度及未完成原因,避免泄露原生敏感消息。局部零诊断也 MUST NOT 签发项目门禁或关闭任务;未接持久任务时须明示未接入。 + +#### Scenario: Explicit directory uses one selected native configuration +- **WHEN** 调用者选择目录、明确原生入口/配置/cwd,目录内有多个 JS/TS 文件 +- **THEN** 有界枚举并逐文件调用原工具,共享截止时间,分别保留仓库相对定位、诊断、同步状态和准备任务;核对枚举与显式输入前后变化,列出跳过项和未执行文件,不能暗示已自动选择 monorepo 子配置或完整覆盖 + +#### Scenario: Caller selects separate monorepo project contexts +- **WHEN** 调用者通过有版本的显式映射,为子项目根分别指定原配置及cwd +- **THEN** 按路径组件选择最深匹配根,未命中范围沿用原参数;拒绝重复根、越界/链接、未知字段及不可读上下文,反馈逐文件的选择来源与范围。映射和选中输入在执行前后核对,变化则保留已取得结果并停止未执行范围;映射不能自行批准规则、覆盖或白名单 + +#### Scenario: A directory file fails while others produce findings +- **WHEN** 一个文件报告/执行未完成或工作台保存失败,其它文件已有原生发现 +- **THEN** 保留各文件发现和具体故障,目录状态为 incomplete;取消/超时保留原因和未执行清单,不能把未执行文件称干净 + +#### Scenario: The original ESLint configuration is itself source code +- **WHEN** 本轮源码目标恰为同一个原 flat config 文件 +- **THEN** 可共享同一个只读字节身份,扫描与同步核对同一摘要;重复源码、其它工具输入别名及报告覆盖输入仍拒绝,不为绕过冲突排除配置源码 + +#### Scenario: Public lint has no explicit native execution context +- **WHEN** 用户请求 lint typescript 但缺显式入口、版本、原配置或工作目录 +- **THEN** 返回配置/环境准备反馈,无源码finding,门禁未判定,不自动创建或迁移配置 + +#### Scenario: Public native finding disappears after a same-configuration repair +- **WHEN** 原生工具先检出规则,再用相同原配置检查已修复文件而零诊断 +- **THEN** 对话分别展示原发现及局部零诊断,仍明确完整项目覆盖和策略未核验;未接持久任务时不虚构关闭事件 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md new file mode 100644 index 0000000..48bd583 --- /dev/null +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md @@ -0,0 +1,137 @@ +## Purpose + +定义 init 对项目语言、版本、构建器、模块关系和架构证据的观察与持久化,以及 AGENTS.md 受管摘要的生成边界,使智能体依据真实项目上下文选择检查和修复动作。 + +## ADDED Requirements + +### Requirement: Initialization SHALL build an evidence bound project profile + +init MUST 识别指定项目边界、各构建根、语言/方言、项目版本、语言目标、构建器/包管理器、框架、源集、现有质量配置及检查前置条件。声明、锁定/解析、本机安装版本 MUST 分开;每项附来源和内容身份,未观察到的事实 MUST 标 unknown,不从主语言或本机版本猜测其它模块。读取范围 MUST 遵循批准扫描与配置发现政策。 + +#### Scenario: Multiple build roots use different languages +- **WHEN** 一个项目含 Java、TypeScript 和 Python 构建根 +- **THEN** 逐根保留语言、版本及构建配置,不以主语言覆盖其它根 + +#### Scenario: Installed runtime differs from the declared target +- **WHEN** 项目声明 Java 17,本机为 JDK 21 或尚未探测 +- **THEN** 项目目标仍是 Java 17,本机证据独立记录或 unknown + +#### Scenario: Different manifests declare different Java or Rust targets +- **WHEN** 多个 POM/Cargo 清单分别直接声明不同 compiler release/source/target 或 rust-version/edition +- **THEN** 按清单保留 declared_only 目标及原始字节来源,不以单个全局语言版本覆盖其它根;包版本、本机版本和有效模型解析保持独立,继承、变量、重复或非法字段不猜测为已知目标 + +#### Scenario: Maven or Cargo package version is directly declared +- **WHEN** POM/Cargo 清单直接声明项目包版本 +- **THEN** 按清单记录 package_declared_versions,依据同次原始清单摘要;不把项目版本当语言目标、本机版本或已解析依赖版本。父/profile/workspace 继承、变量、重复、错误类型或非法值保持未知,刷新保留人工工作记录 + +### Requirement: Architecture observations SHALL not become unapproved rules + +架构画像 MUST 分别描述表现层、领域组织、依赖结构和部署单元,允许多种风格并存。结论 MUST 区分 declared/observed/inferred/confirmed/unknown/stale,并保留依据。目录名、模型判断或相互冲突文档 MUST NOT 自动激活架构阻断规则;批准约束与观察结果必须分离。 + +#### Scenario: Domain and controller directories exist without a design declaration +- **WHEN** 仓库仅有 domain/controller 命名线索 +- **THEN** 最多产生候选架构及确认任务,不认定已采用 DDD 或强制重构 + +#### Scenario: Documentation conflicts with source dependencies +- **WHEN** 文档声明的分层与实际观察不同 +- **THEN** 同时保留证据和冲突,不选择较松约束或伪称架构已验证 + +### Requirement: Module graphs SHALL preserve relation types and uncertainty + +模块图 MUST 区分构建聚合、构建依赖、源码引用、外部组件及声明的服务/业务关系,附范围、条件和来源。动态关系、未知 profile/feature 或不完整源码图 MUST 明示 unresolved;不能用缺边证明无依赖或缩小检查范围。既有 CodeGraph 证据 MUST 核对身份,init 不得自动安装/初始化/更新索引。 + +#### Scenario: Aggregated modules have no dependency edge +- **WHEN** 构建根仅声明两个子模块 +- **THEN** 生成 contains 边,不虚构子模块间依赖 + +#### Scenario: Maven declares a local dependency with explicit coordinates +- **WHEN** 项目内 POM 声明完整且唯一的 group/artifact/version,并直接依赖另一个具有相同完整坐标的本地构建根 +- **THEN** 模块图分别保留 Maven 聚合声明与 declared build_dependency,附来源清单及字节摘要、scope 和条件;声明边不等于有效 Maven 模型或运行时关系,不据此缩小检查范围 + +#### Scenario: Maven dependency identity cannot be resolved statically +- **WHEN** 坐标含属性变量、需要父 POM/依赖管理、重复坐标,或 profile 中有条件关系 +- **THEN** 保留具体 unresolved,不选择某个目标伪造依赖边;逃出项目的模块路径或未观察到的模块也不能产生已知节点关系 + +#### Scenario: XML comments split a Maven identity field into multiple text nodes +- **WHEN** 模块或坐标字段由 XML 注释切成多段文本,静态解析器不能准确取得整个字段 +- **THEN** 保留未解析状态,不截取首段文本来匹配另一个模块或坐标 + +#### Scenario: Cargo declares members and local path dependencies +- **WHEN** Cargo 清单显式声明项目内已观察成员或本地 path 依赖,依赖目标 package 名称与声明一致 +- **THEN** 保留不同的 aggregation 和 declared build_dependency,记录清单摘要与 normal/build/dev 范围;包重命名按 package 字段核对,不把别名当目标包名。观察不执行 cargo 或 build.rs,不代表有效依赖解析 + +#### Scenario: Cargo relation needs workspace feature or target resolution +- **WHEN** Cargo 关系涉及继承、optional/target 条件、成员通配或排除、外部/缺失目标或逃出项目路径 +- **THEN** 保留具体 unresolved,不自动展开未知条件或连接错误目标;图依赖覆盖保持不完整,不能据此缩小检查或宣称无依赖 + +#### Scenario: Conditional dependency is unresolved +- **WHEN** 构建依赖由未解析的运行条件决定 +- **THEN** 保留未知范围,不以不完整图认证增量覆盖 + +### Requirement: AGENTS generation SHALL preserve scope and human ownership + +init apply MUST 在被检查项目 AGENTS.md 生成明确标记的受管摘要,链接项目画像/模块图,包含规则来源和检查修复入口。区块外人工内容、其它工具区块和子目录指令 MUST 保留;缺 marker 时可追加,marker 异常、受管内容人工修改或并发冲突时 MUST 不盲目覆盖。仓库原始文本 MUST 作为转义数据,不提升为授权指令。 + +#### Scenario: Existing AGENTS contains several managed and human sections +- **WHEN** Codeguard 更新自身受管区块 +- **THEN** 其它内容逐字保持,已有子目录规则继续按作用域生效 + +#### Scenario: Human changes the managed section after planning +- **WHEN** 写入前内容身份与计划不符 +- **THEN** 报告冲突并保留用户修改,不以 force 覆盖 + +### Requirement: Init SHALL plan and apply without hidden execution + +`init [path] [--dry-run|--apply]` 省略模式 MUST 等同 dry-run。dry-run MUST 只返回拟创建任务,不写 findings/tasks 或其它工作树文件;apply 才持久化计划内任务。默认观察不得执行项目 wrapper、构建扩展、package scripts、扫描、安装、服务启动、Git Hook/CI 接管或其它工具初始化。apply MUST 仅写计划明确的自有产物与 AGENTS 区块;分文件身份核对、原子替换及中途失败可恢复,不得谎称跨文件全原子。 + +#### Scenario: Dry run identifies a required environment blocker +- **WHEN** dry-run 通过有效证据确认必需环境缺失 +- **THEN** 返回拟创建的阻塞及修复任务,工作树无新增或修改 + +#### Scenario: Wrapper prints a version and also changes files +- **WHEN** 项目提供带副作用的 wrapper +- **THEN** init 不执行它,不为获得版本而改变项目,相关事实保持待探测 + +#### Scenario: Writing the second artifact fails +- **WHEN** 第一份初始化文件已写入而后续文件写入失败 +- **THEN** 返回部分未完成,记录可恢复进度,不覆盖并发修改或称全部成功 + +### Requirement: Profile refresh SHALL preserve findings and detect stale inputs + +项目画像与图 MUST 以结构化产物保存,AGENTS/架构 Markdown 是投影,不是政策权威。重复 init MUST 幂等;manifest、锁、规则、相关源码或文件集合增删变化后 MUST 标过期并重算受影响画像。刷新 MUST 保留发现、修复事件与人工备注,不能重建空任务清单冒充问题已解决。 + +#### Scenario: A module is added after initialization +- **WHEN** 新增模块或构建清单,不属于上次读取的文件集合 +- **THEN** 仍识别画像失效并更新模块图,不仅比较旧文件哈希 + +### Requirement: Initialization status SHALL be separate from quality readiness + +init MUST 分别报告操作完成状态和检查前置准备状态。文件生成成功不证明工具可用、检查通过或交付 allow;缺工具/环境/必要信息 MUST 规划相应 blocker/决策/探测任务,在 apply 时持久化,并给出 doctor/check/sync/next 的后续动作。readiness MUST 依据批准检查义务和选中适配器的适用必需前置条件:已确认必需条件缺失、不兼容或冲突优先为 incomplete;否则,集合未确定、无适用义务或存在未探测/未解析/过期证据为 unknown;否则全部具有有效满足证据才为 ready。可选工具缺失 MUST NOT 阻塞此汇总,未探测 MUST NOT 伪称缺失。首次扫描 MUST 不自动豁免存量问题。未知架构仅在必需规则依赖它时影响相应检查,不强迫所有项目先选择架构风格。 + +#### Scenario: An optional tool is missing and a required runtime is unprobed +- **WHEN** 可选工具已确认缺失,而必需运行时尚无有效探测证据,且无其它已确认必需阻塞 +- **THEN** readiness 为 unknown,生成必需运行时探测计划,不因可选工具缺失返回 incomplete + +#### Scenario: Required preparation evidence is stale or belongs to another binding +- **WHEN** 必需前置证据过期、来自不同策略/目标/工具绑定,或可信时钟/来源尚未核验 +- **THEN** 不能沿用旧 satisfied 或 missing 结论;该前置为 unknown 并要求复核。只有本轮有效的必需缺失/不兼容/冲突优先产生 incomplete,可选条件的失败不改变汇总 + +#### Scenario: Preparation is ready but checks have not run +- **WHEN** 全部已确定适用必需前置有有效满足证据,readiness 为 ready +- **THEN** ready 仅表示前置准备,不代表原生检查完成、没有 finding 或交付 allow;无适用必需集合、集合未完整确认或重复/歧义归属不能因零阻塞而返回 ready + +#### Scenario: Files are initialized but JDK is missing +- **WHEN** 工作区和 AGENTS 生成成功但 Java 工具链未准备 +- **THEN** init 可返回操作成功,同时 readiness=incomplete、准备任务可见,交付未经认证 + +#### Scenario: Preparation tasks retain identity without retaining stale diagnoses +- **WHEN** 同一必需前置的输入绑定或观察状态变化,需要重新规划准备任务 +- **THEN** 任务以工作区内前置标识保持稳定逻辑键,更新本轮绑定;有效缺失、不兼容、冲突分别给出恢复、兼容性复核、冲突决策动作,未知/过期/错绑定仅要求重新核验,不沿用旧缺失诊断。可选、不适用、已满足前置不生成修复任务,未核验来源或歧义要求不能生成可执行任务;规划不自动安装、执行命令或授予交付通过,关闭须重新取得当前有效满足证据 + +#### Scenario: Initialization observations are returned to the agent conversation +- **WHEN** init 以 dry-run 或 apply 观察了语言、构建根及逐清单语言目标 +- **THEN** JSON 与 human 均反馈对应观察摘要、声明与未知状态;dry-run 不要求先写文件才能看到结果。摘要不执行工具、不暴露原始清单内容或本机根路径,也不把文件生成/目标声明变成质量通过;项目路径等不可信文本不能伪造终端指令或状态行 + +#### Scenario: Initialization returns checker configuration separately from execution +- **WHEN** 只读发现器观察检查器的 configured/missing/invalid/unknown 状态 +- **THEN** init 按构建根反馈状态、来源、原因和下一步,执行状态固定 not_run;配置清单不完整和义务尚未绑定必须明示。未配置不能自动变成代码违规,配置已声明不能自动变成执行成功或准备就绪,摘要不自动启用/豁免检查器 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md index f889452..6f59918 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md @@ -4,13 +4,59 @@ ## ADDED Requirements +### Requirement: npm remediation tasks SHALL recheck through their original native audit service +npm持久任务 SHALL 支持 task verify,结构化任务根决定原生cwd,显式原工具上下文、共享预算与任务租约保护复检和持久化。结果 SHALL 反馈原生诊断及下一步,不从零漏洞推导完整覆盖或关闭。 + +#### Scenario: npm native audit is coherent but coverage remains unverified +- **WHEN** 原生版本、输入摘要与锁节点关联一致,本轮没有advisory但可信漏洞覆盖尚未核验 +- **THEN** 记录局部复检并保持同一任务open,返回still_blocked;next说明需核验漏洞源覆盖及时效,不标记代码修复或白名单通过 + +#### Scenario: npm recheck fails after a repair attempt +- **WHEN** 持有有效租约的执行者结束修复尝试后,原生审计返回错误 +- **THEN** 记录关联该尝试的incomplete复检及诊断,任务仍open;next提供具体检查指引,不继续声称尚未运行复检或创建源码违规 + +#### Scenario: npm inputs change after a recorded recheck +- **WHEN** 清单或锁文件改变,旧复检结果与当前输入不再一致 +- **THEN** 历史记录保留但不作为当前结果,next与尝试历史要求原工具重新复检,不能沿用旧的零发现或恢复结论 + +#### Scenario: npm verification receipts are rewritten or assigned to another root +- **WHEN** 本地报告、验证事件和消费收据一并改写摘要,但报告包含重复字段、无效结构、虚构覆盖/权威,或对应另一工作区/构建根 +- **THEN** next和尝试历史拒绝该复检证据,返回具体证据异常而非输入过期;incomplete失败结果也不得用于确认另一任务的修复尝试已经复检。合法旧输入变化须单独给原工具重检指引 + +### Requirement: npm child projects SHALL preserve explicit workspace ownership +公开 npm 审计 SHALL 支持显式父工作区参数,原工具在子项目执行,报告与任务归属所选已初始化工作区;未指定参数不得自动寻找父工作区。 + +#### Scenario: Two npm children share one initialized workspace +- **WHEN** 两个子项目分别指定同一父工作区并重复审计 +- **THEN** 每个构建根保留一张稳定完整性任务,原生 cwd 保持对应子项目,预算默认来自所选工作区,next 复检命令保留显式工作区 + +#### Scenario: npm workspace is an alias or excludes the project +- **WHEN** 显式工作区是符号链接别名或不包含项目的物理目录 +- **THEN** 在原生执行前返回准备未完成,不把外部项目记录为工作区任务;路径组件 a 不包含兄弟 ab + +### Requirement: Local doctor observations SHALL enter the remediation queue without granting readiness + +已初始化工作区的 doctor 局部报告 MUST 绑定当前工作区身份并以 run_id/摘要幂等同步;未初始化或无效工作区不得自动初始化或写入其它路径。显式版本诊断失败可生成稳定的环境调查任务,诊断原因变化或重复运行不得创建同一前置的重复任务;未选工具不得伪造工具缺失或必需检查。任务 MUST 引用报告、具体诊断、允许环境范围、原生 doctor 复检及历史/关闭条件;原生版本恢复不自动关闭原问题、授予准备 ready 或质量通过。工作区不符、被改报告或伪造完成/批准字段 MUST 拒绝导入;持久化/同步失败须如实反馈,保留原生观察而非改写为已修复。 + +#### Scenario: A selected version probe fails twice +- **WHEN** 同一工作区显式选中的 Ruff 版本探测重复失败 +- **THEN** 每次报告保留自己的 run_id,关联同一环境调查任务;再次同步同一报告不重复写任务,next 给 doctor 复检和环境恢复指引,不修改无关源码 + +#### Scenario: A later version probe succeeds +- **WHEN** 原环境调查仍待处理,本次局部原生版本恢复正常 +- **THEN** 保留成功观察及未关闭任务,要求核验前置要求/可信来源;不得把局部版本成功写成质量修复或允许交付 + +#### Scenario: An agent verifies a doctor investigation task +- **WHEN** 智能体对 doctor 环境任务执行 task verify 并显式选择原生工具 +- **THEN** 复用同一版本诊断契约、预算和任务租约,以报告摘要保存复检事件;失败保留具体原因,成功标记环境恢复但策略未核验,任务保持 open。未选择工具为 incomplete,不隐式发现随机 PATH 工具或扫描源码 + ### Requirement: Projects SHALL have an explicitly initialized remediation workspace -Codeguard MUST 支持 `./codeguard/` 及其中的 .gitignore、工作区清单、脱敏 findings/events、任务与决策引用;原始 reports/runs/cache/worktrees/state MUST 默认 Git 忽略。初始化 MUST 提供 dry-run/apply,不覆盖已有用户文件,不创建第二份质量策略。 +Codeguard MUST 支持 `./.codeguard/` 及其中的 .gitignore、工作区清单、脱敏 findings/events、任务与决策引用;原始 reports/runs/cache/worktrees/state MUST 默认 Git 忽略。初始化 MUST 提供 dry-run/apply,不覆盖已有用户文件,不创建第二份质量策略。 -#### Scenario: User already has files under codeguard -- **WHEN** 初始化遇到同名用户目录或冲突文件 -- **THEN** 给出精确合并/冲突计划,不强制覆盖,不全目录忽略用户源码 +#### Scenario: User files and legacy workspace coexist +- **WHEN** 初始化遇到 `.codeguard/` 中的冲突文件,或在 `codeguard/workspace.json` 发现旧版受管工作区 +- **THEN** 给出精确冲突与迁移诊断,不覆盖文件、不静默创建第二份工作区;既有 `codeguard/src/` 用户源码仍参加普通检查,不能整体搬入点目录 ### Requirement: Findings and environment blockers SHALL produce distinct actionable tasks @@ -18,6 +64,8 @@ Codeguard MUST 支持 `./codeguard/` 及其中的 .gitignore、工作区清单 同步 MUST 按 run_id 幂等消费所有未导入且身份匹配的报告,不能仅取最新一份而丢弃其他类别发现。过时报告只能成为历史,完整报告也不得跨未覆盖范围关闭问题。 +RunReport 与准备诊断 PrerequisiteReport MUST 使用 workspace_id + run_id 作为导入幂等键并验证报告摘要;同键不同摘要 MUST 拒绝而不是覆盖。每份报告的事件提交与消费标记 MUST 可恢复,失败不得先推进游标;准备诊断只能形成对应blocker/恢复证据,不伪装源码检查结果。 + #### Scenario: Ten scans report the same issue - **WHEN** 同一内容/策略下多次检出同一个问题 - **THEN** 保留一个稳定 issue 和本地运行历史,不生成十个任务或无意义 tracked 文件变化 @@ -30,6 +78,34 @@ Codeguard MUST 支持 `./codeguard/` 及其中的 .gitignore、工作区清单 - **WHEN** 同一内容先产生 lint 报告再产生 CVE 报告 - **THEN** 同步纳入两者,重复同步不重复创建问题或事件 +#### Scenario: CVE advisory is observed without a qualified vulnerability database +- **WHEN** 原生 OWASP 报告包含 advisory,但数据库时效或依赖归属尚未核验,且工作区已启用持久同步 +- **THEN** 保留脱敏报告并生成稳定的环境/证据阻塞任务,列明原工具复检与库核验步骤;重复扫描不制造多张同身份任务,不将 advisory 直接写成已确认源码 finding、误报白名单或交付通过 + +#### Scenario: Rust CVE observation is rechecked before database qualification +- **WHEN** 已初始化 Rust 工作区反复执行原生 cargo-audit 检查,并对同一未核验漏洞库任务执行 `task verify` +- **THEN** 同一构建根只保留一张稳定的 CVE 覆盖阻塞任务,更新原生 advisory 观察与复检历史;`next` 继续给出原工具及漏洞库核验步骤,任务仍为 open。本地报告、任务勾选或白名单候选均不能替代受信漏洞库时效和批准身份 + +#### Scenario: Doctor report is imported twice or changes under the same identity +- **WHEN** 同一准备报告重复导入,或同一run_id出现不同摘要 +- **THEN** 相同报告幂等,不同摘要拒绝并保留冲突,不重复任务或覆盖证据 + +#### Scenario: Synchronization stops between event and cursor persistence +- **WHEN** 事件已写入但消费标记尚未持久化时中断 +- **THEN** 重试恢复同一事务,不漏事件、不重复计数;一份坏报告不妨碍其它有效报告持久化,整体仍明确未完成 + +#### Scenario: A crashed process leaves a staging file and its PID is reused +- **WHEN** `write_once` 的旧临时文件名已存在,但目标记录仍未写入 +- **THEN** 重试 MUST 以有界的新独占临时文件名继续,不覆盖或删除残留文件;若名字空间耗尽则明确未完成,不伪造消费标记 + +#### Scenario: A malformed report remains after other reports are imported +- **WHEN** 一份坏报告重复同步失败,而同队列的有效 lint 和 CVE 报告已导入 +- **THEN** 保留按报告摘要绑定的脱敏失败原因;`next` 指向修复该报告或检查器,不无限重复推荐未改变输入的 `work sync`;报告内容改变后旧失败观察不得继续适用,整体交付仍未评估 + +#### Scenario: Two processes import the same workspace +- **WHEN** 一个 `work sync` 已持有工作区导入锁,另一个进程尝试同步同一工作区 +- **THEN** 后者在写 finding、任务、事件或消费标记前返回未完成并说明忙碌;锁释放后重试幂等恢复,不凭本地锁状态签发质量结论 + ### Requirement: Closing a task SHALL require verified resolution evidence 正式 resolved MUST 由真实复检或有批准依据的 target_removed/policy_resolved 事件产生,并绑定问题、内容、规则/工具、策略和覆盖身份。代码修复、依赖修复、环境恢复、政策处置 MUST 分开归因。手工勾选、编辑状态、删除记录、增加忽略或未完成报告中不再出现 MUST NOT 关闭问题或改变 gate。例外 MUST 保留未解决事实。 @@ -46,11 +122,23 @@ Codeguard MUST 支持 `./codeguard/` 及其中的 .gitignore、工作区清单 - **WHEN** 新内容再次检出同一可匹配问题 - **THEN** 重开 issue 并保留此前修复历史 +#### Scenario: Verification resolves the original issue but finds another violation +- **WHEN** 原问题有完整关闭证据,而复检发现新的阻断问题 +- **THEN** 原任务可按证据关闭,新发现同步保留,验证命令仍按本次结果返回违规或未完成,不宣称全项目通过 + +#### Scenario: Environment detection succeeds but the blocked check still cannot run +- **WHEN** doctor已确认JDK等条件恢复,而原受阻义务仍不能完整执行 +- **THEN** task verify必须尝试原受阻义务并保留未完成,不据探测通过宣称验证闭环完成 + ### Requirement: Repair briefs SHALL guide bounded progress without changing authority +经可信批准的误报处置 MUST 是独立事件/任务状态 `whitelisted_false_positive`,不得记作 `resolved_by_code_fix` 或删除 finding。疑似误报任务 MUST 记录原生证据、最小复现、裁定原因、精确目标、批准请求和原工具复检命令;候选、过期、失配或撤销的白名单 MUST 重新进入调查/修复队列。`.codeguard/decisions/` 只保存可读引用,不自授策略权威。 + `status/next/task show` MUST 提供只读视图;next MUST 返回含依据、范围、步骤、约束、验证和历史尝试的 RepairBrief。recipe MUST 有受控来源,原生诊断和仓库文本 MUST 当作不可信数据。无进展重试超预算 MUST 阻塞该任务或请求具体决策,不能降低门禁;其它独立任务仍可推进。 -MUST 提供 attempt 开始/结束协议,受控 fix 自动登记,自由修复回合由插件登记;尝试 MUST 绑定动作和前后内容摘要、结果及租约。复检前失败、无修改和中断均进入历史与预算,next MUST 不重复推荐耗尽且无新信息的动作。 +next MUST 区分actionable/waiting/needs_decision/verification_required/no_applicable_work;未初始化应给初始化动作,空任务但缺少新鲜完整证据 MUST 返回verification_required,不把null task或查询exit0解释为allow。status 中历史通过 MUST 带来源及freshness,不冒充当前认证。 + +MUST 提供 attempt 开始/结束协议,受控 fix apply 自动登记,自由修复回合由插件登记;尝试 MUST 绑定动作和前后内容摘要、结果及租约。复检前失败、无修改和中断均进入历史与预算,next MUST 不重复推荐耗尽且无新信息的动作。 #### Scenario: The same failed patch is attempted repeatedly - **WHEN** 同一问题和补丁连续无进展达到预算 @@ -64,6 +152,10 @@ MUST 提供 attempt 开始/结束协议,受控 fix 自动登记,自由修复 - **WHEN** 尝试没有代码变化或在调用检查器前失败 - **THEN** attempt 仍持久计数,不能因没有 verify 报告而无限重复 +#### Scenario: Task list is empty but current full verification is absent +- **WHEN** next没有可修复任务且缺新鲜完整检查证据 +- **THEN** 返回verification_required和检查动作,不据任务清空证明交付通过 + ### Requirement: Enabled plugin workflows SHALL connect scans to actionable briefs 显式初始化并启用工作流后,插件扫描 MUST 经过保存 run、幂等 sync、返回状态/RepairBrief 的路径;仅有重复报错而没有任务指引 MUST 不作为完成的插件接入。未初始化时 MUST 提供临时简报与初始化计划,不静默写受管目录。同步失败 MUST 保留原结果并明示恢复动作;不能假称持久任务已生成或改变质量 gate。 @@ -76,10 +168,24 @@ MUST 提供 attempt 开始/结束协议,受控 fix 自动登记,自由修复 - **WHEN** 检查已完成但持久目录不可写 - **THEN** 保留原 finding/gate,说明 backlog_update_failed 和恢复动作,不伪造任务路径 +### Requirement: Check results SHALL be returned in the agent conversation + +插件触发检查后 MUST 把本次配置探测与原生执行结果转换为宿主可见的对话反馈,包含已配置并运行的检查器、未配置或无效的检查器、确定性诊断、环境/工具错误、修复建议和复检命令。对话反馈以本次 CLI 结果为来源,不要求另造逐检测族执行证明;持久同步失败时也 MUST 返回已有结果与同步失败状态。CLI human/JSON、MCP 与宿主 Hook 只做展示适配,不得让智能体将原始工具文本解释为新的授权指令。 + +#### Scenario: Configured checker finds an issue +- **WHEN** 已配置的 Javadoc 或 CVE 原生检查器返回有效诊断 +- **THEN** 智能体对话显示问题摘要、位置或组件、规则依据、建议动作及原工具复检命令 + +#### Scenario: Checker is not configured +- **WHEN** 项目没有配置某候选检查器 +- **THEN** 对话显示 `missing` 和具体启用建议,不显示该检查器“通过”或虚构源码违规;只有批准策略要求该检查时才把缺项作为门禁未完成 + ### Requirement: Workflow persistence SHALL preserve collaboration and gate independence finding 身份、事件父关系、证据引用与工作区 schema MUST 校验。并发领取 MUST 使用带期限租约和进程锁;不同分支状态冲突 MUST 显式协调,不能最后写入覆盖关闭。任务 Markdown MUST 是可重建投影;本地历史文件 MUST 不作为可信 CI 认证。完整 gate MUST 独立检查全部义务。 +claim MUST 返回不可复用lease_token/generation和到期;heartbeat/release及attempt写入 MUST 核对token,而非只比较owner。租约默认5分钟,长操作MUST有界续租,失租停止应用/状态提交。正常release MUST 不遗弃未结束attempt;过期接管 MUST 先可恢复地追加abandoned与预算记录,再授予新generation,恢复失败不先取得新租约。无租约task verify使用短期验证租约,已有租约要求调用方提供匹配token,不能释放别人取得的租约。 + #### Scenario: All tasks are deleted - **WHEN** 用户或智能体删除持久任务和发现 - **THEN** 新检查仍按源码与批准策略产生发现,不能因此获得 allow @@ -91,3 +197,231 @@ finding 身份、事件父关系、证据引用与工作区 schema MUST 校验 #### Scenario: Branches disagree on resolution - **WHEN** 合并事件存在相互矛盾的关闭状态 - **THEN** 标记 reconciliation_required 并重新核对,不能自动选最后写入关闭 + +#### Scenario: An old owner writes after the task has been reclaimed +- **WHEN** 新generation的租约已生效,旧执行者尝试heartbeat/finish/release +- **THEN** 返回未完成并拒绝旧写入,同名owner也不能复活或释放新租约 + +#### Scenario: Reclaim cannot persist the abandoned attempt +- **WHEN** 过期租约的abandoned事件或预算记录写入失败 +- **THEN** 返回3且不授予新generation,成功重试只追加一次恢复事件并计数一次 + +#### Scenario: Verification owns or borrows a lease +- **WHEN** verify自行取得验证租约、携带有效调用方租约,或提供错误token +- **THEN** 自有租约收尾释放、借用租约保留;token错误时不启动检查器 + +### Requirement: Repair command handoffs SHALL bind attempts and leases explicitly + +attempt start MUST 接受来自受控简报的action-id并由CLI计算动作指纹、观察前置内容,返回attempt_id;finish新增结束事件 MUST 明确attempt-id及当前lease-token,记录观察变化与执行者说明,冲突结束拒绝,同结果重放幂等。已落盘结束收据的原请求重放只返回该收据,即便租约过期也不得再次写入或影响新租约。每任务只允许一个未结束attempt;换action名称不重置同一无进展动作预算。finish结果仅允许ready-to-verify/no-change/failed/blocked,不直接resolved。 + +fix MUST 支持task及成对owner/lease-token绑定;已领取任务复用有效租约,由FixService登记自己的受控attempt,不接管已有未结束自由attempt。未领取时可自行取得并仅释放自有租约。已初始化工作区的批量apply在补丁应用前取得全部受影响任务租约,冲突不能静默跳过;未初始化时只保留私有证据,不调用持久同步/租约,不声称持久任务存在。fix dry-run MUST 不登记正式修复尝试或消耗预算;apply自动登记,插件不得重复计数。 + +#### Scenario: Controlled fix is invoked for an already claimed task +- **WHEN** fix接收task、owner及有效lease-token,且没有未结束attempt +- **THEN** 限定任务范围并登记受控尝试和复检,保留调用方租约,不要求插件重复start/finish + +#### Scenario: The same attempt finish is retried +- **WHEN** 先前finish已持久化但响应丢失后调用方用同ID和结果重试 +- **THEN** 返回已记录结果而不重复预算/事件;不同结果的重复结束返回冲突 + +### Requirement: Explicit Checkstyle workspace observations SHALL generate stable local repair tasks +显式提供已初始化的 --workspace 时,Checkstyle 局部检查 SHALL 绑定项目内源文件、原配置和本轮工具字节后保存观察并同步同一稳定任务。输出必须反馈同步结果和下一步;未完成检查不得生成源码修复任务,局部任务不得授予交付许可或自动关闭。 + +#### Scenario: Repeated native observation +- **WHEN** 同一项目内源码的相同规则和锚点在重复原生检查中仍存在 +- **THEN** 更新同一稳定 finding 的观察记录,不重复创建任务;任务包含规则、证据、范围、步骤、复检、历史和关闭条件 + +#### Scenario: Workspace or frozen inputs mismatch +- **WHEN** 指定工作台未初始化、目标在项目外,或同步前源文件/原配置/工具字节变化 +- **THEN** 不导入源码任务,并在反馈中指出具体阻塞;不能用陈旧观察要求修改源码 + +### Requirement: Checkstyle task verification SHALL replay the original native checker without automatic closure +Checkstyle 任务复检 SHALL 在统一预算、取消和任务租约下使用显式原工具与原配置,保存原生观察及失败尝试。零诊断不能独自证明修复;规则失配、工具身份变化或输入不稳定不能关闭任务。 + +#### Scenario: Original finding still exists or becomes absent +- **WHEN** 原工具完整复检仍检出同一稳定 finding,或在原规则身份仍相同且工具字节一致时未再检出 +- **THEN** 分别记录 still_present 或 candidate_absent_unverified_policy,保留 open 任务和历史,对话与 next 提供下一步 + +#### Scenario: Rule removed or checker changed +- **WHEN** 原配置移除任务对应规则、将同一 ID 绑定到另一检查类,或显式工具字节与原观察不同 +- **THEN** 返回规则覆盖待审或未完成,不把零诊断归为代码修复 + +#### Scenario: Native recheck cannot run +- **WHEN** 缺工具、输入不可用或原生检查未完成 +- **THEN** 保存未完成复检事件与具体原因,不从可编辑 Markdown 执行指令,不关闭任务 + +### Requirement: Checkstyle preparation failures SHALL create stable environment tasks +已初始化且显式启用工作台时,Checkstyle 前置缺失或配置不明 SHALL 形成准备任务,保留具体诊断和当前输入范围;不能生成源码违规或建议修改无关源码。同一工作区的 Checkstyle 前置槽位重复观察更新同一任务,不因诊断变化重置历史。 + +#### Scenario: Native prerequisites are missing +- **WHEN** Java、Checkstyle JAR 或原配置无法确认,且目标仍在指定工作区内 +- **THEN** 同步一个开放准备任务,next 给出恢复工具/配置与原工具复扫步骤,任务包含七项必需信息且不声称质量通过 + +#### Scenario: Repeated preparation changes diagnosis +- **WHEN** 相同前置槽位从缺参数变成缺 JAR 或未知配置,或影响另一源文件 +- **THEN** 保留同一稳定任务及历史,更新当前诊断与范围;人工勾选不能关闭任务 + +#### Scenario: Cancelled request or outside target +- **WHEN** 用户取消检查,或目标不属于指定工作区 +- **THEN** 不把取消或外部目标伪装成项目环境缺陷,不创建该准备任务 + +#### Scenario: Later same-scope native observation runs +- **WHEN** 准备失败后,同一源码范围存在更晚且已消费、输入仍一致的原工具局部观察 +- **THEN** next 转向核对原选择及批准覆盖,不重复建议恢复工具;仍保留开放任务,后续配置或输入变化使该恢复线索失效 + +### Requirement: Checkstyle preparation verification SHALL preserve the original blocked obligation +准备任务复检 SHALL 在既有租约、尝试和统一预算中使用显式原工具,对当前记录的项目内受影响源码复扫。恢复后产生的原生 finding 应进入源码任务,环境恢复只作局部未验证观察,不自动关闭准备任务。 + +#### Scenario: Preparation remains blocked +- **WHEN** 原工具或配置仍不可用,准备任务接受一次复检 +- **THEN** 保存 still_blocked 或 incomplete 观察、具体原因与尝试引用,保留 open 状态,next 不引导修改无关源码 + +#### Scenario: Native preparation recheck runs +- **WHEN** 同一准备任务范围的显式 Checkstyle 检查正常返回局部原生报告 +- **THEN** 保存 environment_restored_unverified_policy,同步其中源码发现,并转向核验原选择、批准和完整覆盖;源码或配置再次变化不沿用恢复线索 + +#### Scenario: Ownership is invalid +- **WHEN** 任务有活动租约但复检者不持正确 owner/token +- **THEN** 不启动原生检查或保存恢复事件,保留原任务和租约 + +#### Scenario: Preparation retry remains blocked after a ready attempt +- **WHEN** 准备修复尝试已标记 ready-to-verify,原工具复检仍为 still_blocked 或 incomplete +- **THEN** 将复检绑定该尝试并累计同动作同输入的无进展次数;预算内恢复具体前置修复动作,预算耗尽后保留开放任务并要求具体诊断或决策,不能反复复检或更换动作名逃逸预算 + +#### Scenario: Inputs change after an attempt is finished +- **WHEN** 一次尝试已经标记 ready-to-verify,但在原工具复检前,任务绑定的源码、清单或锁文件又发生变化 +- **THEN** 新输入的复检不得归因于旧尝试;旧事件保留为历史,旧尝试不再阻塞新输入的动作,且不得用新结果重置旧输入的失败次数或宣称原修复成功 + +#### Scenario: Checkstyle tool changes after a recovery observation +- **WHEN** 准备恢复或源码暂未检出的复检后,原 Java 或 Checkstyle JAR 字节变化、路径身份变化或文件不可用 +- **THEN** next 与 task show 不沿用旧恢复或缺失结论,要求显式原工具重新复检;历史收据继续保留,不能通过旧恢复线索关闭任务 + +#### Scenario: Conversation consumers need a concrete invalidation reason +- **WHEN** 已有 Checkstyle 复检收据因本轮源码、配置或工具变化失效,或前置复检仍受阻 +- **THEN** next/task show 将历史原工具原因与当前观察失效原因分开表达,status 任务摘要保留具体原因与失效原因;智能体无需猜测为何需要再次修复或复检,也不能把查询成功当成交付通过 + +#### Scenario: Present Checkstyle finding is stale after a configuration edit +- **WHEN** 原工具复检仍检出原问题,之后 Checkstyle 配置或目标源码变化 +- **THEN** next/task show 显示当前输入失效原因,要求原工具重新复检;不能用旧 still_present 覆盖先前的失效判断并重新推荐旧源码修复步骤。历史原工具结果保留,任务不关闭 + +### Requirement: ESLint task identity SHALL bind native rule and stable source anchor + +ESLint 原生发现投影 MUST 使用工作区相对路径、原生规则、源码锚点及稳定出现序号,行号与整文件摘要只作本轮证据,不因插入空行而制造新任务身份。MUST 稳定排序并去除重复原生诊断;完整输入中的任一归属或定位无效则不得发布部分源码任务。源码定位 MUST 处理 UTF-16 列及 JavaScript 原生行终止符,不把字节长度当列范围。投影只记录脱敏诊断,不证明本轮报告来源、批准策略或问题关闭。 + +#### Scenario: Source moves by inserted blank lines or native wording changes +- **WHEN** 同一路径与规则的原源码锚点保持,行号或原生消息文字变化 +- **THEN** 稳定finding ID保持,当前行号及源码摘要更新,不把旧任务勾选当修复 + +#### Scenario: Native diagnostic order changes or includes duplicates +- **WHEN** 同轮报告乱序或重复同一原生诊断,或同一锚点在多个位置出现 +- **THEN** 排序与去重后身份确定,不同出现序号保持不同身份,报告顺序不制造额外任务 + +#### Scenario: One diagnostic has invalid scope or Unicode location +- **WHEN** 任一诊断不属于冻结原生文件、相对路径跳转、行越界或列超过原行UTF-16范围 +- **THEN** 拒绝整组任务投影,保持未完成并要求原工具或适配器核查,不生成部分源码修复任务 + +### Requirement: ESLint local observations SHALL feed stable repair records + +显式 `lint typescript --workspace` MUST 将当前输入复核后的脱敏局部观察入队并通过既有同步协议生成稳定 finding 与可读任务,重复扫描更新同一问题历史,不覆盖用户任务备注。报告 MUST 固定工作区、输入、原工作目录、版本及未批准状态;坏形状、输入变化、自称门禁允许或不正确投影不得导入。已消费历史 MUST 按原字节收据确认,不用当前源码重演旧观察。公开反馈 MUST 说明同步状态和 next 查询失败,不把队列异常说成源码违规。 + +`next` MUST 依据摘要绑定的当前已消费报告复核输入及首次工具/配置连续性;上下文改变、抑制、原生未完成或局部零诊断均须复检/核查,不能沿用旧源码修改指引。任务勾选不改变问题状态;当前没有正式关闭入口时保持开放。此局部闭环不证明完整源集、TS插件闭包或质量门禁。 + +#### Scenario: Repeated ESLint scans find the same native problem +- **WHEN** 本轮输入有效,同一稳定规则/源码锚点被重复检查,用户修改了任务备注或勾选文字 +- **THEN** 只保留一个稳定finding/任务,更新观察并保留用户文本,问题仍open且对话返回修复指引 + +#### Scenario: ESLint reports no current diagnostic after a repair +- **WHEN** 同工具/原配置复扫有效且本轮局部零诊断 +- **THEN** next要求覆盖和正式复检核查,不重复旧源码修复、不自行关闭任务或签发门禁 + +#### Scenario: A queued ESLint report self-authorizes or current configuration changes +- **WHEN** 新报告声称delivery_decision=allow,或next查询时当前输入与记录不一致 +- **THEN** 自授权报告导入失败且不增加源码任务;陈旧输入要求原工具复扫,不沿用旧修复步骤 +- **AND** ESLint 上下文失效的备用复检指引仍选择 ESLint 命令并显式要求核验工具、原配置和原工作目录,不回退其它语言检查器或猜测身份 + +### Requirement: ESLint incomplete prerequisites SHALL create investigation tasks + +显式工作区和当前有效源码目标下,缺调用上下文、工具或输入不可读、版本/报告/配置诊断等未完成结果 MUST 进入独立的环境与检查完整性任务;不得生成已确认源码违规或白名单批准。目标身份 MUST 固定工作区与具体源码范围,重复诊断更新同一稳定任务及脱敏历史。取消、外部目标、不支持范围或未初始化工作区不得伪造任务保存成功。解析或抑制诊断 MUST 指引复现根因,不默认认定环境或源码的唯一原因。 + +任务指引 MUST 依据最新摘要绑定的已消费报告及当前源码核验;同范围有较新的有效原工具观察时转为正式复检/覆盖核查,不继续要求修复旧环境诊断。局部恢复不得自行关闭准备任务。对话 human/JSON MUST 展示任务下一步和同步失败状态。 + +#### Scenario: Missing ESLint context repeats or another prerequisite fails +- **WHEN** 同一工作区源码缺Node/ESLint上下文,重复调用或后续诊断变为工具输入不可读 +- **THEN** 只保留一张环境任务,记录最新具体原因;不创建源码finding,不要求修改无关源码 + +#### Scenario: ESLint prerequisites recover locally +- **WHEN** 同范围较新的摘要绑定原工具报告已同步且当前输入有效 +- **THEN** 环境任务保持open,next转verification_required并要求核验当前结果与完整覆盖,不继续沿用旧故障诊断 + +#### Scenario: Native ESLint rejects an unknown configured rule +- **WHEN** 原ESLint因原配置引用不存在规则而无法完成正常报告 +- **THEN** 建立检查完整性任务,反馈当前失败原因及原配置复核指引;不能推导源码违规或质量通过 + +#### Scenario: Preparation target is outside the workspace +- **WHEN** 未完成请求的源码属于另一个工作区 +- **THEN** 返回source_outside_workspace且不创建本工作区环境任务或源码finding + +### Requirement: ESLint task verification SHALL retain native observations + +`task verify` MUST 支持ESLint源码任务与准备任务,复用已有租约、统一执行截止时间、同步及失败尝试预算。工具入口、具体版本、原配置和工作目录 MUST 由显式参数核验,不能执行任务Markdown或历史报告自动选择的程序。复检 MUST 固定任务目标、本轮输入及报告摘要;缺上下文也须明确未完成原因并保留开放状态,不能调用其它语言检查器。 + +源码任务 MUST 比较首次摘要绑定观察的Node、ESLint入口、原配置、版本和cwd连续性;变化只能要求规则/覆盖核查。原生抑制或失败不得作为修复完成。局部原问题消失只属于candidate_absent_unverified_policy;准备恢复只属于environment_restored_unverified_policy,均不自动关闭。next、status及尝试历史 MUST 能消费同一复检事件,较新复检不得被旧扫描覆盖为过期源码修复指引。 + +#### Scenario: ESLint task is verified without explicit native context +- **WHEN** 原任务有效但没有提供Node、ESLint入口、具体版本、原配置和cwd +- **THEN** 保存明确未完成的局部复检观察和开放事件,不执行默认工具、不签发修复完成 + +#### Scenario: ESLint native task remains or disappears after repair +- **WHEN** 显式原工具与原配置复扫正确完成,原稳定任务仍存在或已局部消失 +- **THEN** 分别记录still_present或candidate_absent_unverified_policy,保留任务开放;事件可被next和尝试预算一致读取 + +#### Scenario: ESLint original context changed or a task is suppressed +- **WHEN** 工具/原配置/cwd与首次观察不同,或原生报告显示注释抑制 +- **THEN** 要求规则覆盖核查或抑制复核,不能将零诊断记为resolved + +### Requirement: npm local audit observations SHALL enter persistent coverage repair tasks + +初始化工作区根中的显式npm公开CVE调用 MUST 保存脱敏观察,并通过现有同步器产生稳定CVE检查完整性任务。原生组件/advisory/锁版本观察 MUST 保留为未核验的报告信息,不转换成已确认源码漏洞、白名单批准或任务关闭。同一构建根的完整性义务保持单一稳定任务,具体执行诊断作为历史更新;原清单/锁摘要及节点归属须复核。重复字段、越界/未知结构、节点或版本冲突及已消费报告被篡改不得产生授权或新任务。当前局部任务可供next取得恢复环境、核对数据源与原工具复检步骤;尚未取得覆盖权威时零发现不能关闭。 + +#### Scenario: Repeated npm audit produces one persistent task +- **WHEN** 已初始化根重复运行同一原生npm局部审计 +- **THEN** 第一次保存报告与一张稳定任务,后续更新历史;next提供原npm复检指引,清单/锁身份不符或坏报告不产生新可信事实 + +#### Scenario: Local npm audit cannot confirm CVE closure +- **WHEN** 原生npm报告零发现但数据库覆盖未核验 +- **THEN** 稳定任务仍open、交付未判定;手动删除任务或白名单候选不能关闭CVE义务 + + +#### Scenario: npm execution context is missing before native startup +- **WHEN** 已初始化物理工作区中的 npm 构建根具有可读取且身份可绑定的清单和锁文件,但公开 CVE 调用、显式选择 npm 的 check all 或 task verify 缺少原生调用参数 +- **THEN** MUST 保存本地准备阻塞观察并关联同一稳定 npm 完整性任务;重复检查与补齐上下文后的原生报告不得产生另一张同义务任务。准备观察 MUST 标明 npm_execution_context_missing、零组件及空 advisory,不声称原生工具已启动、漏洞覆盖完整或源码存在漏洞;失败复检保留 incomplete 历史。未初始化、输入变化、路径别名、取消和预算耗尽不得制造可用证据 + + +#### Scenario: npm lockfile is absent before tool startup +- **WHEN** 已初始化物理工作区的 npm 构建根具有可绑定清单,操作系统明确报告 package-lock.json 不存在 +- **THEN** MUST 在启动原生工具前保留 npm_lock_missing 环境阻塞,使用明确 missing 状态及空锁摘要、零组件和空 advisory,不虚构锁文件内容。公开CVE、显式选择npm的check all及task verify沿用同一稳定完整性任务;补齐锁后旧缺锁观察失效,新扫描不增加同义务任务。链接、目录或不可读文件不得伪装为不存在;重放缺锁报告、未知协议或矛盾字段不得生成当前可用证据 + + +#### Scenario: npm manifest is malformed before tool startup +- **WHEN** 初始化工作区中可绑定的package.json存在JSON语法错误、重复字段或非法scripts类型 +- **THEN** 即使提供完整原生参数,MUST 在启动npm前保存配置阻塞、给出清单修复指引并沿用稳定完整性任务,不把错误改称版本失败或源码漏洞。已有可绑定锁文件时,准备观察以npm_manifest_invalid或npm_scripts_invalid表达诊断且保持零组件/空advisory;缺锁同时存在时保留明确缺锁观察及配置错误反馈。清单变化后旧收据不得解释当前输入;报告声称清单损坏时,消费者MUST 与当前绑定字节的配置解析结论核对,不能只信诊断字段 + + +#### Scenario: Default full check discovers npm roots without explicit tools +- **WHEN** 已初始化工作区运行check all且发现可绑定的npm根,但未提供Node/npm及配置参数 +- **THEN** 支持的平台MUST 自动将每根接入准备任务并串行同步,反馈稳定任务与next,重复检查不堆积任务;未启动原生命令,不继承工具环境或凭据,不安装工具。未初始化项目不得隐式创建工作区;check java不得触发npm准备。真实原生参数恢复后继续复用同一任务,仍须独立核验完整CVE覆盖 + + +#### Scenario: npm manifest or lock becomes unavailable during remediation +- **WHEN** 已初始化物理工作区的明确npm任务或公开CVE范围中,清单/锁不存在、非普通文件、路径别名或无法有界读取 +- **THEN** MUST 保存独立输入状态准备观察,缺失与不可用分开;只有可读普通文件有内容摘要,其余摘要为null,零组件/空advisory。消费方必须先严格核对结构及状态对应的原因,再核对当前物理范围、状态与可读内容;损坏字段不能被当作陈旧证据静默沿用。同一完整性义务跨状态修复复用任务,输入恢复后旧观察失效;尝试指纹可记录环境状态但不能冒充源码摘要或关闭证据,next和失败复检历史不得因目录/不可读输入而不可用 + + +#### Scenario: npm manifest disappears from a known initialization profile +- **WHEN** 默认全项目检查不再发现初始化画像中曾记录的npm清单,但物理构建目录仍存在 +- **THEN** MAY 用与该工作区受管摘要一致且严格解析的旧画像恢复准备范围;MUST 核对相对路径、画像标记、当前物理归属及输入不可用状态,只生成本轮准备观察,不用历史摘要或配置启动原工具。画像不可读、摘要不符、结构或路径无效时MUST 明示历史范围未完成并保留当前发现的其它根;恢复清单后须通过当前发现重新绑定,稳定任务不重复,历史画像不构成覆盖或批准 + + +#### Scenario: Profile refresh cannot erase recorded npm remediation scope +- **WHEN** 当前画像刷新后不再包含清单不可用的npm根,但本工作区仍有同一稳定完整性问题的本地事实记录 +- **THEN** 默认check all MUST 保留该物理构建根的准备范围;严格核验工作区、检查器、稳定身份、范围和事实结构,不能由可编辑任务附件的勾选或删除消除检查。事实只提供本地未验证范围线索,不授权原生执行、批准、关闭或覆盖;当前清单恢复后重新发现。损坏或跨工作区记录 MUST 明示范围恢复未完成,不扩展到越界路径或吞掉当前发现的其它根 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md index b0347a4..9ec94fa 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md @@ -8,6 +8,8 @@ 必需检查、规则、阈值、排除、测试要求及漏洞库时效 MUST 来源于批准策略。CLI/env 运行参数 MUST NOT 弱化它们;同一 PR 的策略修改 MUST NOT 在未经批准时为自身代码签发通过。config explain MUST 显示原生配置及 suppression 的有效来源和差异。 +项目可写的质量策略候选 MAY 经严格 schema 与内部引用校验,但即使其工具锁字节摘要匹配,也 MUST 仅作为未获信任的待审输入;候选的必需检查、阈值或排除 MUST NOT 变成有效门禁。候选源码排除至少绑定精确仓库相对文件路径、文件内容摘要、原因和期限,不得以通配、目录或本地 `approved` 字段扩大范围。正式批准来源与基线修订须由独立信任边界核验。 + #### Scenario: Agent raises the severity threshold - **WHEN** 智能体通过参数、环境或本地配置把批准阈值提高 - **THEN** 新交付门禁不接受该弱化,记录策略差异而非通过 @@ -16,10 +18,28 @@ - **WHEN** 原生配置改为禁用必需规则或以自定义空命令替代 - **THEN** 覆盖校验不能满足义务,不以命令成功通过 +#### Scenario: A local policy candidate matches a local tool lock +- **WHEN** 项目提供结构正确的策略候选,且其摘要恰好匹配同一工作树的工具锁 +- **THEN** config 只能报告本地引用相符及批准来源未核验,不生成有效策略、白名单授权或交付通过 + ### Requirement: Rulepacks and toolchains SHALL be versioned and locked rulepack MUST 有版本、规则来源/许可、稳定规则映射、内容摘要及工具兼容范围。检查 MUST 验证工具/运行时/配置/规则锁;扫描 MUST NOT 隐式安装、升级或改写项目配置。安装 MUST 是单独显式动作,离线检查 MUST 不联网。 +`rules list [path]` MUST 复用当前项目发现和版本化规则映射,分别展示检查器静态配置状态、已知候选映射及尚缺的规则目录。候选映射 MUST 保留来源、许可、内容摘要与兼容版本,不得因为项目存在配置文件就声称具体规则已启用、已执行或获批准。目录尚不完整时 MUST 返回未完成和下一步,不把空规则列表解释为项目无需检查。命令 MUST 只读,不执行项目脚本或原生检查;项目可写的同名规则包、白名单或批准字段不得替换内置清单或取得授权。 + +#### Scenario: A configured checker has only candidate rule mappings +- **WHEN** Python 项目具有静态可识别 Ruff 配置,规则目录只有未批准 F401/E501 映射 +- **THEN** rules list 分别展示配置声明及带来源/摘要的候选映射,逐规则启用和执行状态仍未核验,返回未完成而不是生效规则集合或质量通过 + +#### Scenario: Project rule files claim approval or contain executable configuration +- **WHEN** 项目写入同名规则包或自批字段,并在动态配置中放入副作用脚本 +- **THEN** rules list 只复用静态发现,不运行脚本,不用项目文件替换内置规则映射,不生成批准或门禁效果 + +#### Scenario: A requested language has no complete native rule catalog +- **WHEN** rules list 请求已登记但尚无完整规则目录的语言,或 all 中包含该语言 +- **THEN** 返回该语言及各检测类别的目录缺口和准备动作,不把没有映射视为没有规则或已经通过 + #### Scenario: Tool version differs from the lock - **WHEN** PATH 工具与锁不匹配 - **THEN** 未完成并给出准备动作,不自动下载 latest @@ -44,6 +64,14 @@ rulepack MUST 有版本、规则来源/许可、稳定规则映射、内容摘 - **WHEN** 经批准例外超过有效期或不匹配当前范围 - **THEN** 不应用该例外,保留完整门禁要求 +#### Scenario: An old approval is reused after the frozen policy changes +- **WHEN** 白名单处置引用旧策略修订,但宿主冻结的当前修订不同、缺失或无效 +- **THEN** 不应用该处置,保留活动阻断及未完成;不能以处置中自写的修订作为当前策略来源 + +#### Scenario: Approval expires while a check is running +- **WHEN** 发现取证时批准仍有效,但最终门禁的可信时刻已达到到期边界,或最终时钟缺失/为零/早于取证时刻 +- **THEN** 不应用白名单,保留活动阻断并返回未完成;MUST 使用最终门禁时刻而非扫描开始时刻,不能重放旧 observed_at 维持过期豁免 + #### Scenario: Expiry is absent or content changes - **WHEN** 例外没有到期时间或当前内容不匹配获批身份 - **THEN** 拒绝应用例外,不能沿用此前批准关闭问题 @@ -55,3 +83,141 @@ rulepack MUST 有版本、规则来源/许可、稳定规则映射、内容摘 #### Scenario: Dot configuration and secret coexist - **WHEN** 项目含点前缀 linter 配置、普通点前缀源码和拟入库 `.env` - **THEN** 配置仍发现、普通源码按策略忽略、入库安全照常运行,三者不混为同一排除 + +### Requirement: False-positive allowlists SHALL be exact, authorized dispositions + +误报白名单 MUST 仅处置经原生工具复现、人工裁定的精确 finding;MUST 保留原始 finding、规则依据、复检命令和批准引用。条目 MUST 绑定原生检查器/规则/类别、目标和内容身份、finding 指纹、工具/适配器/rulepack 身份、误报依据、可信策略修订及有限期限。源码目标按仓库相对路径与本次文件字节摘要匹配;依赖目标按组件、解析版本、依赖图及 advisory 身份匹配。首版 MUST NOT 允许通配符、正则、整目录或整条规则豁免。重复性规则误报应通过经批准的 rulepack 或项目策略修订及正反例解决。 + +匹配 MUST 发生在原生结果解析、路径归属、内容和覆盖复核之后。缺字段、失配、过期、冲突或未获独立批准的条目 MUST NOT 放行;可信来源不可验证时相关策略义务为 incomplete。`false_positive` MUST 与仍然真实存在但被批准接受的 `accepted_risk` 分开。工具故障、坏报告、原生 suppression、未配置必需检查和覆盖不足 MUST NOT 被白名单处置。 + +白名单 MUST 作为 finding 的处置层实现,不得作为扫描排除、原生命令 suppression 或“无发现”的证明。对系统性误报,MUST 优先定位原生规则、适配器或项目策略的根因,并通过受保护 rulepack/策略修订及正反例回归纠正;不得自动把多个精确条目提升成规则级白名单。误判纠正、驳回、批准、过期、撤销和身份失配 MUST 保留历史事件并关联原稳定 finding/任务;手动修改任务状态不改变门禁。评测 MUST 保留白名单前的原始发现及人工裁定,不得用增加白名单掩盖误报率或漏报率。 + +配置外扫描属于适配器/配置归属错误,MUST 在 finding 生成前纠正;例如项目只启用 P3C naming 规则,却因隔离探针模板额外加载 comment 规则,额外诊断不得进入该项目 finding/白名单申请。若项目生效规则集尚不能确认,义务保持 incomplete,不得把多扫的诊断交由白名单逐条抵消。 + +#### Scenario: A Rust CVE observation has an unverified advisory database +- **WHEN** cargo-audit 的 advisory 与本轮 Cargo.lock 包身份一致,但 RustSec 数据库来源或时效未经可信边界核验,且项目提供自写的精确白名单条目 +- **THEN** 原始 advisory 和未完成原因仍反馈到对话,条目只作为待审线索,不命中有效例外、不关闭任务或给出交付通过 + +`rules whitelist propose` MUST 从本次原生报告及内容复核取得完整 finding、工具制品、适配器和 rulepack 身份,再生成可评审候选;不得用历史任务的首次观察、版本字符串、当前文件名或占位摘要补造缺失身份。若这些证据不全,MUST 返回未完成及逐项补证据/原工具复检动作,不写可批准候选,不改变现有门禁。 + +当调用者显式指定当前原生工具路径时,候选预览 MUST 只读核对该普通文件的字节摘要与扫描报告所记工具摘要;无法读取或不一致时 MUST 隐去旧观察并要求原工具复扫。该复核本身不证明工具获批准,也不把尚缺的规则包、策略或独立裁定身份补齐。 + +白名单纠错 MUST 关联原稳定 finding、原决策与修订链。已批准决策不可原地改写;更正时 MUST 保留撤销事件,生成引用旧决策的新候选,并由独立批准边界在同一可信策略修订中固定撤销与新增集合。新候选未获批准、旧决策已撤销或修订链冲突时 MUST NOT 凭任一条目放行。`rules whitelist explain` MUST 说明脱敏的匹配/失配字段、批准状态和下一步;智能体提出误报或修订候选不等于批准,不能把改任务文本或本地决策文件当成纠错完成。 + +纠错输入 MUST 指明原决策 ID、同一稳定 finding ID、结构化纠错原因(误批、范围过宽、证据失效、根因已修复之一)及本轮原工具复检引用;替代候选还 MUST 具有新的决策 ID、`replaces_decision_id` 和完整精确身份。只撤销而不替代时不得虚构新候选。CLI MUST 返回可审阅的撤销/替代提案和受影响 finding 列表,但提案写入 `codeguard/decisions/` 不得自行生效。受保护发布边界 MUST 校验旧决策存在、引用链无环、撤销与新增集合原子发布,并拒绝旧新条目同时命中或替代候选扩大到其它目标。无法完成复检或权威校验时 MUST 保留原任务为待处理/未完成,不得将白名单修订写成代码修复。 + +#### Scenario: Exact approved false positive is found again +- **WHEN** 同一原生工具、规则、目标内容及策略身份产生同一 finding,且误报裁定仍有效 +- **THEN** 仅该 finding 标记 whitelisted_false_positive,保留原始证据和批准引用,同文件其它 finding 照常判定 + +#### Scenario: A similar finding has different identity +- **WHEN** 相同规则发生在另一文件、文件字节变化、依赖版本/图/advisory 改变或工具语义版本变化 +- **THEN** 原条目不匹配,新 finding 继续接受正常门禁 + +#### Scenario: Disposition identity disagrees with its native finding +- **WHEN** 待应用白名单的完整观察身份与裁定一致,但原生 finding 来自不同工具、不同主目标或依赖版本,或缺少可核对的主定位 +- **THEN** 门禁保留原始阻断并返回未完成;可信宿主必须显式固定 checker/tool/category/obligation 映射,缺映射、冲突映射或未知映射不得按名称后缀猜测。源码/项目主定位核对精确路径,依赖主定位核对精确组件及非缺省版本;不能借次要位置放过主目标不同的发现 + +#### Scenario: A matching approval is paired with a stale native finding identity +- **WHEN** 裁定与其附带的观察身份相同,但本轮原生 finding 缺少独立冻结的完整身份,或该身份中的源码字节、发现指纹、工具/适配器/rulepack 摘要、依赖图或 advisory 与裁定不同 +- **THEN** 保留原始及活动阻断并返回未完成;历史报告缺该字段也不得借旧批准放行。宿主仍须从本轮原工具与内容复核取得该身份,项目可写字段本身不能证明来源可信 + +#### Scenario: Conflicting dispositions arrive in a different order +- **WHEN** 同一 finding 有多条处置,或同一批准决策 ID 被复用于不同 finding,且输入顺序改变 +- **THEN** 门禁在应用前识别全部冲突,保留相关活动阻断,不将任一条先到处置标为 whitelisted;两种顺序产生相同未完成结论与发现集合 + +#### Scenario: Candidate decisions reuse a finding ID with different targets +- **WHEN** 两条白名单候选使用同一稳定 finding ID,但指向不同源码路径、内容或依赖目标 +- **THEN** `rules whitelist list/explain` 将两条都标记为冲突,`explain` 不返回单条身份匹配结论;最终门禁也不得从冲突候选中选择有利于放行的一条 + +#### Scenario: An approved identity is attached to an invalid obligation ledger +- **WHEN** 原生发现的义务归属与所在结果不一致、所在义务未知/无效,或该义务覆盖集合失配 +- **THEN** 不应用该发现的白名单处置,即使观察与裁定身份及检查器映射一致;保留原始/活动阻断并返回未完成 + +#### Scenario: Ruff configuration changes after original checker verification +- **WHEN** 复检后的 Ruff 配置内容变化、配置优先级变化,或旧报告缺少可核对的当前配置身份 +- **THEN** next 要求重新运行原工具,不沿用旧纠错事件或附件;纠错提案返回 verification_required 而不记录新提案,普通误报提案不展示旧观察为当前证据。源码不变、旧配置字节不变也不能抵消高优先级配置切换 + +#### Scenario: The Rust adapter binary changes after a Ruff finding +- **WHEN** 本轮 Ruff finding 的局部报告记录了 CodeGuard 适配器二进制摘要,但工作台读取候选时当前二进制字节已不同,或取证时无法安全取得摘要 +- **THEN** `propose` 不沿用旧观察或补造摘要,返回具体缺口与原工具重扫动作;匹配的二进制摘要只补齐适配器观察身份,未经批准的 rulepack 和人工误报裁定仍不得转成有效候选或门禁例外 + +#### Scenario: A recorded correction has a missing or edited readable projection +- **WHEN** 已保留纠错事件,但可读附件缺失、写入失败或被用户编辑 +- **THEN** 保留事件引用,单独反馈附件恢复动作;重复记录可重建缺失附件,但不得覆盖用户编辑。next 仅展示与当前复检和事件重建字节一致的附件,附件文字不得取得批准、执行或关闭权威 + +#### Scenario: A signed approval binds a snapshot to protected host context +- **WHEN** 宿主选择签名批准来源,并在扫描前固定公钥、撤销状态、可信时钟、工作区、策略修订、受保护代码基线与最小修订序号 +- **THEN** 按域分隔和原始签名载荷核验签名、范围、期限、防回滚与快照字节;快照内部修订也须与签名修订一致。项目自选公钥、签名成功或同次 PR 自写 approved 均不得替代宿主来源与原生检查完整性核验;坏签名、撤销、过期、范围/字节/修订错配及无可信时钟不放行 + +#### Scenario: A signed replacement chain contains an unverified predecessor +- **WHEN** 当前替代条目签名有效,但前序签名损坏/撤销、历史审核上下文无法核验、工作区不符或序号/时间乱序 +- **THEN** 不绑定完整批准链,当前签名不得覆盖前序缺口;每个历史摘要须由该跳签名核验取得,禁止项目自行提供历史 pin。历史候选在受保护审核时刻无效、链截断/多余/成环或超限也不放行 + +#### Scenario: A disposition is reused outside its approved workspace or baseline +- **WHEN** 白名单处置的工作区或当前批准代码基线与宿主独立冻结的范围不一致,或任一范围缺失/无效 +- **THEN** 最终门禁不应用该例外,保留原始及活动阻断并返回未完成;签名预览须携带已核验的范围,不能在投影时丢失。仅接受完整非零 SHA-1/SHA-256 基线,不将 HEAD 等可变引用当作身份;该基线属于当前批准上下文,不能从工作树或处置字段反向生成宿主信任 + +#### Scenario: Historical review occurs after its replacement was issued +- **WHEN** a predecessor signature is valid at its supplied protected review time but that review time is later than the child approval issuance +- **THEN** Codeguard SHALL reject the revision chain rather than treating valid signatures alone as valid chronology + +#### Scenario: Signed predecessor refers to an unrelated code baseline +- **WHEN** 签名修订链有效,但前序代码基线不是后续基线的 Git 祖先(允许同一提交) +- **THEN** 宿主批准绑定入口拒绝该链;完整对象缺失、浅历史、Git 失败或预算耗尽均返回未完成而非认可关系。仅接受完整 SHA-1/SHA-256 提交 ID,禁用 replace/graft 与按需远程取对象,不将本地 Git 观察本身当作可信宿主来源 + +#### Scenario: A valid signature binds an all-zero code baseline +- **WHEN** 签名和宿主上下文一致,但基线是 SHA-1 或 SHA-256 全零 ID +- **THEN** 普通与替代批准入口均拒绝该上下文;全零值不得代表受保护提交或缺省基线 + +#### Scenario: A legitimate historical approval has expired today +- **WHEN** 当前替代条目有效,前序批准在其受保护历史审核时刻合法,但今天已经过期 +- **THEN** 可以核验历史关系,不能因此自动接受当前条目;当前签名与候选仍按本次可信时钟核验,历史密钥最新撤销状态仍须检查 + +#### Scenario: Agent proposes or self-approves a whitelist entry +- **WHEN** agent 写本地候选、`approved=true`,或同一 PR 提交尚未进入可信基线的批准条目 +- **THEN** 候选不改变门禁,受保护 CI 只使用此前可信策略修订;批准、期限和来源均可解释 + +#### Scenario: A local finding lacks exact checker artifact identity +- **WHEN** 持久任务仅记录规则、路径和指纹,但本轮报告缺少工具制品、适配器或 rulepack 摘要 +- **THEN** `rules whitelist propose` 返回未完成和缺失身份列表,不猜测摘要、不产生可批准候选,原 finding 继续阻断 + +#### Scenario: Native finding has no reviewed rule mapping +- **WHEN** 本轮原生检查检出真实规则,但该规则在适配版本下尚无核对过的 CodeGuard 规则映射 +- **THEN** 白名单提案明确区分“规则映射待核对”与“已有映射但尚未批准”,指出原生规则和工具版本核对动作,不制造候选或授权;项目自写 `approved=true` 也不能改变原 finding 或稳定任务 + +#### Scenario: Required checker fails despite an old whitelist match +- **WHEN** 必需原生检查器本次崩溃、报告归属无效或必需规则被未经批准的 suppression 隐藏 +- **THEN** 结果保持 incomplete,不以历史白名单条目推断本次检查通过 + +#### Scenario: An import failure is mislabeled as a false positive +- **WHEN** 本地报告无法解析或归属,智能体为其写误报白名单候选 +- **THEN** 失败收据只指引修复报告或原生检查环境,不生成可白名单处置的 finding;候选不能改变未完成状态 + +#### Scenario: Two native findings collide on one stable ID +- **WHEN** 同一轮的不同原生规则或义务给出相同 finding ID,其中一条带有精确误报批准 +- **THEN** 保留两条原始发现,拒绝将该 ID 的批准扩展到另一条;受影响义务与交付结果保持 incomplete,要求修正身份冲突后重跑 + +#### Scenario: Similar false positives recur across a project type +- **WHEN** 同一原生规则在多个独立目标上反复被人工裁定为误报 +- **THEN** 生成规则/适配器根因调查并提供正反例;不自动创建通配白名单或修改原生排除 + +#### Scenario: User corrects an unreasonable finding +- **WHEN** 用户指出某条 finding 是误判,并提供反例或复现线索 +- **THEN** 智能体先复核原工具结果、有效规则和目标身份,保留原 finding 与任务,提出精确误报候选或规则/适配器修复建议;只有独立批准的精确候选在下一次完整检查中匹配,才对该 finding 标记 `whitelisted_false_positive`,并向对话展示批准引用、到期时间及 `allow_with_exceptions` 或剩余阻断原因 + +#### Scenario: Approved decision is revoked or task text changes +- **WHEN** 已批准条目被撤销,或有人手动勾选、改写其修复任务 +- **THEN** 保留原始 finding 与历史裁定;撤销后本轮原生 finding 重新按正常门禁判定,任务文字不能赋予批准 + +#### Scenario: User edits an approved whitelist entry +- **WHEN** 用户或智能体修改已批准条目的理由、目标、工具身份或期限 +- **THEN** 修改后的字节必须重新批准;不得沿用旧批准、自动续期或扩大范围。对话说明失配字段和复核动作,纠正记录关联同一稳定问题;有效误报处置不标记为源码修复完成 + +#### Scenario: An approved false-positive decision needs correction +- **WHEN** 人工复核发现已批准条目过宽、误批或其证据已失效,并提出替代候选 +- **THEN** 旧决策及撤销原因保持可追溯,新候选引用旧决策且在独立批准前不生效;本轮原生 finding 重新阻断或保持未完成,不能同时消费冲突的旧、新决策 + +#### Scenario: A corrected decision has no replacement or attempts to broaden scope +- **WHEN** 评审只撤销误批条目,或替代候选试图覆盖另一文件、依赖节点、原生规则或内容版本 +- **THEN** 只撤销时原 finding 恢复正常门禁;扩大范围的替代候选被拒绝并单独调查,不因引用旧决策而取得授权 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md index 3461d76..fea3491 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md @@ -2,10 +2,10 @@ ### Requirement: Managed remediation artifacts SHALL have a bounded self-scan policy -初始化清单验证通过的 Codeguard 自有运行产物及生成问题/任务文件 MUST 从普通被测源码发现中排除,并接受工作区 schema、路径及脱敏校验。排除 MUST 精确到生成器拥有的路径集合,不得仅因目录名 codeguard 忽略整棵树;用户源码、未声明文件及入库安全检查 MUST 保留。此要求 MUST 不改变既有点前缀策略及两项例外。 +`.codeguard/` 按既有点前缀策略不进入普通源码发现;其中被初始化清单拥有的运行产物与问题/任务文件 MUST 接受工作区 schema、路径及脱敏校验。不得因目录名 `codeguard` 忽略同名非点目录;其中的用户源码与未声明文件 MUST 继续普通检查。点目录排除不得赋予 `.codeguard/` 质量策略批准或入库安全豁免;拟提交记录仍须接受安全检查。既有点前缀的配置例外保持不变。 #### Scenario: Managed files coexist with user code -- **WHEN** `codeguard/tasks` 有生成任务且 `codeguard/src` 有用户源码 +- **WHEN** `.codeguard/tasks` 有生成任务且 `codeguard/src` 有用户源码 - **THEN** 生成任务走工作区校验,用户源码照常检测,不出现递归扫描运行副本 #### Scenario: A managed record contains a secret diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md index f95b412..539072c 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md @@ -4,14 +4,47 @@ ## ADDED Requirements +### Requirement: check all SHALL orchestrate npm roots through the shared native runtime +check all SHALL 将发现的npm构建根接入共享任务图、截止时间与并发预算,在显式原生上下文下调用同一审计服务;执行后串行同步稳定任务并反馈next,不继承宿主凭据或安装工具。 + +#### Scenario: Multiple npm roots are checked within one workspace +- **WHEN** 已初始化工作区有多个package.json根,调用者提供显式Node/npm/版本/原配置上下文 +- **THEN** 各根原生cwd、结果及稳定任务独立,重复检查不重复生成任务;统一human/JSON展示原生诊断、锁版本线索、同步结果及下一步,局部零漏洞不证明完整覆盖 + +#### Scenario: One npm root fails or the shared budget expires +- **WHEN** 一个根的原生审计失败,或共享截止时间耗尽 +- **THEN** 保留兄弟根已经取得的结果,不把环境失败记为源码违规;预算耗尽后不启动余下任务或签发完整检查通过,取消/超时与未同步状态明确展示 + +#### Scenario: npm context is absent or scoped to a Java-only check +- **WHEN** check all未提供显式npm上下文,或check java接收npm参数 +- **THEN** 前者在支持的平台自动将已发现npm根加入共享准备任务,已初始化且输入可绑定时同步稳定环境/配置任务并反馈next;不得启动缺上下文的原生命令,不自行安装/继承凭据。后者在原生执行前拒绝参数;可信上下文自动解析须独立实现和验收 + +### Requirement: Install previews SHALL distinguish bound layout declarations from verified package contents + +安装预览反馈 0.3 MUST 区分完整布局路径声明已绑定但来源未核验、缺少完整树声明及 raw 不适用目录树布局。已绑定完整布局 MUST 展示安装树声明摘要、内容寻址目录名和入口/可选 bundle 定位摘要;包内私有路径及原下载地址 MUST NOT 回显。预览 MUST 明示包/布局内容尚未验证,不得调用下载、展开或发布服务来隐式补齐。完整声明或局部制品身份匹配 MUST NOT 推导来源批准、准备完成、实际写入或门禁通过;未获批准的 apply 保持写入前阻塞。JSON/human MUST 表达相同阶段与下一步,旧版本 schema MUST 保留且不得将新反馈解释为旧普通成功。 + +#### Scenario: A complete layout is declared but no package is read +- **WHEN** 1.2 清单与原锁路径精确绑定,用户请求 dry-run 或未批准的 apply +- **THEN** 布局标记 declared_paths_bound_untrusted,内容核验 not_run,准备 unknown、来源 unverified、未写入;apply 不安装 + +#### Scenario: A legacy manifest lacks full layout or a raw package is declared +- **WHEN** 清单缺完整树声明,或工具包格式为 raw +- **THEN** 分别显示缺少声明或 raw 不适用;不猜完整安装目录,不把阶段标签当作内容核验 + ### Requirement: Unified commands SHALL select explicit check obligations -Rust CLI MUST 提供 `lint/comments/cve/security/build/check [path]`;`check` 包含全部适用类别。语言别名 MUST 来源于统一注册表,未知语言在执行前拒绝。部分命令 MUST 明示 selection,不得据局部通过声明项目全部通过。`plan` MUST 仅规划,不执行构建、扫描、下载、安装或修改源码。 +Rust CLI MUST 提供 `lint/comments/dependencies/cve/security/build/check [path]`;`check` 包含项目实际已配置且可适配的检查器,以及批准策略明确要求的检查义务。候选检测族目录本身不产生项目义务;未配置的候选项应说明状态与建议,不能因为没有运行就产生代码违规。语言别名 MUST 来源于统一注册表,未知语言在执行前拒绝。部分命令 MUST 明示 selection,不得据局部通过声明项目全部通过。`plan` MUST 仅规划,不执行构建、扫描、下载、安装或修改源码。 + +交付聚合 MUST 对照由可信策略与完整发现独立冻结的应有义务 ID 清单和实际计划的义务清单;任一清单漏项、重复或额外项均不能签发 allow。计划和冻结清单若都来自同一未经核验的项目可写输入,数量一致仍不构成可信来源证明。无适用义务的完整空项目仍按 not_applicable 处理。 #### Scenario: Java lint succeeds in a mixed project - **WHEN** Java lint 完成,但项目仍有 Python、安全或 CVE 义务未在该请求执行 - **THEN** 请求可成功,交付状态为 not_evaluated,不能宣称全项目通过 +#### Scenario: Planned obligations omit a frozen requirement +- **WHEN** 可信冻结契约含 Java CVE 义务,但执行计划只保留已经完成的 Python lint +- **THEN** 即使 Python 结果干净,交付和请求都保持 incomplete,并列出遗漏的 Java CVE 义务 + #### Scenario: User requests a plan - **WHEN** 调用 `codeguard plan check all .` - **THEN** 返回义务与待解析前置条件,不执行外部构建或扫描 @@ -20,6 +53,14 @@ Rust CLI MUST 提供 `lint/comments/cve/security/build/check [pat - **WHEN** 用户输入未注册的语言 ID - **THEN** 执行前返回用法错误,列出规范 ID/别名,不启动检查器 +#### Scenario: A candidate checker is not configured +- **WHEN** 项目未配置候选的 Javadoc 检查器,批准策略也未要求它 +- **THEN** 报告说明 `missing` 和可执行的配置建议,不产生 Javadoc 代码违规或未执行义务;其他已配置检查器继续运行 + +#### Scenario: Policy requires an unconfigured checker +- **WHEN** 批准策略明确要求 Javadoc 检查,但项目没有有效配置 +- **THEN** 报告说明配置缺口并将交付标为 incomplete,不伪造 Javadoc 源码违规或干净通过 + ### Requirement: Rust CLI SHALL expose a versioned exit contract Rust CLI MUST 使用 0 请求通过、1 违规、2 用法错误、3 必需义务未完成、4 内部故障、130 取消。执行后的聚合优先级 MUST 为取消、内部故障、未完成、违规、通过;已有发现 MUST 保留。原生退出码 MUST 独立记录,不直接透传作为 CLI 结论。 @@ -32,14 +73,44 @@ Rust CLI MUST 使用 0 请求通过、1 违规、2 用法错误、3 必需义务 - **WHEN** 工具原生退出 2 - **THEN** 依据该工具契约生成结果,不将其直接解释成 Codeguard 用法错误 +#### Scenario: One task fails internally after another finds a violation +- **WHEN** `check all` 的一个任务内部故障,而另一任务已经取得原生 finding +- **THEN** CLI 返回 4 和结构化内部故障报告,列出失败任务及各任务状态,并保留已取得的原生 finding;交付保持 incomplete,不能把该 finding 或故障解释成白名单放行 + +#### Scenario: Cancellation follows a completed native finding +- **WHEN** `check all` 并行运行期间,一项原生检查已取得 finding,另一项收到 SIGINT 并完成取消清理 +- **THEN** CLI 返回 130、`command_status=cancelled`,保留已取得的 finding 与取消任务状态;不返回普通未完成退出码 3 或交付 allow + ### Requirement: Reports SHALL preserve semantics across public formats -报告 MUST 带 schema_version、请求选择、内容/策略/工具身份、逐项完整性、发现、覆盖及交付判定。human/JSON/SARIF/MCP MUST 来源于同一语义报告。结构化 stdout MUST 不混入进度或原始日志;公开结果 MUST 脱敏,私有原始证据单独存储。未知协议 major MUST 拒绝消费。 +报告 MUST 带 schema_version、请求选择、项目检查器配置状态、本次原生结果、发现及交付判定。human/JSON/SARIF/MCP MUST 来源于同一语义报告;宿主对话反馈 MUST 区分 `configured/missing/invalid/unknown` 与 `passed/finding/tool_error`,不把“已配置”说成“已通过”。结构化 stdout MUST 不混入进度或原始日志;公开结果 MUST 脱敏,私有原始证据单独存储。未知协议 major MUST 拒绝消费。检查请求与 RunReport 的原始 JSON 在全部嵌套层级 MUST 拒绝重复对象键,并设输入字节预算;不能先把重复键覆盖成普通对象再校验交付判定或预算。 + +#### Scenario: Duplicate protocol fields conceal a gate or execution option +- **WHEN** 原始 RunReport 同时含两个 `delivery_gate`/`decision` 键,或内嵌检查请求的 `jobs` 键重复且后值看似合法 +- **THEN** 消费入口拒绝整份原始 JSON,不选取前值或后值,也不生成交付通过或对话摘要 + +新增误报白名单报告字段时 MUST 提升协议版本并迁移所有消费者:报告分别保留原始 finding、有效处置、活跃阻断和未完成义务,交付决策增加 `allow_with_exceptions`。CLI 请求成功可退出 0,但 human/JSON/SARIF/MCP MUST 明示“带批准例外交付”及决策 ID、可信修订、期限与本次匹配范围,不能渲染成普通 PASS;局部检查仍为 not_evaluated。旧消费者不认识新决策时 MUST 拒绝将它映射为普通 allow。 + +#### Scenario: Approved false positive survives every public format +- **WHEN** 有效误报白名单是唯一原始阻断,完整交付检查得到 allow_with_exceptions +- **THEN** 协议版本、CLI/MCP/Hook/SARIF 均保留原始 finding、可信批准引用、期限和带例外语义,不能渲染普通 PASS #### Scenario: SARIF contains no findings but a required task timed out - **WHEN** 一个必需检查超时且没有有效 finding - **THEN** SARIF 仍表达未完成,标准报告不得变成干净通过 +#### Scenario: SARIF consumes an unverified allowlist claim +- **WHEN** 结构有效的报告声明一个 finding 已被误报白名单处置,但报告来源和批准权威尚未独立核验 +- **THEN** SARIF 保留该 finding 为结果、显示处置声明及来源未核验状态,不创建会使查看器隐藏结果的 suppression;只有完成可信绑定后才可声明批准有效 + +#### Scenario: A new run report claims a stale false-positive disposition +- **WHEN** 新版 RunReport 声明误报处置,但本轮 finding 的完整原生身份缺失,或其文件/依赖图/advisory、指纹、工具/适配器/rulepack 摘要与决策身份不同 +- **THEN** 严格消费者拒绝该报告的处置声明,不把它投影为已批准例外;原生规则、工具制品、检查器类别及主目标也须与本轮 finding 和报告身份一致。旧版可作为历史未核验声明读取,未知未来版本不得按现有语义猜测;即使新版结构匹配,来源与独立批准仍须由宿主核验 + +#### Scenario: A source claim sits outside the native coverage or no longer matches the workspace +- **WHEN** 新版报告的源码 finding 主目标不在对应义务的预期及实际覆盖集合内,或宿主从独立指定的工作区安全读取当前文件后发现 SHA-256 不同、文件缺失或路径经过符号链接 +- **THEN** 不得将该 finding 的白名单处置解释为本轮有效;覆盖结构校验直接拒绝报告,内容复核失败时宿主保持未完成。内容摘要匹配本身也不证明原生工具确实运行或批准来源可信,终局门禁仍须复核 + #### Scenario: Tool output contains a credential - **WHEN** 工具 argv 或诊断含凭据 - **THEN** MCP 与公开报告不回显原文,保留可用的私有证据引用 @@ -55,3 +126,170 @@ Rust CLI MUST 使用 0 请求通过、1 违规、2 用法错误、3 必需义务 #### Scenario: Empty project has no applicable checks - **WHEN** 完整发现证明项目无适用检查对象 - **THEN** 标为 not_applicable 且 eligible=false,不签发交付通过 + +### Requirement: Public commands SHALL have distinct operation contracts + +CLI MUST 提供帮助/版本、detect、capabilities、init、plan、doctor、rules list、config validate/explain、tools list/verify/install、六类检查、三个 gate、work sync、status、next、task 协作、fix/verify、mcp serve 与显式 compat。每个命令 MUST 定义参数、默认值、输入/结果类型、允许副作用、错误与下一步;CLI/MCP 接入 MUST 复用核心服务,不另建检查或门禁逻辑。完整目录和 C01–C36 追踪见设计文档,命令 schema、help、映射和验收 MUST 保持一致。 + +#### Scenario: Help is requested outside a project +- **WHEN** 用户在无项目或无扫描工具的目录请求 help 或 version +- **THEN** 从发行元数据返回信息,不初始化、不扫描、不联网更新 + +#### Scenario: A capability exists but its tool is not installed +- **WHEN** capabilities 返回实现能力,而 tools list 显示必需工具缺失 +- **THEN** 两者分别说明发行能力和本地库存,不将能力声明当作环境或质量通过 + +### Requirement: Operation success SHALL remain separate from quality certification + +`rules whitelist list/explain/propose` MUST 复用规则与策略服务。list/explain 为只读;propose 仅产生候选及依据,不批准、不修改有效政策、不签发质量结论。`config validate` MUST 校验白名单 schema、精确范围、批准身份、期限和策略差异;静态无法验证可信批准时 MUST 报未完成,不能按本地声明通过。 +propose 缺少本轮完整原生 finding 或工具/适配器/rulepack 身份时 MUST 返回未完成和缺证据项,不能以占位摘要生成形式上有效的候选。 + +命令结果 MUST 有版本及 report_type/operation/request_id/command_status/exit_code/warnings/next_actions,并保留类型特有的完整payload。RunReport MUST 继续包含逐项完整性、身份、finding和gate。信息/计划/管理操作的 exit 0 只表示该操作完成;doctor/config validate/tools verify 对所选必需条件不能验证满足时 MUST 返回3。非交付操作 MUST NOT 据操作成功签发allow,status 展示历史决策时 MUST 附来源身份与freshness。MCP 服务生命周期与单请求结果 MUST 分开。 + +#### Scenario: Plan contains a missing prerequisite +- **WHEN** plan 完整返回了含缺JDK条件的计划 +- **THEN** 可exit 0但不声称就绪,doctor对同一必需缺失返回3且不虚构源码违规 + +#### Scenario: MCP request times out while the server remains available +- **WHEN** 一个MCP检查请求超时 +- **THEN** 该请求返回未完成语义,服务器存活不作为检查成功证据 + +### Requirement: Preparation commands SHALL preserve observation and mutation boundaries + +detect/capabilities/rules/config/tools list和verify MUST 静态观察,不执行项目脚本或安装工具。config validate MUST 核验配置与批准策略引用;explain MUST 解释来源而不自动选择较松要求;tools verify MUST 区分制品身份与运行能力。doctor MAY 执行适配器声明、身份已解析且有界的诊断,不隐式构建、安装、启动服务或读取凭据值。doctor 的 PrerequisiteReport MUST 带run_id、报告类型、工作区/内容/政策/工具身份、范围与freshness,可被同步为准备证据,不能作为源码质量通过。 + +tools list 的本地候选库存 MUST 明示仅覆盖声明锁,完整必需集合未经核验;MUST 区分声明版本、当前平台制品观察和跨平台未检查条目。运行时/发行包须分别显示缺口,字节相符不能称已批准、可启动或 ready。缺锁、空当前平台或未获可信策略绑定不能将空库存解释为无必需工具;普通候选不得自写 required_by_policy。MUST 复用制品核验服务,不启动 wrapper、联网、安装或写工作区。 + +#### Scenario: Inventory contains a tool for another platform +- **WHEN** tools list 读取结构有效但未经批准的跨平台锁候选 +- **THEN** 保留该声明并标记 other_platform/not_inspected,不访问其制品、不虚构本机缺失或准备通过;当前平台条目按同一制品核验契约展示 + +#### Scenario: Tool bytes match but its runtime cannot start +- **WHEN** tools verify确认制品身份而doctor发现运行时不能启动 +- **THEN** tools verify不被撤写为源码违规,doctor报告必需准备未完成,后续检查不能假通过 + +#### Scenario: Existing suppression conflicts with approved policy +- **WHEN** 配置包含未批准的规则弱化 +- **THEN** validate报告未完成,explain展示来源与拒绝原因,不自动修正阈值或签发批准 + +#### Scenario: Detection is complete but a dynamic condition is unknown +- **WHEN** detect完整读取允许范围但构建条件不能静态解析 +- **THEN** 返回含unknown的DiscoveryReport及exit0,不执行脚本、不写画像或任务 + +#### Scenario: Required discovery inputs cannot be read +- **WHEN** 必要目录因权限错误无法观察 +- **THEN** detect保留部分观察并返回3,不能按空项目或完整发现解释 + +#### Scenario: Capabilities are planned unknown or corrupt +- **WHEN** 查询已登记planned语言、未知语言ID,或发行注册表损坏 +- **THEN** 三者分别为显式planned/gap的查询成功、用法错误2、内部故障4;均不隐式探测或安装工具 + +### Requirement: Tool installation SHALL use a bounded explicit plan and apply + +`tools install --lock PATH [--distribution-manifest FILE] [--dry-run|--apply]` 默认 MUST dry-run,返回精确来源、摘要、安装范围和限制。apply MUST 只安装可信锁与授权范围内制品,验证后逐制品原子发布;部分失败返回未完成且可恢复。扫描/诊断 MUST NOT 隐式调用安装,不自动升级到latest、修改全局PATH或提权。工具存在/安装成功 MUST NOT 直接证明项目检查通过。 + +#### Scenario: Tool installation has no mode flag +- **WHEN** 调用 tools install仅给出lock路径 +- **THEN** 只输出安装计划,不下载或更改工具库存 + +#### Scenario: Apply is requested with only an untrusted local lock candidate +- **WHEN** 安装候选只通过本地结构及制品核验,可信锁或发行授权尚未绑定 +- **THEN** 返回明确缺口及 blocked_before_mutation,不调用发布服务、不联网/安装/写工作区;条目可解释原有制品与恢复动作,但不得宣布已安装或 ready + +#### Scenario: One of several locked artifacts fails verification +- **WHEN** apply中某个制品校验失败 +- **THEN** 不发布该制品,保留其它已验证结果并返回3,后续恢复不消费半成品 + +发行清单 MUST 使用版本化、拒绝未知和重复字段的有界协议;制品 MUST 绑定工具锁原始字节 SHA-256、精确工具 ID/版本/平台、二进制及来源引用摘要和 bundle 身份。清单声明的子集 MUST NOT 证明必需库存或运行时闭包完整。下载地址 MUST 使用 HTTPS 且不得携带用户凭据、查询参数或片段;包摘要、传输大小和展开上限 MUST 明确且有界。原始二进制包的包摘要/大小 MUST 与入口摘要/展开大小一致,不得声明归档入口或 bundle;归档入口 MUST 是无空段、点段、回退段或平台绝对路径的相对路径。结构/引用匹配 MUST NOT 自授可信来源或安装批准,绑定入口 MUST 重新验证传入对象。 + +#### Scenario: Explicit manifest is inspected during install preview +- **WHEN** tools install 显式提供 --distribution-manifest FILE +- **THEN** 有界只读读取并展示未提供/不可读/无效/锁不可用/未绑定/绑定未批准状态;逐工具只展示精确绑定的脱敏包声明,原始下载地址不进入公开反馈;不执行、下载或写入,缺其它工具及运行时覆盖仍保持未完成 + +#### Scenario: Manifest attempts to bind changed lock bytes or another artifact +- **WHEN** 清单绑定的锁原始字节变化,或工具/版本/平台/来源/bundle/二进制身份与锁不一致 +- **THEN** 拒绝绑定,不下载或发布;不得以 JSON 语义相似、版本字符串相同或文件已存在代替摘要核验 + +#### Scenario: Manifest is locally valid but not independently authorized +- **WHEN** 本地清单及其声明子集通过结构与精确锁绑定 +- **THEN** 仅产生声明绑定,不推导覆盖完整、可信来源、批准、ready 或门禁通过;正式 apply 仍须独立发行授权 + +#### Scenario: Manifest includes unsafe package metadata +- **WHEN** 清单包含重复字段/工具平台条目、未知批准字段、凭据地址、零摘要、超限大小或非法归档入口 +- **THEN** 拒绝清单并返回固定脱敏诊断;不把准备输入错误当成源码违规 + +### Requirement: Gate commands SHALL receive explicit delivery content + +pre-commit MUST 使用Git传入环境的index;pre-push MUST 接受remote-name/remote-url和完整stdin ref/OID元组,不回退HEAD;ci MUST 通过版本化input请求明确仓库及不可变OID集合与预期来源。CI输入文件 MUST NOT 自授策略权威。删除ref或无适用源码不得签发代码质量allow;不同内容来源的结果不可互相替代。 + +#### Scenario: CI checks a merge result rather than the branch head +- **WHEN** CI请求指明merge结果OID +- **THEN** 仅按指定不可变内容建立认证,不使用当前checkout或分支头的通过代替 + +#### Scenario: Pre push input is absent +- **WHEN** pre-push没有获得要求的ref输入 +- **THEN** 明确失败而不检查默认HEAD冒充本次推送;合法全删除集合独立记录不适用 + +### Requirement: Execution budgets SHALL have explicit defaults and a shared deadline + +有执行行为的命令 MUST 在版本化命令schema中固化timeout/jobs的支持范围、默认值和来源优先级,报告有效值。初版检查/gate/fix/verify默认总预算30分钟,doctor 2分钟且单探测不超过10秒,tools install 10分钟;检查默认并行度为min(4,max(1,可用CPU并行度))。CLI优先于已登记环境变量、项目运行默认及发行内置值;这些值 MUST 不改变质量义务。子任务和重试 MUST 继承剩余deadline,包含排队、快照、执行、解析、存储及清理,不重置预算。无法及时回收进程 MUST 明示cleanup_pending而不声称完成。 + +项目检查/复检的可选运行默认值 MUST 从版本化 `codeguard/runtime.json` 读取;该文件只能声明运行预算,不能承载或覆盖必需规则、扫描排除、白名单及批准身份。CLI/已登记环境变量优先于它;当项目默认值成为候选来源时,未知字段、坏版本、非普通文件、符号链接或无效预算 MUST 在执行原生工具及取得任务租约前拒绝,不回退内置默认值来掩盖配置错误。报告 MUST 保留最终值与 `project_default` 来源,项目默认值不能把不完整检查改成通过。 + +`check all` 的并行上限 MUST 支持 `--jobs`、登记的 `CODEGUARD_JOBS`、同一 `codeguard/runtime.json` 中可选的 `jobs` 和内置默认值,按上述来源优先级逐字段选择;显式值限定为 1–64 的十进制整数。项目文件一旦为任一字段的候选来源,MUST 对整个版本化文档做一次严格读取和校验,防止超时与并行度从同一文件的不同版本混用。报告 MUST 分别说明并行上限、来源、本轮可执行任务数及实际启动数;并行上限不是实际并发证明,不能因只接入一个适配器就声称多语言并发已验收。 + +#### Scenario: Check parallelism source and actual work differ +- **WHEN** `check all` 在有多个可用 CPU 的机器上只接入一个原生任务,且调用方设置 `--jobs 4` +- **THEN** 调度器以上限 4 运行,反馈分别报告上限 4、一个可执行任务和实际启动任务数,不声称四项检查已完成 + +#### Scenario: Invalid selected jobs budget +- **WHEN** 选中的 `--jobs`、登记环境或项目默认值为零、负数、超过 64 或非十进制整数 +- **THEN** 启动原生工具前返回 2;较高优先级的有效值覆盖较低优先级的无效环境值,项目文件被选中时仍须整体严格校验 + +#### Scenario: Project runtime default is selected +- **WHEN** `codeguard/runtime.json` 有效且未设置显式 CLI 或已登记环境预算 +- **THEN** 本次检查使用项目默认值,报告来源为 `project_default`;之后仍须执行全部适用质量义务 + +#### Scenario: Project runtime default is malformed +- **WHEN** 没有更高优先级的预算来源,且项目运行默认值版本错误、预算非法、文件为链接或含质量排除字段 +- **THEN** 启动原生工具和取得任务租约前拒绝,不静默回退或采纳其中的质量豁免 + +#### Scenario: A retry starts after most of the request budget is consumed +- **WHEN** 某任务在整次请求接近deadline时满足瞬时重试条件 +- **THEN** 重试只能使用剩余预算,不能重新获得完整timeout或降低检查覆盖 + +#### Scenario: Timeout is zero or unsupported for the selected command +- **WHEN** 调用方提供零预算或某命令不支持的执行选项 +- **THEN** 执行前返回2,不将零解释为无限等待或静默忽略参数 + +### Requirement: Report export SHALL preserve identity and persistence failures + +标准报告 MUST 保留可逆的路径身份、展示位置和多位置/包级证据,不以有损字符串或行号单独识别问题。`--output` MUST 原子写入与所选格式一致的报告;写入失败 MUST 保留已取得的检查证据并报告操作未完成,不能把质量结论改成另一项源码违规。JSON未知major或非法枚举 MUST 拒绝,兼容minor扩展不得覆盖必需字段。跨工具归并 MUST 有明确规则映射并保留原始来源。 + +#### Scenario: Report destination cannot be written +- **WHEN** 检查已取得有效发现但指定output不可写 +- **THEN** 保留检查结果并返回操作未完成及恢复位置,不丢弃finding或假称报告已保存 + +#### Scenario: Non UTF8 paths and equivalent tool findings are exported +- **WHEN** 路径含非UTF8字节且多个工具报告近似文案 +- **THEN** 保留可逆路径身份,仅按批准等价映射归并,不能按展示字符串抵消发现 + +### Requirement: npm public CVE feedback SHALL preserve local observation boundaries + +`cve typescript PATH` SHALL 支持显式Node/npm入口、具体版本、原用户/全局配置、可选审计源及共同预算;不执行package脚本、fix或安装。缺上下文提供结构化准备原因,重复/未知参数为使用错误。human/JSON MUST 反馈配置声明、原生依赖数量和脱敏组件/advisory/锁版本观察;零发现不得成为库覆盖或交付通过。当前局部协议固定advisory_coverage和delivery_decision为not_evaluated、工具unverified;工作台反馈必须反映未连接、准备失败或实际同步结果,不能固定声称已连接。取消退出130,其余局部反馈退出3,不能假称完整CVE检查。 + +#### Scenario: Explicit npm invocation returns coherent empty audit +- **WHEN** 公开命令获得本轮稳定输入和一致原生空报告 +- **THEN** 保留依赖数量、声明状态与具体下一步,库覆盖/交付仍未判定,不能手动关闭修复任务 + +#### Scenario: npm context missing or interrupted +- **WHEN** 未提供工具/配置上下文或执行被取消 +- **THEN** 输出准备/取消原因,不生成源码违规、不安装工具、不批准白名单;取消不要求修改源码 + +### Requirement: npm public audit SHALL consume shared runtime timeout defaults + +npm公开CVE入口 MUST 按CLI、登记环境变量、项目runtime.json、内置默认值顺序选择超时预算。只在项目配置成为候选时读取并严格校验,不以无效文件回退掩盖错误。参数及环境值错误为使用错误;项目默认值无效为准备未完成,并在原生工具启动之前停止。反馈0.2 MUST 记录最终预算与来源,未取得有效预算时为null;不能声明可中断文件I/O的硬预算。历史0.1反馈仍按原严格结构消费,不补造预算。 + +#### Scenario: npm timeout precedence and malformed project defaults +- **WHEN** 原项目预算、登记环境值与CLI值同时存在或低优先级文件格式无效 +- **THEN** 只使用最高优先级合法来源,显式CLI值不因低优先级坏文件失败;项目文件为候选且含未知字段、坏协议或符号链接时返回未完成,原生审计不启动 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md index 669c1b0..01f4244 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md +++ b/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md @@ -4,6 +4,8 @@ 显式 legacy-v1 入口 MUST 保持 PASS、FAIL、UNVERIFIED、SKIPPED、PLANNED 及原聚合退出约定:通常 FAIL=2、无 FAIL 但有未验证/计划项=1、已验证或无须检查=0;各旧子命令的已记录差异由兼容层保持。仅真实成功检查允许 passed=true,无法验证不得触发自动修复或 all passed。 +旧 `check`、CVE 与 Dockerfile MUST 分别保留其混合优先级:前两者在已确认 FAIL 与 UNVERIFIED 并存时返回旧 2,Dockerfile 在同样组合时返回旧 1 且保留已确认风险。旧 CVE 参数错误是 3,而其他使用 argparse 的旧检查/修复/规划入口参数错误为 2;旧 PreToolUse 的 2 是宿主拦截。兼容投影和 MCP/Hook 生命周期成功都 MUST 固定为新版交付 `not_evaluated`,不得按旧数字推导新版 allow。 + Rust 新入口 MUST 使用 unified-cli-contract 的版本化协议,MUST 将执行完整性与 findings 分离;混合未完成和违规保留两者并退出 3。CLI/MCP/Hook 转换 MUST 根据协议和结构化语义,不能根据同一个数字猜测通过。此版本边界同样约束旧 CVE、Dockerfile 等结果在新入口的映射。 #### Scenario: Configuration error survives MCP serialization @@ -18,19 +20,37 @@ Rust 新入口 MUST 使用 unified-cli-contract 的版本化协议,MUST 将执 ### Requirement: Required completeness SHALL gate Rust delivery -Rust 交付 allow MUST 同时满足全部适用必需义务完成、覆盖匹配、内容与批准策略身份有效、无阻断违规。缺工具、无实现、坏报告、超时、缓存身份失败或输入变化 MUST NOT 成为 allow。未选择的类别与有理由不适用的类别 MUST 明确区分。 +Rust 交付普通 allow MUST 同时满足全部适用必需义务完成、覆盖匹配、内容与批准策略身份有效、无原始阻断违规。缺工具、无实现、坏报告、超时、缓存身份失败或输入变化 MUST NOT 成为 allow。未选择的类别与有理由不适用的类别 MUST 明确区分。 + +有效误报白名单命中不得抹去原始阻断发现。若全部义务完整、无未经处置的阻断 finding,且存在有效批准的精确误报处置,交付决策 MUST 为 `allow_with_exceptions`,不得显示普通 `allow`;未完成优先于违规和例外放行,未处置的阻断优先于例外放行。`allow_with_exceptions` 仅表示本次输入在带批准引用的策略下可交付,不表示原工具没有报告问题。 #### Scenario: No findings but a required tool is missing - **WHEN** 已运行检查无违规但另一必需工具缺失 - **THEN** 交付 incomplete,不制造代码违规,也不允许交付 +#### Scenario: Project scope changes while native checks run +- **WHEN** 初次发现后、原生工具运行期间,项目新增源码或改变原生规则配置 +- **THEN** 检查结果保留已经取得的原生发现,并明确标记本轮范围变化、要求重新发现与复检;第二轮发现不能被自动当作批准义务账本。仅有 CodeGuard 自有受管记录变化时不得误报项目范围变化 + +#### Scenario: Existing source bytes change while native checks run +- **WHEN** 初次发现的源码路径不变,但原生检查器或并发编辑改变该路径的文件字节 +- **THEN** 本轮检查标记输入内容变化并保持 incomplete,保留已观察到的原生诊断;无法安全捕获或复核全部目标字节时也保持 incomplete,不得把静态路径集合未变解释为内容稳定 + #### Scenario: Finding remains in a historical file - **WHEN** 必需规则检出历史文件中的违规 - **THEN** 保留 finding 并按同一策略阻断,基线分类不能改变结果 +#### Scenario: Approved false positive is the only blocker +- **WHEN** 全部适用义务完整,唯一原始阻断 finding 有当前输入匹配的可信误报白名单 +- **THEN** 报告保留原始 finding 和处置引用,交付决策为 allow_with_exceptions + +#### Scenario: Approved false positive coexists with a real violation +- **WHEN** 同轮有有效误报白名单与未经处置的阻断 finding +- **THEN** 两者均报告,交付决策为 deny;若还有未完成义务则为 incomplete + ### Requirement: Coverage SHALL not change with scheduling strategy -Rust MUST 在调度前建立完整义务;分批、并发、缓存和增量 MUST 保持等价覆盖与判定,未执行义务必须具有有效复用证明,否则未完成。文件数量阈值 MUST NOT 改变历史问题是否阻断。 +Rust MUST 在调度前依据项目配置、适配能力和批准策略建立完整的**实际必需义务**;候选检测族目录不自动生成义务。分批、并发、缓存和增量 MUST 保持这些必需义务的等价覆盖与判定;计划复用而未重跑的必需义务必须具有有效复用依据,否则未完成。这是交付判定的覆盖约束,不要求向智能体额外展示逐候选检测族的执行证明。文件数量阈值 MUST NOT 改变历史问题是否阻断。 #### Scenario: A clean extra file crosses a batching boundary - **WHEN** 目标从 50 个增加至 51 个文件但已有违规未变 diff --git a/openspec/changes/introduce-rust-codeguard-cli/tasks.md b/openspec/changes/introduce-rust-codeguard-cli/tasks.md index e620a70..a265ebd 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/tasks.md +++ b/openspec/changes/introduce-rust-codeguard-cli/tasks.md @@ -1,6 +1,8 @@ # Tasks:统一 Rust Codeguard CLI -本文件跟踪**后续实现**,当前文档交付不勾选任何实现任务。规格事实源为本 change 的 `specs/`;设计展开在 [design](design.md)。每项完成需要关联代码、测试和实际证据,不以存在文件、编译或模拟报告替代。 +本文件跟踪**进行中的实现**;已完成的工程基线任务有独立代码与验收证据,其余项目保持未完成。规格事实源为本 change 的 `specs/`;设计展开在 [design](design.md)。每项完成需要关联代码、测试和实际证据,不以存在文件、编译或模拟报告替代。 + +当前范围与逐项依赖/验收导航见 [实施覆盖索引](implementation-coverage.md):每个Requirement、命令和语言都有任务定位,每个task都有规格依据。阶段/汇总任务完成须满足其关联明细;不得重复创建第二份任务状态。 实施按红→绿→相关回归推进;每个批次先重新检查 Git/AGENTS/现有完成度。仓库创建、分支切换、工具安装、规则权威变更和发布按当时用户授权执行,不从本任务清单推断已经授权这些动作。不得修改本插件外部受管技能副本。 @@ -9,45 +11,129 @@ 依赖:无。覆盖:unified-cli-contract、native-tool-adapters、binary-distribution。 - [ ] 1.1 核对最新旧源码与 57 项清单差异,建立“保留正确行为 / 明确纠偏 / legacy 兼容”表;验收:每条差异关联 spec 和 fixture。 -- [ ] 1.2 在获准位置建立用户指定 `codeguard-cli/` 四 crate workspace,锁定 MSRV/依赖/Cargo.lock;验收:可运行 `codeguard --version`,无空适配器充数。 -- [ ] 1.3 建立 crate 依赖方向检查;验收:core→runtime、adapters→runtime、宿主 SDK 入 core 等反例均被拒绝。 -- [ ] 1.4 创建真实语料登记、脱敏和 oracle 格式,收录当前误判/假通过最小样本;验收:源码/工具/规则身份可复现,争议样本独立标记。 -- [ ] 1.5 定义 language×category×platform 能力 schema 和生成文档入口;验收:54 stable/3 planned 全覆盖,formatter-only 不能伪装 lint。 +- [x] 1.2 在获准位置建立用户指定 `codeguard-cli/` 四 crate workspace,锁定 MSRV/依赖/Cargo.lock;验收:可运行 `codeguard --version`,无空适配器充数。证据:相邻 `codeguard-cli/tests/acceptance/engineering-baseline.md`;真实适配器能力仍为 gap。 +- [x] 1.3 建立 crate 依赖方向检查;验收:core→runtime、adapters→runtime、宿主 SDK 入 core 等反例均被拒绝。证据:相邻 `codeguard-cli/crates/codeguard-cli/tests/crate_boundaries.rs` 与工程基线验收记录;检查器已改用 Rust 消费 Cargo metadata。 +- [x] 1.4 创建真实语料登记、脱敏和 oracle 格式,收录当前误判/假通过最小样本;验收:源码/工具/规则身份可复现,争议样本独立标记。证据:相邻 `codeguard-cli/tests/acceptance/corpus-baseline.md`;Rust 语料验证与真实 Ruff/Maven 回放已替代新工程的 Python 辅助脚本,历史未复现样本不计入已接受 oracle。 +- [x] 1.5 定义 language×category×platform 能力 schema 和生成文档入口;验收:54 stable/3 planned 全覆盖,formatter-only 不能伪装 lint。证据:相邻 `codeguard-cli/tests/acceptance/capability-inventory.md`;当前全部单元诚实标记为 gap。 +- [ ] 1.6 固化应用服务与ports边界:观察/政策/计划/检查/交付/存储/租约/修复及schema所有权;交付:真实领域契约和依赖测试;验收:CLI/MCP共用服务、core无基础设施依赖,新CLI与验收工具为Rust实现,P3C/Maven等通过Rust runtime调用其原生命令,不以空stub计功能完成。 ## 2. S02 CLI、结果模型与门禁 依赖:S01。覆盖:unified-cli-contract、verdict-integrity。 - [ ] 2.1 实现统一命令语法、canonical ID/别名及只读 plan;验收:错参无进程副作用、plan 不运行构建/扫描。 -- [ ] 2.2 定义请求/计划/报告/工具锁 JSON schemas 与兼容版本策略,提供完整正反例;验收:未知 major/非法枚举不按 PASS 消费。 + 进行中:相邻 Rust CLI 新增 C06 的只读 `plan_preview` 0.1,先校验类别/canonical 语言 ID,再静态观察配置;缺可信策略和工具锁时只列候选、不给执行 argv/正式义务、退出 3。目标集成测试验证伪造 Ruff 工具未运行及项目无新增文件,见 `codeguard-cli/tests/acceptance/plan-readonly-preview.md`。别名、可信政策、全量义务/DAG 和正式 CheckPlan 仍缺,不勾选。 +- [x] 2.2 定义请求/计划/报告/工具锁 JSON schemas 与兼容版本策略,提供完整正反例;验收:未知 major/非法枚举不按 PASS 消费,运行报告区分项目检查器的 `configured/missing/invalid/unknown` 与本次原生结果。证据:相邻 `codeguard-cli/schemas/run-report.schema.json` 的 1.2 协议、`crates/codeguard-cli/src/run_report.rs` 与 `tests/run_report_contract.rs` 的正反例;1.0 历史报告仍可读取,1.1 起区分配置和运行,1.2 起 finding 要求定位且检查器状态按构建根区分。此项只完成协议,不代表项目配置探测或宿主对话接线已完成。 + 公共协议输入加固:Rust 检查请求和 RunReport 现从原始字节递归拒绝重复 JSON 键,并复用 16 MiB 输入上限;`delivery_gate`/`decision` 和嵌套 `jobs` 重复键反例先失败后通过。此校验只保证结构消费,不验证报告来源或正式门禁。 - [ ] 2.3 实现 findings 与 completion 双维聚合及新退出码;验收:混合违规/缺工具返回 3 并保留全部发现,取消/内部异常优先级正确。 + Python CVE 部分结果增量:`check all` 对完整但原生异常退出或输出超限的 pip-audit 报告,保留已归属 advisory;执行节点与类别候选均为 `native_incomplete`,未解决条件保留 `python_cve_task_incomplete`。旧汇总层仅按 `native_report_valid=true` 将部分报告误记成功,反例先 RED 后修正;两份实际总报告通过 schema。完整 findings/completion 跨语言、取消与内部异常优先级仍缺,2.3 不勾选,见相邻 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。 + 内部故障反馈进展:`check all/java` 的任务图若返回内部故障,现以退出 4 输出结构化 `check_aborted`,保留兄弟任务已取得的原生局部结果、发现及每项任务状态;交付为 incomplete/not_evaluated。同轮同时有取消时优先退出 130,仍保留故障任务 ID 与原生发现。它不是完整 RunReport,调度器自身失败和跨入口聚合尚未完成,2.3 仍不勾选。 + 取消优先级进展:`check all/java` 的 `check_feedback` 升至 0.16,实际 SIGINT 并行回归证明一项 Ruff 原生任务取消后退出 130,同时保留另一项已完成的 Rust Clippy finding;状态明确为 cancelled,交付仍 incomplete/not_evaluated。`lint python` 对话反馈也升至 0.11,真实 SIGINT 原生探测退出 130,保留局部反馈与子孙清理证据。其它入口、调度器故障与完整义务聚合仍缺,2.3 不勾选。 + 接线进展:公开 `check all` 可从项目发现列出已观察语言的六类候选,正式必需义务保持 unresolved/null;Python 源文件复用原生 Ruff lint、报告同步和 next,Rust 源文件有显式 Cargo 工具时运行局部原生 Clippy。混合项目中 Python 缺工具不吞掉 Rust 诊断,仍返回 3/incomplete。当前只是局部检查反馈,不是完整 RunReport 或全部检查族结果;见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`,2.3 不勾选。 + Java 接线进展:`check all` 0.7 增加独立 `java.p3c` 节点,按最近 Maven 构建根识别已配置的 P3C,只读项目配置与隔离原生单文件探针分别反馈。缺配置不启动 Maven;原生诊断含规则/位置进入 JSON/human。隔离探针提供十个 P3C 规则集,但项目检查只选择 POM 中可静态确认的子集;POM 无法对齐或变化时保留配置阻塞。Java lint 候选即使局部探针完成也保持 `native_incomplete/p3c_declared_rulesets_unverified_coverage`,不伪称完整 lint 或交付通过。真实 Maven/JDK 21 离线用例与未配置、嵌套构建根反例见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。完整义务聚合仍缺,2.3 不勾选。 + 局部语言选择进展:公开 `check java` 复用同一 P3C 节点与任务同步,混合项目只调度 Java、只列 Java 候选,`check_feedback` 0.8 固定 `selection=java`/`delivery_decision=not_evaluated`/退出 3;真实 Maven 样本仅在 POM 同时声明 naming/comment 时返回命名和作者注释两条规则。完整义务集合、其它 Java 检查器及交付聚合仍缺,2.3 不勾选。 - [ ] 2.4 实现义务账本和交付决策;验收:类别命令、空目标、缺 adapter、未执行任务均不能签发项目 allow。 + `check all` 当前固定不完整,显式列出未接入的候选类别;只有受保护策略才可确定必需义务,候选目录不自动升级为账本,原 2.4 验收仍未完成。 + 进行中:相邻 Rust 领域门禁现将独立冻结的应有义务 ID 与实际计划逐项对照;丢失、重复或额外 ID 使交付 incomplete,`conclude_check` 的请求退出 3,已发现问题仍保留。见 `codeguard-cli/tests/acceptance/frozen-obligation-ledger.md`。可信策略/完整发现如何生成和绑定冻结清单、正式 plan/check 的接线尚未实现,不勾选。 + 追加 finding 身份冲突校验:即便义务 ID 和目标覆盖均完整,两条原生发现共用一个 finding ID 也使受影响账本无效,防止门禁按集合去重后误签例外;CLI 完整接线仍缺,2.4 不勾选。 - [ ] 2.5 实现统一 human/JSON/SARIF 渲染与私有证据引用;验收:结构化 stdout 纯净、SARIF 未完成可见、公开报告不泄露凭据。 -- [ ] 2.6 建立具名 legacy-v1 协议映射表和参数测试;验收:逐旧入口验证数字/混合优先级,不把兼容通过当新认证。 + 局部进展:相邻 Rust 工程已有结构有效 RunReport 的纯 SARIF 2.1.0 投影;未完成零发现仍显示失败通知,白名单 finding 保留且不自动 suppression,原生消息与路径留在私有证据。正式 CLI 格式入口、来源核验及全格式一致性仍缺,2.5 不勾选。 + 命令接入进展:实际 `check all/java --format sarif` 已从同轮局部反馈投影已观察的原生 finding;无发现、内部故障及取消仍用失败执行通知表达,原生诊断文本和路径不公开。它尚非完整 RunReport,`lint`/其它检查类命令、`--output`、可信来源和全格式一致性仍缺,2.5 保持未完成。 +- [x] 2.6 建立具名 legacy-v1 协议映射表和参数测试;验收:逐旧入口验证数字/混合优先级,不把兼容通过当新认证。证据:[逐入口映射表](../../../docs/rust-cli/legacy-v1-protocol-map.zh-CN.md) 与相邻 Rust 工程 `tests/acceptance/legacy-v1-protocol-map.md`;CLI 数字及 check/CVE/Dockerfile 混合优先级由 Rust 参数契约核验,MCP 无逐调用进程码、五类 Hook 宿主语义逐项登记,所有兼容投影固定 `not_evaluated`。旧插件 164 项相关回归及 7 项 MCP 实测通过。此项只完成协议映射,不声称 C35 兼容运行时、宿主接线或新版交付认证完成。 +- [ ] 2.7 实现 C01–C36 命令注册、help/版本元数据、操作结果类型与参数支持矩阵;验收:文档/help/CLI/MCP映射无漂移,查询/计划/安装成功不能变为质量allow。 + 进行中:相邻 `codeguard-cli` 已提供 C02 `--version --format human|json`,包含 CLI/目标平台/检查协议 major,并把尚无发布证明的构建身份、规则包兼容范围明确标为未验证;见 `schemas/version-report.schema.json` 和 `crates/codeguard-cli/tests/version_cli.rs`。其余命令注册、帮助生成、MCP 映射与版本化支持矩阵仍缺,暂不勾选。 +- [ ] 2.8 固化每类命令timeout/jobs默认值、来源与总deadline;验收:子进程/重试不重置预算,非法预算执行前拒绝,清理未完成真实可见。 + 进行中:相邻 Rust `check all` 局部入口现接受 1ms–24h 的 `--timeout`,默认 30m;非法预算在原生启动前返回 2,Ruff 版本探测与逐文件检查继承同一截止时间,超时给出 `request_deadline_exceeded` 而非本地完整。见 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。发现、持久化/清理硬预算、其它命令默认值来源、跨命令 jobs、重试和跨平台验收仍缺,不勾选。 + 后续进展:`lint python` CLI 复用相同检查类预算解析与 30m 默认值,从解析后建立截止时间并传入原生 Ruff 链;无效预算和原生探测超时有 CLI 回归。见相邻 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md`。任务复检、其它命令、来源报告及完整 I/O 预算仍待完成。 + 复检进展:`task verify` 局部 Ruff 入口现复用同一预算解析和截止时间;非法预算在租约前拒绝,原生探测超时后复检观察为 incomplete、不写新事件、自有租约释放、任务仍 open。见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`。租约和持久 I/O 的硬截止时间、来源报告、清理状态、jobs/重试及其它命令仍未完成。 + 来源进展:三个已接入 CLI 反馈均已版本升级,公开 `execution_budget` 明确记录最终毫秒值、来源及 `native_execution_only` 的实际执行边界;本地 0.8 原始扫描报告不因对话协议升级而改写。见相邻 `codeguard-cli/tests/acceptance/{check-all-partial-native,lint-python-auto-brief,task-verify-native-observation}.md`。全部 I/O 截止时间与清理状态仍缺,2.8 不勾选。 + 环境优先级进展:三个局部入口现登记 `CODEGUARD_TIMEOUT`,反馈来源枚举新增 `registered_environment`;非法环境值在原生执行/租约前返回 2,显式 CLI 可覆盖无效环境值。`CODEGUARD_JOBS` 目前只接 `check all`;完整 I/O 截止时间及清理状态仍缺。 + 项目默认进展:可选 `codeguard/runtime.json` 1.0 仅允许 `timeout`,三个局部入口按 CLI > 登记环境 > 项目默认 > 内置默认选择并报告 `project_default`;坏协议、额外质量排除字段、超限/链接文件及非法预算在原生执行/租约前拒绝。`check all` 另支持 1.1 可选 `jobs`、`--jobs`、`CODEGUARD_JOBS` 与 1–64 边界,并向 DAG 传入实际并发上限;反馈区分上限、原生节点数与启动数。混合 Python/Rust 项目现有两个独立节点,旧入口尚未扩展 jobs,实际并发及跨进程资源互斥仍需验收。见相邻 `codeguard-cli/schemas/runtime-options{,-1.1}.schema.json` 和 `tests/acceptance/{check-all-partial-native,lint-python-auto-brief,task-verify-native-observation}.md`。全部 I/O 截止时间及清理状态仍缺,2.8 不勾选。 +- [ ] 2.9 实现报告原子导出、可逆路径编码、多位置/包定位及来源保留;验收:output不可写为3且原finding保留,未知major拒绝,不按有损路径或相似文案跨工具抵消发现。 + 局部进展:`check all/java` 的 JSON/SARIF 已支持 `--output PATH` 同目录暂存与原子写入;目标不可用时本轮报告仍在 stdout,已发现的原生问题不丢;已有非 CodeGuard 文件不可覆盖。human/其它检查类命令、可逆路径与多位置/包身份、完整 RunReport 导出及跨工具归并仍缺,2.9 不勾选。 + 反馈补强:局部 JSON 0.18、故障报告 0.3 与局部 SARIF 现显式返回导出状态及受限失败原因码,使只消费结构化 stdout 的智能体也能看到保存失败;成功文件和 stdout 同报 `saved`。完整 2.9 仍未完成。 +- [ ] 2.10 升级 RunReport 与所有公开消费者的白名单处置协议;验收:新版本明确 raw/active/whitelisted finding、批准引用和 allow_with_exceptions,旧消费者拒绝未知决策而非降级为普通 allow,human/JSON/SARIF/MCP/Hook 语义一致。 + 进行中:相邻 `codeguard-cli` 已提供 RunReport 1.3 schema/严格消费和 conversation feedback 0.2 JSON/human,初期白名单协议与旧报告契约测试见 `tests/acceptance/run-report-allowlist-protocol.md`。后续已有保守 SARIF 投影,仍无真实报告生产、可信来源、MCP/Hook 消费者与端到端门禁,不勾选。 + 协议身份接线:RunReport 1.4 要求每条 finding 的完整原生身份,并在误报处置中核对精确决策身份;规则、工具制品、检查器类别和主目标须与本轮报告一致,源码字节/指纹/适配器/rulepack、依赖图/advisory 变化拒绝处置。旧 1.3 schema 原件留存,未来未知版本拒绝;human/JSON/SARIF 继续明确来源及批准未核验,不能凭自写报告签发 allow。当前仅结构消费,真实原工具身份生成、可信来源、MCP/Hook 和正式门禁仍缺,2.10/4.8 不勾选。 + 覆盖/字节复核增量:1.4 源码 finding 主目标必须同时属于本义务预期和实际覆盖集合;宿主可调用只读 `compare_claimed_source_hashes` 对其独立指定工作区内全部源码目标按真实字节比较 SHA-256,文件变化、缺失、链接或超预算均拒绝。该接口尚未由正式门禁调用,不能验证自称的原生结果或批准来源;2.10/4.8 不勾选。 + 领域进展:`codeguard-core` 门禁现保留原始/已批准例外/活跃阻断三个集合;完整且唯一的例外形成 `allow_with_exceptions`,混合真实阻断为 deny、未完成与批准冲突为 incomplete,取消和内部故障不能留下交付 allow。同一批准 ID 跨 finding 复用被拒。仅是纯领域输入契约,受保护审批来源、可信时钟/策略、真实原生身份和公开消费者仍未接入,见相邻 `codeguard-cli/tests/acceptance/allowlist-delivery-domain.md`,2.10/4.8/12.12 仍不勾选。 ## 3. S03 运行时、快照与缓存 依赖:S02。覆盖:execution-kernel、verdict-integrity。 -- [ ] 3.1 实现字面 argv/cwd/env/stdin 的受控进程执行;验收:空格/分号/命令替换字面值无额外执行,探测不消费 stdin。 +- [x] 3.1 实现字面 argv/cwd/env/stdin 的受控进程执行;验收:空格/分号/命令替换字面值无额外执行,探测不消费 stdin。证据:相邻 `codeguard-cli/crates/codeguard-runtime/tests/process_contract.rs` 的 Unix 契约测试与 `codeguard-cli/crates/codeguard-cli/tests/ruff_probe_contract.rs` 的原生 Ruff 版本探测;Windows Job Object 与平台验收由 3.3/11.12 保持未完成。 - [ ] 3.2 实现并发流读取、总 deadline、输出预算和私有原子日志;验收:洪流/编码错误/日志 symlink 场景无假完整、无越界写。 + 进行中:相邻 `codeguard-cli/crates/codeguard-runtime` 已覆盖 Unix 双流共享预算、短命令退出后才发现超限、直接子进程退出后读流跨过 deadline、超时部分输出和私有原子日志;日志目录逐级拒绝 symlink,Ruff 解析拒绝非 UTF-8 报告。Maven/Ruff 探测在身份和输入复核后再次检查同一截止时间。见 `codeguard-cli/tests/acceptance/runtime-stream-log-baseline.md`。持久化 I/O 的硬截止时间、Windows 对等实现和完整 CLI 门禁集成仍缺,暂不勾选。 + 读流稳定性补强:子进程退出后的 stdout/stderr 排空改用原请求绝对期限,避免原固定 150ms 在并行负载下将已关闭短命令误判为 `ReadFailure`;到期仍为未完成。ESLint 取消/超时回归的伪工具保持扫描时间长于截止时间,但给准备阶段充分启动余量,避免把测试负载抖动误判为扫描行为失败。目标回归及全量证据见 verification;3.2 仍因持久化 I/O、Windows 和正式门禁缺口未完成。 - [ ] 3.3 实现 Unix 进程组与 Windows Job Object 的取消/终止/回收;验收:子孙进程、超时、Ctrl-C、排队取消有平台实测。 + Unix 局部进展:相邻 Rust runtime 新增 CLI SIGINT 原子取消桥接,原生执行循环在取消后终止并回收进程组;`process_contract` 通过超时/取消后子孙进程不得延迟写文件的真实副作用测试,`lint_python_cli` 从红测到绿测证明真实 Ctrl-C 返回 incomplete、`request_cancelled` 且无后台延迟写入。仅在当前 macOS Unix 环境验证;Windows Job Object、排队取消与其它宿主入口仍缺,故不勾选。 - [ ] 3.4 实现任务 DAG、资源锁及依赖失败传播;验收:独立任务继续、共享 build 目录互斥、失败依赖未完成可见。 -- [ ] 3.5 实现工作树/index/ref 快照与原始字节校验;验收:SHA-1/SHA-256、坏批响应、特殊文件、symlink/gitlink/LFS 均明确处理。 -- [ ] 3.6 实现 GIT_INDEX_FILE、初始提交、worktree、多 ref/non-HEAD/删除 ref push 输入;验收:真实临时 Git 仓检查准确且 index 不变。 + 纯领域/运行时进展:相邻 Rust core 新增执行前校验的 `TaskGraph`,拒绝重复 ID、缺失/重复/自依赖、重复资源和依赖环;runtime 新增有界并发调度,按资源 ID 互斥,失败链逐层标记 `DependencyFailed`,独立任务继续,排队取消/超时不启动,回调 panic 不当成功。见 `codeguard-cli/tests/acceptance/task-dag-scheduler.md`。正式 CheckPlan/义务账本与 CLI 尚未接线,构建目录资源规范化和跨进程锁也未实现,故不勾选。 + CLI 局部接线:`check all` 将适用的 Python/Ruff 与 Rust/Cargo Clippy 节点送入调度器,共用取消标记和截止时间;公开 `check_feedback` 0.6 的 `execution_tasks` 把本地原生完成标为 `native_observed_unverified`,混合项目一个节点失败不丢另一个节点的诊断。真实并发、正式义务清单和构建目录资源规范化仍缺,见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 + Java 扩展:`check_feedback` 0.7 增加 `java.p3c` 独立节点,复用相同截止时间和取消标志,缺项目配置或工具前提仍保留文件级原因。原生 Maven 探针使用私有临时工作区;完整规则集、跨模块构建资源锁及工作区级义务仍缺,3.4 不勾选。 +- [ ] 3.5 实现工作树/index/ref 快照与原始字节校验;验收:SHA-1/SHA-256、坏批响应、特殊文件、symlink/gitlink/LFS 均明确处理。进行中:相邻 Rust CLI 已按 NUL 协议读取真实 index、前后复核列表,并对有界普通 blob 独立核验 SHA-1/SHA-256 Git OID、记录脱敏字节摘要;symlink/gitlink/LFS、超预算和对象读取失败明确 unresolved,见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。工作树/ref 快照、坏批响应注入测试、特殊类型完整语义及 Git 工具身份未完成。 +- [ ] 3.6 实现 GIT_INDEX_FILE、初始提交、worktree、多 ref/non-HEAD/删除 ref push 输入;验收:真实临时 Git 仓检查准确且 index 不变。进行中:相邻 Rust 的真实 index 路径安全预览覆盖初始仓库、替代 `GIT_INDEX_FILE` 与默认 index 不变;worktree 和 pre-push 多 ref/删除 ref 尚未实现,不勾选。 - [ ] 3.7 实现执行前后内容身份复核和源码副作用检测;验收:并发编辑或检查器改源码导致 incomplete。 + 进行中:相邻 Rust runtime 新增显式相对路径的有界 `SourceSnapshot`,拒绝静态可见的路径越界、重复、符号链接及预算超限;私有副本须写入新目录,运行后复核原件与副本字节。JDK Javadoc 单文件入口已使用此契约,真实 JDK 21 与链接/修改反例通过,见 `codeguard-cli/tests/acceptance/source-snapshot-boundary.md`。调用方源集完整性、并发目录替换的内核级隔离、其它 adapter 接线和项目级 Maven 副作用仍缺,3.7 不勾选。 + 路径并发补强:Unix 读取和复核改为从固定根目录描述符逐级 `openat`/`O_NOFOLLOW`,目录在检查期间切换为范围外符号链接的真实并发反例只能返回原范围字节或错误。副本写入和整个原生进程仍无完整沙箱;源集完整性、其它 adapter 接线和项目级 Maven 副作用仍缺,3.7 不勾选。 + `check all/java` 局部范围复核:原生节点结束后再次静态发现,比较源码/清单集合、构建根、已观察清单/锁/检查器配置摘要及配置状态;新增源码或规则配置变化会加入 `project_scope_changed_during_check`,原诊断保留。截止时间已耗尽则报告范围复核未执行;自有 `codeguard/state` 记录不造成假变化。尚未逐字节冻结全部源码、捕获瞬时改回、实现完整内核隔离或受保护义务账本,3.7/2.4 不勾选。 + 同路径内容复核增量:`check all/java` 在原生节点前对初次发现的源码集合建立有界 `SourceSnapshot`,节点后从固定根目录描述符复核原路径字节。同一路径内容变化加入 `project_source_changed_during_check`;文件数/单文件/总字节超限或安全读取失败显式标记快照或复核不可用,不产生 allow。静态配置文件若同时被归类为源码,其内容变化也可触发此项;仅写入 CodeGuard 自有记录不触发。快照非原子、无进程沙箱,改后又改回、末次复核之后的变化和未发现目标尚不能捕获,3.7/2.4 仍不勾选。 - [ ] 3.8 实现严格缓存及义务等价证明;验收:同 mtime/size 内容替换、规则/依赖/工具/库变化必失效,软缓存不可直接认证。 +- [ ] 3.9 实现run/obligation/task/attempt关联轨迹与分阶段计时、缓存/终止原因;交付:脱敏结构化本地事件;验收:部分失败可追溯,公开轨迹不泄露原始argv/env,不默认上传遥测。 +- [ ] 3.10 实现证据索引、私有权限、引用与保留策略及受管清理;验收:活动run/lease、被引用证据、用户源码和tracked历史不被清理,磁盘/权限/symlink失败不扩大删除或伪造完成。 +- [ ] 3.11 实现离线与可信执行边界port及能力探测;验收:主动联网子进程被拒绝,无法保证时启动前incomplete;可信政策/签发身份不进入项目脚本执行域,真实平台证明由S11/S12补齐。 ## 4. S04 规则与策略权威 依赖:S02。覆盖:rulepack-governance。 - [ ] 4.1 实现运行配置与批准质量策略的独立解析及 config explain;验收:CLI/env 无法弱化 required/threshold/exclude。 + 进行中:相邻 Rust CLI 已有 `quality-policy-candidate` 1.0 严格解析,并在 `config validate/explain --policy-candidate` 只读显示必需检查、规则包/工具锁摘要、时效和精确内容绑定排除;重复、未知、自批和通配被拒。候选即使与本地工具锁字节匹配仍固定 `candidate_unverified`,不形成有效策略。运行参数与受保护批准策略的绑定及真实覆盖仍缺,见 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`,4.1 不勾选。 - [ ] 4.2 实现旧 codeguard.json 显式迁移和原生 suppressions 差异解释;验收:未知/损坏字段不静默丢弃或按默认通过。 + 追加进展:相邻 Rust CLI 的 `config validate/explain` 已只读识别旧 `extensions/exclude/gate_scope/java.commands`,拒绝未知/损坏字段、符号链接与坏工具锁;旧排除、delta 范围和命令均不自授策略权威,固定退出 3。尚未执行正式 schema 迁移或覆盖完整原生 suppressions,见 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`。 + 进行中:Ruff 0.16.8 局部扫描现以同轮原生 `--ignore-noqa` 对照记录源码注释抑制差额,原生结果未据此生成活动 finding 或质量通过;这尚不构成旧配置迁移、受批准 suppressions 差异解释或其它生态覆盖。见 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 - [ ] 4.3 实现 rulepack manifest、来源/许可、稳定规则 ID、摘要和兼容锁;验收:内容篡改/不兼容组合不能执行认证。 + 进行中:相邻 Rust 工程新增仅用于 Ruff 0.16.8 F401/E501 的 `candidate_unapproved` 映射清单,严格解析来源、许可、精确版本、规则 ID 和字节摘要;完整本地报告记录已观察到的映射身份,同步时重算并拒绝篡改。它不设置原生规则覆盖,也不具备受保护批准,不能执行认证。见 `codeguard-cli/tests/acceptance/ruff-rulepack-observation.md`。 - [ ] 4.4 实现基线仅分类 new/existing;验收:未修改文件中的存量违规仍阻断,基线失败不消除 finding。 - [ ] 4.5 实现可信政策修订和例外输入校验;验收:agent 自写批准、无到期、过期、错内容或错范围凭据不生效,批准例外不显示普通 PASS。 -- [ ] 4.6 保留点前缀默认策略及两项例外,生成汇总覆盖;验收:F18 全部成立,无未授权的新排除。 + 签名进展:Rust 已增加域分隔 Ed25519 原始载荷核验,绑定工作区、策略修订、受保护 Git 基线、序号、期限与快照字节;普通候选桥接还核对签名与快照内修订,再走精确字节/身份绑定。可信公钥、撤销、时间和最低序号仍须由宿主提供;未提供项目自批入口。签名四项及原快照十五项通过,见相邻 codeguard-cli/tests/acceptance/signed-approval-binding.md。宿主信任来源、完整签名修订链及真实门禁尚缺,4.5/4.8 不勾选。 +- [ ] 4.6 保留点前缀默认策略及两项例外,生成汇总覆盖;验收:F18 全部成立,无未授权的新排除。进行中:相邻 Rust `detect` 0.3.0 已汇总普通发现的点前缀排除根、配置例外文件及未评估入库安全状态;`gate pre-commit` 路径安全预览能在真实 index 看到点前缀 `.env`,见 `codeguard-cli/tests/acceptance/{dot-prefix-scope-baseline,git-index-safety-preview}.md`。完整安全内容扫描与正式 Git 门禁未接线,不能勾选。 +- [ ] 4.7 接入 rules list/config validate/explain 命令;验收:有效规则、原生suppression与批准来源可解释,静态验证不执行项目脚本,配置错误为未完成而非源码违规。 + 追加进展:`config validate/explain` 0.1 只返回旧配置与工具锁的静态状态、未绑定的可信质量策略和无效白名单权威;不产生有效策略或质量门禁。`rules list`、规则/原生配置差异和批准来源解释仍缺,任务不勾选。 + 2026-09-27入口进展:Rust rules list现复用静态发现及内置版本化Ruff候选映射,逐语言显示配置声明、来源/许可/摘要/兼容版本和六类目录缺口;Node生态显式映射到TypeScript,不靠语言前缀丢失ESLint配置。动态配置不执行、本地同名映射/自批不授权,报告0.1固定未完成且无门禁效果。新增schema及验收用例,结果见verification.md。完整有效规则、可信来源、suppression和批准例外仍缺,4.7不勾选。 +- [ ] 4.8 实现精确误报白名单 schema、可信来源解析和 Rust 匹配器;验收:仅同一原生规则、目标/内容、工具/规则包/适配器及有效批准身份命中;通配、过期、冲突、自批和坏报告均不放行,原始 finding 保留。 + 门禁碰撞反例:两个原生规则/义务共用 finding ID 时,旧纯领域门禁会把单条批准扩展到另一条;现将重复 ID 标为无效义务账本,白名单不匹配,原始阻断仍显示。可信批准接入、本轮原生身份和所有格式消费者仍缺,4.8 不勾选。 + 原生身份加固:领域 finding 现可携本轮宿主冻结的完整身份,白名单处置必须同时与该独立身份匹配;缺字段的旧 finding、源码字节/指纹/工具/适配器/rulepack 摘要变化、依赖图或 advisory 变化均保留原始和活动阻断并返回 incomplete。该字段由谁从真实原工具和内容字节生成、如何验证宿主来源尚未接入;项目 JSON 自填同值不能取得信任,4.8 继续未完成。 + 进行中:相邻 `codeguard-cli` 已实现不具授权效果的精确身份匹配、严格候选 schema/解析器、期限/策略修订/多候选冲突筛选,以及批准快照的字节摘要绑定;后者可拒绝不在先前固定快照中的候选,但预期摘要仍由调用方提供。见 `tests/acceptance/false-positive-identity-baseline.md` 与 `tests/acceptance/approval-snapshot-baseline.md`。可信策略/时钟和摘要来源、批准引用独立核验、同 PR 自批的受保护 CI 验证及门禁接线仍缺,不勾选。 +- [ ] 4.9 接入 `rules whitelist list/explain/propose` 与 config validate/explain;验收:propose 只从本轮完整原生 finding、工具/适配器/rulepack 身份和内容复核生成候选;缺任何身份则报告未完成与补证据动作,不能填占位摘要;查询解释批准与失配原因,普通项目文件不能自授权,系统性误报走经批准的规则修订。进行中:相邻 Rust CLI 已提供显式候选文件的只读 `rules whitelist list/explain`;explain 可对显式提供的发现身份解释精确匹配或失配,观察身份与批准来源均未核验,始终标记 `authority=unverified`、`gate_effect=none`;坏文件、重复 ID、缺失目标均不能呈现为批准。`propose` 已能从本地稳定任务返回缺本轮身份的未完成预览,固定 candidate=null、无门禁效果,见 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`。`config validate/explain` 已有只读候选解析但不能解释可信批准、期限或本轮 finding;自动发现与完整候选生成仍未完成。 + 读取加固:`list/explain` 的候选与显式观察身份、纠错入口的旧决策与替代候选,现统一使用运行时有界普通文件读取,拒绝最终路径符号链接并避免文件类型检查后按路径重新打开;查询命中仍不取得批准。相关回归见相邻 `codeguard-cli/crates/codeguard-cli/tests/whitelist_command_contract.rs`;完整可信来源与门禁仍缺。 + 冲突纠正:同一稳定 finding ID 的两条候选即使目标不同,`list/explain` 也将双方标为冲突,不输出任选一条的身份匹配。查询层改动不等于可信批准接入,4.9 不勾选。 + 前置进展:Ruff 局部报告 0.5 已对完整文件记录本轮工具与配置摘要,未完成文件为空;`propose` 0.2 只从最新已同步报告读取仍存在的当前 finding 与这些摘要,未同步/源码变化/新扫描问题消失不回退旧观察。这仍是本地未验证身份,缺适配器、批准 rulepack、可信来源和完整候选生成,见 `codeguard-cli/tests/acceptance/ruff-observed-artifact-identity.md` 与 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`,4.8/4.9 均不勾选。 + 后续进展:局部报告 0.6 与 `propose` 0.3 额外展示 F401/E501 候选规则映射的 CodeGuard 规则 ID、原生工具版本、清单摘要和 `candidate_unapproved`,并将 `approved_rulepack_identity` 明列为缺失证据。该摘要只是本地观察,不会自批准或放行,见 `codeguard-cli/tests/acceptance/ruff-rulepack-observation.md`。 + 适配器身份进展:Ruff 局部报告 0.9 在有原生 finding 且仍有检查预算时记录本次 CodeGuard 可执行制品摘要;`propose` 从已同步报告读取后再核对当前二进制,变更时拒绝旧观察,缺摘要时明确列为未完成。公开 lint 0.12、候选预览 0.4 和 Ruff task verify 0.9 按协议升级,旧 schema 留存;真实 Ruff 复检和篡改报告/同步标记反例通过。该摘要未证明签名发行、批准 rulepack、人工裁定或可信门禁,4.8/4.9 继续不勾选。 + 工具身份复核进展:`propose` 可显式接收绝对 `--ruff-tool`,按当前普通文件字节复核扫描报告摘要;不同或不可读时隐去旧观察、保持 candidate=null/退出 3,不执行工具或签发批准。已增加参数边界及真实 Ruff 正反例;未指定工具时仍只能展示未获信任的历史摘要。可信工具来源、完整候选和独立审批未接通,4.9 不勾选。 +- [ ] 4.10 实现白名单纠错闭环与规则级误报升级路径;验收:候选/驳回/批准/过期/撤销/失配关联稳定 finding 和任务,已批准例外不伪装为代码修复;误批或过宽条目采用旧决策撤销、新候选引用旧决策、独立批准的修订链,冲突或未批准期间不得放行,原任务重开;纠错提案含原决策/稳定 finding/结构化原因/本轮复检引用,替代候选有新 ID 与 replaces_decision_id;只撤销不制造替代、引用链无环、旧新原子切换、扩大范围拒绝;同规则多目标误报生成规则或适配器根因调查,须以正反例和受保护策略修订处理,不自动扩大白名单;评测保留原始发现和人工裁定误报率。进行中:相邻 Rust 快照协议 1.1 可固定撤销 ID,绑定时撤销优先于旧字节命中;可信发布、修订链事件、真实门禁和任务重开仍缺。 + 本轮进展:相邻 Rust 增加替代候选 1.1 schema 与 `replaces_decision_id`,普通绑定不接受缺旧决策的替代结果;专用绑定校验旧决策引用、同一 finding/检查器/规则/类别/目标归属及同快照撤销旧 ID。旧决策来源可信性、完整修订链无环、纠错提案 CLI、任务投影和受保护发布仍缺,任务不勾选。 + 后续进展:前序快照绑定再核对旧决策的字节摘要与原策略修订,拒绝旧字节篡改、前序已撤销、缺固定摘要与新旧同修订;摘要来源和修订先后顺序仍由受保护发布边界证明,多级链及真实门禁未完成。 + 多跳进展:Rust 现可逐跳验证最多 32 个前序候选/快照直到普通根决策,拒绝链截断、乱序、多余节点、重复 ID/修订的环及前序候选超过当时有效期上限。可信发布来源与真实时间顺序、纠错提案/任务事件和真实门禁仍缺,4.10 保持未完成。 + 纠错入口进展:`rules whitelist propose` 追加只读纠错参数,可从已核对的本轮 Ruff `task verify` 收据、稳定 finding 和旧候选预览撤销;仅撤销与替代草稿分别表达,错 run/错目标/复检后源码变化不生成提案。替代身份仍缺批准的适配器和 rulepack,候选/撤销事件、独立批准与门禁未接入,保持未完成。 + 持久记录进展:纠错命令可选 `--record`,持任务锁重查复检证据,将同一提案按内容摘要幂等记录到稳定 finding 的事件目录;事件携带 task_id、原决策/新草稿和复检引用,固定未验证且无门禁效果。`next` 当前简报已可显示待审事件引用,但持久任务 Markdown 投影、独立批准、可信策略发布与真实门禁仍缺,4.10 不勾选。 + + 可读投影进展:纠错 --record 现从持锁重查的同一提案生成 tasks/corrections//.md 历史附件,保留七项任务信息、事件和复检引用。事件保存后附件失败单独反馈,编辑不覆盖、删除可重建;next 只展示与当前事件重建字节一致的附件,不从 Markdown 读取指令。完整任务协调、独立批准、可信发布及正式关闭仍缺,4.10/9.28 不勾选。 + + 复检配置进展:Ruff 当前简报与误报提案复核目标目前选择的配置路径及字节摘要,配置内容或优先级变化时旧观察不驱动纠错;缺配置身份的旧报告要求重新检查。真实 RED 复现 F401→E501 后旧纠错仍展示,以及新增同字节 .ruff.toml 后普通提案仍用旧配置;两者已接入同一只读发现复核。完整可信批准与自动候选仍缺,4.9/4.10 不勾选。 + + 签名链进展:Rust 多跳入口逐跳核验历史签名、快照修订、同工作区、严格序号与时间顺序、历史候选在受保护审核时刻有效;所有 pin 由验签推导,再沿用原精确替代/撤销/无环绑定。历史过期不抹去当时合法批准,公钥最新撤销仍阻止绑定;32 跳上限。三项签名链反例及单快照/旧快照/边界回归通过,见相邻 codeguard-cli/tests/acceptance/signed-approval-chain-binding.md。宿主信任来源、Git 基线祖先与真实发布/门禁仍缺,4.10 不勾选。 + + Git 基线进展:runtime 原生只读祖先观察与 CLI 签名链联合入口已接通,完整提交、对象类型、非浅历史与每跳关系均须匹配;replace/graft 和 lazy fetch 禁用,同一预算/取消贯穿所有调用。真实 SHA-1/SHA-256、伪造关系、缺对象及本地传输正反对照四项,签名链五项通过,见 codeguard-cli/tests/acceptance/git-approval-baseline-binding.md。可信仓库/工具/公钥来源与真实策略发布、宿主门禁仍缺,4.5/4.10 不勾选。 + + 原生 finding 关联进展:领域门禁新增受保护宿主冻结的 checker/tool/category/obligation 映射,并核对原生主定位的源码路径或依赖组件及显式版本;缺定位、错工具/类别/义务、缺失或歧义映射不应用白名单。处置前预先识别重复 finding 引用及复用的批准决策 ID,冲突双方均保留活动阻断,顺序不影响结果。门禁 26 项、会话 8 项与反馈/报告/SARIF 回归通过,见 codeguard-cli/tests/acceptance/native-allowlist-disposition-binding.md。当前为领域/协议用例,可信来源、签名批准到真实原生报告的宿主接线仍缺,4.8/4.10 不勾选。 + + 最终期限进展:领域门禁新增宿主最终判定时钟,要求 observed_at <= gate_time_unix < expires_at 且时钟非零;检查结束到期、缺时钟或回退不沿用取证时刻放行。已验签结果暴露只读 expires_at,当前边界须取当前批准相关约束的最早期限,不用历史到期缩短合法替代条目。门禁增至 29 项,真实时钟来源与批准生产/宿主接线仍缺,见 codeguard-cli/tests/acceptance/final-gate-approval-clock.md,4.5/4.8 不勾选。 + + 签名处置接线进展:门禁新增宿主独立冻结的当前策略修订;旧/缺修订不能沿用白名单。普通及替代签名入口生成只读绑定预览,固定候选/快照摘要、范围、身份和最早期限;替代必须先核验完整签名/Git 链。独立批准标记始终 false,不能从项目 JSON 构造或自批。门禁 30 项、处置三项、实际 Git 链补充用例及受影响回归通过,见 codeguard-cli/tests/acceptance/signed-disposition-preview-binding.md。可信来源及真实批准生产/门禁仍缺,4.5/4.8 不勾选。 + 范围接线进展:只读签名预览保留工作区及当前批准基线,领域门禁与独立冻结范围比较。跨工作区、错基线、非法/缺范围和旧输入均不能应用白名单;没有白名单的普通判定保留。可信宿主来源及正式门禁仍未接通,4.8 不勾选;验收见相邻 codeguard-cli/tests/acceptance/approval-scope-gate-binding.md。 ## 5. S05 工具适配框架与准备 @@ -55,205 +141,397 @@ - [ ] 5.1 实现 capability/discover/resolve/plan/parse/coverage/fix 协议与编译期注册;验收:adapter 不绕开运行时启动进程或联网。 - [ ] 5.2 实现工具解析、二进制身份、doctor 和 tool lock 验证;验收:wrapper/受管缓存/系统工具均匹配锁,缺工具返回恢复步骤。 + 原生版本进展:统一 runtime 版本探测核对固定参数、工具前后字节、精确 stdout 与私有日志,共享截止时间;超时/取消/spawn/signal/超限/非零退出、版本/stderr/字节变化/日志失败分别保留诊断。现有 Ruff 启动阶段已复用,不完整时不扫描源码。真实 Ruff 0.16.8 版本调用验收与模拟故障分层;doctor CLI、可信锁、完整兼容/环境及准备报告仍缺,5.2/5.6 不勾选;见相邻 tests/acceptance/native-version-diagnostics.md。 + + 进行中:相邻 `codeguard-cli/crates/codeguard-cli/src/tool_identity.rs` 和 `crates/codeguard-cli/tests/tool_identity_contract.rs` 已对三种 origin 的入口、基础可执行位、独立运行时及有界目录树 bundle 摘要作只读核验;真实 Maven libexec 全树通过本地测试锁核对,委托 jar 篡改被拒绝;见 `codeguard-cli/tests/acceptance/tool-identity-baseline.md`。可信锁来源、完整动态依赖闭包、doctor 与恢复步骤仍缺,不能勾选 5.2。 + Ruff 局部原生报告另记录完成文件的工具/配置字节摘要并在整轮末复核,未完成文件不声称身份;尚未接受保护工具锁,见 `codeguard-cli/tests/acceptance/ruff-observed-artifact-identity.md`。 - [ ] 5.3 实现独立 tools install 流程、下载清单与校验;验收:普通 check/plan/doctor 不隐式安装;真实主动联网 wrapper 在离线隔离中被阻止,无法隔离则启动前 incomplete。 + 网络编排进展:download_and_publish_signed_distribution 请求前核对签名/本机平台/精确工具/完整定位及宿主精确站点许可,下载后共享预算进入签名发布服务。拒绝无许可/通配等五类前置反例;另显式固定 Rust 官方仓库提交 LICENSE-MIT 的真实公共 HTTPS、摘要和临时发布 1 项通过(0.70 秒),不执行内容、测试 key 不是真实发行批准。真实宿主来源、正式 CLI apply/运行时/恢复/跨平台仍缺,5.3 不勾选,见相邻 tests/acceptance/signed-network-publication.md。 + 签名发布编排进展:新增明确调用的离线包发布入口,按本机平台、精确工具绑定签名/原锁,raw 或完整布局关联后独立缓存发布;前/发布前/发布后时钟复核,拒绝回退,全部阶段共享预算取消。5 项目标契约通过,覆盖 raw/ZIP 原定位与复用、错误身份/包/签名/平台/工具/时钟、已有损坏目标保留,以及发布后时钟缺失失败再重验。尚无真实宿主信任/网络/正式 CLI 安装/运行时/恢复闭环,5.3 不勾选,见相邻 tests/acceptance/signed-package-publication.md。 + 发行签名进展:新增独立 distribution.v1 Ed25519 域,绑定原始清单/锁、发行者/通道/平台、序号及有效期,严格清单/锁关联后返回只读结果。宿主公钥/撤销/时钟/最低序号真实性仍外置;无项目自批或签发命令。可信宿主和正式下载/install 编排尚缺,5.3 不勾选;见相邻 tests/acceptance/signed-distribution-binding.md。 + HTTPS 传输进展:Rust runtime 新增 TLS 验证、固定字节/摘要、有界手动重定向、共享绝对期限和取消的异步包下载 API;禁环境代理/自动重试/内容解压,状态/编码/长度/摘要不符无半成品。11 项本地 TLS 测试及 96 项相关回归通过;gzip, chunked 接受缺口先复现后修复。来源批准、正式清单到下载/发布接线、apply/运行时/恢复及跨平台仍缺,5.3 不勾选;见相邻 tests/acceptance/package-https-transport.md。 + 下载/展开串联进展:download_verified_archive 请求前校验同一包摘要、格式/入口/预算/完整摘要,下载后以共享预算核对包、入口与完整树,不返回局部成功。新增本地 TLS ZIP/tar.gz→完整树→私有临时目录发布及 raw→字节发布,错误整树/包身份拒绝、声明冲突与无效输入不发请求。15 项 HTTPS 目标测试通过;正式授权、CLI 接线/运行时/恢复仍缺,5.3 不勾选,见相邻 tests/acceptance/downloaded-package-publication.md。 + 完整树进展:新增保留空目录/父目录的 UnpackedArchive 入口,旧文件集合接口保留;内存树按既有 bundle-tree-v1 本机顺序计算/核验,公开构造对象重新检查形状/路径/总量和预期摘要。真实临时目录与原 CLI 算法精确相同,库篡改、空目录缺失、乱序/非法输入/取消/到期反例通过。本轮相关回归 54 项通过,1 项原生缓存 ignored 不计运行;bundle 根映射、批准及完整目录发布/下载/apply 尚缺,5.3 不勾选,见相邻 tests/acceptance/unpacked-bundle-tree.md。 + GNU/PAX 后续:支持下一成员的有界 GNU 路径/局部 PAX path、size 及无害全局描述;完整路径覆盖截断旧头,size 控制真实边界而非一律与旧头相等。17 项归档回归覆盖危险/重复/矛盾/孤立/损坏/超限扩展及标准 tar 解析交叉核对。全局 path/size、sparse/链接、bundle/目录发布、可信下载/批准及 apply 仍缺,不勾选;见相邻 tests/acceptance/tar-extension-verification.md。 + 归档基础:runtime 新增 ZIP/tar.gz 内存展开,先核对包/入口摘要,全成员路径/类型/冲突、成员数及文件/容器预算检查,无文件系统解包或授权。11 项归档用例通过,两格式均串联包流→展开→临时缓存发布;首轮 tar GNU/PAX 等扩展明确拒绝,后续能力见上一条进展。完整 bundle 树、目录发布、可信下载/批准、CLI apply 与全平台仍缺,不勾选;见相邻 tests/acceptance/package-archive-expansion.md。 + 输入修复:共享静态文件读取器采用 Unix 非阻塞打开,再按同一句柄拒绝特殊类型;修复无写入端 FIFO 在类型核验前卡住锁/发行清单观察的问题。先由独立测试子进程复现并回收,再验收读取器及 install 两个输入入口。仅为 Unix 特殊文件边界,网络/发行授权/归档/正式 apply 与跨平台仍未完成;见相邻 tests/acceptance/bounded-input-fifo.md。 + 包流基础:runtime 新增精确长度/非零 SHA-256 校验的有界读取 API,128 MiB 上限,超长至多读取多一个字节,读取前后检查取消/期限;错误仅固定诊断,不返回半成品。9 项包流与 10 项缓存发布测试通过,1 项真实工具测试本轮 ignored 不计运行。临时缓存串联验证成功 raw 字节发布/复用及错误字节不进入发布。尚无网络读取超时、下载/展开/批准及正式 apply,5.3 不勾选,见相邻 tests/acceptance/package-stream-verification.md。 + 清单 CLI 接线进展:install 显式 --distribution-manifest FILE,反馈 0.2 分层显示固定诊断和逐工具脱敏包声明。来源 URI 只给摘要,原锁失配/坏清单/符号链接拒绝,声明子集不消除其它工具或运行时缺口;apply 仍写前阻塞。22 项命令、11 项清单、4 项边界回归,7 份实际 schema 与 4 个伪造权限反例通过;可信下载/展开/正式 apply 未实现,5.3 不勾选,见相邻 tests/acceptance/tools-install-manifest-preview.md。 + 发行清单进展:新增 1.0 严格解析与原始锁字节绑定 API/schema,精确工具/平台/版本/来源/二进制/bundle,限定 HTTPS 和包大小、相对归档入口;绑定时重验对象,拒绝重复字段、未知批准与错身份。11 项契约、4 项 crate 边界通过;schema 4 正例/16 反例通过。清单只是声明子集,不授予来源/安装权限;下载、展开、可信发布及 CLI 接入仍缺,5.3 不勾选,见相邻 tests/acceptance/distribution-manifest-binding.md。 + CLI 预览进展:tools install --lock FILE 默认 dry-run,共用库存/身份核验,绑定锁/二进制/来源引用摘要,分别解释平台与恢复动作。未绑定可信来源的 apply 在写入前明确阻塞,不调用发布 API。32 项回归、实际预览 schema、模式冲突及伪造完成反例通过;可信下载/发行包/正式 apply 未接通,不勾选,见相邻 tests/acceptance/tools-install-preview.md。 + 缓存发布基础:runtime 已提供有界冻结字节/预期 SHA-256 的目录 FD 发布服务;私有独占暂存、写后校验、linkat 不覆盖发布及最终复核,拒绝链接/FIFO/错误权限/损坏目标,重复重验后复用,取消/超时不返回成功。53 项普通相关回归及 1 项显式真实 Ruff 临时发布/原生版本通过。收据不授予发行批准或准备状态;可信下载清单、CLI 预览/apply、压缩包和全平台尚缺,不勾选。见相邻 tests/acceptance/tool-cache-publication.md。 + 5.3 补充进展:显式归档目录投影 API 先验证完整树,再按目录边界去前缀、保留空目录并匹配 bundle 摘要;未消费成员保留原路径和内容。59 项相关测试通过,包含实际临时目录摘要交叉核对;1 项原生缓存测试 ignored。正式清单映射、可信来源、下载/目录发布/apply 尚缺,5.3 不勾选;见相邻 tests/acceptance/bundle-root-projection.md。 + 发行包关联进展:清单 1.1 显式 bundle_archive_root 与 1.0 兼容观察;新增冻结包关联 API,绑定同一锁、包大小/摘要、入口与子树,返回只读树及剩余成员,不写安装目录。清单 13、关联 3、命令 23 共 39 项测试及 schema 4 正例/10 反例通过;可信来源、实际缓存根映射/目录发布/apply 仍缺,5.3 不勾选,见相邻 tests/acceptance/distribution-bundle-binding.md。 + 目录发布进展:macOS/Linux API 使用固定目录 FD、私有独占暂存、逐成员写后/完整集合重验和不覆盖原子目录重命名,取消清理本次暂存;坏已有目标保留并拒绝,并发同树只一方新发布。6 项目录发布、既有缓存 10、投影 4、CLI 57,共 77 项相关用例通过(1 项原生缓存 ignored);正式缓存根映射、其它包成员/运行时、可信下载与 apply 仍缺,5.3 不勾选,见相邻 tests/acceptance/tool-bundle-publication.md。 + 完整布局进展:清单 1.2 声明完整安装树摘要,精确绑定同一内容寻址目录下的锁入口/bundle 根;错路径拒绝,不重写锁。只读布局保留入口、空目录及 bundle 外全部普通成员,分别核验整树/子树。55 项相关测试及 schema 5 正例/7 反例通过;实际临时缓存发布后原锁入口和 bundle 核验匹配。正式 CLI 布局反馈、可信下载/批准、raw/运行时安装与恢复仍缺,5.3 不勾选,见相邻 tests/acceptance/distribution-layout-binding.md。 + CLI 布局反馈进展:install 预览 0.3 区分完整路径声明绑定/缺完整树/raw 不适用,显示内容寻址目录与定位摘要,内容核验固定 not_run;不读取包或调用发布,未批准 apply 仍写前阻塞。48 项相关测试、8 份实际 schema 输出、4 个伪造完成及 2 个格式/阶段矛盾反例通过;0.2 schema 单独保留,私有路径/地址不回显。批准/真实下载/apply 与恢复仍缺,5.3/5.6 不勾选,见相邻 tests/acceptance/tools-install-layout-preview.md。 + raw 定位/内容进展:1.2 原锁入口精确绑定二进制摘要.bin,错路径即使来源引用摘要匹配仍拒绝;有界分块核验返回无复制只读借用视图,预览正确区分新版定位已绑定/旧版需映射。53 项普通回归及 1 项显式真实 Ruff 0.16.8 关联/缓存发布/版本观察通过;4 份实际 raw schema 输出与伪造内容反例通过。可信下载/批准、运行时和正式 apply/恢复仍缺,5.3 不勾选;见相邻 tests/acceptance/distribution-raw-binding.md。 - [ ] 5.4 实现报告产物 freshness、scope/rule 执行覆盖核对;验收:陈旧或伪造空成功报告不能通过。 + 进行中:Ruff 0.16.8 局部扫描已在同轮原生执行 `--show-settings`,记录 F401/E501 全局启用状态及逐文件忽略存在性;报告规则与设置矛盾即 incomplete,损坏设置亦不作为干净证明。设置仍不能证明 `noqa` 等源码内 suppression 或批准策略 required rules 覆盖,故 `coverage_proven=false`;见 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 + 后续进展:同轮 `--ignore-noqa` 对照已使源码注释抑制成为独立观察;正常诊断不包含于对照即 incomplete。仅被抑制的文件标记 `suppressed` 而非 `passed`,旧任务加 `noqa` 后复检进入 `suppression_requires_review`。逐文件配置忽略、批准规则集合和完整门禁仍缺,见 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 + 进行中:相邻 `codeguard-cli/crates/codeguard-runtime` 已实现只读新鲜报告槽位与原生执行/私有日志/报告读取的同轮组合,旧报告在 spawn 前拒绝,缺报告、链接、超限或日志失败均不返回完整结果;见 `tests/acceptance/fresh-native-report-baseline.md`。PMD 6 固定 `-r` 参数已接入局部 Rust 试运行服务,核对源码、启动器及整个工具目录树的前后摘要,并核对报告文件范围、退出码与诊断数量;见 `tests/acceptance/pmd6-runtime-probe-baseline.md`。已批准制品的锁定来源与规则实际生效证据、项目扫描范围、正式 `check` 接线及同用户并发篡改防护仍缺,不能勾选。 - [ ] 5.5 建立 adapter conformance harness;验收:F01–F10、F17 的有效与畸形报告可独立复用,mock 与真工具证据分层。 + F05 增量:相邻 Rust `cve rust` 对结构有效且绑定当前锁的 cargo-audit advisory,即使原生程序随后异常退出、输出完整报告后超时或在其它输出超限后,也保留局部 finding 和 `incomplete`;残缺 stdout JSON 不制造 finding,已初始化工作区仍能同步稳定完整性任务。模拟原生进程、真实工具与全适配器矩阵分层记录,见 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。通用 conformance harness、单体 stdout 报告截断恢复、其它适配器及 F01–F10/F17 全矩阵仍缺,5.5 不勾选。 + Python CVE F05 增量:`pip-audit` 的完整 JSON 在异常退出、输出后超时或其它输出超限时,仍按本轮 PEP 751 锁归属保留局部 advisory 和具体未完成原因;残缺 JSON、锁外组件不生造项目 finding。已初始化工作区保存待核验证据并同步稳定完整性任务,见 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。模拟器不替代真实 pip-audit,通用 conformance harness 和全适配器矩阵仍缺,5.5 不勾选。 +- [ ] 5.6 实现 tools list/verify/install 的库存、制品身份和默认预览/显式安装边界,以及doctor准备报告;验收:身份通过不等于可启动,安装部分失败可恢复,准备证据带run_id并可幂等同步。 + 库存进展:tools list 已复用同一有界锁读取与制品核验,稳定列出所有声明平台、版本、适配器/规则来源及独立 runtime/bundle 缺口;跨平台为 not_inspected,不访问制品或虚构本机缺失。固定声明锁范围、必需库存未核验、required_by_policy=null 与 unknown/退出 3,不执行/安装/写工作区。28 项回归及实际 schema 验证通过;可信必需集合、正式库存与安装仍缺,5.6 不勾选,见相邻 tests/acceptance/tools-list-command.md。 + 持久化进展:doctor 0.2 在已绑定工作区保存不可变 queued 报告并自动 sync;重复失败/原因变化沿用一个环境调查任务,next 给出受限恢复及复检路径。未选择不制造必需缺失;真实版本恢复不自动关闭或授予 ready。严格导入拒绝自写批准、未知字段、预算/工作区/消费摘要异常;保存失败向对话反馈。54 项回归、10 份实际 schema 与 6 项反例通过;可信必需项/全工具报告及 doctor 专用关闭未实现,5.6 不勾选,见相邻 tests/acceptance/doctor-workspace-sync.md。 + doctor 局部入口:默认反馈静态检查配置,仅显式绝对路径 Ruff 运行固定版本诊断,复用统一 runtime、私有临时 cwd/日志和共享预算;单探测上限 10s,脚本入口缺隔离时启动前拒绝。未选工具不冒充缺失;本地版本成功仅 observed_untrusted,策略/必需前置未核验,readiness unknown、交付 not_evaluated,报告明确 not_saved,不写工作区或扫描源码。其它工具、可信锁/必需前置映射、完整准备报告持久化及同步仍缺,5.2/5.6 不勾选;见相邻 tests/acceptance/doctor-local-ruff.md。 + CLI 进展:tools verify 以本地 codeguard.lock.json 或显式候选执行有界只读解析,复用三来源入口/运行时/目录包核验,反馈 issue 与恢复步骤;候选来源未核验,固定 incomplete/unknown、无门禁效力,匹配仅 matched_untrusted,版本仅锁声明,不启动 wrapper/联网/安装或写工作区。显式缓存与运行时参数可核对,跨平台条目不产生本机结论。工具库存/安装、可信锁来源、原生 doctor 与准备报告持久化/同步仍缺,5.2/5.6 不勾选;见相邻 tests/acceptance/tools-verify-command.md。 +- [x] 5.7 实现C03 detect查询处理器与DiscoveryReport,复用观察port;验收:静态未知条件完整返回0,必要目录不可读返回3和部分观察,均不执行wrapper、不写画像/任务。证据:相邻 `codeguard-cli/crates/codeguard-cli/src/{main,discovery}.rs`、`schemas/discovery-report.schema.json`、`crates/codeguard-cli/tests/detect_cli.rs` 与 `tests/acceptance/discovery-baseline.md`;动态构建模型、其余清单语义及多语言源集属于 5.9/6.1/8.x,保留 unknown,不宣称检查通过。 +- [x] 5.8 实现C04 capabilities查询、平台/类别筛选和发行元数据解释;验收:planned查询成功但不称可运行,未知语言2,损坏注册表4,不探测或安装工具。证据:相邻 `codeguard-cli/crates/codeguard-cli/src/main.rs`、`schemas/{capability-inventory,capability-selection}.schema.json`、`crates/codeguard-cli/tests/{capability_inventory,capability_selection}.rs`、`tests/acceptance/capability-inventory.md`;当前所有新能力仍为 gap,原生适配器验收属于 S06–S08。 +- [ ] 5.9 实现动态构建模型解析任务与共享扫描义务映射;验收:detect/init/plan仅保留待解析条件,执行期经统一runtime留证据,多语言/多构建根不丢范围,adapter不私自I/O。 +- [ ] 5.10 实现项目检查器配置探测;验收:按构建根识别 Javadoc、依赖/CVE、lint 与安全检查器的 `configured/missing/invalid/unknown`,说明配置位置与启用建议;28 个检测族只作候选目录,不自动生成全部必需义务。进行中:相邻 Rust `detect` 已只读解析 Maven POM 的六种检查器声明,保守处理父 POM、pluginManagement、profile 和 Gradle;另沿 Python 文件层级识别 Ruff TOML 的配置优先级、lint/format 区别及坏配置,见 `codeguard-cli/tests/acceptance/{maven-config-discovery,ruff-config-discovery}.md`。其他生态、Maven effective model、项目全量执行与宿主反馈接线仍未完成,故不勾选。 + 后续进展:Maven 静态探测新增独立 P3C 项,仅在明确 P3C 2.1.1 插件依赖、已观察的规则路径和 `skipPmdError=false` 同时存在时标记已配置;普通 PMD、缺依赖/规则、动态版本与错误吞掉配置有正反例。`plan lint java` 仅显示候选,不认证规则执行。见相邻 `codeguard-cli/tests/acceptance/maven-config-discovery.md`。 + Javadoc 探测补强:明确关闭 `missing` 的 doclint、动态 doclint 与 `failOnError=false` 不再误报注释检查已配置;`check java` 也会反馈同一配置状态。Maven effective model、生命周期执行与其它生态仍缺,5.10 不勾选。 + Python CVE 输入进展:`detect` 按 Python 构建根区分 requirements 逐行精确版本、动态/未锁输入、uv/Poetry 锁文件未解析及缺输入;`plan cve python` 和 `check all` 保留 `python.pip_audit` 配置未知与原生工具/数据库待核验,不把固定版本或锁文件存在误报为漏洞扫描通过。真实多构建根归属和动态约束反例见相邻 `codeguard-cli/tests/acceptance/python-dependency-input-discovery.md`。项目生效配置、完整依赖图、原生漏洞结果与可信策略仍缺,5.10 不勾选。 + 标准锁区分进展:发现器现识别 `pylock.toml` 与单段命名的 `pylock..toml`,单列 `python_standard_lock_model_unparsed`;同根并存标准锁与 uv/Poetry 锁时保持选择歧义,工具专用锁不再暗示可直接用于 pip-audit `--locked`。真实 CLI 反例见相邻验收文档。PEP 751 内容/环境、原生运行和漏洞库仍未核验,5.10 不勾选。 ## 6. S06 Java 全链路 依赖:S05。覆盖:native-tool-adapters、language-gate-commands。 - [ ] 6.1 实现 Maven/Gradle/JDK/wrapper/profile/module/source-set 观察;验收:多模块、父 POM、动态未知范围与错误 JDK 有真实样本。 + 探测诊断进展:Maven 版本阶段现区分运行时超时/启动前预算耗尽/无法启动/取消/输出及管道故障等原因。两个新反例先暴露通用错误提示,再通过具体原因返回;失败不启动 validate,不产生源码违规。原全量回归的 bundle mutation 偶发失败仍需具体原因复现才能归因,不能凭单独重跑推断解决。 + + 进行中:相邻 `codeguard-cli/crates/codeguard-cli/src/maven_probe.rs` 已通过统一 Rust runtime 调用 Maven 原生 `--version` 和离线 `validate`,复核启动脚本与 POM 内容,并对真实 POM 4.1 错误、无质量绑定 POM 的 validate 成功分别留局部证据;见 `codeguard-cli/tests/acceptance/maven-native-probe.md`。Maven 发行包/JDK 身份锁、Gradle、wrapper、profile、多模块、父 POM 与动态范围仍未完成,不能勾选 6.1 或把 validate 当质量通过。 - [ ] 6.2 确定并锁定官方 P3C/PMD/JDK 兼容组合,实现原生报告解析;验收:正反例证明规则实际加载,不能用 Checkstyle 名称替代。 + 新进展:隔离单文件探针现在声明 P3C 2.1.1 JAR 中十个 `ali-*.xml` 规则集,本地反馈 0.2 记录清单与受控 POM 摘要;真实公开类同时命中命名和作者注释规则,包内可见类不命中作者注释。仅证实两条触发规则及该样本上下文,十个规则集的全规则生效、批准工具闭包和项目覆盖仍未核验,故不勾选。 + 追加进展:公开 `lint java FILE` 现调用固定 Maven PMD 3.11.0/P3C 2.1.1/PMD 6.15.0 单文件探针,原生违规规则与位置可返回对话;本机 JDK 26 隔离离线仓的违规和干净样本均经 CLI 执行,后者仍标 `clean_scope_unproven`、退出 3。当前探针声明十个规则集,本机 JDK 21 的命名和作者注释规则有真实正例。该仓字节摘要仅为本地观察,未证明受批准工具锁、全规则实际生效或项目覆盖,见 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`,6.2 不勾选。 + 进行中:相邻 `codeguard-cli/crates/codeguard-adapters/src/pmd_xml.rs` 已实现 Rust 对 PMD 6 XML 的有界纯解析,坏 XML/DTD/处理错误/版本不符及已报告的 suppression 不生成通过;`pmd6_command.rs` 的固定字面参数已交给局部 Rust runtime 试运行服务。可复跑的 Maven PMD/P3C 哨兵在本机 JDK 8/17/21/26 上均使违规样本报告真实 `ClassNamingShouldBeCamelRule`、干净样本无诊断、坏规则集失败;还以隔离 Maven 仓库、`-o` 和前后目录树摘要复跑,见相邻 `codeguard-cli/tests/acceptance/p3c-pmd-research.md` 与 `codeguard-cli/crates/codeguard-cli/tests/p3c_native_replay.rs`。但闭包摘要尚未接入受批准工具锁,干净 XML 不证明覆盖,正式 `check` 尚未接线,仍不能勾选或把该哨兵扩展为全部 P3C 规则的验收。 + 规则归属补强:项目 POM 规则子集先绑定到隔离探针;本地 P3C 2.1.1 制品的十个规则集/56 个规则 ID 已整理为 Rust 目录,项目原生 XML 若报告未选择的规则集、错误 ID 归属或未知规则,标为 incomplete、不给源码 finding。伪 XML 反例与真实 Maven 正例见 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`;目录仍不是受保护 rulepack/工具锁,全规则执行覆盖和正式批准未证实,6.2 不勾选。 - [ ] 6.3 实现 Checkstyle/Javadoc 注释检查;验收:公共 API、参数返回、inheritDoc、record/Lombok/生成代码正反例。 + 配置失败指引进展:固定 10.21.4 正常 254 + 官方非法属性/正则因果异常才细分 checkstyle_configuration_regex_invalid,公开对话和准备简报指向原配置正则,不回显自由文本。纯分类先 RED 后实现;缺报告且输入变化的反例再 RED,修正为输入/截止/取消优先。原生格式七轮回放通过(38.75 秒),见相邻 tests/acceptance/checkstyle-regex-failure-guidance.md。未知属性级错误/其它版本及完整批准覆盖仍缺,6.3 不勾选。 + 作者/版本格式验收:补齐 JavadocType 指引中缺失的 @author/@version 与事实依据约束,目标指引测试先 RED 后通过。缺标签/格式不符/部分及完整补齐 2/2/1/0 原生诊断准确,原配置复检为局部候选;无效正则连续两轮保持 incomplete 并复用配置准备任务,不冒充源码违规。七轮通过(38.35 秒),见相邻 tests/acceptance/checkstyle-type-formats.md。全部正则/标签变体和完整项目/批准仍缺,6.3 不勾选。 + 类型配置进展:MissingJavadocType/JavadocType 保留四级访问范围、五类类型 token、各自注解参数及类型标签/作者版本参数;跨模块借用反例先 RED 后通过,绑定/配置十三项通过。十组原生配置准确筛选公开/私有/注解/record 与参数/未知标签,恢复首次配置并真实补文档复检为局部候选,十一轮通过(58.02 秒),见相邻 tests/acceptance/checkstyle-type-options.md。作者/版本正则只有静态适配证据,其它 Scope/全部 token 语法与完整项目/批准覆盖仍缺,6.3 不勾选。 + 方法标签配置进展:JavadocMethod 静态适配保留 accessModifiers、允许缺参数/返回标签、validateThrows、allowedAnnotations 及四种原生 token;合法参数先 RED 后修正,绑定/配置十二项通过。公开/私有与注解方法、异常标签六组原生配置及恢复首次配置的两次修复复检共八轮通过(57.23 秒),事实仍 open,见相邻 tests/acceptance/checkstyle-method-tag-options.md。完整配置、全部语法和批准覆盖仍缺,6.3 不勾选。 + 方法 token 进展:MissingJavadocMethod 保留四种原生 token 的模块上下文;静态绑定先 RED 后通过,五组真实配置准确选择普通方法、构造器、注解成员及 record 紧凑构造器,稳定任务无重复;同配置两次复检验证紧凑构造器文档修复,事实仍 open。七轮原生验收通过(51.11 秒),见相邻 tests/acceptance/checkstyle-method-tokens.md。完整配置/语法及正式关闭仍缺,6.3 不勾选。 + 注释变体进展:静态配置新增原 MissingJavadocMethod/JavadocType,实际 CLI 检查 record 参数文档正反例、继承文档/Override/Generated 默认例外,并保留同一行声明及单行方法体的原生差异,用多行方法验证缺文档。显式 Lombok 1.18.38 delombok 原源码/展开 getter 对照显示不同扫描范围,不将展开诊断指到原注解行。所有变体/版本/构造器及完整项目/来源/任务门禁仍缺,6.3 不勾选;见相邻 tests/acceptance/checkstyle-comment-variants.md。 + 原生身份歧义纠偏:共享自定义 ID 的不同 Checkstyle 模块、重复默认检查来源或重复属性在局部配置识别中进入待解析,不挑先/后值、不制造源码违规。新增共享 ID 断言先失败;不同 ID 的相同检查类保持可用。真实 CLI 验证共享 ID 无活动 finding,独立 ID 后显示原生三条注释诊断。规则/义务与批准身份、完整配置/项目/任务门禁仍缺,6.3 不勾选,见相邻 tests/acceptance/checkstyle-rule-source-ambiguity.md。 + Checkstyle 正式局部命令进展:lint java --checker checkstyle 显式选择 Java/JAR/原配置,受支持静态注释配置进入私有快照与 runtime 服务,缺前置/未知上下文结构反馈;无默认规则替换,脚本缺隔离拒绝。公开反馈 0.1.0 保留原 source/位置/严重度,工具/覆盖/交付仍未核验。真实 binary 1 项通过,8 项命令/Javadoc/配置回归通过,两份实际 schema 正例及 4 个虚假权威反例通过;完整 check/project/任务门禁与其它配置仍缺,6.3 不勾选,见相邻 tests/acceptance/java-checkstyle-cli-local.md。 + Checkstyle 输入绑定进展:新增独立请求/结果与 Rust runtime 服务,精确四个不同物理输入摘要前后复核,缺失/额外/别名/变更不形成完整结果;新鲜报告、范围/退出与共同预算取消接线。模拟反例与真实 Checkstyle 10.21.4/Java 21 缺类型注释/修正两轮通过。完整 JDK/配置引用资源闭包、网络隔离/快照与项目归属及正式 CLI/任务门禁仍缺,6.3 不勾选;见相邻 tests/acceptance/checkstyle-input-bound-probe.md。 + Checkstyle 结果进展:Rust 结果判定绑定独立版本/冻结完整文件列表/正常退出,报告或范围异常不当源码违规;warning/info 退出零仍保留,Unix 错误计数低八位不抹去 256 条诊断。四项契约及真实 error/clean/warning 三轮通过;尚未绑定原项目身份/配置或正式 CLI/门禁,6.3 不勾选,见相邻 tests/acceptance/checkstyle-exit-scope-coherence.md。 + Checkstyle 真实验收进展:固定官方 10.21.4 自包含测试 JAR 与本机 Java 21,经统一 runtime 新鲜报告/私有日志/共同截止调用。配置缺 DOCTYPE 先导致无报告失败,纠正为制品内置映射的标准 DTD 后,公共类型、自定义方法 ID、缺 @param/@return 与补全文档两轮通过。制品摘要仅本地观察,真实项目原配置/范围/身份绑定、完整注释变体与生产任务门禁仍缺,不勾选;验收详见相邻 tests/acceptance/checkstyle-native-command.md。 + Checkstyle 参数进展:新增 CheckstyleCommand 固定 Java -jar/原配置/XML/独立报告/单文件参数,路径冲突与控制字符拒绝。显式 10.21.4 原生正反例测试入口有截止/回收/清理;核对该版本 XMLLogger 确认自定义 source 仅输出 ID,不能套新版类名#ID。命令 2 项、解析 6 项通过;因本机未发现 JAR,真实测试未执行。生产 runtime/配置及任务门禁仍缺,6.3 不勾选,见相邻 tests/acceptance/checkstyle-native-command.md。 + Checkstyle 解析进展:新增 Rust 有界 XML 纯解析,保留完整 source/自定义模块 ID、原生严重度与文件级零行/可选列;exception 和根级无文件事件不转换为源码规则违规。坏版本、未知结构、重复文件、DTD/编码/数值与规模异常均未完成;零诊断仍保留文件列表,不授予覆盖权威。测试为协议夹具,真实 Checkstyle 执行和正式配置/任务/白名单/门禁未接通,6.3 不勾选;见相邻 tests/acceptance/checkstyle-xml-observation.md。 + 执行方式纠偏:明确 Maven 上下文时只调度原 POM 多文件探针,不再先运行孤立单文件 JDK;Maven 不适用/前置缺失保持具体未完成,不回退。真实 First 引用 Second 样本先复现无关单文件 native_execution_incomplete,再用同一 Maven 多文件警告/干净两轮验证;模拟缺前置时 JDK 哨兵不启动。反馈升级 0.23.0、Javadoc 0.3.0,区分模式/检查器;旧 0.22 schema 保留。两份实际原生报告及混合模式反例通过。生效模型/依赖类路径/生成源码/任务门禁仍缺,6.3 不勾选,见相邻 tests/acceptance/javadoc-project-mode-selection.md。 + 进行中:相邻 Rust CLI 已增加 `lint java FILE --checker javadoc` 的 JDK 21 原生单文件局部诊断,已知 doclint 缺失注释/参数/返回规则可展示,未知输出和缺失类路径保留未完成;真实 JDK 正反例见 `codeguard-cli/tests/acceptance/java-javadoc-cli-native-local.md`。项目生效配置与完整源集绑定、Checkstyle 原生执行、生成代码范围验证、任务和门禁接线仍缺,6.3 保持未完成。 + 追加进展:`check java` 现只在静态配置确认时调度 `java.javadoc`,把 JDK 21 单文件原生诊断显示到 JSON/human;无配置不自动变成必需检查。真实最小 Maven 项目有缺注释正例,见 `codeguard-cli/tests/acceptance/check-java-javadoc-partial.md`。它尚未执行 Maven Javadoc 插件生效生命周期、解析完整项目类路径、同步 Javadoc 任务或签发门禁,6.3 仍未完成。 + Maven 原生输出研究:Maven 3.9.16/JDK 21/Javadoc Plugin 3.12.0 的真实项目在 `failOnWarnings=false` 时 `BUILD SUCCESS` 仍含缺注释警告;设为 `true` 则失败且保留同样诊断。Rust 有界解析器已用两种原生结果和未知/额外错误反例验收,见 `codeguard-cli/tests/acceptance/maven-javadoc-native-output.md`。同一目录再次运行可能复用文档产物,正式项目执行器及本轮快照证明仍缺,6.3 不勾选。 + 干净日志反例:完整注释项目的首轮与同目录重跑日志都可只显示 `BUILD SUCCESS`,无法从日志区分本轮生成或旧产物复用。Rust 解析器将这类输出标为 `CleanLogUnverified`,未知警告/失败仍为 `Incomplete`;真实 Maven 两轮和反例测试已通过。正式项目执行器必须另证隔离快照、产物及配置身份,6.3 继续未完成。 + 多文件原生进展:`check java`/`check all` 在显式 Maven/JDK 21/离线仓库与树摘要下,对**简单静态 POM**使用私有源码及原 POM 快照运行 Javadoc Plugin 3.12.0;父 POM、profile、依赖、模块、扩展、其它插件或动态配置会在执行前返回不适用,不再以固定 POM 生成配置外诊断。真实两文件违规及修正后干净样本均经 CLI 复跑,原 POM 摘要已绑定;结果单列为局部多文件探针,固定 `project_checker_attribution=unverified`、`coverage_proven=false`、交付未评估。生效模型、类路径、生成源码及完整源集仍未证明,见 `codeguard-cli/tests/acceptance/maven-javadoc-multifile-probe.md`;6.3 不勾选。 + 修复指引进展:Checkstyle 局部反馈 0.2 从原配置精确映射自定义 ID 到四类检查类,给出中文规则摘要、官方依据、修复方向和原输入复检参数;未知来源不发布 finding,重复映射不猜测。普通及真实 10.21.4 回放通过,旧 schema 保留;完整项目配置、任务关闭、批准来源和门禁仍缺,6.3 不勾选。验收见相邻 tests/acceptance/checkstyle-repair-feedback-binding.md。 + + 字段注释进展:原生 JavadocVariable 及其 scope/excludeScope/ignoreNamePattern 原参数进入精确绑定,复用反馈/稳定任务/原工具复检;17 项适配回归和真实三轮字段回放(24.99 秒)通过,实际字段记录及简报 schema 通过。仍缺完整 Java 规则/配置模型/覆盖与批准,6.3 不勾选,见相邻 tests/acceptance/checkstyle-field-javadoc.md。 + 字段范围进展:增加 JavadocVariable 的静态原 tokens 参数,未知 token/其它模块借用被拒;四个绑定与四个配置回归通过。原工具已确认 public/protected/package/private、excludeScope 及字段 token 边界;仅枚举 token 不删除原生必需 VARIABLE_DEF,固定 JAR 字节码和回放据此修正规格/验收假设,不在 Rust 过滤诊断。完整项目模型与门禁仍缺,6.3 保持未勾选。 + 模块名称进展:已支持注释模块接受官方完整名与 Check 后缀短名,使用固定映射保留原 XML/原生 source;未知包名不猜测,重复别名身份拒绝。28 项普通回归和字段四轮真实名称/稳定任务/复检回放(21.95 秒)通过。其它模块/资源/完整生效配置仍缺,6.3 不勾选,见相邻 tests/acceptance/checkstyle-official-module-names.md。 + 方法原参数进展:MissingJavadocMethod 的范围、注解、属性方法、长度与名称排除按本版原参数执行;跨模块及无效静态值拒绝。19 项普通回归、真实四组配置回放(19.03 秒)通过,零诊断不关闭任务。单行非空方法行数边界由固定 JAR 核对并修正夹具假设,不修改原生判断;完整方法/构造器及项目模型仍缺,6.3 不勾选。见相邻 tests/acceptance/checkstyle-missing-method-properties.md。 - [ ] 6.4 实现 Java 安全静态检查及 CVE 依赖图适配;验收:真实安全/CVE 样本、坏报告、库过期与模糊匹配分开记录。 + 解析器进展:相邻 Rust adapter 已按 OWASP Dependency-Check 官方 JSON 1.1 模板提取活动/原生抑制漏洞、来源、分数和包标识;缺必需数组、重复 JSON 键、分析异常或畸形漏洞拒绝。只得到局部报告事实,未调用原生 checker、核验库时效或绑定 Maven 图,6.4 保持未完成。见 `codeguard-cli/tests/acceptance/owasp-dependency-check-json-parser.md`。 + 归属候选进展:相邻 Rust adapter 只在唯一 Maven PURL 与依赖图唯一非根节点的 group/artifact/version/type/classifier 完全一致时给出候选;缺失、冲突、未知限定符、私服 URL、版本不符或图中重复节点分别保留未归属。尚未核验真实制品摘要、原生扫描范围及数据库时效,也未接入 `check java`,6.4 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-attribution.md`。 + 字节身份补强:相邻 Rust adapter 增加 OWASP 报告 SHA-256 与 Maven 节点制品摘要的逐项比较,缺失、损坏和冲突各自保留;相同坐标不再足以构成制品相同的候选。CLI 的 Maven 离线图探针现为可定位的普通制品记录本轮 SHA-256。尚未认证 OWASP 与 Maven 同轮来源、仓库批准身份及漏洞库时效,6.4 保持未完成。见上述归属文档与 `codeguard-cli/tests/acceptance/maven-dependency-tree-check-java.md`。 + 原生局部接线:`check java`/`check all` 已为静态配置的 OWASP Maven 插件建立 `java.cve` 任务,在固定版本的简单原 POM 与私有离线数据库副本中调用原生 goal 并解析 JSON 1.1;human/JSON 反馈展示脱敏 advisory、UNKNOWN 分数和原生 suppression。缺数据库、坏报告、POM 复杂、项目身份错配或数据库变化保持 incomplete。模拟 Maven 正反例通过;尚未以真实 OWASP/合格数据库验收,也缺可信时效、图/制品同轮绑定和正式门禁,6.4 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 + 同轮候选接线:同一 `check` 调用中的 OWASP 与 Maven 图报告现在按相同构建根、POM、Maven/JDK、仓库摘要交叉核对,再逐条复用坐标/制品摘要匹配器;结果写入 `attribution_probes` 并进入 human/JSON 反馈。模拟双插件原生报告的摘要一致、摘要不一致和私服 PURL 脱敏反例通过;这仍只是本地候选,数据库时效、真实原生工具和可信门禁未验收,6.4 不勾选。 + 持久修复路径进展:已初始化项目中的 `check java` 现在保存 CVE 局部报告、自动同步,并把数据库时效未知或原生执行未完成写成稳定环境/证据 blocker;同一问题重复扫描只保留一张任务,内容被篡改的已消费报告不能重新导入。未经核验的 advisory 不伪装为已确认源码 finding,任务给出原工具复检和库核验步骤。真实库与可信门禁仍缺,6.4 不勾选。 - [ ] 6.5 实现 build 等级和测试执行声明;验收:默认静态构建不谎称测试通过,要求测试的策略不可自动跳过。 - [ ] 6.6 接入 Java 完整义务与影响闭包;验收:verify 未绑定质量任务、自定义 echo、50/51 文件、未修改调用方失败均不假通过。 - [ ] 6.7 用代表性 Java 项目完成 check java/check all/doctor/修复前后对照;验收:每条旧新差异人工裁定并有产物引用。 + 进行中:`lint java FILE` 已把单文件原生 P3C 诊断接至 CLI;`check java/doctor`、真实多模块项目及修复前后全量人工裁定仍未完成。单文件证据见 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`,不勾选。 + 后续进展:`check all` 已接隔离 P3C 单文件探针,并以最近 Maven 构建根限制配置归属;本机真实 Maven/JDK 21 离线扫描使违规规则进入统一反馈。局部稳定任务与原 Maven/P3C 复检已接通,十个声明规则集中的命名/作者注释两条有真实正例。`check java` 局部入口也已用真实 Maven 验证,但 doctor、全规则生效证明、其它 Java 静态检查与代表性项目修复前后差异裁定仍缺,6.7 不勾选。见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 +- [ ] 6.8 识别 Java 依赖治理及 CVE 检查配置并调用已配置的原生工具;验收:区分依赖图/版本/许可证/SBOM 与漏洞诊断,未配置时给智能体具体建议;动态版本、父 POM 或私服不可达不得伪造清洁结果。 + 配置反馈进展:`check java`/`check all` 0.10 按 Java 源码最近构建根,把 Maven Dependency、OWASP Dependency-Check 与 FindSecBugs 的静态声明汇总为已声明但未执行、已识别插件缺失或配置未解析,并提供 checker ID 与下一步;多模块混合状态不概括为全项目已配置。Gradle 或 Maven/Gradle 混合根保持模型未解析且不附会 Maven checker ID。FindSecBugs 现在核对完整 groupId/artifactId,避免同名伪依赖误认。原生依赖图接线、CVE 报告解析、漏洞库 freshness、私服/动态版本及受批准义务仍缺,6.8 不勾选。见相邻 `codeguard-cli/tests/acceptance/java-dependency-cve-config-feedback.md`。 + 依赖图解析进展:相邻 Rust 适配器已严格解析 Maven Dependency Plugin 3.7+ 的原生 JSON 树,保留传递边并拒绝坏报告;本机 Maven 3.9.16/插件 3.8.1 的离线 JUnit→Hamcrest 样本通过。原生 goal 尚未接入 CodeGuard 运行时或 `check java`,CVE/advisory 与库时效仍缺,不能从依赖图宣称无漏洞,6.8 仍不勾选。见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-native-parser.md`。 + 原生接线进展:相邻 Rust `check java`/`check all` 0.11 已将静态简单 Maven 构建根的 Dependency Plugin 3.8.1 作为独立 DAG 节点,在私有原 POM 副本中离线执行并反馈依赖图。父 POM、profile、动态版本、外部仓库等重放资格不足时保持未完成;原生 `BUILD SUCCESS` 伴随缺 POM 警告也拒绝当成完整图。真实 Maven/JDK 21 离线仓库的 JUnit→Hamcrest 端到端样本通过;全构建根/生效模型、私服、许可证/SBOM、CVE/advisory 和可信政策仍缺,6.8 不勾选。见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-check-java.md`。 + 无源码构建根补强:依赖图任务现在按每个静态已配置的 Maven 构建根调度,不因根目录暂无 `.java` 而省略;父根有源码、子根无源码时两者分别保留本轮探针结果。P3C/Javadoc 仍按源码条件执行。两个 CLI 回归样本证实旧遗漏及修复后的待检查范围;多模块生效模型与完整覆盖仍未证明,6.8 保持未完成。 + CVE 报告解析进展:新增有界 OWASP JSON 1.1 Rust 解析器,零漏洞报告与缺失依赖数组严格区分,原生 suppression 和无评分漏洞不丢失,数据源时间原样保留但不自证 freshness。原生调用、图归属、可信数据库与对话反馈尚未接线,6.8 不勾选。见 `codeguard-cli/tests/acceptance/owasp-dependency-check-json-parser.md`。 + 图归属局部进展:OWASP Maven PURL 与原生 Maven 图已有独立精确坐标候选匹配器及反例测试;真实调用、制品与数据库身份验证和对话反馈仍缺,不能将候选升级为 CVE 判定,6.8 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-attribution.md`。 + 制品观察进展:依赖图局部原生反馈 0.2 在已核对的离线 Maven 仓库中读取能精确定位的制品并记录摘要,缺文件或不支持类型保持 null;仓库树在读取后再次核对。与 OWASP 报告摘要的匹配仍只是待认证候选,未执行真实 OWASP 扫描,也未检查数据库时效或关闭 CVE 义务,6.8 不勾选。 + OWASP 局部执行进展:已配置构建根现尝试原生 OWASP Maven goal,隔离复制原 POM 和离线数据库并将报告中的漏洞与失败原因反馈到对话;空报告明列 `empty_report_unverified`,数据库时效固定 unknown,未将坐标/摘要候选自动升级为漏洞门禁。当前仅模拟原生工具验收,真实插件、系统级网络隔离、数据库时效及项目全覆盖仍缺,6.8 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 + 同轮归属进展:严格静态 POM 现在允许并列声明固定 Maven Dependency Plugin 3.8.1 与已固定版本的 OWASP 插件,仍拒绝重复、第三方、动态及配置复杂插件。`check_feedback` 0.14 从本轮同根 POM/工具/JDK/离线仓库摘要相同的两份原生局部观察生成逐 advisory 坐标和制品摘要候选;失配与公开 PURL 脱敏均不能得到精确候选。模拟原生双插件、摘要冲突及私服限定符反例见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。漏洞库时效、可信来源、完整项目覆盖与真实 OWASP 数据库验收仍缺,不勾选 6.8。 ## 7. S07 首批共享生态 依赖:S05;可与 S06 独立推进。覆盖:native-tool-adapters。 - [ ] 7.1 实现 Rust lint/rustdoc/build/依赖与安全义务;验收:workspace/features/targets 和所有 F01–F10 适用场景。 -- [ ] 7.2 实现 Python(python)Ruff/注释/依赖与安全义务;验收:目标 Python/配置继承/锁缺失解析有真实样本。 + 2026-09-28 Rust CVE 局部进展:相邻 Rust 工程新增 `cve rust [path] --cargo-audit-tool ABS_PATH --db ABS_PATH --format json`,共享受控进程预算调用原生 cargo-audit 的 `audit --no-fetch --no-yanked --json --db ... --file Cargo.lock`。严格 JSON 解析拒绝重复字段、原生 ignore、计数/退出矛盾,逐 advisory 精确对照本轮 Cargo.lock 的包名、解析版本、来源与校验和;公开反馈仅输出来源 SHA-256,不回显私有仓库地址。实际零漏洞与已知 RUSTSEC-2020-0071 漏洞的原生执行均验证;本地数据库 JSON 的提交/更新时间为空,结果固定 `database_freshness=unverified`、退出 3、`delivery_decision=not_evaluated`。该阶段尚未接入 check all、稳定任务/复检、可信数据库及工具/策略、全部 workspace/features/targets,也未覆盖 yanked 治理;7.1 不勾选。见相邻 `codeguard-cli/tests/acceptance/cargo-audit-native-observation.md`。 + 统一检查增量:`check all` 现以独立 `rust.cve` 节点调度同一 cargo-audit 局部观察,JSON/human/SARIF 保留原生 advisory 或缺工具/数据库原因。反馈协议 0.29 和中断协议 0.10 新增 `rust_cve`,旧协议原件留存;Rust CVE 类别即使有真实 advisory,数据库时效及可信策略未核验仍为 `observed_unverified`、交付 `incomplete`。这不生成可信白名单批准,也不宣称 Rust 依赖安全通过。稳定任务/复检、可信数据库和全构建组合仍缺;7.1/4.8 不勾选。验收见相邻 `codeguard-cli/tests/acceptance/check-all-cargo-audit.md`。 + 工作台增量:已初始化工作区的 `cve rust` 与 `check all` 将局部 cargo-audit 观察绑定本轮清单/锁、工作区和运行 ID 后同步为每构建根一张稳定 CVE 覆盖任务。`next` 给出原工具和漏洞库核验指引;`task verify` 重跑原生工具、保存摘要绑定事件,数据库身份及时效未获可信核验时仍返回 `still_blocked`,任务保持 open。缺工具也生成环境阻塞;该待核验任务排序在可直接修复的源码问题之后,避免挤掉 Clippy 修复。目标普通回归 `check_all_cargo_audit` 3 项及 `check_all_rust_native` 12 项通过,2 项条件忽略;实际复检预览和封套通过 Draft202012 schema。可信漏洞库/工具/规则包、白名单批准及正式门禁仍缺,7.1/4.8 不勾选。验收见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 + 尝试历史增量:同一 CVE 任务的 claim→attempt ready-to-verify→原工具复检现经目标集成测试;`next` 显示 `still_blocked` 并将无进展计入预算,再一次无改动后要求具体决策,拒绝第三次同动作启动。修复了先前复检已保存但 `next` 不显示 CVE 结论的问题。该链证明局部重复动作抑制,不证明漏洞库合格、漏洞修复、批准例外或正式关闭,7.1/9.7/4.8 保持未完成。 + 协议增量:`repair-brief-preview` 0.1 在保留严格 Ruff 分支的同时新增精确 Rust CVE blocker 分支;真实 `next` 复检输出通过 Draft202012,错检查器、伪称 resolved、错范围三类反例拒绝。其它语言简报尚未纳入同一严格 schema,2.2/9.7 的全命令范围不能据此宣称完成。 + 2026-09-27 rustdoc适配进展:增加独立Cargo/rustdoc JSON流解析,missing_docs与broken_intra_doc_links保留原生规则/级别/唯一主定位和package/manifest/target归属;重复键、异常结束、歧义定位、未知警告和编译错误保持未完成,不复用只认Clippy的过滤器。7项协议契约、6项依赖边界通过;显式本机Rust1.98.1的原生重放1项实际覆盖缺文档/正常/坏链接/编译错/allow抑制五种输入,通过;相关Clippy -D warnings及fmt通过。公开comments rust、任务/复检、原配置与可信规则来源、完整workspace/features/targets仍未接通,7.1不勾选;详见verification.md及相邻tests/acceptance/rustdoc-native-observation.md。 + 公开入口追加:comments rust现经共享runtime执行显式Cargo的锁定离线库目标探针,复用共享预算、私有target目录、SourceSnapshot与独立解析;前后复核清单/锁/已发现源码/工具及源码集合,失配/变化不能标完整观察。human/JSON给出规则/位置、原工具复检和not_evaluated;无工具/坏输入明确未完成,任务接入标not_integrated。4项普通CLI反例、5项入口回归及1项真实Cargo补文档前后复查通过;两份实际反馈通过schema、四种伪造授权/覆盖/关闭被拒;相关Clippy通过。完整配置闭包、可信规则/工具、持久任务/原工具verify及check all接线仍缺,7.1保持未完成。 + 文档身份前置:原生范围字段必填并校验真实UTF8切片及行列对应;候选指纹绑定规则/相对目标/原生范围字节,不用行号或列表顺序。同一原生记录可去重,重复声明身份碰撞保留两项歧义观察并置正式ID为空,运行未完成。反馈升级0.2并保留0.1 schema。3项身份契约、6项CLI普通及7项解析回归通过;真实补充与最新静态终态见verification.md。尚非完整符号身份或持久任务接线,7.1/9.7不勾选。 + 局部进展:`check all` 在显式提供绝对 Cargo 工具时,经 Rust runtime 离线执行原生 Cargo Clippy 默认 features/all-targets,并从机器报告保留 Clippy 规则与位置;缺工具、坏报告、编译错误和异源路径保持未完成。配置文件存在与 Cargo manifest 分开报告;真实 Cargo Clippy 临时项目已验证。已初始化工作区可将当前 Clippy finding 或缺工具 blocker 同步到稳定任务并在对话反馈返回下一步,项目可写的伪批准文件不隐藏发现。`task verify --cargo-tool` 可再跑原生 Clippy 并写本地复检事件;真实 `#[allow(clippy::needless_return)]` 导致零诊断时,同工具原生 `--force-warn` 对照重新检出并返回抑制待核查;对照损坏或输入身份变化保持 incomplete,两轮均无发现也仅为待策略核验候选,任务不关闭。工具/规则批准、workspace/features 全组合、rustdoc/build/依赖/安全和 Rust 跨组合覆盖完整核验仍缺,7.1 不勾选。 + 构建接线进展:`check all` 在同一执行图和共享预算内调用原生 Cargo check,单独保留编译错误与环境阻塞并同步稳定任务;Clippy 修复任务仍优先展示,构建任务可单独读取与原工具复检。反馈 0.28 严格增加 rust_build 和 rust.build 节点,历史 0.27 独立保留;实际报告通过 Draft202012。类型检查不执行测试、不证明 workspace/features/targets 及受批准工具/策略全覆盖,白名单候选不能替代编译修复或门禁,7.1/9.7 仍不勾选。 + Rust CVE F05 增量:`cargo-audit` 在完整匹配的 advisory JSON 后异常退出、超时或其它输出超限时,公开局部报告保留 advisory 及各自未完成原因,并将报告同步到稳定 CVE 完整性任务;损坏 JSON 仍不生造 finding。见 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。真实崩溃/超时、单体 stdout 截断恢复、workspace/features/targets 和完整策略仍缺,7.1 不勾选。 +- [ ] 7.2 实现 Python(python)Ruff/注释/依赖与安全义务;验收:目标 Python/配置继承/锁缺失解析有真实样本。进行中:Ruff 已有项目 TOML 发现、逐文件原生扫描和公开 `lint python` 局部反馈命令;真实 E501/干净文件共存、排除文件不假通过、根/子目录不同配置各自生效,以及 CLI F401 回报通过;异源 JSON 诊断被过滤且本次标未完成。扫描后源码或配置变化也使受影响文件转为未完成,旧诊断只作待复查证据。命令因尚无完整策略固定返回3,见相邻 `codeguard-cli/tests/acceptance/{ruff-config-discovery,python-lint-scan}.md`。项目全量源集、规则/锁/政策及注释、依赖、安全适配仍缺,不勾选。 + F05 进展:原生 pip-audit 完整报告与本轮唯一 pylock 整组组件匹配后,即使退出异常、随后超时或其它输出超限,也保留 advisory 与故障原因;残缺 JSON 和锁外组件不生成项目 finding。局部报告/工作台仍为未完成和 `not_evaluated`;`check all` 同样保留发现,但异常退出和输出超限的执行节点与类别候选为 `native_incomplete`,见 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。真实工具、条件环境/依赖组、漏洞库来源及时效和完整门禁仍缺,7.2 不勾选。 + 后续进展:局部反馈 0.8 与本地报告 0.7 增加原生逐文件设置观察,真实逐文件 ignore 与伪造规则启用矛盾反例通过;设置观察不证明源码内抑制缺席,不改变退出 3 或 `not_evaluated`,见 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 + 最新进展:局部反馈 0.9 与本地报告 0.8 增加源码注释抑制原生对照及 `suppressed` 文件状态;真实 `# noqa`、复检与任务持久化反例通过。配置级 suppressions 与其它 Python 检查族仍缺,不能勾选。 + 注释类别增量:Ruff 0.16.8 在项目显式启用 D100 时,`check all` 将本轮原生 D100 诊断关联 Python `comments` 候选并给出模块 docstring 修复/原工具复检动作;真实缺文档与补文档两轮证明只有实际诊断才列为已观察,仍为未验证覆盖和 incomplete 交付。未建立全部 pydocstyle/DOC 规则的生效集合、配置级抑制、可信规则包或完整注释义务,7.2 不勾选。 + 依赖/CVE 输入进展:新增只读 Python requirements 行级分类与逐构建根锁归属,`detect`/`plan cve python`/`check all` 向智能体说明缺少真实依赖闭包、原生检查器和漏洞库验证;有锁或版本 pin 都不当作漏洞扫描结果。验收见相邻 `codeguard-cli/tests/acceptance/python-dependency-input-discovery.md`。原生 pip-audit 调用、漏洞报告解析/归属、数据库身份及时效、稳定任务与正式门禁仍未完成,7.2 不勾选。 + PEP 751 标准锁进展:`pylock.toml`/单段命名锁作为候选输入被观察,uv/Poetry 专用锁保留独立转换或原生工具选择动作;两类同根并存不任意选一份。该区分只减少错误命令建议,尚无 pylock 语义解析或 pip-audit 原生执行证据,7.2 不勾选。 + pip-audit 协议进展:相邻 Rust adapter 加入标准锁项目模式的固定只读 argv 与当前 2.x JSON 保守解析;跳过的组件、重复字段、版本/退出矛盾、意外修复结果和未关闭的别名/描述输出均拒绝。有效包版本和 advisory 仅形成局部观察,`advisory_coverage=not_evaluated`。六项协议测试通过,见 `codeguard-cli/tests/acceptance/pip-audit-protocol.md`。尚未有本机 pip-audit 原生调用、同轮锁/工具身份绑定、数据库时效或 CLI/工作台接线,7.2 不勾选。 + 公开局部探针进展:`cve python` 现可显式选择原生工具/版本,在私有项目副本中复放一份标准 pylock 与 pyproject,使用共享受控进程执行并前后核对原输入、私有副本和工具字节。human/JSON 反馈原生 advisory 或具体准备阻塞,固定 3/`not_evaluated`/覆盖未证明;工具修改私有锁、原生零项与缺锁反例均有 CLI 测试。协议 0.1 见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。使用的是真实进程内核和模拟原生程序,本机 pip-audit、数据库时效、完整 PEP 751 环境/包图、check all 与稳定任务仍未验收,7.2 不勾选。 + 锁身份补强:原生报告的整组组件名/版本现在必须与本轮 PEP 751 标准锁显式版本集合一致;锁中无版本包、原生包不在锁中或版本不符均不能成为项目 finding。等价 Python 包名规范化及缺包/错版本反例通过,见同一验收文档。环境 marker、extras、dependency groups、文件哈希及完整有效包图仍未解析,7.2 不勾选。 + 锁选择防误报增量:标准锁的顶层环境/解释器约束、非空 extras/依赖组/default-groups 及包级 marker/解释器约束现被识别为未解析选择;已配置工具时仍执行原生审计、反馈原生版本/退出和待归属 advisory 数量,但不把 `[[packages]]` 并集或本轮 advisory 当作实际依赖漏洞。适配器 RED→GREEN 和 CLI 原生进程正例见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。这是拒绝错误归属且保留原工具检查的保护,尚未实现各环境的精确选择与全量扫描,7.2 仍未完成。 + 统一检查接线:`check all` 现在按具有可识别 pyproject 的 Python 构建根创建独立 `python.cve.N` 执行节点,复用私有快照原生探针和共享截止时间/取消;显式提供 pip-audit 工具及版本时,human/JSON 逐根显示 advisory,缺工具或缺锁反馈具体准备阻塞。反馈协议 0.30 与中断协议 0.11 新增 `python_cve`,旧协议留存;纯源码无清单继续保留配置缺口。多构建根、缺原生上下文与旧 Python/Rust 混合回归通过;该阶段仍无稳定 CVE 修复任务、复检、漏洞库时效和可信门禁,本机未运行真实 pip-audit,7.2/2.3 不勾选。见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。 + 工作台增量:已初始化工作区现把 `cve python` 和 `check all` 的逐构建根观察同步为稳定 CVE 完整性任务;导入前重读工作区、清单与整组标准锁。`task verify` 对任务原构建根再次调用显式 pip-audit,复检事件经 `next` 的摘要和输入身份核对;重复扫描一张任务、双构建根两张任务、同一任务的 advisory→零项复检仍 open 的普通 CLI 回归通过。独立 Draft 2020-12 对实际工作台报告与复检预览通过。仍仅模拟原生程序,缺真实 pip-audit、PEP 751 完整环境/依赖组、可信漏洞源、精确漏洞修复任务和正式关闭/门禁;7.2/9.7 保持未完成。验收见相邻 `codeguard-cli/tests/acceptance/python-cve-workbench-task.md`。 + D100 修复闭环与误报边界:已初始化工作区的真实 `check all` 将 D100 同步为稳定任务,`next` 给出修复指引;原工具复检仍存在与补文档后候选消失均写事件,任务不因勾选或零诊断自动关闭。伪原生报告若声称 D100、但同轮生效设置未启用,则保留诊断并标记 `rule_settings_report_mismatch`,不能变成可执行注释结论。解析器内部保留精确原生启用集合,公开映射与 schema 不变。仍缺正式全量注释覆盖和可信规则来源,7.2/9.7 不勾选。 + pydocstyle 规则族增量:仅将精确 D### 格式且同轮 Ruff 原生设置确认启用并实际检出的诊断归入 Python `comments`;真实 D101 公共类缺文档样本通过。伪报告 D100/D101 若与启用集合矛盾则保留诊断、标记 `rule_settings_report_mismatch` 并取消本地完整结论;D1000 等非精确代码不归类。此分类不宣称完整 D/DOC 规则覆盖、规则包批准或交付通过,7.2 不勾选。 + D101 指引与复检:对话反馈及稳定任务给出公共类 docstring 的限定范围修复步骤;真实 `# noqa: D101` 只产生 `suppression_requires_review`,真正补文档后仍仅 `candidate_absent_unverified_policy`,任务保持 open。全部注释义务与可信策略仍缺,7.2/9.7 不勾选。 + D101 白名单自批反例:工作区自写 `codeguard/decisions/forged.json` 的 `approved=true` 后,真实 Ruff D101 仍保留同一 finding 和唯一 open 任务;`rules whitelist propose` 不生成候选,并将未核对的原生规则映射与批准规则包身份分别列为缺口,human 输出指引核对原规则/工具版本。已有映射的 F401 回归仍保持原待批准状态。当前只有拒绝路径,可信批准来源及真实例外门禁仍缺,4.8/4.9 不勾选。 - [ ] 7.3 实现 Node/TypeScript/JavaScript(typescript)adapter 基础与依赖审计;验收:parser/tsconfig/本地插件和 monorepo 范围正确。 + 稳定任务前置:Rust投影绑定相对路径/规则/源码锚点/出现序号,排序去重;行号/原生措辞变化不造新ID,任一定位异常拒绝整组输入。UTF16、CRLF与Unicode行终止符经真实ESLint位置用例核对(0.23秒),四项身份契约及CLI/probe回归通过。报告入队/同步/next尚未接通,不能声称已创建持久任务;7.3/9.7仍未完成,见相邻tests/acceptance/eslint-stable-task-input.md。 + 公开入口进展:`lint typescript FILE`显式Node/ESLint入口/版本/原配置/原cwd调用原生probe,human/JSON保留规则/位置/严重度及准备原因;局部反馈0.1.0固定coverage=false、门禁未判定、工作台未接入。23项普通回归与真实ESLint原发现/同配置修复后零诊断两轮35.44秒通过。目录/完整源集、持久任务、TS/parser/plugin/monorepo及依赖仍缺,7.3不勾选;见相邻tests/acceptance/eslint-public-lint-feedback.md。 + 原生核心规则验收:发现本机既有ESLint10.11.0缓存,无安装/升级,通过显式Node24.18.0和Rust runtime运行真实clean/warning/error/parser failure/inline suppression/同配置修复复检六轮,104.56秒通过。原生抑制保持待核查,零诊断仅局部一致;不是TS/parser/plugin/monorepo/完整CLI与门禁验收,7.3不勾选。见相邻 `codeguard-cli/tests/acceptance/eslint-native-core-rules.md`。 + 发现补充:独立JS/TS无清单也返回配置准备;清单复核变更/不可读(有无flat config四反例)使发现不完整,不能隐藏为未知配置并标画像新鲜。先RED后修正,发现/初始化/端口66项通过。 + 配置发现进展:detect/init 接入六种 flat config、旧 eslintrc 和 package.json eslintConfig 的只读线索,保留嵌套配置根及配置字节身份;动态规则、多候选选择、TS loader、旧版本上下文和未观察到配置均明确 unknown,不执行JS或套默认规则。67项发现/初始化/发现端口回归通过,见相邻 `codeguard-cli/tests/acceptance/eslint-static-configuration-discovery.md`;真实逐文件配置、插件/导入闭包、CLI执行和依赖审计仍缺,7.3不勾选。 + 受控执行进展:Rust 统一 runtime 接入显式 Node/ESLint 入口、原配置和完整显式输入摘要;版本、私有新鲜报告及执行前后输入校验不一致均未完成。普通启动前反例与实际 Node 受控 JSON 夹具见相邻 `codeguard-cli/tests/acceptance/eslint-input-bound-probe.md`;该夹具不是原生 ESLint,项目有效配置、导入/插件闭包、TS/monorepo、CLI/依赖审计仍缺,7.3 不勾选。 + 中断诊断进展:扫描启动后取消/超时分别覆盖已写有效报告与无报告四种受控反例;缺报告加取消曾 RED,现优先保留请求中断,不降级为报告损坏。其它失败分流为报告预检、执行留证和报告读取;不把退出2/无报告解释为源码违规。仍为执行层局部验收,完整7.3不勾选。 + 原生命令计划进展:新增 EslintCommand 显式 Node/JS/原配置/源集/JSON 槽位/阈值,以固定字面参数规划,不 Shell/npx/fix/cache/quiet/no-ignore;路径/重复/覆盖及参数预算启动前拒绝。缺 API 先 RED 后实现;四项参数契约通过,真实 Node 24.18.0 经统一 runtime 转发 argv 实测通过(0.05 秒),此为观察脚本,不是 ESLint 原生执行。闭包/物理别名/生效配置/实际 ESLint/CLI/依赖及门禁仍缺,7.3 不勾选;见相邻 tests/acceptance/eslint-native-command-plan.md。 + 报告协议进展:新增 Rust ESLint 10 JSON 有界观察,按具体版本/冻结文件与计数解释 0/1/2、max-warnings、fatal/无 ruleId 和 suppression;合法 warning 与部分规则保留,坏范围/版本/重复/计数不自成干净结果。缺 API 先 RED,dot 路径因自动折叠再 RED 后修正;本轮只做协议夹具,不安装或执行 ESLint。CLI/Node 闭包/有效 parser/config/monorepo/依赖和任务门禁仍缺,7.3 不勾选;见相邻 tests/acceptance/eslint-json-observation.md。 - [ ] 7.4 实现 Shell(shell)方言与 Dockerfile(dockerfile)/IaC 基础;验收:zsh 不静默丢弃、Hadolint 与配置安全报告不互相掩盖故障。 - [ ] 7.5 实现 CVE 共享生态映射、依赖归并和数据库 freshness;验收:UNKNOWN/离线/原生缺失/重复依赖均符合规格。 +- [ ] 7.6 实现跨生态静态检查配置识别与原生结果归类;验收:注释/API 文档、依赖治理、SAST/秘密/IaC/容器等检查器在已配置时运行并反馈,未配置/无效/不可用分开解释,修复后按原工具复检。 ## 8. S08 全语言补齐 依赖:S05,复用 S06/S07 已验收基础。覆盖:native-tool-adapters、language-gate-commands。 -每组以 [57 项清单](../../../docs/rust-cli/coverage-and-acceptance.zh-CN.md) 为边界;每个语言必须有五槽位、工具锁、正反例、故障样本、平台与真实验收产物。每个语言分别拆为能力判定、lint/comments、其余类别与验收三项;每项内部有多工具时按实际 adapter 再细拆,不将未完成工具藏在汇总完成状态中。 +每组以 [57 项清单](../../../docs/rust-cli/coverage-and-acceptance.zh-CN.md) 为边界;每个语言必须有六槽位、工具锁、正反例、故障样本、平台与真实验收产物。每个语言分别拆为能力判定、lint/comments、其余类别与验收三项;每项内部有多工具时按实际 adapter 再细拆,不将未完成工具藏在汇总完成状态中。 -- [ ] 8.1 为 go 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [x] 8.1 为 go 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。证据:相邻 Rust `rulepacks/go_static_candidate_v1.json`、`schemas/go-static-candidate.schema.json`、`codeguard-adapters::parse_go_candidate_profile` 和 `tests/acceptance/go-candidate-baseline.md`;六槽均 `applicable/gap`,五平台未验收,旧 Go stable 不升级为新能力;缺槽/重复/虚报实现、格式化器冒充注释、CVE 漏数据库时效及错类别工具反例通过。真实原生适配与验收仍属 8.2/8.3。 - [ ] 8.2 实现 go 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.3 完成 go 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.4 为 csharp 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 + 原生文件范围进展:Go 普通反馈 0.6 / 源码复检 0.7 / 统一反馈 0.22 增加整组源码摘要;源码复检沿用受控 Go 环境获取 go list JSON,目标 excluded/not_selected 不作为已修复候选,清单失败保持 incomplete;next 和同步在整组源码变化后要求复扫或仅记历史。标签、CGO、平台排除真实反例与普通导入回归通过;完整平台/规则覆盖、注释检测与可信关闭仍缺,8.2 不勾选。 + 原工具任务复检进展:`task verify --go-tool ABS_PATH` 现沿用共享预算、租约、尝试绑定和报告事件;Go 0.5 绑定目标源码,反馈 0.4 区分仍存在、同规则身份变化待核对、未发现候选和未完成。next/尝试历史消费同一 Go 事件,模块配置或源码变化后不沿用候选。普通环境复检、真实 still_present/身份变化/修复/编译失败及实际 schema 验证通过;正式关闭/复发重开、完整平台/规则覆盖和可信策略仍缺,8.2 不勾选。 + 持久任务进展:Go 子反馈 0.4 / 统一反馈 0.21 绑定 workspace/run 及各模块 manifest/go.sum 字节摘要,lint go/check all 自动保存并幂等同步;next 与 Markdown 任务给出 Go 原工具复扫及环境/策略修复指引。错工作区、位置/模块/计数矛盾或越界拒绝源码任务,源码或模块摘要变化保留历史而非活动发现。真实重复扫描只保留一个任务,修复后同步不自动关闭;Go task verify、完整策略/平台覆盖仍缺,8.2/9.13 不勾选。 + 稳定身份前置进展:Go 子反馈 0.3 / 统一反馈 0.20 绑定发现 ID、完整指纹与本轮源码摘要;前置空行保持 ID、不同原生证据/重复锚点分离,模块内位置越界拒绝全部部分发现。原生顺序先排序、同位置同诊断去重。该阶段尚无 Go 持久报告归属、work sync/next/task verify 接线,8.2 仍未完成。 + 进行中:相邻 Rust `codeguard-adapters::parse_go_vet_json` 已针对本机 Go 1.23.4 的原生 `go vet -json` 做保守局部解析,真实违规/干净/编译错误样本与坏版本、坏 JSON、越界位置、多包坏块反例通过;`-json` 违规样本退出 0 但 stderr 有诊断,不能以退出码判干净。macOS `/var` 与 `/private/var` 根别名经真实反例修正。解析器本身不证明工具/规则身份、完整源集/build tags/多平台覆盖或 Staticcheck 注释检测;见相邻 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 + CLI 进展:`codeguard lint go [path] --go-tool ABS_PATH --format json` 已经由 Rust 运行时执行原生版本探测和 vet,离线私有 Go 环境、源码/清单/工具前后摘要及 stderr JSON 解析进入公开局部反馈;真实违规、干净、编译失败和错误工具正反例通过。仍固定退出 3、`not_evaluated`,没有任务同步、受批准策略/工具锁、完整 build tags/平台覆盖或 Staticcheck 注释适配,故 8.2 不勾选。 + 范围加固:早期仅执行根模块时曾对嵌套 `go.mod` 返回明确未完成;现已由下一项逐模块执行替代。原生诊断的相对文件若不在本轮已发现和摘要复核的 Go 源码集合中,不产生该诊断对应的 finding。对应 CLI 反例与本机原生正反例通过;完整源集仍未证明,8.2 不勾选。 + 多模块进展:局部 CLI 现按发现的 Go Module 根逐一运行原生 vet,记录每模块状态并保留前一完整模块的 finding;双模块真实违规与后续编译失败样本通过。逐模块输入摘要和发现归属复核仍只构成局部观察;build tags/平台矩阵、可信工具与规则策略、注释适配和完整验收仍缺,8.2 不勾选。 + 统一检查进展:`check all --go-tool` 复用同一观察服务并纳入共享调度/执行预算、候选类别及 JSON/human/SARIF 局部反馈。缺工具与预算耗尽有明确状态,真实 Go finding 可见但不签发完整通过;持久任务与正式义务、规则/平台证明仍缺,8.2 不勾选。 +- [ ] 8.3 完成 go 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.4 为 csharp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.5 实现 csharp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.6 完成 csharp 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.7 为 kotlin 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.6 完成 csharp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.7 为 kotlin 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.8 实现 kotlin 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.9 完成 kotlin 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.10 为 swift 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.9 完成 kotlin 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.10 为 swift 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.11 实现 swift 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.12 完成 swift 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.13 为 php 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.12 完成 swift 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.13 为 php 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.14 实现 php 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.15 完成 php 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.16 为 ruby 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.15 完成 php 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.16 为 ruby 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.17 实现 ruby 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.18 完成 ruby 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.19 为 scala 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.18 完成 ruby 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.19 为 scala 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.20 实现 scala 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.21 完成 scala 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.22 为 elixir 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.21 完成 scala 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.22 为 elixir 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.23 实现 elixir 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.24 完成 elixir 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.25 为 c 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.24 完成 elixir 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.25 为 c 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.26 实现 c 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.27 完成 c 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.28 为 cpp 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.27 完成 c 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.28 为 cpp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.29 实现 cpp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.30 完成 cpp 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.31 为 objc 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.30 完成 cpp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.31 为 objc 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.32 实现 objc 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.33 完成 objc 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.34 为 dart 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.33 完成 objc 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.34 为 dart 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.35 实现 dart 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.36 完成 dart 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.37 为 vue 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.36 完成 dart 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.37 为 vue 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.38 实现 vue 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.39 完成 vue 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.40 为 svelte 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.39 完成 vue 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.40 为 svelte 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.41 实现 svelte 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.42 完成 svelte 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.43 为 astro 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.42 完成 svelte 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.43 为 astro 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.44 实现 astro 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.45 完成 astro 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.46 为 css 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.45 完成 astro 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.46 为 css 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.47 实现 css 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.48 完成 css 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.49 为 html 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.48 完成 css 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.49 为 html 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.50 实现 html 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.51 完成 html 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.52 为 graphql 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.51 完成 html 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.52 为 graphql 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.53 实现 graphql 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.54 完成 graphql 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.55 为 solidity 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.54 完成 graphql 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.55 为 solidity 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.56 实现 solidity 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.57 完成 solidity 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.58 为 terraform 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.57 完成 solidity 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.58 为 terraform 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.59 实现 terraform 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.60 完成 terraform 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.61 为 nix 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.60 完成 terraform 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.61 为 nix 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.62 实现 nix 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.63 完成 nix 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.64 为 sql 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.63 完成 nix 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.64 为 sql 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.65 实现 sql 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.66 完成 sql 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.67 为 protobuf 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.66 完成 sql 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.67 为 protobuf 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.68 实现 protobuf 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.69 完成 protobuf 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.70 为 yaml 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.69 完成 protobuf 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.70 为 yaml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.71 实现 yaml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.72 完成 yaml 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.73 为 markdown 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.72 完成 yaml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.73 为 markdown 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.74 实现 markdown 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.75 完成 markdown 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.76 为 toml 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.75 完成 markdown 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.76 为 toml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.77 实现 toml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.78 完成 toml 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.79 为 haskell 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.78 完成 toml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.79 为 haskell 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.80 实现 haskell 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.81 完成 haskell 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.82 为 ocaml 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.81 完成 haskell 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.82 为 ocaml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.83 实现 ocaml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.84 完成 ocaml 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.85 为 fsharp 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.84 完成 ocaml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.85 为 fsharp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.86 实现 fsharp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.87 完成 fsharp 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.88 为 perl 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.87 完成 fsharp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.88 为 perl 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.89 实现 perl 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.90 完成 perl 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.91 为 groovy 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.90 完成 perl 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.91 为 groovy 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.92 实现 groovy 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.93 完成 groovy 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.94 为 clojure 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.93 完成 groovy 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.94 为 clojure 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.95 实现 clojure 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.96 完成 clojure 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.97 为 powershell 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.96 完成 clojure 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.97 为 powershell 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.98 实现 powershell 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.99 完成 powershell 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.100 为 zig 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.99 完成 powershell 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.100 为 zig 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.101 实现 zig 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.102 完成 zig 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.103 为 nim 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.102 完成 zig 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.103 为 nim 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.104 实现 nim 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.105 完成 nim 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.106 为 crystal 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.105 完成 nim 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.106 为 crystal 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.107 实现 crystal 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.108 完成 crystal 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.109 为 julia 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.108 完成 crystal 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.109 为 julia 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.110 实现 julia 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.111 完成 julia 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.112 为 elm 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.111 完成 julia 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.112 为 elm 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.113 实现 elm 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.114 完成 elm 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.115 为 lua 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.114 完成 elm 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.115 为 lua 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.116 实现 lua 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.117 完成 lua 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.118 为 luau 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.117 完成 lua 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.118 为 luau 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.119 实现 luau 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.120 完成 luau 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.121 为 pascal 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.120 完成 luau 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.121 为 pascal 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.122 实现 pascal 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.123 完成 pascal 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.124 为 r 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.123 完成 pascal 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.124 为 r 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.125 实现 r 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.126 完成 r 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.127 为 cfml 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.126 完成 r 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.127 为 cfml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.128 实现 cfml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.129 完成 cfml 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.130 为 vbnet 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.129 完成 cfml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.130 为 vbnet 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.131 实现 vbnet 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.132 完成 vbnet 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.133 为 erlang 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.132 完成 vbnet 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.133 为 erlang 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.134 实现 erlang 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.135 完成 erlang 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.136 为 liquid 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.135 完成 erlang 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.136 为 liquid 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.137 实现 liquid 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.138 完成 liquid 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.139 为 cuda 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.138 完成 liquid 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.139 为 cuda 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.140 实现 cuda 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.141 完成 cuda 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.142 为 ansible 固化五类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 +- [ ] 8.141 完成 cuda 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [ ] 8.142 为 ansible 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 - [ ] 8.143 实现 ansible 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.144 完成 ansible 的 CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.145 为 cobol 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。 -- [ ] 8.146 为 arkts 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。 -- [ ] 8.147 为 metal 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。 -- [ ] 8.148 机器核对最新注册表与全部验收条目;验收:54 个原 stable 五槽位与真实证据完整,3 planned 如实披露,无丢项/重复/别名漂移。 +- [ ] 8.144 完成 ansible 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 +- [x] 8.145 为 cobol 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。证据:相邻 Rust `planned_language_gaps` 集成测试以 `.cbl` 项目检查六类别、capabilities planned/gap、退出 3 和不生成空义务;见 `tests/acceptance/planned-language-gaps.md`。 +- [x] 8.146 为 arkts 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。证据:同一测试的 `.ets` 正反例和六类别未集成反馈。 +- [x] 8.147 为 metal 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。证据:同一测试的 `.metal` 正反例和六类别未集成反馈。 +- [ ] 8.148 机器核对最新注册表与全部验收条目;验收:54 个原 stable 六槽位与真实证据完整,3 planned 如实披露,无丢项/重复/别名漂移。 ## 9. S09 持久问题与修复工作流 -依赖:S02、S03、S04、S05;与后续修复和宿主接入共享本协议。覆盖:remediation-workflow、scan-scope-policy。 - -- [ ] 9.1 实现 init dry-run/apply 与工作区 schema/.gitignore/受管路径;验收:不覆盖用户文件,不重复建立质量配置,未初始化只用私有用户缓存存原始报告。 -- [ ] 9.2 实现自有产物精确范围规则与工作区校验;验收:运行副本不递归扫描,codeguard/src 用户源码正常检查,入库 secret 仍阻断。 -- [ ] 9.3 实现 finding/blocker 的稳定身份与重命名匹配;验收:十次相同扫描只有一个问题,行号变化不生成无意义重复,不确定匹配不误关闭。 -- [ ] 9.4 实现 run_id 游标、全量未消费报告幂等 sync;验收:先 lint 后 CVE 不丢问题,部分/过时报告不能跨范围关闭旧问题。 -- [ ] 9.5 实现 append-only 事件、父关系、状态机与可重建 Markdown 投影;验收:手改勾选无复检不关闭,缺父/分支冲突触发协调。 -- [ ] 9.6 实现任务依赖与 blocker 归并;验收:多个模块共缺 JDK 形成一个前置任务,各义务仍完整可见。 -- [ ] 9.7 实现 status/next/show 与 RepairBrief/版本化 recipe;验收:给出修复目标、范围、步骤和复检条件,诊断中的指令不可执行。 -- [ ] 9.8 实现 claim/heartbeat/release 跨进程租约;验收:同工作区只有一个有效领取者,过期和中断可恢复,不声称跨机器全局锁。 -- [ ] 9.9 实现 attempt start/finish、动作与 patch 身份、无进展预算;验收:复检前失败/no-change/abandoned 均计数,耗尽后不重复推荐同一动作。 -- [ ] 9.10 实现 task verify 的证据关闭与重开;验收:工具超时、加 ignore、移动到排除目录不自动 resolved,真修复有完整身份绑定。 +依赖:S02、S03、S04、S05;与后续修复和宿主接入共享本协议。覆盖:remediation-workflow、scan-scope-policy、project-initialization。 + +- [ ] 9.1 实现 init dry-run/apply 与工作区 schema/.gitignore/受管路径;验收:不覆盖用户文件,不重复建立质量配置,未初始化只用私有用户缓存存原始报告。进行中:相邻 Rust CLI 已提供默认只读预览、精确受管目标预检查和局部 apply,含根 AGENTS 受管摘要;当前 apply 固定 partial/退出3,不虚构完整初始化。准备任务、刷新及私有原始报告缓存尚未接线;见 `codeguard-cli/tests/acceptance/init-workspace-preview.md`。 +- [ ] 9.2 实现自有产物精确范围规则与工作区校验;验收:运行副本不递归扫描,codeguard/src 用户源码正常检查,入库 secret 仍阻断。进行中:相邻 Rust discover 已精确跳过自有文件及记录目录,保留 `codeguard/src`;真实 Git index 路径安全预览独立运行,但自有记录内容安全与正式 gate 仍缺。见 `codeguard-cli/tests/acceptance/init-workspace-preview.md`。 +- [ ] 9.3 实现 finding/blocker 的稳定身份与重命名匹配;验收:十次相同扫描只有一个问题,行号变化不生成无意义重复,不确定匹配不误关闭。进行中:相邻 Rust CLI 的 Ruff 局部反馈 0.3 产生不依赖行号的 ID/指纹;真实双轮扫描加本地 sync 验证同一发现仅一份 finding/task。重复 finding 的每轮证据现写入忽略入库的 `state/observations/`,避免改动首次事实与无意义审计事件,崩溃重试幂等。局部 Ruff 环境 blocker 以 checker、构建根、原因和范围生成稳定 ID,重复扫描复用任务。Rust Clippy 局部 finding 现按原生规则、目标与源码行内容形成稳定身份;重复扫描只保留一张任务,缺 Cargo blocker 同样稳定。重命名关联、跨工具身份和不确定匹配协调仍缺,不勾选。 + Java/P3C 命名子集现也按原生规则、目标和源码锚点形成稳定 finding,缺 P3C 配置按 Maven 构建根/原因形成 blocker;初始化工作区两次扫描只保留一张任务。仍无重命名关联或不确定匹配协调。 + CVE/Java/Ruff 等现有 blocker 的重复报告逐轮保存到忽略入库的 `state/observations/`,只有首次或复检后再现追加 tracked 事件;重复扫描任务及 tracked 事件均稳定。跨模块公共前置依赖和完整事件状态机仍缺,不勾选。 +- [ ] 9.4 实现 run_id 游标、全量未消费报告幂等 sync;验收:先 lint 后 CVE 不丢问题,部分/过时报告不能跨范围关闭旧问题;事件写入后游标写入前崩溃可恢复且不重复,一份坏报告不阻止其它有效报告持久化,整体仍返回3。进行中:Rust `lint python` 在已初始化工作区按 workspace_id 保存脱敏本地报告并自动调用 `work sync`;后者遍历全部未消费 Ruff 报告,先落 finding/event/task 后落 `(workspace_id,run_id,摘要)` 消费标记,重复导入和标记丢失重试不重复任务;旧源码只计历史,坏报告不阻止有效报告,同键不同摘要拒绝。跨类别 RunReport、准备诊断、严格事务和并发协调仍缺,见 `codeguard-cli/tests/acceptance/work-sync-ruff-baseline.md`,不勾选。 + 新增 Java/CVE 局部报告 0.3 的自动保存与幂等导入:数据库时效未知和缺工具/库分别生成稳定 blocker,同根重复扫描不创建多张任务;消费后改报告再次同步会显示摘要冲突。CVE advisory 仍只是未核验原生观察,尚不生成源码 finding。跨类别完整 RunReport、崩溃矩阵与可信来源仍未完成,9.4 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 + 跨类别恢复验收补充:同一工作区的 Ruff 与 CVE 两份已保存报告在自动同步失败后可由一次 `work sync` 同时导入;一份坏报告不阻止这两份报告,删除两份消费标记后重试也不新增任务/事件。见相邻 `codeguard-cli/tests/acceptance/work-sync-lint-cve-cross-category.md`。任意崩溃点事务、并发及全类别 RunReport 尚未验收,9.4 不勾选。 + 坏报告现在按当前字节摘要保存脱敏本地失败收据;`next` 对未改输入返回具体失败原因而非反复建议同步,报告变更后旧收据不适用。收据不构成 finding 或白名单批准。回归仍仅覆盖局部报告队列,9.4 不勾选。 + 同工作区 `work sync` 现复用原有跨进程非阻塞文件锁,将本轮报告遍历、fact/事件和消费标记置于同一临界区;锁被占用时返回版本一致的未完成协议,释放后可重试。此测试验证互斥与恢复,不证明完整多进程随机交错、跨平台锁或任意崩溃点事务,9.4 仍不勾选。 + 持久边界补充验收:Ruff finding 的任务、fact、本地观察、事件四阶段及 Ruff 环境 blocker 的 fact 阶段均用独立工作区恢复;重放后缺失记录恢复、原字节不变、事件仅一条、消费标记最后出现。此阶段是磁盘中间态重建,实际进程退出验收见下条;磁盘故障和完整多类别事务矩阵仍缺,9.4 不勾选。 + 实际进程退出补充:仅单元测试编译的子进程在 Ruff finding 的事件已持久化、消费标记未写时直接退出,父进程复查磁盘并重试,事件不重复且游标恢复;生产构建无故障注入入口。其它阶段、磁盘故障、跨类别多记录强杀与完整 RunReport 仍缺,9.4 不勾选。 + 临时写入恢复补充:旧 PID/计数命名的 staging 文件残留曾使 `write_once` 直接失败;现有界换用新的 `create_new` 名字,残留文件原字节不变,目标记录完成。仍未证明磁盘错误/断电和完整事务,9.4 不勾选。 +- [ ] 9.5 实现 append-only 事件、父关系、状态机与可重建 Markdown 投影;验收:手改勾选无复检不关闭,缺父/分支冲突触发协调。进行中:Ruff 与 Rust Clippy 初见 finding 写固定 `observed` 事件和任务投影,重复报告不改 tracked 文件;其余事件、父关系校验、完整状态机及投影重建尚未实现,不勾选。 +- [ ] 9.6 实现任务依赖与 blocker 归并;验收:多个模块共缺 JDK 形成一个前置任务,各义务仍完整可见。进行中:Rust `work sync` 已将同一 Ruff 构建根、同一不完整原因的多个受影响文件归并成一个 `kind=blocker` 任务,分别保留原路径与观察事件;不同构建根不误合并,见 `codeguard-cli/tests/acceptance/work-sync-ruff-blockers.md`。JDK 跨模块公共前置任务、义务依赖边及跨检查器归并尚缺,不勾选。 +- [ ] 9.7 实现 status/next/show 与 RepairBrief/版本化 recipe;验收:给出修复目标、范围、步骤和复检条件,诊断中的指令不可执行。进行中:Python Ruff 局部反馈给出有界修复提示;初版 sync 生成脱敏 Markdown 任务。Rust `next` 已从本地结构化 Ruff fact 生成只读简报,含范围、静态步骤、复检与关闭条件;任务 Markdown 指令不进入简报,缺工具/配置优先指向准备工作。尚无完整 status/show、真实尝试历史、版本化 recipe、租约与复检关闭,因此不勾选,见 `codeguard-cli/tests/acceptance/next-local-brief-preview.md`。 + doctor 复检进展:task verify 已重用原版本诊断和任务租约/尝试一致性,持久化摘要绑定收据;next 与尝试账本识别 doctor 身份。失败仍受阻、未选择未完成,真实 Ruff 恢复仅 environment_restored_unverified_policy,next 指向批准前置及原受阻质量检查,任务仍 open。65 项相关回归及实际协议验收通过;可信义务/正式关闭未实现,不勾选,见相邻 tests/acceptance/doctor-task-verification.md。 + Java/CVE blocker 现也有本地 Markdown 任务和 `java_cve.next` 只读简报,给出构建根、漏洞库/工具检查步骤及带占位参数的复检命令;原生 advisory 未被当作已确认漏洞或白名单批准。`task verify` 可重跑原生 OWASP 并保留局部观察,但正式关闭/重开尚未实现,9.7 不勾选。 + 新增局部 `status` 与 `task show` 只读视图:前者从当前受限事实汇总开放任务、待同步报告和下一步,后者复用事实/事件核对展示指定任务的证据、范围、约束、历史和复检,不读取 Markdown 指令。画像/检查 freshness 固定未核验,空任务不称通过;缺完整事件父关系、历史 gate 收据、依赖、关闭状态与版本化 recipe,9.7 仍不勾选。见相邻 `codeguard-cli/tests/acceptance/status-show-local-preview.md`。 + Checkstyle 工作台连接进展:显式 --workspace 现保存摘要绑定的本轮局部观察,复用既有 work sync 稳定任务与事件,next 从最新报告给出规则依据、修复步骤和原输入复检参数;源码/配置变化要求复扫,手工勾选不关闭任务。历史消费按精确字节收据复用,陈旧新报告不导入。task verify、环境阻塞持久化、check all 配置发现与正式闭环仍缺,9.7/6.3 不勾选;验收见相邻 tests/acceptance/checkstyle-local-workbench.md。 + + Checkstyle 复检进展:task verify 现接受显式 Java/JAR/原配置,在统一预算和租约中重跑原工具,记录仍存在/暂未检出/规则覆盖待审/未完成,next 与尝试读者识别对应收据。工具身份固定首次观察,连续更换工具不能滚动认可;失败观察记录具体原因,全部保持 open。正式关闭、批准策略、完整配置/覆盖、环境任务与取消端到端仍缺,9.7/6.3 不勾选;验收见相邻 tests/acceptance/checkstyle-task-recheck.md。 + + Checkstyle 前置任务进展:显式工作台遇到缺工具/配置/报告问题现保存准备观察并同步稳定 CG-B 任务,next 读取最新具体诊断和受影响范围;不会生成源码 finding,备注/勾选不关闭。后续同范围已消费原生观察只转向核对原选择与批准覆盖,不重复恢复工具;输入变化使线索失效。模块粒度、准备 task verify、完整关闭与宿主 Hook 仍缺,9.7/6.3 不勾选;验收见相邻 tests/acceptance/checkstyle-preparation-tasks.md。 + + Checkstyle 准备复检进展:task verify 现支持显式原工具的准备任务复检,保存具体 still_blocked/incomplete 或局部恢复观察,并同步源码 finding;租约失败不执行或落事件,任务保持 open。53 项受影响普通回归、真实 Java/Checkstyle 恢复及实际产物 schema 通过,见相邻 tests/acceptance/checkstyle-preparation-recheck.md。完整义务/批准与关闭仍缺,9.7 不勾选。 + 准备尝试预算进展:新增 claim/ready-to-verify/失败复检/事件关联/两轮预算耗尽全链用例。修正失败复检后简报不可修复导致 task_not_actionable 的卡点;当前输入有效时允许前置修复,输入变化仍先复检,预算耗尽返回 needs_decision。29 项相关普通回归及真实 Checkstyle 恢复通过,9.7 保持未勾选。 + 恢复交接进展:真实准备尝试的恢复事件关联 attempt,解除 awaiting_verification,环境任务保持 open。复检后 Java/JAR 身份变化现令 next/task show 的旧恢复或缺失观察失效;真实复制 JAR 改动反例先失败后通过(10.28 秒)。批准与正式关闭仍缺,9.7 不勾选。 + 反馈原因进展:next/task show 将当前工具/源码/配置失效原因与原复检原因分开;status 摘要不再丢失具体前置诊断。专用简报与状态 schema 更新,17 项普通回归、JAR 改动/删除真实回放(9.77 秒)及实际产物 schema 通过。正式批准与全义务仍缺,9.7 不勾选。 + 当前输入优先进展:真实 still_present 反例暴露配置失效被后续旧诊断覆盖为 actionable;next/task show 现先核对工具、配置、已绑定源码变化,再解释旧结果,准备与源码任务共享失效优先级。旧收据保留,当前失效不推荐旧修复方向;相关完整覆盖和关闭仍缺,9.7 不勾选。 + 原始配置连续性进展:复检简报从首次摘要绑定报告保留配置身份;同检查类/规则 ID 下增加名称排除后零诊断,连续复检须为 rule_coverage_requires_review,不成为修复候选。原配置恢复并添加文档后仅给局部候选,事实仍 open;真实反例先 RED、修正后四轮通过(40.99 秒),见相邻 tests/acceptance/checkstyle-recheck-config-continuity.md。配置字节变化均需复核,语义等价及受批准策略/正式关闭仍缺,9.7 不勾选。 +- [ ] 9.8 实现 claim/heartbeat/release 跨进程租约;验收:同工作区只有一个有效领取者,过期和中断可恢复,不声称跨机器全局锁。进行中:相邻 Rust CLI 已有 Unix 本地跨进程锁、随机 token 摘要、generation、5 分钟期限及基本过期接管;并发四领取者只有一人成功,旧 token 和同名 owner 不能修改新租约;未结束 attempt 阻止 release,过期接管先落唯一 abandoned 事件。verify/fix 绑定、完整崩溃事务与 Windows 实现未完成,不勾选。 +- [ ] 9.9 实现 attempt start/finish、动作与 patch 身份、无进展预算;验收:复检前失败/no-change/abandoned 均计数,耗尽后不重复推荐同一动作。进行中:Unix Rust CLI 已有受控 action-id、租约绑定、前后受影响路径摘要、不可覆盖 start/finish 事件、同结果幂等重放和同输入两次无进展预算;`ready-to-verify` 必须有绑定该 attempt-id 的原工具复检才可再次 start,复检仍显示问题/未完成时计入预算,私有报告丢失须重新复检。`next` 展示最近历史并停止推荐耗尽的动作。缺完整 patch/环境身份、跨平台实现、正式 fix 自动登记、可信策略和任务关闭,不勾选。 +- [ ] 9.10 实现 task verify 的证据关闭与重开;验收:工具超时、加 ignore、移动到排除目录不自动 resolved,真修复有完整身份绑定;环境任务先确认恢复再重跑原受阻义务,自有验证租约收尾释放、调用方租约保留、错token不启动检查器。进行中:Rust `task verify` 已复用原生 Ruff 路径,对本地 finding/blocker 保存新报告、同步新问题并追加 `verification_observed`;问题消失只给待策略核验候选,fact 保持 open,`next` 对照报告复核候选;Unix 本地版本新增复检自有/借用租约、扫描前错误 token 拒绝、提交前再次核验及结束后自有租约释放,真实 Ruff 0.16.8 样本已覆盖借用场景。Rust Clippy finding/blocker 现复用租约、原生复检、同步与观察事件;真实抑制后原生 `--force-warn` 对照重新检出旧规则并要求抑制核查;对照无效或输入变化不生成修复候选。见 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`、`task-verify-lease-binding.md` 与 `check-all-partial-native.md`。可信策略/覆盖、长操作自动续租、Windows 等价实现、正式关闭和重开仍缺,不勾选。 + Java/P3C 命名子集也能复用原生 Maven 探针、任务租约、局部报告同步及验证事件;原问题仍在为 `still_present`,零诊断仅为 `rule_coverage_requires_review`,配置恢复为 `environment_restored_unverified_policy`。任务仍 open,源码身份变化不产生有效关闭证据。见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 + 后续进展:原任务被 `# noqa` 遮蔽时,复检 0.2 返回 `suppression_requires_review`,`next` 指向抑制核查且 fact 保持 open;真实删除违规仍仅是待策略核验候选,见 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 + 再次补充:真实 Ruff 复检中,原 F401 被配置禁用时返回 `rule_coverage_requires_review`,新增逐文件 ignore 时返回 `suppression_requires_review`;两者均不关闭任务,也不把零诊断伪装成修复。逐文件匹配范围和受批准策略来源仍待验收。 + CVE blocker 复检进展:`task verify` 已按任务检查器重跑原生 OWASP Maven,接受与 `check java` 一致的离线 Maven/JDK/仓库/漏洞库参数;报告经 sync 保留新阻塞,事件和尝试历史核对原报告摘要。缺前置条件或漏洞库时效未核验均保持 `still_blocked` 和 open,POM 变更后要求重跑。模拟报告与缺数据库正例见相邻 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`;真实数据库、可信政策和正式关闭/重开仍缺,不勾选。 - [ ] 9.11 实现 code/dependency/environment/target/policy 的处置归因与例外标签;验收:policy_resolved 不计代码修复,例外保留未解决事实和期限。 - [ ] 9.12 提供受控 fix 的 attempt 与验证事件接口;验收:noop、部分修改失败及并发编辑的事件样本分别记录且不生成假修复;真实 formatter 接线在 S10 完成。 -- [ ] 9.13 为插件提供启用后的 scan→sync→brief API;验收:新问题给下一步,重复无 Git 噪声,同步失败保留原 gate 并说明 backlog_update_failed。 -- [ ] 9.14 验证持久记录隐私、篡改和删除边界;验收:日志默认不入 Git,删除所有任务不影响真实 gate,跨机器无原始日志可重新复检。 +- [ ] 9.13 为插件提供启用后的 scan→sync→brief API;验收:新问题给下一步,重复无 Git 噪声,同步失败保留原 gate 并说明 backlog_update_failed。进行中:初始化项目的公开 Rust `lint python` 已自动保存、同步并在同一 CLI 对话反馈中返回局部 Ruff 简报;重复原生扫描不改 task。`check all` 的局部 Rust Clippy finding/blocker 也能保存、同步并在 JSON/human 对话反馈返回下一步。同步或简报失败仍显示原生结果并分别标明状态,见 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md` 与 `check-all-partial-native.md`。插件 Hook/MCP 接线、正式 RepairBrief/门禁及其它检测族尚缺,不勾选。 + Java/P3C 命名子集现也自动保存、同步并显示稳定 finding/blocker 的下一步;仍为局部观察,不能替代完整 Java 义务或白名单批准。 +- [ ] 9.14 验证持久记录隐私、篡改和删除边界;验收:日志默认不入 Git,删除所有任务不影响真实 gate,跨机器无原始日志可重新复检。进行中:Ruff 本地报告/消费标记默认 Git 忽略,tracked finding/task 不含原生消息,所有同步结果固定 `not_evaluated`;跨机器、删除记录和入库内容安全验收仍缺,不勾选。 +- [ ] 9.15 实现项目边界与多构建根画像;验收:monorepo、多仓、worktree 和混合语言不会互相覆盖或越界观察。 +- [ ] 9.16 定义 project.json/module-graph.json schema 与来源身份;验收:产品/目标/解析/本机版本分别记录,未知值不由其它字段猜测。进行中:相邻 Rust CLI 已产出画像 0.2.0 与模块图 0.1.0 局部 schema、manifest/锁/已识别规则配置摘要及 workspace 内容摘要;`package.json` 包版本另列,语言目标与未探测本机版本保持 unknown,解析版本与完整输入清单仍缺。 + 语言目标进展:project profile 0.3 按 Maven/Cargo 清单保留 Java compiler release/source/target 与 Rust rust-version/edition 的 declared_only 值、构建根、清单字节摘要;不生成全局语言版本,不拿包版本或本机版本替代。变量/继承/重复或非法字段显式 unresolved,刷新保留人工备注。旧 profile 0.2 schema 单独保留;有效模型、其它生态与安装版本仍缺,9.16/9.17 不勾选;见相邻 tests/acceptance/declared-language-target-profile.md。 +- [ ] 9.17 接入各已实现 adapter 的 manifest/锁/wrapper 静态观察;验收:init 不执行项目脚本,声明版本和已解析版本分别有依据。 + 包版本进展:Maven/Cargo 的直接包版本进入已有 package_declared_versions,与初始清单字节 SHA-256 绑定;Maven 不依赖完整 GAV,Cargo 校验直接 SemVer。继承、变量、重复/错类型/非法版本保持 unknown,不冒充语言或本机版本;刷新保留人工备注且幂等,不执行构建器。有效模型、解析版本及其它生态仍缺,9.16/9.17 不勾选;验收见相邻 tests/acceptance/declared-package-version-profile.md。 +- [ ] 9.18 实现分类型、带条件和完整性的模块图;验收:聚合不当依赖,动态未知边不支撑缩小检查范围,过期 CodeGraph 不作为当前证据。进行中:相邻 Rust CLI 仅生成有 manifest 依据的 contains 边并将依赖关系标 unresolved;构建依赖、源码引用、条件及 CodeGraph 身份仍缺。 + Maven 图进展:相邻 Rust adapter 在同次清单字节上观察直接模块/依赖声明,init 图 0.2 区分 contains、aggregation 与 declared build_dependency,附清单摘要、scope/条件。完整唯一直接坐标才连本地依赖;变量、父模型、profile、重复坐标、特殊属性和越界/未知模块保留 unresolved。刷新依赖版本会更新图并保留人工任务备注,旧图 schema 单独保留。完整有效模型、其它生态、源码引用和条件解析仍缺,9.18 不勾选;见相邻 tests/acceptance/maven-static-module-graph.md。 + Cargo 图进展:新增同次清单字节绑定的直接成员/path 依赖观察。图 0.3 保留 normal/build/dev 范围,package 重命名核对目标包身份;workspace/optional/target、通配/排除、外部/缺失/逃逸目标保留 unresolved,不执行 Cargo/build.rs。依赖名称变化后刷新移除旧边并保留人工备注。旧 0.1/0.2 schema 单独保留;有效 Cargo 模型/条件解析及源码引用仍缺,9.18 不勾选;见相邻 tests/acceptance/cargo-static-module-graph.md。 +- [ ] 9.19 实现多维架构画像与确认任务;验收:domain/controller 命名不自动认定 DDD,文档/源码冲突保留,推断不能激活阻断规则。 +- [ ] 9.20 生成 architecture.md 与 AGENTS 精简受管区块;验收:事实/推断可追溯、详情链接有效,不泄露本机路径或凭据,文本指令不被升级为政策。进行中:相邻 Rust CLI 已生成 unknown 架构投影和仅含结构化画像身份/相对链接的根 AGENTS 区块;完整多维架构与来源归属仍缺。 +- [ ] 9.21 实现 AGENTS 区块合并和文件身份保护;验收:人工内容、其它工具区块、子目录指令保留,人工修改/重复 marker/并发写入返回冲突。进行中:相邻 Rust CLI 已保留区块外原字节,并验证初始化后新加的人工前后文在刷新时仍保留;拒绝重复/缺失 marker、人工改写及规划后字节变化。外部编辑器不协作时最终比对与替换之间仍有竞态,子目录指令作用域尚未完整验收。 +- [ ] 9.22 实现 init 默认 dry-run 与受控 apply 的可恢复事务;验收:无隐式安装/构建/服务启动/Hook接管,第二文件失败不伪称全成功或覆盖用户更改。进行中:相邻 Rust CLI 已预检受管目标、逐文件记录已创建文件/目录并对 AGENTS 再次核对;模拟画像先写而 workspace 标记未更新的中断后可重试完成且重复运行幂等。跨文件恢复日志及完整并发保护仍缺,故 apply 固定 partial/退出3。 +- [ ] 9.23 实现输入清单与增删感知的幂等画像刷新;验收:新增模块、锁/规则变化均失效,刷新保留 findings/events/备注。 + 进行中:相邻 Rust CLI 已将 manifest、锁文件字节摘要、旧清单精确登记的单文件检查器配置摘要和各语言源码路径集合摘要纳入局部画像;新增/删除构建根、同数量路径替换或上述配置变化可触发受管投影刷新,输入不完整不声称 fresh。点前缀例外仅匹配精确配置名,不扫描其它隐藏源码;配置存在不当作检查器已配置。旧受管摘要与 AGENTS 区块摘要防止覆盖人工修改,workspace 最后更新,findings/tasks 保留。`package.json` 包版本另列,不冒充语言目标版本。24 项 init 契约测试通过。未登记/嵌套规则配置、源码关系完整性、跨进程编辑器锁及中断恢复的更深验收未完成,不勾选。 +- [ ] 9.24 生成质量配置映射、测试/环境前置清单及准备任务;验收:缺工具或未知架构不虚构代码违规,不自动增加排除或存量豁免;dry-run 仅返回计划,apply 才持久化任务。 + 配置反馈进展:init_plan 0.5 按构建根反馈原生检查器 configured/missing/invalid/unknown、来源、原因和下一步。每条固定 execution=not_run、required_by_policy=null、gate_effect=none,清单明确 partial。JSON/human 同语义,不把缺配置转为代码违规或自动启用工具;旧 0.4 schema 单独保留。批准义务、前置任务持久化与完整 readiness 仍缺,9.24/9.25 不勾选;见相邻 tests/acceptance/init-checker-configuration-feedback.md。 +- [ ] 9.25 实现 init_status/readiness/next_actions;验收:仅按适用必需前置条件及有效证据汇总 ready/incomplete/unknown,可选工具不误阻塞;初始化成功不等于 check/gate 通过,给出可继续执行的 doctor/check/sync/next 动作。 + 准备任务进展:核心 plan_preparation 将同一 readiness 当前结论投影为稳定准备任务;有效缺失/不兼容/冲突提供不同动作,未知只要求重新核验,不沿用旧诊断。来源未核验、非法/重复要求不产生行动任务;可选/不适用/满足条件不生成修复任务。工作区内任务逻辑键不随绑定变化,步骤/关闭条件固定且无执行或交付授权。可信生产、持久化及 CLI/doctor/next 接线仍缺,9.25 不勾选;见相邻 tests/acceptance/preparation-task-planning.md。 + readiness 领域进展:新增可信要求/观察输入契约与纯判定;当前有效的必需缺失/不兼容/冲突为 incomplete,未探测/未解析/过期/错绑定为 unknown,可选条件不影响结果。集合未完整、无适用必需条件、重复或歧义不能 ready;ready 不替代原生检查。当前只是领域模型,批准义务/原生来源/时钟及 CLI/准备任务仍未接通,9.25 不勾选;见相邻 tests/acceptance/preparation-readiness-domain.md。 + 对话摘要进展:init_plan 0.4 在 dry-run/apply 返回同语义 profile_summary(语言/源码清单数量、构建根、逐清单目标与未知状态),human 从相同结构投影并转义路径/字段,避免伪造终端行;不暴露原始清单、本机根路径,不执行工具或生成质量通过。旧 0.3 schema 单独保留。完整 readiness/准备任务/宿主接线仍缺,9.25 不勾选;见相邻 tests/acceptance/init-profile-conversation-feedback.md。 +- [ ] 9.26 固化 status历史freshness、next五类disposition及工作区缺失行为;验收:无任务不等于通过,过期结果不显示当前allow,待租用/待决策/待验证各有具体下一步。进行中:Rust `next` 局部查询区分未初始化、待同步、缺配置需决策、缺工具可准备、源码变化需重检和空任务需全量验证;尚无 status 历史新鲜度、租约 waiting、预算耗尽决策及完整五类覆盖,不勾选。 + `status` 现对未初始化、空任务、待同步及开放任务给只读结构化概况,证据 freshness 明示 `unverified`;历史 allow 收据与可信当前性仍未实现,不能据此升级该项完成。 +- [ ] 9.27 落实token/generation、action-id、attempt-id、幂等finish及释放恢复;验收:旧owner/token不能写新租约,重复finish不重复预算,未结束attempt正常release被拒绝,报告同键不同摘要拒绝;接管前abandoned/预算写入失败不授予新租约,恢复重放不重复计数。进行中:Unix CLI 已实现同一任务锁下的受控 action-id、随机 attempt-id、generation/token 核对、不可覆盖 start/finish、重复 finish 同结果返回原收据、release 拒绝 open attempt、过期接管先写 abandoned;跨进程崩溃矩阵、写入失败注入、verify/fix 共享租约和 Windows 等价实现仍缺,见相邻 `codeguard-cli/tests/acceptance/task-attempt-local-ledger.md`。 + 输入变更加固:ready-to-verify 尝试只在当前任务输入摘要仍等于 finish 时摘要时可认领原工具复检;输入改变则新复检事件无旧 attempt_id,旧尝试不再锁住当前输入的动作或继承旧预算。Rust CVE 锁文件变化反例已由目标集成测试覆盖,相关任务/租约回归通过;真实跨进程竞态、外部工具/漏洞库身份及 Windows 等价实现仍缺,9.27 不勾选。 +- [ ] 9.28 实现误报调查任务和 `whitelisted_false_positive` 事件/投影;验收:任务包含原生证据、最小复现、裁定、范围、复检与尝试历史;候选/失效/撤销后重新待处理,决策引用不能自行授权。 ## 10. S10 修复能力 @@ -263,6 +541,7 @@ - [ ] 10.2 实现前置哈希核对和受控 patch 应用;验收:用户并发编辑不被覆盖,路径逃逸不执行。 - [ ] 10.3 实现同策略复检和修复归因;验收:noop/失败后部分修改/复检器副作用分别呈现,不虚报 fixed。 - [ ] 10.4 将依赖升级和规则调整分开;验收:修 CVE 不自动放松阈值,修 lint 不关闭规则或更改测试真值。 +- [ ] 10.5 实现fix的task/owner/token接入及租约所有权;验收:复用已领取任务不重复attempt,批量租约冲突在应用前失败,dry-run不消耗预算,verify关闭原问题时仍保留新发现。 ## 11. S11 宿主与分发接入 @@ -272,21 +551,35 @@ - [ ] 11.2 实现插件 runtime lock 和原子下载/切换;验收:摘要不符、缺二进制、离线均无静默 Python fallback。 - [ ] 11.3 实现 MCP 相同核心 API 与版本化兼容工具;验收:F22、凭据脱敏与超时/取消正确。 - [ ] 11.4 更新五类宿主入口及 hooks/__protocol__.md 的旧新模式表;验收:保存反馈与严格交付区分,skipGate/env 不能降级新模式。 -- [ ] 11.5 实现真实 Git pre-commit/pre-push 与 CI 入口;验收:alternate index、多 ref、非 HEAD、未知 Shell 边界正确。 +- [ ] 11.5 实现真实 Git pre-commit/pre-push 与 CI 入口;验收:alternate index、多 ref、非 HEAD、未知 Shell 边界正确,remote参数/stdin及ci input schema显式验证,不默认HEAD或由input自授策略权威。进行中:Rust CLI 暴露 `gate pre-commit` 的真实 index 路径安全预览,固定 3/incomplete,不是可放行的完整 Git Hook;见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。 - [ ] 11.6 在独立 codeguard-skills 源仓更新调用与修复指引,再按 vendor 流程同步;验收:不直接编辑受管副本,不建议规避门禁。 - [ ] 11.7 明确 legacy 弃用与安全回滚路径;验收:旧数字保持,但旧通过不能被新 CI 认证。 +- [ ] 11.8 完成macOS arm64候选制品和平台适配验收;依赖11.1/11.2;证据:真实启动、进程树/取消、路径/私有权限、原子写入、离线能力和代表性工具,未支持项明确gap。 +- [ ] 11.9 完成macOS x86_64候选制品和同一平台验收清单;依赖11.1/11.2;验收:不能用arm64或仅交叉编译结果替代目标平台运行证据。 +- [ ] 11.10 完成Linux x86_64候选制品、libc/最低系统约束和平台清单;依赖11.1/11.2;验收:固定实际目标环境,不把一种libc通过泛化为全部Linux。 +- [ ] 11.11 完成Linux aarch64候选制品、libc/最低系统约束和平台清单;依赖11.1/11.2;验收:本平台真实工具/取消/隔离证明,不复用x86_64成功声明。 +- [ ] 11.12 完成Windows x86_64候选制品与平台清单;依赖11.1/11.2;验收:Job Object、特殊路径、文件共享/权限和取消真实运行,不用Unix测试替代。 +- [ ] 11.13 完成Codex宿主命令/MCP/保存反馈/Git阻断及恢复验收;依赖11.2–11.5与S09/S10;证据:实际绑定版本、原始请求及返回、scan→sync→brief链,不以安装缓存替代运行。 +- [ ] 11.14 完成ZCode宿主同一接入清单;依赖11.2–11.5与S09/S10;验收:按其真实协议映射、不透传新CLI退出码,无法阻断的入口如实披露并验证真实Git/CI接入。 +- [ ] 11.15 完成Kimi宿主同一接入清单;依赖11.2–11.5与S09/S10;验收:实际调用二进制、失败可恢复、任务链闭合,不以其他宿主通过代替。 +- [ ] 11.16 将配置探测与原生检查结果反馈到 Codex/ZCode/Kimi 智能体对话;验收:已配置检查器、未配置项、有效诊断、工具故障、修复建议和复检命令清楚可见;backlog 同步失败仍显示本次结果,原始工具文本不能作为智能体指令。进行中:相邻 Rust `conversation_feedback` 已从结构校验后的 RunReport 生成 JSON/human 状态、规则 ID、可用的位置、未完成原因与复检 argv;`lint python` 把真实 Ruff 扫描配置、诊断、故障及 backlog 同步状态渲染成 CLI human/JSON,存储失败仍显示原生 finding,均排除原始工具文案;见 `codeguard-cli/tests/acceptance/{conversation-feedback-baseline,python-lint-scan,work-sync-ruff-baseline}.md`。可信来源绑定、完整规则解释与三宿主自动对话接线未完成,故不勾选。 ## 12. S12 质量评测与验收 -依赖:S08、S09、S10、S11。覆盖:全部十个规格能力。 +依赖:S08、S09、S10、S11。覆盖:全部十一个规格能力。 -- [ ] 12.1 全量执行 F01–F24 适用矩阵与 schema/协议 golden 测试;验收:必备场景零假通过、零工具故障误判。 -- [ ] 12.2 冻结分层语料与统计门槛,执行独立 holdout;验收:按语言/类别公布 n/TP/FP/FN/区间,不用全局平均掩盖证据不足。 +- [ ] 12.1 全量执行 F01–F26 适用矩阵与 schema/协议 golden 测试;验收:必备场景零假通过、零工具故障误判。 +- [ ] 12.2 冻结分层语料、oracle和统计门槛,划分独立holdout;验收:样本/来源/裁定与批准阈值可追溯,不为提高结果改动holdout;计算器由12.10实现,实际评测由12.11执行。 - [ ] 12.3 完成真实旧新对照及人工差异裁定;验收:历史错误不作为新 oracle,兼容回归与意图纠偏分开。 - [ ] 12.4 测量冷/热启动、p50/p95、内存和并发;验收:覆盖与 findings 等价后再比较性能,不以跳检提速。 - [ ] 12.5 执行策略弱化、缓存污染、错误快照、报告缺项和修复越界测试;验收:本地边界如实记录,受保护 CI 不接受未批准策略;项目脚本无法改写可信政策、工具锁或签发收据。 - [ ] 12.6 Codex/ZCode/Kimi 各做真实命令、MCP、保存与 Git 阻断流程;验收:绑定预期二进制,失效场景不能假通过。 - [ ] 12.7 完整运行发现→同步→next→attempt→修复→verify→关闭/重开→全量 gate;验收:跨类别报告不丢失、失败可恢复、耗尽重试不逃逸、任务勾选或清空不改变真实门禁。 +- [ ] 12.8 完整运行项目 init→AGENTS 读取→准备任务→检查→修改构建输入→画像刷新;验收:混合语言、版本冲突、架构未知与人工内容均处理正确,初始化不签发交付认证。 +- [ ] 12.9 按 C01–C36 建立逐命令验收矩阵;验收:合法/非法参数、格式、操作退出码、副作用、未初始化、取消/重放/恢复及核心服务复用均有证据,MCP请求失败与服务生命周期分离。 +- [ ] 12.10 实现分层评测计算与证据不足判定;依赖1.4、12.2的语料/阈值冻结产物;验收:TP/FP/FN、Wilson区间、零分母、争议样本和覆盖差异有已知期望值,不能以零finding报100%准确。进行中:相邻 Rust Core 已实现纯分层计算与相关正反例,见 `codeguard-cli/tests/acceptance/quality-evaluation-baseline.md`;尚未接入经批准冻结的 oracle/阈值与真实回放,不能勾选。 +- [ ] 12.11 建立并执行确定性离线回归、独立holdout与真实工具/漏洞库评测的分离入口和报告归档;依赖12.2、12.10;验收:按语言/类别公布n/TP/FP/FN/区间及库身份/freshness/日期,网络波动不污染离线oracle,性能比较先证明发现/覆盖等价,不自动创建云定时任务。 +- [ ] 12.12 完成误报白名单正反例与全格式门禁验收;验收:用户指出误判后能沿同一稳定 finding 完成原工具复核、候选、独立批准、再次检查与对话反馈;精确命中为 allow_with_exceptions、真实阻断为 deny、工具/覆盖未完成为 incomplete;过期/错文件/错内容/错版本/自批/原生 suppression 均不放行,原始 finding、审批引用及到期提示在 CLI/MCP/Hook/SARIF 一致。 ## 13. S13 发布、文档与规格收敛 @@ -294,7 +587,389 @@ - [ ] 13.1 对照全部 requirement/scenario/tasks 建立最终证据索引;验收:缺证据的项目仍未完成,不为发布删除要求。 - [ ] 13.2 完成 Rust fmt/clippy/tests、工具链回归、插件既有适用测试、vendor 离线与在线检查、OpenSpec strict;记录真实结果。 + 2026-09-27终态补证:依赖边界修复后的同一轮Rust全工作区测试退出0,149组、880通过/0失败/91忽略;fmt及all-targets Clippy在同一源码状态此前通过。旧插件unittest运行632项(621通过、11跳过),独立协议集142通过/0失败/1跳过,旧注册表/架构/Ruff及OpenSpec strict均退出0,vendor离线/在线已有终态。详细证据见verification.md及相邻Rust工程tests/acceptance/workspace-regression-20260927.md;忽略/跳过不算通过,旧协议模拟不证明新Rust宿主接线,MSRV与跨平台/完整工具链矩阵仍未验收,暂不勾选。 - [ ] 13.3 形成 release notes、CLI/策略迁移指南和实际能力矩阵;验收:候选、stable、planned 与未验证平台表述一致。 - [ ] 13.4 发布并逐层核对源码/tag/制品/插件 lock/market/installed runtime;验收:版本及摘要闭环,不以本地成功替代安装证据。 - [ ] 13.5 完成受保护 CI 与已安装三宿主的最终运行复核;验收:实际检查链全部可追溯且未发生自动降级。 - [ ] 13.6 只有全部实施验收完成后 sync/verify/archive 本 change;保留本次设计验证与后续运行验证的独立记录。 +- [ ] 13.7 对照实施覆盖索引验证规格、命令、语言、平台、宿主和任务的双向追踪;验收:没有无任务需求或无依据任务,新增设计同步索引,证据缺失仍保留未完成。 + +### 2026-09-27 ESLint 工作台连接进展(7.3 / 9.7 未完成) + +显式 lint typescript --workspace 已通过Rust保存脱敏观察、严格同步并生成稳定finding/七项Markdown任务,对话反馈返回next及next_error。重复扫描保留同一开放任务和用户备注;status/task show可读该任务。已消费历史按原报告摘要收据确认,修复源码后不会重演历史输入导致误报。最新报告、当前输入与首次工具/配置不连续、抑制、未完成或局部零诊断都要求复检;任务文字不改变状态。 + +配置变化备用指引误选Python的问题由回归先RED确认,现保留ESLint命令和待核验上下文。33项普通相关回归与补充查询联通测试通过,当前feedback0.2及两类简报schema通过;真实原生与最终检查记录见verification。Node环境任务、原生证据完整保留、正式关闭/重开、完整项目/TS插件/配置闭包和门禁仍缺,7.3/9.7不勾选。验收见相邻codeguard-cli/tests/acceptance/eslint-workbench-sync.md。 + +### 2026-09-27 ESLint 环境任务进展(7.3 / 9.7 未完成) + +缺调用上下文、工具/输入不可读及版本/配置/报告未完成现产生独立准备观察和开放环境任务,不伪造源码finding。身份按工作区/当前源码范围固定,重复诊断或原因变化复用任务;外部目标拒绝。next核对最新已消费观察、当前源码及收据,较新同范围扫描恢复后转verification_required,不继续沿用旧故障;human/JSON采用任务步骤。 + +缺上下文入队测试先RED后通过,相关35项回归及反馈/准备简报schema通过。实际既有ESLint10.11.0拒绝不存在规则的公开CLI测试13.71秒通过:环境任务1、源码finding0、门禁未判定。完整关闭/重开、原生证据、构建模型/跨文件环境归并和宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-preparation-workbench.md。 + +### 2026-09-27 ESLint task verify 进展(7.3 / 9.7 未完成) + +ESLint源码/准备任务现可按显式Node、入口、版本、原配置和cwd运行原工具复检;沿用租约、统一执行截止时间、报告同步和失败尝试预算。缺上下文也保存明确未完成开放事件,不改用其它语言检查器。复检绑定首次工具/配置连续性,仍存在、局部消失、抑制、环境恢复和上下文变化分别处理,始终不关闭任务。next/status/attempt已适配ESLint报告和时间顺序。 + +入口缺口先RED,57项相关回归加1分类用例通过;既有真实Node/ESLint通过公开发现、任务复检仍存在、同配置修复复扫及任务局部消失四轮194.36秒验收,事件保存,门禁未判定。公开输出schema实测发现统一schema缺ESLint分支并修正,两种task verify反馈通过。完整配置/插件/源集覆盖、可信策略及正式关闭重开仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-task-verification.md。 + + +### 2026-09-27 ESLint 原规则有效配置核查 + +Rust task verify 增加同轮原生 --print-config 查询,绑定显式源码/主配置/Node/入口前后字节与统一截止时间;只保存规则级别、原因和摘要。复检协议0.2新增effective_rule,历史0.1仍只读识别。规则关闭或缺失时零诊断必须rule_coverage_requires_review,查询损坏/输入变化为未完成,next指向配置核查;不批准白名单或关闭任务。 + +44项普通相关回归及分类单元用例通过,最终9项规则解析/公开CLI普通测试、目标Clippy -D warnings和fmt通过。既有Node24.18.0/ESLint10.11.0原生启用/off/缺规则三轮38.50秒通过;实际公开CLI只改导入mode.cjs关规则、主配置和源码不变的反例108.38秒通过,仍要求覆盖核查且保存事件,无安装升级。受控CLI实际产物通过统一复检、ESLint复检及简报三份Draft202012 schema;简报lint-only复检ID正则先失败后补入eslint-task前缀。schema产物使用受控协议夹具,不冒充原生工具验收。 + +完整导入/插件闭包、TS/全项目源集、required规则批准覆盖、可信宿主门禁和正式关闭重开仍缺,7.3/9.7保持未完成。验收见相邻codeguard-cli/tests/acceptance/eslint-effective-settings.md。 + + +### 2026-09-27 ESLint 有效配置查询取消 + +公开task verify受控进程反例先RED:查询收到SIGINT后,原因丢失并保存成still_present。Rust查询与任务复检现优先保留取消/期限;共享任务入口取消后不保存正常复检事件,并释放自有租约。真实进程组延迟写副作用未出现,再次复检能获取租约。目标用例3.84秒通过,36项相关普通回归、目标Clippy -D warnings和fmt通过。脚本仅为受控协议夹具,不冒充原生ESLint;Windows、跨宿主、中断历史协议及完整I/O预算仍缺,3.3/7.3/9.7不勾选。见相邻tests/acceptance/eslint-effective-interruption.md。 + + +### 2026-09-27 ESLint 项目本地插件原生验收 + +使用既有Node24.18.0/ESLint10.11.0及项目原flat config加载guard.cjs本地规则。公开lint保留完整workspace/no-debugger ID并生成稳定任务;只修源码后,task verify通过原扫描及原生print-config确认规则仍启用,保存局部消失候选,插件与主配置不改,status门禁未评估。真实测试91.56秒通过,没有安装/升级。 + +此证据补齐局部本地插件规则穿过公开CLI/任务复检的真实样本,不证明完整插件闭包或可信批准。TS parser/tsconfig、monorepo完整范围、依赖审计、required规则/正式关闭及宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-local-plugin.md。取消路径及本地插件两项增量在同一change跟踪,不同步或归档未完成计划。 + + +### 2026-09-27 ESLint 显式目录调度 + +lint typescript PATH现支持有界目录清单及逐文件原工具执行,保留排序相对路径、局部反馈、跳过项和未执行清单;共享deadline,前后清单/显式输入变化、单文件失败及工作台保存失败均未完成。codeguard内用户源码照常扫描,点条目/node_modules/链接未选择原因显式反馈。仍使用调用者指定的单一原配置/cwd,不声称自动选择monorepo子配置。 + +目录入口先RED,配置源码又复现输入冲突及同步路径重复拒绝;现只允许原配置与源码共享同一只读字节身份,报告覆盖/其它输入别名及重复源码仍拒绝。受控样本首次4稳定任务、重复0新增,单文件退出2保留其它发现,链接跳过、100ms共同预算3文件未执行及画像缺失工作台失败反例通过。48项普通相关回归通过,最终目标Clippy -D warnings/fmt通过,公开目录JSON通过Draft202012 schema。实际既有Node24.18.0/ESLint10.11.0公开目录三文件(违规、干净、配置源码)62.34秒验收通过,无安装升级;schema样本是受控夹具,与原生证据分开。 + +完整TS/tsconfig、monorepo原生源集及配置归属、插件闭包、依赖/CVE、聚合硬I/O预算、原生证据及可信正式关闭/宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-directory-feedback.md。 + + +### 2026-09-27 ESLint 显式子项目配置映射 + +目录入口新增--config-map绝对路径,1.0有界协议逐项声明项目根/原配置/cwd,组件边界及最深显式根匹配,未命中沿用原参数。不从目录名推断原cwd,不批准规则。重复根/字段、未知字段、越界/链接或不可读配置启动前拒绝,映射与全配置摘要纳入前后及子任务前检查。反馈0.2保留逐文件配置范围和来源及映射摘要,schema仍接受历史0.1。 + +未知选项先RED;受控a/ab边界、根`.`选择、重复/越界/approved字段及首轮改写映射后停止余下三文件反例通过。45项普通相关回归通过,最终补充根`.`用例及目标Clippy/fmt通过;映射及当前公开反馈Draft202012 schema通过受控实际产物,越界schema反例被拒绝。既有Node24.18.0/ESLint10.11.0真实双项目四文件80.78秒通过,根规则没有强加子项目,保留配置源码检查,无安装升级。 + +自动配置归属、完整TS/插件闭包/源集、依赖审计、批准覆盖、聚合硬I/O与正式关闭/宿主门禁仍缺;7.3/9.7不勾选,不归档change。验收见相邻tests/acceptance/eslint-config-map.md。 + + +### 2026-09-27 npm原生审计基础 + +Rust新增npm11/auditReportVersion2有界观察及离线原生命令计划,保留组件、严重度、范围、节点、原生advisory source和间接关系;版本/计数/定位/退出/重复JSON键或error对象不自成干净结果。原生source不是CVE编号,range不是解析版本;依赖类别有重叠,不简单相加。只读package脚本配置API区分明确声明、未观察到、复杂调用和损坏,不执行清单脚本,也不能证明外部CI未配置。 + +缺API先RED;组件低危但直接advisory高危反例再RED后修正。5项协议/参数/配置用例及9项既有ESLint回归通过,共14项普通测试;CLI目标、adapter库Clippy -D warnings及fmt通过。既有Node24.18.0/npm11.16.0经统一runtime验证版本、空锁JSON及缺锁error,0.68秒通过,包/锁字节不变,无node_modules或脚本副作用,无安装升级。合成advisory是协议夹具,不冒充真实漏洞数据库检出。 + +配置API尚未接detect/init,公开CVE/依赖命令、非空依赖/真实漏洞、解析版本/图绑定、漏洞库时效、稳定任务/原工具复检及可信门禁仍缺;7.3/7.5不勾选。见相邻tests/acceptance/npm-audit-observation.md。 + +## 2026-09-27 npm锁文件节点关联进展 + +新增 Rust v3 普通安装节点解析与原生审计精确位置/名称/版本关联;两项锁文件契约及五项 npm 审计回归通过。链接、别名、缺版本、重复字段和身份不匹配保持未完成。仅协议夹具,不是实际非空依赖审计;依赖边、范围求值、库新鲜度、公开命令及工作台闭环仍缺,7.3/7.5 保持未勾选。验收见相邻 `codeguard-cli/tests/acceptance/npm-lock-binding.md`。 + +## 2026-09-27 npm离线非空依赖反例 + +扩展实际 Node 24.18.0/npm 11.16.0 原生验收为私有空缓存的空锁、一个普通依赖节点的非空锁、缺锁三种情况。实验发现非空离线审计也能退出0并返回零漏洞,不能把零发现当成库覆盖或CVE通过。Rust观察新增固定 `advisory_coverage=not_evaluated`,节点关联保持局部身份观察。测试检查清单/锁不变、无安装及脚本副作用;尚缺在线/可信缓存的真实漏洞正例及库新鲜度、完整命令/工作台,因此7.3/7.5不勾选。 + +## 2026-09-27 npm原生advisory与复检 + +显式无凭据registry命令API已提供HTTPS根源及验收loopback HTTP源,固定audit-registry、不安装/不执行脚本;受控原生npm执行证实1.2.3被advisory命中、修订2.0.0后同工具复检无发现,503源失败为npm_native_error。两项原生测试通过(0.58秒),六项审计契约、Clippy/格式通过。受控源不是可信库,coverage固定not_evaluated;早期一次原生正例出现未分类错误,已增加诊断而不能宣称稳定性完全证明。真实库/时效、公开命令及完整工作台仍缺,7.3/7.5不勾选。见相邻`codeguard-cli/tests/acceptance/npm-native-advisory.md`。 + +## 2026-09-27 npm审计配置发现与预览接线 + +node.npm.audit已按原package.json摘要逐根进入共享发现、init数据来源及detect/plan/check all的配置反馈;manifest重读变更/不可读保留unknown与观察未完成。修复plan按语言筛选遗漏node检查器的问题,typescript/all预览均保留四态;check all人类反馈显示根、原因与下一步。新binary流程与发现/计划/初始化70项不同用例通过,Clippy/格式通过。仍未自动执行npm审计、覆盖其它包管理器/CI声明、库时效、稳定任务和门禁,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-audit-discovery.md`。 + +## 2026-09-27 npm输入绑定runtime服务 + +新增独立请求/结果及Rust原生版本-audit-报告-锁节点关联服务,冻结精确输入SHA及npmrc存在性;缺身份、版本错配、输入修改/配置新增、取消与超时均未完成、不提供可用于关闭任务的解析结论。三模式反例与八项审计/锁回归通过;真实npm局部服务首轮通过,最终版本参数修改后复验。完整工具/配置/环境闭包、可信库时效、公开命令与任务闭环仍缺,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-input-bound-probe.md`。 + +## 2026-09-27 npm公开CVE局部反馈 + +Unix `cve typescript` 已接显式Node/npm/版本/用户与全局配置/可选审计源,冻结输入并以human/JSON返回脱敏原生组件、锁版本、严重度、advisory source及下一步。缺上下文给准备状态,局部零发现仍not_evaluated;未接工作台,不假称关闭。10项普通契约、真实binary npm空锁(21.75秒)、两份实际schema报告及四个伪造权威反例通过,Clippy/格式及OpenSpec严格校验通过。真实库、自动check all、完整预算默认来源及持久任务闭环仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-public-cve-feedback.md`。 + +## 2026-09-27 npm共享预算默认值接线 + +公开npm CVE入口复用CLI/登记环境/项目runtime/内置默认值选择器,坏候选项目文件或符号链接在原生执行前返回准备未完成,显式高优先级值不受低优先级坏配置影响。反馈0.2记录预算/来源及native_execution_only,保留严格旧0.1schema。预算、公开命令、发现与输入绑定四项普通测试通过,哨兵未启动;Clippy/格式及OpenSpec严格校验通过。真实命令及实际schema结果后补。硬I/O预算、可信库与工作台仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-runtime-defaults.md`。 + +## 2026-09-27 npm稳定工作台与next接线 + +初始化根中的公开npm审计自动保存脱敏原生组件/advisory/锁版本观察,严格复核输入与字段,经现有同步器创建按根稳定的CVE完整性任务;执行原因作为诊断历史,不伪装源码漏洞或关闭。next识别检查器并给原工具复检步骤。重复扫描一张任务、坏节点/重复字段不产生新任务;反馈0.3及持久观察schema已提供,旧0.1/0.2反馈保留。24项不同普通回归与真实npm公开命令持久化(21.50秒)、实际schema通过,Clippy/格式及OpenSpec严格校验通过。自动check all、早期准备阻塞全覆盖、父工作区映射、npm task verify与可信库/门禁仍缺,7.3/7.5不勾选。验收见相邻`codeguard-cli/tests/acceptance/npm-workbench.md`。 + + +## 2026-09-27 npm显式父工作区与白名单纠错约定 + +公开npm入口新增--workspace物理父目录,原生cwd保持子项目,预算默认读取所选父工作区,持久任务按构建根分离;next保留归属。8项相关普通测试通过,目标Clippy及格式通过,见相邻tests/acceptance/npm-workspace-scope.md。可信库、自动调度、完整关闭与门禁仍缺,7.3/7.5不勾选。 + +白名单文档补齐用户新增/修改/撤销/失效的操作与对话状态,OpenSpec明确修改字节须重新批准、不能记为源码修复。既有精确身份5项、报告处置7项、只读查询8项、提案4项普通契约通过;2项需要指定原生Ruff的测试未运行。这是现有局部契约回归,不是正式审批发布或宿主门禁验收,4.8/4.10/12.12保持未完成。 + + +## 2026-09-27 npm task verify原工具复检 + +稳定npm完整性任务接入task verify、共享预算、借用/自有租约、原服务及锁内输入复核;保存严格npm观察和关联尝试的verification事件,next/历史识别npm序列并给下一步,输入变化不沿用旧结果。局部一致为still_blocked,原生失败为incomplete,任务仍open、无白名单批准。缺参数入口先RED;随后测试暴露两个事件消费者未接npm时间序列,已补齐。 + +36项不同普通相关用例通过;真实Node24.18.0/npm11.16.0公开扫描+原工具task verify通过(43.44秒)。实际复检反馈schema通过,三项伪造覆盖/权威/allow反例被拒;目标Clippy/格式最终检查后补。8项依赖显式原生Ruff的复检用例本轮未运行。完整漏洞库/策略覆盖、正式关闭/重开、宿主门禁及自动check all仍缺,7.3/7.5/9.7不勾选;见相邻tests/acceptance/npm-task-verification.md。 + +最终检查:目标Clippy(-D warnings)及fmt通过;最终局部回归11项通过,human实际复检显示原生诊断/组件数/下一步并保存记录,OpenSpec严格校验与diff检查通过。未增加完整能力勾选。 + + +## 2026-09-27 npm复检收据严格归属与过期分流 + +next与尝试历史新增npm原字节重复键拒绝、同任务检查器/稳定义务/构建根核验;报告解析先完成静态结构再核对当前工作区与清单/锁摘要及节点,锁重读也核对摘要。只有结构有效但输入已变/不可读的历史观察失效后允许重新复检,损坏证据不冒充输入过期。 + +新增十个组合反例(五种篡改乘当前输入未变/已变),同时改写报告、验证事件及消费收据摘要;错构建根先RED,旧实现曾接受另一个根的incomplete失败结果并确认当前尝试已经复检,补精确归属后拒绝。49项不同普通回归通过;10项需要指定原生Ruff的用例本轮未运行。真实既有Node24.18.0/npm11.16.0公开扫描与task verify通过(45.05秒);目标Clippy、fmt、OpenSpec严格校验及diff检查通过。 + +完整受保护工具/配置/审计源上下文、可信漏洞覆盖、正式关闭/重开及宿主门禁仍缺,7.3/7.5/9.7保持未勾选。验收见相邻tests/acceptance/npm-verification-receipt-integrity.md。 + + +## 2026-09-27 check all npm逐根原生编排 + +显式Node/npm/版本/用户与全局配置上下文接入共享任务图,每个发现package根独立cwd/私有运行区,统一jobs和deadline;执行后串行同步稳定npm完整性任务并反馈next,原生失败不变源码违规。缺上下文保持配置发现,check java拒绝npm选项,预算到期不启动剩余任务。协议check_feedback0.24/check_aborted0.5新增npm逐根结果,旧0.23/0.4 schema保留。 + +新入口参数先RED;实际schema验收发现候选原因码遗漏并补齐。两根并发/稳定任务、混合成功失败、500ms统一截止时间、参数及语言范围反例已通过。早期并发回归出现临时私有目录创建失败;源码旧运行ID仅PID/时间不能保证并发唯一,已增加原子序列,同刻度64个ID用例先RED再通过。不将原失败误归为代码违规,具体当次OS失败原因未单独留存。 + +真实既有Node24.18.0/npm11.16.0 check all→稳定任务→next初次21.80秒、最终22.30秒通过;无安装、包脚本或node_modules,清单和锁不变。当前含npm/无上下文实际反馈schema、三项伪造门禁/权威/覆盖反例及旧0.23形状校验通过。最终普通回归、Clippy/格式结果待追加。 + +可信上下文自动解析、早期阻塞全覆盖、完整漏洞库/依赖图及关闭/重开、其它语言/类别调度、跨平台与宿主门禁仍缺,7.3/7.5保持未勾选。验收见相邻tests/acceptance/check-all-npm.md。 + +最终检查:66项不同普通用例通过(63项integration、3项领域/调度单元),目标Clippy(-D warnings)和fmt通过;真实npm check all最终22.30秒通过。其它9项显式原生用例本轮未运行,不将普通夹具作为它们的验收证明。OpenSpec严格校验及diff检查通过。7.3/7.5不勾选,不归档change。 + + +## 2026-09-27 npm缺少上下文的准备阻塞持久化 + +已有可读清单/锁的初始化工作区,公开cve缺参数与显式选择npm的check all部分参数,现在保存本地未验证准备观察并生成稳定CVE完整性任务;随后原生检查复用任务。task verify缺上下文也保留incomplete复检事件,不签发关闭。准备观察固定零组件、空advisory;矛盾记录被严格解析器及当前报告schema拒绝。先通过缺任务和虚构advisory两个RED反例确认问题,再实现修复。 + +36项受影响普通回归通过,实际准备反馈/观察/复检通过Draft202012 schema验证,四个伪造变体被拒;CLI及相关测试Clippy -D warnings通过。真实npm回归结果另附。缺锁/坏清单的独立准备协议、没有显式npm上下文的check all自动任务、工具上下文可信来源、覆盖/审批/真实门禁仍缺。7.3/7.5/9.7及相关完整任务保持未完成;本进展不是完整CVE或白名单放行验收。详见相邻codeguard-cli/tests/acceptance/npm-missing-context-workbench.md。 + +补充验收:显式使用既有Node v24.18.0/npm11.16.0的公开CVE原生回归通过(44.13秒);不安装、不执行包脚本。实际check all准备反馈schema通过,当前嵌入观察schema与独立schema字节结构一致;fmt检查通过。其余2项本轮普通命令忽略的原生测试未运行,不当作通过。 + + +## 2026-09-27 npm缺锁准备协议与稳定任务 + +初始化工作区、可绑定清单且确实缺package-lock.json时,CVE/check all显式npm/task verify在启动工具前保存schema0.2本地准备观察:lock_state=missing、lock_sha256=null、零组件和空advisory;缺锁不伪装为漏洞。补齐锁后旧观察失效,后续普通0.1观察复用稳定任务。悬空链接、伪造状态/摘要/覆盖、未知版本及缺锁收据在锁恢复后重放均被拒;取消、时间预算及物理路径约束继续生效。 + +消费者版本同步为check_feedback0.25、task_verification_preview0.5、check_aborted0.6;独立npm观察读取0.1/0.2,历史schema原字节归档。51项普通集成回归通过;真实npm check all回归通过(22.98秒),原清单/锁不被修改、不安装或执行包脚本。实际缺锁观察/check/verify通过Draft202012校验,五个伪造变体及旧版观察消费者拒绝。abort实际中断运行未在本轮外部schema验收,不将schema静态有效当作运行通过。 + +仍缺不可读/坏清单的独立准备任务、未显式选择npm的check all自动准备调度、可信上下文、完整CVE覆盖和正式任务关闭/宿主门禁;7.3/7.5/9.7保持未完成。验收文档:相邻codeguard-cli/tests/acceptance/npm-missing-lock-workbench.md。 + +最终补充:2项check_command中断/兄弟结果保留单元测试通过,连同51项集成共53项普通用例;Clippy -D warnings、fmt、当前四schema Draft202012静态校验及嵌入协议一致性回归通过。OpenSpec严格校验及diff空白检查通过。观察0.1不能声称npm_lock_missing,缺锁必须采用0.2明确状态。 + + +## 2026-09-27 npm坏清单启动前诊断与任务 + +RED用例证实已识别无效清单仍启动工具,错误被表达成npm_version_mismatch。现将无效JSON、重复字段和非法scripts类型在原生启动前拦截;绑定清单/锁及当前配置解析,保存零组件/空advisory的准备观察,CVE/check all显式npm/task verify复用稳定任务。next及可读任务明确检查package.json语法/重复字段/scripts类型和锁文件,再恢复原工具;修正输入后旧复检收据失效。当前字节有效却声称清单坏的伪造报告被拒。 + +35项不同普通回归通过;实际坏清单观察/check/verify通过Draft202012,3个伪造组件/advisory/覆盖变体拒绝。真实Node v24.18.0/npm11.16.0 check all回归通过(22.50秒),不安装/执行包脚本;其余10项普通命令忽略的原生测试本轮未执行。观察0.1/缺锁0.2与check0.25/verify0.5协议字段不变,仅准备原因的结构约束同步加固;旧schema归档不改。详见相邻codeguard-cli/tests/acceptance/npm-invalid-manifest-workbench.md。 + +不可读或缺清单/目录输入的持久准备协议、可信上下文、完整CVE覆盖与正式任务关闭/门禁仍缺;7.3/7.5/9.7未完成,不以本轮回归代替全计划验收。 + +最终检查:CLI和新增用例Clippy -D warnings、fmt、OpenSpec严格验证及diff空白检查通过。 + + +## 2026-09-27 check all默认自动npm准备任务 + +RED确认无参数check all发现两个npm根却无准备任务。现Unix支持平台默认将发现的npm根接入共享任务图;缺显式上下文只保存准备观察与稳定任务,不启动原工具、不安装/继承凭据。重复扫描、随后补齐上下文的原生检查复用任务,串行同步及next无需调用者手工串接。未初始化项目仅反馈workspace_not_initialized、不创建codeguard;Java-only检查不触发npm。 + +47项不同普通用例通过,涵盖多根准备/后续原生调用、Java隔离、缺锁/坏清单、预算/取消、SARIF与新未初始化反例。实际默认多根check all通过Draft202012,首次两任务、重扫零新增;真实Node v24.18.0/npm11.16.0 check all回归通过(23.03秒),不安装/执行包脚本。其余7项本轮普通命令忽略的原生用例未执行。Clippy -D warnings、fmt通过。 + +只接通CLI默认准备调度;未取得可信工具上下文自动解析、完整CVE覆盖、宿主Hook和正式任务关闭/门禁。Windows该路径仍未支持;不可读/缺清单的持久状态仍缺。7.3/7.5/9.7保持未完成。详见相邻codeguard-cli/tests/acceptance/npm-automatic-preparation.md。 + + +## 2026-09-27 npm不可用输入状态协议与历史 + +新增Rust有界输入状态观察及严格准备报告0.3:present/missing/not_regular/path_alias/unavailable,可读普通文件有SHA,其余null;原因与状态严格一致,零组件/空advisory。公共CVE及task verify可在清单缺失、目录、悬空链接或超限时保存稳定环境任务,不读取链接目标;锁非普通文件也可在默认check all中产生准备任务。旧0.1普通观察/0.2缺锁继续严格识别,消费者升至check0.26/verify0.6/abort0.7,旧schema原字节归档。 + +RED先暴露缺失被当作缺上下文;随后反例暴露目录使next返回attempt_input_unreadable。npm阻塞任务现在以有界输入状态形成尝试指纹,可读与缺失沿用原摘要格式,其余只记录状态,不能成为关闭证明。当前输入恢复后旧复检不再解释本轮;6种结构/身份伪造及一个过期报告被拒,不增任务。 + +78项不同普通回归通过(76集成+2中断单元),包括租约/无进展预算、Java、SARIF、任务复检与旧协议;真实Node v24.18.0/npm11.16.0 check all回归通过(22.42秒)。实际新观察/check/verify通过Draft202012,6个伪造变体拒绝、旧消费者拒绝新协议;其余16项忽略的原生用例本轮未执行。有界不可用fixture为超限,不声称已完成独立权限EACCES运行验收。abort本轮仅既有单位用例和schema静态检查,未外部验证真实中断新观察。 + +仍缺丢失清单后从历史/基线恢复完整根发现、外部工具/配置文件不可用的持久准备、Windows、可信上下文/完整CVE覆盖、宿主Hook及正式关闭/门禁。7.3/7.5/9.7保持未完成,见相邻codeguard-cli/tests/acceptance/npm-input-state-workbench.md。 + +最终核验:最新新增用例及CLI的Clippy -D warnings、fmt、OpenSpec严格验证与diff空白检查通过;输入状态及坏清单最新修复指引回归实际执行通过。 + + +## 2026-09-27 npm历史构建根的准备恢复 + +默认check all现可从与本地受管摘要一致的0.3初始化画像恢复清单不可用但物理目录仍存在的npm准备范围。严格校验递归重复字段、协议标记、相对路径/别名、物理归属及有界输入状态;历史根不使用旧摘要或显式工具参数启动原工具。当前兄弟根仍正常调度,画像错误以historical_npm_scope_unavailable及具体原因反馈,不吞掉其结果。清单恢复后重新发现,稳定任务不重复。 + +新增npm_historical_roots_cli由双根只剩一根的RED推进到通过,覆盖重复同步、混合原生参数调用轨迹及画像失配/越界/别名/错类型/重复字段反例。最终新增矩阵通过;CLI及新增测试Clippy -D warnings、fmt通过。相邻验收:codeguard-cli/tests/acceptance/npm-historical-roots-workbench.md。 + +这是本地准备范围恢复,非可信审批或CVE覆盖。目录整体消失只明示未完成;旧画像版本、刷新画像删除旧根后的完整义务恢复、外部工具/配置、Windows、可信上下文、完整覆盖及宿主闭环仍未完成。7.3/7.5/9.7保持未勾选。 + +最终普通验收:61项不同普通集成用例通过(Java24、check all npm2、部分契约13、SARIF6、npm audit1、历史根1、输入状态1、坏清单1、缺锁1、父工作区1、task verify10);17项显式原生用例在普通命令中忽略。独立执行的历史-only默认检查实际反馈通过Draft202012,两轮稳定任务且历史清单摘要null。OpenSpec严格校验、diff空白检查通过。真实npm回归单独记录。 + +原生补充:显式既有Node v24.18.0/npm11.16.0的check all回归实际通过(22.45秒);不安装、不执行包脚本。普通命令忽略的其余16项原生用例本轮未执行。准备恢复和本地一致性不等于漏洞库覆盖或白名单批准,完整计划仍未完成。 + + +## 2026-09-27 npm画像刷新后保留已记录准备范围 + +RED证实清单删除后再次init刷新画像,默认check all遗漏已有稳定npm问题。现从本工作区有界普通物理finding.json恢复清单不可用、物理目录仍存在的准备范围;核对结构、工作区/检查器、稳定指纹与ID、scope、两项输入归属及状态。画像与事实两类来源独立,不因画像失配吞掉可核验事实范围。只恢复本地准备,不沿用旧结果或启动该根的原工具。可编辑Markdown附件删除/勾选不能消除该范围;附件缺失仍暴露同步问题,不宣称任务已修复。 + +新增npm_recorded_roots_cli覆盖刷新后重复检查、附件删除、事实身份/路径损坏、当前兄弟根保留及输入恢复;已有画像拒绝测试更新为事实恢复仍保留范围,同时明示画像错误。目录整体丢失、删除全部事实且画像已刷新后的防逃逸仍需独立受保护义务来源;本地记录不是可信批准。完整7.3/7.5/9.7保持未完成,不据此归档。 + + +最终验收:27项不同普通集成用例通过(默认npm2、部分契约13、SARIF6、历史画像1、输入状态1、坏清单1、缺锁1、已记录根1、父工作区1)。最新已记录根用例扩展到9项身份/状态/范围错误反例,当前兄弟根均保留;其中运行ID反例用非法分隔符,普通字母本身合法,不为迎合测试收紧契约。实际刷新画像后仅事实来源的两轮check反馈通过Draft202012,清单摘要null,new_blockers=0。显式既有Node v24.18.0/npm11.16.0原生check all回归通过(23.40秒),无安装或包脚本;普通命令忽略的另一项Ruff原生用例本轮未执行。CLI/新增测试Clippy -D warnings、fmt及OpenSpec严格校验、diff空白检查通过。完整计划仍未完成。 + + +## 2026-09-27 Rust全工作区回归与严格静态检查(进行中) + +扩大到cargo test --workspace与cargo clippy --workspace --all-targets -- -D warnings。首次全目标Clippy发现work_sync.rs在测试模块后定义validate_eslint_observation(items_after_test_module);已将同一函数原样移到测试模块之前,无行为或协议变更,不以allow压制告警。fmt检查通过。全目标Clippy复检和同步模块单元回归仍在运行,未提前记录通过;全工作区测试沿原进程继续,当前已收集15组结论、60通过/0失败/3忽略,为中间进度而非整轮验收。 + +已确认普通工作区回归不执行显式ignored原生工具用例;MSRV1.85工具链当前未安装,Windows/宿主验收未运行。13.2及全计划保持未完成。此记录需待同一运行终态更新,不因等待超时重复启动。 + +后续终态:修复后的全工作区all-targets Clippy -D warnings实际通过(1分32秒),同步模块3项恢复/重放单元测试实际通过。全工作区普通测试仍沿原进程运行,尚未签发整轮通过结论。 + + +## 2026-09-27 全工作区依赖边界失败与修复 + +上一全工作区测试已终止为exit101:52组结论累计271通过、1失败、23忽略,失败为crate_boundaries的真实Cargo metadata检查;不记录整轮通过。核对发现adapters两个原生测试调用runtime造成dev越层,且网络下载实现新增的runtime依赖和CLI测试异步依赖未登记。已将Checkstyle原生重放和Node字面参数原生测试移入CLI测试层,删除adapters→runtime dev依赖;保留adapters任何kind不得依赖runtime的红线。仅允许runtime normal reqwest/tokio/tokio-util/futures-util/idna_adapter与runtime dev rustls;CLI tokio只允许dev。新增对应正常/错误crate、build/dev/normal反例,现6项依赖边界与4项纯ESLint命令契约通过。迁移保留原生用例内容及ignored边界,不靠放宽生产依赖方向消除失败。 + +额外原生证据:已实时核验既有/opt/anaconda3/bin/ruff为0.16.8,check all部分结果1项、task verify8项、whitelist propose2项共11项真实Ruff用例通过;包含noqa、规则关闭、per-file-ignore、恢复环境不假关闭及纠错提案不自批。106份schema的静态合法性与本地引用检查通过,不能代替运行报告验收。MSRV1.85、Windows、三宿主仍未验收。修复后全工作区测试与all-targets Clippy重新运行,结果另附;13.2保持未完成。 + +补充终态:修复后all-targets Clippy -D warnings通过(29.62秒),fmt通过;迁移后的Node v24.18.0原生字面参数用例实际通过(1项),只证明argv安全转发,不冒充真实ESLint规则检查。Checkstyle重放迁移保留且本轮未运行。新的全工作区回归仍在原进程运行。 + + +## 2026-09-27 当前规格到任务的覆盖索引修正 + +只读审计发现implementation-coverage.md缺43个后来新增的Requirement映射。已按当前正式规格追加binary-distribution7、execution-kernel5、native-tool-adapters15、remediation-workflow12、unified-cli-contract4项,引用已有实施任务而非另建任务。检查108个当前Requirement各有唯一精确spec/title映射,追踪ID不重复、没有失效Requirement、任务ID及任务区间均存在。每行仍覆盖该Requirement全部Scenario,不拿局部契约通过替代整项验收。 + +此为13.7的规格→任务追踪部分修复,未证明命令/语言/平台/宿主实现及全量双向验收,13.7与完整计划保持未完成。修复依赖边界后的工作区测试仍沿原运行继续;当前23组中间结论95通过/0失败/4忽略,不签发整轮通过。 + + +## 2026-09-27 Checkstyle原生补充与受管技能一致性 + +实时核验现有Checkstyle10.21.4 all.jar(19631994字节,SHA256 3c1d94d6ecc83e02dff587c9ba5b6b4ec4fec38c7a958eb587efec9b28e2f318)与本机JDK21.0.12.1。迁至CLI层的原生重放1项、record/继承/生成范围1项实际通过。首次一并调用Lombok变体时缺CODEGUARD_LOMBOK_JAR,测试在读取该前置条件时失败,不归因于产品误报;随后明确选择本机Lombok1.18.38(SHA256 1e1e427c36ff63c44fd30ef292d9e773ea3154460ab6265d3fed7e6f5bc50fb9)重跑失败项,实际通过(8.99秒)。没有下载或安装新工具,本地摘要不是独立发行批准。java_checkstyle_workbench的13项原生验收仍运行,终态另附。 + +skill_vendor.py check --offline与在线check均实际通过;在线核验codeguard-skills v0.1.2锁定提交2c0c8071f96de48dc53e11de2499c083c100e44c。不修改受管技能或lock,检查脚本不是Rust产品运行时。修复依赖边界后的全工作区普通回归仍沿同一进程运行,未签发整轮通过;13.2及完整计划保持未完成。 + +原生终态:java_checkstyle_workbench 13项全部通过(68.70秒);连同迁移重放、record/继承/生成与补齐参数后的Lombok变体,本轮共16项不同Checkstyle原生用例通过。范围含字段/枚举、方法/构造器、参数返回/泛型、类型选项、原配置抑制、准备恢复、稳定任务和原工具复检。旧失败保留,不把本地原生观察升级为完整项目覆盖、可信规则/白名单批准或任务关闭。6.3/9.7仍未完成。 + + +## 2026-09-27 Cargo Clippy原生补充验收 + +明确选择本机stable-aarch64-apple-darwin的真实Cargo(Rust工具链1.98.1),执行check_all_rust_native两项ignored用例,实际2项通过(6.70秒)。包含原生局部扫描及已初始化稳定任务复检;原生allow抑制经force-warn对照不能解释成已修复,局部缺失仅为未核验策略的候选,任务不自动关闭。此结果不是MSRV1.85实测、完整features/targets覆盖、可信工具/规则政策、Windows或交付门禁验收,7.1/9.7及全计划保持未完成。 + +修复依赖边界后的全工作区测试仍沿同一运行继续,最新中间结果105组、581通过/0失败/72忽略;忽略项不算通过,原生补充另列,未提前签发整轮成功。 + +## 2026-09-27 Rustdoc逐问题修复简报 + +comments rust报告0.3为每条原生发现生成七项修复信息;missing_docs区分内部/外部文档,broken_intra_doc_links要求核对真实符号及作用域。简报绑定本轮源摘要、原生范围及复检argv,修改范围限于原目标;输入变化/身份歧义等未完成观察只给调查及重新检查,修改范围为空。attempt_history空数组明确history_status=not_integrated,不能证明没有历史失败。保留0.2 schema,当前协议升级0.3。 + +TDD先验证缺简报的两项失败;实现后7项普通CLI和3项身份测试通过,1项真实Cargo CLI独立执行通过(4.34秒,含缺文档、补齐、中文坏链接),相关Clippy -D warnings通过(5.77秒)。真实原生报告通过Draft202012协议;删除七项修复字段的七个变体及未完成却保留源码修复指引的变体均被拒。Python校验仅为独立验收,不在Rust产品执行路径。 + +尚未实现Rustdoc持久同步、task verify、尝试历史读取、抑制对照、正式关闭/复发重开、check all调度和完整配置/工具/策略覆盖;7.1、9.7保持未完成。全工作区未重跑,完整目标继续。验收见相邻codeguard-cli/tests/acceptance/rustdoc-repair-brief.md。 + +## 2026-09-27 Rustdoc自动持久同步与next + +comments rust报告0.4加入工作区绑定、独立run_id和原生目标相对路径,保留0.3历史schema。已初始化时保存queued报告并自动调用统一work sync;新原生发现生成稳定fact、Markdown七项任务与观察,同一问题再次扫描不重复建任务。导入重建原生范围指纹和简报,核对源码、清单及锁的当前字节;陈旧证据作为历史并生成重扫准备阻塞,坏身份/额外字段/范围或工具状态矛盾拒绝导入。未完成观察只生成检查准备任务,不创建源码违规。next识别rust.cargo_rustdoc并给同一原工具重扫指引;尚无task verify时不指示自动关闭。 + +TDD初始化扫描缺持久同步时先RED;新增重复扫描/next、缺工具准备、队列入库后清单变化、伪造指纹四个契约。最终相关普通回归:rust_comments_cli 11、identity 3、work_sync 15、cross_category 1、next 6,共36项通过,3项默认忽略不计通过。真实Cargo CLI显式独立运行1项通过(5.56秒),追加初始化、真实发现任务文件及自动同步检查;相关Clippy -D warnings终态通过(10.28秒)。实际绑定反馈与queued报告通过Draft202012,task文件存在,缺工作区ID反例被拒。fmt/OpenSpec结果另记。 + +7.1/9.4/9.7未完成:原配置/完整目标覆盖、可信工具规则、文档task verify/尝试历史/抑制对照/关闭复发及跨宿主尚缺。旧全工作区回归不代表本轮全量;验收见相邻tests/acceptance/rustdoc-workbench-sync.md。 + +## 2026-09-27 Rustdoc任务复检与原生抑制对照 + +复用comments rust的同一观察服务,接通task verify --cargo-tool;同一预算与任务租约内执行普通rustdoc及force-warn对照,捕获全部已发现Rust源/清单/锁并核验两轮输入与工具摘要。原问题仍在为still_present,同文件同规则身份变化为rule_coverage_requires_review,抑制重现为suppression_requires_review;两轮局部零发现仅candidate_absent_unverified_policy,任务保持open。环境恢复同样待策略核验。复检保存同一问题事件并关联准备好的attempt;next/历史读取识别rustdoc时间序列,源码/清单/锁变化后不沿用旧观察。未稳定封套的导入不生成源码修复任务。 + +协议:rustdoc_task_recheck 0.1封套包含普通/强制原生观察与输入身份;文档task_verification_preview升级0.7,其它既有预览继续0.6。保留原0.6schema;当前schema接受具名旧协议及新封套,不赋予门禁/关闭权威。实际原生预览及两轮嵌套报告通过Draft202012,校验Python仅独立验收。 + +TDD缺入口先RED,随后暴露历史读取器缺新checker与序列格式导致第二次复检失败,补齐后连续仍在/抑制/缺失契约通过。相关普通回归:文档CLI12、next6、同步15、任务租约16、任务复检10,共59项不同测试通过;11项默认忽略不计通过。原生CLI独立1项实际通过(14.07秒),包括初始化/稳定任务、真实缺文档复检、补齐文档与源码allow的force-warn反例、中文坏链接;同一测试多轮不重复计数。相关最终Clippy结果另附。 + +仍缺正式关闭与复发重开、完整原配置/workspace/features/targets/符号归属、可信工具/规则/批准、全部语言类别及宿主;7.1/9.7不勾选。未来工具文件变化的旧复检不能作为批准工具证明,本地来源始终未核验。本轮没有全工作区回归。验收见相邻tests/acceptance/rustdoc-task-recheck.md。 + +## 2026-09-27 Rustdoc强制对照导入身份修正 + +反例先RED:普通观察合法时,强制对照的伪造指纹及重复输入归属均被旧同步器消费,failed_reports=0。现把复检导入交给独立Rustdoc封套解析:严格检查顶层键与唯一输入路径归属,稳定输入绑定源/目标及清单/锁;普通和强制观察分别进入同一严格原生范围/指纹解析。强制argv及原始证据保留在封套,只在内部核验投影规范化参数,不修改原始报告或将抑制当修复。输入不稳定/当前失配时只导入准备阻塞,不生成源码任务。 + +同一反例验收三种变体:伪造强制指纹和重复输入被拒,不稳定封套只生成一项重扫阻塞;没有新增源码任务。相关普通回归13项文档CLI、15项同步、6项next,共34项通过;3项默认忽略不算通过。真实Cargo CLI独立1项通过(14.49秒),覆盖正常文档发现/修复复检、原生allow/force-warn和中文链接;相关Clippy -D warnings退出0(7.18秒)。真实报告协议验收另记;schema增加重复行拒绝,唯一字段归属仍由Rust核验。 + +这是任务复检证据的完整性修正,不是正式批准或关闭;7.1/9.7保持未完成。全工作区未重跑,完整目标仍需持续推进。验收见相邻tests/acceptance/rustdoc-forced-evidence-binding.md。 + + +## 2026-09-27 Rustdoc 接入 check all + +完整检查入口新增独立 rust.comments 节点,复用 comments rust 观察服务与持久同步;与 Clippy 共用总预算和 Cargo 资源互斥,分别保留结果/完成状态/准备任务。取消标记传入原生进程,避免新节点绕开任务取消。文档原生发现进入统一对话反馈和 next;检查器成功不覆盖其它未完成。check_feedback 0.27、check_aborted 0.8 自包含嵌入 Rustdoc 0.4,旧 0.26/0.7 协议保留。 + +TDD:缺调度时新契约先失败;接线后回归暴露旧任务计数、协议自包含以及独立准备任务 next 预期,已修正。真实验收新增断言最初误用 local_complete 字段失败,改为既有 local_scan_complete 后通过,不改生产协议迎合测试。普通相关 Go3/Java24/npm2/部分结果13/Rust11/文档14,共67项通过,12项默认忽略不算通过。显式既有 Cargo 原生3项通过:Clippy两项7.03秒、Rustdoc一项12.96秒;增强后的原生完整检查实际断言 missing_docs 及独立两节点。相关 Clippy -D warnings 通过(1.20秒)。 + +真实未初始化/初始化 check_feedback 0.27 均通过 Draft202012,初始化文档同步状态 synced;check_aborted 0.8 仅静态 schema 合法性,本轮未声称实际异常中止协议验收。Python仅独立验收,不在产品执行路径。正式规则/完整构建组合、可信工具策略、关闭复发与宿主仍缺;7.1/9.7不勾选,全工作区未重跑。详见相邻 tests/acceptance/rustdoc-check-all.md。 + + +## 2026-09-27 当前 Rustdoc 集成后的全工作区验收启动 + +当前源在完整 Rustdoc/check all 接线后启动 cargo test --workspace 和 cargo clippy --workspace --all-targets -- -D warnings。两项运行尚未终止,不能以旧880项通过替代本轮终态;测试日志 /tmp/codeguard-workspace-current-20260927.log,Clippy日志 /tmp/codeguard-clippy-current-20260927.log。本轮首批13组59项通过/0失败/0忽略,只是中间结果,13.2保持未完成。 + +独立协议静态审计115份schema合法且本地引用可解析;实施索引核对108项Requirement均有对应行且无重复标题,仅证明映射。OpenSpec strict及git diff --check退出0。未安装工具、未修改规格要求、未发布;完整计划继续,后续沿同一进程核验终态,不因观察等待重启。 + + +## 2026-09-27 全目标 Clippy 终态 + +同一运行 cargo clippy --workspace --all-targets -- -D warnings 已退出0,耗时2m01s,日志SHA256 ba479f2fe8cb4e988013460eed8c16cd6d506830b65530f8804107cf89c7695d。不是部分目标检查。全工作区测试仍运行,中间17组、74通过/0失败/1忽略;不得用中间结果宣布全通过。13.2及完整计划保持未完成。 + + +## 2026-09-27 插件兼容静态与 vendor 校验终态 + +既有架构脚本通过,语言注册57条(54 stable/3 planned)及11项schema规则通过;受管技能离线和在线check均退出0,在线核验 v0.1.2 -> 2c0c8071f96de48dc53e11de2499c083c100e44c。未更新lock、未安装或发布。旧Python脚本只是既有插件兼容验收,不新增Rust产品中的Python检测路径。 + +Rust全工作区测试同一运行仍在继续,本次中间25组/103通过/0失败/4忽略,不能宣布终态。全目标Clippy本轮已通过,115 schema静态校验和108 Requirement映射也通过,均不等于所有原生/平台/宿主验收。13.2不勾选。 + + +## 2026-09-27 既有插件测试与解释器边界 + +协议模拟 tests/run_all.py 终态142通过/0失败/1跳过。第一轮unittest实际632项/93.819秒,1失败/21跳过:主进程3.13.5而Bash CLI子进程PATH选到系统3.9,zip(strict=True)报错,不能将该轮计通过。仓库CI明确3.11/3.12/3.13。统一PATH到既有/opt/anaconda3/bin后,失败所在CLI合同3项实际通过(0.539秒),随后启动同一环境完整unittest,日志 /tmp/codeguard-plugin-unittest-python313-20260927.log,尚未终态。未修改Python生产逻辑、未安装解释器;保留首轮失败。Rust全量沿原进程继续,完整验收仍未完成。 + + +## 2026-09-27 统一解释器插件 unittest 终态 + +明确 PATH=/opt/anaconda3/bin:$PATH,主/子进程使用既有Python3.13.5;完整unittest退出0,632项/99.003秒,其中621通过、11跳过。日志SHA256 10f2e398b7d644ab8abf9cb3efebdfd637efc9994fd80fb41b454f12b0eff71e;首轮3.9子进程失败仍保留,不伪称系统3.9兼容。协议模拟142通过/1跳过、全目标Rust Clippy、架构/语言/schema/OpenSpec/vendor检查分别记录。Rust测试同一运行仍在继续,中间74组/432通过/0失败/34忽略,尚无完整终态;13.2及总目标保持未完成。 + + +## 2026-09-27 Rust 构建实现前验收约束 + +继续既有7.1与Rust command plans SHALL preserve explicit build levels要求,追加原生Cargo check的可归属编译错误与报告损坏两场景;不新增change或改验收目标。后续适配须保留package/manifest/target与原生诊断,类型检查固定test_execution=false,不改称Clippy/文档/安全违规。成功/失败结束、原生退出、重复键、结束后事件及无可归属诊断的失败须分别核验;裸退出不生成源码违规或通过。当前只有规格补齐,尚无Cargo构建实现或测试通过声明;7.1仍未完成。OpenSpec strict和git diff --check退出0。现有Rust全工作区测试继续原运行,未因等待重启。 + + +## 2026-09-27 Rustdoc集成后全工作区测试终态 + +同一 cargo test --workspace 运行已退出0:154组、910通过、0失败、93忽略。包括当前Rustdoc/check all/任务复检及所有既有普通回归;忽略原生测试、MSRV1.85、Windows和宿主不计通过。日志 /tmp/codeguard-workspace-current-20260927.log,SHA256 8d647e591bac5d2d247e33a3e648922d102da3639c72909a0513ecb3b91c5ff8。当前 source 的全目标Clippy已退出0,既有插件unittest621通过/11跳过、协议模拟142通过/1跳过,115schema静态/OpenSpec/架构/语言/vendor另有终态。 + +当前全量结果替代旧880项基线,不抹去首轮Python3.9子进程失败;93项忽略须各自具备条件后独立验收。实际原生Cargo3项和反馈0.27的两种绑定情况验收另列,不把普通协议夹具当真实工具。原配置/全构建组合、可信策略、关闭复发、全部语言类别与发布宿主仍缺,13.2及完整目标不勾选。下一实现为已有7.1下Cargo原生构建契约,新增两场景只是验收准备。 + + +## 2026-09-27 Cargo 原生构建解析前置 + +新增独立 CargoBuildDiagnostic/CargoBuildParsed 对象与 Cargo check JSON流解析,保留编译器错误码、package/manifest/target及唯一主定位范围,不借Clippy/文档规则过滤。结束成功与退出、成功却带error、失败无可归属错误、坏/重复键/未知记录/结束后事件、规模上限等均未完成;前序有效观察保留仅供调查。纯解析尚无源字节/工具/配置绑定,不授予正式源码finding、覆盖或交付权威。 + +TDD缺入口先因unresolved import失败;实现后8项新协议、adapter库6项、Rustdoc7项、依赖边界6项,共27项普通回归通过。真实既有Cargo原生1项通过(0.94秒),包括E0308类型错误、成功但故意失败测试未运行、build.rs执行失败不被误报为源码;首次路径断言因macOS临时路径别名失败,核对实际manifest路径后通过,未改生产解析规则。相关Clippy -D warnings退出0(10.63秒)。未安装或下载工具。 + +公开build rust、共享runtime服务、原输入/工具/目标归属、持久修复任务、复检、check all与完整构建组合仍缺,7.1不勾选。此前154组/910通过全量是本前置之前的基线,本轮新源仅上述受影响验证,不宣称重跑全量;完整目标继续。验收见相邻tests/acceptance/cargo-build-native-observation.md。 + + +## 2026-09-27 build rust 公开类型检查探针 + +新增 build rust [path] --cargo-tool ABS_PATH --timeout DURATION --format human|json,使用共享预算/runtime/SourceSnapshot与私有target调用原生Cargo check --locked --offline --all-targets --message-format=json;不执行测试,不生成锁,不安装工具。前后核验已发现源码集合、根清单/锁和工具字节,原生目标须归属本轮源及根清单,UTF8范围及行列重建候选指纹。保留包身份摘要和原生目标类别,避免公开本机package路径;不同目标类别同候选指纹不按原生顺序消歧。输入/工具变化、取消/超时等不给源码修改范围;取消优先130,普通局部命令保持3/not_evaluated/coverage_proven=false。 + +每发现给七项静态修复/调查信息,历史not_integrated且不授权关闭。反馈 rust_build_local_observation 0.1及严格自包含schema新增build_level=type_check/test_execution=false/build_success;没有队列、任务或门禁接线。真实错误和成功反馈均通过Draft202012,六个伪造授权/覆盖/状态及缺包身份变体被拒;独立Python只验收,不在产品路径。 + +TDD缺公开入口先RED。最终相关普通26项(build6、Rustdoc14、边界6)通过、2项默认忽略不计通过;真实公开Cargo1项通过(7.15秒),包含E0308、补齐成功但panic测试未执行、构建脚本失败不生成源码违规;相关Clippy -D warnings最终退出0(5.63秒)。中途一次输入变化测试得到source_discovery_incomplete,已加强fixture的原子序列路径隔离,之后全组通过;该次底层原因未完全归属,保留失败,不改生产失败判定。 + +7.1/9.7仍未完成:公开命令仅原生类型检查局部探针,缺完整配置/workspace/features/targets/可信工具策略及任务同步/verify/关闭复发/check all接线;新源未重跑全工作区,此前910项基线不覆盖本次新增行为。验收见相邻tests/acceptance/rust-build-cli.md。 + + +## 2026-09-28 Rust构建报告自动同步与next + +build rust局部观察协议升级0.2,保存0.1原始schema;每条finding增目标源码摘要,初始化工作区自动入队并sync。严格导入核对工作区/run/file键、原生状态、根清单锁与当前源码及目标普通文件字节,重算UTF8原生范围指纹;导入改用SourceSnapshot读取源码/目标以拒绝路径别名。包摘要保持未核验观察,不冒充可信来源。有效发现生成稳定fact和七项任务,同一问题重复扫描只更新观察。旧目标即使错误源码未变也只留历史并生成重扫准备任务;伪造指纹拒绝。缺工具生成稳定准备任务,next显示同一原生构建复扫指引。 + +TDD缺自动同步先RED。相关普通:build9、work sync15、next6,共30项通过,3项默认忽略不计通过;真实公开Cargo1项通过(7.70秒);实际绑定反馈与queued 0.2均通过Draft202012,任务文件存在,缺目标摘要反例拒绝。Clippy第一次发现一处不必要借用,已按诊断修正且重新执行,终态见后续证据。 + +7.1/9.7/9.4均未完成:正式task verify、关闭复发、可信包工具/规则策略、完整workspace/features/targets及check all仍缺。0.2队列同步不是构建通过、风险接受或白名单批准;历史0.1不能作为当前可导入报告。全工作区当前新源码尚未重跑;旧910项基线不得挪用。验收见相邻tests/acceptance/rust-build-workbench-sync.md。 + +## 2026-09-28 Rust 构建任务的原工具复检与白名单边界 + +延续既有7.1/9.7/9.4,不新建OpenSpec change。先以已同步编译任务的 `task verify` 返回 `task_checker_unsupported` 作RED;现将 `rust.cargo_check` 接入任务租约、统一截止时间、原生Cargo check、全部已发现Rust源/根清单/锁快照和本轮工具摘要。复检封套 `rust_build_task_recheck` 0.1 与任务、运行和输入绑定;`task_verification_preview` 0.8 保留旧0.7 schema。有效相同错误为still_present,局部零诊断仅candidate_absent_unverified_policy,环境任务仅恢复候选;事件与本地报告持久化并供next/尝试历史核验。保存前重抓输入且拒绝源集变化,报告导入严格复核原生诊断身份。next复检命令指向同一task verify,不自行关闭或批准白名单。 + +白名单仍按已有规则体系处理:候选/本地决策无门禁效力;原生工具故障、配置或覆盖未完成不能转成误报放行。Rust构建任务的局部复检只提供纠错证据,不证明可信白名单批准、完整构建组合、测试执行或最终交付。受影响普通测试41项(build10、work sync15、next6、task verify10)通过,12项条件性忽略;真实既有Cargo任务复检1项通过。Clippy受影响包all-targets -D warnings退出0;119份schema静态合法性与引用存在性通过。此前910项全量基线早于此新代码,不能作为当前全量证明。7.1/9.7/9.4/4.8/12.12均保持未完成,待可信策略、白名单批准/正式门禁、完整构建目标、任务关闭复发和跨宿主验收。详见相邻codeguard-cli/tests/acceptance/rust-build-task-verification.md。 + +## 2026-09-28 npm 审计异常退出的局部证据 + +延续 F05、2.3、5.5 和 7.3;未新建 change。受控 npm 11.16.0 命令输出完整且与锁节点绑定的 advisory 后异常码 2 退出,旧公开反馈丢弃 finding;目标测试先 RED。现严格解析与再次核对输入后保留脱敏证据,原因仍为 npm_audit_execution_incomplete、交付未评估;check all 执行节点为 native_incomplete,不因报告有效而显示任务成功。截断 JSON 反例仍零 finding。同一工作台只维持稳定的 npm CVE 完整性任务,不把局部观察改成漏洞确认或放行。 + +该阶段目标 npm_audit_cli/check_all_npm、全工作区 cargo test --workspace --offline -q、全目标 Clippy -D warnings、fmt 和 OpenSpec strict 均退出 0。详见相邻 codeguard-cli/tests/acceptance/npm-partial-native.md。此阶段仅覆盖异常退出后的完整报告;超时与输出上限的后续进展见下段。真实 npm 故障、数据库来源及时效及跨语言 F05 矩阵未验收,2.3/5.5/7.3 与总计划继续未勾选。 + +后续 F05 增量:同一 npm 原生观察现对完整 stdout 报告后超时、其它输出超出共享上限继续执行严格 JSON/锁节点/输入摘要核对;分别保留 `deadline` 和 `npm_audit_output_limit` 及局部 finding,不将零漏洞报告当作未完成执行的干净证明。超时后不跨截止时间持久化;输出超限仍可同步稳定完整性任务,`check all` 节点保持 `native_incomplete`。工具运行中变更或 JSON 截断都不产生 finding。完整 5.5/7.3 与 F05 跨适配器验收仍未完成。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/verification.md b/openspec/changes/introduce-rust-codeguard-cli/verification.md index f55d154..b782206 100644 --- a/openspec/changes/introduce-rust-codeguard-cli/verification.md +++ b/openspec/changes/introduce-rust-codeguard-cli/verification.md @@ -1,24 +1,112 @@ # 本次设计交付验证 +## 2026-09-26 `lint go` 原生局部 CLI + +相邻 Rust CLI 已接入 `codeguard lint go`,从显式 Go 1.23.4 二进制执行版本探测及 `go vet -json ./...`,把原生规则、相对路径、行列与诊断文本摘要送入 human/JSON 反馈。运行前后复核工具、`go.mod`、可选 `go.sum` 和发现的 Go 源文件;继承环境被清空,Go 工具链/模块网络下载关闭,缓存位于私有临时目录。无工具或无关二进制不产生干净结果,真实违规、干净和编译错误分别有独立反馈,所有结果仍退出 3、交付未评估。反馈 schema 和真实验收范围见 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。任务同步、完整项目/平台覆盖、可信工具与策略,以及注释原生工具尚缺,8.2 未完成。 + +## 2026-09-26 Go vet JSON 原生局部解析 + +相邻 Rust `codeguard-adapters` 新增 Go 1.23.4 `go vet -json` 的局部报告解析;本机原生违规、干净、编译失败三样本分别得到 `FindingsObservedUnverified`、`CleanObservedUnverified`、`Incomplete`。JSON 模式中违规样本退出 0、诊断位于 stderr,排除了“退出 0 即无违规”的错误适配。真实测试首次因 macOS `/var`/`/private/var` 路径别名失败,修复根路径归属后通过。坏版本/JSON/包/位置/多包坏块均不生成部分 finding。CLI 调用、Staticcheck 注释、完整覆盖和工具锁尚缺,8.2 继续未完成。详细证据见 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 + +验证:`cargo test -p codeguard-adapters --test go_vet_contract --offline` 为 5 通过、1 显式原生用例跳过;`CODEGUARD_GO_TOOL=/usr/local/go/bin/go cargo test -p codeguard-adapters --test go_vet_contract --offline -- --ignored` 为 1 通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。默认工作区回归跳过其余需要显式原生工具的用例。 + +## 2026-09-26 Go 六类别候选档案 + +相邻 Rust `rulepacks/go_static_candidate_v1.json` 固化 Go Modules 的 lint/comments/dependencies/cve/security/build 六个适用类别、候选原生工具与版本、五个待验收平台及每类覆盖缺口;Rust 解析器拒绝缺项、重复、虚报 implemented/not_applicable、错类别工具、`gofmt` 冒充注释检测和 CVE 漏数据库新鲜度要求。旧注册表的 Go `stable` 仅保留为迁移元数据,新能力矩阵仍全为 `gap`。这完成 OpenSpec 8.1 的候选/缺口账本,不证明 8.2/8.3 的真实检查能力。依据见 `codeguard-cli/tests/acceptance/go-candidate-baseline.md`。 + +TDD:新增契约测试先因缺档案/接口失败,补齐后通过;错类别工具反例再次先失败后修正。`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 均退出 0;显式原生测试仍按原设置跳过。 + +## 2026-09-25 Maven Javadoc 多文件原生 CLI 探针 + +相邻 Rust `check java`/`check all` 对已静态配置的 Maven 构建根增加独立多文件 Javadoc 探针:有界源码快照、新私有项目、固定 POM、离线 Maven/JDK 21、原生输出解析与输入/制品复核。真实两文件违规样本产生多条缺注释诊断;源码修正后重新建快照得到 `clean_log_unverified`。两轮均退出 3、交付未评估;固定探针 POM 与项目生效配置/完整类路径不等价,6.3 保持未完成。首次原生失败说明离线仓库中的 Maven 镜像 ID 必须由匹配的 settings 提供;改用现有隔离 settings 后原生用例通过。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0;默认工作区测试跳过显式真实 Maven 用例,该用例另行通过。证据见相邻 `codeguard-cli/tests/acceptance/maven-javadoc-multifile-probe.md`。 + +## 2026-09-25 源码快照目录替换反例 + +相邻 Rust runtime 的 `SourceSnapshot` 在 Unix 上改为固定根目录描述符、逐级 `openat`/`O_NOFOLLOW` 读取及复核。测试将子目录反复在真实目录和指向范围外文件的符号链接之间切换,1,000 次捕获只能得到根内预期字节或错误;目标 `source_snapshot_contract` 4 项、`java_javadoc_cli` 普通 4 项和显式 JDK 21 的 1 项均通过。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt 与 OpenSpec strict 均退出 0。仍须区分该输入读取保护与项目级 Maven 执行沙箱:副本写入、插件副作用及完整源集尚未证明,3.7/6.3 不勾选。 + +## 2026-09-25 Javadoc 输入快照执行边界 + +项目级 Maven Javadoc 仍不能直接交给当前工作树执行:实际 POM 可能触发额外插件和生成源码,而现有单文件探针没有完整项目配置归属。相邻 Rust runtime 增加有界 `SourceSnapshot`,并接入 JDK Javadoc 单文件入口。相对路径逃逸、重复、预算超限、符号链接文件/父目录、原件或私有副本改变均有负例;快照不宣称源集完整或内核级抵御恶意并发目录替换。`source_snapshot_contract` 3 项、`java_javadoc_cli` 普通 4 项及显式真实 JDK 21 1 项通过;`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。完整项目级 Maven 运行和 3.7/6.3 验收仍未完成。 + +## 2026-09-25 Maven Javadoc 干净日志与旧产物反例 + +本机 Maven 3.9.16/JDK 21/离线 Javadoc Plugin 3.12.0 的完整注释项目,首轮和同目录重跑都成功且没有 Javadoc 诊断块;日志本身不能证明第二轮重新生成了文档。相邻 Rust 解析器新增 `CleanLogUnverified`,只允许已观察的编码提示,保留零诊断但明确 `javadoc_fresh_execution_unverified`;未知警告、额外错误与失败结果仍为 `Incomplete`。这一状态不是项目检查通过,也不能关闭修复任务。独立快照执行器、产物归属和生效配置证明仍缺,6.3 不勾选。 + +验证:`maven_javadoc_output_contract` 普通 5 项及显式真实 Maven 2 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。默认工作区测试仍跳过需要显式本机原生工具的用例;项目执行器尚未实现。 + +## 2026-09-25 Maven Javadoc 原生输出双路径 + +在独立临时 Maven 项目上,本机 Maven 3.9.16/JDK 21/离线 Javadoc Plugin 3.12.0 的原生执行证明:`failOnWarnings=false` 时 `BUILD SUCCESS` 仍有缺注释警告;`true` 时 `BUILD FAILURE` 和同一诊断。相邻 Rust adapters 新增有界解析器,只有单一 goal、已知插件版本、完整警告数量、源码字节与规则归属及可信失败签名同时匹配才保留局部诊断;其它结果为 `Incomplete`、不生成部分 finding。首次真实测试发现同目录第二次执行可能复用 `target/site/apidocs`,改为每轮独立项目副本后两种原生路径均通过。这是项目级执行器需要隔离快照的验收前提,并非执行器已实现。 + +验证:解析器目标测试 3 通过、1 个显式原生测试默认跳过;显式设置 Maven/JDK 路径后真实原生测试 1 通过;`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`cargo test --workspace --offline -q`、`openspec validate introduce-rust-codeguard-cli --strict` 与 `git diff --check` 均退出 0。默认完整测试仍跳过需显式环境的原生用例。6.3 保持未完成。 + +## 2026-09-25 `check java` Javadoc 局部原生反馈 + +相邻 Rust CLI 的 `check java`/`check all` 新增条件调度的 `java.javadoc` 任务:仅静态配置确认为 `configured` 才调用 JDK 21 原生单文件探针,并在 JSON/human 显示缺注释位置与规则。无 Javadoc 配置时不调度,也不把缺失检查器自动升级为必需义务;配置无效/未知仍由 discovery 给出原因。检查反馈协议增量为 0.9.0,Javadoc 结果固定 `project_checker_attribution=unverified`、`coverage_proven=false`、`delivery_decision=not_evaluated`,不进入任务同步、白名单生效或门禁。 + +验收:目标集成测试先因 `native_results.java_javadoc` 缺失失败,接线后通过;显式本机 JDK 21 的真实最小 Maven 项目用例通过 1 项,返回 `JavadocMissingComment`。把调度条件收紧为“仅已配置”后,相关 `check_all_java_p3c` 为 15 通过/4 显式原生跳过,`check_all_partial_contract` 为 13 通过/1 跳过,真实 JDK 用例再次通过;最终 `cargo test --workspace --offline -q` 退出 0。Clippy、格式检查及 OpenSpec 严格校验也退出 0。项目 Maven Javadoc 插件生命周期、effective model/类路径、Checkstyle、生成源码和完整源集未验收,6.3 保持未完成。 + +## 2026-09-25 Javadoc 配置误报反例 + +相邻 Rust Maven 静态探测修正了“声明 Javadoc 插件即认为缺失注释规则可用”的误判:`doclint=none`、`all,-missing`、仅 `syntax`、`failOnError=false` 及未被插件配置覆盖的 `maven.javadoc.skip=true` 均不再返回 `configured`;动态 doclint 返回 `unknown`。`check java` 的 discovery 同轮反馈 `invalid/javadoc_missing_check_disabled`,仍未把这项配置观察当成项目原生执行或门禁通过。 + +TDD 证据:新增 `detect_cli` 反例先失败(既有输出错误地为 `configured`),实现后目标用例通过。`cargo test -p codeguard-cli --test detect_cli --offline -q` 为 19 通过;`cargo test -p codeguard-cli --test check_all_java_p3c --offline -q` 为 14 通过、3 个显式原生用例跳过;`cargo clippy --workspace --all-targets --offline -- -D warnings` 与 `cargo fmt --all --check` 退出 0。该切片未运行完整 workspace 回归,也未证明 Maven effective model、跨父 POM 属性覆盖或项目级 Javadoc 执行,5.10/6.3 继续未完成。 + +## 2026-09-25 JDK Javadoc 单文件原生诊断切片 + +相邻 Rust CLI 新增 `lint java FILE --checker javadoc --java-home ABS_PATH`;JDK 21 `-Xdoclint:missing` 的已知缺失注释、参数和返回诊断可映射到原源码。未知文本、缺少类路径、进程失败或缺失原生产物保持未完成;无诊断只标为 `clean_scope_unproven`,一律退出 3、不签发项目通过。`lint java` 缺省 P3C 行为仍保留。本单文件切片当时尚未接入 `check java`;项目生效配置、任务、白名单生效门禁及 Checkstyle、完整项目级验收仍未完成。 + +验证:`cargo test --workspace --offline -q` 退出 0;`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 均退出 0。显式本机 JDK 21 的 `CODEGUARD_JAVA_HOME=... cargo test -p codeguard-cli --test java_javadoc_cli --offline -- --ignored` 通过 1 个真实原生测试,覆盖缺类注释、参数/返回、`{@inheritDoc}`、record 与 Lombok 类路径缺失。默认工作区测试跳过显式原生工具用例;P3C 局部回归 6 通过、2 跳过。P3C 报告 schema 的规则集下限对齐固定原生计划的 10 组。 + 日期:2026-09-24。性质:架构与规格文档验证,**不是 Rust 实现、真实扫描器或发布验收**。 +本文件保留设计阶段的历史快照;文内“未建立 Rust 源码仓”“267 项未勾选”等数字描述的是当时状态。随后启动的实施以 [tasks.md](tasks.md) 为唯一勾选状态,独立 Rust 工程证据记录在相邻 `codeguard-cli/tests/acceptance/`,最新旧源码增量见 [核对记录](../../../docs/rust-cli/legacy-delta-20260924.zh-CN.md)。 + ## 交付范围 -- [设计文档入口](../../../docs/rust-cli/README.md):架构、技术方案、57 项语言迁移与验收、项目内持久修复工作流。 -- 本 change 的 proposal、design、10 个 capability delta 和可执行 tasks。 +- [设计文档入口](../../../docs/rust-cli/README.md):架构、技术方案、57 项语言迁移与验收、项目内持久修复工作流、项目初始化与 AGENTS 接入、逐指令架构。 +- 本 change 的 proposal、design、11 个 capability delta 和可执行 tasks。 - 持久工作区使用 `./codeguard/`,含自有 .gitignore;以问题、阻塞、任务和复检事件指导修复,规则和最终门禁不由任务文件决定。 ## 实际检查 `openspec validate introduce-rust-codeguard-cli --strict --json --no-interactive` 已通过,无 issue。最初的校验发现 MODIFIED scenario 标题未保留,已恢复原 scenario 名称并显式限定旧协议范围,再次校验通过;未删除旧场景来绕过验证。 -本次使用只读脚本核对 Markdown 本地链接、代码围栏、JSON 示例、语言 ID/状态、重复任务编号、proposal/spec 目录和规范任务追踪,最终退出 0、issues=[]。范围为 19 份 Markdown、40 个本地链接、57 个语言条目、10 个 capability、43 条 requirement、89 个 scenario、228 项未勾选实现任务。Mermaid 有 9 个代码块,已检查围栏与人工语法,未执行渲染器视觉验收。 +初始设计交付使用只读脚本核对 Markdown 本地链接、代码围栏、JSON 示例、语言 ID/状态、重复任务编号、proposal/spec 目录和规范任务追踪,最终退出 0、issues=[]。初始范围为 19 份 Markdown、40 个本地链接、57 个语言条目、10 个 capability、43 条 requirement、89 个 scenario、228 项未勾选实现任务。Mermaid 有 9 个代码块,已检查围栏与人工语法,未执行渲染器视觉验收。 `git diff --check` 与 `git diff --cached --check` 在本次文档路径范围均通过。任务初次语言 ID 机器核对发现三项仅写了大小写不同的展示名,已补充 canonical ID 并复核 57 项全部可追踪。 OpenSpec 的 planning artifacts 为 complete 只说明 proposal/design/specs/tasks 已齐备,不意味着实施完成。实现任务全部未勾选;不得据 status 的 isComplete 字段声称二进制可用。 -## 独立读者检查 +## 初始化设计增量复核 + +同日补充 init 的项目画像、分类型模块图、AGENTS 受管摘要、静态观察与写入边界、画像刷新和准备状态。沿用同一 change,未建立第二套规格事实源。 + +增量完成后重新执行 OpenSpec 严格校验,通过且无 issue。文档核对范围为 21 份 Markdown、48 个本地链接、11 个 capability、50 条 requirement、104 个 scenario、240 项未勾选任务;本地链接、代码围栏、JSON 示例、任务编号连续性/唯一性、proposal/spec 目录及能力任务追踪均通过。Mermaid 共 11 个代码块,未执行渲染器视觉验收。`git diff --check` 通过。 + +独立读者复核促成两项补充:dry-run 仅返回拟创建的任务,apply 才持久化;readiness 只按适用必需前置条件汇总,区分已确认阻塞、未探测和已就绪,避免可选工具缺失误阻塞。init 成功与质量通过继续保持独立。 + +## 逐指令架构增量复核 + +同日新增 [逐指令架构](../../../docs/rust-cli/command-architecture.zh-CN.md),覆盖 C01–C35 的职责/价值、输入输出、副作用、失败恢复、应用服务与调用旅程。细化统一操作协议、准备证据、工具安装、交付输入、执行预算和任务租约/attempt接入,并同步既有规格和任务。 + +最终 OpenSpec 严格校验与文档静态核对通过:22份 Markdown、57个本地链接、14个Mermaid代码块、11个capability、57条requirement、122个scenario、248项未勾选任务;C01–C35目录与独立章节一一对应,F01–F26场景编号连续。核对覆盖本地链接、代码围栏、JSON示例、任务编号、proposal/spec一致性及能力任务追踪;`git diff --check`通过。Mermaid未执行渲染器视觉验收。 + +独立读者指出并完成修订:fix缺少已领取任务的租约传参、doctor准备证据缺少明确导入身份、执行预算缺少默认和总deadline;二轮复核进一步区分已初始化批量fix与未初始化私有证据路径。另明确已落盘finish的幂等读取不受后续租约到期影响,不能重新写入新租约状态。 + +以上只验证设计产物;未构建或运行35项新命令、MCP服务、安装器、租约或真实检查器,未初始化被检查项目。预算默认值仍需实施阶段按真实项目验证,不作为已测性能承诺。 + +## 实施前规范与计划覆盖审计 + +同日按用户要求核对全部已确认设计是否落入规范与任务,新增 [实施覆盖索引](implementation-coverage.md),逐条连接Requirement、命令、语言、平台/宿主及任务,并补充执行里程碑、责任边界与待定参数的关闭任务。索引不维护第二份实施状态。 + +本轮补齐5条正式Requirement、17个Scenario、19项任务,并强化既有9.4/9.10/9.27的故障验收。具体包括detect/capabilities查询处理、事件/游标中断恢复、过期租约接管、环境任务原义务复检、关联追踪、证据保留、分层评测以及逐平台/宿主验收。独立读者复核5项命令缺口均闭合,执行顺序未见明确循环;评测依赖拆为12.2冻结输入→12.10计算器→12.11真实评测。 + +当前审计范围为23份Markdown、126个本地链接、15个Mermaid代码块、11项capability、62条Requirement、139个Scenario、267项未勾选任务。机器核对证明每个Requirement恰有一条索引映射、全部267项任务均有规格关联(未映射为0);35项命令与设计章节一致,57个语言与当前注册表集合及stable/planned状态一致,5个平台和3个宿主均有有效任务引用。Markdown围栏、JSON示例、本地链接、任务编号、proposal/spec及阶段追踪检查通过。 + +`openspec validate introduce-rust-codeguard-cli --strict --json --no-interactive`通过且无issue;`git diff --check`通过。Mermaid未运行视觉渲染。此结论限定于当前已确认设计的拆分与追踪;P3C兼容版本、平台ABI、签名身份、语料和性能等待实测参数已绑定任务,不声称已确定。代码实现、原生工具、平台/宿主运行及发布仍全部未完成;未运行apply/sync/archive。 + +## 初始设计独立读者检查 两轮只读审查识别并修订以下六项: @@ -36,3 +124,1918 @@ OpenSpec 的 planning artifacts 为 complete 只说明 proposal/design/specs/tas 源码观察基线为 `03ebb24`,读到的注册表为 54 stable/3 planned。工作过程中存在其他任务切换分支、暂存 release/manifest 文件;本次不创建或切换分支、不修改这些发布文件、不代替其他任务提交。文档最终实现基线须在实施开始时再次核对。 没有建立 Rust 源码仓、编译或执行新 CLI,没有安装工具、测量实际误报率、发布制品、同步市场或验收宿主;没有运行 openspec apply/sync/archive。既有代码全量测试不用于证明本次文档设计已运行。后续实现与发布证据按 tasks 逐项记录。 + +## 2026-09-24 静态检测族增量 + +用户明确补充 Javadoc、CVE、依赖检测及其他静态检测。现有 change 增加六类别/28 检测族契约、`dependencies` 命令 C36、逐族义务与真实工具验收任务;相关设计见 [静态检测目录](../../../docs/rust-cli/static-check-catalog.zh-CN.md)。相邻 Rust 工作区的能力矩阵协议从 `0.1.0` 升到 `0.2.0`,57×5×6 共 1710 个能力单元继续全部为 `gap`;计划协议 `1.1` 要求检测族,解析器仍兼容只读 `1.0` 计划。新增 schema/解析器一致性与类别错配反例。 + +验证:`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、能力矩阵生成器 `--check`、`openspec validate introduce-rust-codeguard-cli --strict` 和 `git diff --check` 均通过。原生 Javadoc、依赖治理、CVE 及其余检测族尚无执行适配器和误报率验收,不能由分类、schema 或通过的单元测试推断为已支持。 + +## 2026-09-24 配置探测与智能体反馈纠偏 + +按用户最新说明,上节“逐族义务”不再表示每个项目必须逐项证明执行。28 个检测族改为候选目录;目标流程是“识别项目是否配置检查器 → Rust 调用已配置的原生工具 → 将结果和修复/配置建议送到智能体对话”。`missing/invalid/unknown` 与代码诊断、工具故障分开表达;只有批准策略要求的缺项影响交付门禁。新增对话反馈 Requirement 和 11.16 实施任务。相邻 Rust RunReport 协议升级到 1.1,新增 `checker_statuses` 并校验“未配置不能声称运行结果”,1.0 报告兼容读取;2.2 在协议测试通过后重新勾选,项目配置探测与宿主对话接线仍未完成。 + +同日继续实施 5.10 的 Maven 切片:Rust `detect` 的 `0.2.0` 报告现在按构建根返回检查器配置状态,`codeguard-adapters` 纯解析 POM,CLI 只做只读观察和 human/JSON 展示。直接声明的 Javadoc/PMD/Checkstyle/Dependency/Dependency-Check/FindSecBugs、未声明、pluginManagement、父 POM、坏 XML/DTD 和 Gradle 未解析模型均有集成样本;详情见相邻 `codeguard-cli/tests/acceptance/maven-config-discovery.md`。配置发现不执行检查器,也不代表能力矩阵可从 gap 升级。其他生态与真实对话宿主仍为未完成。 + +补充误判边界:Maven 插件显式 `skip=true` 返回 `invalid`,动态 skip 值或动态插件坐标返回 `unknown`,均不标记为 `configured`。`detect_cli` 集成测试 9 项通过;随后 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、OpenSpec 严格校验及 `git diff --check` 全部通过。默认忽略的原生 P3C 回放未在本轮重跑,且这些检查不构成 5.10 全生态完成或 11.16 宿主对话验收。 + +再次核对用户的“配置发现与对话反馈”要求后,统一命令与覆盖规格明确:实际义务来自项目已配置且可适配的检查器及批准策略,不来自 28 个候选检测族目录;未配置且非必需的 Javadoc 样本只给建议,明确必需但未配置才导致 incomplete。另将 POM 读取失败与 XML 错误区分:前者 `unknown/pom_unreadable` 且发现操作不完整,后者 `invalid/pom_invalid_xml`。本次有界观察端口回归覆盖了读取失败;修改后重新执行完整 workspace 测试、Clippy、格式检查、OpenSpec 严格校验与 `git diff --check`,均退出 0。默认忽略的原生回放仍不计入本轮验收。 + +实际运行 `cargo run --offline -q --bin codeguard -- detect tests/fixtures/p3c_native --format human` 退出 0,终端反馈 PMD `configured` 与 Checkstyle、Javadoc、Dependency、Dependency-Check、FindSecBugs 的 `missing` 和逐项下一步。这证明当前 CLI 能把**配置探测**渲染给调用它的智能体;原生检查结果尚无完整 `check` 命令,Codex/ZCode/Kimi Hook 对话接线未验收,不能将终端输出冒充 11.16 完成。 + +## 2026-09-24 运行结果对话摘要切片 + +相邻 Rust CLI 增加 `conversation_feedback`:从结构已校验的 RunReport 生成宿主可消费的 JSON/human 摘要,区分配置状态、运行状态、有效规则 ID、未完成义务和复检 argv,输出显式标记“来源尚未绑定”。自由文本原生诊断、summary 和 next_actions 不进入反馈;注入和凭据样本断言两个格式均无泄漏。RunReport 升级到 1.2,finding 要求源码/依赖/项目定位并校验相对路径和一基行列;检查器状态按构建根区分,旧 1.0/1.1 报告继续可读取。目标报告测试 14 项通过,反馈 JSON schema 与生成物顶层字段一致;详情见 `codeguard-cli/tests/acceptance/conversation-feedback-baseline.md`。这还不能代替来源校验、真实检查报告、规则公开解释或三宿主现场验收;11.16 保持未完成。 + +此切片完成后复跑 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict` 与 `git diff --check`,均退出 0。默认忽略的原生 P3C 和依赖外部环境的回放未作为本轮通过证据。 + +## 2026-09-24 Ruff 项目配置与原生规则切片 + +沿 Python 文件目录层级只读探测 Ruff 配置,依官方优先级区分 `.ruff.toml`、`ruff.toml`、含 `[tool.ruff]` 的 `pyproject.toml`,用 Rust TOML 解析器区分明确 lint、仅格式化、坏配置与未解析 extend。既有单文件 Ruff probe 新增可选的项目配置绑定;绑定时禁止沿用忽略配置的 `--isolated`,执行前后校验配置摘要,并通过原生 `--show-files` 核对目标确实被选中。未绑定模式仍只作隔离基线。 + +`detect_cli` 12 项通过;`ruff_probe_contract` 默认 4 项通过、5 项需 Ruff 的真实测试在 `/opt/anaconda3/bin/ruff` 0.16.8 上通过。原生 E501 样本证明非默认项目规则加载,被 `force-exclude` 排除的文件明确未完成;具体命令与边界见相邻 `codeguard-cli/tests/acceptance/ruff-config-discovery.md`。这不等于项目全量 Python lint、正式 `check` 或三宿主对话接线,5.10/7.2/11.16 均保持未完成。 + +随后 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 均退出 0;真实 Ruff 5 项在最终代码状态复跑也通过。新增 TOML 解析依赖的 crate 边界白名单已同步,仅允许 adapter 使用;初次全量测试发现旧发现测试按全局总数断言 Maven 六项、以及白名单未包含 TOML,均按新范围修正后复跑通过。OpenSpec 严格校验与插件 `git diff --check` 通过。原生 P3C 等其他忽略测试本轮未运行。 + +## 2026-09-24 Python 项目扫描与对话数据切片 + +相邻 Rust CLI 的库服务现按 Python 文件匹配已发现的 Ruff 项目配置,逐文件调用原生 Ruff 并保留诊断与未完成原因。发现器不再把 `.venv` 等点目录当普通源码,但仍读取 `.ruff.toml`;`python_lint_feedback` 将配置、规则 ID、行列、运行状态、修复建议和复检 argv 输出为可展示 JSON,原始原生消息不进入反馈,交付判定固定为 `not_evaluated`。无需为每个候选检测族额外生成执行证明。见相邻 `codeguard-cli/tests/acceptance/python-lint-scan.md`。 + +`python_lint_scan_contract` 默认 3 项通过、2 项忽略;在 `/opt/anaconda3/bin/ruff` 0.16.8 上真实 2 项通过,覆盖配置规则发现与排除文件不假通过。`detect_cli` 13 项通过。该切片验证时,`cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict`、插件 `git diff --check` 均退出 0。当时尚无公开项目 `lint python` 命令;后续入口见下一节。完整 Python 六类适配、已批准策略门禁及 Codex/ZCode/Kimi 宿主接线仍未完成,5.10/7.2/11.16 仍不勾选。 + +## 2026-09-24 公开 Python lint 入口 + +相邻 Rust CLI 现提供 `codeguard lint python [path] [--ruff-tool ABS_PATH] [--format human|json]` 的局部原生入口。先探测项目配置,未配置时不启动 Ruff;已配置时查找可执行文件、通过受控 runtime 读取原生版本,再逐文件调用 Ruff。JSON/human 都反馈配置、运行状态、有效规则和位置、修复建议与复检信息。工具来源尚未获批准,完整 Python 六类别与项目政策门禁未完成,因此 `tool_approval=unverified`、`delivery_decision=not_evaluated`,命令固定退出 3;它不签发局部或项目质量通过。 + +新 `lint_python_cli` 默认 5 项通过、2 项需 Ruff 的真实测试在 `/opt/anaconda3/bin/ruff` 0.16.8 上通过,覆盖缺配置不调用、缺工具、错误程序、human 输出、显式路径与 PATH 自动发现的原生 F401 到 CLI JSON。最终 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 退出 0;`cargo fmt --all` 已执行,OpenSpec 严格校验和插件 `git diff --check` 通过。三宿主自动对话接线、可信工具锁和完整策略未实现,7.2/11.16 不勾选。 + +## 2026-09-24 Ruff 报告归属与多配置回归 + +相邻 Rust CLI 新增真实嵌套配置样本:根目录 E501、子目录 F401 均仅由自身生效 Ruff 配置产生,`python_lint_scan_contract` 的真实工具样本增至 3 项通过。另用受控假 Ruff 返回混合 JSON,证实旧 `ruff_probe` 会把别的文件诊断误归到当前源文件;修复后先将报告路径解析回本次源,再过滤异源诊断。同文件有效发现仍保留,整次标记 `report_source_mismatch`/未完成,不把异源发现展示为当前文件的问题。目标反例先失败后通过,原生 Ruff 5 项回归通过。该修复只覆盖本次文件归属,工具批准、策略、全项目覆盖与宿主接线仍缺。 + +最终 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 退出 0;真实 Ruff 的 CLI 2 项、单文件探测 5 项、项目扫描 3 项分别通过;`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 退出 0。未运行的其它外部工具测试不计入本次验收。 + +## 2026-09-24 误报白名单规格补充 + +新增精确误报白名单设计,并将匹配、可信审批、失效重审、任务归因、带例外交付决策及协议升级写入 rulepack-governance、verdict-integrity、unified-cli-contract、remediation-workflow,映射到 S02/S04/S09/S12 的未完成任务。此轮只验证文档和规格一致性;Rust 1.2 报告、CLI 命令、白名单匹配器与宿主门禁尚未实现本设计,不能声称白名单已经生效。 + +`openspec validate introduce-rust-codeguard-cli --strict` 与 `git diff --check` 均退出 0。本次未改 Rust 源码,因此未把既有 Rust 测试作为白名单实现证据。 + +## 2026-09-24 误报白名单精确身份匹配切片 + +相邻 Rust Core 新增精确身份模型与纯比较函数:源码路径/内容,或依赖组件/版本/图/advisory,连同 finding、原生规则、工具、适配器和 rulepack 身份必须完全一致;通配、越界与缺摘要失败。目标契约测试先因接口缺失失败,随后 5 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check` 均退出 0。详见 `codeguard-cli/tests/acceptance/false-positive-identity-baseline.md`。此函数不验证批准,不能改变 gate;OpenSpec 4.8 及后续协议/宿主/验收任务仍未完成。 + +该切片随后补充版本化候选 schema 与 Rust 严格解析器:6 个目标契约测试先因接口/schema 缺失失败,随后通过;补充未知检查类别反例也先失败后通过。全工作区测试、Clippy、`cargo fmt --all --check`、OpenSpec 严格校验与插件 `git diff --check` 均通过。`approved=true`、坏身份、无期限、错 kind/版本和缺复现/批准引用均不能形成合法候选。解析成功仍不验证批准来源或到期时钟,不能接入放行门禁;4.8 仍保持未完成。 + +继续实现候选集合纯筛选:四个目标测试先因接口缺失失败,后共 10 项通过;同一精确身份的两条候选即使其中一条已过期仍报冲突,缺上下文、策略修订不符、未来生效、到期和超过政策期限上限均拒绝进入权威核验。`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、OpenSpec 严格校验与插件 `git diff --check` 均通过。返回的 `ReadyForAuthorityCheck` 不是批准;可信策略/时钟来源、批准凭据、同 PR 自批与门禁接线仍缺,4.8 不勾选。 + +## 2026-09-24 RunReport 1.3 误报处置消费协议 + +新增 RunReport 1.3 的原始/已处置/活跃阻断集合与 `allow_with_exceptions` 结构消费,conversation feedback 0.2 对话摘要显示批准引用和到期时间并注明来源未核验;局部检查、另一真实阻断、另一未完成义务、错策略修订、重复处置、坏引用及未完成的原检查均有反例。7 项目标测试先因字段缺失失败,随后通过;旧报告 14 项回归及全工作区测试、Clippy、fmt 均通过。详见相邻 `codeguard-cli/tests/acceptance/run-report-allowlist-protocol.md`。这尚不是可信报告生产或全格式宿主门禁,2.10/12.12 保持未完成。 + +## 2026-09-25 批准快照字节绑定切片 + +相邻 Rust CLI 增加 `approval-snapshot:1.0` 严格协议与纯比较器。候选须存在于快照的 ID/原始字节摘要集合,快照须与外部预期摘要一致,并与传入的原生发现身份精确匹配;候选更改批准文字、同次新增、快照篡改、重复条目、未知字段、不同原生发现、缺时钟和到期均有拒绝测试。目标测试先因模块不存在失败,随后 7 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、OpenSpec 严格校验及插件 `git diff --check` 均退出 0。`BoundToPinnedSnapshot` 只证明输入间绑定:外部摘要可能由项目自行计算,调用方传入的 finding/时钟来源也尚未核验,所以不签发批准或交付放行。4.5/4.8/12.12 仍未完成。 + +## 2026-09-25 分层质量评测纯计算切片 + +相邻 Rust Core 新增 `evaluate_quality`,按 cohort/语言/类别/适配器分层统计 TP/FP/FN、precision/recall 和双侧 95% Wilson 区间。零发现不可估计,争议/未裁定、覆盖差异、未完成和工具故障误判单列;真问题漏报与假通过失败,任一分层未达或证据不足不由其它层平均覆盖。目标测试先因模块缺失失败,扩展后 8 项通过。详见 `codeguard-cli/tests/acceptance/quality-evaluation-baseline.md`。正式 12.2 冻结配置和 12.11 真实回放尚无证据;12.10 仍不勾选。 + +## 2026-09-25 点前缀范围汇总切片 + +相邻 Rust `detect` 的 DiscoveryReport 升级为 0.3.0,普通发现点前缀排除根和配置例外文件在 `scope_summary` 中按总数显示,不输出普通排除路径的逐文件报告;入库安全明确 `not_evaluated`。`.hidden.py`、`.hidden_dir`、`.env` 及两项配置例外的目标测试先因旧协议失败,随后 `detect_cli` 14 项通过。详见 `codeguard-cli/tests/acceptance/dot-prefix-scope-baseline.md`。这不是 F18 全部验收:Git 安全例外和完整检查范围仍缺,4.6 不勾选。 + +## 2026-09-25 Git index 路径安全预览 + +相邻 Rust Core 实现旧插件入库路径政策的纯判定;Rust CLI 通过受控 Git 原生命令按 NUL 协议读取真实 index,校验记录、对象格式、阶段、OID 和前后列表,并尊重替代 `GIT_INDEX_FILE`。公开 `codeguard gate pre-commit` 只报告拟提交路径违规,固定 3/incomplete/not_evaluated;公开预览 schema 不含 allow。纯路径测试 3 项、真实 Git/CLI 测试 9 项通过,含真实 SHA-256 仓库;目标测试先因模块缺失失败,随后通过。全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。Git 工具批准、对象内容、完整质量义务、真实 Hook/pre-push/CI 与宿主接线仍缺,相关任务均未勾选。 + +## 2026-09-25 Git index blob 字节核验增量 + +相邻 Rust CLI 增加受控 `git cat-file --batch-check/--batch`,独立按 Git blob framing 重算 SHA-1/SHA-256 OID,记录脱敏的内容 SHA-256、长度与类型;symlink、gitlink、LFS 指针、超出预算或读取失败保持 unresolved,且路径违规不会因对象读取失败消失。公开预览 schema 升至 0.2.0,区分 verified/unresolved/failed/not_observed,仍固定 3/incomplete/not_evaluated。真实 Git/CLI 目标测试 13 项通过,含暂存与工作树字节分离、特殊对象和超预算失败;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。Git 工具批准、工作树/ref 原子快照、完整质量义务及真实 Hook/CI 仍缺,相关任务未勾选。 + +## 2026-09-25 白名单候选只读查询切片 + +相邻 Rust CLI 接入 `rules whitelist list/explain --candidate FILE`;候选文件经既有严格解析器校验,输出始终 `authority=unverified`、`gate_effect=none`,不回显自由文本依据。错误文档、重复 ID 或不存在的 explain 目标为 incomplete/退出 3;有效查询退出 0 只表示查询完成。目标测试先因命令不存在失败,随后 `whitelist_command_contract` 4 项通过;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/whitelist-candidate-inspection.md`。自动发现、propose、可信批准及本次原生 finding 的门禁绑定仍缺,4.9 与 12.12 未勾选。 + +## 2026-09-25 `init` 工作区预览与局部 apply + +相邻 Rust CLI 接入 `init` 的默认只读预览和显式 `--apply`:复用静态发现,生成项目画像、仅有 contains 边的模块图及用户指定的工作区目录;受管文件预检冲突、逐项创建并记录已创建目录/文件,现有 AGENTS 人工内容不触碰。为维持重复 init 的稳定性,普通发现精确排除受管文件及记录目录,仍保留 `codeguard/src` 用户源码。目标测试先因命令缺失失败,随后 `init_command_contract` 7 项通过;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/init-workspace-preview.md`。该实现缺 AGENTS 受管摘要、准备任务、可信策略、画像刷新及完整来源身份,apply 固定 partial/退出3;9.1/9.2/9.15–9.25 仍未勾选。 + +## 2026-09-25 AGENTS 受管摘要增量 + +相邻 Rust CLI 在 `init --apply` 时生成根 AGENTS Codeguard 区块,链接项目画像、模块图和架构观察,仅引用已生成文件的 SHA-256 与当前可用命令,不复制项目自由文本。规划时解析成对 marker,写前再次核对 AGENTS 原字节,保留区块外人工内容/其它工具块及原权限;异常/重复 marker、人工改写、符号链接或规划后字节变化均返回冲突。为避免自身生成的 AGENTS 造成画像循环漂移,普通发现精确排除根 AGENTS;Git 入库安全入口仍独立。目标测试先因行为缺失失败,随后 `init_command_contract` 11 项与规划后修改单测通过。跨外部编辑器的强制并发锁、刷新事务、准备任务及完整检查仍缺,相关任务保持未勾选。 + +## 2026-09-25 画像刷新与白名单纠错边界 + +相邻 Rust CLI 将工作区/画像/init 计划协议升级为 0.2,记录受管投影摘要、清单和锁文件字节摘要,以及源码路径集合摘要。重新 init 可以刷新仍与旧摘要一致的投影和 AGENTS 区块;人工修改或无效工作区身份返回冲突,workspace 最后更新,findings/tasks 保留。刷新目标测试先因旧实现失败,随后 `init_command_contract` 17 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 和 `cargo fmt --all --check` 通过。OpenSpec strict 与插件 `git diff --check` 通过。9.23 的规则配置语义、完整源码关系和强制跨进程锁尚未实现,继续未勾选。 + +补充误报白名单的纠错分流:精确误判才走候选和独立批准;系统性规则不适用走规则包修订,真实问题走风险接受,工具/配置/覆盖问题保持 incomplete。现有 `rules whitelist list/explain` 仅检查候选结构,固定 `authority=unverified`、`gate_effect=none`;未实现可信批准及本轮 finding 的门禁绑定,不声称白名单已放行。 + +## 2026-09-25 规则配置刷新与版本语义增量 + +相邻 Rust CLI 将 Ruff/预提交配置的原始字节 SHA-256 加入项目画像;同名配置的新增、修改、删除触发受管刷新,无法有界读取时 `observation_complete=false` 且 `profile_stale=null`。`package.json` 的包版本独立存为 `package_declared_versions`,语言目标版本仍为 unknown,不据包版本选择检查规则。规则变更与包版本目标测试先因旧行为失败,随后 `init_command_contract` 20 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件 `git diff --check` 均退出 0。其它语言配置和源码关系尚未完成,9.23 不勾选。 + +## 2026-09-25 受管刷新恢复反例 + +相邻 Rust CLI 新增 AGENTS 区块外人工文本保留及“画像已更新、workspace 标记仍旧”的中断重试契约;重试可继续完成并在下一次运行保持幂等。`init_command_contract` 增至 22 项且通过。完整事务日志、外部编辑器的强制并发保护与其它语言配置仍未完成,9.21–9.23 保持未勾选。 + +## 2026-09-25 跨语言精确配置输入观察 + +相邻 Rust adapter 读取旧语言清单的 `linter_config_files` 候选字段;discover 只读取其中精确单文件名,包含受配置发现例外保护的点文件,不遍历普通点前缀源码。注册表解析拒绝通配、路径穿越、控制字符与同语言重复配置名。`checkstyle.xml`、`eslint.config.mjs` 与 `.eslintrc` 的变更均使 init 画像过期;存在配置文件不升级为“检查器已配置”。相关测试先因旧实现缺失失败,随后 `init_command_contract` 24 项、`detect_cli` 14 项及 adapter 注册表目标测试通过;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。嵌套点目录、未登记配置、实际规则解析和源码关系仍缺,9.23 继续未勾选。 + +## 2026-09-25 Python 局部修复提示与输入失效 + +相邻 Rust CLI 的 Python Ruff 局部反馈升为 0.2:完成的 F401/E501 提供限定文件、扫描前源码摘要、谨慎修复步骤与原工具复检条件;未知规则只给调查提示,原生自由文本不进入对话。若后续文件扫描改动先前源码或 Ruff 配置,受影响文件转为 incomplete,原诊断保留待复查且不产生可执行修复提示。模拟原生工具跨文件改动的反例通过,`python_lint_scan_contract` 5 项普通与固定 Ruff 0.16.8 的 3 项原生测试均通过;全工作区测试及 Clippy 通过。该局部提示不构成持久 RepairBrief、可信白名单或完整交付门禁;7.2、9.7、12.12 保持未完成。 + +## 2026-09-25 白名单候选身份纠错查询 + +相邻 Rust CLI 的 `rules whitelist explain` 可选择显式观察身份文件,复用核心精确匹配并报告身份相同或失配。坏观察文件、坏候选、重复 ID 和不同 ID 重复处置同一身份均不展示有效匹配;schema 0.2 固定 `authority=unverified`、`gate_effect=none`。发现身份文件是普通本地输入,并非本轮原生检查证据;匹配不能作为批准。`whitelist_command_contract` 6 项、全工作区测试与 Clippy 通过,OpenSpec strict 与 `git diff --check` 通过。可信身份来源、候选期限/审批核验、propose、config validate 和真实门禁仍缺,4.8/4.9/12.12 未勾选。 + +## 2026-09-25 Ruff 局部稳定发现身份 + +相邻 Rust CLI 对本轮完成且源码稳定的 Ruff 诊断生成行号无关的 `finding_id`/完整指纹。源码行锚点、原生规则与私有消息摘要共同区分同文件问题;跨文件、跨规则或重复同源诊断不误合并。两项身份单测与固定 Ruff 0.16.8 双轮扫描验证:前插一行后 ID 不变而文件 SHA-256 改变;无法核对定位或输入变化时不签发身份。`python_lint_feedback` 升至 0.3,仍固定局部 `not_evaluated`。持久归并、重命名匹配、环境 blocker 和复检关闭尚未实现,9.3 未勾选。 + +## 2026-09-25 工作区 ID 与局部报告绑定 + +相邻 Rust `workspace.json` 0.3/init 计划 0.3 加入稳定 `workspace_id`,刷新沿用既有身份;旧版工作区能升级且不清理 findings,损坏身份拒绝刷新。`lint python` CLI 反馈 0.4 在工作区有效时引用该 ID,未初始化、旧版未绑定和损坏状态分开报告;始终为局部 `not_evaluated`。目标 `init_command_contract` 25 项、`lint_python_cli` 6 项普通测试及固定 Ruff 0.16.8 的 2 项真实 CLI 测试通过;全 Rust 工作区测试、Clippy、fmt、OpenSpec strict、插件 diff 检查均通过。此处只完成未来 `(workspace_id, run_id, report_digest)` 导入键的前置身份,不表示 `work sync` 已实现;9.4 保持未完成。 + +## 2026-09-25 Ruff 报告持久同步与自动串接 + +相邻 Rust CLI 加入 `work sync` 初版及已初始化 `lint python` 的自动保存→同步链路。脱敏局部报告保存在 Git 忽略的 reports,按 workspace_id/run_id/原报告字节摘要核对;完整且源码仍匹配的 Ruff finding 创建首次 fact、observed event 和任务 Markdown,重复扫描只更新 Git 忽略的消费标记。写入先暂存并同步到忽略的 state 后硬链接创建目标,标记最后持久化;标记丢失重试、旧源码历史化、同 run ID 摘要冲突、坏报告与好报告并存均有反例。固定 Ruff 0.16.8 的真实两轮扫描只生成一张任务;记录目录不可用时 CLI 仍显示原生 F401 并报告 `backlog_update_failed`。任务不含原生消息,所有同步结果 `not_evaluated`/退出 3。`work_sync_contract` 4 项普通和 2 项固定 Ruff 原生测试、全 Rust 工作区测试、Clippy、fmt、OpenSpec strict 与插件 diff 检查通过。见相邻 `codeguard-cli/tests/acceptance/work-sync-ruff-baseline.md`。该切片尚无环境 blocker、跨类别 RunReport、完整事件状态机、attempt/lease、`next` 和复检门禁,相关 9.3–9.14/11.16 仍未完成。 + +## 2026-09-25 白名单纠错规则体系补充 + +在既有精确误报白名单设计上,明确了白名单只位于原生 finding 之后的处置层、单点误报与系统性规则误报的不同纠正路径,以及候选/驳回/批准/过期/撤销/失配与稳定任务的关联。OpenSpec 增加系统性误报和撤销反例,tasks 新增 4.10;白名单前原始发现与人工裁定仍纳入误报/漏报评测。本轮为设计与规格更新,未改变 Rust CLI 行为,可信批准、纠错事件流与真实门禁仍未实现。 + +`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。 + +## 2026-09-25 Ruff 环境 blocker 持久归并 + +相邻 Rust CLI 的 `work sync` 对 Ruff 局部 `incomplete` 文件新增稳定环境 blocker:同构建根、同原因归并多个文件,不同构建根分别建任务;每轮观察事件保留受影响路径。缺工具与缺配置的真实 CLI 反例产生环境准备任务,不伪装成源码违规或质量通过。同步预览 schema 升至 0.2,新增 blocker record/event schema;`lint python` 对话反馈的 `backlog_sync` 新增 `new_blockers`。详见相邻 `codeguard-cli/tests/acceptance/work-sync-ruff-blockers.md`。 + +`work_sync_contract` 7 项普通测试及固定 Ruff 0.16.8 的 2 项显式原生测试、Rust 全工作区测试、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均通过。跨语言工具链依赖、正式任务依赖图、复检关闭和完整门禁仍缺,9.3/9.6/9.7 保持未完成。 + +## 2026-09-25 本地只读 next 简报预览 + +相邻 Rust CLI 新增 `codeguard next [path] --format human|json`,从工作区 Ruff finding/blocker 事实生成结构化局部简报。未初始化提示 init;未消费报告先提示 sync;任务空但无全量认证证据时返回 verification_required。缺配置要求决策,缺工具指向环境准备;源码内容变化后不再推荐旧修复步骤。任务 Markdown 自由文本不进入简报,损坏事实和消费标记不能被解释成可交付。协议固定 `authority=local_unverified`、`delivery_decision=not_evaluated`;成功 exit 0 只表示视图完整。见相邻 `codeguard-cli/tests/acceptance/next-local-brief-preview.md`。 + +`next_command_contract` 6 项、Rust 全工作区测试、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均通过。完整 status/show、任务依赖/租约/attempt 预算、版本化 recipe、跨类别选择及任务关闭仍缺,9.7、9.13、9.26 保持未完成。 + +## 2026-09-25 Python 扫描自动返回局部简报 + +相邻 Rust `lint python` 现在复用 `next` 的只读服务,在已初始化工作区的本地报告保存与同步成功后,直接把结构化下一步放入同一 CLI 对话反馈。公开版本为 0.5,私有本地报告仍为 0.4;失败时分别呈现 backlog 与简报读取状态,不丢原生诊断。缺配置的普通 CLI 测试得到 needs_decision;固定 Ruff 0.16.8 的真实 F401 扫描在同一响应中得到 actionable 简报。见相邻 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md`。 + +`lint_python_cli` 8 项普通与 3 项显式原生 Ruff 测试通过;这仅证明 Rust CLI 内的 Python/Ruff 局部链,插件 Hook/MCP、多语言检测族、可信策略与完整交付门禁仍未完成,9.13/11.16 不勾选。 + +## 2026-09-25 Ruff 任务原工具复检观察 + +相邻 Rust CLI 新增 `codeguard task verify `,复用公开 Python/Ruff 的同一原生扫描路径,保存本轮局部报告、同步新发现,并为原任务追加 `verification_observed` 事件。`next` 核对任务、工作区、事件和报告摘要后,才将原问题缺失或环境恢复显示为待策略核验候选;再次扫描检出问题会恢复待处理指引。本地忽略的复检报告在另一机器缺失时,不沿用未核验的恢复结论。fact 始终 open,CLI 固定 `local_unverified`、`not_evaluated`、退出 3,不能因此签发白名单或关闭任务。 + +`task_verify_contract` 的 5 项普通测试、固定 Ruff 0.16.8 的 2 项显式原生测试、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check` 均通过。见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`。可信工具/规则/覆盖、任务租约与 token、正式 resolved/reopen、跨类别复检仍缺,9.10 保持未完成。 + +## 2026-09-25 白名单候选缺证据边界 + +复核现有 `codeguard/findings` Ruff fact 与误报候选 schema 后确认:fact 只存首次规则、路径和发现指纹,缺本轮工具制品、适配器、rulepack 身份,不能安全拼成可批准候选。已在白名单设计、rulepack-governance、unified-cli-contract 与任务 4.9 固化 `propose` 的前置条件和反例:证据不全返回未完成及补证据动作,不猜测摘要、不写候选、不改变门禁。`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 通过。此时只更新规格;命令预览进展见下一节。 + +## 2026-09-25 白名单 propose 缺证据预览 + +相邻 Rust CLI 已实现 `rules whitelist propose [path]` 的保守入口:读取稳定任务并返回复检命令与本轮缺失的工具/适配器/rulepack 身份;环境 blocker 和未知任务不能产生候选。输出协议固定 `candidate=null`、`authority=unverified`、`gate_effect=none`、`not_evaluated`、退出 3,不写 decisions。目标测试先因命令不存在失败;实现后 2 项普通测试及固定 Ruff 0.16.8 的 1 项显式原生测试、Rust 全工作区测试、全目标 Clippy 和 fmt 通过。见相邻 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`。完整候选生成、批准来源与门禁仍未实现,4.9 保持未完成。 + +## 2026-09-25 Ruff 完整文件的工具与配置观察摘要 + +相邻 Rust 扫描结果仅对原生证据完整且输入稳定的文件携带本轮工具/配置字节 SHA-256;扫描结束后再复核工具,身份变化使相关文件 incomplete 并清空摘要。公开反馈 0.6、本地持久报告 0.5;同步器兼容旧 0.4,但新版完整文件缺有效摘要或未完成文件虚报摘要均拒绝导入。局部 `next` 接受两版复检报告,保留原任务 open。`lint_python_cli` 8 项普通/3 项真实 Ruff、`python_lint_scan_contract` 5 项普通/3 项真实 Ruff、`work_sync_contract` 8 项普通及 `task_verify_contract` 5 项普通/2 项真实 Ruff 测试通过;全 Rust 工作区测试、Clippy、fmt 与 JSON 语法检查通过。见相邻 `codeguard-cli/tests/acceptance/ruff-observed-artifact-identity.md`。这不是可信工具批准;适配器、rulepack、候选绑定及完整门禁仍缺,相关 4.8/4.9/5.2/9.10 保持未完成。 + +## 2026-09-25 propose 最新本地观察绑定 + +相邻 Rust `rules whitelist propose` 预览升至 0.2:只选择最新的本地 Ruff 报告,先核对工作区、结构化报告、当前源码与已同步标记,再展示同一稳定 finding 的报告/源码/工具/配置摘要。真实 Ruff 测试先因旧预览不含观察而失败;实现后覆盖最新观察、较新报告未同步、源码变化及新扫描问题消失,均不会用旧记录生成候选。2 项普通与 1 项真实 Ruff 目标测试通过。`candidate=null`、退出 3、`not_evaluated` 保持不变;`rulepacks/` 当前只有旧语言清单,不能用配置摘要冒充受批准 Ruff rulepack,适配器及可信批准身份仍缺,4.8/4.9/12.12 不勾选。见相邻 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`。 + +## 2026-09-25 Ruff 候选规则映射观察身份 + +相邻 Rust 工程加入 `rulepacks/ruff_lint_preview_v1.json`,精确映射 Ruff 0.16.8 的 F401/E501,记录版本、来源、许可、原生/CodeGuard 规则 ID 与原始字节 SHA-256,状态固定 `candidate_unapproved`。解析拒绝通配、重复、错误来源/许可和自批准。完整局部报告 0.6 仅在版本匹配且 finding 原生规则已映射时附观察身份;未知规则及版本不匹配仍保留原生诊断但无映射。同步器拒绝改写映射摘要;公开反馈为 0.7。`propose` 0.3 从最新已同步、源码及配置未变的报告展示该观察,并明列 `approved_rulepack_identity` 缺失,固定 `candidate=null`、门禁 none、退出 3。见相邻 `codeguard-cli/tests/acceptance/ruff-rulepack-observation.md`。 + +`ruff_rulepack_contract` 3 项、`work_sync_contract` 普通测试、`lint_python_cli` 8 项普通与 3 项真实 Ruff、`whitelist_propose_contract` 2 项普通与 1 项真实 Ruff 均通过;Rust 全工作区离线测试、全目标 Clippy `-D warnings`、fmt、四个 JSON 文件语法检查、OpenSpec strict 和插件 `git diff --check` 通过。P3C 等未显式运行的原生忽略测试仍不计入本次证据。候选清单不配置 Ruff 覆盖,不具受保护批准或可信策略身份,4.3/4.8/4.9 均保留未完成。 + +## 2026-09-25 Ruff 原生设置与规则覆盖缺口 + +相邻 Rust runtime 在配置项目的 Ruff 0.16.8 扫描中新增 `check --show-settings` 原生步骤;受限解析器只提取 F401/E501 全局启用状态、是否配置逐文件忽略和设置输出摘要。公开反馈升为 0.8、本地报告升为 0.7;二者均明确 `coverage_proven=false`。设置输出损坏或找不到、规则未启用却返回相应诊断时,局部扫描 incomplete 并保留已有诊断。同步器仅对 0.7 完整文件接受结构有效且不自称覆盖已证明的设置观察;缺失或伪称的报告拒绝导入。真实 Ruff 的 E501/F401、逐文件忽略及原任务复检链均通过,见相邻 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 + +适配器解析 2 项、局部扫描 6 项普通及 4 项真实 Ruff、同步 10 项普通、`lint_python_cli` 8 项普通及 3 项真实 Ruff、白名单 propose 1 项真实 Ruff、任务 verify 2 项真实 Ruff测试通过;Rust 全工作区离线测试与全目标 Clippy通过。`noqa` 与其它原生 suppression、批准 required rule 集合、完整目标覆盖及可信门禁仍缺,OpenSpec 5.4/7.2 保持未完成。 + +## 2026-09-25 Ruff 源码注释抑制原生对照与任务复检 + +相邻 Rust runtime 对配置项目的 Ruff 0.16.8 在普通 JSON 扫描后以同一总截止时间执行 `--ignore-noqa` 原生对照,校验工具/配置/源码、报告归属及普通诊断包含关系;损坏或矛盾的对照不能变成干净证据。公开反馈升为 0.9、本地报告升为 0.8;仅被注释抑制且无活动 finding 的文件标记 `suppressed`,公开展示对照摘要、抑制数和规则 ID,但抑制诊断不生成活动 finding。`task verify` 预览/事件升为 0.2:原 F401 添加 `# noqa: F401` 后返回 `suppression_requires_review`,`next` 要求核查抑制,原 fact 保持 open;真正移除违规仍只形成待策略核验候选。见相邻 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 + +固定 Ruff 0.16.8 原生样本已验证 `# noqa`、`ruff: ignore`、文件级注释抑制与无抑制行为;`python_lint_scan_contract` 5 项真实样本、`lint_python_cli` 4 项真实样本及 `task_verify_contract` 5 项真实样本通过。额外真实反例证明禁用原规则与新增逐文件 ignore 都不会被当成修复。同步器 0.8 缺抑制观察或伪称计数的反例通过。Rust 全工作区离线测试、全目标 Clippy `-D warnings`、fmt、三个更新 schema JSON 语法检查、OpenSpec strict 和插件 `git diff --check` 均退出 0;真实 human CLI 对 `# noqa` 显示 `suppressed`、抑制数 1、退出 3 和 `not_evaluated`。批准策略、逐文件配置忽略的精确目标归属、完整覆盖及正式交付门禁仍缺,4.2/5.4/7.2/9.10 不勾选。 + +随后收紧 0.8 本地报告导入:`suppressed` 必须有非零抑制差额且无活动 finding,普通 `passed` 不能隐藏抑制;旧报告不能凭新增状态绕过。合法 `suppressed` 可同步但不产生新活动 finding。`work_sync_contract` 11 项普通测试和全目标 Clippy 通过;这项校验不把本地报告提升为可信交付证据。 + +## 2026-09-25 C06 只读计划预览 + +相邻 Rust CLI 新增 `codeguard plan <类别|check> <语言|all> [path]`,优先校验类别与 canonical 语言 ID,然后复用静态项目发现。预览 0.1 列出选中类别、语言、检查器配置、待定候选和未解析条件;`policy_identity=null`、`obligations=[]`、候选命令 null,固定 `not_evaluated` 与退出 3。它不伪造正式 CheckPlan、批准规则或原生执行能力。见相邻 `codeguard-cli/tests/acceptance/plan-readonly-preview.md`。 + +目标测试先因命令缺失失败;实现后首 2 项通过,含伪造 Ruff 工具不执行、项目目录不新增文件、非法类别与未知语言在观察前返回 2;随后增补 P3C 静态候选反例,现为 3 项。`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all` 与新 schema JSON 语法检查通过。可信策略、完整义务/DAG、工具锁和正式计划身份仍缺,2.1/2.4/2.7 保持未完成。 + +## 2026-09-25 Maven P3C 静态配置独立识别 + +相邻 Rust `detect` 将 `java.maven.p3c` 与通用 `java.maven.pmd` 分开。明确的 P3C 2.1.1 制品依赖、已核对的内置规则路径和 `skipPmdError=false` 形成静态 configured;缺项、动态值和处理错误跳过有独立状态及恢复动作。测试先因没有 P3C 检查器项失败,随后 `detect_cli` 的正反例及 `plan_preview_cli` 的 Java 候选测试通过。见相邻 `codeguard-cli/tests/acceptance/maven-config-discovery.md`。此处只确认直接 POM 声明,未验证 Maven effective model 或原生规则运行,5.10/6.2 保持未完成。 + +全工作区测试首次指出不可读 POM 的静态检查器数由 6 增至 7;修正该旧断言后全工作区测试退出 0。随后补齐父 POM 下直接 PMD 声明的保守 unknown 反例,定向 `detect_cli` 16 项与 `plan_preview_cli` 3 项、全目标 Clippy、OpenSpec strict、插件 `git diff --check` 均通过。此补充没有重新执行显式 ignored 的原生 Maven/P3C 哨兵,不将静态配置探测当作原生运行证明。 + +## 2026-09-25 冻结义务清单对照 + +相邻 Rust Core 的交付判定增加应有义务 ID 与实际计划的集合对照。新的反例先证明旧代码会在遗漏 `java/cve` 时给出 `Allow`;实现后漏项、额外项与重复冻结 ID 都为 incomplete,`conclude_check` 还把漏项带到请求退出 3。见相邻 `codeguard-cli/tests/acceptance/frozen-obligation-ledger.md`。这只是纯领域一致性校验,可信清单来源及正式 CLI 接线未实现,OpenSpec 2.4 保留未完成。 + +`delivery_gate_contract` 14 项、`check_session_contract` 6 项及 `cargo test --workspace --offline -q` 全部通过;`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 退出 0。显式 ignored 的原生外部工具测试不计入此轮执行证据。 + +## 2026-09-25 C09/C10 只读配置观察与白名单自授权隔离 + +相邻 Rust CLI 新增 `config validate/explain [path]` 的保守入口:有界只读解析旧 `codeguard.json` 和结构化工具锁,计数并标记旧 `exclude`、`gate_scope=delta`、`java.commands` 为待批准迁移;未知/损坏字段、坏工具锁和符号链接为未完成。项目内伪造 `codeguard/decisions/` 批准无效。输出协议 `config_inspection` 0.1 固定 `authority=unverified`、`gate_effect=none`、`effective_policy=null`、`not_evaluated` 与退出 3。目标测试先因命令缺失失败,实施后 6 项通过,见相邻 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`。 + +`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 均退出 0。完整可信质量策略、正式 config schema 迁移、原生配置差异、白名单独立审批和真实交付门禁未接通;4.1、4.2、4.5、4.7、4.9、12.12 均保持未完成。 + +## 2026-09-25 质量策略候选协议与工具锁引用 + +相邻 Rust CLI 增加 `quality-policy-candidate` 1.0 严格解析与 `config validate/explain --policy-candidate FILE` 只读展示。候选要求非空必需检查、已登记语言/检测族、具体规则与源集、阻断严重度、规则包/工具锁摘要、CVE 库时效和测试要求。候选源码排除限定精确单文件路径、内容摘要、结构化原因和到期字段;未知字段、自写批准、通配/路径穿越、重复或空义务均拒绝。工具锁原始字节相符显示 `matched_untrusted`,失配显示 `mismatch`,均不赋予策略权威。`config_inspection` 升至 0.2,含请求 ID、命令状态与警示,固定 `effective_policy=null`、`gate_effect=none`、退出 3。设计与测试见相邻 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`。 + +新增 7 项质量策略候选测试与 6 项配置观察测试通过;最终代码状态的 `cargo test --workspace --offline -q` 全工作区回归、全目标 Clippy、fmt、两个 JSON schema 语法检查、OpenSpec strict 与插件 `git diff --check` 均退出 0。部分依赖外部原生工具的测试按显式 ignored 保持未运行,不能算本轮验收。可信基线/批准来源、同 PR 策略变更隔离、有效策略绑定、逐项原生配置差异、规则/覆盖和交付门禁仍缺,4.1、4.5、4.7、4.9、12.12 不勾选。 + +## 2026-09-25 公开 Java P3C 单文件原生诊断 + +相邻 Rust CLI 新增 `lint java FILE` 局部入口,用固定的 Maven PMD 3.11.0/P3C 2.1.1/PMD 6.15.0 配置,在私有临时项目中复制单个 Java 输入并通过统一 runtime 调用原生 Maven;固定 `-o` 和显式离线仓,前后复核源码、复制件、POM/settings、Maven/JDK 入口及仓库树。公开只展示规则/规则集/位置,不回显原生消息。结构报告 `java_p3c_local_feedback` 0.1 固定 `coverage_proven=false`、`checker_identity=unverified`、`delivery_decision=not_evaluated`、退出 3。假 Maven 退出 0 却不生成报告、错误仓库摘要及复制源码被修改均为未完成。 + +本机 4.4 GiB 通用 Maven 仓超过运行时 512 MiB 树预算,故从已缓存制品复制出 340 MiB 测试仓,并在 `-o` 下先验证真实 Maven 生成含 `ClassNamingShouldBeCamelRule`/`AlibabaJavaNaming` 的 XML。其观测树摘要为 `ead9fd901ba10e3bddf60cc3543b64839d7650f967326b2c94b9442d556cedef`;以该临时仓显式运行 `java_p3c_cli` 的两个原生 ignored 测试,违规样本返回结构化 finding,干净样本返回 `clean_scope_unproven`,两者均退出 3,测试退出 0。原生测试仓和显式摘要只是本地观察,不构成独立批准或离线网络隔离证明。详见相邻 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`。 + +正式多模块扫描、有效项目原生配置/覆盖证明、工具与规则批准身份、finding/task 同步、Java 注释/CVE/安全/构建及 `check java/check all` 仍缺;5.4、6.2、6.6、6.7 保持未完成。 + +进一步用同一 340 MiB 仓和 JDK 26 显式复跑原有 `p3c_native_replay --ignored`:违规、干净和坏规则集三项原生哨兵及执行前后树摘要均通过。新增 Java 分派首次全工作区回归暴露 Python `lint` 参数截断;已修正分派,并把未知语言反例改为 Ruby。修正后 Python 与 Java 两组目标测试、最终代码的全工作区离线测试、全目标 Clippy、fmt、JSON schema 语法检查、OpenSpec strict 和插件 `git diff --check` 退出 0。随后仅调整 human 输出去掉 JSON 引号,目标测试与 Clippy 再通过;真实 human CLI 在最终代码上显示 `Bad_Name.java:1 ClassNamingShouldBeCamelRule` 与未核验提示,命令退出 3。未把任何局部结果算作交付允许。 + +## 2026-09-25 误报白名单撤销快照切片 + +相邻 Rust `approval-snapshot` 增加 1.1 协议与必填 `revoked_decision_ids`。被撤销的决策即使其原字节摘要还在快照中也返回 `Revoked`;同一修订可固定替代候选,重复/通配撤销 ID、1.1 缺字段及 1.0 越权添加撤销字段使快照无效。旧 1.0 快照仍可读取。目标测试先因缺 `Revoked` 变体编译失败,实施后 10 项通过;全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。撤销表达仍只证明本地快照与候选输入之间的关系;可信快照来源、修订历史事件、独立批准、真实门禁和任务重开未接通,4.8、4.10、12.12 仍未完成。 + +## 2026-09-25 重复扫描的本地证据与审计事件去重 + +相邻 Rust `work sync` 修正同一 Ruff finding 的重复扫描证据:每轮当前源码匹配的发现都在默认忽略的 `state/observations//.json` 记录报告与源码摘要、位置和工作区身份;相同内容不重复改 tracked finding/task/event。复检后重新检出只增加一次恢复观察事件,后续相同扫描继续记本地证据。坏报告、过时源码仍不生成当前问题或认证。目标测试先因缺第二轮观察失败,复检去重反例先因第四轮多出事件失败;实现后十轮扫描只保留一个问题、一个任务、一条首次事件与十份本地观察,复检后重现只多一条事件,消费标记丢失重试幂等。 + +`work_sync_contract` 12 项普通测试及固定 Ruff 0.16.8 的两项原生测试通过;最终状态的全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。当前本地观察不作为可信规则/工具批准或交付证据,跨语言同步、重命名、父事件关系、并发事务与正式关闭仍缺,9.3–9.5 保持未完成。 + +## 2026-09-25 Unix 本地任务租约基础 + +相邻 Rust CLI 新增 `task claim/heartbeat/release`:在 runtime 的独占文件锁下,以稳定任务 ID 串行化本地状态;32 字节随机 token 只返回领取者,本地仅保存 token SHA-256,generation 防止同名 owner 的旧 token 操作新租约。默认期限 5 分钟,释放同 token 可幂等重放,过期且没有公开 attempt 状态时可被新一代领取。无效任务不建锁、符号链接状态拒绝、四进程并发只有一个领取成功;锁繁忙立即返回未完成,不无限等待;所有输出均固定 `local_unverified`/`not_evaluated`。目标测试初次因命令不存在失败,随后 6 项通过。首次全工作区测试暴露 CLI 直接依赖 libc 违反 crate 方向;已将文件锁移至 runtime,crate 边界测试与全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict、插件 `git diff --check` 均退出 0。之后补充非阻塞锁目标测试及 Clippy 通过;全工作区需在最终状态复跑。 + +最终非阻塞锁改动后的 `cargo test --workspace --offline -q` 再次退出 0。以上还不是 S09 租约验收:未结束 attempt 的过期接管与 abandoned 事务、token 绑定的 verify/fix、Windows 实现及跨机器行为均未完成,9.8、9.9、9.10、9.27 保持未勾选。详见相邻 `codeguard-cli/tests/acceptance/task-lease-local.md`。 + +## 2026-09-25 Unix 修复尝试与无进展预算切片 + +相邻 Rust CLI 新增 `task attempt start/finish`,并将 RepairBrief 接到受控 action-id 和本地历史。首次定向测试因 action-id/attempt 命令不存在而失败;实现后 13 项 `task_lease_contract` 通过,覆盖错误 token、动作改名、不可重复 open attempt、未结束拒绝 release、同结果 finish 重放、矛盾的 no-change、两次同输入无进展停止推荐、过期接管先记 abandoned、旧 token 不能改写,以及环境 blocker 不改源码仍可进入待复检。新事件采用不可覆盖的 start/finish 文件;事件/响应和扩展简报各有版本化 schema。`cargo test --workspace --offline`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。详情见相邻 `codeguard-cli/tests/acceptance/task-attempt-local-ledger.md`。 + +该切片仅记录任务受影响路径的字节变化,不等同完整 patch 或环境工具身份;`ready-to-verify` 不证明原检查器复检或受保护规则覆盖,正式 fix 自动登记、verify 租约绑定、Windows 等价实现与故障注入矩阵仍缺。真实 Ruff/P3C 原生验收未因这组本地契约测试自动完成,9.8、9.9、9.10、9.27 继续未勾选。 + +## 2026-09-25 task verify 租约绑定 + +相邻 Rust CLI 的 `task verify` 新增 Unix 本地租约预检和提交前再核验。无占用时短期自领并在复检后释放;已有占用时只借用匹配的 owner/token,错误 token 和未带凭据的冲突请求在调用原生扫描前返回 3,借用结束不释放别人的租约。定向测试先因缺 `--owner` 参数与自有租约而失败,实现后 `task_verify_contract` 普通 7 项及 `task_lease_contract` 13 项通过。固定 Ruff 0.16.8 的显式原生复检 6 项通过,其中新增真实 finding 下错误 token 不产生 native_scan/新报告、正确 token 保留 active 借用租约的样本,详见相邻 `codeguard-cli/tests/acceptance/task-verify-lease-binding.md`。可信身份、长操作自动续租与取消、Windows、正式任务关闭/重开仍缺,9.10 不勾选。 + +最终状态下 `cargo test --workspace --offline`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 均退出 0;工作区默认测试不包含显式 ignored 的原生样本,上述 6 项 Ruff 用例已单独运行。 + +## 2026-09-25 attempt 与原工具复检关联 + +此前 `ready-to-verify` 可在没有新复检的情况下再次 start,绕开无进展预算。现由验证事件 0.3 记录对应 attempt-id;下一次 start 在该尝试没有可核对原工具报告时返回 `verification_required_before_retry`。同一输入的复检仍显示问题或检查未完成时计入预算;复检确认问题不再出现时清除等待,但仍不自动关闭 finding。丢失 Git 忽略的本地原报告后旧事件不作为复检凭据,重新运行原工具可恢复。定向契约测试先因缺这项约束失败,随后新增的等待/两次复检预算/报告丢失恢复用例通过;本机 Ruff 0.16.8 显式原生复检 7 项通过,新增修复后任务仍 open 的实测样本。完整 patch/环境身份、可信规则覆盖、正式关闭/重开和跨平台语义仍缺,9.9/9.10 不勾选。 + +最终状态下 `cargo test --workspace --offline`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。默认工作区测试未包含显式 ignored 的真实 Ruff 样本;7 项原生复检已单独执行。 + +## 2026-09-25 源码变化后的复检状态转换 + +修复 `next` 对同一问题的状态死角:源码变化先要求复检;`task verify` 原生 Ruff 仍检出同一稳定 finding,且报告中的目标源码摘要与当前文件一致时,简报恢复 `actionable`,展示复检观察和 run/report 摘要;复检后源码再变则重新要求复检。`task attempt start` 只接受当前 actionable 简报,防止借租约绕过复检继续修改。两个定向测试先分别因旧行为失败,再在实现后通过;其中一个使用固定 Ruff 0.16.8 的真实原生复检。最终 `cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 及插件 `git diff --check` 均退出 0。该局部状态仍不关闭 finding、不产生交付认证;9.7、9.9、9.10、9.27 仍未完成。 + +误报白名单另有独立的精确处置规格与 4.8–4.10、9.28、12.12 验收任务。当前未将本次复检观察用于白名单批准或放行;可信审批、本轮完整身份及真实门禁仍缺。 + +## 2026-09-25 白名单替代候选与撤销的局部绑定 + +相邻 Rust 增加 `false-positive-decision` 1.1 替代候选协议:必须指明不同于新 ID 的 `replaces_decision_id`,1.0 仍拒绝该字段。`approval-snapshot` 1.1 绑定要求在同次快照撤销旧 ID;普通绑定在缺旧决策时返回未核验,专用绑定核对旧 ID、稳定 finding、原生检查器/规则/类别和精确目标归属,防止把一个目标的误报纠正扩到另一个目标。定向测试先因缺字段/返回类型编译失败,随后候选与快照共 24 项通过;全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。详见相邻 `codeguard-cli/tests/acceptance/whitelist-replacement-binding.md`。 + +这些是本地结构与字节绑定,不证明旧决策来自此前受保护修订,也未校验多级修订链无环、本轮复检引用或执行真实门禁。OpenSpec 4.10 和 12.12 继续未完成。 + +## 2026-09-25 白名单前序快照关系核对 + +相邻 Rust 新增替代候选的前序快照绑定:除同轮新候选与撤销集合外,还核对旧决策字节已列入另一份固定摘要的前序快照、旧决策声明的策略修订一致、前序未撤销且新旧修订不同。缺前序摘要、错误摘要、旧字节更改、前序撤销和同修订反例均拒绝绑定。定向测试先因前序接口缺失编译失败,随后 `approval_snapshot_contract` 14 项通过;最终 `cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。旧摘要来源和修订时间顺序仍须由受保护 CI/宿主证明,不能用本地生成的两份摘要自签授权;多级无环修订链、纠错 CLI、任务事件与真实门禁仍未完成,4.10/12.12 保持未勾选。 + +## 2026-09-25 白名单多跳修订链结构校验 + +相邻 Rust 新增最多 32 跳的前序链绑定:从当前替代候选向前追溯至普通根候选,逐跳验证决策字节所属快照、前驱引用、同一 finding/精确目标、子快照撤销前驱、策略修订唯一及当时允许的最大有效期。完整 A→B→C 样本通过;截断、乱序、根后多余节点、重复 ID 成环及超长链拒绝。目标测试先因接口缺失编译失败,随后 `approval_snapshot_contract` 15 项通过;最终 `cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。 随后的 schema 审核移除了 check feedback 与纠错事件的跨文件相对 `$ref`,避免 URN `$id` 下引用不可解析;两个受影响的集成测试文件及 JSON 语法复核通过。可信快照来源、真实修订时间顺序、纠错命令/任务事件与实际门禁仍缺,4.10/12.12 不勾选。 + +## 2026-09-25 白名单纠错只读提案 + +相邻 Rust `rules whitelist propose` 增加 `--correct-decision/--correction-reason/--verification-run` 及可选 `--replacement`。旧候选必须与稳定 finding 的 Ruff 规则/目标一致;run ID 必须绑定最近由 `task verify` 保存、事件及报告摘要可复核的原工具结果。原 finding 仍存在时可预览撤销,问题消失且复检后源码未再变化时支持 `root_cause_fixed` 仅撤销;错误 run、环境 blocker、扩大到其它文件、源码再次变化均不生成提案。替代草稿只展示 ID 与候选摘要,本轮观察可核对的源码/工具/发现指纹必须匹配,但由于适配器和已批准 rulepack 身份缺失,状态保持 `evidence_incomplete`。输出始终退出 3、`authority=unverified`、`gate_effect=none`,不写 `decisions/`、不关闭任务、不放行。 + +普通 `whitelist_propose_contract` 4 项通过(2 项需原生工具而默认忽略);固定 Ruff 0.16.8 的纠错端到端样本显式通过,`task_verify_contract` 的 8 项原生复检回归显式通过。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 最终退出 0。完整批准身份、可信旧决策来源、持久纠错事件/任务投影、原生跨语言复检与真实门禁仍缺,4.10/12.12 保持未完成。见相邻 `codeguard-cli/tests/acceptance/whitelist-correction-preview.md`。 + +## 2026-09-25 白名单纠错本地事件 + +相邻 Rust CLI 的 `rules whitelist propose --record` 在任务锁下重新核对原生复检与精确范围,把纠错提案写入稳定 finding 的追加事件目录。相同提案由内容摘要确定文件名,重放不重复;环境 blocker、证据过期和源码变化不能新增事件。事件与输出均为 `authority=unverified`、`gate_effect=none`,不触碰 `decisions/` 或交付门禁。原生 Ruff 端到端及普通契约测试通过;`next` 会在本轮复检引用仍匹配时给原稳定任务添加待审事件引用和 `needs_decision` 指引,过期事件不能占用当前任务。持久任务 Markdown 投影、可信批准和策略发布仍未实现,4.10 保持未完成。 + +## 2026-09-25 白名单领域门禁聚合 + +相邻 Rust Core 增加 `AllowlistDisposition` 和原始/已批准/活跃 finding 集合,以及独立的 `allow_with_exceptions` 交付决策与 `passed_with_exceptions` 请求结论。先写的反例揭露同一批准 ID 可跨两条 finding 复用、取消后仍保留 allow;修正后定向 `delivery_gate_contract` 18 项与 `check_session_contract` 8 项通过。过期、目标失配、自批、重复批准、混合真实阻断及不完整义务也保持不放行。当前数据仍由测试显式提供;真实 CLI 没有受保护批准输入,不能据此宣称白名单已经生效。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0;新增 serde 默认值后定向 26 项回归及 Clippy 再次通过。 + +## 2026-09-25 全项目检查局部入口 + +相邻 Rust CLI 初版新增 `check all` 0.1,复用现有 Python Ruff 原生扫描→本地报告保存→`work sync`→`next`;初版把其它语言/六类别称为未完成义务,这一语义已由下方 0.2 纠正。先写的测试因命令不存在失败;实现后普通 4 项、固定 Ruff 0.16.8 的 F401 原生样本显式通过。JSON/human 均保留配置、原生违规与未完成原因,固定退出 3/incomplete,不签发项目 allow。完整 RunReport、可信策略/工具锁、其余适配器及正式项目门禁仍缺,2.3/2.4/12.7 不勾选。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。 + +## 2026-09-25 `check all` 候选/义务边界纠正 + +复核 native-tool-adapters 与 verdict-integrity 规格后,发现初版 `check all` 把每个已发现语言的六类别称为“未完成义务”,会错误暗示所有候选检测器都是项目必需项。修订 `check_feedback` 为 0.2:`category_candidates` 仅是能力候选,`required_obligations=null`、`obligation_status=unresolved` 明示尚无可信策略;Ruff 原生失败为 `native_incomplete`,仅本轮局部扫描完整才为 `observed_unverified`。先改反例使普通测试失败,修复后普通与真实 Ruff 测试均通过。完整策略、冻结义务及正式门禁仍缺,任务保持未完成。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。 + +## 2026-09-25 `check all` 局部总预算接线 + +相邻 Rust `check all` 新增 `--timeout`(正整数加 ms/s/m/h,默认 30m、最大 24h),参数错误在原生执行前返回 2。参数解析后建立一次 `Instant` 截止时间,并传入已接入的 Ruff 版本探测与逐文件扫描;原生超时给出 `request_deadline_exceeded`,不生成局部完整证明,整体仍为 `incomplete`/退出 3。测试先证明原命令拒绝有效 `--timeout`,接线后 `check_all_partial_contract` 6 项通过、1 项默认忽略;固定 Ruff 0.16.8 的 F401 真实用例显式通过。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件 `git diff --check` 均退出 0。此切片尚未使发现、持久同步、简报和清理受到硬截止时间约束,也未统一 jobs、重试或其它命令预算;2.8 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 + +## 2026-09-25 `lint python` 检查类预算复用 + +相邻 Rust `check_budget` 现统一解析检查类 `--timeout`(默认 30m、最大 24h),`lint python` CLI 与 `check all` 共享同一参数契约;CLI 在参数解析后建立一次截止时间,传给 Ruff 版本探测与逐文件扫描。先写的原生探测超时用例因旧 CLI 拒绝有效 `--timeout` 失败;接线后 `lint_python_cli` 普通 10 项通过、4 项默认忽略,固定 Ruff 0.16.8 的原生 F401 反馈用例显式通过。非法预算在启动前返回 2,原生超时保留 `request_deadline_exceeded` 和 `not_evaluated`,无假通过。全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict、插件 `git diff --check` 均退出 0。任务复检、预算来源报告、持久 I/O/清理硬截止时间及其它命令仍未实现,2.8 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md`。 + +## 2026-09-25 `task verify` 局部预算与超时复检 + +相邻 Rust `task verify` 现复用检查类 `--timeout` 解析和默认 30m 截止时间,并将同一时间传入原生 Ruff 探测与逐文件扫描。先写的有效预算用例在旧 CLI 返回 2;接线后非法预算在获取租约前返回 2,超时扫描显示 `request_deadline_exceeded`,复检观察为 `incomplete`、不追加验证事件,自有租约释放,稳定任务保持待处理。`task_verify_contract` 普通 9 项通过、8 项默认忽略,固定 Ruff 0.16.8 的源码修复复检用例显式通过;全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 及插件 `git diff --check` 均退出 0。租约、持久 I/O、清理的硬截止时间与完整来源报告仍缺,2.8/9.10 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`。 + +## 2026-09-25 检查预算公开来源协议 + +相邻 Rust `check_feedback` 0.3、Python 对话反馈 0.10 与任务复检预览 0.3 新增严格的 `execution_budget`:最终 `timeout_ms`、`source=cli|builtin_default`、`enforcement=native_execution_only`。三个入口的默认 30m 和显式 100ms 路径都有 CLI 契约断言;前置任务不可用的复检 JSON 也保留来源字段。先改 schema 测试确认旧协议失败,再升级 schema/输出与消费者版本断言。原始 0.8 扫描报告保持独立;其它语言、项目/环境预算来源与全 I/O 硬截止时间仍待接线,不能把公开值当作完整预算验收。全工作区离线测试、全目标 Clippy `-D warnings`、fmt、固定 Ruff 0.16.8 的三个真实 CLI 样本、OpenSpec strict 和插件 `git diff --check` 均退出 0;前置任务不可用的新增断言随后单独通过。见相邻 `codeguard-cli/tests/acceptance/{check-all-partial-native,lint-python-auto-brief,task-verify-native-observation}.md`,2.8 仍未勾选。 + +## 2026-09-25 已登记超时环境变量优先级 + +相邻 Rust 三个局部入口现在只读取明确登记的 `CODEGUARD_TIMEOUT`,按显式 CLI > 环境变量 > 内置 30m 解析,公开 `execution_budget.source` 新增 `registered_environment`。先写的 `check all` 250ms 环境来源用例因旧实现仍取 30m 失败;实现后 CLI 覆盖、非法环境值在原生/租约前拒绝及两个其它入口的契约测试通过。非 UTF-8 环境值由解析拒绝;未登记变量不会改变预算。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、固定 Ruff 0.16.8 的 `check all` F401 样本、OpenSpec strict 与插件 `git diff --check` 均退出 0。项目运行默认值、jobs 和全部 I/O/清理总预算尚未实现;2.8 保持未完成。 + +## 2026-09-25 项目运行默认值及优先级 + +相邻 Rust 增加可选 `codeguard/runtime.json` 1.0,仅允许 `timeout`,有界普通文件读取并拒绝文件/父目录链接、错误协议、非法预算、过大文件及任何额外质量排除字段。三个局部入口在无显式 CLI 和已登记环境值时读取项目默认,公开反馈显示 `project_default`;截止时间从请求解析后开始计,不把配置读取成本重置掉。先写的项目默认测试在旧实现仍返回内置 30m 而失败;实现后 `check_all_partial_contract` 普通 10 项、`lint_python_cli` 普通 11 项、`task_verify_contract` 普通 10 项通过,其余真实工具用例保持显式运行。固定 Ruff 0.16.8 的 `check all` F401 样本现用项目默认 30s 并显式通过,原发现仍可见。全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。运行默认值不构成规则/白名单授权;jobs、跨命令预算及持久 I/O/清理硬截止时间仍缺,2.8 保持未完成。见相邻 `codeguard-cli/schemas/runtime-options.schema.json` 和 `tests/acceptance/check-all-partial-native.md`。 + +## 2026-09-25 `check all` 双语言局部原生观察 + +相邻 Rust CLI 新增 Cargo Clippy 机器报告解析和局部调用,`check all` 对适用的 Python/Ruff、Rust/Clippy 建立两个独立 DAG 节点。先写的 Rust 原生契约在旧 CLI 的 `--cargo-tool` 路径上失败;接线后普通目标测试 13+6 项通过、各 1 项原生用例默认忽略,真实 Cargo Clippy 临时项目的显式用例通过。混合项目测试验证 Python 工具缺失不吞掉 Rust 的有效诊断;编译错误、坏报告、缺 Cargo 工具都保持 incomplete,已解析的有效部分发现保留。human/JSON 反馈显示检查器配置观察、原生状态、Clippy 规则/位置和复检命令,`check_feedback` 升至 0.6,交付始终为 incomplete/退出 3。 + +变更后 `cargo test --workspace --offline -q` 退出 0;最后补充的人类可读输出和非零退出细分又经两个目标契约测试、真实 Cargo Clippy、全目标 Clippy `-D warnings` 与 fmt 检查通过。OpenSpec strict 和插件 `git diff --check` 通过。此结果只证明本地默认 features/all-targets 的局部原生观察;可信工具锁、批准规则包、完整 workspace/features、构建脚本隔离、Rust finding 任务同步、其它五类别及全格式门禁仍缺,2.3/2.8/3.4/7.1 均不勾选。见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 + +## 2026-09-25 Rust Clippy 任务同步与白名单自批反例 + +相邻 Rust CLI 的 `check all` 现在为已初始化工作区保存 Clippy 局部原生报告,将当前源码仍匹配的 finding 与缺 Cargo blocker 归并为稳定任务,并在 JSON/human 反馈返回 `next` 简报。重复扫描不复制任务;Rust `task verify` 尚未接通,明确返回 `rust_checker_verify_not_integrated`,原任务不会借 Ruff 复检关闭。新增反例在项目可写 `codeguard/decisions/` 写入 `approved=true` 后重新运行 Clippy,原始 finding 和修复任务仍可见,交付仍为 incomplete。这仅验证本地自批不会在当前局部链隐藏问题,不证明可信白名单已经生效。 + +目标契约测试先因 Rust 缺同步字段失败,接线后 `check_all_rust_native` 普通 9 项通过、1 项默认忽略,相关 `check_all_partial_contract`、`work_sync_contract`、`next_command_contract`、`task_verify_contract` 定向测试通过,真实 Cargo Clippy 临时项目显式通过。首轮全工作区测试仅在 SIGINT 时序测试未等到原生启动标记而失败;该测试单独重跑通过,第二轮 `cargo test --workspace --offline -q` 退出 0。全目标 Clippy `-D warnings`、fmt、JSON schema 解析、OpenSpec strict 与插件 `git diff --check` 均通过。工具/规则权威、跨类别义务、Rust 原工具复检、可信批准及正式交付门禁仍缺,4.8/7.1/9.3/9.10/9.13/12.12 保持未完成。见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 + +## 2026-09-25 Rust Clippy 原工具任务复检 + +相邻 Rust CLI 的 `task verify --cargo-tool ABS_PATH` 现在对 Rust Clippy finding/blocker 复用任务租约、项目发现、原生 Cargo Clippy、报告同步及 `verification_observed` 事件。`next` 按 checker 身份核对保存报告和事件摘要;同一发现仍在为 `still_present`,检查完成但未再报告时为 `rule_coverage_requires_review`,因为当前尚不能排除 `allow`、Cargo lints、特性组合及规则身份变化。环境任务恢复为 `environment_restored_unverified_policy`。任务事实始终 open,交付仍为 `not_evaluated`/退出 3;不存在 Rust 到 Ruff 的替代复检。 + +先修改的 Rust 任务测试因旧 CLI 不接受 `--cargo-tool` 而失败;接线后 `check_all_rust_native` 普通 10 项通过、2 项默认忽略,`task_verify_contract` 普通 10 项与 `next_command_contract` 6 项通过。显式真实 Cargo Clippy 样本确认持久任务复检先得到 `still_present`,再对源码加 `#[allow(clippy::needless_return)]` 得到 `rule_coverage_requires_review` 且 fact 仍 open。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings` 与 fmt 通过。可信工具/规则、Rust 原生抑制对照、完整特性覆盖、正式关闭/重开和跨平台租约仍缺,7.1/9.10 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 + +## 2026-09-25 Clippy 原生强制告警抑制对照 + +本机独立原生探针确认:同一带 `#[allow(clippy::needless_return)]` 的源码,普通 Cargo Clippy 零诊断,`--force-warn clippy::needless_return` 返回原规则诊断。相邻 Rust `task verify` 现在只在普通 Clippy 完整且原稳定 finding 消失时对该规则执行同截止时间的原生对照;把两轮脱敏报告、目标源码摘要、工具与 manifest 身份放入同一 0.3 本地报告。对照重现原 finding 为 `suppression_requires_review`,两轮均无发现为 `candidate_absent_unverified_policy`;对照坏报告、工具/manifest/源码变化或超时保持 incomplete。`next` 复核事件和报告摘要,源码再变化时要求重跑,任务不关闭;白名单和门禁不因本地观察生效。 + +先把真实抑制用例改为期望原生对照识别,旧实现失败;接线后 `check_all_rust_native` 普通 11 项通过、2 项默认忽略,真实 Cargo Clippy 复检用例显式通过,坏强制告警报告反例也通过。`cargo test --workspace --offline -q` 与全目标 Clippy `-D warnings` 通过。局部对照仍不证明受保护工具锁、完整 features/targets、批准规则覆盖或正式解决,7.1/9.10/12.12 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md` 和 `task-verify-native-observation.md`。 + +## 2026-09-25 Java/P3C 进入 `check all` 的局部原生观察 + +相邻 Rust CLI 的 `check all` 0.7 新增 `java.p3c` DAG 节点。Java 源文件根据最近 Maven 构建根的 P3C 配置逐份决定是否运行隔离的原生 Maven/PMD 探针;未配置的源码不会借其它模块的配置启动 Maven。文件级 JSON/human 反馈保留配置状态、原生原因、P3C 规则与位置。节点使用整轮截止时间和取消标志;原生探针仍只加载 P3C 2.1.1 命名规则集,故即使出现真实 finding,Java lint 候选仍标 `native_incomplete/p3c_naming_subset_only`,覆盖与交付保持未完成。 + +普通契约覆盖未配置不启动、已配置诊断可见及嵌套模块配置归属;显式真实 Maven/JDK 21 用例使用本机 340 MiB 固定离线仓,使 `Bad_Name.java` 的 `ClassNamingShouldBeCamelRule` 出现在 `check all`,命令仍退出 3。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、JSON schema 解析、OpenSpec strict 与插件 `git diff --check` 均退出 0。此局部接线没有完成 `check java`、全部 P3C/其它 Java 规则、finding→稳定任务→原工具复检、可信白名单/策略或代表性项目修复前后对照;2.3、3.4、6.2、6.7、9.13 均不勾选。证据见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 + +## 2026-09-25 Java/P3C 稳定任务与原工具复检 + +相邻 Rust CLI 的 Java/P3C 局部报告现在绑定已初始化工作区和本轮 run;`work sync` 从原生诊断生成稳定 finding,并将缺配置或原生前置条件按 Maven 构建根归并为 blocker。重复扫描只保留一张任务,`check all` 的 JSON/human 反馈显示同步状态及下一步。`task verify` 对 Java 任务重新运行原生 Maven/P3C,保存报告与 `verification_observed` 事件;原问题仍在返回 `still_present`,干净单文件报告仅为 `rule_coverage_requires_review`,配置恢复仍为 `environment_restored_unverified_policy`。任务事实保持 open、正式交付固定未评估;源码在复检和落盘之间变化时拒绝沿用观察。schema 已允许 Java 原生扫描对象。 + +`check_all_java_p3c` 普通契约 6 项通过、2 项真实用例默认忽略;显式真实 Maven/JDK 21 与固定离线依赖仓的两个用例均通过,包括初始化工作区复检后仍存在的原生 `ClassNamingShouldBeCamelRule`。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、JSON 语法、OpenSpec strict 和插件 `git diff --check` 退出 0。仍未验收 POM/源码并发变化的全部窗口、完整 P3C 规则覆盖、可信白名单批准、原生 suppression 对照、正式关闭/重开与完整 Java 门禁;2.3、3.4、6.2、6.7、9.3、9.10、9.13、12.12 保持未勾选。证据见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 + +## 2026-09-25 P3C 十规则集声明与第二规则正例 + +相邻 Rust CLI 的隔离单文件 POM 从 `ali-naming.xml` 扩展为 P3C 2.1.1 制品里的十个 `ali-*.xml` 规则集。公开本地反馈升至 0.2,列出声明清单与受控 POM SHA-256;`check all` 的 Java lint 原因改为 `p3c_declared_rulesets_unverified_coverage`,仍为 incomplete。固定 340 MiB 离线仓内的 P3C JAR 列出了全部十个资源;独立原生试跑同时检出 `ClassNamingShouldBeCamelRule` 与 `ClassMustHaveAuthorRule`。先在 CLI 真实用例中新增第二规则期望,旧单规则实现确实失败;扩展后,公开类 `Bad_Name` 同时检出两条,包内可见类没有作者注释诊断,原命名 finding 的任务复检仍为 `still_present`、fact 保持 open。两条真实 CLI 用例在 JDK 21、固定离线仓显式运行并通过。 + +这组证据证明两个规则在所测上下文真实触发,不能证明十个规则集全部规则均有效、项目 POM 的生效模型或全源集覆盖;可信工具/规则包批准和白名单门禁也未取得。局部报告始终 `coverage_proven=false`、交付未评估。OpenSpec 2.3、6.2、6.3、6.7 仍不勾选。详见相邻 `codeguard-cli/tests/acceptance/{java-p3c-cli-native-local,check-all-java-p3c-partial}.md`。 + +最终验证:本轮 `cargo test --workspace --offline -q` 退出 0;新增的声明清单与受控 POM 一致性契约另经 `java_p3c_cli` 目标测试通过,`check_all_java_p3c` 目标普通 6 项通过、真实 2 项显式通过。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0。全工作区默认测试跳过需要原生 Maven/JDK 的用例,真实 2 项是单独运行的验收。 + +## 2026-09-25 `check java` 局部语言选择 + +相邻 Rust CLI 新增 `codeguard check java [path]`,沿用 `check all` 的原生 Java/P3C DAG 节点、报告持久同步与任务简报。混合 Python/Rust/Java 项目只启动 Java 节点,只列 Java 候选;Java 简报按 checker 过滤已有其它语言任务。公开 `check_feedback` 升至 0.8,以协议条件绑定 `selection=java`、`delivery_decision=not_evaluated`、退出 3;`check all` 仍为全项目 `incomplete`。无 Java 目标明确 `java_target_absent_or_unobserved`,不从空选区推断通过。新增目标测试先因旧入口拒绝 `java` 而失败,实施后普通混合项目、现存 Python 任务和空 Java 目标反例通过;真实 Maven/JDK 21 固定离线仓的 `check java` 显式测试同时返回 `ClassNamingShouldBeCamelRule` 与 `ClassMustHaveAuthorRule`,交付未评估。 + +这仍是局部 P3C 观察,不证明 Javadoc、CVE、依赖、安全、构建等 Java 义务已实现,也没有可信策略、完整项目覆盖或交付 gate。OpenSpec 2.3、6.2、6.3–6.8 保持未完成。证据见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 + +最终 `cargo test --workspace --offline -q` 退出 0;`check_all_java_p3c` 普通 9 项、`check_all_partial_contract` 普通 13 项通过,真实 `check java` 用例另行显式通过。全目标 Clippy `-D warnings`、fmt、JSON schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认工作区测试跳过原生工具用例,真实 Maven 测试的通过只覆盖所述 JDK、离线仓与样本。 + +## 2026-09-25 P3C 项目规则集误报纠正 + +复核发现前述“项目真实 POM 命中两条规则”的结论混淆了配置发现和隔离探针:验收 POM 实际只启用 `ali-naming.xml`,探针却固定执行十个规则集,因此原作者注释诊断不能算该项目有效 finding。相邻 Rust CLI 现从已发现且摘要稳定的直接 POM 提取精确 P3C 规则集子集,构造仅含该子集的隔离 POM;扫描前后及任务复检/同步时核对项目 POM 字节。未知规则、动态/继承配置或 POM 变化保持未完成,不能借误报白名单掩盖适配器错误。无项目上下文的 `lint java FILE` 仍为十规则集的未授权局部诊断。 + +真实 Maven/JDK 21、固定离线仓的三个显式用例重新运行通过:只配置 naming 的 `check all` 不再报告 `ClassMustHaveAuthorRule`;同时配置 naming/comment 的 `check java` 报告两条原生规则;原命名任务 `task verify` 仍保持 open。普通反例新增未知规则集不启动 Maven和扫描中 POM 变化丢弃 finding。此修复仅减少局部观察的配置外误报,仍未实现可信白名单批准、完整生效 Maven 模型或 Java 交付门禁;OpenSpec 2.3、6.1、6.2、6.7、9.10、12.12 保持未完成。 + +## 2026-09-25 P3C 原生诊断规则归属与报告重放复核 + +相邻 Rust adapter 增加 P3C 2.1.1 的十个规则集、56 个规则 ID 的归属目录。对本地 JAR(SHA-256 `e7afec9340a0f30f56f4fdcd3b9c49e79ed24253719fcb9f457f5bcb43e54860`)只读提取 XML `name` 和各规则 ID,对照 Rust 目录,十组及 56 个 ID 完全一致。`java_p3c_command` 在生成 finding 前核对规则集已被本轮 POM 选择、原生 ruleset 名称和规则 ID 归属;错误归属只返回 `native_rule_outside_selected_rulesets` 与 incomplete。 + +持久化边界发现真实缺口:将已保存的有效 Java 报告改写 `ruleset` 并以新 run ID 重放时,旧 `work sync` 的定向测试先以 `failed_reports=0` 失败,证明它会接受改写。修复后,同步重新核对当前 POM 子集、探针 POM 摘要及每条诊断归属;改写 ruleset、声明子集或探针摘要的三份报告均导入失败,不新增 finding。adapter 目标测试、`check_all_java_p3c` 普通 13 项、Rust 全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict、JSON schema 语法和插件 `git diff --check` 均通过。最终代码上显式真实 Maven/JDK 21 固定离线仓的三项项目扫描与原工具任务复检也通过,仍固定交付未完成/未评估。此处只是局部低误报证据,不证明受保护 rulepack、全部规则执行覆盖或正式交付门禁;6.2、9.10、12.12 保持未完成。 + +## 2026-09-25 白名单身份失配解释 + +相邻 Rust CLI 的 `rules whitelist explain` 只读查询协议升至 0.3.0:对显式提供的候选与观察身份,列出源码/依赖目标、finding、原生规则及工具/适配器/rulepack 的**失配字段名**,并提供原工具复检、修复候选或核验独立批准的下一步动作;不回显观察值。先新增目标反例,旧实现缺字段且协议仍为 0.2.0,测试失败;实施后 `whitelist_command_contract` 8 项通过。`authority=unverified`、`gate_effect=none` 保持不变,查询不签发批准,也不把候选文件当成门禁授权。 + +本轮 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、JSON schema 语法、OpenSpec strict 和插件 `git diff --check` 均退出 0。需原生工具的默认忽略用例未由这次改动重新验收。可信本轮 finding、独立批准、期限与正式门禁仍缺,4.8–4.10、12.12 保持未完成;局部行为见相邻 `codeguard-cli/tests/acceptance/whitelist-candidate-inspection.md`。 + +## 2026-09-25 Maven Javadoc 原 POM 私有重放 + +此前 `check java` 的 Maven 多文件探针使用固定 POM,即使项目声明不同构建内容也会得到配置外的局部诊断。相邻 Rust adapter 现在只接受无继承、依赖、profile、模块、扩展或其它插件的简单静态 POM,直接固定 Javadoc Plugin 3.12.0 与 `doclint=missing`;Rust runtime 将原 POM 和显式 Java 文件同批快照复制到私有新目录,核对与配置发现一致的 POM 字节摘要,并在原生命令后复核原件及副本。其它 POM 在运行前返回 `project_pom_replay_ineligible`,不以合成 POM 替代。公开 `check-feedback` schema 同步描述现有 `java_javadoc` 0.2 多文件字段及原 POM 模式。 + +adapter 正反例覆盖简单/命名空间 POM、父 POM、动态属性、其它插件、DTD、未知配置与重复字段;CLI 单元反例确认复杂 POM 及发现后 POM 摘要变化不会启动原生探针。真实 Maven 3.9.16、JDK 21、固定离线仓的两文件违规和修正样本显式重跑通过,报告 `native_plan_sha256` 等于项目 POM 字节摘要;修正后的干净日志仍为 `clean_log_unverified`。有效 Maven 生效模型、完整类路径/源集、生成源码、可信规则策略和交付门禁尚未证明,6.3 保持未完成。局部验收见相邻 `codeguard-cli/tests/acceptance/maven-javadoc-multifile-probe.md`。 +## 2026-09-25 Java 依赖、CVE 与安全检查器配置反馈 + +相邻 Rust CLI 的 `check java`/`check all` 现按 Java 源码最近构建根,分别反馈 Maven Dependency、OWASP Dependency-Check、FindSecBugs 的静态声明状态、检查器身份和下一步。已声明但未执行的检查器为 `native_incomplete`,缺失声明为 `not_configured`;动态或混合模块配置保持 `configuration_unresolved`,Gradle 和 Maven/Gradle 混合项目不冒称 Maven 检查器。FindSecBugs 依赖要求完整 groupId/artifactId,避免同名伪依赖造成“已配置”误判。原生依赖图、CVE 数据时效和安全扫描尚未接入,交付保持 `incomplete`,OpenSpec 6.8 不勾选。 + +本轮 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、反馈 schema JSON 解析、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。普通测试通过,显式要求真实 Maven/JDK 等工具的 ignored 用例不计入本轮验收。白名单仍只在精确 finding、原生复检、独立批准和有效期限齐备后才允许例外;这轮配置反馈既不产生漏洞扫描结论,也不提供白名单授权。 + +## 2026-09-25 Maven 原生依赖图解析基线 + +相邻 Rust 适配器新增 Maven Dependency Plugin JSON 依赖树解析。4 项目标契约先因接口缺失失败、实现后通过;显式真实测试用 Maven 3.9.16 离线调用插件 3.8.1,JUnit 4.13.2 → Hamcrest Core 1.3 的边与组件版本均可解析。官方格式依据见 [Maven Dependency Plugin 文档](https://maven.apache.org/plugins/maven-dependency-plugin/examples/tree-mojo.html)。解析器不运行 CodeGuard 原生任务,也不形成漏洞结论;隔离调用、项目生效模型、私服/动态版本、CVE 数据库身份和对话反馈仍缺,6.8 不勾选。目标验收见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-native-parser.md`。 + +本次修改后 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0;真实 Maven 用例另以 `--ignored` 显式运行通过。全工作区普通测试并不包含被忽略的其它原生工具用例。 + +## 2026-09-26 Maven 依赖图原生 `check java` 接线 + +相邻 Rust CLI 0.11 在 Java 项目中将已声明的 Maven Dependency Plugin 作为独立 DAG 节点,使用私有原 POM 快照、显式 Maven/JDK/离线仓库树摘要运行原生 `tree`,把节点与传递边反馈到 JSON/human。配置缺失、POM 不适合静态重放、工具/仓库/原 POM 不稳定或报告不完整均保持未完成。真实离线测试揭示 Maven 的 `BUILD SUCCESS` 可伴随 POM 缺失警告并漏掉传递依赖;新增日志反例使这种结果返回 `native_dependency_resolution_warning`,不把图当作完整。随后在约 420 MiB 的测试专用离线闭包中对齐 JUnit 元数据来源,Maven 3.9.16/JDK 21 真实 `check java` 用例确认 JUnit→Hamcrest 原生边可见,CVE 类别仍未验证。此为局部原生观察,未认证项目全量依赖治理、漏洞匹配或交付。见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-check-java.md`。 + +本轮全工作区 `cargo test --workspace --offline -q` 退出 0;之后因 Clippy 指出的同分支重复而合并条件,相关 `check_all_java_p3c` 21 项普通测试和 `check_all_partial_contract` 13 项普通测试复跑通过。全目标 Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict、插件 `git diff --check` 均退出 0。真实 Maven 用例需显式 `--ignored` 和经准备的离线仓库;最初缺闭包、随后镜像来源不一致的失败也保留为诊断证据,不计作通过。 + +## 2026-09-26 无源码 Maven 依赖构建根调度 + +复核 `check java` 发现依赖任务曾以 `.java` 源码存在为前提,因此只有 POM/依赖声明的项目完全没有依赖图任务;父根有 Java 源码而子根无源码时也会漏掉子 POM。新增 CLI 反例先失败,再改为按每个静态确认配置了 Maven Dependency Plugin 的构建根调度,候选结果显式给出 `java.maven.dependency`、`native_incomplete` 和缺少原生前置条件。`check all` 同样保留该任务;P3C/Javadoc 仍由源码存在决定。无源码不再等于无依赖义务,缺 Maven/JDK/离线仓库时不会生成空图通过。 + +定向 `check_all_java_p3c` 23 项普通测试通过、6 项需要原生工具的用例保持忽略;全工作区 `cargo test --workspace --offline -q` 在功能改动后退出 0,随后仅将空源码集合改为具名局部变量,定向测试再通过。全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。该修复只补静态已配置构建根的调度,未证明 Maven 生效多模块模型、动态版本、许可证、SBOM、CVE、可信执行边界或交付门禁,OpenSpec 6.8 仍未完成。 + +## 2026-09-26 OWASP Dependency-Check JSON 解析基线 + +相邻 Rust adapter 新增有界 OWASP JSON 1.1 解析器,依据官方 `jsonReport.vsl` 的 `scanInfo`、`projectInfo`、`dependencies`、活动与原生抑制漏洞字段。目标测试先因接口缺失失败;实施后又添加重复 `dependencies` 键反例,旧解析会以后值覆盖前值并通过,现递归拒绝所有重复 JSON 键。坏 schema、缺依赖数组、分析异常、错误标志、坏组件摘要、坏漏洞 ID/分数均返回解析错误;无评分漏洞、原生 suppression 和空数据源保留为事实,不推导为清洁或数据库新鲜。输出不保留原生文件路径。 + +`cargo test -p codeguard-adapters --test owasp_dependency_check_contract --offline -q` 5 项通过;全工作区 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 diff 检查均退出 0。默认测试不含需真实 OWASP 插件及漏洞库的原生验收。尚缺本轮原生执行、数据库时效、Maven 图归属、对话结果和正式门禁;OpenSpec 6.4/6.8 保持未完成。局部范围见相邻 `codeguard-cli/tests/acceptance/owasp-dependency-check-json-parser.md`。 + +## 2026-09-26 OWASP 与 Maven 图精确归属候选 + +相邻 Rust adapter 新增独立归属函数:只有 OWASP 包标识中的唯一 Maven PURL 与原生 Maven 图中唯一非根节点的 group/artifact/version/type/classifier 完全一致,才返回坐标候选及节点索引。错误版本、组、类型、classifier、缺 PURL、未知/私服限定符、多个冲突标识及图中重复坐标均不能归属;原生 suppression 仍由漏洞观察保留。先写的接口契约因缺函数而失败,实施后目标 3 项测试通过。它只证明报告与图的精确坐标关系,不能证明两份报告来自同轮可信执行、制品摘要相同、漏洞库新鲜或 CVE 真实有效。真实 OWASP 调用、对话反馈与门禁仍未接线,6.4/6.8 保持未完成。见相邻 `codeguard-cli/tests/acceptance/owasp-maven-attribution.md`。 + +本轮 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0。普通测试中的 ignored 原生用例未算入此次验收。 + +## 2026-09-26 OWASP/Maven 制品字节身份候选 + +相邻 Rust adapter 在既有精确坐标归属之后新增 SHA-256 比较:OWASP 报告和 Maven 制品观察任一方缺摘要、摘要损坏或值冲突,均不能得到同一制品候选;只有相等摘要返回 `ExactDigestCandidate`,仍不证明报告或仓库来源可信。先写的接口契约因缺类型/函数失败;实施后 4 项 OWASP–Maven 定向测试通过。Maven 原生图探针从固定离线仓库读取可无损定位的普通制品字节并在读取后复核仓库树摘要,缺文件/未知类型保持 null;CLI 反例先因缺摘要字段失败,实施后真实字节摘要进入 JSON 反馈。`check_feedback` 协议升至 0.12、依赖图局部协议升至 0.2,schema 同步,零源码依赖构建根的计数下限也对齐为 0。真实 OWASP 调用、数据库身份/时效、同轮报告绑定和最终 CVE 门禁尚未实现,6.4/6.8 仍未完成。见相邻 `codeguard-cli/tests/acceptance/{owasp-maven-attribution,maven-dependency-tree-check-java}.md`。 + +复查接口后将摘要绑定改为从本次报告与图重算坐标归属,不接收外部旧归属列表;错误版本反例返回未归属,定向 4 项再次通过。摘要向量来源仍待受保护运行时核验。 + +本轮 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict 及插件 `git diff --check` 均退出 0。普通测试仍跳过显式依赖原生工具的 ignored 用例;CLI 制品摘要测试使用模拟 Maven/JDK 和固定离线仓库,不能替代真实 OWASP 验收。 + +## 2026-09-26 OWASP Maven 原生局部反馈 + +相邻 Rust CLI 为直接声明 OWASP Maven 插件的构建根新增 `java.cve` 任务和 `check_feedback` 0.13 的 `java_cve` 局部结果。静态 POM 计划先以 3 项契约暴露缺接口,现只接受固定版本的简单直接项目;父 POM、动态版本、额外插件及跳过/排除配置在执行前返回不适用。原生探针读取并核对 Maven/JDK/离线仓库和 CVE 数据目录字节身份,将原 POM 与数据库复制到私有工作区,调用插件固定版本的 JSON goal;本轮解析后的漏洞来源、ID、分数、包标识及 suppression 进入 JSON/human 对话反馈。CLI 两项目标测试先因命令不接受数据目录参数和缺 `java_cve` 结果失败,接线后通过。错误项目名或数据库摘要变化的反例保持 `incomplete` 且不输出 advisory;旧配置测试确认混合 Maven/Gradle 与多构建根仍保持范围未解析,不因某一 POM 已配置而概括全项目。 + +本地数据库摘要不证明漏洞库时效,原生报告也不自证完整扫描。现在 `database_freshness=unverified`、`coverage_proven=false`、交付仍未评估;真实 OWASP 插件/合格数据库、系统级网络隔离、同轮依赖图与制品绑定及受保护策略门禁均未验收,6.4/6.8 不勾选。局部验收见相邻 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 + +定向 POM 3 项、模拟 CLI 2 项、既有 Java 29 项(其中 6 项 ignored)、检查反馈 14 项(其中 1 项 ignored)均通过。全工作区 `cargo test --workspace --offline -q` 退出 0;全目标 Clippy 首次指出既有测试在更新预期后的相同 if 分支,合并断言后 Clippy `-D warnings`、fmt、schema JSON 解析及受影响 Java 29 项复测均退出 0。OpenSpec strict 与插件 `git diff --check` 退出 0。本机可见 Maven/JDK 和部分 OWASP 插件 jar,但未找到可用的离线漏洞数据库,故没有真实 OWASP/数据库时效验收;普通全工作区测试中的 ignored 用例未计入通过范围。 + +后续补充“根 Maven 报告已有漏洞、子根为 Gradle”的端到端反例:局部原生报告仍可见,但项目级 CVE 候选保持 `checker_build_systems_mixed`、无 Maven checker ID,防止一处成功覆盖未解析的其它模块。定向 CLI 2 项、既有 Java 29 项及全目标 Clippy 复测退出 0;全工作区测试是在此新增反例之前运行,未把后续改动说成再次全量回归。 + +## 2026-09-26 CVE 反馈脱敏与白名单边界 + +模拟 OWASP 报告加入携带私服 `repository_url` 的 Maven PURL,先证实原反馈会回显地址,再将对话 JSON 中的未知限定符包标识替换为稳定 `redacted-sha256`;标准 Maven PURL 保留,异常 advisory 来源、ID 和数据库来源/时间戳也只显示安全格式或摘要。定向 `check_java_cve_native` 2 项通过,确认私服地址不进入反馈。误报白名单设计同步明确:脱敏摘要不可当作 CVE 组件身份,只有本轮原生 advisory、依赖图/制品身份和新鲜数据库可核验时才可能进入精确误报裁定;当前 `database_freshness=unverified`、`coverage_proven=false`,白名单不放行。 + +本次改动后 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。真实 OWASP 与数据库验收、可信白名单批准及门禁绑定仍未实现,6.4/6.8/4.9/12.12 均保持未完成;ignored 原生测试不计入通过范围。 + +## 2026-09-26 OWASP 与 Maven 图同轮候选归属 + +此前两个私有原生探针都只接受自身一个插件,同一 POM 无法同时执行依赖图和 OWASP。相邻 Rust adapter 现在只增开“固定 Maven Dependency Plugin 3.8.1 + 固定 OWASP 插件”的严格双插件形状,重复、额外、动态和复杂插件仍拒绝。`check_feedback` 升至 0.14:同一 `check` 的两个构建根、POM、Maven/JDK 和离线仓库摘要一致时,逐条展示精确 Maven PURL、图节点与制品 SHA-256 的候选状态;身份失配或图缺失不复用历史观察。公开反馈中若另有被脱敏的私服 PURL,即使同时有标准 PURL,也标为 `unsupported_purl`,防止在信息损失后误归属。 + +先写的双插件资格契约因旧单插件限制失败,修复后 adapter 4+2 项定向测试通过。模拟原生 CLI 的双插件正例、制品摘要冲突和私服限定符反例通过;另有不同 POM 摘要及图未完成的定向单元反例。最终生产代码与集成反例后的 `cargo test --workspace --offline -q` 退出 0;最后新增的单元反例另由 `cargo test -p codeguard-cli --lib java_cve_attribution::tests --offline -q` 验证通过。全目标 Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict 与插件 `git diff --check` 退出 0。测试中的 Maven/JDK/数据库仍为模拟,真实 OWASP 与可信漏洞库、数据库 freshness、工具锁、全构建范围和正式门禁未验收,6.4/6.8 保持未完成;ignored 原生测试不计入通过范围。 + +## 2026-09-26 CVE 局部报告持久任务 + +相邻 Rust `check java` 把 0.3 CVE 局部报告绑定到已初始化工作区的 `workspace_id/run_id`,自动保存后由 `work sync` 按摘要导入。原生 OWASP 有 advisory 或空报告但数据库 freshness 未核验时,生成 `cve_database_freshness_unverified` 环境/证据 blocker;缺数据库或工具时按原生结构化原因生成 blocker。任务引用报告、构建根和复检参数,`java_cve.next` 返回只读 RepairBrief。此切片**不**将未经核验的 advisory 升为源码 finding,不关闭旧问题,也不改变交付门禁。未初始化项目不写受管目录。 + +先写的集成反例因 `backlog_status` 缺失失败;实施后模拟原生报告、重复扫描仍只有一张同身份任务、缺数据库的环境任务、已消费报告被改后 `work sync` 拒绝摘要冲突均通过。`check_feedback` 协议升至 0.15;`cargo test --workspace --offline -q`、Clippy `--all-targets -D warnings`、fmt、schema JSON 解析、OpenSpec strict 与插件 `git diff --check` 退出 0。真实 OWASP/合格数据库、CVE 任务的 `task verify` 关闭与重开、跨类别完整报告事务及可信门禁仍缺,6.4/9.4/9.7 保持未完成;ignored 原生用例不计入通过范围。 + +## 2026-09-26 CVE 任务原工具复检观察 + +先写 `cve_blocker_verify_uses_original_checker_and_keeps_task_open` 集成测试,旧路由实际返回 `python_lint_feedback` 而失败。现按 CVE checker ID 重跑原生 OWASP Maven 探针,显式接受 Maven/JDK/离线仓库/漏洞库路径和摘要;复检报告经 `work sync` 后附带 `verification_observed`,`next` 与 attempt 历史校验事件的原报告身份。缺库任务仍为 `still_blocked`;模拟 advisory 再现时漏洞库时效仍未核验,亦为 `still_blocked`。两者均保持 open、`local_unverified`、退出 3。POM 复检后变动不沿用恢复候选,需重新扫描。 + +`check_java_cve_native` 三项集成测试通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。ignored 原生用例不计入通过范围。此处仅证明任务分派和本地事件链,真实 OWASP 插件与合格漏洞库、CVE 正式关闭/重开、跨类别完整门禁仍未验收,9.10 保持未完成。 + +## 2026-09-26 Blocker 重复扫描的本地证据与 Git 噪声 + +新增集成反例:同一 CVE 前置阻塞扫描两次原先留下两条 tracked `observed` 事件,断言期望仅一条而失败。现有 blocker 与 finding 一样,每轮在忽略入库的 `state/observations//.json` 保存脱敏报告摘要和受影响路径;首见写一条 tracked 事件,复检后再现补一条,之后重复扫描不再增加 tracked 事件。Rust `work sync` 同时识别 Ruff、Rust Clippy、Java P3C 和 CVE 的 run 序列以判断复检后的再现;重复导入仍受 `write_once` 和消费标记保护。新增 `local-blocker-observation` 0.1 schema。`check_java_cve_native` 的重复/复检/再现样本与 `work_sync_contract` 的 Ruff 多文件归并样本通过。跨模块公共前置关系、正式状态机、可信门禁仍缺,9.3/9.5/9.6 不勾选。 + +回归时一条 `task_verify_contract` 旧断言仍期待“重复扫描新增 tracked 事件”,改为核对首次与复检事件以及两轮本地观察后通过。最终 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、JSON schema 语法、OpenSpec strict 与插件 `git diff --check` 退出 0;默认忽略的原生用例未纳入通过范围。 + +## 2026-09-26 status 与 task show 局部只读视图 + +先写 CLI 集成反例,旧入口对 `status` 和 `task show` 返回未知命令且无 JSON。相邻 Rust CLI 现复用 `next` 的受限 fact/事件检查,`status` 汇总开放 finding/blocker、待同步报告和下一步,`task show` 定位指定任务的结构化 RepairBrief。恶意任务 Markdown 不进入输出;坏 ID 返回 2,缺失或损坏事实返回 3;未初始化与空任务均不表示门禁通过。两份局部结果 schema 已加入;`status_show_contract` 四项定向测试通过。完整事件父关系、历史通过证据 freshness、依赖和正式关闭/重开仍缺,9.7/9.26 保持未完成。 + +最终 `cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、fmt、两份 schema JSON 语法、OpenSpec strict 与插件 `git diff --check` 退出 0;默认 ignored 的真实原生用例未纳入通过范围。 + +## 2026-09-26 Ruff→CVE 跨类别待导入与游标恢复 + +同一初始化项目先生成 Ruff 报告再生成 CVE 报告,阻断自动 sync 后仍保留两份本地报告。恢复后添加一份坏 JSON,单次 `work sync` 同时导入两类 blocker、坏报告单独失败;再次删除两份消费标记并同步,标记恢复且任务/事件数量不变。`cargo test -p codeguard-cli --test work_sync_cross_category --offline` 的一项 CLI 集成验收通过。此切片不包含任意崩溃点或多进程并发的事务证明,也不代表可信 CVE 或完整 gate,OpenSpec 9.4 保持未完成。 + +## 2026-09-26 失败报告收据与误报白名单边界 + +在上述跨类别验收中加入坏报告的后续 `next`/`status` 断言:原实现反复返回 `pending_reports_require_sync`,目标测试先失败。现在每次可归属且有界的导入失败都留下忽略入库的脱敏收据,绑定工作区、run ID、报告 SHA-256 和静态错误码;`next` 返回 `failed_report_requires_repair` 与安全的报告引用,不重复推荐无变化的同步。改写坏报告后,旧收据不适用,重新同步才记录新失败。收据写入失败时先尝试处理其余报告,然后明确返回未完成。收据不是 finding 或白名单批准;该反例已补入 rulepack 与修复流程规格。 + +最初新增的 RepairBrief schema 少一个闭合括号,首轮全工作区测试的 schema 契约因此失败;修正后 `next_command_contract` 6 项及跨类别集成 1 项通过。之后全工作区离线测试退出 0;最后调整失败收据写入错误的批处理边界后,受影响两组测试再次通过。全目标 Clippy `-D warnings`、fmt、两份 JSON schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。普通测试中的 ignored 原生工具用例没有运行。正式可信批准、完整门禁、并发与崩溃矩阵仍未实现,4.8–4.10、9.4、12.12 保持未完成。 + +## 2026-09-26 同工作区同步互斥与失败协议 + +先写 `sync_rejects_a_concurrent_import_before_writing_records`:测试进程持有现有跨进程文件锁,另一个 `work sync` 原先照样导入报告,反例失败。现同步在枚举报告前取得 `state/work-sync.lock` 的非阻塞独占锁,忙碌时先返回 `work_sync_busy`,不写 finding、任务、事件或消费标记;释放后重试导入一次,再重试只计已消费报告。用例同时发现失败响应仍使用 0.1 协议,与已发布的 0.2 work-sync schema 不符;已统一为 0.2。`work_sync_contract` 普通 13 项(2 项原生依赖 ignored)及 Ruff/CVE 跨类别 1 项通过。 + +本轮最终 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 的真实原生工具用例没有运行。互斥只在当前 Unix 本地同步入口证明;跨平台并发、任意崩溃点事务和完整 RunReport 尚未验收,9.4 不勾选。 + +## 2026-09-26 首轮报告导入持久边界重放 + +在四个独立初始化工作区中,先取得同一 Ruff finding 的完整原始记录,然后分别重建“仅任务”“任务加 fact”“已写本地观察”“已写 tracked 事件但尚无消费标记”的持久状态。`work sync` 重放后逐字恢复 fact、任务、观察和事件,恢复消费标记,事件目录仍只有一条。另用真实缺 Ruff 工具的扫描形成环境 blocker,重建已写 fact、未写观察/事件/标记的状态,同样可重放。两项新定向用例和 `work_sync_contract` 普通 15 项、跨类别同步 1 项均通过;2 项显式 ignored 原生用例未运行。全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 退出 0。本次只重建了磁盘中间态,未实际强杀进程或注入磁盘故障;9.4 继续未完成。 + +## 2026-09-26 事件落盘后子进程退出验收 + +新增仅在 Rust `cfg(test)` 构建存在的故障注入点,位于 `import_one` 已持久化 finding/观察/事件之后、写消费标记之前。父测试建立真实初始化工作区和未消费 Ruff 报告;子进程在该点直接退出 97。父进程确认事件存在、标记不存在,随后同一报告重新同步,标记恢复、原事件字节不变且仅一条;这同时验证进程退出后同步文件锁可重新取得。测试先因缺注入点以退出 101 失败,接线后通过。生产构建不包含注入入口。 + +最终 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。默认 ignored 的原生工具用例没有运行。此结果证明该单一真实进程退出点;磁盘故障、其它中断点、多记录/CVE 事务及跨平台仍未验收,9.4 不勾选。 + +## 2026-09-26 残留 staging 与 PID 复用恢复 + +`write_once` 原先用 PID 加进程内计数形成一次性 staging 名;若旧进程留下同名临时文件且 PID 复用,`create_new` 直接失败,目标记录无法在重试中写入。先写的目标契约因缺有界重试接口而编译失败;实现后,写入器遇 `AlreadyExists` 最多尝试 32 个新名字,绝不读取、覆盖或删除旧文件。单个残留名测试证明目标写入且旧字节不变;全部 32 个名字占满时返回 `staging_name_exhausted`,目标仍不存在,全部旧文件保留。这里是恢复活性改进,不是自动垃圾清理或断电持久性证明。 + +两项定向单元测试、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0;默认 ignored 原生用例未运行。磁盘写失败、跨平台文件系统语义、全类别事务及完整门禁仍未验收,9.4 保持未完成。 + +## 2026-09-26 白名单与重复 finding ID 的门禁碰撞 + +审计纯领域门禁发现:若两个义务的原生 finding 意外共用一个 ID,但规则不同,原实现把原始阻断 ID 收进集合;一条精确批准只匹配其中一个原生规则,却会按同一 ID 从活跃阻断集合中移除两者。先写的 `same_finding_id_from_another_rule_cannot_be_waived_by_one_exact_decision` 实际得到错误的 `AllowWithExceptions`,目标断言失败。现门禁先统计全轮 finding ID;重复 ID 使每个受影响义务账本无效,白名单对该 ID 失效,活跃阻断保留,交付为 `Incomplete`。无白名单的单义务重复 ID 也保持未完成,防止集合去重掩盖报告错误。原始 finding 仍留在传入的原生结果中,不按文本相似度合并。 + +`delivery_gate_contract` 20 项、`check_session_contract` 8 项、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0;默认 ignored 原生工具用例未运行。这是领域门禁反例与修复,不证明 CLI/宿主已绑定可信策略、批准、时钟和真实原生身份;2.4、4.8、12.12 均未完成。 + +## 2026-09-26 内部故障仍返回已取得的原生发现 + +`check all/java` 原先在任务图返回任一 `InternalFailure` 时立即退出 4,兄弟任务槽位中已经取得的原生 finding 不进入对话反馈。先写的定向契约因缺报告构造函数而编译失败;现增加 `check_aborted` 0.2 局部报告,记录失败任务 ID、所有执行任务状态、项目发现和各原生结果。只有内部任务故障时退出 4,同轮取消优先退出 130;`check all` 的交付状态为 incomplete,局部 `check java` 为 not_evaluated。Python 扫描若只留下内部错误结果,也按同一路径反馈。白名单不能利用内部故障把已发现的问题转为通过。 + +定向单元测试构造 Python F401 与 Rust 内部故障,验证 F401 未丢失、失败任务可定位和 schema 可解析。`cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict`、插件 `git diff --check` 均退出 0。默认 ignored 的真实原生用例未运行;调度器自身失败、真实同轮工具异常注入、取消路径、完整义务账本与可信白名单门禁仍待验收,2.3 不勾选。 + +## 2026-09-26 SIGINT 取消优先级与并行原生发现 + +既有 SIGINT 集成测试暴露 `check all` 已把任务标成 cancelled,却仍以普通未完成退出 3。先把同一用例的目标改为 130,实测失败(实际 3);接着将 `check_feedback` 协议升至 0.16,在任务取消或进程 SIGINT 时输出 `command_status=cancelled`、`reason=request_cancelled` 和退出 130,交付依然 incomplete/not_evaluated。测试进一步放入并行 Rust Clippy 原生诊断:Ruff 子进程收到 SIGINT 并清理后,已经取得的 `clippy::needless_return` finding 留在 `native_results`,延迟写入标记仍证明 Ruff 后台子进程已终止。该定向集成测试通过。 + +另以纯单元反例构造“Python 已有 F401、Rust 内部故障、Java 取消”,核对 `check_aborted` 0.2 优先返回 130,保留 F401 和故障任务 ID。局部 `check all/java` 取消反馈仍不是完整 RunReport,也未证明 `lint python` 等其它入口遵循 130、调度器自身异常携带全部部分证据或可信白名单门禁。OpenSpec 2.3 不勾选。 + +最终 `cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、两份相关 schema 的 JSON 解析、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 的真实原生工具用例未运行。 + +## 2026-09-26 `lint python` 取消出口对齐 + +既有真实 SIGINT 用例中 Ruff 原生探测取消并回收子孙进程,但 CLI 固定退出 3。先把目标断言改为 130,实测仍为 3;修复后公开 `python_lint_feedback` 0.11 在收到 SIGINT 或扫描明确返回 `request_cancelled` 时,标记 cancelled、退出 130,保留原局部反馈与取消原因。定向 SIGINT 用例通过。原始工作区扫描报告仍保持 0.8,未把对话协议字段写回发现事实。其它命令的取消语义和完整聚合尚未证明,2.3 不勾选。 + +本轮最终 `cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、三份相关 schema 的 JSON 解析、OpenSpec strict 与插件 `git diff --check` 均退出 0;默认 ignored 的真实原生工具用例未运行。 + +## 2026-09-26 三种 planned 语言的显式缺口验收 + +COBOL、ArkTS、Metal 原先在能力查询中可见 planned/gap,但含 `.cbl`、`.ets`、`.metal` 源码的 `check all` 仅输出通用 `not_integrated`,未把旧登记与当前能力缺口带给智能体。先写集成反例,因候选缺 `legacy_status` 而失败;现 `check_feedback` 升至 0.17,每语言六类别候选同时列出旧登记 planned、当前能力矩阵一致为 gap、`planned_language_adapter_gap` 和原生适配/正反例的下一步。请求固定退出 3、交付 incomplete、正式义务仍为 null;没有空适配器或 `not_applicable`。跨平台能力不一致时,单一候选能力字段为空,避免把某平台结果概括到所有平台。 + +定向 `planned_language_gaps` 集成测试覆盖三种真实扩展名、18 个候选、能力查询、缺口条件与不生成正式义务;加入 `capability_status` 后复测通过。最终全工作区 `cargo test --workspace --offline -q --no-fail-fast`、Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict 和插件 `git diff --check` 均退出 0;默认 ignored 的真实原生用例未运行。8.145–8.147 的显式 planned/gap 验收已满足;54 个旧 stable 语言的原生适配与 8.148 汇总仍未完成。 + +## 2026-09-26 白名单 finding 与未完成状态的 SARIF 投影 + +相邻 Rust CLI 增加 `feedback_sarif` 纯转换器。定向测试先因模块缺失编译失败;实现后,结构有效 RunReport 中的白名单 finding 仍是 SARIF `result`,附处置与批准引用但不生成 `suppressions`,并标明报告所称批准来源未核验。同轮另有活跃阻断时两个结果都保留且总体为 `deny`。未完成且零 finding 的报告仍以 `executionSuccessful=false`、错误级工具通知及未完成义务计数显式表达。原生消息、路径和证据引用不复制到公开 SARIF,规则与 finding ID 用哈希投影。见相邻 `codeguard-cli/tests/acceptance/sarif-feedback-baseline.md`。 + +定向 `sarif_feedback_contract` 3 项、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 的原生工具用例未运行;转换器尚未接入正式 CLI/MCP/Hook,报告来源、内容身份及批准权威未被验证,2.5、2.10、12.12 均保持未完成。 + +## 2026-09-26 `check all/java` 局部 SARIF 命令输出 + +当前实际检查入口使用 `check_feedback`/`check_aborted`,不是完整 RunReport;直接复用上节转换器会丢失局部原生发现。先写 `check_sarif_cli` 2 项命令反例,旧参数解析均退出 2;实现后 `check all/java --format sarif` 由同轮局部报告投影嵌套原生 finding,固定 `executionSuccessful=false` 与失败通知,保留原退出码 3/4/130。模拟 Clippy finding 可见,诊断内 `token=private` 不公开;零 finding 的 Java 局部检查仍为 `not_evaluated`。另有内部故障保留两个检查器已取得 finding 的单元反例。CVE advisory 与依赖图节点未经归属,不伪装为 SARIF finding。见相邻 `codeguard-cli/tests/acceptance/check-partial-sarif.md`。 + +定向 CLI 2 项及转换器单元 1 项通过。首次全工作区并行回归中 `check_sarif_cli` 曾间歇失败,单独重跑及第二次全工作区回归退出 0;失败断言未保存,仍需后续观察。全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 原生工具用例未运行;完整 RunReport、其它检查类格式、`--output`、可信门禁及白名单批准仍未接通,2.5/2.10/12.12 不勾选。 + +## 2026-09-26 JSON/SARIF 局部报告原子导出 + +在 `check all/java` 上实现 `--output PATH` 的 JSON/SARIF 局部导出:同目录创建私有暂存文件,完整写入与同步后原子发布;新目标用不覆盖现有路径的硬链接创建,替换目标只接受可解析的既有 CodeGuard 报告。目标父目录不存在时,扫描已经取得的 finding 仍完整输出到 stdout,stderr 提供 `output_parent_unavailable` 恢复原因,退出保持未完成 3;已有源码文件不会被输出覆盖。目标可写时,导出文件与 stdout 是同一所选格式的文档。先写的导出成功/失败反例因旧解析器拒绝 `--output` 而失败;已有源码保护反例也先证实旧实现会覆盖源码,修复后通过。 + +定向 `check_sarif_cli` 6 项、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 原生工具用例未运行。当前输出仍是局部 `check_feedback`/`check_aborted`,human/其它检查命令未接入,非 UTF-8 可逆路径、多位置/包身份、完整 RunReport 与跨工具等价归并尚未实现;2.9 保持未完成。 + +## 2026-09-26 导出失败进入智能体结构化反馈 + +上一节导出失败只写 stderr;若宿主只消费 stdout,智能体看不到保存失败。先把 `check_sarif_cli` 改为要求失败时 SARIF `codeguardExportStatus=failed`/受限原因码,成功文件与 stdout 同报 `saved`,JSON 成功报告也带 `export.status=saved`;旧行为的 3 项断言均实际失败。现 `check_feedback` 0.18、`check_aborted` 0.3 要求结构化 `export`,默认 `not_requested`;尝试导出前构造 `saved` 文档,仅成功发布才输出该版本,失败则输出 `failed` 文档并保留同轮发现。局部 SARIF 从同一状态投影。没有扩大白名单或签发完整检查。 + +定向 `check_sarif_cli` 6 项、`check_all_partial_contract` 13 项普通/1 项忽略、`check_all_java_p3c` 23 项普通/6 项忽略、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、两份 JSON schema 语法、OpenSpec strict 和插件 `git diff --check` 均退出 0。默认 ignored 的真实原生工具用例未运行;宿主对 stderr/stdout 的消费、human/其它命令导出与完整 RunReport 仍待验收,2.9 不勾选。 + +## 2026-09-26 Go vet 局部 CLI、白名单纠错场景与并行回归 + +相邻 Rust 工程新增 `codeguard lint go` 局部入口:显式 Go 1.23.4 工具路径、离线隔离执行、原生 `go vet -json ./...`、本轮源码/manifest/工具摘要复核和脱敏 JSON/human 对话反馈。原生诊断与清洁样本均已在本机 Go 1.23.4 下执行;编译错误保持 incomplete。CLI 始终退出 3、`coverage_proven=false`、`delivery_decision=not_evaluated`,尚未接入 `check all`、工作任务和正式门禁。见相邻 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 + +用户要求能通过纠正白名单处置不合理误判。本 change 已有精确身份、原生复检、候选/独立批准/撤销链与 `allow_with_exceptions` 设计;本次补充从用户反馈到再次检查、对话说明的可观察场景,并写入 12.12 验收。可信批准、任务闭环、真实门禁和 CLI/MCP/Hook/SARIF 一致性仍未实现,相关任务保持未勾选。 + +全工作区首轮并行回归暴露 `check_sarif_cli` 间歇失败:已有源码文件有时在读取前变空,报告暂存文件有时在发布前消失,替换返回 OS 错误 2。测试用进程 ID 与时钟纳秒生成临时目录,缺进程内唯一序号;给目录名增加原子递增编号后,该测试并行连续运行 10 轮均通过。`cargo test --workspace --offline -q`、`cargo fmt --all --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0;此前全目标 Clippy `-D warnings` 与本轮 Go 真实忽略用例分别通过。并行失败的根因由症状和修复后稳定性推断,未取得碰撞路径日志;原生 P3C 等默认忽略用例不在全工作区通过范围。 + +## 2026-09-26 Go 多模块与诊断源集归属 + +`lint go` 的局部扫描使用根模块 `go vet ./...`。新反例先证实:当目标下存在第二份 `go.mod` 时,旧 CLI 继续进入版本探测,没有向智能体指出嵌套模块漏检。现只读发现同时保存 Go manifest 集合;非单一根 `go.mod` 返回 `go_multiple_modules_unvalidated`,提示逐模块核查。另构造有界假原生报告,其位置在根内但文件未列入本轮源码集合:解析后整轮返回 `go_vet_diagnostic_outside_discovered_sources`,不输出该诊断为 finding。该测试首次因 macOS `/var` 与 `/private/var` 路径别名得到解析层拒绝,改用规范根路径后命中目标归属检查。 + +`cargo test -p codeguard-cli --test go_lint_cli --offline` 4 项普通测试通过、1 项原生测试默认忽略;显式 `CODEGUARD_GO_TOOL=/usr/local/go/bin/go ... -- --ignored` 的真实 Go 1.23.4 违规/干净/编译错误用例通过。仍无逐模块执行、完整 build tags/目标平台证明、可信工具/规则策略或 Go 注释适配,8.2 不勾选。 + +本次修改后的 `cargo test --workspace --offline -q`、`cargo fmt --all --check`、全目标 Clippy `-D warnings`、OpenSpec strict 与插件 `git diff --check` 均退出 0;全工作区默认忽略的原生环境用例不计入通过范围。 + +## 2026-09-26 Go 多模块原生复检 + +上一节只识别嵌套模块并返回范围阻塞。本轮从真实反例继续:根模块干净而嵌套模块含 `printf` 违规时,旧 CLI 返回 incomplete,未运行第二个模块;先写的验收断言失败。现对只读发现的最多 64 个 `go.mod` 按相对根逐一执行 `go vet -json ./...`,把诊断绑定到已发现源码及其所属模块,反馈 0.2 列出每模块状态。根模块有原生违规、嵌套模块编译失败时,公开结果保持 incomplete,已完成根模块的 finding 仍保留。若工具/任一模块 manifest、可选 `go.sum` 或源码在检查中变化,丢弃本轮 finding。模拟报告指向未发现源码或从根模块指向嵌套模块时,该模块保持未完成,不把报告位置误认作有效发现。 + +本机 Go 1.23.4 的真实单/双模块、局部干净、违规及失败样本通过;普通 CLI 4 项通过。仍未验收 build tags、目标平台/CGO、完整依赖图及规则策略,也未接入 `check all`、任务同步、注释检查和可信门禁,8.2 不勾选。 + +修改后全工作区 `cargo test --workspace --offline -q`、`cargo fmt --all --check`、全目标 Clippy `-D warnings`、Go 反馈 schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认忽略的其它原生用例仍不计入全工作区通过范围。 + +## 2026-09-26 Go 接入统一局部检查 + +新 `check_all_go` 反例先要求 Go 项目在统一检查中保留缺工具原因和 `go.lint` 任务,旧行为缺 `native_results.go_lint`,断言失败。现 `check all --go-tool ABS_PATH` 复用 `lint go` 的受控观察服务,接入共享 TaskGraph、deadline/jobs、类别候选、内部故障快照及 JSON/human/SARIF 汇总。真实 Go 1.23.4 的 `printf` 诊断在统一 JSON 与 SARIF 保留,SARIF 仍 `executionSuccessful=false`;整体交付为 incomplete,Go 子报告仍不签发质量通过。缺工具、相对路径、Java 选择误用 Go 参数和 2 秒预算下的慢版本探测均有明确反例;超时映射为 `deadline_exceeded`。Go 子报告沿用 0.2,统一检查反馈升为 0.19、内部故障反馈升为 0.4。 + +`check_all_go` 普通 3 项、Go CLI 普通 4 项通过;显式真实 Go 的统一检查 JSON/SARIF 及单/双模块用例各 1 项通过。使用已安装的 `/opt/anaconda3/bin/python3`/jsonschema 对真实违规、缺工具和 Java 选择的实际输出执行 Draft 2020-12 校验通过;项目 shell 的另一个 Python 缺 jsonschema,未安装依赖。此验证辅助程序不属于 Rust 产品运行时。Go 尚无持久任务/原工具任务复检、完整规则/平台覆盖或可信门禁,8.2/9.13 仍未完成。 + +本次修改后全工作区 `cargo test --workspace --offline -q`、`cargo fmt --all --check`、全目标 Clippy `-D warnings`、相关 schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认忽略的其它原生环境用例未包含在全工作区通过范围。 + +## 2026-09-26 Go 稳定发现身份前置能力 + +新增 `go_finding_identity` 契约测试先因模块未导出而编译失败,随后实现稳定身份并接入原生观察。Go 子反馈 0.3 与统一反馈 0.20 要求稳定 ID、完整指纹和本轮源码摘要。指纹以模块/package/路径/原生规则/源码行锚点/原生消息/重复锚点序号绑定;绝对行号与整文件摘要不参与稳定 ID。排序原生发现和同位置诊断去重避免原生数组顺序制造重复任务;字节摘要独立绑定本次输入。模块内任一位置越界不发布部分有效发现,输入变化清空本轮发现。 + +纯身份 3 项、Go CLI 普通 5 项、统一 Go 普通 3 项通过。显式 Go 1.23.4 的 CLI 原生验收和统一 JSON/SARIF 各 1 项通过,CLI 包含重复扫描/插入空行、修复、编译错误、双模块和部分模块失败。两种实际含违规输出通过 Draft 2020-12 schema 校验。局部能力没有新增交付批准;Go 持久报告工作区/运行归属、同步、next 和 task verify 未实现,8.2 保持未完成。 + +本轮全工作区回归退出 101:`maven_probe_contract::delegated_bundle_mutation_during_validate_invalidates_local_evidence` 期望 `bundle_identity_changed`,实际 `version_execution_incomplete`。该测试使用 2 秒总预算,但现有结果不含该次进程具体终止原因,不能据此确认是超时。单独重跑该测试文件的 7 个普通用例通过、3 个原生环境用例忽略;原失败尚未解释,不报告全工作区通过。Go 相关普通/显式原生专项、实际 schema 验证、全目标 Clippy、fmt 和 OpenSpec strict 通过。后续须保留进程终止证据定位 Maven 回归干扰,再重新取得完整回归退出 0。 + +## 2026-09-26 Maven 版本失败可诊断性 + +从上一轮全量失败继续:检查发现 `run_maven_probe` 对所有非零/异常版本阶段统一返回 `version_execution_incomplete`,无法区分时间预算、启动权限或执行层故障。新增 100ms 预算的长进程反例和普通文件缺可执行权限反例,两者先按期失败(得到通用原因),实现后分别得到超时/启动前耗尽和启动失败原因,均不启动 validate、不生成源码违规。其余终止类别也显式保留;没有放宽产品或测试截止时间。 + +Maven 普通契约现为 9 项,连续五轮均通过,各轮 3 个本机原生环境验收未执行;全目标 Clippy、格式、OpenSpec strict 和 diff 检查通过。此前 bundle mutation 的一次失败仍无法恢复具体终止原因,重复通过不等于根因确认。完整工作区回归的终态另行记录;6.1 及完整计划保持未完成。 + +本轮完整 `cargo test --workspace --offline -q` 最终退出 0,原 Maven bundle mutation 用例通过,新增超时/启动失败反例也包含在该轮回归。全量日志 `/tmp/codeguard-maven-reason-workspace.log` 仅作本地执行记录,不作为长期规格事实源。默认忽略的原生工具用例仍未计入本轮全量通过范围;偶发失败根因不因本轮成功而标为已确认。 + +## 2026-09-26 Go 报告归属与持久修复任务 + +缺工具场景的新 `go_work_sync` 测试先因缺 `backlog_status` 失败,接通保存与同步后又暴露 next 拒绝 Go checker;现已统一 `lint go` 和 `check all` 的本地保存/同步函数,并让 next 返回 Go 原工具参数及环境/策略指引。Go 子反馈 0.4、统一反馈 0.21 新增 workspace/run、各模块 manifest/go.sum 身份和同步反馈。尚未初始化或无效工作区不写队列,保存失败不改变原生 finding 或签发门禁。 + +同步器验证工作区和运行文件名、已完成模块、诊断计数、归属及源码位置;单模块计数有上限,过大输入不让求和溢出。源码或模块内容已改变的报告只计历史;错工作区、计数矛盾、越界路径、模块错属和坏位置不生成源码任务。合成报告测试只验证本地一致性,字段及摘要不能自证可信原生来源或策略批准。 + +Go 同步普通 3 项通过,包含多个畸形报告与历史输入子场景;显式本机 Go 1.23.4 原生 1 项通过,发现自动生成具备证据/规则/范围/步骤/复检/历史/关闭条件的 Markdown 任务,重复扫描不复制,修复后任务仍 open。Go CLI 普通 5 项、统一 Go 普通 3 项及统一协议普通 13 项通过。已初始化项目的实际 Go 和统一含违规输出通过 Draft 2020-12 schema 校验;Clippy 与 fmt 通过。Go task verify、可信规则/平台覆盖及正式关闭/重开仍缺,8.2/9.13 不勾选。 + +当前 Go next 源码分支按首次事实摘要保守提示是否需要复扫;新报告的当前源码摘要已写入独立本地观察,但完整最新复检观察消费仍待 Go task verify 接线。不能把当前简报或同步成功说成修复闭环完成。 + +本轮全工作区回归最终退出 0。计数上限和 human 工作台提示的最后调整另经 Go 同步/CLI 专项、统一协议专项、最终全目标 Clippy 与 fmt 验证;默认忽略的原生环境用例不因全量通过而变为已执行。实际 Go 原生同步与报告 schema 验证如上;完整目标的剩余任务不因这轮回归成功而勾选。 + +最终版本显式重跑本地 Go 1.23.4 的 `check_all_go`、`go_lint_cli`、`go_work_sync` 三个原生验收,各 1 项全部通过,覆盖初始化/未初始化、统一 JSON/SARIF、单/双模块、稳定身份、修复、编译失败和持久任务同步;不涉及自动安装或网络下载。 + +## 2026-09-26 Go 原工具任务复检与简报消费 + +环境任务复检新测试先得到 task_checker_unsupported,接通原生调用后又暴露旧事件消费者不识别 Go run ID/report;现 task verify、next、尝试历史与同步事件排序均识别 Go。复检使用显式绝对 Go 路径、同一 runtime 和预算,沿用任务租约/锁、完成尝试绑定和事件原子写入。Go 源码复检子报告 0.5 带 task/path/本轮源码摘要与输入稳定标记,公开任务反馈升为 0.4,追加事件保持 0.3/state_after=open。普通扫描仍为 Go 0.4/check 0.21。 + +真实 Go 1.23.4 环境下仍有原发现为 still_present;同文件同规则出现另一指纹为 rule_coverage_requires_review,不能凭指纹变化推导修复;修复后为 candidate_absent_unverified_policy,编译失败为 incomplete。缺工具环境复检为 still_blocked 并保留事件;原覆盖/策略任务不会因为原工具能运行而标为恢复。next 绑定同一报告字节,原生观察后源码或模块配置变化会要求重新复检,均不关闭任务或签发门禁。 + +普通 Go 同步/复检 4 项通过,显式本机 Go 的同步与任务复检 2 项通过(任务复检还验证模块清单变更使候选失效)。使用现有 jsonschema 对四种实际任务反馈与 Go 子反馈执行 Draft 2020-12 验证通过。一个专项命令误写不存在的 task_attempt_contract,未执行测试;已改用实际包含尝试流程的 task_lease_contract,与 Go/next/task_verify 回归重新运行,原错误不计通过。Clippy 和 fmt 通过;全工作区回归终态另记。正式关闭/重开、全语言完整覆盖、策略批准和宿主接线仍未完成。 + +本轮全工作区 `cargo test --workspace --offline -q` 最终退出 0(默认忽略的原生环境用例未计执行)。末尾的同规则身份变化分流和 Go 参数归属检查经 Go/next/task_verify/task_lease 目标回归、实际 Go 四类输出 schema、最终 Clippy 和 fmt 验证;显式 Go 原生任务 2 项通过。计划仍有正式关闭/重开、完整覆盖与策略/宿主接线缺口,不因本地通过而归档该 change。 + +## 2026-09-26 Go 原生文件范围与观察失效 + +先实际复现 RED:旧源码复检在目标被 build tag 排除时返回未检出候选。新增 go list 连续 JSON 解析与复检范围观察后,标签、CGO 和非宿主平台三种排除均为 rule_coverage_requires_review,保持 open,并提示构建范围复核;清单或身份失败为 incomplete。普通 Go 0.6、源码复检 0.7、check 0.22 绑定整组源码摘要,vet/list 之间及事件采纳时输入变化不可用;next 在后续任一 Go 源码变化时要求复扫,同步旧源码仅保留历史。 + +解析器两项、普通 go_work_sync 四项、next 六项及 task_verify 十项通过。显式 Go 1.23.4 原生 go_work_sync 三项退出 0,包含排除三子场景及后续源码变更。独立临时工作区的 still_present、excluded、candidate_absent_unverified_policy、incomplete 四类实际 task verify 与其 Go 子报告,以及普通 Go/统一检查输出通过 Draft 2020-12 JSON Schema;版本为 Go 0.6/0.7、check 0.22、task preview 0.4。 + +全工作区离线回归最终退出 0;整组源码历史校验的最后调整另经普通 Go 同步回归与最终真实原生/schema 检查。默认忽略用例不计执行。fmt 校验与最终 `cargo clippy --workspace --all-targets --offline -- -D warnings` 均退出 0。完整 Go 注释、平台/规则策略与正式关闭/重开尚未完成;8.2/9.13 不勾选,全部计划仍有 265 项未勾选。 + +## 2026-09-26 白名单纠错可读任务附件 + +RED:真实 Ruff 纠错测试在旧实现缺 projection_status/可读文件时失败。现显式 --record 在同一任务锁内复核收据、生成事件与历史附件,反馈用锁内提案,避免锁前预览与记录混合。附件含七项任务信息,引用同一稳定 finding、旧决策、本轮复检与事件;候选 Markdown/HTML 标点实体化。事件成功但附件失败单独反馈,无覆盖用户编辑;重复记录能恢复删除的附件。next 只展示匹配当前事件重建字节的附件,不从 Markdown 执行或授权。 + +普通 next 六项、白名单提案四项和转义反例一项通过;显式 Ruff 0.16.8 原生提案两项通过。纠错原生用例额外核对七节投影、幂等引用、用户编辑保留、冲突不丢事件、删除重建及 next 对修改附件不采信。0.2 投影状态协议保留 0.1 读取,recorded/failed 区分引用与失败原因;独立临时 Ruff 项目的预览、已记录、附件冲突、删除重建、事件及 next 实际输出通过 Draft 2020-12 Schema;最后添加具体检查器/规则/目标展示后,原生两项与转义反例再次通过,最终 Clippy 与 fmt 均退出 0。完整工作区离线回归最终退出 0;最后的具体检查器/规则/目标展示补充另经最终原生两项、转义反例、Clippy 和 fmt 验证。默认忽略的原生环境用例不计执行。独立批准、可信发布、全事件链和正式任务处置仍缺,4.10/9.28 未勾选。 + +## 2026-09-26 Ruff 复检配置变化与优先级 + +真实 RED 一:F401→E501 修改配置后,next 仍以 still_present 复检驱动旧纠错事件和附件。真实 RED 二:在原 ruff.toml 字节未变时新增同内容 .ruff.toml,普通误报 propose 仍返回旧本地观察。现用当前只读项目发现核对目标所选配置路径和字节摘要;发现不完整、配置缺失/无效/未知、路径或摘要变化及旧报告缺配置身份均不沿用旧观察。next 要求原工具复检,纠错不产生新提案,普通 propose 不展示旧身份;历史记录保留。 + +普通 next 六项、task_verify 十项、白名单提案四项及 work_sync 十五项通过。显式 Ruff 原生任务复检八项与白名单提案两项通过;新增反例覆盖规则配置修改、高优先级配置切换以及未检出候选后再改配置。独立临时项目对配置内容变化、配置优先级变化、删除配置及恢复原配置的实际 next/correction/propose 输出通过 Draft 2020-12 Schema,失效时没有旧事件/附件引用或新提案,恢复后原事件可继续调查且不产生批准。fmt 与最终 Clippy 均退出 0;完整工作区离线回归最终退出 0。普通 propose 优先级核对的最后调整另经上述四组目标回归、原生两项与实际 Schema 验证,默认忽略的原生用例不计执行。 + +本增量只复核当前项目配置,不执行项目脚本、不认证规则包或独立批准;完整候选生成、可信发布、正式门禁及任务关闭仍缺,4.9/4.10 不勾选。 + +## 2026-09-26 批准签名与严格快照桥接 + +两个 RED 分别为签名核验 API 缺失与核验后候选绑定入口缺失。Rust 新增 Ed25519 原文/域分隔核验、宿主上下文和非授权结果类型,依赖 ring 0.17.14 从已有缓存离线解析。载荷绑定工作区、修订、受保护基线、序号、期限及快照原始字节;普通候选桥接仍严格解析快照并核对内外修订,最后使用签名得出的摘要走原有精确绑定。未提供项目自选公钥、自批开关或生产签发 CLI。 + +签名四项、原批准快照十五项通过;反例包括换私钥/目标/基线/快照、签名原文空白变化、错误签名域、密钥撤销/失效/未来、批准未来/过期、无时钟、回滚/超期限、重复已知字段、额外 approved、坏版本/长度/零签名、快照内外修订错配和候选字节篡改。Clippy 通过;格式、schema、OpenSpec 和完整工作区终态另记。当前仅证明给定宿主输入下的密码学核验;公钥来源、可信时钟/防回滚持久状态、完整签名修订链及实际门禁接入仍缺,4.5/4.8 不勾选。 + +分层完整回归首先退出 101:crate_boundaries 拒绝 CLI 直接生产依赖 ring。此失败未忽略,未以目标测试通过替代。密码学原语已移至 runtime;CLI 保留协议解析且仅 dev 依赖 ring 用于测试签名,边界新增 CLI normal/build 和 core 直接 ring 的拒绝反例。修正后的目标边界/签名/快照通过,后续完整回归结果见下。 + +修正后边界三项、签名四项及批准快照十五项退出 0;实际 Cargo metadata 仅有 runtime normal 与 CLI dev 两条 ring 边。另从 RFC 8032 §7.1 TEST 1 获取独立公钥/签名向量,runtime 原语两项验证标准向量、篡改、无效公钥/签名及超限输入均通过;Clippy 与 fmt 通过。封装/载荷 schema 的结构及拒绝自写 approved 样本通过 Draft 2020-12 校验;这些结构样本不证明签名有效,密码学证据来自 Rust 测试。OpenSpec 严格校验及 diff check 通过。修正后的完整工作区离线回归最终退出 0;启动后新增的 runtime 标准向量两项另经目标执行与最终 Clippy/fmt 验证,未计为该次默认套件的已运行项。默认忽略的原生环境用例不计执行。 + +## 2026-09-26 多跳签名白名单修订链 + +RED 为签名链入口与前序输入类型缺失。局部实现逐跳核验签名和快照内外修订,再沿用精确替代/撤销绑定;历史摘要只由验签结果推导。前序序号严格递减,历史签发/审核不得越过子批准签发,旧候选必须在受保护历史审核时刻有效。历史今天过期不抹去当时合法记录,但本轮宿主提供的撤销状态仍须生效。当前批准按本轮时钟核验;超 32 跳在验签前拒绝。 + +首次目标执行有一项测试错误地 unwrap 乱序链的拒绝错误,已修正拒绝断言,并保留失败记录。最终签名链三项、单快照签名四项、旧快照十五项和依赖边界三项共 25 项通过,覆盖正常三修订链、截断/乱序/多余节点、前序私钥不符、序号回滚、未来批准、跨工作区、缺历史时钟、旧候选未生效、历史密钥撤销、空链及上限。最终 fmt 和全目标 Clippy 退出 0。完整工作区回归终态另记;默认忽略的原生环境用例不计执行。宿主信任来源、Git 基线祖先关系、可信发布与实际门禁仍缺,4.10 不勾选。 + +补充时序分支反例:前序签名在历史审核时刻有效,但审核晚于替代批准签发,明确返回 approval_revision_order_invalid。最终链测试四项全部通过,fmt 与全目标 Clippy 再次退出 0。此新增反例在已经启动的完整回归之外单独执行,不将其追溯算入那轮全量套件。 + +完整工作区离线回归最终退出 0,日志为本地 /tmp/codeguard-signed-chain-workspace.log;默认忽略的原生环境用例未计执行。新增第四项时序反例另经专项执行,最终 fmt/Clippy 和 OpenSpec 严格校验、git diff check 通过。完整计划与可信门禁仍未完成,change 不归档。 + +## 2026-09-26 签名链的原生 Git 基线关系 + +两次 RED 分别为 runtime 原生祖先观察缺失、CLI 联合入口缺失。实现后在宿主明确指定的 Git/仓库上,先核验签名与精确替代链,再逐跳检查完整非零同格式提交 ID、commit 对象类型、非浅历史及祖先关系。Git 参数/环境禁用 replace、graft、commit-graph 加速、lazy fetch 和可选锁,所有步骤与各跳共享宿主截止时间及取消标记。Git 失败/未知输出不能转为批准。 + +本机 Git 2.54.0 的 runtime 四项通过,涵盖 SHA-1/SHA-256、同提交/反向/无关、tree/短引用/零/缺对象、replace/graft、浅历史、缺工具/取消/超预算,以及 config/index 字节不变;部分克隆本地假传输有正对照确认能被普通 Git 启动,而 Codeguard 禁取对象观察不启动它,不接外部服务。签名链五项(含真实三提交链、签名有效但无关基线、浅历史)、单快照四项、旧快照十五项及边界三项通过。完整工作区和最终 Clippy/fmt/OpenSpec 终态另记。联合入口不证明公钥/历史时刻/最低序号与仓库/工具可信来源,不签发门禁,4.5/4.10 未勾选。 + +补充签名链用例确认上层取消标记确实传递,不在每跳重置;随后 RED 复现普通签名入口接受有效签名中的全零基线。Rust 与 signed-approval-payload schema 现统一拒绝两种零 ID。最终单快照五项、签名链五项、旧快照十五项和边界三项通过;Draft 2020-12 六个基线结构样本通过(不作为签名证据)。这些后补调整单独执行,不追溯计入已启动的全量回归。 + +本轮完整工作区离线回归最终退出 0,日志为本地 /tmp/codeguard-git-approval-workspace.log。后补的取消与全零基线调整另经上述最终专项、全目标 Clippy 和 fmt 验证;OpenSpec 严格校验与 git diff check 通过。默认忽略的原生环境用例未计执行。联合 Git/签名入口没有升级为可信策略发布或最终门禁,完整计划继续保持未完成。 + +## 2026-09-26 白名单处置与原生主目标关联 + +RED 一/二分别复现原生 finding 工具不同、主目标不同或缺主定位时仍被处置为白名单。DeliveryInput 增加默认空的 native_checker_bindings,宿主须冻结 checker/tool/category/obligation 关联;领域门禁核对唯一映射与实际 finding 工具/义务、类别,再核对第一处主定位。源码/项目核对精确路径,依赖核对组件和非缺省版本;次要位置不能替代不同主目标。旧输入可读,但缺映射不应用白名单;普通无白名单结果保留兼容。 + +RED 三复现冲突输入的首条仍在 whitelisted 集合。门禁现预先统计所有重复 finding 引用与重复批准决策 ID,冲突双方全部不应用;原始/活动阻断保留,反转输入顺序结果相同。正例现提供明确主定位与冻结映射,不将缺定位伪装为完整。 + +最终门禁 26 项、会话汇总 8 项、RunReport 14 项、带例外报告反馈 7 项与 SARIF 3 项通过;core 自身回归通过,最终全目标 Clippy 与 fmt 通过。专项第一次误用不存在的 conversation_feedback_contract 等 target,命令退出 101 未执行测试;改为实际目标后上述回归通过。完整工作区终态另记。以上是合成领域/协议用例,不证明真实原生或批准来源;制品/源内容/依赖图/advisory 归属及签名批准到实际宿主的完整接线仍缺,4.8/4.10 未勾选。 + +后补 RED 四复现错误义务归属仍留下 whitelisted 状态;现在源结果 ID 与 finding.obligation_id 必须一致,源义务无 invalid/incomplete/coverage_mismatch 标记才可参与处置。第 27 项包含错归属、未知义务与覆盖失配,要求保留活动阻断。此修改在已启动的完整回归之外单独验证,终态另记。 + +后补修改的最终目标结果:门禁 27 项、会话 8 项、RunReport 14 项、带例外反馈 7 项及 SARIF 3 项通过;core 自身回归全部通过,全目标 Clippy 与 fmt 退出 0。OpenSpec 严格校验及 diff check 通过。完整工作区终态另记;未将这些合成域模型用例计为真实宿主或原生完整验收。 + +完整工作区离线回归最终退出 0,日志为本地 /tmp/codeguard-native-disposition-workspace.log;默认忽略的原生环境用例未计执行。启动后补充的源义务有效性检查另经上述最终专项、core 回归、Clippy 与 fmt 验证,不追溯计入原全量快照。完整计划和实际宿主门禁仍未完成,change 不归档。 + +## 2026-09-26 最终门禁时钟与签名到期元数据 + +两个 RED 分别为 DeliveryInput 缺最终判定时钟、已验签结果缺只读到期方法。领域门禁现要求非零最终时刻满足 observed_at <= gate_time_unix < expires_at;到期瞬间、缺最终时钟或时钟回退均保留活动阻断与未完成,不能沿用旧取证时间。旧输入可读,无白名单普通门禁不因缺新增时钟改变结论。VerifiedApprovalSnapshot 的私有到期值来自已验签载荷,不新增授权效果;宿主应约束当前批准的最早到期边界,不将历史合法记录的旧期限套到当前替代条目。 + +第一轮目标门禁 29 项、会话 8 项、RunReport 14 项、带例外反馈 7 项、SARIF 3 项、签名与签名链各 5 项及快照 15 项、core 回归通过,Clippy 与 fmt 退出 0。补充只读到期元数据后相同受影响目标、依赖边界与最终静态检查终态另记。本轮未改原生进程或适配器,不重跑无关原生环境用例,也不将合成时刻视为真实宿主时钟验收;可信时钟来源、批准生产及宿主门禁仍缺,4.5/4.8 未勾选。 + +最终相同受影响目标、依赖边界三项及 core 回归全部退出 0;全目标 Clippy、fmt、OpenSpec 严格校验及 diff check 通过。本轮没有执行完整工作区或原生环境套件,不将前轮全量结果当作本轮证据。完整计划与真实宿主门禁仍未完成,change 不归档。 + +## 2026-09-26 当前策略修订与签名处置预览 + +两个 RED 分别为 DeliveryInput 缺当前策略修订、签名处置入口缺失。领域门禁现要求待应用处置与宿主独立冻结的当前修订完全一致,缺/空/不同修订均保留活动阻断。新增只读 BoundFalsePositiveDisposition,普通入口先核验签名/快照/候选,替代入口先核验完整签名/Git 链;候选有 64 KiB 上限。结果固定候选及快照摘要、范围、精确身份、引用、序号与最早当前期限;内部构造且不支持从项目 JSON 反序列化,独立批准标记始终 false。 + +最终门禁 30 项、会话 8 项、处置 3 项、签名与签名链各 5 项、快照 15 项、边界 3 项、RunReport 14 项、带例外反馈 7 项、SARIF 3 项与 core 回归通过,全目标 Clippy/fmt 退出 0。实际 Git 链用例补充合法替代的预览期限、普通入口拒绝替代及无关基线拒绝;其它原生 identity/来源审核为合成模型。测试中显式模拟独立来源审核只为检验字段消费,不是产品批准接口,也不认证真实宿主来源。未执行完整工作区或其它原生工具套件;OpenSpec/diff 终态另记。可信来源、真实批准生产与宿主门禁仍缺,4.5/4.8 未勾选。 + +## 2026-09-26 批准范围到最终门禁 + +相邻 Rust 工程新增 `ApprovalScope`,独立冻结的门禁范围与处置批准范围必须精确一致;签名预览保留范围且仍没有独立批准权威。跨工作区、错基线、缺范围,以及双方同填全零/HEAD/大写/短摘要等非法身份均不能处置 finding。基线指当前批准上下文,不从工作树 HEAD 推导;旧 JSON 可读,但缺范围的白名单不能放行。 + +新增测试先因范围类型与字段缺失失败;实现后受影响 CLI 契约 80 项(含门禁 32、会话 8、签名预览 3、签名链 5、普通签名 5、边界 3、报告 14/7、SARIF 3)及 core 单元/契约 9/8/5/3 均通过。领域门禁的独立来源为合成输入;签名链含本地实际 Git,均不能证明可信宿主批准或全语言交付。OpenSpec strict 与 git diff --check 通过。workspace all-target Clippy(-D warnings)与格式检查均终态通过。验收说明:相邻 `codeguard-cli/tests/acceptance/approval-scope-gate-binding.md`。完整计划仍有 265 项未勾选;4.8 不勾选,本轮未运行 workspace 全测试。 + +## 2026-09-26 Maven 静态模块关系与画像刷新 + +相邻 Rust 工程新增同次清单字节绑定的 Maven 模块观察模型与图 0.2;contains、aggregation、declared build_dependency 分开。完整唯一直接坐标才连接本地依赖,记录来源、SHA-256、scope/声明条件;变量、父模型、profile、依赖管理、特殊属性、重复坐标及逃逸/未知模块保留具体 unresolved。图不能用于缩小扫描范围,不等于 Maven 生效模型。历史 0.1 schema 单独保留。 + +新增 init 用例先因旧图仍为 0.1 且无直接声明关系失败,实现后 init 28 项通过;受影响 check-plan/config/边界/detect/plan 共 38 项及 CLI 库 18 项通过,adapter 常规测试通过(8 项 ignored 原生用例未执行)。曾因回归目标名写错而未运行 CLI 回归,已更正实际目标名后通过;Clippy 首次发现新导出位于 test module 之后;首次调整漏掉了导出,第二次已恢复到测试模块之前,新增 adapter 3 项与 init 28 项重跑通过;该阶段 Clippy/格式已通过;分段文本修复后的最终轮次见补充记录。 + +真实 CLI init 输出经现有 JSON Schema 验证:当前图正例与历史图正例有效,6 个错误状态/摘要/条件/scope/来源/完整性反例拒绝;验证辅助不是产品 Python 实现。初始化未执行 Maven 或 wrapper,刷新依赖版本改变图且保留人工任务备注、重复刷新幂等。OpenSpec strict 与 diff 检查通过,完整计划仍未完成,9.18 不勾选。验收:相邻 codeguard-cli/tests/acceptance/maven-static-module-graph.md。 + +补充:复核发现 XML 注释切分文本时首段可能错误匹配另一模块;新增反例先失败,现拒绝分段标量并记录 unresolved。adapter 4 项与受影响 CLI 66 项重跑通过;追加 Scenario 的 OpenSpec strict 与 diff 校验通过。最后一轮 workspace all-target Clippy(-D warnings)与格式检查均终态通过。 + +## 2026-09-26 Cargo 静态模块图 + +同次 Cargo.toml 字节观察新增 CargoModuleModel;模块图 0.3 区分成员聚合与 path 依赖,保留 normal/build/dev、来源清单摘要与声明条件。package 重命名核对真实目标包名;workspace/optional/target、通配/排除、外部/缺失/逃逸目标及版本/feature 解析缺口保持 unresolved。依赖完整性 false,不用于缩小检查。历史 0.1/0.2 schema 单独保留。 + +新增 init 用例先因旧图 0.2 没有 Cargo 声明而失败。实现后 Cargo adapter 3 项、Maven adapter 4 项,CLI 受影响契约 69 项(init 31、detect 20、check-plan/config 各 6、边界/plan 各 3)与 CLI 库 18 项通过。刷新更名依赖会移除旧边并保留人工备注,重复刷新幂等;没有生成 Cargo.lock/target,也没有执行 build.rs。 + +实际 CLI 产物通过 JSON Schema 验证,5 个错误 scope/basis/status/摘要/完整性反例拒绝,0.1/0.2 历史正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查均终态通过。产品观察/投影是 Rust,schema 辅助不作为产品 Python 实现。未执行 Cargo 有效模型、完整 workspace/所有原生语言检查或端到端交付;完整计划仍在实施,9.18 不勾选。验收:相邻 codeguard-cli/tests/acceptance/cargo-static-module-graph.md。 + +## 2026-09-26 逐清单 Java/Rust 语言目标 + +相邻 Rust adapter 扩展同次清单模型;project profile 0.3 保留 Java compiler release/source/target 与 Rust rust-version/edition 的逐清单 declared_only 事实、构建根和原始摘要。汇总语言版本、本机版本保持 unknown/null,不用包版本、默认值、父/profile/workspace 推断。变量、重复/嵌套/分段 XML、继承/错类型/非法值记录具体缺口;旧 profile 0.2 schema 单独保留。 + +新增 init 用例先因 profile 仍为 0.2 失败,实现后语言目标 adapter 4 项、Cargo/Maven 3/4 项、CLI 契约 71 项与 CLI 库 18 项通过。声明由变量变为 17 后画像刷新并保留人工任务备注,重复刷新幂等。实际 CLI profile 通过 JSON Schema,6 个语言/edition/status/摘要/来源/伪造本机版本反例拒绝,历史 0.2 正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。 + +没有执行原生有效构建模型、安装或本机版本探测;没有运行完整 workspace/全语言/端到端交付,不能把声明当检查能力或质量通过。9.16/9.17 保持未勾选,完整计划仍有 265 项未完成。验收:相邻 codeguard-cli/tests/acceptance/declared-language-target-profile.md。 + +## 2026-09-26 init 画像的 JSON/human 反馈 + +init_plan 0.4 新增 profile_summary,在默认 dry-run 和 apply 反馈语言/文件数量、构建根、逐清单目标与未知状态。human 从同一结构投影,所有不可信路径/字段及已创建/冲突路径均转义;不公开原始清单、本机根路径,不把声明或写文件变成准备/质量通过。旧 init_plan 0.3 schema 单独保留。 + +新增用例先因旧输出 0.3 无摘要失败,实现后 init 36 项与受影响其它 CLI 契约 38 项、CLI 库 18 项通过。真实 CLI 验证 dry-run 不写文件、与 apply 摘要一致、两种格式同目标/未知状态、换行/ESC 目录名不生成伪造状态行,根路径不公开。真实 JSON 通过 schema,6 个伪造就绪/架构/有效模型/目标确认、缺摘要、交付 allow 反例拒绝;历史 0.3 正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 和 diff 检查终态通过。 + +未运行完整 workspace/原生全语言/宿主对话端到端,完整 readiness、准备任务及接线仍缺,9.25 不勾选,完整计划继续实施。验收:相邻 codeguard-cli/tests/acceptance/init-profile-conversation-feedback.md。 + +## 2026-09-26 init 检查配置反馈 + +init_plan 0.5 按构建根展示静态检查器配置的 configured/missing/invalid/unknown、来源、原因和下一步。每条固定 not_run、required_by_policy=null、gate_effect=none,整体 checker_inventory=partial;不把缺配置变成源码违规或把声明当执行成功,未知继承保持未知。旧 init_plan 0.4 schema 单独保留。 + +新增用例先因旧 0.4 无检查配置反馈失败,实现后 init 39 项与其它受影响 CLI 契约 38 项、CLI 库 18 项通过。实际临时项目验证四个 Maven 构建根状态及 human/JSON 一致;Python 缺 Ruff 配置不产生 finding,源码不变,dry-run 不落盘或启动检查。真实四状态输出通过 schema,6 个伪造配置通过/执行完成/必需策略/门禁/完整清单/缺下一步反例拒绝,旧 0.4 正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。 + +没有运行完整 workspace/全语言原生检查或宿主对话端到端;批准义务、准备任务与完整 readiness 仍未接入,9.24/9.25 不勾选,完整计划继续推进。验收:相邻 codeguard-cli/tests/acceptance/init-checker-configuration-feedback.md。 + +## 2026-09-26 preparation readiness 领域判定 + +新增分文件的要求/观察/状态/输入/结果契约和纯 evaluate_readiness。只处理批准且适用必需前置,以当前绑定和可信时钟检查证据;有效必需缺失/不兼容/冲突优先 incomplete,未探测/未解析/过期/错绑定/歧义为 unknown,完整非空适用集合全部满足才 ready。可选失败与旧证据不影响汇总。verified 字段是宿主输入约定,不构成本地 JSON 授权;CLI 未接入可信来源,init 仍 unknown。 + +新用例先因类型/函数不存在编译失败,实现后 readiness 8 项、受影响会话 8/门禁 32/init 39/边界 3 共 90 项,以及 core 单元/契约 9/8/5/3 通过。联合用例确认准备 ready 不提供缺失的原生检查证据,交付仍 incomplete;不从零阻塞/零必需集合或可选缺工具推导假就绪。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 和 diff 检查终态通过。 + +这些是领域合成输入,不证明真实工具探测或批准/来源核验;未运行完整 workspace/原生全语言或宿主端到端。可信来源、实际准备清单、任务规划/持久化及 CLI接线仍缺,9.25 不勾选,完整计划继续实施。验收:相邻 codeguard-cli/tests/acceptance/preparation-readiness-domain.md。 + +## 2026-09-26 Maven/Cargo 直接包版本画像 + +已有 package_declared_versions 现在记录当前清单直接包版本,绑定同批原始字节 SHA-256。Maven 不要求完整 GAV,不从父/profile 或变量恢复;只观察有界字面值,不证明 Maven 生效语义。Cargo 使用本地已缓存 semver 1.0.28(锁文件固定)校验直接字符串,保留预发布和构建标识;继承、错类型和非法版本保持未知。包版本与语言目标/本机版本分离,画像刷新保留人工任务记录并幂等,不执行项目构建器。 + +新增混合项目用例先因包版本字段 Null 而失败,实现后 init 41 项通过。package version 2 项、Cargo 模块 3 项、Maven 模块 4 项通过;检测/配置/检查计划/计划预览共 35 项与 CLI 库 18 项通过。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查通过。验收入口及反例见相邻 codeguard-cli/tests/acceptance/declared-package-version-profile.md。 + +依赖边界检查首次因新增 semver 未登记而失败;将其限定为 adapters 普通解析依赖后,4 项边界用例通过,反例拒绝 core/runtime/CLI 和 adapter 构建依赖。重新运行 all-target Clippy 与格式检查均终态通过。 + +未运行完整 workspace、全语言原生检查或宿主端到端。其它生态、有效构建模型、解析依赖版本、本机版本探测与可信准备任务仍缺,9.16/9.17 不勾选;完整计划保持进行中。 + +## 2026-09-26 准备任务领域规划 + +核心 plan_preparation 使用同一 readiness 输入与当前判定。已确认必需缺失/不兼容/冲突分别规划恢复、兼容复核、冲突决策;未知只要求重新核验,不保留过期或错绑定的旧诊断。工作区内稳定逻辑键不受绑定/状态变化影响,当前绑定更新,任务排序与重复规划幂等。未核验来源、非法/重复要求不生成行动任务,可选/不适用/满足条件不生成修复任务。固定中文步骤和关闭条件不拼接项目命令,不自动执行/安装或产生质量 allow。 + +目标用例先因类型/函数缺失失败。实现后规划 7 项、readiness 8 项、init 41 项、边界 4 项、交付门禁 32 项、检查会话 8 项共 100 项通过,core 单元/契约 9/8/5/3 共 25 项通过。部分清单仍保留已确认阻塞与未知兄弟,旧证据不误导安装;向计划注入 delivery_decision 被严格消费拒绝。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。验收见相邻 codeguard-cli/tests/acceptance/preparation-task-planning.md。 + +证据为合成领域输入,不证明真实工具探测或批准来源。未运行完整 workspace/全语言原生或宿主端到端。真实要求生产、证据/历史关联、工作区持久化、doctor/check/sync/next 与 CLI 接线尚缺,9.25 不勾选;完整计划保持进行中。 + +## 2026-09-26 tools verify 只读 CLI 接线 + +新增 tools verify 入口及 human/JSON 同源反馈,默认读取 codeguard.lock.json 或显式候选,有界普通文件读取拒绝链接锁。复用工具三来源及独立 runtime/bundle 核验,逐项展示摘要/可执行位、issue 和恢复建议,隐去路径与锁原文。仅当前平台条目形成观察,版本保持 lock_declared_only,字节匹配仅 matched_untrusted。固定 incomplete、authority=unverified、readiness=unknown、gate_effect=none 与退出 3,不启动 wrapper、联网、安装或写工作区。 + +入口缺失时最初 4 个用例因无 JSON 输出失败;实现及扩展后 CLI 8 项、静态身份 8 项、配置 6 项、边界 4 项共 26 项通过。测试 wrapper 含副作用但没有运行;运行时/目录包缺口与入口匹配分开。跨平台测试首次用了非协议平台名,改用正式平台清单反例后通过,未放宽解析。报告 0.1 schema 验证 2 份实际 CLI 输出及 6 项伪造批准/就绪/门禁/执行/版本反例。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查通过。 + +mock 及静态制品核验不是原生启动或可信工具锁来源证明。未执行完整 workspace/全语言原生或宿主端到端;tools list/install、可信锁来源、doctor 有界原生诊断、准备报告持久化及 work sync 仍缺,5.2/5.6 不勾选。验收见相邻 codeguard-cli/tests/acceptance/tools-verify-command.md;完整计划保持进行中。 + +## 2026-09-26 原生版本探测故障分类 + +runtime 新增分文件的原生版本请求/观察与共享探测服务,限制版本参数并核对工具前后字节、精确 stdout、无异常 stderr、私有日志及共同截止时间。超时/启动前耗尽/取消/spawn/signal/输出超限/管道/清理/平台/非零退出分别保留诊断码和 termination;版本不符、stderr、字节变化和记录失败不再合并。现有 Ruff 版本启动阶段复用服务,失败不继续源码扫描,结果没有策略批准或质量通过权限。 + +目标用例先因类型/函数缺失失败。模拟探测与显式选择真实 Ruff 的 7 项、边界 4 项、默认 Ruff probe 5 项、Python scan 6 项、runtime process 15 项/private log 6 项共 43 项通过。随后明确设置 CODEGUARD_RUFF_BIN,补跑原有两套各 5 项 ignored 真实 Ruff 0.16.8 扫描回归,共 10 项全部通过;没有把默认跳过当成通过。all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。 + +测试目录最初含 macOS 临时路径链接导致私有日志被拒,改用规范化路径而未放宽守卫。执行期间字节变化测试最初追加非法命令导致真实非零退出,修正成合法注释以验证零退出但制品变化。真实版本用例只调用版本;真实扫描用例单独证明已有局部 Ruff 配置/范围/报告行为,均不代表完整策略门禁。 + +doctor CLI、可信工具锁来源、完整兼容/环境诊断、其它适配器复用及准备报告持久化/同步仍缺;未运行完整 workspace、全语言或宿主端到端,5.2/5.6 不勾选。验收见相邻 codeguard-cli/tests/acceptance/native-version-diagnostics.md;完整计划保持进行中。 + +## 2026-09-26 doctor 局部配置/Ruff 入口 + +新增 doctor 命令及 human/JSON 反馈;默认只观察项目配置,工具未选择不等于缺失。仅显式绝对路径 Ruff 进入固定版本参数探测,复用统一 runtime、0700 私有临时运行区及空继承环境。单探测上限 10s 并受剩余总预算约束(默认 2m,静态发现非硬预算覆盖);脚本入口无隔离时启动前拒绝,Mach-O/ELF 格式筛选不代表批准或网络隔离。本地原生成功仅 observed_untrusted、版本 Ruff 0.16.8,公开输出无工具/临时路径或原生文本;readiness unknown、交付 not_evaluated、quality_checks not_run、gate_effect none。取消退出 130,其它局部状态退出 3。 + +目标行为缺失时三个用例因没有 JSON 输出失败;实现后 doctor 6 项(含显式真实 Ruff)、版本观察 7 项、初始化 41 项、工具核验 8 项、边界 4 项共 66 项通过。四份实际 CLI 未选择/缺工具/脚本拒绝/原生版本输出及项目摘要通过 doctor 0.1 和现有 init 摘要 schema;7 项伪造批准、ready、交付、质量执行、门禁、保存或必需策略反例拒绝。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查终态通过。 + +临时日志仅本次观察使用,不写 codeguard/ 或导入准备任务,persistence=not_saved;输出不是正式 PrerequisiteReport。可信锁/必需前置绑定、其它工具与运行环境、完整隔离/预算覆盖、持久报告与 work sync/next 仍缺。未运行完整 workspace/全语言原生或宿主端到端,5.2/5.6 不勾选;验收见相邻 codeguard-cli/tests/acceptance/doctor-local-ruff.md,完整计划继续实施。 + +## 2026-09-26 doctor 报告持久化与稳定环境任务 + +doctor 0.2 已在绑定工作区保存不可变报告并自动同步;显式 Ruff 失败产生稳定环境调查任务,原因变化记录独立观察且不增生任务。未选择不制造必需缺失,真实 Ruff 版本恢复后原任务仍 open;next 返回 doctor 恢复路径,不修改无关源码。落盘 queued 与对话 synced_partial/backlog_update_failed 分开,报告不原地改写。导入检查严格字段、预算、工作区及未获授权状态,拒绝伪造批准/就绪;保存目录链接被拒。旧检查器没有新增 null 诊断字段。 + +目标回归 54 项通过、10 项 ignored;CODEGUARD_TEST_RUFF 明确指向本机 Ruff 0.16.8,doctor 原生版本与恢复用例实际运行。10 份实际输出/落盘记录通过公开 schema;6 项伪造授权与通过反例拒绝。首次 Clippy 指出函数置于测试模块之后;移动时误放入局部函数,编译检查发现后改至模块级。最终 all-target Clippy(-D warnings)通过,格式、OpenSpec strict 与 diff 检查通过。详情见相邻 tests/acceptance/doctor-workspace-sync.md。 + +完整可信 PrerequisiteReport、批准义务/工具锁来源、其它工具、doctor 专用原生复检关闭及宿主端到端仍缺。没有运行全 workspace 测试、发布或安装,不勾选完整任务,目标保持进行中。 + +## 2026-09-26 doctor 环境任务原生复检 + +task verify 识别 python.ruff.doctor,复用固定版本诊断、剩余预算及报告同步,失败保留具体原因,未选择不推导恢复;成功仅 environment_restored_unverified_policy,原任务保持 open。next、同步时间序列及尝试账本接入 doctor 运行身份和严格报告分类。next 提示仅版本观察、核验批准前置并运行原受阻质量检查,未关闭或签发质量通过。 + +最初两个新增用例因不支持检查器失败;实现后 next 查询暴露尝试账本不识别 doctor run_id,补齐该消费者后通过。65 项相关测试通过、10 项 ignored;真实版本恢复用例显式指定 Ruff 0.16.8,默认不把未选原生环境算通过。12 份实际复检/原生/落盘/事件 schema 验证与 allow 篡改反例通过。all-target Clippy(-D warnings)及格式通过,OpenSpec strict/diff 检查通过。详见相邻 tests/acceptance/doctor-task-verification.md。 + +正式 PrerequisiteReport、可信义务来源、当前证据时效、全工具及正式关闭/重开尚缺;全 workspace 测试、其它原生与宿主端到端未运行,不勾选完整任务,目标保持进行中。 + +## 2026-09-26 tools list 声明库存入口 + +新增 tools list,共用有界锁读取、严格解析、三来源及独立运行时/发行包制品核验。稳定列出声明版本、适配器/规则来源、平台及具体制品缺口;其它平台仅 not_inspected,候选锁不获得必需策略或准备权限。公开报告固定 declared_lock_only、required_inventory unverified、required_by_policy null、readiness unknown、gate none 与退出 3,不启动 wrapper、联网、安装或写工作区。现有 verify 报告字段保持。 + +四项入口缺失测试先失败,实施后六项库存用例加八项原有 verify、八项身份、六项配置,共 28 项通过。五份实际库存 schema 验证覆盖缺锁、三来源及其它平台,五项批准/就绪/必需/门禁篡改被拒。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tools-list-command.md。 + +可信完整必需库存、tools install 与发行恢复未实现,全 workspace 测试/原生启动/宿主端到端未运行;5.6 保持未完成,继续原目标。 + +## 2026-09-26 受管安装原子缓存发布基础 + +新增 runtime 冻结字节发布 API,128 MiB 上限、非零预期 SHA-256、取消/预算检查;缓存根归属和权限检查,固定目录 FD 独占暂存、0700、同步/重读校验、linkat 不覆盖原子发布、最终普通文件再核验。正常清理本次暂存,不删除遗留/冲突目标;相同制品重新核验后复用。收据不表达批准或质量状态,正式来源批准/下载/CLI 尚缺。 + +初始五项测试因 API 缺失失败;补齐后十项普通发布用例通过,覆盖摘要、取消、期限、链接/FIFO、权限、硬链接、超限、遗留及并发恢复。fresh_report/private_log/边界/身份/工具 CLI 相关用例共 53 项通过。另显式指定本机 Ruff 0.16.8,1 项原生临时缓存发布及统一版本观察实际通过;未用默认 ignored 代替执行。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tool-cache-publication.md。 + +该基础不证明可信发行来源或全平台安装;不可中断文件系统调用和同用户改写不具有强隔离保证,发布后失败可保留完整制品并需重验。未运行全 workspace/Windows/网络下载/压缩包/宿主端到端,不勾选 5.3/5.6,继续完整目标。 + +## 2026-09-27 tools install 候选预览与 apply 边界 + +新增显式 --lock、默认 dry-run 的安装预览入口,共用有界静态锁/制品核验。候选报告绑定锁、二进制和来源引用摘要,区分当前/其它平台及恢复动作。来源尚未批准时 apply 明确 blocked_before_mutation,不启动、下载、写入或调用发布服务,固定 unknown/unverified/无门禁效果。 + +三个入口用例先失败;实施后工具 CLI/身份/配置共 32 项通过。三份实际输出 schema、两种模式冲突和四项伪造完成反例通过;all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tools-install-preview.md。可信源披露/批准、下载、发行包、正式 apply 与全平台/宿主验收仍缺,全 workspace 未运行;5.3/5.6 不勾选,目标继续。 + +## 2026-09-27 发行清单解析与精确锁绑定 + +新增 distribution-manifest 1.0 schema、严格有界解析及绑定 API,核对锁原始字节和精确制品身份;绑定重新验证对象,raw 交叉字段及两种归档相对入口分别限定。http 1.5.0 只解析 URI,无网络客户端;新增依赖边界验证。 + +11 项契约与 4 项 crate 边界通过(无 ignored);schema 4 正例/16 反例通过,all-target Clippy(-D warnings)通过。详细验收见相邻 tests/acceptance/distribution-manifest-binding.md。清单只表达声明子集;可信来源、下载、展开及正式 apply/CLI 接线仍缺,5.3/5.6 不勾选,完整目标继续。未运行全 workspace 或宿主端到端。 + +## 2026-09-27 tools install 显式清单预览 + +新增 --distribution-manifest FILE,0.2 报告及旧 0.1 schema 保留;有界读取、严格解析、原始锁精确绑定,固定状态和逐工具脱敏包声明。子集声明不证明其它工具/独立运行时覆盖,apply 继续写前阻塞。 + +22 项 CLI、11 项清单、4 项边界共 37 项通过;7 份实际报告 schema 和 4 项伪造权限反例通过。见相邻 tests/acceptance/tools-install-manifest-preview.md。可信下载、展开、批准发布、完整 apply/宿主验收仍缺,5.3/5.6 不勾选;未运行全 workspace,目标继续。 + +## 2026-09-27 展开前发行包流验证 + +新增 runtime 有界包流校验 API,精确大小、SHA-256 和共享截止时间;超长最多读取声明加一,读取前后检查预算/取消,中断继承预算,固定脱敏失败。验证只是冻结字节,不授予发行来源或安装权限。 + +6 项初始缺 API 测试失败,补齐及扩充后包流 9 项和缓存发布 10 项通过。临时缓存串联验证 raw 字节发布/复用;错误包不进入发布。1 项原生 Ruff 用例本轮 ignored,未计运行。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/package-stream-verification.md。网络层单次超时、HTTPS/TLS、可信下载及归档/正式 apply/宿主仍未接通;全 workspace 未运行,5.3/5.6 保持未完成,完整目标继续。 + +## 2026-09-27 静态输入 FIFO 卡住修复 + +先以独立子进程复现共享静态读取器在无写入端 FIFO 的 open 上阻塞,父进程超时后终止并回收,回归失败。Unix 打开增加 O_NONBLOCK/O_CLOEXEC,仍拒绝目标链接,并由同一句柄类型/大小检查拒绝特殊输入。 + +修复后 runtime 库 4 项、真实 FIFO 读取 1 项、CLI 命令 23 项和 crate 边界 4 项,共 32 项通过,无 ignored。CLI 中 install 的锁及清单 FIFO 均明确 unreadable/退出 3,不写工作区、无准备通过。格式、OpenSpec strict/diff 检查通过;见相邻 tests/acceptance/bounded-input-fifo.md。 + +此修复不保证任意文件系统硬超时或 Windows 特殊文件语义,未完成发行授权、网络下载、归档、正式 apply/宿主验收;全 workspace 未运行,完整目标继续。 + +## 2026-09-27 ZIP/tar.gz 内存展开基础 + +新增 runtime 归档请求/冻结文件及内存展开 API,固定 tar/zip/flate2 Rust 后端依赖且只允许 runtime 普通依赖接入。核对包/入口摘要,全成员路径、文件类型、重复/大小写/祖先冲突;最多 10000 成员、512 MiB 文件预算,tar 头和填充另给有界 16 MiB。gzip/ZIP 完整读取、损坏与隐藏尾部拒绝,ZIP 注释仍支持,SFX/加密/不支持算法及 tar GNU/PAX 等明确未完成。 + +三项缺 API 测试先失败,补齐后归档逐步扩充至 11 项;两格式均实际串联包流校验→内存展开→临时受管缓存发布。相关包流 9 项、缓存 10 项、crate 边界 5 项、清单 11 项和工具 CLI 23 项通过,共 69 项(1 项原生工具 ignored 不计运行)。见相邻 tests/acceptance/package-archive-expansion.md。 + +尚未实现全 tar 扩展、bundle 树核验/完整目录发布、实际下载、可信发行批准或正式 CLI apply;当前工具链不等于实际 MSRV/全平台验收,未运行全 workspace/宿主端到端。5.3/5.6 不勾选,完整目标继续。 + +## 2026-09-27 GNU/PAX 有界局部扩展 + +新增 TarExtensionState,逐记录精确长度及完整消费校验,GNU 有界 NUL 路径、局部 PAX path/size、无害全局描述。拒绝危险/重复/矛盾/孤立扩展、大小溢出及不支持的全局路径/大小、sparse/linkpath/字符集变换;不恢复权限、时间、所有权或 xattr。 + +两项正例先因不支持类型失败;PAX size 合法覆盖旧头又因相等限制失败,随后改为用 tar 头字段解析与校验和核对、按生效大小推进实际数据边界。标准 tar 迭代交叉核对旧头为零而 PAX size=4 的样本及后续 LICENSE 边界。完整 GNU UTF-8 路径覆盖旧头截断字节回归通过,局部扩展不跨成员。 + +归档 17 项、包流 9 项、缓存发布 10 项、crate 边界 5 项,共 41 项通过;1 项原生缓存用例 ignored 不计运行。最终 all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tar-extension-verification.md。全局 PAX/sparse/链接、bundle/目录发布、可信下载批准、CLI apply 与全平台/宿主尚缺,全 workspace 未运行;5.3/5.6 不勾选,完整目标继续。 + +## 2026-09-27 完整内存树与既有 bundle 摘要关联 + +新增 UnpackedArchive、完整树展开入口及内存 hash/verify;保留空目录、补全父目录,旧文件集合接口仍可用。公开对象重验规范路径/父目录/冲突/总量,单文件和树资源边界与既有本机 bundle-tree-v1 对齐;按本机 Path 排序及原目录栈顺序记录,内容按块检查共享预算/取消。 + +三项初始 API 缺失测试失败;实施后真实临时目录和内存树摘要精确相同,乱序不变、库篡改/空目录缺失/伪造形状/无效预期摘要/取消到期均拒绝或失配。两种归档验证空目录及隐式父目录保留,父目录大小写冲突拒绝。归档 19、包流 9、缓存 10、原有制品身份 8、边界 5、完整树 3,共 54 项通过;1 项原生缓存用例 ignored 不计运行。最终 all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/unpacked-bundle-tree.md。 + +此处仅本机内容等价验证,不是可信批准或正式安装。包前缀到锁 bundle 根的映射、完整目录原子发布、网络下载/批准、CLI apply/恢复及全平台/宿主尚缺,全 workspace 未运行;5.3/5.6 不勾选,完整目标继续。 + +## 2026-09-27 显式归档目录投影 + +完整原树先验证,显式规范目录按路径边界去前缀;选中空目录保留,未消费成员以原路径和内容返回,不复制文件内容。只读投影核对既有 bundle 树摘要,不授予来源或安装批准。初始四项契约因 API 缺失失败;实施后 projection 4、归档 19、包流 9、缓存 10、完整树 4、制品身份 8、crate 边界 5,共 59 项通过。包括投影实际写入临时目录与既有 CLI 摘要一致,以及兄弟目录、非法外部成员、缺根/错根、篡改和取消/预算反例。1 项原生缓存用例 ignored,不计运行。all-target Clippy -D warnings 通过。详见相邻 tests/acceptance/bundle-root-projection.md。 + +正式发行清单映射、可信来源、实际下载、目录发布、CLI apply/恢复及平台/宿主验收仍未完成;未运行全 workspace,5.3 不勾选。 + +## 2026-09-27 发行清单 1.1 与 bundle 内容关联 + +两项清单测试先因不支持版本/字段失败,三项内容关联测试先因 API 缺失编译失败。实现后清单 13、关联 3、安装观察回归 23,共 39 项通过。固定 ZIP 实测包大小/摘要、精确入口、完整树与指定 bundle 根;错包/入口/根/锁、缺映射、取消和到期均拒绝。schema 4 正例/10 反例通过,旧 1.0 schema 单独保存。all-target Clippy -D warnings、格式检查通过。见相邻 tests/acceptance/distribution-bundle-binding.md。 + +内容关联不授予批准或安装完成;实际缓存根映射、可信来源/下载、目录发布、CLI apply/恢复与平台/宿主验收仍缺,未运行全 workspace,5.3 保持未完成。 + +## 2026-09-27 完整工具目录发布基础 + +新增 macOS/Linux publish_tool_bundle、目录 FD I/O、独占暂存清理与 InstalledBundle。冻结完整树/预期摘要先验证;成员以 0700 写入,文件/目录同步并重新比较成员集合、内容及类型/权限/单链接,原生独占重命名发布,不覆盖已有目标。最终再次核验,同树并发只有一个新发布,另一方核验后复用。发布收据不包含批准权威。 + +初始 5 项 API 缺失编译失败;实施后 6 项目录发布、4 项投影、10 项已有缓存及 57 项 CLI 相关测试,共 77 项通过。1 项原生缓存 ignored,不计运行。包括真实暂存出现后取消清理,以及固定发行包经清单/锁/入口/子树关联后发布,并与既有磁盘 bundle 摘要精确一致。Clippy 曾指出新增测试无用闭包/单位绑定,已修正,重跑串联 4 项和最终 all-target Clippy -D warnings 通过。OpenSpec strict/diff 检查通过。 + +本机仅 macOS 实测;Linux/Windows、跨进程及故障注入全集、同权限恶意进程隔离未验收。缓存根到锁路径映射、未消费包成员与运行时、可信下载/批准、正式 CLI apply/恢复/宿主验收仍缺;未运行全 workspace,5.3 保持未完成。详见相邻 tests/acceptance/tool-bundle-publication.md。 + +## 2026-09-27 完整安装布局与原锁定位 + +清单 1.2 声明完整 install_tree_sha256,归档必需/raw 禁止,旧 1.0/1.1 保持观察但不能猜布局。绑定精确锁入口和可选 bundle 根到同一完整树内容寻址目录,不重写锁。只读布局保留全部原包路径/普通成员/空目录,核验完整树及可选子树;空包内根与无 bundle 均可核验。 + +新增契约先因 API 缺失编译失败;5 项包/布局、14 项清单、23 项观察、8 项制品身份、5 项边界,共 55 项通过。实际临时缓存发布后原锁的入口摘要/基础可执行位和 bundle 摘要一致。bundle 外内容不符即使重建相符声明/锁路径也被完整树拒绝,错入口/根亦拒绝。schema 5 正例/7 反例与 all-target Clippy -D warnings 通过;增强精确错误码后目标契约重跑通过。见相邻 tests/acceptance/distribution-layout-binding.md。 + +正式 CLI 布局反馈、可信来源/下载、raw/运行时安装、恢复及其它平台/宿主尚缺;未运行全 workspace,5.3 不勾选。 + +## 2026-09-27 安装布局预览反馈 0.3 + +新契约先因反馈仍是 0.2 失败;新增脱敏 layout 投影与 JSON/human 阶段解释,完整声明绑定、缺完整树及 raw 不适用分别显示,内容核验 not_run,未批准 apply 不写入/不准备/不放行。0.2 schema 独立保存,新枚举覆盖 bundle/完整布局错误原因,禁止格式/阶段矛盾。 + +24 项命令、14 项清单、5 项包/布局、5 项边界,共 48 项通过;补 human 与 raw 断言后命令 24 项再次通过。最终 schema 的 8 份真实命令输出通过;4 个伪造批准/准备/写入/内容完成与 2 个阶段矛盾被拒,旧 schema 拒绝新版本。all-target Clippy、目标 Clippy、格式检查通过。见相邻 tests/acceptance/tools-install-layout-preview.md。 + +来源批准、实际包下载/核验/安装、raw 定位、恢复与平台/宿主仍缺;未运行全 workspace,5.3/5.6 保持未完成。 + +## 2026-09-27 raw 内容与原锁缓存定位 + +新增 1.2 raw 精确入口约束和不可变借用内容 API;旧清单不猜定位,错误路径连同相符来源摘要仍拒绝,包长度/摘要/原锁字节与共享期限/取消均核对。结果不复制制品内容,Debug 不输出原字节,不赋予来源/门禁权威;预览相符新版定位指向后续包内容核验,旧版要求映射,content_verification 仍 not_run。 + +初始因 API 缺失编译失败;4 raw、14 清单、5 包/完整布局、25 命令、5 边界,共 53 项普通测试通过。另显式 CODEGUARD_TEST_RUFF=/opt/anaconda3/bin/ruff 执行真实 0.16.8 字节关联/临时私有缓存发布/runtime 原生版本观察,1 项通过,2.17 秒。该未批准测试声明未下载或执行 lint,不证明规则覆盖/发行批准。4 份实际 raw 预览 schema 与伪造内容完成反例通过;all-target Clippy -D warnings 通过。见相邻 tests/acceptance/distribution-raw-binding.md。 + +可信来源/真实下载、运行时安装、正式 apply/恢复和平台/宿主仍缺,未运行全 workspace,5.3 保持未完成。 + + +## 2026-09-27 有界 HTTPS 包传输 + +新增冻结请求与异步 runtime API,采用 TLS 验证、精确长度/摘要、五跳手动 HTTPS 重定向、显式 authority 范围、共享绝对期限/取消和固定诊断。不采用环境代理、自动重试或内容解压,不写缓存、不授予来源/安装权威。仅 cfg(test) 信任本地测试 CA;生产无根替换/关闭验证参数。 + +API 缺失先编译失败,TLS 正例在测试服务显式清除 macOS 接受连接的非阻塞继承后通过。加强反例要求请求已到达且诊断精确;gzip, chunked 新例先意外返回成功,生产增加编码校验后通过。11 TLS 与 96 相关不同回归通过;两个真实 Ruff ignored 不计已运行。154 已缓存 registry manifest 无高于 1.85 的声明,14 非本机/wasm 未缓存未核验;不是实际 1.85 或跨平台验证。见相邻 tests/acceptance/package-https-transport.md。 + +完整发行源/网络授权、清单到下载及发布正式接线、运行时安装、apply/恢复与宿主仍缺,未运行全 workspace,5.3 不勾选。 + +最终 runtime/CLI all-target Clippy -D warnings、cargo fmt --check、OpenSpec 严格校验与插件 git diff --check 均通过。 + + +## 2026-09-27 下载归档完整树及临时发布串联 + +新增 download_verified_archive,请求前校验包声明一致及展开输入,下载后原归档解析与入口/完整树核验使用共享预算。新测试最初因 API 缺失失败,实现后 15 HTTPS 目标项通过;新增 ZIP/tar.gz 和 raw 实际本地 TLS 至私有临时缓存证据,空目录/入口完整,错误树/包摘要拒绝,声明冲突/坏展开输入不发请求。见相邻 tests/acceptance/downloaded-package-publication.md。 + +来源与网络授权、正式 CLI 下载到安装编排、运行时/恢复、远端发行源及全平台/宿主仍缺,5.3 不勾选,未运行全 workspace。 + +最终回归:runtime 单元 19、归档 19、完整树发布 6、raw 缓存 10,共 54 项通过;1 项真实 Ruff ignored 不计已执行。runtime all-target Clippy -D warnings、格式、OpenSpec 严格校验及插件 diff 检查通过。 + + +## 2026-09-27 发行专属签名与清单/锁绑定 + +新增独立 distribution.v1 Ed25519 域和版本化载荷/封装,精确固定原始清单/锁、范围、序号和有效期,并继续严格制品绑定。API 缺失先编译失败;8 项目标签名契约覆盖篡改/协议重放/失效或撤销/回滚/范围/坏清单锁/输入限制。两份 schema 结构正例与必填缺失/未知批准反例单独校验,不等于密码学验证。见相邻 tests/acceptance/signed-distribution-binding.md。 + +独立宿主真实信任来源、轮换撤销及防回滚持久状态、网络许可、最终时钟和正式下载/install 编排仍缺,5.3 不勾选,未运行全 workspace。 + +最终验证:签名 8、清单 14、完整布局 5、raw 4、tools 预览 25,共 56 项通过;1 项真实 Ruff ignored 不计运行。两份 Schema 2 个结构正例/15 个缺字段或未知批准反例通过。CLI all-target Clippy -D warnings、格式检查、OpenSpec 严格校验和插件 diff 检查通过。 + + +## 2026-09-27 签名发行包与缓存发布编排 + +新增明确调用的离线包编排,绑定签名/原始锁与清单、本机平台和精确工具;raw 与完整归档布局在同一预算下核验并调用受控缓存发布,入口保持原锁。前/发布前/发布后可信时钟与签名复核,取消和截止共享,发布后失败不返回成功且重试必须重验。5 项目标契约先因缺 API 失败、实现后通过,见相邻 tests/acceptance/signed-package-publication.md。 + +真实宿主信任/撤销及防回滚来源、网络授权、正式 CLI 下载至安装编排、运行时/恢复、其它平台/宿主仍缺,5.3 不勾选,未运行全 workspace。 + +最终验证:发布编排 5、签名 8、完整布局 5、raw 4、tools 预览 25,共 47 项通过;1 项真实 Ruff ignored 不计运行。CLI all-target Clippy -D warnings、格式检查、OpenSpec 严格校验及插件 diff 检查通过。 + + +## 2026-09-27 签名网络下载及缓存发布编排 + +新增网络服务请求前核对签名/本机平台/精确工具/清单 1.2/宿主精确 authority,下载后进入签名包发布服务共享预算。前置五类反例无写入;显式固定 Rust 官方仓库提交 LICENSE-MIT,以测试 key/时钟调用生产公共 TLS 客户端,真实下载及临时发布 1 项通过(0.70 秒),内容不执行,未替代真实发行根。见相邻 tests/acceptance/signed-network-publication.md。 + +真实宿主信任/网络许可来源、正式 CLI apply 接线、原生工具包/运行时/恢复与全平台仍缺,5.3 不勾选,未运行全 workspace。 + +最终回归:网络前置 1、签名 8、发布 5、tools 预览 25、runtime HTTPS 15,共 54 项普通测试通过;另 1 项显式真实公共 HTTPS 下载发布通过。CLI/runtime all-target Clippy -D warnings、格式、OpenSpec 严格校验与插件 diff 检查通过。 + + +## 2026-09-27 Javadoc 明确 Maven 模式不回退单文件 + +真实 First 引用 Second 样本先复现孤立 JDK 探针的无关 native_execution_incomplete;现在明确 Maven 时只运行原 POM 多文件检查,缺前置保留具体原因而不回退,未选择 Maven 的 JDK 局部模式保留。反馈 0.23.0/Javadoc 0.3.0 显式区分模式及检查器,旧 schema 单独保留。真实警告与文档完整两轮均成功,不签发项目覆盖;两份实际反馈 schema 正例及四个混合模式/错检查器反例通过。见相邻 tests/acceptance/javadoc-project-mode-selection.md。 + +并行回归的 schema 旧版本断言已更新;另取消用例未在两秒内观察到任务齐备,独立重跑通过但根因未定位,不能声称消除。生效模型/类路径/生成源码/Checkstyle/任务门禁等仍缺,6.3 不勾选。 + +最终验证:Java check 24、partial 13(随后串行)、Javadoc CLI 4,共 41 项普通测试通过;另 3 项明确执行的真实 Maven/JDK 测试通过。2 个实际 Maven 报告与 1 个实际 JDK 单文件报告通过新 schema,4 个混合模式/错检查器反例被拒,旧 schema 拒绝新版。CLI all-target Clippy -D warnings、格式、OpenSpec 严格校验和插件 diff 检查通过。取消用例先前一次并行启动窗口失败仍未归因,不作为已解决问题。 + +## 2026-09-27 取消夹具准备屏障 + +受控慢准备复现旧断言失败,但实际报告确认两个任务已启动;旧 Rust 标记代表诊断准备而非启动。仅修正测试夹具,分离准备窗口与取消屏障并回收失败子进程,仍核验退出 130、诊断保留与子孙进程无迟到写入。默认并行 partial 13 项通过;随后三份受影响测试共 41 项通过、8 项真实工具未执行,Clippy 通过。见相邻 tests/acceptance/cancellation-preparation-barrier.md。此前偶发失败的主机负载原因未独立证实;生产取消代码未修改,完整 OpenSpec 任务不因此勾选。 + +## 2026-09-27 Checkstyle XML 纯解析 + +6.3 新增 Checkstyle 原生 XML 的 Rust 有界解析,保留完整 source/模块 ID、严重度、文件级零行与可选列;异常与无文件事件不制造源码违规。先因缺 API 编译失败,再完成协议夹具正反例。适配器整包回归 89 项通过、8 项原生工具未执行(其中 Checkstyle 当时 5 项);随后新增边界及混合异常断言,最新 Checkstyle 6 项全部通过。格式、adapter all-target Clippy -D warnings、OpenSpec 严格校验与插件 diff 检查通过。见相邻 tests/acceptance/checkstyle-xml-observation.md。 + +未执行真实 Checkstyle,原生执行/配置/范围/报告 freshness、任务/白名单/门禁和完整 Java 注释正反例仍缺;6.3 不勾选,未运行全 workspace。 + +## 2026-09-27 Checkstyle 原生参数和版本差异 + +参数规划先因缺 API 编译失败,新增 Rust CheckstyleCommand 后 2 项契约通过;XML 6 项回归通过。新增显式 Java/10.21.4 JAR 原生正反例入口,20 秒截止与回收/临时清理,但本机相关缓存没有找到 JAR,1 项真实测试未执行。原生源码核对发现 10.21.4 自定义 ID 在 source 中单独输出,修正了原生验收断言,并新增旧版 ID 原样保留测试;不猜测规则类名。adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验与 diff 检查通过,见相邻 tests/acceptance/checkstyle-native-command.md。生产执行及正式配置/任务/门禁仍未完成,6.3 不勾选。 + +## 2026-09-27 Checkstyle 真实运行与配置纠偏 + +从官方固定 release 获取临时测试 JAR,内容摘要见相邻 checkstyle-native-command.md;该摘要是本地观察,不是发行批准。真实测试先因无 DOCTYPE 的配置被原工具拒绝且无报告失败;采用原版 ConfigurationLoader 映射的内置标准 DTD 后,将验收调用接入统一 runtime 新鲜报告/私有日志/清空环境/20 秒截止。真实公共类型、缺 @param/@return、自定义模块 ID 及补全文档两轮 1 项通过(0.63 秒);另参数与解析 8 项通过。adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过。 + +没有任意项目配置的独立网络隔离或身份/范围证明;生产 Checkstyle 服务/正式 CLI、完整 Java 注释变体、任务/白名单/门禁仍缺,6.3 不勾选,未运行全 workspace。 + +## 2026-09-27 Checkstyle 退出/范围判定 + +新增 Rust evaluate_checkstyle_report,独立版本/冻结文件集合/正常退出一致性;空或重复预期范围、实际范围不符、异常/坏报告/退出冲突保持未完成。warning/info 退出零和 Unix 256 错误退出截断均保留诊断,未知版本/平台不套用本契约。目标 API 缺失先编译失败,4 项契约通过;连同解析/参数共 12 项通过。真实 10.21.4/Java 21 通过统一 runtime 运行 error/clean/warning 三轮,实际 XML 均经新判定,1 项通过(0.81 秒)。256 错误为协议夹具,非真实大规模执行证明。 + +adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过;见相邻 tests/acceptance/checkstyle-exit-scope-coherence.md。项目原配置/身份/范围权威及正式 CLI/任务/门禁仍缺,6.3 不勾选,未运行全 workspace。 + +## 2026-09-27 Checkstyle 输入绑定执行 + +新增单对象文件请求/结果与 runtime 编排,独立冻结四个不同物理路径摘要,执行前后复核且共同预算/取消贯穿。新鲜 XML/私有日志及原生范围退出已接线,输入变化保留局部报告但不产生完整结论。缺 API 先编译失败;4 项模拟契约覆盖配置中途变更、陈旧报告、摘要、截止取消和缺失/额外/别名身份,8 项 PMD 执行回归通过。另真实 10.21.4/Java 21 通过该生产服务进行缺注释/补全文档两轮,1 项通过(最终 4.93 秒)。CLI all-target Clippy -D warnings、格式、OpenSpec 严格校验与 diff 检查通过,见相邻 tests/acceptance/checkstyle-input-bound-probe.md。 + +该局部服务尚未接正式 CLI/project check;JDK 动态闭包、配置资源/自定义模块闭包、独立网络隔离、同用户篡改恢复竞争及可信原项目身份/规则范围仍未证明。完整注释变体、任务/白名单/交付门禁仍缺,6.3 不勾选,未运行全 workspace。 + +## 2026-09-27 Checkstyle 正式局部 CLI + +lint java --checker checkstyle 接入显式 Java/JAR/原配置与私有源码/配置快照,结束复核原输入;仅已支持的静态注释配置可直接调用,其它上下文不替换默认规则。缺入口时目标断言先失败,接入后命令 2、Javadoc 4、配置识别 2 共 8 项普通测试通过;实际 binary/Checkstyle 10.21.4/Java 21 1 项通过(3.94 秒),显示 1 条公共类型诊断。两份实际缺前置/原生反馈 schema 正例与 4 个伪造权威反例通过。CLI/adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过。见相邻 tests/acceptance/java-checkstyle-cli-local.md。 + +公开反馈 0.1.0 仍固定本地未核验、覆盖 false、交付 not_evaluated/退出 3;正式 project check、完整配置与工具闭包、所有注释变体、任务/白名单/门禁仍缺,6.3 不勾选,未运行全 workspace。 + +## 2026-09-27 Checkstyle 原生来源歧义纠偏 + +新增共享模块 ID 反例先复现旧配置识别错误接受;现在重复默认检查来源、共享自定义来源和同模块重复属性保持上下文待解析,不自动合并或选先/后值。同类检查的不同 ID 静态正例保留。真实 CLI 验证单规则原生诊断、两个模块共享 ID 时不生成活动 finding、改为独立 ID 后原生类型及参数/返回三条诊断,1 项通过(7.71 秒)。CLI 2、Javadoc 4、配置 3、退出/范围 4 共 13 项普通回归通过;CLI/adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验及 diff 检查通过。 + +见相邻 tests/acceptance/checkstyle-rule-source-ambiguity.md。该修正尚不证明批准规则/义务绑定、稳定任务或白名单门禁已接通;完整项目和配置上下文仍缺,6.3 不勾选,未运行全 workspace。 + +## 2026-09-27 Checkstyle 注释变体与生成范围 + +新增 MissingJavadocMethod/JavadocType 原模块识别,目标配置断言先失败后通过。实际 10.21.4/Java 21 CLI 验收 record 参数文档正反例、带参数/返回的 inheritDoc、Override/Generated 默认例外及移除注解的缺文档,保留同一行类/方法及单行方法体的原生行为差异;最终该真实用例通过(28.63 秒)。前两次期望 missingMethod 的断言失败,随后保持原生输出并新增多行方法体的正例,不删除诊断、不自动批准白名单。 + +另真实 Lombok 1.18.38(缓存 Manifest 与本地摘要核对)delombok 对照用例通过:原 @Getter 文件零诊断,展开 getter 文件 missingMethod;路径保持展开范围,不冒充原注解行。两个真实用例分别通过,普通配置/退出/CLI/Javadoc 回归共 14 项通过。CLI/adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过,见相邻 tests/acceptance/checkstyle-comment-variants.md。 + +样本不能证明所有 record 构造器、继承形式或 Lombok 注解/版本/编译类路径;生成来源、完整项目/规则范围与任务/白名单门禁仍缺,6.3 不勾选,未运行全 workspace。 + +## Checkstyle 修复反馈关联增量 + +局部反馈升级 0.2.0;普通 CLI 两项、绑定两项与真实 10.21.4 CLI 一项通过。验收说明见相邻 codeguard-cli/tests/acceptance/checkstyle-repair-feedback-binding.md。此增量不完成 6.3 的完整配置、项目覆盖与门禁。 + +补充验证:配置/退出范围/XML 回归 14 项通过,CLI/适配器全目标 Clippy 与格式检查通过;schema 两份真实输出通过、五个错误变体被拒、旧 0.1 消费者拒绝 0.2。首次路径断言按未规范化临时目录比较失败,改为规范化原输入路径后通过;未修改产品路径行为。OpenSpec 严格校验和差异空白检查通过。 + +## Checkstyle 显式工作台连接 + +新增局部报告、稳定 finding 导入、可读任务与 next 修复依据恢复;任务关闭与完整宿主门禁尚未完成。TDD 与历史收据误报修复详见相邻 codeguard-cli/tests/acceptance/checkstyle-local-workbench.md。 + +本轮最终验证:25 项普通回归通过;一项真实 Checkstyle 10.21.4 工作台回放通过(10.53 秒),覆盖同任务重复扫描、无关空行、配置变化、手工勾选及陈旧新报告拒绝。四份实际产物 schema 通过,三种错误授权/关闭变体及旧 0.2 消费者拒绝新反馈。CLI 全目标 Clippy、OpenSpec 严格校验及差异空白检查通过。 + +## Checkstyle 稳定任务原工具复检 + +34 项普通回归、六轮真实复检及工作台真实回归通过。暂未检出、规则失配和工具失败均不关闭任务;首次工具身份固定,后续观察不自授权。实现与反例详见相邻 codeguard-cli/tests/acceptance/checkstyle-task-recheck.md。 + +补充协议验收:两轮真实 still_present/缺前置复检及对应 next 产物通过三个专用 schema;错误 coverage_proven=true 被拒。首次 next schema 仍沿用 Ruff 的 lint-复检 ID 和缺少 incomplete 枚举而拒绝真实输出,已改为 Checkstyle 专用 run ID 与明确未完成值;未放宽授权字段。CLI 全目标及后续局部变更 Clippy、格式、OpenSpec 严格校验和差异空白检查均通过。 + +## Checkstyle 环境准备槽位 + +新增稳定环境任务、最新诊断投影与同范围后续原生观察指引;普通来源/幂等/备注/范围反例及真实原工具回归见相邻 codeguard-cli/tests/acceptance/checkstyle-preparation-tasks.md。正式关闭、模块粒度与可信批准仍未完成。 + +最终验证:27 项普通回归通过;已有源码工作台真实回归通过(10.03 秒),准备恢复真实回放通过(8.36 秒)。四份实际反馈/观察/任务/next 产物 schema 通过,旧 0.3 消费者拒绝新反馈;取消观察的 schema 与导入反例拒绝。后续同范围原生观察和配置变化失效均按实际产物验证。全目标 Clippy、格式、OpenSpec 严格校验与差异空白检查通过。 + +## Checkstyle 环境准备任务复检 + +原工具 task verify 接通准备任务,局部恢复产生的原生源码 finding 进入稳定任务;仍受阻与恢复均保存原因/历史且保持任务 open。53 项普通受影响回归通过,真实 Java/Checkstyle 恢复回放通过(8.36 秒);实际 blocked/recovered 报告、反馈与 next 专用 schema 通过,错误覆盖声明被拒。租约反例无执行与事件;临时工作区字段对历史读取的误报已修正。完整准备义务与可信关闭尚缺,详见相邻 codeguard-cli/tests/acceptance/checkstyle-preparation-recheck.md。 + +本轮最后检查:Rust 全 workspace/all-targets Clippy(-D warnings)、格式检查、OpenSpec 严格校验和插件差异空白检查通过;不扩大为完整计划验收。 + +## Checkstyle 准备尝试无进展闭环 + +专用测试先复现失败复检导致第二次修复 task_not_actionable,随后修正有效输入下的前置恢复指引。两轮 ready-to-verify 的 still_blocked 原生复检各自绑定尝试并计入预算,第三次重复动作被拒,next 要求决策且任务 open;源码变化反例仍要求复检。29 项相关普通回归与显式真实恢复回放(9.28 秒)通过,详见相邻 tests/acceptance/checkstyle-preparation-recheck.md。正式关闭与完整义务仍未实现。 + +## Checkstyle 恢复尝试交接与工具观察失效 + +真实准备恢复事件关联 ready-to-verify 尝试,解除等待状态且保留开放任务;修改测试复制 JAR 的字节后旧恢复结论不能继续用于 task show/next。原反例在正确 task 字段上复现旧恢复仍显示,产品修复后扩展回放通过(10.28 秒)。39 项普通受影响回归、CLI 全目标 Clippy(-D warnings)、格式、OpenSpec 严格校验与插件差异空白检查通过;仍不代表批准或正式关闭。 + +本轮后续六轮真实 Checkstyle 源码复检回归通过(45.25 秒),未扩大为完整项目验收。 + +## Checkstyle 失效原因与状态消费者 + +原复检原因与当前输入失效原因分开,status 任务摘要保留二者;真实 JAR 改动和删除回放通过(9.77 秒)。17 项普通相关回归、CLI 全目标 Clippy、格式、OpenSpec 严格校验与差异空白检查通过。实际反馈/简报/status schema 通过,覆盖伪造和任务 closed 变体被拒;不代表完整批准与关闭协议。详见相邻 tests/acceptance/checkstyle-preparation-recheck.md。 + +## Checkstyle 当前失效优先于历史 still_present + +真实配置改动反例先复现失效状态被旧 still_present 覆盖成 actionable。调整当前工具、配置、已绑定源码核对的优先级后,扩展六轮真实回放通过(57.00 秒),覆盖配置注释和源码空行变化后的 task show。33 项普通相关回归、实际三类失效简报/schema、CLI 全目标 Clippy、格式、OpenSpec 严格校验及差异空白检查通过。任务保持 open,完整义务和可信关闭仍缺;详见相邻 tests/acceptance/checkstyle-task-recheck.md。 + +## 原生字段 Javadoc 适配 + +增加 JavadocVariable 精确原配置绑定和本版 scope/excludeScope/ignoreNamePattern 原参数;原生报告生成字段修复任务并支持同任务复检。TDD 暴露未知类与范围参数被拒后完成修正。26 项普通回归、三轮真实字段回放(24.99 秒)、实际字段 finding/任务/复检/失效简报 schema、覆盖与关闭伪造反例通过。CLI/adapter 全目标 Clippy、格式、OpenSpec 严格校验及差异空白检查通过。只验证 public 范围与指定忽略/字段/局部变量边界,不冒充枚举常量及完整 Java 义务验收;6.3 保持未勾选,详见相邻 tests/acceptance/checkstyle-field-javadoc.md。 + +## 字段访问范围与原生必需 token + +静态 JavadocVariable tokens 支持经 TDD 先失败后实现,未知 token 和跨模块借用拒绝。七组真实范围/枚举回放通过(32.86 秒);scope public/protected/package/private、excludeScope、配置字段 token 和配置枚举 token 的结果逐项核验。固定 10.21.4 JAR 的 getRequiredTokens 返回 VARIABLE_DEF,因此仅枚举配置仍检出字段,修正规格和预期而不篡改原输出。同行枚举 Javadoc 被原工具检出的首次假设错误已记录,正常文档夹具改为独立行。17 项普通回归、全目标 Clippy、格式、OpenSpec 严格校验和差异空白检查通过。完整项目义务及其它语法仍缺,6.3 不勾选;详见相邻 tests/acceptance/checkstyle-field-javadoc.md。 + +## Checkstyle 官方名称与稳定任务归属 + +官方完整名称的纯绑定先因返回 None 失败,再完成固定名称映射;支持既有五类 Javadoc 检查的短名/Check 后缀短名/官方完整名及 Checker/TreeWalker 完整名。未知包名和同 source 的短名/完整名重复声明拒绝,原 XML 不重写。28 项普通相关回归、字段四轮真实名称与复检回放(21.95 秒)、CLI/adapter 全目标 Clippy、格式、OpenSpec 严格校验和差异空白检查通过。字段三种名称复用同一 finding/task,无伪配置 blocker;其余检查类本轮仅有名称绑定回归,完整配置及门禁仍缺。6.3 保持未勾选,详见相邻 tests/acceptance/checkstyle-official-module-names.md。 + +## MissingJavadocMethod 原配置参数 + +静态原参数绑定先因不支持返回 None 失败,实现后支持范围、注解、属性方法、方法长度和名称正则,原 XML 保留,非法及跨模块静态参数拒绝。19 项普通相关回归、四组真实配置筛选回放(19.03 秒)、CLI/adapter 全目标及最终夹具单测试 Clippy、格式、OpenSpec 严格校验和差异空白检查通过。单行非空方法不检出的最初误解由固定 JAR 行数/默认阈值逻辑核对后纠正,多行夹具区分属性 true/false;原工具规则未重写,零诊断不关闭历史任务。完整构造器/record/token 和项目生效模型仍缺,6.3 不勾选,详见相邻 tests/acceptance/checkstyle-missing-method-properties.md。 + + +## 2026-09-27 MissingJavadocMethod 原生 token 选择 + +静态绑定新增模块限定的 METHOD_DEF/CTOR_DEF/ANNOTATION_FIELD_DEF/COMPACT_CTOR_DEF,跨模块或未知 token 不猜测。目标测试先失败,修改后绑定七项及配置四项通过;真实 Checkstyle 10.21.4/Java 21 五组选择与两次紧凑构造器复检共七轮通过(51.11 秒),稳定任务不重复、原生修复候选不关闭事实。见相邻 codeguard-cli/tests/acceptance/checkstyle-method-tokens.md。任务 6.3 仍未完成,未宣称完整项目或批准门禁。 + +该增量的 20 项普通目标/回归测试通过(adapter 11、CLI/workbench 9);显式原生用例单独运行通过,不将其它 ignored 用例计入已运行证据。受影响两 crate 全目标 Clippy、cargo fmt --all --check、OpenSpec strict 与 git diff --check 均退出 0。 + + +## 2026-09-27 Checkstyle 原始配置连续性 + +真实字段任务在增加 ignoreNamePattern 后原生零诊断,旧复检错误显示缺失候选;先 RED 后修正,简报现从首次摘要绑定报告恢复 original_configuration_input,classify 在问题缺失时核对首轮配置摘要,连续两轮配置排除要求 rule_coverage_requires_review。恢复原配置并实际补注释后仅给 candidate_absent_unverified_policy,事实仍 open。四轮原生执行通过(40.99 秒);可选新增 schema 字段保留旧简报可读性,缺身份不沿用修复候选。语义等价配置、批准来源及正式关闭仍缺,9.7 不勾选。 + +该修正的 CLI/workbench 九项普通回归、实际原生准备/源码报告与简报 schema、全目标 Clippy、fmt、OpenSpec strict 和 diff whitespace 检查通过。token 矩阵原首轮使用全 token,后续使用仅紧凑构造器 token;其源码补文档后的期望须随本修正改为 rule_coverage_requires_review,早前该矩阵给出局部候选的验收结论不再代表当前行为。首次配置不变的字段修复正例仍给出局部候选。 + +最终代码下,调整期望的 token 矩阵七轮原生复跑通过(42.08 秒),目标测试 Clippy 与 fmt 再检查通过。 + + +## 2026-09-27 JavadocMethod 原生标签参数 + +核对固定 Checkstyle 制品 API/token 后,新增 JavadocMethod 专属访问修饰符、允许缺参数/返回、throws 校验与共享注解/token 静态适配;未重写原 XML。合法参数测试先 RED 后修正,绑定八项及配置四项通过;真实六组原生配置按预期产生 4/2/2/0/2/5 项诊断,恢复首次配置后 still_present 与真实文档修复局部候选的两次复检通过,八轮共 57.23 秒。稳定事实保持 open,允许标签选项不自成白名单。全语法、项目配置/覆盖及批准仍缺,6.3 不勾选,验收见相邻 tests/acceptance/checkstyle-method-tag-options.md。 + +该增量 21 项普通目标/回归(adapter 12、CLI/workbench 9)通过;上述八轮原生测试单独显式运行通过,其它 ignored 用例不计入本轮运行证据。受影响两 crate 全目标 Clippy、fmt、OpenSpec strict 与 git diff --check 均退出 0;未修改反馈协议字段。 + + +## 2026-09-27 原生类型注释配置 + +核对固定制品 API/token 后补齐类型检查范围/注解/标签参数,原 XML 不重写;合法参数先 RED 后修正,绑定九项及配置四项通过。十组原生配置按预期产生 MissingJavadocType 5/4/1/1 与 JavadocType 2/1/1/0/1/1 项诊断;恢复首次 typeTags 配置并真实修正文档复检形成局部候选,事件保存、事实均 open,十一轮 58.02 秒。作者/版本格式只有静态适配证据,其它 Scope/全部 token 语法、完整配置与批准覆盖仍缺,6.3 不勾选。验收见相邻 tests/acceptance/checkstyle-type-options.md。 + +该增量 22 项普通测试(adapter 13、CLI/workbench 9)通过;原生十一轮单独显式执行,其它 ignored 不计入本轮证据。Adapter 全目标和受影响 CLI 工作台目标 Clippy、fmt 检查通过。 +OpenSpec strict 与插件 git diff --check 均退出 0。 + + +## 2026-09-27 类型作者/版本格式及修复指引 + +原 JavadocType 指引只有参数核对,作者/版本诊断缺实际修复方向;目标断言先 RED,修正后保留项目事实及不编造约束。固定 10.21.4/Java 21 的原 author/version 正则对缺失、错误、部分及完整补齐产生 2/2/1/0 诊断,原配置 task verify 为局部候选;无效正则两轮保持 incomplete,配置准备任务只新增一次、无源码 finding,事实仍 open。七轮真实执行通过(38.35 秒)。静态绑定十项及配置四项通过;完整正则/标签变体、项目模型及批准门禁仍缺,6.3 不勾选。验收见相邻 tests/acceptance/checkstyle-type-formats.md。 + +该增量普通目标/回归共 23 项通过(adapter 14、CLI/workbench 9);原生七轮单独显式运行,其它 ignored 不计入。Adapter 全目标与 CLI 工作台目标 Clippy、fmt、OpenSpec strict 和插件 git diff --check 均退出 0;未新增反馈字段。 + + +## 2026-09-27 原生正则配置失败修复方向 + +核对固定原生 stderr 后新增有界纯失败分类:254 正常退出、官方非法属性和正则因果异常组合;只有不一致/缺失报告时细分,不向对话回显值或堆栈。公开反馈与准备简报新增正则配置修复方向。分类 API 缺失先 RED 后实现,probe 缺报告且输入变化再 RED 后修正为冻结输入/取消/截止优先;正常一致报告仍保留。真实七轮格式回放通过(38.75 秒),验证特定 reason、对话动作与准备简报,事实保持 open。未知失败/其它版本/完整项目及批准覆盖仍缺,6.3 不勾选,验收见相邻 tests/acceptance/checkstyle-regex-failure-guidance.md。 + +普通目标/回归共 49 项通过(adapter 15、probe 5、CLI/workbench 9、next 6、status/show 4、task verify 10)。原生七轮显式回放通过,另一次实际原生配置失败的反馈与准备简报 schema 校验通过;未计入其它 ignored。两 crate 全目标 Clippy 通过;随后缺报告输入变化修正的 CLI lib/probe Clippy 与五项 probe 回归通过。最终 fmt、OpenSpec strict 和 git diff --check 退出 0。 + + +## 2026-09-27 ESLint JSON 原生报告协议原型 + +核对 ESLint 官方 formatter 与 exit/max-warnings 文档后新增按对象拆分的有界 Rust 解析,保留 warning 和有效规则,区分 fatal/无 ruleId/suppression,核对具体版本、文件集合和计数。API 缺失先 RED 后实现;dot 路径额外反例因 Path 组件折叠再 RED 后修正为原始段检查。此为协议夹具,未安装/执行 ESLint,未接通生效 JS 配置、TS parser/monorepo、Node 闭包、CLI/依赖及任务门禁;7.3 保持未完成。验收见相邻 tests/acceptance/eslint-json-observation.md。 + +最终 22 项目标/回归测试通过(ESLint 7、既有 Checkstyle 15);adapter 全目标 Clippy、fmt、OpenSpec strict 与 git diff --check 均退出 0。当前原生 ESLint 执行为 NOT_RUN,JSON 夹具版本仅用于具体身份比较反例,不证明所标版本制品兼容。 + + +## 2026-09-27 ESLint 原生字面命令计划 + +缺 EslintCommand API 先 RED 后补齐固定字面 argv;显式 Node/JS/原配置/完整源码/独立报告与可选 max-warnings,禁用自动配置查找,不 Shell/npx/隐式改源码。四项路径/参数/重复/冲突/预算契约通过。显式 Node 24.18.0 的统一 runtime argv 观察脚本通过(0.05 秒),保留 metacharacters 字面、源文件/配置原字节,无 Shell 展开;不等于 ESLint 原生执行。闭包、物理别名、有效项目配置、ESLint/TS/monorepo/CLI/依赖及批准仍缺,7.3 不勾选,见相邻 tests/acceptance/eslint-native-command-plan.md。 + +最终 13 项普通目标/回归通过(ESLint 命令 4、报告 7、Checkstyle 命令 2),Node 字面 argv 原生测试另行显式运行通过;ESLint 原生仍 NOT_RUN。Adapter 全目标 Clippy、fmt、OpenSpec strict 和插件 git diff --check 均退出 0。 + +## 2026-09-27 ESLint 输入绑定受控执行 + +Rust 公开执行服务现通过统一 runtime 运行显式 Node/ESLint JS 入口的版本探测与扫描。完整显式摘要集合、物理路径、精确稳定版本、安全 run_id、私有新鲜报告、共享截止时间/取消和扫描前后输入复核均接入;错误不转换为源码违规。缺 API 编译 RED 后补齐模块与入口。初次实际 Node 夹具因原10秒预算在调试摘要校验阶段耗尽返回未完成;正常测试改60秒,独立截止时间拒绝反例保留。 + +最终19项普通目标/回归测试通过(ESLint 命令4、报告7、执行前检查1、Checkstyle 命令2及执行5)。实际 Node 七种受控 JSON 模式单项测试113.72秒通过,包括干净、warning、error、坏报告、错版本、扫描时输入变化、退出2/缺报告。它是项目自有JS夹具,不是 ESLint 原生检查;原生 ESLint NOT_RUN。CLI lib/新执行测试 Clippy、adapter 全目标 Clippy、fmt、OpenSpec strict 和插件 git diff --check 均退出0。验收见相邻 tests/acceptance/eslint-input-bound-probe.md。 + +JS配置/插件闭包、TS parser/tsconfig、monorepo、可信工具和项目有效配置、公开CLI/依赖审计及完整任务门禁仍未完成,7.3保持未勾选;局部执行一致不授予覆盖或白名单权威。 + +## 2026-09-27 ESLint 运行中断诊断 + +扫描实际启动后取消/超时,分别覆盖已写有效零诊断报告与未写报告四种 Unix 受控模式。扫描标记及报告存在性明确验证前提。取消且无报告反例先RED(一般报告失败覆盖取消),修正为请求中断/真实终止原因优先;版本留证失败也沿用。其它失败明确区分报告预检、执行留证、报告读取;退出2/无报告仍未完成,不是源码违规。 + +最终18项普通受影响/回归测试通过(ESLint 执行2、报告7、命令4、Checkstyle执行5),新增中断四模式测试3.28秒;实际Node七模式受控JSON复跑109.10秒通过。CLI lib/新执行测试Clippy、fmt、OpenSpec strict及git diff --check均退出0。夹具不是ESLint原生检查,原生ESLint仍NOT_RUN,完整7.3和整体实现验收仍未完成。 + +## 2026-09-27 ESLint 静态配置发现接入 detect/init + +按 ESLint 官方配置文件文档核对六种 flat config 文件名、TS loader 与配置选择上下文,新增 Rust 静态候选观察。package.json 再次读取须匹配本轮原摘要;配置候选字节纳入原有画像输入。嵌套配置所在根分别保留,不将文件存在当成规则生效、不执行JS、不隐式迁移旧配置。未观察到配置不证明外部/显式参数不存在,保持unknown并给原生核查动作。 + +新增两项先RED(无候选观察),实现后加嵌套TS配置反例。初次回归暴露既有init测试仍断言空列表;更新为精确node.eslint/unknown,保留不能声称就绪和改/删配置导致画像过期的原契约。最终67项通过(detect23、init41、discovery端口3),CLI相关Clippy、fmt、OpenSpec strict和git diff --check通过。原生ESLint、逐文件规则/导入插件闭包、TS parser/monorepo实际执行及完整7.3仍未完成。验收见相邻 tests/acceptance/eslint-static-configuration-discovery.md。 + +## 2026-09-27 ESLint 原生核心规则验收及发现补充 + +两项缺口先RED后修正:独立JS无package/config原来无准备反馈;package复核变更或不可读原来仍可能发现完整(flat config存在时还会隐藏具体原因)。现提供源码引用/核查动作,输入失效标发现不完整及清单阻塞路径。66项目标/回归通过(detect24、init41、发现端口1),执行层2项普通回归通过,共68项;相关CLI Clippy/fmt通过。 + +本轮找到本机既有npm缓存ESLint10.11.0,无安装/升级,使用显式Node24.18.0通过Rust runtime运行六轮真实原生检查:干净、no-unused-vars warning、no-debugger error、解析失败、eslint-disable抑制、同原配置修复复检,104.56秒通过。warning/error保留,解析/抑制待核查,零诊断不签发任务关闭或门禁允许。早先记录的原生ESLint NOT_RUN为当时边界,现只对该核心规则测试完成原生验收;TS/parser/tsconfig、插件/导入闭包、有效配置归属、完整CLI/任务/门禁仍未完成,7.3不勾选。见相邻 tests/acceptance/eslint-native-core-rules.md。OpenSpec严格校验与插件diff检查通过。 + +## 2026-09-27 ESLint 公开局部lint命令 + +接通lint typescript FILE与help,显式Node/JS入口/版本/原flat config/原cwd,避免按配置目录猜原调用上下文。缺上下文先RED(旧路由退出2),实现后返回准备反馈3;非法参数仍2。JSON/human显示原规则、位置、严重度与下一步;原生消息仅输出摘要,明确临时证据退出清理、workbench未接入、coverage=false、门禁未判定。 + +23项普通相关回归通过(CLI3/probe2/Go5/Python12/语言缺口1);本机既有ESLint10.11.0/Node24.18.0经过公开CLI检出no-debugger,源码修复后同配置零诊断,两轮35.44秒通过,均不签发项目通过。CLI lib/bin/新测试Clippy、fmt、公开缺上下文反馈Draft202012 schema校验、OpenSpec strict与git diff --check通过。未安装工具。完整项目、持久任务、TS/plugin/闭包/依赖和7.3仍未完成,验收见相邻tests/acceptance/eslint-public-lint-feedback.md。 + +## 2026-09-27 ESLint 稳定任务输入前置 + +持久化接线审查发现需要先稳定问题身份与原生Unicode定位。缺API先RED后新增投影:相对路径/规则/锚点/序号,排序去重;源码行号与原生措辞变更不重复建问题,错误范围/定位使整组失败。UTF16列与CRLF、CR/LF、U2028/U2029处理避免字节列误判。 + +四项身份契约及CLI/probe共9项普通回归通过;现有Node/ESLint10.11.0原生定位三条no-debugger,emoji后列7与后两行2/3均与投影一致,0.23秒通过。Clippy/fmt、OpenSpec strict/diff检查通过,无安装。这里只完成稳定任务输入,未完成队列/任务/next接线,当前公开反馈仍workbench未接入,7.3/9.7不勾选;见相邻tests/acceptance/eslint-stable-task-input.md。 + +## 2026-09-27 ESLint 脱敏观察入队及稳定任务连接 + +当前公开lint typescript FILE --workspace ABS_PATH复核摘要后保存eslint_workbench_observation并同步稳定finding/任务;反馈0.2返回同步状态、next或next_error。严格导入拒绝自授权allow、错误范围/投影/输入;历史已消费报告按不可变字节收据处理。重复扫描保留同一任务与用户备注,status/task show展示开放状态。next核查本轮报告及首次工具/配置连续性,不从局部零诊断、抑制或勾选推断关闭。 + +配置改变后的备用指引回归先失败(recheck_argv[2]为python),修正后选择typescript及显式待核验的ESLint上下文。33项相关普通回归通过(身份4、CLI4、next6、status/show4、sync15);补充CLI工作台status/task show联通再跑1项通过。受控插件ID只是协议样例,未执行TS插件。当前公开feedback及actionable/失效配置两类简报以Draft202012 schema实测通过,目标CLI lib/bin/eslint_lint_cli Clippy -D warnings与fmt通过。 + +本机既有Node24.18.0与ESLint10.11.0通过公开CLI执行初始化后两轮真实检查,no-debugger发现入队,原配置修复源码后零诊断,next转verification_required、任务仍open,两轮均退出3且coverage=false/delivery not_evaluated。显式ignored原生用例本轮69.88秒通过,无安装或升级。原生临时输出退出后仍清理,仅脱敏结构化观察持久保存。验收见相邻tests/acceptance/eslint-workbench-sync.md。 + +Node环境阻塞任务、原生完整证据留存、正式task verify关闭/重开、全项目/多文件、TS插件及配置闭包、依赖/CVE与真实宿主门禁未完成,7.3/9.7不勾选。全计划未完成,不同步/归档当前change。 + +## 2026-09-27 ESLint 检查完整性准备任务 + +早期缺上下文以及工具/配置/版本/报告未完成路径接通Rust准备观察、严格同步和环境任务,源码finding与准备任务分开。取消、外部目标、不支持范围与未初始化工作区不制造成功。诊断变化保留同目标稳定任务。next从最新已消费摘要绑定报告核对当前范围,较新有效扫描使旧环境任务转正式核查而非继续重复旧动作;仍不能关闭任务。human/JSON直接反馈当前任务步骤。 + +缺上下文用例先RED(not_connected),实现后重复两次只建一个blocker;缺工具更新最新诊断不建第二张任务,受控恢复后next转verification_required且复检路径仍为原源码;外部工作区目标拒绝。相关普通回归35项通过(身份4、CLI6、next6、status/show4、sync15),准备feedback及独立简报Draft202012 schema通过。实际现有Node24.18.0/ESLint10.11.0遇原配置不存在规则,公开CLI生成环境任务1/源码finding0,不签发门禁,显式ignored原生验收13.71秒通过,无安装/升级。最终Clippy/fmt检查见本轮结果。 + +完整构建模型和跨文件共同环境根因归并、正式关闭/重开、完整原生证据及真实宿主门禁仍未完成;7.3/9.7不勾选。验收见相邻tests/acceptance/eslint-preparation-workbench.md。 + +## 2026-09-27 ESLint 稳定任务原工具复检 + +task verify接通源码/准备任务,显式Node/ESLint入口/版本/原配置/cwd,参数预检查、租约、统一截止时间、同步与尝试历史复用现有Rust流程。不执行Markdown或历史报告里的程序。当前输入与首次原工具/配置连续性不一致时需核查;原生抑制不当修复。仍存在、局部消失候选、环境恢复或未完成均保留任务open,不签发allow或resolved。 + +缺上下文入口先RED(task_checker_unsupported),新事件又复现attempt历史不认识ESLint报告/时间,修正后next/status/attempt和重复扫描一致。57项相关回归通过(ESLint6、next6、status/show4、租约/尝试16、verify10、sync15),另分类1项通过,覆盖上下文变化、仍存在、抑制和目标错误。CLI夹具显式复检still_present与无上下文事件保存通过。实际既有Node24.18.0/ESLint10.11.0通过公开发现、任务复检仍存在、修复源码后同配置复扫、任务复检局部消失四轮,194.36秒通过;事件保存但任务保持开放,均局部门禁未判定,无安装/升级。 + +公开未完成及原生观察task verify反馈分别通过统一preview与eslint-task-recheck schema;实测发现原统一schema不认识ESLint,追加严格分支后通过。临时原生输出仍清理,只有脱敏结构化观察持久化。完整JS配置/导入闭包、required规则覆盖、TS插件/全项目源集、可信宿主策略和正式关闭重开仍缺,7.3/9.7不勾选,change不归档。验收见相邻tests/acceptance/eslint-task-verification.md。 + + +## 2026-09-27 ESLint 原规则有效配置核查 + +Rust task verify 增加同轮原生 --print-config 查询,绑定显式源码/主配置/Node/入口前后字节与统一截止时间;只保存规则级别、原因和摘要。复检协议0.2新增effective_rule,历史0.1仍只读识别。规则关闭或缺失时零诊断必须rule_coverage_requires_review,查询损坏/输入变化为未完成,next指向配置核查;不批准白名单或关闭任务。 + +44项普通相关回归及分类单元用例通过,最终9项规则解析/公开CLI普通测试、目标Clippy -D warnings和fmt通过。既有Node24.18.0/ESLint10.11.0原生启用/off/缺规则三轮38.50秒通过;实际公开CLI只改导入mode.cjs关规则、主配置和源码不变的反例108.38秒通过,仍要求覆盖核查且保存事件,无安装升级。受控CLI实际产物通过统一复检、ESLint复检及简报三份Draft202012 schema;简报lint-only复检ID正则先失败后补入eslint-task前缀。schema产物使用受控协议夹具,不冒充原生工具验收。 + +完整导入/插件闭包、TS/全项目源集、required规则批准覆盖、可信宿主门禁和正式关闭重开仍缺,7.3/9.7保持未完成。验收见相邻codeguard-cli/tests/acceptance/eslint-effective-settings.md。 + + +## 2026-09-27 ESLint 有效配置查询取消 + +公开task verify受控进程反例先RED:查询收到SIGINT后,原因丢失并保存成still_present。Rust查询与任务复检现优先保留取消/期限;共享任务入口取消后不保存正常复检事件,并释放自有租约。真实进程组延迟写副作用未出现,再次复检能获取租约。目标用例3.84秒通过,36项相关普通回归、目标Clippy -D warnings和fmt通过。脚本仅为受控协议夹具,不冒充原生ESLint;Windows、跨宿主、中断历史协议及完整I/O预算仍缺,3.3/7.3/9.7不勾选。见相邻tests/acceptance/eslint-effective-interruption.md。 + + +## 2026-09-27 ESLint 项目本地插件原生验收 + +使用既有Node24.18.0/ESLint10.11.0及项目原flat config加载guard.cjs本地规则。公开lint保留完整workspace/no-debugger ID并生成稳定任务;只修源码后,task verify通过原扫描及原生print-config确认规则仍启用,保存局部消失候选,插件与主配置不改,status门禁未评估。真实测试91.56秒通过,没有安装/升级。 + +此证据补齐局部本地插件规则穿过公开CLI/任务复检的真实样本,不证明完整插件闭包或可信批准。TS parser/tsconfig、monorepo完整范围、依赖审计、required规则/正式关闭及宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-local-plugin.md。取消路径及本地插件两项增量在同一change跟踪,不同步或归档未完成计划。 + + +## 2026-09-27 ESLint 显式目录调度 + +lint typescript PATH现支持有界目录清单及逐文件原工具执行,保留排序相对路径、局部反馈、跳过项和未执行清单;共享deadline,前后清单/显式输入变化、单文件失败及工作台保存失败均未完成。codeguard内用户源码照常扫描,点条目/node_modules/链接未选择原因显式反馈。仍使用调用者指定的单一原配置/cwd,不声称自动选择monorepo子配置。 + +目录入口先RED,配置源码又复现输入冲突及同步路径重复拒绝;现只允许原配置与源码共享同一只读字节身份,报告覆盖/其它输入别名及重复源码仍拒绝。受控样本首次4稳定任务、重复0新增,单文件退出2保留其它发现,链接跳过、100ms共同预算3文件未执行及画像缺失工作台失败反例通过。48项普通相关回归通过,最终目标Clippy -D warnings/fmt通过,公开目录JSON通过Draft202012 schema。实际既有Node24.18.0/ESLint10.11.0公开目录三文件(违规、干净、配置源码)62.34秒验收通过,无安装升级;schema样本是受控夹具,与原生证据分开。 + +完整TS/tsconfig、monorepo原生源集及配置归属、插件闭包、依赖/CVE、聚合硬I/O预算、原生证据及可信正式关闭/宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-directory-feedback.md。 + + +## 2026-09-27 ESLint 显式子项目配置映射 + +目录入口新增--config-map绝对路径,1.0有界协议逐项声明项目根/原配置/cwd,组件边界及最深显式根匹配,未命中沿用原参数。不从目录名推断原cwd,不批准规则。重复根/字段、未知字段、越界/链接或不可读配置启动前拒绝,映射与全配置摘要纳入前后及子任务前检查。反馈0.2保留逐文件配置范围和来源及映射摘要,schema仍接受历史0.1。 + +未知选项先RED;受控a/ab边界、根`.`选择、重复/越界/approved字段及首轮改写映射后停止余下三文件反例通过。45项普通相关回归通过,最终补充根`.`用例及目标Clippy/fmt通过;映射及当前公开反馈Draft202012 schema通过受控实际产物,越界schema反例被拒绝。既有Node24.18.0/ESLint10.11.0真实双项目四文件80.78秒通过,根规则没有强加子项目,保留配置源码检查,无安装升级。 + +自动配置归属、完整TS/插件闭包/源集、依赖审计、批准覆盖、聚合硬I/O与正式关闭/宿主门禁仍缺;7.3/9.7不勾选,不归档change。验收见相邻tests/acceptance/eslint-config-map.md。 + + +## 2026-09-27 npm原生审计基础 + +Rust新增npm11/auditReportVersion2有界观察及离线原生命令计划,保留组件、严重度、范围、节点、原生advisory source和间接关系;版本/计数/定位/退出/重复JSON键或error对象不自成干净结果。原生source不是CVE编号,range不是解析版本;依赖类别有重叠,不简单相加。只读package脚本配置API区分明确声明、未观察到、复杂调用和损坏,不执行清单脚本,也不能证明外部CI未配置。 + +缺API先RED;组件低危但直接advisory高危反例再RED后修正。5项协议/参数/配置用例及9项既有ESLint回归通过,共14项普通测试;CLI目标、adapter库Clippy -D warnings及fmt通过。既有Node24.18.0/npm11.16.0经统一runtime验证版本、空锁JSON及缺锁error,0.68秒通过,包/锁字节不变,无node_modules或脚本副作用,无安装升级。合成advisory是协议夹具,不冒充真实漏洞数据库检出。 + +配置API尚未接detect/init,公开CVE/依赖命令、非空依赖/真实漏洞、解析版本/图绑定、漏洞库时效、稳定任务/原工具复检及可信门禁仍缺;7.3/7.5不勾选。见相邻tests/acceptance/npm-audit-observation.md。 + +## 2026-09-27 npm锁文件节点关联进展 + +新增 Rust v3 普通安装节点解析与原生审计精确位置/名称/版本关联;两项锁文件契约及五项 npm 审计回归通过。链接、别名、缺版本、重复字段和身份不匹配保持未完成。仅协议夹具,不是实际非空依赖审计;依赖边、范围求值、库新鲜度、公开命令及工作台闭环仍缺,7.3/7.5 保持未勾选。验收见相邻 `codeguard-cli/tests/acceptance/npm-lock-binding.md`。 + +## 2026-09-27 npm离线非空依赖反例 + +扩展实际 Node 24.18.0/npm 11.16.0 原生验收为私有空缓存的空锁、一个普通依赖节点的非空锁、缺锁三种情况。实验发现非空离线审计也能退出0并返回零漏洞,不能把零发现当成库覆盖或CVE通过。Rust观察新增固定 `advisory_coverage=not_evaluated`,节点关联保持局部身份观察。测试检查清单/锁不变、无安装及脚本副作用;尚缺在线/可信缓存的真实漏洞正例及库新鲜度、完整命令/工作台,因此7.3/7.5不勾选。 + +本轮验证:原生三场景测试通过(0.77秒),7项普通契约通过;adapter lib与CLI三项test target的Clippy(-D warnings)、格式及OpenSpec严格校验通过。此前把非空离线结果预期为原生错误的测试失败,实际观察到零发现后修正覆盖语义;新增覆盖字段验收先因API缺失失败,再实现通过。 + +## 2026-09-27 npm原生advisory与复检 + +显式无凭据registry命令API已提供HTTPS根源及验收loopback HTTP源,固定audit-registry、不安装/不执行脚本;受控原生npm执行证实1.2.3被advisory命中、修订2.0.0后同工具复检无发现,503源失败为npm_native_error。两项原生测试通过(0.58秒),六项审计契约、Clippy/格式通过。受控源不是可信库,coverage固定not_evaluated;早期一次原生正例出现未分类错误,已增加诊断而不能宣称稳定性完全证明。真实库/时效、公开命令及完整工作台仍缺,7.3/7.5不勾选。见相邻`codeguard-cli/tests/acceptance/npm-native-advisory.md`。 + +最终重复原生验收2项通过(0.55秒);审计与锁关联8项普通契约通过,OpenSpec严格校验及diff检查通过。重复运行未再次出现早期原生正例错误,其原因仍未确定。 + +## 2026-09-27 npm审计配置发现与预览接线 + +node.npm.audit已按原package.json摘要逐根进入共享发现、init数据来源及detect/plan/check all的配置反馈;manifest重读变更/不可读保留unknown与观察未完成。修复plan按语言筛选遗漏node检查器的问题,typescript/all预览均保留四态;check all人类反馈显示根、原因与下一步。新binary流程与发现/计划/初始化70项不同用例通过,Clippy/格式通过。仍未自动执行npm审计、覆盖其它包管理器/CI声明、库时效、稳定任务和门禁,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-audit-discovery.md`。 + +## 2026-09-27 npm输入绑定runtime服务 + +新增独立请求/结果及Rust原生版本-audit-报告-锁节点关联服务,冻结精确输入SHA及npmrc存在性;缺身份、版本错配、输入修改/配置新增、取消与超时均未完成、不提供可用于关闭任务的解析结论。三模式反例与八项审计/锁回归通过;真实npm局部服务首轮通过,最终版本参数修改后复验。完整工具/配置/环境闭包、可信库时效、公开命令与任务闭环仍缺,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-input-bound-probe.md`。 + +最终验证:九项普通契约通过(1项输入服务三模式、6项审计、2项锁关联),两项真实npm验收通过(21.68秒);CLI lib与输入服务/原生测试target的Clippy(-D warnings)、格式、OpenSpec严格校验和diff检查通过。服务未接入公开CVE入口,任务仍不勾选。 + +## 2026-09-27 npm公开CVE局部反馈 + +Unix `cve typescript` 已接显式Node/npm/版本/用户与全局配置/可选审计源,冻结输入并以human/JSON返回脱敏原生组件、锁版本、严重度、advisory source及下一步。缺上下文给准备状态,局部零发现仍not_evaluated;未接工作台,不假称关闭。10项普通契约、真实binary npm空锁(21.75秒)、两份实际schema报告及四个伪造权威反例通过,Clippy/格式及OpenSpec严格校验通过。真实库、自动check all、完整预算默认来源及持久任务闭环仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-public-cve-feedback.md`。 + +## 2026-09-27 npm共享预算默认值接线 + +公开npm CVE入口复用CLI/登记环境/项目runtime/内置默认值选择器,坏候选项目文件或符号链接在原生执行前返回准备未完成,显式高优先级值不受低优先级坏配置影响。反馈0.2记录预算/来源及native_execution_only,保留严格旧0.1schema。预算、公开命令、发现与输入绑定四项普通测试通过,哨兵未启动;Clippy/格式及OpenSpec严格校验通过。真实命令及实际schema结果后补。硬I/O预算、可信库与工作台仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-runtime-defaults.md`。 + +最终验证:真实Node/npm公开命令通过(21.50秒);三份实际0.2预算反馈通过schema,历史0.1兼容输入通过,四项非法预算反例被拒。最终diff检查通过;不把预算接线当成完整CVE或工作台验收。 + +## 2026-09-27 npm稳定工作台与next接线 + +初始化根中的公开npm审计自动保存脱敏原生组件/advisory/锁版本观察,严格复核输入与字段,经现有同步器创建按根稳定的CVE完整性任务;执行原因作为诊断历史,不伪装源码漏洞或关闭。next识别检查器并给原工具复检步骤。重复扫描一张任务、坏节点/重复字段不产生新任务;反馈0.3及持久观察schema已提供,旧0.1/0.2反馈保留。24项不同普通回归与真实npm公开命令持久化(21.50秒)、实际schema通过,Clippy/格式及OpenSpec严格校验通过。自动check all、早期准备阻塞全覆盖、父工作区映射、npm task verify与可信库/门禁仍缺,7.3/7.5不勾选。验收见相邻`codeguard-cli/tests/acceptance/npm-workbench.md`。 + +追加正例验收:公开受控组件报告保留advisory及解析版本,依赖变更仍复用同一任务。测试先暴露已消费npm历史报告被当前锁变化错误重演的问题;现纳入不可变字节收据消费分支,新报告仍复核当前输入。历史字节变化仍按run_id_digest_conflict拒绝。最终24项普通回归及Clippy/格式结果见本轮输出。 + + +## 2026-09-27 npm显式父工作区与白名单纠错约定 + +公开npm入口新增--workspace物理父目录,原生cwd保持子项目,预算默认读取所选父工作区,持久任务按构建根分离;next保留归属。8项相关普通测试通过,目标Clippy及格式通过,见相邻tests/acceptance/npm-workspace-scope.md。可信库、自动调度、完整关闭与门禁仍缺,7.3/7.5不勾选。 + +白名单文档补齐用户新增/修改/撤销/失效的操作与对话状态,OpenSpec明确修改字节须重新批准、不能记为源码修复。既有精确身份5项、报告处置7项、只读查询8项、提案4项普通契约通过;2项需要指定原生Ruff的测试未运行。这是现有局部契约回归,不是正式审批发布或宿主门禁验收,4.8/4.10/12.12保持未完成。 + + +## 2026-09-27 npm task verify原工具复检 + +稳定npm完整性任务接入task verify、共享预算、借用/自有租约、原服务及锁内输入复核;保存严格npm观察和关联尝试的verification事件,next/历史识别npm序列并给下一步,输入变化不沿用旧结果。局部一致为still_blocked,原生失败为incomplete,任务仍open、无白名单批准。缺参数入口先RED;随后测试暴露两个事件消费者未接npm时间序列,已补齐。 + +36项不同普通相关用例通过;真实Node24.18.0/npm11.16.0公开扫描+原工具task verify通过(43.44秒)。实际复检反馈schema通过,三项伪造覆盖/权威/allow反例被拒;目标Clippy/格式最终检查后补。8项依赖显式原生Ruff的复检用例本轮未运行。完整漏洞库/策略覆盖、正式关闭/重开、宿主门禁及自动check all仍缺,7.3/7.5/9.7不勾选;见相邻tests/acceptance/npm-task-verification.md。 + +最终检查:目标Clippy(-D warnings)及fmt通过;最终局部回归11项通过,human实际复检显示原生诊断/组件数/下一步并保存记录,OpenSpec严格校验与diff检查通过。未增加完整能力勾选。 + + +## 2026-09-27 npm复检收据严格归属与过期分流 + +next与尝试历史新增npm原字节重复键拒绝、同任务检查器/稳定义务/构建根核验;报告解析先完成静态结构再核对当前工作区与清单/锁摘要及节点,锁重读也核对摘要。只有结构有效但输入已变/不可读的历史观察失效后允许重新复检,损坏证据不冒充输入过期。 + +新增十个组合反例(五种篡改乘当前输入未变/已变),同时改写报告、验证事件及消费收据摘要;错构建根先RED,旧实现曾接受另一个根的incomplete失败结果并确认当前尝试已经复检,补精确归属后拒绝。49项不同普通回归通过;10项需要指定原生Ruff的用例本轮未运行。真实既有Node24.18.0/npm11.16.0公开扫描与task verify通过(45.05秒);目标Clippy、fmt、OpenSpec严格校验及diff检查通过。 + +完整受保护工具/配置/审计源上下文、可信漏洞覆盖、正式关闭/重开及宿主门禁仍缺,7.3/7.5/9.7保持未勾选。验收见相邻tests/acceptance/npm-verification-receipt-integrity.md。 + + +## 2026-09-27 check all npm逐根原生编排 + +显式Node/npm/版本/用户与全局配置上下文接入共享任务图,每个发现package根独立cwd/私有运行区,统一jobs和deadline;执行后串行同步稳定npm完整性任务并反馈next,原生失败不变源码违规。缺上下文保持配置发现,check java拒绝npm选项,预算到期不启动剩余任务。协议check_feedback0.24/check_aborted0.5新增npm逐根结果,旧0.23/0.4 schema保留。 + +新入口参数先RED;实际schema验收发现候选原因码遗漏并补齐。两根并发/稳定任务、混合成功失败、500ms统一截止时间、参数及语言范围反例已通过。早期并发回归出现临时私有目录创建失败;源码旧运行ID仅PID/时间不能保证并发唯一,已增加原子序列,同刻度64个ID用例先RED再通过。不将原失败误归为代码违规,具体当次OS失败原因未单独留存。 + +真实既有Node24.18.0/npm11.16.0 check all→稳定任务→next初次21.80秒、最终22.30秒通过;无安装、包脚本或node_modules,清单和锁不变。当前含npm/无上下文实际反馈schema、三项伪造门禁/权威/覆盖反例及旧0.23形状校验通过。最终普通回归、Clippy/格式结果待追加。 + +可信上下文自动解析、早期阻塞全覆盖、完整漏洞库/依赖图及关闭/重开、其它语言/类别调度、跨平台与宿主门禁仍缺,7.3/7.5保持未勾选。验收见相邻tests/acceptance/check-all-npm.md。 + +最终检查:66项不同普通用例通过(63项integration、3项领域/调度单元),目标Clippy(-D warnings)和fmt通过;真实npm check all最终22.30秒通过。其它9项显式原生用例本轮未运行,不将普通夹具作为它们的验收证明。OpenSpec严格校验及diff检查通过。7.3/7.5不勾选,不归档change。 + + +## 2026-09-27 npm缺少上下文的准备阻塞持久化 + +已有可读清单/锁的初始化工作区,公开cve缺参数与显式选择npm的check all部分参数,现在保存本地未验证准备观察并生成稳定CVE完整性任务;随后原生检查复用任务。task verify缺上下文也保留incomplete复检事件,不签发关闭。准备观察固定零组件、空advisory;矛盾记录被严格解析器及当前报告schema拒绝。先通过缺任务和虚构advisory两个RED反例确认问题,再实现修复。 + +36项受影响普通回归通过,实际准备反馈/观察/复检通过Draft202012 schema验证,四个伪造变体被拒;CLI及相关测试Clippy -D warnings通过。真实npm回归结果另附。缺锁/坏清单的独立准备协议、没有显式npm上下文的check all自动任务、工具上下文可信来源、覆盖/审批/真实门禁仍缺。7.3/7.5/9.7及相关完整任务保持未完成;本进展不是完整CVE或白名单放行验收。详见相邻codeguard-cli/tests/acceptance/npm-missing-context-workbench.md。 + +补充验收:显式使用既有Node v24.18.0/npm11.16.0的公开CVE原生回归通过(44.13秒);不安装、不执行包脚本。实际check all准备反馈schema通过,当前嵌入观察schema与独立schema字节结构一致;fmt检查通过。其余2项本轮普通命令忽略的原生测试未运行,不当作通过。 + + +## 2026-09-27 npm缺锁准备协议与稳定任务 + +初始化工作区、可绑定清单且确实缺package-lock.json时,CVE/check all显式npm/task verify在启动工具前保存schema0.2本地准备观察:lock_state=missing、lock_sha256=null、零组件和空advisory;缺锁不伪装为漏洞。补齐锁后旧观察失效,后续普通0.1观察复用稳定任务。悬空链接、伪造状态/摘要/覆盖、未知版本及缺锁收据在锁恢复后重放均被拒;取消、时间预算及物理路径约束继续生效。 + +消费者版本同步为check_feedback0.25、task_verification_preview0.5、check_aborted0.6;独立npm观察读取0.1/0.2,历史schema原字节归档。51项普通集成回归通过;真实npm check all回归通过(22.98秒),原清单/锁不被修改、不安装或执行包脚本。实际缺锁观察/check/verify通过Draft202012校验,五个伪造变体及旧版观察消费者拒绝。abort实际中断运行未在本轮外部schema验收,不将schema静态有效当作运行通过。 + +仍缺不可读/坏清单的独立准备任务、未显式选择npm的check all自动准备调度、可信上下文、完整CVE覆盖和正式任务关闭/宿主门禁;7.3/7.5/9.7保持未完成。验收文档:相邻codeguard-cli/tests/acceptance/npm-missing-lock-workbench.md。 + +最终补充:2项check_command中断/兄弟结果保留单元测试通过,连同51项集成共53项普通用例;Clippy -D warnings、fmt、当前四schema Draft202012静态校验及嵌入协议一致性回归通过。OpenSpec严格校验及diff空白检查通过。观察0.1不能声称npm_lock_missing,缺锁必须采用0.2明确状态。 + + +## 2026-09-27 npm坏清单启动前诊断与任务 + +RED用例证实已识别无效清单仍启动工具,错误被表达成npm_version_mismatch。现将无效JSON、重复字段和非法scripts类型在原生启动前拦截;绑定清单/锁及当前配置解析,保存零组件/空advisory的准备观察,CVE/check all显式npm/task verify复用稳定任务。next及可读任务明确检查package.json语法/重复字段/scripts类型和锁文件,再恢复原工具;修正输入后旧复检收据失效。当前字节有效却声称清单坏的伪造报告被拒。 + +35项不同普通回归通过;实际坏清单观察/check/verify通过Draft202012,3个伪造组件/advisory/覆盖变体拒绝。真实Node v24.18.0/npm11.16.0 check all回归通过(22.50秒),不安装/执行包脚本;其余10项普通命令忽略的原生测试本轮未执行。观察0.1/缺锁0.2与check0.25/verify0.5协议字段不变,仅准备原因的结构约束同步加固;旧schema归档不改。详见相邻codeguard-cli/tests/acceptance/npm-invalid-manifest-workbench.md。 + +不可读或缺清单/目录输入的持久准备协议、可信上下文、完整CVE覆盖与正式任务关闭/门禁仍缺;7.3/7.5/9.7未完成,不以本轮回归代替全计划验收。 + +最终检查:CLI和新增用例Clippy -D warnings、fmt、OpenSpec严格验证及diff空白检查通过。 + + +## 2026-09-27 check all默认自动npm准备任务 + +RED确认无参数check all发现两个npm根却无准备任务。现Unix支持平台默认将发现的npm根接入共享任务图;缺显式上下文只保存准备观察与稳定任务,不启动原工具、不安装/继承凭据。重复扫描、随后补齐上下文的原生检查复用任务,串行同步及next无需调用者手工串接。未初始化项目仅反馈workspace_not_initialized、不创建codeguard;Java-only检查不触发npm。 + +47项不同普通用例通过,涵盖多根准备/后续原生调用、Java隔离、缺锁/坏清单、预算/取消、SARIF与新未初始化反例。实际默认多根check all通过Draft202012,首次两任务、重扫零新增;真实Node v24.18.0/npm11.16.0 check all回归通过(23.03秒),不安装/执行包脚本。其余7项本轮普通命令忽略的原生用例未执行。Clippy -D warnings、fmt通过。 + +只接通CLI默认准备调度;未取得可信工具上下文自动解析、完整CVE覆盖、宿主Hook和正式任务关闭/门禁。Windows该路径仍未支持;不可读/缺清单的持久状态仍缺。7.3/7.5/9.7保持未完成。详见相邻codeguard-cli/tests/acceptance/npm-automatic-preparation.md。 + + +## 2026-09-27 npm不可用输入状态协议与历史 + +新增Rust有界输入状态观察及严格准备报告0.3:present/missing/not_regular/path_alias/unavailable,可读普通文件有SHA,其余null;原因与状态严格一致,零组件/空advisory。公共CVE及task verify可在清单缺失、目录、悬空链接或超限时保存稳定环境任务,不读取链接目标;锁非普通文件也可在默认check all中产生准备任务。旧0.1普通观察/0.2缺锁继续严格识别,消费者升至check0.26/verify0.6/abort0.7,旧schema原字节归档。 + +RED先暴露缺失被当作缺上下文;随后反例暴露目录使next返回attempt_input_unreadable。npm阻塞任务现在以有界输入状态形成尝试指纹,可读与缺失沿用原摘要格式,其余只记录状态,不能成为关闭证明。当前输入恢复后旧复检不再解释本轮;6种结构/身份伪造及一个过期报告被拒,不增任务。 + +78项不同普通回归通过(76集成+2中断单元),包括租约/无进展预算、Java、SARIF、任务复检与旧协议;真实Node v24.18.0/npm11.16.0 check all回归通过(22.42秒)。实际新观察/check/verify通过Draft202012,6个伪造变体拒绝、旧消费者拒绝新协议;其余16项忽略的原生用例本轮未执行。有界不可用fixture为超限,不声称已完成独立权限EACCES运行验收。abort本轮仅既有单位用例和schema静态检查,未外部验证真实中断新观察。 + +仍缺丢失清单后从历史/基线恢复完整根发现、外部工具/配置文件不可用的持久准备、Windows、可信上下文/完整CVE覆盖、宿主Hook及正式关闭/门禁。7.3/7.5/9.7保持未完成,见相邻codeguard-cli/tests/acceptance/npm-input-state-workbench.md。 + +最终核验:最新新增用例及CLI的Clippy -D warnings、fmt、OpenSpec严格验证与diff空白检查通过;输入状态及坏清单最新修复指引回归实际执行通过。 + + +## 2026-09-27 npm历史构建根的准备恢复 + +默认check all现可从与本地受管摘要一致的0.3初始化画像恢复清单不可用但物理目录仍存在的npm准备范围。严格校验递归重复字段、协议标记、相对路径/别名、物理归属及有界输入状态;历史根不使用旧摘要或显式工具参数启动原工具。当前兄弟根仍正常调度,画像错误以historical_npm_scope_unavailable及具体原因反馈,不吞掉其结果。清单恢复后重新发现,稳定任务不重复。 + +新增npm_historical_roots_cli由双根只剩一根的RED推进到通过,覆盖重复同步、混合原生参数调用轨迹及画像失配/越界/别名/错类型/重复字段反例。最终新增矩阵通过;CLI及新增测试Clippy -D warnings、fmt通过。相邻验收:codeguard-cli/tests/acceptance/npm-historical-roots-workbench.md。 + +这是本地准备范围恢复,非可信审批或CVE覆盖。目录整体消失只明示未完成;旧画像版本、刷新画像删除旧根后的完整义务恢复、外部工具/配置、Windows、可信上下文、完整覆盖及宿主闭环仍未完成。7.3/7.5/9.7保持未勾选。 + +最终普通验收:61项不同普通集成用例通过(Java24、check all npm2、部分契约13、SARIF6、npm audit1、历史根1、输入状态1、坏清单1、缺锁1、父工作区1、task verify10);17项显式原生用例在普通命令中忽略。独立执行的历史-only默认检查实际反馈通过Draft202012,两轮稳定任务且历史清单摘要null。OpenSpec严格校验、diff空白检查通过。真实npm回归单独记录。 + +原生补充:显式既有Node v24.18.0/npm11.16.0的check all回归实际通过(22.45秒);不安装、不执行包脚本。普通命令忽略的其余16项原生用例本轮未执行。准备恢复和本地一致性不等于漏洞库覆盖或白名单批准,完整计划仍未完成。 + + +## 2026-09-27 npm画像刷新后保留已记录准备范围 + +RED证实清单删除后再次init刷新画像,默认check all遗漏已有稳定npm问题。现从本工作区有界普通物理finding.json恢复清单不可用、物理目录仍存在的准备范围;核对结构、工作区/检查器、稳定指纹与ID、scope、两项输入归属及状态。画像与事实两类来源独立,不因画像失配吞掉可核验事实范围。只恢复本地准备,不沿用旧结果或启动该根的原工具。可编辑Markdown附件删除/勾选不能消除该范围;附件缺失仍暴露同步问题,不宣称任务已修复。 + +新增npm_recorded_roots_cli覆盖刷新后重复检查、附件删除、事实身份/路径损坏、当前兄弟根保留及输入恢复;已有画像拒绝测试更新为事实恢复仍保留范围,同时明示画像错误。目录整体丢失、删除全部事实且画像已刷新后的防逃逸仍需独立受保护义务来源;本地记录不是可信批准。完整7.3/7.5/9.7保持未完成,不据此归档。 + + +最终验收:27项不同普通集成用例通过(默认npm2、部分契约13、SARIF6、历史画像1、输入状态1、坏清单1、缺锁1、已记录根1、父工作区1)。最新已记录根用例扩展到9项身份/状态/范围错误反例,当前兄弟根均保留;其中运行ID反例用非法分隔符,普通字母本身合法,不为迎合测试收紧契约。实际刷新画像后仅事实来源的两轮check反馈通过Draft202012,清单摘要null,new_blockers=0。显式既有Node v24.18.0/npm11.16.0原生check all回归通过(23.40秒),无安装或包脚本;普通命令忽略的另一项Ruff原生用例本轮未执行。CLI/新增测试Clippy -D warnings、fmt及OpenSpec严格校验、diff空白检查通过。完整计划仍未完成。 + + +## 2026-09-27 Rust全工作区回归与严格静态检查(进行中) + +扩大到cargo test --workspace与cargo clippy --workspace --all-targets -- -D warnings。首次全目标Clippy发现work_sync.rs在测试模块后定义validate_eslint_observation(items_after_test_module);已将同一函数原样移到测试模块之前,无行为或协议变更,不以allow压制告警。fmt检查通过。全目标Clippy复检和同步模块单元回归仍在运行,未提前记录通过;全工作区测试沿原进程继续,当前已收集15组结论、60通过/0失败/3忽略,为中间进度而非整轮验收。 + +已确认普通工作区回归不执行显式ignored原生工具用例;MSRV1.85工具链当前未安装,Windows/宿主验收未运行。13.2及全计划保持未完成。此记录需待同一运行终态更新,不因等待超时重复启动。 + +后续终态:修复后的全工作区all-targets Clippy -D warnings实际通过(1分32秒),同步模块3项恢复/重放单元测试实际通过。全工作区普通测试仍沿原进程运行,尚未签发整轮通过结论。 + + +## 2026-09-27 全工作区依赖边界失败与修复 + +上一全工作区测试已终止为exit101:52组结论累计271通过、1失败、23忽略,失败为crate_boundaries的真实Cargo metadata检查;不记录整轮通过。核对发现adapters两个原生测试调用runtime造成dev越层,且网络下载实现新增的runtime依赖和CLI测试异步依赖未登记。已将Checkstyle原生重放和Node字面参数原生测试移入CLI测试层,删除adapters→runtime dev依赖;保留adapters任何kind不得依赖runtime的红线。仅允许runtime normal reqwest/tokio/tokio-util/futures-util/idna_adapter与runtime dev rustls;CLI tokio只允许dev。新增对应正常/错误crate、build/dev/normal反例,现6项依赖边界与4项纯ESLint命令契约通过。迁移保留原生用例内容及ignored边界,不靠放宽生产依赖方向消除失败。 + +额外原生证据:已实时核验既有/opt/anaconda3/bin/ruff为0.16.8,check all部分结果1项、task verify8项、whitelist propose2项共11项真实Ruff用例通过;包含noqa、规则关闭、per-file-ignore、恢复环境不假关闭及纠错提案不自批。106份schema的静态合法性与本地引用检查通过,不能代替运行报告验收。MSRV1.85、Windows、三宿主仍未验收。修复后全工作区测试与all-targets Clippy重新运行,结果另附;13.2保持未完成。 + +补充终态:修复后all-targets Clippy -D warnings通过(29.62秒),fmt通过;迁移后的Node v24.18.0原生字面参数用例实际通过(1项),只证明argv安全转发,不冒充真实ESLint规则检查。Checkstyle重放迁移保留且本轮未运行。新的全工作区回归仍在原进程运行。 + + +## 2026-09-27 当前规格到任务的覆盖索引修正 + +只读审计发现implementation-coverage.md缺43个后来新增的Requirement映射。已按当前正式规格追加binary-distribution7、execution-kernel5、native-tool-adapters15、remediation-workflow12、unified-cli-contract4项,引用已有实施任务而非另建任务。检查108个当前Requirement各有唯一精确spec/title映射,追踪ID不重复、没有失效Requirement、任务ID及任务区间均存在。每行仍覆盖该Requirement全部Scenario,不拿局部契约通过替代整项验收。 + +此为13.7的规格→任务追踪部分修复,未证明命令/语言/平台/宿主实现及全量双向验收,13.7与完整计划保持未完成。修复依赖边界后的工作区测试仍沿原运行继续;当前23组中间结论95通过/0失败/4忽略,不签发整轮通过。 + + +## 2026-09-27 Checkstyle原生补充与受管技能一致性 + +实时核验现有Checkstyle10.21.4 all.jar(19631994字节,SHA256 3c1d94d6ecc83e02dff587c9ba5b6b4ec4fec38c7a958eb587efec9b28e2f318)与本机JDK21.0.12.1。迁至CLI层的原生重放1项、record/继承/生成范围1项实际通过。首次一并调用Lombok变体时缺CODEGUARD_LOMBOK_JAR,测试在读取该前置条件时失败,不归因于产品误报;随后明确选择本机Lombok1.18.38(SHA256 1e1e427c36ff63c44fd30ef292d9e773ea3154460ab6265d3fed7e6f5bc50fb9)重跑失败项,实际通过(8.99秒)。没有下载或安装新工具,本地摘要不是独立发行批准。java_checkstyle_workbench的13项原生验收仍运行,终态另附。 + +skill_vendor.py check --offline与在线check均实际通过;在线核验codeguard-skills v0.1.2锁定提交2c0c8071f96de48dc53e11de2499c083c100e44c。不修改受管技能或lock,检查脚本不是Rust产品运行时。修复依赖边界后的全工作区普通回归仍沿同一进程运行,未签发整轮通过;13.2及完整计划保持未完成。 + +原生终态:java_checkstyle_workbench 13项全部通过(68.70秒);连同迁移重放、record/继承/生成与补齐参数后的Lombok变体,本轮共16项不同Checkstyle原生用例通过。范围含字段/枚举、方法/构造器、参数返回/泛型、类型选项、原配置抑制、准备恢复、稳定任务和原工具复检。旧失败保留,不把本地原生观察升级为完整项目覆盖、可信规则/白名单批准或任务关闭。6.3/9.7仍未完成。 + + +## 2026-09-27 Cargo Clippy原生补充验收 + +明确选择本机stable-aarch64-apple-darwin的真实Cargo(Rust工具链1.98.1),执行check_all_rust_native两项ignored用例,实际2项通过(6.70秒)。包含原生局部扫描及已初始化稳定任务复检;原生allow抑制经force-warn对照不能解释成已修复,局部缺失仅为未核验策略的候选,任务不自动关闭。此结果不是MSRV1.85实测、完整features/targets覆盖、可信工具/规则政策、Windows或交付门禁验收,7.1/9.7及全计划保持未完成。 + +修复依赖边界后的全工作区测试仍沿同一运行继续,最新中间结果105组、581通过/0失败/72忽略;忽略项不算通过,原生补充另列,未提前签发整轮成功。 + +## 2026-09-27 全工作区回归终态与旧插件兼容验收 + +修复依赖边界后的同一轮 cargo test --workspace 已实际结束,退出码0;完整日志149组结果、880通过、0失败、91忽略(组数含零测试的doc-test组)。日志/private/tmp/codeguard-workspace-boundaries.5rmnN9,SHA256 61690f3e20d0eecb6e9ce06cf98814ba76428763037253214f398ed61c97e899。前述中间数字均为当时进度,本段才是整轮终态。忽略项不算通过,独立原生补充按各自范围记录;详细边界见相邻codeguard-cli/tests/acceptance/workspace-regression-20260927.md。 + +旧插件使用本机既有/opt/anaconda3/bin/python 3.13.5和Ruff 0.16.8执行兼容检查,不作为新Rust产品的实现路径: + +| 检查 | 实际终态 | 范围 | +|---|---|---| +| python -m unittest discover -s tests -q | 退出0;632项运行、621通过、11跳过;111.689秒 | 既有单元与跨进程兼容语义;跳过项未验收 | +| python tests/run_all.py | 退出0;142通过、0失败、1跳过 | 旧语言结构及宿主协议模拟;不等于已安装宿主运行 | +| python scripts/validate_languages_json.py | 退出0;57条目、11条schema规则通过 | 54 stable/3 planned的旧注册表结构,不证明新适配器可用 | +| python scripts/check_architecture.py | 退出0 | 旧实现声明依赖和导入环 | +| ruff check hooks scripts tests | 退出0 | 既有Python兼容代码静态检查 | +| openspec validate introduce-rust-codeguard-cli --strict --no-interactive | 退出0 | 当前增量规格格式与结构有效,不是实现验收 | + +旧协议测试中的CODEGUARD_SKIP_GATE等历史行为只证明兼容夹具期望,没有批准新Rust门禁沿用逃生机制。旧单元日志/private/tmp/codeguard-legacy-unittest-20260927.log,协议日志/private/tmp/codeguard-legacy-harness-20260927.log。未静默安装缺失检查器;跳过不改记为通过。此前相同Rust源码状态的fmt、all-targets Clippy和vendor离线/在线检查已记录;本段补全等待中的Rust回归终态及旧插件适用测试。 + +13.2取得当前macOS/既有工具链的新增回归证据;MSRV1.85、其它平台、三宿主、完整规则/审批/任务关闭与门禁仍缺,不能把本段提升为全计划完成或发布验收。 + +## 2026-09-27 rules list入口与候选规则目录 + +按既有4.7/C08及rulepack-governance规格实现Rust只读rules list [path],补充同一Requirement的三项Scenario,不另建事实源。复用静态发现与已有严格版本化Ruff映射,分别展示配置声明、候选映射和逐语言六类目录缺口;不执行动态配置/工具、不修改项目文件、项目同名规则包及自批字段不授权。配置存在不证明具体规则启用,候选始终unverified/not_run;报告0.1固定未完成/退出3,无门禁效果。Node检查器明确映射到TypeScript生态,不以语言前缀遗漏ESLint。 + +RED:初次新增5项测试在旧入口为1通过/4失败;实现后5项通过。增加Node配置归属反例后再现失败,明确生态映射后修复。中断前启动的相关回归和Clippy句柄后来不存在,且进程检查未见存活任务,不能推断那轮通过;本轮重新执行并保留日志。 + +当前终态:rules_list_cli 6项、config_inspection_contract 6项、whitelist_command_contract 8项,共20项通过/0失败/0忽略,进程退出0。实际二进制Python/TypeScript/Java/all四份输出通过rules-inventory Draft202012 schema,四种伪造批准/通过变体被拒,动态ESLint配置无副作用。fmt检查退出0;新源码的全工作区all-targets Clippy仍在运行,终态另附。当前OpenSpec strict及git diff空白检查退出0。日志/private/tmp/codeguard-rules-list-tests-20260927.log、/private/tmp/codeguard-rules-list-clippy-20260927.log;验收说明见相邻tests/acceptance/rules-list-static-inventory.md。 + +未证明完整项目有效规则目录、可信工具锁/政策、逐文件原生配置与suppression差异、已批准例外或三宿主接线;4.7与完整计划仍未完成。之前880项工作区通过属于本入口新增之前的源码状态,不升级为本次新源码全工作区回归证明。 + +静态检查终态:新源码的cargo clippy --workspace --all-targets -- -D warnings实际退出0(3m44s,含锁等待),没有以中断前未知结果替代;fmt及本轮最终OpenSpec严格校验/diff空白检查已退出0。入口既有单元回归另行运行,终态另附。 + +入口回归终态:cargo test -p codeguard-cli --bin codeguard退出0,5项既有参数/登记/发现测试通过。连同三个集成套件,本轮25项不同普通用例通过,无忽略;不等于所有工作区套件或原生工具/宿主验收。日志/private/tmp/codeguard-rules-list-entry-tests-20260927.log。 + +## 2026-09-27 Rustdoc原生适配验收 + +核对Cargo rustdoc官方命令与本机最小原生输出,确认missing_docs进入Cargo JSON诊断,不能复用Clippy过滤器。按现有7.1/原生证据Requirement增加独立Rust解析器及两项Scenario,保持同一OpenSpec事实源;规则/级别/唯一主定位及原生package/manifest/target仅作观察,待执行层绑定。重复键、歧义定位、异常结束、未知警告、编译错误为未完成,不按自由文本或退出非零生成注释违规。 + +初态新API缺失导致契约测试编译失败;实现后cargo_rustdoc_contract 7项通过。crate_boundaries 6项通过;显式已有CODEGUARD_CARGO_BIN的rustdoc_native_replay 1项通过(1.95秒),五种原生输入涵盖缺文档/正常/坏链接/编译失败/源码allow抑制,源码不变,无安装。总计14项不同测试通过;不能将五个循环输入写成五项独立测试。相关两测试目标的Clippy -D warnings退出0(15.09秒),fmt退出0。 + +原生重放使用Rust1.98.1,只执行局部库目标。未实现公开comments rust、稳定任务/复检闭环、原配置与完整目标归属、前后字节绑定、可信工具/规则、全部features/workspace、跨平台与宿主;7.1仍不勾选。验收说明见相邻codeguard-cli/tests/acceptance/rustdoc-native-observation.md;先前880项全工作区成功不是本次新增源码的全量证明。 + +## 2026-09-27 comments rust公开入口与输入归属 + +延续7.1,同一Rust服务接入comments rust,显式Cargo经共享runtime运行锁定离线库目标机器流,采用私有target目录和共享预算。SourceSnapshot捕获根清单/锁/全部本轮已发现Rust源码,运行后复核字节及发现集合;Cargo入口摘要前后绑定。原生主定位、根清单和库目标源码归属不匹配为未完成。human/JSON反馈明确显式规则探针、未批准政策/覆盖、任务尚未接入及原工具复检,不把零诊断解释为修复或交付。 + +RED:入口缺失时普通测试1通过/3失败、原生1忽略;实现阶段一次错误Result::filter调用导致编译失败,修正后4项普通CLI测试通过。显式本机Cargo/Rust1.98.1的原生CLI用例实际1通过(3.43秒),含补文档前后两轮;不是两项独立测试。随后最终源码4项CLI契约及5项入口单测通过(共9项普通、1项默认忽略);原生独立补充计1项,不能把忽略项重算为默认通过。相关CLI目标Clippy -D warnings通过(最终2.50秒)。 + +实际缺工具与原生有发现两份报告通过rustdoc-local-observation Draft202012,篡改授权/交付/覆盖/关闭的四个变体被拒。该校验的Python不在Rust产品运行链。验收说明见相邻tests/acceptance/rust-comments-cli.md。 + +当前backlog_status固定not_integrated;未实现稳定文档任务、task verify、抑制对照、check all调度、完整配置/运行时闭包、可信工具/规则、全部workspace/features/targets或跨平台/宿主,7.1仍未完成。旧全工作区回归不能升级为本次新增源码的全量证明。 + +取消反例追加:真实SIGINT与源码变化同轮发生时,首次测试失败,退出3而非130;修正取消优先级后rust_comments_cli 5项普通通过/1项默认忽略(1.39秒),相关CLI目标Clippy -D warnings退出0(6.54秒)。前面的4项为该反例加入前的历史记录。原生补文档前后用例在最终源码上再次运行,终态另附;5项入口单测已有通过,完整工作区未重跑,完整计划不勾选。 + +最终原生补充实际1项通过(3.45秒),普通5项及独立补充均不失败;fmt、OpenSpec strict和diff空白检查退出0。仍不提升为完整任务或全部工作区验收。 + +## 2026-09-27 Rustdoc范围身份与歧义反馈 + +持久任务接线前审计发现旧行锚点/序号可能错认同一行的crate与函数诊断。新增独立纯身份服务,保留原生字节范围并校验真实UTF8切片及行列;指纹采用规则、相对目标与原生范围字节,不采用行号或输出序号。完全相同原生记录去重;不同范围候选指纹碰撞时保留观察但finding_id为空、identity_status=ambiguous,运行未完成,不能生成正式任务身份。 + +新增身份API最初缺失导致编译失败;重复声明CLI反例最初错误返回native_observed_unverified。修复后3项身份契约、6项CLI普通及7项协议回归通过。反馈升级0.2,旧0.1 schema原字节副本保留;实际原生0.2报告通过schema,crate/函数ID不同,伪造歧义仍保留ID的变体被拒。之后补强范围与行列一致性并复跑普通回归仍通过;最终原生/静态结果另附,不复用补强前结果。 + +这是7.1/9.7的身份前置,不是完整符号身份、持久任务或task verify交付。已知同文件同声明的不同符号仍需语义归属,目前只调查歧义;完整配置/构建组合、可信来源、三宿主及任务关闭重开仍缺,不勾选。验收见相邻tests/acceptance/rustdoc-native-span-identity.md。 + +补强后终态:两项原生独立用例均通过,CLI用例追加中文文档坏链接的真实UTF8范围/行列核对(5.12秒),原生重放用例通过(1.26秒)。相关adapters/CLI测试目标Clippy -D warnings退出0(7.69秒),普通6+3与协议7已有通过;合计18项不同测试,两个原生测试均显式独立执行,不把默认忽略计为通过。全工作区未重跑,完整计划保持未完成。 + +## 2026-09-27 Rustdoc逐问题修复简报 + +comments rust报告0.3为每条原生发现生成七项修复信息;missing_docs区分内部/外部文档,broken_intra_doc_links要求核对真实符号及作用域。简报绑定本轮源摘要、原生范围及复检argv,修改范围限于原目标;输入变化/身份歧义等未完成观察只给调查及重新检查,修改范围为空。attempt_history空数组明确history_status=not_integrated,不能证明没有历史失败。保留0.2 schema,当前协议升级0.3。 + +TDD先验证缺简报的两项失败;实现后7项普通CLI和3项身份测试通过,1项真实Cargo CLI独立执行通过(4.34秒,含缺文档、补齐、中文坏链接),相关Clippy -D warnings通过(5.77秒)。真实原生报告通过Draft202012协议;删除七项修复字段的七个变体及未完成却保留源码修复指引的变体均被拒。Python校验仅为独立验收,不在Rust产品执行路径。 + +尚未实现Rustdoc持久同步、task verify、尝试历史读取、抑制对照、正式关闭/复发重开、check all调度和完整配置/工具/策略覆盖;7.1、9.7保持未完成。全工作区未重跑,完整目标继续。验收见相邻codeguard-cli/tests/acceptance/rustdoc-repair-brief.md。 + +## 2026-09-27 Rustdoc自动持久同步与next + +comments rust报告0.4加入工作区绑定、独立run_id和原生目标相对路径,保留0.3历史schema。已初始化时保存queued报告并自动调用统一work sync;新原生发现生成稳定fact、Markdown七项任务与观察,同一问题再次扫描不重复建任务。导入重建原生范围指纹和简报,核对源码、清单及锁的当前字节;陈旧证据作为历史并生成重扫准备阻塞,坏身份/额外字段/范围或工具状态矛盾拒绝导入。未完成观察只生成检查准备任务,不创建源码违规。next识别rust.cargo_rustdoc并给同一原工具重扫指引;尚无task verify时不指示自动关闭。 + +TDD初始化扫描缺持久同步时先RED;新增重复扫描/next、缺工具准备、队列入库后清单变化、伪造指纹四个契约。最终相关普通回归:rust_comments_cli 11、identity 3、work_sync 15、cross_category 1、next 6,共36项通过,3项默认忽略不计通过。真实Cargo CLI显式独立运行1项通过(5.56秒),追加初始化、真实发现任务文件及自动同步检查;相关Clippy -D warnings终态通过(10.28秒)。实际绑定反馈与queued报告通过Draft202012,task文件存在,缺工作区ID反例被拒。fmt/OpenSpec结果另记。 + +7.1/9.4/9.7未完成:原配置/完整目标覆盖、可信工具规则、文档task verify/尝试历史/抑制对照/关闭复发及跨宿主尚缺。旧全工作区回归不代表本轮全量;验收见相邻tests/acceptance/rustdoc-workbench-sync.md。 + +## 2026-09-27 Rustdoc任务复检与原生抑制对照 + +复用comments rust的同一观察服务,接通task verify --cargo-tool;同一预算与任务租约内执行普通rustdoc及force-warn对照,捕获全部已发现Rust源/清单/锁并核验两轮输入与工具摘要。原问题仍在为still_present,同文件同规则身份变化为rule_coverage_requires_review,抑制重现为suppression_requires_review;两轮局部零发现仅candidate_absent_unverified_policy,任务保持open。环境恢复同样待策略核验。复检保存同一问题事件并关联准备好的attempt;next/历史读取识别rustdoc时间序列,源码/清单/锁变化后不沿用旧观察。未稳定封套的导入不生成源码修复任务。 + +协议:rustdoc_task_recheck 0.1封套包含普通/强制原生观察与输入身份;文档task_verification_preview升级0.7,其它既有预览继续0.6。保留原0.6schema;当前schema接受具名旧协议及新封套,不赋予门禁/关闭权威。实际原生预览及两轮嵌套报告通过Draft202012,校验Python仅独立验收。 + +TDD缺入口先RED,随后暴露历史读取器缺新checker与序列格式导致第二次复检失败,补齐后连续仍在/抑制/缺失契约通过。相关普通回归:文档CLI12、next6、同步15、任务租约16、任务复检10,共59项不同测试通过;11项默认忽略不计通过。原生CLI独立1项实际通过(14.07秒),包括初始化/稳定任务、真实缺文档复检、补齐文档与源码allow的force-warn反例、中文坏链接;同一测试多轮不重复计数。相关最终Clippy结果另附。 + +仍缺正式关闭与复发重开、完整原配置/workspace/features/targets/符号归属、可信工具/规则/批准、全部语言类别及宿主;7.1/9.7不勾选。未来工具文件变化的旧复检不能作为批准工具证明,本地来源始终未核验。本轮没有全工作区回归。验收见相邻tests/acceptance/rustdoc-task-recheck.md。 + +最终补充:相关五个CLI测试目标Clippy -D warnings退出0(9.51秒);fmt --check退出0,OpenSpec严格校验及git diff --check退出0。原生验收后仅调整next/任务说明文字和复检argv指向,CLI12与next6再通过;全工作区及完整正式闭环仍未验收。 + +## 2026-09-27 Rustdoc强制对照导入身份修正 + +反例先RED:普通观察合法时,强制对照的伪造指纹及重复输入归属均被旧同步器消费,failed_reports=0。现把复检导入交给独立Rustdoc封套解析:严格检查顶层键与唯一输入路径归属,稳定输入绑定源/目标及清单/锁;普通和强制观察分别进入同一严格原生范围/指纹解析。强制argv及原始证据保留在封套,只在内部核验投影规范化参数,不修改原始报告或将抑制当修复。输入不稳定/当前失配时只导入准备阻塞,不生成源码任务。 + +同一反例验收三种变体:伪造强制指纹和重复输入被拒,不稳定封套只生成一项重扫阻塞;没有新增源码任务。相关普通回归13项文档CLI、15项同步、6项next,共34项通过;3项默认忽略不算通过。真实Cargo CLI独立1项通过(14.49秒),覆盖正常文档发现/修复复检、原生allow/force-warn和中文链接;相关Clippy -D warnings退出0(7.18秒)。真实报告协议验收另记;schema增加重复行拒绝,唯一字段归属仍由Rust核验。 + +这是任务复检证据的完整性修正,不是正式批准或关闭;7.1/9.7保持未完成。全工作区未重跑,完整目标仍需持续推进。验收见相邻tests/acceptance/rustdoc-forced-evidence-binding.md。 + +协议终态:真实本机Cargo文档task verify报告及嵌套普通/强制观察通过当前Draft202012;重复输入行变体被schema拒绝。独立校验退出0;fmt --check、OpenSpec严格校验及git diff --check均退出0。没有全工作区或完整交付批准验收。 + + +## 2026-09-27 Rustdoc 接入 check all + +完整检查入口新增独立 rust.comments 节点,复用 comments rust 观察服务与持久同步;与 Clippy 共用总预算和 Cargo 资源互斥,分别保留结果/完成状态/准备任务。取消标记传入原生进程,避免新节点绕开任务取消。文档原生发现进入统一对话反馈和 next;检查器成功不覆盖其它未完成。check_feedback 0.27、check_aborted 0.8 自包含嵌入 Rustdoc 0.4,旧 0.26/0.7 协议保留。 + +TDD:缺调度时新契约先失败;接线后回归暴露旧任务计数、协议自包含以及独立准备任务 next 预期,已修正。真实验收新增断言最初误用 local_complete 字段失败,改为既有 local_scan_complete 后通过,不改生产协议迎合测试。普通相关 Go3/Java24/npm2/部分结果13/Rust11/文档14,共67项通过,12项默认忽略不算通过。显式既有 Cargo 原生3项通过:Clippy两项7.03秒、Rustdoc一项12.96秒;增强后的原生完整检查实际断言 missing_docs 及独立两节点。相关 Clippy -D warnings 通过(1.20秒)。 + +真实未初始化/初始化 check_feedback 0.27 均通过 Draft202012,初始化文档同步状态 synced;check_aborted 0.8 仅静态 schema 合法性,本轮未声称实际异常中止协议验收。Python仅独立验收,不在产品执行路径。正式规则/完整构建组合、可信工具策略、关闭复发与宿主仍缺;7.1/9.7不勾选,全工作区未重跑。详见相邻 tests/acceptance/rustdoc-check-all.md。 + + +## 2026-09-27 当前 Rustdoc 集成后的全工作区验收启动 + +当前源在完整 Rustdoc/check all 接线后启动 cargo test --workspace 和 cargo clippy --workspace --all-targets -- -D warnings。两项运行尚未终止,不能以旧880项通过替代本轮终态;测试日志 /tmp/codeguard-workspace-current-20260927.log,Clippy日志 /tmp/codeguard-clippy-current-20260927.log。本轮首批13组59项通过/0失败/0忽略,只是中间结果,13.2保持未完成。 + +独立协议静态审计115份schema合法且本地引用可解析;实施索引核对108项Requirement均有对应行且无重复标题,仅证明映射。OpenSpec strict及git diff --check退出0。未安装工具、未修改规格要求、未发布;完整计划继续,后续沿同一进程核验终态,不因观察等待重启。 + + +## 2026-09-27 全目标 Clippy 终态 + +同一运行 cargo clippy --workspace --all-targets -- -D warnings 已退出0,耗时2m01s,日志SHA256 ba479f2fe8cb4e988013460eed8c16cd6d506830b65530f8804107cf89c7695d。不是部分目标检查。全工作区测试仍运行,中间17组、74通过/0失败/1忽略;不得用中间结果宣布全通过。13.2及完整计划保持未完成。 + + +## 2026-09-27 插件兼容静态与 vendor 校验终态 + +既有架构脚本通过,语言注册57条(54 stable/3 planned)及11项schema规则通过;受管技能离线和在线check均退出0,在线核验 v0.1.2 -> 2c0c8071f96de48dc53e11de2499c083c100e44c。未更新lock、未安装或发布。旧Python脚本只是既有插件兼容验收,不新增Rust产品中的Python检测路径。 + +Rust全工作区测试同一运行仍在继续,本次中间25组/103通过/0失败/4忽略,不能宣布终态。全目标Clippy本轮已通过,115 schema静态校验和108 Requirement映射也通过,均不等于所有原生/平台/宿主验收。13.2不勾选。 + + +## 2026-09-27 既有插件测试与解释器边界 + +协议模拟 tests/run_all.py 终态142通过/0失败/1跳过。第一轮unittest实际632项/93.819秒,1失败/21跳过:主进程3.13.5而Bash CLI子进程PATH选到系统3.9,zip(strict=True)报错,不能将该轮计通过。仓库CI明确3.11/3.12/3.13。统一PATH到既有/opt/anaconda3/bin后,失败所在CLI合同3项实际通过(0.539秒),随后启动同一环境完整unittest,日志 /tmp/codeguard-plugin-unittest-python313-20260927.log,尚未终态。未修改Python生产逻辑、未安装解释器;保留首轮失败。Rust全量沿原进程继续,完整验收仍未完成。 + + +## 2026-09-27 统一解释器插件 unittest 终态 + +明确 PATH=/opt/anaconda3/bin:$PATH,主/子进程使用既有Python3.13.5;完整unittest退出0,632项/99.003秒,其中621通过、11跳过。日志SHA256 10f2e398b7d644ab8abf9cb3efebdfd637efc9994fd80fb41b454f12b0eff71e;首轮3.9子进程失败仍保留,不伪称系统3.9兼容。协议模拟142通过/1跳过、全目标Rust Clippy、架构/语言/schema/OpenSpec/vendor检查分别记录。Rust测试同一运行仍在继续,中间74组/432通过/0失败/34忽略,尚无完整终态;13.2及总目标保持未完成。 + + +## 2026-09-27 Rust 构建实现前验收约束 + +继续既有7.1与Rust command plans SHALL preserve explicit build levels要求,追加原生Cargo check的可归属编译错误与报告损坏两场景;不新增change或改验收目标。后续适配须保留package/manifest/target与原生诊断,类型检查固定test_execution=false,不改称Clippy/文档/安全违规。成功/失败结束、原生退出、重复键、结束后事件及无可归属诊断的失败须分别核验;裸退出不生成源码违规或通过。当前只有规格补齐,尚无Cargo构建实现或测试通过声明;7.1仍未完成。OpenSpec strict和git diff --check退出0。现有Rust全工作区测试继续原运行,未因等待重启。 + + +## 2026-09-27 Rustdoc集成后全工作区测试终态 + +同一 cargo test --workspace 运行已退出0:154组、910通过、0失败、93忽略。包括当前Rustdoc/check all/任务复检及所有既有普通回归;忽略原生测试、MSRV1.85、Windows和宿主不计通过。日志 /tmp/codeguard-workspace-current-20260927.log,SHA256 8d647e591bac5d2d247e33a3e648922d102da3639c72909a0513ecb3b91c5ff8。当前 source 的全目标Clippy已退出0,既有插件unittest621通过/11跳过、协议模拟142通过/1跳过,115schema静态/OpenSpec/架构/语言/vendor另有终态。 + +当前全量结果替代旧880项基线,不抹去首轮Python3.9子进程失败;93项忽略须各自具备条件后独立验收。实际原生Cargo3项和反馈0.27的两种绑定情况验收另列,不把普通协议夹具当真实工具。原配置/全构建组合、可信策略、关闭复发、全部语言类别与发布宿主仍缺,13.2及完整目标不勾选。下一实现为已有7.1下Cargo原生构建契约,新增两场景只是验收准备。 + + +## 2026-09-27 Cargo 原生构建解析前置 + +新增独立 CargoBuildDiagnostic/CargoBuildParsed 对象与 Cargo check JSON流解析,保留编译器错误码、package/manifest/target及唯一主定位范围,不借Clippy/文档规则过滤。结束成功与退出、成功却带error、失败无可归属错误、坏/重复键/未知记录/结束后事件、规模上限等均未完成;前序有效观察保留仅供调查。纯解析尚无源字节/工具/配置绑定,不授予正式源码finding、覆盖或交付权威。 + +TDD缺入口先因unresolved import失败;实现后8项新协议、adapter库6项、Rustdoc7项、依赖边界6项,共27项普通回归通过。真实既有Cargo原生1项通过(0.94秒),包括E0308类型错误、成功但故意失败测试未运行、build.rs执行失败不被误报为源码;首次路径断言因macOS临时路径别名失败,核对实际manifest路径后通过,未改生产解析规则。相关Clippy -D warnings退出0(10.63秒)。未安装或下载工具。 + +公开build rust、共享runtime服务、原输入/工具/目标归属、持久修复任务、复检、check all与完整构建组合仍缺,7.1不勾选。此前154组/910通过全量是本前置之前的基线,本轮新源仅上述受影响验证,不宣称重跑全量;完整目标继续。验收见相邻tests/acceptance/cargo-build-native-observation.md。 + + +## 2026-09-27 build rust 公开类型检查探针 + +新增 build rust [path] --cargo-tool ABS_PATH --timeout DURATION --format human|json,使用共享预算/runtime/SourceSnapshot与私有target调用原生Cargo check --locked --offline --all-targets --message-format=json;不执行测试,不生成锁,不安装工具。前后核验已发现源码集合、根清单/锁和工具字节,原生目标须归属本轮源及根清单,UTF8范围及行列重建候选指纹。保留包身份摘要和原生目标类别,避免公开本机package路径;不同目标类别同候选指纹不按原生顺序消歧。输入/工具变化、取消/超时等不给源码修改范围;取消优先130,普通局部命令保持3/not_evaluated/coverage_proven=false。 + +每发现给七项静态修复/调查信息,历史not_integrated且不授权关闭。反馈 rust_build_local_observation 0.1及严格自包含schema新增build_level=type_check/test_execution=false/build_success;没有队列、任务或门禁接线。真实错误和成功反馈均通过Draft202012,六个伪造授权/覆盖/状态及缺包身份变体被拒;独立Python只验收,不在产品路径。 + +TDD缺公开入口先RED。最终相关普通26项(build6、Rustdoc14、边界6)通过、2项默认忽略不计通过;真实公开Cargo1项通过(7.15秒),包含E0308、补齐成功但panic测试未执行、构建脚本失败不生成源码违规;相关Clippy -D warnings最终退出0(5.63秒)。中途一次输入变化测试得到source_discovery_incomplete,已加强fixture的原子序列路径隔离,之后全组通过;该次底层原因未完全归属,保留失败,不改生产失败判定。 + +7.1/9.7仍未完成:公开命令仅原生类型检查局部探针,缺完整配置/workspace/features/targets/可信工具策略及任务同步/verify/关闭复发/check all接线;新源未重跑全工作区,此前910项基线不覆盖本次新增行为。验收见相邻tests/acceptance/rust-build-cli.md。 + + +## 2026-09-28 Rust构建报告自动同步与next + +build rust局部观察协议升级0.2,保存0.1原始schema;每条finding增目标源码摘要,初始化工作区自动入队并sync。严格导入核对工作区/run/file键、原生状态、根清单锁与当前源码及目标普通文件字节,重算UTF8原生范围指纹;导入改用SourceSnapshot读取源码/目标以拒绝路径别名。包摘要保持未核验观察,不冒充可信来源。有效发现生成稳定fact和七项任务,同一问题重复扫描只更新观察。旧目标即使错误源码未变也只留历史并生成重扫准备任务;伪造指纹拒绝。缺工具生成稳定准备任务,next显示同一原生构建复扫指引。 + +TDD缺自动同步先RED。相关普通:build9、work sync15、next6,共30项通过,3项默认忽略不计通过;真实公开Cargo1项通过(7.70秒);实际绑定反馈与queued 0.2均通过Draft202012,任务文件存在,缺目标摘要反例拒绝。Clippy第一次发现一处不必要借用,已按诊断修正且重新执行,终态见后续证据。 + +7.1/9.7/9.4均未完成:正式task verify、关闭复发、可信包工具/规则策略、完整workspace/features/targets及check all仍缺。0.2队列同步不是构建通过、风险接受或白名单批准;历史0.1不能作为当前可导入报告。全工作区当前新源码尚未重跑;旧910项基线不得挪用。验收见相邻tests/acceptance/rust-build-workbench-sync.md。 + +## 2026-09-28 Rust 构建任务局部复检 + +任务从RED `task_checker_unsupported` 到同一原生Cargo的复检事件。41项受影响普通回归通过(build10、work sync15、next6、task verify10);12项条件性忽略不算通过。显式既有Cargo真实复检1项通过,证明E0308持续与修复后局部零诊断两条路径,后者仍为`candidate_absent_unverified_policy`、`test_execution=false`、`delivery_decision=not_evaluated`。相关all-targets Clippy -D warnings退出0;119份schema静态合法性及本地引用存在性通过。实际本地任务复检封套与公开反馈通过Draft202012验证,伪造delivery allow反例被拒;该局部验收不替代全工作区回归、可信批准、正式门禁、关闭复发、MSRV/Windows/宿主验收。 + +全工作区当前源码的 `cargo test --workspace` 已以退出0结束,覆盖适配器、CLI、核心、运行时的默认测试和doc-tests;默认跳过的显式原生/平台条件用例仍不计通过。此次全量是在Rust构建任务复检代码和回归测试加入后执行,替代旧910项基线,但不证明全部OpenSpec计划已实现。受影响包all-targets Clippy及OpenSpec strict通过;正式白名单宿主审批、关闭复发、完整语言与构建矩阵仍未完成。 + +## 2026-09-28 check all 接入 Rust 原生类型检查 + +TDD 首先复现 `check all` 虽运行 Rust Clippy/rustdoc,却把构建类别留在 `not_integrated`。现新增独立 `rust.build` 节点,在现有共享预算与 Cargo 目标资源下调用原生 Cargo check;编译诊断独立于 Clippy/文档发现,完成后同步本地稳定任务,环境或报告故障保留具体未完成原因。旧 Clippy 待修任务继续优先显示,构建任务可独立从 next 读取;不把任务清空、零诊断、项目可写批准候选解释为交付通过。反馈 0.28 增 `rust_build`、`rust.build`,故障反馈 0.9 增构建结果,旧协议 schema 原字节留存。 + +新场景先 RED 后通过。调整后受影响的 Rust 原生/部分合同/Java/npm/SARIF/rustdoc 集成测试全部通过;一次回归揭示旧 Clippy 下一步被构建环境任务抢占,已修正优先顺序。另一次实际报告验证揭示 schema 漏列 `rust.build` 节点,已补齐。最终 `cargo test --workspace --quiet` 完整退出 0;当前反馈实际 JSON 通过 Draft202012,121 份 schema 文档静态合法;schema 改动后再次运行的 Rust 与部分合同两组分别为 12/13 通过、2/1 忽略。`cargo fmt --check`、CLI 全目标 `cargo clippy -D warnings`、OpenSpec strict、插件 `git diff --check` 均退出 0。 + +这只验收局部原生类型检查与任务指引;未证明全部 Cargo workspace/features/targets、测试执行、受批准规则/工具、白名单可信批准、正式关闭复发或交付门禁。7.1/9.7/4.8/13.2 保持未完成,默认忽略的原生条件用例不计本轮通过。 + +## 2026-09-28 白名单原生 finding 身份二次绑定 + +新增失败反例先证明:裁定和附带观察身份相等,但原始 finding 缺完整身份时,旧领域门禁错误返回 allow_with_exceptions。现领域 finding 可携本轮完整身份,只有它与裁定观察逐字段相同且既有原生规则、工具、主定位、义务及宿主冻结映射均匹配时,才可能标精确误报。旧报告缺字段、源码内容/指纹/工具/适配器/rulepack 摘要、依赖图或 advisory 变化均保留原始及活动阻断,结论 incomplete。项目 JSON 自填该字段不能证明它来自真实原工具;可信宿主来源和正式白名单门禁仍缺,4.8 未完成。 + +受影响门禁 34 项、会话 8 项、签名处置 3 项、core 包普通测试均退出 0。全工作区 `cargo clippy --workspace --all-targets -- -D warnings`、`cargo fmt --check`、OpenSpec strict 与插件 diff 空白检查均退出 0。随后首次全工作区测试在编译阶段退出 101:另一个进程同时对同一 CLI workspace 执行 `cargo clean --manifest-path .../codeguard-cli/Cargo.toml`,删除 `target/debug/.fingerprint`,Cargo 报多个 dep-info 目录不存在。该次不是测试通过,也不是源码失败;在清理结束、构建目录稳定后须重新运行完整回归。 + +## 2026-09-28 RunReport 1.4 白名单身份声明约束 + +新增 1.4 报告协议:每条 finding 带完整 `native_identity`,每条误报处置带 `decision_identity`,解析时要求两者逐字段相等,并核对规则、声明的工具摘要、检查器类别及主目标。历史 1.3 schema 原样保留,旧版本不能借新字段伪称 1.4;未来未知版本拒绝。新增目标反例先因解析器不认识 `native_identity` 失败,随后 9 项白名单合同、14 项既有报告合同、4 项 SARIF 合同通过。依赖图/advisory 改变复用旧处置被拒,SARIF 仍保留未核验处置结果且不泄露私有令牌。独立 Draft202012 对实际 1.4 正例接受,对缺 finding 身份、缺处置身份的变体拒绝。详见相邻 `codeguard-cli/tests/acceptance/run-report-allowlist-protocol.md`。 + +字段仍由报告自行声明,结构解析不证明本轮原生工具输出或真实源码/依赖图字节,更不证明受保护审批、撤销和可信时钟。真实报告生产、独立来源核验、正式 CLI/MCP/Hook 门禁仍未完成;2.10、4.8 均不勾选。全工作区回归和当前源码的全目标 Clippy 结果在本节记录时仍待重跑,不沿用前一源码基线。 + +本轮随后重跑得到终态:当前源码 `cargo test --workspace --quiet` 退出 0,全部默认运行的测试组通过;需显式原生工具或平台条件的忽略用例未计为通过。`cargo clippy --workspace --all-targets -- -D warnings`、`cargo fmt --all --check`、122 份 schema 的 Draft202012 静态校验、OpenSpec strict 与插件差异空白检查均退出 0。上述结果证明回归和协议静态有效,不把报告自填身份提升为可信来源,也不把 2.10/4.8 标为完成。 + +## 2026-09-28 RunReport 源码覆盖和独立字节复核 + +TDD 先复现报告漏洞:把源码 finding 的主定位、原生身份及白名单决策身份一同改为义务覆盖范围外的路径,旧 1.4 解析仍接受带例外结论。现每个源码目标必须属于其义务预期与实际覆盖集合,反例被拒。另为受信宿主提供 `compare_claimed_source_hashes`,由宿主独立指定工作区根并通过 `SourceSnapshot` 安全读取全部声明的源码目标,比较当前普通文件 SHA-256。目标测试先因接口缺失编译失败;实现后覆盖真实字节匹配、内容变化、文件删除、Unix 链接、旧报告及同文件冲突摘要。白名单合同 12 项、既有报告 14 项、SARIF 4 项通过。 + +当前源码完整 `cargo test --workspace --quiet` 退出 0:157 组、937 通过、0 失败、96 忽略;日志 `/tmp/codeguard-workspace-report-source-20260928.log`,SHA-256 `3b0bb42977983a8c2a05ba559ea5220f3afcf17f6beafb1a4681bb5e75b5c965`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件 diff 空白检查通过。该内容比较是当前时刻的局部证据,不证明报告来源、原生工具运行、批准与终局输入不变;正式门禁尚未调用,2.10/4.8/12.12 保持未完成。 + +## 2026-09-28 Ruff 本轮适配器摘要进入误报调查 + +真实 Ruff 0.16.8 用例先因误报提案没有 `adapter_sha256` 失败。Ruff 局部报告 0.9 现只在有原生 finding、未取消且预算仍有效时计算当前 CodeGuard 可执行制品摘要;工作台读取本轮已同步发现后再次比较当前二进制。反例同时改写本地报告与消费标记的报告摘要,仍因适配器字节不符拒绝候选;规则包保持 `candidate_unapproved`,提案仍 `candidate=null`、退出 3、无门禁效果。公开 lint 升 0.12、误报预览升 0.4、Ruff task verify 升 0.9,三份前版 schema 保存供历史读取;实际三种新输出均通过 Draft202012,其中 task verify 使用本地 schema 引用注册。见相邻 `codeguard-cli/tests/acceptance/ruff-adapter-identity.md`。 + +首次实现在原生探测前两次哈希整个二进制,引发短预算与 SIGINT 两项回归失败;改为 finding 返回后按需计算并在哈希后再次核对截止时间。最终当前源码全工作区测试退出 0:157 组、937 通过、0 失败、96 忽略,日志 `/tmp/codeguard-workspace-adapter-final-20260928.log`,SHA-256 `63a22f4bba2daf1a006ce0c4bcf917cdba192892712aceeed1f052ba3b18611e`。另外显式运行原生 Ruff 任务复检 8 项、白名单/纠错 2 项,全部通过;125 份 schema 静态校验、全目标 Clippy、格式、OpenSpec strict 和插件差异空白检查通过。二进制摘要仍不是可信发行签名,报告/消费标记仍由项目可写,批准 rulepack、人工裁定与正式门禁尚缺;4.8/4.9/12.12 不勾选。 + +## 2026-09-28 legacy-v1 逐入口协议映射 + +任务 2.6 已完成具名映射与参数验收,映射表见 [旧入口协议表](../../../docs/rust-cli/legacy-v1-protocol-map.zh-CN.md),Rust 证据见相邻 `codeguard-cli/tests/acceptance/legacy-v1-protocol-map.md`。旧 check/CVE 对混合 FAIL 与 UNVERIFIED 返回 2,Dockerfile 返回 1 且保留已确认风险;CVE 参数错误为旧 3,PreToolUse 的 2 是宿主拦截。`fix` 的无语言、无改动、无适用文件分别登记;没有上下文的空结果不猜数字。旧 MCP 四个工具不具有逐请求进程退出码,五类 Hook 的生命周期成功不能当新版质量通过。所有 Rust 兼容投影固定 `not_evaluated`,C35 实际运行时和宿主迁移仍未完成。 + +真实旧插件相关测试在 PATH 前置已有 Python 3.13.5 后 164 项通过,MCP server 7 项通过;若由系统 Python 3.9 执行旧包装器,一项 `fix` 用例会因 `zip(..., strict=True)` 抛错,这一旧环境差异已保留为迁移缺口。当前 Rust workspace 全量测试 158 组、941 通过、0 失败、96 条件忽略,`legacy_v1_protocol_contract` 3/3,all-targets Clippy `-D warnings`、格式检查、OpenSpec strict 与插件差异空白检查均通过。此验收仅证明旧协议映射,不证明新版统一 CLI、MCP/Hook 或交付门禁完成。 + +## 2026-09-28 Rust 原生 cargo-audit 局部 CVE 观察 + +延续既有 OpenSpec 7.1,先新增原生 JSON 契约与公开命令目标测试,分别因解析入口和 `cve rust` 不存在失败,再实现 Rust 受控调用原生 `cargo-audit audit --no-fetch --no-yanked --json`。JSON 递归拒绝重复键,核对原生退出/计数/忽略配置,将每条 advisory 的包名、解析版本、来源与校验和绑定本轮 `Cargo.lock` 字节;报告无授权门禁或白名单效力。真实本机 `cargo-audit` 0.22.2 对当前 Rust 工程扫描 172 个锁定依赖、零漏洞,另对 `time 0.1.40` 样本检出 `RUSTSEC-2020-0071`;两份实际反馈均通过新 Draft202012 schema,均为 `database_freshness=unverified`、退出 3、`not_evaluated`。本机原生报告的数据库提交和更新时间均为 null,绝不据此称安全通过或签发误报例外。公开反馈只含依赖来源摘要;警告存在时仍保留已解析漏洞事实。 + +最终源码完整 `cargo test --workspace --offline -q` 退出 0:160 组、947 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-workspace-cargo-audit-final-state-20260928.log`,SHA-256 `a6872d6e2a888580533f5191ae035949e29601c09fe3d240aab1ace48ddca674`。新增 adapter 普通测试 5 项、CLI 普通测试 1 项;真实 cargo-audit 条件测试另显式执行 1 项并通过。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、126 份 schema 静态校验、OpenSpec strict 与插件 diff 空白检查均通过;新报告对 false allow/coverage/database freshness 三种篡改被 schema 拒绝。验收详见相邻 `codeguard-cli/tests/acceptance/cargo-audit-native-observation.md`。 + +这只是局部原生观察:漏洞库可信身份和时效、已批准工具/策略、完整 workspace/features/targets、依赖治理和安全义务、任务同步与复检、`check all`、MCP/Hook/宿主和带例外门禁均未完成。7.1、4.8、12.12 及总体计划保持未完成。 + +## 2026-09-28 Rust CVE 统一检查与白名单边界 + +相邻 Rust CLI 将已有 cargo-audit 局部观察接入 `check all` 的独立 `rust.cve` 节点。显式工具与离线库提供的 advisory 保留在 JSON,对应脱敏发现进入 SARIF,human 显示漏洞和下一步;缺工具明确返回环境阻塞。反馈 0.29 和故障反馈 0.10 均加入 `rust_cve`,前一版本 schema 留存。CVE 类别即使观察到 `RUSTSEC-2020-0071`,仍因数据库时效和可信策略未核验保持 `incomplete`、退出 3;没有自写白名单放行路径。OpenSpec rulepack 场景和误报白名单设计补充了 Rust CVE 的待审边界,详见相邻 `codeguard-cli/tests/acceptance/check-all-cargo-audit.md`。 + +新增目标测试先因 `rust.cve` 缺失失败,接线后通过。完整回归初次揭示旧 Rust 文档测试仍断言三个节点,第二次揭示两项 CVE 测试临时目录并发重名;更新旧断言并给夹具加唯一序号后,最终 `cargo test --workspace --offline -q` 退出 0:161 组、949 通过、0 失败、97 条件忽略。日志 `/tmp/codeguard-workspace-rust-cve-all-20260928.log`,SHA-256 `e4ec3b345fa111ffa18bef11199a5b3f34ce1407aa43646082210844c6a2be0c`。额外显式运行真实 cargo-audit 条件用例 1 项,通过。全目标 Clippy `-D warnings`、格式、128 份 JSON Schema 静态校验、两份实际 `check all` JSON 的 Draft202012 验证、OpenSpec strict 和插件 `git diff --check` 均通过。 + +本轮没有可信漏洞库来源/时效、完整 Cargo 构建组合、受保护批准、稳定 CVE 任务/复检或正式宿主门禁;白名单当前仍是设计和局部纯领域/候选能力,不能实际替原生发现签发有效例外。7.1、4.8 和总体计划保持未完成。 + +## 2026-09-28 Rust CVE 工作台与复检增量 + +先以已初始化 Rust 项目重复原生审计仍无 `rust.cargo_audit` 稳定任务作为失败验收,再实现局部观察封套、持久同步、`next` 修复指引和 `task verify` 原工具复检。相同构建根重复扫描保留一张开放的 CVE 覆盖任务;原生 advisory 留在本地观察,数据库时效仍未核验。复检重新检查清单/锁身份并记录 `still_blocked` 事件,任务不会因勾选、零发现或本地白名单候选关闭。 + +目标 `check_all_cargo_audit` 3 项、受影响 `check_all_rust_native` 12 项通过,另 2 项条件性忽略。首次全量回归发现新 CVE 任务改变旧 Clippy 用例的 `next` 顺序及任务总数;现将待外部库核验的 CVE 任务排在可直接修复的源码问题之后,更新任务数量预期,受影响组复跑通过。完整 Rust 工作区离线测试最终 161 组、950 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-workspace-rust-cve-workbench-final-20260928.log` 的 SHA-256 为 `f14638de101e33499308d9ced02632eecd0ab8e032363c345a9ab3bad339a5d6`。全量开始后追加的缺工具阻塞断言另在目标组三项中复跑通过。130 份 schema 通过 Draft202012 静态校验,实际 CVE 封套与复检预览通过 Draft202012;全目标 Clippy `-D warnings`、格式、OpenSpec strict 和插件差异空白检查通过。验收详情见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 + +本地报告及任务身份仍属 `local_unverified`;可信漏洞库身份/时效、批准工具/策略、精确白名单独立批准及正式交付门禁未实现,7.1、4.8 和总体计划保持未完成。 + +## 2026-09-28 Rust CVE 尝试历史、无进展预算与简报协议 + +以已初始化 CVE 任务走 claim→attempt ready-to-verify→同租约原生 `task verify` 的端到端回归。首次目标测试发现 `next` 虽能核验复检事件和历史,却没有展示 `still_blocked`;增加 Rust CVE 结果分支后,简报保留未核验库的具体下一步。`still_blocked` 计入同动作无进展预算;追加一次 `no-change` 后,`next` 返回 `needs_decision`,再次启动同动作明确返回 `no_progress_budget_exhausted`。目标 `check_all_cargo_audit` 4 项通过。 + +另用实际 `next` JSON 发现旧 `repair-brief-preview` 0.1 schema 只容纳 Ruff,现加入严格 Rust CVE blocker 分支,不放宽原 Ruff 约束。实际简报通过 Draft202012;检查器、复检结论、范围三种篡改均被拒。完整 Rust 工作区离线测试最终 161 组、951 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-workspace-rust-cve-attempt-20260928.log`,SHA-256 `4e172eedebc6e7f235425613f5126910860ebdf1eb403dba31259b6822572427`。新增 schema 在全量 Rust 运行后加入,另经 130 份 Draft202012 静态校验和实际输出验证;全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。验收见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 + +这仅证明本地工作台防重复动作,不具漏洞库来源/时效证明、精确白名单独立批准或最终门禁授权。其它语言的 `next` 严格 schema 覆盖仍缺,7.1/4.8/9.7 和总体计划保持未完成。 + +## 2026-09-28 尝试结束后的输入变化不得误归因复检 + +以 Rust CVE 稳定任务构造反例:claim 和 ready-to-verify 已结束,随后 `Cargo.lock` 发生字节变化,再运行原工具复检。旧代码把新输入的复检事件归到旧 attempt。现在通用尝试账本仅在当前任务输入摘要等于该次 finish 的 `after_sha256` 时允许绑定;输入变化时新复检仍可保存,但 `attempt_id=null`,旧尝试仅留在历史,不继续阻塞当前输入的动作或继承其无进展预算。目标集成测试先失败后通过,并确认新输入可登记新 attempt。 + +受影响普通测试:Rust CVE 5 项、Checkstyle 7 项、租约/尝试 16 项、复检 10 项,合计 38 项通过;Checkstyle 13 项与复检 8 项条件性忽略,不计通过。完整 Rust 工作区离线测试终态为 161 组、952 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-workspace-attempt-input-binding-20260928.log`,SHA-256 `48f8939abf9d724c00b99e9a1ce8213eca5009c283fbf893919889be8138113d`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。此修正不证明外部工具/漏洞库字节或策略来源已冻结,也不签发白名单批准、任务关闭或交付许可。9.27/7.1/4.8 保持未完成,验收见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 + +## 2026-09-28 白名单候选复用 finding ID 的冲突纠正 + +新增两条反例:同一稳定 finding ID 的候选分别指向两个源码目标。旧 `rules whitelist explain` 会选中其中一条并返回 `identity_matched`、退出 0;旧纯候选筛选器会返回 `ReadyForAuthorityCheck`。两项测试在修改实现前实际失败;现在查询将双方标为冲突、退出 3,筛选器返回 `ConflictingCandidates`。受影响的两个 Rust 测试组共 21 项通过;完整 Rust 工作区离线测试 161 组、954 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-whitelist-conflict-20260928.log`,SHA-256 `db31e7f66efbfbeb8bb35a2699c61bc959c3d3d2b257c3dcf6d4be16a966e45f`。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件差异空白检查通过。候选查询仍为 `authority=unverified`、`gate_effect=none`;可信批准来源与真实交付门禁仍未接入,4.8/4.9 和总体计划保持未完成。 + +## 2026-09-28 公共检查请求与 RunReport 原始 JSON 重复键拒绝 + +增加检查请求嵌套 `jobs`、RunReport 顶层 `delivery_gate`、内层 `decision` 及内嵌请求 `jobs` 重复键反例。旧解析先覆盖重复值,这两项目标测试修改前均失败;现公共入口复用已有递归无重复键解析器与 16 MiB 字节预算,整份原始输入被拒绝,不生成经过结构校验的对话反馈。请求、报告、白名单报告三个受影响测试组共 33 项通过;完整 Rust 工作区离线测试 161 组、956 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-strict-public-json-20260928.log`,SHA-256 `cf278e412fb09f368636ae6a938187ae8538d78b16829630f084c9cb7a6e6197`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。这仅加固协议消费;真实原生报告生产、可信来源及最终门禁仍缺,2.3/2.10/12.12 和总体计划未完成。 + +## 2026-09-28 `check all/java` 本轮项目范围复核 + +以真实伪 Ruff 子进程在初次项目发现后写入 `late.py`:旧 `check all` 没有标记范围变化,目标测试先失败。现在原生任务结束后重新静态发现,比较源码/清单集合、构建根、清单/锁/规则配置摘要及配置状态;源码新增或规则配置变化时公开 `unresolved_conditions` 记录 `project_scope_changed_during_check`,human 反馈要求重新发现和原工具复检。`codeguard/state` 自有受管记录写入不触发该项;已超过总截止时间则不做无预算末次发现,标记未复核。目标测试组 15 通过、1 条需原生 Ruff 的用例条件忽略;完整 Rust 工作区离线测试 161 组、958 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-check-scope-recheck-20260928.log`,SHA-256 `aada412ef433de5b3447ca339c2e05de48a77ef28f6147862d6e2cbf2875734b`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。 + +该复核只比较发现范围和已静态观察到的配置身份,不冻结每个源码文件的全程字节、不检测改后又改回,也不能把本地候选转换为可信必需义务。因此 3.7/2.4 和总体计划保持未完成。 + +## 2026-09-28 `check all/java` 同路径源码字节复核 + +初次发现的源码路径在原生任务前建立有界快照;任务结束后从固定根目录描述符读取同路径文件并比较字节。先增加真实伪 Ruff 子进程把 `app.py` 的 `import os` 改为等长 `import io` 的反例,以及 runtime 的原路径字节复核契约;后者先因接口不存在而编译失败。现在 CLI 报 `project_source_changed_during_check`,human 提示核对并发编辑或检查器副作用,保留已有原生诊断和 incomplete 判定。单文件超过 16 MiB 的反例报 `project_source_snapshot_unavailable`;仅改 `codeguard/state` 不报源码变化。`ruff.toml` 同时是 TOML 源文件,配置变更触发源码变化提示符合当前发现分类。 + +目标 `check_all_partial_contract` 17 通过、1 条条件忽略,`source_snapshot_contract` 5 通过。首次并行全工作区运行在既有 `process_contract::argv_metacharacters_are_literal_and_cannot_spawn_a_shell` 的 `ReadFailure` 失败;第二次在既有 `eslint_probe_contract::interrupted_scan_preserves_cancel_and_deadline_reason_with_or_without_report` 的启动标记断言失败;两项单独复跑均通过,不将两次失败计为全量验收通过。随后 `cargo test --workspace --offline -q -- --test-threads=1` 退出 0:161 组、961 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-source-byte-recheck-serial-20260928.log`,SHA-256 `f1d7855414a4c1b0e7bfcd4bfa67eaf7e296660ee9d145c2acf94b38ec037772`。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件 `git diff --check` 均通过。 + +当前快照仅覆盖初次静态发现的源码,捕获过程不是原子项目切面,改后又改回、末次复核之后的修改以及未发现的目标仍无法保证识别;完整沙箱、受保护义务账本和正式门禁亦未完成。因此 3.7/2.4 与总体计划保持未完成。 + +## 2026-09-28 原生进程读流排空与并行回归稳定性 + +上一轮同路径源码复核后的两次并行全量运行分别在 `process_contract` 的短命令读取和 `eslint_probe_contract` 的扫描启动前提上失败,单独复跑通过;这暴露了运行时固定 150ms 排空窗口及测试使用过紧整轮期限的时序边界。现成功退出的原生进程继续按原请求绝对期限排空 stdout/stderr,不另造固定短期限;期限耗尽仍不可返回完整。ESLint 反例把伪扫描时间维持长于总期限,并把准备阶段预算增大,使实际取消和期限行为仍被执行。 + +目标 `process_contract` 15 项通过,`eslint_probe_contract` 2 项通过、2 项条件忽略。当前源码 `cargo test --workspace --offline -q` 并行运行退出 0:161 组、961 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-runtime-drain-parallel-20260928.log`,SHA-256 `bbb5ee8768ed3baaa1d0337c4f932410c32cfcb631c14797c7641b09353abf4d`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 和插件差异空白检查均通过。先前并行失败记录不被抹除;单次并行通过不能证明所有负载和平台无时序问题。持久化 I/O 硬截止时间、Windows 对等行为及正式门禁仍缺,3.2/3.3 与总体计划继续未完成。 + +## 2026-09-28 Ruff D100 原生注释问题归类 + +先用本机 Ruff 0.16.8 和项目 `ruff.toml` 显式选择 D100,复现公共 Python 模块缺少顶层 docstring:原有 `check all` 已保留 D100 原生诊断,但 `comments` 候选仍显示未接入,目标验收先失败。现在仅在本轮原生 D100 实际检出时,将 Python 注释候选关联 `python.ruff`、显示 `observed_unverified` 并给出模块文档修复/同工具复检动作;D100 诊断摘要与修复任务提示也明确说明模块 docstring。补上准确 docstring 后再次运行原生 Ruff,D100 观察消失,注释候选不伪称完整通过,交付仍为 incomplete。规则包未映射的原生诊断保持未批准身份;没有从配置文本或零诊断推断全量注释覆盖。 + +真实 `native_ruff_d100_is_reported_as_python_comment_evidence` 用例显式执行并通过,普通受影响三个测试目标合计 38 项通过、9 项条件忽略。当前源码并行 `cargo test --workspace --offline -q` 退出 0:161 组、961 通过、0 失败、98 条件忽略;日志 `/tmp/codeguard-python-d100-parallel-20260928.log`,SHA-256 `93e1db0e071bcf6bec16c60916624d8ca4e2c6ba4fa8cbbc14444bdd3ceccbd9`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。D100 以外的注释规则、生效规则集证明、配置级 suppression、可信规则包和完整交付门禁仍缺,7.2 与总体计划不勾选。 + +## 2026-09-28 D100 稳定任务复检与生效规则交叉核对 + +实际初始化工作区后,以固定 Ruff 0.16.8 运行 `check all`:D100 原生诊断同步为一张稳定任务,`next` 给出同一任务和规则;`task verify` 在问题仍存在时记录 `still_present`,补充模块 docstring 后再次调用原工具记录 `candidate_absent_unverified_policy`。复检事件已持久化,finding 事实保持 open,没有把任务勾选或局部零诊断当作正式关闭与交付许可。该真实链的显式条件测试通过。 + +另构造伪 Ruff:JSON 报告声称 D100,但同轮 `--show-settings` 的启用规则集合为空。旧实现错误地返回本地扫描完整;反例先失败。解析器现内部保留精确原生启用集合,D100 与本轮设置矛盾时返回 `rule_settings_report_mismatch`、保留诊断并取消本地完整结论。内部集合不序列化,公开候选映射、规则包批准与既有 schema 形状均未扩大。`ruff_settings_contract` 3 项通过,目标伪报告反例通过;两条真实 Ruff D100 用例显式运行通过。 + +当前源码并行 `cargo test --workspace --offline -q` 退出 0:161 组、963 通过、0 失败、99 条件忽略;日志 `/tmp/codeguard-d100-workbench-settings-20260928.log`,SHA-256 `7327ce6eee24a47ef34e50fb3390b2a9a2a6c29065faa263445bab7fb9815787`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查通过。配置级 suppression、全部注释规则及完整源集、可信工具/规则政策和正式任务关闭门禁仍未完成,7.2/9.7 与总体计划保持未完成。 + +## 2026-09-28 Ruff pydocstyle 规则族局部归类 + +将 Python 注释候选从仅识别 D100 扩为精确 D### 原生诊断,并逐项交叉核对同轮 Ruff 生效规则集合。真实 Ruff 0.16.8 的 D101 公共类缺文档测试先因未归类而失败,修正后通过;适配器格式边界 4 项测试通过,D1000/DOC201 等不会归入该类。伪原生报告 D100/D101 但启用集合为空的反例通过,均保留诊断、取消本地完整结论。真实 D100/D101 两项显式运行通过;全工作区离线测试 161 组、964 通过、0 失败、100 条件忽略,日志 `/tmp/codeguard-d-family-20260928.log`,SHA-256 `5c70119ce9172ee39688a0ef35dae8f38a15e0f58e48366409e1b614619bd98c`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。完整 D/DOC 覆盖、配置级 suppression、可信规则批准和交付门禁仍缺,7.2 保持未完成。 + +## 2026-09-28 D101 可执行修复与原生抑制对照 + +真实 Ruff D101 样本对“公共类缺少文档字符串”和明确的类 docstring 修复步骤先 RED 后通过。初始化工作区的稳定任务文件给出相同范围与原工具复检命令;在类声明加 `# noqa: D101` 时,`task verify` 的原生无抑制对照检出原问题并记录 `suppression_requires_review`,不能把绕过当修复。补充真实类文档后的复检仅记录 `candidate_absent_unverified_policy`,finding 仍 open。两项真实 Ruff 目标测试均通过;变更后全工作区离线测试 161 组、964 通过、0 失败、101 条件忽略,日志 `/tmp/codeguard-d101-guidance-20260928.log`,SHA-256 `b5d3fe1171c54f4cc85ca13c02c194c583867fa53f71a0f99af4ece2a7a70f26`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 和插件差异空白检查均退出 0。7.2/9.7 仍未完成。 + +## 2026-09-28 D101 项目自批白名单反例 + +在真实 Ruff D101 稳定任务已经存在后,向项目自有 `codeguard/decisions/forged.json` 写入同一 finding 和 `approved=true`。重跑原生 `check all` 仍返回 D101、同一唯一稳定任务和 incomplete;只读 `rules whitelist propose` 固定 candidate=null、authority=unverified、gate_effect=none。原逻辑只笼统报告批准规则包缺失,现将尚无核对映射的 D101 标记 `rulepack_mapping_unavailable`,分别列出 `reviewed_native_rule_mapping` 与 `approved_rulepack_identity`,human 输出也显示核对动作。该具体期望先 RED 后通过;已有 F401 候选映射的真实回归通过,仍不获批准。该证据只覆盖未接可信批准时的拒绝路径,不能证明未来独立签发、密钥来源与正式交付例外已接通;4.8/4.9 仍未完成。 + +分流改动后全工作区离线测试 161 组、964 通过、0 失败、101 条件忽略,日志 `/tmp/codeguard-rulepack-mapping-20260928.log`,SHA-256 `be05119f7a9fcc5cd7b9029b611f2975d54c1f06531dae81f7741376f8994663`;真实 D101 和 F401 白名单提案用例分别显式通过。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 和插件差异空白检查退出 0。完整可信签发及门禁仍未实现,保持原任务未完成状态。 + +## 2026-09-28 Python 依赖输入的逐构建根只读发现 + +相邻 Rust 工程新增 Python requirements 的保守行级分类和逐构建根 CVE 输入说明。先写的 `detect` 与 `check all` 目标回归分别因缺少 `python.pip_audit` 发现、类别反馈而失败;实施后,逐行固定版本、动态约束、uv 锁存在未解析、无依赖输入与根/子项目锁归属的正反例通过。包名大小写及 `-`/`_`/`.` 等价形式的重复声明也保持未解析。`plan cve python` 不生成已可执行扫描任务;`check all` human/JSON 报告配置未知、依赖图及原生工具待核验,交付固定 incomplete。源码/依赖输入变化的故障注入分支尚无独立测试,不能以这些回归代替原生漏洞验收。 + +`detect_cli` 27 项、`check_all_partial_contract` 17 项通过/3 条件忽略;adapter 分类定向测试通过。当前源码 `cargo test --workspace --offline -q` 退出 0:161 组、968 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-cve-input-20260928.log`,SHA-256 `87716b999b0a9a171c5d04dc76ab76176911b1bcbad0d293752c5a7b0cd17b17`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。未安装或调用 pip-audit,锁图、传递依赖、漏洞数据库身份与时效、真实 advisory、稳定 CVE 修复任务及正式门禁均未验收;5.10、7.2 与总体计划继续未完成。 + +## 2026-09-28 Python 标准锁与专用锁的原生入口边界 + +依据 [pip-audit 官方项目模式](https://github.com/pypa/pip-audit/blob/main/README.md?plain=1)及 [PyPA pylock 文件名规范](https://packaging.python.org/en/latest/specifications/pylock-toml/),新增对 `pylock.toml` 和单段命名 `pylock.ci.toml` 的只读识别;它们仍标为标准锁模型未解析。`uv.lock`/`poetry.lock` 保留独立状态及需选原生工具或显式导出的动作;同根并存多锁时返回选择歧义,不默认让 pip-audit `--locked` 消费专用锁。公开 `detect` 真实文件样本先因标准锁未识别而 RED,实施后单标准锁、命名标准锁、多锁和仅 uv 锁四阶段回归通过。 + +`detect_cli` 28 项及 `check_all_partial_contract` 17 项通过/3 条件忽略。变更后 `cargo test --workspace --offline -q` 退出 0:161 组、969 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-pylock-20260928.log`,SHA-256 `598ccc575996826a30917de38b9f308a975ce5abdaf5bd8eeb46c970c19ecf03`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 和插件差异空白检查退出 0。此轮没有调用 pip-audit,PEP 751 内容/环境、完整依赖图、真实 advisory 和漏洞数据库时效仍未核验;5.10/7.2 不勾选。 + +## 2026-09-28 pip-audit 项目锁命令计划与 JSON 协议观察 + +对照 [pip-audit 当前 JSON formatter 源码](https://github.com/pypa/pip-audit/blob/main/pip_audit/_format/json.py)与 [官方 CLI/退出码说明](https://github.com/pypa/pip-audit/blob/main/README.md?plain=1),相邻 Rust adapter 新增标准锁项目模式的字面参数计划及 2.x JSON 保守解析。命令固定 strict、JSON、别名、关闭描述与进度、项目外缓存,不含修复或忽略参数;相对路径及项目内缓存拒绝。解析器只接当前对象结构,递归拒绝重复字段;跳过依赖、意外 fixes、重复组件、版本或退出矛盾和不符命令形状的原始描述都保持未完成。有效原生 advisory、组件解析版本及 CVE 别名仅为观察,空 JSON 仍固定 `advisory_coverage=not_evaluated`。 + +测试先因缺 `parse_pip_audit_json` 编译失败,解析实施后 4 项通过;再因缺 `PipAuditCommand` 编译失败,命令计划实施后 6 项全部通过。最终全工作区 `cargo test --workspace --offline -q` 退出 0:162 组、975 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-pip-audit-protocol-20260928.log`,SHA-256 `927b942584ebcb6a4a37b9dacaea6d8ca70c90186ad84ffff9cc13562398020f`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。测试 JSON 按上游源码构造;当前机器未安装/调用 pip-audit,本阶段没有真实原生输出、同轮锁身份、漏洞库时效、CLI/任务/门禁证据;7.2 和总体计划均不勾选。 + +## 2026-09-28 Python 标准锁局部 CVE 入口与归属门槛 + +公开 `cve python` 先因被旧 npm 分派接管而两项 RED。现使用显式工具/版本、共同截止时间和受控进程,在独占私有目录复放项目 pyproject 与唯一标准 pylock;工具版本、原清单/锁、私有副本与工具字节在执行前后核对。human/JSON 提供局部 advisory、缺锁及输入变化反馈,始终退出 3、`not_evaluated`、`coverage_proven=false`。本机模拟原生可执行文件测试证明:原生漏洞可见,原生零项不放行,私有锁改动使结果无效且原项目不变。macOS `/var` 到 `/private/var` 的祖先路径规范化曾使首次正例误判工具不可用;现拒绝工具自身符号链接,同时允许祖先目录规范化,目标测试通过。 + +复核又发现原生报告的组件若不在锁中仍会显示为项目局部 finding;缺包反例先 RED。现在只抽取 PEP 751 锁中的显式包名/版本,与原生报告整组解析组件作规范化精确对照;缺包、错版本、无版本源码包、损坏锁均不生成项目 finding。五项公开 CLI、七项 adapter 协议/绑定测试通过。试图构造非 UTF-8 文件名作 CLI 反例时,本机 APFS 在建文件阶段返回 `Illegal byte sequence`;该夹具移除,代码对不可解码目录项保持未完成,但没有声称此边界经真实文件系统验收。 + +独立 Draft 2020-12 校验通过原生零项与缺锁两份当前 CLI 报告,并拒绝 `coverage_proven=true`、`delivery_decision=allow`、已观察却 `native_report_valid=false` 三个伪授权变体;Python 只用于验收,不在 Rust 产品执行路径。最终当前源码 `cargo test --workspace --offline -q` 退出 0:163 组、981 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-cve-lock-binding-20260928.log`,SHA-256 `b9740ce886402146cd68a9ac30203d01dd580c7ff62731d01484f4bff7325b12`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。模拟程序不是 pip-audit 本体;PEP 751 环境/依赖组及文件哈希、真实漏洞库身份与时效、完整原生运行、稳定修复任务和 check all/宿主门禁仍缺,7.2 与总体计划不勾选。 + +## 2026-09-28 Python 条件锁的错误归属防护 + +依据 [PyPA pylock 规范](https://packaging.python.org/en/latest/specifications/pylock-toml/),`environments`、`requires-python`、extras、依赖组、default-groups 和包级 marker 会改变实际选用的包。原解析器把带环境条件的 `[[packages]]` 当成同一组显式包身份;先写的反例对此返回 `Ok`,RED 已复现。现在没有目标环境和组选择上下文时,Rust adapter 返回 `python_lock_selection_unresolved`;已配置工具时 `cve python` 与 `check all` 仍调用原生审计,公开版本、退出码和待归属 advisory 数量,但保留退出 3、零项目 finding 和具体核对动作。显式空 extras/组仍可用于局部观察。已初始化项目的实际 CLI 扫描仍创建一张稳定的 Python CVE 完整性任务,故该不确定性不会因无法归属而从修复工作台消失。 + +适配器 8 项协议测试和 Python CVE CLI 10 项测试通过;独立 Draft 2020-12 对实际条件锁报告验证通过(退出 3、零 finding、无 schema 错误)。全工作区 `cargo test --workspace --offline -q` 退出 0:163 组、987 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-lock-selection-20260928.log`,SHA-256 `0668b596522484e7a12455cc760323120830a00e73f955e556a64f2ef66ac1b4`。全目标 Clippy `-D warnings`、Rust fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。模拟工具与静态格式核对不证明真实 pip-audit、环境选择、漏洞库及时效;7.2 与总体计划保持未完成。 + +后续检查发现首次条件锁保护把原生工具也提前跳过,不符合已配置检查器仍应反馈执行结果的设计。新 CLI 反例先显示 `native_version=null`(RED);修正后同一模拟原生程序实际返回版本 `2.10.0`、退出 `1` 和一条待归属 advisory,公开结果仅反馈待归属数量、保留零项目 finding/退出 3,并自动同步同一稳定 CVE 完整性任务。真实 `cve python`、`check all` 和工作台报告的三份 JSON 均通过独立 Draft 2020-12 校验;脚本首次缺本地 schema registry 的错误已在验收脚本中修正,不属于产品。最终 `cargo test --workspace --offline -q` 退出 0:163 组、987 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-conditional-native-20260928.log`,SHA-256 `676bc207d7b9eb4e79e0045fc1ebc903ab475a9436b79dc04291182c94605ac7`。全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件差异空白检查退出 0。未运行真实 pip-audit,环境/组精确选择、漏洞库身份与时效、全量义务及可信门禁仍缺,7.2 和总目标保持未完成。 + +## 2026-09-28 Rust CVE 原生异常后的部分发现 + +延续 F05、5.5 和 7.1。受控原生 `cargo-audit` 先输出与当前 `Cargo.lock` 匹配的完整 advisory JSON,再以异常码 2 退出;旧 CLI 把该有效 finding 丢弃,目标集成测试先 RED。修正后从完整报告独立解析并核对锁、清单及工具字节,公开一条待核验 RUSTSEC finding,`local_scan_complete=false`、`cargo_audit_execution_incomplete`、退出 3、交付 `not_evaluated`。保存的本地报告保留该发现,已初始化工作区同步唯一稳定 CVE 完整性任务;部分证据不升级为已批准漏洞或放行。截断 JSON/异常码 2 的负例仍为零 finding。独立 Draft 2020-12 核验实际局部与工作台 JSON,两份 schema 均通过;详见相邻 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。 + +首轮全量回归在测试夹具建临时目录时因并发重名失败(`File exists`),未运行到产品断言。夹具增加进程内原子序号后,Rust CVE 测试文件 2 项普通测试通过、1 项显式真实工具测试默认忽略;最终 `cargo test --workspace --offline -q` 退出 0:163 组、988 通过、0 失败、101 条件忽略。日志 `/tmp/codeguard-rust-cve-f05-full-20260928.log`,SHA-256 `74b54089afe874b71cf1551f9453d13d5bf76b15dcf8de3ba2f6182183b3412f`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-rust-cve-f05-clippy-20260928.log`,SHA-256 `417b2ef0e9e174870bcbecb513216af0b5b02ef5e7c4e7271bc740d04b6c55b7`;Rust fmt、OpenSpec strict 和插件差异空白检查退出 0。原生程序为受控模拟器;真实 `cargo-audit` 崩溃、超时后部分输出、其它适配器及通用 F01–F10/F17 矩阵未验收,5.5/7.1 与总体计划均不勾选。 + +## 2026-09-28 Rust CVE 完整报告后超时的部分发现 + +延续 F05。模拟原生程序先输出完整且与本轮 `Cargo.lock` 匹配的 advisory,然后保持运行到超时;旧入口直接返回空 finding,目标测试先 RED。现对已捕获 stdout 做严格 JSON 与锁文件绑定,且复核工具、清单、锁字节;保留 advisory,但原生超时原因 `request_deadline_exceeded`、`local_scan_complete=false`、退出 3 和 `not_evaluated` 不变。已初始化工作区保存包含该部分 finding 的本地报告并同步稳定完整性任务,不能因此关闭漏洞义务或认定数据库时效。200ms 初始夹具在并行负载下无法稳定证明“报告已输出”,改为报告输出后停留 5s、2s 超时的明确顺序。独立 Draft 2020-12 对实际公开报告及保存的工作台报告均通过;首次验收脚本缺 URN 本地引用注册,修正脚本后两份 schema 零错误。详见相邻 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。 + +最终 `cargo test --workspace --offline -q` 退出 0:163 组、988 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-rust-cve-f05-timeout-full-20260928.log`,SHA-256 `08e75244e07486cf28879a5c2d2b40e39834bddb314e5939cc3815dc3db3fbd4`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-rust-cve-f05-timeout-clippy-20260928.log`,SHA-256 `06deecc3c68c7e0b91ffbd05c208056b55458616edaf89af53d7e94c7a765e53`;fmt、OpenSpec strict 和插件差异空白检查退出 0。当前仍为模拟原生进程;实际 cargo-audit 卡死、输出超限/坏报告、其它语言适配器及通用 conformance 矩阵未完成,5.5/7.1 与总体计划保持未勾选。 + +## 2026-09-28 Rust CVE 输出超限的发现与故障分类 + +延续 F05。受控原生程序先向 stdout 输出完整、与本轮锁绑定的 advisory JSON,再向 stderr 写入超过共同 16 MiB 配额的数据;原 CLI 虽保留 finding,却把输出上限折叠为通用执行未完成,具体原因断言先 RED。现在明确反馈 `cargo_audit_output_limit`,仍为退出 3、`local_scan_complete=false`、`not_evaluated`,保留局部 advisory 并同步稳定 CVE 完整性任务。对照程序只输出残缺 stdout JSON 后触发同一上限,零 finding;没有从 JSON 前缀推断漏洞。独立 Draft 2020-12 对正反两组实际公开报告与各自保存的工作台报告均为零 schema 错误,见相邻 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。 + +最终 `cargo test --workspace --offline -q` 退出 0:163 组、988 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-rust-cve-f05-output-limit-full-20260928.log`,SHA-256 `6e84ccc6450917fdece4ace379430543b8d72c9cc941821be5f59fad96eaa340`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-rust-cve-f05-output-limit-clippy-20260928.log`,SHA-256 `598bb85a445f943398014aad58e8f987aef829bd392bac6f17fbaa7339d267d3`;Rust fmt、OpenSpec strict 与插件差异空白检查退出 0。此处原生程序为受控模拟器,验证的是完整 stdout 报告后其它输出超限;cargo-audit 单体 JSON 自身截断不可据前缀恢复,真实工具故障、其它适配器和通用 F01–F10/F17 矩阵仍缺,5.5/7.1 与总体计划不勾选。 + +## 2026-09-28 Python CVE 原生故障后的部分发现 + +延续 F05、5.5 与 7.2。受控 `pip-audit` 先返回已独立核验的 2.10.0 版本,再输出与本轮 PEP 751 唯一锁整组组件匹配的 Flask advisory,最后异常码 2 退出;旧 CLI 丢弃 finding,目标测试先 RED。修正后严格解析完整 JSON,复核项目原清单/锁、私有副本与工具字节,并用既有锁归属比较保留局部 advisory。`native_report_valid=true` 只表示报告内容可核对;真实退出码 2、`pip_audit_execution_incomplete`、`local_scan_complete=false`、退出 3 和 `not_evaluated` 保留。工作台仍只生成稳定的 Python CVE 完整性任务,不将部分 advisory 认定为获批准的项目漏洞。残缺 JSON 或原生包不在锁中均保持零 finding。继续用同一目标测试验证完整报告后超时与其它输出超限:分别保留 `request_deadline_exceeded` 和 `pip_audit_output_limit`,无原生整数退出码,部分 finding 不放行;残缺 JSON 后超限仍零 finding。普通 Python CVE CLI 文件 11 项测试通过。 + +独立 Draft 2020-12 对异常退出、超时、输出超限、残缺报告四组实际公开报告及各自保存的工作台报告验证通过,finding 数依次为 1/1/1/0,四组均退出 3、未完成、零 schema 错误。第一次复跑时仓库默认 `target/` 在编译过程中消失,链接器报依赖 `.rlib` 缺失;核对时目录已不存在,磁盘尚余 37 GiB,未把此记作产品测试失败,也未重置源码。改用独立 `CARGO_TARGET_DIR=/tmp/codeguard-python-f05-target-20260928` 后目标和全量测试通过。最终 `cargo test --workspace --offline -q`:163 组、989 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-f05-full-20260928.log`,SHA-256 `eefa91a2e73154944bdd3881c18fbd9c8ec62e48bdf1d06ee3ec6b19ed2d820b`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-python-f05-clippy-20260928.log`,SHA-256 `465c3e723d436ef227a04a77e3404e82b7aad5eec3c1ff9080a6f3f7d0447e7f`;fmt、OpenSpec strict 和插件差异空白检查退出 0。验收详见相邻 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。真实 pip-audit 故障、PEP 751 条件环境/依赖组、数据库来源及时效、其它语言适配器和通用 F01–F10/F17 矩阵仍未证明,5.5/7.2 与总体计划保持未完成。 + +## 2026-09-28 `check all` 对 Python CVE 部分报告的状态修正 + +延续 2.3 和 7.2。局部报告在异常退出后 `native_report_valid=true` 是完整 JSON 与锁身份可核对,不等于原生命令按退出契约完成;旧总入口据此把执行节点和类别候选误标为已观察。新增已初始化工作区的 `check all` 反例,目标断言 `native_incomplete` 先 RED。修正后仅 `native_advisories_observed_unverified` 和 `native_zero_advisories_unverified` 这两种正常退出结果使 Python CVE 执行节点成功;异常码 2、输出超限保留本轮 finding,同时任务节点和类别候选为 `native_incomplete`,未解决条件含 `python_cve_task_incomplete`,工作台继续同步稳定完整性任务。11 项 Python CVE 目标文件测试通过。独立 Draft 2020-12 对异常退出及输出超限两份实际 `check all` JSON 验证通过:均退出 3、各一条 advisory、执行/候选未完成、零 schema 错误。详见相邻 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。 + +最终在独立构建目录中 `cargo test --workspace --offline -q` 退出 0:163 组、989 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-f05-check-all-full-20260928.log`,SHA-256 `be71ff67c3344e6a483c2c0d7c014a4bf2ce5d0d7cd00b12781d9747c43ac30a`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-python-f05-check-all-clippy-20260928.log`,SHA-256 `d0492b6f8a4a276e8cbe4f385278c6e748acbd88b449f60d9e35ee9707c6b123`;fmt、OpenSpec strict 和插件差异空白检查退出 0。只覆盖 Python CVE 局部到总入口的这一状态链;完整跨语言 findings/completion 聚合、真实 pip-audit/漏洞库、受批准策略与宿主门禁仍缺,2.3/7.2 与总体计划不勾选。 + +## 2026-09-28 npm CVE 异常退出后的证据与执行状态 + +受控 Node/npm 11.16.0 程序在输出与当前锁节点匹配的完整一条 advisory 后以 2 退出;旧 `cve typescript` 报告零 finding,目标断言先失败。修正后公开反馈保留一条脱敏局部发现及 `npm_audit_execution_incomplete`,工作台维持同一稳定 CVE 完整性任务。`check all` 原生结果仍显示该发现,但执行节点为 `native_incomplete`。截断 JSON 后以 2 退出的对照仍零 finding。局部报告可核对不等于原生命令完成,退出 3、覆盖和交付未评估不变。 + +该阶段 `npm_audit_cli` 和 `check_all_npm` 目标测试、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check` 及 OpenSpec strict 均退出 0。此阶段只覆盖异常退出;超时与输出上限的后续进展见下段。受控替身未证明真实 npm 故障、数据库新鲜度与全部 F05 矩阵,2.3/5.5/7.3 和完整目标保持未完成。详见相邻 `codeguard-cli/tests/acceptance/npm-partial-native.md`。 + +后续补齐完整报告后超时和其它输出超限两种模拟故障:公开反馈均保留一条局部 advisory,原因分别为 `deadline` 与 `npm_audit_output_limit`,交付未评估;截断 JSON 的超限对照零 finding,工具文件变化也使结果失效。输出超限的实际 `check all` 反馈包含 finding,但执行节点 `native_incomplete`。已初始化工作区在超时后不给截止时间外的持久化成功,输出超限仍同步稳定任务。独立 Draft 2020-12 对异常退出的实际反馈、工作台和完整检查三个 JSON 验证通过。首次全量败于新增 npm 测试替身过早退出,第二次败于既有 Rust CVE 测试替身的同类时序;两者调整后目标回归及最终全工作区退出 0:163 组、989 通过、0 失败、101 条件忽略,日志 `/tmp/codeguard-npm-f05-full-final-20260928.log`,SHA-256 `a008b5049c919c7cc9fa43d968e0be936e43d5631d9c6f5acd2c35c080eaa5f5`。全目标 Clippy `-D warnings`、fmt 退出 0。真实 npm 故障、取消、全部原生优先级及跨语言 F05 矩阵仍缺,不勾选 2.3/5.5/7.3。 From 850bfd23814c5c86edb2b1207f136afd1a1e1022 Mon Sep 17 00:00:00 2001 From: loong10k <20489781+loong10k@users.noreply.github.com> Date: Mon, 28 Sep 2026 21:51:55 +0800 Subject: [PATCH 2/6] =?UTF-8?q?feat(plugin):=20=E8=BF=81=E7=A7=BB=E5=88=B0?= =?UTF-8?q?=20Agent=20Plugins=20v1.0.0=20=E5=8F=AF=E7=A7=BB=E6=A4=8D?= =?UTF-8?q?=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 此前仅发布各客户端专属清单(.codex-plugin/、.zcode-plugin/、kimi.plugin.json), 不符合 Agent Plugins 规范。符合规范的客户端会因缺少根清单而整体拒绝该插件, 其中的 68 个技能一个也加载不到(§5.1/§5.3:缺清单是致命错误,不是警告)。 - 新增根 plugin.json:$schema 常量 + name 约束 + 封闭字段集;客户端专属的 interface 等数据移入 extensions["com.openai"] / extensions["ai.nanoco.nanoclaw"] - version 取基础版本,+codex. 构建元数据留在兼容通道 - 新增客户端扩展目录,让非可移植的 commands/hooks/agents 对注册表客户端可见: - 新增 `com.github.copilot/`(VS Code 与 GitHub Copilot 共用) - 新增 `dev.openhands/`(OpenHands) 根目录副本保留,Codex/ZCode/Kimi 通道不受影响 - 新增 scripts/validate_portable_plugin.py:纯标准库、无网络,按发布 schema 校验清单、技能发现与镜像漂移 - 新增 docs/portable-migration.md 记录迁移内容与客户端覆盖 校验:19/19 包通过规范校验;4655 个测试,红色套件 9 个且全部为迁移前既有失败, 本次迁移零新增失败。 仓库内同步调整: - scripts/check_architecture.py:把 scripts/validate_portable_plugin.py 登记进 SCRIPT_ROLES(角色 entry),否则未分类顶层脚本会触发架构门禁。 --- com.github.copilot/hooks/__protocol__.md | 231 ++++++ com.github.copilot/hooks/env_check.py | 110 +++ com.github.copilot/hooks/gate_lib.py | 124 +++ com.github.copilot/hooks/hooks.json | 64 ++ com.github.copilot/hooks/post_tool_lint.py | 131 ++++ .../hooks/pre_tool_git_guard.py | 138 ++++ com.github.copilot/hooks/stop_summary.py | 71 ++ .../hooks/user_prompt_validator.py | 118 +++ dev.openhands/commands/check.json | 5 + dev.openhands/commands/fix.json | 5 + dev.openhands/commands/init.json | 5 + dev.openhands/hooks/__protocol__.md | 231 ++++++ dev.openhands/hooks/env_check.py | 110 +++ dev.openhands/hooks/gate_lib.py | 124 +++ dev.openhands/hooks/hooks.json | 64 ++ dev.openhands/hooks/post_tool_lint.py | 131 ++++ dev.openhands/hooks/pre_tool_git_guard.py | 138 ++++ dev.openhands/hooks/stop_summary.py | 71 ++ dev.openhands/hooks/user_prompt_validator.py | 118 +++ docs/portable-migration.md | 94 +++ plugin.json | 56 ++ scripts/check_architecture.py | 1 + scripts/validate_portable_plugin.py | 713 ++++++++++++++++++ 23 files changed, 2853 insertions(+) create mode 100644 com.github.copilot/hooks/__protocol__.md create mode 100755 com.github.copilot/hooks/env_check.py create mode 100644 com.github.copilot/hooks/gate_lib.py create mode 100644 com.github.copilot/hooks/hooks.json create mode 100644 com.github.copilot/hooks/post_tool_lint.py create mode 100755 com.github.copilot/hooks/pre_tool_git_guard.py create mode 100755 com.github.copilot/hooks/stop_summary.py create mode 100755 com.github.copilot/hooks/user_prompt_validator.py create mode 100644 dev.openhands/commands/check.json create mode 100644 dev.openhands/commands/fix.json create mode 100644 dev.openhands/commands/init.json create mode 100644 dev.openhands/hooks/__protocol__.md create mode 100755 dev.openhands/hooks/env_check.py create mode 100644 dev.openhands/hooks/gate_lib.py create mode 100644 dev.openhands/hooks/hooks.json create mode 100644 dev.openhands/hooks/post_tool_lint.py create mode 100755 dev.openhands/hooks/pre_tool_git_guard.py create mode 100755 dev.openhands/hooks/stop_summary.py create mode 100755 dev.openhands/hooks/user_prompt_validator.py create mode 100644 docs/portable-migration.md create mode 100644 plugin.json create mode 100755 scripts/validate_portable_plugin.py diff --git a/com.github.copilot/hooks/__protocol__.md b/com.github.copilot/hooks/__protocol__.md new file mode 100644 index 0000000..4549211 --- /dev/null +++ b/com.github.copilot/hooks/__protocol__.md @@ -0,0 +1,231 @@ +# hooks/ 与宿主 CLI 之间的契约(canonical cheat-sheet) + +> 这份文档是 codeguard-plugin 与 Codex CLI / ZCode / Kimi Code 三端宿主 +> 交互契约的**单源事实**。所有 hook 脚本(`hooks/*.py`)的实现都必须与本文件 +> 一致;若未来调整任何退出码或 JSON schema,**同一 commit 内**必须更新本文件。 +> +> 对应的 OpenSpec 规范是 `hook-protocol`(见 `openspec/specs/hook-protocol/spec.md`)。 + +--- + +## 1. 协议总表 + +| 事件 | Hook 脚本 | stdout | stderr | exit | 阻断? | +|---|---|---|---|---|---| +| SessionStart | `env_check.py` | 人类可读一行摘要 `codeguard 插件环境:...` | 仅内部错误时 | 0 | 否 | +| UserPromptSubmit | `user_prompt_validator.py` | JSON `{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"..."}}` | 仅内部错误时 | 0 | 否 | +| PreToolUse `Bash` | `pre_tool_git_guard.py` | 通过:空;未验证:JSON additionalContext | 通过:空;失败:完整修复指令 | 0(通过/放行)/ 2(拦截) | 放行:否;确定违规:是 | +| PostToolUse `Write\|Edit\|MultiEdit` | `post_tool_lint.py` | JSON `{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"..."}, "systemMessage":"..."}` | 仅内部错误时 | 0 | 否 | +| Stop | `stop_summary.py` | 人类可读会话摘要 | 仅内部错误时 | 0 | 否 | + +实现定位(**符号而非行号**——行号随每次重构腐烂,符号不腐;v0.8.0 起弃用行号指针): +- SessionStart 摘要:`hooks/env_check.py::main`(含双副本告警段)。 +- UserPromptSubmit JSON:`hooks/user_prompt_validator.py::main`(非 git 目录跳过说明 `_non_git_note`)与 `::is_trigger`。 +- PreToolUse stderr:`hooks/pre_tool_git_guard.py::main`;静态语法在 `scripts/codeguard/git_syntax.py`,仓库观察与 `is_guarded/_guarded_mode` 在 `scripts/codeguard/git_context.py`;旧 Hook helper 导入继续兼容。一层脚本观察共用 `_indirect_bodies`。 +- PostToolUse JSON:`hooks/post_tool_lint.py::main`(通过/自动修复后通过/失败 additionalContext 三处 print)。 +- Stop 摘要:`hooks/stop_summary.py::main`(含绕过计数 `summarize` 与 skipGate 遗留告警)。 + +门禁内部边界:`hooks/gate_lib.py` 只保留兼容导出;`scripts/codeguard/gate.py` 选择内容面与保序汇总, +`gate_checks.py` 返回各语言独立 `GateOutcome`;`repository_policy.py` 检查路径安全和显式豁免, +`baseline.py` 核验存量证据,`spec_validation.py` 适配可选 OpenSpec 校验,`reporting.py` 保留反馈格式。 +应用服务无需 hooks 路径或宿主 SDK 即可运行;兼容面不承担第二份业务实现。 + +语言服务边界:`registry_schema` 的纯校验同时服务注册表 CLI 与运行时加载,`registry` 派生 +识别/命令表;`config` 读取配置,`discovery` 只做项目发现,`toolchain` 负责探活。 +SessionStart 与每轮门禁各持有独立 `ToolchainProbe`,在目标目录执行且 stdin=DEVNULL; +同批同命令成功探活去重,不同命令仍并行,失败与下一批检查都重新探测。 +探活成功不代表 lint 通过。`detect_lang`、`user_config` 的原公开导入继续兼容。 + +`codeguard.json` 缺失时保留默认值;存在但 JSON/字段类型/扩展语言 ID/排除正则无效时, +CLI/MCP 明确返回 UNVERIFIED,自动修复不执行。门禁以未验证说明放行而非报告通过; +其它 Hook 的配置异常仍遵循既有 fail-open 和 stderr 告警,不把它变成代码违规。 + +--- + +## 2. 三端兼容矩阵 + +| 宿主 | SessionStart | UserPromptSubmit | PreToolUse Bash | PostToolUse Write\|Edit\|MultiEdit | Stop | +|---|---|---|---|---|---| +| Codex CLI | stdout 注入 developer context | stdout JSON 注入 additionalContext | exit 2 走工具结果回给 AI;exit 0 静默 | stdout JSON 注入 additionalContext + systemMessage | stdout 摘要 | +| ZCode | 同 Codex | 同 Codex,additionalContext 进 systemMessage | 同 Codex | 同 Codex | 同 Codex | +| Kimi Code CLI | stdout 摘要注入会话上下文 | stdout JSON 注入上下文(观察型,**不阻断用户消息**) | exit 2 拦截 + stderr 指令;exit 0 静默 | stdout JSON 注入上下文 | stdout 摘要 | + +所有三端在所有事件上,**内部错误都走 fail-open**(见 §3),hook bug 永远不阻断工作流。 + +--- + +## 3. Fail-open 约定(强制) + +任何 hook 脚本在 `__main__` 处必须有: + +```python +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) +``` + +含义: +- 钩子内部任何未捕获异常 → stderr 打印 traceback 摘要 → **exit 0**。 +- AI 与用户上下文永远收到「钩子无意见」的语义。 +- 同一约定适用于全部 5 个钩子的 `__main__` 尾部:`env_check.py`、`post_tool_lint.py`、`pre_tool_git_guard.py`、`user_prompt_validator.py`、`stop_summary.py`(符号级约束,见 §6)。 + +**禁止**把 fail-open 改为 exit 2——会破坏宿主工作流。 + +--- + +## 4. PreToolUse 硬拦截(exit 2)的语义边界 + +`pre_tool_git_guard.py` 是**唯一**会 exit 2 的 hook——且仅当: +1. 入参命令命中 `is_guarded()`:**直接**(先展开 `$(...)`/反引号内层文本到待扫面, + 再分隔符切段、剥除段首 shell 控制引导词(`if`/`then`/`do`/`while`/`!`…)与 + `NAME=VAL`/`env`/常见裸 wrapper 前缀并跳过 git 全局选项(`-C`/`-c`/…)后 + 子命令为 `git commit|push`;子串匹配会误伤 payload/echo 文本)**或一层解释器 + 间接**(`bash|sh|python… <脚本>` 的脚本文本、`-c` 内联代码按同规则扫描—— + `bash runner.sh` 式绕过曾连推 4 次漏网;`ro=$(git push …)`、`if git push; then` + 曾静默放行(实测);拼接式 subprocess 不在静态扫描承诺内);并且 + `resolve_project_roots()` 用**同一套归一化判定**收集仓库边界(含 `git -C ` + 的显式仓边界)——两处必须同源,否则 is_guarded 命中而 roots=[] → main 静默 + 放行,归一化修复被 roots 层击穿(0.8.2 实测:`git -C`/`FOO=1 git push`/ + `sudo git push` 三种形态全部穿透);并且 +2. 仓库级 `git config codeguard.skipGate true` 未设置(命中豁免时记账一次, + `gate_lib.record_skip_event`,Stop 汇总可见;**该豁免只覆盖语言门禁**—— + 入库内容安全扫描不受其覆盖,见下方一致性约束);并且 +3. 实际跑 linter 后存在非 skipped 的 failures。 + +出口内容(`gate_lib.gate_directive` 生成): +- **首行必须是 `codeguard ❌ 提交门禁未通过:` 综述**(tests/run_all 守护); +- 整调用声明——"整个工具调用没有执行(含非 git 前序步骤),请把修复与提交拆成 + 两次独立调用"——**必须紧跟首行综述(指令前置)**,其后才是每语言细节、 + 「怎么修」先于 linter 原始输出。**报告总长受 `REPORT_MAX_CHARS`(3000)硬上限**: + 宿主把超长 stderr 从尾部截断,指令在末段时长报告下会整体丢失(实测 AI 只见到 + 首段 linter 报错,逃生门与拆调用指引全没读到);超限按"保头保尾"截细节, + 尾部的「完整输出: /tmp/…」日志路径不得截掉。PreToolUse 的 exit 2 拒绝的是 + **整个 Bash 工具调用**,此前未声明这一点,AI 反复把写文件与提交塞进同一调用 + 并误判"编辑被吞"。 + +**禁止**因工具未装、项目未接入、检查超时等 UNVERIFIED 状态 exit 2;保留 fail-open, +但 MUST 明确未验证,不能输出“全部通过”。没有适用改动是 SKIPPED,不等于工具故障。 +单个并行语言检查出现内部异常时,只将该语言标为 UNVERIFIED,其余语言的已知失败仍拦截。 +Git 安全路径观察无法读取拟入库路径时,以 JSON additionalContext 说明未验证;若已有已知失败, +该失败仍 exit 2,不能因后续安全观察故障被顶层 fail-open 清空。 +退出码按工具解释,不能全局把 2 当崩溃(例如 pylint 的 2 是违规)。 +**取消无基线存量归因**:报错在未修改文件上也可能是本次 API 变化造成的,不能凭路径放行。 + +**一致性约束**:`UserPromptSubmit` 软门禁与本硬门禁共用同一条 skipGate 豁免, +且**豁免范围仅限语言门禁**:入库内容安全扫描(密钥/凭据类路径)不被任何 +代理可控豁免(仓库配置、内联 `-c codeguard.skipGate=true`、链式)覆盖,恒执行; +需要完整放行(含安全扫描)只能用进程环境变量 `CODEGUARD_SKIP_GATE`(1/true/yes, +仅用户可设——宿主内联赋值不会传入钩子进程)。软硬两门在豁免下也照常报告安全违规。 +且**都不得在非 git 目录回退成"扫描 cwd"**——UPS 对非 git 目录输出一行 +`_non_git_note` 说明并 exit 0(工作区根被回退扫描 = 上百无关仓的存量 lint +变成永久红,实测)。双副本事件去重键:PreToolUse 用 `tool_use_id + 命令`、 +UserPromptSubmit 用 `session_id + 完整文本 + 检查输入身份`、SessionStart/Stop 用 `session_id`; +这些键同时绑定当前会话/worktree。payload 不带对应字段时不做事件去重。 +去重仅记录**已经完成**的结果:SessionStart/Stop 异常后可重试;软门禁有跳过或未验证项 +时不记录完成。硬门禁只短时重放已完成的拒绝(保留 exit 2 与诊断),绝不缓存放行; +第一份仍在执行时第二份可以重复检查,不可因“事件见过”直接返回 0。 +这不是 exactly-once 执行保证,也不能代替当前代码快照。 +推送语义:门禁面由 `_guarded_mode` 统一判定——直接命令与一层间接共用同一套 +扫描;**commit 面 = 按命令链预测的实际提交面**(`pre_tool_git_guard.staging_intent`: +纯 `git commit` → 仅暂存区;`git add -A` → 含未跟踪;`git add -u` 或 `commit -a` → 仅已跟踪改动; +`git add ` → 并入这些路径——add 在 PreToolUse 时**尚未执行**, +不并入会漏检"即将暂存"的文件;并行会话留在工作树的未暂存 WIP 不属于本次提交, +曾因此被误拦);纯 push 在 HEAD 快照中检查未推送差异(`up...HEAD`),无上游时检查 HEAD 树。 +commit+push 使用预测提交快照并合并未推送范围。删除文件进入影响分析,不作为新增敏感文件。 +`git_staging` 将每段 cd/-C、pathspec 与其 worktree 根绑定;硬门禁逐仓传入目标身份, +另一仓的 add -A 不得扩张本仓的纯 commit。Git ls-files 成组解析 glob/目录/literal/exclude; +`-u` 不包含未跟踪文件,`-f` 可包含指定忽略文件,解析后的名字在快照中按字面处理。 +子目录 add . 不扩到兄弟目录;路径含空格与连续相对 cd/-C 保留上下文。 +动态路径、交互暂存和 pathspec-from-file 等未支持形态返回 JSON additionalContext 的 +git UNVERIFIED,保持 exit 0 兼容放行;不能被描述为已准确验证,也不冒充程序内部异常。 +硬门禁从 Git blobs 物化一次性目录,不借真实 .git,不修改原 index/工作树,也不复用软门禁缓存。 +符号链接/子模块/冲突、超限、依赖不可用都明确 UNVERIFIED。快照是内容隔离,不是执行沙箱; +复杂命令链、非 HEAD refspec、并发修改仍需独立 CI 验证。 +UserPromptSubmit 按提示词里的 `push/推送` 选 commit/push 面,但**不传 lanes = +三路宽口径**——软门禁没有待执行命令可预测,按"工作树有待提交改动就提醒"注入 +(注入非阻断,多提醒不算错;硬门禁少拦才是底线),软硬两门只在 skipGate 豁免 +上严格一致(豁免只覆盖语言门禁;安全扫描两边都照常执行)。 + +PostToolUse 只运行可限定到单文件的检查和 formatter。append_files=false 的项目命令推迟到 +显式 check/Git 门禁;保存不能触发整项目 formatter。工具异常不能自动修复。 +CLI/MCP 共用 PASS/FAIL/UNVERIFIED/SKIPPED/PLANNED,只有 PASS 的 passed=true。 +CLI 的 0/1/2 与 hook 的 fail-open 退出码是不同协议,不能混用。 + +Java 计划由 `java_analysis` 装配:`java_build` 读描述,`java_impact` 计算模块反向闭包, +`java_planning` 选择命令,`java_environment` 选择 wrapper/JDK,`java_changes` 观察版本差异。 +`java_project.py` 保留原 CLI/导入面。默认 skipTests/check -x test 不变,权威命令不加默认参数; +纯版本降级必须由正确 Git 基线与当前描述证明,依赖版本和编译配置变化不得降为 validate/help。 +根与变更路径先规范化;分析仍是模块级,不等于完整符号或任意构建脚本语义验证。 + +### 状态归属与持久化 + +`scripts/codeguard/hook_state.py` 负责会话归属、统计、冷却、审计和已完成结果; +`scripts/codeguard/storage.py` 负责跨进程锁与原子文件替换。锁覆盖整个读改写, +使用独立且不随数据替换的 `.lock` 文件,不能只有原子写而没有读改写互斥。 + +- 宿主提供 `session_id` 时,统计保存在 `CODEGUARD_HOME/sessions/<会话与worktree哈希>.json`; + 同一 session 在不同 Git worktree 也分开。Stop 只原子消费当前作用域,后续并发写入保留。 +- 无 `session_id` 时沿用 `session_state.json` 与旧插件内状态的兼容读取;此模式**没有跨会话隔离保证**。 + 旧全局记录不分配给任意一个带 ID 的新会话,不能把兼容读取称为可信归属迁移。 +- 门禁审计由调用线程汇总后写入,`worktree` 是原仓根,`execution_root` 是实际检查目录 + (可能为临时快照),`session_scope` 保留会话归属;`cmd` 为已物化的执行 argv,不再写未展开模板。 + 存量豁免记录为 SKIPPED 而非检查通过;当前或基线为 UNVERIFIED 时均不得授予豁免。 +- 保存检查只在获得 PASS/FAIL 后登记去重,UNVERIFIED 后允许立即重试。 + 去重同时校验文件内容和配置/命令身份;检查前后身份不一致不登记,不把执行中产生的新内容当作已检查。 +- 本批真实并发与 worktree 验证在 macOS 完成;Windows 锁实现尚未在 Windows 实机验证。 + +### 缓存身份与失效 + +`scripts/codeguard/fingerprint.py` 采集输入身份,`scripts/codeguard/cache.py` 只读写和校验完整软结果。 +缓存保存在 `CODEGUARD_HOME/gate-cache/.json`;旧 `/tmp` 条目不读取、不自动删除。 + +- 身份包含真实 worktree 路径、HEAD、Git index 的内容条目、upstream、受版本控制及非忽略工作树文件的内容、 + 常见根 linter 配置/注册表声明的配置、用户配置、命令定义和本地工具身份;不再用 mtime/size 代替源码内容。 +- Git 文件名按 NUL 分隔,linked worktree 不假设 `.git` 是目录。项目 `codeguard.json` 不保留永不过期的进程副本。 +- 预算为 10,000 个文件名、64 MiB 内容;符号链接/特殊文件、预算超限、读取失败或非 Git 目录时禁用该身份缓存, + 仍实际检查。预算不截断成一个看似完整的键;非 Git 保存也仍检查,但不采用仓库身份去重。 +- 只保存检查前后身份一致且 `skipped` 为空的软结果;损坏格式、未来时间戳和未知结果均重跑。 + 硬门禁不读取软缓存,事件去重亦不缓存放行。 +- 这是有明确输入范围的软观察优化,不是原子安全快照或可移植验收凭据;任意外部动态配置、远程依赖和未声明环境变化 + 不在完整性证明范围内。准确提交验证和 CI 仍独立运行,不得以软缓存证明整个项目已通过。 + +--- + +## 5. 新增 hook checklist + +新加一个 hook 时,按顺序自检: + +1. **读本 cheat-sheet** + `openspec/specs/hook-protocol/spec.md`。 +2. 在 `hooks/hooks.json` 注册(事件 / matcher / command / timeout)。 +3. 脚本实现遵守 §1 协议总表的 exit 码与 stdout 形态。 +4. 脚本 `__main__` 加 §3 的 fail-open 套子。 +5. 在 `tests/run_all.py` 加子集触发:stdin 喂真实宿主协议 JSON,断言 exit 码与 stdout 形状。 +6. 在本文件 §1 协议总表加一行,标注实现位置(`hooks/.py:line`)。 +7. OpenSpec change:proposal / design / `hook-protocol/spec.md` 加 Scenario / tasks 勾选后 archive。 + +--- + +## 6. 协议变更策略 + +任何对 §1 协议总表字段的修改: + +- 同步改本文件 + 对应 `hooks/*.py` + 对应测试。 +- 走 OpenSpec change(`hook-protocol` spec 下新增 MODIFIED Requirements + Scenarios)。 +- 不允许「先改代码后补文档」的拆分 commit——契约一致是同一变更的原子单位。 + +--- + +## 7. 与 OpenSpec 的对应 + +| Cheat-sheet 节 | OpenSpec spec / Scenario | +|---|---| +| §1 协议总表 | `hook-protocol::Requirement: Hook-host contract SHALL live in hooks/__protocol__.md` | +| §3 Fail-open | `hook-protocol::Requirement: The cheat-sheet SHALL document fail-open` | +| §5 新增 hook checklist | `hook-protocol::Requirement: tests/run_all.py SHALL reference the cheat-sheet` | + +变更通过 `openspec archive add-host-protocol-cheatsheet` 入库;spec 在 `openspec/specs/hook-protocol/spec.md`。 diff --git a/com.github.copilot/hooks/env_check.py b/com.github.copilot/hooks/env_check.py new file mode 100755 index 0000000..bfc1585 --- /dev/null +++ b/com.github.copilot/hooks/env_check.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +"""SessionStart 宿主适配器:读取事件与本机插件配置,输出项目记忆。""" +from __future__ import annotations + +import contextlib +import json +import os +import subprocess +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard import startup_application +from codeguard.reporting import plugin_version +from detect_lang import ( # 兼容原有 Python 导入接口 + LANG_COMMANDS, + REGISTRY, + detect_languages, + ensure_user_path, + find_project_root, + load_user_config, +) + +__all__ = [ + "LANG_COMMANDS", + "REGISTRY", + "detect_languages", + "detect_linter_config", + "ensure_user_path", + "find_project_root", + "load_user_config", + "main", + "notify", + "version_backlog_note", +] + +detect_linter_config = startup_application.detect_linter_config +version_backlog_note = startup_application.version_backlog_note + + +def notify(title: str, message: str) -> None: + """macOS 系统通知;其他宿主静默。""" + if sys.platform != "darwin": + return + safe_title = title.replace('"', "'") + safe_message = message.replace('"', "'")[:200] + with contextlib.suppress(OSError): + subprocess.Popen( + ["osascript", "-e", + f'display notification "{safe_message}" with title "{safe_title}"'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + + +def _enabled_plugin_orgs() -> tuple[str, ...]: + """ZCode 宿主注册表只在适配器读取,其他宿主缺文件时无副作用。""" + try: + config = json.loads((Path.home() / ".zcode" / "cli" / "config.json").read_text(encoding="utf-8")) + orgs = { + key.split("@", 1)[1] + for key in (config.get("plugins", {}) or {}).get("enabledPlugins", {}) + if key.startswith("codeguard@") + } + return tuple(sorted(orgs)) + except (OSError, ValueError, AttributeError): + return () + + +def main(payload: dict | None = None) -> int: + from codeguard.hook_state import observe_once, session_scope + session_id = (payload or {}).get("session_id") + with session_scope(payload or {}): + return observe_once(f"start:{session_id}" if session_id else None, lambda: _main(payload)) + + +def _main(payload: dict | None = None) -> int: + ensure_user_path(from_login_shell=True) + project_root = find_project_root(os.getcwd()) or Path(os.getcwd()) + current = plugin_version() + report = startup_application.build_startup_report( + project_root, + plugin_version="" if current == "unknown" else current, + cache_root=Path.home() / ".zcode" / "cli" / "plugins" / "cache", + enabled_plugin_orgs=_enabled_plugin_orgs(), + ) + if report.notification: + notify(*report.notification) + if report.text: + print(report.text) + return 0 + + +if __name__ == "__main__": + try: + payload: dict = {} + if not sys.stdin.isatty(): + try: + data = json.loads(sys.stdin.read()) + if isinstance(data, dict): + payload = data + except (json.JSONDecodeError, ValueError): + payload = {} + sys.exit(main(payload)) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断宿主工作流 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/com.github.copilot/hooks/gate_lib.py b/com.github.copilot/hooks/gate_lib.py new file mode 100644 index 0000000..226c9ed --- /dev/null +++ b/com.github.copilot/hooks/gate_lib.py @@ -0,0 +1,124 @@ +"""旧 Hook 导入兼容面;检查、仓库策略、审计与反馈均委托到独立服务。""" +from __future__ import annotations + +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard.baseline import ( + _git, + _mentioned_files, + _stale_attribution, + baseline_stale_finding, +) +from codeguard.gate import ( + GATE_CACHE_TTL, + _gate_cache_key, + _gate_cache_path, + _worktree_fingerprint, + run_gate, +) +from codeguard.gate import run_batch as _run_gate_uncached +from codeguard.hook_state import ( + codeguard_home, + record_gate_decision, + record_skip_event, + session_state_path, + should_suppress_event, +) +from codeguard.path_policy import ( + GUARD_EXCLUDE_DIRS, + GUARD_EXCLUDE_FILES, + GUARD_ROOT_ONLY_FILES, +) +from codeguard.reporting import ( + CODEGUARD_VERSION, + REPORT_MAX_CHARS, + _dependency_resolution_hint, + _failure_detail_blocks, + _log_path, + _rule_summary, + _squeeze, + _truncate_detail, + format_failure_report, + format_safety_report, + gate_directive, + summarize_failures, +) +from codeguard.repository_policy import check_commit_safety, skip_gate_via_git_config +from codeguard.spec_validation import validate as _openspec_validate +from detect_lang import ( + LANG_COMMANDS, + detect_language, + detect_languages, + get_overrides, + probe_toolchain, + project_uses_linter, +) +from scope import changed_files + +__all__ = [ + "CODEGUARD_VERSION", + "GATE_CACHE_TTL", + "GUARD_EXCLUDE_DIRS", + "GUARD_EXCLUDE_FILES", + "GUARD_ROOT_ONLY_FILES", + "LANG_COMMANDS", + "PLUGIN_ROOT", + "REPORT_MAX_CHARS", + "_dependency_resolution_hint", + "_failure_detail_blocks", + "_gate_cache_key", + "_gate_cache_path", + "_git", + "_log_path", + "_mentioned_files", + "_openspec_validate", + "_rule_summary", + "_run_gate_uncached", + "_squeeze", + "_stale_attribution", + "_truncate_detail", + "_worktree_fingerprint", + "baseline_stale_finding", + "changed_files", + "check_commit_safety", + "codeguard_home", + "detect_language", + "detect_languages", + "format_failure_report", + "format_safety_report", + "gate_directive", + "get_overrides", + "probe_toolchain", + "project_uses_linter", + "record_gate_decision", + "record_skip_event", + "run_gate", + "session_state_path", + "should_suppress_event", + "skip_gate_via_git_config", + "summarize_failures", +] + + +def _java_executable_from_plan(plan: dict) -> str | None: + """从 java_project.analyze 的产物里解析构建可执行文件。 + + 两条来源按优先级: + 1. 顶层 ``executable`` 键(java_project 正常产出); + 2. 回退 ``commands[0].argv[0]``——历史版本的 java_project 只把 + wrapper 体现在计划命令里(实测 68c8a37 曾因此让 mvnw 感知成为 + 死代码:消费者读的键生产者从不写)。 + 非 mvn/gradle wrapper(如 codeguard.json 显式命令)不参与替换。 + """ + exe = plan.get("executable") + if exe: + return exe + for cmd in plan.get("commands", []) or []: + argv = cmd.get("argv") or [] + if argv and Path(argv[0]).name in ("mvnw", "gradlew"): + return argv[0] + return None diff --git a/com.github.copilot/hooks/hooks.json b/com.github.copilot/hooks/hooks.json new file mode 100644 index 0000000..781375d --- /dev/null +++ b/com.github.copilot/hooks/hooks.json @@ -0,0 +1,64 @@ +{ + "hooks": { + "SessionStart": [ + { + "matcher": "startup|resume", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/env_check.py\"", + "timeout": 30, + "statusMessage": "codeguard: 检测项目语言与现有 linter 配置…" + } + ] + } + ], + "UserPromptSubmit": [ + { + "matcher": "提交|commit|push|提交代码|部署|deploy", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/user_prompt_validator.py\"", + "timeout": 120 + } + ] + } + ], + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/pre_tool_git_guard.py\"", + "timeout": 120 + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Write|Edit|MultiEdit", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/post_tool_lint.py\"", + "timeout": 180 + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/stop_summary.py\"", + "timeout": 15 + } + ] + } + ] + } +} diff --git a/com.github.copilot/hooks/post_tool_lint.py b/com.github.copilot/hooks/post_tool_lint.py new file mode 100644 index 0000000..ddf480e --- /dev/null +++ b/com.github.copilot/hooks/post_tool_lint.py @@ -0,0 +1,131 @@ +"""PostToolUse 宿主适配器:保存反馈以 JSON 注入上下文,绝不阻断写文件。""" +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard import save_application +from codeguard.hook_state import codeguard_home, session_scope +from detect_lang import ( # 兼容原有 Python 导入接口 + LANG_COMMANDS, + detect_language, + ensure_user_path, + find_project_root, + load_user_config, + project_uses_linter, +) +from scope import is_build_artifact + +__all__ = [ + "DEDUP_FILE", "LANG_COMMANDS", "bump_state", "detect_language", "ensure_user_path", + "extract_file_path", "find_project_root", "is_build_artifact", "is_ejs_template", + "load_user_config", "mac_notify", "main", "project_uses_linter", "read_payload", + "run", "should_skip", "should_suppress_duplicate", +] + +# 多个 marketplace 副本共享用户级去重状态;保留原测试/嵌入方的覆盖点。 +DEDUP_FILE: Path | None = None + + +def _dedup_path() -> Path: + return DEDUP_FILE or codeguard_home() / "file_dedup.json" + + +def _state_path() -> Path: + return save_application.state_path() + + +def bump_state(lang: str, passed: bool, auto_fixed: bool = False) -> None: + save_application.bump_state(lang, passed, auto_fixed) + + +def _notify_cooldown_ok(lang: str, cooldown_s: int = 60) -> bool: + return save_application.notification_allowed(lang, cooldown_s) + + +def mac_notify(title: str, message: str) -> None: + """macOS 通知;非 macOS 宿主由 JSON 上下文呈现问题。""" + if sys.platform != "darwin": + return + safe_title = title.replace('"', "'") + safe_message = message.replace('"', "'")[:200] + subprocess.Popen( + ["osascript", "-e", + f'display notification "{safe_message}" with title "{safe_title}" sound name "Pop"'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + + +def should_suppress_duplicate(file_path: str, identity: str | None = None) -> bool: + return save_application.should_suppress_duplicate(file_path, identity, _dedup_path()) + + +is_ejs_template = save_application.is_ejs_template +run = save_application.run +should_skip = save_application.should_skip + + +def read_payload() -> dict: + if sys.stdin.isatty(): + return {} + try: + return json.loads(sys.stdin.read()) + except (json.JSONDecodeError, ValueError): + return {} + + +def extract_file_path(payload: dict) -> str: + for candidate in (payload.get("file_path"), + (payload.get("tool_input") or {}).get("file_path"), + (payload.get("tool_input") or {}).get("path"), + (payload.get("input") or {}).get("file_path")): + if candidate: + return str(candidate) + return "" + + +def main() -> int: + payload = read_payload() + with session_scope(payload): + return _main(payload) + + +def _main(payload: dict) -> int: + ensure_user_path() + file_path = extract_file_path(payload) + if not file_path: + return 0 + cfg = load_user_config() + project_root = find_project_root(os.getcwd()) or Path(os.getcwd()) + result = save_application.evaluate_save(file_path, project_root, cfg, store=_dedup_path()) + if result.additional_context is not None: + message = {"hookSpecificOutput": { + "hookEventName": "PostToolUse", + "additionalContext": result.additional_context, + }} + if result.system_message is not None: + message["systemMessage"] = result.system_message + print(json.dumps(message, ensure_ascii=False)) + sys.stdout.flush() + result.acknowledge() + if result.notification: + lang, title, message = result.notification + if _notify_cooldown_ok(lang): + mac_notify(title, message) + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断 AI 写文件 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/com.github.copilot/hooks/pre_tool_git_guard.py b/com.github.copilot/hooks/pre_tool_git_guard.py new file mode 100755 index 0000000..69afcff --- /dev/null +++ b/com.github.copilot/hooks/pre_tool_git_guard.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +"""PreToolUse 宿主适配器:AI 执行 git commit/push 前输出硬门禁决策。""" +from __future__ import annotations + +import contextlib +import io +import json +import os +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) +sys.path.insert(0, str(PLUGIN_ROOT / "hooks")) + +from codeguard.git_context import ( + _command_indirect, + _fallback_roots, + _filter_fallback_roots, + _guarded_mode, + _is_git_repo, + _repo_root_of, + is_guarded, + resolve_project_roots, + staging_intent, +) +from codeguard.git_guard_application import evaluate_git_command +from codeguard.git_syntax import ( + _analyze_segment, + _collect_subs, + _flatten_substitutions, + _git_c_path, + _git_seg_parts, + _git_side_effect_sub, + _normalize_segment, + _segment_is_git_side_effect, + chain_skip_gate, + inline_skip_gate, +) +from codeguard.hook_state import completed_event, record_completed_event, session_scope +from codeguard.repository_policy import env_skip_gate +from detect_lang import ensure_user_path, load_user_config +from gate_lib import ( # 兼容原有 Python 导入接口 + check_commit_safety, + format_safety_report, + gate_directive, + record_skip_event, + run_gate, + skip_gate_via_git_config, +) + +__all__ = [ + "GUARDED_PATTERNS", "_analyze_segment", "_collect_subs", "_command_indirect", + "_fallback_roots", "_filter_fallback_roots", "_flatten_substitutions", "_git_c_path", + "_git_seg_parts", "_git_side_effect_sub", "_guarded_mode", "_is_git_repo", + "_normalize_segment", "_repo_root_of", "_segment_is_git_side_effect", "chain_skip_gate", + "check_commit_safety", "extract_command", "format_safety_report", "gate_directive", + "inline_skip_gate", "is_guarded", "main", "read_payload", "record_skip_event", + "resolve_project_roots", "run_gate", "skip_gate_via_git_config", "staging_intent", +] + +GUARDED_PATTERNS = ("git commit", "git push") + + +def read_payload() -> dict: + if sys.stdin.isatty(): + return {} + try: + return json.loads(sys.stdin.read()) + except (json.JSONDecodeError, ValueError): + return {} + + +def extract_command(payload: dict) -> str: + tool_input = payload.get("tool_input") or {} + command = tool_input.get("command") + return str(command) if command else "" + + +def main() -> int: + payload = read_payload() + with session_scope(payload): + key = ("pre:" + str(payload["tool_use_id"]) + ":" + extract_command(payload) + if payload.get("tool_use_id") else None) + cached = completed_event(key) if key else None + if cached is not None and cached["code"] == 2: + _deliver(cached["code"], cached["stdout"], cached["stderr"]) + return cached["code"] + stdout, stderr = io.StringIO(), io.StringIO() + with contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr): + code = _main(payload) + out, err = stdout.getvalue(), stderr.getvalue() + # 只复用阻断结果,硬门放行和未验证永远重跑准确快照。 + delivered = _deliver(code, out, err) + if key and code == 2 and delivered: + record_completed_event(key, code, out, err) + return code + + +def _deliver(code: int, stdout: str, stderr: str) -> bool: + """刷新宿主输出后才允许缓存;已知拦截不能因输出故障降为放行。""" + try: + sys.stdout.write(stdout) + sys.stderr.write(stderr) + sys.stdout.flush() + sys.stderr.flush() + except (OSError, UnicodeError, ValueError): + if code == 2: + return False + raise + return True + + +def _main(payload: dict) -> int: + ensure_user_path() + result = evaluate_git_command( + extract_command(payload), + cwd=Path(os.getcwd()), + load_config=load_user_config, + bypass_env=env_skip_gate(), + ) + for context in result.contexts: + print(json.dumps({"hookSpecificOutput": { + "hookEventName": "PreToolUse", "additionalContext": context, + }}, ensure_ascii=False)) + if result.stderr: + print(result.stderr, file=sys.stderr) + return result.exit_code + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断宿主工具 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/com.github.copilot/hooks/stop_summary.py b/com.github.copilot/hooks/stop_summary.py new file mode 100755 index 0000000..b624946 --- /dev/null +++ b/com.github.copilot/hooks/stop_summary.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +"""Stop 钩子:会话结束前总结本次会话产生的代码规范问题。 + +让用户在关闭会话前能看到: +- 本次修改了哪些语言 +- 哪些 linter 通过、哪些失败 +- 自动修复成功的次数 +- 残留需要手动处理的警告 +""" +from __future__ import annotations + +import json +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] # hooks/ 的上级 = 插件根 + +sys.path.insert(0, str(PLUGIN_ROOT / "hooks")) +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard import session_application + +# 现行状态目录在 ~/.codeguard(CODEGUARD_HOME 可覆盖);插件根的旧文件 +# 升版本即丢、双副本各存一半——load_state 优先新路径,回退读旧文件一次。 +LEGACY_STATE_FILE = PLUGIN_ROOT / ".session_state.json" + + +def load_state() -> dict: + return session_application.load_state(LEGACY_STATE_FILE) + + +def summarize(state: dict) -> str: + return session_application.summarize(state) + + +def _skipgate_left_enabled() -> bool: + return session_application.skipgate_left_enabled(Path.cwd()) + + +def main(payload: dict | None = None) -> int: + from codeguard.hook_state import observe_once, session_scope + session_id = (payload or {}).get("session_id") + with session_scope(payload or {}): + return observe_once(f"stop:{session_id}" if session_id else None, lambda: _main(payload)) + + +def _main(payload: dict | None = None) -> int: + prepared = session_application.prepare_summary(LEGACY_STATE_FILE, Path.cwd()) + for line in prepared.lines: + print(line) + sys.stdout.flush() + prepared.acknowledge() + return 0 + + +if __name__ == "__main__": + try: + payload: dict = {} + if not sys.stdin.isatty(): + try: + data = json.loads(sys.stdin.read()) + if isinstance(data, dict): + payload = data + except (json.JSONDecodeError, ValueError): + payload = {} + sys.exit(main(payload)) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open:traceback 绝不进 AI 上下文/阻断工作流 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/com.github.copilot/hooks/user_prompt_validator.py b/com.github.copilot/hooks/user_prompt_validator.py new file mode 100755 index 0000000..a4397d8 --- /dev/null +++ b/com.github.copilot/hooks/user_prompt_validator.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +"""UserPromptSubmit 宿主适配器:软提醒注入,不阻断用户消息。""" +from __future__ import annotations + +import contextlib +import json +import os +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) +sys.path.insert(0, str(PLUGIN_ROOT / "hooks")) + +from codeguard import prompt_application, prompt_policy +from codeguard.hook_state import session_scope +from codeguard.repository_policy import env_skip_gate +from detect_lang import ( # 兼容原有 Python 导入接口 + LANG_COMMANDS, + detect_languages, + ensure_user_path, + find_project_root, + load_user_config, +) +from gate_lib import ( # 兼容原有 Python 导入接口 + check_commit_safety, + format_safety_report, + gate_directive, + record_skip_event, + run_gate, + skip_gate_via_git_config, + summarize_failures, +) + +__all__ = [ + "LANG_COMMANDS", "QUESTION_MARKERS", "TRIGGER_PATTERNS", "check_commit_safety", + "detect_languages", "ensure_user_path", "find_project_root", "format_safety_report", + "gate_directive", "is_trigger", "load_user_config", "main", "notify", "read_payload", + "read_user_text", "record_skip_event", "run_gate", "skip_gate_via_git_config", + "summarize_failures", +] + +TRIGGER_PATTERNS = prompt_policy.TRIGGER_PATTERNS +QUESTION_MARKERS = prompt_policy.QUESTION_MARKERS +is_trigger = prompt_policy.is_trigger +_detect_languages_in_text = prompt_policy.detect_languages_in_text +_non_git_note = prompt_application.non_git_note + + +def notify(title: str, message: str) -> None: + """macOS 系统通知;其他宿主仅依赖对话上下文。""" + if sys.platform != "darwin": + return + import subprocess + safe_title = title.replace('"', "'") + safe_message = message.replace('"', "'")[:200] + with contextlib.suppress(OSError): + subprocess.Popen( + ["osascript", "-e", + f'display notification "{safe_message}" with title "{safe_title}" sound name "Pop"'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + + +def read_payload() -> dict: + """stdin 只读取一次,兼容 user_prompt 与 prompt 字段。""" + if sys.stdin.isatty(): + return {} + try: + data = json.loads(sys.stdin.read()) + except json.JSONDecodeError: + return {} + return data if isinstance(data, dict) else {} + + +def read_user_text() -> str: + payload = read_payload() + return str(payload.get("user_prompt") or payload.get("prompt") or "") + + +def main() -> int: + payload = read_payload() + with session_scope(payload): + return _main(payload) + + +def _main(payload: dict) -> int: + user_text = str(payload.get("user_prompt") or payload.get("prompt") or "") + if not is_trigger(user_text): + return 0 + ensure_user_path(from_login_shell=True) + result = prompt_application.evaluate_prompt( + user_text, + project_root=find_project_root(os.getcwd()), + session_id=payload.get("session_id"), + load_config=load_user_config, + bypass_env=env_skip_gate(), + ) + if result.notification: + notify(*result.notification) + if result.additional_context is not None: + print(json.dumps({"hookSpecificOutput": { + "hookEventName": "UserPromptSubmit", + "additionalContext": result.additional_context, + }}, ensure_ascii=False)) + sys.stdout.flush() + result.acknowledge() + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断用户消息 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/dev.openhands/commands/check.json b/dev.openhands/commands/check.json new file mode 100644 index 0000000..9c10ba6 --- /dev/null +++ b/dev.openhands/commands/check.json @@ -0,0 +1,5 @@ +{ + "name": "check", + "description": "运行项目代码 lint 检查(跨语言)", + "prompt": "运行 /check。\n\n步骤:\n1. 调用 `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/detect_lang.py .` 识别项目语言\n2. 对每种语言跑对应 linter(mvn javadoc+checkstyle / cargo clippy+fmt / npx eslint / ruff check)\n3. 失败时尝试自动修复(spotless:apply / cargo fmt / eslint --fix / ruff --fix)\n4. 给出表格化报告:每种语言通过/失败/修复数量\n5. 如有失败,给出每个文件的具体错误位置和修复建议\n\n也可以直接调用:`python3 ${CLAUDE_PLUGIN_ROOT}/scripts/run_check.py`(推荐)" +} diff --git a/dev.openhands/commands/fix.json b/dev.openhands/commands/fix.json new file mode 100644 index 0000000..b688774 --- /dev/null +++ b/dev.openhands/commands/fix.json @@ -0,0 +1,5 @@ +{ + "name": "fix", + "description": "自动修复所有 linter 问题", + "prompt": "运行 /fix。\n\n步骤:\n1. 调用 `python3 ${CLAUDE_PLUGIN_ROOT}/scripts/detect_lang.py .` 识别项目语言\n2. 对每种语言跑对应修复命令(spotless:apply / cargo fmt / eslint --fix / ruff check --fix)\n3. 修复后跑 lint 验证\n4. 报告哪些被自动修复、哪些仍需手动处理\n\n也可以直接调用:`python3 ${CLAUDE_PLUGIN_ROOT}/scripts/fix.py [--dry-run]`\n\n注意:\n- 不要自动修改 linter 配置文件(checkstyle.xml、clippy.toml 等)来消除失败\n- 不要在业务代码中加 `@SuppressWarnings` 来屏蔽 javadoc 警告\n- 不要为了通过 lint 而改坏代码逻辑" +} diff --git a/dev.openhands/commands/init.json b/dev.openhands/commands/init.json new file mode 100644 index 0000000..fae4aae --- /dev/null +++ b/dev.openhands/commands/init.json @@ -0,0 +1,5 @@ +{ + "name": "init", + "description": "把 codeguard 接入当前项目(写 .pre-commit-config.yaml / AGENTS.md / CI)", + "prompt": "运行 /init。\n\n按 `codeguard-init` skill 的步骤操作:\n1. 检测项目语言\n2. 拷贝对应 linter 配置到项目根(checkstyle.xml / clippy.toml / eslint.config.js / ruff 配置)\n3. 写 .pre-commit-config.yaml(基于插件的模板)\n4. 增量更新 AGENTS.md(追加代码规范章节,不覆盖已有内容)\n5. 询问用户是否生成 GitHub Actions 工作流\n6. 输出安装指令:`pip install pre-commit && pre-commit install`(不自动执行)\n\n边界:\n- 不删除/覆盖已有配置\n- 不覆盖 AGENTS.md 已有内容\n- 不自动执行 pre-commit install" +} diff --git a/dev.openhands/hooks/__protocol__.md b/dev.openhands/hooks/__protocol__.md new file mode 100644 index 0000000..4549211 --- /dev/null +++ b/dev.openhands/hooks/__protocol__.md @@ -0,0 +1,231 @@ +# hooks/ 与宿主 CLI 之间的契约(canonical cheat-sheet) + +> 这份文档是 codeguard-plugin 与 Codex CLI / ZCode / Kimi Code 三端宿主 +> 交互契约的**单源事实**。所有 hook 脚本(`hooks/*.py`)的实现都必须与本文件 +> 一致;若未来调整任何退出码或 JSON schema,**同一 commit 内**必须更新本文件。 +> +> 对应的 OpenSpec 规范是 `hook-protocol`(见 `openspec/specs/hook-protocol/spec.md`)。 + +--- + +## 1. 协议总表 + +| 事件 | Hook 脚本 | stdout | stderr | exit | 阻断? | +|---|---|---|---|---|---| +| SessionStart | `env_check.py` | 人类可读一行摘要 `codeguard 插件环境:...` | 仅内部错误时 | 0 | 否 | +| UserPromptSubmit | `user_prompt_validator.py` | JSON `{"hookSpecificOutput":{"hookEventName":"UserPromptSubmit","additionalContext":"..."}}` | 仅内部错误时 | 0 | 否 | +| PreToolUse `Bash` | `pre_tool_git_guard.py` | 通过:空;未验证:JSON additionalContext | 通过:空;失败:完整修复指令 | 0(通过/放行)/ 2(拦截) | 放行:否;确定违规:是 | +| PostToolUse `Write\|Edit\|MultiEdit` | `post_tool_lint.py` | JSON `{"hookSpecificOutput":{"hookEventName":"PostToolUse","additionalContext":"..."}, "systemMessage":"..."}` | 仅内部错误时 | 0 | 否 | +| Stop | `stop_summary.py` | 人类可读会话摘要 | 仅内部错误时 | 0 | 否 | + +实现定位(**符号而非行号**——行号随每次重构腐烂,符号不腐;v0.8.0 起弃用行号指针): +- SessionStart 摘要:`hooks/env_check.py::main`(含双副本告警段)。 +- UserPromptSubmit JSON:`hooks/user_prompt_validator.py::main`(非 git 目录跳过说明 `_non_git_note`)与 `::is_trigger`。 +- PreToolUse stderr:`hooks/pre_tool_git_guard.py::main`;静态语法在 `scripts/codeguard/git_syntax.py`,仓库观察与 `is_guarded/_guarded_mode` 在 `scripts/codeguard/git_context.py`;旧 Hook helper 导入继续兼容。一层脚本观察共用 `_indirect_bodies`。 +- PostToolUse JSON:`hooks/post_tool_lint.py::main`(通过/自动修复后通过/失败 additionalContext 三处 print)。 +- Stop 摘要:`hooks/stop_summary.py::main`(含绕过计数 `summarize` 与 skipGate 遗留告警)。 + +门禁内部边界:`hooks/gate_lib.py` 只保留兼容导出;`scripts/codeguard/gate.py` 选择内容面与保序汇总, +`gate_checks.py` 返回各语言独立 `GateOutcome`;`repository_policy.py` 检查路径安全和显式豁免, +`baseline.py` 核验存量证据,`spec_validation.py` 适配可选 OpenSpec 校验,`reporting.py` 保留反馈格式。 +应用服务无需 hooks 路径或宿主 SDK 即可运行;兼容面不承担第二份业务实现。 + +语言服务边界:`registry_schema` 的纯校验同时服务注册表 CLI 与运行时加载,`registry` 派生 +识别/命令表;`config` 读取配置,`discovery` 只做项目发现,`toolchain` 负责探活。 +SessionStart 与每轮门禁各持有独立 `ToolchainProbe`,在目标目录执行且 stdin=DEVNULL; +同批同命令成功探活去重,不同命令仍并行,失败与下一批检查都重新探测。 +探活成功不代表 lint 通过。`detect_lang`、`user_config` 的原公开导入继续兼容。 + +`codeguard.json` 缺失时保留默认值;存在但 JSON/字段类型/扩展语言 ID/排除正则无效时, +CLI/MCP 明确返回 UNVERIFIED,自动修复不执行。门禁以未验证说明放行而非报告通过; +其它 Hook 的配置异常仍遵循既有 fail-open 和 stderr 告警,不把它变成代码违规。 + +--- + +## 2. 三端兼容矩阵 + +| 宿主 | SessionStart | UserPromptSubmit | PreToolUse Bash | PostToolUse Write\|Edit\|MultiEdit | Stop | +|---|---|---|---|---|---| +| Codex CLI | stdout 注入 developer context | stdout JSON 注入 additionalContext | exit 2 走工具结果回给 AI;exit 0 静默 | stdout JSON 注入 additionalContext + systemMessage | stdout 摘要 | +| ZCode | 同 Codex | 同 Codex,additionalContext 进 systemMessage | 同 Codex | 同 Codex | 同 Codex | +| Kimi Code CLI | stdout 摘要注入会话上下文 | stdout JSON 注入上下文(观察型,**不阻断用户消息**) | exit 2 拦截 + stderr 指令;exit 0 静默 | stdout JSON 注入上下文 | stdout 摘要 | + +所有三端在所有事件上,**内部错误都走 fail-open**(见 §3),hook bug 永远不阻断工作流。 + +--- + +## 3. Fail-open 约定(强制) + +任何 hook 脚本在 `__main__` 处必须有: + +```python +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) +``` + +含义: +- 钩子内部任何未捕获异常 → stderr 打印 traceback 摘要 → **exit 0**。 +- AI 与用户上下文永远收到「钩子无意见」的语义。 +- 同一约定适用于全部 5 个钩子的 `__main__` 尾部:`env_check.py`、`post_tool_lint.py`、`pre_tool_git_guard.py`、`user_prompt_validator.py`、`stop_summary.py`(符号级约束,见 §6)。 + +**禁止**把 fail-open 改为 exit 2——会破坏宿主工作流。 + +--- + +## 4. PreToolUse 硬拦截(exit 2)的语义边界 + +`pre_tool_git_guard.py` 是**唯一**会 exit 2 的 hook——且仅当: +1. 入参命令命中 `is_guarded()`:**直接**(先展开 `$(...)`/反引号内层文本到待扫面, + 再分隔符切段、剥除段首 shell 控制引导词(`if`/`then`/`do`/`while`/`!`…)与 + `NAME=VAL`/`env`/常见裸 wrapper 前缀并跳过 git 全局选项(`-C`/`-c`/…)后 + 子命令为 `git commit|push`;子串匹配会误伤 payload/echo 文本)**或一层解释器 + 间接**(`bash|sh|python… <脚本>` 的脚本文本、`-c` 内联代码按同规则扫描—— + `bash runner.sh` 式绕过曾连推 4 次漏网;`ro=$(git push …)`、`if git push; then` + 曾静默放行(实测);拼接式 subprocess 不在静态扫描承诺内);并且 + `resolve_project_roots()` 用**同一套归一化判定**收集仓库边界(含 `git -C ` + 的显式仓边界)——两处必须同源,否则 is_guarded 命中而 roots=[] → main 静默 + 放行,归一化修复被 roots 层击穿(0.8.2 实测:`git -C`/`FOO=1 git push`/ + `sudo git push` 三种形态全部穿透);并且 +2. 仓库级 `git config codeguard.skipGate true` 未设置(命中豁免时记账一次, + `gate_lib.record_skip_event`,Stop 汇总可见;**该豁免只覆盖语言门禁**—— + 入库内容安全扫描不受其覆盖,见下方一致性约束);并且 +3. 实际跑 linter 后存在非 skipped 的 failures。 + +出口内容(`gate_lib.gate_directive` 生成): +- **首行必须是 `codeguard ❌ 提交门禁未通过:` 综述**(tests/run_all 守护); +- 整调用声明——"整个工具调用没有执行(含非 git 前序步骤),请把修复与提交拆成 + 两次独立调用"——**必须紧跟首行综述(指令前置)**,其后才是每语言细节、 + 「怎么修」先于 linter 原始输出。**报告总长受 `REPORT_MAX_CHARS`(3000)硬上限**: + 宿主把超长 stderr 从尾部截断,指令在末段时长报告下会整体丢失(实测 AI 只见到 + 首段 linter 报错,逃生门与拆调用指引全没读到);超限按"保头保尾"截细节, + 尾部的「完整输出: /tmp/…」日志路径不得截掉。PreToolUse 的 exit 2 拒绝的是 + **整个 Bash 工具调用**,此前未声明这一点,AI 反复把写文件与提交塞进同一调用 + 并误判"编辑被吞"。 + +**禁止**因工具未装、项目未接入、检查超时等 UNVERIFIED 状态 exit 2;保留 fail-open, +但 MUST 明确未验证,不能输出“全部通过”。没有适用改动是 SKIPPED,不等于工具故障。 +单个并行语言检查出现内部异常时,只将该语言标为 UNVERIFIED,其余语言的已知失败仍拦截。 +Git 安全路径观察无法读取拟入库路径时,以 JSON additionalContext 说明未验证;若已有已知失败, +该失败仍 exit 2,不能因后续安全观察故障被顶层 fail-open 清空。 +退出码按工具解释,不能全局把 2 当崩溃(例如 pylint 的 2 是违规)。 +**取消无基线存量归因**:报错在未修改文件上也可能是本次 API 变化造成的,不能凭路径放行。 + +**一致性约束**:`UserPromptSubmit` 软门禁与本硬门禁共用同一条 skipGate 豁免, +且**豁免范围仅限语言门禁**:入库内容安全扫描(密钥/凭据类路径)不被任何 +代理可控豁免(仓库配置、内联 `-c codeguard.skipGate=true`、链式)覆盖,恒执行; +需要完整放行(含安全扫描)只能用进程环境变量 `CODEGUARD_SKIP_GATE`(1/true/yes, +仅用户可设——宿主内联赋值不会传入钩子进程)。软硬两门在豁免下也照常报告安全违规。 +且**都不得在非 git 目录回退成"扫描 cwd"**——UPS 对非 git 目录输出一行 +`_non_git_note` 说明并 exit 0(工作区根被回退扫描 = 上百无关仓的存量 lint +变成永久红,实测)。双副本事件去重键:PreToolUse 用 `tool_use_id + 命令`、 +UserPromptSubmit 用 `session_id + 完整文本 + 检查输入身份`、SessionStart/Stop 用 `session_id`; +这些键同时绑定当前会话/worktree。payload 不带对应字段时不做事件去重。 +去重仅记录**已经完成**的结果:SessionStart/Stop 异常后可重试;软门禁有跳过或未验证项 +时不记录完成。硬门禁只短时重放已完成的拒绝(保留 exit 2 与诊断),绝不缓存放行; +第一份仍在执行时第二份可以重复检查,不可因“事件见过”直接返回 0。 +这不是 exactly-once 执行保证,也不能代替当前代码快照。 +推送语义:门禁面由 `_guarded_mode` 统一判定——直接命令与一层间接共用同一套 +扫描;**commit 面 = 按命令链预测的实际提交面**(`pre_tool_git_guard.staging_intent`: +纯 `git commit` → 仅暂存区;`git add -A` → 含未跟踪;`git add -u` 或 `commit -a` → 仅已跟踪改动; +`git add ` → 并入这些路径——add 在 PreToolUse 时**尚未执行**, +不并入会漏检"即将暂存"的文件;并行会话留在工作树的未暂存 WIP 不属于本次提交, +曾因此被误拦);纯 push 在 HEAD 快照中检查未推送差异(`up...HEAD`),无上游时检查 HEAD 树。 +commit+push 使用预测提交快照并合并未推送范围。删除文件进入影响分析,不作为新增敏感文件。 +`git_staging` 将每段 cd/-C、pathspec 与其 worktree 根绑定;硬门禁逐仓传入目标身份, +另一仓的 add -A 不得扩张本仓的纯 commit。Git ls-files 成组解析 glob/目录/literal/exclude; +`-u` 不包含未跟踪文件,`-f` 可包含指定忽略文件,解析后的名字在快照中按字面处理。 +子目录 add . 不扩到兄弟目录;路径含空格与连续相对 cd/-C 保留上下文。 +动态路径、交互暂存和 pathspec-from-file 等未支持形态返回 JSON additionalContext 的 +git UNVERIFIED,保持 exit 0 兼容放行;不能被描述为已准确验证,也不冒充程序内部异常。 +硬门禁从 Git blobs 物化一次性目录,不借真实 .git,不修改原 index/工作树,也不复用软门禁缓存。 +符号链接/子模块/冲突、超限、依赖不可用都明确 UNVERIFIED。快照是内容隔离,不是执行沙箱; +复杂命令链、非 HEAD refspec、并发修改仍需独立 CI 验证。 +UserPromptSubmit 按提示词里的 `push/推送` 选 commit/push 面,但**不传 lanes = +三路宽口径**——软门禁没有待执行命令可预测,按"工作树有待提交改动就提醒"注入 +(注入非阻断,多提醒不算错;硬门禁少拦才是底线),软硬两门只在 skipGate 豁免 +上严格一致(豁免只覆盖语言门禁;安全扫描两边都照常执行)。 + +PostToolUse 只运行可限定到单文件的检查和 formatter。append_files=false 的项目命令推迟到 +显式 check/Git 门禁;保存不能触发整项目 formatter。工具异常不能自动修复。 +CLI/MCP 共用 PASS/FAIL/UNVERIFIED/SKIPPED/PLANNED,只有 PASS 的 passed=true。 +CLI 的 0/1/2 与 hook 的 fail-open 退出码是不同协议,不能混用。 + +Java 计划由 `java_analysis` 装配:`java_build` 读描述,`java_impact` 计算模块反向闭包, +`java_planning` 选择命令,`java_environment` 选择 wrapper/JDK,`java_changes` 观察版本差异。 +`java_project.py` 保留原 CLI/导入面。默认 skipTests/check -x test 不变,权威命令不加默认参数; +纯版本降级必须由正确 Git 基线与当前描述证明,依赖版本和编译配置变化不得降为 validate/help。 +根与变更路径先规范化;分析仍是模块级,不等于完整符号或任意构建脚本语义验证。 + +### 状态归属与持久化 + +`scripts/codeguard/hook_state.py` 负责会话归属、统计、冷却、审计和已完成结果; +`scripts/codeguard/storage.py` 负责跨进程锁与原子文件替换。锁覆盖整个读改写, +使用独立且不随数据替换的 `.lock` 文件,不能只有原子写而没有读改写互斥。 + +- 宿主提供 `session_id` 时,统计保存在 `CODEGUARD_HOME/sessions/<会话与worktree哈希>.json`; + 同一 session 在不同 Git worktree 也分开。Stop 只原子消费当前作用域,后续并发写入保留。 +- 无 `session_id` 时沿用 `session_state.json` 与旧插件内状态的兼容读取;此模式**没有跨会话隔离保证**。 + 旧全局记录不分配给任意一个带 ID 的新会话,不能把兼容读取称为可信归属迁移。 +- 门禁审计由调用线程汇总后写入,`worktree` 是原仓根,`execution_root` 是实际检查目录 + (可能为临时快照),`session_scope` 保留会话归属;`cmd` 为已物化的执行 argv,不再写未展开模板。 + 存量豁免记录为 SKIPPED 而非检查通过;当前或基线为 UNVERIFIED 时均不得授予豁免。 +- 保存检查只在获得 PASS/FAIL 后登记去重,UNVERIFIED 后允许立即重试。 + 去重同时校验文件内容和配置/命令身份;检查前后身份不一致不登记,不把执行中产生的新内容当作已检查。 +- 本批真实并发与 worktree 验证在 macOS 完成;Windows 锁实现尚未在 Windows 实机验证。 + +### 缓存身份与失效 + +`scripts/codeguard/fingerprint.py` 采集输入身份,`scripts/codeguard/cache.py` 只读写和校验完整软结果。 +缓存保存在 `CODEGUARD_HOME/gate-cache/.json`;旧 `/tmp` 条目不读取、不自动删除。 + +- 身份包含真实 worktree 路径、HEAD、Git index 的内容条目、upstream、受版本控制及非忽略工作树文件的内容、 + 常见根 linter 配置/注册表声明的配置、用户配置、命令定义和本地工具身份;不再用 mtime/size 代替源码内容。 +- Git 文件名按 NUL 分隔,linked worktree 不假设 `.git` 是目录。项目 `codeguard.json` 不保留永不过期的进程副本。 +- 预算为 10,000 个文件名、64 MiB 内容;符号链接/特殊文件、预算超限、读取失败或非 Git 目录时禁用该身份缓存, + 仍实际检查。预算不截断成一个看似完整的键;非 Git 保存也仍检查,但不采用仓库身份去重。 +- 只保存检查前后身份一致且 `skipped` 为空的软结果;损坏格式、未来时间戳和未知结果均重跑。 + 硬门禁不读取软缓存,事件去重亦不缓存放行。 +- 这是有明确输入范围的软观察优化,不是原子安全快照或可移植验收凭据;任意外部动态配置、远程依赖和未声明环境变化 + 不在完整性证明范围内。准确提交验证和 CI 仍独立运行,不得以软缓存证明整个项目已通过。 + +--- + +## 5. 新增 hook checklist + +新加一个 hook 时,按顺序自检: + +1. **读本 cheat-sheet** + `openspec/specs/hook-protocol/spec.md`。 +2. 在 `hooks/hooks.json` 注册(事件 / matcher / command / timeout)。 +3. 脚本实现遵守 §1 协议总表的 exit 码与 stdout 形态。 +4. 脚本 `__main__` 加 §3 的 fail-open 套子。 +5. 在 `tests/run_all.py` 加子集触发:stdin 喂真实宿主协议 JSON,断言 exit 码与 stdout 形状。 +6. 在本文件 §1 协议总表加一行,标注实现位置(`hooks/.py:line`)。 +7. OpenSpec change:proposal / design / `hook-protocol/spec.md` 加 Scenario / tasks 勾选后 archive。 + +--- + +## 6. 协议变更策略 + +任何对 §1 协议总表字段的修改: + +- 同步改本文件 + 对应 `hooks/*.py` + 对应测试。 +- 走 OpenSpec change(`hook-protocol` spec 下新增 MODIFIED Requirements + Scenarios)。 +- 不允许「先改代码后补文档」的拆分 commit——契约一致是同一变更的原子单位。 + +--- + +## 7. 与 OpenSpec 的对应 + +| Cheat-sheet 节 | OpenSpec spec / Scenario | +|---|---| +| §1 协议总表 | `hook-protocol::Requirement: Hook-host contract SHALL live in hooks/__protocol__.md` | +| §3 Fail-open | `hook-protocol::Requirement: The cheat-sheet SHALL document fail-open` | +| §5 新增 hook checklist | `hook-protocol::Requirement: tests/run_all.py SHALL reference the cheat-sheet` | + +变更通过 `openspec archive add-host-protocol-cheatsheet` 入库;spec 在 `openspec/specs/hook-protocol/spec.md`。 diff --git a/dev.openhands/hooks/env_check.py b/dev.openhands/hooks/env_check.py new file mode 100755 index 0000000..bfc1585 --- /dev/null +++ b/dev.openhands/hooks/env_check.py @@ -0,0 +1,110 @@ +#!/usr/bin/env python3 +"""SessionStart 宿主适配器:读取事件与本机插件配置,输出项目记忆。""" +from __future__ import annotations + +import contextlib +import json +import os +import subprocess +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard import startup_application +from codeguard.reporting import plugin_version +from detect_lang import ( # 兼容原有 Python 导入接口 + LANG_COMMANDS, + REGISTRY, + detect_languages, + ensure_user_path, + find_project_root, + load_user_config, +) + +__all__ = [ + "LANG_COMMANDS", + "REGISTRY", + "detect_languages", + "detect_linter_config", + "ensure_user_path", + "find_project_root", + "load_user_config", + "main", + "notify", + "version_backlog_note", +] + +detect_linter_config = startup_application.detect_linter_config +version_backlog_note = startup_application.version_backlog_note + + +def notify(title: str, message: str) -> None: + """macOS 系统通知;其他宿主静默。""" + if sys.platform != "darwin": + return + safe_title = title.replace('"', "'") + safe_message = message.replace('"', "'")[:200] + with contextlib.suppress(OSError): + subprocess.Popen( + ["osascript", "-e", + f'display notification "{safe_message}" with title "{safe_title}"'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + + +def _enabled_plugin_orgs() -> tuple[str, ...]: + """ZCode 宿主注册表只在适配器读取,其他宿主缺文件时无副作用。""" + try: + config = json.loads((Path.home() / ".zcode" / "cli" / "config.json").read_text(encoding="utf-8")) + orgs = { + key.split("@", 1)[1] + for key in (config.get("plugins", {}) or {}).get("enabledPlugins", {}) + if key.startswith("codeguard@") + } + return tuple(sorted(orgs)) + except (OSError, ValueError, AttributeError): + return () + + +def main(payload: dict | None = None) -> int: + from codeguard.hook_state import observe_once, session_scope + session_id = (payload or {}).get("session_id") + with session_scope(payload or {}): + return observe_once(f"start:{session_id}" if session_id else None, lambda: _main(payload)) + + +def _main(payload: dict | None = None) -> int: + ensure_user_path(from_login_shell=True) + project_root = find_project_root(os.getcwd()) or Path(os.getcwd()) + current = plugin_version() + report = startup_application.build_startup_report( + project_root, + plugin_version="" if current == "unknown" else current, + cache_root=Path.home() / ".zcode" / "cli" / "plugins" / "cache", + enabled_plugin_orgs=_enabled_plugin_orgs(), + ) + if report.notification: + notify(*report.notification) + if report.text: + print(report.text) + return 0 + + +if __name__ == "__main__": + try: + payload: dict = {} + if not sys.stdin.isatty(): + try: + data = json.loads(sys.stdin.read()) + if isinstance(data, dict): + payload = data + except (json.JSONDecodeError, ValueError): + payload = {} + sys.exit(main(payload)) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断宿主工作流 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/dev.openhands/hooks/gate_lib.py b/dev.openhands/hooks/gate_lib.py new file mode 100644 index 0000000..226c9ed --- /dev/null +++ b/dev.openhands/hooks/gate_lib.py @@ -0,0 +1,124 @@ +"""旧 Hook 导入兼容面;检查、仓库策略、审计与反馈均委托到独立服务。""" +from __future__ import annotations + +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard.baseline import ( + _git, + _mentioned_files, + _stale_attribution, + baseline_stale_finding, +) +from codeguard.gate import ( + GATE_CACHE_TTL, + _gate_cache_key, + _gate_cache_path, + _worktree_fingerprint, + run_gate, +) +from codeguard.gate import run_batch as _run_gate_uncached +from codeguard.hook_state import ( + codeguard_home, + record_gate_decision, + record_skip_event, + session_state_path, + should_suppress_event, +) +from codeguard.path_policy import ( + GUARD_EXCLUDE_DIRS, + GUARD_EXCLUDE_FILES, + GUARD_ROOT_ONLY_FILES, +) +from codeguard.reporting import ( + CODEGUARD_VERSION, + REPORT_MAX_CHARS, + _dependency_resolution_hint, + _failure_detail_blocks, + _log_path, + _rule_summary, + _squeeze, + _truncate_detail, + format_failure_report, + format_safety_report, + gate_directive, + summarize_failures, +) +from codeguard.repository_policy import check_commit_safety, skip_gate_via_git_config +from codeguard.spec_validation import validate as _openspec_validate +from detect_lang import ( + LANG_COMMANDS, + detect_language, + detect_languages, + get_overrides, + probe_toolchain, + project_uses_linter, +) +from scope import changed_files + +__all__ = [ + "CODEGUARD_VERSION", + "GATE_CACHE_TTL", + "GUARD_EXCLUDE_DIRS", + "GUARD_EXCLUDE_FILES", + "GUARD_ROOT_ONLY_FILES", + "LANG_COMMANDS", + "PLUGIN_ROOT", + "REPORT_MAX_CHARS", + "_dependency_resolution_hint", + "_failure_detail_blocks", + "_gate_cache_key", + "_gate_cache_path", + "_git", + "_log_path", + "_mentioned_files", + "_openspec_validate", + "_rule_summary", + "_run_gate_uncached", + "_squeeze", + "_stale_attribution", + "_truncate_detail", + "_worktree_fingerprint", + "baseline_stale_finding", + "changed_files", + "check_commit_safety", + "codeguard_home", + "detect_language", + "detect_languages", + "format_failure_report", + "format_safety_report", + "gate_directive", + "get_overrides", + "probe_toolchain", + "project_uses_linter", + "record_gate_decision", + "record_skip_event", + "run_gate", + "session_state_path", + "should_suppress_event", + "skip_gate_via_git_config", + "summarize_failures", +] + + +def _java_executable_from_plan(plan: dict) -> str | None: + """从 java_project.analyze 的产物里解析构建可执行文件。 + + 两条来源按优先级: + 1. 顶层 ``executable`` 键(java_project 正常产出); + 2. 回退 ``commands[0].argv[0]``——历史版本的 java_project 只把 + wrapper 体现在计划命令里(实测 68c8a37 曾因此让 mvnw 感知成为 + 死代码:消费者读的键生产者从不写)。 + 非 mvn/gradle wrapper(如 codeguard.json 显式命令)不参与替换。 + """ + exe = plan.get("executable") + if exe: + return exe + for cmd in plan.get("commands", []) or []: + argv = cmd.get("argv") or [] + if argv and Path(argv[0]).name in ("mvnw", "gradlew"): + return argv[0] + return None diff --git a/dev.openhands/hooks/hooks.json b/dev.openhands/hooks/hooks.json new file mode 100644 index 0000000..781375d --- /dev/null +++ b/dev.openhands/hooks/hooks.json @@ -0,0 +1,64 @@ +{ + "hooks": { + "SessionStart": [ + { + "matcher": "startup|resume", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/env_check.py\"", + "timeout": 30, + "statusMessage": "codeguard: 检测项目语言与现有 linter 配置…" + } + ] + } + ], + "UserPromptSubmit": [ + { + "matcher": "提交|commit|push|提交代码|部署|deploy", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/user_prompt_validator.py\"", + "timeout": 120 + } + ] + } + ], + "PreToolUse": [ + { + "matcher": "Bash", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/pre_tool_git_guard.py\"", + "timeout": 120 + } + ] + } + ], + "PostToolUse": [ + { + "matcher": "Write|Edit|MultiEdit", + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/post_tool_lint.py\"", + "timeout": 180 + } + ] + } + ], + "Stop": [ + { + "hooks": [ + { + "type": "command", + "command": "python3 \"${CLAUDE_PLUGIN_ROOT}/hooks/stop_summary.py\"", + "timeout": 15 + } + ] + } + ] + } +} diff --git a/dev.openhands/hooks/post_tool_lint.py b/dev.openhands/hooks/post_tool_lint.py new file mode 100644 index 0000000..ddf480e --- /dev/null +++ b/dev.openhands/hooks/post_tool_lint.py @@ -0,0 +1,131 @@ +"""PostToolUse 宿主适配器:保存反馈以 JSON 注入上下文,绝不阻断写文件。""" +from __future__ import annotations + +import json +import os +import subprocess +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard import save_application +from codeguard.hook_state import codeguard_home, session_scope +from detect_lang import ( # 兼容原有 Python 导入接口 + LANG_COMMANDS, + detect_language, + ensure_user_path, + find_project_root, + load_user_config, + project_uses_linter, +) +from scope import is_build_artifact + +__all__ = [ + "DEDUP_FILE", "LANG_COMMANDS", "bump_state", "detect_language", "ensure_user_path", + "extract_file_path", "find_project_root", "is_build_artifact", "is_ejs_template", + "load_user_config", "mac_notify", "main", "project_uses_linter", "read_payload", + "run", "should_skip", "should_suppress_duplicate", +] + +# 多个 marketplace 副本共享用户级去重状态;保留原测试/嵌入方的覆盖点。 +DEDUP_FILE: Path | None = None + + +def _dedup_path() -> Path: + return DEDUP_FILE or codeguard_home() / "file_dedup.json" + + +def _state_path() -> Path: + return save_application.state_path() + + +def bump_state(lang: str, passed: bool, auto_fixed: bool = False) -> None: + save_application.bump_state(lang, passed, auto_fixed) + + +def _notify_cooldown_ok(lang: str, cooldown_s: int = 60) -> bool: + return save_application.notification_allowed(lang, cooldown_s) + + +def mac_notify(title: str, message: str) -> None: + """macOS 通知;非 macOS 宿主由 JSON 上下文呈现问题。""" + if sys.platform != "darwin": + return + safe_title = title.replace('"', "'") + safe_message = message.replace('"', "'")[:200] + subprocess.Popen( + ["osascript", "-e", + f'display notification "{safe_message}" with title "{safe_title}" sound name "Pop"'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + + +def should_suppress_duplicate(file_path: str, identity: str | None = None) -> bool: + return save_application.should_suppress_duplicate(file_path, identity, _dedup_path()) + + +is_ejs_template = save_application.is_ejs_template +run = save_application.run +should_skip = save_application.should_skip + + +def read_payload() -> dict: + if sys.stdin.isatty(): + return {} + try: + return json.loads(sys.stdin.read()) + except (json.JSONDecodeError, ValueError): + return {} + + +def extract_file_path(payload: dict) -> str: + for candidate in (payload.get("file_path"), + (payload.get("tool_input") or {}).get("file_path"), + (payload.get("tool_input") or {}).get("path"), + (payload.get("input") or {}).get("file_path")): + if candidate: + return str(candidate) + return "" + + +def main() -> int: + payload = read_payload() + with session_scope(payload): + return _main(payload) + + +def _main(payload: dict) -> int: + ensure_user_path() + file_path = extract_file_path(payload) + if not file_path: + return 0 + cfg = load_user_config() + project_root = find_project_root(os.getcwd()) or Path(os.getcwd()) + result = save_application.evaluate_save(file_path, project_root, cfg, store=_dedup_path()) + if result.additional_context is not None: + message = {"hookSpecificOutput": { + "hookEventName": "PostToolUse", + "additionalContext": result.additional_context, + }} + if result.system_message is not None: + message["systemMessage"] = result.system_message + print(json.dumps(message, ensure_ascii=False)) + sys.stdout.flush() + result.acknowledge() + if result.notification: + lang, title, message = result.notification + if _notify_cooldown_ok(lang): + mac_notify(title, message) + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断 AI 写文件 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/dev.openhands/hooks/pre_tool_git_guard.py b/dev.openhands/hooks/pre_tool_git_guard.py new file mode 100755 index 0000000..69afcff --- /dev/null +++ b/dev.openhands/hooks/pre_tool_git_guard.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python3 +"""PreToolUse 宿主适配器:AI 执行 git commit/push 前输出硬门禁决策。""" +from __future__ import annotations + +import contextlib +import io +import json +import os +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) +sys.path.insert(0, str(PLUGIN_ROOT / "hooks")) + +from codeguard.git_context import ( + _command_indirect, + _fallback_roots, + _filter_fallback_roots, + _guarded_mode, + _is_git_repo, + _repo_root_of, + is_guarded, + resolve_project_roots, + staging_intent, +) +from codeguard.git_guard_application import evaluate_git_command +from codeguard.git_syntax import ( + _analyze_segment, + _collect_subs, + _flatten_substitutions, + _git_c_path, + _git_seg_parts, + _git_side_effect_sub, + _normalize_segment, + _segment_is_git_side_effect, + chain_skip_gate, + inline_skip_gate, +) +from codeguard.hook_state import completed_event, record_completed_event, session_scope +from codeguard.repository_policy import env_skip_gate +from detect_lang import ensure_user_path, load_user_config +from gate_lib import ( # 兼容原有 Python 导入接口 + check_commit_safety, + format_safety_report, + gate_directive, + record_skip_event, + run_gate, + skip_gate_via_git_config, +) + +__all__ = [ + "GUARDED_PATTERNS", "_analyze_segment", "_collect_subs", "_command_indirect", + "_fallback_roots", "_filter_fallback_roots", "_flatten_substitutions", "_git_c_path", + "_git_seg_parts", "_git_side_effect_sub", "_guarded_mode", "_is_git_repo", + "_normalize_segment", "_repo_root_of", "_segment_is_git_side_effect", "chain_skip_gate", + "check_commit_safety", "extract_command", "format_safety_report", "gate_directive", + "inline_skip_gate", "is_guarded", "main", "read_payload", "record_skip_event", + "resolve_project_roots", "run_gate", "skip_gate_via_git_config", "staging_intent", +] + +GUARDED_PATTERNS = ("git commit", "git push") + + +def read_payload() -> dict: + if sys.stdin.isatty(): + return {} + try: + return json.loads(sys.stdin.read()) + except (json.JSONDecodeError, ValueError): + return {} + + +def extract_command(payload: dict) -> str: + tool_input = payload.get("tool_input") or {} + command = tool_input.get("command") + return str(command) if command else "" + + +def main() -> int: + payload = read_payload() + with session_scope(payload): + key = ("pre:" + str(payload["tool_use_id"]) + ":" + extract_command(payload) + if payload.get("tool_use_id") else None) + cached = completed_event(key) if key else None + if cached is not None and cached["code"] == 2: + _deliver(cached["code"], cached["stdout"], cached["stderr"]) + return cached["code"] + stdout, stderr = io.StringIO(), io.StringIO() + with contextlib.redirect_stdout(stdout), contextlib.redirect_stderr(stderr): + code = _main(payload) + out, err = stdout.getvalue(), stderr.getvalue() + # 只复用阻断结果,硬门放行和未验证永远重跑准确快照。 + delivered = _deliver(code, out, err) + if key and code == 2 and delivered: + record_completed_event(key, code, out, err) + return code + + +def _deliver(code: int, stdout: str, stderr: str) -> bool: + """刷新宿主输出后才允许缓存;已知拦截不能因输出故障降为放行。""" + try: + sys.stdout.write(stdout) + sys.stderr.write(stderr) + sys.stdout.flush() + sys.stderr.flush() + except (OSError, UnicodeError, ValueError): + if code == 2: + return False + raise + return True + + +def _main(payload: dict) -> int: + ensure_user_path() + result = evaluate_git_command( + extract_command(payload), + cwd=Path(os.getcwd()), + load_config=load_user_config, + bypass_env=env_skip_gate(), + ) + for context in result.contexts: + print(json.dumps({"hookSpecificOutput": { + "hookEventName": "PreToolUse", "additionalContext": context, + }}, ensure_ascii=False)) + if result.stderr: + print(result.stderr, file=sys.stderr) + return result.exit_code + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断宿主工具 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/dev.openhands/hooks/stop_summary.py b/dev.openhands/hooks/stop_summary.py new file mode 100755 index 0000000..b624946 --- /dev/null +++ b/dev.openhands/hooks/stop_summary.py @@ -0,0 +1,71 @@ +#!/usr/bin/env python3 +"""Stop 钩子:会话结束前总结本次会话产生的代码规范问题。 + +让用户在关闭会话前能看到: +- 本次修改了哪些语言 +- 哪些 linter 通过、哪些失败 +- 自动修复成功的次数 +- 残留需要手动处理的警告 +""" +from __future__ import annotations + +import json +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] # hooks/ 的上级 = 插件根 + +sys.path.insert(0, str(PLUGIN_ROOT / "hooks")) +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) + +from codeguard import session_application + +# 现行状态目录在 ~/.codeguard(CODEGUARD_HOME 可覆盖);插件根的旧文件 +# 升版本即丢、双副本各存一半——load_state 优先新路径,回退读旧文件一次。 +LEGACY_STATE_FILE = PLUGIN_ROOT / ".session_state.json" + + +def load_state() -> dict: + return session_application.load_state(LEGACY_STATE_FILE) + + +def summarize(state: dict) -> str: + return session_application.summarize(state) + + +def _skipgate_left_enabled() -> bool: + return session_application.skipgate_left_enabled(Path.cwd()) + + +def main(payload: dict | None = None) -> int: + from codeguard.hook_state import observe_once, session_scope + session_id = (payload or {}).get("session_id") + with session_scope(payload or {}): + return observe_once(f"stop:{session_id}" if session_id else None, lambda: _main(payload)) + + +def _main(payload: dict | None = None) -> int: + prepared = session_application.prepare_summary(LEGACY_STATE_FILE, Path.cwd()) + for line in prepared.lines: + print(line) + sys.stdout.flush() + prepared.acknowledge() + return 0 + + +if __name__ == "__main__": + try: + payload: dict = {} + if not sys.stdin.isatty(): + try: + data = json.loads(sys.stdin.read()) + if isinstance(data, dict): + payload = data + except (json.JSONDecodeError, ValueError): + payload = {} + sys.exit(main(payload)) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open:traceback 绝不进 AI 上下文/阻断工作流 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/dev.openhands/hooks/user_prompt_validator.py b/dev.openhands/hooks/user_prompt_validator.py new file mode 100755 index 0000000..a4397d8 --- /dev/null +++ b/dev.openhands/hooks/user_prompt_validator.py @@ -0,0 +1,118 @@ +#!/usr/bin/env python3 +"""UserPromptSubmit 宿主适配器:软提醒注入,不阻断用户消息。""" +from __future__ import annotations + +import contextlib +import json +import os +import sys +from pathlib import Path + +PLUGIN_ROOT = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN_ROOT / "scripts")) +sys.path.insert(0, str(PLUGIN_ROOT / "hooks")) + +from codeguard import prompt_application, prompt_policy +from codeguard.hook_state import session_scope +from codeguard.repository_policy import env_skip_gate +from detect_lang import ( # 兼容原有 Python 导入接口 + LANG_COMMANDS, + detect_languages, + ensure_user_path, + find_project_root, + load_user_config, +) +from gate_lib import ( # 兼容原有 Python 导入接口 + check_commit_safety, + format_safety_report, + gate_directive, + record_skip_event, + run_gate, + skip_gate_via_git_config, + summarize_failures, +) + +__all__ = [ + "LANG_COMMANDS", "QUESTION_MARKERS", "TRIGGER_PATTERNS", "check_commit_safety", + "detect_languages", "ensure_user_path", "find_project_root", "format_safety_report", + "gate_directive", "is_trigger", "load_user_config", "main", "notify", "read_payload", + "read_user_text", "record_skip_event", "run_gate", "skip_gate_via_git_config", + "summarize_failures", +] + +TRIGGER_PATTERNS = prompt_policy.TRIGGER_PATTERNS +QUESTION_MARKERS = prompt_policy.QUESTION_MARKERS +is_trigger = prompt_policy.is_trigger +_detect_languages_in_text = prompt_policy.detect_languages_in_text +_non_git_note = prompt_application.non_git_note + + +def notify(title: str, message: str) -> None: + """macOS 系统通知;其他宿主仅依赖对话上下文。""" + if sys.platform != "darwin": + return + import subprocess + safe_title = title.replace('"', "'") + safe_message = message.replace('"', "'")[:200] + with contextlib.suppress(OSError): + subprocess.Popen( + ["osascript", "-e", + f'display notification "{safe_message}" with title "{safe_title}" sound name "Pop"'], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + + +def read_payload() -> dict: + """stdin 只读取一次,兼容 user_prompt 与 prompt 字段。""" + if sys.stdin.isatty(): + return {} + try: + data = json.loads(sys.stdin.read()) + except json.JSONDecodeError: + return {} + return data if isinstance(data, dict) else {} + + +def read_user_text() -> str: + payload = read_payload() + return str(payload.get("user_prompt") or payload.get("prompt") or "") + + +def main() -> int: + payload = read_payload() + with session_scope(payload): + return _main(payload) + + +def _main(payload: dict) -> int: + user_text = str(payload.get("user_prompt") or payload.get("prompt") or "") + if not is_trigger(user_text): + return 0 + ensure_user_path(from_login_shell=True) + result = prompt_application.evaluate_prompt( + user_text, + project_root=find_project_root(os.getcwd()), + session_id=payload.get("session_id"), + load_config=load_user_config, + bypass_env=env_skip_gate(), + ) + if result.notification: + notify(*result.notification) + if result.additional_context is not None: + print(json.dumps({"hookSpecificOutput": { + "hookEventName": "UserPromptSubmit", + "additionalContext": result.additional_context, + }}, ensure_ascii=False)) + sys.stdout.flush() + result.acknowledge() + return 0 + + +if __name__ == "__main__": + try: + sys.exit(main()) + except SystemExit: + raise + except Exception as exc: # noqa: BLE001 — 内部错误 fail-open,不阻断用户消息 + print(f"[codeguard] 内部错误已忽略(fail-open): {exc!r}", file=sys.stderr) + sys.exit(0) diff --git a/docs/portable-migration.md b/docs/portable-migration.md new file mode 100644 index 0000000..2eb64cb --- /dev/null +++ b/docs/portable-migration.md @@ -0,0 +1,94 @@ +# Portable Agent Plugins migration + +**Status: migrated to Agent Plugins v1.0.0.** + +This package originally shipped only per-client manifests. None of those is part +of the Agent Plugins format, so a conformant client rejected the package +outright and never reached the 68 skills inside it — a missing root +manifest is fatal, not a warning (§5.1, §5.3). + +## What ships now + +| File | Role | +|------|------| +| `plugin.json` | Canonical portable manifest (published `agent-plugins.org` 1.0.0 schema) | +| `mcp.json` | _(none — this package bundles no MCP servers)_ | +| `.codex-plugin/plugin.json` | Codex compatibility manifest, unchanged | +| `.zcode-plugin/plugin.json` | ZCode compatibility manifest, unchanged | +| `kimi.plugin.json` | Kimi compatibility manifest, unchanged | + +## Layout rules honoured + +- `plugin.json`, `skills/` live at the package root. +- The portable manifest declares **only** published-schema fields. The schema is + closed (`additionalProperties: false`), so it deliberately omits: + - `interface` — carried at `extensions["com.openai"]["interface"]` (§8) + - `skills` — discovered from the fixed `skills/` location; it MUST NOT be declared (§6.1) +- `name` is `codeguard` — lowercase alphanumerics, `-` and `.` only, starting and + ending alphanumeric, with no `--` or `..` (§5.5). +- `version` is the **base** version `0.16.1`. The `+codex.` build + metadata in `.codex-plugin/plugin.json` describes that compatibility channel's + build, not the portable plugin, so it stays there. +- `$schema` is the exact published constant + `https://agent-plugins.org/schemas/1.0.0/plugin.schema.json`. + +## Client-owned data + +Everything the portable schema has no field for lives under a reverse-domain +client extension namespace (§8): + +- `interface` + +## Client coverage + +`skills/` and `mcp.json` are the portable component types, so **every client in +the [Agent Plugins registry](https://agent-plugins.org/compatible-clients) loads +this package with no client-specific work**: VS Code, Cursor, GitHub Copilot, +ChatGPT & Codex, Kiro, Hermes Agent, OpenClaw, Grok Bot, NanoClaw and OpenHands. + +Commands, agents and hooks are explicitly *not* portable, so a client reads them +from the extension directory it owns (§8.2). This package mirrors its +non-portable components accordingly: + +- `com.github.copilot/` — `hooks/` for VS Code and GitHub Copilot (they share this namespace) +- `dev.openhands/` — `commands/`, `hooks/` for OpenHands +- `extensions["com.openai"]` — manifest data for ChatGPT & Codex + +The root `commands/`, `hooks/` and `agents/` directories are kept unchanged, so +the Codex, ZCode and Kimi channels keep working. `scripts/validate_portable_plugin.py` +fails if a mirror drifts from its root copy. + +> **OpenClaw precedence.** OpenClaw checks for a client-specific bundle +> marker (`.codex-plugin/`) before a root `plugin.json`, and treats the +> client-specific format as winning so its richer mappings survive. This +> package ships both, so OpenClaw loads it as a Codex bundle — which keeps +> its commands and hooks working — rather than as an Agent Plugins bundle. +> Removing `.codex-plugin/` would change that, and would break the Codex +> channel, so it stays. + +## MCP + +This package bundles no MCP servers, so there is no `mcp.json`. +Declaring an empty server set would be noise, and declaring a server +without a working transport would be an untruthful claim. + +## Verifying + +The check is machine-runnable and needs no network access or third-party +package: + +```bash +python3 scripts/validate_portable_plugin.py +``` + +It validates the root manifest against the published schema rules (closed field +set, `$schema` constant, name constraints, `author`/`extensions` sub-shapes), +validates `mcp.json` including every closed transport variant and `cwd` form, +checks skill discovery under `skills/`, and asserts identity agreement with the +compatibility manifest. + +## References + +- [Agent Plugins specification](https://agent-plugins.org/specification) +- [Plugin manifest schema](https://agent-plugins.org/schemas/1.0.0/plugin.schema.json) +- [MCP configuration schema](https://agent-plugins.org/schemas/1.0.0/mcp.schema.json) diff --git a/plugin.json b/plugin.json new file mode 100644 index 0000000..924c885 --- /dev/null +++ b/plugin.json @@ -0,0 +1,56 @@ +{ + "$schema": "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json", + "name": "codeguard", + "version": "0.16.1", + "description": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit.", + "author": { + "name": "Full Stack Skills / PartMe.AI", + "url": "https://github.com/partme-ai" + }, + "homepage": "https://github.com/partme-ai/partme-codeguard-plugin", + "repository": "https://github.com/partme-ai/partme-codeguard-plugin", + "license": "Apache-2.0", + "keywords": [ + "java", + "rust", + "typescript", + "python", + "javadoc", + "checkstyle", + "clippy", + "eslint", + "ruff", + "pre-commit" + ], + "extensions": { + "com.openai": { + "interface": { + "displayName": "代码规范守卫", + "shortDescription": "Trustworthy code checks and Java impact analysis", + "longDescription": "Evidence-backed code checks and Git content gates for AI assistants, with Maven/Gradle module impact analysis. Save hooks provide feedback; unverified checks are explicit. Java planning is read-only; executing project checks runs trusted build/test commands, not a security sandbox.", + "developerName": "Full Stack Skills / PartMe.AI", + "category": "Developer Tools", + "capabilities": [ + "Read", + "Write" + ], + "websiteURL": "https://github.com/partme-ai/partme-codeguard-plugin", + "privacyPolicyURL": "https://github.com/partme-ai/partme-codeguard-plugin/blob/main/PRIVACY.md", + "termsOfServiceURL": "https://github.com/partme-ai/partme-codeguard-plugin/blob/main/TERMS.md", + "defaultPrompt": [ + "Run /check on the current project and fix what fails", + "Initialize codeguard on this repository with /init", + "Analyze Java module impact, then run the project's verification plan" + ], + "brandColor": "#2563EB", + "composerIcon": "./assets/composer-icon.png", + "logo": "./assets/official-logo.png", + "logoDark": "./assets/official-logo.png", + "screenshots": [] + } + }, + "ai.nanoco.nanoclaw": { + "agentName": "代码规范守卫" + } + } +} diff --git a/scripts/check_architecture.py b/scripts/check_architecture.py index afa1ab0..b107bc7 100644 --- a/scripts/check_architecture.py +++ b/scripts/check_architecture.py @@ -25,6 +25,7 @@ "java_project.py": "entry", "run_check.py": "entry", "validate_languages_json.py": "entry", + "validate_portable_plugin.py": "entry", "verdict.py": "compat-shim", "user_config.py": "compat-shim", "run_per_language.py": "compat-shim", diff --git a/scripts/validate_portable_plugin.py b/scripts/validate_portable_plugin.py new file mode 100755 index 0000000..9dab3d5 --- /dev/null +++ b/scripts/validate_portable_plugin.py @@ -0,0 +1,713 @@ +#!/usr/bin/env python3 +"""Validate this package against the Agent Plugins v1.0.0 specification. + +The Agent Plugins format is a *closed* portable contract: a conformant client +MUST reject a plugin whose root `plugin.json` is missing or invalid, and MUST +NOT discover any of its components. This script is the machine-checkable half +of the claim that the package conforms, so it validates against the published +schema rules directly rather than trusting a hand-maintained checklist. + +Checked here: + * root `plugin.json` -- presence, closed top-level field set, `$schema` + constant, plugin-name constraints, `author` / `extensions` sub-shapes + * root `mcp.json` -- when present: `$schema` constant, closed top-level + field set, version agreement with `plugin.json`, and every server entry + matching exactly one closed transport variant + * `skills/` -- discovery shape (immediate children with SKILL.md) + and Agent Skills frontmatter for each discovered skill + * parity -- identity agreement with the client compatibility + manifest (`.codex-plugin/plugin.json`) when one is shipped + +Pure standard library: no third-party dependency and no network access. + +Usage: + python3 scripts/validate_portable_plugin.py [--root DIR] [--json] +""" + +from __future__ import annotations + +import argparse +import json +import re +import sys +from pathlib import Path + +# --- Published schema constants (agent-plugins.org 1.0.0) ------------------ + +PLUGIN_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/plugin.schema.json" +MCP_SCHEMA = "https://agent-plugins.org/schemas/1.0.0/mcp.schema.json" + +# plugin.schema.json: additionalProperties false +PLUGIN_TOP_LEVEL = frozenset( + { + "$schema", + "name", + "version", + "description", + "author", + "homepage", + "repository", + "license", + "keywords", + "extensions", + } +) +PLUGIN_REQUIRED = frozenset({"$schema", "name"}) + +# §5.5 / plugin.schema.json name pattern +NAME_PATTERN = re.compile(r"^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$") + +# §5.4: the author object may contain only these three string fields. +AUTHOR_ALLOWED = frozenset({"name", "email", "url"}) + +# mcp.schema.json: additionalProperties false +MCP_TOP_LEVEL = frozenset({"$schema", "mcpServers"}) +MCP_REQUIRED = frozenset({"$schema", "mcpServers"}) + +# §7.2.1 cwd forms: plugin-relative, or rooted at the two reserved placeholders. +CWD_PATTERN = re.compile(r"^(?:\./|\$\{PLUGIN_ROOT\}(?:/|$)|\$\{PLUGIN_DATA\}(?:/|$))") + +# §9.2: a plugin may not override the client-provided variables. +RESERVED_ENV = frozenset({"PLUGIN_ROOT", "PLUGIN_DATA"}) + +# §7.2.1: a bundled executable must use a plugin-relative command. +BUNDLED_COMMAND_PATTERN = re.compile(r"^\./[^\s]+$") + +STDIO_FIELDS = frozenset({"type", "command", "args", "env", "cwd"}) +REMOTE_FIELDS = frozenset({"type", "url", "headers"}) + +IDENTITY_FIELDS = ( + "name", + "description", + "author", + "homepage", + "repository", + "license", + "keywords", +) + +# §8.2: client-specific files live in a top-level directory named exactly the +# extension namespace. The Agent Plugins registry clients each own one, and the +# packages mirror their non-portable components into the directories those +# clients actually read. The root copies stay in place for the Codex / ZCode / +# Kimi channels, so the mirrors are checked for drift rather than assumed. +CLIENT_EXTENSION_MIRRORS = { + "com.github.copilot": ("hooks",), # VS Code and GitHub Copilot + "dev.openhands": ("commands", "agents", "hooks"), # OpenHands +} + +# Build noise that must never be mirrored or compared. +_IGNORED_PARTS = {"__pycache__", ".pytest_cache", ".ruff_cache"} +_IGNORED_SUFFIXES = {".pyc", ".pyo"} + + +class Report: + """Collects findings without aborting on the first problem.""" + + def __init__(self) -> None: + self.errors: list[str] = [] + self.notes: list[str] = [] + + def fail(self, where: str, message: str) -> None: + self.errors.append(f"{where}: {message}") + + def note(self, message: str) -> None: + self.notes.append(message) + + +def load_json(path: Path, report: Report, where: str): + if not path.is_file(): + return None + try: + return json.loads(path.read_text(encoding="utf-8")) + except (OSError, ValueError) as exc: + report.fail(where, f"is not readable JSON ({exc})") + return None + + +# --- plugin.json (§5) ------------------------------------------------------ + + +def check_plugin_manifest(root: Path, report: Report) -> dict | None: + where = "plugin.json" + path = root / "plugin.json" + if not path.is_file(): + report.fail( + where, + "missing. A conformant client MUST reject the plugin and MUST NOT " + "discover its components (§5.1, §5.3).", + ) + return None + + manifest = load_json(path, report, where) + if manifest is None: + return None + if not isinstance(manifest, dict): + report.fail(where, f"must be a top-level JSON object, got {type(manifest).__name__}") + return None + + unknown = sorted(set(manifest) - PLUGIN_TOP_LEVEL) + if unknown: + # Non-fatal for a client, but it is a schema violation and a client + # will report and ignore these fields (§5.2). + report.fail( + where, + f"unknown top-level field(s) {unknown}. The schema is closed; " + f"client-specific data belongs under `extensions` (§5.2).", + ) + + missing = sorted(PLUGIN_REQUIRED - set(manifest)) + if missing: + report.fail(where, f"missing required field(s) {missing} (§5.3)") + return None + + schema = manifest["$schema"] + if schema != PLUGIN_SCHEMA: + report.fail( + where, + f"$schema is {schema!r}, expected the canonical identifier " + f"{PLUGIN_SCHEMA!r} (§5.2).", + ) + + name = manifest["name"] + if not isinstance(name, str): + report.fail(where, f"name must be a string, got {type(name).__name__} (§5.3)") + else: + if not 1 <= len(name) <= 64: + report.fail(where, f"name is {len(name)} characters, must be 1-64 (§5.5)") + if not NAME_PATTERN.match(name): + report.fail( + where, + f"name {name!r} violates §5.5 (lowercase alphanumerics, '-', '.'; " + f"must start and end alphanumeric; no '--' or '..').", + ) + + version = manifest.get("version") + if version is not None and not isinstance(version, str): + report.fail(where, f"version must be a string, got {type(version).__name__} (§5.4)") + + keywords = manifest.get("keywords") + if keywords is not None: + if not isinstance(keywords, list) or not all(isinstance(k, str) for k in keywords): + report.fail(where, "keywords must be an array of strings (§5.4)") + + for scalar in ("description", "homepage", "repository", "license"): + if scalar in manifest and not isinstance(manifest[scalar], str): + report.fail(where, f"{scalar} must be a string (§5.4)") + + author = manifest.get("author") + if author is not None: + if not isinstance(author, dict): + report.fail(where, "author must be an object (§5.4)") + else: + extra = sorted(set(author) - AUTHOR_ALLOWED) + if extra: + report.fail( + where, + f"author has field(s) {extra}; the author object allows only " + f"{sorted(AUTHOR_ALLOWED)} and is otherwise invalid (§5.4).", + ) + for key, value in author.items(): + if not isinstance(value, str): + report.fail(where, f"author.{key} must be a string (§5.4)") + + extensions = manifest.get("extensions") + if extensions is not None: + if not isinstance(extensions, dict): + # Non-fatal: the client reports and ignores it (§8.1). + report.fail( + where, + "extensions must be an object keyed by client extension namespace (§8.1).", + ) + else: + for namespace, value in extensions.items(): + if not isinstance(value, dict): + report.fail( + where, + f"extensions[{namespace!r}] must be an object (§8.1).", + ) + elif not _looks_like_namespace(namespace): + report.note( + f"extensions key {namespace!r} is not a reverse-domain " + f"namespace (§8 suggests a domain the client controls)." + ) + + return manifest + + +def _looks_like_namespace(namespace: str) -> bool: + return bool(re.match(r"^[a-z0-9]+(?:\.[a-z0-9-]+)+$", namespace)) + + +# --- mcp.json (§7.2) ------------------------------------------------------- + + +def check_mcp_manifest(root: Path, plugin: dict | None, report: Report) -> None: + path = root / "mcp.json" + where = "mcp.json" + if not path.is_file(): + return + + doc = load_json(path, report, where) + if doc is None: + return + if not isinstance(doc, dict): + report.fail(where, f"must be a top-level JSON object, got {type(doc).__name__}") + return + + unknown = sorted(set(doc) - MCP_TOP_LEVEL) + if unknown: + report.fail( + where, + f"unknown top-level field(s) {unknown}; mcp.json allows only " + f"{sorted(MCP_TOP_LEVEL)} and an invalid document disables MCP for " + f"the whole plugin (§7.2.1, §7.2.2).", + ) + missing = sorted(MCP_REQUIRED - set(doc)) + if missing: + report.fail(where, f"missing required field(s) {missing} (§7.2.1)") + return + + if doc["$schema"] != MCP_SCHEMA: + report.fail( + where, + f"$schema is {doc['$schema']!r}, expected {MCP_SCHEMA!r} (§7.2.1).", + ) + + # §10.1: the mcp.json version must match the version plugin.json declares. + if plugin is not None: + p_schema = plugin.get("$schema") + m_schema = doc["$schema"] + if isinstance(p_schema, str) and isinstance(m_schema, str): + p_version = p_schema.rsplit("/", 2)[-2] + m_version = m_schema.rsplit("/", 2)[-2] + if p_version != m_version: + report.fail( + where, + f"targets Agent Plugins {m_version} but plugin.json targets " + f"{p_version}; a mismatch invalidates this document (§10.1).", + ) + + servers = doc["mcpServers"] + if not isinstance(servers, dict): + report.fail(where, f"mcpServers must be an object, got {type(servers).__name__}") + return + + for server_name, entry in servers.items(): + check_server_entry(f"{where} mcpServers[{server_name!r}]", entry, root, report) + + +def check_server_entry(where: str, entry, root: Path, report: Report) -> None: + if not isinstance(entry, dict): + report.fail(where, f"must be an object, got {type(entry).__name__}") + return + + kind = entry.get("type") + if kind is None: + report.fail( + where, + "missing required `type`; each server entry MUST match exactly one " + "closed transport variant (§7.2.1).", + ) + return + + if kind == "stdio": + allowed, required = STDIO_FIELDS, {"type", "command"} + elif kind in ("streamable-http", "sse"): + allowed, required = REMOTE_FIELDS, {"type", "url"} + else: + report.fail( + where, + f"unknown type {kind!r}; valid values are 'stdio', " + f"'streamable-http', 'sse' (§7.2.1).", + ) + return + + extra = sorted(set(entry) - allowed) + if extra: + report.fail( + where, + f"unknown field(s) {extra} for the {kind!r} variant; the variant is " + f"closed, so this makes the entry invalid (§7.2.1).", + ) + missing = sorted(required - set(entry)) + if missing: + report.fail(where, f"missing required field(s) {missing} for {kind!r} (§7.2.1)") + return + + if kind == "stdio": + _check_stdio(where, entry, root, report) + else: + _check_remote(where, entry, report) + + +def _check_stdio(where: str, entry: dict, root: Path, report: Report) -> None: + command = entry["command"] + if not isinstance(command, str) or not command: + report.fail(where, "command must be a non-empty string (§7.2.1)") + elif " " in command.strip(): + report.fail( + where, + f"command {command!r} must be a single executable token, not a shell " + f"command string (§7.2.1).", + ) + elif command.startswith("./"): + target = (root / command).resolve() + try: + target.relative_to(root.resolve()) + except ValueError: + report.fail( + where, + f"command {command!r} escapes the plugin root (§4.1).", + ) + + args = entry.get("args") + if args is not None and ( + not isinstance(args, list) or not all(isinstance(a, str) for a in args) + ): + report.fail(where, "args must be an array of strings (§7.2.1)") + + env = entry.get("env") + if env is not None: + if not isinstance(env, dict): + report.fail(where, "env must be an object of strings (§7.2.1)") + else: + reserved = sorted(set(env) & RESERVED_ENV) + if reserved: + report.fail( + where, + f"env declares reserved variable(s) {reserved}; a plugin MUST NOT " + f"override them and the entry is invalid (§9.2).", + ) + for key, value in env.items(): + if not isinstance(value, str): + report.fail(where, f"env[{key!r}] must be a string (§9.2)") + + cwd = entry.get("cwd") + if cwd is not None: + if not isinstance(cwd, str): + report.fail(where, "cwd must be a string (§7.2.1)") + elif not CWD_PATTERN.match(cwd): + report.fail( + where, + f"cwd {cwd!r} must be plugin-relative (starting with './') or rooted " + f"at ${{PLUGIN_ROOT}} / ${{PLUGIN_DATA}} (§7.2.1).", + ) + elif cwd.startswith("./"): + target = (root / cwd).resolve() + try: + target.relative_to(root.resolve()) + except ValueError: + report.fail(where, f"cwd {cwd!r} escapes the plugin root (§4.1)") + + +def _check_remote(where: str, entry: dict, report: Report) -> None: + url = entry["url"] + if not isinstance(url, str) or not url: + report.fail(where, "url must be a non-empty string (§7.2.1)") + return + if "${" in url: + report.fail( + where, + f"url {url!r} must not contain placeholders; clients MUST NOT perform " + f"placeholder or environment-variable expansion in url (§7.2.1).", + ) + if not url.startswith(("http://", "https://")): + report.fail(where, f"url {url!r} must be an absolute HTTP or HTTPS URL (§7.2.1)") + elif "#" in url: + report.fail(where, f"url {url!r} must not contain a fragment (§7.2.1)") + + headers = entry.get("headers") + if headers is not None: + if not isinstance(headers, dict): + report.fail(where, "headers must be an object of strings (§7.2.1)") + else: + seen: dict[str, str] = {} + for key in headers: + if not isinstance(key, str): + report.fail(where, f"header name {key!r} must be a string (§7.2.1)") + continue + lowered = key.lower() + if lowered in seen: + report.fail( + where, + f"header {key!r} duplicates {seen[lowered]!r} under different " + f"casing; header names are case-insensitive (§7.2.1).", + ) + seen[lowered] = key + if "${" in key: + report.fail( + where, + f"header name {key!r} must not contain placeholders (§7.2.1).", + ) + for key, value in headers.items(): + if not isinstance(value, str): + report.fail(where, f"header {key!r} value must be a string (§7.2.1)") + elif "${" in value: + report.fail( + where, + f"header {key!r} value must not contain placeholders; header " + f"values are literal visible package data (§7.2.1).", + ) + + +# --- skills/ (§6.1, §7.1) -------------------------------------------------- + +FRONTMATTER_NAME_RE = re.compile(r"^(?!.*(?:--|\.\.))[a-z0-9](?:[a-z0-9.-]*[a-z0-9])?$") + + +def check_skills(root: Path, report: Report) -> tuple[int, list[str]]: + where = "skills/" + skills_dir = root / "skills" + if not skills_dir.exists(): + # §6.2: a missing fixed location is not an error. + return 0, [] + if not skills_dir.is_dir(): + report.fail( + where, + "exists but is not a directory; the skills component type is invalid " + "without affecting other component types (§6.2).", + ) + return 0, [] + + discovered: list[str] = [] + for child in sorted(skills_dir.iterdir()): + if not child.is_dir(): + # Stray files are not skills; §7.1 only looks at immediate child dirs. + report.note(f"skills/{child.name} is a file, not a skill directory") + continue + skill_md = child / "SKILL.md" + if not skill_md.is_file(): + report.note(f"skills/{child.name}/ has no SKILL.md and is not a skill") + continue + discovered.append(child.name) + check_skill_md(f"skills/{child.name}/SKILL.md", child, skill_md, report) + return len(discovered), discovered + + +def check_skill_md(where: str, skill_dir: Path, path: Path, report: Report) -> None: + text = path.read_text(encoding="utf-8", errors="replace") + if not text.startswith("---"): + report.fail(where, "missing YAML frontmatter; required by the Agent Skills spec (§7.1)") + return + end = text.find("\n---", 3) + if end == -1: + report.fail(where, "unterminated YAML frontmatter") + return + + fields: dict[str, str] = {} + for line in text[3:end].splitlines(): + match = re.match(r"^([A-Za-z_-]+):\s*(.*)$", line) + if match: + fields[match.group(1)] = match.group(2).strip().strip('"').strip("'") + + name = fields.get("name", "") + if not name: + report.fail(where, "frontmatter is missing `name`") + else: + if not FRONTMATTER_NAME_RE.match(name): + report.fail(where, f"frontmatter name {name!r} is not a valid skill identifier") + if name != skill_dir.name: + report.fail( + where, + f"frontmatter name {name!r} does not match its directory " + f"{skill_dir.name!r}; discovery is by directory (§7.1).", + ) + if not fields.get("description"): + report.fail(where, "frontmatter is missing `description`") + + +# --- client extension directories (§8.2) ---------------------------------- + + +def _content_files(directory: Path) -> dict[str, Path]: + """Map relative path -> file for every real content file under `directory`.""" + found: dict[str, Path] = {} + if not directory.is_dir(): + return found + for path in directory.rglob("*"): + if not path.is_file(): + continue + if any(part in _IGNORED_PARTS for part in path.parts): + continue + if path.suffix in _IGNORED_SUFFIXES: + continue + found[str(path.relative_to(directory))] = path + return found + + +def check_client_extensions(root: Path, report: Report) -> None: + for namespace, sources in CLIENT_EXTENSION_MIRRORS.items(): + namespace_dir = root / namespace + if not namespace_dir.exists(): + continue + if not namespace_dir.is_dir(): + report.fail( + namespace, + "exists but is not a directory; an extension directory is a " + "top-level directory named exactly the namespace (§8.2).", + ) + continue + if not _looks_like_namespace(namespace): + report.fail( + namespace, + "is not a reverse-domain namespace (§8 suggests a domain the " + "owning client controls).", + ) + + for source in sources: + mirror = namespace_dir / source + source_dir = root / source + mirrored = _content_files(mirror) + original = _content_files(source_dir) + + if mirrored and not original: + report.fail( + f"{namespace}/{source}", + f"mirrors a root `{source}/` that no longer exists; remove the " + f"stale extension directory (§8.2).", + ) + continue + + for relative in sorted(set(original) - set(mirrored)): + report.fail( + f"{namespace}/{source}/{relative}", + f"is missing from the client extension mirror of `{source}/`; " + f"re-run scripts/add_client_extensions.py (§8.2).", + ) + for relative in sorted(set(mirrored) - set(original)): + report.fail( + f"{namespace}/{source}/{relative}", + f"has no counterpart in the root `{source}/`; remove the stale " + f"mirror (§8.2).", + ) + for relative in sorted(set(mirrored) & set(original)): + if mirrored[relative].read_bytes() != original[relative].read_bytes(): + report.fail( + f"{namespace}/{source}/{relative}", + f"has drifted from the root `{source}/` copy; re-run " + f"scripts/add_client_extensions.py (§8.2).", + ) + + if mirrored: + report.note( + f"{namespace}/{source}/ mirrors {len(mirrored)} file(s) from " + f"the root {source}/" + ) + + +# --- parity with the client compatibility manifest ------------------------- + + +def check_parity(root: Path, plugin: dict | None, report: Report) -> None: + compat = root / ".codex-plugin" / "plugin.json" + if plugin is None or not compat.is_file(): + return + where = ".codex-plugin/plugin.json" + other = load_json(compat, report, where) + if not isinstance(other, dict): + return + + for field in IDENTITY_FIELDS: + if field in other and plugin.get(field) != other[field]: + report.fail( + where, + f"{field} disagrees with the portable manifest " + f"({other[field]!r} vs {plugin.get(field)!r}); the two manifests must " + f"describe one plugin.", + ) + + def base(value): + return value.split("+", 1)[0] if isinstance(value, str) else value + + if "version" in other and base(plugin.get("version")) != base(other["version"]): + report.fail( + where, + f"version {other['version']!r} does not share the portable base version " + f"{plugin.get('version')!r}.", + ) + + interface = other.get("interface") + if isinstance(interface, dict): + extensions = plugin.get("extensions") + carried = extensions.get("com.openai", {}).get("interface") if isinstance(extensions, dict) else None + if carried is None: + report.fail( + where, + "declares an `interface` block that the portable manifest does not " + "carry under extensions['com.openai'] (§8).", + ) + elif carried != interface: + report.fail( + where, + "the `interface` block has drifted from " + "extensions['com.openai']['interface'].", + ) + + +# --- entry point ----------------------------------------------------------- + + +def validate(root: Path) -> Report: + report = Report() + if not root.is_dir(): + report.fail("root", f"{root} is not a directory") + return report + plugin = check_plugin_manifest(root, report) + check_mcp_manifest(root, plugin, report) + count, _ = check_skills(root, report) + if count: + report.note(f"{count} skill(s) discovered under skills/") + check_client_extensions(root, report) + check_parity(root, plugin, report) + if (root / ".mcp.json").is_file() and not (root / "mcp.json").is_file(): + report.note( + "`.mcp.json` is present but `mcp.json` is not; Agent Plugins reads only " + "`mcp.json` at the plugin root, so these MCP servers are invisible to a " + "conformant client (§6.1, §7.2.1)." + ) + return report + + +def main(argv: list[str]) -> int: + parser = argparse.ArgumentParser(description=__doc__.splitlines()[0]) + parser.add_argument( + "--root", + type=Path, + default=Path(__file__).resolve().parent.parent, + help="plugin package root (default: the repository containing this script)", + ) + parser.add_argument("--json", action="store_true", help="emit a machine-readable report") + args = parser.parse_args(argv) + + report = validate(args.root.resolve()) + + if args.json: + json.dump( + { + "root": str(args.root.resolve()), + "ok": not report.errors, + "errors": report.errors, + "notes": report.notes, + }, + sys.stdout, + indent=2, + ensure_ascii=False, + ) + sys.stdout.write("\n") + return 1 if report.errors else 0 + + print(f"Agent Plugins v1.0.0 validation: {args.root.resolve()}") + for note in report.notes: + print(f" note {note}") + for error in report.errors: + print(f" FAIL {error}") + if report.errors: + print(f"\n{len(report.errors)} problem(s) found.") + return 1 + print("\nPASS - package conforms to Agent Plugins v1.0.0.") + return 0 + + +if __name__ == "__main__": + sys.exit(main(sys.argv[1:])) From 3d58b85c46f107aa38576d1e63f3053114d69528 Mon Sep 17 00:00:00 2001 From: loong10k <20489781+loong10k@users.noreply.github.com> Date: Tue, 29 Sep 2026 00:10:33 +0800 Subject: [PATCH 3/6] =?UTF-8?q?docs:=20=E5=B0=86=20Rust=20=E8=A7=84?= =?UTF-8?q?=E8=8C=83=E4=B8=8E=E8=AE=BE=E8=AE=A1=E8=BF=81=E7=A7=BB=E8=87=B3?= =?UTF-8?q?=20codeguard=20=E7=8B=AC=E7=AB=8B=E4=BB=93=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/rust-cli/README.md | 26 +- docs/rust-cli/architecture.zh-CN.md | 304 --- docs/rust-cli/command-architecture.zh-CN.md | 737 ------ .../rust-cli/coverage-and-acceptance.zh-CN.md | 174 -- .../false-positive-allowlist.zh-CN.md | 202 -- docs/rust-cli/legacy-delta-20260924.zh-CN.md | 17 - docs/rust-cli/legacy-v1-protocol-map.zh-CN.md | 32 - docs/rust-cli/project-initialization.zh-CN.md | 205 -- docs/rust-cli/remediation-workflow.zh-CN.md | 252 -- docs/rust-cli/static-check-catalog.zh-CN.md | 81 - docs/rust-cli/technical-design.zh-CN.md | 364 --- .../.openspec.yaml | 3 - .../introduce-rust-codeguard-cli/design.md | 85 - .../implementation-coverage.md | 324 --- .../introduce-rust-codeguard-cli/proposal.md | 49 - .../specs/binary-distribution/spec.md | 199 -- .../specs/execution-kernel/spec.md | 159 -- .../specs/hook-protocol/spec.md | 73 - .../specs/language-gate-commands/spec.md | 103 - .../specs/native-tool-adapters/spec.md | 600 ----- .../specs/project-initialization/spec.md | 137 -- .../specs/remediation-workflow/spec.md | 427 ---- .../specs/rulepack-governance/spec.md | 223 -- .../specs/scan-scope-policy/spec.md | 17 - .../specs/unified-cli-contract/spec.md | 295 --- .../specs/verdict-integrity/spec.md | 57 - .../introduce-rust-codeguard-cli/tasks.md | 975 -------- .../verification.md | 2041 ----------------- 28 files changed, 6 insertions(+), 8155 deletions(-) delete mode 100644 docs/rust-cli/architecture.zh-CN.md delete mode 100644 docs/rust-cli/command-architecture.zh-CN.md delete mode 100644 docs/rust-cli/coverage-and-acceptance.zh-CN.md delete mode 100644 docs/rust-cli/false-positive-allowlist.zh-CN.md delete mode 100644 docs/rust-cli/legacy-delta-20260924.zh-CN.md delete mode 100644 docs/rust-cli/legacy-v1-protocol-map.zh-CN.md delete mode 100644 docs/rust-cli/project-initialization.zh-CN.md delete mode 100644 docs/rust-cli/remediation-workflow.zh-CN.md delete mode 100644 docs/rust-cli/static-check-catalog.zh-CN.md delete mode 100644 docs/rust-cli/technical-design.zh-CN.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/.openspec.yaml delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/design.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/proposal.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/tasks.md delete mode 100644 openspec/changes/introduce-rust-codeguard-cli/verification.md diff --git a/docs/rust-cli/README.md b/docs/rust-cli/README.md index 5e2fc9b..6573692 100644 --- a/docs/rust-cli/README.md +++ b/docs/rust-cli/README.md @@ -1,23 +1,9 @@ -# Codeguard Rust CLI 设计文档 +# Rust 文档已迁移 -状态:设计基线已完成,工程基线部分实施;原生检查、修复闭环和宿主验收尚未完成。日期:2026-09-24。原设计源码基线为 `03ebb24`,当前 HEAD `9e4adb1` 的增量见下表;后续实现仍须核对工作树和已合并规格。 +Rust CLI 的设计文档、进行中的 OpenSpec change、任务与验收记录已整体迁至独立 [codeguard 仓库](https://github.com/full-stack-plugins/codeguard)。本页仅作导航,不维护第二份 Rust 规范或任务。 -| 文档 | 回答的问题 | -|---|---| -| [架构文档](architecture.zh-CN.md) | 产品目标、模块边界、检查流程、低误报机制、权威边界 | -| [技术方案](technical-design.zh-CN.md) | 命令、数据协议、适配器、执行器、配置、缓存、分发与兼容实现 | -| [逐指令架构设计](command-architecture.zh-CN.md) | 36 项命令入口的作用、价值、输入输出、副作用、退出语义、协作流程与验收 | -| [静态检测目录](static-check-catalog.zh-CN.md) | Javadoc、依赖治理、CVE 和其他 28 个检测族的义务与证据边界 | -| [语言迁移与验收](coverage-and-acceptance.zh-CN.md) | 57 个条目的迁移、类别覆盖、评测方法、验收证据 | -| [最新旧实现增量核对](legacy-delta-20260924.zh-CN.md) | 原设计基线到当前 HEAD 的源码差异、兼容/纠偏归类与回归样本 | -| [持久问题与修复工作流](remediation-workflow.zh-CN.md) | 项目内 codeguard 目录、问题记录、待办任务、智能体修复与复检闭环 | -| [项目初始化与 AGENTS.md 接入](project-initialization.zh-CN.md) | 项目画像、版本/构建器/架构/模块图、受管摘要与检查准备 | -| [误报白名单设计](false-positive-allowlist.zh-CN.md) | 精确匹配、可信审批、过期重审、任务流与带例外交付语义 | -| [OpenSpec proposal](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md) | 为什么变更及变更范围 | -| [OpenSpec design](../../openspec/changes/introduce-rust-codeguard-cli/design.md) | 架构决策、兼容性、实施顺序和待验证事项 | -| [OpenSpec tasks](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md) | 可执行任务、依赖和完成证据 | -| [实施覆盖索引](../../openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md) | 设计、逐条规格、36项命令、57个语言、平台/宿主到实施任务的双向追踪 | +- [中英文架构与技术方案](https://github.com/full-stack-plugins/codeguard/tree/main/docs) +- [逐指令、初始化、修复闭环、白名单与迁移设计](https://github.com/full-stack-plugins/codeguard/blob/main/docs/README.zh_CN.md) +- [唯一 OpenSpec change 与任务](https://github.com/full-stack-plugins/codeguard/tree/main/openspec/changes/introduce-rust-codeguard-cli) -本次需求的唯一规范性事实源为 `openspec/changes/introduce-rust-codeguard-cli/specs/`。这些说明文档展开设计,不创建第二套任务状态。仓库 `openspec/specs/` 与 [当前架构](../current-architecture.md) 仍描述已落地的旧运行时;新 Rust 工程基线不能被宣称为扫描器或宿主行为已经生效。 - -本次验收记录见 [verification.md](../../openspec/changes/introduce-rust-codeguard-cli/verification.md)。文档校验成功不代表二进制、扫描器或宿主运行验收成功。 +本插件的旧运行时及宿主规范仍在本仓 `openspec/specs/`;Rust 集成接口在新仓维护,宿主实际接线仍由本插件实现和验收。迁移于 2026-09-28 在本地完成;远程链接须随两仓后续提交推送生效。 diff --git a/docs/rust-cli/architecture.zh-CN.md b/docs/rust-cli/architecture.zh-CN.md deleted file mode 100644 index 89eaba7..0000000 --- a/docs/rust-cli/architecture.zh-CN.md +++ /dev/null @@ -1,304 +0,0 @@ -# Codeguard Rust CLI 架构设计 - -本方案把 Codeguard 恢复为传统静态工具驱动的多语言代码质量守卫。统一入口是 Rust 二进制 `codeguard`,智能体负责调用、解释和修复,检查事实来自工具,门禁要求来自受控策略。 - -状态:工程基线部分实施,原生检查与交付闭环待实现。规范性要求见 [OpenSpec change](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md)。实现细节见 [技术方案](technical-design.zh-CN.md),能力与测试见 [迁移验收](coverage-and-acceptance.zh-CN.md)。 - -每条命令的职责、价值、输入输出、状态与副作用、失败恢复、应用服务映射见 [逐指令架构设计](command-architecture.zh-CN.md)。命令分为发现准备、质量检查、交付门禁、持久修复、宿主协议入口;共享检查内核和证据模型,不按命令复制实现。 - -项目内新增 `./.codeguard/` 持久工作区,保存脱敏问题、任务和修复事件;本地报告、日志、缓存默认 Git 忽略。智能体以 `next` 获取可推进任务,以 `task verify` 完成真实复检。完整设计见 [修复工作流](remediation-workflow.zh-CN.md)。 - -## 1. 产品目标与不可变约束 - -1. 对已支持语言识别 lint、注释规范、依赖/CVE、安全规范及构建检查的项目配置;已配置且可适配的检查器调用原生能力,其他候选项说明缺失、无效或未知状态。只有批准策略要求的缺项影响交付门禁。 -2. 优先复用语言生态的成熟工具和项目配置。Rust 统一编排与证据,不重新实现各语言编译器和静态分析器。 -3. 低误报来自准确的工具版本、规则、语言方言、构建上下文和报告解析。不能靠关闭规则、减少检查范围或默认忽略旧问题改善数字。 -4. 代码违规与执行故障分别呈现;必需检查未完成时交付门禁不通过。 -5. AI 无权自行降低质量要求。修代码、修适配器、修工具配置的过程均留下可复核的变化与复检证据。 -6. 一次检查结论绑定实际内容、有效配置、工具与规则版本。不能借用工作树的通过替代 index 或待推送内容。 -7. 单语言、单类别命令的通过只代表该请求完成;全项目交付需要完整 contract 的证据。 - -“所有语言”是可扩展的适配器体系和明确的覆盖承诺,不是任何文件后缀都会自动拥有完整分析器。当前 57 个注册条目是迁移输入;对于没有可用检查器的类别,必须报告缺口,不能生成空适配器充数。 - -## 2. 当前实现证据与设计纠偏 - -以下为 `03ebb24` 的静态观察,不是对当前误报率的统计,也不替代实机复现。 - -| 当前证据 | 影响 | 新设计 | -|---|---|---| -| [入口](../../bin/codeguard) 是 Bash 转发 Python;语言、CVE、Dockerfile 有不同协议 | 调用方容易把不同退出码当成相同状态 | Rust 统一报告;旧数字经版本化兼容层映射 | -| [verdict.py](../../scripts/codeguard/verdict.py) 有通用 rc=1/cargo=101 和环境文本归类 | 进程失败与工具发现仍可能混淆 | 每个工具版本具有专用结果契约,不在通用执行器判断违规 | -| [gate_checks.py](../../scripts/codeguard/gate_checks.py) 在最多 50 个文件时走 delta,并调用基线豁免 | 性能分支改变语义,历史发现可消失 | 全部必需义务保持不变;分批、缓存、基线只优化或分类 | -| [hook-protocol](../../openspec/specs/hook-protocol/spec.md) 规定 fail-open 与 skipGate | 未完成检查可能不阻止交付动作 | 迁移后交付入口要求完整;普通保存反馈仍不冒充交付门禁 | -| [语言表](../../scripts/languages.json) 有 54 stable、3 planned,Julia/Pascal 的 lint 为空 | 语言标签不能证明真实检测能力 | 按语言 × 类别 × 工具 × 平台验收 | -| [本地规则文件](../../linters/checkstyle/p3c-javadoc-enforced.xml) 是 Checkstyle XML | 文件名不能证明已执行官方 P3C | 官方 P3C/PMD 与 Checkstyle/Javadoc 分开建模与取证 | -| [执行内核](../../scripts/codeguard/execution.py)、Git 快照、Java 影响分析已有专门模块 | 有价值的行为与回归样本可迁移 | 迁移证据和正确性约束,不逐行翻译全部历史策略 | - -旧版本的 fail-open、默认 delta、基线豁免是本次明确要改变的行为;不能用“兼容旧行为”把它们重新带入新门禁。兼容层只在显式旧协议范围内存在,并标明不能提供新交付认证。 - -## 3. 系统边界 - -```mermaid -flowchart TB - Human[开发者 / 质量策略负责人] --> Policy[受控质量策略与规则锁] - Agent[AI 编程智能体] --> Plugin[codeguard-plugin 宿主薄入口] - Skills[codeguard-skills 调用与修复指南] --> Agent - Plugin --> CLI[codeguard 原生二进制] - Terminal[终端 / 编辑器] --> CLI - CI[受保护 CI / Git 接入] --> CLI - Policy --> CLI - CLI --> Tools[语言原生 lint / 文档 / 安全 / CVE / 构建工具] - Tools --> Report[原始证据 + 标准报告 + 覆盖账本] - Report --> Gate[完整性与违规门禁] - Gate --> Agent - Gate --> CI -``` - -| 交付物 | 所有权 | 不承担的职责 | -|---|---|---| -| `codeguard-cli` | Rust 内核、适配器、rulepack、schema、二进制发布 | 宿主专用提示词和市场目录 | -| `codeguard-plugin` | 三宿主入口、hook 事件映射、运行时版本/摘要绑定 | 复制检查逻辑、另写 verdict、默默 fallback | -| `codeguard-skills` | 使用、诊断、修复步骤的技能事实源 | 生成比工具证据更高优先级的门禁结论 | -| 项目/组织策略 | 规则、适用性、阈值、豁免审批、受保护 CI | 依赖智能体自觉执行作为唯一约束 | - -现有受管技能仍从独立技能仓经 lock/vendor 同步;不直接修改本插件受管副本。新 Rust 仓的远程地址、发布签名身份及平台 ABI 在实施任务中确定,本次不虚构已有仓库或二进制。 - -## 4. Rust workspace 与依赖方向 - -```text -codeguard-cli/ -├── Cargo.toml -├── crates/ -│ ├── codeguard-cli/ -│ ├── codeguard-core/ -│ ├── codeguard-runtime/ -│ └── codeguard-adapters/ -├── rulepacks/ -├── schemas/ -└── tests/ - ├── fixtures/ - ├── integration/ - └── acceptance/ -``` - -仓库、crate 目录和 Cargo package 使用上面的 kebab-case;模块与 `.rs` 文件使用 snake_case;类型使用 PascalCase;二进制名 `codeguard`。一类主要职责一个文件,`mod.rs` 只组织和重导出;不以 `compat.rs` 堆积领域对象,不提交 `todo!()` 适配器作为完成项。新原生实现没有 Java 对应物时,中文 doc 注释说明用途,不伪造 Java 来源。 - -```mermaid -flowchart LR - CLI[codeguard-cli] --> Core[codeguard-core] - CLI --> Runtime[codeguard-runtime] - CLI --> Adapters[codeguard-adapters] - Runtime --> Core - Adapters --> Core -``` - -这是编译依赖图,不是进程调用图。禁止 core 导入 runtime/adapters/宿主 SDK;禁止 adapters 导入 runtime。core 定义 `ExecutionPort`、`SnapshotPort`、`EvidenceStore` 等接口,runtime 实现;CLI 组合运行时与适配器并调用 core 的协调服务。 - -| crate | 主要模块 | 关键责任 | -|---|---|---| -| cli | args、commands、render、mcp、compat | 参数、入口协议、stdout/stderr、终端报告、退出码映射 | -| core | model、policy、planning、coverage、gate、remediation、ports | 检查义务、任务 DAG、结果聚合、覆盖证明、问题生命周期与修复任务;尽量纯函数 | -| runtime | process、snapshot、toolchain、cache、storage、workspace、telemetry | 操作系统进程、Git/文件观察、工具解析、有界资源、持久记录与租约 | -| adapters | java、rust、python、node、shell、… | 专用工具探测、计划、报告解析、覆盖核对、修复计划 | - -初版采用编译期适配器注册。任意脚本、动态库插件或远程规则执行不是默认扩展入口,避免将字符串命令表原样升级为新的执行系统。 - -## 5. 项目持久工作区与修复闭环 - -在被检查项目根目录使用 `./.codeguard/` 作为持久修复工作区。它记录发现、环境阻塞、待处理任务与复检证据,支持智能体恢复上下文并持续推进修复。此布局与前述 `codeguard-cli/` Rust 源码仓布局分别承担项目数据和工具开发职责。 - -### 5.1 已确认的目录 - -```text -.codeguard/ -├── .gitignore -├── README.md -├── workspace.json -├── findings/ # 脱敏问题、环境阻塞及历史事件 -├── tasks/ # 可读的修复任务 -├── decisions/ # 经批准的决策引用 -├── reports/ # 以下本地数据默认不入 Git -├── runs/ -├── cache/ -├── worktrees/ -└── state/ -``` - -目录内 `.gitignore` 默认包含: - -```gitignore -/reports/ -/runs/ -/cache/ -/worktrees/ -/state/ -``` - -脱敏后的问题、任务与决策引用可随项目进入 Git,便于审查和交接;原始报告、日志、缓存、临时副本和租约状态保留在本地。`workspace.json` 描述工作区身份、schema 和受管路径,质量要求仍由已有配置入口及可信策略提供。完整记录结构、隐私和并发规则见 [持久问题与修复工作流](remediation-workflow.zh-CN.md)。 - -### 5.2 已确认的核心流程 - -```mermaid -flowchart LR - A[原生工具检查] --> B[归并问题与环境阻塞] - B --> C[生成修复任务] - C --> D[智能体获取下一步] - D --> E[修复代码或环境] - E --> F[原工具复检] - F -->|解决| G[记录证据并关闭] - F -->|仍存在| C - F -->|重复无进展| H[保留问题并提出具体决策] - G --> I[完整交付检查] -``` - -每张任务必须包含:**问题证据、规则依据、允许修改的范围、修复步骤、复检命令、历史尝试和关闭条件**。缺 JDK、工具版本不兼容或漏洞库不可用等情况生成环境修复任务,并关联依赖它的检查义务,指导智能体先恢复检查条件。 - -目标命令流程如下;除版本和能力清单查询外,当前仍待实现: - -```bash -codeguard init . --apply -codeguard check all . -codeguard work sync . -codeguard next . --format json -# 按任务修复 -codeguard task verify CG-abc123 . -``` - -上述命令展示显式调用路径。项目初始化并启用插件工作流后,插件自动串起检查、幂等同步和修复指引;普通独立 CLI 检查仍可由用户显式执行 `work sync`。 - -### 5.3 修复闭环的固定约束 - -- **同一问题只保留一个稳定任务**:重复扫描归并证据,避免生成重复待办;同一根因可形成任务组,逐项保留发现和关闭条件。 -- **任务勾选不等于修复完成**:必须由原工具在有效规则及匹配范围下复检,才能确认代码或环境已修复;问题复发时重开,历史保留。 -- **失败尝试也要记录**:包括复检前失败、没有修改和中断。无进展达到预算后停止重复动作,给出具体诊断或决策需求,门禁要求保持不变。 -- **启用后插件自动串起检查、同步、修复指引**:智能体通过任务获取下一步;同步失败保留原检查结果并说明恢复动作,不能假称任务已经生成。 -- **任务清空不影响门禁**:完整交付仍由源码、有效策略和原生检查证据决定;原有 `codeguard/src/` 等非点目录用户源码照常检查,`.codeguard/` 中自有记录仍接受入库安全检查。 - -任务关闭只证明对应问题已按其关闭条件处理,完整交付检查仍须覆盖全部适用必需义务。经批准的政策处置或例外须单独归因,不能伪称代码已经修复。 - -### 5.4 init:项目画像与智能体接入 - -`codeguard init` 负责识别项目、建立检查前置条件清单,并把可追溯的项目摘要写入被检查项目 `AGENTS.md` 的 Codeguard 受管区块。初始化必须覆盖: - -| 维度 | 记录内容 | -|---|---| -| 边界与技术栈 | 项目/构建根、语言与方言、框架;产品版本、语言目标、已解析版本、本机版本分开 | -| 构建体系 | 构建器、wrapper、包管理器、锁文件、profiles/features/targets、源码与测试源集 | -| 架构与模块 | 分层、领域组织、部署单元、构建/源码/外部依赖关系;每项带依据和完整性 | -| 质量与验证 | 已有 lint/注释/安全/CVE 配置、规则来源、测试与构建命令、实际验证状态 | -| 准备与协作 | 缺失工具/环境、既有 AGENTS/子目录约束、规格体系、已有图索引及后续准备任务 | - -MVC、DDD 等按不同架构维度描述,可以并存。目录名只能提供线索,推断必须标注待确认;构建聚合、源码引用和运行时关系不能混成一种依赖。未证明完整的图不能用来缩小检查范围。 - -工作区补充 `.codeguard/project.json`、`.codeguard/module-graph.json` 和 `.codeguard/architecture.md`,分别保存结构化画像、关系及可读投影;`workspace.json` 只引用它们。AGENTS 保持简明,链接详情,保留既有人工内容和其它工具区块。被生成的画像是观察结果,不能自动成为新的规则权威。 - -init 默认 dry-run,`--apply` 写入预览中的受管文件与 AGENTS 区块。实际工具探测、安装、构建、服务启动、Hook/CI 接入分别列为后续动作,不隐式执行。重复初始化按输入身份刷新画像并保留问题历史;初始化成功与质量门禁通过分开报告。 - -完整内容、AGENTS 区块模板、版本来源与验收场景见 [项目初始化设计](project-initialization.zh-CN.md)。 - -## 6. 一次检查的完整路径 - -```mermaid -flowchart TD - Request[解析请求与入口协议] --> Resolve[定位项目与输入内容身份] - Resolve --> Contract[解析可信策略和全部必需义务] - Contract --> Discover[发现语言 / 模块 / 依赖清单 / 工具配置] - Discover --> Plan[适配器生成有依赖关系的计划] - Plan --> Ready{前置条件可验证?} - Ready -- 否 --> Incomplete[记录未完成原因与恢复动作] - Ready -- 是 --> Run[复用有效缓存或执行原生工具] - Run --> Parse[工具专用解析器保留全部有效发现] - Parse --> Coverage[核对目标覆盖 / 配置 / 输入身份] - Incomplete --> Gate[门禁聚合] - Coverage --> Gate - Gate --> Output[JSON / 人类报告 / SARIF 与私有证据] -``` - -解析、规划、执行、报告各阶段都可失败;失败必须产生具体原因及未完成义务。某个检查失败不抹掉其他已确认发现。可独立执行的任务继续;依赖失败的任务标为依赖未满足,不能被删掉。 - -`check all` 建立项目全部适用类别的义务;`lint java` 只选择 Java lint。项目没有使用某语言与某语言检查器缺失是不同事实,后者不能伪装成不适用。 - -## 7. 结果与门禁的分离 - -单个检查结果至少包含三个维度: - -- 执行完整性:`complete / incomplete / not_applicable`。 -- 发现:零条或多条带规则、位置、工具证据的 finding;不随执行失败清空。 -- 门禁影响:由有效策略判定,而不是工具退出码或模型的主观置信度决定。 - -```mermaid -flowchart LR - C[完整性] --> G[交付判定] - F[已确认违规] --> G - P[有效质量策略] --> G - G --> A[满足全部义务: allow] - G --> B[存在阻断违规: deny] - G --> I[必需义务未完成: incomplete] -``` - -`incomplete` 与 `deny` 都不满足交付要求,但反馈不同:前者修工具链、配置或证据,后者修代码或依赖。混合情况报告全部发现,顶层优先显示未完成,不能暗示“只是工具故障,没有问题”。 - -注释检查不能被格式化检查替代;`cargo fmt --check` 不等于 `clippy`;CVE 扫描不等于源代码安全检查;Maven `verify` 成功不证明未绑定的 P3C/Checkstyle/Javadoc 已执行。Maven 生命周期通过插件绑定具体目标,必须验证实际执行项。[Maven 官方生命周期说明](https://maven.apache.org/guides/introduction/introduction-to-the-lifecycle.html) - -## 8. 低误报机制 - -| 误报来源 | 工程控制 | 必需证据 | -|---|---|---| -| Java/Python/SQL/Shell 方言和版本错误 | 读取项目目标版本及构建上下文,验证工具支持矩阵 | 解析依据、工具版本、命令与配置摘要 | -| 工具自身崩溃被当成代码问题 | 工具专用退出码与结构化报告契约 | 原始 rc、故障类型、有效报告片段 | -| 风格默认值与项目约定冲突 | 显式选择版本化 rulepack,解释规则来源 | effective config、规则差异及策略权威 | -| 子模块、生成代码、依赖目录误入 | 模块图、源集、批准排除与覆盖核对 | 义务清单、排除理由、扫描目标集合 | -| 重复或历史发现误处理 | 按稳定规则/位置/内容去重,基线只标 new/existing | 不消失的原始发现及归并映射 | -| CVE 包匹配或严重度不确定 | 真实解析依赖版本、来源与漏洞库元数据 | package identity、依赖路径、advisory、时间与摘要 | -| 正则对注释和安全语义误判 | 优先语言工具/AST 和可测试规则 | 正反例;无证据的语义猜测不成为确定违规 | - -无法确定的检测仍是待解决的覆盖或证据问题,不能通过“低置信度就删除”降低误报率。规则是否阻断由事先确认的策略决定,运行时不动态调低阈值。 - -可复现的原生工具误报可进入[精确白名单裁定](false-positive-allowlist.zh-CN.md):保留 finding,只对经独立批准且身份与期限匹配的那一条作处置;交付显示 `allow_with_exceptions`。未配置检查、工具故障和真实但被接受的风险分别处理,不能混入误报白名单。 - -注释的语法、公共 API 文档存在性、参数/返回值对应关系可用确定性工具检查;“注释是否真正解释业务动机”不能无证据宣称已验证。明确的中文注释要求可作为专用规则,但必须处理专有名词、代码片段、继承文档与生成代码,不能按单字符语言判断粗暴拦截。 - -## 9. 性能与正确性 - -Rust 可减少启动和编排开销,但总耗时通常受外部工具、构建和漏洞库影响;“性能最高”必须通过同范围、同规则、同缓存条件的测量验证。 - -性能手段是复用构建结果、任务 DAG、有界并发、精确缓存和合并相同扫描。增量执行必须证明未重跑义务的输入与配置没有变化,且适配器支持这种复用;证明不了就扩大扫描。文件数从 50 到 51 只能改变调度方式,不能改变问题是否阻断。 - -同一个 target/build 目录和不可并发工具使用资源锁。超时、输出上限、网络状态或缓存故障均不得变成 PASS。保存事件采用较短预算只提供反馈,交付入口使用完整预算;二者结果不能不加区分复用。 - -## 10. 权威与安全边界 - -```mermaid -sequenceDiagram - participant A as 智能体 - participant C as codeguard - participant P as 可信策略源 - participant T as 原生检查器 - participant G as 受保护 CI - A->>C: check all,绑定内容身份 - C->>P: 读取批准的规则与工具锁 - C->>T: 执行计划 - T-->>C: 原生报告与退出状态 - C-->>A: 发现 / 未完成原因 / 门禁状态 - A->>C: 修复代码后复检 - G->>C: 独立加载可信策略并检查待交付内容 - C-->>G: 可核对的最终证据 -``` - -不能从 agent 的“用户已经同意”文本、环境变量、Git config 或可修改的本地 JSON 得出政策授权。策略调整是独立、可审查的变更;合并后的可信修订才作为 CI 的有效版本。例外必须绑定规则、范围、内容身份、原因、批准身份和到期时间,保留原始违规与非通过检查状态;外部系统可记录“经批准例外交付”,不得显示普通 PASS。 - -CLI 与用户同权限,无法防止用户替换二进制、绕过本地 hook 或修改磁盘。完整约束依赖受保护的 CI、可信策略来源及受控状态检查。进程隔离快照不等于系统沙箱;运行项目构建脚本有实际执行能力。 - -受保护 CI 还必须隔离可信验证端与被测项目的执行区:项目脚本不能改写可信策略、工具锁、验证器或最终状态凭据。执行产物是待核验输入;可信端验证输入/规则/覆盖并独立签发结果,不能直接上传项目脚本生成的绿色收据。无法提供这种隔离的环境不宣传不可自降级保证。 - -## 11. 迁移原则 - -先固定契约与真实样本,再逐工具实现适配;先对照验证,再切换宿主;所有原 stable 条目都完成验收后,才宣布全量迁移。迁移对照必须区分“旧实现 bug 修正”和“新实现回归”,不能要求复制旧豁免结果。 - -保存、提示等反馈事件不承担完整交付认证。真正的 Git pre-commit/pre-push 和 CI 优先绑定真实输入;宿主 Shell 预测仅作有边界的前置检查,不重新建造完整 Shell 解释器。 - -现有点前缀忽略策略保持:普通扫描不检查、不逐文件报告点前缀路径;入库安全和配置发现例外不变。报告只记录生效策略及汇总覆盖,不把已排除路径重新变成告警。若未来要检测 `.github/workflows` 等内容,需要单独确认策略变更。 - -新增持久工作区按点前缀策略排除普通源码发现,生成器拥有的记录改由工作区 schema 与脱敏校验;这不构成入库安全豁免,拟提交记录仍须安全检查。非点目录 `codeguard/` 的用户源码不因同名而被排除。任务文件只是投影,删除任务、勾选完成或编辑历史都不能替代真实 gate。 - -所有实施任务和待验证项统一维护在 [tasks.md](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md)。 diff --git a/docs/rust-cli/command-architecture.zh-CN.md b/docs/rust-cli/command-architecture.zh-CN.md deleted file mode 100644 index 99ff7b2..0000000 --- a/docs/rust-cli/command-architecture.zh-CN.md +++ /dev/null @@ -1,737 +0,0 @@ -# Codeguard 命令架构:职责、价值与执行契约 - -状态:待实现设计,2026-09-24。本文逐项细化统一 Rust 二进制的目标命令,**不是当前 Python CLI 的使用手册**。规范事实源仍是 [现有 OpenSpec change](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md),不建立第二份实现任务清单。 - -读者是 CLI/适配器实现者、插件接入者和使用 Codeguard 修复项目的智能体。每条命令必须回答:为什么存在、选择什么对象、读写什么、输出什么证据、如何处理失败、下一步是什么。原生工具决定检查事实,批准策略决定检查义务,智能体依据证据修复。 - -## 1. 命令体系与协作路线 - -```mermaid -flowchart TB - Discover[detect / capabilities] --> Init[init:画像与工作入口] - Init --> Prepare[config / rules / tools / doctor] - Prepare --> Plan[plan:检查义务与执行计划] - Plan --> Scan[lint / comments / dependencies / cve / security / build] - Plan --> Check[check:完整类别编排] - Scan --> Runs[有身份的运行报告] - Check --> Runs - Runs --> Sync[work sync:持久化问题和阻塞] - Sync --> Read[status / next / task show] - Read --> Attempt[claim / attempt start] - Attempt --> Repair[fix 或智能体按简报修复] - Repair --> Finish[attempt finish] - Finish --> Verify[task verify:原工具复检] - Verify -->|仍存在或未完成| Read - Verify -->|证据确认解决| Delivery[check all / gate] - Delivery -->|满足全部义务| Done[交付证据] - Delivery -->|发现或未完成| Runs -``` - -这是流程协作图,不表示每条命令在内部自动执行所有后继命令。独立 CLI 的 `check` 保存报告,`work sync` 更新任务;已启用插件在一次工作流中串起保存、同步和简报。`fix --apply` 与 `task verify` 内含必要复检;两者不是不受控的无限修复循环。 - -### 1.1 命令目录 - -下表 C01–C36 是文档追踪编号,不是对外子命令。每项在后文有独立契约。 - -| ID | 入口 | 用户获得的价值 | -|---|---|---| -| C01 | `help` / `--help` | 查询确实支持的参数和行为,避免智能体猜命令 | -| C02 | `--version` | 确认实际二进制身份和协议兼容范围 | -| C03 | `detect` | 观察项目语言、构建根与版本来源 | -| C04 | `capabilities` | 了解此发行版能适配的检查器;项目是否配置由 doctor/check 探测 | -| C05 | `init` | 建立项目画像、AGENTS 入口及持久修复工作区 | -| C06 | `plan` | 在执行前看清检查义务、范围、工具和缺口 | -| C07 | `doctor` | 将工具链和环境故障定位成可恢复的前置问题 | -| C08 | `rules list` | 查清实际规则的依据、来源与适用性 | -| C09 | `config validate` | 验证配置结构、引用和策略一致性 | -| C10 | `config explain` | 解释每项生效配置为何生效以及来自哪里 | -| C11 | `tools list` | 查看工具库存与项目所需工具 | -| C12 | `tools verify` | 检验实际工具制品是否符合锁定身份 | -| C13 | `tools install` | 将精确锁定的工具安装到受管位置 | -| C14 | `lint` | 检查编码规范与适用的静态质量规则 | -| C15 | `comments` | 检查可确定验证的注释与文档契约 | -| C16 | `cve` | 检查目标依赖图中的已知漏洞 | -| C17 | `security` | 检查源码、配置、敏感内容及入库安全规则 | -| C18 | `build` | 验证编译、构建一致性及策略要求的测试等级 | -| C19 | `check` | 编排指定语言的全部适用质量类别 | -| C20 | `gate pre-commit` | 检查这次实际将提交的 index 内容 | -| C21 | `gate pre-push` | 检查本次所有实际推送 ref 的内容 | -| C22 | `gate ci` | 对明确的不可变交付内容执行可信完整门禁 | -| C23 | `work sync` | 将全部未导入报告归并成稳定问题和修复任务 | -| C24 | `status` | 显示准备、检查、任务与证据新鲜度的分离状态 | -| C25 | `next` | 返回一个可推进动作及完整修复简报 | -| C26 | `task show` | 查看某项任务的证据、允许范围和历史 | -| C27 | `task claim` | 在同工作区取得有期限的任务租约 | -| C28 | `task heartbeat` | 续租并证明执行者仍持有当前租约 | -| C29 | `task release` | 释放协作占用,保留问题和历史 | -| C30 | `task attempt start` | 在修改前登记一次可追溯修复尝试 | -| C31 | `task attempt finish` | 记录实际变化、失败或无进展,防止无穷重试 | -| C32 | `fix` | 执行有界原生修复并复检结果 | -| C33 | `task verify` | 用证据判断任务是否满足关闭条件 | -| C34 | `mcp serve` | 向智能体提供同一核心能力的结构化入口 | -| C35 | `compat legacy-v1` | 显式承接旧调用协议,隔离旧语义 | -| C36 | `dependencies` | 识别依赖检查配置,运行已配置工具并反馈结果 | - -### 1.2 容易混淆的边界 - -| 对比 | 职责区别 | -|---|---| -| detect / init | detect 返回观察结果;init 将画像、受管摘要和工作流配置形成可预览、可应用的产物 | -| capabilities / doctor / check | capabilities 回答发行版能适配什么;doctor 探测项目配置和工具条件;check 调用已配置工具并返回本次结果 | -| tools verify / doctor | 前者验证制品身份与兼容元数据;后者执行有界诊断,定位运行条件 | - -`doctor [path] [--ruff-tool ABS_PATH] [--timeout DURATION] [--format human|json]` 已接入局部配置与 Ruff 版本诊断。默认不选工具;显式 Ruff 才在私有临时 cwd/日志中以固定版本参数、清空环境和共享截止时间运行,单探测最多 10s。脚本入口缺隔离时启动前拒绝。成功仅 observed_untrusted,readiness unknown、交付 not_evaluated,不安装、不扫描或写工作区;报告 doctor_observation 0.1 明确 persistence=not_saved。其它工具、可信前置映射及正式 PrerequisiteReport 持久化/同步仍待完成。 - -当前已接入 `tools verify [path] [--tool-lock-candidate FILE] [--managed-cache ABS_PATH] [--runtime ID=ABS_PATH] [--format human|json]` 的静态候选核验:逐项反馈入口/运行时/目录包的摘要及可执行位状态、issue 和恢复方向,不启动或安装工具。锁来源未核验,固定 incomplete、readiness=unknown、gate_effect=none;匹配仅 matched_untrusted,锁声明版本不代表本机启动观察。完整可信工具库存、兼容元数据、doctor 原生诊断及准备报告接线尚未完成。 -| plan / check | plan 给出执行计划和未知项;check 执行计划并取得检查证据 | -| lint / build | 编码规范与编译构建分别有义务;构建成功不证明 P3C 等规则实际运行 | -| check / gate | check 默认冻结工作树;gate 冻结 index/ref/CI 指定内容,并执行交付上下文要求 | -| status / next / task show | 分别是全局概况、下一步选择、指定任务详情;都不自动领取或修复 | -| fix / task verify | fix 可以改源码并附带复检;verify 不改源码,只根据复检追加任务状态 | -| attempt finish / task verify | finish 记录尝试结束;只有符合证据条件的 verify/同步才能确认解决 | - -## 2. 统一命令协议 - -### 2.1 参数与选择范围 - -- `[path]` 默认当前目录;先解析指定项目与构建根,不擅自扩大到上层工作区。共享目标发现与既有点路径政策,入库安全和配置发现例外保持。 -- 检查类的 `` 必填,接受注册表 canonical ID 与显式别名。`all` 是全部适用义务,不是安装所有语言工具;缺适配器不能删除义务。 -- 查询/管理类支持 `--format human|json`;检查类另支持 `sarif` 与 `--output PATH`。不支持的格式在启动子进程前返回用法错误。 -- 检查执行预算使用 `--jobs N`、`--timeout DURATION`、`--offline`;这些选项不改变质量要求。具体支持矩阵由同一命令 schema 生成,不能让无执行职责的命令接受后悄悄忽略。 -- 不自动把 `audit`、`scan`、`repair` 等近义词解析成别的操作。初版没有独立 `test` 指令;策略要求的测试属于 build 义务,报告明确其等级。 -- 命令解析只接受结构化参数;原生进程使用字面 argv。项目文本、诊断和任务 Markdown 不成为 Shell 模板或授权来源。 - -### 2.2 输出类型与退出语义 - -共用 `schema_version`、`report_type`、`operation`、`request_id`、`command_status`、`exit_code`、`warnings`、`next_actions`。检查报告继续使用既有 RunReport 顶层字段,如 `run_id/request/results/delivery_gate`,不为统一外壳丢失逐项证据。查询、计划、安装、修复及任务结果采用各自类型;不要求每个查询伪造空 findings。 - -`command_status=complete|incomplete|error|cancelled` 描述命令操作。一次检查发现违规仍可是 complete;报告另存 `completion`、findings 与 gate。`request_id` 标识请求,`run_id` 标识检查或诊断的证据生产运行,`task_id/attempt_id/lease_token` 标识协作对象;不能混用。 - -RunReport 与 doctor 的 PrerequisiteReport 均携带唯一 run_id、report_type、workspace/content/policy/tool 身份、观察范围及 freshness。导入幂等键为 workspace_id + run_id,另校验报告摘要;同键同摘要不重复写入,同键不同摘要拒绝并保留冲突。重新运行doctor产生新run_id,同一环境阻塞仍按稳定blocker身份合并,不制造第二张任务。 - -| 命令性质 | exit 0 的含义 | 典型非零 | -|---|---|---| -| 信息查询、plan、status、next | 请求的视图或计划已完整返回;允许明确含 unknown、待办和历史失败 | 无法读取必要来源为 3;坏参数为 2 | -| init | 计划或受管写入完成;readiness 可仍 incomplete | 写入冲突/部分落盘为 3 | -| doctor、config validate、tools verify | 本次所选验证条件满足;不是代码质量通过 | 必需条件缺失、配置无效或制品不匹配为 3 | -| 检查、gate、task verify | 选中义务完整且无阻断违规 | 违规 1,必需检查未完成 3 | -| sync、租约、attempt、安装 | 指定状态操作完成;尚有问题不改变此成功含义 | 存储、租约或安装未完成为 3 | -| fix --dry-run | 完成修复预览,不证明修复成功 | 无法得到可信预览为 3 | -| fix --apply | 应用流程和规定复检完成且无阻断违规 | 仍有违规 1,应用/复检未完成 3 | - -全部操作保留 2 用法错误、4 内部故障、130 取消。执行后优先级:取消 > 内部故障 > 未完成 > 违规 > 成功;原生 raw_exit_code 独立保存。查询无法形成可信结果时不能以“已经输出错误信息”为由 exit 0。 - -只有 `check all` 与 `gate` 可以评估整份交付 contract。`check all` 的 allow 只绑定工作树快照,不能当作 index/ref/CI 收据。其它命令顶层不签发交付 allow;status 可展示带来源、身份、时间的历史决策,必须另示当前 freshness。无适用对象不能生成 allow。 - -JSON stdout 恰好一个完整文档;日志进 stderr/私有证据。MCP stdio stdout 则保留给协议消息,不直接打印 CLI JSON。公开记录脱敏;结构化 `next_actions` 带作用、前提和 argv,不将诊断原文直接升级为建议执行的命令。 - -### 2.3 副作用分级 - -| 类别 | 命令 | 允许的副作用 | -|---|---|---| -| 静态观察 | help/version、detect、capabilities、plan、rules、config、tools list/verify、status/next/show | 读取允许范围;不执行项目脚本、扫描或安装 | -| 初始化 | init dry-run / apply | dry-run 不写工作树;apply 精确写计划内画像、AGENTS 受管块、工作流记录 | -| 运行诊断 | doctor | 有界探测、私有诊断;不安装、不执行完整构建/扫描 | -| 证据执行 | 六类检查、三个 gate、task verify | 物化快照、运行工具、保存报告与缓存;verify 还追加任务事件 | -| 工作区协作 | sync、claim/heartbeat/release、attempt | sync/attempt 更新事实与投影;正常租约仅写本地 state,过期恢复另记abandoned事件,不修改源码/策略 | -| 显式安装 | tools install | 只写工具锁指定且授权的受管工具位置 | -| 受控修复 | fix dry-run / apply | dry-run 可在私有隔离副本运行修复器;apply 校验身份后修改允许文件并记录尝试 | -| 协议入口 | mcp serve、compat | 调用被映射操作;协议启动成功不等于检查成功 | - -原生构建/扫描可能执行项目插件,普通本地隔离目录不等于安全沙箱;网络和可信 CI 边界遵循 [执行内核设计](technical-design.zh-CN.md)。未初始化时允许执行检查并保存私有报告,不静默创建 tracked 工作区。要求持久任务的命令须明确报告 workspace_not_initialized。 - -### 2.4 执行预算与默认值 - -以下为初版设计默认值,实施时必须随命令schema/version固化,并通过真实项目测量验证;不宣称适合所有项目。运行参数优先级为 CLI > 已登记环境变量 > 项目运行默认 > 发行内置默认,报告记录最终值和来源。未知环境变量不成为隐式开关。 - -当前 Rust 局部检查入口已登记 `CODEGUARD_TIMEOUT`,与 `--timeout` 使用相同的 ms/s/m/h 格式及 1ms–24h 边界。项目可选 `.codeguard/runtime.json` 作为更低优先级的运行默认值;文件必须是非链接的有界普通 JSON,只接受以下版本化结构,不由 `init` 自动创建,也不能写质量排除或批准字段: - -```json -{"schema_version":"1.0","document_type":"codeguard_runtime_options","timeout":"5m"} -``` - -`check all` 已扩展并行预算:`--jobs N`、登记的 `CODEGUARD_JOBS` 或 `.codeguard/runtime.json` 1.1 中可选的 `jobs` 取值为 1–64;默认 `min(4, max(1, 可用CPU并行度))`。1.0 文件仅有 `timeout`,保持原含义;1.1 文件仍要求 `timeout`,可附 `jobs`。每个字段按 CLI > 登记环境变量 > 项目运行默认 > 内置默认选取。任一字段需要项目默认值时,一次读取并严格校验整份文件;两个字段均有较高优先级来源时不读取项目文件。选中的非法值、坏协议、额外字段、链接或过大文件在原生执行前拒绝。公开反馈分别记录 timeout/jobs 的值与来源、并行上限、可执行原生任务数和真正启动数。混合 Python/Rust/Go/Java 项目可调度对应的独立原生节点;Go 工具通过 `--go-tool ABS_PATH` 显式选择;Java 当前只运行已配置的 P3C 十规则集声明的隔离单文件探针,不能代表完整 lint。真实并发与跨进程资源互斥尚待专项验收,全部 I/O 硬截止时间仍待实现。 - -| 运行类别 | 整次操作默认timeout | 默认并行度 / 可覆盖选项 | -|---|---|---| -| 六类检查、三个gate | 30分钟 | `min(4, max(1, 可用CPU并行度))`;支持 `--jobs`、`--timeout`、`--offline` | -| doctor | 2分钟;单个探测上限10秒且受剩余总预算约束 | 1;支持 `--timeout`,不隐式发起联网探测 | -| fix(预览或应用)、task verify | 30分钟,含规定复检 | 修复写入串行,验证沿检查并发配置;支持 `--timeout`、`--offline` | -| tools install | 10分钟 | 安装制品串行;支持 `--timeout`、`--offline`,离线只能使用已验证本地制品 | - -timeout包含等待资源锁、快照、探测、执行、解析、持久化和清理预算;子任务/重试继承剩余deadline,不能每次重新获得30分钟。取消/超时触发进程树终止与回收;强制清理预留在总预算内,操作系统无法按时回收时明确cleanup_pending,不伪称完成。后台服务mcp serve本身无检查deadline,但每个请求必须按同一类别有界。 - -`--timeout`接受正数及ms/s/m/h单位,`--jobs`接受正整数;0、负数、未知单位或不支持的选项为2。不得以无限timeout隐藏无进展,也不得因缩短预算改变必需义务。工作区租约默认5分钟,插件建议每60秒heartbeat;长运行的FixService/验证服务负责内部续租,失租停止应用与状态提交。续租不能重置attempt预算。 - -## 3. 发现与准备命令 - -### C01 — help / --help - -- **语法与价值**:`codeguard help [command...]` 或命令末尾 `--help`;提供参数、默认值、格式、退出码及最小示例,减少猜测调用。 -- **行为与输出**:由命令 schema 生成静态帮助,不要求项目有效、工具已安装或网络可用。JSON 帮助如未在 schema 提供,明确拒绝,不能伪装支持。 -- **失败与后继**:未知命令返回 2,列出合法入口;帮助成功不创建画像、不启动检查。 - -### C02 — --version - -- **语法与价值**:`codeguard --version [--format human|json]`;显示 CLI 版本、构建目标、构建身份、协议 major 和规则包兼容范围,定位插件实际绑定的二进制。 -- **行为与输出**:读取嵌入的发行元数据,不能联网查询 latest 或自行更新。工具、适配器实际状态继续由 capabilities/tools 给出。 -- **失败与后继**:合法版本查询正常 exit 0;版本相等不是文件完整性或真实工具验收证明,继续 tools verify/doctor。 - -### C03 — detect - -- **语法与价值**:`codeguard detect [path] [--format human|json]`;快速观察语言、方言、多构建根、清单、声明版本与源集,供 init/plan 复用。 -- **输入与结果**:读取批准范围中的清单、锁与源文件特征,返回 DiscoveryReport、证据位置、未知项和观察覆盖。不执行 wrapper 或读取整台机器的开发环境。 -- **副作用与失败**:不写画像/AGENTS/任务。可完整回答“存在无法静态解析的条件”时 exit 0;权限错误导致必要发现范围不可读时 exit 3,并显示部分结果。 -- **下一步**:需要持久接入用 init,需要知道规则能力用 capabilities,需要执行前计划用 plan。 - -### C04 — capabilities - -- **语法与价值**:`codeguard capabilities [language] [--platform ID] [--category ID] [--format human|json]`;回答这个发行版在语言 × 类别 × 工具 × 平台上承诺什么。无筛选 JSON 返回完整能力矩阵;带筛选 JSON 返回发行版本和所选单元。 -- **输入与结果**:读取发行注册表和适配器描述,返回支持/候选/计划状态、工具约束、输入粒度、报告与修复能力、已验证组合和缺口。尚未验证的工具约束或报告能力保持 gap/unknown,不从旧 lint 命令推断为已实现。 -- **副作用与失败**:不探测项目、不安装工具;注册语言 planned 仍可查询成功,不能把 planned 写成已可运行。未知语言为 2;注册表损坏为 4。 -- **下一步**:用 doctor 判断当前项目是否满足已实现能力的前置条件。没有实现的适配器不会因安装工具自动获得能力。 - -### C05 — init - -- **语法与价值**:`codeguard init [path] [--dry-run|--apply] [--format human|json]`;省略模式为 dry-run,建立持久项目画像与智能体工作入口。 -- **输入与结果**:复用 detect,生成带证据的语言/版本/构建/架构画像、分类型模块图、规则映射、准备任务、AGENTS 受管摘要和精确文件差异。MVC/DDD 等推断不自动成为强制约束。 -- **副作用与失败**:apply 才写入自有工作区和受管摘要,保留人工文本;重复执行按输入身份刷新而不清空历史。冲突/部分写入为 3。dry-run 的任务只出现在计划里。 -- **下一步**:返回 init_status 与独立 readiness;已授权插件继续 doctor/check/sync/next。完整契约见 [初始化设计](project-initialization.zh-CN.md)。 - -### C06 — plan - -- **语法与价值**:`codeguard plan [path] [--format human|json]`;明确“应该检查什么、如何执行、哪些信息还缺失”。 -- **输入与结果**:新鲜观察、可信策略、原生配置与工具锁形成全量义务,再选择适配器及任务 DAG。每项列目标、规则、工具身份、前置依赖、网络/资源需求、预计写入位置、缓存使用条件与未解析部分。 -- **副作用与失败**:不运行检查器、解析构建模型的项目脚本、下载或安装;没有运行过就不给虚构耗时和命中率。完整返回含 blocker 的计划可以 exit 0;必要输入损坏、读不到可信策略为 3。 -- **下一步**:doctor 恢复前置条件,再执行对应检查。执行时重新核对输入身份,不能直接使用过期计划。 - -当前相邻 Rust CLI 只实现 `plan_preview` 0.1:通过静态发现展示已观察的检查器配置、选中类别及待定候选;可信政策、工具锁与内容身份缺失时 `policy_identity=null`、`obligations=[]`,候选无执行命令,返回 3。它不是本节要求的正式计划或义务 DAG;见相邻 `codeguard-cli/tests/acceptance/plan-readonly-preview.md`。 - -### C07 — doctor - -- **语法与价值**:`codeguard doctor [language|all] [path] [--format human|json]`;省略语言为 all,定位工具链、配置可加载性和执行环境问题。 -- **输入与结果**:依据适用检查义务诊断必需运行时、制品、目标版本、权限、必要环境变量是否存在、漏洞库身份/时效及离线能力,返回 PrerequisiteReport 和结构化恢复动作。 -- **副作用与失败**:只执行适配器声明、已解析身份、预算内的诊断命令;不得把任意项目 script 的 `--version` 当无副作用操作。需执行项目控制逻辑而缺少明确执行范围时标未完成,不隐式构建、安装或启动服务。默认不远程连通性探测、不读取凭据值。 -- **下一步**:必需项缺失/未知为 3,可选工具缺失不误阻塞;生成可供 sync 消费的准备证据。恢复环境后重新 doctor,并运行原来被阻塞的检查;doctor 通过不证明源码质量通过。 - -当前局部实现:`doctor [path] --ruff-tool ABS_PATH` 仅支持显式 Ruff 版本诊断及静态配置观察。0.2 报告在已绑定工作区自动保存并同步环境调查任务;未选择工具不产生缺失任务,版本恢复不自动关闭原任务。落盘 queued 报告保持不可变,对话另显示同步状态。`task verify` 已接同一局部版本诊断和摘要绑定事件,`next` 能解释恢复但策略未核验;可信必需项/全工具准备报告及正式关闭仍未接通,不能将该切片当成上面的完整命令能力。 - -### C08 — rules list - -- **语法与价值**:`codeguard rules list [path] [--format human|json]`;显示此项目有效规则及解释,避免只看规则名称猜检查内容。 -- **输入与结果**:读取 rulepack/工具锁、批准策略和原生配置,列出 Codeguard/native rule ID、来源版本、类别、严重度、适用条件、规则依据、修复指引、已批准 suppression/例外及原因。 -- **副作用与失败**:只读。动态条件未解析时标候选;不能凭名称宣称已执行 P3C。关键规则包缺失或摘要错误为 3,完整视图可带不适用规则而 exit 0。 -- **下一步**:config explain 解释来源冲突,plan 显示规则实际绑定的检查任务;本命令没有 enable/disable/approve 副作用。 - -当前局部实现:Rust `rules list [path] --format human|json` 已复用静态发现,分别展示检查器配置声明、内置 Ruff F401/E501 候选映射的版本/来源/许可/摘要,以及逐语言六类规则目录缺口。Node 检查器明确归属旧登记中的 TypeScript 生态。即使 Ruff 配置为 configured,具体规则启用仍 unverified、执行 not_run、批准 unverified;动态 ESLint 配置不执行。项目内同名 rulepack 或 approved 字段不能替换内置映射。报告0.1固定 incomplete/退出3、gate_effect=none;不是完整项目有效规则集合。可信工具锁/政策、各生态完整目录、原生逐文件有效配置、suppression及已批准例外解释仍待接入,4.7保持未完成。 - -同属 C08 的 `codeguard rules whitelist list [path]`、`explain [path]` 为只读查询;`propose [path] --format json` 仅在本轮完整原生身份可核验时生成含精确身份、复现依据、期限建议的候选,不写有效政策或自批。当前 `propose` 0.3 只实现证据预览:从最新已同步且源码、配置仍匹配的 Ruff 报告显示本地观察到的工具/配置摘要、原生工具版本与 F401/E501 的候选规则映射摘要;报告未同步、损坏或原问题消失时不沿用旧证据。它返回原工具复检命令、仍缺的**已批准**规则包身份和 `candidate=null`,不能生成可审批文件。候选、已批准、过期、失配分别展示原因;批准引用及真实生效范围由 `config validate/explain` 核验。设计见 [误报白名单](false-positive-allowlist.zh-CN.md)。 - -### C09 — config validate - -- **语法与价值**:`codeguard config validate [path] [--format human|json]`;在昂贵检查前发现配置错误和未经允许的策略弱化。 -- **输入与结果**:校验 codeguard.json、lock、被引用的规则和原生配置的 schema、类型、引用身份、版本兼容及批准策略约束;返回逐路径/字段的诊断。 -- **副作用与失败**:不修配置、不把旧未知字段静默丢弃、不运行构建;静态无法完成的动态配置验证明确未完成。无效配置、必要引用缺失或未获批准的覆盖为 3,不报告源码违规。 -- **下一步**:根据 config explain 的来源定位修复。结构正确不证明策略修订已获批准,也不证明原生检查器确实加载规则。 - -### C10 — config explain - -- **语法与价值**:`codeguard config explain [path] [--format human|json]`;回答“为什么这项规则或范围生效”。 -- **输入与结果**:返回每项运行参数、质量策略、工具锁和原生配置值的来源、覆盖关系、批准依据、拒绝的覆盖及 suppression 差异。凭据值脱敏,只展示引用名称。 -- **副作用与失败**:只读。无法解析某层时给出可用的部分来源及 3,不能把默认值冒充最终有效值;已完整解释现存待办不等于修改配置。 -- **下一步**:修复错误配置或提交具体的政策变更需求;Codeguard 不让智能体通过改任务文件完成政策批准。 - -### C11 — tools list - -- **语法与价值**:`codeguard tools list [path] [--format human|json]`;对照项目工具锁显示必需/可选工具、版本约束、受管缓存及项目/系统候选。 -- **输入与结果**:静态读取锁和库存,区分声明、已找到、未找到、尚未验证。未初始化项目仍可读取合法 codeguard 配置;缺少锁就明确声明“仅候选库存”。 -- **副作用与失败**:不执行候选二进制、不下载、不选择较宽松版本。库存完整显示缺工具可 exit 0;库存必要元数据不可读为 3。 -- **下一步**:tools verify 证明制品身份,doctor 判断能否运行,tools install 安装明确锁定的缺项。 - -当前局部实现:`tools list [path] [--tool-lock-candidate FILE] [--managed-cache ABS_PATH] [--runtime ID=ABS_PATH] [--format human|json]` 复用静态制品核验,列出声明版本、适配器/规则来源、独立运行时/工具包及当前平台缺口。其它平台保留声明但不检查制品。输出固定 `inventory_scope=declared_lock_only`、`required_inventory=unverified`、`required_by_policy=null`、readiness unknown 与退出 3;不是完整受批准必需库存,不启动/安装/写工作区。 - -### C12 — tools verify - -- **语法与价值**:`codeguard tools verify [path] [--format human|json]`;验证工具锁要求的实际制品、规则包及声明运行时身份,防止 PATH 漂移。 -- **输入与结果**:逐项核验版本元数据、平台、摘要、允许来源和可信发行证明;返回匹配、缺失、不兼容或篡改证据。只核验代码字节和元数据,不执行待核验项目脚本。 -- **副作用与失败**:不下载安装;必需锁缺失或任一必需项不匹配为 3。工具身份一致不证明工具可启动或规则实际执行。 -- **下一步**:缺制品用 tools install,身份正确但运行条件不明用 doctor。不能静默降级到随机系统版本。 - -### C13 — tools install - -- **语法与价值**:`codeguard tools install --lock PATH [--dry-run|--apply] [--format human|json]`;省略模式为 dry-run,统一补齐已选定且可校验的工具链。 -- **输入与结果**:精确工具锁和实际平台生成下载/安装清单,包括来源、摘要、目标目录、预计副作用及不支持项;apply 返回逐工具安装及验证状态。 -- **副作用与失败**:dry-run 不联网安装;apply 才下载至受管临时位置、校验后逐制品原子发布并再次验证。不能写全局 PATH、自动提权或通过任意安装脚本接管系统;需要特殊安装程序时返回单独准备动作。锁本身必须来源可信,任意 URL+自写摘要不是授权。 -- **下一步**:部分失败为 3并保留已验证的安装结果;不得留下冒充可用的半成品。随后 doctor 确认项目可使用它们;check/doctor 不隐式调用此写入操作。 - -当前局部实现:`tools install --lock FILE [path] [--dry-run|--apply]` 共用声明库存/制品观察,默认预览。候选计划列出摘要、缺口、平台及恢复动作;可信锁/发行来源未绑定时 apply 返回 blocked_before_mutation、writes_performed=false 和退出 3,不调用发布 API。完整可信下载/发行包/正式 apply 尚未实现。 - -## 4. 原生质量检查命令 - -以下六条共享语法:`codeguard [path] [--format human|json|sarif] [--output PATH] [--jobs N] [--timeout DURATION] [--offline]`。共享执行链为:建立义务 → 冻结内容 → 核验政策/工具 → 执行 DAG → 专用解析与覆盖核验 → 报告。全程不修改真实源码或 index,不自动同步 tracked 任务。 - -### C14 — lint - -- **价值与范围**:执行已批准的编码规范、格式检查及一般静态质量规则。例如 Java 官方 P3C/PMD 与 Checkstyle 分开登记;格式器只有经验证的只读 check/diff 模式才计入相应能力。 -- **输入与输出**:依据语言版本、模块、source set 和原生配置选择兼容适配器;每条 finding 保留 native rule ID、位置、规则依据和证据。相同原生执行可供其它类别取证,但不能凭类似文案随意去重。 -- **失败与后继**:违规为 1;缺配置、解析失败或工具崩溃为 3,不能让通用 error 字样决定违规。转 work sync/next;支持确定性原生修复时再 fix。 - -当前 Rust `lint python` 局部实现仍固定退出 3;已初始化项目在原生 Ruff 扫描后自动保存 0.8 本地报告、同步,再把 `next` 只读简报嵌入公开对话反馈 0.10。完整文件携本轮工具与配置摘要、逐文件原生设置、F401/E501 候选规则映射及 `--ignore-noqa` 对照观察。仅被源码注释抑制的文件标记 `suppressed`,不标普通 `passed`;对照差额独立于活动 finding,不会自成白名单或门禁。规则是否全局启用及逐文件配置忽略可见,但受批准规则集合与完整覆盖仍未核验,固定 `coverage_proven=false`。同步或简报读取失败分别标明状态,原生诊断仍展示。这不等于 C14 的完整类别门禁或插件宿主接线。验收见相邻 `codeguard-cli/tests/acceptance/{lint-python-auto-brief,ruff-observed-artifact-identity,ruff-rulepack-observation,ruff-effective-settings-observation,ruff-native-suppression-observation}.md`。 - -Rust CVE 局部入口 `codeguard cve rust [path] --cargo-audit-tool ABS_PATH --db ABS_PATH [--timeout 30s] --format json` 只调用显式原生 `cargo-audit` 与显式离线 RustSec 数据库,不隐式下载。它核对原生漏洞与本轮 `Cargo.lock` 的精确包名、解析版本、来源及校验和;私有来源只显示摘要。`check all [path] --cargo-audit-tool ABS_PATH --rustsec-db ABS_PATH` 现将同一局部观察作为独立的 `rust.cve` 节点,向 JSON、human 与 SARIF 反馈 advisory 和未完成原因。原生 JSON 即使报告零漏洞,若数据库提交/更新时间缺失或来源时效未经可信边界核验,反馈仍为 `database_freshness=unverified`、`not_evaluated`、退出 3。此入口尚未完成正式策略、全构建组合、稳定任务与复检、白名单生效;也不检查 yanked 包。验收见相邻 `codeguard-cli/tests/acceptance/cargo-audit-native-observation.md` 和 `check-all-cargo-audit.md`。 - -当前另有 `codeguard lint go [path] --go-tool ABS_PATH [--timeout DURATION] --format human|json` 的局部入口,显式调用 Go 1.23.4 原生 `go vet -json ./...`。Rust 清空继承环境并关闭模块网络/工具链自动下载,使用私有 Go 缓存,执行前后核对工具、`go.mod`、可选 `go.sum` 和已发现源码的内容摘要。对话反馈展示原生规则与行列,不把原生消息文本当作指令;原生 JSON 中违规即使退出 0 也不会被判为干净。工具缺失、版本不符、编译错误或坏报告保持未完成。所有结果固定退出 3、`delivery_decision=not_evaluated`、`coverage_proven=false`;已接入 `check all` 局部汇总;已自动保存并同步本地任务,next 提供 Go 环境/源码指引;task verify 已支持 Go 原工具局部复检;尚缺正式关闭/重开、受批准工具锁/策略和 Go 注释检测。见相邻 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 -当前局部入口逐一进入已发现的 Go Module 根运行 vet,并在 0.6 反馈中列出每模块状态;某模块失败时保持未完成,已完成模块的本轮 finding 仍显示。原生诊断若指向未纳入本轮源码发现的文件或归属别的模块,则该模块未完成;源码、各模块清单或工具在执行中变化则丢弃本轮 finding。多模块运行仍未证明 build tags、平台/CGO 组合或受批准的全项目覆盖。 - -当前 `check all/java` 增加 `--format sarif` 的局部输出:从同轮 `check_feedback` 或 `check_aborted` 读取已观察的原生 finding,保留未完成状态与非零退出码,公开结果只给散列身份和固定提示,不复制原生诊断文本、路径或证据。零 finding 仍为 `executionSuccessful=false`,不能视作通过;未归属 CVE advisory 和依赖图节点不伪装为已确认 finding。其 JSON/SARIF 局部报告也可使用 `--output PATH` 同目录暂存与原子写入;写入失败后 stdout 仍保留报告,并以受限原因码标明 `export.status=failed`,不会覆盖已有源码文件。成功文件与 stdout 均标记 `saved`;未请求导出标记 `not_requested`。当前局部反馈协议为 JSON 0.22/故障 0.4,SARIF 在 run 属性中保留同义导出状态。human 和其它检查类命令尚无导出入口。它不等于完整 RunReport 或可信交付认证,见相邻 `codeguard-cli/tests/acceptance/check-partial-sarif.md`。 - -当前另有 `codeguard lint java FILE --maven-tool ABS_PATH --java-home ABS_PATH --maven-repo ABS_PATH --repo-sha256 SHA256` 单文件局部入口。Rust 在私有临时项目离线调用 Maven PMD 3.11.0 与 P3C 2.1.1 的固定命名规则集;原生违规在 human/JSON 对话反馈中展示规则及位置,缺报告或执行故障不被解释为源码违规。干净 XML 没有文件覆盖证明,因此显示 `clean_scope_unproven` 而非 PASS;工具/策略批准和完整 Java 义务未绑定,固定退出 3。真实违规与干净样本见相邻 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`。这不是 C14 目标的目录/模块级执行,也不替代 Java Checkstyle、Javadoc、CVE 或安全检查。 - -### C15 — comments - -- **价值与范围**:验证公共 API 文档覆盖、参数/返回/异常标签、链接与语法等可确定规则;按目标语言区分继承文档、生成代码、宏/注解生成成员。 -- **输入与输出**:规则包声明哪些源集、可见性及文档义务适用;用原生文档工具或有验收证据的 AST 检查器取证,输出违反的具体文档契约。 -- **失败与后继**:没有适配器是能力缺口,不等于“不需要注释”。纯主观文风意见不直接形成阻断发现;修复应补足真实语义,不能生成空话注释来骗覆盖率。之后原 comments 工具复检。 - -当前Rust局部入口:`comments rust [path] --cargo-tool ABS_PATH [--timeout DURATION] --format human|json` 使用共享runtime执行原生锁定离线库目标探针,绑定清单/锁/已发现源码/工具并复核原生目标;缺工具、坏报告或输入变化为未完成,取消优先返回130。反馈0.4绑定原生UTF8源码范围,行移动不按序号替换候选身份;重复声明归属不明时保留歧义观察、不分配正式ID。逐发现增加七项修复简报:证据、规则依据、修改范围、步骤、原工具复检、未接通的历史状态和关闭条件;完整局部观察给限定源码指引,输入变化或歧义只要求调查/重扫且修改范围为空。给出规则/位置及原工具复检,coverage_proven=false、交付not_evaluated。已初始化工作区自动保存绑定报告并同步稳定问题、任务及观察,重复扫描不重复建任务;输入失配、歧义或原生未完成生成准备任务。next识别文档任务并指向task verify;同轮普通/force-warn原生对照分别核验范围、指纹和唯一输入归属,区分问题仍在、抑制待审及待策略核验的缺失候选,记录复检事件和关联尝试,任务仍open。源码allow可能隐藏诊断,零诊断不算修复或批准例外。原项目生效规则、完整构建组合、正式关闭重开和宿主仍缺;7.1不勾选。验收见相邻codeguard-cli/tests/acceptance/rust-comments-cli.md。 - -### C16 — cve - -- **价值与范围**:审计项目真实依赖图的已知漏洞,覆盖策略规定的直接/传递、运行/开发/构建依赖范围,不审计宿主恰好安装的无关包。 -- **输入与输出**:清单、锁、可证明的解析图和有身份/时效的漏洞库;结果包括生态、组件版本、advisory、依赖路径、原生严重度、修复版本信息及匹配确定性。 -- **失败与后继**:网络、库过期、版本解析或匹配不确定为 incomplete并保留已确认发现,不虚构 CVE。离线同样核验库新鲜度。依赖升级由独立 fix 计划或任务处理,升级后的 CVE 与受影响构建必须复检。 - -### C36 — dependencies - -- **价值与范围**:对每个构建根识别依赖图、版本、许可证、SBOM 和来源检查的配置;运行已配置且可用的原生检查器。未配置项给出建议,不因候选目录中有该检测族就自动要求执行。此命令不能据此宣称无 CVE。 -- **输入与输出**:锁文件、构建配置和经受控解析的 effective graph;结果逐检测族保留组件坐标、解析路径、scope、规则身份和来源证据。不同构建根与源集不能由主语言的一个清单代替。 -- **失败与后继**:动态版本、私服不可达、父 POM 缺失、图不完整或报告范围未知为 incomplete。已确认的版本或许可证问题仍保留,修复后由原生工具复检依赖、CVE 和受影响构建。 - -### C17 — security - -- **价值与范围**:执行源码安全、配置/IaC、secret 内容及入库路径规则;不同规则具有不同的证据与扫描边界。 -- **输入与输出**:源内容、配置和可信规则包,报告缺陷位置或脱敏敏感证据;命中 `*.pem` 等禁止入库路径只能称 repository_policy_violation,不能仅凭文件名断言泄露私钥。 -- **失败与后继**:原生语义不明确或覆盖不足为 3。点路径、受管记录、生成文件不能成为入库安全逃逸位置;scope 必须按该类政策计算。任务引导修补漏洞/移除敏感内容;如需外部凭据轮换,明确恢复步骤,不把删除字符串称为已轮换。 - -### C18 — build - -- **价值与范围**:验证依赖解析、编译、类型、打包和明确要求的生命周期检查,发现单文件 lint 无法证明的模块兼容问题。 -- **输入与输出**:构建根、wrapper、目标运行时、profile/feature/target 和可信命令配置,返回逐阶段结果与 build_level、test_execution。保留已确认的静态构建默认;策略要求测试时必须执行。 -- **失败与后继**:有可信编译诊断的源码错误可为 finding;磁盘不足、缺 JDK、下载失败是环境未完成。原生构建成功不能证明全部质量规则加载或测试已执行;无法核验阶段覆盖仍为 3。构建计划影响闭包决定修复后复检范围。 - -当前 `build rust [path] --cargo-tool ABS_PATH` 只实现锁定、离线、全部目标且默认 feature 的原生 Cargo 类型检查;报告明确 `build_level=type_check`、`test_execution=false`。已初始化项目将可归属编译错误及缺工具等环境阻塞同步到稳定任务,`task verify` 调用同一 Cargo 复检,零诊断仍需核对策略与覆盖。完整 workspace、feature/target 组合及测试义务尚未建立,不签发构建通过或交付允许。 - -### C19 — check - -- **价值与范围**:探测 lint/comments/dependencies/cve/security/build 的项目配置,组合已配置检查器与批准策略明确要求的检查;统一解决多工具启动、依赖顺序和结果聚合。 -- **输入与输出**:逐项返回 `configured/missing/invalid/unknown`,已配置项附本次原生诊断或工具故障。候选目录不自动变成全量义务;策略必需项单独标注。宿主将结果摘要、位置或组件、修复建议及复检命令呈现在智能体对话。 -- **失败与后继**:相互独立的检查继续收集证据;依赖失败的检查明确 incomplete,不跟着消失。mixed finding+missing tool 返回 3且保留二者。`check java` 只报告该语言;初版只有 `check all` 评估全项目交付 contract。 -- **下一步**:独立 CLI 保存运行报告后可 work sync;已启用插件自动 sync并返回简报。工作树 allow 有内容与政策身份,不等于允许不同 index/ref 提交。 - -当前局部实现:`check java [path]` 已复用 `check all` 的 Java/P3C 原生节点、工作区同步与 Java 任务简报;即使混合项目中存在 Python/Rust 源码,也只调度 Java 节点。`check_feedback` 0.22 对 `selection=java` 固定 `delivery_decision=not_evaluated`、退出 3,缺 Java 目标不作为通过。完整 Java 检查器集合、可信必需义务、工具/规则批准与交付聚合仍未接通。 - -`check all` 的 Rust 节点已在同一任务图和预算内分别调用原生 Cargo check、Clippy 和 rustdoc。类型错误只进入 `rust.cargo_check` 的构建观察和稳定任务,不混作 Clippy/注释违规;缺工具、坏报告、输入变化、超时或取消保留原生结果和具体未完成原因。对话同时展示原始发现及下一步,旧有 Clippy 任务仍优先呈现,构建任务可由 `next` 单独读取。反馈协议 0.28 增加严格的 `rust_build` 字段;任务同步不代表完整构建覆盖或交付门禁已通过。 - -## 5. 交付门禁命令 - -gate 与 check 使用同一个义务/适配器/报告内核,差异是权威内容来源、入口输入与可信政策上下文。严格交付中 deny/incomplete/internal_error/cancelled 均不能放行;真实 Git Hook 将非零映射为拒绝,宿主 Hook 依宿主协议转换,不能直接透传 CLI exit=2。 - -### C20 — gate pre-commit - -当前 Rust 二进制只接入真实 index 的**路径安全预览**,可用 `--git-tool ABS_PATH` 指定 Git;它返回 3/incomplete/not_evaluated,报告尚未核验工具、对象内容或完整质量义务。下列是完整目标契约,不能用预览结果代替正式 Git Hook 门禁。 - -- **语法与价值**:`codeguard gate pre-commit [path] [--format human|json]`;核验将要提交的真实 index,避免工作树修好但暂存区仍旧错误。 -- **输入与结果**:尊重 Git 工作目录、GIT_INDEX_FILE、部分暂存、初始提交与文件删除,冻结 tree/对象身份并执行完整交付 contract,返回 index 来源的 GateReport。 -- **副作用与失败**:不 git add、不 stash、不覆盖用户 index;冲突条目、无法物化的必要对象或输入并发变化为 3。输入不是 Git 仓时不向上层工作区回退。 -- **下一步**:失败说明具体源码任务或环境恢复动作;修复并按用户意图暂存后重跑。通过收据仅绑定被冻结的 index,不能防止 hook 之后任意外部修改;交付端须核对最终内容。 - -### C21 — gate pre-push - -- **语法与价值**:`codeguard gate pre-push [path] --remote-name NAME --remote-url URL [--format human|json]`;stdin 为 Git 提供的 local-ref/local-OID/remote-ref/remote-OID 元组。 -- **输入与结果**:CLI 先完整读取并验证输入,再将不可变推送集合交给 core;覆盖多 ref、非 HEAD 分支/标签、删除 ref和新 ref。remote URL 只作为上下文,不触发推送且公开输出脱敏。 -- **副作用与失败**:不 git push、不默认 git fetch、不把 stdin传给探测器;本地缺必要对象时 3。每个新增/更新 ref 的全量义务保持,不用 HEAD 成功替代。删除 ref 显式记录不适用;全部删除不能签发源码质量 allow。 -- **下一步**:修复实际被推送内容后重跑;真实 Hook 接线需原样传 remote 参数和 stdin。stdin缺失不能退化成检查 HEAD。 - -### C22 — gate ci - -- **语法与价值**:`codeguard gate ci [path] --input PATH [--format human|json]`;用版本化请求文件明确 CI 本次认证的内容集合,避免 merge result 与分支头混淆。 -- **输入与结果**:输入包含 schema_version、仓库身份、一个或多个不可变 commit OID、用途与预期内容来源;符号 ref仅作描述,不替代 OID。文件不授予政策权威,可信策略/工具锁由受保护接入独立提供。 -- **副作用与失败**:不提交、不合并、不发布;无效参数 schema 在执行前为 2,无法获取必要对象/可信策略/执行隔离条件为 3。项目脚本不能改写可信验证器或最终状态凭据。 -- **下一步**:按每个内容项和完整义务生成 GateReport;只有全部满足才 allow。失败把修复信息交回插件/CI展示;本地可写任务或缓存不能单独签发可信 CI 成功。 - -## 6. 问题工作区与协作命令 - -### C23 — work sync - -- **语法与价值**:`codeguard work sync [path] [--format human|json]`;将原始运行结果转为稳定、可恢复的问题与任务。 -- **输入与结果**:消费匹配工作区的全部未导入 RunReport/准备证据,逐项验证 schema、内容/规则/工具/政策/范围身份;返回导入、重复、历史、拒绝、问题新增/更新/重开/关闭计数及游标。 -- **副作用与失败**:按 run_id幂等追加脱敏事件、重建任务投影并更新本地消费状态。旧报告只能进入历史,部分检查不按“没出现”关闭问题。单份报告事件提交与已消费标记形成可恢复事务;失败不能先推进游标丢掉事件,其他有效报告可先完成。 -- **下一步**:next 获取动作。坏报告/存储失败返回 3并保留原始证据;再次执行从未完成单元恢复。同步成功不说明 backlog 已清空,也不重新计算质量 gate。 - -当前 Rust 局部实现消费已初始化工作区的 Python Ruff 本地报告 0.4/0.5/0.6/0.7/0.8;0.5 起对完整文件要求工具与配置摘要,0.6 对映射的 F401/E501 另外核验候选规则包身份与摘要,0.7 要求原生设置观察,0.8 再要求注释抑制对照且禁止把 `suppressed` 当 `passed`。缺字段、伪造覆盖或结构矛盾拒绝导入,旧报告不倒填身份。公开输出为 `work_sync_preview` 0.2,固定退出 3/`not_evaluated`。本地 Ruff 扫描已自动保存并同步,创建 finding 或环境 blocker、观察事件及任务,重复发现不改 tracked 任务;其它类别报告、关闭/重开、完整游标事务仍按上面的目标契约实施。`next` 已有只读局部简报预览,见 C25。 - -### C24 — status - -- **语法与价值**:`codeguard status [path] [--format human|json]`;快速判断项目现在卡在哪里。 -- **输入与结果**:只读汇总 initialized、画像 freshness、必需前置条件、最近运行的身份/覆盖、待导入报告、finding/blocker/任务状态、租约及冲突。 -- **副作用与失败**:不 doctor、不扫描、不 sync、不修改状态。可返回“未初始化”或“还有10项问题”并 exit 0;无法读取可信视图时 3。 -- **下一步**:返回精确缺项:先 init、先同步、先恢复环境、继续 next 或需要完整检查。历史 allow 必须标明证据来源及是否仍匹配,不能作为当前绿色徽标。 - -当前 Rust CLI 的局部只读视图已列出已初始化工作区的开放 finding/blocker 数量、每项受限摘要与 `next` 建议;待同步报告单独标识,空任务仍要求验证。画像及检查证据的新鲜度固定未核验,不展示历史通过。租约冲突、完整依赖、已关闭状态及历史 gate 收据仍待实现。 - -### C25 — next - -- **语法与价值**:`codeguard next [path] [--format human|json]`;选择一个能够推进工作的动作,返回理由和 RepairBrief。 -- **输入与结果**:依据任务依赖、严重度、准备状态、有效租约、动作历史与预算。优先解除影响多项检查的前置阻塞,但严重问题始终可见。返回 `disposition=actionable|waiting|needs_decision|verification_required|no_applicable_work`。 -- **副作用与失败**:不领取、不运行动作、不更新过期状态;只做只读推导。无可行动任务与“全部通过”不同:全部被租用返回 waiting,预算耗尽返回具体决策,任务空但缺新鲜完整检查返回 verification_required。未初始化返回初始化动作/临时简报。 -- **下一步**:actionable给出允许范围、规则证据、步骤、历史和复检条件;执行者另行 claim。只要完整回答就可 exit 0,不得让插件把 null task解释为允许交付。 - -当前 Rust 局部实现提供 `repair_brief_preview` 0.1:从 Ruff finding/blocker 记录生成静态有界简报,未同步报告先提示 sync;空任务返回 verification_required,缺配置与缺工具分别返回 needs_decision/actionable。任务 Markdown 不作为指令来源。Unix 本地实现还会展示受控 `action_id`、最近五次尝试、未结束尝试及同输入动作的无进展计数;预算耗尽后转 `needs_decision`。所有视图仍是 `local_unverified`/`not_evaluated`。完整依赖、可信策略新鲜度、跨类别选择与跨平台租约仍待实现;验收见相邻 `codeguard-cli/tests/acceptance/next-local-brief-preview.md` 和 `task-attempt-local-ledger.md`。 - -局部 `task verify` 新增原生 Ruff 复检观察事件后,`next` 会核对事件与保存的原生报告:已消失的问题转为待策略核验;源码变化后仍存在的同一问题,只有报告里的目标源码摘要仍与当前文件一致,才重新成为可执行任务,并展示复检 run/report 引用。源码再次变化会恢复待复检状态。Rust Clippy 任务也已复用租约、原工具复检与事件核对;仍有同一发现时保持待修复,零诊断时用同工具的原规则 `--force-warn` 作原生对照;重现诊断则核查抑制,两轮都未检出也仅作待策略核验候选,环境恢复也仅为待策略核验。`task attempt start` 拒绝非 actionable 简报,防止绕过复检直接重复修改;这些观察不构成正式关闭或 gate 放行。 - -### C26 — task show - -- **语法与价值**:`codeguard task show [path] [--format human|json]`;读取指定任务的完整修复上下文。 -- **输入与结果**:稳定 issue、事件父关系、当前内容/政策身份和可重建投影,显示证据、状态、允许修改范围、依赖、尝试、关闭条件和租约。 -- **副作用与失败**:不信任 Markdown勾选;任务不存在、事件链损坏或作用区不符返回 3,ID语法错误返回 2。resolved任务也保留历史和 freshness。 -- **下一步**:claim后按简报修复,或原工具 verify;不能通过 show执行仓库诊断中的命令。 - -当前 Rust CLI 局部实现从结构化 fact 与最新复检事件生成 RepairBrief;任务 Markdown 只检查存在,不作为行动指令。非法 ID 返回 2,缺失或受限事实损坏返回 3;完整事件父关系、可重建投影和已关闭任务历史尚未验收。 - -### C27 — task claim - -当前相邻 Rust CLI 在 Unix 实现了本地 `claim/heartbeat/release` 0.1 切片:按稳定任务 ID 锁定工作区状态,随机 token 仅返回给领取者,状态仅保存 SHA-256;同一 owner 不能复用旧 generation 的 token,并发领取只有一个成功。未结束尝试阻止正常 release;过期接管会先写入 `abandoned` 结束事件,失败则不换 generation。成功仅表示本地协作操作完成,`delivery_decision=not_evaluated`。跨平台实现、verify/fix 租约绑定及完整事件事务仍须完成,不作为 C27–C29 全量验收。 - -- **语法与价值**:`codeguard task claim [path] --owner ID [--format human|json]`;防止同工作区两个执行者同时修同一任务。 -- **输入与结果**:在跨进程锁下核对任务、前置状态与租约,返回不可复用的 lease_token、generation、expires_at和当前任务身份;owner是审计标签,单凭同名 owner不能操作新租约。 -- **副作用与失败**:正常领取只更新本地 state。有效租约已存在为 3并返回等待信息,不强抢;过期租约若有未结束attempt,须先在可恢复事务中追加abandoned事件和预算记录,再换新generation。恢复存储失败返回3,不先取得新租约后假定历史已经补齐。 -- **下一步**:携带token调用 heartbeat/attempt/release;租约不授权修改超出简报的源码,更不授予策略变更权。跨机器全局独占不在初版保证内。 - -### C28 — task heartbeat - -- **语法与价值**:`codeguard task heartbeat [path] --owner ID --lease-token TOKEN [--format human|json]`;续租当前仍有效的任务占用。 -- **输入与结果**:锁内核对 token/generation、owner、作用区与到期条件,返回新的 expires_at。续租周期由工作流运行配置给出,不由质量阈值推导。 -- **副作用与失败**:只改state。失效token、已过期/已替换租约返回 3,不能复活旧持有者;调用方停止继续写入,重新读取任务状态。 -- **下一步**:继续当前有界尝试。heartbeat只证明协作存活,不能重置无进展预算或延长无限重试。 - -### C29 — task release - -- **语法与价值**:`codeguard task release [path] --owner ID --lease-token TOKEN [--format human|json]`;显式结束占用,允许下一个执行者接续。 -- **输入与结果**:验证当前租约并返回释放状态;相同已完成释放请求可幂等重放,新租约存在时旧token不能释放它。 -- **副作用与失败**:不关闭问题、不删除attempt。存在未finish尝试时正常release返回 3,要求先记录失败/blocked等真实结尾;崩溃后的到期恢复将其记abandoned。 -- **下一步**:next继续其他任务或等待。release成功不证明修复完成。 - -### C30 — task attempt start - -- **语法与价值**:`codeguard task attempt start [path] --owner ID --lease-token TOKEN --action-id ID [--format human|json]`;在实际修复前记录本次准备尝试什么。 -- **输入与结果**:action-id来自RepairBrief的受控动作/recipe标识;自由代码修复使用明确的manual-code-edit动作类型并引用任务允许范围。CLI观察前置内容和环境证据,生成attempt_id、动作指纹、前置摘要及可用预算。 -- **副作用与失败**:追加开始事件;同任务只能有一项未结束尝试,过期租约、范围不符或相同动作预算耗尽返回 3。动作ID不可被调用方任意换名来重置预算,指纹由规范化动作、范围和输入决定。 -- **下一步**:执行该修复,再finish。失败发生在运行修复器之前也必须记入历史。 - -### C31 — task attempt finish - -- **语法与价值**:`codeguard task attempt finish [path] --owner ID --lease-token TOKEN --attempt-id ID --outcome --note-code [--format human|json]`。 -- **输入与结果**:精确匹配begin事件、作用区和租约,CLI观察后置内容/patch或相关环境探测证据;返回观察变化与执行者说明两份信息、耗用预算及下一步。 -- **副作用与失败**:追加结束事件、更新任务投影;同attempt同结果幂等返回,冲突finish返回 3。若结束收据已落盘,原请求的重放仅返回该收据,即便租约后来到期也不再写事件或改变新租约;不存在已结束收据时必须持有当前有效租约。ready-to-verify只表示可进入复检,不能写resolved;调用方说no-change但实际有变化时拒绝该结果并要求重新说明。 -- **下一步**:task verify取得证据。租约中断但尚未验证的修改保留,恢复协议记录abandoned及当前事实,不自动回滚别人修改。 - -当前 Unix 局部实现将 start/finish 写为 `.codeguard/findings//events/attempt-*.json` 不可覆盖文件,在同一任务锁内核对租约。`next` 展示受控动作和简短历史;同输入动作连续两次 `no-change/failed/blocked/abandoned`,或 `ready-to-verify` 后原检查仍显示问题/未完成,均计入无进展预算。`ready-to-verify` 必须先由原工具产生与该 attempt-id 绑定的可核对复检事件,下一次 start 才可继续;旧复检或丢失私有报告不能解除等待。环境修复不必通过源码改动证明进展。当前摘要只覆盖任务声明的源码/受影响路径,尚未绑定完整补丁、环境工具身份、正式 fix 服务及可信门禁;本地事件与退出 0 均不能关闭 finding。 - -## 7. 修复与复检命令 - -### C32 — fix - -- **语法与价值**:`codeguard fix [path] --category <--dry-run|--apply> [--task TASK_ID] [--owner ID --lease-token TOKEN] [--format human|json]`;调用已声明的确定性原生修复器,把可机械修复的问题安全落到代码。 -- **输入与结果**:真实发现、匹配的工具/规则/内容、允许修改范围和recipe形成FixPlan。dry-run可在私有隔离副本运行修复器以产生真实补丁,但不改变项目源码、tracked任务或尝试预算;不能运行的预览明确为计划而非已生成补丁。 -- **执行与副作用**:apply确认适用范围和前置哈希,已初始化时按同一租约/attempt协议登记,隔离执行→核对变化范围→逐文件安全应用→原工具及受影响义务复检→写尝试/验证事件。未初始化时保留私有操作证据和临时简报,不声称产生持久任务。 -- **任务绑定**:`--task`将修复限定到该任务允许范围;它的语言/类别须与请求匹配。已有claim时必须同时传owner和token,复用租约但不接管已有未结束attempt;FixService登记自己的受控attempt,结束后不释放调用方租约。未持有租约时可只传task,由服务自行claim并在收尾时释放。已初始化且无task的批量apply先同步所用发现、映射受影响任务,并在同工作区事务中取得全部所需租约;任何冲突在应用补丁前返回3,不能悄悄跳过被占用任务。未初始化路径仅保留私有证据,不调用持久同步或任务租约服务;此时指定task须返回workspace_not_initialized。owner/token参数成对出现且要求task;dry-run只读任务,不领取或消耗预算。 -- **失败与后继**:没有原生修复能力返回3及人工修复简报;不偷偷让模型改代码或转成关闭规则。并发修改、越界补丁、部分应用、复检超时分别记录;多文件写入不伪称全原子。只回滚自己拥有且未被后续改动的内容。 -- **成功定义**:分别给出execution_succeeded、changed_files、verification和resolved_issue_ids;修复器exit0或无变化都不能得到fixed=true。存在其他必需违规时保留它们;单项修复成功不授权完整交付。 - -### C33 — task verify - -- **语法与价值**:`codeguard task verify [path] [--owner ID --lease-token TOKEN] [--format human|json]`;判断指定任务的关闭条件是否真的满足。 -- **输入与执行**:依据issue、规则/工具/政策身份和影响闭包重建验证计划,冻结当前内容后运行原检查器。环境任务先验证恢复条件,再重跑原来受阻义务;探测到JDK不等于项目已能通过构建。 -- **协作与副作用**:无租约时使用短期验证租约;若已有租约则要求对应token,不能冒用owner。不修改源码,持久保存运行报告并幂等同步相关发现和验证事件;结束时只释放本次自行取得的验证租约。 -- **判定与失败**:完整证据确认解决才追加code_fixed/dependency_fixed/environment_restored等状态;目标删除和政策处置必须有批准且可核验的独立依据。仍存在为1;覆盖不足、工具不可用、并发变化为3。若原问题解决但复检引出其他违规,原任务可按证据关闭,新发现同步保留,命令仍按本次验证结果返回1/3。 -- **下一步**:next推进剩余任务;无剩余任务也须check all/gate完成交付检查。不提供task close --force。 - -当前 Rust 局部入口支持 `codeguard task verify [path] [--owner ID --lease-token TOKEN] [--ruff-tool ABS_PATH] --format human|json`,复用 `lint python` 的原生 Ruff 路径并追加本地观察事件。无现有占用时 CLI 领取本地短期租约并在结束后释放;已有占用时必须借用匹配的 owner/token,错误 token 或无凭据的冲突请求在扫描前返回 3。扫描与事件写入之间再次核对 generation/token/期限及待验证 attempt-id,失租或新尝试插入时不提交复检事件,借用租约始终保留给调用者。验证事件 0.3 记录 attempt-id 或 null;报告丢失时不能消费旧复检预算结论,须重跑原工具。它尚无可信策略、长操作自动续租、Windows 等价实现与正式关闭协议,固定返回 3/`not_evaluated`;即使原问题消失,也只产生待策略核验候选。见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`、`task-verify-lease-binding.md` 与 `task-attempt-local-ledger.md`。 - -## 8. 宿主入口与兼容命令 - -### C34 — mcp serve - -- **语法与价值**:`codeguard mcp serve`;初版通过stdio提供结构化工具入口,供支持MCP的宿主复用统一内核。 -- **输入与结果**:宿主工作区与每个工具请求映射为同样的项目、选择、内容和运行选项;具体MCP tool names/schema由S11锁定并生成映射表。旧MCP工具名只能使用显式版本化映射。 -- **执行与失败**:serve仅启动协议服务,不自动初始化项目、扫描或安装。读写行为遵循对应核心操作。单请求的1/3/4/130作为结果语义返回,不把每个检查失败变成服务器进程退出;协议非法参数用MCP适配层错误表达,不混进工具日志。 -- **下一步**:已启用工作流的MCP扫描请求走scan→sync→brief;独立低层执行请求明示是否同步。取消传播至同一进程/快照运行时;服务关闭回收自身请求,不清空用户任务。 - -### C35 — compat legacy-v1 - -- **语法与价值**:`codeguard compat legacy-v1 <旧子命令与参数>`;为旧宿主迁移保留明确版本边界。 -- **输入与结果**:按旧入口的逐项协议映射参数、退出码与字段,标明protocol=legacy-v1、实际runtime和未认证边界。不能用一张通用退出码表覆盖旧check/CVE等差异。 -- **映射依据**:[legacy-v1 逐入口协议表](legacy-v1-protocol-map.zh-CN.md)分别列出七类旧 CLI、四个 MCP 工具、五类 Hook 的数字、字段与混合优先级;Rust 参数契约不把兼容出口升级为交付 allow。 -- **副作用与失败**:保留的旧写行为须由对应旧动作明确触发;新入口失败不自动回退到此命令。缺兼容运行时说明未完成,不安装旧环境自救。 -- **下一步**:逐入口迁移到Rust标准协议并验收。旧成功不生成新交付allow,旧skipGate变量也不授权新入口跳过检查。 - -## 9. 内部应用服务与执行架构 - -```mermaid -flowchart LR - CLI[CLI 参数与格式] --> Request[类型化请求与来源上下文] - MCP[MCP 请求映射] --> Request - Plugin[插件工作流入口] --> Request - Request --> Catalog[发现 / 配置 / 规则 / 能力服务] - Request --> Init[初始化服务] - Request --> Scan[计划 / 检查服务] - Request --> Gate[交付服务] - Request --> Work[任务 / 修复服务] - Gate --> Scan - Work --> Scan - Init --> Catalog - Scan --> Ports[core ports] - Catalog --> Ports - Init --> Ports - Work --> Ports - Ports --> Runtime[runtime:观察 / 快照 / 进程 / 存储] - Scan --> Adapter[adapter:计划 / 解析 / 覆盖] -``` - -这是调用关系;编译依赖仍是CLI装配、runtime/adapters依赖core,core不导入基础设施。命令处理器只做参数转换、调用服务和输出映射,不能各自实现一套扫描或gate。 - -| 核心应用服务 | 命令 | 可复用能力 / port | -|---|---|---| -| CatalogService / ProjectObservationService | detect、capabilities、rules、config、tools list | Registry、ObservationPort、PolicySourcePort | -| InitializationService | init | 画像构造、OwnershipManifest、WorkspaceStore、受管文本合并 | -| PreparationService / ToolchainService | doctor、tools verify/install | ToolchainPort、ExecutionPort、ArtifactInstallPort | -| PlanningService / CheckService | plan、六类检查 | 义务账本、Adapter、SnapshotPort、ExecutionPort、EvidenceStore、CachePort | -| DeliveryService | 三个gate | 内容请求解析、可信策略、CheckService、完整性判定 | -| RemediationService / TaskQueryService | sync、status、next、show | 事件归并、修复简报、RemediationStore | -| TaskLeaseService / AttemptService | claim、heartbeat、release、attempt | 跨进程事务、租约generation、幂等事件、预算 | -| FixService / TaskVerificationService | fix、verify | 受控补丁、AttemptService、CheckService、验证事件 | - -这些是逻辑边界,不要求一条命令新建一个crate。实体、值对象和纯判定在core;I/O由ports注入;运行结果进入同一渲染与协议层。新服务名称不代表已有可编译实现。 - -### 9.1 插件自动闭环 - -```mermaid -sequenceDiagram - participant H as 宿主插件 - participant C as 核心工作流 - participant T as 原生工具 - participant S as 证据与任务存储 - participant A as 智能体 - H->>C: 已启用项目的检查请求 - C->>T: 冻结范围并执行适用检查 - T-->>C: 原始产物和终止状态 - C->>S: 保存RunReport - C->>S: 幂等同步全部匹配未导入报告 - alt 同步成功 - C-->>A: 检查结论 + RepairBrief + 下一步 - else 同步未完成 - C-->>A: 原结论 + backlog_update_failed + 恢复动作 - end - A->>C: claim / attempt start - A->>A: 按任务修复 - A->>C: attempt finish / task verify - C->>T: 原检查器及受影响范围复检 - C->>S: 追加证据事件 - C-->>A: 解决 / 仍存在 / 未完成 + next -``` - -插件调用同一核心工作流API,不必为每个步骤启动一次二进制,也不复制状态机。同步失败影响工作流完成状态,不能改写已取得的quality gate;因此可能同时出现“检查已得出明确结论”和“任务保存未完成”。严格交付如何显示宿主错误由入口协议处理,不能据存储失败假造源码违规。 - -### 9.2 并发、取消与恢复 - -- 查询使用一致性视图;写操作带工作区身份、对象版本/事件父关系和幂等键,避免读到一半的新状态。 -- lease_token包含不可复用的租约身份和generation。旧进程同名owner不享有新租约;失租后只能保留诊断,不能提交状态事件。 -- run_id导入、attempt结束、租约释放各自定义幂等域;“再次执行”不等于再次写一份相同任务或历史。 -- 取消传播到进程树和执行DAG。已完成证据保留,未完成部分明确标识;不能因为用户取消就删除finding或伪造finish成功。 -- 多文件应用、初始化、安装允许部分完成,但记录精确恢复位置。任何rollback都只处理本次拥有且未被别人改动的内容。 - -## 10. 典型调用旅程 - -### 10.1 首次接入 - -```bash -codeguard detect . --format json -codeguard capabilities java --format json -codeguard init . --dry-run -codeguard init . --apply -codeguard config validate . -codeguard plan check all . --format json -codeguard doctor all . --format json -# 仅在需要安装并具有对应授权时,使用实际工具锁路径执行以下两步。 -codeguard tools install --lock codeguard.lock.json --dry-run -codeguard tools install --lock codeguard.lock.json --apply -codeguard tools verify . -codeguard doctor all . -codeguard check all . --format json -codeguard work sync . --format json -codeguard next . --format json -``` - -这是顺序示意,调用方必须消费每步结果并处理失败,不能无条件执行整段。非安装问题按doctor给出的具体动作恢复;未满足必需前置条件不代表可以跳过检查。 - -### 10.2 智能体修复单项任务 - -以下ID/token是协议占位符,实际值取上一条JSON结果;插件实现使用结构化传参,不解析human文本。 - -```text -codeguard task show CG-abc123 . --format json -codeguard task claim CG-abc123 . --owner agent-session-1 --format json -codeguard task attempt start CG-abc123 . --owner agent-session-1 --lease-token --action-id --format json -按任务允许范围修复,长任务期间携带同一token调用heartbeat -codeguard task attempt finish CG-abc123 . --owner agent-session-1 --lease-token --attempt-id --outcome ready-to-verify --format json -codeguard task verify CG-abc123 . --owner agent-session-1 --lease-token --format json -codeguard task release CG-abc123 . --owner agent-session-1 --lease-token --format json -codeguard next . --format json -``` - -若采用`fix --apply`,在claim后调用`fix ... --task CG-abc123 --owner agent-session-1 --lease-token --apply`,由FixService登记受控尝试并复检,不再由插件为同一个原生修复重复start/finish。不要先创建未结束的自由修复attempt再移交给fix;外层回合可关联子attempt但不重复计数。原生修复未支持时使用上述自由修复路线。 - -### 10.3 交付 - -```text -本地修复完成 → check all(工作树证据) -用户选择暂存内容 → gate pre-commit(index证据) -实际推送ref输入 → gate pre-push(ref证据) -受保护CI指定不可变OID → gate ci(可信交付证据) -``` - -完整检查可以按严格身份复用有效执行结果,但每个入口重新计算自己的交付条件;不同来源的“通过”不能互相替代。 - -## 11. 实现追踪与验收标准 - -| 命令范围 | 对应规格 | 实现任务阶段 | -|---|---|---| -| C01–C04、C06、公共参数/输出 | unified-cli-contract、native-tool-adapters | S01、S02、S05 | -| C05 | project-initialization、remediation-workflow | S09 | -| C07、C11–C13 | native-tool-adapters、execution-kernel、unified-cli-contract | S05 | -| C08–C10 | rulepack-governance、unified-cli-contract | S04 | -| C14–C19 | unified-cli-contract、native-tool-adapters、verdict-integrity | S02、S06–S08 | -| C20–C22 | execution-kernel、hook-protocol、unified-cli-contract | S03、S11 | -| C23–C31、C33 | remediation-workflow | S09 | -| C32 | execution-kernel、remediation-workflow | S10 | -| C34–C35 | unified-cli-contract、hook-protocol、binary-distribution | S02、S11 | -| C36 | unified-cli-contract、native-tool-adapters | S02、S05、S06–S08 | - -所有命令都要验证:参数合法/非法、支持格式、退出语义、允许副作用和未初始化行为;有状态命令另测并发、取消、重放与恢复。重点反例: - -1. 查询next没有任务,但缺乏新鲜全量证据:必须返回verification_required,不能allow。 -2. plan列出缺JDK仍正常完成计划,doctor返回未完成:两者无矛盾,不能把plan exit0当就绪。 -3. tools身份验证通过,但JDK不能启动:doctor未完成,check不得假通过。 -4. lint与CVE先后产生报告:sync消费全部;重复sync不重复tracked事件。 -5. 旧租约失效后新执行者领取:旧heartbeat/finish/release不能修改新状态。 -6. 修复器exit0但无变化、部分应用后超时:不能宣称fixed=true或清空原finding。 -7. 原任务修好但引入另一违规:原问题按证据关闭,新问题保留,不能宣布全项目通过。 -8. 工作树通过但暂存区旧内容失败,或推送非HEAD分支失败:对应gate阻断。 -9. tools install默认预览不下载;显式apply部分失败后重试只处理未完成且身份匹配项。 -10. MCP某请求超时而服务仍存活:该请求结果未完成,不能以服务器活着证明检查成功。 -11. check得到真实违规但sync写盘失败:保留原违规,另报工作流错误和恢复动作。 -12. compat返回旧数字成功:新CI不能据此签发allow。 - -help、参数schema、命令矩阵、CLI/MCP映射与测试样本应由同一注册定义生成并检查漂移;各命令是否具备真实工具验收另行记录。本文完整不代表36项入口已实现,也不替代后续全部语言和平台验收。 - -Go 任务现可使用 `codeguard task verify ID [path] --go-tool ABS_PATH` 复用相同受控 vet,并沿用任务租约、尝试绑定、报告同步和追加事件。环境仍受阻、仍有原发现、同文件同规则身份变化以及无发现候选分别解释;同规则新指纹不能直接解释为原问题消失。源码任务的 Go 0.7 报告绑定 task/path/源码摘要、整组源码摘要、原生文件范围观察和稳定输入标记;任务复检反馈为 0.4,事件仍为 0.3。next 核对报告摘要并消费观察,源码或模块配置变化后要求复扫。无发现仅为待规则/平台覆盖与策略核验候选,任务保持 open,尚非正式关闭/复发重开。 - -Go 源码任务复检另用相同工具和构建环境执行 `go list -json ./...`,记录目标 selected/excluded/not_selected/incomplete。构建标签、CGO 关闭或平台约束排除目标时,返回 rule_coverage_requires_review 并要求检查构建范围;原生清单失败为 incomplete。两轮之间或观察保存后整组源码、模块清单变化会使观察失效。该清单仅证明默认构建条件下的局部文件选择,不代表所有平台、features、规则或可信策略覆盖。 - -### tools install 的发行清单局部接线 - -当前安装预览支持 `tools install --lock FILE --distribution-manifest FILE [path] [--dry-run|--apply]`。反馈 0.2 对清单显示固定的读取/解析/锁绑定原因,逐工具展示包格式、包摘要和大小及源地址摘要;不输出原始地址。缺清单、错误身份或声明只覆盖部分工具不会消除准备缺口。绑定未批准不等于源可信,apply 仍阻塞在写入前。旧 0.1 schema 单独保留;可信下载、归档展开和正式安装未完成。验收见相邻 `codeguard-cli/tests/acceptance/tools-install-manifest-preview.md`。 - -安装 runtime 已有 ZIP/tar.gz 的内存展开及包流→冻结文件→缓存入口字节发布基础。后续支持有界 GNU 长路径、局部 PAX path/size 及无害全局描述,局部状态仅作用到下一成员;PAX size 按真实边界解析并与标准 tar 样本交叉核对。全局 path/size、sparse/链接、bundle 目录发布、可信下载/批准和正式 CLI apply 仍缺,预览不会调用这些基础 API 自行安装。验收见相邻 `codeguard-cli/tests/acceptance/tar-extension-verification.md`。 - -完整归档树入口现已保留空目录/父目录,内存 bundle-tree-v1 与本机原目录算法交叉核验通过;原文件集合 API 保留。摘要相符只证明输入树内容,包内前缀到锁 bundle 根、批准来源与目录发布仍须独立接通,`tools install --apply` 当前仍阻塞。验收见相邻 `codeguard-cli/tests/acceptance/unpacked-bundle-tree.md`。 - -显式 `project_unpacked_bundle` API 现可把完整归档中的指定目录映射为 bundle 根,先验证整树、按目录边界去前缀,保留空目录与未消费成员,并与实际落盘目录摘要交叉核对。此映射尚未进入发行清单或正式安装计划,不能从内容匹配推导批准来源或安装完成;apply 仍写前阻塞。验收见相邻 `codeguard-cli/tests/acceptance/bundle-root-projection.md`。 - -发行清单 1.1 现显式声明 bundle_archive_root;旧 1.0 保持只读观察,缺映射不能猜根。inspect_distribution_bundle 内容 API 已绑定清单/锁/冻结包/入口/子树并保留剩余成员;正式安装目的目录、可信来源与目录发布仍缺,预览/apply 不调用该 API 自行安装。验收见相邻 codeguard-cli/tests/acceptance/distribution-bundle-binding.md。 - -工具树发布 API 现可在 macOS/Linux 使用私有暂存和不覆盖目录重命名,将完整已匹配子树发布到内容寻址目录;复用前重验成员、内容、权限和类型,取消清理本次暂存。固定发行包已串联关联/发布与既有磁盘摘要交叉核验;这不是正式安装计划,外部入口/运行时与锁路径映射仍缺,预览/apply 不自动调用发布。验收见相邻 codeguard-cli/tests/acceptance/tool-bundle-publication.md。 - -完整布局 API 现使用清单 1.2 的 install_tree_sha256 绑定同一内容寻址目录下的锁入口和 bundle 根,保留原包路径与全部普通成员;错路径不重写锁,旧清单缺布局不猜测。实际发布后原锁只读制品核验通过,但正式安装预览/来源批准/下载/运行时与恢复仍缺,apply 不自动调用该 API。验收见相邻 codeguard-cli/tests/acceptance/distribution-layout-binding.md。 - -当前安装预览反馈已升级 0.3,逐声明解释完整布局路径绑定、缺完整树声明及 raw 不适用;只公开内容寻址目录和定位摘要,human/JSON 明示内容核验 not_run。预览不读取包或调用发布,未批准 apply 仍写前阻塞。旧 0.2 schema 单独保留,验收见相邻 codeguard-cli/tests/acceptance/tools-install-layout-preview.md。 - -新版 raw 内容 API 现精确绑定原锁的二进制摘要.bin 定位,分块核验冻结字节并返回无复制借用视图;新版绑定预览下一步为核验来源/原包,旧声明仍需定位映射。显式本机 Ruff 0.16.8 串联发布与原生版本观察通过,来源/质量权威未授予;实际下载、运行时和正式 apply/恢复仍缺。验收见相邻 codeguard-cli/tests/acceptance/distribution-raw-binding.md。 - - -### ESLint 显式目录入口实施进展 - -当前Rust `lint typescript PATH` 已支持显式单配置目录逐文件调度。目录反馈与单文件反馈分别版本化,保留各文件原生结果、稳定任务同步、未执行范围和跳过原因,共享预算;配置文件作为源码也照常检查。目录使用原参数声明的配置/cwd,完整monorepo配置选择、TS及依赖覆盖仍待实现,不能据局部结果授予门禁。验收见相邻`codeguard-cli/tests/acceptance/eslint-directory-feedback.md`。 - - -### ESLint 子项目显式配置上下文 - -目录检查可通过 `--config-map ABS_PATH` 选择多个子项目原上下文。映射协议为 `{"schema_version":"1.0","projects":[{"root":"packages/api","config":"packages/api/eslint.config.cjs","cwd":"packages/api"}]}`,路径均相对当前检查目录根。最深匹配目录组件生效,未命中沿用原 `--config` / `--cwd`;配置选择与批准规则覆盖仍为两个独立状态。映射有界并绑定摘要,重复/越界/未知字段拒绝,变动停止后续文件。目录反馈0.2逐文件展示选择范围和来源,不将本地JSON升级为白名单或交付权威。真实双项目及故障验收见相邻 `codeguard-cli/tests/acceptance/eslint-config-map.md`。 - -### 2026-09-27 当前npm局部CVE入口 - -相邻Rust工程已提供Unix `cve typescript PATH`,通过显式`--node-tool ABS --npm-entry ABS --npm-version VERSION --userconfig ABS --globalconfig ABS`选择原生上下文,可加`--registry URL --timeout 90s --format json`。省略源为离线观察,不能确认数据库覆盖。该入口输出配置状态、脱敏advisory/锁版本和下一步,局部反馈保持退出3及交付未判定;尚未自动连接check all和稳定修复任务,完整命令计划未完成。实际验收见相邻`codeguard-cli/tests/acceptance/npm-public-cve-feedback.md`。 - - -### npm子项目的显式父工作区 - -Unix局部CVE命令可指定`--workspace ABS_PATH`,项目目录仍是原生执行cwd,报告及任务归属该已初始化物理父目录;不指定时使用项目自身。默认预算来自所选工作区,next复检保留该参数。越界项目和符号链接工作区别名在原生启动前拒绝。此归属能力不证明漏洞库覆盖或完整交付门禁。 - - -### npm稳定任务复检入口 - -Unix `task verify ID WORKSPACE --node-tool ABS --npm-entry ABS --npm-version VERSION --userconfig ABS --globalconfig ABS [--registry URL]` 按结构化任务构建根调用原审计服务;预算取父工作区,持有租约时同时传owner/token。human/JSON返回诊断与脱敏advisory并记录尝试,局部零发现仍待覆盖核验、不关闭;原生失败保持环境诊断。输入变化后历史结果失效,next要求重新复检。 - - -### check all的npm原生任务 - -Unix全项目检查现可提供显式Node/npm/具体版本/原用户及全局配置/可选registry参数,将已发现package根纳入共享jobs和deadline。各根原生结果独立,统一反馈后串行同步父工作区稳定任务并给next;缺上下文只展示配置发现,Java局部入口拒绝npm参数。check反馈0.24/中止反馈0.5增加逐根npm结果,历史schema单独保留。可信上下文自动解析及完整漏洞覆盖尚未完成。 - - -### 2026-09-27 npm缺锁准备观察 - -已有初始化工作区和可绑定清单时,公开CVE、显式npm check all、task verify缺锁会生成同一稳定完整性任务,提示恢复锁及原工具复检,不执行安装或把缺锁变成源码漏洞。观察0.2明确lock_state=missing且摘要为空;普通观察0.1仍严格读取。消费者现为check_feedback0.25、task_verification_preview0.5、check_aborted0.6,旧schema保留。锁恢复、链接或输入变化会使旧缺锁收据失效,不重复建任务。不可读/坏清单任务、自动上下文选择和完整门禁仍未实现。 - - -### 2026-09-27 默认全项目npm准备调度 - -当前Unix CLI的check all无需npm参数也会为已发现根准备稳定任务;未配置工具时不执行原生命令,初始化工作区中输入可绑定才同步并返回next。重复扫描和补齐参数后的原生观察沿用任务。未初始化不自动init,Java-only不运行npm。此为CLI接线,不表示插件Hook或可信上下文自动解析已完成,也不取得CVE覆盖/门禁权威。 - - -### 2026-09-27 npm不可用输入与复检历史 - -公开CVE或既有任务复检可记录清单/锁缺失、非普通文件、路径别名及有界读取失败;仅可读普通文件填内容摘要,其余为null。新观察0.3明确两个输入状态与诊断,继续复用稳定任务;恢复读取/物理路径后旧状态失效。尝试指纹记录状态,不成为源码修复或门禁依据。消费者check0.26/verify0.6/abort0.7,旧协议归档。默认check all只有发现且身份可绑定的根才调度,清单完全丢失的历史根恢复发现仍待补齐;外部工具/配置状态和宿主Hook尚缺。 - - -### 2026-09-27 历史npm准备范围恢复 - -默认check all在Unix上读取当前0.3初始化画像及受管摘要,恢复物理目录仍存在但清单当前不可用的准备范围。只生成本轮状态和稳定任务,不以历史摘要或当前显式工具参数启动该历史根的原生检查;当前其它根独立调度。画像不一致/错误路径/重复字段明确历史范围未完成,清单恢复后重新发现。此为本地范围线索,不是覆盖或批准;整体目录丢失、画像刷新删除旧根后的义务恢复及宿主接线仍缺。详见相邻Rust验收npm-historical-roots-workbench.md。 - - -## 2026-09-27 Rust 文档接入完整检查调度 - -`check all` 对 Rust 项目分别调度 `rust.comments` 与 `rust.lint`,共享总截止时间和 Cargo 资源互斥。文档节点复用 `comments rust` 的锁定离线库目标观察服务;两项的结果、未完成状态及准备任务独立保留,Clippy 成功不能覆盖文档缺工具或缺锁。初始化工作区后,文档报告自动同步为稳定问题和修复任务;下一步会继续指引尚未处理的任务。human 输出包含规则、位置、依据及同步状态。 - -当前 check_feedback 升级 0.27,check_aborted 升级 0.8,保留历史 0.26/0.7 schema;新协议嵌入独立 Rustdoc 0.4 观察并保持自包含。局部原生成功仍不证明原项目规则、全部 workspace/features/targets 覆盖或交付通过;正式关闭重开、可信策略与宿主验收仍缺。验收见相邻 Rust 工程 `tests/acceptance/rustdoc-check-all.md`。 - - -## 2026-09-27 Rust 原生构建解析前置 - -相邻 Rust adapter 新增独立 Cargo check JSON 流解析,保留原生编译错误编码、package/manifest/target 和主定位字节范围;不复用 Clippy 或 Rustdoc 的规则分类。完成事件与退出码矛盾、坏 JSON/重复键、结束后事件、未知记录、无法归属的编译失败及越界报告均为未完成。已观察诊断在后续流损坏时只作调查证据,不据裸 exit 101 判定源码违规。 - -真实既有 Cargo 样本验证类型错误 E0308、成功类型检查及构建脚本失败;成功样本的故意失败测试未执行,不能称测试通过。该解析前置尚未接入公开 build rust、共享运行时服务、原输入/工具绑定、同步任务、task verify、check all 或完整 workspace/features/targets,因此仍为局部前置,7.1不勾选。验收见相邻 Rust 工程 tests/acceptance/cargo-build-native-observation.md。 - - -## 2026-09-27 Rust 构建公开入口 - -`build rust [path] --cargo-tool ABS_PATH [--timeout DURATION] --format human|json` 已通过共享runtime执行锁定离线的all-targets类型检查。反馈区分原生成功/编译错误和环境未完成,固定build_level=type_check/test_execution=false;输入/工具/源集合变化或取消不给源码修复许可,取消返回130。原生范围绑定与七项修复简报只针对本轮唯一局部目标,包身份以摘要反馈。普通退出3和交付not_evaluated不伪称完整质量通过。该阶段尚未接入任务同步和task verify;当前阶段进展见下文。check all、完整构建组合与可信策略仍待接入;验收见相邻tests/acceptance/rust-build-cli.md。 - - -## 2026-09-28 Rust 构建工作台接线 - -已初始化工作区的 `build rust` 把本地0.2报告入队并调用统一 `work sync`,有效编译错误生成稳定fact和七项Markdown任务;同一问题重复检查只更新观察,不复制任务。缺工具/锁、坏原生流及已变输入生成准备任务,队列导入重算当前源码范围指纹,绑定目标源码摘要;旧目标变化只留历史和重扫阻塞,伪造指纹拒绝导入。`next` 识别 `rust.cargo_check` 并指向原工具构建复扫。 - -任务复检已接入 `codeguard task verify CG-... . --cargo-tool ABS_PATH --format json`:以任务租约和统一截止时间重跑同一原生Cargo check,保存绑定源码、根清单、锁和工具身份的0.1复检封套及0.8公开反馈。编译错误仍在为`still_present`;零诊断仅为`candidate_absent_unverified_policy`,任务仍open。`next`现在指向`task verify`并核对当前复检事件;可信白名单批准、完整项目策略/构建组合、正式关闭复发和交付门禁仍未接通。验收见相邻Rust工程tests/acceptance/rust-build-task-verification.md。 - -工作台同步和原工具复扫指引不等于正式 `task verify`、任务关闭或交付批准。包身份仅以本地观察摘要存储,未取得可信来源;完整 workspace/features/targets 和所有构建/测试等级仍缺。报告协议0.2,旧0.1 schema保存只作历史解析边界;验收见相邻 `codeguard-cli/tests/acceptance/rust-build-workbench-sync.md`。 diff --git a/docs/rust-cli/coverage-and-acceptance.zh-CN.md b/docs/rust-cli/coverage-and-acceptance.zh-CN.md deleted file mode 100644 index 38e9495..0000000 --- a/docs/rust-cli/coverage-and-acceptance.zh-CN.md +++ /dev/null @@ -1,174 +0,0 @@ -# Codeguard Rust CLI 语言迁移与验收设计 - -状态:能力矩阵工程基线已落地,原生适配与真实验收待执行。语言清单取自 `03ebb24` 的 [scripts/languages.json](../../scripts/languages.json),共 57 项:54 stable、3 planned。表中工具是旧注册声明或迁移调查入口,**不是已核验的新适配器能力**。尚未实现的 Rust 适配器不计完成;只有 formatter 的旧 stable 也必须补足真实只读检查。 - -## 1. 每种语言的能力账本 - -每一 language/module 都生成 `lint/comments/dependencies/cve/security/build` 六个发行能力槽位,分别记录 `implemented / gap / not_applicable`,并附 adapter、规则、工具版本和验收记录。项目运行时另按[静态检查配置目录](static-check-catalog.zh-CN.md)探测 `configured/missing/invalid/unknown`;目录中的 28 个候选检测族不要求每个项目逐项配置或证明执行。 - -- `implemented` 只表示具备通过验收的实现;一次运行仍可能 incomplete。 -- `gap` 表示有义务但没有可靠能力,交付不能通过。 -- `not_applicable` 必须有结构性理由,例如完整依赖发现证明没有第三方组件,或配置文件语言没有独立编译步骤。缺工具、缺规则、扫描失败不能作为理由。 -- 外部 ecosystem 扫描可满足多个相关语言的 CVE 义务,但需要可追溯映射。纯 Markdown 的 build 可能不适用,其链接站点构建、文档规则仍按项目声明产生义务。 -- 宣传能力矩阵由同一注册数据生成;明确语言/类别/平台覆盖,不能只有“支持 57 种语言”的单一数字。 - -Go 六类别的第一版候选档案见相邻 Rust 工程 `codeguard-cli/rulepacks/go_static_candidate_v1.json`,由 `go-static-candidate:1.0.0` schema 和 Rust 解析器校验。它只覆盖 Go Modules 方言的调查入口;五个候选平台均未完成原生工具验收,六类全为 `applicable/gap`。`lint` 候选 `go vet`,`comments` 候选显式启用 ST1000/ST1020/ST1021/ST1022 的 Staticcheck,`dependencies` 候选 `go list -m -json all`,`cve` 候选 govulncheck,`security` 候选 gosec,`build` 候选 `go build`。其中 [Go 文档注释规范](https://go.dev/doc/comment) 要求导出名有注释,但 [Staticcheck 所列的注释规则](https://staticcheck.dev/docs/checks) 不是完整的“缺全部导出符号注释”证明;`gofmt` 只是格式化器。Go Modules 的依赖图与 workspace/replace 归属、漏洞库时效、gosec 工具链要求、build tags、`go test`、许可证/SBOM 和跨平台目标都保留为缺口。此档案不会改变 `codeguard capabilities go` 当前的 `gap`,也不能作为运行或通过证据。 - -## 2. 全量迁移清单 - -波次仅是执行顺序:A 先跑通端到端,B/C 补齐现有 stable,P 保留原 planned 路线图。全量迁移必须完成 A/B/C;P 不强制虚构实现,但如果目标项目要求 P 对应能力,仍不能通过。 - -| language ID | 旧状态 | 旧 lint 声明/调查入口 | 波次 | 必须验证的差异 | -|---|---|---|---|---| -| java | stable | Maven verify | A | P3C、注释、安全、CVE 各自取证;Maven/Gradle/JDK 矩阵 | -| rust | stable | cargo clippy | A | workspace/features/targets、rustdoc、依赖审计 | -| typescript | stable | ESLint | A | JS/TS 别名、parser、tsconfig、type-aware 上下文 | -| python | stable | Ruff | A | 目标 Python、docstring 规则、依赖图 | -| go | stable | go vet | B | 多模块、build tags、依赖与文档规则 | -| csharp | stable | dotnet format --verify-no-changes | B | analyzer、solution、目标 framework、XML 文档 | -| kotlin | stable | Gradle detekt | B | Kotlin/JVM 版本、Gradle 项目与 KDoc | -| swift | stable | SwiftLint | B | Swift/Xcode 工具链、平台与文档规则 | -| php | stable | php -l | B | 语法检查不能代表完整编码规范;配置与 PHPDoc | -| ruby | stable | RuboCop | B | Ruby 版本、cop 配置、依赖与注释 | -| scala | stable | scalafmt --check | B | 格式之外的诊断义务及 Scaladoc | -| shell | stable | ShellCheck | A | sh/bash/zsh 方言分别建模;不得静默抛弃 zsh | -| dockerfile | stable | Hadolint | A | Dockerfile 变体、配置安全与镜像依赖范围 | -| yaml | stable | yamllint | B | 原生配置与 YAML 方言、模板文件 | -| elixir | stable | Credo | B | Mix project、依赖、模块文档 | -| css | stable | Stylelint | B | CSS 方言及插件,不能将任意预处理器当 CSS | -| c | stable | clang-tidy | B | compile_commands、目标平台、头文件上下文 | -| cpp | stable | clang-tidy | B | 编译数据库、模板、标准版本、头文件 | -| objc | stable | clang-tidy | B | Objective-C/Objective-C++ 与 SDK | -| dart | stable | dart analyze | B | SDK、analysis_options、pub 依赖 | -| vue | stable | ESLint | B | SFC parser、template/script/style 覆盖 | -| svelte | stable | ESLint | B | Svelte parser/plugin 与编译上下文 | -| astro | stable | ESLint | B | Astro parser/plugin、模板与内嵌语言 | -| solidity | stable | Solhint | B | pragma/compiler、静态安全和依赖 | -| terraform | stable | TFLint | B | provider/module 版本、IaC 安全与锁 | -| nix | stable | deadnix | B | dead-code 不代表完整安全;Nix 表达式和锁 | -| html | stable | HTMLHint | B | 模板方言显式适用,不能正则过滤后假装全覆盖 | -| sql | stable | SQLFluff | B | dialect、templater、项目配置 | -| graphql | stable | ESLint | B | schema/operation/plugin,上下文关联 | -| protobuf | stable | buf lint | B | module/workspace 与依赖 | -| markdown | stable | markdownlint-cli2 | B | 项目规则、代码块、MDX 等方言 | -| toml | stable | Taplo | B | TOML/schema 规则与项目归属 | -| haskell | stable | HLint | C | GHC extensions、项目依赖、文档规则 | -| ocaml | stable | ocamlformat --check | C | 原命令可执行性、Dune/opam、格式之外义务 | -| fsharp | stable | dotnet fantomas --check | C | F# 项目/工具锁与编译诊断 | -| perl | stable | Perl::Critic | C | Perl 版本、profile、POD | -| groovy | stable | npm-groovy-lint | C | Groovy/Gradle 方言与只读执行模式 | -| clojure | stable | clj-kondo | C | namespace/classpath、配置与文档元数据 | -| powershell | stable | PSScriptAnalyzer | C | PowerShell 版本、对象报告与 comment help | -| zig | stable | zig fmt --check | C | 格式与编译义务分离、Zig 版本 | -| nim | stable | nim check | C | 命令真实输入、项目入口与依赖 | -| crystal | stable | Ameba | C | Crystal 版本、shards、文档规则 | -| julia | stable | lint 为空;旧表有 format 能力 | C | 找到并验证只读检查器,不以 formatter 宣称 lint 完成 | -| elm | stable | elm-review | C | review 项目配置、依赖与锁定规则 | -| lua | stable | Luacheck | C | Lua 版本/globals、文档约定 | -| luau | stable | luau-analyze | C | Luau 类型环境,不能复用 Lua 语义 | -| pascal | stable | lint 为空;旧表有 format 能力 | C | 编译器/方言与只读检查能力补齐 | -| r | stable | lintr | C | R 版本、包项目、对象报告与文档 | -| cfml | stable | CFLint | C | CFML 引擎、模板和报告版本 | -| cobol | planned | 无 | P | 显式 capability gap,保留迁移记录 | -| vbnet | stable | dotnet format --verify-no-changes | C | VB analyzer、solution、XML 注释 | -| erlang | stable | Elvis | C | OTP/rebar、规则与文档 | -| arkts | planned | 无 | P | SDK/编译器可用性未知,不能标成功 | -| metal | planned | 无 | P | Apple SDK 能力未知,不能标成功 | -| liquid | stable | theme-check | C | 主题结构、Liquid/HTML 边界 | -| cuda | stable | clang-tidy | C | CUDA toolkit、host/device、编译数据库 | -| ansible | stable | ansible-lint | C | collections、playbook、依赖及安全规则 | - -旧表只有 lint 声明并不代表其它类别不需要做;每行必须附完整六槽位记录后才可以验收。`java`/`kotlin`/`scala` 等可共享 Maven/Gradle 依赖图,不能重复扫描造成重复 CVE,也不能漏掉另一构建根。 - -## 3. 必备场景库 - -每个新 stable adapter 至少含以下 fixture 类型;工具模拟只测执行边界,最终必须用真实二进制完成正反例。 - -| 编号 | 场景 | 验收 | -|---|---|---| -| F01 | 正确源码,正确配置与版本 | 完整、零阻断违规;实际目标非空 | -| F02 | 一条确定违规与对应最小修复 | 检出规则和正确位置;复检不再有该 finding | -| F03 | 缺命令/运行时、版本不兼容、坏配置 | incomplete,违规数不因工具故障虚增 | -| F04 | 原生非零但没有有效报告 | incomplete,不靠通用 rc 推断违规 | -| F05 | 有效违规后超时/崩溃/输出截断 | 保留 finding,同时 incomplete | -| F06 | exit 0 但空/畸形/陈旧/矛盾报告 | incomplete,不能假 PASS | -| F07 | 模块/方言/生成代码/配置继承 | 按批准规则准确覆盖;不能自行扩大或缩小 | -| F08 | 字符编码、特殊路径、空格、换行、非 UTF-8 | 身份可逆;无注入、无静默丢目标 | -| F09 | 内容或原生配置同大小同 mtime 替换 | 缓存失效;检查绑定实际输入 | -| F10 | 规则/工具/漏洞库更换 | 重新计算,不复用旧通过 | -| F11 | 50/51 文件、顺序变化、并发度变化 | findings 和 gate 等价;只有耗时变化 | -| F12 | 历史问题在未修改文件 | existing 分类,仍按相同规则阻断 | -| F13 | Agent 尝试 skipGate/env/suppression/提高阈值 | 不能获得新交付 allow,留下策略差异 | -| F14 | formatter 成功但无变化/失败后部分变化 | 分开执行成功、内容变化与已修复 | -| F15 | 原始诊断含凭据,日志目录/文件 symlink | 公共报告脱敏,目标不被意外覆盖 | -| F16 | index 与工作树不同、多 ref/non-HEAD push | 检查真实内容;不改 index | -| F17 | 所有发现为零但有一个必需类别缺能力 | exit 3,不能签发交付通过 | -| F18 | 点前缀源码/配置/.env | 普通面不扫描不逐文件报告;配置发现及入库安全例外保留 | -| F19 | Java verify 没绑定 P3C/Javadoc | 不得据 verify 成功声称全部质量义务完成 | -| F20 | 库过期/离线、模糊包匹配、未知严重度 | CVE 不伪造安全通过,也不伪称确定高危 | -| F21 | stdout/stderr 洪流、fork 子孙进程、取消 | 有界结束、清理、部分证据、无孤儿进程 | -| F22 | 同一请求 CLI/MCP/Hook/CI 输出转换 | 语义一致,协议退出码按各自表映射 | -| F23 | 多工具重复发现或同规则多次出现 | 归并可追溯,次数不丢失,不跨文件抵扣 | -| F24 | 项目脚本禁用 analyzer 或自定义命令仅 echo | 覆盖不足,不能被命令 exit 0 欺骗 | -| F25 | 查询/计划/初始化/安装成功、空任务、MCP服务存活 | 操作成功与质量认证分开,next无完整证据时要求验证 | -| F26 | 同名旧owner、租约过期、finish重放、fix接管、doctor重复同步 | token/generation隔离、attempt不重复、导入身份明确,失败和部分状态可恢复 | - -## 4. 误报与漏报的评测方法 - -采用两层语料:确定性合成正反例用于边界与回归;脱敏的真实项目样本用于规则适用性、方言、依赖与报告准确性。样本按语言、类别、工具版本和项目规模分层,保留独立 holdout,不能只挑工具最容易通过的项目。 - -每条裁定记录由人工或经过确认的 oracle 给出:应有 finding、规则依据、位置/依赖定位、应有执行状态、覆盖义务。争议样本单独统计,不靠模型投票充当真值。样本来源、版本、内容摘要、工具锁、裁定理由随报告归档。 - -| 指标 | 定义 | 防止指标失真 | -|---|---|---| -| Precision | TP / (TP + FP) | 附 finding 样本量;无发现时记不可估计,不能报 100% | -| False discovery rate | FP / (TP + FP) | 不与传统 FPR 混称 | -| Recall | TP / (TP + FN) | 使用已知真问题语料,保留漏报原因 | -| 工具故障误判率 | 被错误标成代码违规的故障样本 / 全部故障样本 | 单列,不与代码 FP 混在一起 | -| 完整率 | 完成且覆盖匹配的必需义务 / 全部适用必需义务 | 删除义务、增加排除会进入差异审计 | -| 假通过数 | incomplete、坏证据或已知阻断违规却 allow 的样本数 | 必须为零;未知不能算通过 | -| 稳定性 | 相同输入/工具/规则/库身份重跑结果一致比例 | 按规则定位不稳定来源 | -| 性能 | 同环境冷/热启动、p50/p95、峰值内存、缓存命中 | 对比覆盖/规则/工具完全一致 | - -建议发布门槛(目标,不是已达成指标):确定性必备场景零假通过、零工具故障误判;新增 adapter 必须检出其全部预置真问题;关键安全/CVE 回归零漏报;每个有足够裁定样本的 adapter/category 的 precision 95% Wilson 下界至少 0.98。没有足够样本的能力不得借全局平均值升级为充分验证;预览版本标明证据不足。 - -统计门槛调整属于人工可审查的验收标准变化,智能体不得为了完成任务调低。每个分层至少列出 n、TP、FP、FN、区间、规则数和项目数;CI 跑固定离线集,周期性真实工具/漏洞库运行单独跟踪,避免网络波动污染确定性回归。 - -性能先建立基线,再由维护者冻结绝对预算;本次不编造毫秒级承诺。验收首先要求优化前后发现集合、完整性、覆盖身份等价,才比较启动、扫描和缓存性能。 - -## 5. 发布与迁移验收矩阵 - -| 层次 | 证据 | 不可替代它的证据 | -|---|---|---| -| Rust 源码 | fmt/clippy/test、依赖方向、schema/fixture 测试 | 文件存在或编译成功 | -| 工具适配 | 固定工具链真实正反例、故障与修复复检 | mock 输出解析通过 | -| 全语言覆盖 | 54 stable 六槽位验收 + 3 planned 明示 | Java/Python/Rust/TS 演示 | -| Git/CI | 实际 index、多 ref push、受保护策略测试 | Shell 字符串静态识别 | -| 制品 | target triple、摘要/签名、安装及离线 doctor | Release 页面存在 | -| 插件接入 | Codex/ZCode/Kimi 每种事件真实调用新二进制 | manifest 语法正确 | -| 市场与安装 | source/lock/vendor/market/installed version/digest 对齐 | 本地单元测试通过 | -| 产品结果 | 固定语料 precision/recall/完整率与历史差异裁定 | “误报已经很低”的主观描述 | - -验收记录建议包含 `requirement_id / task_id / fixture_or_project / tool_lock / source_digest / expected / actual / artifact_refs / reviewer / date`。任务只有对应证据可定位且通过时才勾选。 - -## 6. 规范到任务追踪 - -以下是阶段级导航;逐条Requirement、36项命令、57个语言、5个平台和3个宿主的具体任务ID与执行里程碑见 [实施覆盖索引](../../openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md)。该索引不维护第二份勾选状态。 - -| 规格能力 | 任务阶段 | 主要场景 | -|---|---|---| -| unified-cli-contract | S01、S02、S04、S05、S11 | F17、F22、F25、C01–C36 错参/空输入/预算/副作用 | -| native-tool-adapters | S05、S06、S07、S08 | F01–F08、F19、F20、F23、F24 | -| rulepack-governance | S04、S05、S12 | F07、F10、F12、F13、F18 | -| verdict-integrity | S02、S12 | F03–F06、F12、F17 | -| execution-kernel | S03、S10、S12 | F08–F11、F14–F16、F21 | -| language-gate-commands | S05–S08、S12 | F03、F07、F11、F19 | -| hook-protocol | S11、S12 | F13、F16、F22 | -| binary-distribution | S11、S13 | 摘要不匹配、无网络、版本回滚、三宿主实机 | -| remediation-workflow | S09、S10、S11、S12 | F25、F26、重复发现归并、跨类别同步、attempt 预算、复检关闭/重开、租约冲突 | -| scan-scope-policy | S04、S09、S12 | 自有产物不递归扫描、用户源码仍检查、入库安全不豁免 | -| project-initialization | S09、S12 | 多语言/版本来源、分类型模块图、架构推断、AGENTS 保留、画像失效、初始化不等于门禁通过 | - -## 7. 完成边界 - -当前已完成四 crate 与能力矩阵的工程基线;上述表格无一构成适配器已实现证明。实施顺序与核对框统一位于 [OpenSpec tasks](../../openspec/changes/introduce-rust-codeguard-cli/tasks.md)。旧实现对照仅用于解释差异,不作为新系统必须复制错误的依据。 diff --git a/docs/rust-cli/false-positive-allowlist.zh-CN.md b/docs/rust-cli/false-positive-allowlist.zh-CN.md deleted file mode 100644 index ae1b625..0000000 --- a/docs/rust-cli/false-positive-allowlist.zh-CN.md +++ /dev/null @@ -1,202 +0,0 @@ -# CodeGuard 误报白名单设计 - -状态:规范设计与局部实施。相邻 Rust 工程已有精确身份比较、候选解析、期限/冲突筛选、批准快照字节绑定与撤销/替代链校验,以及单快照和多跳 Ed25519 签名核验 API。只读 `rules whitelist list/explain` 展示候选、失配字段和下一步;普通 `propose` 只展示当前本地观察,纠错 `propose --record` 可保存待审事件与可读附件。命令仍固定 `authority=unverified`、`gate_effect=none`,不能自行批准或放行。`config validate/explain` 对本地排除、自定义命令及白名单引用标记未授权;Ruff F401/E501 的候选规则映射也不证明策略批准。可信公钥、摘要、时钟和防回滚状态来源,完整候选生成、配置校验、批准发布与宿主门禁尚未接通。规范性要求以 [OpenSpec rulepack-governance](../../openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md) 为准。 - -当前 Python Ruff 0.16.8 局部扫描还从原生 `--show-settings` 记录逐文件全局启用规则及逐文件忽略配置。设置观察可指出“规则未启用”或“可能被逐文件忽略”,但不能证明源码内 `noqa` 等抑制不存在;反馈固定 `coverage_proven=false`。这份观察不能代替受批准 required rule 集合和完整覆盖核验,见相邻 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 - -后续局部扫描增加同轮原生 `--ignore-noqa` 对照:`# noqa`、`ruff: ignore` 等源码注释造成的诊断差额单独展示。仅有注释抑制而无活动 finding 的文件标记 `suppressed`,不标普通 `passed`;抑制结果不自动变成源码违规或白名单命中。若原任务复检时同规则抑制出现,`task verify` 返回 `suppression_requires_review`,`next` 要求核查抑制及批准依据,任务保持 open。逐文件配置忽略及受批准规则覆盖仍须独立核验,见相邻 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 - -原任务复检还会核对同轮原生设置:原规则未启用时返回 `rule_coverage_requires_review`;存在逐文件忽略配置时返回保守的 `suppression_requires_review`。两者都不能从“本次零诊断”推导已修复;当前只给待核查观察,不签发批准或关闭任务。 - -Rust Clippy 局部任务复检在普通扫描零诊断时,用同一工具对原规则运行原生 `--force-warn` 对照,并绑定目标源码字节、manifest 与工具摘要。原稳定 finding 被强制告警重新检出时标记 `suppression_requires_review`;两轮都无发现仅为 `candidate_absent_unverified_policy`,对照损坏或输入变化为 `incomplete`。这只是本地原生观察,不验证全部 features/targets 或可信规则策略,也不把原生抑制当作误报白名单批准。 - -Rust 编译任务的 `task verify` 现可用原生 Cargo check 复检并把观察写回同一稳定任务。相同错误仍在为 `still_present`,本轮零诊断仅为 `candidate_absent_unverified_policy`;类型检查没有执行测试,也没有核验完整构建组合。编译错误或工具故障不因本地白名单候选而消失,白名单正式生效仍取决于独立批准与完整门禁。局部验收见相邻 `codeguard-cli/tests/acceptance/rust-build-task-verification.md`。 - -ESLint 局部任务复检现也调用原生 `--print-config FILE` 核对原规则有效级别。只修改导入配置把规则关闭、主配置及源码不变的真实反例返回 `rule_coverage_requires_review`,next 提醒核查配置和批准依据,不能解释为修复或有效白名单。查询失败仍未完成;这项观察未证明完整导入闭包、TS 插件或受批准规则覆盖,见相邻 `codeguard-cli/tests/acceptance/eslint-effective-settings.md`。 - -## 目标与边界 - -### 用户纠正白名单的操作约定 - -用户应能从对话中选中原问题,查看“为什么报、为什么未命中、需要纠正什么”。智能体返回原生规则依据、精确目标、当前候选或批准决策、失配字段和复检动作,随后将纠正记录附到同一稳定问题。无需用户直接维护匹配摘要或编辑原始报告。此为目标交互,不能把现有只读查询当作完整交付能力。 - -- 新增:复核原工具误判,生成精确候选;批准后下一轮仍执行原工具,只豁免匹配的问题。 -- 修改:理由、目标、工具身份或期限改变都产生新版本;旧批准不能授权修改后的字节,替代决策须重新批准。 -- 撤销:保留旧记录,恢复原问题的正常处置;若问题仍被原工具发现,恢复对应待处理任务。 -- 到期或失配:解释具体原因,给出复核任务;不得自动续期、扩大范围或删除问题。 - -对话必须分别显示“待审”“已批准且本轮命中”“失效/撤销”,不能用统一的“已忽略”混淆三者。白名单纠错任务的完成条件是裁定和本轮处置可核验;源码修复任务的完成条件仍是原工具复检,不因白名单文件修改而记为代码已修复。 - -白名单用于纠正**经过复现和裁定的误报**,不是跳过检查器、降低规则阈值或默认忽略历史问题。原生工具照常运行、原始 finding 照常保留;白名单只在报告解释与门禁处置阶段匹配该 finding。无效、过期或来源不可信的条目不生效。确实存在但团队决定接受的风险属于独立的 `accepted_risk` 例外,不能标成误报;工具崩溃、配置不明、覆盖不足或漏洞库过期属于 `incomplete`,也不能进入误报白名单。 - -坏报告的 `state/import-failures/` 本地收据只记录脱敏失败原因和报告字节摘要,供 `next` 指出修复动作;它没有原生 finding 身份、批准权威或门禁效力。报告修正后必须重新同步和原生复检,不能通过编写白名单候选来消除同步失败。 - -项目启用规则与 CodeGuard 探针规则不一致时,应先修配置解析或适配器。例:Maven POM 只声明 P3C `ali-naming.xml`,探针不能以模板中的 `ali-comment.xml` 生成作者注释 finding;也不能为这类多扫问题申请白名单来掩盖适配错误。POM 身份变化或无法确定生效规则集时,返回配置阻塞和重新发现动作。 -原生报告也不能自证规则归属:PMD XML 若声称来自未启用的 P3C 规则集,或把另一个规则集的 ID 写入已启用规则集,应先标记报告未完成,不给智能体创建“修复源码”任务,更不生成白名单候选。 - -Javadoc 单文件 doclint 探针的 `findings_observed_untrusted` 也只供定位注释;尚未绑定项目生效配置、完整源集和可信工具身份时,不得直接据此生成可批准的误报白名单。类路径缺失、未知诊断文本或原生进程失败属于 `incomplete`,应先修复检查环境或适配器。 - -CVE 白名单还要绑定本轮原生 advisory、精确依赖坐标与解析版本、依赖图及制品摘要、检测器和规则身份,以及可核验的新鲜漏洞库。当前 OWASP Maven 局部反馈的 `database_freshness=unverified`、`coverage_proven=false`,因此只能作为调查线索,不能生成会放行的白名单命中。对话反馈中被脱敏为 `redacted-sha256` 的私服包标识也不能反向充当组件身份;须在受保护的原生报告与图归属中完成精确匹配。漏洞真实存在但业务接受风险时走 `accepted_risk`,不能以“误报”条目规避 CVE 门禁。 - -Rust 的 `cve rust` 与 `check all` 现可调用原生 cargo-audit,并将 advisory 的包名、解析版本、来源和校验和与本轮 `Cargo.lock` 对照;公开反馈仍把私有来源脱敏。此对照只是局部身份核验:RustSec 数据库来源与时效、完整依赖图和构建组合、受批准工具及策略仍未证明。即使 advisory 与锁文件精确相符,`database_freshness=unverified` 时也不得签发或命中能改变门禁的 CVE 白名单;用户纠正可先记录为待审调查,并在下一轮原工具复检后补充证据。没有 advisory 的局部扫描同样不能靠白名单变成安全通过。 - -```mermaid -flowchart LR - T[原生工具检查] --> F[保留原始发现和覆盖状态] - F --> V[核对冻结检查器映射与原生主目标] - V --> M{匹配精确白名单?} - M -->|否| A[按原策略阻断或继续修复] - M -->|候选/过期/错版本/错内容| A - M -->|批准且全部身份匹配| W[标记 whitelisted_false_positive] - W --> R[保留发现、决策引用和复检命令] - R --> G{其它必需检查完整且无未处置阻断?} - G -->|是| E[allow_with_exceptions] - G -->|否| D[deny 或 incomplete] -``` - -## 条目模型 - -### 纠错分流 - -| 复核结论 | Codeguard 处理 | 门禁含义 | -|---|---|---| -| 原生规则在此精确输入上确为误判,且有可复现证据 | 提交有期限的 `false_positive` 候选,经独立批准后只处置该 finding | 其它义务完整时最多 `allow_with_exceptions` | -| 规则对该类项目普遍不适用 | 修订受保护的 rulepack/项目策略,附正反例回归 | 新策略生效前旧规则仍执行 | -| 问题真实存在,但团队决定承担风险 | 走独立的 `accepted_risk` 决策,不能伪装成误报 | 按独立策略显示风险例外 | -| 工具未配置、崩溃、漏洞库过期或报告不完整 | 创建环境/配置修复任务 | `incomplete`,白名单不参与放行 | - -智能体可以收集证据并提出候选;对话中收到“这是误报”的反馈时应定位原 finding、给出原生复检与最小复现,再选择上表路径。修改候选文件本身只会改变待审内容;即使文件写入 `.codeguard/decisions/`,也不能凭路径或字段让本轮扫描通过。错误批准条目须撤销并重开相应任务,不能删除历史 finding 来掩盖纠错过程。 - -第一版只支持**精确发现**。一个决策条目只绑定一个稳定 finding 和一个精确目标;多个目标必须分别取证、裁定和批准。不能用 `*`、`**`、正则、整库目录或“忽略某规则的全部结果”冒充误报白名单。同一 finding ID 出现两个候选目标时属于身份冲突,查询与门禁均不得挑选其中一条放行。若规则在某类项目中系统性不适用,应修改经批准的 rulepack/项目策略,并用正反例验证,而不是堆积宽泛白名单。 - -### 规则层级与纠错优先级 - -白名单是**发现后的处置规则**,不能成为扫描输入排除规则。应用顺序固定为:批准的必需检查与覆盖范围 → 原生工具执行及结果校验 → finding 稳定身份 → 白名单身份、期限及独立批准校验 → 门禁汇总。任何前序步骤为 `incomplete` 时,不运行“没有发现所以命中白名单”之类的推断。候选条目只供调查;已批准的精确条目只能处置对应 finding;策略级规则调整须在下次检查以新 rulepack 身份重新执行原工具。 - -对反复出现的误判,按根因选择最窄的纠正方式: - -| 根因 | 纠正位置 | 必须留下的证据 | -|---|---|---| -| 单个输入触发原生工具误报 | 精确 `false_positive` 条目 | 最小复现、原生诊断、目标与工具身份、批准引用、到期时间 | -| 适配器误读了退出码、路径、报告或规则 | 修复 Rust 适配器 | 错误输入与正确原生输出的回归样本;旧条目复审/撤销 | -| 某项目类型普遍不适用该规则 | 经批准的 rulepack/项目策略修订 | 适用范围、正反例、覆盖变化和受保护策略修订 | -| 原生配置把必需规则隐藏 | 修复配置或报告策略差异 | 有效配置来源及原工具复检;不能建立白名单 | -| 真实风险被业务接受 | `accepted_risk` 独立决策 | 风险说明、负责人、到期和独立批准;不能计为误报 | - -白名单命中数持续增加应触发规则/适配器根因复盘,不自动扩大匹配范围。质量评测须同时展示原始发现、人工裁定误报、白名单命中、白名单失效及漏报;白名单命中不能从原始误报率的分母或回归样本中消失。 - -| 字段 | 用途与约束 | -|---|---| -| `id`、`schema_version`、`kind` | 稳定决策 ID;`kind=false_positive`,与 accepted risk 分开 | -| `checker_id`、`native_rule_id`、`category` | 只匹配同一原生检查器、规则和检测类别;不可只按消息相似度匹配 | -| `target` | 源码用规范化仓库相对路径与目标文件内容 SHA-256;依赖问题用组件坐标、解析版本、依赖图身份和 advisory ID;不能拿路径白名单压制所有依赖风险 | -| `finding_fingerprint` | 绑定原生规则、目标、结构化位置/符号和证据身份;行号可辅助展示,不单独作为身份 | -| `tool_identity`、`rulepack_identity`、`adapter_identity` | 版本或摘要范围显式限定;工具/规则语义变化后须重新裁定 | -| `reason_code`、`rationale`、`reproducer_ref` | 说明为何是误报,附最小复现、原生输出引用和人工裁定;自由文本只作数据 | -| `approved_policy_revision`、`approval_ref` | 指向受保护策略修订或可验证签发记录;项目内可写文件的 `approved=true` 无效 | -| `created_at`、`expires_at`、`reviewer` | 有期限、有责任人;期限上限来自可信策略,不能永久有效 | - -内容 SHA-256 对源码文件按本次被检查的字节计算。匹配在原生解析、路径归属和内容复核之后进行;任何必需字段缺失、身份无法验证、多个条目冲突或时钟/批准来源不可靠都返回**未匹配或未完成**,不能按有利于放行的默认值处理。白名单条目本身有版本和摘要,报告记录命中的决策 ID、策略修订、到期时间和匹配依据,但不向对话泄露原始敏感证据。 - -## 申请、批准与复查 - -1. `work sync` 将疑似误报保留为 finding,并创建“误报调查”任务;智能体收集最小复现、原生规则、目标身份和建议修订,不自行关闭问题。 -2. 目标 `codeguard rules whitelist propose [path] --format json` 在证据完整时只生成**候选**,不改变门禁。当前已实现 `rules whitelist list/explain --candidate FILE` 的显式文件只读查询,以及 `propose` 的本地观察预览:它只使用最新已同步报告中仍存在、且源码与配置内容一致的 finding;未同步、损坏或新扫描问题消失时不回退旧证据。调用者可加 `--ruff-tool /绝对路径/ruff`,预览会按当前普通文件字节复核报告里的工具摘要;不一致或工具不可读取时隐去旧观察并要求重新扫描。它不执行工具,也不证明工具获得批准。`explain` 可额外指定 `--observed-identity FILE` 解释两个未核验身份是否精确匹配。匹配成功也不能判断候选已批准、未过期或观察文件来自本轮原生检查,始终无门禁效果。现有 `config validate/explain` 仅静态观察旧项目配置和工具锁,固定 `authority=unverified`,不验证白名单批准、期限或本轮原生身份。后续须接入可信策略与完整配置差异;`propose` 的完整候选生成仍未实现。 - -Ruff 局部报告现在只在确有原生 finding 且还有检查预算时记录本次 CodeGuard 可执行制品的 SHA-256 作为**适配器观察摘要**;无摘要时仍报告具体缺口。候选入口读取已同步报告后再次哈希当前二进制,若发生变化,即使本地报告和同步标记被一起改写也拒绝沿用旧观察。这补齐一个可核对字段,不代表二进制发行来源、rulepack 或误报裁定已获独立批准;`candidate` 仍为 `null`,门禁不变。 - - `propose` 的输入必须是**本轮**原工具结果及内容复核形成的完整精确身份。当前 Ruff 局部报告 0.6 已对完整文件记录本轮观察到的工具与配置字节摘要,已映射的 F401/E501 另记录未批准规则包摘要;预览 0.3 能将它们与最新已同步、源码及配置未变的 finding 关联,但持久任务仍只存首次规则、路径和发现指纹,且尚无适配器及**经批准的** rulepack 身份。因此不能拿任务文件或候选规则包摘要直接拼出可评审条目。身份缺失时应返回 `incomplete`,列出缺失字段和复检/准备动作,不填零摘要、版本字符串或“当前文件”占位,也不写候选文件。 -3. 人工评审确认确属工具/适配器误报后,将精确条目纳入受保护策略修订或签发批准;本地 `.codeguard/decisions/` 保存可读引用和历史,不作为自足的授权源。正在提交白名单的同一 PR 必须由受保护 CI 使用**此前可信基线**验证,不能用自己新写的条目为自己签发通过。 - -批准快照协议 `approval-snapshot:1.0` 记录策略修订、最长有效期及每个已批准候选的 ID/原始字节 SHA-256。Rust 的 `bind_candidate_to_snapshot` 先比对快照的预期 SHA-256,再校验候选是否在快照中、修订及有效期是否一致,并与调用方提供的本次原生 finding 身份精确匹配。更改候选中的批准文字、评审人或任何字段都会改变摘要;同次 PR 新增候选若不在此前快照中不能命中。此函数的 `BoundToPinnedSnapshot` **仅证明输入之间的绑定**,不证明摘要、时钟或 finding 来自受保护来源;项目可写配置或智能体自行计算的摘要不能升级为授权。正式门禁还须由隔离的 CI/宿主固定旧策略快照、可信时钟和真实原生发现。 - -快照 `1.1` 增加必填 `revoked_decision_ids`,由同一策略修订同时固定有效候选与撤销 ID。绑定函数在解析并核对快照摘要后优先返回 `Revoked`,即使旧候选字节仍列在 `decisions` 中也不能沿用;重复、通配撤销 ID 或 `1.1` 缺撤销集合使整份快照无效。旧 `1.0` 快照仍可读取,但不能包含撤销字段。当前这只是快照内的撤销表达与字节绑定,还没有可信发布、修订链事件、真实 finding 门禁或 `explain` 自动发现,不能把本地构造的 `1.1` 快照当成批准。 - -替代候选使用决策协议 `1.1`,必须以 `replaces_decision_id` 引用不同的旧决策 ID;普通 `1.0` 候选不得携带该字段。替代候选绑定时,同次快照必须撤销旧 ID;还要提供旧决策字节,确认稳定 finding、检查器、规则、类别和精确目标归属没有扩大。仅调用普通绑定接口、缺旧决策、引用错 ID 或改到另一目标,均不能得到替代绑定结果。该结构核对仍不能证明旧字节来自先前可信批准;受保护策略发布需继续验证旧决策存在、旧快照来源及修订链无环。 - -前序绑定接口进一步要求旧决策字节在**另一份**固定摘要的前序快照中列明且尚未撤销,旧决策声明的修订与该快照一致;前后快照修订不能相同。缺前序摘要、摘要与字节不符、旧字节被改或前序快照已撤销旧决策均拒绝。两个摘要的真正来源和修订先后顺序不能由工作区文件自证,必须由受保护发布流程固定;该接口的成功值仍不是白名单生效或交付授权。 - -多次纠错使用按“当前候选的直接前驱 → 最初普通候选”排列的前序链。Rust 逐跳核对旧决策确在对应快照、同一 finding/精确目标、子快照撤销其前驱、各跳策略修订不同且旧决策有效期不超过当时上限;必须走到不再替代别人的根候选。截断、乱序、多余节点、重复决策 ID/修订形成的环或超过 32 跳均拒绝。结构完整仍不证明快照来自可信发布,也不能用版本字符串推断修订发生的真实先后。 -4. 生效后的每次检查仍运行原工具。只要源内容、依赖图、规则、工具/adapter、目标、批准修订或期限失配,原 finding 重新按正常规则处理;复发或新位置不能沿用旧白名单自动放过。 -5. 若根因已在 checker/adapter 中修复,应撤销条目并用原工具正反例复检。已批准条目过期前提示复审,历史事件保留,任务处置标为 `whitelisted_false_positive` 而非 `resolved_by_code_fix`。 - -纠错反馈须回到同一个稳定 finding/任务:用户指出误判后,智能体记录反例并提出候选;被驳回时继续修复原问题或环境;批准后同步处置事件,任务可标为“经批准例外”,但不得写成源码已修复。批准被撤销、到期或身份失配时,任务重新进入待处理;任何人手动勾选任务都不改变本轮门禁。查询命令要分别解释 `candidate_unverified`、`approved_match`、`expired`、`identity_mismatch`、`revoked` 与 `approval_unverifiable`,并显示下一步是补证据、复检、重审还是修复代码。 - -### 纠正白名单的闭环 - -用户反馈“这条是误报”时,智能体先用 `rules whitelist explain` 定位原始 finding、原生规则和当前处置,再运行原工具取得本轮证据。若证实是单条误判,就对**同一稳定 finding** 提出精确候选;若是适配器解析错误,先修适配器;若规则对一类项目普遍不适用,则提出受保护的规则/项目策略修订。不能仅凭一句反馈生成有效豁免,也不能要求智能体反复修改无关源码。 - -已批准条目需要纠正时,采用“撤销旧决策 + 新候选 + 独立批准”的修订链;旧决策 ID 与历史事件不可覆盖或删除,新候选明确引用被替代的决策。受保护策略发布时原子地固定撤销集合和新批准集合,避免旧、新条目在过渡期间同时生效。若同一 finding 存在两个有效且互相冲突的决策,保持 `incomplete` 并要求评审,不选择较宽松的一条。撤销、过期、身份变化或新候选未批准时,本轮原生 finding 恢复正常阻断;既有任务重开并记录原因。 - -纠错提案的最小数据为原决策 ID、稳定 finding ID、结构化原因、本轮原工具复检引用和受影响目标。若仍是同一目标的误报,替代候选使用新决策 ID、`replaces_decision_id` 与新的完整精确身份;若先前误批或检查器已经修正,可以只撤销,不制造替代条目。CLI 只生成可审阅提案;受保护策略发布负责校验旧决策存在、修订链无环、撤销和替代原子生效、替代范围未扩大。另一个文件或依赖节点出现相同规则时,应单独调查,不能借旧决策的修订链批量放过。 - -当前 Rust 局部入口支持 `codeguard rules whitelist propose [path] --correct-decision FILE --correction-reason CODE --verification-run RUN_ID [--replacement FILE] [--record] --format json`。它只读取稳定任务、严格解析的旧候选及由 `task verify` 保存且摘要可核对的本轮原生报告。复检仍存在时可预览误批/范围过宽/证据失效的撤销;复检确认原问题缺失且目标源码未再变化时,可预览 `root_cause_fixed` 的仅撤销。提交替代文件时还比对同一稳定 finding 与目标、已观察的源码/工具/发现指纹;由于适配器与已批准规则包身份仍缺,替代只标为 `unverified_draft`,预览状态为 `evidence_incomplete`。任何路径都固定退出 3、`authority=unverified`、`gate_effect=none`,不写 `decisions/`,不关闭任务,也不更改门禁。 - -加 `--record` 时,命令持任务锁重查证据,将提案幂等写入 `.codeguard/findings//events/correction-proposed-.json`,并在输出中给出 `record_ref`。事件引用同一稳定 finding 与任务,包含旧决策、新草稿摘要、原生复检 run/报告摘要及缺失的批准证据;同内容重放不增事件。证据过期或目标变化时不落盘。此事件是待审记录,不是 `decisions/` 的可信批准,也不能让智能体关闭任务。`codeguard next . --format json` 会在当前复检 run/报告摘要仍匹配时,向同一任务简报附 `correction_proposal_refs`,提示独立评审;过期事件不作为当前任务决策。 - -`rules whitelist explain` 应逐字段解释命中、失配和修订链,只显示脱敏身份与批准引用;`propose` 应支持对现有决策提出修订候选,但永远不能自行批准或直接改门禁。此修订入口及可信策略发布流程仍待实现。验收需覆盖“批准误报后精确放行、误批撤销后重新阻断、修订期间不能双重放行、其它同规则 finding 不受影响”,并在评测中保留白名单前的误报与漏报统计。 - -```mermaid -stateDiagram-v2 - [*] --> proposed - proposed --> rejected: 裁定并非误报 - proposed --> approved: 可信评审与策略修订 - approved --> stale: 内容/规则/工具/范围改变 - approved --> expired: 期限届满 - approved --> revoked: 根因修复或批准撤销 - stale --> proposed: 重新取证 - expired --> proposed: 重新复审 - revoked --> [*] -``` - -## 门禁与对话反馈 - -白名单**不删除 finding,也不改变原生工具退出语义或检查完整性**。报告分别记录 `raw_findings`、`whitelisted_false_positive`、`active_findings`、`incomplete_obligations`;每条命中报告原阻断级别、处置标签和批准引用。存在有效白名单且其它必需义务均完整时,交付决策为 `allow_with_exceptions`,不显示普通 `PASS/allow`;尚有真实阻断则 `deny`,工具/配置/覆盖未完成则 `incomplete`。同一 finding 同时命中冲突条目时不自动选最宽松结果。 - -Rust RunReport 1.4 schema/结构解析及对话摘要 0.2 已加入该决策值;1.3 原始 schema 仍保存供历史读取。1.4 对每条 finding 要求完整原生身份,对白名单处置要求精确决策身份,并核对规则、工具摘要、检查器类别和主定位;两份身份任一字段不同即拒绝报告声明。相邻 Rust 工程还有一个未接入正式命令的 SARIF 2.1.0 纯转换器:未完成运行在 SARIF 中标记执行失败和错误通知;白名单 finding 仍保留为结果,附上批准引用及“报告声明、来源未核验”标记,不创建 SARIF suppression;原生消息和路径不进入公开投影。原生报告生产、可信审批与 CLI/MCP/Hook 全格式消费尚未接通。旧消费者遇到新值应拒绝按普通 allow 解释。`allow_with_exceptions` 对完整交付请求可对应退出 0,但必须保留明确的带例外状态与可核验批准来源。 - -1.4 消费者现还要求源码 finding 的主目标同时属于该义务声明的预期和实际覆盖集合。独立的 `compare_claimed_source_hashes` 接口只接受宿主指定的工作区根,安全读取报告里**全部源码目标**的当前普通文件字节并比较 SHA-256;旧协议、内容变化、文件缺失、符号链接、冲突摘要或资源超限均拒绝。它只是一次内容比对,不能从报告自填的覆盖集合、工具摘要或审批字段推断来源可信,也不能替代终局复核;正式门禁仍未调用该接口。 - -智能体对话应说“规则 X 在文件 Y 被原工具发现,经白名单决策 Z 判为误报,本次不阻断;到期/失效条件是……”,并给出原工具复检命令。候选或失效白名单只能提示调查,不能对话中说“已放过”。`next` 可引导人工裁定或代码修复,但不得反复让智能体改无关源码。评测同时报告白名单前后发现数、已裁定误报数、实际漏报和豁免比例,不能通过增加白名单把 precision 人为抬高。 - -## 必须通过的验收场景 - -| 场景 | 期望 | -|---|---| -| 同一内容、规则、目标、工具/策略身份且批准有效 | 只标记对应 finding,不影响同文件其它规则;交付最多为 `allow_with_exceptions` | -| 同一规则出现在另一文件、内容变更、依赖版本或 advisory 变化 | 不匹配;原阻断保留 | -| 条目过期、缺批准、批准来自当前 PR 或本地 `approved=true` | 不放行,给出失效/未批准原因 | -| `propose` 只拿到历史任务,缺本轮工具/适配器/rulepack 摘要 | 不生成可批准候选;报告缺证据与原工具复检动作 | -| 原生检查器崩溃或报告范围不完整 | `incomplete`,即使历史 finding 曾在白名单中 | -| 原生 suppression 隐藏了必需规则 | 报策略差异/未完成,不能凭白名单证明该规则已执行 | -| 同轮有白名单误报与真实阻断 | 两类都展示,最终 `deny` | -| 唯一阻断是有效白名单误报,全部义务完整 | `allow_with_exceptions`,不写普通 `allow` | -| 原生规则或 adapter 修复后条目撤销 | 原工具复检;历史裁定与指标仍可追溯 | -| 同一误判重复扫描、任务被手动勾选或改名 | 复用同一 finding 与决策引用;不因任务文字变化改变处置或门禁 | -| 白名单命中量攀升或同规则出现多条候选 | 形成规则/适配器根因调查,不能自动合并为规则级忽略 | - -### 当前可读纠错附件 - -纠错命令显式 --record 现在生成 .codeguard/tasks/corrections//.md,附属于同一稳定任务,包含证据、规则、范围、步骤、复检、历史和关闭条件。附件为历史投影,需通过 next 核对当前适用性;用户编辑保留、不用于批准或执行指令。事件保存成功后附件冲突/失败单独反馈,重试可恢复被删除的附件。next 仅引用当前复检仍匹配且与事件重建字节一致的附件。该能力仍不具独立批准、可信发布或正式门禁效力。 - -当前 Ruff 复检观察及普通误报提案在读取时重新发现目标选中的配置,核对配置路径和字节摘要。规则配置变化、新增更高优先级配置或旧报告缺少身份时,next 要求原工具复扫,不继续展示旧纠错事件/附件;历史记录仍保留。原源码未变也不能使陈旧配置证据继续有效。 - -### 批准签名绑定的局部实现 - -Rust 现可在宿主预固定公钥、时钟和基线上核验 Ed25519 签名,精确绑定工作区、策略修订、基线提交、防回滚序号、有限期限和批准快照原始字节。普通候选桥接先核验签名,再核对快照内修订与签名修订一致,随后沿用精确候选身份与字节绑定。改签名原文、换目标/快照/私钥、过期、撤销、缺可信时钟或回滚均拒绝。项目没有自选公钥或签发批准的 CLI;公钥可信来源、撤销及最低序号仍由受保护宿主负责,尚未接通真实门禁和完整签名修订链。签名成功不能把原生 incomplete 转为通过。 - -当前多跳签名入口会逐跳核验历史签名和快照字节,再检查工作区、序号、签发/审核先后与当时有效期;历史 pin 由验签结果生成,不接受项目自行提供。随后继续原有精确替代/撤销/无环校验。历史条目今天过期不抹去当时合法记录,但宿主当前撤销的公钥仍拒绝绑定。历史时间和公钥来源、代码基线祖先关系及实际门禁仍须由受保护宿主接入。以上局部签名核验补充了前文的实施状态;候选查询与纠错命令仍无批准或放行效力。 - -Git 联合入口现进一步核对每跳已签名基线的原生祖先关系(允许同一提交),签名有效但代码历史无关仍拒绝。缺对象、浅历史、旧 Git 不支持禁取对象参数、取消或预算耗尽均为未完成;不降级为纯签名通过。工具和仓库可信来源、批准发布及最终门禁仍待宿主接线,不赋予本地候选授权。 - -领域门禁现进一步核对白名单身份与原生 finding:宿主冻结 checker/tool/category/obligation 映射,第一处定位作为主目标,源码核对路径,依赖核对组件与显式版本。缺定位、错主目标、错工具或缺/冲突映射均保留活动阻断;次要定位不能扩展豁免。全部处置应用前先识别重复 finding 和复用的决策 ID,冲突双方不留下先到的白名单状态。此增量不证明原生制品摘要、批准来源或依赖图归属,也未接通真实宿主门禁。 - -领域 finding 还增加本轮完整原生身份绑定。只有它与批准项附带的观察身份逐字段一致,才可能进入白名单处置;旧报告缺身份、文件字节或指纹变化、工具/适配器/rulepack 摘要变化、依赖图或 advisory 变化都会保留原始及活动阻断并返回未完成。这个字段只是领域输入契约,不能让项目自行填写并取得可信来源;正式宿主仍须从本轮原工具结果和真实目标字节复核后冻结它。 - -应用处置时还必须采用最终门禁的可信时钟:到期边界不包含,缺最终时钟、零值或早于取证时间均不应用白名单,不能重放旧 observed_at 维持豁免。普通无白名单门禁不因缺此新字段改变结论。已验签快照现提供只读到期上限,宿主固定当前批准相关约束的最早边界;历史批准按当时审核时间核验,不将历史到期时间套到当前合法替代条目。可信时钟和真实批准生产仍由宿主接线。 - -门禁现还与宿主独立冻结的当前策略修订比较,处置不得用自己声明的修订充当当前策略。签名入口可生成不可从项目 JSON 反序列化的只读处置绑定预览,固定候选/快照字节、范围、身份和最早期限;替代入口先核验完整签名与 Git 链。预览的独立批准标记始终 false,不增加自批命令或放行能力;来源核验、真实宿主批准和发布仍未接通。 - -### 最终门禁的工作区与批准基线绑定 - -签名预览中的 `approval_scope` 保留已核验的工作区及当前批准上下文基线。门禁须与宿主独立冻结的范围精确比较,不得从处置字段复制宿主范围。缺范围、跨工作区、错基线或非法身份均不应用白名单并保留活动阻断。基线仅接受完整非零、小写 SHA-1/SHA-256 提交 ID;它是批准上下文的基线,不是临时工作树 HEAD。旧输入仍可读取,未带范围的旧白名单不能放行;没有白名单的普通判定保持原语义。来源可信性和真实宿主接线仍待实施。 diff --git a/docs/rust-cli/legacy-delta-20260924.zh-CN.md b/docs/rust-cli/legacy-delta-20260924.zh-CN.md deleted file mode 100644 index d3832b1..0000000 --- a/docs/rust-cli/legacy-delta-20260924.zh-CN.md +++ /dev/null @@ -1,17 +0,0 @@ -# 旧实现增量核对(2026-09-24) - -这份记录为 OpenSpec 1.1 的**进行中证据**。当前插件 HEAD 为 `9e4adb1`;原设计读取的 `03ebb24` 不是最新源码。两提交间旧运行时代码有 9 个文件变化。`scripts/languages.json` 未变,SHA-256 为 `012370f9d83a2daeb3cc87fef292a7509e85b53540ce9adf1eaf171f0910d251`,仍是 54 stable / 3 planned。逐语言差异与后续验收入口见 [语言迁移表](coverage-and-acceptance.zh-CN.md#2-全量迁移清单);Rust 工程固定了该清单快照,并在 `codeguard-cli/crates/codeguard-cli/tests/capability_inventory.rs` 核验 57×5×5 个显式缺口,不能把旧注册状态当作新能力。 - -| 旧源码增量 | 新流程归类与依据 | 已有回归样本 / 后续 fixture | -|---|---|---| -| `hooks/__protocol__.md`:旧 skipGate 只豁免语言检查,入库安全仍检查 | **保留 legacy-v1**;新交付完全拒绝 skipGate 自授权。见 hook-protocol、rulepack-governance | `tests/test_skip_gate_safety_scope.py`;新入口 F13/F22 待实现 | -| `scripts/codeguard/gate.py`:采集缓存身份前补 PATH | **保留正确行为**,但新缓存必须绑定真实有效环境身份。见 execution-kernel | `tests/test_skip_gate_safety_scope.py`;新缓存 F09/F10 待实现 | -| `scripts/codeguard/git_guard_application.py`:语言豁免后仍执行安全路径检查 | **legacy-v1 兼容 + 新流程纠偏**:保留安全发现,新入口不得接受豁免。见 hook-protocol、scan-scope-policy | `tests/test_skip_gate_safety_scope.py`;新 Git F16/F18 待实现 | -| `scripts/codeguard/prompt_application.py`:软反馈同样保留安全报告 | **legacy-v1 兼容**;新软反馈不能冒充硬门禁。见 hook-protocol | `tests/test_skip_gate_safety_scope.py`;新宿主 F22 待实现 | -| `scripts/codeguard/toolchain.py`:补 PATH,缺入口时探测 Python 模块并给诊断 | **保留正确诊断**,但不得把模块探测成功当作原命令可执行。见 unified-cli-contract、native-tool-adapters | `tests/test_skip_gate_safety_scope.py`;新 doctor F03 待实现 | -| `scripts/paths.py`:补符号链接解释器真实 scripts 目录 | **保留正确路径发现**,工具仍需锁身份与实际启动证明。见 execution-kernel、rulepack-governance | `tests/test_skip_gate_safety_scope.py`;新 tools verify/doctor 待实现 | -| `scripts/codeguard/reporting.py`:说明旧豁免范围 | **legacy-v1 兼容**;新修复简报不得推荐绕过。见 hook-protocol、remediation-workflow | `tests/test_skip_gate_safety_scope.py`;新 RepairBrief 待实现 | -| `scripts/check_architecture.py`:容纳旧模块新增依赖 | **只保留旧架构校验**;新四 crate 方向由独立检查拒绝反例。见 execution-kernel | `tests/test_architecture.py`;`codeguard-cli/crates/codeguard-cli/tests/crate_boundaries.rs` | -| `scripts/bump-plugin.mjs`:Claude 版本路径写后核对 | **保留发布正确性**;新二进制与插件锁/市场仍需分层验收。见 binary-distribution | `tests/test_plugin_manifests.py`;新发布验收 13.4 待实现 | - -旧源码中仍存在新规范明确纠偏的共性行为:通用 `rc=1` 推断 finding、最多 50 文件时的 delta/基线豁免、缺工具旧 Hook 放行、Java Maven verify 代替多项质量义务。它们分别由 native-tool-adapters、verdict-integrity、execution-kernel、hook-protocol 和 language-gate-commands 的新要求替换;当前仅有领域聚合测试,真实新适配器和完整对照 fixture 尚未落地,因此 OpenSpec 1.1 **仍未完成**。 diff --git a/docs/rust-cli/legacy-v1-protocol-map.zh-CN.md b/docs/rust-cli/legacy-v1-protocol-map.zh-CN.md deleted file mode 100644 index 0fb1342..0000000 --- a/docs/rust-cli/legacy-v1-protocol-map.zh-CN.md +++ /dev/null @@ -1,32 +0,0 @@ -# legacy-v1 入口协议与退出码映射 - -本表只描述插件旧入口的既有行为,供 Rust C35 兼容层逐项实现。旧版返回 0、MCP 工具调用成功或 Hook 放行,均**不等于**新版交付 `allow`;Rust 投影固定 `new_delivery_decision=not_evaluated`。新版 CLI 的 0/1/2/3/4/130 协议独立计算,不能直接透传旧数字。来源为当前插件旧入口和应用服务;[旧源码增量](legacy-delta-20260924.zh-CN.md)记载与早期设计快照的差异。 - -## CLI 入口 - -| 旧入口 | 旧数字和混合优先级 | 0 的实际含义及迁移边界 | 来源 | 验收入口 | -|---|---|---|---|---| -| `bin/codeguard` 默认、`check` | `FAIL→2` 优先于 `UNVERIFIED/PLANNED→1`;仅 PASS/SKIPPED→0;空语言→1;argparse 用法错→2 | 可能只有 SKIPPED,不代表完整项目质量通过;MCP 模式另列 | `bin/codeguard`、`scripts/run_check.py::cli_main`、`scripts/codeguard/verdict.py::exit_status` | Rust `legacy_v1_protocol_contract`;旧 `tests/test_verdict_integrity.py` | -| `fix` | 任一 formatter 失败、未配置而返回 PLANNED、UNVERIFIED 或无识别语言→1;全部成功/跳过/显式 dry-run、无 Git 改动或无适用文件→0;argparse 错→2 | 空 `run_fix` 结果不足以区分“无语言”和“无适用文件”,兼容层必须保留入口分支;formatter 成功不证明文件改变,仍须复检 | `scripts/fix.py::main`、`scripts/codeguard/language_check.py::run_fix` | Rust 参数表;旧 `tests/test_cli_contracts.py`、`tests/test_cli_fix_reporting.py` | -| `cve` | `FAIL→2` 优先于 `UNVERIFIED→1`;空结果→1;全 PASS→0;参数/生态/严重度错→3 | 只是旧阈值下各生态结果;不能用 2 推断新版 CLI 用法错 | `scripts/cve_check.py::main`、`scripts/codeguard/cve_policy.py::aggregate_exit` | Rust 参数表;旧 `tests/test_cve_boundaries.py` | -| `dockerfile` | 任一 UNVERIFIED 或无目标→1,即使同批有 FAIL;完整且有 FAIL→2;全 PASS→0;argparse 错→2 | 混合结果中的风险仍留在报告;退出 1 不得丢掉已确认发现 | `scripts/dockerfile_security.py::main`、`scripts/codeguard/dockerfile_reports.py::aggregate_status` | Rust 参数表;旧 `tests/test_dockerfile_boundaries.py` | -| `detect` | 有根及无根的正常查询→0(无根输出 `[]`);配置错误→1 | 只是发现操作,`[]` 不能签发空项目质量通过 | `scripts/detect_lang.py::main` | Rust 参数表;旧 `tests/test_cli_contracts.py` | -| `init` | 总是输出人工引导并返回 0,不写项目 | 旧引导完成不等于 Rust `init --apply` 或任何检查完成 | `bin/codeguard` 的 `init` 分支 | Rust 参数表;旧 `tests/test_cli_contracts.py` | -| `java-plan` | `UNVERIFIED→1`,其余计划状态→0;argparse 错→2 | 只读计划,未执行 Java 构建或检查 | `scripts/java_project.py::main` | Rust 参数表;旧 `tests/test_java_project_impact.py` | -| 未知子命令 | wrapper→1;诊断写 stderr | 新版未知命令走自身用法协议,不能套旧 1 | `bin/codeguard` 默认分支 | Rust 参数表 | - -`run_check.py --mcp` 是旧 MCP **服务器生命周期**入口:SDK 缺失时进程返回 1,启动服务后退出 0。服务退出 0 不表示任何工具调用或质量检查成功。`check_code_style` 返回逐语言数组,保留 `passed/status/reason/exit_code/log_path`;`auto_fix` 返回修复尝试与复检摘要;`list_languages` 只返回 ID/名称;`analyze_java_impact` 返回只读计划。四种工具返回的是 MCP 文本块中的 JSON payload,**没有**可直接映射的每次调用进程退出码;配置损坏可返回 `UNVERIFIED/exit_code=1` 的工具 payload,未知工具返回 `error` 对象。来源:`scripts/run_check.py::mcp_main`、`scripts/codeguard/check_application.py::mcp_tool_payload`;旧 `tests/test_mcp_server.py` 和 `tests/test_mcp_autofix_identity.py` 继续覆盖真实旧 SDK 接口。C35 的 MCP 接线与宿主验收另由 11.1/11.3 承担,本表不把服务存活变成新版认证。 - -## 五类 Hook - -| 旧事件 | 旧退出/反馈 | 新版边界 | 来源与旧夹具 | -|---|---|---|---| -| SessionStart | 0;stdout 人类可读摘要;未捕获异常 stderr 提示并 exit 0 | 环境信息不等于检查通过 | `hooks/env_check.py`;`tests/test_startup_application.py` | -| UserPromptSubmit | 0;命中时 stdout `hookSpecificOutput.additionalContext`;内部异常 exit 0 | 观察型软反馈不阻断交付 | `hooks/user_prompt_validator.py`;`tests/test_prompt_application.py` | -| PreToolUse Bash | 0 放行或附 `additionalContext` 的未验证;2 拦截并在 stderr 给修复指令;内部异常 exit 0 | 旧 2 是宿主拦截,不是新 CLI 用法错;旧 0 包含 fail-open,不能当 `allow` | `hooks/pre_tool_git_guard.py`、`scripts/codeguard/git_guard_application.py`;`tests/test_git_guard_application.py` | -| PostToolUse Write/Edit/MultiEdit | 0;stdout 可含 JSON 反馈与 systemMessage;内部异常 exit 0 | 保存反馈不承担质量门禁 | `hooks/post_tool_lint.py`;`tests/test_save_application.py` | -| Stop | 0;stdout 会话摘要;内部异常 exit 0 | 历史计数不替代完整交付检查 | `hooks/stop_summary.py`;`tests/test_session_application.py` | - -PreToolUse 当前源码还会在无法准确解析 Git 意图、没有可定位仓库等情况下返回 2;这与旧 `hooks/__protocol__.md` 中“仅已确认 lint 失败才 exit 2”的文字不完全一致。C35 必须先按真实旧源码和宿主实测固定此分支,不得以旧文档的概括删掉阻断或把不可确认意图伪称为已确认源码违规。`codeguard.skipGate`/`CODEGUARD_SKIP_GATE` 和 Hook fail-open 仅归 legacy-v1;新版交付门禁按独立完整性与受保护策略判定。 - -Rust `crates/codeguard-cli/src/legacy_v1_protocol.rs` 只承接**已经归类**的旧信号,拒绝不支持的入口/信号组合。它没有调用 Python、没有运行原生检查器,也不签发质量结果。C35 仍须实现旧 argv、字段、MCP/Hook 宿主接线及每种入口的真实回放;本表与纯映射测试不能替代这些运行时验收。 diff --git a/docs/rust-cli/project-initialization.zh-CN.md b/docs/rust-cli/project-initialization.zh-CN.md deleted file mode 100644 index 0837d9a..0000000 --- a/docs/rust-cli/project-initialization.zh-CN.md +++ /dev/null @@ -1,205 +0,0 @@ -# Codeguard 项目初始化与 AGENTS.md 接入 - -`codeguard init` 目标是建立可追溯的项目画像、检查准备清单和智能体工作入口。当前相邻 Rust CLI 已实现只读预览、不覆盖人工文件的工作区创建、根 AGENTS.md 的精简受管区块,以及对静态清单、锁文件和源码路径集合变化的受控刷新;准备任务、可信策略、完整输入关系和跨外部编辑器的强制并发保护仍待实现,apply 明确返回 partial。本文描述目标设计及已标明的局部实现,不是本插件仓库的实际画像。 - -规范事实源为本 change 的 [project-initialization](../../openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md),修复循环沿用 [持久工作流](remediation-workflow.zh-CN.md)。 - -## 1. 初始化要回答的问题 - -| 初始化内容 | 识别结果与依据 | 对后续工作的作用 | -|---|---|---| -| 项目边界 | 指定根目录、Git 根、worktree、monorepo、多构建根、子仓边界 | 避免把工作区或相邻仓库当成一个项目 | -| 语言与版本 | 语言/方言、声明版本、编译目标、锁定/实际解析版本、本机版本分开记录 | 避免用本机 JDK/Python 版本替代项目目标版本 | -| 构建与包管理 | Maven/Gradle/Cargo 等清单、wrapper、包管理器、lockfile、workspace、profiles/features/targets | 形成可执行的项目级检查计划 | -| 框架与关键技术 | Web 框架、ORM、数据库驱动、消息/缓存组件及声明来源 | 选择兼容规则和所需运行条件;不声称服务已经启动 | -| 模块与依赖图 | 构建模块、包/源码根、直接/传递依赖、测试/运行/构建范围 | 计算修复影响面,决定模块或项目级复检 | -| 架构画像 | 表现层组织、领域组织、依赖方向、部署单元分别描述 | 给智能体上下文,明确已确认边界和待确认推断 | -| 源集与特殊目录 | 生产代码、测试、生成代码、第三方代码、fixture、迁移脚本 | 为各检查类别建立正确目标,候选排除不自动生效 | -| 现有规则 | lint、注释、格式、安全、CVE、原生 suppression、AGENTS/CLAUDE 约束 | 复用已有接入,暴露与批准策略的冲突 | -| 测试与验证方式 | 测试框架、单元/集成测试命令、测试环境依赖、已有 CI 中允许观察的配置 | 区分声明命令和已实际验证命令 | -| 工具准备情况 | 已安装/未探测/缺失/不兼容、网络/漏洞库前置条件 | 将准备问题变成环境 blocker,而非代码违规 | -| 外部依赖前置条件 | 构建/测试需要的数据库、容器、私有依赖凭据名称等 | 说明恢复条件;不读取或写入凭据值,不启动服务 | -| 既有工程流程 | OpenSpec/Spec Kit、可用 CodeGraph、现有 Git hooks/CI 接入、子目录指令 | 接入现有工作方式,不重复初始化其它工具 | - -产品版本、语言版本、编译目标、构建器版本、依赖版本和实际安装版本必须是不同字段。例如“项目声明 Java 17、本机 JDK 未探测”是有效画像;不能看到本机 JDK 21 就把项目写成 Java 21。 - -## 2. 架构识别不能靠目录名定案 - -MVC、DDD、分层、六边形和微服务描述不同维度,可以同时存在。画像按项目或模块记录以下维度: - -- 表现层:例如 Controller/接口适配层及入口。 -- 领域组织:业务模块、领域模型、候选限界上下文。 -- 依赖结构:层间引用、模块方向、端口与适配器边界。 -- 部署形态:声明的应用/服务/作业单元,实际部署拓扑若无证据保持未知。 - -每条结论标记 `declared / observed / inferred / confirmed / unknown / stale`,附来源路径、位置或配置键、内容摘要和检测器版本。`confirmed` 表示有可核验的人工架构声明确认,不等于扫描器证明项目完整遵守该架构;来源变化后须标 stale 并重新核对。 - -存在 `domain/`、`repository/` 或 `controller/` 只能构成线索,不能直接写“项目采用 DDD,因此必须重构为 DDD”。源码证据与 README/ADR 冲突时同时展示,创建确认任务;无法确定业务边界时保留候选。推断结果不直接变成阻断规则,只有批准后的结构约束才能通过确定性检查器执行。 - -AI 可以解释证据、提出候选分层与修复建议,但不得将判断直接升级为批准的工程约束。 - -## 3. 模块图的类型与完整性 - -`module-graph.json` 记录带类型的节点和边: - -| 类型 | 示例 | 边界 | -|---|---|---| -| contains | workspace 包含 module | 构建聚合不等于代码依赖 | -| build_dependency | 模块依赖另一个模块编译 | 携带 scope、profile/feature 条件 | -| source_reference | 源码 import/use 引用 | 不自动等于运行时调用 | -| external_dependency | 模块依赖某个包 | 区分声明范围与已解析具体版本 | -| declared_service_relation | 文档/配置声明服务调用或消息关系 | 没有运行证据不声称实际调用已验证 | -| candidate_business_boundary | 候选业务模块或限界上下文 | 属于推断,待确认,不自动裁剪检查范围 | - -每条边保留来源、条件、完整性和观察身份。动态 Gradle/POM profile、反射、依赖注入或运行时生成关系无法静态确定时标 `unresolved`。空图或未找到引用不等于“无依赖”;未证明完整的图不能支撑缩小质量检查范围。 - -已有 CodeGraph 时先核对索引与内容身份,符合条件可作为附加源码关系证据;未建立或过期时不静默安装、初始化、更新索引,也不将其作为 init 的硬依赖。语言原生构建模型仍提供相应构建事实。 - -## 4. 产物与事实源 - -在既定工作区中补充三个画像产物,并在被检查项目 AGENTS.md 写受管摘要: - -```text -project/ -├── AGENTS.md # 保留人工内容,添加 Codeguard 受管区块 -└── .codeguard/ - ├── workspace.json # 身份/schema/受管文件清单及画像引用 - ├── project.json # 结构化项目画像、依据与未知项 - ├── module-graph.json # 有类型/条件/证据的模块关系 - ├── architecture.md # 项目结构与依赖图的可读投影 - ├── findings/ # 已确认检查发现与初始化 blocker - ├── tasks/ # 工具准备、架构确认和修复任务 - └── ... # 沿用已确认的其它目录 -``` - -`project.json`/`module-graph.json` 是观察结果,`architecture.md` 和 AGENTS 受管区块是可重建投影。质量政策仍由既有可信配置提供;画像不是另一份规则文件,编辑画像不能取消检查。 - -画像默认可提交,但只保留脱敏且跨机器有意义的信息。真实本机绝对路径、实际安装位置、会话状态和探测诊断进入 Git 忽略的 state/reports;受管 AGENTS 只链接画像与可重复命令,不固化某开发者机器环境。 - -输入清单包括实际读取的 manifest、锁文件、指令、源码关系证据与它们的哈希。新增/删除相关文件同样影响身份;不能只核对“上次存在的文件”。构建/锁/规则/模块变化后标记对应画像过期,重新 init 生成差异,保留 findings/events 与人工备注。 - -当前局部实现把受管投影摘要写入 `workspace.json` 0.3,并给工作区分配稳定 `workspace_id`:首次由规范化根路径摘要形成,后续刷新沿用已保存身份;旧 0.1/0.2 工作区可受控升级。该 ID 只用于本地报告归属与未来同步幂等键,不是授权或质量证据。`project.json` 记录已发现的构建清单、锁文件、旧语言清单中精确登记的单文件检查器配置字节摘要,以及各语言源码路径集合摘要;`package.json` 的包版本与语言目标版本分开,后者无证据时保持 unknown。静态模块图的 Maven 声明(0.2 起,当前图为 0.3)保留构建根 `contains`,并区分 Maven `modules` 的 `aggregation` 与完整唯一坐标支持的直接 `build_dependency` 声明。声明边记录清单及 SHA-256、scope 与声明条件,不代表 Maven 生效模型;父 POM、profile、变量、管理版本、特殊依赖属性和重复坐标保留具体 unresolved。旧 0.1 schema 单独保留;所有图仍固定依赖覆盖不完整,不据此缩小检查范围。新增、修改、删除这些已识别配置会令 `profile_stale=true`;输入无法完整读取时 freshness 为 unknown,而不是假称 fresh。点前缀范围仅对旧清单明确列出的单文件配置及既有 Ruff/预提交配置开放,其它点文件仍跳过;嵌套点配置目录尚未处理。配置文件存在只是一条观察证据,不能据此宣称检查器已配置或规则已执行。重新 init 仅替换能由上次摘要证明仍是 Codeguard 所生成的文件和 AGENTS 受管区块,人工修改则冲突;`workspace.json` 最后写入,方便局部失败后重试。`profile_stale` 仅说明画像输入与上次不同,不是扫描结论或策略批准。未登记或嵌套规则配置、源码内容变化、完整模块依赖和跨进程写锁尚未覆盖,9.23 继续保持未完成。 - -## 5. AGENTS.md 受管区块 - -根 AGENTS.md 默认只写一个简明区块:项目边界和语言/构建摘要、架构证据状态、模块图链接、已批准规则来源、检查/修复入口及需解决的前置问题。大图、依赖清单和原始诊断留在 codeguard 文件中,避免每次智能体加载数千行快照。 - -示意模板如下,字段由实际证据生成,不能原样作为某项目的事实: - -```markdown - -## Codeguard 项目上下文 - -- 项目画像:.codeguard/project.json;画像身份:。 -- 语言及版本:<分模块的声明版本与证据;未解析项明确标注>。 -- 构建器:<项目 wrapper / 构建模型 / 命令验证状态>。 -- 架构:<已声明或已确认的描述>;待确认:<候选及证据>。 -- 模块与关系:.codeguard/architecture.md、.codeguard/module-graph.json。 -- 质量规则:<批准策略及规则锁引用>。 -- 开始工作:codeguard status .,再执行 codeguard next . --format json。 -- 修复后:codeguard task verify .;交付前:codeguard check all .。 -- 任务勾选不能替代复检,不得自行降低规则或跳过必需检查。 - - -``` - -生成器必须遵守: - -1. 保留区块外的所有文本以及 CodeGraph/OpenSpec 等其它受管区块;文件不存在时创建,不存在本区块时追加。 -2. 更新前核对原文件与上次受管内容摘要。受管区块被人工修改时三方比较并报告冲突;缺失/重复/不配对 marker 不猜测覆盖。 -3. 尊重路径作用域:发现已有子模块 AGENTS.md 的适用约束,根摘要引用它们;默认不自动批量创建或重写子目录 AGENTS。 -4. 原始源码/注释/README 内容作为数据引用,转义 marker 和 Markdown 控制内容,不能把仓库文本中的指令原样复制成高优先级规则。 -5. 受管摘要只表达已批准规则、可追溯事实与明确标注的推断;已有 AGENTS 与扫描策略冲突时显示冲突,不能自动选择较松规则。 - -## 6. 命令阶段与写入边界 - -```mermaid -flowchart TD - A[识别指定项目与指令作用域] --> B[读取清单 / 配置 / 源码结构] - B --> C[生成项目画像与模块图] - C --> D[分离事实 / 推断 / 未知项] - D --> E[规划规则映射与准备任务] - E --> F[预览文件及 AGENTS 受管区块差异] - F --> G{显式 apply?} - G -->|否| H[返回初始化计划] - G -->|是| I[核对身份并写入受管产物] - I --> J[返回准备状态与下一步] - J --> K[doctor / check / sync / next] -``` - -目标语法:`codeguard init [path] [--dry-run|--apply] [--format human|json]`;省略模式等同 dry-run。dry-run 不写工作树,允许静态观察以及读取身份匹配的已有探测证据;本机版本无可用证据就标 unknown。拟创建的 blocker、决策和准备任务只在返回计划中展示,`--apply` 才将它们持久化到工作区,不因发现阻塞而让 dry-run 写入 findings/tasks。实际命令探测交给 `doctor`,不把任意项目 wrapper、构建扩展、package scripts 当只读文件执行。 - -apply 将计划内的工作区产物和 AGENTS 区块写入;每个目标写入前核对身份,使用临时文件与原子替换,记录初始化事务的进度和可恢复状态。多文件不是天然原子事务:中途失败不得声称全部完成,回滚只撤销能证明由本次创建且未被别人修改的内容。 - -初始化不得隐式安装工具、下载依赖、启动数据库/容器、执行构建/测试、修改业务源码、接管 Git hooks、写 CI 配置或初始化其它规格/图工具。这些事项形成有明确作用范围和前提的后续动作,不与生成项目画像混在一起。 - -当前点前缀默认扫描政策保持。已有批准配置发现机制可读其允许的配置文件;新画像探测器若需要读取额外点路径,必须提出精确 metadata allowlist 的政策变更,获准前该部分保持 unknown,不偷偷遍历隐藏源码或宿主目录。 - -## 7. 初始化成功与项目就绪 - -报告分别提供 `operation=init`、`mode`、`init_status=planned|applied|conflict|partial`、`readiness=ready|incomplete|unknown`、`unresolved`、`changed_files` 和 `next_actions`。初始化文件完整生成可以 exit 0,同时 readiness=incomplete;这不能映射成 check PASS 或 delivery allow。写入冲突/部分失败按操作未完成退出 3,内部故障退出 4。 - -准备状态依据已批准检查义务及选中适配器,汇总**适用且必需**的前置条件: - -| 条件(按表中顺序判断) | readiness | -|------|------| -| 已确认任一必需前置条件缺失、不兼容或冲突 | `incomplete` | -| 否则,必需条件集合尚不能确定,或其中仍有未探测、未解析、过期的证据 | `unknown` | -| 否则,所有适用必需条件都有身份匹配且有效的满足证据 | `ready` | - -未识别出任何适用检查义务时返回 `unknown` 并说明原因,不以空集合证明已就绪。可选工具缺失不影响该汇总;架构候选未确认仅在必需规则依赖它时影响准备状态。`ready` 只说明前置条件满足,不能代表代码质量通过。 - -已确认的必需工具缺失不会阻止保存真实的项目画像,而是形成 blocker;尚未探测的版本形成探测动作,不伪称缺失。架构候选需要确认时形成 `needs_decision` 任务,不能强迫每个项目先选择一种架构。上述任务在 dry-run 中仅规划、apply 后才持久化。 - -建议初始化后工作顺序: - -```bash -codeguard init . --dry-run -codeguard init . --apply -codeguard doctor all . --format json -codeguard check all . --format json -codeguard work sync . -codeguard next . --format json -``` - -首次完整检查建立问题清单,不自动创建存量豁免。无法运行的检查保持未完成,缺失前置条件成为可处理任务。工具准备/集成已有授权时由插件继续执行相应步骤;否则给出具体动作和所需信息,不能因 init 成功停止整个修复流程。 - -## 8. 验收场景 - -- Java 17 项目在 JDK 21 或无 JDK 的机器初始化:声明版本不被覆盖,本机未知不伪造结果。 -- 一个仓库含 Java、TypeScript、Python 多构建根:逐根记录而非只取主语言。 -- 聚合模块互不依赖:contains 不误写成 build_dependency。 -- 存在 domain/controller 目录但无架构声明:产生候选和依据,不激活 DDD 强制规则。 -- AGENTS 有人工内容、其它受管块或子目录约束:完整保留;并发修改产生冲突。 -- wrapper 脚本有副作用:dry-run/apply 均不执行它,探测保持待验证。 -- dry-run 发现已确认的环境阻塞:返回拟创建任务,工作树无新增或修改。 -- 可选工具缺失而必需工具尚未探测:readiness=unknown;不得因可选项误阻塞或将未探测伪称缺失。 -- 新增模块/更改锁/删除构建清单后重新 init:画像失效并刷新,原问题与历史仍保留。 -- 工具未安装但产物生成成功:init_status=applied、readiness=incomplete,交付状态不变。 -- 受管投影被篡改或删除:不能改变有效策略或凭此证明检查已通过。 - -### Cargo 静态声明关系的实施边界 - -当前模块图 0.3 还观察 Cargo 明确成员与本地路径依赖,分别表达 aggregation 和 declared build_dependency,绑定 Cargo.toml 原始字节摘要;依赖保留 normal/build/dev 范围,并按 package 字段处理重命名、核对目标真实包名。仅连接项目内已观察且可定位的目标。workspace 继承、optional/target 条件、成员通配/排除、外部或缺失目标与逃逸路径保留具体 unresolved,版本约束和 feature 也未由原生模型解析。init 不运行 cargo/build.rs 或创建 Cargo.lock/target。历史 0.1/0.2 schema 单独保留;图不证明完整有效模型,不用于缩小检查范围。 - -### 逐清单语言目标的实施边界 - -project.json 0.3 的 language_targets 按清单保存直接 Java maven.compiler.release/source/target 与 Rust rust-version/edition,每条附 build_root、manifest_ref、manifest_sha256,状态为 declared_only。不同模块的值分别保留;汇总 declared_version 与未探测 installed_version 仍为空,不以包版本、另一个模块或本机工具猜测。变量、workspace 继承、重复/嵌套/分段 XML 字段及非法值记录具体 unknown_conditions,不展开 Maven profile/父模型或 Cargo 继承。声明不是生效构建模型,也不激活质量门禁。历史 profile 0.2 schema 单独保留;其它生态与完整版本解析仍未实施。 - -### Maven/Cargo 直接包版本的实施边界 - -已有 package_declared_versions 现在按 Maven/Cargo 清单保存直接包版本,与同批初始清单字节的 manifest_sha256 对应。Maven 不要求完整 GAV,也不读取父/profile 版本;只观察有界字面值,不证明生效版本语义。Cargo 直接字符串须符合 SemVer,保留预发布和构建标识;继承、变量、错类型及非法值显式 unknown,不恢复默认值。包版本不能代替语言目标或本机版本。变更刷新保留人工任务记录,重复初始化幂等;不执行 Cargo/Maven 或产生构建产物。现有 profile 0.3 协议不新增字段;完整有效模型与其它生态仍待实现。 - -### 初始化结果的对话反馈 - -init_plan 0.4 在默认 dry-run 与 apply 都返回 profile_summary:语言及源码/清单数量、构建根、逐清单语言目标与具体未知项。human 从相同结构展示,路径和字段按 JSON 字符串转义,防止不可信目录名伪造终端状态。dry-run 不需写入 .codeguard/ 即可看到结果;摘要不含原始清单内容或本机根路径。本机版本 not_probed、构建模型 not_resolved、架构 unknown;readiness 仍 unknown、交付 not_evaluated。旧 init_plan 0.3 schema 单独保留。完整前置清单及 readiness 汇总仍待实施。 - -### 检查配置与执行状态的反馈 - -init_plan 0.5 的 profile_summary.checkers 按构建根展示 configured/missing/invalid/unknown,并附 configuration_ref、reason 和 next_action。每条 execution=not_run、required_by_policy=null、gate_effect=none,checker_inventory=partial;JSON/human 一致。配置已声明不代表执行成功,缺配置不自动生成代码违规或开启检查器,未知继承不猜测为 missing。readiness 仍 unknown、交付 not_evaluated。旧 init_plan 0.4 schema 单独保留,批准义务和准备任务仍待接入。 - -### 准备状态的领域判定 - -核心 plan_preparation 可据同次 readiness 输入生成稳定的准备任务:有效必需缺失、不兼容、冲突分别给出恢复、兼容性复核和冲突决策;未知/过期/错绑定只要求重新核验,不复用历史缺失诊断。可选、不适用、已满足条件不生成修复任务;未核验来源或非法/重复要求只保留诊断。任务逻辑键在工作区内稳定,绑定变化更新证据,不产生重复任务。固定步骤及关闭条件要求当前有效满足证据,不能通过勾选关闭或自动安装/执行;规划不产生质量 allow。可信输入生产、完整证据/尝试关联、持久化及 CLI 接线尚未完成。 - -核心 evaluate_readiness 已区分 ready/incomplete/unknown。输入要求与观察须由可信宿主验证;只处理适用必需前置,并核对当前绑定和有效期。当前必需缺失/不兼容/冲突优先 incomplete;未探测、未解析、过期、错绑定、集合不完整或没有已确认适用必需条件为 unknown;全部有效满足才 ready。可选条件不影响汇总,重复/歧义不能选择有利证据。结果仅含前置阻塞/未知 ID 和诊断码,不生成交付 allow。CLI 尚无可信来源接线,init 仍保持 unknown,准备任务持久化及实际入口仍待实施。 diff --git a/docs/rust-cli/remediation-workflow.zh-CN.md b/docs/rust-cli/remediation-workflow.zh-CN.md deleted file mode 100644 index e00927e..0000000 --- a/docs/rust-cli/remediation-workflow.zh-CN.md +++ /dev/null @@ -1,252 +0,0 @@ -# Codeguard 持久问题与修复工作流 - -Codeguard 在项目根创建 `./.codeguard/`,将“发现问题 → 形成任务 → 指导修复 → 原工具复检 → 关闭或重开”变为可恢复的工作流。目录既服务人,也服务智能体;检查器负责事实,工作流负责下一步,批准策略决定交付。 - -状态:设计及 Ruff 局部实现。本篇补充 [架构](architecture.zh-CN.md) 和 [技术方案](technical-design.zh-CN.md),规范为 [remediation-workflow](../../openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md)。已有 OpenSpec 管理 Codeguard 自身开发规格;项目内 `.codeguard/tasks/` 管理被检查项目的修复任务,两者不能互相充当完成证明。 - -当前相邻 Rust CLI 已将初始化工作区的 `lint python` 局部结果保存到本地 reports、自动同步,再在同一对话反馈中返回只读下一步简报。同步对本轮原生完整、目标源码仍相同的 Ruff 发现创建脱敏 finding、首次事件和可读任务;缺工具、缺配置等不完整文件创建独立环境 blocker,同一构建根及原因归并,不同构建根分开。重复扫描保留稳定任务,Ruff finding 的每轮报告摘要、源码摘要、行号及 run ID 写入本地 `state/observations/`,同内容重复扫描不新增可提交审计事件;blocker 当前仍为每轮写观察事件。局部 `task verify` 已能重跑原生 Ruff、保存新发现与本地复检观察;原问题消失只进入待策略核验,未正式关闭。Rust Clippy 的局部发现和环境任务也已同步到相同工作台,`task verify --cargo-tool` 会调用原生 Clippy 并保存复检观察;零诊断会对原规则运行原生 `--force-warn` 对照;重现即核查抑制,未重现也只形成待策略核验候选,不能直接关闭任务。Unix 本地 `task claim/heartbeat/release` 已能用跨进程锁和 token/generation 协调同工作区任务,局部 attempt 与 verify 已接入租约;受控 fix 和可信关闭仍缺。过时报告不产生当前源码修复任务,坏报告不阻止其它有效报告;记录故障在对话中显示 `backlog_update_failed`,简报读取故障单独显示 `repair_brief_status=unavailable`。这一切仍为局部待办工作,命令固定返回未认证语义;插件 Hook/MCP、完整 RunReport、正式任务复检关闭和 gate 仍未接线。验收证据见相邻 `codeguard-cli/tests/acceptance/work-sync-ruff-baseline.md`、`codeguard-cli/tests/acceptance/lint-python-auto-brief.md`、`codeguard-cli/tests/acceptance/task-verify-native-observation.md`、`codeguard-cli/tests/acceptance/check-all-partial-native.md` 与 `codeguard-cli/tests/acceptance/task-lease-local.md`。 - -## 1. 为什么需要持久工作区 - -一次终端报错容易丢失上下文:智能体看不到此前尝试、修复是否改变了问题、是否缺环境,最终可能重复相同动作或绕过门禁。持久工作区应能回答六个问题: - -1. 当前还有哪些真实问题和未完成检查? -2. 这个问题来自哪个工具、规则和哪份内容? -3. 应该改源码、依赖、工具链,还是提交规则配置变更? -4. 下一步具体执行什么,允许改哪些文件? -5. 上次尝试为何失败,是否适合继续自动修复? -6. 用什么复检证据证明已解决,哪些交付义务仍未完成? - -## 2. 目录及版本控制 - -```text -project/ -├── codeguard.json # 已有配置入口,继续唯一 -├── codeguard.lock.json # 工具/adapter/rulepack 锁 -└── .codeguard/ - ├── .gitignore # 忽略下面的本地运行数据 - ├── README.md # 本项目工作流说明与常用命令 - ├── workspace.json # 工作区 ID/schema/受管路径清单 - ├── findings/ - │ └── CG-/ - │ ├── finding.json # 脱敏、稳定的问题事实 - │ └── events/ - │ └── .json # 发现、尝试、复检、关闭/重开的审计事件 - ├── tasks/ - │ └── CG-.md # 面向人/智能体的修复任务投影 - ├── decisions/ - │ └── .json # 外部批准决策的引用,不是本地授权旗标 - ├── reports/ # 本地标准报告与复检报告 - ├── runs/ # 本地原始输出、进程证据 - ├── cache/ # 本地工具/扫描缓存索引 - ├── worktrees/ # 本地隔离扫描或修复副本 - └── state/ # 本地锁、领取租约、队列索引和恢复日志 -``` - -默认 `.gitignore`: - -```gitignore -/reports/ -/runs/ -/cache/ -/worktrees/ -/state/ -``` - -README、workspace manifest、脱敏 findings/events、任务文档与决策引用默认可入 Git,便于团队审查和交接;原始日志、缓存、临时源码与领取状态不提交。工具全局缓存可继续在用户缓存目录,本地 cache 只保存所需索引,不要求复制所有工具。 - -记录中不能包含密钥、原始环境、带令牌 argv 或不必要的源码片段。finding.json 保存最小定位、规则依据与不可变证据摘要;详细原文留本地私有 runs。另一台机器缺少本地证据时,可以根据稳定信息重新检查,不能凭仓库里的“已关闭”获得交付认证。 - -`workspace.json` 不是第二份质量配置。它只描述此工作区 schema、ID 和受管文件集合;质量要求仍来自 `codeguard.json` 引用的可信策略和 lock。任何普通文件中的“approved”都不构成授权。 - -init 还生成 `project.json`、`module-graph.json` 与 `architecture.md`,并在项目 AGENTS.md 写受管摘要;workspace 清单引用这些画像,详细职责见 [初始化设计](project-initialization.zh-CN.md)。它们属于可提交的脱敏观察/投影,按精确受管路径校验,不是质量政策。 - -项目尚未初始化时,check 的原始报告写入私有用户缓存,不自行创建 `.codeguard/runs`;初始化后才按固定目录路由本地证据。现有文件进入受管范围需要精确的初始化计划,不能仅靠同名目录推定所有权。 - -### 防止 Codeguard 检查自己的运行产物 - -`.codeguard/` 是点目录,按现行点前缀规则不进入普通源码发现。初始化清单绑定的 reports/runs/cache/worktrees/state 与生成 finding/task 文件仍由 Codeguard 自己进行 schema、路径和脱敏校验;被忽略的普通扫描范围不自动取得策略批准或入库安全豁免。 - -不得简单忽略所有名为 codeguard 的目录;已有 `codeguard/src/`、用户文件和未声明路径照常检查。受管路径必须来自经过校验的生成器清单,不接受 agent 任意扩张排除。入库安全检查仍覆盖拟提交的记录,不能借工具产物身份提交密钥。此新增规则须随本 change 明确更新 scan-scope-policy,现行点前缀规则保持不变。 - -## 3. 三种记录分别解决什么问题 - -| 记录 | 来源 | 用途 | -|---|---|---| -| RunReport | 一次真实检查 | 描述本次内容、执行、全部发现和未完成义务 | -| Finding/Blocker | 多次检查归并的稳定对象 | 追踪代码问题或工具环境阻塞的生命周期 | -| RepairTask | 从对象、规则修复知识和项目上下文生成 | 告诉执行者下一步、限制和验收方式 | - -代码违规创建 `kind=finding`,工具缺失/配置错误/数据库不可用创建 `kind=blocker`。blocker 可以解除后继续原检查,但不能把它伪装成“代码问题已修复”。纯运行噪声、重复日志不各自生成任务。 - -多个 findings 可由同一根因修复时生成一个任务组,逐项保留关闭条件;例如十个模块缺同一 JDK,先生成一个工具链准备任务,并使其依赖检查等待。不能为降低任务数而把不同规则的证据合并掉。 - -## 4. 状态机 - -```mermaid -stateDiagram-v2 - [*] --> open: 首次有效发现 - open --> ready: 修复目标和验收已明确 - open --> blocked: 缺环境或需人工决策 - ready --> in_progress: 领取租约 - in_progress --> awaiting_verification: 修复产物已准备 - awaiting_verification --> resolved: 绑定证据复检确认 - awaiting_verification --> ready: 同一问题仍存在 - awaiting_verification --> blocked: 复检未完成 - in_progress --> blocked: 重复失败或超出自动修复范围 - blocked --> ready: 前置条件恢复 - resolved --> open: 新内容重新检出 -``` - -`resolved` 必须有关闭原因:`code_fixed`、`dependency_fixed`、`environment_restored`、`target_removed` 或 `policy_resolved`。后两者不能被报告成代码已修复:真实删除需要 Git 内容/范围证据;规则正式变更需要可信批准修订和迁移映射。新增 ignore、移动到排除目录、未知规则映射或未验证删除不能自动关闭。 - -`accepted_exception` 是独立处置标签,保留未解决事实与例外到期条件;不是 resolved,不计入修复成功率。规则被新版批准策略移除时,旧记录可以 policy_resolved,但原证据及策略变更历史保留。没有新证据仅手工改状态、勾选 Markdown,最多表示执行者声称完成,正式状态仍 awaiting_verification。 - -任务完成与交付通过独立:关闭一项只证明那一项;`check all`/`gate` 仍需检查完整 contract,发现修复引入的新问题。全部任务被删除或勾选也不能生成 allow。 - -## 5. 稳定身份、事实源与协作 - -首次发现生成稳定 issue ID,后续使用工具/规则 ID、仓库相对路径、符号/内容锚点及类别匹配。CVE 使用 ecosystem/component/advisory/依赖定位。行号是展示信息,不能作为唯一身份。文件重命名使用 Git 关联与锚点匹配;匹配不确定时保留候选关系,不错误关闭旧问题。 - -`finding.json` 保存初始事实和身份;每次有意义的状态变化追加一个唯一 event 文件,携带 parent event ID、原内容/政策/工具身份、run evidence digest、actor、时间和变化原因。派生状态和 tasks Markdown 可以重建,不能作为新的事实权威。 - -事件文件是可审查历史,不是密码学授权或无需复检的证明。用户同权限可以修改 Git 文件,因此 CI 独立读取可信策略并复检代码。事件冲突、丢失父节点或相互矛盾的关闭事件产生 `reconciliation_required`,不采用“最后一个写入 wins”关闭问题。 - -`state/` 中使用跨进程锁和带到期的 task lease;claim/heartbeat/release 通过 CLI 完成。租约只防止同工作区重复劳动,不授权改质量规则。不同机器通过独立分支提交事件,合并后按父关系核对;远程全局调度不在初版保证内。 - -同一问题在同一内容/策略下反复扫描,只更新本地观察和 runs,不反复改 tracked finding/task 文件。复检后重新检出可追加一次恢复待处理事件,后续相同扫描仍只更新本地观察;发现集合、修复状态或重要上下文变化才生成持久事件,减少 Git 噪声。保存 Hook 不自动把一整份持久清单刷进用户工作树。 - -## 6. CLI 工作流 - -```text -codeguard init . --dry-run -codeguard init . --apply - -codeguard check all . --format json -codeguard work sync . -codeguard status . -codeguard next . --format json -codeguard task show CG-abc123 . -codeguard task claim CG-abc123 . --owner agent-session-1 -codeguard task attempt start CG-abc123 . --owner agent-session-1 --lease-token --action-id <简报动作ID> - -# 智能体按照任务修改源码或修复环境 -codeguard task attempt finish CG-abc123 . --owner agent-session-1 --lease-token --attempt-id --outcome ready-to-verify -codeguard task verify CG-abc123 . --owner agent-session-1 --lease-token --format json -codeguard task release CG-abc123 . --owner agent-session-1 --lease-token -codeguard check all . --format json -``` - -上例占位符从前一步结构化结果取得;详细参数与 C23–C33 契约见 [逐指令设计](command-architecture.zh-CN.md)。claim 返回不可复用 token/generation,不能仅用同名 owner 续租、结束尝试或释放新租约。受控 fix 可携带 task/owner/token 复用租约并自行登记 attempt,插件不能再为同一修复重复 start/finish。 - -`init --dry-run` 输出项目观察、画像和文件创建/更新/冲突清单;省略模式同样只读。`--apply` 写入计划中的自有工作区文件与 AGENTS 受管区块,不覆盖人工内容或修改质量阈值。已存在同名用户目录时合并计划须精确到文件,冲突路径拒绝写入;不以 `--force` 吞掉用户文件。 - -`work sync` 消费与当前工作区绑定、schema 有效的本地报告,生成/归并记录与任务。默认按 run_id 游标幂等消费所有尚未导入的匹配报告;同一内容先 lint 再 CVE 的报告必须合并,不能只取最后一份。每份报告分别验证内容、政策、工具与检查范围;已过时的报告可保留历史,但不能导入为当前事实。部分报告只能增加有效发现/阻塞,不能据未出现自动关闭旧问题,完整报告也不能跨未覆盖范围关闭。 - -`status/next/task show` 只读;`next` 不自动领取,返回最适合推进的任务和选择理由。`claim/release/heartbeat` 正常操作只改本地 lease;过期恢复遇到未结束attempt时先追加abandoned事件和预算记录,再取得新租约,恢复失败不能假称已接续。`task verify` 运行该问题及受影响范围的真实检查并按证据追加事件;不等于全项目 gate。CLI 不提供无需证据的 `task close --force`。 - -`task attempt start/finish` 登记尝试 ID、动作指纹、执行者、前后内容/patch 摘要与结果;finish 的枚举是 ready-to-verify、no-change、failed、blocked,不能直接 resolved。受控 `fix --apply` 自动写这些事件;dry-run 只预览,不消耗修复预算。自由源码修改由插件在修复回合前后调用。中断未 finish 的尝试在租约恢复时记 abandoned,不捏造成功;无修改和复检前失败也进入 prior_attempts/预算。agent 自述原因作为备注,实际内容变化由 CLI 观察,不能由 agent 自报成功关闭。 - -doctor 的准备证据和检查报告均绑定 run_id,按 workspace_id + run_id + 报告摘要校验幂等性;同键不同摘要拒绝。next 明确区分 actionable/waiting/needs_decision/verification_required/no_applicable_work,不能以没有待办推断当前质量通过。status 展示历史通过时保留其内容身份与 freshness。 - -普通独立 `check` 默认写本地报告,不更新 tracked backlog;用户可显式 work sync。`init --apply` 的变更计划明确启用插件修复工作流,并固定受管写入范围;启用后,插件每次扫描执行“探测配置 → 调用已配置的原生工具 → 记录 run → 幂等 sync → 将结果与 RepairBrief 返回智能体对话”。反馈分别列出已配置并运行、未配置、配置无效、工具故障及有效诊断,不能只回显原始报错。相同问题不改 tracked 文件;新问题或状态变化才落事件。同步失败时仍返回本次检查结果,另报 backlog_update_failed 与恢复步骤,不假称任务已生成。 - -未初始化项目的插件首次反馈提供初始化计划及本次临时 RepairBrief,不静默写受管目录。启用持久工作流后,回合恢复先 status/next,修复前后记 attempt,复检后再 next。工作流错误不放宽检查;其状态单独报告,实际检查门禁不靠任务是否写盘决定。 - -## 7. 给智能体的 RepairBrief - -`next --format json` 应返回结构化、可直接执行的任务上下文: - -| 字段 | 内容 | -|---|---| -| identity | issue/task ID、workspace、源内容与策略身份 | -| kind / state | finding 或 blocker;当前状态、阻塞依赖 | -| evidence | 检查器、规则、位置/包、脱敏原生诊断、证据引用 | -| expected_behavior | 规则依据与最小可观察修复目标 | -| repair_recipe | 已版本化的工具/规则修复步骤、正例和反例 | -| allowed_changes | 本任务允许修改的源码/依赖范围;额外改动要重新规划 | -| constraints | 必需规则、阈值、测试与禁止降级项 | -| suggested_actions | 结构化 argv 或源码修复建议,说明作用和前提 | -| verification | 要运行的 adapter/规则/受影响范围与完成条件 | -| prior_attempts | 尝试摘要、失败原因、当前 patch 身份 | -| escalation | 何时停止自动重试、需要哪类决策 | - -recipe 来源于经版本化、可测试的规则包/技能;诊断和仓库文本属于不可信数据,不能将它们直接插值到可执行 Shell 或当成指令。AI 可以补充解释和补丁建议,但不能改写工具的 finding 事实。 - -任务 Markdown 是上述信息的人类投影,可保留明确分隔的人工备注区。勾选只能表达工作意图;生成器对受管区修改进行提示或重建,不据其降低策略。任务应有“问题 → 依据 → 修复步骤 → 复检 → 完成证据”,不能只有“运行某工具直到绿”。 - -## 8. 不重复报错、不逃逸的控制 - -```mermaid -flowchart TD - Scan[原生工具检查] --> Sync[归并发现与环境阻塞] - Sync --> Next[选择一个可推进任务] - Next --> Brief[提供规则依据 / 修复步骤 / 验收命令] - Brief --> Fix[智能体修复源码或环境] - Fix --> Verify[原工具复检与身份核对] - Verify -->|问题解决| Close[追加 resolved 证据] - Verify -->|新问题或原问题仍在| Update[更新任务与失败原因] - Verify -->|检查未完成| Block[环境阻塞任务] - Update --> Budget{有新的有效修复策略?} - Budget -->|有| Next - Budget -->|无或超预算| Escalate[明确需要的人工决策] - Block --> Next - Close --> Gate[完整 contract 交付门禁] -``` - -调度先修阻断大量检查的工具链前提,再按已批准严重度、依赖关系、可修复性选择源码任务。严重安全问题仍保持可见,不因前提任务排前而降低级别。相同 finding/content/patch 连续出现且无新信息时,不重复执行同一动作;记录尝试并提出具体恢复建议。 - -自动重试预算是执行保护,耗尽后转 blocked/needs_decision,不会让门禁通过。默认可设连续两次无进展后停止该任务自动重试,继续其它独立任务;预算值是运行选项,不能修改质量要求。需要用户时,问题应具体到缺失的工具安装授权、业务行为选择或有证据的规则缺陷,不能直接建议“跳过 Codeguard”。 - -“疑似误报”创建规则/adapter 缺陷调查任务,带最小复现与原生输出;在正式修复规则或批准策略变更之前,原检查状态不凭主观判断消失。工具误判可修复适配器并重新运行;不能借修改被测项目 tests 或忽略规则实现闭环。 - -## 9. 闭环验收 - -| 场景 | 必须观察到的结果 | -|---|---| -| 同一问题扫描十次 | 一个稳定 issue,运行记录可查,无十份重复任务 | -| 同内容先 lint 再 CVE 后同步 | 两份未消费报告均进入清单,重复同步幂等 | -| 缺 JDK 导致多个模块未检查 | 一个可复用前置 blocker,依赖检查完整列出 | -| 手工将任务勾为完成 | 无复检则正式状态不关闭,gate 不变 | -| 修复后工具超时 | awaiting_verification/blocked,保留原 finding,不自动关闭 | -| 未完成批次没再输出旧问题 | 不据缺失推断 resolved | -| 移动文件或新增 ignore | 无可证明等价覆盖时不能关闭旧问题 | -| 真正修复后同规则复检干净 | 记录内容/规则/工具/范围与 resolved 事件 | -| 已修问题重新出现 | 同一匹配 issue 重开,保留历史尝试 | -| 两个智能体同时领取 | 同工作区仅一份有效 lease;租约过期可恢复 | -| 修复在复检前失败或无修改 | attempt 与预算仍记录,next 不再推荐耗尽且无新信息的相同动作 | -| 不同分支出现冲突关闭事件 | reconciliation_required,不能取最后写入作为真值 | -| 删除全部 tasks/findings | 新检查仍发现真实问题;无法靠清空目录通过 | -| 受管目录含 secret 或用户源码 | secret 仍经入库安全;未声明源码正常扫描 | - -这套目录应成为智能体的修复工作台。最终判断始终回到真实内容、有效政策和原生检查器,文件记录帮助推进工作,不能替代检查本身。 - -### Checkstyle 准备任务的尝试与复检 - -当前局部 Rust 工作流支持准备任务的受控尝试和显式原工具复检。智能体完成环境恢复动作后,以 `ready-to-verify` 结束尝试,再调用 `task verify`;任务勾选和该尝试标签都不代表环境已经恢复。复检仍受阻时,具体原因与原尝试关联,在当前源码范围仍有效时继续指引前置修复,避免只重复检查。相同动作与输入连续无进展时,已有预算把任务转为 `needs_decision`,保留环境问题及历史;不能靠改动作名称重置预算。观察后的源码变化或不可用时,应先重新确认范围。 - -局部原工具恢复后,其源码发现进入稳定修复任务,准备任务保留 open,下一步核验原工具选择、生效配置、批准及完整覆盖。可信来源、模块粒度与正式关闭仍待完成;本地恢复反馈不能替代这些条件。验收见相邻 `codeguard-cli/tests/acceptance/checkstyle-preparation-recheck.md`。 - -准备恢复的复检事件会关联最近的受控 ready-to-verify 尝试,解除其等待复检状态;仍不能关闭任务。Java 或 Checkstyle JAR 在复检后变化、路径身份变化或不可用时,下一步和任务查询均要求重新复检,不沿用旧恢复或暂未检出结论。 - -Checkstyle 的当前工具、配置与已绑定源码失效判断优先于旧复检结果分类。即使旧结果为 still_present,也不能将已经失效的任务重新标为可按旧诊断修复;应显示具体失效原因并按原工具复检。 - - -### Checkstyle 原始配置复检边界 - -源码任务的修复候选必须保持首次发现时的配置字节身份;仅检查类及规则 ID 相同不能证明 scope、token、名称排除及其它参数未改变。原生复检零诊断但配置变化时返回 rule_coverage_requires_review,重复复检不覆盖首次依据。新增原始配置身份可从摘要绑定的首轮报告恢复;旧简报缺身份时要求复核。当前整份 XML 字节变化均需调查,包括等价空白变化,但不会形成源码违规;实际仍检出同一问题时保留 still_present。恢复原配置并修正文档才产生局部缺失候选,事实仍 open,批准义务与正式关闭另行核验。 - - -原生 Checkstyle 配置正则失败可细分为 checkstyle_configuration_regex_invalid:仅固定版本已识别正常退出与因果异常组合,且没有一致诊断报告;输入变化、取消/截止和留证失败优先。对话及配置准备简报要求修正原配置正则并复扫,不回显堆栈或属性值,不建议修改无关源码。未知错误保留原原因,不能凭堆栈关键词关闭任务或放行。 - - -### 2026-09-27 历史npm准备范围恢复 - -默认check all在Unix上读取当前0.3初始化画像及受管摘要,恢复物理目录仍存在但清单当前不可用的准备范围。只生成本轮状态和稳定任务,不以历史摘要或当前显式工具参数启动该历史根的原生检查;当前其它根独立调度。画像不一致/错误路径/重复字段明确历史范围未完成,清单恢复后重新发现。此为本地范围线索,不是覆盖或批准;整体目录丢失、画像刷新删除旧根后的义务恢复及宿主接线仍缺。详见相邻Rust验收npm-historical-roots-workbench.md。 - - -## 2026-09-27 npm画像刷新后保留已记录准备范围 - -RED证实清单删除后再次init刷新画像,默认check all遗漏已有稳定npm问题。现从本工作区有界普通物理finding.json恢复清单不可用、物理目录仍存在的准备范围;核对结构、工作区/检查器、稳定指纹与ID、scope、两项输入归属及状态。画像与事实两类来源独立,不因画像失配吞掉可核验事实范围。只恢复本地准备,不沿用旧结果或启动该根的原工具。可编辑Markdown附件删除/勾选不能消除该范围;附件缺失仍暴露同步问题,不宣称任务已修复。 - -新增npm_recorded_roots_cli覆盖刷新后重复检查、附件删除、事实身份/路径损坏、当前兄弟根保留及输入恢复;已有画像拒绝测试更新为事实恢复仍保留范围,同时明示画像错误。目录整体丢失、删除全部事实且画像已刷新后的防逃逸仍需独立受保护义务来源;本地记录不是可信批准。完整7.3/7.5/9.7保持未完成,不据此归档。 diff --git a/docs/rust-cli/static-check-catalog.zh-CN.md b/docs/rust-cli/static-check-catalog.zh-CN.md deleted file mode 100644 index fb6ab8f..0000000 --- a/docs/rust-cli/static-check-catalog.zh-CN.md +++ /dev/null @@ -1,81 +0,0 @@ -# Codeguard 静态检查配置与对话反馈 - -下表是**候选检查目录**,不是每个项目必须执行的清单,也不是已实现能力表。`codeguard capabilities` 说明发行版能适配什么;项目配置探测说明本项目启用了什么;本次检查结果说明原生工具返回了什么。这三者分别反馈。当前 57 种语言在五个候选平台上的六类别单元仍为 `gap`。Rust 负责配置发现、受控调用和结果整理,P3C、Maven、Javadoc 等继续运行各自原生检查器。 - -```mermaid -flowchart LR - A[项目语言与构建器] --> B[探测原生检查配置] - B -->|已配置| C[Rust 调用原生检查器] - B -->|未配置/无效| D[说明配置缺口与启用建议] - C --> E[解析原生诊断或工具故障] - D --> F[智能体对话反馈] - E --> F - F --> G[智能体修复代码或配置] - G --> H[原工具复检并更新反馈] -``` - -| 类别 | 候选检测族 | 可识别的检查示例 | -|---|---|---| -| `lint` | `syntax`, `style`, `type`, `dataflow`, `complexity`, `duplication`, `dead_code`, `architecture`, `api_compatibility`, `schema` | 语法、代码规范、类型、数据流、复杂度、重复代码、死代码、模块边界、公开 API 兼容性、数据模式 | -| `comments` | `api_docs`, `comment_policy`, `doc_links` | Javadoc/rustdoc/KDoc 等 API 文档、注释规则、文档链接 | -| `dependencies` | `graph`, `versions`, `licenses`, `sbom`, `provenance` | 实际解析图、版本冲突和过期、许可证政策、SBOM 完整性、组件来源 | -| `cve` | `advisory` | 组件身份与版本匹配、advisory、数据库身份和时效、严重度 | -| `security` | `sast`, `secrets`, `iac`, `container`, `config`, `policy` | 源码漏洞、秘密内容、基础设施配置、镜像/Dockerfile、运行配置、禁止入库策略 | -| `build` | `compile`, `reproducibility`, `manifest` | 编译/静态构建、可复现性、构建清单一致性 | - -检测族完整标识是“类别.族名”,如 `comments.api_docs`。它用于给已配置的检查器归类,而不要求所有项目逐族启用。`dependencies.graph` 可为 CVE 匹配提供输入,但图解析成功不能宣称没有漏洞;CVE 无命中也不能证明许可证或版本治理合格。Javadoc 检查应按项目已配置的规则解释公共 API、参数/返回、继承文档等诊断,formatter 不算注释检查。 - -项目配置探测返回 `configured / missing / invalid / unknown`,并指出检查器、配置文件/规则来源和具体处理建议。`configured` 时运行原生命令,把本次诊断、位置或组件、规则依据、工具错误及复检命令直接反馈到智能体对话。`missing` 不等于源码违规,`unknown` 不等于通过;只有批准策略明确要求的缺项影响交付门禁。工具故障、坏报告或数据库过期反馈为未完成,不冒充代码问题。修复后重跑相同原生检查器,依据新结果更新任务。 - -对话反馈示例(说明格式,不代表当前 CLI 已支持): - -```text -CodeGuard · Java -Javadoc:已配置(pom.xml),检查发现 2 项;Foo.java:42 缺少 @return。 -CVE:未配置;可在项目依赖审计配置中启用受支持的原生检查器。 -下一步:补全 Foo.java 的返回值说明,再运行 codeguard comments java . 复检。 -``` - -检测族可在后续协议版本中扩展。候选目录、项目是否配置、工具是否可用、本次运行结果和交付策略必须分开表述;目录登记不意味着已有适配器,也不自动生成项目义务。 - -### 字段 Javadoc 局部适配状态 - -Checkstyle 10.21.4 的原生 JavadocVariable 已接入显式原配置、稳定问题/修复任务与 task verify,支持本版 scope/excludeScope/ignoreNamePattern 参数。public 字段及指定忽略、serialVersionUID、局部变量边界经过原工具回放;public/protected/package/private、excludeScope 与枚举 token 的七组原生边界已补充验收;10.21.4 的 VARIABLE_DEF 是必需 token,仅选择枚举 token 仍包含字段检查。其它语法与完整配置模型仍待验收。字段文档修复后的零诊断只为局部候选观察,不证明完整项目通过。验收见相邻 codeguard-cli/tests/acceptance/checkstyle-field-javadoc.md。 - -既有五类 Javadoc 静态模块已支持官方短名、带 Check 后缀短名和官方完整类名,Checker/TreeWalker 完整名也保留原生配置;只按固定版本精确映射,不猜测自定义包名。字段规则的三种写法已用原工具验证共享同一任务,其余模块名称已有纯绑定回归,完整项目配置仍待接通。 - -MissingJavadocMethod 静态适配增加范围、allowedAnnotations、allowMissingPropertyJavadoc、minLineCount 与 ignoreMethodNamesRegex;四组固定原工具配置回放已验证筛选实际结果,原 XML 不重写。10.21.4 对单行非空体的方法行数边界须按原工具复现,不能据有 getter/setter 名称便推断豁免。METHOD_DEF、CTOR_DEF、ANNOTATION_FIELD_DEF、COMPACT_CTOR_DEF 五组原生选择及紧凑构造器文档修复复检已补充局部验收;完整构造器语法、项目模型及受批准规则覆盖仍待完成。 - - -JavadocMethod 已保留固定 10.21.4 的 accessModifiers、allowMissingParamTags、allowMissingReturnTag、validateThrows、allowedAnnotations 和四类方法/构造器 token。六组原生配置证明允许缺标签、公开范围及注解例外不会被 Rust 额外补报,throws 选项增加原生异常标签诊断;恢复首次配置后的实际文档修复经复检仅形成局部候选。原生配置不等于白名单批准或必需覆盖证明,完整项目模型仍未完成,见相邻 tests/acceptance/checkstyle-method-tag-options.md。 - - -类型文档静态适配保留 MissingJavadocType/JavadocType 的 scope/excludeScope 与五类类型 token、各自注解例外、JavadocType 的参数/未知标签以及作者/版本格式参数。十组原生配置与一次真实文档修复复检验证访问范围、注解、record 选择及参数/未知标签边界;作者/版本格式仅有静态绑定证据,完整项目与批准覆盖仍待完成。验收见相邻 tests/acceptance/checkstyle-type-options.md。 - - -作者/版本格式局部原生正反例已补充:缺失与不符均报告原诊断,真实补齐后原配置复检只给候选;无效正则为配置准备阻塞,重复失败复用任务。类型修复指引涵盖 @author/@version 与项目事实依据,不编造作者或版本。任意格式与标签变体、有效项目模型及批准覆盖仍待完成,见相邻 tests/acceptance/checkstyle-type-formats.md。 - - -### JavaScript/TypeScript 报告协议局部状态 - -相邻 Rust adapter 提供 ESLint 10 JSON 纯解析原型,核对预期版本、显式文件集合、原生计数和 exit/max-warnings 关系。退出零的 warning 保留,fatal 或缺规则身份消息要求调查,抑制不算白名单;尚未执行原生 ESLint、解析生效 flat config/TS parser 或接通项目 CLI/依赖/工作台,不能把此原型标为 JavaScript/TypeScript 已支持。依据及夹具验收见相邻 tests/acceptance/eslint-json-observation.md。 - - -ESLint 原生命令计划已可由 Rust 固定构造:显式 Node/JS 入口、原 flat config、完整源集和 JSON 槽位,禁用配置自动查找、不隐式 fix/cache/quiet/install。真实 Node 的字面参数转发已验收,但仅执行观察脚本;ESLint 原生及项目配置/CLI/依赖接线仍未运行,不能据此宣称 JavaScript/TypeScript 检查已启用。见相邻 tests/acceptance/eslint-native-command-plan.md。 - - -### npm审计适配基础实施进展 - -相邻Rust工程已加入npm11机器报告观察、只读审计脚本声明识别和显式离线原生命令计划。原生advisory/间接关系保留,错误、缺锁、计数和严重度矛盾均未完成;不会将advisory数字当CVE、范围当解析版本。配置识别尚未接入detect/init,公开CVE/依赖命令及完整锁图/数据库时效/任务门禁仍待实现;真实空锁及缺锁与协议正反例见相邻 `codeguard-cli/tests/acceptance/npm-audit-observation.md`。 - -### Python 依赖与 CVE 输入的只读发现 - -相邻 Rust `detect` 按 Python 构建根记录 `requirements.txt` 的简单逐行固定版本、动态/未锁声明、`uv.lock`/`poetry.lock` 存在但未解析、以及没有依赖输入等状态;`plan cve python` 和 `check all` 将缺口反馈给智能体。它只检查可见输入的语法与归属,不解析传递依赖闭包,也不调用 pip-audit 或查询漏洞库。即使所有可见行都精确固定版本,或已有锁文件,检查器配置仍为 `unknown`,交付仍未评估。多构建根反例与具体输出见相邻 `codeguard-cli/tests/acceptance/python-dependency-input-discovery.md`。 - -标准 `pylock.toml`/单段命名 `pylock..toml` 现与 uv/Poetry 专用锁分开记录;同根多锁要求先确认实际输入。依据 [pip-audit 官方项目模式](https://github.com/pypa/pip-audit/blob/main/README.md?plain=1)和 [PyPA pylock 命名规范](https://packaging.python.org/en/latest/specifications/pylock-toml/),不能把 uv/Poetry 专用锁直接作为 pip-audit `--locked` 输入。标准锁仍需解析 PEP 751 环境/依赖组和原生报告,发现器不会仅凭文件名给出漏洞结论。 - -pip-audit 的 Rust adapter 另有固定只读 `--locked` 参数计划和 JSON 纯解析:有效组件版本、advisory 与别名可保留为局部观察,跳过组件、错误退出和报告矛盾均使观察未完成。该 API 尚未调用本机原生工具,也未与标准锁字节、漏洞库或 `check all` 绑定;零项观察固定 `advisory_coverage=not_evaluated`。协议及反例见相邻 `codeguard-cli/tests/acceptance/pip-audit-protocol.md`。 - -公开 `cve python PATH --pip-audit-tool ABS_PATH --pip-audit-version VERSION` 已用受控进程和私有标准锁快照接通该协议。它前后核对项目 pyproject、单份 pylock、私有副本与工具字节;human/JSON 显示原生 advisory、缺锁、工具故障或输入变化,固定交付未评估。本机尚无 pip-audit 的真实运行证据,PEP 751 环境/依赖组、数据库时效和项目全覆盖仍不能声明已验证。局部验收见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。 - -为降低归属误报,该入口仅在整组原生组件名/解析版本与本轮标准锁的显式版本集合一致时显示项目局部 advisory;缺包、错版本、无版本源码包或锁模型损坏都保留阻塞,不拿原生 JSON 直接指控当前项目。此比较尚未解释 PEP 751 的环境选择与哈希,匹配也不构成完整图或数据库覆盖证明。 diff --git a/docs/rust-cli/technical-design.zh-CN.md b/docs/rust-cli/technical-design.zh-CN.md deleted file mode 100644 index 979254b..0000000 --- a/docs/rust-cli/technical-design.zh-CN.md +++ /dev/null @@ -1,364 +0,0 @@ -# Codeguard Rust CLI 技术方案 - -状态:待实现;命令、字段与文件布局是目标协议,不代表当前 Python CLI 已支持。规范性事实源为 [本次 OpenSpec](../../openspec/changes/introduce-rust-codeguard-cli/proposal.md)。 - -## 1. 命令模型 - -逐项职责、价值、结果类型、副作用、失败恢复与典型调用旅程见 [命令架构](command-architecture.zh-CN.md),检测族与验收边界见 [静态检测目录](static-check-catalog.zh-CN.md)。以下是同一目标协议的语法汇总;执行预算参数省略处遵循该文档 2.4 的支持矩阵和默认值,并在实现时从同一命令 schema 生成完整帮助。 - -```text -codeguard [path] - [--format human|json|sarif] [--output PATH] - [--jobs N] [--timeout DURATION] [--offline] -codeguard help [command...] -codeguard --version [--format human|json] -codeguard plan [path] - [--format human|json] -codeguard detect [path] [--format human|json] -codeguard capabilities [language] [--format human|json] -codeguard doctor [language|all] [path] [--format human|json] -codeguard rules list [path] [--format human|json] -codeguard config [path] [--format human|json] -codeguard fix [path] --category - <--dry-run|--apply> [--task TASK_ID] [--owner ID --lease-token TOKEN] - [--format human|json] -codeguard gate pre-commit [path] [--format human|json] -codeguard gate pre-push [path] --remote-name NAME --remote-url URL [--format human|json] -codeguard gate ci [path] --input PATH [--format human|json] -codeguard tools [path] [--format human|json] -codeguard tools install --lock PATH [--dry-run|--apply] [--format human|json] -codeguard init [path] [--dry-run|--apply] [--format human|json] -codeguard work sync [path] [--format human|json] -codeguard status [path] [--format human|json] -codeguard next [path] [--format human|json] -codeguard task show [path] [--format human|json] -codeguard task verify [path] [--owner ID --lease-token TOKEN] [--format human|json] -codeguard task claim [path] --owner ID [--format human|json] -codeguard task [path] --owner ID --lease-token TOKEN [--format human|json] -codeguard task attempt start [path] --owner ID --lease-token TOKEN - --action-id ID [--format human|json] -codeguard task attempt finish [path] --owner ID --lease-token TOKEN - --attempt-id ID --outcome VALUE [--format human|json] -codeguard mcp serve -codeguard compat legacy-v1 <旧子命令与参数> -``` - -检查命令的 language 必填,path 默认当前目录。canonical ID 沿用现有注册表,别名由同一注册表解析;`all` 是发现所有适用语言及类别,不是对所有注册语言强制安装工具。未知语言在执行前返回用法错误。 - -`gate pre-push` 通过 remote-name/remote-url 接受 Git hook 参数,通过 stdin 接受 ref/OID 元组;`gate ci --input` 接收版本化请求文件,其中明确仓库身份、不可变 commit OID 集合与预期内容来源。符号 ref 只作描述,输入文件不授予政策权威。禁止通过默认 HEAD 推测推送/CI目标;完整输入 schema 和验证样本在 S02 落实。 - -```bash -codeguard lint java . --format json -codeguard comments java . -codeguard cve all . --offline -codeguard check all . --format json --output codeguard-report.json -codeguard plan check all . -codeguard doctor java . -codeguard fix java . --category lint --dry-run -``` - -检查命令默认不修改源码、配置、Git index,也不自动修复;构建产物和工具缓存写入隔离运行区。`plan` 不执行构建、扫描、下载或安装,只读取计划所需信息;无法静态确定的部分记为待解析。`doctor` 可执行有界版本探测,但不执行安装。`tools install` 是独立显式动作,默认只预览锁定的安装计划,`--apply` 才安装,不由扫描隐式触发。 - -`check` 的类别是 lint、comments、dependencies、cve、security、build;先识别项目实际检查器配置,再运行已配置且可用的原生工具。未配置项反馈给智能体,只有批准策略要求的缺项影响交付门禁。build 的测试执行等级独立记录,由批准策略和明确的项目构建命令确定:沿用现有 Java 静态构建默认不运行测试;报告必须写明 test_execution=false,不能声称测试通过。若批准策略要求测试,必须运行,CLI 不提供自动跳过路径。 - -持久修复工作区及新增命令的写入边界见 [修复工作流](remediation-workflow.zh-CN.md)。check 写本地报告,work sync 显式更新脱敏问题/任务;next 只读并返回 RepairBrief,task verify 依据复检追加状态事件,不能手工强制关闭。 - -init 默认 dry-run,静态建立项目画像、模块图、检查准备清单及 AGENTS 受管摘要;apply 写入计划内产物,实际探测仍交给 doctor。版本来源、架构推断、增量刷新和 AGENTS 合并契约见 [初始化设计](project-initialization.zh-CN.md)。init 操作成功只表示计划/产物完成,不签发质量通过;其 readiness 独立记录前置条件。 - -## 2. 退出码、请求通过与交付通过 - -下表首先定义检查类的含义。信息/计划/管理命令的 0 表示该操作完整完成:例如 plan 可以完整返回含阻塞的计划,next 可以正常返回待决策,而 doctor/config validate/tools verify 对必需验证条件未满足返回 3。任何非交付命令不能因 exit 0 签发质量 allow;详见命令架构的退出语义表。 - -| 新 CLI 退出码 | 条件 | -|---|---| -| 0 | 请求选中的全部适用义务已完成且无阻断违规 | -| 1 | 请求已完成,存在阻断违规 | -| 2 | 参数语法、未知子命令/语言等用法错误;未启动检查 | -| 3 | 必需义务未完成:缺工具、无能力、坏配置、超时、无效报告、覆盖不全等 | -| 4 | Codeguard 内部故障或无法建立可信结果 | -| 130 | 用户取消;已有结果保留为部分结果 | - -聚合优先级:取消 > 内部故障 > 未完成 > 违规 > 请求通过;用法错误只在执行前产生。单检查执行故障不等于进程原生 exit=3;`raw_exit_code` 单独保存,进程未启动或由 signal 终止时可为 null,并有 `termination_reason`。 - -`lint java` 可以 exit 0,但报告 `delivery_gate.decision=not_evaluated`、`eligible=false`。只有 `check all` 或交付入口完成整份质量 contract,且内容与可信策略匹配时才可 `allow`。完整扫描无适用对象时可以 exit 0,但结果为 `not_applicable`,不能显示“全部已验证”,也不能用空输入签发交付认证。显式 `lint java` 找不到任何 Java 目标则 exit 3,避免目录选错变绿。 - -`check java` 完成全部 Java 义务;除非计划已证明该项目整份 contract 只含 Java 且所有跨语言依赖义务也覆盖,否则不签发全项目通过。实现初版可统一限制为 `check all`/`gate` 才计算交付 allow。 - -## 3. 数据模型与协议 - -`schema_version` 使用 major.minor 字符串,初始目标为 `1.0`;二进制版本、adapter 版本、rulepack 版本分别记录。消费者必须拒绝未知 major,允许兼容 minor 的可选扩展;禁止宽松读取未知枚举后按通过处理。 - -命令结果共用 report_type/operation/request_id/command_status/exit_code/warnings/next_actions。检查继续使用下述 RunReport,查询、计划、准备、修复和状态操作采用各自 schema;不把所有结果强制变成空 findings 报告。command_status 描述操作完成性,独立于检查 completion、finding、readiness 和 delivery_gate。mcp serve 的服务生命周期与各请求结果分离。 - -| 对象 | 关键字段 | 不变量 | -|---|---|---| -| CheckRequest | command、selection、root、content_source、operational_options | 用户选择与批准策略分开 | -| PolicyIdentity | source、revision、digest、authority | digest 证明一致性,不单独证明授权 | -| ContentIdentity | source_kind、repository/worktree identity、commit/index/tree digest、manifest digest | 不能仅用路径/mtime/size | -| CheckObligation | id、module、language、category、required、targets、rule_ids | 先有义务,再选择工具,缺工具不能删除义务 | -| CheckPlan | obligations、tasks、dependency_edges、resource_keys、scope_digest | DAG 无环;未执行任务有解释 | -| ToolExecution | executable identity、argv、cwd、env fingerprint、times、raw rc、artifacts | 原始敏感参数只进私有证据 | -| CheckResult | obligation_id、completion、reason、findings、execution_refs、coverage | findings 与 completion 正交 | -| Finding | id、native_rule_id、category、severity、gate_impact、message、location、evidence_refs、baseline_state | 原生严重度与批准策略判定的 blocking/non_blocking/undetermined 分开;不能由自然语言反推规则 | -| Coverage | expected、observed、unresolved、excluded_policy_digest、proof_kind | 数量相等不等于集合相等 | -| GateDecision | decision、eligible、blocking_finding_ids、incomplete_obligation_ids、coverage_mismatch_ids、invalid_ledger_ids、policy_digest | 未完成不能 allow;义务与实际目标精确比对 | -| RunReport | version、run_id、request、policy/content identity、results、gate、summary | human/json/sarif 派生自同一对象 | - -当前 Rust 结构消费协议已升至 1.3,并兼容读取 1.0–1.2;`completion=complete|incomplete|not_applicable`,`delivery_gate.decision` 增加 `allow_with_exceptions` 及原始/已处置/活跃发现集合。当前仅有 schema、严格解析与 JSON/human 对话摘要切片,真实报告生产、可信审批和其它格式/宿主消费尚未接通,不能把解析成功的带例外声明作为可信交付。内部故障另置 `run_status=internal_error`,交付决策保持 incomplete。详见[误报白名单设计](false-positive-allowlist.zh-CN.md)。 - -输出示意(**字段节选,不是可直接通过 schema 的完整样本**): - -```json -{ - "schema_version": "1.0", - "request": {"command": "check", "selection": "all"}, - "results": [ - { - "obligation_id": "java:app:lint:p3c", - "completion": "complete", - "findings": [{"id": "f-1", "native_rule_id": "native-rule-id", "severity": "error", "gate_impact": "blocking"}] - }, - { - "obligation_id": "maven:app:cve", - "completion": "incomplete", - "reason": "advisory_database_unavailable", - "findings": [] - } - ], - "delivery_gate": { - "decision": "incomplete", - "eligible": false, - "blocking_finding_ids": ["f-1"], - "incomplete_obligation_ids": ["maven:app:cve"] - }, - "exit_code": 3 -} -``` - -`gate_impact` 缺失或非法时拒绝消费报告;`undetermined` 保留发现,并使对应请求未完成。非阻断发现保留在报告中,但本身不产生违规退出码。当前 Rust 领域聚合与四类协议 schema/严格消费边界已实现相关结构判定;原生适配器、批准策略映射、完整报告生成与可信来源核验仍属后续任务,不得把人工构造的字段当作已验证原生证据。 - -结构化 stdout 只能有一个 JSON 文档;进度、下载提示、工具输出写 stderr 或私有日志。`--output` 成功时将相同序列化报告原子写入目标文件,stdout 仍遵守所选格式;写入失败返回 3,保留已有结果。SARIF 转换保留 tool/rule/location,并用运行通知与 invocation 成功状态表达 incomplete,禁止导出零 findings 就隐去未完成;标准 JSON 始终是完整协议。 - -源位置使用仓库相对路径;文件名含非 UTF-8 字节时保留可逆编码标识和展示名,不用有损字符串进行身份比较。多位置、跨文件数据流或依赖发现允许 primary location 缺省,但必须存在包/模块定位。归并只对同工具或经过显式规则映射的等价发现进行,保留原始记录和次数;不同工具不能只按文案去重。 - -## 4. 核心类型、接口与依赖 - -建议技术栈为 clap、Tokio、serde/serde_json、thiserror;Git 初版使用受控 argv 调用已安装 Git 并校验字节协议。依赖版本与 MSRV 在建仓时实测固定到 Cargo.lock,不在设计文档引用浮动 latest 作为构建锁。 - -领域类型放 `codeguard-core/src/model/`,每个主要类型单文件;计划、门禁、策略为纯逻辑。核心协调器通过 ports 请求 I/O。接口设计示意: - -```text -Adapter.descriptor() -> CapabilityDescriptor -Adapter.discover(observations) -> ApplicabilityEvidence -Adapter.resolve(context, policy, toolchain) -> ResolvedCheck -Adapter.plan(resolved_check) -> AdapterPlan -Adapter.parse(raw_artifacts, termination) -> ParsedEvidence -Adapter.verify_coverage(plan, evidence) -> CoverageAssessment -Adapter.plan_fix(finding_set, context) -> FixPlan - -ExecutionPort.run(process_spec, cancellation) -> ToolExecution -SnapshotPort.capture(content_request) -> SnapshotLease -EvidenceStore.persist(raw_evidence) -> EvidenceRef -CachePort.lookup(validated_identity) -> VerifiedCacheEntry | Miss -``` - -这些是逻辑签名,不是待拷贝编译的 Rust stub。Codeguard 自有的观察、编排、解析、策略判定、门禁和新工程验收均以 Rust 实现,不通过 Python 辅助脚本承载新入口逻辑。runtime 做观察和受控执行;P3C、Maven 等外部原生检查器仍运行官方命令,Rust adapter 只解释注入的数据、提出命令,不私下 `spawn`、联网或修改文件。core 根据计划协调任务,CLI 负责依赖注入。MCP 放在 cli 的入口模块,复用同一核心 API;不得通过调用自身命令拼另一套 verdict。 - -## 5. 工具适配器协议 - -每个适配器发布描述包含:adapter ID/version、语言及方言、检查类别、平台/运行时版本范围、所需配置、输入单位、报告格式版本、原生退出语义、缓存前提、修复能力、网络要求和资源锁。 - -稳定 ID 如 `java.p3c`、`java.checkstyle`、`java.javadoc`、`rust.clippy`、`python.ruff`、`typescript.eslint`。Node 工具可复用实现,但 Vue/Svelte/Astro/GraphQL 的 parser/plugin/context 必须分别验证,不能靠同一个 eslint 二进制宣布所有能力可用。 - -优先 JSON/XML/SARIF 等结构化报告。只提供文本的工具必须固定兼容版本、locale、语法及 golden fixtures;解析失败保留原文和未完成状态。禁止通用“包含 error 就失败”或“exit 1 就违规”的策略。比如 ESLint 的退出 1 与退出 2 表达不同类别结果,适配器必须按它的契约解释。[ESLint CLI](https://eslint.org/docs/latest/use/command-line-interface#exit-codes) - -有效 findings 与环境故障可能同时存在:保留已验证 findings,completion=incomplete。工具 exit 0 也必须核对报告、执行义务、被扫描对象与 freshness;有副作用的检查器不得把改写后的通过当作原始内容通过。 - -注册表只登记有证据的能力。`format` 存在但没有只读检查能力时,不能自动算作 lint;有原生 check/diff 模式时需证明无修改且报告可解释。无成熟注释检查器的语言可实现确定性 AST 规则,但需独立 capability/正反例验收;否则明确缺口。 - -## 6. Java 专项 - -Java 是第一条端到端实现线,不代表只支持 Java。适配计划必须区分以下义务: - -| 类别 | 工具/机制候选 | 验证要点 | -|---|---|---| -| 阿里规范 | 官方 P3C PMD 规则实现 | P3C/PMD/JDK 的兼容组合和实际规则加载 | -| 格式与通用规范 | Checkstyle;项目已有格式检查目标 | XML 结构、规则版本、源码级别、只读模式 | -| 注释规范 | Checkstyle Javadoc 规则、Javadoc/doclint | 公共 API 范围、参数返回、继承文档、Lombok/record/生成代码 | -| 安全静态分析 | 项目已接入并经验证的安全分析器,例如 SpotBugs 安全规则或规则扫描器 | 所需字节码、classpath、规则清单与报告完整性 | -| CVE | 经验证的 Maven 依赖扫描适配器 | 解析实际依赖图与版本,漏洞库身份和匹配证据 | -| 构建 | Maven/Gradle 的批准生命周期和目标 | 编译及必要质量任务是否真的执行;测试执行单独声明 | - -官方 P3C 包含 PMD 实现;本仓 Checkstyle XML 不应被重命名或包装成“官方 P3C 已通过”。具体兼容版本在真实样本矩阵中确定。[P3C 官方仓库](https://github.com/alibaba/p3c) - -Java 解析顺序:项目 wrapper 与声明运行时 → effective model/启用 profile → 模块图/源集/依赖 → 已绑定质量任务 → 缺失义务的受控适配计划。读取 effective model 可能执行构建扩展,因此不是纯静态 `plan` 的隐式行为,需进入执行阶段并留证据。 - -当前 Maven Javadoc 多文件局部探针只对无继承、依赖、profile、模块、扩展、其它插件和动态配置的简单 POM 重放原文件,并把原 POM 与显式源码一起复制到私有快照。其它 POM 返回未完成,不能用固定模板 POM 产生项目归属的注释问题。此局部执行仍未证明完整生效模型、生成源码和源集覆盖,不签发项目门禁结果。 - -对于未配置质量工具的项目,返回 `missing` 与具体配置建议;不自动构造或写入 POM/Gradle 质量插件。配置无效返回 `invalid`,无法判定返回 `unknown`。用户或批准策略明确选择启用后再按原生命令运行,不以“缺配置”报告源码违规。`java.commands` 只能提供实际命令,不能以 `echo ok` 满足 P3C。 - -Maven 父子模块、dependencyManagement、profile、toolchains、annotation processor、测试源集和 Gradle 动态脚本都影响结论。静态模型不完整时保守扩大范围;扩大后仍不能证明规则执行,则未完成。已有 Java 影响闭包可迁移,但版本变动不得自动以 validate/help 替代未证明等价的 lint/CVE 义务。 - -## 7. CVE、注释、安全类别 - -CVE 的单位是依赖生态和解析后的组件图,不是源码后缀。Maven/Node/Python/Rust/Go 与通用扫描器按清单能力选择;原生缺失不得偷偷 fallback 成不同覆盖的通过。多个语言共享同一依赖图可以共享证据,但每份义务必须可追溯。 - -漏洞记录保留 CVE/GHSA/OSV 等原标识、别名、包坐标或 purl、版本、传递依赖路径、匹配方式、受影响区间、修复版本、严重度来源和漏洞库时间/摘要。只有模糊 CPE 匹配时,不伪装成精确包证据;待复核项仍可导致完整性不足,不静默丢弃。 - -缺 lockfile 不必一律失败:适配器若能解析并固化实际依赖图可继续,否则未完成。漏洞库过期、网络断开或数据库未验证不能产生安全 PASS;离线只使用满足批准 freshness 的本地库。未知严重度不能映射为 LOW 或删除:若策略无法比较则未完成;批准“所有已知漏洞阻断”时可直接判违规。 - -当前 `check java` 按每份 Java 源码的最近构建根展示 Maven Dependency、OWASP Dependency-Check 与 FindSecBugs 的静态声明状态。静态简单 POM 中已配置的 Maven Dependency Plugin 现可用私有原 POM 副本离线运行原生依赖树,反馈组件和传递边;原生日志即使 `BUILD SUCCESS`,只要有缺 POM 等警告便标未完成。其余 checker 仍未接入原生执行;缺失、跳过、未知或多模块混合配置分别给出原因与下一步。局部依赖图不代表全模块、版本治理、许可证、SBOM、CVE 数据库或安全检查覆盖。 - -注释规则绑定语言语法及 API 范围。规则包应明确是否允许继承文档、接口/实现重复说明、生成代码排除和 test fixture 的专用规则;这些是预先确认的语义,不是扫描失败后的临时豁免。 - -安全分为源代码规则、配置/IaC、敏感内容及入库路径策略。`.env`/`*.pem` 等命中现行禁止入库模式时报告 `repository_policy_violation`,不得仅凭文件名宣称发现私钥;内容扫描的 secret finding 另有规则和脱敏证据。公共证书等例外需要正式策略变更,AI 不可自动放行。 - -## 8. 配置、规则包和工具链锁 - -保留 `codeguard.json` 作为项目入口,通过显式 schema migration 导入新协议。新增 `codeguard.lock.json` 绑定工具、适配器与规则摘要;不读取旧字段后静默丢弃。 - -| 配置平面 | 内容 | 覆盖规则 | -|---|---|---| -| 运行参数 | jobs、终端格式、日志位置、预算 | CLI > 环境变量 > 项目默认;不足只产生未完成 | -| 质量策略 | required、rulepack、severity、源集、批准排除、freshness、测试要求 | 可信组织策略及已批准项目修订;运行参数不可弱化 | -| 工具锁 | 工具版本/摘要、JDK、adapter、rulepack、下载来源 | 按 lock 验证;不使用 latest 自动升级 | -| 项目原生配置 | eslint/ruff/checkstyle 等 | 作为实际规则输入;必须与批准策略要求对齐 | - -当前 Rust `config validate/explain --policy-candidate FILE` 只实现质量策略**候选**的静态协议检查。候选 1.0 固定 `policy_id/revision`、工具锁原始字节摘要、非空必需检测集合、逐项语言/类别/检测族、规则包摘要、具体规则、源集与阻断严重度、CVE 库时效、测试要求;候选源码排除必须是单个仓库相对文件路径、文件字节摘要、结构化原因及有限到期字段。重复义务、通配排除、未知语言和自写 `approved` 被拒绝。精确源码排除与**发现后的误报白名单**是两种不同处置:前者影响扫描范围,后者保留扫描与原始 finding。两者均只能由独立批准策略赋权。 - -此候选协议不包含受保护批准来源;CLI 即使核对了本地工具锁摘要,也固定返回 `candidate_unverified`、`effective_policy=null` 和未完成。它还不能证明原生规则实际启用、排除内容/期限在本轮有效、策略修订在 CI 基线中,或形成冻结义务清单。后续可信策略加载必须从受保护宿主/CI 取得基线身份,拒绝同次 PR 用自身策略文件授权自身变更;不能把 `--policy-candidate` 当成批准开关。 - -`config explain` 显示每一有效值的来源与覆盖原因。原生配置中已有 disable/suppressions 必须列入策略解释和数量/摘要审计;不能把原生配置当作不可审查的隐藏降级入口。PR 同时修改代码与检查配置时,CI 使用可信基线策略评估政策差异;未经批准的新策略不能给本 PR 自行签发通过。 - -规则包目录设计: - -```text -rulepacks/// - manifest.json - rules.json - tool-configs/ - compatibility.json - fixtures/ -``` - -manifest 记录来源、许可、分类、规则严重度、工具兼容约束、内容摘要和变更说明。每个 native rule ID 映射稳定的 Codeguard rule ID;删除、改义或改变默认阻断级别属于可审查规则迁移,不靠扫描时随机选择。 - -默认选择“已存在且匹配锁的项目工具 → 已验证的受管缓存 → 匹配锁的系统工具”;版本不匹配即未完成。安装需要独立 `tools install`,提供下载清单、校验和与安装范围;扫描期间不能用 npx/pip/curl 偷偷安装。可能下载依赖的构建命令须在计划中说明网络模式与锁约束,`--offline` 不得联网;在线模式也不得自动升级规则或工具。 - -`--offline` 是执行约束,不能只转发工具的 offline flag。adapter 声明可验证的离线条件,运行时使用经平台验证的网络禁止环境执行可能联网的 wrapper/扩展;无法保证时在启动前返回 `offline_isolation_unavailable`,不声称已离线。安装沙箱或容器工具仍是独立准备动作,扫描不得隐式安装。验收必须包含会主动联网的真实子进程。 - -## 9. 执行器与资源控制 - -`ProcessSpec` 包含 executable、argv、cwd、受控 env overlay、stdin 模式、deadline、输出预算、资源键、网络策略声明和预期产物。默认 stdin=null;pre-push 输入先由 CLI 读取为结构化请求,不把宿主 stdin 交给扫描器。 - -Rust 并发读取 stdout/stderr,有界缓冲加私有文件记录;超限必须标识不完整。取消或超时需终止受控进程树并 wait/reap;只丢弃 Child 不等于可靠结束进程。当前 Unix 原型使用 `std::process::Command`、非阻塞管道和独立进程组,并提供拒绝 symlink/覆盖的私有原子原始日志接口;证据索引、脱离进程组的子孙进程及 Windows Job Object 尚待实现,不能用原型验收完整进程树控制。[Rust Command 文档](https://doc.rust-lang.org/std/process/struct.Command.html) - -任务 DAG 中相互独立的检查继续收集证据;同一模块构建目录、数据库更新或非并发扫描器通过 resource key 互斥。deadline 是整次请求预算,包含排队/探测/执行/解析/清理;子进程不能各自重置全部预算。 - -检查计划只读源码:准确内容物化到隔离目录,生成产物写独立区域;执行前后检查源码身份,意外变更导致未完成。禁止跟随路径逃逸 symlink;Git symlink/gitlink/LFS 对象按类型记录,无法获得所需真实源码时不当作普通文件通过。日志私有、原子写,证据索引保留摘要与保留期限;MCP/终端不默认输出密钥或原始环境。 - -受保护 CI 的可信协调/验证进程、策略、工具锁和最终状态凭据与被测脚本执行域隔离,采用只读挂载、独立身份或等效平台机制,不把签发凭据传入构建进程。执行区仅可写临时构建输出及待核验产物;可信端重新校验内容、报告来源、执行范围和规则覆盖后生成最终结果。单纯不同目录不能满足这个保证;不具备隔离能力时报告能力限制,不宣传抗任意脚本篡改。该要求不会将普通本地模式虚构成安全沙箱。 - -重试只限可识别的瞬时 I/O 故障,固定次数并保留全部尝试;不重试真实违规以期待随机变绿,不在重试中换规则、目录或工具版本。工具内部编程错误不无限重试。 - -## 10. 内容快照、缓存及增量证明 - -| 入口 | 权威内容 | -|---|---| -| 显式 check | 本次请求冻结的工作树清单和内容,检查后复核身份 | -| Git pre-commit | Git 实际传入环境下的 index,尊重 GIT_INDEX_FILE,包括部分提交 | -| Git pre-push | stdin 各 local ref/OID 与 remote ref/OID,支持多 ref、删除 ref、非 HEAD ref | -| CI | 调用方明示且解析为不可变 OID 的待交付内容;合并结果与分支头不能混用 | -| 宿主 PreToolUse | 有边界的预测内容;不声称等价于完整 Shell 执行 | - -Git 原始路径使用 NUL 协议,校验对象数量、类型、长度、模式和哈希;SHA-1/SHA-256 按仓库对象格式处理。index 冲突、多仓、初始提交、worktree、submodule、删除/重命名以及输入并发变化均有 fixtures。预测失败阻止认证并提示真实 Git 接入或拆分动作,不扫描另一个仓库充数。 - -缓存键至少包含:协议/adapter 版本、工具二进制与运行时、规则包、有效配置、目标内容与完整依赖输入集合、模块图、content_source、任务参数、平台、locale、CVE 库身份和 freshness。字节相同但 source kind/授权上下文不同也不得直接复用交付收据。 - -只缓存完整可验证结果,PASS 和真实违规都可缓存;incomplete/取消/内部故障不提供完成证据。完整缓存记录包含报告摘要和覆盖证明;缓存损坏视为 miss。交付入口不得消费软反馈缓存,可复用满足相同严格身份和可信来源的检查结果,再独立重算交付 gate。本地可写缓存不能作为受保护 CI 的可信外部证据。 - -增量算法先生成全量义务,再为每项选择执行或复用。无依赖隔离证明的 AST/类型/构建检查扩大到模块或项目;改变规则、编译选项、锁文件或父配置使相关闭包失效。不能以“文件未变”证明依赖它的检查结果未变。 - -## 11. 修复协议 - -```mermaid -sequenceDiagram - participant U as 调用方 - participant C as Codeguard - participant F as 原生修复器 - U->>C: fix --dry-run - C-->>U: 精确目标 / 内容身份 / 补丁或计划 / 副作用说明 - U->>C: fix --apply,既有修复授权 - C->>C: 核对目标身份与授权范围 - C->>F: 在隔离副本执行支持的修复 - F-->>C: 退出状态及变化 - C->>C: 校验范围,安全应用,再按相同策略复检 - C-->>U: 执行成功 / 实际变化 / 复检结果分别报告 -``` - -`fixed=true` 需要证明目标变化与该修复有关并完成复检;formatter exit 0 不够。应用 patch 前比较前置内容哈希;并发编辑时停止应用,不能覆盖用户修改。失败有部分变化时保留补丁及真实状态;只回滚自己可证明拥有且未被后续改动的部分。 - -不自动修改 lint 配置、阈值、忽略、测试或基线来修复 finding;CVE 升级引入行为变化时将依赖变更作为独立修复计划,完整复扫和受影响验证后才声明解决。 - -## 12. 插件、MCP 与分发 - -插件 lock 绑定 CLI version、target triple、artifact digest、协议 major、rulepack lock;安装时和运行前验证绑定。原生二进制是统一入口,但 Java/Node/Python 等扫描工具仍需要各自运行时,`doctor` 必须说明。 - -初始发布候选目标:macOS arm64/x86_64、Linux x86_64/aarch64、Windows x86_64;Linux libc/最低系统版本和每工具平台能力在 S10 实测固化。未验证组合不标稳定。下载原子落盘后切换;校验失败不得使用随机 PATH 版本或静默回退 Python,报告未完成。 - -MCP 工具参数映射到相同 CheckRequest,保留旧工具名时通过显式协议适配。宿主 Hook exit=2 可能表示阻断,而新 CLI exit=2 是用法错误,必须按报告语义映射,不透传数字。取消、超时、二进制不可用也要有宿主特定测试。 - -旧通道 `compat legacy-v1` 保持各旧子命令自己的退出协议:常见 check/CVE 为通过0、未验证1、违规2、用法3;混合优先级按旧入口原约定,不把 Dockerfile/CVE/check 的历史差异硬套成一张表。新报告与旧字段同时出现时以明确 protocol 标签解释,保留所有发现。兼容通道不能被新交付 CI 当作等价认证。 - -切换流程:协议与适配器测试 → 真实仓对照 → 显式指定新二进制 → 宿主/CI 按语义接入 → 全语言与平台验收 → 旧入口弃用。回滚只能回到满足相同严格契约的已验证 Rust 版本;若只能运行旧 fail-open 通道,则交付状态保持未认证,不能为恢复可用性伪造通过。 - -## 13. 可观测性与度量 - -每次 run/obligation/task/attempt 使用关联 ID,记录工具耗时、启动/解析/快照耗时、扫描范围、缓存原因、原始退出和未完成原因。日志默认本地,不收集源码遥测;如需远程统计需单独明确采集内容。 - -证据索引同时记录摘要、受管所有权、引用和保留策略;到期清理不删除活动run/lease、仍被保留收据引用的必要证据、用户源码或tracked问题历史。证据缺失不能继续支持当前认证,可通过重新复检恢复。关联追踪、证据存储和评测门槛已分别进入execution-kernel与binary-distribution规格,具体任务见 [实施覆盖索引](../../openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md)。 - -低误报评价至少同时展示:finding precision、漏报率、工具故障误判率、必需义务完成率、被排除/豁免比例、各类别覆盖、p50/p95 耗时及样本数。把规则关闭后 precision 变高视为覆盖退化。指标定义和真实验收见 [coverage-and-acceptance](coverage-and-acceptance.zh-CN.md)。 - -本技术方案没有声称已达到某个误报率或性能增益;这些必须由任务中的固定语料、人工裁定与真实工具运行证明。 - -## 批准签名核验接入 - -局部实现使用 ring 0.17.14 的 Ed25519,精确签载荷原始 UTF-8 文本,不做签后 JSON 重新序列化。签名消息按固定协议域、NUL、精确密钥 ID、NUL、载荷原文组成;载荷及封装 schema 分别为 signed-approval-payload/envelope 1.0。工作区、修订、基线、序号、期限及快照字节摘要都参与签名。普通候选桥接拒绝签名载荷修订与快照内修订不一致,并继续验证候选的精确字节和原生身份。 - -```mermaid -flowchart LR - A[项目误报候选] --> B[独立评审与签发环境] - B --> C[签名载荷与批准快照] - H[受保护宿主:公钥 撤销 时钟 基线 最小序号] --> V[Rust 签名与上下文核验] - C --> V - V --> S[严格快照解析及精确候选绑定] - S -->|替代链| L[逐跳 Git 提交祖先核验] - L -. 尚待接通 .-> G[原生完整性与最终门禁] - S -. 普通批准尚待接通 .-> G - N[本轮原生发现] --> G -``` - -当前签名 API 不加载项目公钥,不提供签发 CLI,也不产生交付结论。宿主的公钥来源、轮换/撤销及最低序号状态尚未接线;测试 seed 不属于发行信任锚。局部多跳入口现逐跳核验签名、快照、工作区、序号和签发/历史审核时间,并继续执行精确替代、撤销、无环与 32 跳限制;不能凭一个当前签名认可未核验的历史摘要。前序代码基线的 Git 祖先关系仍待受保护宿主核验。所有宿主输入仍须来自独立信任边界,同权限本地进程不可宣称不可绕过。 - -局部 Git 联合入口现补齐原生逐跳祖先观察:先完成签名与精确替代绑定,再核对前序基线属于子基线历史;只接受完整同格式提交 ID,拒绝浅历史、缺对象、非提交、噪音或失败报告。禁用 replace/graft、commit-graph 加速和 lazy fetch,各跳共享截止时间与取消标记。原签名 API 单独成功仍不证明祖先关系;宿主还须认证 Git 工具、隔离仓库、可信公钥及本轮原生检查,联合 API 的 BoundToPinnedSnapshot 也不等于交付 allow。 - -## 工具安装缓存发布的当前基础 - -相邻 Rust runtime 已提供 `publish_tool_bytes`:调用方先冻结有界字节和预期 SHA-256;在已有、当前用户拥有且非共享可写的目录中,以固定目录 FD 创建私有暂存,写后核验,原子新增内容寻址文件,再核验最终文件。重复条目必须复核,损坏、链接、FIFO 或权限异常不覆盖;取消/到期/写入失败不返回成功,暂存正常清理。收据只描述缓存发布,不能充当可信锁、发行批准、平台兼容或质量通过。 - -正式 `tools install` 还须先接入批准来源、下载清单、平台/包格式与预览/apply 服务,再调用该基础层。当前不开放未批准候选的 CLI apply。不可中断的文件系统调用及同用户恶意改写不提供强隔离保证;发布后失败可能保留完整制品,后续须重新核验恢复。验收见相邻 tests/acceptance/tool-cache-publication.md。 - - -### HTTPS 发行包传输局部实现 - -相邻 Rust runtime 的 download_verified_package 只接收冻结 URL/大小/摘要及显式重定向 authority,TLS 验证与响应校验后返回有界字节。连接、重定向和包流继承同一绝对期限/取消;不使用环境代理、自动重试或内容解压,不写缓存、不授予发行批准。11 项本地 TLS 及相关回归见相邻 codeguard-cli/tests/acceptance/package-https-transport.md。正式 tools install 尚未调用此入口,可信来源/网络授权、下载至发布编排、运行时安装、恢复和跨平台仍须完成;check/plan/doctor 不会自动联网安装。 - - -### Javadoc 项目检查模式 - -明确提供 Maven 上下文时,项目检查只运行原 POM 多文件探针,避免同项目类型互相引用造成孤立单文件假阻塞。前置/生效范围不确定时保留具体原因,不回退;未选择 Maven 时 JDK 单文件局部观察保持可用。反馈 0.23.0 与 Javadoc 0.3.0 标明 probe_mode,Maven 模式不嵌入单文件诊断。局部观察数不证明完整源集、有效配置或交付通过。验收见相邻 codeguard-cli/tests/acceptance/javadoc-project-mode-selection.md。 - -### Checkstyle 局部 CLI 实施进展 - -相邻 Rust 工程现在提供 `codeguard lint java FILE --checker checkstyle --java-tool PATH --checkstyle-jar PATH --config PATH --format json`,使用显式原配置和私有源码/配置快照调用统一 runtime,反馈原生规则身份、位置与严重度。当前静态注释配置限定已验证内置模块;未知配置/资源保留待解析,不改写为默认规则。JSON 0.1.0 与真实工具局部验收详见相邻 `tests/acceptance/java-checkstyle-cli-local.md`。项目级 check、完整工具/配置/规则范围及任务/白名单/交付接线仍未完成;局部观察不变成普通通过。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/.openspec.yaml b/openspec/changes/introduce-rust-codeguard-cli/.openspec.yaml deleted file mode 100644 index 74e9ae7..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/.openspec.yaml +++ /dev/null @@ -1,3 +0,0 @@ -schema: spec-driven -created: 2026-09-24 -goal: 通过统一 Rust CLI 恢复全语言传统静态工具质量守卫,降低误报且禁止自动降级门禁 diff --git a/openspec/changes/introduce-rust-codeguard-cli/design.md b/openspec/changes/introduce-rust-codeguard-cli/design.md deleted file mode 100644 index 3bf2e76..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/design.md +++ /dev/null @@ -1,85 +0,0 @@ -# Design:统一 Rust Codeguard CLI - -## Context - -动机见 [proposal](proposal.md)。当前运行时是 Bash/Python、57 个语言注册条目、独立技能 vendor 与多宿主 Hook。源码基线 `03ebb24`;现有 OpenSpec 仍描述旧 fail-open、skipGate、基线豁免与旧退出码。本 change 是显式契约升级,不是对旧策略做行为保持的逐行翻译。 - -完整设计见 [架构文档](../../../docs/rust-cli/architecture.zh-CN.md)、[技术方案](../../../docs/rust-cli/technical-design.zh-CN.md);覆盖和指标见 [迁移验收](../../../docs/rust-cli/coverage-and-acceptance.zh-CN.md)。这些文档展开设计,本目录 `specs/` 是规范性事实源,`tasks.md` 是唯一任务状态。 - -## Goals / Non-Goals - -**Goals**:单一二进制与领域内核;独立的执行完整性和违规证据;不可由 AI 自行降级的质量 contract;全语言逐类别覆盖;可测试的工具适配与准确内容身份;渐进替换宿主入口。 - -**Non-Goals**:原设计阶段不建立 Rust 源码仓或发布产物;后续实施阶段以逐任务验收推进,不因四 crate 工程基线存在而宣称发布完成。不重写所有原生分析工具;不采用 LLM 作为最终裁判;不承诺本地同权限环境不可绕过;不把动态 Shell 全解析作为交付正确性的基础。 - -**Rust 与原生工具边界**:用户已明确 Codeguard 自身的检测编排、运行控制、报告解析、策略/门禁及新工程验收均用 Rust;P3C、Maven 等仍执行官方原生命令,Rust 负责受控调用和解释,不重写官方规则。新 CLI 不以 Python 脚本作底层实现;旧 Python 仅在具名 legacy-v1 入口保留到迁移完成。 - -## Decisions - -| 决策 | 选择及理由 | 考虑过的替代 | -|---|---|---| -| D01 workspace | 使用用户确定的四 crate,core 定义 ports,runtime/adapters 单向依赖 core | 单 crate 易混职责;每工具独立 crate 初期增加发布成本 | -| D02 执行权威 | Rust 统一编排,工具提供 finding,受控策略决定 gate | AI 重判缺可复现证据;通用 rc/文本判定丢语义 | -| D03 结果模型 | findings 与 completion 正交,混合结果全部保留 | 单 PASS/FAIL/UNKNOWN 枚举容易吞掉部分真实发现 | -| D04 完整性门禁 | 必需检查未完成不能交付;基线只分类 | fail-open/默认存量豁免延续用户明确否定的方向 | -| D05 覆盖 | 先建立完整义务,再选择执行/缓存;语言 × 类别 × 工具验收 | 按文件后缀或已注册命令计数无法证明能力 | -| D06 工具管理 | 显式 provision、固定锁、兼容组合测试 | 扫描时自动安装 latest 导致不可复现与运行副作用 | -| D07 配置权威 | 运行参数与质量策略分离;CI 使用可信已批准政策 | CLI/env 覆盖一切使智能体可自行关闭门禁 | -| D08 Git | 真正 Git 事件绑定 index/ref;宿主预测有明确边界 | 继续扩充 Shell 模拟仍不能覆盖任意程序间接调用 | -| D09 发布兼容 | 新协议明确版本,旧入口具名兼容且不作为新认证 | 同一个 rc 静默改义会破坏 CI/宿主 | -| D10 初版扩展 | 编译期适配器,版本化数据规则包 | 动态任意脚本插件会扩大信任和测试边界 | -| D11 测试执行 | 保留静态构建默认等级并明确报告,策略要求时执行测试 | 自动替用户将所有 verify 改为跑测试,超出已确认范围 | -| D12 修复工作区 | `./codeguard/` 持久存储脱敏问题、事件与任务,本地日志/缓存 Git 忽略,原工具复检关闭 | 仅终端报错缺少恢复上下文;自由 Markdown 勾选会制造无证据完成 | -| D13 项目初始化 | init 生成带证据的项目画像、分类型模块图和 AGENTS 受管摘要;事实、推断、准备状态与政策分开 | 根据目录猜定 DDD 或直接执行构建来推测配置,容易产生错误约束和未预期副作用 | -| D14 命令应用服务 | 36项入口共用应用服务与证据内核;查询/计划/诊断/状态操作与质量认证分开,命令schema统一生成help和接入矩阵 | 给每条命令复制扫描逻辑,或把所有exit 0解释为项目通过,会引入协议漂移 | -| D15 协作与恢复 | 显式lease token/generation和attempt/action ID,受控fix复用或自行领取租约,运行报告与准备证据幂等导入 | 只用owner字符串、隐式最新attempt或单份最新报告无法可靠处理并发和响应丢失 | -| D16 误报白名单 | 只对经复现、独立批准的精确 finding 作有期限处置;保留原始发现、复检与审计,交付显示 allow_with_exceptions | 广泛路径/规则忽略、agent 自批或把工具故障算误报会掩盖真实问题 | - -完整指令职责、价值、参数、结果类型、预算初始值、状态变化和调用旅程见 [命令架构](../../../docs/rust-cli/command-architecture.zh-CN.md)。预算是实现基线,平台能力和性能仍需实测;命令存在不等于已有原生工具验收。 - -初始化细节见 [项目初始化与 AGENTS.md 接入](../../../docs/rust-cli/project-initialization.zh-CN.md)。不直接改写本插件 AGENTS 来冒充被检查项目画像;实现任务沿 S09 展开,整体验收在 S12。 - -修复工作区详见 [持久修复设计](../../../docs/rust-cli/remediation-workflow.zh-CN.md)。状态、任务和历史帮助执行者推进,但最终 gate 独立检查源码与可信政策;任务记录不能成为新的跳过开关。 - -误报白名单的条目身份、可信审批、失效与门禁转换见 [误报白名单设计](../../../docs/rust-cli/false-positive-allowlist.zh-CN.md)。它是规则处置,不替代原生检测;实现分解到 S02/S04/S09/S12。 - -## Risks / Trade-offs - -- [严格门禁暴露工具环境欠账] → `doctor` 给出具体恢复路径,先完成工具链准备;不能通过 fail-open 消除欠账。 -- [官方 P3C、PMD、JDK 版本兼容] → 固定组合并运行真实样本;不把同名 Checkstyle 配置视为替代。 -- [跨语言 comments/security 能力差异] → 缺口显式记录;可新增确定性规则,不能把缺能力标成不适用。 -- [构建脚本和原生配置可执行/可降级] → 隔离运行、身份核对、可信策略 diff;快照不等于恶意代码沙箱。 -- [全量检查较慢] → 基于等价证明缓存和增量,不改变义务;性能预算以实测设定。 -- [同一 change 涉及未来多个仓] → 当前规格暂驻插件仓;未来 CLI 仓引用此事实源,迁移事实源须独立批准,禁止双写冲突任务。 -- [已有规格很多旧行为要求] → 在 delta 中给旧运行时明确协议范围;迁移后入口受 Rust 契约管辖,并更新宿主协议说明。 - -## Migration Plan - -阶段顺序及当前设计到逐条Requirement/命令/语言/平台/宿主的任务映射见 [实施覆盖索引](implementation-coverage.md)。索引已反向检查每项实施任务的规格依据;任务状态只在tasks.md维护,不以OpenSpec产物齐备作为实现完成。先建立Java真实修复闭环,再补齐全部已承诺能力;第一条闭环通过不能关闭其它语言或宿主任务。 - -```mermaid -flowchart LR - S1[契约和语料 S01-S02] --> S2[运行时与治理 S03-S05] - S2 --> S3[Java及首批工具 S06-S07] - S3 --> S4[全语言补齐 S08] - S3 --> S5[修复与宿主 S10-S11] - S2 --> SW[持久修复工作区 S09] - S4 --> S6[真实验收 S12] - S5 --> S6 - SW --> S6 - S6 --> S7[发布与规格同步 S13] -``` - -对照运行保留旧/新报告与差异原因,不直接将旧结论作为真值。已确认的历史错误行为需要新规范的正反例替代旧期望,其它兼容性用具名 legacy 测试保留。切换后不因 Rust 未完成自动回落旧 Python 放行。 - -回滚以满足相同严格契约的上一 Rust release 为目标;没有这种版本时保持交付未认证,反馈入口可恢复旧工具但不得显示新门禁通过。市场、安装和真实运行证据分层记录。 - -## Open Questions - -以下是实施阶段必须验证的技术参数,不改变上述需求与任务范围:P3C/PMD/JDK 兼容版本;各罕见语言可用的只读诊断工具;平台最低 ABI/MSRV;签名发布身份和新仓远程地址;代表性语料的确切项目清单及脱敏方式;逐工具性能基线。对应任务未完成前,不将候选参数写成发布承诺。 - -## Completion Boundary - -原设计阶段完成标准仅为架构、技术方案、覆盖验收设计、OpenSpec proposal/design/specs/tasks 的一致性和校验。后续实施已开始;完成状态以 `tasks.md` 的代码、测试与实测证据为准。真实工具、宿主和发布验收未完成前不执行 sync/archive。 - -实施前覆盖审计补充:静态查询处理器、事件/游标中断恢复、过期租约恢复顺序、环境任务复检、私有证据保留、关联追踪和分层评测均有明确任务;5个候选平台和3个宿主各有独立验收条目。技术参数未知项绑定任务和所需证据,不能自行假定完成。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md b/openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md deleted file mode 100644 index d4526e1..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/implementation-coverage.md +++ /dev/null @@ -1,324 +0,0 @@ -# 实施覆盖索引与执行顺序 - -状态:覆盖关系基于 2026-09-24 审计,实施状态更新至 2026-09-28。相邻独立 `codeguard-cli/` 已有 Rust 工程、局部原生适配器、CLI 反馈及部分持久任务/原工具复检:包括 Ruff、Clippy、Rustdoc、Rust 构建类型检查和部分 Java/Node 检查。Rustdoc 已接入 `check all` 的独立调度与同步;Rust 构建仅接通公开局部探针和工作台同步,正式复检与完整检查调度仍缺。上述能力不代表所有语言类别、完整项目配置/构建组合、可信策略、正式任务关闭重开或宿主闭环完成;各项证据与限制见 [verification.md](verification.md)。此前源码的全目标 Clippy 与全工作区测试通过(154组/910通过/0失败/93忽略);新增构建接线后只完成受影响验证,尚无当前源码的全工作区终态。此文件是导航和覆盖关系,规范仍在 specs/,唯一勾选状态仍在 [tasks.md](tasks.md)。不能以本索引有行、有映射或 OpenSpec planning complete 证明功能已实现。 - -## 1. 审计结论与补齐范围 - -此前大部分设计已有规格和任务,但 detect/capabilities 仅有汇总注册任务;同步/接管恢复和环境任务复检缺明确故障验收;运行追踪、证据保留和评测门槛尚未充分进入正式规范;平台与宿主验收缺独立条目。现已补齐这些条目,已有清晰任务不重复拆分。 - -本索引覆盖36项命令、全部规格requirement、57个语言条目、5个候选平台、3个宿主,以及技术设计中的横向职责。每个requirement下全部Scenario属于该行验收范围;真正验收时必须提供逐Scenario证据,不能只挑其中一个通过样本。 - -## 2. 分阶段执行与责任边界 - -```mermaid -flowchart LR - A[S01-S02 契约与协议] --> B[S03 执行基础] - A --> C[S04 策略与规则] - B --> D[S05 适配与准备] - C --> D - D --> E[S06 Java / S07 首批生态] - D --> F[S09 工作区与任务] - E --> G[S08 其余语言] - E --> H[S10 修复] - F --> H - H --> I[S11 宿主与平台] - G --> J[S12 全量验收] - I --> J - J --> K[S13 发布与规格收敛] -``` - -| 里程碑 | 输入和可执行范围 | 退出证据 | 责任归属 | -|---|---|---|---| -| M0 契约基线 | S01、S02;在获准仓位建立四crate、schema和统一命令注册 | 协议正反例、依赖方向、命令帮助;只证明契约,不证明扫描器可用 | CLI/core维护者 | -| M1 运行内核 | M0之后S03、S04,再S05 | 进程、快照、政策、工具准备与静态查询;模拟工具和真实工具证据分开 | runtime/core/adapters维护者 | -| M2 第一条真实闭环 | Java S06,加S09已具备的sync/next/attempt/verify、S10修复与必要S11入口 | 真实Java检查→任务→修复→复检→准确内容gate;其它语言不得随之标完成 | adapters与插件接入维护者 | -| M3 能力补齐 | S07/S08逐语言,S09初始化全量场景,S11逐平台/宿主 | 下表每行独立证据,54个旧stable六槽位齐备;3个planned明确gap | 语言、平台与宿主维护者 | -| M4 产品验收 | S12;12.2先冻结oracle/阈值,再12.10计算器、12.11执行独立评测 | 真实工具、分层质量、完整性、故障恢复、性能和端到端证据 | 评测/验收维护者 | -| M5 发布收敛 | 全部实施验收满足后S13,按授权发布 | source/tag/artifact/lock/market/installed/runtime逐层证据,最后sync/archive | 发布维护者 | - -责任是模块职责,不虚构已分配人员。M2是可提前运行的集成切片,不代表整个S09/S11已完成;完整阶段依赖仍以tasks.md为准。CI调度时应使用任务实际前置产物,不能因为同属阶段而提前勾选。 - -Rust实现归未来独立CLI仓;宿主Hooks/commands/runtime lock归当前插件仓;受管技能修改归独立codeguard-skills源仓,经vendor引入。本change暂为三方唯一规格事实源,未批准前不复制成第二套可独立勾选的任务。 - -## 3. Requirement → 实施任务 - -追踪ID只是本索引的稳定引用,完整Requirement标题与spec文件才是规范定位;MODIFIED旧标题保持不变。任务区间包含端点。 - -| 追踪ID | 规格 / Requirement原名 | 实施任务ID | -|---|---|---| -| BD01 | [binary-distribution](specs/binary-distribution/spec.md) / Plugin execution SHALL bind a verified runtime artifact | 11.1,11.2,11.8-11.12 | -| BD02 | [binary-distribution](specs/binary-distribution/spec.md) / Compatibility SHALL be explicit and versioned | 2.6,11.7 | -| BD03 | [binary-distribution](specs/binary-distribution/spec.md) / Release claims SHALL require layered evidence | 11.8-11.15,13.1-13.7 | -| BD04 | [binary-distribution](specs/binary-distribution/spec.md) / Quality claims SHALL use independently labelled stratified evidence | 1.4,12.2-12.4,12.10,12.11 | -| EK01 | [execution-kernel](specs/execution-kernel/spec.md) / Existing entry points SHALL remain compatible | 1.1,1.3,2.6,4.2,11.6,11.7 | -| EK02 | [execution-kernel](specs/execution-kernel/spec.md) / Rust execution SHALL bound and close process lifecycles | 3.1-3.4 | -| EK03 | [execution-kernel](specs/execution-kernel/spec.md) / Rust snapshots SHALL bind the actual delivery input | 3.5-3.7,11.5 | -| EK04 | [execution-kernel](specs/execution-kernel/spec.md) / Rust cache reuse SHALL prove obligation equivalence | 3.8,12.5 | -| EK05 | [execution-kernel](specs/execution-kernel/spec.md) / Rust fixes SHALL preserve ownership and verify outcomes | 10.1-10.5 | -| EK06 | [execution-kernel](specs/execution-kernel/spec.md) / Offline and trusted CI execution SHALL enforce their declared boundaries | 3.11,5.3,11.5,12.5 | -| EK07 | [execution-kernel](specs/execution-kernel/spec.md) / Execution observability SHALL correlate evidence without changing verdicts | 3.9,12.4,12.11 | -| EK08 | [execution-kernel](specs/execution-kernel/spec.md) / Evidence storage SHALL preserve ownership and active references | 3.2,3.10,9.14 | -| HP01 | [hook-protocol](specs/hook-protocol/spec.md) / The cheat-sheet SHALL document fail-open for uncaught exceptions | 2.6,11.4 | -| HP02 | [hook-protocol](specs/hook-protocol/spec.md) / Soft and hard gates SHALL share the skipGate escape and neither may fall back to scanning outside a git repository | 2.6,4.5,11.4,11.5 | -| HP03 | [hook-protocol](specs/hook-protocol/spec.md) / Fail-open uncertainty SHALL be visible | 2.6,11.3-11.5 | -| HP04 | [hook-protocol](specs/hook-protocol/spec.md) / Skip-gate bypass values SHALL be parsed strictly | 2.6,4.5,11.4 | -| HP05 | [hook-protocol](specs/hook-protocol/spec.md) / Migrated host surfaces SHALL share the same report semantics | 11.3-11.6,11.13-11.15,12.6 | -| LG01 | [language-gate-commands](specs/language-gate-commands/spec.md) / Languages may declare a configuration prerequisite | 2.6,5.1,5.2 | -| LG02 | [language-gate-commands](specs/language-gate-commands/spec.md) / Gates in git repositories SHALL default to changed-file scope | 2.6,3.5-3.8,6.6 | -| LG03 | [language-gate-commands](specs/language-gate-commands/spec.md) / A toolchain crash SHALL be recorded as unverified, not as a lint failure | 2.3,5.4,5.5 | -| LG04 | [language-gate-commands](specs/language-gate-commands/spec.md) / Rust command plans SHALL preserve explicit build levels | 6.5,6.6,12.1 | -| NA01 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Adapters SHALL publish verifiable capability contracts | 1.5,5.1,5.5,5.8 | -| NA02 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Native evidence SHALL be interpreted per tool contract | 5.4,5.5 | -| NA08 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Static detection families SHALL remain explicit and extensible | 5.10,6.3,6.8,7.6,8.1-8.148 | -| NA03 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Java checks SHALL prove each required native obligation | 6.1-6.7 | -| NA04 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Comment and security categories SHALL retain their own evidence | 6.3,6.4,7.1-7.4,8.1-8.144 | -| NA05 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / CVE checks SHALL bind actual dependency and database identity | 6.4,7.5 | -| NA06 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Migration SHALL account for every legacy language entry | 1.1,1.5,6.1-6.7,7.1-7.5,8.1-8.148 | -| NA07 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Adapters SHALL separate static observation from executable resolution | 1.3,1.6,5.1,5.7,5.9 | -| PI01 | [project-initialization](specs/project-initialization/spec.md) / Initialization SHALL build an evidence bound project profile | 9.15-9.17 | -| PI02 | [project-initialization](specs/project-initialization/spec.md) / Architecture observations SHALL not become unapproved rules | 9.19 | -| PI03 | [project-initialization](specs/project-initialization/spec.md) / Module graphs SHALL preserve relation types and uncertainty | 9.18 | -| PI04 | [project-initialization](specs/project-initialization/spec.md) / AGENTS generation SHALL preserve scope and human ownership | 9.20,9.21 | -| PI05 | [project-initialization](specs/project-initialization/spec.md) / Init SHALL plan and apply without hidden execution | 9.1,9.22,9.24 | -| PI06 | [project-initialization](specs/project-initialization/spec.md) / Profile refresh SHALL preserve findings and detect stale inputs | 9.16,9.23 | -| PI07 | [project-initialization](specs/project-initialization/spec.md) / Initialization status SHALL be separate from quality readiness | 9.24,9.25,12.8 | -| RW01 | [remediation-workflow](specs/remediation-workflow/spec.md) / Projects SHALL have an explicitly initialized remediation workspace | 9.1,9.2 | -| RW02 | [remediation-workflow](specs/remediation-workflow/spec.md) / Findings and environment blockers SHALL produce distinct actionable tasks | 9.3,9.4,9.6 | -| RW03 | [remediation-workflow](specs/remediation-workflow/spec.md) / Closing a task SHALL require verified resolution evidence | 9.10,9.11,9.28,10.3,10.5 | -| RW04 | [remediation-workflow](specs/remediation-workflow/spec.md) / Repair briefs SHALL guide bounded progress without changing authority | 9.7,9.9,9.26 | -| RW05 | [remediation-workflow](specs/remediation-workflow/spec.md) / Enabled plugin workflows SHALL connect scans to actionable briefs | 9.13,11.13-11.15,12.7 | -| RW08 | [remediation-workflow](specs/remediation-workflow/spec.md) / Check results SHALL be returned in the agent conversation | 5.10,9.13,11.16,12.7 | -| RW06 | [remediation-workflow](specs/remediation-workflow/spec.md) / Workflow persistence SHALL preserve collaboration and gate independence | 9.5,9.8,9.14,9.27 | -| RW07 | [remediation-workflow](specs/remediation-workflow/spec.md) / Repair command handoffs SHALL bind attempts and leases explicitly | 9.9,9.12,9.27,10.5 | -| RG01 | [rulepack-governance](specs/rulepack-governance/spec.md) / Quality policy SHALL be independent from operational options | 4.1,4.2,4.7 | -| RG02 | [rulepack-governance](specs/rulepack-governance/spec.md) / Rulepacks and toolchains SHALL be versioned and locked | 4.3,5.2,5.3 | -| RG03 | [rulepack-governance](specs/rulepack-governance/spec.md) / Historical findings SHALL remain findings | 4.4 | -| RG04 | [rulepack-governance](specs/rulepack-governance/spec.md) / Exceptions SHALL require independently verifiable authority | 4.5,9.11,12.5 | -| RG05 | [rulepack-governance](specs/rulepack-governance/spec.md) / Existing dot-prefix scope SHALL remain explicit | 4.6 | -| RG06 | [rulepack-governance](specs/rulepack-governance/spec.md) / False-positive allowlists SHALL be exact, authorized dispositions | 4.5,4.8,4.9,4.10,9.28,12.12 | -| SS01 | [scan-scope-policy](specs/scan-scope-policy/spec.md) / Managed remediation artifacts SHALL have a bounded self-scan policy | 4.6,9.2,9.14 | -| UC01 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Unified commands SHALL select explicit check obligations | 2.1,2.4 | -| UC02 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Rust CLI SHALL expose a versioned exit contract | 2.3 | -| UC03 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Reports SHALL preserve semantics across public formats | 2.2,2.5,2.10,12.12 | -| UC04 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Empty selection SHALL NOT certify delivery | 2.4 | -| UC05 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Public commands SHALL have distinct operation contracts | 1.2,1.6,2.7,4.9,5.7,5.8,12.9 | -| UC06 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Operation success SHALL remain separate from quality certification | 2.2,2.3,2.7,2.10,4.9,9.26,11.3 | -| UC07 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Preparation commands SHALL preserve observation and mutation boundaries | 4.7,5.2,5.6-5.8 | -| UC08 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Tool installation SHALL use a bounded explicit plan and apply | 5.3,5.6 | -| UC09 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Gate commands SHALL receive explicit delivery content | 3.6,11.5 | -| UC10 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Execution budgets SHALL have explicit defaults and a shared deadline | 2.8,3.1-3.4 | -| UC11 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Report export SHALL preserve identity and persistence failures | 2.2,2.5,2.9 | -| VI01 | [verdict-integrity](specs/verdict-integrity/spec.md) / Verdicts SHALL preserve uncertainty across interfaces | 2.3,2.6,11.4 | -| VI02 | [verdict-integrity](specs/verdict-integrity/spec.md) / Required completeness SHALL gate Rust delivery | 2.4,2.10,4.8,12.1,12.5,12.12 | -| VI03 | [verdict-integrity](specs/verdict-integrity/spec.md) / Coverage SHALL not change with scheduling strategy | 3.4,3.8,6.6,12.4 | - -## 4. 36项命令 → 规格与任务 - -每行除列出的专项验收,还执行12.9统一参数/格式/退出码/副作用/取消矩阵。检查入口连接共同CheckService,不能把“命令可解析”当作原生适配器已经完成。 - -| ID | 命令 | 规格追踪ID | 实施任务ID | 专项验收 | -|---|---|---|---|---| -| C01 | `help / --help` | UC05 | 2.7 | 无项目仍返回帮助,不扫描或安装 | -| C02 | `--version` | UC05,BD01 | 1.2,2.7 | 嵌入元数据和实际runtime绑定可核对 | -| C03 | `detect` | UC07,NA07 | 5.7 | 完整unknown为0,必要输入不可读为3,不写画像 | -| C04 | `capabilities` | UC05,UC07,NA01 | 1.5,5.8 | planned/未知ID/坏注册表分别解释 | -| C05 | `init` | PI01,PI02,PI03,PI04,PI05,PI06,PI07,RW01 | 9.1,9.15-9.25,12.8 | 静态预览、受管应用、冲突恢复、准备状态分离 | -| C06 | `plan` | UC01,NA07 | 2.1,3.4,5.9 | 义务/DAG/未解析项可见,不执行动态脚本 | -| C07 | `doctor` | UC07 | 5.2,5.6 | 制品匹配不代替运行条件,报告可同步 | -| C08 | `rules list/whitelist list/explain/propose` | RG01,RG02,RG06,UC07 | 4.3,4.7-4.10 | 规则与白名单候选/批准/失配及撤销修订链可追溯,propose不自批 | -| C09 | `config validate` | RG01,UC07 | 4.2,4.7 | 坏配置与未批准弱化为未完成 | -| C10 | `config explain` | RG01,UC07 | 4.1,4.7 | 来源/覆盖/拒绝原因可见且脱敏 | -| C11 | `tools list` | UC07 | 5.6 | 静态库存可含缺工具,不宣称已验证 | -| C12 | `tools verify` | RG02,UC07 | 5.2,5.6 | 摘要与锁不符不回退随机PATH | -| C13 | `tools install` | UC08,RG02 | 5.3,5.6 | 默认预览,显式应用可恢复,无静默安装 | -| C14 | `lint` | UC01,NA01,NA02,NA03 | 2.1,5.1,6.2 | 编码规则真实执行;其它语言见第5节逐行任务 | -| C15 | `comments` | NA04 | 2.1,5.1,6.3 | formatter不代替文档契约;其它语言见第5节 | -| C16 | `cve` | NA05 | 2.1,6.4,7.5 | 真实依赖/库身份/UNKNOWN保留;其它语言见第5节 | -| C17 | `security` | NA04,RG05,SS01 | 2.1,4.6,6.4,9.2 | 源码/配置/入库策略证据分离;其它语言见第5节 | -| C18 | `build` | LG04,NA03 | 2.1,6.5,6.6 | 构建等级/测试执行与规则覆盖分离;其它语言见第5节 | -| C19 | `check` | UC01,UC02,UC04,VI02,VI03 | 2.3,2.4,3.4,6.7 | 全义务聚合,部分成功不代表项目allow | -| C20 | `gate pre-commit` | UC09,EK03 | 3.5-3.7,11.5 | 实际index/alternate index/部分暂存 | -| C21 | `gate pre-push` | UC09,EK03 | 3.6,11.5 | remote/stdin/非HEAD/多ref,缺输入不回退 | -| C22 | `gate ci` | UC09,EK06 | 3.11,11.5,12.5 | 不可变OID与可信验证端隔离 | -| C23 | `work sync` | RW02 | 9.3,9.4,9.6 | 全部报告、单份失败、事件/游标中断恢复 | -| C24 | `status` | RW04,UC06 | 9.7,9.26 | 历史结果freshness与当前状态分离 | -| C25 | `next` | RW04 | 9.7,9.26 | 五种disposition,空待办不等于allow | -| C26 | `task show` | RW04,RW06 | 9.5,9.7 | 事件证据与人工勾选分离,坏ID/坏链可见 | -| C27 | `task claim` | RW06 | 9.8,9.27 | 到期接管先abandoned/预算,失败不授新租约 | -| C28 | `task heartbeat` | RW06 | 9.8,9.27 | 旧token不能复活,续租不重置预算 | -| C29 | `task release` | RW06 | 9.8,9.27 | 不释放新租约,未结束尝试不得遗弃 | -| C30 | `task attempt start` | RW04,RW07 | 9.9,9.27 | 受控动作/输入指纹,换名不重置预算 | -| C31 | `task attempt finish` | RW04,RW07 | 9.9,9.27 | 显式attempt,幂等结束,失败/noop也计数 | -| C32 | `fix` | EK05,RW07 | 9.12,10.1-10.5 | 预览不消耗尝试、应用保所有权、同策略复检 | -| C33 | `task verify` | RW03,RW06 | 9.10,9.11,10.5 | 环境恢复后重跑原义务,自有/借用租约区分 | -| C34 | `mcp serve` | UC06,HP05 | 11.3,11.13-11.15 | 请求失败和服务存活分离,共用核心API | -| C35 | `compat legacy-v1` | BD02,EK01 | 2.6,11.7 | 逐旧入口映射,不生成新认证 | -| C36 | `dependencies` | UC01,NA08 | 2.1,5.10,6.8,7.6 | 探测依赖检查配置,运行已配置工具并反馈结果,与 CVE 分开 | - -## 5. 全语言迁移 → 实施任务 - -统一满足NA01/NA04/NA05/NA06;每个旧stable都有lint/comments/dependencies/cve/security/build六槽位,缺口不得静默当not_applicable。下表只定位任务,具体候选工具与差异见语言迁移文档。planned保留缺口是已确认范围,不把它当成新实现已完成。 - -| language ID | 基线状态 | 实施任务ID | 验收要求 | -|---|---|---|---| -| java | stable | 6.1-6.7 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| rust | stable | 7.1 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| typescript | stable | 7.3 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| python | stable | 7.2 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| go | stable | 8.1,8.2,8.3 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| csharp | stable | 8.4,8.5,8.6 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| kotlin | stable | 8.7,8.8,8.9 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| swift | stable | 8.10,8.11,8.12 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| php | stable | 8.13,8.14,8.15 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| ruby | stable | 8.16,8.17,8.18 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| scala | stable | 8.19,8.20,8.21 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| shell | stable | 7.4 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| dockerfile | stable | 7.4 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| yaml | stable | 8.70,8.71,8.72 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| elixir | stable | 8.22,8.23,8.24 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| css | stable | 8.46,8.47,8.48 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| c | stable | 8.25,8.26,8.27 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| cpp | stable | 8.28,8.29,8.30 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| objc | stable | 8.31,8.32,8.33 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| dart | stable | 8.34,8.35,8.36 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| vue | stable | 8.37,8.38,8.39 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| svelte | stable | 8.40,8.41,8.42 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| astro | stable | 8.43,8.44,8.45 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| solidity | stable | 8.55,8.56,8.57 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| terraform | stable | 8.58,8.59,8.60 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| nix | stable | 8.61,8.62,8.63 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| html | stable | 8.49,8.50,8.51 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| sql | stable | 8.64,8.65,8.66 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| graphql | stable | 8.52,8.53,8.54 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| protobuf | stable | 8.67,8.68,8.69 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| markdown | stable | 8.73,8.74,8.75 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| toml | stable | 8.76,8.77,8.78 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| haskell | stable | 8.79,8.80,8.81 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| ocaml | stable | 8.82,8.83,8.84 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| fsharp | stable | 8.85,8.86,8.87 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| perl | stable | 8.88,8.89,8.90 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| groovy | stable | 8.91,8.92,8.93 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| clojure | stable | 8.94,8.95,8.96 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| powershell | stable | 8.97,8.98,8.99 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| zig | stable | 8.100,8.101,8.102 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| nim | stable | 8.103,8.104,8.105 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| crystal | stable | 8.106,8.107,8.108 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| julia | stable | 8.109,8.110,8.111 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| elm | stable | 8.112,8.113,8.114 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| lua | stable | 8.115,8.116,8.117 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| luau | stable | 8.118,8.119,8.120 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| pascal | stable | 8.121,8.122,8.123 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| r | stable | 8.124,8.125,8.126 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| cfml | stable | 8.127,8.128,8.129 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| cobol | planned | 8.145 | planned/gap清晰,项目必需时未完成,不能空实现充数 | -| vbnet | stable | 8.130,8.131,8.132 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| erlang | stable | 8.133,8.134,8.135 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| arkts | planned | 8.146 | planned/gap清晰,项目必需时未完成,不能空实现充数 | -| metal | planned | 8.147 | planned/gap清晰,项目必需时未完成,不能空实现充数 | -| liquid | stable | 8.136,8.137,8.138 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| cuda | stable | 8.139,8.140,8.141 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | -| ansible | stable | 8.142,8.143,8.144 | 六槽位适用性+真实工具正反例+F01–F26适用场景 | - -## 6. 平台与宿主 → 独立证据 - -| 目标 | 规格追踪ID | 实施任务ID | 验收边界 | -|---|---|---|---| -| macOS arm64 | BD01,BD03,EK02,EK06,EK08 | 11.8 | 目标平台真实执行、进程回收、私有存储、离线能力 | -| macOS x86_64 | BD01,BD03,EK02,EK06,EK08 | 11.9 | 不用arm64或交叉编译替代 | -| Linux x86_64 | BD01,BD03,EK02,EK06,EK08 | 11.10 | 固定libc/最低系统/运行环境 | -| Linux aarch64 | BD01,BD03,EK02,EK06,EK08 | 11.11 | 本架构运行,不借x86证据 | -| Windows x86_64 | BD01,BD03,EK02,EK08 | 11.12 | Job Object/路径/权限/文件共享/取消;离线能力实测,不能保证则明确gap | -| Codex | HP05,BD03,RW05 | 11.13 | 安装身份+真实CLI/MCP/保存/Git与修复链 | -| ZCode | HP05,BD03,RW05 | 11.14 | 宿主协议与阻断能力,不透传新CLI数字 | -| Kimi | HP05,BD03,RW05 | 11.15 | 实际调用与失败恢复,不以别的宿主替代 | - -## 7. 横向设计覆盖 - -| 设计范围 | 规格追踪ID | 任务定位 | -|---|---|---| -| 四crate与应用服务/ports、外部技能所有权 | EK01,NA07,UC05 | 1.1–1.6、11.6 | -| 参数、输出类型、退出码、格式与原子导出 | UC01–UC11,VI01,VI02 | 2.1–2.10、5.7–5.8 | -| 项目画像、架构推断、AGENTS受管合并、刷新 | PI01–PI07 | 9.15–9.25 | -| 策略/规则/配置/工具锁/例外/基线 | RG01–RG06 | 4.1–4.9、5.2–5.3、9.28、12.12 | -| 静态观察与动态解析、原生专用报告、共享扫描 | NA01–NA07 | 5.1–5.9、6/7/8各语言任务 | -| 进程生命周期、DAG、预算、网络与可信CI | EK02,EK06,UC10 | 3.1–3.4、3.11、11.5、12.5 | -| Git真实输入、内容身份、缓存等价与覆盖 | EK03,EK04,VI03 | 3.5–3.8、6.6、11.5 | -| 持久目录、隐私、自扫描与证据保留 | EK08,RW01,RW06,SS01 | 3.10、9.1–9.2、9.14 | -| 问题/阻塞归并、事件与投影、同步事务 | RW02,RW03,RW06 | 9.3–9.6、9.10–9.11、9.28 | -| RepairBrief、租约、尝试、无进展与失租恢复 | RW04,RW06,RW07 | 9.7–9.9、9.12、9.26–9.27 | -| 原生修复、补丁所有权、部分失败与复检 | EK05,RW07 | 10.1–10.5 | -| 插件自动scan→sync→brief、MCP/Hook映射 | HP01–HP05,RW05 | 9.13、11.3–11.6、11.13–11.15 | -| 制品绑定、显式legacy、迁移与回滚 | BD01–BD03 | 11.1–11.2、11.7–11.12、13.3–13.5 | -| 本地关联追踪、故障归因、隐私及无默认上传 | EK07,EK08 | 3.9–3.10、12.4、12.11 | -| 分层oracle、holdout、统计门槛、性能等价 | BD04 | 1.4、12.2–12.4、12.10–12.11 | -| 完整交付/语言平台证据及规范收敛 | BD03,NA06 | 12.1–12.11、13.1–13.7 | - -## 8. 实施时待确定参数及关闭责任 - -这些不是遗漏任务,也不是已验证事实;必须在列出的任务取得证据,不能用待定作为跳过义务的理由。 - -| 待确定项 | 关闭任务 | 所需证据 | -|---|---|---| -| CLI独立仓位置、远程地址、MSRV和依赖锁 | 1.2、11.1、13.4 | 用户授权的仓位/发布身份与可复现构建 | -| 官方P3C/PMD/JDK精确兼容组合 | 6.2 | 固定版本与真实正反例 | -| 罕见语言工具、方言和不适用依据 | 8.1–8.148 | 每语言六槽位实际证据,未解决保持gap | -| 平台ABI/libc/最低系统、签名与网络隔离能力 | 11.1、11.8–11.12 | 各目标平台真实运行与能力报告 | -| 精确MCP工具schema和宿主事件映射 | 11.3–11.5、11.13–11.15 | 实际协议与三宿主验收 | -| 语料项目、oracle裁定和绝对性能预算 | 1.4、12.2、12.4、12.10–12.11 | 分层独立样本、冻结阈值及同覆盖基线 | - -## 9. 覆盖审计口径 - -静态审计必须检查:每个Requirement恰有一行;每个task至少被一个Requirement关联;35个命令、57个语言、5个平台、3个宿主均可定位;所有任务引用存在;阶段依赖无循环,验收输入和实施产物分开。语义覆盖另由设计逐项对照和独立读者审查,不能用编号数量代替。 - -当前所有实现任务保持未勾选。索引通过只能声称“当前已确认设计已拆分并可追踪”,不能声称二进制、低误报指标、平台或宿主已可用。后续若新增设计,必须同轮更新规格、tasks与本索引。 - - -## 2026-09-27 新增规格的任务映射补齐 - -以下补齐当前增量规格的追踪,不创建第二套任务、不改变验收标准。每行覆盖该Requirement下全部Scenario;任务ID已与现有tasks核对。部分Rust契约或原生用例通过不代表所列完整任务完成,状态仍以tasks为准。 - -| 追踪ID | 规格 / Requirement原名 | 实施任务ID | -|---|---|---| -| BD05 | [binary-distribution](specs/binary-distribution/spec.md) / Network installation SHALL verify signed selection and exact host permission before downloading | 5.3,11.2,12.5,13.4 | -| BD06 | [binary-distribution](specs/binary-distribution/spec.md) / Signed package publication SHALL bind source, content, clock and original locator | 11.1,11.2,12.5,13.4 | -| BD07 | [binary-distribution](specs/binary-distribution/spec.md) / Distribution signatures SHALL bind original manifest and lock bytes under independent host constraints | 11.1,11.2,12.5,13.4 | -| BD08 | [binary-distribution](specs/binary-distribution/spec.md) / Package HTTPS transport SHALL preserve frozen bytes under the shared budget | 3.2,3.3,11.2,12.5 | -| BD09 | [binary-distribution](specs/binary-distribution/spec.md) / Downloaded archives SHALL bind the complete tree before publication | 11.1,11.2,12.5,13.4 | -| BD10 | [binary-distribution](specs/binary-distribution/spec.md) / Archive bundle roots SHALL be projected explicitly without discarding other members | 11.1,11.2,12.5,13.4 | -| BD11 | [binary-distribution](specs/binary-distribution/spec.md) / Bundle directories SHALL publish without exposing partial trees or replacing existing content | 11.1,11.2,12.5,13.4 | -| EK09 | [execution-kernel](specs/execution-kernel/spec.md) / Static input inspection SHALL reject special files without waiting for peers | 3.2,3.5,3.7,5.2,12.5 | -| EK10 | [execution-kernel](specs/execution-kernel/spec.md) / Managed artifact publication SHALL preserve identity and ownership | 3.7,3.10,11.2,12.5 | -| EK11 | [execution-kernel](specs/execution-kernel/spec.md) / Distribution package streams SHALL be bounded and verified before extraction | 3.2,3.7,11.2,12.5 | -| EK12 | [execution-kernel](specs/execution-kernel/spec.md) / Archive expansion SHALL validate all members before publication | 3.2,3.7,11.2,12.5 | -| EK13 | [execution-kernel](specs/execution-kernel/spec.md) / Complete archive trees SHALL bind all bundle contents | 3.2,3.7,11.2,12.5 | -| NT01 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Explicit Maven Javadoc selection SHALL not fall back to isolated single-file diagnostics | 5.10,6.3,12.1,12.3 | -| NT02 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Checkstyle XML interpretation SHALL preserve native identity and distinguish processing failures | 5.10,6.3,12.1,12.3 | -| NT03 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Checkstyle repair feedback SHALL bind native sources to original configuration | 5.10,6.3,12.1,12.3 | -| NT04 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Field Javadoc checking SHALL use the native configured Checkstyle rule | 5.10,6.3,12.1,12.3 | -| NT05 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Official Checkstyle module names SHALL preserve native checker identity | 5.10,6.3,12.1,12.3 | -| NT06 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Missing method Javadoc configuration SHALL remain native and context-bound | 5.10,6.3,12.1,12.3 | -| NT07 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Method tag configuration SHALL preserve native option semantics | 5.10,6.3,12.1,12.3 | -| NT08 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Type documentation options SHALL retain their original checker context | 5.10,6.3,12.1,12.3 | -| NT09 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint JSON reports SHALL separate rule findings from incomplete execution and suppression | 5.10,7.3,12.1 | -| NT10 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint native command planning SHALL use explicit literal inputs | 3.1,7.3,12.1 | -| NT11 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint controlled execution SHALL bind version and current inputs | 3.2,3.7,7.3,12.1 | -| NT12 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint configuration discovery SHALL distinguish candidates from effective configuration | 5.10,7.3,12.1 | -| NT13 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / npm native audit observation SHALL retain protocol and coverage boundaries | 5.10,7.3,7.5,12.1 | -| NT14 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / ESLint task recheck SHALL observe the original effective rule | 7.3,9.7,12.7 | -| NT15 | [native-tool-adapters](specs/native-tool-adapters/spec.md) / Public ESLint local feedback SHALL retain uncertainty and explicit context | 7.3,9.13,11.16,12.9 | -| RW09 | [remediation-workflow](specs/remediation-workflow/spec.md) / npm remediation tasks SHALL recheck through their original native audit service | 7.3,9.7,9.13,12.7 | -| RW10 | [remediation-workflow](specs/remediation-workflow/spec.md) / npm child projects SHALL preserve explicit workspace ownership | 7.3,9.14,9.15,12.7 | -| RW11 | [remediation-workflow](specs/remediation-workflow/spec.md) / Local doctor observations SHALL enter the remediation queue without granting readiness | 5.2,9.3,9.24,9.25,12.7 | -| RW12 | [remediation-workflow](specs/remediation-workflow/spec.md) / Explicit Checkstyle workspace observations SHALL generate stable local repair tasks | 6.3,9.3,9.4,9.13,12.7 | -| RW13 | [remediation-workflow](specs/remediation-workflow/spec.md) / Checkstyle task verification SHALL replay the original native checker without automatic closure | 6.3,9.7,9.13,12.7 | -| RW14 | [remediation-workflow](specs/remediation-workflow/spec.md) / Checkstyle preparation failures SHALL create stable environment tasks | 6.3,9.3,9.24,12.7 | -| RW15 | [remediation-workflow](specs/remediation-workflow/spec.md) / Checkstyle preparation verification SHALL preserve the original blocked obligation | 6.3,9.7,9.13,12.7 | -| RW16 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint task identity SHALL bind native rule and stable source anchor | 7.3,9.3,9.14,12.7 | -| RW17 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint local observations SHALL feed stable repair records | 7.3,9.3,9.4,9.13,12.7 | -| RW18 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint incomplete prerequisites SHALL create investigation tasks | 7.3,9.3,9.24,12.7 | -| RW19 | [remediation-workflow](specs/remediation-workflow/spec.md) / ESLint task verification SHALL retain native observations | 7.3,9.7,9.13,12.7 | -| RW20 | [remediation-workflow](specs/remediation-workflow/spec.md) / npm local audit observations SHALL enter persistent coverage repair tasks | 7.3,9.3,9.4,9.13,12.7 | -| UC12 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / check all SHALL orchestrate npm roots through the shared native runtime | 2.3,3.4,7.3,7.5,9.13,12.9 | -| UC13 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / Install previews SHALL distinguish bound layout declarations from verified package contents | 2.7,11.2,12.9 | -| UC14 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / npm public CVE feedback SHALL preserve local observation boundaries | 2.5,7.3,7.5,11.16,12.9 | -| UC15 | [unified-cli-contract](specs/unified-cli-contract/spec.md) / npm public audit SHALL consume shared runtime timeout defaults | 2.8,3.2,7.3,12.9 | diff --git a/openspec/changes/introduce-rust-codeguard-cli/proposal.md b/openspec/changes/introduce-rust-codeguard-cli/proposal.md deleted file mode 100644 index ca2a882..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/proposal.md +++ /dev/null @@ -1,49 +0,0 @@ -# Proposal:统一 Rust Codeguard CLI - -## Why - -Codeguard 的目标是调用传统静态工具,完成多语言代码规范、注释规范、依赖漏洞、安全和构建质量检查。当前实现把工具故障、基线豁免和宿主放行混在交付路径中,智能体容易通过降低检查要求消除报错;需要统一执行与证据契约,恢复“准确检查、完整交付”的产品边界。 - -项目侧以**识别实际检查配置 → 调用已配置的原生工具 → 将结果反馈到智能体对话**为主流程。检测族目录只提供发现线索,不要求每个项目证明所有候选检查都执行过;未配置与运行失败分别给出配置或环境恢复建议。 - -## What Changes - -- 建立独立 Rust workspace `codeguard-cli/`,四个 crate 分别负责入口、领域契约、执行基础设施、工具适配;发布可执行文件 `codeguard`。 -- 提供 `lint/comments/dependencies/cve/security/build/check `,CLI、MCP、Git 与宿主入口复用同一检查内核。 -- 固化完整命令目录:发现准备、配置与工具管理、准确内容门禁、持久修复和协议入口;逐项定义输入输出、副作用、操作退出语义、执行预算和下一步,避免查询/安装成功被当成质量通过。 -- **BREAKING**:新 CLI 协议采用 0 通过、1 违规、2 用法错误、3 未完成、4 内部故障、130 取消;旧协议通过显式兼容入口保留,禁止根据数字猜测状态。 -- **BREAKING**:迁移后的交付门禁要求必需检查全部完成;工具故障不认定为代码违规,也不再允许被当作交付通过。 -- **BREAKING**:新流程不接受智能体自行设置 skipGate、降低阈值、增加 suppression 或使用存量基线豁免;基线仅分类问题。 -- 用版本化 rulepack、工具链锁、结构化报告、检查覆盖账本和真实样本评测降低误报;保留全部真实发现与不确定性。 -- 将运行关联追踪、私有证据保留和分层评测门槛纳入正式规格;建立逐需求/命令/语言/平台/宿主的实施覆盖索引,明确尚需实测的参数及关闭任务。 -- 在项目内初始化 `./codeguard/`,将脱敏问题、环境阻塞、修复任务和复检事件持久化;原始报告与缓存由目录内 .gitignore 忽略,通过 next/task verify 指导智能体闭环修复。 -- init 识别项目边界、语言/版本、构建器、架构证据与模块依赖,形成结构化画像和检查准备任务,在被检查项目 AGENTS.md 安全维护受管摘要。 -- 迁移当前注册表全部 57 个条目,逐项验收 54 个 stable 的实际能力,保留 3 个 planned 的真实状态;禁止用少数语言演示代替全量迁移。 -- 保留项目既有点前缀忽略及入库安全、配置发现例外;各检查类别明确适用条件和能力缺口。 - -## Capabilities - -### New Capabilities - -- `unified-cli-contract`:统一命令、选择范围、版本化报告、CLI/MCP 协议。 -- `native-tool-adapters`:工具适配、类别覆盖、Java 原生工具链和全语言迁移。 -- `rulepack-governance`:规则版本、可信策略、禁止自动弱化、例外和基线治理。 -- `binary-distribution`:二进制与插件版本绑定、兼容迁移、发布验收。 -- `remediation-workflow`:持久问题和待办、修复简报、任务租约、真实复检关闭与重开。 -- `project-initialization`:项目画像、架构证据与模块图、AGENTS 受管摘要、幂等刷新及准备状态。 - -### Modified Capabilities - -- `verdict-integrity`:新增 Rust 双维结果和完整性交付门禁;明确旧入口的协议边界。 -- `execution-kernel`:新增 Rust crate 边界、进程生命周期、准确缓存与快照约束;显式隔离旧实现兼容要求。 -- `language-gate-commands`:区分旧流程与新 CLI 的前置条件、范围及工具故障语义。 -- `hook-protocol`:限定旧 fail-open/skipGate 契约,规定迁移后交付入口的阻断和宿主映射。 -- `scan-scope-policy`:为受管 Codeguard 产物添加精确自扫描边界,用户源码和入库安全不受影响。 - -## Impact - -未来代码归属:`codeguard-cli` 持有 Rust 内核、适配器、规则和协议;本插件持有宿主入口、运行时版本绑定;`codeguard-skills` 持有技能事实源。现有 `skills.lock.json` 管理边界不变。 - -设计阶段仅交付规格与执行任务;后续实施已在相邻独立工作目录 `../codeguard-cli/` 建立 Rust 四 crate 工程基线,尚未建立远程源码仓、修改 Python 运行行为、升级安装或发布。正式规格以本 change 的 `specs/` 为准;实现完成前不 sync/archive。旧 OpenSpec change 的宿主副本治理另行保留,不并入或伪称已完成。 - -相关说明:[架构文档](../../../docs/rust-cli/architecture.zh-CN.md)、[技术方案](../../../docs/rust-cli/technical-design.zh-CN.md)、[语言迁移与验收](../../../docs/rust-cli/coverage-and-acceptance.zh-CN.md)。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md deleted file mode 100644 index 6090662..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/binary-distribution/spec.md +++ /dev/null @@ -1,199 +0,0 @@ -## Purpose - -定义统一 Rust 二进制与宿主插件的制品绑定、兼容入口、迁移和发布证据,使源码、发布版本、实际安装和运行能力能够分别验证,避免未验证回退产生假通过。 - -## ADDED Requirements - -### Requirement: Network installation SHALL verify signed selection and exact host permission before downloading - -签名网络安装编排 MUST 在任何下载请求前核验原签名/清单/锁、独立宿主范围/时钟/最低序号、本机平台及精确工具,并要求完整定位清单。宿主网络许可 MUST 为有界规范主机:端口集合,包含初始站点,禁止通配、环境代理推导或项目自批;重定向仅沿同一明确许可范围,传输 MUST 复用受控 runtime 的 TLS/字节/预算契约。签名/目标/平台/许可失配 MUST 在请求前拒绝且不写缓存。 - -下载后的制品发布 MUST 复用签名包发布编排,重新核验下载前固定范围和时间、包/完整树及原锁定位,沿用绝对期限/取消,不执行包内入口。只有完成的制品收据可返回;网络成功或测试签名不得替代真实宿主信任来源、运行时齐备、原生可运行性或质量门禁。真实网络测试 MUST 单独明确站点/固定内容,使用测试信任密钥时不得声称真实发行批准。 - -#### Scenario: A site is missing from the independent host grant -- **WHEN** 签名与精确目标相符,但初始下载 authority 不在宿主许可中或许可含通配 -- **THEN** 返回固定未批准/范围无效诊断,不发起下载请求,不写缓存 - -#### Scenario: A public HTTPS fixture traverses the complete service -- **WHEN** 明确授权测试站点及固定提交内容,以专属测试密钥绑定声明调用网络编排 -- **THEN** 生产 TLS 客户端核验精确字节并按原锁发布临时缓存,不执行制品;该证据不升级为真实发行信任根或宿主验收 - - -### Requirement: Signed package publication SHALL bind source, content, clock and original locator - -明确调用的离线包发布编排 MUST 在文件系统写入前验证发行签名和原清单/锁、选择精确工具及本机平台,仅使用具有完整定位协议的清单。raw MUST 使用精确长度/摘要/原锁定位关联,归档 MUST 关联完整树和可选 bundle,再调用受控发布层重新核验内容及文件系统。编排 MUST NOT 重写工具锁、下载网络资源或执行包内入口;制品收据不得证明运行时齐备、原生可运行性或质量通过。 - -签名和受保护时钟 MUST 在内容核验前、发布前及发布后核对,时钟不得早于初始固定上下文或本轮前次观察;取消和绝对期限共享全部阶段。签名/目标/包/期限失配或发布前取消 MUST NOT 写入制品。发布后时钟/期限/预算失败可能保留完整内容,但 MUST 返回失败,重试仅在重新核验来源/内容/文件系统后复用;不得删除既有损坏目标或回退旧清单猜测定位。宿主信任/撤销/防回滚真实性及网络安装许可仍须独立建立,项目 JSON 不能自行授予权限。 - -#### Scenario: A signed raw or archive package is published at the original lock locator -- **WHEN** 明确调用编排,独立宿主输入下签名有效、原始包/布局相符且缓存安全 -- **THEN** 发布入口与原工具锁精确相同;重复调用重新核验后复用,不执行制品或声称完整工具准备 - -#### Scenario: The final clock becomes unavailable after publication -- **WHEN** 完整制品已发布但最终时钟不可核验 -- **THEN** 不返回成功,完整内容可保留;后续新调用必须重新验证全部绑定和时间后才能复用 - -#### Scenario: Existing published bytes are tampered -- **WHEN** 同一内容寻址目标已存在但字节损坏 -- **THEN** 返回失败并保留损坏目标,不覆盖或删除它来制造安装成功 - - -### Requirement: Distribution signatures SHALL bind original manifest and lock bytes under independent host constraints - -发行来源绑定 MUST 使用独立 `codeguard.distribution.v1` Ed25519 协议域,签名覆盖精确密钥 ID 与原始 release_json UTF-8 文本,不复用白名单批准域或签后重序列化载荷。版本化封装/载荷 MUST 拒绝未知及重复字段,限制输入长度。载荷 MUST 固定发行者、通道、平台、递增序号、签发/失效时间、原始清单及锁字节 SHA-256。 - -可信公钥、其发行者/期限/撤销状态,以及预期通道/平台、可信时钟、最低序号和最长有效期 MUST 由受保护宿主独立提供,不从被检查项目或同次候选变更自证。核验 MUST 拒绝范围失配、过期/未来签发、撤销、回滚与缺时钟;核验后仍 MUST 严格解析清单、绑定全部制品至同一原锁,并要求所选平台确实存在。只读结果 MUST NOT 可由 JSON 构造或直接声明安装/网络/质量权威;签名相符仅证明在给定宿主输入下的字节/范围绑定,正式执行仍须验证真实宿主来源、网络授权、最终时钟/撤销及安装计划。 - -#### Scenario: A valid release signature binds exact manifest bytes -- **WHEN** 宿主范围及有效密钥下签名相符,原清单/锁摘要精确一致且全部制品绑定成功 -- **THEN** 返回只读清单/锁摘要、平台、序号与期限,不联网安装或授予门禁权威 - -#### Scenario: Another protocol or changed bytes are replayed -- **WHEN** 提供白名单域签名,或已签 release_json、清单、锁字节被修改 -- **THEN** 签名或精确字节绑定拒绝,即使 JSON 的业务内容看似相同 - -#### Scenario: A signed manifest disagrees with the locked artifact -- **WHEN** 清单摘要/签名相符但制品身份与原工具锁不同,或所选平台无制品 -- **THEN** 拒绝来源绑定,不以签名替代严格制品核验 - - -### Requirement: Package HTTPS transport SHALL preserve frozen bytes under the shared budget - -已授权调用方使用的包下载运行时 MUST 核对冻结 URL、非零摘要与 1..128 MiB 长度,验证 TLS,不采用环境代理、自动重试或内容解压。初始 URL MUST 为无凭据、查询或片段的 HTTPS;重定向 MUST 手动检查,最多五跳,禁止降级或凭据,跨 authority 仅允许显式规范 host:port 集合。重定向查询可承载 CDN 签名,但 MUST NOT 在反馈中输出原 URL、查询或底层错误。下载 MUST 继承原绝对截止时刻和取消信号,在等待连接、响应和读取期间响应取消,不得逐跳重置预算。 - -最终响应 MUST 为 200,仅接受未编码或 identity 内容;传输编码只允许单个 chunked,不得与 Content-Length 混用。声明长度及实际解码框架后的包长度、SHA-256 MUST 与冻结输入精确一致;超长最多多读一个字节,截断、编码歧义、超时、取消或失配不得返回半成品。成功值只证明字节传输,不授予发行来源、安装、准备或门禁权威,也不写缓存。生产入口不得提供禁用 TLS 或由项目指定信任根的选项。 - -#### Scenario: A valid TLS stream returns the frozen package -- **WHEN** TLS 验证成功且响应为固定长度、chunked 或关闭分隔的精确声明字节 -- **THEN** 返回经过长度/摘要核验的有界包;不写文件、不授予来源或安装权威 - -#### Scenario: A transport coding changes byte semantics -- **WHEN** 响应声明 gzip 内容或 gzip, chunked 传输编码、坏长度、截断或错误摘要 -- **THEN** 返回固定诊断,不向后续展开或发布返回字节 - -#### Scenario: An unapproved redirect or cancellation occurs -- **WHEN** 发生跨未批准 authority、HTTP 降级、凭据、歧义 Location 或共享预算取消/到期 -- **THEN** 不继续目标请求或返回成功,不重置预算,也不回显敏感原 URL - - -### Requirement: Downloaded archives SHALL bind the complete tree before publication - -完整归档下载入口 MUST 在发请求前核对下载与展开声明使用同一包 SHA-256,并拒绝未知格式、非法入口、零摘要、无效展开上限或非法完整树摘要。下载、展开、入口及完整树核验 MUST 使用同一绝对期限/取消,不得把网络成功直接当作可发布树。返回结果 MUST 保留所有普通成员及空目录;后续发布 MUST 重新核对树摘要和文件系统,不授予发行来源/运行时/安装权限。raw 下载亦只能在精确包摘要相符后提交独立发布层。测试 CA MUST 只用于局部测试,不能成为生产默认信任。 - -#### Scenario: HTTPS carries a complete ZIP or tar.gz package -- **WHEN** 包、入口与完整树声明均相符,后续调用方明确使用私有临时缓存 -- **THEN** 普通文件、入口和空目录完整保留,独立发布后磁盘内容相符;没有发行批准或原生工具执行结论 - -#### Scenario: The package hash is consistent but the declared tree differs -- **WHEN** 下载成功而展开树与完整声明摘要不一致 -- **THEN** 返回树摘要失配,不返回可发布的局部成功 - -#### Scenario: Download and archive declarations disagree -- **WHEN** 展开声明的包摘要不同或入口/格式/预算/完整摘要无效 -- **THEN** 请求前拒绝,不发送网络请求也不写缓存 - -### Requirement: Archive bundle roots SHALL be projected explicitly without discarding other members - -归档安装 MUST 在选择子目录前验证完整归档树。bundle 根 MUST 是显式声明的规范目录;空根仅表示明确选择整树,不得根据包名或首个目录猜测。投影 MUST 按完整目录边界去除前缀,保留选中空目录,并按既有 bundle 树协议核对预期摘要。未消费成员 MUST 保留原路径与内容供安装计划单独处理,不得无声丢弃。非法根、失配、取消或预算耗尽 MUST NOT 返回成功。内容匹配 MUST NOT 自行授予来源批准、工具准备或安装完成状态;正式落盘仍须核验文件系统与制品身份。 - -发行清单 1.1 MUST 在声明 bundle 树摘要时显式提供 `bundle_archive_root`,无 bundle 时不得声明映射,raw 包不得携带映射。1.0 清单 MUST 保持可读,但不能凭旧声明猜测 bundle 根。内容关联 MUST 绑定清单原字节与同一锁原字节、精确工具/平台、包大小/摘要、入口摘要和 bundle 摘要;关联成功仅证明内容,不授予下载、安装或可信来源权威。 - -发行清单 1.2 的归档制品 MUST 声明完整 `install_tree_sha256`,覆盖入口、bundle 及其余普通成员,raw 包不得声明完整树。内容寻址安装目录 MUST 为 `.bundle`;锁入口 MUST 精确为该目录加归档入口,锁 bundle 根 MUST 精确为该目录加显式包内根,空包内根指向安装目录自身。绑定 MUST 拒绝路径不一致而非重写锁。完整布局 MUST 保留原包相对路径、空目录和所有普通成员,并分别核验完整安装树和可选 bundle 子树;不存在 bundle 时仍核验完整树。旧清单缺少完整安装树声明时不得猜测或自动升级为安装计划。 - -清单 1.2 的 raw 制品 MUST 将锁入口精确绑定为 `.bin`;即使来源引用摘要相符,非规范入口也必须拒绝,不得重写锁或发布到另一名字。raw 内容关联 MUST 核对同一原清单/锁、精确工具/平台、包长度及分块二进制摘要,采用共享期限/取消信号,不返回半成品。借用结果 MUST 保持输入不可变且不复制制品内容;诊断不得转储原始字节。旧清单可观察,但不能据此自动推导新版 raw 安装定位。内容相符和本机版本观察 MUST NOT 授予发行批准或质量门禁权威。 - -#### Scenario: A raw reference hash matches an incorrect lock path -- **WHEN** 清单来源引用摘要与锁一致,但锁入口不是对应二进制摘要的 `.bin` 文件 -- **THEN** 新版绑定返回 raw 定位失配,预览不推进到包内容核验或安装,不重写锁 - -#### Scenario: Frozen raw content is verified and published locally -- **WHEN** 明确新版定位、包长度/摘要相符,底层发布层被已授权调用方使用 -- **THEN** 发布返回的相对入口与原锁一致,原锁可重新核验;借用字节不复制,不从内容匹配或原生版本观察推导批准/门禁通过 - -#### Scenario: A wrapper depends on files outside the selected bundle -- **WHEN** 入口位于包内 `release/bin/tool`,bundle 为 `release/libexec`,另有其它普通成员 -- **THEN** 完整安装布局保留全部原相对路径,入口和 bundle 锁路径指向同一完整树内容寻址目录;实际发布后用原锁核验入口和 bundle,不修改锁或声称原生可运行 - -#### Scenario: Content outside the bundle changes -- **WHEN** bundle 子树摘要不变,但其它成员使完整安装树与声明不同 -- **THEN** 完整布局关联失败,不以 bundle 相符为依据发布剩余内容 - -#### Scenario: Similar sibling directories exist in a package -- **WHEN** 显式选择 `release/libexec`,包内另有 `release/libexec-other` 和外部启动器 -- **THEN** 仅去除 `release/libexec/` 的精确前缀,其它成员以原路径和内容返回;投影目录摘要与对应实际目录摘要一致 - -#### Scenario: An invalid member lies outside the selected root -- **WHEN** 选中的子树合法,但原树其它成员含非法路径或冲突 -- **THEN** 完整树核验失败,不得通过过滤该成员获得成功投影 - -#### Scenario: The requested root is missing or has a wrong identity -- **WHEN** 根目录不存在、指向文件、大小写不一致,或选中树与预期摘要不匹配 -- **THEN** 拒绝映射,不回退整包或另一个目录,也不发布局部制品 - -#### Scenario: A legacy manifest declares a bundle without a root -- **WHEN** 1.0 清单可以绑定锁,但没有包内目录映射 -- **THEN** 只读观察仍可读取,bundle 内容关联返回缺少映射,不猜测目录或启动安装 - -#### Scenario: Package identity disagrees with the bound declaration -- **WHEN** 包大小/摘要、入口或选择目录与同一绑定声明不一致 -- **THEN** 不返回成功 bundle,保持来源未批准和安装未完成状态 - -### Requirement: Bundle directories SHALL publish without exposing partial trees or replacing existing content - -完整目录发布 MUST 先验证输入树及预期 bundle 摘要,在已固定的受管缓存目录描述符下独占创建私有暂存,按规范成员构建文件/目录,拒绝链接及特殊类型并核验所有权、权限、硬链接、完整成员集合和字节内容。文件及目录 MUST 同步后才使用原生不覆盖的原子目录重命名;平台不支持该操作时 MUST 返回未完成,不得降级为可覆盖 rename。最终目录 MUST 重新核验才返回相对内容寻址收据。重复安装 MUST 重新核验后复用;已存在但内容、成员或权限不同的目录 MUST 保留且拒绝,不得替换。 - -取消及预算 MUST 在构建和核验期间检查;发布前失败 MUST 清理本次已创建成员,清理不得跟随链接或删除被替换的目录。进程崩溃或外部篡改导致的未清理暂存 MUST NOT 充当已安装制品。发布后同步/核验/预算失败可能留下完整目录,MUST NOT 返回安装成功,后续重试须重新核验。此收据 MUST NOT 授予来源批准、原生可运行性或其它未消费成员的安装完成状态。 - -#### Scenario: Two installers race to publish the same tree -- **WHEN** 两个进程同时发布同一内容寻址目录 -- **THEN** 只有一个新目录发布成功,另一方完整核验后复用;最终名字不暴露半成品,也不覆盖目录 - -#### Scenario: Existing content is tampered or linked -- **WHEN** 已存在目录含篡改文件、额外/缺失成员、链接、FIFO、错误权限或硬链接 -- **THEN** 拒绝复用并保留原目录,不覆盖为新制品 - -#### Scenario: Cancellation occurs after staging begins -- **WHEN** 本轮暂存目录已存在但还未原子发布时取消 -- **THEN** 不返回成功,清理本次成员;最终内容寻址名字不出现 - -### Requirement: Plugin execution SHALL bind a verified runtime artifact - -插件 MUST 绑定 CLI 版本、平台、制品摘要及协议版本;不匹配或不可用时 MUST 报未完成,不得随机使用 PATH 版本或自动回退旧 Python 产生通过。doctor MUST 明示原生扫描器的 JDK/Node/Python 等外部依赖。 - -#### Scenario: Runtime checksum is invalid -- **WHEN** 安装二进制摘要不符合插件锁 -- **THEN** 拒绝将其作为可信检查器,交付未完成 - -### Requirement: Compatibility SHALL be explicit and versioned - -旧 CLI/MCP/Hook 兼容 MUST 具名并按旧入口分别映射协议;禁止透传新退出码或隐式改变旧语义。新交付门禁 MUST 不接受 legacy-v1 的 fail-open 结果作为新认证。兼容移除 MUST 有发布迁移说明。 - -#### Scenario: Legacy caller expects findings to exit two -- **WHEN** 旧调用经 legacy-v1 接入 -- **THEN** 使用该旧入口的退出约定,同时不声称已满足新门禁 - -### Requirement: Release claims SHALL require layered evidence - -stable 发布 MUST 分别提供真实工具、平台、Git/CI、宿主安装与运行验收;不以编译、mock 测试、tag 或市场清单替代。全语言完成声明 MUST 满足语言迁移要求。回滚 MUST 不降低已确认的交付契约。 - -#### Scenario: Release artifact exists but host cannot run it -- **WHEN** GitHub release 有二进制但某宿主无法启动 -- **THEN** 该宿主验收保持未完成,不宣称已交付 - -#### Scenario: Only a legacy fail-open rollback is available -- **WHEN** 新运行时故障且没有符合新契约的旧 Rust 版本 -- **THEN** 交付保持未认证,不能以旧放行行为恢复绿色门禁 - -### Requirement: Quality claims SHALL use independently labelled stratified evidence - -评测 MUST 使用有来源/摘要/工具锁的分层语料和独立holdout,由人工或已确认oracle裁定;争议单列,不用模型投票充当真值。MUST 报告每语言/类别的样本量、TP/FP/FN、precision/recall、区间、工具故障误判率、完整率、假通过数及同覆盖性能。零发现的precision MUST 不可估计,不能记100%;排除扩大或义务删除不能当作误报改善。 - -设计中的发布验收目标 MUST 固化到批准评测配置:确定性必备场景零假通过/零工具故障误判,预置真问题全检出,关键安全/CVE回归零漏报,有足够裁定样本的adapter/category其precision的95% Wilson下界至少0.98。证据不足不得借全局平均升级为充分验证;调整目标需独立批准。性能绝对门槛在实测基线后冻结,不凭Rust技术选择宣称已达成。 - -#### Scenario: Evaluation returns no findings or too few labels -- **WHEN** 某类别没有finding或统计证据不足 -- **THEN** 展示不可估计/证据不足,不报告100%准确率或借其它类别平均值宣布充分验证 - -#### Scenario: Excluding files improves an apparent precision score -- **WHEN** 优化后排除范围扩大或必需义务减少 -- **THEN** 覆盖差异可见且不能据此通过等价优化验收,原批准门槛保持 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md deleted file mode 100644 index fb83730..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/execution-kernel/spec.md +++ /dev/null @@ -1,159 +0,0 @@ -## MODIFIED Requirements - -### Requirement: Existing entry points SHALL remain compatible - -显式 legacy-v1 兼容入口 MUST 保留原 CLI 子命令、四个 MCP 工具、五类 Hook 路径/JSON/退出约定及旧 Python 导入接口,除非另有弃用发布。用户配置 MUST 经显式转换,语言注册与外部受管技能所有权不变。 - -本规范中原有 Python 模块路径、顺序遇错终止、软缓存不供硬门禁、基线豁免、Java 轻量版本检查、fail-open 和旧退出码要求 MUST 限于 legacy-v1。Rust 新入口 MUST 遵守本 change 的统一义务、缓存证明、基线仅分类、独立任务继续及严格交付契约。其余原始证据、字节校验、内容身份、隐私与不修改用户 index 等正确性要求 MUST 延续。执行内核不得导入宿主 SDK。 - -#### Scenario: Legacy script invocation -- **WHEN** 旧 manifest 从原路径执行兼容脚本 -- **THEN** 使用显式旧协议,不静默改写数字语义,也不能签发新交付认证 - -#### Scenario: Rust execution encounters an independent failed task -- **WHEN** 一个任务失败且其它任务不依赖它 -- **THEN** 仍收集其它任务证据,失败依赖项保留未完成,不继承旧顺序短路作为全批通过依据 - -## ADDED Requirements - -### Requirement: Static input inspection SHALL reject special files without waiting for peers - -配置、工具锁、发行清单及其它静态协议输入 MUST 在同一已打开文件句柄上确认普通文件类型与大小边界,不得以可读路径或文件名证明输入有效。Unix 打开 MUST 拒绝目标符号链接并采用非阻塞模式,FIFO 无写入端时不得在类型判断之前无限等待;类型或大小无效返回未完成诊断,不执行输入、不修改源码或签发准备成功。此机制 MUST NOT 被描述为任意文件系统调用的硬超时保证,其它平台必须独立验收同等约束。 - -#### Scenario: A manifest or lock path points to a FIFO without a writer -- **WHEN** 静态工具库存/安装预览读取的输入是无写入端 FIFO -- **THEN** 不等待写入端,拒绝特殊文件并反馈 unreadable/未完成;不写入工作区、不将其计为源码违规或工具就绪 - -### Requirement: Rust execution SHALL bound and close process lifecycles - -执行 MUST 使用字面 argv、明确 cwd/env/stdin、总预算及有界输出,记录真实终止原因。超时/取消/超限 MUST 停止并回收受控进程树,保留部分证据;同一构建目录的冲突任务 MUST 互斥。工具规则解释 MUST 不属于通用进程执行层。 - -#### Scenario: Child process outlives its parent -- **WHEN** 工具创建子孙进程后发生取消 -- **THEN** 在声明的平台保证内终止并回收整棵受控进程树,不能仅丢弃句柄 - -#### Scenario: Clean child exits before reader threads are scheduled -- **WHEN** 原生工具成功退出且 stdout/stderr 已关闭,但并行负载推迟了读线程调度 -- **THEN** 在请求剩余总期限内继续排空并取得真实 EOF;不得因固定短排空窗口把完整结果误判为读取失败,超过总期限仍返回未完成 - -### Requirement: Rust snapshots SHALL bind the actual delivery input - -真实 pre-commit MUST 尊重 GIT_INDEX_FILE;pre-push MUST 读取每条 ref/OID 元组,不能假定 HEAD;CI MUST 绑定明确不可变内容。字节完整性、类型、哈希、路径和执行前后身份 MUST 校验。快照失败或源内容被检查器修改 MUST 未完成,不改真实 index;宿主预测 MUST 不冒充完整 Shell 语义。 - -#### Scenario: Push targets a non HEAD ref -- **WHEN** 用户推送的 local OID 与当前 HEAD 不同 -- **THEN** 检查实际 local OID 及指定推送范围,不能用 HEAD 通过替代 - -#### Scenario: Partial commit uses an alternate index -- **WHEN** Git hook 环境含 GIT_INDEX_FILE -- **THEN** 检查该 index,保留真实工作树及 index 内容 - -### Requirement: Managed artifact publication SHALL preserve identity and ownership - -受管工具安装的缓存发布 MUST 与质量结果缓存分开。安装字节须有上限并核对预期 SHA-256,缓存根须归当前用户且不可被其它用户写入;使用固定目录描述符和不覆盖的原子发布,拒绝缓存根/目标链接、损坏或权限不符的已有制品。取消、到期或校验失败不得发布未完成文件;正常退出清理暂存,重复相同字节只能在再次核验后复用。缓存写入收据只说明字节发布,不证明锁/发行来源批准、平台兼容、可启动或质量通过;CLI 安装仍须独立核验批准来源。 - -#### Scenario: Another file already occupies the content-addressed tool destination -- **WHEN** 安装发布目标已存在但内容、文件类型、所有权或权限不匹配 -- **THEN** 保留原目标,安装未完成并给出冲突;不得覆盖或跟随链接,也不能用文件名中的摘要自证完整 - -### Requirement: Distribution package streams SHALL be bounded and verified before extraction - -发行包读取 MUST 绑定预期非零 SHA-256、精确传输大小和共享截止时间,传输长度上限为 128 MiB;超出声明长度最多探测一个字节即拒绝。读取中断重试 MUST 继承剩余预算,取消、期限、短流、长流、摘要失配、分配或传输失败 MUST NOT 返回可展开/发布的成功字节。传输诊断 MUST 脱敏。读取器每次读取前后 MUST 核对截止时间和取消;实际网络层 MUST 独立实施单次连接/读取超时,不能以流层预算检查声称可中断任意阻塞读取。验证只证明包字节与输入声明匹配,MUST NOT 自授发行来源批准、平台就绪或门禁通过。 - -#### Scenario: Stream exceeds or differs from the declared package -- **WHEN** 包字节短缺、超长、摘要失配或读取失败 -- **THEN** 返回固定未完成诊断,不向展开/发布阶段交付成功字节;无穷流不能按声明长度之外继续累积内存 - -#### Scenario: Cancellation or deadline changes during a package read -- **WHEN** 单次 read 返回时已经取消或超过共享截止时间 -- **THEN** 拒绝本次字节,不重置预算、不返回校验成功;网络读取超时义务仍由传输层完成 - -### Requirement: Archive expansion SHALL validate all members before publication - -ZIP/tar.gz 展开 MUST 先核对包摘要,绑定明确入口及其二进制摘要,并核验包内所有成员,不得只检查入口而忽略其它路径。路径穿越、绝对/平台歧义路径、重复及大小写碰撞、文件/目录与祖先冲突、链接/设备/特殊类型 MUST 拒绝。普通文件展开总量不得超过请求预算及 512 MiB,全包成员最多 10000;压缩容器及头信息亦须有独立有界预算。损坏压缩数据、CRC、隐藏尾随数据、缺入口、错摘要、取消或到期 MUST NOT 返回局部成功。展开结果只是冻结文件集合,MUST NOT 自授发行批准、bundle 校验、安装或准备通过;落盘仍须受管发布层重新核验路径归属和权限。未实现的扩展、压缩算法或归档类型 MUST 明确未完成,不静默跳过。 - -#### Scenario: Valid entrypoint coexists with a dangerous archive member -- **WHEN** 入口及其摘要正确,但其它成员路径穿越、重复、为链接/设备或发生文件目录冲突 -- **THEN** 拒绝整个展开结果,不向发布层交付部分成功文件,不生成源码违规 - -GNU 长路径与局部 PAX MUST 作为下一条普通文件/目录的有界扩展处理,消费后清空;GNU 数据最多 1025 字节并有明确 NUL 终止,单条 PAX 数据最多 64 KiB,记录长度必须精确且全部消费。重复键、重复局部扩展、矛盾路径、孤立扩展和 malformed 记录 MUST 拒绝。生效路径仍须遵守所有原路径约束;完整扩展路径可覆盖被截断的旧头字节,不得将旧头 UTF-8 断裂误判为有效路径非法。局部 PAX size MUST 控制真实文件数据边界并参与总量/溢出检查,不得一律要求与旧头相等或按旧头推进。权限、所有者、时间及 xattr 描述字段 MUST NOT 从归档恢复;未实现的全局路径/大小、linkpath、sparse 或字符集变换须明确未完成。 - -#### Scenario: Local extension changes the effective path or size -- **WHEN** 合法 GNU/PAX 给下一文件提供完整路径或 PAX size 与旧头不同 -- **THEN** 使用经验证的生效路径及大小,按生效大小核对内容和后续块边界;下一文件不沿用局部扩展,原摘要、路径、类型及资源检查不降低 - -#### Scenario: Extension is malformed, ambiguous or orphaned -- **WHEN** 路径穿越、重复键、矛盾扩展、大小溢出/超限、长度错误或扩展无后续成员 -- **THEN** 返回固定未完成诊断,无局部成功或文件写入;不从后续文件或旧头猜测缺失的扩展语义 - -#### Scenario: Archive fails integrity, resource or format validation -- **WHEN** ZIP/gzip 数据损坏、展开超限、入口缺失/摘要错误、附加隐藏数据或未支持的扩展存在 -- **THEN** 返回固定脱敏未完成原因,不写工作区;取消和期限沿用包读取/发布的同一剩余预算 - -### Requirement: Complete archive trees SHALL bind all bundle contents - -完整归档树 MUST 保留显式空目录及所有隐式父目录,文件集合与完整树入口 MUST 明确区分;旧文件集合消费者不得被静默改成新返回类型。完整树使用现有本机 `codeguard-bundle-tree-v1` 的目录/文件记录、路径长度、内容大小/摘要及本机排序/目录遍历顺序核验,不得以入口匹配或文件总数代替 bundle 内容身份。公开结构被外部构造或改写后 MUST 重新校验路径、父目录、类型/大小写冲突、总量和预期非零精确摘要;最多 100000 树条目、512 MiB 总文件字节和 128 MiB 单文件。摘要计算 MUST 继承共享截止时间/取消并检查内容块。匹配只证明声明树内容,不得授予发行来源、目录发布、完整依赖闭包、准备或质量通过。 - -#### Scenario: An empty directory or delegated library differs from the locked bundle -- **WHEN** 入口字节相同,但归档中空目录被删除或委托库被修改 -- **THEN** 完整树摘要不匹配,包不能按该 bundle 身份进入正式发布;保留具体未完成原因,不生成源码违规 - -#### Scenario: A caller provides a forged or incomplete in-memory tree -- **WHEN** 树含穿越/重复/大小写冲突、缺父目录、超限或无效预期摘要 -- **THEN** 拒绝树核验,不按路径文本推断条目已验证;取消和到期无成功摘要或批准 - -### Requirement: Rust cache reuse SHALL prove obligation equivalence - -缓存 MUST 绑定内容、依赖闭包、工具/运行时、adapter、规则、配置、平台、来源和 CVE 库身份/时效。只有完整有效结果可复用;硬门禁不得直接消费软反馈缓存,必须核验严格身份和可信来源并重算 gate。缺少依赖隔离证明 MUST 扩大扫描或未完成。 - -#### Scenario: Configuration changes with identical size and time -- **WHEN** 配置等长替换且 mtime 未变 -- **THEN** 缓存不命中,不能按元数据复用旧 PASS - -### Requirement: Rust fixes SHALL preserve ownership and verify outcomes - -fix MUST 区分 dry-run 与 apply,检查目标身份及范围;应用前置条件不符 MUST 不覆盖用户编辑。执行成功、观察到变化、复检确认修复 MUST 分开报告。修复 MUST NOT 自动降低规则、阈值、忽略或修改测试期待以消除违规。 - -#### Scenario: User edits during fix planning -- **WHEN** 修复计划生成后原文件发生变化 -- **THEN** 不覆盖用户内容,重新规划或报告未完成 - -#### Scenario: Formatter succeeds without changes -- **WHEN** 原生 formatter exit 0 且内容未变 -- **THEN** 只声明执行成功,不声称 fixed=true - -### Requirement: Offline and trusted CI execution SHALL enforce their declared boundaries - -离线执行 MUST 在可验证的不联网条件下运行,包括被调工具的子进程;无法提供条件时 MUST 在执行前报告未完成。可信 CI 的策略、工具锁、验证器和状态签发凭据 MUST 与被测脚本执行区隔离;项目产物 MUST 经可信端核验,不得让项目脚本直接签发或篡改认证。普通快照目录 MUST NOT 被宣传为满足该隔离。 - -#### Scenario: Wrapper attempts network access in offline mode -- **WHEN** 被调 wrapper 主动发起网络访问 -- **THEN** 声明支持的离线环境阻止访问;无法保证的平台拒绝开始并报告能力不足 - -#### Scenario: Project script tries to rewrite policy or receipts -- **WHEN** 被测项目脚本尝试改写可信策略、工具或最终状态 -- **THEN** 受保护执行边界拒绝写入,脚本生成的收据不能直接作为 gate 认证 - -### Requirement: Execution observability SHALL correlate evidence without changing verdicts - -执行链 MUST 关联request/run/obligation/task/attempt ID,记录快照、启动、执行、解析、缓存及总耗时、终止原因、缓存理由和完整性。原始argv/env/诊断 MUST 仅进入受控私有证据,公开轨迹脱敏。默认遥测 MUST 留在本地,不自动上传源码、凭据或诊断。度量采集不可把incomplete改成PASS,日志/证据写入故障须独立呈现。 - -#### Scenario: A failed execution has partial useful evidence -- **WHEN** 原生工具在产出finding后超时 -- **THEN** 从run和obligation可追溯已保留证据与真实终止原因,公开轨迹不泄漏原始敏感参数 - -#### Scenario: Metrics storage is unavailable -- **WHEN** 指标存储失败但原检查已形成结论 -- **THEN** 保留原质量结论并明确观测故障;必要证据无法保存时报告操作未完成,不伪造检查成功 - -### Requirement: Evidence storage SHALL preserve ownership and active references - -日志、报告、快照与缓存 MUST 使用精确受管路径、适合平台的私有权限与原子写入,拒绝symlink路径逃逸。证据索引 MUST 记录摘要、保留策略和有效引用;清理 MUST 不删除用户源码、tracked问题历史、活动run/lease或仍被保留收据引用的必要证据。损坏/丢失证据不得支持当前认证,允许重新复检恢复;磁盘或权限失败不得触发无限重试或扩大删除范围。 - -#### Scenario: Cleanup encounters an active run and a user file -- **WHEN** 到期本地缓存与活动run、同名用户源码同时存在 -- **THEN** 只清理有所有权和到期依据的非活动产物,其余保持,不能按整个codeguard目录删除 - -#### Scenario: A private log path redirects through a symlink -- **WHEN** 日志或报告目标指向受管范围以外 -- **THEN** 拒绝越界写入并保留真实失败状态,不覆盖目标或把缺日志当检查通过 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md deleted file mode 100644 index 2b4c214..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/hook-protocol/spec.md +++ /dev/null @@ -1,73 +0,0 @@ -## MODIFIED Requirements - -### Requirement: The cheat-sheet SHALL document fail-open for uncaught exceptions - -`hooks/__protocol__.md` MUST 按运行时和事件区分:legacy-v1 未捕获异常保留 stderr 诊断和 exit 0 的旧兼容行为;普通保存/提示反馈不承担交付阻断。迁移到 Rust 严格交付模式的 Git/CI/PreToolUse 入口遇到内部故障 MUST 依宿主协议阻断并说明未完成,不能 fail-open。宿主不支持可靠阻断时 MUST 明示能力边界并依赖真实 Git/CI,不得声称该宿主已提供硬门禁。 - -#### Scenario: A hook hits an unexpected exception -- **WHEN** 显式旧兼容 Hook 顶层异常 -- **THEN** 记录诊断并按旧 exit 0,不能称为新认证成功 - -#### Scenario: A migrated delivery hook hits an unexpected exception -- **WHEN** 严格交付入口内部失败 -- **THEN** 按宿主阻断协议拒绝交付并报告未完成 - -### Requirement: Soft and hard gates SHALL share the skipGate escape and neither may fall back to scanning outside a git repository - -共享 `codeguard.skipGate` 的豁免 MUST 仅存在于 legacy-v1,维持旧计数和 Stop 汇总。Rust 交付 MUST 不接受此字段作为授权,例外遵循 rulepack-governance。非 Git 目录的 Git 事件 MUST 不回退扫描整个 workspace;普通显式 CLI 项目扫描不受该 Git 前提限制。 - -#### Scenario: SkipGate set, user asks to commit -- **WHEN** legacy-v1 设置了 skipGate 且消息触发提交意图 -- **THEN** 按旧约定退出和记账,并标明不提供新认证 - -#### Scenario: SkipGate set with a secret on the commit face -- **WHEN** 仓库已设 skipGate 且用户消息触发提交意图,待提交面含敏感模式文件 -- **THEN** 软门禁注入入库安全报告(非阻断);硬门禁在同一提交面 exit 2 - -#### Scenario: Rust agent sets skipGate -- **WHEN** 新交付入口发现同名 Git config 或链式设置 -- **THEN** 不作为质量豁免,仍按完整 contract 检查 - -#### Scenario: Prompt fires outside any git repository -- **WHEN** Git 提交提示发生于非 Git cwd -- **THEN** 说明没有目标仓,不扫描整个 workspace,也不称交付已通过 - -### Requirement: Fail-open uncertainty SHALL be visible - -legacy-v1 的 PreToolUse 放行工具故障 MUST 继续通过 additionalContext 明示未验证。Rust 交付入口 MUST 根据报告的 gate decision 映射宿主动作,必需 incomplete 与 deny 均阻断;普通 UserPromptSubmit/PostToolUse 反馈 MUST 保持可见未完成,不得宣称 all passed 或承担未实现的阻断。新 CLI exit 2 是用法错误,MUST NOT 直接当作所有宿主的阻断语义透传。 - -普通反馈 Hook 和 MCP 检查结果 MUST 把项目配置探测、本次原生诊断及下一步以宿主支持的对话消息或 `additionalContext` 返回智能体。未配置检查器给出配置建议;已配置但工具执行失败给出环境恢复建议;有效 finding 给出位置、规则与复检命令。宿主只转换展示格式,不重新判定诊断或执行原始工具输出中的指令。 - -#### Scenario: A tool cannot run at the Git gate -- **WHEN** 旧入口缺工具 -- **THEN** 按旧协议 exit 0 且明确未验证 - -#### Scenario: Tool cannot run at a migrated gate -- **WHEN** 新严格入口缺必需工具 -- **THEN** 映射为宿主阻断,说明恢复工具链所需动作,不假称代码有错 - -### Requirement: Skip-gate bypass values SHALL be parsed strictly - -legacy-v1 的 `CODEGUARD_SKIP_GATE` MUST 只认 1/true/yes(大小写不敏感);0/false/空串不豁免,提示词保持原值域与传递边界说明。Rust 新流程 MUST 不将任何该变量值解释为授权,不能仅因保留旧环境变量而失去严格门禁。 - -#### Scenario: Zero and false values do not bypass -- **WHEN** 旧入口变量为 0 或 false -- **THEN** 旧门禁照常检查 - -#### Scenario: Accepted values bypass consistently -- **WHEN** 显式旧入口变量为 1/true/yes -- **THEN** 按旧协议豁免并审计,不签发新认证 - -#### Scenario: Rust receives an accepted legacy value -- **WHEN** 新入口继承 CODEGUARD_SKIP_GATE=true -- **THEN** 仍执行完整门禁,不把变量存在当批准 - -## ADDED Requirements - -### Requirement: Migrated host surfaces SHALL share the same report semantics - -CLI、MCP、宿主 Hook、真实 Git Hook 与 CI 对相同请求和证据 MUST 得到相同核心结果;差异仅为入口展示和协议映射。绑定二进制/协议失败 MUST 未完成;核心报告 MUST 不由宿主或智能体重写。迁移 MUST 为三宿主提供真实调用证据。 - -#### Scenario: Mixed findings and incomplete evidence reach three hosts -- **WHEN** 同一标准报告包含违规及未完成项 -- **THEN** 各宿主均保留二者,严格交付入口阻断,保存反馈不冒充交付通过 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md deleted file mode 100644 index 920935d..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/language-gate-commands/spec.md +++ /dev/null @@ -1,103 +0,0 @@ -## MODIFIED Requirements - -### Requirement: Languages may declare a configuration prerequisite - -注册表 MUST 允许声明配置前置条件,避免采用不适合项目的默认规则。legacy-v1 缺配置时维持未接入/未验证且旧 Hook 放行语义。Rust 新入口 MUST 使用已批准 rulepack 或已接入的项目配置;如果不能可靠满足前置条件,必需义务为 incomplete,不能通过“未接入”自动免除。 - -#### Scenario: 已声明前置条件且项目未接入 -- **WHEN** legacy-v1 项目缺少声明配置 -- **THEN** 按旧协议说明未验证并兼容放行,不签发新认证 - -#### Scenario: Rust required configuration is missing -- **WHEN** 新入口没有项目配置且无法使用批准规则包建立可靠计划 -- **THEN** 返回 configuration_required 和未完成,不报代码违规、不满足交付门禁 - -#### Scenario: 已声明前置条件且项目已接入 -- **WHEN** 原生配置存在且满足批准策略 -- **THEN** 按有效配置执行,保留配置来源和覆盖证据 - -#### Scenario: 未声明前置条件的语言不受影响 -- **WHEN** 工具契约不要求额外配置 -- **THEN** 正常按已批准规则和工具锁执行,不凭空新增项目配置障碍 - -### Requirement: Gates in git repositories SHALL default to changed-file scope - -本条标题描述 legacy-v1:旧门禁 MUST 保留 delta 默认、gate_scope=repo、FULL_SCAN_EXCLUDES、index/预测暂存/HEAD 的历史输入规则与完整诊断;准确快照不复用旧软缓存。Rust 新门禁 MUST 建立全部适用必需义务,增量仅作为等价执行优化,不能默认豁免未修改文件中的问题。新真实 Git 入口 MUST 使用 execution-kernel 的实际 index/ref 契约。 - -#### Scenario: A committed legacy issue is untouched by a clean change -- **WHEN** legacy-v1 改动仅文档且项目检查确实不适用 -- **THEN** 明示无须执行,不伪称完成项目验证 - -#### Scenario: A new staged file introduces a problem -- **WHEN** index 内容违规但工作树已修好 -- **THEN** 检出 index 违规,不借用工作树通过 - -#### Scenario: A bad commit made outside the gate must not slip through the push -- **WHEN** 实际待推送内容违规但工作树已修好 -- **THEN** 检查待推送内容并保留违规 - -#### Scenario: Push with no resolvable upstream does not crash -- **WHEN** 旧入口没有可解析上游 -- **THEN** 保留 HEAD 全树回退,不因空基线跳过 - -#### Scenario: A chained commit-and-push takes the wider face -- **WHEN** 宿主可可靠建模同仓 commit→push -- **THEN** 覆盖拟提交内容和已有待推送内容;不可建模时明示未完成 - -#### Scenario: Rust optimization leaves an obligation unproven -- **WHEN** 增量计划没有执行某必需任务且无等价缓存证明 -- **THEN** 不能据 delta 干净签发交付 allow - -### Requirement: A toolchain crash SHALL be recorded as unverified, not as a lint failure - -检查器退出码 MUST 结合工具契约判定,工具故障 MUST 不认作代码违规。legacy-v1 保留 UNVERIFIED、CLI 1、Hook 可见放行。Rust MUST 将该义务标 incomplete、CLI 3,必需检查不满足交付;混合有效发现仍保留。不能统一把所有工具 exit 2 当配置错误,也不能把所有 exit 1 当违规。 - -#### Scenario: An npx tool crashes with exit 2 -- **WHEN** ESLint 因配置问题以 exit 2 退出 -- **THEN** 旧接口为 UNVERIFIED;新接口为 incomplete,均不能称为 lint 违规或通过 - -## ADDED Requirements - -### Requirement: Rust command plans SHALL preserve explicit build levels - -Rust build MUST 记录编译、静态检查和测试执行的区别。Java 默认静态构建保留不运行测试的等级;批准策略要求测试时 MUST 执行,智能体不得自行追加 skip。自定义命令 MUST 通过义务覆盖核对,不能只凭 exit 0 替代质量证据。 - -#### Scenario: Policy requires tests -- **WHEN** 项目批准策略要求构建时运行测试 -- **THEN** 新计划包含测试执行,运行参数不能静默排除 test - -#### Scenario: Default static build completes -- **WHEN** 默认静态构建成功但未运行测试 -- **THEN** 报告 test_execution=false,不声称测试通过 - -#### Scenario: Native Cargo check reports an attributed compiler error -- **WHEN** Rust 静态构建调用原生 Cargo check,机器流包含完整 package/manifest/target 身份、可归属的编译诊断及失败结束记录 -- **THEN** 保留原生编译诊断与目标身份,明确 build_level=type_check、test_execution=false;不将它改称 Clippy、文档或安全违规,不从局部目标结果推导完整项目或交付结论 - -#### Scenario: Native Cargo build report lacks a valid completion contract -- **WHEN** Cargo 静态构建机器流损坏、重复语义键、无结束记录、结束后仍有事件、成功结束却含 error,或进程失败而无可归属编译诊断 -- **THEN** 构建结果保持未完成;有效已观察诊断可保留为调查证据,但不能把裸退出码、空输出或环境故障认作源码违规或通过 - -#### Scenario: Public Cargo type-check probe encounters changed inputs or cancellation -- **WHEN** build rust的显式原生类型检查执行时源码、根清单、锁或工具身份变化,或用户取消同轮执行 -- **THEN** 报告绑定本轮原生状态和输入摘要,保留调查证据且移除源码修复许可;取消优先返回130;完整且目标归属唯一的局部诊断才提供限定目标修复指引,仍明确test_execution=false、coverage_proven=false和交付not_evaluated,不将局部成功当作完整策略或任务关闭 - -#### Scenario: Cargo build observations synchronize without closing old tasks -- **WHEN** 已初始化工作区重复扫描同一编译错误,或未消费报告的源码/原生目标/清单/锁字节已经变化 -- **THEN** 当前有效观察只更新同一稳定问题和修复任务,next指向原生构建检查;陈旧证据保留为历史并生成重扫准备任务,坏身份拒绝导入;环境失败生成准备任务,不生成源码违规,同步或任务勾选不得关闭问题 - -#### Scenario: Cargo build task rechecks through the original checker -- **WHEN** 智能体对稳定的 Rust 编译任务执行 task verify,并显式提供同一原生 Cargo 工具 -- **THEN** 在任务租约和统一截止时间内重新执行 Cargo check,绑定源码、清单、锁与工具身份,保存关联任务和尝试的复检事件;原错误仍在时返回 still_present,工具或输入异常返回 incomplete - -#### Scenario: Cargo build task has no diagnostic in a local recheck -- **WHEN** 原生 Cargo check 本轮无错误,而完整项目策略、目标组合或规则覆盖尚未核验 -- **THEN** 仅返回 candidate_absent_unverified_policy 或环境恢复候选,保留原任务 open,next 指引核查原生配置和完整交付;不得凭零诊断、白名单候选或任务勾选自动关闭 - -#### Scenario: Unified check schedules native Rust type checking -- **WHEN** `check all` 发现 Rust 源码,调用方提供绝对 Cargo 工具,并有可读取的根 Cargo 清单与锁 -- **THEN** 在同一任务图、共享截止时间和 Cargo 构建资源约束下调用原生 Cargo check;反馈独立保留编译 finding、构建等级和是否执行测试,已初始化工作区同步稳定任务并在对话中给出下一步;局部构建成功仍不授予完整覆盖或交付通过 - -#### Scenario: Unified Rust build check cannot complete -- **WHEN** Cargo 缺失、原生机器流损坏、目标归属不明、输入或工具变化、执行超时或取消 -- **THEN** `check all` 保留本轮原生诊断和具体未完成原因,生成可恢复的环境/完整性任务;不得将故障算源码编译违规、白名单命中或空结果通过 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md deleted file mode 100644 index e93f55c..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/native-tool-adapters/spec.md +++ /dev/null @@ -1,600 +0,0 @@ -## Purpose - -定义传统原生工具在 Codeguard 内的配置发现、受控调用和结果解释,使语言注册、项目配置、工具安装与本次检查结果不再被混为同一种支持状态。 - -## ADDED Requirements - -### Requirement: Explicit Maven Javadoc selection SHALL not fall back to isolated single-file diagnostics - -项目检查明确提供 Maven 执行上下文时,Javadoc MUST 选择原 POM/完整显式主源码的多文件检查,不再额外启动隔离单文件 JDK 探针。构建根不适用、配置/类路径未知、环境缺失或原生失败 MUST 保留具体未完成诊断,不得用单文件探针代替项目配置。未选择 Maven 的显式 JDK 局部模式保持可用,但 MUST 标注其单文件范围且不推导项目覆盖。报告 MUST 版本化显示探针模式及独立多文件结果;跨文件类型引用不得因为已舍弃的单文件上下文额外生成源码 finding 或环境任务。 - -#### Scenario: Two configured source files refer to each other -- **WHEN** 用户明确提供 Maven/JDK/离线检查上下文且静态原 POM 可重放 -- **THEN** 仅运行 Maven 多文件检查,所有单文件 observation 为空并指向构建根结果;原生日志和源码位置可展示,覆盖/批准仍单独核验 - -#### Scenario: Maven cannot establish a valid project scope -- **WHEN** 已选择 Maven 但 POM 动态/继承或检查前置缺失 -- **THEN** 返回多文件具体未完成原因,不回退单文件 JDK 以制造无关诊断或伪装完成 - - -### Requirement: Adapters SHALL publish verifiable capability contracts - -每个 adapter MUST 声明语言/方言、类别、可识别的原生配置、工具和运行时兼容范围、输入范围、报告格式及退出语义。发行能力与项目配置分开呈现;项目检查器状态 MUST 区分 `configured`、`missing`、`invalid`、`unknown`。formatter 存在 MUST NOT 自动证明 lint/comments 能力。 - -#### Scenario: A project has no Javadoc checker configuration -- **WHEN** Java 项目没有启用 Javadoc 检查规则或可识别的检查命令 -- **THEN** 返回 `missing` 与可操作的配置建议,不报告源码缺少 Javadoc,也不声称已检查通过 - -#### Scenario: A stable legacy entry has only a formatter -- **WHEN** 迁移 Julia 或 Pascal,原 lint 命令为空 -- **THEN** 补充经过真实验收的只读检查能力前保持能力缺口,不能据旧 stable 标签通过 - -#### Scenario: Shell dialect is unsupported -- **WHEN** 项目含 zsh,而选定 ShellCheck 不支持该方言 -- **THEN** 为其保留能力缺口或选择已验证的专用适配器,不静默删除义务 - -### Requirement: Native evidence SHALL be interpreted per tool contract - -adapter MUST 根据工具版本的报告及退出语义解析结果;MUST NOT 以通用非零、exit 1、关键词或模型主观判断替代。无效、截断、陈旧、与计划不符或内部矛盾的报告 MUST 产生未完成。有效部分发现 MUST 保留。 - -Rust 注释诊断 MUST 使用原生 Cargo/rustdoc 机器流,不能复用只接收 Clippy 规则的解析器或通过正则重写文档规则。已识别 missing_docs 与 rustdoc::broken_intra_doc_links 的观察 MUST 保留原生规则/级别、唯一主定位和原生 package/manifest/target 身份供执行层核对;不得把其它编译错误改称注释问题。重复 JSON 键、缺失/重复/失败的结束记录、结束后新事件、歧义主定位及未支持的警告 MUST 保持未完成。纯解析或显式局部库目标执行不证明项目原配置、完整工作区/features/targets、可信工具或批准规则覆盖。 - -公开 comments rust 的局部探针 MUST 显式选择Cargo入口、采用共享预算与受控运行时,使用锁定离线输入和私有输出目录,不隐式下载/安装工具。MUST 将当前清单/锁/已观察源码、工具字节及原生主目标核对,输入变化、目标越界或机器流异常返回未完成。显式探针规则 MUST 标明不代表项目获批准的生效文档规则;局部零诊断不得关闭任务或批准白名单,完整配置闭包与构建组合仍须独立验证。 - -Rustdoc发现候选身份 MUST 绑定原生主定位字节范围所对应的真实UTF8源码及精确规则/相对目标,而不是诊断列表序号;范围缺失、倒置、越界或切断UTF8时不得猜测行内容补造。相同原生记录可去重,但同一候选身份对应多个不同源码范围/诊断时 MUST 明示歧义,保留观察且不分配正式finding ID或关闭任务。文档修复/行移动不得让剩余发现借用另一问题的顺序身份;完整符号归属尚未建立时仍是候选。 - -Rustdoc逐问题反馈 MUST 提供问题证据、规则依据、允许修改的范围、修复步骤、原工具复检命令、尝试历史状态和关闭条件。局部完成且身份唯一时可提供限定目标源码的修复指引;输入变化、歧义、取消或其它未完成状态 MUST 保留调查指引且不给源码修改范围。尚未接入持久任务时 MUST 明示历史未接通,不得把空历史伪装为无失败尝试。简报不能授权任务关闭、白名单批准或完整交付。 - -#### Scenario: Rustdoc evidence becomes stale before repair guidance -- **WHEN** 原工具发现文档问题,但同轮输入变化或发现身份歧义 -- **THEN** 反馈保留原生证据,指向重新检查或身份调查,允许修改的源码范围为空,不指示按旧定位修复 - -#### Scenario: Rustdoc observations synchronize to an initialized workbench -- **WHEN** 初始化工作区的本轮文档观察具有绑定身份和唯一原生发现,且同步时源码、清单与锁仍匹配 -- **THEN** 保存本地报告并自动同步为同一稳定问题及可读任务;重复扫描更新观察而不重复建任务,未完成/歧义产生检查准备任务,陈旧发现不得驱动源码修复 - -#### Scenario: Full Rust check schedules independent lint and documentation observations -- **WHEN** check all发现Rust源码并取得显式Cargo上下文 -- **THEN** 共享预算分别调度Clippy与rustdoc,保留各自结果、未完成原因和持久任务;库文档探针不代表项目原配置或完整构建组合,不能授予完整交付通过 - -#### Scenario: Rustdoc task recheck encounters native suppression -- **WHEN** 文档任务使用同一 Cargo 在稳定输入上复检,普通扫描未发现原问题而原生 force-warn 对照发现同文件同规则 -- **THEN** 记录 suppression_requires_review 和原工具证据,保持任务open;两轮局部零发现仍须策略/范围核验,不自行关闭或批准白名单 - -#### Scenario: Rustdoc forced evidence has a forged identity -- **WHEN** 文档任务复检封套中的强制告警报告指纹、原生范围或输入身份损坏,普通报告仍合法 -- **THEN** 导入必须独立核验两份原生观察,不得仅凭封套形状或普通报告有效就消费损坏对照;保持未完成并指出证据修复动作 - -#### Scenario: Rustdoc declarations have identical source text -- **WHEN** 同文件两个不同原生范围产生相同规则及声明字节,缺足够符号归属区分 -- **THEN** 保留两项歧义观察,finding ID为空且运行未完成,不按出现顺序发放稳定任务身份或把修复一项解释为另一项关闭 - -#### Scenario: Public Rust comments probe observes a selected library -- **WHEN** comments rust 收到显式Cargo工具,在原生库目标上观察文档诊断或零诊断 -- **THEN** 对话显示规则/位置与局部范围,整体仍未完成/not_evaluated;清单/锁/源码/工具变化或诊断目标归属失配不能作为当前完整观察,未集成的持久任务须明确说明 - -#### Scenario: Rust comments cancellation coincides with input changes -- **WHEN** 原生文档进程被用户取消,运行后复核同时发现源码变化 -- **THEN** 保留取消状态和退出130,局部观察保持未完成;不能用输入变化将取消降级为普通退出3或解释为修复 - -#### Scenario: Native rustdoc reports documentation diagnostics -- **WHEN** 原生 rustdoc 机器流产生 missing_docs 或 broken_intra_doc_links 并有唯一主定位及目标身份 -- **THEN** 适配器保留具体规则、位置及目标归属;不能因 Clippy 不接收这些规则而丢失注释观察,也不能据局部观察签发完整项目通过 - -#### Scenario: Rustdoc encounters compilation failure or ambiguous report -- **WHEN** 同轮有编译错误、未知警告、重复键、主定位歧义或异常结束记录 -- **THEN** 结果标未完成,保留已观察诊断用于调查,不把环境/报告失败当注释违规或零问题通过 - -#### Scenario: Tool verification observes a local lock candidate -- **WHEN** `tools verify` 读取本地工具锁候选并核对当前平台的入口、可选运行时及目录包字节 -- **THEN** 逐项反馈匹配、缺失、不可读、摘要失配或不可执行及恢复动作;不启动 wrapper、安装或联网,不把结构合法/字节匹配解释为可信批准、可启动或规则已执行。本地来源未获核验时整体未完成、readiness=unknown、无门禁效力;坏锁或链接锁不生成源码 finding - -#### Scenario: Doctor diagnoses an explicitly selected Ruff binary -- **WHEN** doctor 观察项目配置并收到显式绝对路径的 Ruff 原生入口 -- **THEN** 在私有目录以固定版本参数、清空继承环境、共同预算及单探测上限执行版本诊断;不运行源码扫描或项目 wrapper。未选择工具不冒充工具缺失,脚本入口在无法隔离时启动前未完成;原生成功仅形成未核验来源的局部版本观察,不能给 readiness 或质量门禁签发通过,必须反馈其它诊断缺口及下一步 - -#### Scenario: Version discovery fails before checking source -- **WHEN** 原生版本探测超时、预算在启动前耗尽、无法启动、被取消、被信号终止或输出/管道/清理失败 -- **THEN** 保留执行层的具体失败类别,返回环境阻塞和对应恢复动作;不启动后续质量检查,不将失败误报为源码违规 - -#### Scenario: A version process exits zero with incompatible output or changed artifact -- **WHEN** 原生版本探测退出零,但 stdout 不符合适配器精确版本契约、出现未预期 stderr、工具字节改变,或本轮私有记录失败 -- **THEN** 分别反馈版本不符、输出异常、制品变化或记录失败;不运行后续源码检查,不将零退出推导为可用、质量通过或批准身份。超时/取消/无法启动/信号/输出超限保留各自执行类别,共享截止时间不得因记录或工具复核重置 - -#### Scenario: Valid finding precedes a crash -- **WHEN** 工具先产生有效违规,随后发生配置或进程故障 -- **THEN** 保存该 finding 并记录 incomplete,不覆盖为纯工具错误或完整违规结果 - -#### Scenario: Tool exits zero with a stale report -- **WHEN** 报告属于此前内容或当前规则未执行 -- **THEN** 拒绝将其作为本次通过证据 - -#### Scenario: A Clippy finding disappears behind a native lint allowance -- **WHEN** Rust 任务普通 Clippy 复检不再报告原规则,但同工具、同目标字节、同 manifest 和同截止时间内的 `--force-warn <原规则>` 原生对照重新检出该稳定 finding -- **THEN** 记录原生抑制待核查并保留任务;对照失败、输入或工具身份改变时保持 incomplete,不能把零诊断当作修复或白名单批准 - -#### Scenario: A Go target disappears because native build selection excludes it -- **WHEN** 原 Go finding 在默认构建条件的 vet 复检中未检出,但同工具、同受控环境与同截止时间内的 go list JSON 显示目标被构建标签、平台或 CGO 排除,或未列入本轮原生源文件集合 -- **THEN** 保留任务并要求核查构建范围;不得把未检查目标解释为已修复。原生清单损坏、归属未知或两轮源码/模块/工具变化时为 incomplete;局部 selected 观察不得证明所有平台与规则覆盖或白名单批准 - -#### Scenario: Go source inputs change after a verification observation -- **WHEN** Go 复检绑定的整组源码或模块清单与读取下一步/同步时的当前内容不一致 -- **THEN** 旧观察不能指引关闭;next 要求原工具复扫,同步将旧发现计入历史而非当前活动源码任务 - -### Requirement: Static detection families SHALL remain explicit and extensible - -Codeguard MUST 分别记录 `lint`、`comments`、`dependencies`、`cve`、`security`、`build` 六类别。`comments.api_docs` 对应 Javadoc 等 API 文档检查;`dependencies` 对应依赖图、版本治理、许可证、SBOM 和来源;`cve` 对应漏洞匹配。28 个检测族是可扩展的**候选目录**,不是每个项目都必须配置或逐项证明执行的清单。Codeguard MUST 识别项目中实际配置的检查器、规则和命令;已配置且可用的检查器由 Rust 调用原生能力,并把本次结果反馈给智能体。未配置、配置错误和工具不可用 MUST 分开说明。只有批准策略明确要求的缺失检查才影响交付门禁,不能把所有候选检测族自动升级为必需义务。 - -#### Scenario: Configured Javadoc checker reports a missing comment -- **WHEN** Java 项目已配置 Javadoc 检查,原生工具返回有效缺失注释诊断 -- **THEN** 智能体对话显示文件、位置、规则、修复建议和复检命令;不要求额外的逐族执行证明 - -#### Scenario: Javadoc output cannot be attributed to the configured project checker -- **WHEN** 局部 JDK doclint 探针发现缺失注释,但尚未绑定项目生效配置、完整源集、可信工具身份或所需类路径 -- **THEN** 可以显示带来源的局部诊断和复检建议;不得把它写成已批准项目 finding、完整检查通过或可关闭任务的证据。未知原生输出、缺少类路径和工具执行故障标为未完成,不转换为代码违规 - -#### Scenario: Javadoc plugin declaration disables missing-comment checks -- **WHEN** Maven POM 声明 Javadoc 插件,但显式 `doclint=none`、`all,-missing` 或其它不含 `missing` 的静态规则组合 -- **THEN** 注释检查配置显示为无效并给出启用 `missing` 的建议;动态 doclint 或动态错误处理策略显示未知,显式 `failOnError=false` 显示无效,不能仅凭插件存在宣称注释规则已启用 - -#### Scenario: Maven Javadoc reports warnings with a successful build -- **WHEN** 已配置的 Maven Javadoc 插件产生有效缺注释警告,但 `failOnWarnings=false` 使原生命令返回 `BUILD SUCCESS` -- **THEN** 仍须解析并反馈原生缺注释诊断;退出码和 `BUILD SUCCESS` 不得覆盖警告。复检必须验证本轮独立执行与目标产物,不能用上轮缓存导致的零诊断关闭任务 - -#### Scenario: A successful Javadoc log has no diagnostic block -- **WHEN** 已完整注释的项目首次执行与同目录重跑均输出无诊断的 `BUILD SUCCESS`,且日志未提供可核验的本轮产物身份 -- **THEN** 解析器只能记录无诊断日志观察,不能据此证明本轮重新检查、关闭任务或签发项目通过;须由受控执行器另行核验新鲜快照和产物归属 - -#### Scenario: A synthetic Maven Javadoc POM differs from project configuration -- **WHEN** 隔离探针准备用固定 POM 替代项目 POM 来扫描多份源码 -- **THEN** 不得把探针诊断归为该项目已配置检查器的 finding;`check java` 不用合成 POM 遮盖真实项目配置,配置无法受控重放时保持未完成 - -#### Scenario: A simple project POM is replayed for Maven Javadoc -- **WHEN** 当前项目 POM 直接固定 Javadoc 3.12.0 与 `doclint=missing`,且静态验证没有父 POM、profile、依赖、模块、扩展或其它插件 -- **THEN** Rust 在私有快照中复制原 POM 和显式 Java 源码,运行原生 Maven,报告原 POM 字节摘要及局部诊断;若 POM 变化或输出无法归属,结果未完成;即使日志干净,也不能据此声明完整源集或交付通过 - -#### Scenario: A complex project POM cannot be safely replayed -- **WHEN** Javadoc 声明依赖继承、动态属性、其它插件或未知构建内容 -- **THEN** 不以固定 POM 替代项目配置生成可归因诊断;标记项目 POM 重放不适用,保留检查义务并给出解析生效模型或受控执行的下一步 - -#### Scenario: No SAST or IaC checker is configured -- **WHEN** 项目只配置秘密扫描,而没有 SAST 或 IaC 检查器配置 -- **THEN** 如实列出已配置的秘密扫描和未配置的候选检查;不虚构 SAST/IaC 已执行,也不凭候选目录自动判代码违规 - -#### Scenario: Java dependency and CVE checker declarations differ by module -- **WHEN** 多模块 Java 项目的根构建文件声明 OWASP Dependency-Check,而内层构建根没有声明,且两处都有 Java 源码 -- **THEN** `check java` 对已识别 CVE checker 报告构建根配置混合与逐模块核查动作,不将根声明推广为全项目已配置;已声明但未执行原工具时保持未完成,不产生“无漏洞”结论 - -#### Scenario: A Gradle source tree has no Maven checker identity -- **WHEN** Java 源码归属 Gradle 构建根,或 Maven 与 Gradle 构建根混合,且尚未解析 Gradle 生效模型 -- **THEN** 类别反馈说明 Gradle 或混合构建模型未解析,不把 Maven checker ID 贴到这些源码,也不推断依赖治理、CVE 或安全检查已完成 - -#### Scenario: Python dependency inputs are not mistaken for a CVE result -- **WHEN** Python 构建根只有逐行固定版本的 requirements、含动态约束的 requirements、uv/Poetry 锁文件,或没有可识别依赖输入 -- **THEN** `detect` 按构建根分别记录输入位置及相应未解析原因;`plan cve python` 与 `check all` 保留原生检查器、依赖图和漏洞数据库待核验状态。固定版本行不等于完整传递依赖图,锁文件存在不等于已解析或已完成漏洞匹配;任何一种情况都不得生成零漏洞结论或已完成门禁 - -#### Scenario: Python dependency input changes during discovery -- **WHEN** Python 依赖文件在首次清单观察后不可读或字节摘要变化 -- **THEN** 本轮发现标记不完整,指出变化的输入和重新发现动作;不能将旧输入或相邻构建根的锁文件用作当前根的 CVE 证据 - -#### Scenario: A tool-specific Python lock is not a pip-audit standard lock -- **WHEN** 项目有符合 PyPA 命名的 `pylock.toml` 或 `pylock..toml`,或只有 `uv.lock`/`poetry.lock`,或同根同时存在两类锁 -- **THEN** 分别记录标准锁未解析、工具专用锁未解析或锁选择歧义;不得把 `uv.lock`/`poetry.lock` 直接交给当前只支持项目 pylock 的 pip-audit `--locked` 入口。标准锁存在也不证明环境选择、完整依赖图、原生审计或数据库时效;多锁不得擅自任选一份 - -#### Scenario: pip-audit reports a skipped dependency or inconsistent result -- **WHEN** 受控 pip-audit 项目锁审计的 JSON 报告含跳过的包、重复字段、非预期修复结果,或漏洞数量与原生退出状态矛盾 -- **THEN** 保留本次观察为未完成并给出明确原因;只有结构完整的原生组件、解析版本和 advisory 可成为后续归属候选。即使原生报告为空且退出零,也须另行核验项目锁的环境/依赖组、完整包图、工具及漏洞数据库身份和时效,不能仅凭 JSON 解析签发无漏洞结论 - -#### Scenario: Python native CVE probe uses a private snapshot -- **WHEN** 用户显式选择 pip-audit 可执行文件和版本,为有且仅有一份标准 pylock 的 Python 项目运行局部 `cve python` -- **THEN** Rust 先观察项目清单、锁和工具字节,在私有目录复放输入并由受控进程调用原生工具;前后任一原文件、私有副本或工具变化都使结果未完成。结构有效且整组组件名/解析版本与同轮标准锁逐项匹配的 advisory 才可反馈为局部候选;不匹配者不得成为项目 finding。零项与异常均保留 `not_evaluated` 和未核验覆盖;该局部探针不代替完整项目环境选择、漏洞库时效、稳定任务或交付门禁验收 - -#### Scenario: Conditional pylock packages are not flattened into one project environment -- **WHEN** 标准 pylock 含 `environments`、`requires-python`、非空 `extras`/`dependency-groups`/`default-groups`,或包级 `marker`/`requires-python`,而当前探针没有相应的目标环境与选择上下文 -- **THEN** 在已配置原生工具且锁的基本结构可解析时仍调用原生 CVE 检查,把版本、退出状态和待归属 advisory 数量反馈给智能体;同时返回明确的锁选择未解析状态与环境核对动作。不得把所有 `[[packages]]` 合并为当前项目实际依赖,不得把待归属 advisory 发布为项目 finding 或零漏洞结论。显式空 extras/组可继续作为单用途锁的局部输入,但仍不证明完整覆盖 - -#### Scenario: check all schedules Python CVE by build root -- **WHEN** `check all` 发现一个或多个具有可识别 `pyproject.toml` 的 Python 构建根,调用方可选择显式 pip-audit 路径和版本 -- **THEN** 每个构建根作为独立任务复用同一个私有快照原生探针,共享请求截止时间与取消;JSON/human 反馈必须逐根显示原生 advisory 或缺锁、缺工具、输入不一致等具体阻塞。无清单的源码根只保留配置缺口,不伪造原生扫描。即使每个局部报告有效,项目环境、依赖组、漏洞库身份及时效和可信策略未核验时,类别最多为 `observed_unverified`,全项目交付仍为 `incomplete` - -#### Scenario: Python CVE observation enters the repair workbench -- **WHEN** 已初始化工作区对同一 Python 构建根重复运行 `cve python` 或 `check all`,随后对该任务执行原生复检 -- **THEN** 输入清单、标准锁集合、构建根及运行报告必须在导入时重新核对;相同构建根和 CVE 完整性义务只保留一张稳定任务,后续扫描与失败尝试形成历史事件。缺工具/锁形成环境准备指引,已观察 advisory 保留为待核验局部证据;复检必须再次调用原工具并写入观察事件,不能因零 advisory、自写白名单、任务勾选或报告重放自动关闭。过期或损坏的报告必须显式阻止导入,且不吞掉其他任务的证据 - -#### Scenario: A similarly named security plugin dependency is not FindSecBugs -- **WHEN** SpotBugs 插件依赖中的 `artifactId` 为 `findsecbugs-plugin`,但 `groupId` 并非 FindSecBugs 制品坐标 -- **THEN** 静态探测不得标记 FindSecBugs 已配置,也不得把该名称当作原生安全规则已运行 - -### Requirement: Java checks SHALL prove each required native obligation - -Java MUST 识别 P3C、通用 lint、Javadoc/注释、安全、依赖治理、依赖漏洞和构建的项目配置状态。官方 P3C MUST 使用经验证的 P3C PMD 实现和兼容工具链;Checkstyle 配置名 MUST NOT 被标为 P3C。已配置的 Maven/Gradle 检查通过其原生命令执行,结果按该工具契约解释。`mvn verify` 成功只作为本次构建结果反馈,不能被描述成未配置的检查器也通过。 - -#### Scenario: Verify succeeds without quality plugins -- **WHEN** `mvn verify` 成功但未运行所需 P3C/Javadoc 检查 -- **THEN** 在智能体对话中显示 P3C/Javadoc `missing` 与配置建议;`check java` 只总结实际运行的检查,批准策略要求的缺项才使门禁未完成 - -#### Scenario: JDK and PMD are incompatible -- **WHEN** P3C 规则运行因 JDK/PMD 组合失败 -- **THEN** 报告具体工具链未完成,不记为代码违规,不自动换规则或跳过 - -#### Scenario: Maven PMD returns zero with default or error-skipping configuration -- **WHEN** Maven PMD 运行成功,但生效规则集并非项目声明的 P3C 规则,或处理错误被忽略 -- **THEN** 报告配置错误或工具结果未完成;Rust 不得把 Maven 退出码或空 XML 转述为 P3C 检查通过 - -#### Scenario: Isolated P3C probe must honor the project ruleset subset -- **WHEN** 项目仅声明 `ali-naming.xml`,隔离探针内置模板还包含 `ali-comment.xml` -- **THEN** 项目检查只执行已确认的命名规则集;作者注释规则的诊断不得进入该项目 finding 或修复任务。POM 在发现、执行或同步期间变化,或生效配置无法确定时,保留配置阻塞而非借误报白名单放行 - -#### Scenario: Native XML claims an unselected or impossible P3C rule -- **WHEN** PMD XML 结构合法且退出码为 0,但诊断中的规则集未被本轮项目配置选择,或规则 ID 不属于该规则集 -- **THEN** 不生成项目 finding 或源码修复任务;反馈报告规则归属未核验并保持 incomplete。规则目录须与固定版本 P3C 制品核对,不能只凭报告中的自由文本 ruleset 名称接受诊断 - -### Requirement: Comment and security categories SHALL retain their own evidence - -注释检查 MUST 根据语言与规则验证其确定性要求,不得以格式化代替。源代码安全、配置安全、入库策略和 CVE MUST 分开归类;仅命中禁止文件模式 MUST 报策略违规,不得无内容证据声称检测到真实私钥。未实现的语义能力 MUST 明示。 - -#### Scenario: Public API lacks required documentation -- **WHEN** 有效规则要求文档且源码缺少对应注释 -- **THEN** 原生或经验证的确定性规则输出注释违规,普通 formatter 成功不消除该义务 - -#### Scenario: Configured Ruff reports a Python module docstring rule -- **WHEN** Python 项目配置 Ruff 的 D100,原生 Ruff 对公共模块报告缺少 docstring -- **THEN** 注释类别保留该原生规则、定位与修复后原工具复检建议;局部诊断可标已观察但不得推断全部注释规则、工具/策略批准或项目交付通过。补充 docstring 后原生零诊断只撤销该局部问题观察,不自动签发完整注释检查通过 - -#### Scenario: Configured Ruff reports another pydocstyle rule -- **WHEN** Python 项目显式启用 Ruff D### pydocstyle 规则,例如 D101,且同轮原生设置确认该规则生效并返回诊断 -- **THEN** 将该精确原生诊断归入注释候选,保留规则 ID、源码位置与原工具复检建议;仅有配置文本、非 D### 代码或没有诊断均不证明注释义务已执行或通过 - -#### Scenario: Ruff docstring report conflicts with effective settings -- **WHEN** 原生报告声称检出 D### pydocstyle 规则,而同轮 Ruff 生效设置并未启用该精确规则 -- **THEN** 保留原生诊断供核查,但本轮源码检查标为未完成,不生成可执行的注释修复结论或项目交付通过;用于交叉核对的完整原生规则集合不自动成为公开批准规则包 - -#### Scenario: Public certificate matches a forbidden path rule -- **WHEN** 文件命中现行禁止入库模式但没有私钥内容证据 -- **THEN** 按策略违规报告,不能将文件名命中写成已确认密钥泄露 - -### Requirement: CVE checks SHALL bind actual dependency and database identity - -Rust CVE 检查 MUST 绑定实际解析的组件版本、依赖来源、advisory 标识和数据库身份/时效。无可靠组件匹配、数据库过期、离线无合格库、缺失必要严重度时 MUST 保留发现与不确定性,不产生无依据的安全通过或确定高危。原生工具缺失 MUST NOT 静默换覆盖不同的通用工具。共享扫描 MUST 可追溯到全部被满足的义务。 - -#### Scenario: Offline database is too old -- **WHEN** 离线数据库超过批准的 freshness -- **THEN** CVE 未完成,不以零匹配判安全 - -#### Scenario: Native cargo-audit JSON omits database provenance -- **WHEN** Rust 使用显式原生 cargo-audit 可执行文件和离线数据库扫描 Cargo.lock,报告有漏洞或零漏洞,但数据库提交/更新时间缺失或尚未由可信边界核验 -- **THEN** 保留原生 advisory 与锁定组件的名称、解析版本和来源观察;公开反馈不得泄露私有来源,数据库身份/时效仍为未完成,零漏洞不得称安全通过。原生忽略列表、损坏报告、计数或退出码矛盾也不得转成误报白名单或质量通过 - -#### Scenario: Project check includes the Rust CVE obligation -- **WHEN** `check all` 发现 Rust 项目,不论是否提供显式 cargo-audit 工具和离线数据库 -- **THEN** 在共享任务图中登记独立 `rust.cve` 节点,反馈原生漏洞或缺工具/数据库的具体阻塞;JSON/human/SARIF 均不得吞掉已观察 advisory,未核验数据库、工具和策略仍使完整交付未完成。取消或内部故障时保留已取得的其它原生结果,旧报告版本保持可辨识 - -#### Scenario: Report has no comparable severity -- **WHEN** 已知漏洞没有策略阈值需要的严重度 -- **THEN** 保留 finding;无法按策略判定时未完成,不预过滤 UNKNOWN - -#### Scenario: OWASP report and Maven graph share only a local identity candidate -- **WHEN** 同一构建根配置两个原生插件,本轮 OWASP 报告与 Maven 图的 POM、工具、JDK、离线仓库摘要一致,且某条 advisory 的精确 PURL、图节点和制品 SHA-256 一致 -- **THEN** 可显示该条候选归属及原生证据引用;数据库时效、可信工具与项目覆盖未经核验时仍不得签发 CVE 通过、确定严重度门禁或误报白名单放行 - -#### Scenario: Advisory cannot be safely attributed to the current dependency graph -- **WHEN** 两份原生报告的构建根、输入摘要、组件坐标或制品字节摘要不一致,或 PURL 因私服限定符不能无损解释 -- **THEN** 逐条显示失配或无法归属,并保留原生漏洞观察;不得按相似文件名、脱敏摘要或历史图推断组件身份 - -### Requirement: Migration SHALL account for every legacy language entry - -迁移 MUST 逐项登记基线注册表全部 57 项,包括 54 stable 和 3 planned;前者完成六类别配置识别、原生适配器调用与结果反馈验收前 MUST NOT 宣称全量迁移完成。planned MUST 保持显式状态,不能为凑数量创建空实现。注册表变化 MUST 重新做差异核对。 - -#### Scenario: Four major languages are implemented -- **WHEN** 仅 Java/Rust/Python/TypeScript 已可用 -- **THEN** 只能声明这部分能力完成,剩余迁移任务仍未完成 - -#### Scenario: A project contains a planned language -- **WHEN** 项目含 COBOL、ArkTS 或 Metal 源码并运行 `check all` -- **THEN** 六类别候选均明确保留 `planned` 的旧登记状态与 `gap` 的当前能力含义,返回未完成和具体适配步骤;不能把无原生适配器解释为 `not_applicable`、空结果或质量通过 - -### Requirement: Adapters SHALL separate static observation from executable resolution - -adapter MUST 基于注入观察声明适用性、计划与报告解析,不自行spawn、联网或写文件。动态构建模型解析 MUST 作为有身份、预算、网络声明和证据的执行任务,由core经runtime port调用;静态detect/init/plan无法解析的条件保留unknown,不偷偷执行wrapper。模块/源集/方言与跨语言依赖映射 MUST 保留各自范围,不能用主语言覆盖其它构建根。 - -Codeguard 自有的新执行、解析、策略判定、门禁与验收工具 MUST 由 Rust 实现,不在新 CLI 路径中调用 Python 脚本来承担这些职责。P3C、Maven 等原生检查器仍按各自官方命令执行,由 Rust runtime 受控启动,Rust adapter 解释其原生证据;本要求不意味着用 Rust 重写它们的规则实现。旧 Python 入口只属于具名 legacy 兼容范围,不能参与新入口的通过判定。 - -#### Scenario: A build model requires project extensions to resolve -- **WHEN** 静态读取不足以确定effective model或条件依赖 -- **THEN** plan保留待解析任务,实际解析只在明确执行阶段进行并记录证据 - -#### Scenario: A shared scanner serves several language obligations -- **WHEN** 多模块多语言共享一个依赖扫描器 -- **THEN** 原生执行由统一runtime协调,结果映射到全部对应义务,不绕过进程控制或漏掉另一构建根 - -### Requirement: Checkstyle XML interpretation SHALL preserve native identity and distinguish processing failures - -Checkstyle XML 解析 MUST 保留完整 source(包括自定义模块 ID)、原生严重度、文件及可选列号;文件级零行号 MUST NOT 被改成任意源码行。异常和缺文件归属的事件 MUST 保持未完成,不制造源码规则违规。解析 MUST 有界并拒绝 DTD、损坏/未知结构、版本不符、歧义重复文件和非法字段。结构有效与空诊断 MUST NOT 单独证明本轮执行、检查范围、批准规则或交付通过。 - -原生结果判定 MUST 使用独立冻结的完整文件列表和经版本/平台验收的退出契约;缺失、重复、遗漏或额外文件不得形成完整结果。warning/info 在退出零时 MUST 保留;操作系统退出截断 MUST NOT 抹去报告中的错误。异常、信号、取消或退出与诊断矛盾 MUST 保持未完成,不冒充源码违规或普通通过。 - -原配置的重复属性与无法区分的原生规则来源 MUST 保留上下文歧义,不能默认选择某个属性值、合并检查实例或扩大白名单。具有可区分模块 ID 的相同检查类 MUST 保留各自身份,不因检查类相同而自动忽略。 - -#### Scenario: Distinct modules share a source ID in an older native version -- **WHEN** 锁定原工具版本仅输出模块 ID,两个配置实例共用该 ID -- **THEN** 无法独立归属的局部执行保持待解析,不产生可用于扩大白名单的规则绑定;改为不同 ID 后仍按原配置执行并分别展示诊断 - -#### Scenario: Warning severity returns a successful native exit -- **WHEN** 原工具退出零但本轮 XML 含有效 warning/info -- **THEN** 报告保留诊断及原严重度,不将退出零投影为零诊断 - -#### Scenario: Native scope differs from the frozen source list -- **WHEN** XML 文件列表遗漏或增加冻结范围外的文件 -- **THEN** 返回范围未完成,原始诊断仅保留为局部证据,不自动扩大活动 finding 或白名单范围 - -#### Scenario: Two configured modules use the same checker class -- **WHEN** 原生 source 使用相同类名但不同自定义模块 ID -- **THEN** 解析保留两个完整身份,不能合并后扩大白名单或规则归属 - -#### Scenario: An exception appears beside a valid diagnostic -- **WHEN** 文件 XML 内含 exception 及可解析的 error -- **THEN** 保留可解析诊断为局部证据,同时报告处理未完成;异常不成为源码违规且报告不能当作完整结果 - -#### Scenario: A structurally valid report contains no violations -- **WHEN** 原生报告仅列出零诊断文件或没有文件 -- **THEN** 解析只返回结构观察,执行器仍须核对本轮产物、原配置、退出码与完整范围 - -### Requirement: Checkstyle repair feedback SHALL bind native sources to original configuration -局部 Checkstyle 反馈 SHALL 从同轮原配置精确关联原生 source 与内置检查类,保留原生 ID,并提供规则依据、修复方向和原输入复检参数。该映射不能授予工具批准、规则覆盖、白名单或项目交付权威。 - -#### Scenario: Custom ID has an unambiguous original module -- **WHEN** 固定版本原工具报告自定义 ID,原配置中该 ID 唯一对应已支持模块 -- **THEN** 展示对应检查类、中文规则摘要、官方依据与复检步骤,不改写原生 ID,也不因有修复指引就关闭任务 - -#### Scenario: Native source cannot be bound -- **WHEN** 原生 source 未在原配置映射中,或配置存在重复 ID 或未知版本语义 -- **THEN** 返回未完成,不按消息、短类名或顺序推测规则,不发布用于修改源码的 finding - -### Requirement: Field Javadoc checking SHALL use the native configured Checkstyle rule -Rust 的 Checkstyle 注释适配 SHALL 支持原配置的 JavadocVariable,保留原生自定义规则 ID、完整检查类、严重度、范围及精确目标,不用自写字段注释规则替代原工具。 - -#### Scenario: Native field rule distinguishes configured scope and exceptions -- **WHEN** 固定 Checkstyle 10.21.4 对显式原配置下的字段执行 JavadocVariable -- **THEN** 只把原生报告中的问题生成稳定任务;原配置忽略名、访问范围、serialVersionUID 和局部变量等边界以原工具输出为准,不额外制造缺注释问题 - -#### Scenario: Field repair is verified with the same rule -- **WHEN** 原字段任务补充实际语义文档后接受 task verify -- **THEN** 使用显式同一原工具/配置,原问题未再检出只作为局部候选观察;保留任务开放,不以原生零诊断证明完整项目覆盖或批准 - -#### Scenario: Field and enum tokens select different native targets -- **WHEN** 原 JavadocVariable 配置选择 VARIABLE_DEF 或 ENUM_CONSTANT_DEF,或限定访问范围/excludeScope -- **THEN** Rust 保留静态合法原参数,不扩展 token 集合;保留原生默认及必需 token 语义:10.21.4 的 VARIABLE_DEF 必需,仅配置 ENUM_CONSTANT_DEF 时仍包含字段检查,不由 Rust 过滤;访问范围外的声明不产生额外 finding。未知 token 或其它模块借用该参数不能按本适配上下文执行 - -### Requirement: Official Checkstyle module names SHALL preserve native checker identity -已支持的静态 Checkstyle 模块 SHALL 接受官方短名和完整类名原写法,原 XML 字节照常交给工具,Rust 仅在既定版本映射中归一检查器身份,不以任意后缀、消息或类名相似度猜测归属。 - -#### Scenario: Official short and full names describe the same rule -- **WHEN** Checker、TreeWalker 及已支持 Javadoc 模块改用官方完整类名,原目标、规则 ID 和工具保持相同 -- **THEN** 保留同一稳定 finding/task 和原生规则依据,不创建伪造配置阻塞;配置变化仍需重新原工具检查 - -#### Scenario: Unknown namespace or duplicated alias claims a rule -- **WHEN** 其它包的同名检查类冒用已支持类名,或短名与完整类名产生同一未区分的原生 source -- **THEN** 返回上下文未完成而非猜测身份;不能按遍历顺序把一条诊断分配给任一模块 - -### Requirement: Missing method Javadoc configuration SHALL remain native and context-bound -MissingJavadocMethod 的静态原配置 SHALL 支持本版范围、allowedAnnotations、allowMissingPropertyJavadoc、minLineCount 与 ignoreMethodNamesRegex 参数,原工具决定其筛选与文档语义;适配器不得移除用户原参数改用默认扫描。 - -#### Scenario: Original method exclusions select only real native findings -- **WHEN** 原配置按访问范围、注解、属性方法、名称或长度限制方法检查 -- **THEN** 只将原工具实际诊断接入稳定修复任务;这些参数不是 CodeGuard 误报白名单批准,也不能证明受保护必需规则覆盖 - -#### Scenario: Method properties are borrowed by another module -- **WHEN** 非该检查器声明相同参数,或静态整数/布尔/注解名称无法解析 -- **THEN** 返回配置上下文未完成而非猜测含义,不把配置故障伪装成源码缺注释 - -#### Scenario: Method configuration explicitly selects constructors or annotation members -- **WHEN** MissingJavadocMethod 原配置选择 METHOD_DEF、CTOR_DEF、ANNOTATION_FIELD_DEF 或 COMPACT_CTOR_DEF -- **THEN** 在该模块上下文保留原 token 集合与原生必需 token 语义;原生诊断进入稳定任务,非选中类别不被 Rust 额外补报,record 紧凑构造器可用同配置原工具复检。跨模块借用或不支持 token 返回上下文未完成 - -#### Scenario: Same checker class changes its target exclusions during repair -- **WHEN** 同一稳定任务复检的检查类未变,但原始配置字节已变化,原问题不再出现在诊断中 -- **THEN** Codeguard SHALL 返回 rule_coverage_requires_review,不能将调整 scope、token、名称排除或其它原生参数造成的零诊断标为修复候选;缺原配置身份也须复核。后续重复复检或扫描不得用新配置覆写首次发现的配置身份。恢复原配置并修正文档后才可给出局部待策略核验候选,仍不得自动关闭事实 - -### Requirement: Method tag configuration SHALL preserve native option semantics - -固定 Checkstyle 10.21.4 的 JavadocMethod 静态适配 MUST 保留 accessModifiers、allowMissingParamTags、allowMissingReturnTag、validateThrows、allowedAnnotations 与原生可接受 tokens,不将它们借用给缺方法文档检查器。源码是否缺参数、返回或异常标签 MUST 由原生诊断决定,参数不产生白名单批准或必需规则覆盖证明。 - -#### Scenario: Original method tag policy deliberately permits missing tags -- **WHEN** 原配置限定访问修饰符,并选择允许缺参数/返回标签、允许注解或启用 throws 标签校验 -- **THEN** 原 XML 不改写,实际诊断进入稳定任务;不对原工具已允许的缺标签额外补报。使用原始配置修正文档后仅给局部复检候选 - -#### Scenario: A method tag property appears in an unrelated module -- **WHEN** 未支持检查器借用标签检查专属属性,或布尔/修饰符/token 不合法 -- **THEN** 保持配置上下文未完成,不套默认值或标源码违规 - -### Requirement: Type documentation options SHALL retain their original checker context - -固定 10.21.4 的 MissingJavadocType/JavadocType 原 scope/excludeScope 与五类类型 tokens MUST 保留原生语义。skipAnnotations MUST 只适配 MissingJavadocType;allowedAnnotations、allowMissingParamTags、allowUnknownTags、authorFormat/versionFormat MUST 只在 JavadocType 上适配。正则含义与是否缺文档/标签 MUST 由原工具判断,不由 Rust 生成替代规则或白名单批准。 - -#### Scenario: Type annotations or record parameter policy permit documentation exceptions -- **WHEN** 原类型检查配置限定访问范围、注解例外、类型 token 或允许缺 record 参数标签 -- **THEN** 执行原 XML,仅将实际原生诊断同步到稳定任务;不额外补报被原配置允许的情况。恢复首次配置并修正文档后只形成局部复检候选 - -#### Scenario: A type property is borrowed by a method checker -- **WHEN** 类型专属属性跨模块声明,或非法布尔/范围/token/动态值出现 -- **THEN** 保持配置上下文未完成,不猜测默认规则或将配置错误当源码违规 - -#### Scenario: Author and version tags violate original type format requirements -- **WHEN** JavadocType 原 authorFormat/versionFormat 检出缺标签或值格式不符 -- **THEN** 保留原生诊断和稳定任务,修复指引须包含作者/版本格式并要求使用项目实际身份/版本依据,不编造事实。原格式配置不变时真实修正文档仅给局部复检候选 - -#### Scenario: A type format regex is rejected by the native checker -- **WHEN** 静态配置可读取,但原生工具拒绝无效格式正则 -- **THEN** 反馈 incomplete 并生成稳定配置准备任务,重复失败不制造多张任务,不生成源码标签违规或假干净结论 - -#### Scenario: Native configuration regex failure has a recognized fixed-version signature -- **WHEN** 10.21.4 原进程正常退出 254,预算内 stderr 同时含官方配置属性非法值异常和 PatternSyntaxException,且没有相互一致的原生诊断报告 -- **THEN** Codeguard SHALL 只返回脱敏 checkstyle_configuration_regex_invalid 和原配置修复/原工具复扫指引,不回显属性值或原始堆栈;未知退出/异常、取消/超时/超限及证据失败不得套用该细分,不能生成源码违规或覆盖通过 - -### Requirement: ESLint JSON reports SHALL separate rule findings from incomplete execution and suppression - -ESLint 10 原生 JSON 适配 MUST 核对冻结的具体版本、完整显式文件集合、诊断/计数与 exit/max-warnings 契约。普通退出零的 warning MUST 保留;退出 1 MUST 根据 error 或已冻结警告阈值解释,不直接算工具故障;退出 2、未知/非正常退出、坏报告或身份/范围矛盾 MUST 未完成。fatal 或无原生 ruleId 的诊断 MUST 调查语法/parser/配置,不能伪造规则 finding;同报告合法规则诊断须保留。 - -#### Scenario: ESLint warning does not fail the native process -- **WHEN** 完整 JSON 报告只含 warning 且退出 0,或冻结 max-warnings 阈值导致退出 1 -- **THEN** 保留原生规则、严重度和位置;解析一致性不证明项目有效配置、工具批准或交付通过 - -#### Scenario: A parser error or ignored-file notice lacks a native rule identity -- **WHEN** JSON 中出现 fatal/parser 诊断或无 ruleId 的文件/配置提示 -- **THEN** 标为待调查的未完成,不把它当普通规则违规;有效规则发现仍可供定位 - -#### Scenario: ESLint reports only suppressed diagnostics -- **WHEN** suppressedMessages 非空而活动 messages 为空 -- **THEN** 保留抑制数量并要求覆盖/批准核查,不标干净范围,不自动制造白名单或源码 finding - -#### Scenario: A native array omits a planned file or contradicts its counts -- **WHEN** 文件集合缺失/重复/额外,版本不匹配,路径含跳转,诊断计数矛盾或 JSON 损坏 -- **THEN** 返回未完成,不能签发解析一致性或复检关闭候选 - -### Requirement: ESLint native command planning SHALL use explicit literal inputs - -Rust ESLint 命令计划 MUST 明确 Node 入口、ESLint JS 入口、原 flat config、完整显式源码列表与本轮独立 JSON 槽位,以字面 argv 构造,不借 Shell/npx 隐式安装或拼接命令。MUST 禁用配置自动查找、保留原配置/ignore 语义与显式 max-warnings;不得隐式 fix/cache/quiet 或替换规则。规划 MUST 有界,拒绝相对/跳转/控制字符、空/重复范围与输入输出冲突;物理路径别名、脚本/插件闭包、报告新鲜性和生效项目上下文仍须执行层核验。 - -#### Scenario: A selected project has file paths with spaces or shell metacharacters -- **WHEN** 显式原配置和源码路径合法但含空格或 Shell 元字符 -- **THEN** 逐项保留字面路径,Node 与 ESLint 参数分界明确,不能执行字符串中的 Shell 片段或隐式修复源码 - -#### Scenario: Caller freezes a warning threshold -- **WHEN** 本轮计划明确 max-warnings -- **THEN** 使用原生整数参数,反馈解析须核对同一冻结阈值;不通过 quiet 删除 warning 来制造通过 - -#### Scenario: Report slot aliases a planned input or argument budget is exceeded -- **WHEN** 词法输入输出冲突、范围重复/为空、路径不安全或规划预算超限 -- **THEN** 启动前拒绝计划,不写报告,不删除输入,不冒充已检查的干净范围 - -### Requirement: ESLint controlled execution SHALL bind version and current inputs - -Rust ESLint 执行层 MUST 在统一 runtime 中运行显式 Node/ESLint 入口,版本探测和扫描共享取消、绝对截止时间及有界日志。启动前 MUST 校验 Node、入口、原配置、所有显式源码的精确物理路径与摘要集合,使用私有的新鲜报告槽位;版本必须与冻结预期一致。版本探测后和扫描后 MUST 复核输入,输入改变或报告/进程异常为未完成,不构造源码违规或已修复结论。局部一致结果不得自证项目配置、JS 导入/插件闭包、可信工具批准或完整覆盖。 - -#### Scenario: Prior report exists or an input digest is missing -- **WHEN** 本轮报告槽位已有文件,或任何显式输入缺少冻结摘要 -- **THEN** 启动 Node 前拒绝执行;旧报告不能作为本轮证据 - -#### Scenario: Version or configuration changes during controlled execution -- **WHEN** 入口报告非预期版本,或版本探测/扫描后配置字节已变化 -- **THEN** 返回未完成;配置变化时可保留已解析诊断作调查线索,但不能签发局部一致、任务关闭或门禁通过 - -#### Scenario: A controlled report is coherent but project context remains unknown -- **WHEN** 实际进程返回与本轮文件、计数和退出码一致的 JSON,但项目配置归属或插件导入闭包未核验 -- **THEN** 只返回局部观察,不能升级为完整项目覆盖或批准的白名单处置 - -#### Scenario: An interrupted ESLint scan has already written a report or writes none -- **WHEN** 扫描启动后取消或共同截止时间到达,无论本轮报告已写出还是尚未生成 -- **THEN** 保留 request_cancelled 或 request_deadline_exceeded 原因,不降级成一般报告损坏,不把已写出的零诊断报告当作完成;后续指引不得要求智能体修改无关源码 - -### Requirement: ESLint configuration discovery SHALL distinguish candidates from effective configuration - -项目发现 MUST 静态记录六种原生 flat config 文件、旧 eslintrc 文件及 package.json eslintConfig 线索。MUST 绑定读到的配置/清单字节,保持嵌套配置所在根;发现不得执行 JS、隐式迁移旧配置或套用默认规则。静态存在不能证明逐文件规则、选中配置、TS loader 或插件闭包生效;未发现候选也不能断言外部配置或显式调用参数不存在。MUST 返回具体未确认原因及原生核查动作,不制造源码违规或白名单批准。 - -#### Scenario: Several flat configuration candidates exist in one root -- **WHEN** 同一目录存在多种 flat config,当前项目调用上下文尚未解析 -- **THEN** 分别记录候选与配置选择未确认,不任意拼接规则或把候选认定为已启用 - -#### Scenario: A nested Node package contains a TypeScript configuration -- **WHEN** 根目录有 JS flat config,子包有 TS/MTS/CTS flat config -- **THEN** 保留不同配置所在根,要求原生逐文件归属与 TS loader 核查;不把根规则强加子包 - -#### Scenario: No flat config is observed or only legacy declaration exists -- **WHEN** package.json 所在根没有观察到 flat config,或包含旧 eslintConfig -- **THEN** 说明未观察到配置或需原工具版本上下文,提供准备动作;不创建默认配置、不报告源码违规 - -#### Scenario: Node manifest changes or becomes unreadable during discovery -- **WHEN** ESLint 线索复核读取的 package.json 与本轮清单摘要不一致或不可读取,即使同目录已有 flat config -- **THEN** 标记发现不完整并保留清单阻塞路径和具体准备原因,不能隐藏为普通未知配置或据此把初始化画像标新鲜 - -#### Scenario: Standalone JavaScript or TypeScript source has no package manifest -- **WHEN** 项目中观察到独立 JS/TS 源码但无 package.json 或根配置候选 -- **THEN** 返回配置未观察到的待准备线索及源码引用,不安装包、不创建清单或默认规则,也不省略检查准备反馈 - -### Requirement: npm native audit observation SHALL retain protocol and coverage boundaries - -Rust npm审计适配 MUST 核对具体原工具版本、auditReportVersion、冻结审计阈值的退出契约、原生组件和汇总计数,拒绝重复JSON键及路径越界。原生advisory source编号 MUST NOT 冒充CVE编号,受影响范围 MUST NOT 冒充锁文件解析版本,间接via关系 MUST NOT 复制成直接advisory。直接advisory高危而组件被降级的报告矛盾 MUST 为未完成。静态脚本声明、锁文件存在及离线零诊断均不能证明当前依赖图、漏洞库时效或完整策略覆盖。 - -#### Scenario: Native audit reports a vulnerability and exits one -- **WHEN** 原生报告按本轮阈值返回退出1且组件/计数一致 -- **THEN** 保留原生易受影响组件、严重度、节点、范围及关系观察,不把退出1当作工具故障,不自动签发批准漏洞身份或白名单 - -#### Scenario: Native audit lacks a lock or emits a contradictory report -- **WHEN** npm返回error对象、报告损坏、版本不同、计数不一致或定位越界 -- **THEN** 返回未完成和具体原因,不构造源码违规或干净审计 - -#### Scenario: Offline audit reports no dependencies -- **WHEN** 显式原工具在私有缓存及用户/全局配置下离线审计空锁文件并返回零发现 -- **THEN** 只记录该原生报告一致;不安装依赖、执行fix或项目脚本,不将离线/零依赖观察推广为完整CVE门禁 - -#### Scenario: A package script merely mentions npm audit -- **WHEN** 脚本含复合Shell命令或自定义参数,而非已识别的明确原生命令声明 -- **THEN** 静态配置标记需原上下文复核,不执行脚本;没有观察到声明也不能证明外部CI未配置审计 - -#### Scenario: npm input-bound runtime observations require unchanged original inputs -- **WHEN** 调用者冻结Node/npm、清单、锁、用户/全局配置及存在的项目npmrc,原生审计在统一runtime中执行 -- **THEN** 精确核对输入摘要集合及具体版本,版本和审计沿用相同显式上下文,共用取消与截止;输入变更或新增此前不存在的项目npmrc时返回未完成且不提供可关闭任务的parsed结论;stdout报告有界解析并核对锁节点,局部一致不证明工具模块闭包、数据库覆盖或交付权威 - -#### Scenario: Per-root npm audit declarations enter discovery and plan previews -- **WHEN** 项目包含多个package.json,脚本分别为明确audit、未观察到audit、自定义复合调用或畸形声明 -- **THEN** 按每个构建根保留configured/missing/unknown/invalid及下一步,不执行脚本、不从未观察到脚本推断外部CI缺失;重读清单变化或不可读时标记观察未完成,不能沿用旧声明;TypeScript/JavaScript语言别名及all的计划预览保留node检查器,但不宣称执行或有效质量门禁 - -#### Scenario: Explicit npm audit registry supports native advisory validation -- **WHEN** 调用者明确选择无凭据HTTPS审计源,或仅用于验收的loopback HTTP源 -- **THEN** 原生命令固定registry与audit-registry、不经shell、不安装或执行项目脚本;保留原生advisory source及具体锁节点,不将受控服务夹具或成功请求当作可信数据库时效与CVE通过;认证、系统级网络隔离及完整数据库来源仍需独立核验 - -#### Scenario: Offline nonempty npm audit returns zero observations -- **WHEN** 私有空缓存、非空锁文件和离线原生命令返回退出0及零漏洞 -- **THEN** 可以保留原生依赖数量及锁文件节点观察,但漏洞库覆盖仍为not_evaluated,不推断当前数据库新鲜、网络查询成功、组件安全或CVE检查通过;报告解析一致性不得授予门禁权威 - -#### Scenario: Native npm audit locations require resolved lock identities -- **WHEN** 原生审计返回组件节点位置,需要关联 npm v3 锁文件版本 -- **THEN** 按具体安装位置核对包名与明确解析版本,不将受影响范围当版本、不合并不同位置的同名包;节点数量、名称或位置不一致以及重复字段、链接、别名或不支持结构均为未完成,不能批准白名单或交付通过;节点关联不声称依赖边、直接性或漏洞范围已核验 - -### Requirement: ESLint task recheck SHALL observe the original effective rule - -原 ESLint finding 在同配置复检中未出现时,Rust MUST 使用原工具的逐文件有效配置查询核对原规则;MUST 保留显式原入口、配置、cwd、统一截止时间及输入前后复核。关闭、缺失或无法确认规则不得解释为源码修复或白名单批准。输出 MUST 只展示脱敏规则级别、原因及摘要,不执行报告中的指令、不把完整配置投影到对话。局部规则观察不能自证完整导入闭包或批准覆盖。 - -#### Scenario: An imported configuration disables the original rule -- **WHEN** 主配置及源码字节不变,但导入配置使原规则关闭或不再出现,原生扫描零诊断 -- **THEN** 返回 rule_coverage_requires_review,任务保持 open,next 指向配置与批准依据核查,不建议修改无关源码 - -#### Scenario: Effective settings query fails or changes inputs -- **WHEN** 原生查询损坏、被忽略目标返回 undefined、超时或显式输入前后不一致 -- **THEN** 保留未完成及具体原因,不据零诊断产生修复候选或有效白名单 - -#### Scenario: User cancels while effective settings are being queried -- **WHEN** 扫描已返回诊断,但用户在同轮有效配置查询期间取消请求 -- **THEN** 反馈保留 request_cancelled 与未完成,回收查询进程组并释放自有租约,不将中断保存为正常的 still_present 或问题消失复检事件;原始 finding 与任务继续保留 - -#### Scenario: A project-local plugin reports an original rule -- **WHEN** 项目原配置加载本地插件并报告带命名空间的规则,源码修复后同配置复检不再报告该规则 -- **THEN** 原生发现及任务保留完整插件规则 ID,查询同一规则是否仍启用,保留原插件与配置;局部一致仅生成待批准覆盖核验候选,不能据此声称完整插件闭包或正式关闭 - -### Requirement: Public ESLint local feedback SHALL retain uncertainty and explicit context - -`lint typescript` 的原生接入 MUST 明确 Node、ESLint JS 入口、具体版本、项目原 flat config 及原工作目录,不能从配置所在目录猜测原调用上下文。上下文缺失 MUST 返回准备动作而不安装工具、套默认规则或制造源码违规。当前显式单文件范围 MUST 明示局部覆盖,目录未调度时不能视为已检查;JSON/human反馈 MUST 保留原生规则、位置、严重度及未完成原因,避免泄露原生敏感消息。局部零诊断也 MUST NOT 签发项目门禁或关闭任务;未接持久任务时须明示未接入。 - -#### Scenario: Explicit directory uses one selected native configuration -- **WHEN** 调用者选择目录、明确原生入口/配置/cwd,目录内有多个 JS/TS 文件 -- **THEN** 有界枚举并逐文件调用原工具,共享截止时间,分别保留仓库相对定位、诊断、同步状态和准备任务;核对枚举与显式输入前后变化,列出跳过项和未执行文件,不能暗示已自动选择 monorepo 子配置或完整覆盖 - -#### Scenario: Caller selects separate monorepo project contexts -- **WHEN** 调用者通过有版本的显式映射,为子项目根分别指定原配置及cwd -- **THEN** 按路径组件选择最深匹配根,未命中范围沿用原参数;拒绝重复根、越界/链接、未知字段及不可读上下文,反馈逐文件的选择来源与范围。映射和选中输入在执行前后核对,变化则保留已取得结果并停止未执行范围;映射不能自行批准规则、覆盖或白名单 - -#### Scenario: A directory file fails while others produce findings -- **WHEN** 一个文件报告/执行未完成或工作台保存失败,其它文件已有原生发现 -- **THEN** 保留各文件发现和具体故障,目录状态为 incomplete;取消/超时保留原因和未执行清单,不能把未执行文件称干净 - -#### Scenario: The original ESLint configuration is itself source code -- **WHEN** 本轮源码目标恰为同一个原 flat config 文件 -- **THEN** 可共享同一个只读字节身份,扫描与同步核对同一摘要;重复源码、其它工具输入别名及报告覆盖输入仍拒绝,不为绕过冲突排除配置源码 - -#### Scenario: Public lint has no explicit native execution context -- **WHEN** 用户请求 lint typescript 但缺显式入口、版本、原配置或工作目录 -- **THEN** 返回配置/环境准备反馈,无源码finding,门禁未判定,不自动创建或迁移配置 - -#### Scenario: Public native finding disappears after a same-configuration repair -- **WHEN** 原生工具先检出规则,再用相同原配置检查已修复文件而零诊断 -- **THEN** 对话分别展示原发现及局部零诊断,仍明确完整项目覆盖和策略未核验;未接持久任务时不虚构关闭事件 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md deleted file mode 100644 index 48bd583..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/project-initialization/spec.md +++ /dev/null @@ -1,137 +0,0 @@ -## Purpose - -定义 init 对项目语言、版本、构建器、模块关系和架构证据的观察与持久化,以及 AGENTS.md 受管摘要的生成边界,使智能体依据真实项目上下文选择检查和修复动作。 - -## ADDED Requirements - -### Requirement: Initialization SHALL build an evidence bound project profile - -init MUST 识别指定项目边界、各构建根、语言/方言、项目版本、语言目标、构建器/包管理器、框架、源集、现有质量配置及检查前置条件。声明、锁定/解析、本机安装版本 MUST 分开;每项附来源和内容身份,未观察到的事实 MUST 标 unknown,不从主语言或本机版本猜测其它模块。读取范围 MUST 遵循批准扫描与配置发现政策。 - -#### Scenario: Multiple build roots use different languages -- **WHEN** 一个项目含 Java、TypeScript 和 Python 构建根 -- **THEN** 逐根保留语言、版本及构建配置,不以主语言覆盖其它根 - -#### Scenario: Installed runtime differs from the declared target -- **WHEN** 项目声明 Java 17,本机为 JDK 21 或尚未探测 -- **THEN** 项目目标仍是 Java 17,本机证据独立记录或 unknown - -#### Scenario: Different manifests declare different Java or Rust targets -- **WHEN** 多个 POM/Cargo 清单分别直接声明不同 compiler release/source/target 或 rust-version/edition -- **THEN** 按清单保留 declared_only 目标及原始字节来源,不以单个全局语言版本覆盖其它根;包版本、本机版本和有效模型解析保持独立,继承、变量、重复或非法字段不猜测为已知目标 - -#### Scenario: Maven or Cargo package version is directly declared -- **WHEN** POM/Cargo 清单直接声明项目包版本 -- **THEN** 按清单记录 package_declared_versions,依据同次原始清单摘要;不把项目版本当语言目标、本机版本或已解析依赖版本。父/profile/workspace 继承、变量、重复、错误类型或非法值保持未知,刷新保留人工工作记录 - -### Requirement: Architecture observations SHALL not become unapproved rules - -架构画像 MUST 分别描述表现层、领域组织、依赖结构和部署单元,允许多种风格并存。结论 MUST 区分 declared/observed/inferred/confirmed/unknown/stale,并保留依据。目录名、模型判断或相互冲突文档 MUST NOT 自动激活架构阻断规则;批准约束与观察结果必须分离。 - -#### Scenario: Domain and controller directories exist without a design declaration -- **WHEN** 仓库仅有 domain/controller 命名线索 -- **THEN** 最多产生候选架构及确认任务,不认定已采用 DDD 或强制重构 - -#### Scenario: Documentation conflicts with source dependencies -- **WHEN** 文档声明的分层与实际观察不同 -- **THEN** 同时保留证据和冲突,不选择较松约束或伪称架构已验证 - -### Requirement: Module graphs SHALL preserve relation types and uncertainty - -模块图 MUST 区分构建聚合、构建依赖、源码引用、外部组件及声明的服务/业务关系,附范围、条件和来源。动态关系、未知 profile/feature 或不完整源码图 MUST 明示 unresolved;不能用缺边证明无依赖或缩小检查范围。既有 CodeGraph 证据 MUST 核对身份,init 不得自动安装/初始化/更新索引。 - -#### Scenario: Aggregated modules have no dependency edge -- **WHEN** 构建根仅声明两个子模块 -- **THEN** 生成 contains 边,不虚构子模块间依赖 - -#### Scenario: Maven declares a local dependency with explicit coordinates -- **WHEN** 项目内 POM 声明完整且唯一的 group/artifact/version,并直接依赖另一个具有相同完整坐标的本地构建根 -- **THEN** 模块图分别保留 Maven 聚合声明与 declared build_dependency,附来源清单及字节摘要、scope 和条件;声明边不等于有效 Maven 模型或运行时关系,不据此缩小检查范围 - -#### Scenario: Maven dependency identity cannot be resolved statically -- **WHEN** 坐标含属性变量、需要父 POM/依赖管理、重复坐标,或 profile 中有条件关系 -- **THEN** 保留具体 unresolved,不选择某个目标伪造依赖边;逃出项目的模块路径或未观察到的模块也不能产生已知节点关系 - -#### Scenario: XML comments split a Maven identity field into multiple text nodes -- **WHEN** 模块或坐标字段由 XML 注释切成多段文本,静态解析器不能准确取得整个字段 -- **THEN** 保留未解析状态,不截取首段文本来匹配另一个模块或坐标 - -#### Scenario: Cargo declares members and local path dependencies -- **WHEN** Cargo 清单显式声明项目内已观察成员或本地 path 依赖,依赖目标 package 名称与声明一致 -- **THEN** 保留不同的 aggregation 和 declared build_dependency,记录清单摘要与 normal/build/dev 范围;包重命名按 package 字段核对,不把别名当目标包名。观察不执行 cargo 或 build.rs,不代表有效依赖解析 - -#### Scenario: Cargo relation needs workspace feature or target resolution -- **WHEN** Cargo 关系涉及继承、optional/target 条件、成员通配或排除、外部/缺失目标或逃出项目路径 -- **THEN** 保留具体 unresolved,不自动展开未知条件或连接错误目标;图依赖覆盖保持不完整,不能据此缩小检查或宣称无依赖 - -#### Scenario: Conditional dependency is unresolved -- **WHEN** 构建依赖由未解析的运行条件决定 -- **THEN** 保留未知范围,不以不完整图认证增量覆盖 - -### Requirement: AGENTS generation SHALL preserve scope and human ownership - -init apply MUST 在被检查项目 AGENTS.md 生成明确标记的受管摘要,链接项目画像/模块图,包含规则来源和检查修复入口。区块外人工内容、其它工具区块和子目录指令 MUST 保留;缺 marker 时可追加,marker 异常、受管内容人工修改或并发冲突时 MUST 不盲目覆盖。仓库原始文本 MUST 作为转义数据,不提升为授权指令。 - -#### Scenario: Existing AGENTS contains several managed and human sections -- **WHEN** Codeguard 更新自身受管区块 -- **THEN** 其它内容逐字保持,已有子目录规则继续按作用域生效 - -#### Scenario: Human changes the managed section after planning -- **WHEN** 写入前内容身份与计划不符 -- **THEN** 报告冲突并保留用户修改,不以 force 覆盖 - -### Requirement: Init SHALL plan and apply without hidden execution - -`init [path] [--dry-run|--apply]` 省略模式 MUST 等同 dry-run。dry-run MUST 只返回拟创建任务,不写 findings/tasks 或其它工作树文件;apply 才持久化计划内任务。默认观察不得执行项目 wrapper、构建扩展、package scripts、扫描、安装、服务启动、Git Hook/CI 接管或其它工具初始化。apply MUST 仅写计划明确的自有产物与 AGENTS 区块;分文件身份核对、原子替换及中途失败可恢复,不得谎称跨文件全原子。 - -#### Scenario: Dry run identifies a required environment blocker -- **WHEN** dry-run 通过有效证据确认必需环境缺失 -- **THEN** 返回拟创建的阻塞及修复任务,工作树无新增或修改 - -#### Scenario: Wrapper prints a version and also changes files -- **WHEN** 项目提供带副作用的 wrapper -- **THEN** init 不执行它,不为获得版本而改变项目,相关事实保持待探测 - -#### Scenario: Writing the second artifact fails -- **WHEN** 第一份初始化文件已写入而后续文件写入失败 -- **THEN** 返回部分未完成,记录可恢复进度,不覆盖并发修改或称全部成功 - -### Requirement: Profile refresh SHALL preserve findings and detect stale inputs - -项目画像与图 MUST 以结构化产物保存,AGENTS/架构 Markdown 是投影,不是政策权威。重复 init MUST 幂等;manifest、锁、规则、相关源码或文件集合增删变化后 MUST 标过期并重算受影响画像。刷新 MUST 保留发现、修复事件与人工备注,不能重建空任务清单冒充问题已解决。 - -#### Scenario: A module is added after initialization -- **WHEN** 新增模块或构建清单,不属于上次读取的文件集合 -- **THEN** 仍识别画像失效并更新模块图,不仅比较旧文件哈希 - -### Requirement: Initialization status SHALL be separate from quality readiness - -init MUST 分别报告操作完成状态和检查前置准备状态。文件生成成功不证明工具可用、检查通过或交付 allow;缺工具/环境/必要信息 MUST 规划相应 blocker/决策/探测任务,在 apply 时持久化,并给出 doctor/check/sync/next 的后续动作。readiness MUST 依据批准检查义务和选中适配器的适用必需前置条件:已确认必需条件缺失、不兼容或冲突优先为 incomplete;否则,集合未确定、无适用义务或存在未探测/未解析/过期证据为 unknown;否则全部具有有效满足证据才为 ready。可选工具缺失 MUST NOT 阻塞此汇总,未探测 MUST NOT 伪称缺失。首次扫描 MUST 不自动豁免存量问题。未知架构仅在必需规则依赖它时影响相应检查,不强迫所有项目先选择架构风格。 - -#### Scenario: An optional tool is missing and a required runtime is unprobed -- **WHEN** 可选工具已确认缺失,而必需运行时尚无有效探测证据,且无其它已确认必需阻塞 -- **THEN** readiness 为 unknown,生成必需运行时探测计划,不因可选工具缺失返回 incomplete - -#### Scenario: Required preparation evidence is stale or belongs to another binding -- **WHEN** 必需前置证据过期、来自不同策略/目标/工具绑定,或可信时钟/来源尚未核验 -- **THEN** 不能沿用旧 satisfied 或 missing 结论;该前置为 unknown 并要求复核。只有本轮有效的必需缺失/不兼容/冲突优先产生 incomplete,可选条件的失败不改变汇总 - -#### Scenario: Preparation is ready but checks have not run -- **WHEN** 全部已确定适用必需前置有有效满足证据,readiness 为 ready -- **THEN** ready 仅表示前置准备,不代表原生检查完成、没有 finding 或交付 allow;无适用必需集合、集合未完整确认或重复/歧义归属不能因零阻塞而返回 ready - -#### Scenario: Files are initialized but JDK is missing -- **WHEN** 工作区和 AGENTS 生成成功但 Java 工具链未准备 -- **THEN** init 可返回操作成功,同时 readiness=incomplete、准备任务可见,交付未经认证 - -#### Scenario: Preparation tasks retain identity without retaining stale diagnoses -- **WHEN** 同一必需前置的输入绑定或观察状态变化,需要重新规划准备任务 -- **THEN** 任务以工作区内前置标识保持稳定逻辑键,更新本轮绑定;有效缺失、不兼容、冲突分别给出恢复、兼容性复核、冲突决策动作,未知/过期/错绑定仅要求重新核验,不沿用旧缺失诊断。可选、不适用、已满足前置不生成修复任务,未核验来源或歧义要求不能生成可执行任务;规划不自动安装、执行命令或授予交付通过,关闭须重新取得当前有效满足证据 - -#### Scenario: Initialization observations are returned to the agent conversation -- **WHEN** init 以 dry-run 或 apply 观察了语言、构建根及逐清单语言目标 -- **THEN** JSON 与 human 均反馈对应观察摘要、声明与未知状态;dry-run 不要求先写文件才能看到结果。摘要不执行工具、不暴露原始清单内容或本机根路径,也不把文件生成/目标声明变成质量通过;项目路径等不可信文本不能伪造终端指令或状态行 - -#### Scenario: Initialization returns checker configuration separately from execution -- **WHEN** 只读发现器观察检查器的 configured/missing/invalid/unknown 状态 -- **THEN** init 按构建根反馈状态、来源、原因和下一步,执行状态固定 not_run;配置清单不完整和义务尚未绑定必须明示。未配置不能自动变成代码违规,配置已声明不能自动变成执行成功或准备就绪,摘要不自动启用/豁免检查器 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md deleted file mode 100644 index 6f59918..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/remediation-workflow/spec.md +++ /dev/null @@ -1,427 +0,0 @@ -## Purpose - -定义项目内持久的问题、环境阻塞、修复任务和复检事件,使智能体能够恢复上下文并逐步完成修复,同时保证任务文件、人工勾选和删除记录不能替代原生工具的验收证据。 - -## ADDED Requirements - -### Requirement: npm remediation tasks SHALL recheck through their original native audit service -npm持久任务 SHALL 支持 task verify,结构化任务根决定原生cwd,显式原工具上下文、共享预算与任务租约保护复检和持久化。结果 SHALL 反馈原生诊断及下一步,不从零漏洞推导完整覆盖或关闭。 - -#### Scenario: npm native audit is coherent but coverage remains unverified -- **WHEN** 原生版本、输入摘要与锁节点关联一致,本轮没有advisory但可信漏洞覆盖尚未核验 -- **THEN** 记录局部复检并保持同一任务open,返回still_blocked;next说明需核验漏洞源覆盖及时效,不标记代码修复或白名单通过 - -#### Scenario: npm recheck fails after a repair attempt -- **WHEN** 持有有效租约的执行者结束修复尝试后,原生审计返回错误 -- **THEN** 记录关联该尝试的incomplete复检及诊断,任务仍open;next提供具体检查指引,不继续声称尚未运行复检或创建源码违规 - -#### Scenario: npm inputs change after a recorded recheck -- **WHEN** 清单或锁文件改变,旧复检结果与当前输入不再一致 -- **THEN** 历史记录保留但不作为当前结果,next与尝试历史要求原工具重新复检,不能沿用旧的零发现或恢复结论 - -#### Scenario: npm verification receipts are rewritten or assigned to another root -- **WHEN** 本地报告、验证事件和消费收据一并改写摘要,但报告包含重复字段、无效结构、虚构覆盖/权威,或对应另一工作区/构建根 -- **THEN** next和尝试历史拒绝该复检证据,返回具体证据异常而非输入过期;incomplete失败结果也不得用于确认另一任务的修复尝试已经复检。合法旧输入变化须单独给原工具重检指引 - -### Requirement: npm child projects SHALL preserve explicit workspace ownership -公开 npm 审计 SHALL 支持显式父工作区参数,原工具在子项目执行,报告与任务归属所选已初始化工作区;未指定参数不得自动寻找父工作区。 - -#### Scenario: Two npm children share one initialized workspace -- **WHEN** 两个子项目分别指定同一父工作区并重复审计 -- **THEN** 每个构建根保留一张稳定完整性任务,原生 cwd 保持对应子项目,预算默认来自所选工作区,next 复检命令保留显式工作区 - -#### Scenario: npm workspace is an alias or excludes the project -- **WHEN** 显式工作区是符号链接别名或不包含项目的物理目录 -- **THEN** 在原生执行前返回准备未完成,不把外部项目记录为工作区任务;路径组件 a 不包含兄弟 ab - -### Requirement: Local doctor observations SHALL enter the remediation queue without granting readiness - -已初始化工作区的 doctor 局部报告 MUST 绑定当前工作区身份并以 run_id/摘要幂等同步;未初始化或无效工作区不得自动初始化或写入其它路径。显式版本诊断失败可生成稳定的环境调查任务,诊断原因变化或重复运行不得创建同一前置的重复任务;未选工具不得伪造工具缺失或必需检查。任务 MUST 引用报告、具体诊断、允许环境范围、原生 doctor 复检及历史/关闭条件;原生版本恢复不自动关闭原问题、授予准备 ready 或质量通过。工作区不符、被改报告或伪造完成/批准字段 MUST 拒绝导入;持久化/同步失败须如实反馈,保留原生观察而非改写为已修复。 - -#### Scenario: A selected version probe fails twice -- **WHEN** 同一工作区显式选中的 Ruff 版本探测重复失败 -- **THEN** 每次报告保留自己的 run_id,关联同一环境调查任务;再次同步同一报告不重复写任务,next 给 doctor 复检和环境恢复指引,不修改无关源码 - -#### Scenario: A later version probe succeeds -- **WHEN** 原环境调查仍待处理,本次局部原生版本恢复正常 -- **THEN** 保留成功观察及未关闭任务,要求核验前置要求/可信来源;不得把局部版本成功写成质量修复或允许交付 - -#### Scenario: An agent verifies a doctor investigation task -- **WHEN** 智能体对 doctor 环境任务执行 task verify 并显式选择原生工具 -- **THEN** 复用同一版本诊断契约、预算和任务租约,以报告摘要保存复检事件;失败保留具体原因,成功标记环境恢复但策略未核验,任务保持 open。未选择工具为 incomplete,不隐式发现随机 PATH 工具或扫描源码 - -### Requirement: Projects SHALL have an explicitly initialized remediation workspace - -Codeguard MUST 支持 `./.codeguard/` 及其中的 .gitignore、工作区清单、脱敏 findings/events、任务与决策引用;原始 reports/runs/cache/worktrees/state MUST 默认 Git 忽略。初始化 MUST 提供 dry-run/apply,不覆盖已有用户文件,不创建第二份质量策略。 - -#### Scenario: User files and legacy workspace coexist -- **WHEN** 初始化遇到 `.codeguard/` 中的冲突文件,或在 `codeguard/workspace.json` 发现旧版受管工作区 -- **THEN** 给出精确冲突与迁移诊断,不覆盖文件、不静默创建第二份工作区;既有 `codeguard/src/` 用户源码仍参加普通检查,不能整体搬入点目录 - -### Requirement: Findings and environment blockers SHALL produce distinct actionable tasks - -持久同步 MUST 区分真实 finding 与检查未完成的 blocker,按稳定身份归并重复发现、保留原规则与证据。部分报告 MUST 只能增加有效发现/阻塞,不能因缺失旧 finding 自动关闭。任务 MUST 包含问题依据、允许改动、修复步骤、前置依赖、复检条件及历史尝试。 - -同步 MUST 按 run_id 幂等消费所有未导入且身份匹配的报告,不能仅取最新一份而丢弃其他类别发现。过时报告只能成为历史,完整报告也不得跨未覆盖范围关闭问题。 - -RunReport 与准备诊断 PrerequisiteReport MUST 使用 workspace_id + run_id 作为导入幂等键并验证报告摘要;同键不同摘要 MUST 拒绝而不是覆盖。每份报告的事件提交与消费标记 MUST 可恢复,失败不得先推进游标;准备诊断只能形成对应blocker/恢复证据,不伪装源码检查结果。 - -#### Scenario: Ten scans report the same issue -- **WHEN** 同一内容/策略下多次检出同一个问题 -- **THEN** 保留一个稳定 issue 和本地运行历史,不生成十个任务或无意义 tracked 文件变化 - -#### Scenario: Missing JDK prevents several checks -- **WHEN** 多个模块因同一 JDK 缺失未完成 -- **THEN** 生成工具链 blocker 与依赖关系,不虚构多条代码违规 - -#### Scenario: Lint and CVE reports await import -- **WHEN** 同一内容先产生 lint 报告再产生 CVE 报告 -- **THEN** 同步纳入两者,重复同步不重复创建问题或事件 - -#### Scenario: CVE advisory is observed without a qualified vulnerability database -- **WHEN** 原生 OWASP 报告包含 advisory,但数据库时效或依赖归属尚未核验,且工作区已启用持久同步 -- **THEN** 保留脱敏报告并生成稳定的环境/证据阻塞任务,列明原工具复检与库核验步骤;重复扫描不制造多张同身份任务,不将 advisory 直接写成已确认源码 finding、误报白名单或交付通过 - -#### Scenario: Rust CVE observation is rechecked before database qualification -- **WHEN** 已初始化 Rust 工作区反复执行原生 cargo-audit 检查,并对同一未核验漏洞库任务执行 `task verify` -- **THEN** 同一构建根只保留一张稳定的 CVE 覆盖阻塞任务,更新原生 advisory 观察与复检历史;`next` 继续给出原工具及漏洞库核验步骤,任务仍为 open。本地报告、任务勾选或白名单候选均不能替代受信漏洞库时效和批准身份 - -#### Scenario: Doctor report is imported twice or changes under the same identity -- **WHEN** 同一准备报告重复导入,或同一run_id出现不同摘要 -- **THEN** 相同报告幂等,不同摘要拒绝并保留冲突,不重复任务或覆盖证据 - -#### Scenario: Synchronization stops between event and cursor persistence -- **WHEN** 事件已写入但消费标记尚未持久化时中断 -- **THEN** 重试恢复同一事务,不漏事件、不重复计数;一份坏报告不妨碍其它有效报告持久化,整体仍明确未完成 - -#### Scenario: A crashed process leaves a staging file and its PID is reused -- **WHEN** `write_once` 的旧临时文件名已存在,但目标记录仍未写入 -- **THEN** 重试 MUST 以有界的新独占临时文件名继续,不覆盖或删除残留文件;若名字空间耗尽则明确未完成,不伪造消费标记 - -#### Scenario: A malformed report remains after other reports are imported -- **WHEN** 一份坏报告重复同步失败,而同队列的有效 lint 和 CVE 报告已导入 -- **THEN** 保留按报告摘要绑定的脱敏失败原因;`next` 指向修复该报告或检查器,不无限重复推荐未改变输入的 `work sync`;报告内容改变后旧失败观察不得继续适用,整体交付仍未评估 - -#### Scenario: Two processes import the same workspace -- **WHEN** 一个 `work sync` 已持有工作区导入锁,另一个进程尝试同步同一工作区 -- **THEN** 后者在写 finding、任务、事件或消费标记前返回未完成并说明忙碌;锁释放后重试幂等恢复,不凭本地锁状态签发质量结论 - -### Requirement: Closing a task SHALL require verified resolution evidence - -正式 resolved MUST 由真实复检或有批准依据的 target_removed/policy_resolved 事件产生,并绑定问题、内容、规则/工具、策略和覆盖身份。代码修复、依赖修复、环境恢复、政策处置 MUST 分开归因。手工勾选、编辑状态、删除记录、增加忽略或未完成报告中不再出现 MUST NOT 关闭问题或改变 gate。例外 MUST 保留未解决事实。 - -#### Scenario: Agent checks a task as done without verification -- **WHEN** 任务 Markdown 被标为完成但无有效复检 -- **THEN** 正式状态仍待验证,交付判定不变 - -#### Scenario: Verification times out after a patch -- **WHEN** 修复后的原检查器超时 -- **THEN** 原 finding 保留,转为待验证/阻塞,不自动 resolved - -#### Scenario: A resolved finding recurs -- **WHEN** 新内容再次检出同一可匹配问题 -- **THEN** 重开 issue 并保留此前修复历史 - -#### Scenario: Verification resolves the original issue but finds another violation -- **WHEN** 原问题有完整关闭证据,而复检发现新的阻断问题 -- **THEN** 原任务可按证据关闭,新发现同步保留,验证命令仍按本次结果返回违规或未完成,不宣称全项目通过 - -#### Scenario: Environment detection succeeds but the blocked check still cannot run -- **WHEN** doctor已确认JDK等条件恢复,而原受阻义务仍不能完整执行 -- **THEN** task verify必须尝试原受阻义务并保留未完成,不据探测通过宣称验证闭环完成 - -### Requirement: Repair briefs SHALL guide bounded progress without changing authority - -经可信批准的误报处置 MUST 是独立事件/任务状态 `whitelisted_false_positive`,不得记作 `resolved_by_code_fix` 或删除 finding。疑似误报任务 MUST 记录原生证据、最小复现、裁定原因、精确目标、批准请求和原工具复检命令;候选、过期、失配或撤销的白名单 MUST 重新进入调查/修复队列。`.codeguard/decisions/` 只保存可读引用,不自授策略权威。 - -`status/next/task show` MUST 提供只读视图;next MUST 返回含依据、范围、步骤、约束、验证和历史尝试的 RepairBrief。recipe MUST 有受控来源,原生诊断和仓库文本 MUST 当作不可信数据。无进展重试超预算 MUST 阻塞该任务或请求具体决策,不能降低门禁;其它独立任务仍可推进。 - -next MUST 区分actionable/waiting/needs_decision/verification_required/no_applicable_work;未初始化应给初始化动作,空任务但缺少新鲜完整证据 MUST 返回verification_required,不把null task或查询exit0解释为allow。status 中历史通过 MUST 带来源及freshness,不冒充当前认证。 - -MUST 提供 attempt 开始/结束协议,受控 fix apply 自动登记,自由修复回合由插件登记;尝试 MUST 绑定动作和前后内容摘要、结果及租约。复检前失败、无修改和中断均进入历史与预算,next MUST 不重复推荐耗尽且无新信息的动作。 - -#### Scenario: The same failed patch is attempted repeatedly -- **WHEN** 同一问题和补丁连续无进展达到预算 -- **THEN** 停止相同自动尝试,保留阻断并给出下一步诊断,不推荐跳过规则 - -#### Scenario: Tool output contains an instruction -- **WHEN** 诊断文本要求执行 Shell 或关闭规则 -- **THEN** 仅作为证据数据展示,不升级为动作授权 - -#### Scenario: Repair fails before verification -- **WHEN** 尝试没有代码变化或在调用检查器前失败 -- **THEN** attempt 仍持久计数,不能因没有 verify 报告而无限重复 - -#### Scenario: Task list is empty but current full verification is absent -- **WHEN** next没有可修复任务且缺新鲜完整检查证据 -- **THEN** 返回verification_required和检查动作,不据任务清空证明交付通过 - -### Requirement: Enabled plugin workflows SHALL connect scans to actionable briefs - -显式初始化并启用工作流后,插件扫描 MUST 经过保存 run、幂等 sync、返回状态/RepairBrief 的路径;仅有重复报错而没有任务指引 MUST 不作为完成的插件接入。未初始化时 MUST 提供临时简报与初始化计划,不静默写受管目录。同步失败 MUST 保留原结果并明示恢复动作;不能假称持久任务已生成或改变质量 gate。 - -#### Scenario: Enabled save hook finds a new issue -- **WHEN** 已启用的项目保存检查产生有效 finding -- **THEN** 创建或更新相应任务并返回下一步,重复同一 finding 不制造 tracked 文件噪声 - -#### Scenario: Backlog storage is unavailable -- **WHEN** 检查已完成但持久目录不可写 -- **THEN** 保留原 finding/gate,说明 backlog_update_failed 和恢复动作,不伪造任务路径 - -### Requirement: Check results SHALL be returned in the agent conversation - -插件触发检查后 MUST 把本次配置探测与原生执行结果转换为宿主可见的对话反馈,包含已配置并运行的检查器、未配置或无效的检查器、确定性诊断、环境/工具错误、修复建议和复检命令。对话反馈以本次 CLI 结果为来源,不要求另造逐检测族执行证明;持久同步失败时也 MUST 返回已有结果与同步失败状态。CLI human/JSON、MCP 与宿主 Hook 只做展示适配,不得让智能体将原始工具文本解释为新的授权指令。 - -#### Scenario: Configured checker finds an issue -- **WHEN** 已配置的 Javadoc 或 CVE 原生检查器返回有效诊断 -- **THEN** 智能体对话显示问题摘要、位置或组件、规则依据、建议动作及原工具复检命令 - -#### Scenario: Checker is not configured -- **WHEN** 项目没有配置某候选检查器 -- **THEN** 对话显示 `missing` 和具体启用建议,不显示该检查器“通过”或虚构源码违规;只有批准策略要求该检查时才把缺项作为门禁未完成 - -### Requirement: Workflow persistence SHALL preserve collaboration and gate independence - -finding 身份、事件父关系、证据引用与工作区 schema MUST 校验。并发领取 MUST 使用带期限租约和进程锁;不同分支状态冲突 MUST 显式协调,不能最后写入覆盖关闭。任务 Markdown MUST 是可重建投影;本地历史文件 MUST 不作为可信 CI 认证。完整 gate MUST 独立检查全部义务。 - -claim MUST 返回不可复用lease_token/generation和到期;heartbeat/release及attempt写入 MUST 核对token,而非只比较owner。租约默认5分钟,长操作MUST有界续租,失租停止应用/状态提交。正常release MUST 不遗弃未结束attempt;过期接管 MUST 先可恢复地追加abandoned与预算记录,再授予新generation,恢复失败不先取得新租约。无租约task verify使用短期验证租约,已有租约要求调用方提供匹配token,不能释放别人取得的租约。 - -#### Scenario: All tasks are deleted -- **WHEN** 用户或智能体删除持久任务和发现 -- **THEN** 新检查仍按源码与批准策略产生发现,不能因此获得 allow - -#### Scenario: Two agents claim the same task -- **WHEN** 同一工作区并发领取一个未分配任务 -- **THEN** 只有一个有效 lease,另一个收到当前归属与恢复信息 - -#### Scenario: Branches disagree on resolution -- **WHEN** 合并事件存在相互矛盾的关闭状态 -- **THEN** 标记 reconciliation_required 并重新核对,不能自动选最后写入关闭 - -#### Scenario: An old owner writes after the task has been reclaimed -- **WHEN** 新generation的租约已生效,旧执行者尝试heartbeat/finish/release -- **THEN** 返回未完成并拒绝旧写入,同名owner也不能复活或释放新租约 - -#### Scenario: Reclaim cannot persist the abandoned attempt -- **WHEN** 过期租约的abandoned事件或预算记录写入失败 -- **THEN** 返回3且不授予新generation,成功重试只追加一次恢复事件并计数一次 - -#### Scenario: Verification owns or borrows a lease -- **WHEN** verify自行取得验证租约、携带有效调用方租约,或提供错误token -- **THEN** 自有租约收尾释放、借用租约保留;token错误时不启动检查器 - -### Requirement: Repair command handoffs SHALL bind attempts and leases explicitly - -attempt start MUST 接受来自受控简报的action-id并由CLI计算动作指纹、观察前置内容,返回attempt_id;finish新增结束事件 MUST 明确attempt-id及当前lease-token,记录观察变化与执行者说明,冲突结束拒绝,同结果重放幂等。已落盘结束收据的原请求重放只返回该收据,即便租约过期也不得再次写入或影响新租约。每任务只允许一个未结束attempt;换action名称不重置同一无进展动作预算。finish结果仅允许ready-to-verify/no-change/failed/blocked,不直接resolved。 - -fix MUST 支持task及成对owner/lease-token绑定;已领取任务复用有效租约,由FixService登记自己的受控attempt,不接管已有未结束自由attempt。未领取时可自行取得并仅释放自有租约。已初始化工作区的批量apply在补丁应用前取得全部受影响任务租约,冲突不能静默跳过;未初始化时只保留私有证据,不调用持久同步/租约,不声称持久任务存在。fix dry-run MUST 不登记正式修复尝试或消耗预算;apply自动登记,插件不得重复计数。 - -#### Scenario: Controlled fix is invoked for an already claimed task -- **WHEN** fix接收task、owner及有效lease-token,且没有未结束attempt -- **THEN** 限定任务范围并登记受控尝试和复检,保留调用方租约,不要求插件重复start/finish - -#### Scenario: The same attempt finish is retried -- **WHEN** 先前finish已持久化但响应丢失后调用方用同ID和结果重试 -- **THEN** 返回已记录结果而不重复预算/事件;不同结果的重复结束返回冲突 - -### Requirement: Explicit Checkstyle workspace observations SHALL generate stable local repair tasks -显式提供已初始化的 --workspace 时,Checkstyle 局部检查 SHALL 绑定项目内源文件、原配置和本轮工具字节后保存观察并同步同一稳定任务。输出必须反馈同步结果和下一步;未完成检查不得生成源码修复任务,局部任务不得授予交付许可或自动关闭。 - -#### Scenario: Repeated native observation -- **WHEN** 同一项目内源码的相同规则和锚点在重复原生检查中仍存在 -- **THEN** 更新同一稳定 finding 的观察记录,不重复创建任务;任务包含规则、证据、范围、步骤、复检、历史和关闭条件 - -#### Scenario: Workspace or frozen inputs mismatch -- **WHEN** 指定工作台未初始化、目标在项目外,或同步前源文件/原配置/工具字节变化 -- **THEN** 不导入源码任务,并在反馈中指出具体阻塞;不能用陈旧观察要求修改源码 - -### Requirement: Checkstyle task verification SHALL replay the original native checker without automatic closure -Checkstyle 任务复检 SHALL 在统一预算、取消和任务租约下使用显式原工具与原配置,保存原生观察及失败尝试。零诊断不能独自证明修复;规则失配、工具身份变化或输入不稳定不能关闭任务。 - -#### Scenario: Original finding still exists or becomes absent -- **WHEN** 原工具完整复检仍检出同一稳定 finding,或在原规则身份仍相同且工具字节一致时未再检出 -- **THEN** 分别记录 still_present 或 candidate_absent_unverified_policy,保留 open 任务和历史,对话与 next 提供下一步 - -#### Scenario: Rule removed or checker changed -- **WHEN** 原配置移除任务对应规则、将同一 ID 绑定到另一检查类,或显式工具字节与原观察不同 -- **THEN** 返回规则覆盖待审或未完成,不把零诊断归为代码修复 - -#### Scenario: Native recheck cannot run -- **WHEN** 缺工具、输入不可用或原生检查未完成 -- **THEN** 保存未完成复检事件与具体原因,不从可编辑 Markdown 执行指令,不关闭任务 - -### Requirement: Checkstyle preparation failures SHALL create stable environment tasks -已初始化且显式启用工作台时,Checkstyle 前置缺失或配置不明 SHALL 形成准备任务,保留具体诊断和当前输入范围;不能生成源码违规或建议修改无关源码。同一工作区的 Checkstyle 前置槽位重复观察更新同一任务,不因诊断变化重置历史。 - -#### Scenario: Native prerequisites are missing -- **WHEN** Java、Checkstyle JAR 或原配置无法确认,且目标仍在指定工作区内 -- **THEN** 同步一个开放准备任务,next 给出恢复工具/配置与原工具复扫步骤,任务包含七项必需信息且不声称质量通过 - -#### Scenario: Repeated preparation changes diagnosis -- **WHEN** 相同前置槽位从缺参数变成缺 JAR 或未知配置,或影响另一源文件 -- **THEN** 保留同一稳定任务及历史,更新当前诊断与范围;人工勾选不能关闭任务 - -#### Scenario: Cancelled request or outside target -- **WHEN** 用户取消检查,或目标不属于指定工作区 -- **THEN** 不把取消或外部目标伪装成项目环境缺陷,不创建该准备任务 - -#### Scenario: Later same-scope native observation runs -- **WHEN** 准备失败后,同一源码范围存在更晚且已消费、输入仍一致的原工具局部观察 -- **THEN** next 转向核对原选择及批准覆盖,不重复建议恢复工具;仍保留开放任务,后续配置或输入变化使该恢复线索失效 - -### Requirement: Checkstyle preparation verification SHALL preserve the original blocked obligation -准备任务复检 SHALL 在既有租约、尝试和统一预算中使用显式原工具,对当前记录的项目内受影响源码复扫。恢复后产生的原生 finding 应进入源码任务,环境恢复只作局部未验证观察,不自动关闭准备任务。 - -#### Scenario: Preparation remains blocked -- **WHEN** 原工具或配置仍不可用,准备任务接受一次复检 -- **THEN** 保存 still_blocked 或 incomplete 观察、具体原因与尝试引用,保留 open 状态,next 不引导修改无关源码 - -#### Scenario: Native preparation recheck runs -- **WHEN** 同一准备任务范围的显式 Checkstyle 检查正常返回局部原生报告 -- **THEN** 保存 environment_restored_unverified_policy,同步其中源码发现,并转向核验原选择、批准和完整覆盖;源码或配置再次变化不沿用恢复线索 - -#### Scenario: Ownership is invalid -- **WHEN** 任务有活动租约但复检者不持正确 owner/token -- **THEN** 不启动原生检查或保存恢复事件,保留原任务和租约 - -#### Scenario: Preparation retry remains blocked after a ready attempt -- **WHEN** 准备修复尝试已标记 ready-to-verify,原工具复检仍为 still_blocked 或 incomplete -- **THEN** 将复检绑定该尝试并累计同动作同输入的无进展次数;预算内恢复具体前置修复动作,预算耗尽后保留开放任务并要求具体诊断或决策,不能反复复检或更换动作名逃逸预算 - -#### Scenario: Inputs change after an attempt is finished -- **WHEN** 一次尝试已经标记 ready-to-verify,但在原工具复检前,任务绑定的源码、清单或锁文件又发生变化 -- **THEN** 新输入的复检不得归因于旧尝试;旧事件保留为历史,旧尝试不再阻塞新输入的动作,且不得用新结果重置旧输入的失败次数或宣称原修复成功 - -#### Scenario: Checkstyle tool changes after a recovery observation -- **WHEN** 准备恢复或源码暂未检出的复检后,原 Java 或 Checkstyle JAR 字节变化、路径身份变化或文件不可用 -- **THEN** next 与 task show 不沿用旧恢复或缺失结论,要求显式原工具重新复检;历史收据继续保留,不能通过旧恢复线索关闭任务 - -#### Scenario: Conversation consumers need a concrete invalidation reason -- **WHEN** 已有 Checkstyle 复检收据因本轮源码、配置或工具变化失效,或前置复检仍受阻 -- **THEN** next/task show 将历史原工具原因与当前观察失效原因分开表达,status 任务摘要保留具体原因与失效原因;智能体无需猜测为何需要再次修复或复检,也不能把查询成功当成交付通过 - -#### Scenario: Present Checkstyle finding is stale after a configuration edit -- **WHEN** 原工具复检仍检出原问题,之后 Checkstyle 配置或目标源码变化 -- **THEN** next/task show 显示当前输入失效原因,要求原工具重新复检;不能用旧 still_present 覆盖先前的失效判断并重新推荐旧源码修复步骤。历史原工具结果保留,任务不关闭 - -### Requirement: ESLint task identity SHALL bind native rule and stable source anchor - -ESLint 原生发现投影 MUST 使用工作区相对路径、原生规则、源码锚点及稳定出现序号,行号与整文件摘要只作本轮证据,不因插入空行而制造新任务身份。MUST 稳定排序并去除重复原生诊断;完整输入中的任一归属或定位无效则不得发布部分源码任务。源码定位 MUST 处理 UTF-16 列及 JavaScript 原生行终止符,不把字节长度当列范围。投影只记录脱敏诊断,不证明本轮报告来源、批准策略或问题关闭。 - -#### Scenario: Source moves by inserted blank lines or native wording changes -- **WHEN** 同一路径与规则的原源码锚点保持,行号或原生消息文字变化 -- **THEN** 稳定finding ID保持,当前行号及源码摘要更新,不把旧任务勾选当修复 - -#### Scenario: Native diagnostic order changes or includes duplicates -- **WHEN** 同轮报告乱序或重复同一原生诊断,或同一锚点在多个位置出现 -- **THEN** 排序与去重后身份确定,不同出现序号保持不同身份,报告顺序不制造额外任务 - -#### Scenario: One diagnostic has invalid scope or Unicode location -- **WHEN** 任一诊断不属于冻结原生文件、相对路径跳转、行越界或列超过原行UTF-16范围 -- **THEN** 拒绝整组任务投影,保持未完成并要求原工具或适配器核查,不生成部分源码修复任务 - -### Requirement: ESLint local observations SHALL feed stable repair records - -显式 `lint typescript --workspace` MUST 将当前输入复核后的脱敏局部观察入队并通过既有同步协议生成稳定 finding 与可读任务,重复扫描更新同一问题历史,不覆盖用户任务备注。报告 MUST 固定工作区、输入、原工作目录、版本及未批准状态;坏形状、输入变化、自称门禁允许或不正确投影不得导入。已消费历史 MUST 按原字节收据确认,不用当前源码重演旧观察。公开反馈 MUST 说明同步状态和 next 查询失败,不把队列异常说成源码违规。 - -`next` MUST 依据摘要绑定的当前已消费报告复核输入及首次工具/配置连续性;上下文改变、抑制、原生未完成或局部零诊断均须复检/核查,不能沿用旧源码修改指引。任务勾选不改变问题状态;当前没有正式关闭入口时保持开放。此局部闭环不证明完整源集、TS插件闭包或质量门禁。 - -#### Scenario: Repeated ESLint scans find the same native problem -- **WHEN** 本轮输入有效,同一稳定规则/源码锚点被重复检查,用户修改了任务备注或勾选文字 -- **THEN** 只保留一个稳定finding/任务,更新观察并保留用户文本,问题仍open且对话返回修复指引 - -#### Scenario: ESLint reports no current diagnostic after a repair -- **WHEN** 同工具/原配置复扫有效且本轮局部零诊断 -- **THEN** next要求覆盖和正式复检核查,不重复旧源码修复、不自行关闭任务或签发门禁 - -#### Scenario: A queued ESLint report self-authorizes or current configuration changes -- **WHEN** 新报告声称delivery_decision=allow,或next查询时当前输入与记录不一致 -- **THEN** 自授权报告导入失败且不增加源码任务;陈旧输入要求原工具复扫,不沿用旧修复步骤 -- **AND** ESLint 上下文失效的备用复检指引仍选择 ESLint 命令并显式要求核验工具、原配置和原工作目录,不回退其它语言检查器或猜测身份 - -### Requirement: ESLint incomplete prerequisites SHALL create investigation tasks - -显式工作区和当前有效源码目标下,缺调用上下文、工具或输入不可读、版本/报告/配置诊断等未完成结果 MUST 进入独立的环境与检查完整性任务;不得生成已确认源码违规或白名单批准。目标身份 MUST 固定工作区与具体源码范围,重复诊断更新同一稳定任务及脱敏历史。取消、外部目标、不支持范围或未初始化工作区不得伪造任务保存成功。解析或抑制诊断 MUST 指引复现根因,不默认认定环境或源码的唯一原因。 - -任务指引 MUST 依据最新摘要绑定的已消费报告及当前源码核验;同范围有较新的有效原工具观察时转为正式复检/覆盖核查,不继续要求修复旧环境诊断。局部恢复不得自行关闭准备任务。对话 human/JSON MUST 展示任务下一步和同步失败状态。 - -#### Scenario: Missing ESLint context repeats or another prerequisite fails -- **WHEN** 同一工作区源码缺Node/ESLint上下文,重复调用或后续诊断变为工具输入不可读 -- **THEN** 只保留一张环境任务,记录最新具体原因;不创建源码finding,不要求修改无关源码 - -#### Scenario: ESLint prerequisites recover locally -- **WHEN** 同范围较新的摘要绑定原工具报告已同步且当前输入有效 -- **THEN** 环境任务保持open,next转verification_required并要求核验当前结果与完整覆盖,不继续沿用旧故障诊断 - -#### Scenario: Native ESLint rejects an unknown configured rule -- **WHEN** 原ESLint因原配置引用不存在规则而无法完成正常报告 -- **THEN** 建立检查完整性任务,反馈当前失败原因及原配置复核指引;不能推导源码违规或质量通过 - -#### Scenario: Preparation target is outside the workspace -- **WHEN** 未完成请求的源码属于另一个工作区 -- **THEN** 返回source_outside_workspace且不创建本工作区环境任务或源码finding - -### Requirement: ESLint task verification SHALL retain native observations - -`task verify` MUST 支持ESLint源码任务与准备任务,复用已有租约、统一执行截止时间、同步及失败尝试预算。工具入口、具体版本、原配置和工作目录 MUST 由显式参数核验,不能执行任务Markdown或历史报告自动选择的程序。复检 MUST 固定任务目标、本轮输入及报告摘要;缺上下文也须明确未完成原因并保留开放状态,不能调用其它语言检查器。 - -源码任务 MUST 比较首次摘要绑定观察的Node、ESLint入口、原配置、版本和cwd连续性;变化只能要求规则/覆盖核查。原生抑制或失败不得作为修复完成。局部原问题消失只属于candidate_absent_unverified_policy;准备恢复只属于environment_restored_unverified_policy,均不自动关闭。next、status及尝试历史 MUST 能消费同一复检事件,较新复检不得被旧扫描覆盖为过期源码修复指引。 - -#### Scenario: ESLint task is verified without explicit native context -- **WHEN** 原任务有效但没有提供Node、ESLint入口、具体版本、原配置和cwd -- **THEN** 保存明确未完成的局部复检观察和开放事件,不执行默认工具、不签发修复完成 - -#### Scenario: ESLint native task remains or disappears after repair -- **WHEN** 显式原工具与原配置复扫正确完成,原稳定任务仍存在或已局部消失 -- **THEN** 分别记录still_present或candidate_absent_unverified_policy,保留任务开放;事件可被next和尝试预算一致读取 - -#### Scenario: ESLint original context changed or a task is suppressed -- **WHEN** 工具/原配置/cwd与首次观察不同,或原生报告显示注释抑制 -- **THEN** 要求规则覆盖核查或抑制复核,不能将零诊断记为resolved - -### Requirement: npm local audit observations SHALL enter persistent coverage repair tasks - -初始化工作区根中的显式npm公开CVE调用 MUST 保存脱敏观察,并通过现有同步器产生稳定CVE检查完整性任务。原生组件/advisory/锁版本观察 MUST 保留为未核验的报告信息,不转换成已确认源码漏洞、白名单批准或任务关闭。同一构建根的完整性义务保持单一稳定任务,具体执行诊断作为历史更新;原清单/锁摘要及节点归属须复核。重复字段、越界/未知结构、节点或版本冲突及已消费报告被篡改不得产生授权或新任务。当前局部任务可供next取得恢复环境、核对数据源与原工具复检步骤;尚未取得覆盖权威时零发现不能关闭。 - -#### Scenario: Repeated npm audit produces one persistent task -- **WHEN** 已初始化根重复运行同一原生npm局部审计 -- **THEN** 第一次保存报告与一张稳定任务,后续更新历史;next提供原npm复检指引,清单/锁身份不符或坏报告不产生新可信事实 - -#### Scenario: Local npm audit cannot confirm CVE closure -- **WHEN** 原生npm报告零发现但数据库覆盖未核验 -- **THEN** 稳定任务仍open、交付未判定;手动删除任务或白名单候选不能关闭CVE义务 - - -#### Scenario: npm execution context is missing before native startup -- **WHEN** 已初始化物理工作区中的 npm 构建根具有可读取且身份可绑定的清单和锁文件,但公开 CVE 调用、显式选择 npm 的 check all 或 task verify 缺少原生调用参数 -- **THEN** MUST 保存本地准备阻塞观察并关联同一稳定 npm 完整性任务;重复检查与补齐上下文后的原生报告不得产生另一张同义务任务。准备观察 MUST 标明 npm_execution_context_missing、零组件及空 advisory,不声称原生工具已启动、漏洞覆盖完整或源码存在漏洞;失败复检保留 incomplete 历史。未初始化、输入变化、路径别名、取消和预算耗尽不得制造可用证据 - - -#### Scenario: npm lockfile is absent before tool startup -- **WHEN** 已初始化物理工作区的 npm 构建根具有可绑定清单,操作系统明确报告 package-lock.json 不存在 -- **THEN** MUST 在启动原生工具前保留 npm_lock_missing 环境阻塞,使用明确 missing 状态及空锁摘要、零组件和空 advisory,不虚构锁文件内容。公开CVE、显式选择npm的check all及task verify沿用同一稳定完整性任务;补齐锁后旧缺锁观察失效,新扫描不增加同义务任务。链接、目录或不可读文件不得伪装为不存在;重放缺锁报告、未知协议或矛盾字段不得生成当前可用证据 - - -#### Scenario: npm manifest is malformed before tool startup -- **WHEN** 初始化工作区中可绑定的package.json存在JSON语法错误、重复字段或非法scripts类型 -- **THEN** 即使提供完整原生参数,MUST 在启动npm前保存配置阻塞、给出清单修复指引并沿用稳定完整性任务,不把错误改称版本失败或源码漏洞。已有可绑定锁文件时,准备观察以npm_manifest_invalid或npm_scripts_invalid表达诊断且保持零组件/空advisory;缺锁同时存在时保留明确缺锁观察及配置错误反馈。清单变化后旧收据不得解释当前输入;报告声称清单损坏时,消费者MUST 与当前绑定字节的配置解析结论核对,不能只信诊断字段 - - -#### Scenario: Default full check discovers npm roots without explicit tools -- **WHEN** 已初始化工作区运行check all且发现可绑定的npm根,但未提供Node/npm及配置参数 -- **THEN** 支持的平台MUST 自动将每根接入准备任务并串行同步,反馈稳定任务与next,重复检查不堆积任务;未启动原生命令,不继承工具环境或凭据,不安装工具。未初始化项目不得隐式创建工作区;check java不得触发npm准备。真实原生参数恢复后继续复用同一任务,仍须独立核验完整CVE覆盖 - - -#### Scenario: npm manifest or lock becomes unavailable during remediation -- **WHEN** 已初始化物理工作区的明确npm任务或公开CVE范围中,清单/锁不存在、非普通文件、路径别名或无法有界读取 -- **THEN** MUST 保存独立输入状态准备观察,缺失与不可用分开;只有可读普通文件有内容摘要,其余摘要为null,零组件/空advisory。消费方必须先严格核对结构及状态对应的原因,再核对当前物理范围、状态与可读内容;损坏字段不能被当作陈旧证据静默沿用。同一完整性义务跨状态修复复用任务,输入恢复后旧观察失效;尝试指纹可记录环境状态但不能冒充源码摘要或关闭证据,next和失败复检历史不得因目录/不可读输入而不可用 - - -#### Scenario: npm manifest disappears from a known initialization profile -- **WHEN** 默认全项目检查不再发现初始化画像中曾记录的npm清单,但物理构建目录仍存在 -- **THEN** MAY 用与该工作区受管摘要一致且严格解析的旧画像恢复准备范围;MUST 核对相对路径、画像标记、当前物理归属及输入不可用状态,只生成本轮准备观察,不用历史摘要或配置启动原工具。画像不可读、摘要不符、结构或路径无效时MUST 明示历史范围未完成并保留当前发现的其它根;恢复清单后须通过当前发现重新绑定,稳定任务不重复,历史画像不构成覆盖或批准 - - -#### Scenario: Profile refresh cannot erase recorded npm remediation scope -- **WHEN** 当前画像刷新后不再包含清单不可用的npm根,但本工作区仍有同一稳定完整性问题的本地事实记录 -- **THEN** 默认check all MUST 保留该物理构建根的准备范围;严格核验工作区、检查器、稳定身份、范围和事实结构,不能由可编辑任务附件的勾选或删除消除检查。事实只提供本地未验证范围线索,不授权原生执行、批准、关闭或覆盖;当前清单恢复后重新发现。损坏或跨工作区记录 MUST 明示范围恢复未完成,不扩展到越界路径或吞掉当前发现的其它根 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md deleted file mode 100644 index 9ec94fa..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/rulepack-governance/spec.md +++ /dev/null @@ -1,223 +0,0 @@ -## Purpose - -定义质量策略、原生配置、工具链和规则包的权威及变更流程,确保降低误报依靠准确证据而不是智能体自行关闭检查,并保留可复核的例外与历史问题记录。 - -## ADDED Requirements - -### Requirement: Quality policy SHALL be independent from operational options - -必需检查、规则、阈值、排除、测试要求及漏洞库时效 MUST 来源于批准策略。CLI/env 运行参数 MUST NOT 弱化它们;同一 PR 的策略修改 MUST NOT 在未经批准时为自身代码签发通过。config explain MUST 显示原生配置及 suppression 的有效来源和差异。 - -项目可写的质量策略候选 MAY 经严格 schema 与内部引用校验,但即使其工具锁字节摘要匹配,也 MUST 仅作为未获信任的待审输入;候选的必需检查、阈值或排除 MUST NOT 变成有效门禁。候选源码排除至少绑定精确仓库相对文件路径、文件内容摘要、原因和期限,不得以通配、目录或本地 `approved` 字段扩大范围。正式批准来源与基线修订须由独立信任边界核验。 - -#### Scenario: Agent raises the severity threshold -- **WHEN** 智能体通过参数、环境或本地配置把批准阈值提高 -- **THEN** 新交付门禁不接受该弱化,记录策略差异而非通过 - -#### Scenario: A checker disables all native rules -- **WHEN** 原生配置改为禁用必需规则或以自定义空命令替代 -- **THEN** 覆盖校验不能满足义务,不以命令成功通过 - -#### Scenario: A local policy candidate matches a local tool lock -- **WHEN** 项目提供结构正确的策略候选,且其摘要恰好匹配同一工作树的工具锁 -- **THEN** config 只能报告本地引用相符及批准来源未核验,不生成有效策略、白名单授权或交付通过 - -### Requirement: Rulepacks and toolchains SHALL be versioned and locked - -rulepack MUST 有版本、规则来源/许可、稳定规则映射、内容摘要及工具兼容范围。检查 MUST 验证工具/运行时/配置/规则锁;扫描 MUST NOT 隐式安装、升级或改写项目配置。安装 MUST 是单独显式动作,离线检查 MUST 不联网。 - -`rules list [path]` MUST 复用当前项目发现和版本化规则映射,分别展示检查器静态配置状态、已知候选映射及尚缺的规则目录。候选映射 MUST 保留来源、许可、内容摘要与兼容版本,不得因为项目存在配置文件就声称具体规则已启用、已执行或获批准。目录尚不完整时 MUST 返回未完成和下一步,不把空规则列表解释为项目无需检查。命令 MUST 只读,不执行项目脚本或原生检查;项目可写的同名规则包、白名单或批准字段不得替换内置清单或取得授权。 - -#### Scenario: A configured checker has only candidate rule mappings -- **WHEN** Python 项目具有静态可识别 Ruff 配置,规则目录只有未批准 F401/E501 映射 -- **THEN** rules list 分别展示配置声明及带来源/摘要的候选映射,逐规则启用和执行状态仍未核验,返回未完成而不是生效规则集合或质量通过 - -#### Scenario: Project rule files claim approval or contain executable configuration -- **WHEN** 项目写入同名规则包或自批字段,并在动态配置中放入副作用脚本 -- **THEN** rules list 只复用静态发现,不运行脚本,不用项目文件替换内置规则映射,不生成批准或门禁效果 - -#### Scenario: A requested language has no complete native rule catalog -- **WHEN** rules list 请求已登记但尚无完整规则目录的语言,或 all 中包含该语言 -- **THEN** 返回该语言及各检测类别的目录缺口和准备动作,不把没有映射视为没有规则或已经通过 - -#### Scenario: Tool version differs from the lock -- **WHEN** PATH 工具与锁不匹配 -- **THEN** 未完成并给出准备动作,不自动下载 latest - -### Requirement: Historical findings SHALL remain findings - -基线 MUST 只用于 new/existing 分类和趋势,不得默认豁免存量违规。所有阻断规则 MUST 对新旧发现一致生效。基线不可读或无法比较 MUST 不删除当前发现。 - -#### Scenario: A harmless edit leaves an old violation -- **WHEN** 完整检查在未修改源码中检出已有的阻断违规 -- **THEN** 可标 existing,但仍阻断,不因历史身份或 diff 位置豁免 - -### Requirement: Exceptions SHALL require independently verifiable authority - -例外 MUST 同时绑定规则、范围、内容身份、到期时间、原因和可核验的批准身份,不能采用永久无期限例外。agent 声称获批、skipGate、可写 JSON 或普通 Git config MUST NOT 本身构成授权。例外 MUST 保留原始发现及非通过检查状态;外部批准交付必须与普通 PASS 区分。文档 MUST 明示同权限本地进程不可提供不可绕过保证。 - -#### Scenario: Agent writes a local approval flag -- **WHEN** 智能体写 `approved=true` 或 `codeguard.skipGate=true` -- **THEN** 新交付门禁不接受为授权,不改变违规或未完成状态 - -#### Scenario: A real exception expires -- **WHEN** 经批准例外超过有效期或不匹配当前范围 -- **THEN** 不应用该例外,保留完整门禁要求 - -#### Scenario: An old approval is reused after the frozen policy changes -- **WHEN** 白名单处置引用旧策略修订,但宿主冻结的当前修订不同、缺失或无效 -- **THEN** 不应用该处置,保留活动阻断及未完成;不能以处置中自写的修订作为当前策略来源 - -#### Scenario: Approval expires while a check is running -- **WHEN** 发现取证时批准仍有效,但最终门禁的可信时刻已达到到期边界,或最终时钟缺失/为零/早于取证时刻 -- **THEN** 不应用白名单,保留活动阻断并返回未完成;MUST 使用最终门禁时刻而非扫描开始时刻,不能重放旧 observed_at 维持过期豁免 - -#### Scenario: Expiry is absent or content changes -- **WHEN** 例外没有到期时间或当前内容不匹配获批身份 -- **THEN** 拒绝应用例外,不能沿用此前批准关闭问题 - -### Requirement: Existing dot-prefix scope SHALL remain explicit - -本变更 MUST 保留普通检查面点前缀默认忽略、不逐路径告警,以及入库安全和配置发现两项例外。覆盖报告 MUST 记录有效策略与汇总范围,不能宣称排除内容已检查。新增扫描或放宽禁止入库策略 MUST 经独立策略变更。 - -#### Scenario: Dot configuration and secret coexist -- **WHEN** 项目含点前缀 linter 配置、普通点前缀源码和拟入库 `.env` -- **THEN** 配置仍发现、普通源码按策略忽略、入库安全照常运行,三者不混为同一排除 - -### Requirement: False-positive allowlists SHALL be exact, authorized dispositions - -误报白名单 MUST 仅处置经原生工具复现、人工裁定的精确 finding;MUST 保留原始 finding、规则依据、复检命令和批准引用。条目 MUST 绑定原生检查器/规则/类别、目标和内容身份、finding 指纹、工具/适配器/rulepack 身份、误报依据、可信策略修订及有限期限。源码目标按仓库相对路径与本次文件字节摘要匹配;依赖目标按组件、解析版本、依赖图及 advisory 身份匹配。首版 MUST NOT 允许通配符、正则、整目录或整条规则豁免。重复性规则误报应通过经批准的 rulepack 或项目策略修订及正反例解决。 - -匹配 MUST 发生在原生结果解析、路径归属、内容和覆盖复核之后。缺字段、失配、过期、冲突或未获独立批准的条目 MUST NOT 放行;可信来源不可验证时相关策略义务为 incomplete。`false_positive` MUST 与仍然真实存在但被批准接受的 `accepted_risk` 分开。工具故障、坏报告、原生 suppression、未配置必需检查和覆盖不足 MUST NOT 被白名单处置。 - -白名单 MUST 作为 finding 的处置层实现,不得作为扫描排除、原生命令 suppression 或“无发现”的证明。对系统性误报,MUST 优先定位原生规则、适配器或项目策略的根因,并通过受保护 rulepack/策略修订及正反例回归纠正;不得自动把多个精确条目提升成规则级白名单。误判纠正、驳回、批准、过期、撤销和身份失配 MUST 保留历史事件并关联原稳定 finding/任务;手动修改任务状态不改变门禁。评测 MUST 保留白名单前的原始发现及人工裁定,不得用增加白名单掩盖误报率或漏报率。 - -配置外扫描属于适配器/配置归属错误,MUST 在 finding 生成前纠正;例如项目只启用 P3C naming 规则,却因隔离探针模板额外加载 comment 规则,额外诊断不得进入该项目 finding/白名单申请。若项目生效规则集尚不能确认,义务保持 incomplete,不得把多扫的诊断交由白名单逐条抵消。 - -#### Scenario: A Rust CVE observation has an unverified advisory database -- **WHEN** cargo-audit 的 advisory 与本轮 Cargo.lock 包身份一致,但 RustSec 数据库来源或时效未经可信边界核验,且项目提供自写的精确白名单条目 -- **THEN** 原始 advisory 和未完成原因仍反馈到对话,条目只作为待审线索,不命中有效例外、不关闭任务或给出交付通过 - -`rules whitelist propose` MUST 从本次原生报告及内容复核取得完整 finding、工具制品、适配器和 rulepack 身份,再生成可评审候选;不得用历史任务的首次观察、版本字符串、当前文件名或占位摘要补造缺失身份。若这些证据不全,MUST 返回未完成及逐项补证据/原工具复检动作,不写可批准候选,不改变现有门禁。 - -当调用者显式指定当前原生工具路径时,候选预览 MUST 只读核对该普通文件的字节摘要与扫描报告所记工具摘要;无法读取或不一致时 MUST 隐去旧观察并要求原工具复扫。该复核本身不证明工具获批准,也不把尚缺的规则包、策略或独立裁定身份补齐。 - -白名单纠错 MUST 关联原稳定 finding、原决策与修订链。已批准决策不可原地改写;更正时 MUST 保留撤销事件,生成引用旧决策的新候选,并由独立批准边界在同一可信策略修订中固定撤销与新增集合。新候选未获批准、旧决策已撤销或修订链冲突时 MUST NOT 凭任一条目放行。`rules whitelist explain` MUST 说明脱敏的匹配/失配字段、批准状态和下一步;智能体提出误报或修订候选不等于批准,不能把改任务文本或本地决策文件当成纠错完成。 - -纠错输入 MUST 指明原决策 ID、同一稳定 finding ID、结构化纠错原因(误批、范围过宽、证据失效、根因已修复之一)及本轮原工具复检引用;替代候选还 MUST 具有新的决策 ID、`replaces_decision_id` 和完整精确身份。只撤销而不替代时不得虚构新候选。CLI MUST 返回可审阅的撤销/替代提案和受影响 finding 列表,但提案写入 `codeguard/decisions/` 不得自行生效。受保护发布边界 MUST 校验旧决策存在、引用链无环、撤销与新增集合原子发布,并拒绝旧新条目同时命中或替代候选扩大到其它目标。无法完成复检或权威校验时 MUST 保留原任务为待处理/未完成,不得将白名单修订写成代码修复。 - -#### Scenario: Exact approved false positive is found again -- **WHEN** 同一原生工具、规则、目标内容及策略身份产生同一 finding,且误报裁定仍有效 -- **THEN** 仅该 finding 标记 whitelisted_false_positive,保留原始证据和批准引用,同文件其它 finding 照常判定 - -#### Scenario: A similar finding has different identity -- **WHEN** 相同规则发生在另一文件、文件字节变化、依赖版本/图/advisory 改变或工具语义版本变化 -- **THEN** 原条目不匹配,新 finding 继续接受正常门禁 - -#### Scenario: Disposition identity disagrees with its native finding -- **WHEN** 待应用白名单的完整观察身份与裁定一致,但原生 finding 来自不同工具、不同主目标或依赖版本,或缺少可核对的主定位 -- **THEN** 门禁保留原始阻断并返回未完成;可信宿主必须显式固定 checker/tool/category/obligation 映射,缺映射、冲突映射或未知映射不得按名称后缀猜测。源码/项目主定位核对精确路径,依赖主定位核对精确组件及非缺省版本;不能借次要位置放过主目标不同的发现 - -#### Scenario: A matching approval is paired with a stale native finding identity -- **WHEN** 裁定与其附带的观察身份相同,但本轮原生 finding 缺少独立冻结的完整身份,或该身份中的源码字节、发现指纹、工具/适配器/rulepack 摘要、依赖图或 advisory 与裁定不同 -- **THEN** 保留原始及活动阻断并返回未完成;历史报告缺该字段也不得借旧批准放行。宿主仍须从本轮原工具与内容复核取得该身份,项目可写字段本身不能证明来源可信 - -#### Scenario: Conflicting dispositions arrive in a different order -- **WHEN** 同一 finding 有多条处置,或同一批准决策 ID 被复用于不同 finding,且输入顺序改变 -- **THEN** 门禁在应用前识别全部冲突,保留相关活动阻断,不将任一条先到处置标为 whitelisted;两种顺序产生相同未完成结论与发现集合 - -#### Scenario: Candidate decisions reuse a finding ID with different targets -- **WHEN** 两条白名单候选使用同一稳定 finding ID,但指向不同源码路径、内容或依赖目标 -- **THEN** `rules whitelist list/explain` 将两条都标记为冲突,`explain` 不返回单条身份匹配结论;最终门禁也不得从冲突候选中选择有利于放行的一条 - -#### Scenario: An approved identity is attached to an invalid obligation ledger -- **WHEN** 原生发现的义务归属与所在结果不一致、所在义务未知/无效,或该义务覆盖集合失配 -- **THEN** 不应用该发现的白名单处置,即使观察与裁定身份及检查器映射一致;保留原始/活动阻断并返回未完成 - -#### Scenario: Ruff configuration changes after original checker verification -- **WHEN** 复检后的 Ruff 配置内容变化、配置优先级变化,或旧报告缺少可核对的当前配置身份 -- **THEN** next 要求重新运行原工具,不沿用旧纠错事件或附件;纠错提案返回 verification_required 而不记录新提案,普通误报提案不展示旧观察为当前证据。源码不变、旧配置字节不变也不能抵消高优先级配置切换 - -#### Scenario: The Rust adapter binary changes after a Ruff finding -- **WHEN** 本轮 Ruff finding 的局部报告记录了 CodeGuard 适配器二进制摘要,但工作台读取候选时当前二进制字节已不同,或取证时无法安全取得摘要 -- **THEN** `propose` 不沿用旧观察或补造摘要,返回具体缺口与原工具重扫动作;匹配的二进制摘要只补齐适配器观察身份,未经批准的 rulepack 和人工误报裁定仍不得转成有效候选或门禁例外 - -#### Scenario: A recorded correction has a missing or edited readable projection -- **WHEN** 已保留纠错事件,但可读附件缺失、写入失败或被用户编辑 -- **THEN** 保留事件引用,单独反馈附件恢复动作;重复记录可重建缺失附件,但不得覆盖用户编辑。next 仅展示与当前复检和事件重建字节一致的附件,附件文字不得取得批准、执行或关闭权威 - -#### Scenario: A signed approval binds a snapshot to protected host context -- **WHEN** 宿主选择签名批准来源,并在扫描前固定公钥、撤销状态、可信时钟、工作区、策略修订、受保护代码基线与最小修订序号 -- **THEN** 按域分隔和原始签名载荷核验签名、范围、期限、防回滚与快照字节;快照内部修订也须与签名修订一致。项目自选公钥、签名成功或同次 PR 自写 approved 均不得替代宿主来源与原生检查完整性核验;坏签名、撤销、过期、范围/字节/修订错配及无可信时钟不放行 - -#### Scenario: A signed replacement chain contains an unverified predecessor -- **WHEN** 当前替代条目签名有效,但前序签名损坏/撤销、历史审核上下文无法核验、工作区不符或序号/时间乱序 -- **THEN** 不绑定完整批准链,当前签名不得覆盖前序缺口;每个历史摘要须由该跳签名核验取得,禁止项目自行提供历史 pin。历史候选在受保护审核时刻无效、链截断/多余/成环或超限也不放行 - -#### Scenario: A disposition is reused outside its approved workspace or baseline -- **WHEN** 白名单处置的工作区或当前批准代码基线与宿主独立冻结的范围不一致,或任一范围缺失/无效 -- **THEN** 最终门禁不应用该例外,保留原始及活动阻断并返回未完成;签名预览须携带已核验的范围,不能在投影时丢失。仅接受完整非零 SHA-1/SHA-256 基线,不将 HEAD 等可变引用当作身份;该基线属于当前批准上下文,不能从工作树或处置字段反向生成宿主信任 - -#### Scenario: Historical review occurs after its replacement was issued -- **WHEN** a predecessor signature is valid at its supplied protected review time but that review time is later than the child approval issuance -- **THEN** Codeguard SHALL reject the revision chain rather than treating valid signatures alone as valid chronology - -#### Scenario: Signed predecessor refers to an unrelated code baseline -- **WHEN** 签名修订链有效,但前序代码基线不是后续基线的 Git 祖先(允许同一提交) -- **THEN** 宿主批准绑定入口拒绝该链;完整对象缺失、浅历史、Git 失败或预算耗尽均返回未完成而非认可关系。仅接受完整 SHA-1/SHA-256 提交 ID,禁用 replace/graft 与按需远程取对象,不将本地 Git 观察本身当作可信宿主来源 - -#### Scenario: A valid signature binds an all-zero code baseline -- **WHEN** 签名和宿主上下文一致,但基线是 SHA-1 或 SHA-256 全零 ID -- **THEN** 普通与替代批准入口均拒绝该上下文;全零值不得代表受保护提交或缺省基线 - -#### Scenario: A legitimate historical approval has expired today -- **WHEN** 当前替代条目有效,前序批准在其受保护历史审核时刻合法,但今天已经过期 -- **THEN** 可以核验历史关系,不能因此自动接受当前条目;当前签名与候选仍按本次可信时钟核验,历史密钥最新撤销状态仍须检查 - -#### Scenario: Agent proposes or self-approves a whitelist entry -- **WHEN** agent 写本地候选、`approved=true`,或同一 PR 提交尚未进入可信基线的批准条目 -- **THEN** 候选不改变门禁,受保护 CI 只使用此前可信策略修订;批准、期限和来源均可解释 - -#### Scenario: A local finding lacks exact checker artifact identity -- **WHEN** 持久任务仅记录规则、路径和指纹,但本轮报告缺少工具制品、适配器或 rulepack 摘要 -- **THEN** `rules whitelist propose` 返回未完成和缺失身份列表,不猜测摘要、不产生可批准候选,原 finding 继续阻断 - -#### Scenario: Native finding has no reviewed rule mapping -- **WHEN** 本轮原生检查检出真实规则,但该规则在适配版本下尚无核对过的 CodeGuard 规则映射 -- **THEN** 白名单提案明确区分“规则映射待核对”与“已有映射但尚未批准”,指出原生规则和工具版本核对动作,不制造候选或授权;项目自写 `approved=true` 也不能改变原 finding 或稳定任务 - -#### Scenario: Required checker fails despite an old whitelist match -- **WHEN** 必需原生检查器本次崩溃、报告归属无效或必需规则被未经批准的 suppression 隐藏 -- **THEN** 结果保持 incomplete,不以历史白名单条目推断本次检查通过 - -#### Scenario: An import failure is mislabeled as a false positive -- **WHEN** 本地报告无法解析或归属,智能体为其写误报白名单候选 -- **THEN** 失败收据只指引修复报告或原生检查环境,不生成可白名单处置的 finding;候选不能改变未完成状态 - -#### Scenario: Two native findings collide on one stable ID -- **WHEN** 同一轮的不同原生规则或义务给出相同 finding ID,其中一条带有精确误报批准 -- **THEN** 保留两条原始发现,拒绝将该 ID 的批准扩展到另一条;受影响义务与交付结果保持 incomplete,要求修正身份冲突后重跑 - -#### Scenario: Similar false positives recur across a project type -- **WHEN** 同一原生规则在多个独立目标上反复被人工裁定为误报 -- **THEN** 生成规则/适配器根因调查并提供正反例;不自动创建通配白名单或修改原生排除 - -#### Scenario: User corrects an unreasonable finding -- **WHEN** 用户指出某条 finding 是误判,并提供反例或复现线索 -- **THEN** 智能体先复核原工具结果、有效规则和目标身份,保留原 finding 与任务,提出精确误报候选或规则/适配器修复建议;只有独立批准的精确候选在下一次完整检查中匹配,才对该 finding 标记 `whitelisted_false_positive`,并向对话展示批准引用、到期时间及 `allow_with_exceptions` 或剩余阻断原因 - -#### Scenario: Approved decision is revoked or task text changes -- **WHEN** 已批准条目被撤销,或有人手动勾选、改写其修复任务 -- **THEN** 保留原始 finding 与历史裁定;撤销后本轮原生 finding 重新按正常门禁判定,任务文字不能赋予批准 - -#### Scenario: User edits an approved whitelist entry -- **WHEN** 用户或智能体修改已批准条目的理由、目标、工具身份或期限 -- **THEN** 修改后的字节必须重新批准;不得沿用旧批准、自动续期或扩大范围。对话说明失配字段和复核动作,纠正记录关联同一稳定问题;有效误报处置不标记为源码修复完成 - -#### Scenario: An approved false-positive decision needs correction -- **WHEN** 人工复核发现已批准条目过宽、误批或其证据已失效,并提出替代候选 -- **THEN** 旧决策及撤销原因保持可追溯,新候选引用旧决策且在独立批准前不生效;本轮原生 finding 重新阻断或保持未完成,不能同时消费冲突的旧、新决策 - -#### Scenario: A corrected decision has no replacement or attempts to broaden scope -- **WHEN** 评审只撤销误批条目,或替代候选试图覆盖另一文件、依赖节点、原生规则或内容版本 -- **THEN** 只撤销时原 finding 恢复正常门禁;扩大范围的替代候选被拒绝并单独调查,不因引用旧决策而取得授权 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md deleted file mode 100644 index fea3491..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/scan-scope-policy/spec.md +++ /dev/null @@ -1,17 +0,0 @@ -## ADDED Requirements - -### Requirement: Managed remediation artifacts SHALL have a bounded self-scan policy - -`.codeguard/` 按既有点前缀策略不进入普通源码发现;其中被初始化清单拥有的运行产物与问题/任务文件 MUST 接受工作区 schema、路径及脱敏校验。不得因目录名 `codeguard` 忽略同名非点目录;其中的用户源码与未声明文件 MUST 继续普通检查。点目录排除不得赋予 `.codeguard/` 质量策略批准或入库安全豁免;拟提交记录仍须接受安全检查。既有点前缀的配置例外保持不变。 - -#### Scenario: Managed files coexist with user code -- **WHEN** `.codeguard/tasks` 有生成任务且 `codeguard/src` 有用户源码 -- **THEN** 生成任务走工作区校验,用户源码照常检测,不出现递归扫描运行副本 - -#### Scenario: A managed record contains a secret -- **WHEN** 拟提交的持久记录意外包含密钥 -- **THEN** 入库安全仍检查并阻断,受管产物不能豁免敏感内容 - -#### Scenario: Agent expands the ownership manifest -- **WHEN** agent 将普通源码路径添加进受管排除清单 -- **THEN** 生成器所有权校验不接受扩张,不能据可写 manifest 关闭扫描 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md deleted file mode 100644 index 539072c..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/unified-cli-contract/spec.md +++ /dev/null @@ -1,295 +0,0 @@ -## Purpose - -定义 Rust Codeguard 的统一请求、语言选择、报告、退出码及多入口转换协议,使局部检查成功与完整交付认证具有明确边界,调用方无需猜测原生工具状态。 - -## ADDED Requirements - -### Requirement: check all SHALL orchestrate npm roots through the shared native runtime -check all SHALL 将发现的npm构建根接入共享任务图、截止时间与并发预算,在显式原生上下文下调用同一审计服务;执行后串行同步稳定任务并反馈next,不继承宿主凭据或安装工具。 - -#### Scenario: Multiple npm roots are checked within one workspace -- **WHEN** 已初始化工作区有多个package.json根,调用者提供显式Node/npm/版本/原配置上下文 -- **THEN** 各根原生cwd、结果及稳定任务独立,重复检查不重复生成任务;统一human/JSON展示原生诊断、锁版本线索、同步结果及下一步,局部零漏洞不证明完整覆盖 - -#### Scenario: One npm root fails or the shared budget expires -- **WHEN** 一个根的原生审计失败,或共享截止时间耗尽 -- **THEN** 保留兄弟根已经取得的结果,不把环境失败记为源码违规;预算耗尽后不启动余下任务或签发完整检查通过,取消/超时与未同步状态明确展示 - -#### Scenario: npm context is absent or scoped to a Java-only check -- **WHEN** check all未提供显式npm上下文,或check java接收npm参数 -- **THEN** 前者在支持的平台自动将已发现npm根加入共享准备任务,已初始化且输入可绑定时同步稳定环境/配置任务并反馈next;不得启动缺上下文的原生命令,不自行安装/继承凭据。后者在原生执行前拒绝参数;可信上下文自动解析须独立实现和验收 - -### Requirement: Install previews SHALL distinguish bound layout declarations from verified package contents - -安装预览反馈 0.3 MUST 区分完整布局路径声明已绑定但来源未核验、缺少完整树声明及 raw 不适用目录树布局。已绑定完整布局 MUST 展示安装树声明摘要、内容寻址目录名和入口/可选 bundle 定位摘要;包内私有路径及原下载地址 MUST NOT 回显。预览 MUST 明示包/布局内容尚未验证,不得调用下载、展开或发布服务来隐式补齐。完整声明或局部制品身份匹配 MUST NOT 推导来源批准、准备完成、实际写入或门禁通过;未获批准的 apply 保持写入前阻塞。JSON/human MUST 表达相同阶段与下一步,旧版本 schema MUST 保留且不得将新反馈解释为旧普通成功。 - -#### Scenario: A complete layout is declared but no package is read -- **WHEN** 1.2 清单与原锁路径精确绑定,用户请求 dry-run 或未批准的 apply -- **THEN** 布局标记 declared_paths_bound_untrusted,内容核验 not_run,准备 unknown、来源 unverified、未写入;apply 不安装 - -#### Scenario: A legacy manifest lacks full layout or a raw package is declared -- **WHEN** 清单缺完整树声明,或工具包格式为 raw -- **THEN** 分别显示缺少声明或 raw 不适用;不猜完整安装目录,不把阶段标签当作内容核验 - -### Requirement: Unified commands SHALL select explicit check obligations - -Rust CLI MUST 提供 `lint/comments/dependencies/cve/security/build/check [path]`;`check` 包含项目实际已配置且可适配的检查器,以及批准策略明确要求的检查义务。候选检测族目录本身不产生项目义务;未配置的候选项应说明状态与建议,不能因为没有运行就产生代码违规。语言别名 MUST 来源于统一注册表,未知语言在执行前拒绝。部分命令 MUST 明示 selection,不得据局部通过声明项目全部通过。`plan` MUST 仅规划,不执行构建、扫描、下载、安装或修改源码。 - -交付聚合 MUST 对照由可信策略与完整发现独立冻结的应有义务 ID 清单和实际计划的义务清单;任一清单漏项、重复或额外项均不能签发 allow。计划和冻结清单若都来自同一未经核验的项目可写输入,数量一致仍不构成可信来源证明。无适用义务的完整空项目仍按 not_applicable 处理。 - -#### Scenario: Java lint succeeds in a mixed project -- **WHEN** Java lint 完成,但项目仍有 Python、安全或 CVE 义务未在该请求执行 -- **THEN** 请求可成功,交付状态为 not_evaluated,不能宣称全项目通过 - -#### Scenario: Planned obligations omit a frozen requirement -- **WHEN** 可信冻结契约含 Java CVE 义务,但执行计划只保留已经完成的 Python lint -- **THEN** 即使 Python 结果干净,交付和请求都保持 incomplete,并列出遗漏的 Java CVE 义务 - -#### Scenario: User requests a plan -- **WHEN** 调用 `codeguard plan check all .` -- **THEN** 返回义务与待解析前置条件,不执行外部构建或扫描 - -#### Scenario: A language identifier is unknown -- **WHEN** 用户输入未注册的语言 ID -- **THEN** 执行前返回用法错误,列出规范 ID/别名,不启动检查器 - -#### Scenario: A candidate checker is not configured -- **WHEN** 项目未配置候选的 Javadoc 检查器,批准策略也未要求它 -- **THEN** 报告说明 `missing` 和可执行的配置建议,不产生 Javadoc 代码违规或未执行义务;其他已配置检查器继续运行 - -#### Scenario: Policy requires an unconfigured checker -- **WHEN** 批准策略明确要求 Javadoc 检查,但项目没有有效配置 -- **THEN** 报告说明配置缺口并将交付标为 incomplete,不伪造 Javadoc 源码违规或干净通过 - -### Requirement: Rust CLI SHALL expose a versioned exit contract - -Rust CLI MUST 使用 0 请求通过、1 违规、2 用法错误、3 必需义务未完成、4 内部故障、130 取消。执行后的聚合优先级 MUST 为取消、内部故障、未完成、违规、通过;已有发现 MUST 保留。原生退出码 MUST 独立记录,不直接透传作为 CLI 结论。 - -#### Scenario: Findings coexist with an unavailable scanner -- **WHEN** lint 有已确认违规且必需 CVE 工具不可用 -- **THEN** 返回 3,报告同时包含违规和未完成项 - -#### Scenario: Native tool exits with code two -- **WHEN** 工具原生退出 2 -- **THEN** 依据该工具契约生成结果,不将其直接解释成 Codeguard 用法错误 - -#### Scenario: One task fails internally after another finds a violation -- **WHEN** `check all` 的一个任务内部故障,而另一任务已经取得原生 finding -- **THEN** CLI 返回 4 和结构化内部故障报告,列出失败任务及各任务状态,并保留已取得的原生 finding;交付保持 incomplete,不能把该 finding 或故障解释成白名单放行 - -#### Scenario: Cancellation follows a completed native finding -- **WHEN** `check all` 并行运行期间,一项原生检查已取得 finding,另一项收到 SIGINT 并完成取消清理 -- **THEN** CLI 返回 130、`command_status=cancelled`,保留已取得的 finding 与取消任务状态;不返回普通未完成退出码 3 或交付 allow - -### Requirement: Reports SHALL preserve semantics across public formats - -报告 MUST 带 schema_version、请求选择、项目检查器配置状态、本次原生结果、发现及交付判定。human/JSON/SARIF/MCP MUST 来源于同一语义报告;宿主对话反馈 MUST 区分 `configured/missing/invalid/unknown` 与 `passed/finding/tool_error`,不把“已配置”说成“已通过”。结构化 stdout MUST 不混入进度或原始日志;公开结果 MUST 脱敏,私有原始证据单独存储。未知协议 major MUST 拒绝消费。检查请求与 RunReport 的原始 JSON 在全部嵌套层级 MUST 拒绝重复对象键,并设输入字节预算;不能先把重复键覆盖成普通对象再校验交付判定或预算。 - -#### Scenario: Duplicate protocol fields conceal a gate or execution option -- **WHEN** 原始 RunReport 同时含两个 `delivery_gate`/`decision` 键,或内嵌检查请求的 `jobs` 键重复且后值看似合法 -- **THEN** 消费入口拒绝整份原始 JSON,不选取前值或后值,也不生成交付通过或对话摘要 - -新增误报白名单报告字段时 MUST 提升协议版本并迁移所有消费者:报告分别保留原始 finding、有效处置、活跃阻断和未完成义务,交付决策增加 `allow_with_exceptions`。CLI 请求成功可退出 0,但 human/JSON/SARIF/MCP MUST 明示“带批准例外交付”及决策 ID、可信修订、期限与本次匹配范围,不能渲染成普通 PASS;局部检查仍为 not_evaluated。旧消费者不认识新决策时 MUST 拒绝将它映射为普通 allow。 - -#### Scenario: Approved false positive survives every public format -- **WHEN** 有效误报白名单是唯一原始阻断,完整交付检查得到 allow_with_exceptions -- **THEN** 协议版本、CLI/MCP/Hook/SARIF 均保留原始 finding、可信批准引用、期限和带例外语义,不能渲染普通 PASS - -#### Scenario: SARIF contains no findings but a required task timed out -- **WHEN** 一个必需检查超时且没有有效 finding -- **THEN** SARIF 仍表达未完成,标准报告不得变成干净通过 - -#### Scenario: SARIF consumes an unverified allowlist claim -- **WHEN** 结构有效的报告声明一个 finding 已被误报白名单处置,但报告来源和批准权威尚未独立核验 -- **THEN** SARIF 保留该 finding 为结果、显示处置声明及来源未核验状态,不创建会使查看器隐藏结果的 suppression;只有完成可信绑定后才可声明批准有效 - -#### Scenario: A new run report claims a stale false-positive disposition -- **WHEN** 新版 RunReport 声明误报处置,但本轮 finding 的完整原生身份缺失,或其文件/依赖图/advisory、指纹、工具/适配器/rulepack 摘要与决策身份不同 -- **THEN** 严格消费者拒绝该报告的处置声明,不把它投影为已批准例外;原生规则、工具制品、检查器类别及主目标也须与本轮 finding 和报告身份一致。旧版可作为历史未核验声明读取,未知未来版本不得按现有语义猜测;即使新版结构匹配,来源与独立批准仍须由宿主核验 - -#### Scenario: A source claim sits outside the native coverage or no longer matches the workspace -- **WHEN** 新版报告的源码 finding 主目标不在对应义务的预期及实际覆盖集合内,或宿主从独立指定的工作区安全读取当前文件后发现 SHA-256 不同、文件缺失或路径经过符号链接 -- **THEN** 不得将该 finding 的白名单处置解释为本轮有效;覆盖结构校验直接拒绝报告,内容复核失败时宿主保持未完成。内容摘要匹配本身也不证明原生工具确实运行或批准来源可信,终局门禁仍须复核 - -#### Scenario: Tool output contains a credential -- **WHEN** 工具 argv 或诊断含凭据 -- **THEN** MCP 与公开报告不回显原文,保留可用的私有证据引用 - -### Requirement: Empty selection SHALL NOT certify delivery - -显式语言请求无目标 MUST 为未完成。全部发现后证明确无适用义务时 MAY 返回请求成功,但 MUST 标明 not_applicable,MUST NOT 生成交付 allow。缺失工具或 adapter MUST NOT 被当成无适用目标。 - -#### Scenario: Java command runs in the wrong directory -- **WHEN** 显式 `lint java` 未发现 Java 目标 -- **THEN** 返回 3 并说明无匹配目标,不能报告 Java 已通过 - -#### Scenario: Empty project has no applicable checks -- **WHEN** 完整发现证明项目无适用检查对象 -- **THEN** 标为 not_applicable 且 eligible=false,不签发交付通过 - -### Requirement: Public commands SHALL have distinct operation contracts - -CLI MUST 提供帮助/版本、detect、capabilities、init、plan、doctor、rules list、config validate/explain、tools list/verify/install、六类检查、三个 gate、work sync、status、next、task 协作、fix/verify、mcp serve 与显式 compat。每个命令 MUST 定义参数、默认值、输入/结果类型、允许副作用、错误与下一步;CLI/MCP 接入 MUST 复用核心服务,不另建检查或门禁逻辑。完整目录和 C01–C36 追踪见设计文档,命令 schema、help、映射和验收 MUST 保持一致。 - -#### Scenario: Help is requested outside a project -- **WHEN** 用户在无项目或无扫描工具的目录请求 help 或 version -- **THEN** 从发行元数据返回信息,不初始化、不扫描、不联网更新 - -#### Scenario: A capability exists but its tool is not installed -- **WHEN** capabilities 返回实现能力,而 tools list 显示必需工具缺失 -- **THEN** 两者分别说明发行能力和本地库存,不将能力声明当作环境或质量通过 - -### Requirement: Operation success SHALL remain separate from quality certification - -`rules whitelist list/explain/propose` MUST 复用规则与策略服务。list/explain 为只读;propose 仅产生候选及依据,不批准、不修改有效政策、不签发质量结论。`config validate` MUST 校验白名单 schema、精确范围、批准身份、期限和策略差异;静态无法验证可信批准时 MUST 报未完成,不能按本地声明通过。 -propose 缺少本轮完整原生 finding 或工具/适配器/rulepack 身份时 MUST 返回未完成和缺证据项,不能以占位摘要生成形式上有效的候选。 - -命令结果 MUST 有版本及 report_type/operation/request_id/command_status/exit_code/warnings/next_actions,并保留类型特有的完整payload。RunReport MUST 继续包含逐项完整性、身份、finding和gate。信息/计划/管理操作的 exit 0 只表示该操作完成;doctor/config validate/tools verify 对所选必需条件不能验证满足时 MUST 返回3。非交付操作 MUST NOT 据操作成功签发allow,status 展示历史决策时 MUST 附来源身份与freshness。MCP 服务生命周期与单请求结果 MUST 分开。 - -#### Scenario: Plan contains a missing prerequisite -- **WHEN** plan 完整返回了含缺JDK条件的计划 -- **THEN** 可exit 0但不声称就绪,doctor对同一必需缺失返回3且不虚构源码违规 - -#### Scenario: MCP request times out while the server remains available -- **WHEN** 一个MCP检查请求超时 -- **THEN** 该请求返回未完成语义,服务器存活不作为检查成功证据 - -### Requirement: Preparation commands SHALL preserve observation and mutation boundaries - -detect/capabilities/rules/config/tools list和verify MUST 静态观察,不执行项目脚本或安装工具。config validate MUST 核验配置与批准策略引用;explain MUST 解释来源而不自动选择较松要求;tools verify MUST 区分制品身份与运行能力。doctor MAY 执行适配器声明、身份已解析且有界的诊断,不隐式构建、安装、启动服务或读取凭据值。doctor 的 PrerequisiteReport MUST 带run_id、报告类型、工作区/内容/政策/工具身份、范围与freshness,可被同步为准备证据,不能作为源码质量通过。 - -tools list 的本地候选库存 MUST 明示仅覆盖声明锁,完整必需集合未经核验;MUST 区分声明版本、当前平台制品观察和跨平台未检查条目。运行时/发行包须分别显示缺口,字节相符不能称已批准、可启动或 ready。缺锁、空当前平台或未获可信策略绑定不能将空库存解释为无必需工具;普通候选不得自写 required_by_policy。MUST 复用制品核验服务,不启动 wrapper、联网、安装或写工作区。 - -#### Scenario: Inventory contains a tool for another platform -- **WHEN** tools list 读取结构有效但未经批准的跨平台锁候选 -- **THEN** 保留该声明并标记 other_platform/not_inspected,不访问其制品、不虚构本机缺失或准备通过;当前平台条目按同一制品核验契约展示 - -#### Scenario: Tool bytes match but its runtime cannot start -- **WHEN** tools verify确认制品身份而doctor发现运行时不能启动 -- **THEN** tools verify不被撤写为源码违规,doctor报告必需准备未完成,后续检查不能假通过 - -#### Scenario: Existing suppression conflicts with approved policy -- **WHEN** 配置包含未批准的规则弱化 -- **THEN** validate报告未完成,explain展示来源与拒绝原因,不自动修正阈值或签发批准 - -#### Scenario: Detection is complete but a dynamic condition is unknown -- **WHEN** detect完整读取允许范围但构建条件不能静态解析 -- **THEN** 返回含unknown的DiscoveryReport及exit0,不执行脚本、不写画像或任务 - -#### Scenario: Required discovery inputs cannot be read -- **WHEN** 必要目录因权限错误无法观察 -- **THEN** detect保留部分观察并返回3,不能按空项目或完整发现解释 - -#### Scenario: Capabilities are planned unknown or corrupt -- **WHEN** 查询已登记planned语言、未知语言ID,或发行注册表损坏 -- **THEN** 三者分别为显式planned/gap的查询成功、用法错误2、内部故障4;均不隐式探测或安装工具 - -### Requirement: Tool installation SHALL use a bounded explicit plan and apply - -`tools install --lock PATH [--distribution-manifest FILE] [--dry-run|--apply]` 默认 MUST dry-run,返回精确来源、摘要、安装范围和限制。apply MUST 只安装可信锁与授权范围内制品,验证后逐制品原子发布;部分失败返回未完成且可恢复。扫描/诊断 MUST NOT 隐式调用安装,不自动升级到latest、修改全局PATH或提权。工具存在/安装成功 MUST NOT 直接证明项目检查通过。 - -#### Scenario: Tool installation has no mode flag -- **WHEN** 调用 tools install仅给出lock路径 -- **THEN** 只输出安装计划,不下载或更改工具库存 - -#### Scenario: Apply is requested with only an untrusted local lock candidate -- **WHEN** 安装候选只通过本地结构及制品核验,可信锁或发行授权尚未绑定 -- **THEN** 返回明确缺口及 blocked_before_mutation,不调用发布服务、不联网/安装/写工作区;条目可解释原有制品与恢复动作,但不得宣布已安装或 ready - -#### Scenario: One of several locked artifacts fails verification -- **WHEN** apply中某个制品校验失败 -- **THEN** 不发布该制品,保留其它已验证结果并返回3,后续恢复不消费半成品 - -发行清单 MUST 使用版本化、拒绝未知和重复字段的有界协议;制品 MUST 绑定工具锁原始字节 SHA-256、精确工具 ID/版本/平台、二进制及来源引用摘要和 bundle 身份。清单声明的子集 MUST NOT 证明必需库存或运行时闭包完整。下载地址 MUST 使用 HTTPS 且不得携带用户凭据、查询参数或片段;包摘要、传输大小和展开上限 MUST 明确且有界。原始二进制包的包摘要/大小 MUST 与入口摘要/展开大小一致,不得声明归档入口或 bundle;归档入口 MUST 是无空段、点段、回退段或平台绝对路径的相对路径。结构/引用匹配 MUST NOT 自授可信来源或安装批准,绑定入口 MUST 重新验证传入对象。 - -#### Scenario: Explicit manifest is inspected during install preview -- **WHEN** tools install 显式提供 --distribution-manifest FILE -- **THEN** 有界只读读取并展示未提供/不可读/无效/锁不可用/未绑定/绑定未批准状态;逐工具只展示精确绑定的脱敏包声明,原始下载地址不进入公开反馈;不执行、下载或写入,缺其它工具及运行时覆盖仍保持未完成 - -#### Scenario: Manifest attempts to bind changed lock bytes or another artifact -- **WHEN** 清单绑定的锁原始字节变化,或工具/版本/平台/来源/bundle/二进制身份与锁不一致 -- **THEN** 拒绝绑定,不下载或发布;不得以 JSON 语义相似、版本字符串相同或文件已存在代替摘要核验 - -#### Scenario: Manifest is locally valid but not independently authorized -- **WHEN** 本地清单及其声明子集通过结构与精确锁绑定 -- **THEN** 仅产生声明绑定,不推导覆盖完整、可信来源、批准、ready 或门禁通过;正式 apply 仍须独立发行授权 - -#### Scenario: Manifest includes unsafe package metadata -- **WHEN** 清单包含重复字段/工具平台条目、未知批准字段、凭据地址、零摘要、超限大小或非法归档入口 -- **THEN** 拒绝清单并返回固定脱敏诊断;不把准备输入错误当成源码违规 - -### Requirement: Gate commands SHALL receive explicit delivery content - -pre-commit MUST 使用Git传入环境的index;pre-push MUST 接受remote-name/remote-url和完整stdin ref/OID元组,不回退HEAD;ci MUST 通过版本化input请求明确仓库及不可变OID集合与预期来源。CI输入文件 MUST NOT 自授策略权威。删除ref或无适用源码不得签发代码质量allow;不同内容来源的结果不可互相替代。 - -#### Scenario: CI checks a merge result rather than the branch head -- **WHEN** CI请求指明merge结果OID -- **THEN** 仅按指定不可变内容建立认证,不使用当前checkout或分支头的通过代替 - -#### Scenario: Pre push input is absent -- **WHEN** pre-push没有获得要求的ref输入 -- **THEN** 明确失败而不检查默认HEAD冒充本次推送;合法全删除集合独立记录不适用 - -### Requirement: Execution budgets SHALL have explicit defaults and a shared deadline - -有执行行为的命令 MUST 在版本化命令schema中固化timeout/jobs的支持范围、默认值和来源优先级,报告有效值。初版检查/gate/fix/verify默认总预算30分钟,doctor 2分钟且单探测不超过10秒,tools install 10分钟;检查默认并行度为min(4,max(1,可用CPU并行度))。CLI优先于已登记环境变量、项目运行默认及发行内置值;这些值 MUST 不改变质量义务。子任务和重试 MUST 继承剩余deadline,包含排队、快照、执行、解析、存储及清理,不重置预算。无法及时回收进程 MUST 明示cleanup_pending而不声称完成。 - -项目检查/复检的可选运行默认值 MUST 从版本化 `codeguard/runtime.json` 读取;该文件只能声明运行预算,不能承载或覆盖必需规则、扫描排除、白名单及批准身份。CLI/已登记环境变量优先于它;当项目默认值成为候选来源时,未知字段、坏版本、非普通文件、符号链接或无效预算 MUST 在执行原生工具及取得任务租约前拒绝,不回退内置默认值来掩盖配置错误。报告 MUST 保留最终值与 `project_default` 来源,项目默认值不能把不完整检查改成通过。 - -`check all` 的并行上限 MUST 支持 `--jobs`、登记的 `CODEGUARD_JOBS`、同一 `codeguard/runtime.json` 中可选的 `jobs` 和内置默认值,按上述来源优先级逐字段选择;显式值限定为 1–64 的十进制整数。项目文件一旦为任一字段的候选来源,MUST 对整个版本化文档做一次严格读取和校验,防止超时与并行度从同一文件的不同版本混用。报告 MUST 分别说明并行上限、来源、本轮可执行任务数及实际启动数;并行上限不是实际并发证明,不能因只接入一个适配器就声称多语言并发已验收。 - -#### Scenario: Check parallelism source and actual work differ -- **WHEN** `check all` 在有多个可用 CPU 的机器上只接入一个原生任务,且调用方设置 `--jobs 4` -- **THEN** 调度器以上限 4 运行,反馈分别报告上限 4、一个可执行任务和实际启动任务数,不声称四项检查已完成 - -#### Scenario: Invalid selected jobs budget -- **WHEN** 选中的 `--jobs`、登记环境或项目默认值为零、负数、超过 64 或非十进制整数 -- **THEN** 启动原生工具前返回 2;较高优先级的有效值覆盖较低优先级的无效环境值,项目文件被选中时仍须整体严格校验 - -#### Scenario: Project runtime default is selected -- **WHEN** `codeguard/runtime.json` 有效且未设置显式 CLI 或已登记环境预算 -- **THEN** 本次检查使用项目默认值,报告来源为 `project_default`;之后仍须执行全部适用质量义务 - -#### Scenario: Project runtime default is malformed -- **WHEN** 没有更高优先级的预算来源,且项目运行默认值版本错误、预算非法、文件为链接或含质量排除字段 -- **THEN** 启动原生工具和取得任务租约前拒绝,不静默回退或采纳其中的质量豁免 - -#### Scenario: A retry starts after most of the request budget is consumed -- **WHEN** 某任务在整次请求接近deadline时满足瞬时重试条件 -- **THEN** 重试只能使用剩余预算,不能重新获得完整timeout或降低检查覆盖 - -#### Scenario: Timeout is zero or unsupported for the selected command -- **WHEN** 调用方提供零预算或某命令不支持的执行选项 -- **THEN** 执行前返回2,不将零解释为无限等待或静默忽略参数 - -### Requirement: Report export SHALL preserve identity and persistence failures - -标准报告 MUST 保留可逆的路径身份、展示位置和多位置/包级证据,不以有损字符串或行号单独识别问题。`--output` MUST 原子写入与所选格式一致的报告;写入失败 MUST 保留已取得的检查证据并报告操作未完成,不能把质量结论改成另一项源码违规。JSON未知major或非法枚举 MUST 拒绝,兼容minor扩展不得覆盖必需字段。跨工具归并 MUST 有明确规则映射并保留原始来源。 - -#### Scenario: Report destination cannot be written -- **WHEN** 检查已取得有效发现但指定output不可写 -- **THEN** 保留检查结果并返回操作未完成及恢复位置,不丢弃finding或假称报告已保存 - -#### Scenario: Non UTF8 paths and equivalent tool findings are exported -- **WHEN** 路径含非UTF8字节且多个工具报告近似文案 -- **THEN** 保留可逆路径身份,仅按批准等价映射归并,不能按展示字符串抵消发现 - -### Requirement: npm public CVE feedback SHALL preserve local observation boundaries - -`cve typescript PATH` SHALL 支持显式Node/npm入口、具体版本、原用户/全局配置、可选审计源及共同预算;不执行package脚本、fix或安装。缺上下文提供结构化准备原因,重复/未知参数为使用错误。human/JSON MUST 反馈配置声明、原生依赖数量和脱敏组件/advisory/锁版本观察;零发现不得成为库覆盖或交付通过。当前局部协议固定advisory_coverage和delivery_decision为not_evaluated、工具unverified;工作台反馈必须反映未连接、准备失败或实际同步结果,不能固定声称已连接。取消退出130,其余局部反馈退出3,不能假称完整CVE检查。 - -#### Scenario: Explicit npm invocation returns coherent empty audit -- **WHEN** 公开命令获得本轮稳定输入和一致原生空报告 -- **THEN** 保留依赖数量、声明状态与具体下一步,库覆盖/交付仍未判定,不能手动关闭修复任务 - -#### Scenario: npm context missing or interrupted -- **WHEN** 未提供工具/配置上下文或执行被取消 -- **THEN** 输出准备/取消原因,不生成源码违规、不安装工具、不批准白名单;取消不要求修改源码 - -### Requirement: npm public audit SHALL consume shared runtime timeout defaults - -npm公开CVE入口 MUST 按CLI、登记环境变量、项目runtime.json、内置默认值顺序选择超时预算。只在项目配置成为候选时读取并严格校验,不以无效文件回退掩盖错误。参数及环境值错误为使用错误;项目默认值无效为准备未完成,并在原生工具启动之前停止。反馈0.2 MUST 记录最终预算与来源,未取得有效预算时为null;不能声明可中断文件I/O的硬预算。历史0.1反馈仍按原严格结构消费,不补造预算。 - -#### Scenario: npm timeout precedence and malformed project defaults -- **WHEN** 原项目预算、登记环境值与CLI值同时存在或低优先级文件格式无效 -- **THEN** 只使用最高优先级合法来源,显式CLI值不因低优先级坏文件失败;项目文件为候选且含未知字段、坏协议或符号链接时返回未完成,原生审计不启动 diff --git a/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md b/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md deleted file mode 100644 index 01f4244..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/specs/verdict-integrity/spec.md +++ /dev/null @@ -1,57 +0,0 @@ -## MODIFIED Requirements - -### Requirement: Verdicts SHALL preserve uncertainty across interfaces - -显式 legacy-v1 入口 MUST 保持 PASS、FAIL、UNVERIFIED、SKIPPED、PLANNED 及原聚合退出约定:通常 FAIL=2、无 FAIL 但有未验证/计划项=1、已验证或无须检查=0;各旧子命令的已记录差异由兼容层保持。仅真实成功检查允许 passed=true,无法验证不得触发自动修复或 all passed。 - -旧 `check`、CVE 与 Dockerfile MUST 分别保留其混合优先级:前两者在已确认 FAIL 与 UNVERIFIED 并存时返回旧 2,Dockerfile 在同样组合时返回旧 1 且保留已确认风险。旧 CVE 参数错误是 3,而其他使用 argparse 的旧检查/修复/规划入口参数错误为 2;旧 PreToolUse 的 2 是宿主拦截。兼容投影和 MCP/Hook 生命周期成功都 MUST 固定为新版交付 `not_evaluated`,不得按旧数字推导新版 allow。 - -Rust 新入口 MUST 使用 unified-cli-contract 的版本化协议,MUST 将执行完整性与 findings 分离;混合未完成和违规保留两者并退出 3。CLI/MCP/Hook 转换 MUST 根据协议和结构化语义,不能根据同一个数字猜测通过。此版本边界同样约束旧 CVE、Dockerfile 等结果在新入口的映射。 - -#### Scenario: Configuration error survives MCP serialization -- **WHEN** 旧入口检查器因配置错误退出且没有有效违规结论 -- **THEN** 旧 CLI 退出 1,旧 MCP 返回 passed=false、UNVERIFIED 和原因 - -#### Scenario: Configuration error survives Rust MCP serialization -- **WHEN** 新入口同一检查因配置错误未完成 -- **THEN** Rust CLI 退出 3,MCP 保留 incomplete,不能通过协议转换生成 PASS - -## ADDED Requirements - -### Requirement: Required completeness SHALL gate Rust delivery - -Rust 交付普通 allow MUST 同时满足全部适用必需义务完成、覆盖匹配、内容与批准策略身份有效、无原始阻断违规。缺工具、无实现、坏报告、超时、缓存身份失败或输入变化 MUST NOT 成为 allow。未选择的类别与有理由不适用的类别 MUST 明确区分。 - -有效误报白名单命中不得抹去原始阻断发现。若全部义务完整、无未经处置的阻断 finding,且存在有效批准的精确误报处置,交付决策 MUST 为 `allow_with_exceptions`,不得显示普通 `allow`;未完成优先于违规和例外放行,未处置的阻断优先于例外放行。`allow_with_exceptions` 仅表示本次输入在带批准引用的策略下可交付,不表示原工具没有报告问题。 - -#### Scenario: No findings but a required tool is missing -- **WHEN** 已运行检查无违规但另一必需工具缺失 -- **THEN** 交付 incomplete,不制造代码违规,也不允许交付 - -#### Scenario: Project scope changes while native checks run -- **WHEN** 初次发现后、原生工具运行期间,项目新增源码或改变原生规则配置 -- **THEN** 检查结果保留已经取得的原生发现,并明确标记本轮范围变化、要求重新发现与复检;第二轮发现不能被自动当作批准义务账本。仅有 CodeGuard 自有受管记录变化时不得误报项目范围变化 - -#### Scenario: Existing source bytes change while native checks run -- **WHEN** 初次发现的源码路径不变,但原生检查器或并发编辑改变该路径的文件字节 -- **THEN** 本轮检查标记输入内容变化并保持 incomplete,保留已观察到的原生诊断;无法安全捕获或复核全部目标字节时也保持 incomplete,不得把静态路径集合未变解释为内容稳定 - -#### Scenario: Finding remains in a historical file -- **WHEN** 必需规则检出历史文件中的违规 -- **THEN** 保留 finding 并按同一策略阻断,基线分类不能改变结果 - -#### Scenario: Approved false positive is the only blocker -- **WHEN** 全部适用义务完整,唯一原始阻断 finding 有当前输入匹配的可信误报白名单 -- **THEN** 报告保留原始 finding 和处置引用,交付决策为 allow_with_exceptions - -#### Scenario: Approved false positive coexists with a real violation -- **WHEN** 同轮有有效误报白名单与未经处置的阻断 finding -- **THEN** 两者均报告,交付决策为 deny;若还有未完成义务则为 incomplete - -### Requirement: Coverage SHALL not change with scheduling strategy - -Rust MUST 在调度前依据项目配置、适配能力和批准策略建立完整的**实际必需义务**;候选检测族目录不自动生成义务。分批、并发、缓存和增量 MUST 保持这些必需义务的等价覆盖与判定;计划复用而未重跑的必需义务必须具有有效复用依据,否则未完成。这是交付判定的覆盖约束,不要求向智能体额外展示逐候选检测族的执行证明。文件数量阈值 MUST NOT 改变历史问题是否阻断。 - -#### Scenario: A clean extra file crosses a batching boundary -- **WHEN** 目标从 50 个增加至 51 个文件但已有违规未变 -- **THEN** 原违规的门禁影响不变,不能因切换扫描方式而豁免或新增归因 diff --git a/openspec/changes/introduce-rust-codeguard-cli/tasks.md b/openspec/changes/introduce-rust-codeguard-cli/tasks.md deleted file mode 100644 index a265ebd..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/tasks.md +++ /dev/null @@ -1,975 +0,0 @@ -# Tasks:统一 Rust Codeguard CLI - -本文件跟踪**进行中的实现**;已完成的工程基线任务有独立代码与验收证据,其余项目保持未完成。规格事实源为本 change 的 `specs/`;设计展开在 [design](design.md)。每项完成需要关联代码、测试和实际证据,不以存在文件、编译或模拟报告替代。 - -当前范围与逐项依赖/验收导航见 [实施覆盖索引](implementation-coverage.md):每个Requirement、命令和语言都有任务定位,每个task都有规格依据。阶段/汇总任务完成须满足其关联明细;不得重复创建第二份任务状态。 - -实施按红→绿→相关回归推进;每个批次先重新检查 Git/AGENTS/现有完成度。仓库创建、分支切换、工具安装、规则权威变更和发布按当时用户授权执行,不从本任务清单推断已经授权这些动作。不得修改本插件外部受管技能副本。 - -## 1. S01 契约与工程基线 - -依赖:无。覆盖:unified-cli-contract、native-tool-adapters、binary-distribution。 - -- [ ] 1.1 核对最新旧源码与 57 项清单差异,建立“保留正确行为 / 明确纠偏 / legacy 兼容”表;验收:每条差异关联 spec 和 fixture。 -- [x] 1.2 在获准位置建立用户指定 `codeguard-cli/` 四 crate workspace,锁定 MSRV/依赖/Cargo.lock;验收:可运行 `codeguard --version`,无空适配器充数。证据:相邻 `codeguard-cli/tests/acceptance/engineering-baseline.md`;真实适配器能力仍为 gap。 -- [x] 1.3 建立 crate 依赖方向检查;验收:core→runtime、adapters→runtime、宿主 SDK 入 core 等反例均被拒绝。证据:相邻 `codeguard-cli/crates/codeguard-cli/tests/crate_boundaries.rs` 与工程基线验收记录;检查器已改用 Rust 消费 Cargo metadata。 -- [x] 1.4 创建真实语料登记、脱敏和 oracle 格式,收录当前误判/假通过最小样本;验收:源码/工具/规则身份可复现,争议样本独立标记。证据:相邻 `codeguard-cli/tests/acceptance/corpus-baseline.md`;Rust 语料验证与真实 Ruff/Maven 回放已替代新工程的 Python 辅助脚本,历史未复现样本不计入已接受 oracle。 -- [x] 1.5 定义 language×category×platform 能力 schema 和生成文档入口;验收:54 stable/3 planned 全覆盖,formatter-only 不能伪装 lint。证据:相邻 `codeguard-cli/tests/acceptance/capability-inventory.md`;当前全部单元诚实标记为 gap。 -- [ ] 1.6 固化应用服务与ports边界:观察/政策/计划/检查/交付/存储/租约/修复及schema所有权;交付:真实领域契约和依赖测试;验收:CLI/MCP共用服务、core无基础设施依赖,新CLI与验收工具为Rust实现,P3C/Maven等通过Rust runtime调用其原生命令,不以空stub计功能完成。 - -## 2. S02 CLI、结果模型与门禁 - -依赖:S01。覆盖:unified-cli-contract、verdict-integrity。 - -- [ ] 2.1 实现统一命令语法、canonical ID/别名及只读 plan;验收:错参无进程副作用、plan 不运行构建/扫描。 - 进行中:相邻 Rust CLI 新增 C06 的只读 `plan_preview` 0.1,先校验类别/canonical 语言 ID,再静态观察配置;缺可信策略和工具锁时只列候选、不给执行 argv/正式义务、退出 3。目标集成测试验证伪造 Ruff 工具未运行及项目无新增文件,见 `codeguard-cli/tests/acceptance/plan-readonly-preview.md`。别名、可信政策、全量义务/DAG 和正式 CheckPlan 仍缺,不勾选。 -- [x] 2.2 定义请求/计划/报告/工具锁 JSON schemas 与兼容版本策略,提供完整正反例;验收:未知 major/非法枚举不按 PASS 消费,运行报告区分项目检查器的 `configured/missing/invalid/unknown` 与本次原生结果。证据:相邻 `codeguard-cli/schemas/run-report.schema.json` 的 1.2 协议、`crates/codeguard-cli/src/run_report.rs` 与 `tests/run_report_contract.rs` 的正反例;1.0 历史报告仍可读取,1.1 起区分配置和运行,1.2 起 finding 要求定位且检查器状态按构建根区分。此项只完成协议,不代表项目配置探测或宿主对话接线已完成。 - 公共协议输入加固:Rust 检查请求和 RunReport 现从原始字节递归拒绝重复 JSON 键,并复用 16 MiB 输入上限;`delivery_gate`/`decision` 和嵌套 `jobs` 重复键反例先失败后通过。此校验只保证结构消费,不验证报告来源或正式门禁。 -- [ ] 2.3 实现 findings 与 completion 双维聚合及新退出码;验收:混合违规/缺工具返回 3 并保留全部发现,取消/内部异常优先级正确。 - Python CVE 部分结果增量:`check all` 对完整但原生异常退出或输出超限的 pip-audit 报告,保留已归属 advisory;执行节点与类别候选均为 `native_incomplete`,未解决条件保留 `python_cve_task_incomplete`。旧汇总层仅按 `native_report_valid=true` 将部分报告误记成功,反例先 RED 后修正;两份实际总报告通过 schema。完整 findings/completion 跨语言、取消与内部异常优先级仍缺,2.3 不勾选,见相邻 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。 - 内部故障反馈进展:`check all/java` 的任务图若返回内部故障,现以退出 4 输出结构化 `check_aborted`,保留兄弟任务已取得的原生局部结果、发现及每项任务状态;交付为 incomplete/not_evaluated。同轮同时有取消时优先退出 130,仍保留故障任务 ID 与原生发现。它不是完整 RunReport,调度器自身失败和跨入口聚合尚未完成,2.3 仍不勾选。 - 取消优先级进展:`check all/java` 的 `check_feedback` 升至 0.16,实际 SIGINT 并行回归证明一项 Ruff 原生任务取消后退出 130,同时保留另一项已完成的 Rust Clippy finding;状态明确为 cancelled,交付仍 incomplete/not_evaluated。`lint python` 对话反馈也升至 0.11,真实 SIGINT 原生探测退出 130,保留局部反馈与子孙清理证据。其它入口、调度器故障与完整义务聚合仍缺,2.3 不勾选。 - 接线进展:公开 `check all` 可从项目发现列出已观察语言的六类候选,正式必需义务保持 unresolved/null;Python 源文件复用原生 Ruff lint、报告同步和 next,Rust 源文件有显式 Cargo 工具时运行局部原生 Clippy。混合项目中 Python 缺工具不吞掉 Rust 诊断,仍返回 3/incomplete。当前只是局部检查反馈,不是完整 RunReport 或全部检查族结果;见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`,2.3 不勾选。 - Java 接线进展:`check all` 0.7 增加独立 `java.p3c` 节点,按最近 Maven 构建根识别已配置的 P3C,只读项目配置与隔离原生单文件探针分别反馈。缺配置不启动 Maven;原生诊断含规则/位置进入 JSON/human。隔离探针提供十个 P3C 规则集,但项目检查只选择 POM 中可静态确认的子集;POM 无法对齐或变化时保留配置阻塞。Java lint 候选即使局部探针完成也保持 `native_incomplete/p3c_declared_rulesets_unverified_coverage`,不伪称完整 lint 或交付通过。真实 Maven/JDK 21 离线用例与未配置、嵌套构建根反例见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。完整义务聚合仍缺,2.3 不勾选。 - 局部语言选择进展:公开 `check java` 复用同一 P3C 节点与任务同步,混合项目只调度 Java、只列 Java 候选,`check_feedback` 0.8 固定 `selection=java`/`delivery_decision=not_evaluated`/退出 3;真实 Maven 样本仅在 POM 同时声明 naming/comment 时返回命名和作者注释两条规则。完整义务集合、其它 Java 检查器及交付聚合仍缺,2.3 不勾选。 -- [ ] 2.4 实现义务账本和交付决策;验收:类别命令、空目标、缺 adapter、未执行任务均不能签发项目 allow。 - `check all` 当前固定不完整,显式列出未接入的候选类别;只有受保护策略才可确定必需义务,候选目录不自动升级为账本,原 2.4 验收仍未完成。 - 进行中:相邻 Rust 领域门禁现将独立冻结的应有义务 ID 与实际计划逐项对照;丢失、重复或额外 ID 使交付 incomplete,`conclude_check` 的请求退出 3,已发现问题仍保留。见 `codeguard-cli/tests/acceptance/frozen-obligation-ledger.md`。可信策略/完整发现如何生成和绑定冻结清单、正式 plan/check 的接线尚未实现,不勾选。 - 追加 finding 身份冲突校验:即便义务 ID 和目标覆盖均完整,两条原生发现共用一个 finding ID 也使受影响账本无效,防止门禁按集合去重后误签例外;CLI 完整接线仍缺,2.4 不勾选。 -- [ ] 2.5 实现统一 human/JSON/SARIF 渲染与私有证据引用;验收:结构化 stdout 纯净、SARIF 未完成可见、公开报告不泄露凭据。 - 局部进展:相邻 Rust 工程已有结构有效 RunReport 的纯 SARIF 2.1.0 投影;未完成零发现仍显示失败通知,白名单 finding 保留且不自动 suppression,原生消息与路径留在私有证据。正式 CLI 格式入口、来源核验及全格式一致性仍缺,2.5 不勾选。 - 命令接入进展:实际 `check all/java --format sarif` 已从同轮局部反馈投影已观察的原生 finding;无发现、内部故障及取消仍用失败执行通知表达,原生诊断文本和路径不公开。它尚非完整 RunReport,`lint`/其它检查类命令、`--output`、可信来源和全格式一致性仍缺,2.5 保持未完成。 -- [x] 2.6 建立具名 legacy-v1 协议映射表和参数测试;验收:逐旧入口验证数字/混合优先级,不把兼容通过当新认证。证据:[逐入口映射表](../../../docs/rust-cli/legacy-v1-protocol-map.zh-CN.md) 与相邻 Rust 工程 `tests/acceptance/legacy-v1-protocol-map.md`;CLI 数字及 check/CVE/Dockerfile 混合优先级由 Rust 参数契约核验,MCP 无逐调用进程码、五类 Hook 宿主语义逐项登记,所有兼容投影固定 `not_evaluated`。旧插件 164 项相关回归及 7 项 MCP 实测通过。此项只完成协议映射,不声称 C35 兼容运行时、宿主接线或新版交付认证完成。 -- [ ] 2.7 实现 C01–C36 命令注册、help/版本元数据、操作结果类型与参数支持矩阵;验收:文档/help/CLI/MCP映射无漂移,查询/计划/安装成功不能变为质量allow。 - 进行中:相邻 `codeguard-cli` 已提供 C02 `--version --format human|json`,包含 CLI/目标平台/检查协议 major,并把尚无发布证明的构建身份、规则包兼容范围明确标为未验证;见 `schemas/version-report.schema.json` 和 `crates/codeguard-cli/tests/version_cli.rs`。其余命令注册、帮助生成、MCP 映射与版本化支持矩阵仍缺,暂不勾选。 -- [ ] 2.8 固化每类命令timeout/jobs默认值、来源与总deadline;验收:子进程/重试不重置预算,非法预算执行前拒绝,清理未完成真实可见。 - 进行中:相邻 Rust `check all` 局部入口现接受 1ms–24h 的 `--timeout`,默认 30m;非法预算在原生启动前返回 2,Ruff 版本探测与逐文件检查继承同一截止时间,超时给出 `request_deadline_exceeded` 而非本地完整。见 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。发现、持久化/清理硬预算、其它命令默认值来源、跨命令 jobs、重试和跨平台验收仍缺,不勾选。 - 后续进展:`lint python` CLI 复用相同检查类预算解析与 30m 默认值,从解析后建立截止时间并传入原生 Ruff 链;无效预算和原生探测超时有 CLI 回归。见相邻 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md`。任务复检、其它命令、来源报告及完整 I/O 预算仍待完成。 - 复检进展:`task verify` 局部 Ruff 入口现复用同一预算解析和截止时间;非法预算在租约前拒绝,原生探测超时后复检观察为 incomplete、不写新事件、自有租约释放、任务仍 open。见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`。租约和持久 I/O 的硬截止时间、来源报告、清理状态、jobs/重试及其它命令仍未完成。 - 来源进展:三个已接入 CLI 反馈均已版本升级,公开 `execution_budget` 明确记录最终毫秒值、来源及 `native_execution_only` 的实际执行边界;本地 0.8 原始扫描报告不因对话协议升级而改写。见相邻 `codeguard-cli/tests/acceptance/{check-all-partial-native,lint-python-auto-brief,task-verify-native-observation}.md`。全部 I/O 截止时间与清理状态仍缺,2.8 不勾选。 - 环境优先级进展:三个局部入口现登记 `CODEGUARD_TIMEOUT`,反馈来源枚举新增 `registered_environment`;非法环境值在原生执行/租约前返回 2,显式 CLI 可覆盖无效环境值。`CODEGUARD_JOBS` 目前只接 `check all`;完整 I/O 截止时间及清理状态仍缺。 - 项目默认进展:可选 `codeguard/runtime.json` 1.0 仅允许 `timeout`,三个局部入口按 CLI > 登记环境 > 项目默认 > 内置默认选择并报告 `project_default`;坏协议、额外质量排除字段、超限/链接文件及非法预算在原生执行/租约前拒绝。`check all` 另支持 1.1 可选 `jobs`、`--jobs`、`CODEGUARD_JOBS` 与 1–64 边界,并向 DAG 传入实际并发上限;反馈区分上限、原生节点数与启动数。混合 Python/Rust 项目现有两个独立节点,旧入口尚未扩展 jobs,实际并发及跨进程资源互斥仍需验收。见相邻 `codeguard-cli/schemas/runtime-options{,-1.1}.schema.json` 和 `tests/acceptance/{check-all-partial-native,lint-python-auto-brief,task-verify-native-observation}.md`。全部 I/O 截止时间及清理状态仍缺,2.8 不勾选。 -- [ ] 2.9 实现报告原子导出、可逆路径编码、多位置/包定位及来源保留;验收:output不可写为3且原finding保留,未知major拒绝,不按有损路径或相似文案跨工具抵消发现。 - 局部进展:`check all/java` 的 JSON/SARIF 已支持 `--output PATH` 同目录暂存与原子写入;目标不可用时本轮报告仍在 stdout,已发现的原生问题不丢;已有非 CodeGuard 文件不可覆盖。human/其它检查类命令、可逆路径与多位置/包身份、完整 RunReport 导出及跨工具归并仍缺,2.9 不勾选。 - 反馈补强:局部 JSON 0.18、故障报告 0.3 与局部 SARIF 现显式返回导出状态及受限失败原因码,使只消费结构化 stdout 的智能体也能看到保存失败;成功文件和 stdout 同报 `saved`。完整 2.9 仍未完成。 -- [ ] 2.10 升级 RunReport 与所有公开消费者的白名单处置协议;验收:新版本明确 raw/active/whitelisted finding、批准引用和 allow_with_exceptions,旧消费者拒绝未知决策而非降级为普通 allow,human/JSON/SARIF/MCP/Hook 语义一致。 - 进行中:相邻 `codeguard-cli` 已提供 RunReport 1.3 schema/严格消费和 conversation feedback 0.2 JSON/human,初期白名单协议与旧报告契约测试见 `tests/acceptance/run-report-allowlist-protocol.md`。后续已有保守 SARIF 投影,仍无真实报告生产、可信来源、MCP/Hook 消费者与端到端门禁,不勾选。 - 协议身份接线:RunReport 1.4 要求每条 finding 的完整原生身份,并在误报处置中核对精确决策身份;规则、工具制品、检查器类别和主目标须与本轮报告一致,源码字节/指纹/适配器/rulepack、依赖图/advisory 变化拒绝处置。旧 1.3 schema 原件留存,未来未知版本拒绝;human/JSON/SARIF 继续明确来源及批准未核验,不能凭自写报告签发 allow。当前仅结构消费,真实原工具身份生成、可信来源、MCP/Hook 和正式门禁仍缺,2.10/4.8 不勾选。 - 覆盖/字节复核增量:1.4 源码 finding 主目标必须同时属于本义务预期和实际覆盖集合;宿主可调用只读 `compare_claimed_source_hashes` 对其独立指定工作区内全部源码目标按真实字节比较 SHA-256,文件变化、缺失、链接或超预算均拒绝。该接口尚未由正式门禁调用,不能验证自称的原生结果或批准来源;2.10/4.8 不勾选。 - 领域进展:`codeguard-core` 门禁现保留原始/已批准例外/活跃阻断三个集合;完整且唯一的例外形成 `allow_with_exceptions`,混合真实阻断为 deny、未完成与批准冲突为 incomplete,取消和内部故障不能留下交付 allow。同一批准 ID 跨 finding 复用被拒。仅是纯领域输入契约,受保护审批来源、可信时钟/策略、真实原生身份和公开消费者仍未接入,见相邻 `codeguard-cli/tests/acceptance/allowlist-delivery-domain.md`,2.10/4.8/12.12 仍不勾选。 - -## 3. S03 运行时、快照与缓存 - -依赖:S02。覆盖:execution-kernel、verdict-integrity。 - -- [x] 3.1 实现字面 argv/cwd/env/stdin 的受控进程执行;验收:空格/分号/命令替换字面值无额外执行,探测不消费 stdin。证据:相邻 `codeguard-cli/crates/codeguard-runtime/tests/process_contract.rs` 的 Unix 契约测试与 `codeguard-cli/crates/codeguard-cli/tests/ruff_probe_contract.rs` 的原生 Ruff 版本探测;Windows Job Object 与平台验收由 3.3/11.12 保持未完成。 -- [ ] 3.2 实现并发流读取、总 deadline、输出预算和私有原子日志;验收:洪流/编码错误/日志 symlink 场景无假完整、无越界写。 - 进行中:相邻 `codeguard-cli/crates/codeguard-runtime` 已覆盖 Unix 双流共享预算、短命令退出后才发现超限、直接子进程退出后读流跨过 deadline、超时部分输出和私有原子日志;日志目录逐级拒绝 symlink,Ruff 解析拒绝非 UTF-8 报告。Maven/Ruff 探测在身份和输入复核后再次检查同一截止时间。见 `codeguard-cli/tests/acceptance/runtime-stream-log-baseline.md`。持久化 I/O 的硬截止时间、Windows 对等实现和完整 CLI 门禁集成仍缺,暂不勾选。 - 读流稳定性补强:子进程退出后的 stdout/stderr 排空改用原请求绝对期限,避免原固定 150ms 在并行负载下将已关闭短命令误判为 `ReadFailure`;到期仍为未完成。ESLint 取消/超时回归的伪工具保持扫描时间长于截止时间,但给准备阶段充分启动余量,避免把测试负载抖动误判为扫描行为失败。目标回归及全量证据见 verification;3.2 仍因持久化 I/O、Windows 和正式门禁缺口未完成。 -- [ ] 3.3 实现 Unix 进程组与 Windows Job Object 的取消/终止/回收;验收:子孙进程、超时、Ctrl-C、排队取消有平台实测。 - Unix 局部进展:相邻 Rust runtime 新增 CLI SIGINT 原子取消桥接,原生执行循环在取消后终止并回收进程组;`process_contract` 通过超时/取消后子孙进程不得延迟写文件的真实副作用测试,`lint_python_cli` 从红测到绿测证明真实 Ctrl-C 返回 incomplete、`request_cancelled` 且无后台延迟写入。仅在当前 macOS Unix 环境验证;Windows Job Object、排队取消与其它宿主入口仍缺,故不勾选。 -- [ ] 3.4 实现任务 DAG、资源锁及依赖失败传播;验收:独立任务继续、共享 build 目录互斥、失败依赖未完成可见。 - 纯领域/运行时进展:相邻 Rust core 新增执行前校验的 `TaskGraph`,拒绝重复 ID、缺失/重复/自依赖、重复资源和依赖环;runtime 新增有界并发调度,按资源 ID 互斥,失败链逐层标记 `DependencyFailed`,独立任务继续,排队取消/超时不启动,回调 panic 不当成功。见 `codeguard-cli/tests/acceptance/task-dag-scheduler.md`。正式 CheckPlan/义务账本与 CLI 尚未接线,构建目录资源规范化和跨进程锁也未实现,故不勾选。 - CLI 局部接线:`check all` 将适用的 Python/Ruff 与 Rust/Cargo Clippy 节点送入调度器,共用取消标记和截止时间;公开 `check_feedback` 0.6 的 `execution_tasks` 把本地原生完成标为 `native_observed_unverified`,混合项目一个节点失败不丢另一个节点的诊断。真实并发、正式义务清单和构建目录资源规范化仍缺,见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 - Java 扩展:`check_feedback` 0.7 增加 `java.p3c` 独立节点,复用相同截止时间和取消标志,缺项目配置或工具前提仍保留文件级原因。原生 Maven 探针使用私有临时工作区;完整规则集、跨模块构建资源锁及工作区级义务仍缺,3.4 不勾选。 -- [ ] 3.5 实现工作树/index/ref 快照与原始字节校验;验收:SHA-1/SHA-256、坏批响应、特殊文件、symlink/gitlink/LFS 均明确处理。进行中:相邻 Rust CLI 已按 NUL 协议读取真实 index、前后复核列表,并对有界普通 blob 独立核验 SHA-1/SHA-256 Git OID、记录脱敏字节摘要;symlink/gitlink/LFS、超预算和对象读取失败明确 unresolved,见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。工作树/ref 快照、坏批响应注入测试、特殊类型完整语义及 Git 工具身份未完成。 -- [ ] 3.6 实现 GIT_INDEX_FILE、初始提交、worktree、多 ref/non-HEAD/删除 ref push 输入;验收:真实临时 Git 仓检查准确且 index 不变。进行中:相邻 Rust 的真实 index 路径安全预览覆盖初始仓库、替代 `GIT_INDEX_FILE` 与默认 index 不变;worktree 和 pre-push 多 ref/删除 ref 尚未实现,不勾选。 -- [ ] 3.7 实现执行前后内容身份复核和源码副作用检测;验收:并发编辑或检查器改源码导致 incomplete。 - 进行中:相邻 Rust runtime 新增显式相对路径的有界 `SourceSnapshot`,拒绝静态可见的路径越界、重复、符号链接及预算超限;私有副本须写入新目录,运行后复核原件与副本字节。JDK Javadoc 单文件入口已使用此契约,真实 JDK 21 与链接/修改反例通过,见 `codeguard-cli/tests/acceptance/source-snapshot-boundary.md`。调用方源集完整性、并发目录替换的内核级隔离、其它 adapter 接线和项目级 Maven 副作用仍缺,3.7 不勾选。 - 路径并发补强:Unix 读取和复核改为从固定根目录描述符逐级 `openat`/`O_NOFOLLOW`,目录在检查期间切换为范围外符号链接的真实并发反例只能返回原范围字节或错误。副本写入和整个原生进程仍无完整沙箱;源集完整性、其它 adapter 接线和项目级 Maven 副作用仍缺,3.7 不勾选。 - `check all/java` 局部范围复核:原生节点结束后再次静态发现,比较源码/清单集合、构建根、已观察清单/锁/检查器配置摘要及配置状态;新增源码或规则配置变化会加入 `project_scope_changed_during_check`,原诊断保留。截止时间已耗尽则报告范围复核未执行;自有 `codeguard/state` 记录不造成假变化。尚未逐字节冻结全部源码、捕获瞬时改回、实现完整内核隔离或受保护义务账本,3.7/2.4 不勾选。 - 同路径内容复核增量:`check all/java` 在原生节点前对初次发现的源码集合建立有界 `SourceSnapshot`,节点后从固定根目录描述符复核原路径字节。同一路径内容变化加入 `project_source_changed_during_check`;文件数/单文件/总字节超限或安全读取失败显式标记快照或复核不可用,不产生 allow。静态配置文件若同时被归类为源码,其内容变化也可触发此项;仅写入 CodeGuard 自有记录不触发。快照非原子、无进程沙箱,改后又改回、末次复核之后的变化和未发现目标尚不能捕获,3.7/2.4 仍不勾选。 -- [ ] 3.8 实现严格缓存及义务等价证明;验收:同 mtime/size 内容替换、规则/依赖/工具/库变化必失效,软缓存不可直接认证。 -- [ ] 3.9 实现run/obligation/task/attempt关联轨迹与分阶段计时、缓存/终止原因;交付:脱敏结构化本地事件;验收:部分失败可追溯,公开轨迹不泄露原始argv/env,不默认上传遥测。 -- [ ] 3.10 实现证据索引、私有权限、引用与保留策略及受管清理;验收:活动run/lease、被引用证据、用户源码和tracked历史不被清理,磁盘/权限/symlink失败不扩大删除或伪造完成。 -- [ ] 3.11 实现离线与可信执行边界port及能力探测;验收:主动联网子进程被拒绝,无法保证时启动前incomplete;可信政策/签发身份不进入项目脚本执行域,真实平台证明由S11/S12补齐。 - -## 4. S04 规则与策略权威 - -依赖:S02。覆盖:rulepack-governance。 - -- [ ] 4.1 实现运行配置与批准质量策略的独立解析及 config explain;验收:CLI/env 无法弱化 required/threshold/exclude。 - 进行中:相邻 Rust CLI 已有 `quality-policy-candidate` 1.0 严格解析,并在 `config validate/explain --policy-candidate` 只读显示必需检查、规则包/工具锁摘要、时效和精确内容绑定排除;重复、未知、自批和通配被拒。候选即使与本地工具锁字节匹配仍固定 `candidate_unverified`,不形成有效策略。运行参数与受保护批准策略的绑定及真实覆盖仍缺,见 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`,4.1 不勾选。 -- [ ] 4.2 实现旧 codeguard.json 显式迁移和原生 suppressions 差异解释;验收:未知/损坏字段不静默丢弃或按默认通过。 - 追加进展:相邻 Rust CLI 的 `config validate/explain` 已只读识别旧 `extensions/exclude/gate_scope/java.commands`,拒绝未知/损坏字段、符号链接与坏工具锁;旧排除、delta 范围和命令均不自授策略权威,固定退出 3。尚未执行正式 schema 迁移或覆盖完整原生 suppressions,见 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`。 - 进行中:Ruff 0.16.8 局部扫描现以同轮原生 `--ignore-noqa` 对照记录源码注释抑制差额,原生结果未据此生成活动 finding 或质量通过;这尚不构成旧配置迁移、受批准 suppressions 差异解释或其它生态覆盖。见 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 -- [ ] 4.3 实现 rulepack manifest、来源/许可、稳定规则 ID、摘要和兼容锁;验收:内容篡改/不兼容组合不能执行认证。 - 进行中:相邻 Rust 工程新增仅用于 Ruff 0.16.8 F401/E501 的 `candidate_unapproved` 映射清单,严格解析来源、许可、精确版本、规则 ID 和字节摘要;完整本地报告记录已观察到的映射身份,同步时重算并拒绝篡改。它不设置原生规则覆盖,也不具备受保护批准,不能执行认证。见 `codeguard-cli/tests/acceptance/ruff-rulepack-observation.md`。 -- [ ] 4.4 实现基线仅分类 new/existing;验收:未修改文件中的存量违规仍阻断,基线失败不消除 finding。 -- [ ] 4.5 实现可信政策修订和例外输入校验;验收:agent 自写批准、无到期、过期、错内容或错范围凭据不生效,批准例外不显示普通 PASS。 - 签名进展:Rust 已增加域分隔 Ed25519 原始载荷核验,绑定工作区、策略修订、受保护 Git 基线、序号、期限与快照字节;普通候选桥接还核对签名与快照内修订,再走精确字节/身份绑定。可信公钥、撤销、时间和最低序号仍须由宿主提供;未提供项目自批入口。签名四项及原快照十五项通过,见相邻 codeguard-cli/tests/acceptance/signed-approval-binding.md。宿主信任来源、完整签名修订链及真实门禁尚缺,4.5/4.8 不勾选。 -- [ ] 4.6 保留点前缀默认策略及两项例外,生成汇总覆盖;验收:F18 全部成立,无未授权的新排除。进行中:相邻 Rust `detect` 0.3.0 已汇总普通发现的点前缀排除根、配置例外文件及未评估入库安全状态;`gate pre-commit` 路径安全预览能在真实 index 看到点前缀 `.env`,见 `codeguard-cli/tests/acceptance/{dot-prefix-scope-baseline,git-index-safety-preview}.md`。完整安全内容扫描与正式 Git 门禁未接线,不能勾选。 -- [ ] 4.7 接入 rules list/config validate/explain 命令;验收:有效规则、原生suppression与批准来源可解释,静态验证不执行项目脚本,配置错误为未完成而非源码违规。 - 追加进展:`config validate/explain` 0.1 只返回旧配置与工具锁的静态状态、未绑定的可信质量策略和无效白名单权威;不产生有效策略或质量门禁。`rules list`、规则/原生配置差异和批准来源解释仍缺,任务不勾选。 - 2026-09-27入口进展:Rust rules list现复用静态发现及内置版本化Ruff候选映射,逐语言显示配置声明、来源/许可/摘要/兼容版本和六类目录缺口;Node生态显式映射到TypeScript,不靠语言前缀丢失ESLint配置。动态配置不执行、本地同名映射/自批不授权,报告0.1固定未完成且无门禁效果。新增schema及验收用例,结果见verification.md。完整有效规则、可信来源、suppression和批准例外仍缺,4.7不勾选。 -- [ ] 4.8 实现精确误报白名单 schema、可信来源解析和 Rust 匹配器;验收:仅同一原生规则、目标/内容、工具/规则包/适配器及有效批准身份命中;通配、过期、冲突、自批和坏报告均不放行,原始 finding 保留。 - 门禁碰撞反例:两个原生规则/义务共用 finding ID 时,旧纯领域门禁会把单条批准扩展到另一条;现将重复 ID 标为无效义务账本,白名单不匹配,原始阻断仍显示。可信批准接入、本轮原生身份和所有格式消费者仍缺,4.8 不勾选。 - 原生身份加固:领域 finding 现可携本轮宿主冻结的完整身份,白名单处置必须同时与该独立身份匹配;缺字段的旧 finding、源码字节/指纹/工具/适配器/rulepack 摘要变化、依赖图或 advisory 变化均保留原始和活动阻断并返回 incomplete。该字段由谁从真实原工具和内容字节生成、如何验证宿主来源尚未接入;项目 JSON 自填同值不能取得信任,4.8 继续未完成。 - 进行中:相邻 `codeguard-cli` 已实现不具授权效果的精确身份匹配、严格候选 schema/解析器、期限/策略修订/多候选冲突筛选,以及批准快照的字节摘要绑定;后者可拒绝不在先前固定快照中的候选,但预期摘要仍由调用方提供。见 `tests/acceptance/false-positive-identity-baseline.md` 与 `tests/acceptance/approval-snapshot-baseline.md`。可信策略/时钟和摘要来源、批准引用独立核验、同 PR 自批的受保护 CI 验证及门禁接线仍缺,不勾选。 -- [ ] 4.9 接入 `rules whitelist list/explain/propose` 与 config validate/explain;验收:propose 只从本轮完整原生 finding、工具/适配器/rulepack 身份和内容复核生成候选;缺任何身份则报告未完成与补证据动作,不能填占位摘要;查询解释批准与失配原因,普通项目文件不能自授权,系统性误报走经批准的规则修订。进行中:相邻 Rust CLI 已提供显式候选文件的只读 `rules whitelist list/explain`;explain 可对显式提供的发现身份解释精确匹配或失配,观察身份与批准来源均未核验,始终标记 `authority=unverified`、`gate_effect=none`;坏文件、重复 ID、缺失目标均不能呈现为批准。`propose` 已能从本地稳定任务返回缺本轮身份的未完成预览,固定 candidate=null、无门禁效果,见 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`。`config validate/explain` 已有只读候选解析但不能解释可信批准、期限或本轮 finding;自动发现与完整候选生成仍未完成。 - 读取加固:`list/explain` 的候选与显式观察身份、纠错入口的旧决策与替代候选,现统一使用运行时有界普通文件读取,拒绝最终路径符号链接并避免文件类型检查后按路径重新打开;查询命中仍不取得批准。相关回归见相邻 `codeguard-cli/crates/codeguard-cli/tests/whitelist_command_contract.rs`;完整可信来源与门禁仍缺。 - 冲突纠正:同一稳定 finding ID 的两条候选即使目标不同,`list/explain` 也将双方标为冲突,不输出任选一条的身份匹配。查询层改动不等于可信批准接入,4.9 不勾选。 - 前置进展:Ruff 局部报告 0.5 已对完整文件记录本轮工具与配置摘要,未完成文件为空;`propose` 0.2 只从最新已同步报告读取仍存在的当前 finding 与这些摘要,未同步/源码变化/新扫描问题消失不回退旧观察。这仍是本地未验证身份,缺适配器、批准 rulepack、可信来源和完整候选生成,见 `codeguard-cli/tests/acceptance/ruff-observed-artifact-identity.md` 与 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`,4.8/4.9 均不勾选。 - 后续进展:局部报告 0.6 与 `propose` 0.3 额外展示 F401/E501 候选规则映射的 CodeGuard 规则 ID、原生工具版本、清单摘要和 `candidate_unapproved`,并将 `approved_rulepack_identity` 明列为缺失证据。该摘要只是本地观察,不会自批准或放行,见 `codeguard-cli/tests/acceptance/ruff-rulepack-observation.md`。 - 适配器身份进展:Ruff 局部报告 0.9 在有原生 finding 且仍有检查预算时记录本次 CodeGuard 可执行制品摘要;`propose` 从已同步报告读取后再核对当前二进制,变更时拒绝旧观察,缺摘要时明确列为未完成。公开 lint 0.12、候选预览 0.4 和 Ruff task verify 0.9 按协议升级,旧 schema 留存;真实 Ruff 复检和篡改报告/同步标记反例通过。该摘要未证明签名发行、批准 rulepack、人工裁定或可信门禁,4.8/4.9 继续不勾选。 - 工具身份复核进展:`propose` 可显式接收绝对 `--ruff-tool`,按当前普通文件字节复核扫描报告摘要;不同或不可读时隐去旧观察、保持 candidate=null/退出 3,不执行工具或签发批准。已增加参数边界及真实 Ruff 正反例;未指定工具时仍只能展示未获信任的历史摘要。可信工具来源、完整候选和独立审批未接通,4.9 不勾选。 -- [ ] 4.10 实现白名单纠错闭环与规则级误报升级路径;验收:候选/驳回/批准/过期/撤销/失配关联稳定 finding 和任务,已批准例外不伪装为代码修复;误批或过宽条目采用旧决策撤销、新候选引用旧决策、独立批准的修订链,冲突或未批准期间不得放行,原任务重开;纠错提案含原决策/稳定 finding/结构化原因/本轮复检引用,替代候选有新 ID 与 replaces_decision_id;只撤销不制造替代、引用链无环、旧新原子切换、扩大范围拒绝;同规则多目标误报生成规则或适配器根因调查,须以正反例和受保护策略修订处理,不自动扩大白名单;评测保留原始发现和人工裁定误报率。进行中:相邻 Rust 快照协议 1.1 可固定撤销 ID,绑定时撤销优先于旧字节命中;可信发布、修订链事件、真实门禁和任务重开仍缺。 - 本轮进展:相邻 Rust 增加替代候选 1.1 schema 与 `replaces_decision_id`,普通绑定不接受缺旧决策的替代结果;专用绑定校验旧决策引用、同一 finding/检查器/规则/类别/目标归属及同快照撤销旧 ID。旧决策来源可信性、完整修订链无环、纠错提案 CLI、任务投影和受保护发布仍缺,任务不勾选。 - 后续进展:前序快照绑定再核对旧决策的字节摘要与原策略修订,拒绝旧字节篡改、前序已撤销、缺固定摘要与新旧同修订;摘要来源和修订先后顺序仍由受保护发布边界证明,多级链及真实门禁未完成。 - 多跳进展:Rust 现可逐跳验证最多 32 个前序候选/快照直到普通根决策,拒绝链截断、乱序、多余节点、重复 ID/修订的环及前序候选超过当时有效期上限。可信发布来源与真实时间顺序、纠错提案/任务事件和真实门禁仍缺,4.10 保持未完成。 - 纠错入口进展:`rules whitelist propose` 追加只读纠错参数,可从已核对的本轮 Ruff `task verify` 收据、稳定 finding 和旧候选预览撤销;仅撤销与替代草稿分别表达,错 run/错目标/复检后源码变化不生成提案。替代身份仍缺批准的适配器和 rulepack,候选/撤销事件、独立批准与门禁未接入,保持未完成。 - 持久记录进展:纠错命令可选 `--record`,持任务锁重查复检证据,将同一提案按内容摘要幂等记录到稳定 finding 的事件目录;事件携带 task_id、原决策/新草稿和复检引用,固定未验证且无门禁效果。`next` 当前简报已可显示待审事件引用,但持久任务 Markdown 投影、独立批准、可信策略发布与真实门禁仍缺,4.10 不勾选。 - - 可读投影进展:纠错 --record 现从持锁重查的同一提案生成 tasks/corrections//.md 历史附件,保留七项任务信息、事件和复检引用。事件保存后附件失败单独反馈,编辑不覆盖、删除可重建;next 只展示与当前事件重建字节一致的附件,不从 Markdown 读取指令。完整任务协调、独立批准、可信发布及正式关闭仍缺,4.10/9.28 不勾选。 - - 复检配置进展:Ruff 当前简报与误报提案复核目标目前选择的配置路径及字节摘要,配置内容或优先级变化时旧观察不驱动纠错;缺配置身份的旧报告要求重新检查。真实 RED 复现 F401→E501 后旧纠错仍展示,以及新增同字节 .ruff.toml 后普通提案仍用旧配置;两者已接入同一只读发现复核。完整可信批准与自动候选仍缺,4.9/4.10 不勾选。 - - 签名链进展:Rust 多跳入口逐跳核验历史签名、快照修订、同工作区、严格序号与时间顺序、历史候选在受保护审核时刻有效;所有 pin 由验签推导,再沿用原精确替代/撤销/无环绑定。历史过期不抹去当时合法批准,公钥最新撤销仍阻止绑定;32 跳上限。三项签名链反例及单快照/旧快照/边界回归通过,见相邻 codeguard-cli/tests/acceptance/signed-approval-chain-binding.md。宿主信任来源、Git 基线祖先与真实发布/门禁仍缺,4.10 不勾选。 - - Git 基线进展:runtime 原生只读祖先观察与 CLI 签名链联合入口已接通,完整提交、对象类型、非浅历史与每跳关系均须匹配;replace/graft 和 lazy fetch 禁用,同一预算/取消贯穿所有调用。真实 SHA-1/SHA-256、伪造关系、缺对象及本地传输正反对照四项,签名链五项通过,见 codeguard-cli/tests/acceptance/git-approval-baseline-binding.md。可信仓库/工具/公钥来源与真实策略发布、宿主门禁仍缺,4.5/4.10 不勾选。 - - 原生 finding 关联进展:领域门禁新增受保护宿主冻结的 checker/tool/category/obligation 映射,并核对原生主定位的源码路径或依赖组件及显式版本;缺定位、错工具/类别/义务、缺失或歧义映射不应用白名单。处置前预先识别重复 finding 引用及复用的批准决策 ID,冲突双方均保留活动阻断,顺序不影响结果。门禁 26 项、会话 8 项与反馈/报告/SARIF 回归通过,见 codeguard-cli/tests/acceptance/native-allowlist-disposition-binding.md。当前为领域/协议用例,可信来源、签名批准到真实原生报告的宿主接线仍缺,4.8/4.10 不勾选。 - - 最终期限进展:领域门禁新增宿主最终判定时钟,要求 observed_at <= gate_time_unix < expires_at 且时钟非零;检查结束到期、缺时钟或回退不沿用取证时刻放行。已验签结果暴露只读 expires_at,当前边界须取当前批准相关约束的最早期限,不用历史到期缩短合法替代条目。门禁增至 29 项,真实时钟来源与批准生产/宿主接线仍缺,见 codeguard-cli/tests/acceptance/final-gate-approval-clock.md,4.5/4.8 不勾选。 - - 签名处置接线进展:门禁新增宿主独立冻结的当前策略修订;旧/缺修订不能沿用白名单。普通及替代签名入口生成只读绑定预览,固定候选/快照摘要、范围、身份和最早期限;替代必须先核验完整签名/Git 链。独立批准标记始终 false,不能从项目 JSON 构造或自批。门禁 30 项、处置三项、实际 Git 链补充用例及受影响回归通过,见 codeguard-cli/tests/acceptance/signed-disposition-preview-binding.md。可信来源及真实批准生产/门禁仍缺,4.5/4.8 不勾选。 - 范围接线进展:只读签名预览保留工作区及当前批准基线,领域门禁与独立冻结范围比较。跨工作区、错基线、非法/缺范围和旧输入均不能应用白名单;没有白名单的普通判定保留。可信宿主来源及正式门禁仍未接通,4.8 不勾选;验收见相邻 codeguard-cli/tests/acceptance/approval-scope-gate-binding.md。 - -## 5. S05 工具适配框架与准备 - -依赖:S03、S04。覆盖:native-tool-adapters、language-gate-commands。 - -- [ ] 5.1 实现 capability/discover/resolve/plan/parse/coverage/fix 协议与编译期注册;验收:adapter 不绕开运行时启动进程或联网。 -- [ ] 5.2 实现工具解析、二进制身份、doctor 和 tool lock 验证;验收:wrapper/受管缓存/系统工具均匹配锁,缺工具返回恢复步骤。 - 原生版本进展:统一 runtime 版本探测核对固定参数、工具前后字节、精确 stdout 与私有日志,共享截止时间;超时/取消/spawn/signal/超限/非零退出、版本/stderr/字节变化/日志失败分别保留诊断。现有 Ruff 启动阶段已复用,不完整时不扫描源码。真实 Ruff 0.16.8 版本调用验收与模拟故障分层;doctor CLI、可信锁、完整兼容/环境及准备报告仍缺,5.2/5.6 不勾选;见相邻 tests/acceptance/native-version-diagnostics.md。 - - 进行中:相邻 `codeguard-cli/crates/codeguard-cli/src/tool_identity.rs` 和 `crates/codeguard-cli/tests/tool_identity_contract.rs` 已对三种 origin 的入口、基础可执行位、独立运行时及有界目录树 bundle 摘要作只读核验;真实 Maven libexec 全树通过本地测试锁核对,委托 jar 篡改被拒绝;见 `codeguard-cli/tests/acceptance/tool-identity-baseline.md`。可信锁来源、完整动态依赖闭包、doctor 与恢复步骤仍缺,不能勾选 5.2。 - Ruff 局部原生报告另记录完成文件的工具/配置字节摘要并在整轮末复核,未完成文件不声称身份;尚未接受保护工具锁,见 `codeguard-cli/tests/acceptance/ruff-observed-artifact-identity.md`。 -- [ ] 5.3 实现独立 tools install 流程、下载清单与校验;验收:普通 check/plan/doctor 不隐式安装;真实主动联网 wrapper 在离线隔离中被阻止,无法隔离则启动前 incomplete。 - 网络编排进展:download_and_publish_signed_distribution 请求前核对签名/本机平台/精确工具/完整定位及宿主精确站点许可,下载后共享预算进入签名发布服务。拒绝无许可/通配等五类前置反例;另显式固定 Rust 官方仓库提交 LICENSE-MIT 的真实公共 HTTPS、摘要和临时发布 1 项通过(0.70 秒),不执行内容、测试 key 不是真实发行批准。真实宿主来源、正式 CLI apply/运行时/恢复/跨平台仍缺,5.3 不勾选,见相邻 tests/acceptance/signed-network-publication.md。 - 签名发布编排进展:新增明确调用的离线包发布入口,按本机平台、精确工具绑定签名/原锁,raw 或完整布局关联后独立缓存发布;前/发布前/发布后时钟复核,拒绝回退,全部阶段共享预算取消。5 项目标契约通过,覆盖 raw/ZIP 原定位与复用、错误身份/包/签名/平台/工具/时钟、已有损坏目标保留,以及发布后时钟缺失失败再重验。尚无真实宿主信任/网络/正式 CLI 安装/运行时/恢复闭环,5.3 不勾选,见相邻 tests/acceptance/signed-package-publication.md。 - 发行签名进展:新增独立 distribution.v1 Ed25519 域,绑定原始清单/锁、发行者/通道/平台、序号及有效期,严格清单/锁关联后返回只读结果。宿主公钥/撤销/时钟/最低序号真实性仍外置;无项目自批或签发命令。可信宿主和正式下载/install 编排尚缺,5.3 不勾选;见相邻 tests/acceptance/signed-distribution-binding.md。 - HTTPS 传输进展:Rust runtime 新增 TLS 验证、固定字节/摘要、有界手动重定向、共享绝对期限和取消的异步包下载 API;禁环境代理/自动重试/内容解压,状态/编码/长度/摘要不符无半成品。11 项本地 TLS 测试及 96 项相关回归通过;gzip, chunked 接受缺口先复现后修复。来源批准、正式清单到下载/发布接线、apply/运行时/恢复及跨平台仍缺,5.3 不勾选;见相邻 tests/acceptance/package-https-transport.md。 - 下载/展开串联进展:download_verified_archive 请求前校验同一包摘要、格式/入口/预算/完整摘要,下载后以共享预算核对包、入口与完整树,不返回局部成功。新增本地 TLS ZIP/tar.gz→完整树→私有临时目录发布及 raw→字节发布,错误整树/包身份拒绝、声明冲突与无效输入不发请求。15 项 HTTPS 目标测试通过;正式授权、CLI 接线/运行时/恢复仍缺,5.3 不勾选,见相邻 tests/acceptance/downloaded-package-publication.md。 - 完整树进展:新增保留空目录/父目录的 UnpackedArchive 入口,旧文件集合接口保留;内存树按既有 bundle-tree-v1 本机顺序计算/核验,公开构造对象重新检查形状/路径/总量和预期摘要。真实临时目录与原 CLI 算法精确相同,库篡改、空目录缺失、乱序/非法输入/取消/到期反例通过。本轮相关回归 54 项通过,1 项原生缓存 ignored 不计运行;bundle 根映射、批准及完整目录发布/下载/apply 尚缺,5.3 不勾选,见相邻 tests/acceptance/unpacked-bundle-tree.md。 - GNU/PAX 后续:支持下一成员的有界 GNU 路径/局部 PAX path、size 及无害全局描述;完整路径覆盖截断旧头,size 控制真实边界而非一律与旧头相等。17 项归档回归覆盖危险/重复/矛盾/孤立/损坏/超限扩展及标准 tar 解析交叉核对。全局 path/size、sparse/链接、bundle/目录发布、可信下载/批准及 apply 仍缺,不勾选;见相邻 tests/acceptance/tar-extension-verification.md。 - 归档基础:runtime 新增 ZIP/tar.gz 内存展开,先核对包/入口摘要,全成员路径/类型/冲突、成员数及文件/容器预算检查,无文件系统解包或授权。11 项归档用例通过,两格式均串联包流→展开→临时缓存发布;首轮 tar GNU/PAX 等扩展明确拒绝,后续能力见上一条进展。完整 bundle 树、目录发布、可信下载/批准、CLI apply 与全平台仍缺,不勾选;见相邻 tests/acceptance/package-archive-expansion.md。 - 输入修复:共享静态文件读取器采用 Unix 非阻塞打开,再按同一句柄拒绝特殊类型;修复无写入端 FIFO 在类型核验前卡住锁/发行清单观察的问题。先由独立测试子进程复现并回收,再验收读取器及 install 两个输入入口。仅为 Unix 特殊文件边界,网络/发行授权/归档/正式 apply 与跨平台仍未完成;见相邻 tests/acceptance/bounded-input-fifo.md。 - 包流基础:runtime 新增精确长度/非零 SHA-256 校验的有界读取 API,128 MiB 上限,超长至多读取多一个字节,读取前后检查取消/期限;错误仅固定诊断,不返回半成品。9 项包流与 10 项缓存发布测试通过,1 项真实工具测试本轮 ignored 不计运行。临时缓存串联验证成功 raw 字节发布/复用及错误字节不进入发布。尚无网络读取超时、下载/展开/批准及正式 apply,5.3 不勾选,见相邻 tests/acceptance/package-stream-verification.md。 - 清单 CLI 接线进展:install 显式 --distribution-manifest FILE,反馈 0.2 分层显示固定诊断和逐工具脱敏包声明。来源 URI 只给摘要,原锁失配/坏清单/符号链接拒绝,声明子集不消除其它工具或运行时缺口;apply 仍写前阻塞。22 项命令、11 项清单、4 项边界回归,7 份实际 schema 与 4 个伪造权限反例通过;可信下载/展开/正式 apply 未实现,5.3 不勾选,见相邻 tests/acceptance/tools-install-manifest-preview.md。 - 发行清单进展:新增 1.0 严格解析与原始锁字节绑定 API/schema,精确工具/平台/版本/来源/二进制/bundle,限定 HTTPS 和包大小、相对归档入口;绑定时重验对象,拒绝重复字段、未知批准与错身份。11 项契约、4 项 crate 边界通过;schema 4 正例/16 反例通过。清单只是声明子集,不授予来源/安装权限;下载、展开、可信发布及 CLI 接入仍缺,5.3 不勾选,见相邻 tests/acceptance/distribution-manifest-binding.md。 - CLI 预览进展:tools install --lock FILE 默认 dry-run,共用库存/身份核验,绑定锁/二进制/来源引用摘要,分别解释平台与恢复动作。未绑定可信来源的 apply 在写入前明确阻塞,不调用发布 API。32 项回归、实际预览 schema、模式冲突及伪造完成反例通过;可信下载/发行包/正式 apply 未接通,不勾选,见相邻 tests/acceptance/tools-install-preview.md。 - 缓存发布基础:runtime 已提供有界冻结字节/预期 SHA-256 的目录 FD 发布服务;私有独占暂存、写后校验、linkat 不覆盖发布及最终复核,拒绝链接/FIFO/错误权限/损坏目标,重复重验后复用,取消/超时不返回成功。53 项普通相关回归及 1 项显式真实 Ruff 临时发布/原生版本通过。收据不授予发行批准或准备状态;可信下载清单、CLI 预览/apply、压缩包和全平台尚缺,不勾选。见相邻 tests/acceptance/tool-cache-publication.md。 - 5.3 补充进展:显式归档目录投影 API 先验证完整树,再按目录边界去前缀、保留空目录并匹配 bundle 摘要;未消费成员保留原路径和内容。59 项相关测试通过,包含实际临时目录摘要交叉核对;1 项原生缓存测试 ignored。正式清单映射、可信来源、下载/目录发布/apply 尚缺,5.3 不勾选;见相邻 tests/acceptance/bundle-root-projection.md。 - 发行包关联进展:清单 1.1 显式 bundle_archive_root 与 1.0 兼容观察;新增冻结包关联 API,绑定同一锁、包大小/摘要、入口与子树,返回只读树及剩余成员,不写安装目录。清单 13、关联 3、命令 23 共 39 项测试及 schema 4 正例/10 反例通过;可信来源、实际缓存根映射/目录发布/apply 仍缺,5.3 不勾选,见相邻 tests/acceptance/distribution-bundle-binding.md。 - 目录发布进展:macOS/Linux API 使用固定目录 FD、私有独占暂存、逐成员写后/完整集合重验和不覆盖原子目录重命名,取消清理本次暂存;坏已有目标保留并拒绝,并发同树只一方新发布。6 项目录发布、既有缓存 10、投影 4、CLI 57,共 77 项相关用例通过(1 项原生缓存 ignored);正式缓存根映射、其它包成员/运行时、可信下载与 apply 仍缺,5.3 不勾选,见相邻 tests/acceptance/tool-bundle-publication.md。 - 完整布局进展:清单 1.2 声明完整安装树摘要,精确绑定同一内容寻址目录下的锁入口/bundle 根;错路径拒绝,不重写锁。只读布局保留入口、空目录及 bundle 外全部普通成员,分别核验整树/子树。55 项相关测试及 schema 5 正例/7 反例通过;实际临时缓存发布后原锁入口和 bundle 核验匹配。正式 CLI 布局反馈、可信下载/批准、raw/运行时安装与恢复仍缺,5.3 不勾选,见相邻 tests/acceptance/distribution-layout-binding.md。 - CLI 布局反馈进展:install 预览 0.3 区分完整路径声明绑定/缺完整树/raw 不适用,显示内容寻址目录与定位摘要,内容核验固定 not_run;不读取包或调用发布,未批准 apply 仍写前阻塞。48 项相关测试、8 份实际 schema 输出、4 个伪造完成及 2 个格式/阶段矛盾反例通过;0.2 schema 单独保留,私有路径/地址不回显。批准/真实下载/apply 与恢复仍缺,5.3/5.6 不勾选,见相邻 tests/acceptance/tools-install-layout-preview.md。 - raw 定位/内容进展:1.2 原锁入口精确绑定二进制摘要.bin,错路径即使来源引用摘要匹配仍拒绝;有界分块核验返回无复制只读借用视图,预览正确区分新版定位已绑定/旧版需映射。53 项普通回归及 1 项显式真实 Ruff 0.16.8 关联/缓存发布/版本观察通过;4 份实际 raw schema 输出与伪造内容反例通过。可信下载/批准、运行时和正式 apply/恢复仍缺,5.3 不勾选;见相邻 tests/acceptance/distribution-raw-binding.md。 -- [ ] 5.4 实现报告产物 freshness、scope/rule 执行覆盖核对;验收:陈旧或伪造空成功报告不能通过。 - 进行中:Ruff 0.16.8 局部扫描已在同轮原生执行 `--show-settings`,记录 F401/E501 全局启用状态及逐文件忽略存在性;报告规则与设置矛盾即 incomplete,损坏设置亦不作为干净证明。设置仍不能证明 `noqa` 等源码内 suppression 或批准策略 required rules 覆盖,故 `coverage_proven=false`;见 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 - 后续进展:同轮 `--ignore-noqa` 对照已使源码注释抑制成为独立观察;正常诊断不包含于对照即 incomplete。仅被抑制的文件标记 `suppressed` 而非 `passed`,旧任务加 `noqa` 后复检进入 `suppression_requires_review`。逐文件配置忽略、批准规则集合和完整门禁仍缺,见 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 - 进行中:相邻 `codeguard-cli/crates/codeguard-runtime` 已实现只读新鲜报告槽位与原生执行/私有日志/报告读取的同轮组合,旧报告在 spawn 前拒绝,缺报告、链接、超限或日志失败均不返回完整结果;见 `tests/acceptance/fresh-native-report-baseline.md`。PMD 6 固定 `-r` 参数已接入局部 Rust 试运行服务,核对源码、启动器及整个工具目录树的前后摘要,并核对报告文件范围、退出码与诊断数量;见 `tests/acceptance/pmd6-runtime-probe-baseline.md`。已批准制品的锁定来源与规则实际生效证据、项目扫描范围、正式 `check` 接线及同用户并发篡改防护仍缺,不能勾选。 -- [ ] 5.5 建立 adapter conformance harness;验收:F01–F10、F17 的有效与畸形报告可独立复用,mock 与真工具证据分层。 - F05 增量:相邻 Rust `cve rust` 对结构有效且绑定当前锁的 cargo-audit advisory,即使原生程序随后异常退出、输出完整报告后超时或在其它输出超限后,也保留局部 finding 和 `incomplete`;残缺 stdout JSON 不制造 finding,已初始化工作区仍能同步稳定完整性任务。模拟原生进程、真实工具与全适配器矩阵分层记录,见 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。通用 conformance harness、单体 stdout 报告截断恢复、其它适配器及 F01–F10/F17 全矩阵仍缺,5.5 不勾选。 - Python CVE F05 增量:`pip-audit` 的完整 JSON 在异常退出、输出后超时或其它输出超限时,仍按本轮 PEP 751 锁归属保留局部 advisory 和具体未完成原因;残缺 JSON、锁外组件不生造项目 finding。已初始化工作区保存待核验证据并同步稳定完整性任务,见 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。模拟器不替代真实 pip-audit,通用 conformance harness 和全适配器矩阵仍缺,5.5 不勾选。 -- [ ] 5.6 实现 tools list/verify/install 的库存、制品身份和默认预览/显式安装边界,以及doctor准备报告;验收:身份通过不等于可启动,安装部分失败可恢复,准备证据带run_id并可幂等同步。 - 库存进展:tools list 已复用同一有界锁读取与制品核验,稳定列出所有声明平台、版本、适配器/规则来源及独立 runtime/bundle 缺口;跨平台为 not_inspected,不访问制品或虚构本机缺失。固定声明锁范围、必需库存未核验、required_by_policy=null 与 unknown/退出 3,不执行/安装/写工作区。28 项回归及实际 schema 验证通过;可信必需集合、正式库存与安装仍缺,5.6 不勾选,见相邻 tests/acceptance/tools-list-command.md。 - 持久化进展:doctor 0.2 在已绑定工作区保存不可变 queued 报告并自动 sync;重复失败/原因变化沿用一个环境调查任务,next 给出受限恢复及复检路径。未选择不制造必需缺失;真实版本恢复不自动关闭或授予 ready。严格导入拒绝自写批准、未知字段、预算/工作区/消费摘要异常;保存失败向对话反馈。54 项回归、10 份实际 schema 与 6 项反例通过;可信必需项/全工具报告及 doctor 专用关闭未实现,5.6 不勾选,见相邻 tests/acceptance/doctor-workspace-sync.md。 - doctor 局部入口:默认反馈静态检查配置,仅显式绝对路径 Ruff 运行固定版本诊断,复用统一 runtime、私有临时 cwd/日志和共享预算;单探测上限 10s,脚本入口缺隔离时启动前拒绝。未选工具不冒充缺失;本地版本成功仅 observed_untrusted,策略/必需前置未核验,readiness unknown、交付 not_evaluated,报告明确 not_saved,不写工作区或扫描源码。其它工具、可信锁/必需前置映射、完整准备报告持久化及同步仍缺,5.2/5.6 不勾选;见相邻 tests/acceptance/doctor-local-ruff.md。 - CLI 进展:tools verify 以本地 codeguard.lock.json 或显式候选执行有界只读解析,复用三来源入口/运行时/目录包核验,反馈 issue 与恢复步骤;候选来源未核验,固定 incomplete/unknown、无门禁效力,匹配仅 matched_untrusted,版本仅锁声明,不启动 wrapper/联网/安装或写工作区。显式缓存与运行时参数可核对,跨平台条目不产生本机结论。工具库存/安装、可信锁来源、原生 doctor 与准备报告持久化/同步仍缺,5.2/5.6 不勾选;见相邻 tests/acceptance/tools-verify-command.md。 -- [x] 5.7 实现C03 detect查询处理器与DiscoveryReport,复用观察port;验收:静态未知条件完整返回0,必要目录不可读返回3和部分观察,均不执行wrapper、不写画像/任务。证据:相邻 `codeguard-cli/crates/codeguard-cli/src/{main,discovery}.rs`、`schemas/discovery-report.schema.json`、`crates/codeguard-cli/tests/detect_cli.rs` 与 `tests/acceptance/discovery-baseline.md`;动态构建模型、其余清单语义及多语言源集属于 5.9/6.1/8.x,保留 unknown,不宣称检查通过。 -- [x] 5.8 实现C04 capabilities查询、平台/类别筛选和发行元数据解释;验收:planned查询成功但不称可运行,未知语言2,损坏注册表4,不探测或安装工具。证据:相邻 `codeguard-cli/crates/codeguard-cli/src/main.rs`、`schemas/{capability-inventory,capability-selection}.schema.json`、`crates/codeguard-cli/tests/{capability_inventory,capability_selection}.rs`、`tests/acceptance/capability-inventory.md`;当前所有新能力仍为 gap,原生适配器验收属于 S06–S08。 -- [ ] 5.9 实现动态构建模型解析任务与共享扫描义务映射;验收:detect/init/plan仅保留待解析条件,执行期经统一runtime留证据,多语言/多构建根不丢范围,adapter不私自I/O。 -- [ ] 5.10 实现项目检查器配置探测;验收:按构建根识别 Javadoc、依赖/CVE、lint 与安全检查器的 `configured/missing/invalid/unknown`,说明配置位置与启用建议;28 个检测族只作候选目录,不自动生成全部必需义务。进行中:相邻 Rust `detect` 已只读解析 Maven POM 的六种检查器声明,保守处理父 POM、pluginManagement、profile 和 Gradle;另沿 Python 文件层级识别 Ruff TOML 的配置优先级、lint/format 区别及坏配置,见 `codeguard-cli/tests/acceptance/{maven-config-discovery,ruff-config-discovery}.md`。其他生态、Maven effective model、项目全量执行与宿主反馈接线仍未完成,故不勾选。 - 后续进展:Maven 静态探测新增独立 P3C 项,仅在明确 P3C 2.1.1 插件依赖、已观察的规则路径和 `skipPmdError=false` 同时存在时标记已配置;普通 PMD、缺依赖/规则、动态版本与错误吞掉配置有正反例。`plan lint java` 仅显示候选,不认证规则执行。见相邻 `codeguard-cli/tests/acceptance/maven-config-discovery.md`。 - Javadoc 探测补强:明确关闭 `missing` 的 doclint、动态 doclint 与 `failOnError=false` 不再误报注释检查已配置;`check java` 也会反馈同一配置状态。Maven effective model、生命周期执行与其它生态仍缺,5.10 不勾选。 - Python CVE 输入进展:`detect` 按 Python 构建根区分 requirements 逐行精确版本、动态/未锁输入、uv/Poetry 锁文件未解析及缺输入;`plan cve python` 和 `check all` 保留 `python.pip_audit` 配置未知与原生工具/数据库待核验,不把固定版本或锁文件存在误报为漏洞扫描通过。真实多构建根归属和动态约束反例见相邻 `codeguard-cli/tests/acceptance/python-dependency-input-discovery.md`。项目生效配置、完整依赖图、原生漏洞结果与可信策略仍缺,5.10 不勾选。 - 标准锁区分进展:发现器现识别 `pylock.toml` 与单段命名的 `pylock..toml`,单列 `python_standard_lock_model_unparsed`;同根并存标准锁与 uv/Poetry 锁时保持选择歧义,工具专用锁不再暗示可直接用于 pip-audit `--locked`。真实 CLI 反例见相邻验收文档。PEP 751 内容/环境、原生运行和漏洞库仍未核验,5.10 不勾选。 - -## 6. S06 Java 全链路 - -依赖:S05。覆盖:native-tool-adapters、language-gate-commands。 - -- [ ] 6.1 实现 Maven/Gradle/JDK/wrapper/profile/module/source-set 观察;验收:多模块、父 POM、动态未知范围与错误 JDK 有真实样本。 - 探测诊断进展:Maven 版本阶段现区分运行时超时/启动前预算耗尽/无法启动/取消/输出及管道故障等原因。两个新反例先暴露通用错误提示,再通过具体原因返回;失败不启动 validate,不产生源码违规。原全量回归的 bundle mutation 偶发失败仍需具体原因复现才能归因,不能凭单独重跑推断解决。 - - 进行中:相邻 `codeguard-cli/crates/codeguard-cli/src/maven_probe.rs` 已通过统一 Rust runtime 调用 Maven 原生 `--version` 和离线 `validate`,复核启动脚本与 POM 内容,并对真实 POM 4.1 错误、无质量绑定 POM 的 validate 成功分别留局部证据;见 `codeguard-cli/tests/acceptance/maven-native-probe.md`。Maven 发行包/JDK 身份锁、Gradle、wrapper、profile、多模块、父 POM 与动态范围仍未完成,不能勾选 6.1 或把 validate 当质量通过。 -- [ ] 6.2 确定并锁定官方 P3C/PMD/JDK 兼容组合,实现原生报告解析;验收:正反例证明规则实际加载,不能用 Checkstyle 名称替代。 - 新进展:隔离单文件探针现在声明 P3C 2.1.1 JAR 中十个 `ali-*.xml` 规则集,本地反馈 0.2 记录清单与受控 POM 摘要;真实公开类同时命中命名和作者注释规则,包内可见类不命中作者注释。仅证实两条触发规则及该样本上下文,十个规则集的全规则生效、批准工具闭包和项目覆盖仍未核验,故不勾选。 - 追加进展:公开 `lint java FILE` 现调用固定 Maven PMD 3.11.0/P3C 2.1.1/PMD 6.15.0 单文件探针,原生违规规则与位置可返回对话;本机 JDK 26 隔离离线仓的违规和干净样本均经 CLI 执行,后者仍标 `clean_scope_unproven`、退出 3。当前探针声明十个规则集,本机 JDK 21 的命名和作者注释规则有真实正例。该仓字节摘要仅为本地观察,未证明受批准工具锁、全规则实际生效或项目覆盖,见 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`,6.2 不勾选。 - 进行中:相邻 `codeguard-cli/crates/codeguard-adapters/src/pmd_xml.rs` 已实现 Rust 对 PMD 6 XML 的有界纯解析,坏 XML/DTD/处理错误/版本不符及已报告的 suppression 不生成通过;`pmd6_command.rs` 的固定字面参数已交给局部 Rust runtime 试运行服务。可复跑的 Maven PMD/P3C 哨兵在本机 JDK 8/17/21/26 上均使违规样本报告真实 `ClassNamingShouldBeCamelRule`、干净样本无诊断、坏规则集失败;还以隔离 Maven 仓库、`-o` 和前后目录树摘要复跑,见相邻 `codeguard-cli/tests/acceptance/p3c-pmd-research.md` 与 `codeguard-cli/crates/codeguard-cli/tests/p3c_native_replay.rs`。但闭包摘要尚未接入受批准工具锁,干净 XML 不证明覆盖,正式 `check` 尚未接线,仍不能勾选或把该哨兵扩展为全部 P3C 规则的验收。 - 规则归属补强:项目 POM 规则子集先绑定到隔离探针;本地 P3C 2.1.1 制品的十个规则集/56 个规则 ID 已整理为 Rust 目录,项目原生 XML 若报告未选择的规则集、错误 ID 归属或未知规则,标为 incomplete、不给源码 finding。伪 XML 反例与真实 Maven 正例见 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`;目录仍不是受保护 rulepack/工具锁,全规则执行覆盖和正式批准未证实,6.2 不勾选。 -- [ ] 6.3 实现 Checkstyle/Javadoc 注释检查;验收:公共 API、参数返回、inheritDoc、record/Lombok/生成代码正反例。 - 配置失败指引进展:固定 10.21.4 正常 254 + 官方非法属性/正则因果异常才细分 checkstyle_configuration_regex_invalid,公开对话和准备简报指向原配置正则,不回显自由文本。纯分类先 RED 后实现;缺报告且输入变化的反例再 RED,修正为输入/截止/取消优先。原生格式七轮回放通过(38.75 秒),见相邻 tests/acceptance/checkstyle-regex-failure-guidance.md。未知属性级错误/其它版本及完整批准覆盖仍缺,6.3 不勾选。 - 作者/版本格式验收:补齐 JavadocType 指引中缺失的 @author/@version 与事实依据约束,目标指引测试先 RED 后通过。缺标签/格式不符/部分及完整补齐 2/2/1/0 原生诊断准确,原配置复检为局部候选;无效正则连续两轮保持 incomplete 并复用配置准备任务,不冒充源码违规。七轮通过(38.35 秒),见相邻 tests/acceptance/checkstyle-type-formats.md。全部正则/标签变体和完整项目/批准仍缺,6.3 不勾选。 - 类型配置进展:MissingJavadocType/JavadocType 保留四级访问范围、五类类型 token、各自注解参数及类型标签/作者版本参数;跨模块借用反例先 RED 后通过,绑定/配置十三项通过。十组原生配置准确筛选公开/私有/注解/record 与参数/未知标签,恢复首次配置并真实补文档复检为局部候选,十一轮通过(58.02 秒),见相邻 tests/acceptance/checkstyle-type-options.md。作者/版本正则只有静态适配证据,其它 Scope/全部 token 语法与完整项目/批准覆盖仍缺,6.3 不勾选。 - 方法标签配置进展:JavadocMethod 静态适配保留 accessModifiers、允许缺参数/返回标签、validateThrows、allowedAnnotations 及四种原生 token;合法参数先 RED 后修正,绑定/配置十二项通过。公开/私有与注解方法、异常标签六组原生配置及恢复首次配置的两次修复复检共八轮通过(57.23 秒),事实仍 open,见相邻 tests/acceptance/checkstyle-method-tag-options.md。完整配置、全部语法和批准覆盖仍缺,6.3 不勾选。 - 方法 token 进展:MissingJavadocMethod 保留四种原生 token 的模块上下文;静态绑定先 RED 后通过,五组真实配置准确选择普通方法、构造器、注解成员及 record 紧凑构造器,稳定任务无重复;同配置两次复检验证紧凑构造器文档修复,事实仍 open。七轮原生验收通过(51.11 秒),见相邻 tests/acceptance/checkstyle-method-tokens.md。完整配置/语法及正式关闭仍缺,6.3 不勾选。 - 注释变体进展:静态配置新增原 MissingJavadocMethod/JavadocType,实际 CLI 检查 record 参数文档正反例、继承文档/Override/Generated 默认例外,并保留同一行声明及单行方法体的原生差异,用多行方法验证缺文档。显式 Lombok 1.18.38 delombok 原源码/展开 getter 对照显示不同扫描范围,不将展开诊断指到原注解行。所有变体/版本/构造器及完整项目/来源/任务门禁仍缺,6.3 不勾选;见相邻 tests/acceptance/checkstyle-comment-variants.md。 - 原生身份歧义纠偏:共享自定义 ID 的不同 Checkstyle 模块、重复默认检查来源或重复属性在局部配置识别中进入待解析,不挑先/后值、不制造源码违规。新增共享 ID 断言先失败;不同 ID 的相同检查类保持可用。真实 CLI 验证共享 ID 无活动 finding,独立 ID 后显示原生三条注释诊断。规则/义务与批准身份、完整配置/项目/任务门禁仍缺,6.3 不勾选,见相邻 tests/acceptance/checkstyle-rule-source-ambiguity.md。 - Checkstyle 正式局部命令进展:lint java --checker checkstyle 显式选择 Java/JAR/原配置,受支持静态注释配置进入私有快照与 runtime 服务,缺前置/未知上下文结构反馈;无默认规则替换,脚本缺隔离拒绝。公开反馈 0.1.0 保留原 source/位置/严重度,工具/覆盖/交付仍未核验。真实 binary 1 项通过,8 项命令/Javadoc/配置回归通过,两份实际 schema 正例及 4 个虚假权威反例通过;完整 check/project/任务门禁与其它配置仍缺,6.3 不勾选,见相邻 tests/acceptance/java-checkstyle-cli-local.md。 - Checkstyle 输入绑定进展:新增独立请求/结果与 Rust runtime 服务,精确四个不同物理输入摘要前后复核,缺失/额外/别名/变更不形成完整结果;新鲜报告、范围/退出与共同预算取消接线。模拟反例与真实 Checkstyle 10.21.4/Java 21 缺类型注释/修正两轮通过。完整 JDK/配置引用资源闭包、网络隔离/快照与项目归属及正式 CLI/任务门禁仍缺,6.3 不勾选;见相邻 tests/acceptance/checkstyle-input-bound-probe.md。 - Checkstyle 结果进展:Rust 结果判定绑定独立版本/冻结完整文件列表/正常退出,报告或范围异常不当源码违规;warning/info 退出零仍保留,Unix 错误计数低八位不抹去 256 条诊断。四项契约及真实 error/clean/warning 三轮通过;尚未绑定原项目身份/配置或正式 CLI/门禁,6.3 不勾选,见相邻 tests/acceptance/checkstyle-exit-scope-coherence.md。 - Checkstyle 真实验收进展:固定官方 10.21.4 自包含测试 JAR 与本机 Java 21,经统一 runtime 新鲜报告/私有日志/共同截止调用。配置缺 DOCTYPE 先导致无报告失败,纠正为制品内置映射的标准 DTD 后,公共类型、自定义方法 ID、缺 @param/@return 与补全文档两轮通过。制品摘要仅本地观察,真实项目原配置/范围/身份绑定、完整注释变体与生产任务门禁仍缺,不勾选;验收详见相邻 tests/acceptance/checkstyle-native-command.md。 - Checkstyle 参数进展:新增 CheckstyleCommand 固定 Java -jar/原配置/XML/独立报告/单文件参数,路径冲突与控制字符拒绝。显式 10.21.4 原生正反例测试入口有截止/回收/清理;核对该版本 XMLLogger 确认自定义 source 仅输出 ID,不能套新版类名#ID。命令 2 项、解析 6 项通过;因本机未发现 JAR,真实测试未执行。生产 runtime/配置及任务门禁仍缺,6.3 不勾选,见相邻 tests/acceptance/checkstyle-native-command.md。 - Checkstyle 解析进展:新增 Rust 有界 XML 纯解析,保留完整 source/自定义模块 ID、原生严重度与文件级零行/可选列;exception 和根级无文件事件不转换为源码规则违规。坏版本、未知结构、重复文件、DTD/编码/数值与规模异常均未完成;零诊断仍保留文件列表,不授予覆盖权威。测试为协议夹具,真实 Checkstyle 执行和正式配置/任务/白名单/门禁未接通,6.3 不勾选;见相邻 tests/acceptance/checkstyle-xml-observation.md。 - 执行方式纠偏:明确 Maven 上下文时只调度原 POM 多文件探针,不再先运行孤立单文件 JDK;Maven 不适用/前置缺失保持具体未完成,不回退。真实 First 引用 Second 样本先复现无关单文件 native_execution_incomplete,再用同一 Maven 多文件警告/干净两轮验证;模拟缺前置时 JDK 哨兵不启动。反馈升级 0.23.0、Javadoc 0.3.0,区分模式/检查器;旧 0.22 schema 保留。两份实际原生报告及混合模式反例通过。生效模型/依赖类路径/生成源码/任务门禁仍缺,6.3 不勾选,见相邻 tests/acceptance/javadoc-project-mode-selection.md。 - 进行中:相邻 Rust CLI 已增加 `lint java FILE --checker javadoc` 的 JDK 21 原生单文件局部诊断,已知 doclint 缺失注释/参数/返回规则可展示,未知输出和缺失类路径保留未完成;真实 JDK 正反例见 `codeguard-cli/tests/acceptance/java-javadoc-cli-native-local.md`。项目生效配置与完整源集绑定、Checkstyle 原生执行、生成代码范围验证、任务和门禁接线仍缺,6.3 保持未完成。 - 追加进展:`check java` 现只在静态配置确认时调度 `java.javadoc`,把 JDK 21 单文件原生诊断显示到 JSON/human;无配置不自动变成必需检查。真实最小 Maven 项目有缺注释正例,见 `codeguard-cli/tests/acceptance/check-java-javadoc-partial.md`。它尚未执行 Maven Javadoc 插件生效生命周期、解析完整项目类路径、同步 Javadoc 任务或签发门禁,6.3 仍未完成。 - Maven 原生输出研究:Maven 3.9.16/JDK 21/Javadoc Plugin 3.12.0 的真实项目在 `failOnWarnings=false` 时 `BUILD SUCCESS` 仍含缺注释警告;设为 `true` 则失败且保留同样诊断。Rust 有界解析器已用两种原生结果和未知/额外错误反例验收,见 `codeguard-cli/tests/acceptance/maven-javadoc-native-output.md`。同一目录再次运行可能复用文档产物,正式项目执行器及本轮快照证明仍缺,6.3 不勾选。 - 干净日志反例:完整注释项目的首轮与同目录重跑日志都可只显示 `BUILD SUCCESS`,无法从日志区分本轮生成或旧产物复用。Rust 解析器将这类输出标为 `CleanLogUnverified`,未知警告/失败仍为 `Incomplete`;真实 Maven 两轮和反例测试已通过。正式项目执行器必须另证隔离快照、产物及配置身份,6.3 继续未完成。 - 多文件原生进展:`check java`/`check all` 在显式 Maven/JDK 21/离线仓库与树摘要下,对**简单静态 POM**使用私有源码及原 POM 快照运行 Javadoc Plugin 3.12.0;父 POM、profile、依赖、模块、扩展、其它插件或动态配置会在执行前返回不适用,不再以固定 POM 生成配置外诊断。真实两文件违规及修正后干净样本均经 CLI 复跑,原 POM 摘要已绑定;结果单列为局部多文件探针,固定 `project_checker_attribution=unverified`、`coverage_proven=false`、交付未评估。生效模型、类路径、生成源码及完整源集仍未证明,见 `codeguard-cli/tests/acceptance/maven-javadoc-multifile-probe.md`;6.3 不勾选。 - 修复指引进展:Checkstyle 局部反馈 0.2 从原配置精确映射自定义 ID 到四类检查类,给出中文规则摘要、官方依据、修复方向和原输入复检参数;未知来源不发布 finding,重复映射不猜测。普通及真实 10.21.4 回放通过,旧 schema 保留;完整项目配置、任务关闭、批准来源和门禁仍缺,6.3 不勾选。验收见相邻 tests/acceptance/checkstyle-repair-feedback-binding.md。 - - 字段注释进展:原生 JavadocVariable 及其 scope/excludeScope/ignoreNamePattern 原参数进入精确绑定,复用反馈/稳定任务/原工具复检;17 项适配回归和真实三轮字段回放(24.99 秒)通过,实际字段记录及简报 schema 通过。仍缺完整 Java 规则/配置模型/覆盖与批准,6.3 不勾选,见相邻 tests/acceptance/checkstyle-field-javadoc.md。 - 字段范围进展:增加 JavadocVariable 的静态原 tokens 参数,未知 token/其它模块借用被拒;四个绑定与四个配置回归通过。原工具已确认 public/protected/package/private、excludeScope 及字段 token 边界;仅枚举 token 不删除原生必需 VARIABLE_DEF,固定 JAR 字节码和回放据此修正规格/验收假设,不在 Rust 过滤诊断。完整项目模型与门禁仍缺,6.3 保持未勾选。 - 模块名称进展:已支持注释模块接受官方完整名与 Check 后缀短名,使用固定映射保留原 XML/原生 source;未知包名不猜测,重复别名身份拒绝。28 项普通回归和字段四轮真实名称/稳定任务/复检回放(21.95 秒)通过。其它模块/资源/完整生效配置仍缺,6.3 不勾选,见相邻 tests/acceptance/checkstyle-official-module-names.md。 - 方法原参数进展:MissingJavadocMethod 的范围、注解、属性方法、长度与名称排除按本版原参数执行;跨模块及无效静态值拒绝。19 项普通回归、真实四组配置回放(19.03 秒)通过,零诊断不关闭任务。单行非空方法行数边界由固定 JAR 核对并修正夹具假设,不修改原生判断;完整方法/构造器及项目模型仍缺,6.3 不勾选。见相邻 tests/acceptance/checkstyle-missing-method-properties.md。 -- [ ] 6.4 实现 Java 安全静态检查及 CVE 依赖图适配;验收:真实安全/CVE 样本、坏报告、库过期与模糊匹配分开记录。 - 解析器进展:相邻 Rust adapter 已按 OWASP Dependency-Check 官方 JSON 1.1 模板提取活动/原生抑制漏洞、来源、分数和包标识;缺必需数组、重复 JSON 键、分析异常或畸形漏洞拒绝。只得到局部报告事实,未调用原生 checker、核验库时效或绑定 Maven 图,6.4 保持未完成。见 `codeguard-cli/tests/acceptance/owasp-dependency-check-json-parser.md`。 - 归属候选进展:相邻 Rust adapter 只在唯一 Maven PURL 与依赖图唯一非根节点的 group/artifact/version/type/classifier 完全一致时给出候选;缺失、冲突、未知限定符、私服 URL、版本不符或图中重复节点分别保留未归属。尚未核验真实制品摘要、原生扫描范围及数据库时效,也未接入 `check java`,6.4 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-attribution.md`。 - 字节身份补强:相邻 Rust adapter 增加 OWASP 报告 SHA-256 与 Maven 节点制品摘要的逐项比较,缺失、损坏和冲突各自保留;相同坐标不再足以构成制品相同的候选。CLI 的 Maven 离线图探针现为可定位的普通制品记录本轮 SHA-256。尚未认证 OWASP 与 Maven 同轮来源、仓库批准身份及漏洞库时效,6.4 保持未完成。见上述归属文档与 `codeguard-cli/tests/acceptance/maven-dependency-tree-check-java.md`。 - 原生局部接线:`check java`/`check all` 已为静态配置的 OWASP Maven 插件建立 `java.cve` 任务,在固定版本的简单原 POM 与私有离线数据库副本中调用原生 goal 并解析 JSON 1.1;human/JSON 反馈展示脱敏 advisory、UNKNOWN 分数和原生 suppression。缺数据库、坏报告、POM 复杂、项目身份错配或数据库变化保持 incomplete。模拟 Maven 正反例通过;尚未以真实 OWASP/合格数据库验收,也缺可信时效、图/制品同轮绑定和正式门禁,6.4 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 - 同轮候选接线:同一 `check` 调用中的 OWASP 与 Maven 图报告现在按相同构建根、POM、Maven/JDK、仓库摘要交叉核对,再逐条复用坐标/制品摘要匹配器;结果写入 `attribution_probes` 并进入 human/JSON 反馈。模拟双插件原生报告的摘要一致、摘要不一致和私服 PURL 脱敏反例通过;这仍只是本地候选,数据库时效、真实原生工具和可信门禁未验收,6.4 不勾选。 - 持久修复路径进展:已初始化项目中的 `check java` 现在保存 CVE 局部报告、自动同步,并把数据库时效未知或原生执行未完成写成稳定环境/证据 blocker;同一问题重复扫描只保留一张任务,内容被篡改的已消费报告不能重新导入。未经核验的 advisory 不伪装为已确认源码 finding,任务给出原工具复检和库核验步骤。真实库与可信门禁仍缺,6.4 不勾选。 -- [ ] 6.5 实现 build 等级和测试执行声明;验收:默认静态构建不谎称测试通过,要求测试的策略不可自动跳过。 -- [ ] 6.6 接入 Java 完整义务与影响闭包;验收:verify 未绑定质量任务、自定义 echo、50/51 文件、未修改调用方失败均不假通过。 -- [ ] 6.7 用代表性 Java 项目完成 check java/check all/doctor/修复前后对照;验收:每条旧新差异人工裁定并有产物引用。 - 进行中:`lint java FILE` 已把单文件原生 P3C 诊断接至 CLI;`check java/doctor`、真实多模块项目及修复前后全量人工裁定仍未完成。单文件证据见 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`,不勾选。 - 后续进展:`check all` 已接隔离 P3C 单文件探针,并以最近 Maven 构建根限制配置归属;本机真实 Maven/JDK 21 离线扫描使违规规则进入统一反馈。局部稳定任务与原 Maven/P3C 复检已接通,十个声明规则集中的命名/作者注释两条有真实正例。`check java` 局部入口也已用真实 Maven 验证,但 doctor、全规则生效证明、其它 Java 静态检查与代表性项目修复前后差异裁定仍缺,6.7 不勾选。见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 -- [ ] 6.8 识别 Java 依赖治理及 CVE 检查配置并调用已配置的原生工具;验收:区分依赖图/版本/许可证/SBOM 与漏洞诊断,未配置时给智能体具体建议;动态版本、父 POM 或私服不可达不得伪造清洁结果。 - 配置反馈进展:`check java`/`check all` 0.10 按 Java 源码最近构建根,把 Maven Dependency、OWASP Dependency-Check 与 FindSecBugs 的静态声明汇总为已声明但未执行、已识别插件缺失或配置未解析,并提供 checker ID 与下一步;多模块混合状态不概括为全项目已配置。Gradle 或 Maven/Gradle 混合根保持模型未解析且不附会 Maven checker ID。FindSecBugs 现在核对完整 groupId/artifactId,避免同名伪依赖误认。原生依赖图接线、CVE 报告解析、漏洞库 freshness、私服/动态版本及受批准义务仍缺,6.8 不勾选。见相邻 `codeguard-cli/tests/acceptance/java-dependency-cve-config-feedback.md`。 - 依赖图解析进展:相邻 Rust 适配器已严格解析 Maven Dependency Plugin 3.7+ 的原生 JSON 树,保留传递边并拒绝坏报告;本机 Maven 3.9.16/插件 3.8.1 的离线 JUnit→Hamcrest 样本通过。原生 goal 尚未接入 CodeGuard 运行时或 `check java`,CVE/advisory 与库时效仍缺,不能从依赖图宣称无漏洞,6.8 仍不勾选。见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-native-parser.md`。 - 原生接线进展:相邻 Rust `check java`/`check all` 0.11 已将静态简单 Maven 构建根的 Dependency Plugin 3.8.1 作为独立 DAG 节点,在私有原 POM 副本中离线执行并反馈依赖图。父 POM、profile、动态版本、外部仓库等重放资格不足时保持未完成;原生 `BUILD SUCCESS` 伴随缺 POM 警告也拒绝当成完整图。真实 Maven/JDK 21 离线仓库的 JUnit→Hamcrest 端到端样本通过;全构建根/生效模型、私服、许可证/SBOM、CVE/advisory 和可信政策仍缺,6.8 不勾选。见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-check-java.md`。 - 无源码构建根补强:依赖图任务现在按每个静态已配置的 Maven 构建根调度,不因根目录暂无 `.java` 而省略;父根有源码、子根无源码时两者分别保留本轮探针结果。P3C/Javadoc 仍按源码条件执行。两个 CLI 回归样本证实旧遗漏及修复后的待检查范围;多模块生效模型与完整覆盖仍未证明,6.8 保持未完成。 - CVE 报告解析进展:新增有界 OWASP JSON 1.1 Rust 解析器,零漏洞报告与缺失依赖数组严格区分,原生 suppression 和无评分漏洞不丢失,数据源时间原样保留但不自证 freshness。原生调用、图归属、可信数据库与对话反馈尚未接线,6.8 不勾选。见 `codeguard-cli/tests/acceptance/owasp-dependency-check-json-parser.md`。 - 图归属局部进展:OWASP Maven PURL 与原生 Maven 图已有独立精确坐标候选匹配器及反例测试;真实调用、制品与数据库身份验证和对话反馈仍缺,不能将候选升级为 CVE 判定,6.8 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-attribution.md`。 - 制品观察进展:依赖图局部原生反馈 0.2 在已核对的离线 Maven 仓库中读取能精确定位的制品并记录摘要,缺文件或不支持类型保持 null;仓库树在读取后再次核对。与 OWASP 报告摘要的匹配仍只是待认证候选,未执行真实 OWASP 扫描,也未检查数据库时效或关闭 CVE 义务,6.8 不勾选。 - OWASP 局部执行进展:已配置构建根现尝试原生 OWASP Maven goal,隔离复制原 POM 和离线数据库并将报告中的漏洞与失败原因反馈到对话;空报告明列 `empty_report_unverified`,数据库时效固定 unknown,未将坐标/摘要候选自动升级为漏洞门禁。当前仅模拟原生工具验收,真实插件、系统级网络隔离、数据库时效及项目全覆盖仍缺,6.8 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 - 同轮归属进展:严格静态 POM 现在允许并列声明固定 Maven Dependency Plugin 3.8.1 与已固定版本的 OWASP 插件,仍拒绝重复、第三方、动态及配置复杂插件。`check_feedback` 0.14 从本轮同根 POM/工具/JDK/离线仓库摘要相同的两份原生局部观察生成逐 advisory 坐标和制品摘要候选;失配与公开 PURL 脱敏均不能得到精确候选。模拟原生双插件、摘要冲突及私服限定符反例见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。漏洞库时效、可信来源、完整项目覆盖与真实 OWASP 数据库验收仍缺,不勾选 6.8。 - -## 7. S07 首批共享生态 - -依赖:S05;可与 S06 独立推进。覆盖:native-tool-adapters。 - -- [ ] 7.1 实现 Rust lint/rustdoc/build/依赖与安全义务;验收:workspace/features/targets 和所有 F01–F10 适用场景。 - 2026-09-28 Rust CVE 局部进展:相邻 Rust 工程新增 `cve rust [path] --cargo-audit-tool ABS_PATH --db ABS_PATH --format json`,共享受控进程预算调用原生 cargo-audit 的 `audit --no-fetch --no-yanked --json --db ... --file Cargo.lock`。严格 JSON 解析拒绝重复字段、原生 ignore、计数/退出矛盾,逐 advisory 精确对照本轮 Cargo.lock 的包名、解析版本、来源与校验和;公开反馈仅输出来源 SHA-256,不回显私有仓库地址。实际零漏洞与已知 RUSTSEC-2020-0071 漏洞的原生执行均验证;本地数据库 JSON 的提交/更新时间为空,结果固定 `database_freshness=unverified`、退出 3、`delivery_decision=not_evaluated`。该阶段尚未接入 check all、稳定任务/复检、可信数据库及工具/策略、全部 workspace/features/targets,也未覆盖 yanked 治理;7.1 不勾选。见相邻 `codeguard-cli/tests/acceptance/cargo-audit-native-observation.md`。 - 统一检查增量:`check all` 现以独立 `rust.cve` 节点调度同一 cargo-audit 局部观察,JSON/human/SARIF 保留原生 advisory 或缺工具/数据库原因。反馈协议 0.29 和中断协议 0.10 新增 `rust_cve`,旧协议原件留存;Rust CVE 类别即使有真实 advisory,数据库时效及可信策略未核验仍为 `observed_unverified`、交付 `incomplete`。这不生成可信白名单批准,也不宣称 Rust 依赖安全通过。稳定任务/复检、可信数据库和全构建组合仍缺;7.1/4.8 不勾选。验收见相邻 `codeguard-cli/tests/acceptance/check-all-cargo-audit.md`。 - 工作台增量:已初始化工作区的 `cve rust` 与 `check all` 将局部 cargo-audit 观察绑定本轮清单/锁、工作区和运行 ID 后同步为每构建根一张稳定 CVE 覆盖任务。`next` 给出原工具和漏洞库核验指引;`task verify` 重跑原生工具、保存摘要绑定事件,数据库身份及时效未获可信核验时仍返回 `still_blocked`,任务保持 open。缺工具也生成环境阻塞;该待核验任务排序在可直接修复的源码问题之后,避免挤掉 Clippy 修复。目标普通回归 `check_all_cargo_audit` 3 项及 `check_all_rust_native` 12 项通过,2 项条件忽略;实际复检预览和封套通过 Draft202012 schema。可信漏洞库/工具/规则包、白名单批准及正式门禁仍缺,7.1/4.8 不勾选。验收见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 - 尝试历史增量:同一 CVE 任务的 claim→attempt ready-to-verify→原工具复检现经目标集成测试;`next` 显示 `still_blocked` 并将无进展计入预算,再一次无改动后要求具体决策,拒绝第三次同动作启动。修复了先前复检已保存但 `next` 不显示 CVE 结论的问题。该链证明局部重复动作抑制,不证明漏洞库合格、漏洞修复、批准例外或正式关闭,7.1/9.7/4.8 保持未完成。 - 协议增量:`repair-brief-preview` 0.1 在保留严格 Ruff 分支的同时新增精确 Rust CVE blocker 分支;真实 `next` 复检输出通过 Draft202012,错检查器、伪称 resolved、错范围三类反例拒绝。其它语言简报尚未纳入同一严格 schema,2.2/9.7 的全命令范围不能据此宣称完成。 - 2026-09-27 rustdoc适配进展:增加独立Cargo/rustdoc JSON流解析,missing_docs与broken_intra_doc_links保留原生规则/级别/唯一主定位和package/manifest/target归属;重复键、异常结束、歧义定位、未知警告和编译错误保持未完成,不复用只认Clippy的过滤器。7项协议契约、6项依赖边界通过;显式本机Rust1.98.1的原生重放1项实际覆盖缺文档/正常/坏链接/编译错/allow抑制五种输入,通过;相关Clippy -D warnings及fmt通过。公开comments rust、任务/复检、原配置与可信规则来源、完整workspace/features/targets仍未接通,7.1不勾选;详见verification.md及相邻tests/acceptance/rustdoc-native-observation.md。 - 公开入口追加:comments rust现经共享runtime执行显式Cargo的锁定离线库目标探针,复用共享预算、私有target目录、SourceSnapshot与独立解析;前后复核清单/锁/已发现源码/工具及源码集合,失配/变化不能标完整观察。human/JSON给出规则/位置、原工具复检和not_evaluated;无工具/坏输入明确未完成,任务接入标not_integrated。4项普通CLI反例、5项入口回归及1项真实Cargo补文档前后复查通过;两份实际反馈通过schema、四种伪造授权/覆盖/关闭被拒;相关Clippy通过。完整配置闭包、可信规则/工具、持久任务/原工具verify及check all接线仍缺,7.1保持未完成。 - 文档身份前置:原生范围字段必填并校验真实UTF8切片及行列对应;候选指纹绑定规则/相对目标/原生范围字节,不用行号或列表顺序。同一原生记录可去重,重复声明身份碰撞保留两项歧义观察并置正式ID为空,运行未完成。反馈升级0.2并保留0.1 schema。3项身份契约、6项CLI普通及7项解析回归通过;真实补充与最新静态终态见verification.md。尚非完整符号身份或持久任务接线,7.1/9.7不勾选。 - 局部进展:`check all` 在显式提供绝对 Cargo 工具时,经 Rust runtime 离线执行原生 Cargo Clippy 默认 features/all-targets,并从机器报告保留 Clippy 规则与位置;缺工具、坏报告、编译错误和异源路径保持未完成。配置文件存在与 Cargo manifest 分开报告;真实 Cargo Clippy 临时项目已验证。已初始化工作区可将当前 Clippy finding 或缺工具 blocker 同步到稳定任务并在对话反馈返回下一步,项目可写的伪批准文件不隐藏发现。`task verify --cargo-tool` 可再跑原生 Clippy 并写本地复检事件;真实 `#[allow(clippy::needless_return)]` 导致零诊断时,同工具原生 `--force-warn` 对照重新检出并返回抑制待核查;对照损坏或输入身份变化保持 incomplete,两轮均无发现也仅为待策略核验候选,任务不关闭。工具/规则批准、workspace/features 全组合、rustdoc/build/依赖/安全和 Rust 跨组合覆盖完整核验仍缺,7.1 不勾选。 - 构建接线进展:`check all` 在同一执行图和共享预算内调用原生 Cargo check,单独保留编译错误与环境阻塞并同步稳定任务;Clippy 修复任务仍优先展示,构建任务可单独读取与原工具复检。反馈 0.28 严格增加 rust_build 和 rust.build 节点,历史 0.27 独立保留;实际报告通过 Draft202012。类型检查不执行测试、不证明 workspace/features/targets 及受批准工具/策略全覆盖,白名单候选不能替代编译修复或门禁,7.1/9.7 仍不勾选。 - Rust CVE F05 增量:`cargo-audit` 在完整匹配的 advisory JSON 后异常退出、超时或其它输出超限时,公开局部报告保留 advisory 及各自未完成原因,并将报告同步到稳定 CVE 完整性任务;损坏 JSON 仍不生造 finding。见 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。真实崩溃/超时、单体 stdout 截断恢复、workspace/features/targets 和完整策略仍缺,7.1 不勾选。 -- [ ] 7.2 实现 Python(python)Ruff/注释/依赖与安全义务;验收:目标 Python/配置继承/锁缺失解析有真实样本。进行中:Ruff 已有项目 TOML 发现、逐文件原生扫描和公开 `lint python` 局部反馈命令;真实 E501/干净文件共存、排除文件不假通过、根/子目录不同配置各自生效,以及 CLI F401 回报通过;异源 JSON 诊断被过滤且本次标未完成。扫描后源码或配置变化也使受影响文件转为未完成,旧诊断只作待复查证据。命令因尚无完整策略固定返回3,见相邻 `codeguard-cli/tests/acceptance/{ruff-config-discovery,python-lint-scan}.md`。项目全量源集、规则/锁/政策及注释、依赖、安全适配仍缺,不勾选。 - F05 进展:原生 pip-audit 完整报告与本轮唯一 pylock 整组组件匹配后,即使退出异常、随后超时或其它输出超限,也保留 advisory 与故障原因;残缺 JSON 和锁外组件不生成项目 finding。局部报告/工作台仍为未完成和 `not_evaluated`;`check all` 同样保留发现,但异常退出和输出超限的执行节点与类别候选为 `native_incomplete`,见 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。真实工具、条件环境/依赖组、漏洞库来源及时效和完整门禁仍缺,7.2 不勾选。 - 后续进展:局部反馈 0.8 与本地报告 0.7 增加原生逐文件设置观察,真实逐文件 ignore 与伪造规则启用矛盾反例通过;设置观察不证明源码内抑制缺席,不改变退出 3 或 `not_evaluated`,见 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 - 最新进展:局部反馈 0.9 与本地报告 0.8 增加源码注释抑制原生对照及 `suppressed` 文件状态;真实 `# noqa`、复检与任务持久化反例通过。配置级 suppressions 与其它 Python 检查族仍缺,不能勾选。 - 注释类别增量:Ruff 0.16.8 在项目显式启用 D100 时,`check all` 将本轮原生 D100 诊断关联 Python `comments` 候选并给出模块 docstring 修复/原工具复检动作;真实缺文档与补文档两轮证明只有实际诊断才列为已观察,仍为未验证覆盖和 incomplete 交付。未建立全部 pydocstyle/DOC 规则的生效集合、配置级抑制、可信规则包或完整注释义务,7.2 不勾选。 - 依赖/CVE 输入进展:新增只读 Python requirements 行级分类与逐构建根锁归属,`detect`/`plan cve python`/`check all` 向智能体说明缺少真实依赖闭包、原生检查器和漏洞库验证;有锁或版本 pin 都不当作漏洞扫描结果。验收见相邻 `codeguard-cli/tests/acceptance/python-dependency-input-discovery.md`。原生 pip-audit 调用、漏洞报告解析/归属、数据库身份及时效、稳定任务与正式门禁仍未完成,7.2 不勾选。 - PEP 751 标准锁进展:`pylock.toml`/单段命名锁作为候选输入被观察,uv/Poetry 专用锁保留独立转换或原生工具选择动作;两类同根并存不任意选一份。该区分只减少错误命令建议,尚无 pylock 语义解析或 pip-audit 原生执行证据,7.2 不勾选。 - pip-audit 协议进展:相邻 Rust adapter 加入标准锁项目模式的固定只读 argv 与当前 2.x JSON 保守解析;跳过的组件、重复字段、版本/退出矛盾、意外修复结果和未关闭的别名/描述输出均拒绝。有效包版本和 advisory 仅形成局部观察,`advisory_coverage=not_evaluated`。六项协议测试通过,见 `codeguard-cli/tests/acceptance/pip-audit-protocol.md`。尚未有本机 pip-audit 原生调用、同轮锁/工具身份绑定、数据库时效或 CLI/工作台接线,7.2 不勾选。 - 公开局部探针进展:`cve python` 现可显式选择原生工具/版本,在私有项目副本中复放一份标准 pylock 与 pyproject,使用共享受控进程执行并前后核对原输入、私有副本和工具字节。human/JSON 反馈原生 advisory 或具体准备阻塞,固定 3/`not_evaluated`/覆盖未证明;工具修改私有锁、原生零项与缺锁反例均有 CLI 测试。协议 0.1 见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。使用的是真实进程内核和模拟原生程序,本机 pip-audit、数据库时效、完整 PEP 751 环境/包图、check all 与稳定任务仍未验收,7.2 不勾选。 - 锁身份补强:原生报告的整组组件名/版本现在必须与本轮 PEP 751 标准锁显式版本集合一致;锁中无版本包、原生包不在锁中或版本不符均不能成为项目 finding。等价 Python 包名规范化及缺包/错版本反例通过,见同一验收文档。环境 marker、extras、dependency groups、文件哈希及完整有效包图仍未解析,7.2 不勾选。 - 锁选择防误报增量:标准锁的顶层环境/解释器约束、非空 extras/依赖组/default-groups 及包级 marker/解释器约束现被识别为未解析选择;已配置工具时仍执行原生审计、反馈原生版本/退出和待归属 advisory 数量,但不把 `[[packages]]` 并集或本轮 advisory 当作实际依赖漏洞。适配器 RED→GREEN 和 CLI 原生进程正例见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。这是拒绝错误归属且保留原工具检查的保护,尚未实现各环境的精确选择与全量扫描,7.2 仍未完成。 - 统一检查接线:`check all` 现在按具有可识别 pyproject 的 Python 构建根创建独立 `python.cve.N` 执行节点,复用私有快照原生探针和共享截止时间/取消;显式提供 pip-audit 工具及版本时,human/JSON 逐根显示 advisory,缺工具或缺锁反馈具体准备阻塞。反馈协议 0.30 与中断协议 0.11 新增 `python_cve`,旧协议留存;纯源码无清单继续保留配置缺口。多构建根、缺原生上下文与旧 Python/Rust 混合回归通过;该阶段仍无稳定 CVE 修复任务、复检、漏洞库时效和可信门禁,本机未运行真实 pip-audit,7.2/2.3 不勾选。见相邻 `codeguard-cli/tests/acceptance/python-cve-cli.md`。 - 工作台增量:已初始化工作区现把 `cve python` 和 `check all` 的逐构建根观察同步为稳定 CVE 完整性任务;导入前重读工作区、清单与整组标准锁。`task verify` 对任务原构建根再次调用显式 pip-audit,复检事件经 `next` 的摘要和输入身份核对;重复扫描一张任务、双构建根两张任务、同一任务的 advisory→零项复检仍 open 的普通 CLI 回归通过。独立 Draft 2020-12 对实际工作台报告与复检预览通过。仍仅模拟原生程序,缺真实 pip-audit、PEP 751 完整环境/依赖组、可信漏洞源、精确漏洞修复任务和正式关闭/门禁;7.2/9.7 保持未完成。验收见相邻 `codeguard-cli/tests/acceptance/python-cve-workbench-task.md`。 - D100 修复闭环与误报边界:已初始化工作区的真实 `check all` 将 D100 同步为稳定任务,`next` 给出修复指引;原工具复检仍存在与补文档后候选消失均写事件,任务不因勾选或零诊断自动关闭。伪原生报告若声称 D100、但同轮生效设置未启用,则保留诊断并标记 `rule_settings_report_mismatch`,不能变成可执行注释结论。解析器内部保留精确原生启用集合,公开映射与 schema 不变。仍缺正式全量注释覆盖和可信规则来源,7.2/9.7 不勾选。 - pydocstyle 规则族增量:仅将精确 D### 格式且同轮 Ruff 原生设置确认启用并实际检出的诊断归入 Python `comments`;真实 D101 公共类缺文档样本通过。伪报告 D100/D101 若与启用集合矛盾则保留诊断、标记 `rule_settings_report_mismatch` 并取消本地完整结论;D1000 等非精确代码不归类。此分类不宣称完整 D/DOC 规则覆盖、规则包批准或交付通过,7.2 不勾选。 - D101 指引与复检:对话反馈及稳定任务给出公共类 docstring 的限定范围修复步骤;真实 `# noqa: D101` 只产生 `suppression_requires_review`,真正补文档后仍仅 `candidate_absent_unverified_policy`,任务保持 open。全部注释义务与可信策略仍缺,7.2/9.7 不勾选。 - D101 白名单自批反例:工作区自写 `codeguard/decisions/forged.json` 的 `approved=true` 后,真实 Ruff D101 仍保留同一 finding 和唯一 open 任务;`rules whitelist propose` 不生成候选,并将未核对的原生规则映射与批准规则包身份分别列为缺口,human 输出指引核对原规则/工具版本。已有映射的 F401 回归仍保持原待批准状态。当前只有拒绝路径,可信批准来源及真实例外门禁仍缺,4.8/4.9 不勾选。 -- [ ] 7.3 实现 Node/TypeScript/JavaScript(typescript)adapter 基础与依赖审计;验收:parser/tsconfig/本地插件和 monorepo 范围正确。 - 稳定任务前置:Rust投影绑定相对路径/规则/源码锚点/出现序号,排序去重;行号/原生措辞变化不造新ID,任一定位异常拒绝整组输入。UTF16、CRLF与Unicode行终止符经真实ESLint位置用例核对(0.23秒),四项身份契约及CLI/probe回归通过。报告入队/同步/next尚未接通,不能声称已创建持久任务;7.3/9.7仍未完成,见相邻tests/acceptance/eslint-stable-task-input.md。 - 公开入口进展:`lint typescript FILE`显式Node/ESLint入口/版本/原配置/原cwd调用原生probe,human/JSON保留规则/位置/严重度及准备原因;局部反馈0.1.0固定coverage=false、门禁未判定、工作台未接入。23项普通回归与真实ESLint原发现/同配置修复后零诊断两轮35.44秒通过。目录/完整源集、持久任务、TS/parser/plugin/monorepo及依赖仍缺,7.3不勾选;见相邻tests/acceptance/eslint-public-lint-feedback.md。 - 原生核心规则验收:发现本机既有ESLint10.11.0缓存,无安装/升级,通过显式Node24.18.0和Rust runtime运行真实clean/warning/error/parser failure/inline suppression/同配置修复复检六轮,104.56秒通过。原生抑制保持待核查,零诊断仅局部一致;不是TS/parser/plugin/monorepo/完整CLI与门禁验收,7.3不勾选。见相邻 `codeguard-cli/tests/acceptance/eslint-native-core-rules.md`。 - 发现补充:独立JS/TS无清单也返回配置准备;清单复核变更/不可读(有无flat config四反例)使发现不完整,不能隐藏为未知配置并标画像新鲜。先RED后修正,发现/初始化/端口66项通过。 - 配置发现进展:detect/init 接入六种 flat config、旧 eslintrc 和 package.json eslintConfig 的只读线索,保留嵌套配置根及配置字节身份;动态规则、多候选选择、TS loader、旧版本上下文和未观察到配置均明确 unknown,不执行JS或套默认规则。67项发现/初始化/发现端口回归通过,见相邻 `codeguard-cli/tests/acceptance/eslint-static-configuration-discovery.md`;真实逐文件配置、插件/导入闭包、CLI执行和依赖审计仍缺,7.3不勾选。 - 受控执行进展:Rust 统一 runtime 接入显式 Node/ESLint 入口、原配置和完整显式输入摘要;版本、私有新鲜报告及执行前后输入校验不一致均未完成。普通启动前反例与实际 Node 受控 JSON 夹具见相邻 `codeguard-cli/tests/acceptance/eslint-input-bound-probe.md`;该夹具不是原生 ESLint,项目有效配置、导入/插件闭包、TS/monorepo、CLI/依赖审计仍缺,7.3 不勾选。 - 中断诊断进展:扫描启动后取消/超时分别覆盖已写有效报告与无报告四种受控反例;缺报告加取消曾 RED,现优先保留请求中断,不降级为报告损坏。其它失败分流为报告预检、执行留证和报告读取;不把退出2/无报告解释为源码违规。仍为执行层局部验收,完整7.3不勾选。 - 原生命令计划进展:新增 EslintCommand 显式 Node/JS/原配置/源集/JSON 槽位/阈值,以固定字面参数规划,不 Shell/npx/fix/cache/quiet/no-ignore;路径/重复/覆盖及参数预算启动前拒绝。缺 API 先 RED 后实现;四项参数契约通过,真实 Node 24.18.0 经统一 runtime 转发 argv 实测通过(0.05 秒),此为观察脚本,不是 ESLint 原生执行。闭包/物理别名/生效配置/实际 ESLint/CLI/依赖及门禁仍缺,7.3 不勾选;见相邻 tests/acceptance/eslint-native-command-plan.md。 - 报告协议进展:新增 Rust ESLint 10 JSON 有界观察,按具体版本/冻结文件与计数解释 0/1/2、max-warnings、fatal/无 ruleId 和 suppression;合法 warning 与部分规则保留,坏范围/版本/重复/计数不自成干净结果。缺 API 先 RED,dot 路径因自动折叠再 RED 后修正;本轮只做协议夹具,不安装或执行 ESLint。CLI/Node 闭包/有效 parser/config/monorepo/依赖和任务门禁仍缺,7.3 不勾选;见相邻 tests/acceptance/eslint-json-observation.md。 -- [ ] 7.4 实现 Shell(shell)方言与 Dockerfile(dockerfile)/IaC 基础;验收:zsh 不静默丢弃、Hadolint 与配置安全报告不互相掩盖故障。 -- [ ] 7.5 实现 CVE 共享生态映射、依赖归并和数据库 freshness;验收:UNKNOWN/离线/原生缺失/重复依赖均符合规格。 -- [ ] 7.6 实现跨生态静态检查配置识别与原生结果归类;验收:注释/API 文档、依赖治理、SAST/秘密/IaC/容器等检查器在已配置时运行并反馈,未配置/无效/不可用分开解释,修复后按原工具复检。 - -## 8. S08 全语言补齐 - -依赖:S05,复用 S06/S07 已验收基础。覆盖:native-tool-adapters、language-gate-commands。 - -每组以 [57 项清单](../../../docs/rust-cli/coverage-and-acceptance.zh-CN.md) 为边界;每个语言必须有六槽位、工具锁、正反例、故障样本、平台与真实验收产物。每个语言分别拆为能力判定、lint/comments、其余类别与验收三项;每项内部有多工具时按实际 adapter 再细拆,不将未完成工具藏在汇总完成状态中。 - -- [x] 8.1 为 go 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。证据:相邻 Rust `rulepacks/go_static_candidate_v1.json`、`schemas/go-static-candidate.schema.json`、`codeguard-adapters::parse_go_candidate_profile` 和 `tests/acceptance/go-candidate-baseline.md`;六槽均 `applicable/gap`,五平台未验收,旧 Go stable 不升级为新能力;缺槽/重复/虚报实现、格式化器冒充注释、CVE 漏数据库时效及错类别工具反例通过。真实原生适配与验收仍属 8.2/8.3。 -- [ ] 8.2 实现 go 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 - 原生文件范围进展:Go 普通反馈 0.6 / 源码复检 0.7 / 统一反馈 0.22 增加整组源码摘要;源码复检沿用受控 Go 环境获取 go list JSON,目标 excluded/not_selected 不作为已修复候选,清单失败保持 incomplete;next 和同步在整组源码变化后要求复扫或仅记历史。标签、CGO、平台排除真实反例与普通导入回归通过;完整平台/规则覆盖、注释检测与可信关闭仍缺,8.2 不勾选。 - 原工具任务复检进展:`task verify --go-tool ABS_PATH` 现沿用共享预算、租约、尝试绑定和报告事件;Go 0.5 绑定目标源码,反馈 0.4 区分仍存在、同规则身份变化待核对、未发现候选和未完成。next/尝试历史消费同一 Go 事件,模块配置或源码变化后不沿用候选。普通环境复检、真实 still_present/身份变化/修复/编译失败及实际 schema 验证通过;正式关闭/复发重开、完整平台/规则覆盖和可信策略仍缺,8.2 不勾选。 - 持久任务进展:Go 子反馈 0.4 / 统一反馈 0.21 绑定 workspace/run 及各模块 manifest/go.sum 字节摘要,lint go/check all 自动保存并幂等同步;next 与 Markdown 任务给出 Go 原工具复扫及环境/策略修复指引。错工作区、位置/模块/计数矛盾或越界拒绝源码任务,源码或模块摘要变化保留历史而非活动发现。真实重复扫描只保留一个任务,修复后同步不自动关闭;Go task verify、完整策略/平台覆盖仍缺,8.2/9.13 不勾选。 - 稳定身份前置进展:Go 子反馈 0.3 / 统一反馈 0.20 绑定发现 ID、完整指纹与本轮源码摘要;前置空行保持 ID、不同原生证据/重复锚点分离,模块内位置越界拒绝全部部分发现。原生顺序先排序、同位置同诊断去重。该阶段尚无 Go 持久报告归属、work sync/next/task verify 接线,8.2 仍未完成。 - 进行中:相邻 Rust `codeguard-adapters::parse_go_vet_json` 已针对本机 Go 1.23.4 的原生 `go vet -json` 做保守局部解析,真实违规/干净/编译错误样本与坏版本、坏 JSON、越界位置、多包坏块反例通过;`-json` 违规样本退出 0 但 stderr 有诊断,不能以退出码判干净。macOS `/var` 与 `/private/var` 根别名经真实反例修正。解析器本身不证明工具/规则身份、完整源集/build tags/多平台覆盖或 Staticcheck 注释检测;见相邻 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 - CLI 进展:`codeguard lint go [path] --go-tool ABS_PATH --format json` 已经由 Rust 运行时执行原生版本探测和 vet,离线私有 Go 环境、源码/清单/工具前后摘要及 stderr JSON 解析进入公开局部反馈;真实违规、干净、编译失败和错误工具正反例通过。仍固定退出 3、`not_evaluated`,没有任务同步、受批准策略/工具锁、完整 build tags/平台覆盖或 Staticcheck 注释适配,故 8.2 不勾选。 - 范围加固:早期仅执行根模块时曾对嵌套 `go.mod` 返回明确未完成;现已由下一项逐模块执行替代。原生诊断的相对文件若不在本轮已发现和摘要复核的 Go 源码集合中,不产生该诊断对应的 finding。对应 CLI 反例与本机原生正反例通过;完整源集仍未证明,8.2 不勾选。 - 多模块进展:局部 CLI 现按发现的 Go Module 根逐一运行原生 vet,记录每模块状态并保留前一完整模块的 finding;双模块真实违规与后续编译失败样本通过。逐模块输入摘要和发现归属复核仍只构成局部观察;build tags/平台矩阵、可信工具与规则策略、注释适配和完整验收仍缺,8.2 不勾选。 - 统一检查进展:`check all --go-tool` 复用同一观察服务并纳入共享调度/执行预算、候选类别及 JSON/human/SARIF 局部反馈。缺工具与预算耗尽有明确状态,真实 Go finding 可见但不签发完整通过;持久任务与正式义务、规则/平台证明仍缺,8.2 不勾选。 -- [ ] 8.3 完成 go 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.4 为 csharp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.5 实现 csharp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.6 完成 csharp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.7 为 kotlin 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.8 实现 kotlin 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.9 完成 kotlin 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.10 为 swift 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.11 实现 swift 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.12 完成 swift 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.13 为 php 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.14 实现 php 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.15 完成 php 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.16 为 ruby 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.17 实现 ruby 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.18 完成 ruby 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.19 为 scala 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.20 实现 scala 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.21 完成 scala 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.22 为 elixir 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.23 实现 elixir 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.24 完成 elixir 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.25 为 c 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.26 实现 c 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.27 完成 c 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.28 为 cpp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.29 实现 cpp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.30 完成 cpp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.31 为 objc 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.32 实现 objc 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.33 完成 objc 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.34 为 dart 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.35 实现 dart 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.36 完成 dart 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.37 为 vue 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.38 实现 vue 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.39 完成 vue 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.40 为 svelte 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.41 实现 svelte 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.42 完成 svelte 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.43 为 astro 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.44 实现 astro 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.45 完成 astro 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.46 为 css 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.47 实现 css 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.48 完成 css 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.49 为 html 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.50 实现 html 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.51 完成 html 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.52 为 graphql 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.53 实现 graphql 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.54 完成 graphql 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.55 为 solidity 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.56 实现 solidity 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.57 完成 solidity 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.58 为 terraform 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.59 实现 terraform 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.60 完成 terraform 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.61 为 nix 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.62 实现 nix 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.63 完成 nix 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.64 为 sql 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.65 实现 sql 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.66 完成 sql 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.67 为 protobuf 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.68 实现 protobuf 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.69 完成 protobuf 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.70 为 yaml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.71 实现 yaml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.72 完成 yaml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.73 为 markdown 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.74 实现 markdown 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.75 完成 markdown 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.76 为 toml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.77 实现 toml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.78 完成 toml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.79 为 haskell 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.80 实现 haskell 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.81 完成 haskell 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.82 为 ocaml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.83 实现 ocaml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.84 完成 ocaml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.85 为 fsharp 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.86 实现 fsharp 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.87 完成 fsharp 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.88 为 perl 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.89 实现 perl 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.90 完成 perl 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.91 为 groovy 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.92 实现 groovy 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.93 完成 groovy 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.94 为 clojure 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.95 实现 clojure 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.96 完成 clojure 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.97 为 powershell 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.98 实现 powershell 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.99 完成 powershell 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.100 为 zig 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.101 实现 zig 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.102 完成 zig 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.103 为 nim 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.104 实现 nim 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.105 完成 nim 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.106 为 crystal 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.107 实现 crystal 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.108 完成 crystal 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.109 为 julia 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.110 实现 julia 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.111 完成 julia 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.112 为 elm 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.113 实现 elm 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.114 完成 elm 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.115 为 lua 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.116 实现 lua 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.117 完成 lua 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.118 为 luau 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.119 实现 luau 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.120 完成 luau 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.121 为 pascal 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.122 实现 pascal 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.123 完成 pascal 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.124 为 r 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.125 实现 r 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.126 完成 r 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.127 为 cfml 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.128 实现 cfml 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.129 完成 cfml 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.130 为 vbnet 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.131 实现 vbnet 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.132 完成 vbnet 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.133 为 erlang 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.134 实现 erlang 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.135 完成 erlang 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.136 为 liquid 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.137 实现 liquid 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.138 完成 liquid 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.139 为 cuda 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.140 实现 cuda 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.141 完成 cuda 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [ ] 8.142 为 ansible 固化六类别适用性、候选工具/方言/版本及缺口;验收:每个槽位有实际依据,not_applicable 不得用缺工具解释。 -- [ ] 8.143 实现 ansible 的 lint/comments 适配与规则;验收:真实工具正确样本和违规样本、错误配置/版本/报告反例通过,格式化不能冒充注释检查。 -- [ ] 8.144 完成 ansible 的 dependencies/CVE/security/build 适用能力及整体验收;验收:依赖生态映射和逐类别真实证据齐备,缺口未解决不升级 stable。 -- [x] 8.145 为 cobol 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。证据:相邻 Rust `planned_language_gaps` 集成测试以 `.cbl` 项目检查六类别、capabilities planned/gap、退出 3 和不生成空义务;见 `tests/acceptance/planned-language-gaps.md`。 -- [x] 8.146 为 arkts 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。证据:同一测试的 `.ets` 正反例和六类别未集成反馈。 -- [x] 8.147 为 metal 保留显式 planned/gap;验收:项目要求该能力时返回未完成,不能用空实现充数。证据:同一测试的 `.metal` 正反例和六类别未集成反馈。 -- [ ] 8.148 机器核对最新注册表与全部验收条目;验收:54 个原 stable 六槽位与真实证据完整,3 planned 如实披露,无丢项/重复/别名漂移。 - -## 9. S09 持久问题与修复工作流 - -依赖:S02、S03、S04、S05;与后续修复和宿主接入共享本协议。覆盖:remediation-workflow、scan-scope-policy、project-initialization。 - -- [ ] 9.1 实现 init dry-run/apply 与工作区 schema/.gitignore/受管路径;验收:不覆盖用户文件,不重复建立质量配置,未初始化只用私有用户缓存存原始报告。进行中:相邻 Rust CLI 已提供默认只读预览、精确受管目标预检查和局部 apply,含根 AGENTS 受管摘要;当前 apply 固定 partial/退出3,不虚构完整初始化。准备任务、刷新及私有原始报告缓存尚未接线;见 `codeguard-cli/tests/acceptance/init-workspace-preview.md`。 -- [ ] 9.2 实现自有产物精确范围规则与工作区校验;验收:运行副本不递归扫描,codeguard/src 用户源码正常检查,入库 secret 仍阻断。进行中:相邻 Rust discover 已精确跳过自有文件及记录目录,保留 `codeguard/src`;真实 Git index 路径安全预览独立运行,但自有记录内容安全与正式 gate 仍缺。见 `codeguard-cli/tests/acceptance/init-workspace-preview.md`。 -- [ ] 9.3 实现 finding/blocker 的稳定身份与重命名匹配;验收:十次相同扫描只有一个问题,行号变化不生成无意义重复,不确定匹配不误关闭。进行中:相邻 Rust CLI 的 Ruff 局部反馈 0.3 产生不依赖行号的 ID/指纹;真实双轮扫描加本地 sync 验证同一发现仅一份 finding/task。重复 finding 的每轮证据现写入忽略入库的 `state/observations/`,避免改动首次事实与无意义审计事件,崩溃重试幂等。局部 Ruff 环境 blocker 以 checker、构建根、原因和范围生成稳定 ID,重复扫描复用任务。Rust Clippy 局部 finding 现按原生规则、目标与源码行内容形成稳定身份;重复扫描只保留一张任务,缺 Cargo blocker 同样稳定。重命名关联、跨工具身份和不确定匹配协调仍缺,不勾选。 - Java/P3C 命名子集现也按原生规则、目标和源码锚点形成稳定 finding,缺 P3C 配置按 Maven 构建根/原因形成 blocker;初始化工作区两次扫描只保留一张任务。仍无重命名关联或不确定匹配协调。 - CVE/Java/Ruff 等现有 blocker 的重复报告逐轮保存到忽略入库的 `state/observations/`,只有首次或复检后再现追加 tracked 事件;重复扫描任务及 tracked 事件均稳定。跨模块公共前置依赖和完整事件状态机仍缺,不勾选。 -- [ ] 9.4 实现 run_id 游标、全量未消费报告幂等 sync;验收:先 lint 后 CVE 不丢问题,部分/过时报告不能跨范围关闭旧问题;事件写入后游标写入前崩溃可恢复且不重复,一份坏报告不阻止其它有效报告持久化,整体仍返回3。进行中:Rust `lint python` 在已初始化工作区按 workspace_id 保存脱敏本地报告并自动调用 `work sync`;后者遍历全部未消费 Ruff 报告,先落 finding/event/task 后落 `(workspace_id,run_id,摘要)` 消费标记,重复导入和标记丢失重试不重复任务;旧源码只计历史,坏报告不阻止有效报告,同键不同摘要拒绝。跨类别 RunReport、准备诊断、严格事务和并发协调仍缺,见 `codeguard-cli/tests/acceptance/work-sync-ruff-baseline.md`,不勾选。 - 新增 Java/CVE 局部报告 0.3 的自动保存与幂等导入:数据库时效未知和缺工具/库分别生成稳定 blocker,同根重复扫描不创建多张任务;消费后改报告再次同步会显示摘要冲突。CVE advisory 仍只是未核验原生观察,尚不生成源码 finding。跨类别完整 RunReport、崩溃矩阵与可信来源仍未完成,9.4 不勾选。见 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 - 跨类别恢复验收补充:同一工作区的 Ruff 与 CVE 两份已保存报告在自动同步失败后可由一次 `work sync` 同时导入;一份坏报告不阻止这两份报告,删除两份消费标记后重试也不新增任务/事件。见相邻 `codeguard-cli/tests/acceptance/work-sync-lint-cve-cross-category.md`。任意崩溃点事务、并发及全类别 RunReport 尚未验收,9.4 不勾选。 - 坏报告现在按当前字节摘要保存脱敏本地失败收据;`next` 对未改输入返回具体失败原因而非反复建议同步,报告变更后旧收据不适用。收据不构成 finding 或白名单批准。回归仍仅覆盖局部报告队列,9.4 不勾选。 - 同工作区 `work sync` 现复用原有跨进程非阻塞文件锁,将本轮报告遍历、fact/事件和消费标记置于同一临界区;锁被占用时返回版本一致的未完成协议,释放后可重试。此测试验证互斥与恢复,不证明完整多进程随机交错、跨平台锁或任意崩溃点事务,9.4 仍不勾选。 - 持久边界补充验收:Ruff finding 的任务、fact、本地观察、事件四阶段及 Ruff 环境 blocker 的 fact 阶段均用独立工作区恢复;重放后缺失记录恢复、原字节不变、事件仅一条、消费标记最后出现。此阶段是磁盘中间态重建,实际进程退出验收见下条;磁盘故障和完整多类别事务矩阵仍缺,9.4 不勾选。 - 实际进程退出补充:仅单元测试编译的子进程在 Ruff finding 的事件已持久化、消费标记未写时直接退出,父进程复查磁盘并重试,事件不重复且游标恢复;生产构建无故障注入入口。其它阶段、磁盘故障、跨类别多记录强杀与完整 RunReport 仍缺,9.4 不勾选。 - 临时写入恢复补充:旧 PID/计数命名的 staging 文件残留曾使 `write_once` 直接失败;现有界换用新的 `create_new` 名字,残留文件原字节不变,目标记录完成。仍未证明磁盘错误/断电和完整事务,9.4 不勾选。 -- [ ] 9.5 实现 append-only 事件、父关系、状态机与可重建 Markdown 投影;验收:手改勾选无复检不关闭,缺父/分支冲突触发协调。进行中:Ruff 与 Rust Clippy 初见 finding 写固定 `observed` 事件和任务投影,重复报告不改 tracked 文件;其余事件、父关系校验、完整状态机及投影重建尚未实现,不勾选。 -- [ ] 9.6 实现任务依赖与 blocker 归并;验收:多个模块共缺 JDK 形成一个前置任务,各义务仍完整可见。进行中:Rust `work sync` 已将同一 Ruff 构建根、同一不完整原因的多个受影响文件归并成一个 `kind=blocker` 任务,分别保留原路径与观察事件;不同构建根不误合并,见 `codeguard-cli/tests/acceptance/work-sync-ruff-blockers.md`。JDK 跨模块公共前置任务、义务依赖边及跨检查器归并尚缺,不勾选。 -- [ ] 9.7 实现 status/next/show 与 RepairBrief/版本化 recipe;验收:给出修复目标、范围、步骤和复检条件,诊断中的指令不可执行。进行中:Python Ruff 局部反馈给出有界修复提示;初版 sync 生成脱敏 Markdown 任务。Rust `next` 已从本地结构化 Ruff fact 生成只读简报,含范围、静态步骤、复检与关闭条件;任务 Markdown 指令不进入简报,缺工具/配置优先指向准备工作。尚无完整 status/show、真实尝试历史、版本化 recipe、租约与复检关闭,因此不勾选,见 `codeguard-cli/tests/acceptance/next-local-brief-preview.md`。 - doctor 复检进展:task verify 已重用原版本诊断和任务租约/尝试一致性,持久化摘要绑定收据;next 与尝试账本识别 doctor 身份。失败仍受阻、未选择未完成,真实 Ruff 恢复仅 environment_restored_unverified_policy,next 指向批准前置及原受阻质量检查,任务仍 open。65 项相关回归及实际协议验收通过;可信义务/正式关闭未实现,不勾选,见相邻 tests/acceptance/doctor-task-verification.md。 - Java/CVE blocker 现也有本地 Markdown 任务和 `java_cve.next` 只读简报,给出构建根、漏洞库/工具检查步骤及带占位参数的复检命令;原生 advisory 未被当作已确认漏洞或白名单批准。`task verify` 可重跑原生 OWASP 并保留局部观察,但正式关闭/重开尚未实现,9.7 不勾选。 - 新增局部 `status` 与 `task show` 只读视图:前者从当前受限事实汇总开放任务、待同步报告和下一步,后者复用事实/事件核对展示指定任务的证据、范围、约束、历史和复检,不读取 Markdown 指令。画像/检查 freshness 固定未核验,空任务不称通过;缺完整事件父关系、历史 gate 收据、依赖、关闭状态与版本化 recipe,9.7 仍不勾选。见相邻 `codeguard-cli/tests/acceptance/status-show-local-preview.md`。 - Checkstyle 工作台连接进展:显式 --workspace 现保存摘要绑定的本轮局部观察,复用既有 work sync 稳定任务与事件,next 从最新报告给出规则依据、修复步骤和原输入复检参数;源码/配置变化要求复扫,手工勾选不关闭任务。历史消费按精确字节收据复用,陈旧新报告不导入。task verify、环境阻塞持久化、check all 配置发现与正式闭环仍缺,9.7/6.3 不勾选;验收见相邻 tests/acceptance/checkstyle-local-workbench.md。 - - Checkstyle 复检进展:task verify 现接受显式 Java/JAR/原配置,在统一预算和租约中重跑原工具,记录仍存在/暂未检出/规则覆盖待审/未完成,next 与尝试读者识别对应收据。工具身份固定首次观察,连续更换工具不能滚动认可;失败观察记录具体原因,全部保持 open。正式关闭、批准策略、完整配置/覆盖、环境任务与取消端到端仍缺,9.7/6.3 不勾选;验收见相邻 tests/acceptance/checkstyle-task-recheck.md。 - - Checkstyle 前置任务进展:显式工作台遇到缺工具/配置/报告问题现保存准备观察并同步稳定 CG-B 任务,next 读取最新具体诊断和受影响范围;不会生成源码 finding,备注/勾选不关闭。后续同范围已消费原生观察只转向核对原选择与批准覆盖,不重复恢复工具;输入变化使线索失效。模块粒度、准备 task verify、完整关闭与宿主 Hook 仍缺,9.7/6.3 不勾选;验收见相邻 tests/acceptance/checkstyle-preparation-tasks.md。 - - Checkstyle 准备复检进展:task verify 现支持显式原工具的准备任务复检,保存具体 still_blocked/incomplete 或局部恢复观察,并同步源码 finding;租约失败不执行或落事件,任务保持 open。53 项受影响普通回归、真实 Java/Checkstyle 恢复及实际产物 schema 通过,见相邻 tests/acceptance/checkstyle-preparation-recheck.md。完整义务/批准与关闭仍缺,9.7 不勾选。 - 准备尝试预算进展:新增 claim/ready-to-verify/失败复检/事件关联/两轮预算耗尽全链用例。修正失败复检后简报不可修复导致 task_not_actionable 的卡点;当前输入有效时允许前置修复,输入变化仍先复检,预算耗尽返回 needs_decision。29 项相关普通回归及真实 Checkstyle 恢复通过,9.7 保持未勾选。 - 恢复交接进展:真实准备尝试的恢复事件关联 attempt,解除 awaiting_verification,环境任务保持 open。复检后 Java/JAR 身份变化现令 next/task show 的旧恢复或缺失观察失效;真实复制 JAR 改动反例先失败后通过(10.28 秒)。批准与正式关闭仍缺,9.7 不勾选。 - 反馈原因进展:next/task show 将当前工具/源码/配置失效原因与原复检原因分开;status 摘要不再丢失具体前置诊断。专用简报与状态 schema 更新,17 项普通回归、JAR 改动/删除真实回放(9.77 秒)及实际产物 schema 通过。正式批准与全义务仍缺,9.7 不勾选。 - 当前输入优先进展:真实 still_present 反例暴露配置失效被后续旧诊断覆盖为 actionable;next/task show 现先核对工具、配置、已绑定源码变化,再解释旧结果,准备与源码任务共享失效优先级。旧收据保留,当前失效不推荐旧修复方向;相关完整覆盖和关闭仍缺,9.7 不勾选。 - 原始配置连续性进展:复检简报从首次摘要绑定报告保留配置身份;同检查类/规则 ID 下增加名称排除后零诊断,连续复检须为 rule_coverage_requires_review,不成为修复候选。原配置恢复并添加文档后仅给局部候选,事实仍 open;真实反例先 RED、修正后四轮通过(40.99 秒),见相邻 tests/acceptance/checkstyle-recheck-config-continuity.md。配置字节变化均需复核,语义等价及受批准策略/正式关闭仍缺,9.7 不勾选。 -- [ ] 9.8 实现 claim/heartbeat/release 跨进程租约;验收:同工作区只有一个有效领取者,过期和中断可恢复,不声称跨机器全局锁。进行中:相邻 Rust CLI 已有 Unix 本地跨进程锁、随机 token 摘要、generation、5 分钟期限及基本过期接管;并发四领取者只有一人成功,旧 token 和同名 owner 不能修改新租约;未结束 attempt 阻止 release,过期接管先落唯一 abandoned 事件。verify/fix 绑定、完整崩溃事务与 Windows 实现未完成,不勾选。 -- [ ] 9.9 实现 attempt start/finish、动作与 patch 身份、无进展预算;验收:复检前失败/no-change/abandoned 均计数,耗尽后不重复推荐同一动作。进行中:Unix Rust CLI 已有受控 action-id、租约绑定、前后受影响路径摘要、不可覆盖 start/finish 事件、同结果幂等重放和同输入两次无进展预算;`ready-to-verify` 必须有绑定该 attempt-id 的原工具复检才可再次 start,复检仍显示问题/未完成时计入预算,私有报告丢失须重新复检。`next` 展示最近历史并停止推荐耗尽的动作。缺完整 patch/环境身份、跨平台实现、正式 fix 自动登记、可信策略和任务关闭,不勾选。 -- [ ] 9.10 实现 task verify 的证据关闭与重开;验收:工具超时、加 ignore、移动到排除目录不自动 resolved,真修复有完整身份绑定;环境任务先确认恢复再重跑原受阻义务,自有验证租约收尾释放、调用方租约保留、错token不启动检查器。进行中:Rust `task verify` 已复用原生 Ruff 路径,对本地 finding/blocker 保存新报告、同步新问题并追加 `verification_observed`;问题消失只给待策略核验候选,fact 保持 open,`next` 对照报告复核候选;Unix 本地版本新增复检自有/借用租约、扫描前错误 token 拒绝、提交前再次核验及结束后自有租约释放,真实 Ruff 0.16.8 样本已覆盖借用场景。Rust Clippy finding/blocker 现复用租约、原生复检、同步与观察事件;真实抑制后原生 `--force-warn` 对照重新检出旧规则并要求抑制核查;对照无效或输入变化不生成修复候选。见 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`、`task-verify-lease-binding.md` 与 `check-all-partial-native.md`。可信策略/覆盖、长操作自动续租、Windows 等价实现、正式关闭和重开仍缺,不勾选。 - Java/P3C 命名子集也能复用原生 Maven 探针、任务租约、局部报告同步及验证事件;原问题仍在为 `still_present`,零诊断仅为 `rule_coverage_requires_review`,配置恢复为 `environment_restored_unverified_policy`。任务仍 open,源码身份变化不产生有效关闭证据。见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 - 后续进展:原任务被 `# noqa` 遮蔽时,复检 0.2 返回 `suppression_requires_review`,`next` 指向抑制核查且 fact 保持 open;真实删除违规仍仅是待策略核验候选,见 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 - 再次补充:真实 Ruff 复检中,原 F401 被配置禁用时返回 `rule_coverage_requires_review`,新增逐文件 ignore 时返回 `suppression_requires_review`;两者均不关闭任务,也不把零诊断伪装成修复。逐文件匹配范围和受批准策略来源仍待验收。 - CVE blocker 复检进展:`task verify` 已按任务检查器重跑原生 OWASP Maven,接受与 `check java` 一致的离线 Maven/JDK/仓库/漏洞库参数;报告经 sync 保留新阻塞,事件和尝试历史核对原报告摘要。缺前置条件或漏洞库时效未核验均保持 `still_blocked` 和 open,POM 变更后要求重跑。模拟报告与缺数据库正例见相邻 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`;真实数据库、可信政策和正式关闭/重开仍缺,不勾选。 -- [ ] 9.11 实现 code/dependency/environment/target/policy 的处置归因与例外标签;验收:policy_resolved 不计代码修复,例外保留未解决事实和期限。 -- [ ] 9.12 提供受控 fix 的 attempt 与验证事件接口;验收:noop、部分修改失败及并发编辑的事件样本分别记录且不生成假修复;真实 formatter 接线在 S10 完成。 -- [ ] 9.13 为插件提供启用后的 scan→sync→brief API;验收:新问题给下一步,重复无 Git 噪声,同步失败保留原 gate 并说明 backlog_update_failed。进行中:初始化项目的公开 Rust `lint python` 已自动保存、同步并在同一 CLI 对话反馈中返回局部 Ruff 简报;重复原生扫描不改 task。`check all` 的局部 Rust Clippy finding/blocker 也能保存、同步并在 JSON/human 对话反馈返回下一步。同步或简报失败仍显示原生结果并分别标明状态,见 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md` 与 `check-all-partial-native.md`。插件 Hook/MCP 接线、正式 RepairBrief/门禁及其它检测族尚缺,不勾选。 - Java/P3C 命名子集现也自动保存、同步并显示稳定 finding/blocker 的下一步;仍为局部观察,不能替代完整 Java 义务或白名单批准。 -- [ ] 9.14 验证持久记录隐私、篡改和删除边界;验收:日志默认不入 Git,删除所有任务不影响真实 gate,跨机器无原始日志可重新复检。进行中:Ruff 本地报告/消费标记默认 Git 忽略,tracked finding/task 不含原生消息,所有同步结果固定 `not_evaluated`;跨机器、删除记录和入库内容安全验收仍缺,不勾选。 -- [ ] 9.15 实现项目边界与多构建根画像;验收:monorepo、多仓、worktree 和混合语言不会互相覆盖或越界观察。 -- [ ] 9.16 定义 project.json/module-graph.json schema 与来源身份;验收:产品/目标/解析/本机版本分别记录,未知值不由其它字段猜测。进行中:相邻 Rust CLI 已产出画像 0.2.0 与模块图 0.1.0 局部 schema、manifest/锁/已识别规则配置摘要及 workspace 内容摘要;`package.json` 包版本另列,语言目标与未探测本机版本保持 unknown,解析版本与完整输入清单仍缺。 - 语言目标进展:project profile 0.3 按 Maven/Cargo 清单保留 Java compiler release/source/target 与 Rust rust-version/edition 的 declared_only 值、构建根、清单字节摘要;不生成全局语言版本,不拿包版本或本机版本替代。变量/继承/重复或非法字段显式 unresolved,刷新保留人工备注。旧 profile 0.2 schema 单独保留;有效模型、其它生态与安装版本仍缺,9.16/9.17 不勾选;见相邻 tests/acceptance/declared-language-target-profile.md。 -- [ ] 9.17 接入各已实现 adapter 的 manifest/锁/wrapper 静态观察;验收:init 不执行项目脚本,声明版本和已解析版本分别有依据。 - 包版本进展:Maven/Cargo 的直接包版本进入已有 package_declared_versions,与初始清单字节 SHA-256 绑定;Maven 不依赖完整 GAV,Cargo 校验直接 SemVer。继承、变量、重复/错类型/非法版本保持 unknown,不冒充语言或本机版本;刷新保留人工备注且幂等,不执行构建器。有效模型、解析版本及其它生态仍缺,9.16/9.17 不勾选;验收见相邻 tests/acceptance/declared-package-version-profile.md。 -- [ ] 9.18 实现分类型、带条件和完整性的模块图;验收:聚合不当依赖,动态未知边不支撑缩小检查范围,过期 CodeGraph 不作为当前证据。进行中:相邻 Rust CLI 仅生成有 manifest 依据的 contains 边并将依赖关系标 unresolved;构建依赖、源码引用、条件及 CodeGraph 身份仍缺。 - Maven 图进展:相邻 Rust adapter 在同次清单字节上观察直接模块/依赖声明,init 图 0.2 区分 contains、aggregation 与 declared build_dependency,附清单摘要、scope/条件。完整唯一直接坐标才连本地依赖;变量、父模型、profile、重复坐标、特殊属性和越界/未知模块保留 unresolved。刷新依赖版本会更新图并保留人工任务备注,旧图 schema 单独保留。完整有效模型、其它生态、源码引用和条件解析仍缺,9.18 不勾选;见相邻 tests/acceptance/maven-static-module-graph.md。 - Cargo 图进展:新增同次清单字节绑定的直接成员/path 依赖观察。图 0.3 保留 normal/build/dev 范围,package 重命名核对目标包身份;workspace/optional/target、通配/排除、外部/缺失/逃逸目标保留 unresolved,不执行 Cargo/build.rs。依赖名称变化后刷新移除旧边并保留人工备注。旧 0.1/0.2 schema 单独保留;有效 Cargo 模型/条件解析及源码引用仍缺,9.18 不勾选;见相邻 tests/acceptance/cargo-static-module-graph.md。 -- [ ] 9.19 实现多维架构画像与确认任务;验收:domain/controller 命名不自动认定 DDD,文档/源码冲突保留,推断不能激活阻断规则。 -- [ ] 9.20 生成 architecture.md 与 AGENTS 精简受管区块;验收:事实/推断可追溯、详情链接有效,不泄露本机路径或凭据,文本指令不被升级为政策。进行中:相邻 Rust CLI 已生成 unknown 架构投影和仅含结构化画像身份/相对链接的根 AGENTS 区块;完整多维架构与来源归属仍缺。 -- [ ] 9.21 实现 AGENTS 区块合并和文件身份保护;验收:人工内容、其它工具区块、子目录指令保留,人工修改/重复 marker/并发写入返回冲突。进行中:相邻 Rust CLI 已保留区块外原字节,并验证初始化后新加的人工前后文在刷新时仍保留;拒绝重复/缺失 marker、人工改写及规划后字节变化。外部编辑器不协作时最终比对与替换之间仍有竞态,子目录指令作用域尚未完整验收。 -- [ ] 9.22 实现 init 默认 dry-run 与受控 apply 的可恢复事务;验收:无隐式安装/构建/服务启动/Hook接管,第二文件失败不伪称全成功或覆盖用户更改。进行中:相邻 Rust CLI 已预检受管目标、逐文件记录已创建文件/目录并对 AGENTS 再次核对;模拟画像先写而 workspace 标记未更新的中断后可重试完成且重复运行幂等。跨文件恢复日志及完整并发保护仍缺,故 apply 固定 partial/退出3。 -- [ ] 9.23 实现输入清单与增删感知的幂等画像刷新;验收:新增模块、锁/规则变化均失效,刷新保留 findings/events/备注。 - 进行中:相邻 Rust CLI 已将 manifest、锁文件字节摘要、旧清单精确登记的单文件检查器配置摘要和各语言源码路径集合摘要纳入局部画像;新增/删除构建根、同数量路径替换或上述配置变化可触发受管投影刷新,输入不完整不声称 fresh。点前缀例外仅匹配精确配置名,不扫描其它隐藏源码;配置存在不当作检查器已配置。旧受管摘要与 AGENTS 区块摘要防止覆盖人工修改,workspace 最后更新,findings/tasks 保留。`package.json` 包版本另列,不冒充语言目标版本。24 项 init 契约测试通过。未登记/嵌套规则配置、源码关系完整性、跨进程编辑器锁及中断恢复的更深验收未完成,不勾选。 -- [ ] 9.24 生成质量配置映射、测试/环境前置清单及准备任务;验收:缺工具或未知架构不虚构代码违规,不自动增加排除或存量豁免;dry-run 仅返回计划,apply 才持久化任务。 - 配置反馈进展:init_plan 0.5 按构建根反馈原生检查器 configured/missing/invalid/unknown、来源、原因和下一步。每条固定 execution=not_run、required_by_policy=null、gate_effect=none,清单明确 partial。JSON/human 同语义,不把缺配置转为代码违规或自动启用工具;旧 0.4 schema 单独保留。批准义务、前置任务持久化与完整 readiness 仍缺,9.24/9.25 不勾选;见相邻 tests/acceptance/init-checker-configuration-feedback.md。 -- [ ] 9.25 实现 init_status/readiness/next_actions;验收:仅按适用必需前置条件及有效证据汇总 ready/incomplete/unknown,可选工具不误阻塞;初始化成功不等于 check/gate 通过,给出可继续执行的 doctor/check/sync/next 动作。 - 准备任务进展:核心 plan_preparation 将同一 readiness 当前结论投影为稳定准备任务;有效缺失/不兼容/冲突提供不同动作,未知只要求重新核验,不沿用旧诊断。来源未核验、非法/重复要求不产生行动任务;可选/不适用/满足条件不生成修复任务。工作区内任务逻辑键不随绑定变化,步骤/关闭条件固定且无执行或交付授权。可信生产、持久化及 CLI/doctor/next 接线仍缺,9.25 不勾选;见相邻 tests/acceptance/preparation-task-planning.md。 - readiness 领域进展:新增可信要求/观察输入契约与纯判定;当前有效的必需缺失/不兼容/冲突为 incomplete,未探测/未解析/过期/错绑定为 unknown,可选条件不影响结果。集合未完整、无适用必需条件、重复或歧义不能 ready;ready 不替代原生检查。当前只是领域模型,批准义务/原生来源/时钟及 CLI/准备任务仍未接通,9.25 不勾选;见相邻 tests/acceptance/preparation-readiness-domain.md。 - 对话摘要进展:init_plan 0.4 在 dry-run/apply 返回同语义 profile_summary(语言/源码清单数量、构建根、逐清单目标与未知状态),human 从相同结构投影并转义路径/字段,避免伪造终端行;不暴露原始清单、本机根路径,不执行工具或生成质量通过。旧 0.3 schema 单独保留。完整 readiness/准备任务/宿主接线仍缺,9.25 不勾选;见相邻 tests/acceptance/init-profile-conversation-feedback.md。 -- [ ] 9.26 固化 status历史freshness、next五类disposition及工作区缺失行为;验收:无任务不等于通过,过期结果不显示当前allow,待租用/待决策/待验证各有具体下一步。进行中:Rust `next` 局部查询区分未初始化、待同步、缺配置需决策、缺工具可准备、源码变化需重检和空任务需全量验证;尚无 status 历史新鲜度、租约 waiting、预算耗尽决策及完整五类覆盖,不勾选。 - `status` 现对未初始化、空任务、待同步及开放任务给只读结构化概况,证据 freshness 明示 `unverified`;历史 allow 收据与可信当前性仍未实现,不能据此升级该项完成。 -- [ ] 9.27 落实token/generation、action-id、attempt-id、幂等finish及释放恢复;验收:旧owner/token不能写新租约,重复finish不重复预算,未结束attempt正常release被拒绝,报告同键不同摘要拒绝;接管前abandoned/预算写入失败不授予新租约,恢复重放不重复计数。进行中:Unix CLI 已实现同一任务锁下的受控 action-id、随机 attempt-id、generation/token 核对、不可覆盖 start/finish、重复 finish 同结果返回原收据、release 拒绝 open attempt、过期接管先写 abandoned;跨进程崩溃矩阵、写入失败注入、verify/fix 共享租约和 Windows 等价实现仍缺,见相邻 `codeguard-cli/tests/acceptance/task-attempt-local-ledger.md`。 - 输入变更加固:ready-to-verify 尝试只在当前任务输入摘要仍等于 finish 时摘要时可认领原工具复检;输入改变则新复检事件无旧 attempt_id,旧尝试不再锁住当前输入的动作或继承旧预算。Rust CVE 锁文件变化反例已由目标集成测试覆盖,相关任务/租约回归通过;真实跨进程竞态、外部工具/漏洞库身份及 Windows 等价实现仍缺,9.27 不勾选。 -- [ ] 9.28 实现误报调查任务和 `whitelisted_false_positive` 事件/投影;验收:任务包含原生证据、最小复现、裁定、范围、复检与尝试历史;候选/失效/撤销后重新待处理,决策引用不能自行授权。 - -## 10. S10 修复能力 - -依赖:S03、S05、S09 的事件/attempt 接口及对应已验收 adapter。覆盖:execution-kernel、rulepack-governance。 - -- [ ] 10.1 实现 dry-run 计划与隔离副本修复、变化清单;验收:只读请求不改源码,计划包含内容身份与副作用范围。 -- [ ] 10.2 实现前置哈希核对和受控 patch 应用;验收:用户并发编辑不被覆盖,路径逃逸不执行。 -- [ ] 10.3 实现同策略复检和修复归因;验收:noop/失败后部分修改/复检器副作用分别呈现,不虚报 fixed。 -- [ ] 10.4 将依赖升级和规则调整分开;验收:修 CVE 不自动放松阈值,修 lint 不关闭规则或更改测试真值。 -- [ ] 10.5 实现fix的task/owner/token接入及租约所有权;验收:复用已领取任务不重复attempt,批量租约冲突在应用前失败,dry-run不消耗预算,verify关闭原问题时仍保留新发现。 - -## 11. S11 宿主与分发接入 - -依赖:S02、S03、S09,至少 S06/S07 已可真实运行。覆盖:hook-protocol、binary-distribution。 - -- [ ] 11.1 构建候选平台二进制,固化 ABI/MSRV/签名身份/校验清单;验收:各 target 运行 smoke,未测平台不标 stable。 -- [ ] 11.2 实现插件 runtime lock 和原子下载/切换;验收:摘要不符、缺二进制、离线均无静默 Python fallback。 -- [ ] 11.3 实现 MCP 相同核心 API 与版本化兼容工具;验收:F22、凭据脱敏与超时/取消正确。 -- [ ] 11.4 更新五类宿主入口及 hooks/__protocol__.md 的旧新模式表;验收:保存反馈与严格交付区分,skipGate/env 不能降级新模式。 -- [ ] 11.5 实现真实 Git pre-commit/pre-push 与 CI 入口;验收:alternate index、多 ref、非 HEAD、未知 Shell 边界正确,remote参数/stdin及ci input schema显式验证,不默认HEAD或由input自授策略权威。进行中:Rust CLI 暴露 `gate pre-commit` 的真实 index 路径安全预览,固定 3/incomplete,不是可放行的完整 Git Hook;见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。 -- [ ] 11.6 在独立 codeguard-skills 源仓更新调用与修复指引,再按 vendor 流程同步;验收:不直接编辑受管副本,不建议规避门禁。 -- [ ] 11.7 明确 legacy 弃用与安全回滚路径;验收:旧数字保持,但旧通过不能被新 CI 认证。 -- [ ] 11.8 完成macOS arm64候选制品和平台适配验收;依赖11.1/11.2;证据:真实启动、进程树/取消、路径/私有权限、原子写入、离线能力和代表性工具,未支持项明确gap。 -- [ ] 11.9 完成macOS x86_64候选制品和同一平台验收清单;依赖11.1/11.2;验收:不能用arm64或仅交叉编译结果替代目标平台运行证据。 -- [ ] 11.10 完成Linux x86_64候选制品、libc/最低系统约束和平台清单;依赖11.1/11.2;验收:固定实际目标环境,不把一种libc通过泛化为全部Linux。 -- [ ] 11.11 完成Linux aarch64候选制品、libc/最低系统约束和平台清单;依赖11.1/11.2;验收:本平台真实工具/取消/隔离证明,不复用x86_64成功声明。 -- [ ] 11.12 完成Windows x86_64候选制品与平台清单;依赖11.1/11.2;验收:Job Object、特殊路径、文件共享/权限和取消真实运行,不用Unix测试替代。 -- [ ] 11.13 完成Codex宿主命令/MCP/保存反馈/Git阻断及恢复验收;依赖11.2–11.5与S09/S10;证据:实际绑定版本、原始请求及返回、scan→sync→brief链,不以安装缓存替代运行。 -- [ ] 11.14 完成ZCode宿主同一接入清单;依赖11.2–11.5与S09/S10;验收:按其真实协议映射、不透传新CLI退出码,无法阻断的入口如实披露并验证真实Git/CI接入。 -- [ ] 11.15 完成Kimi宿主同一接入清单;依赖11.2–11.5与S09/S10;验收:实际调用二进制、失败可恢复、任务链闭合,不以其他宿主通过代替。 -- [ ] 11.16 将配置探测与原生检查结果反馈到 Codex/ZCode/Kimi 智能体对话;验收:已配置检查器、未配置项、有效诊断、工具故障、修复建议和复检命令清楚可见;backlog 同步失败仍显示本次结果,原始工具文本不能作为智能体指令。进行中:相邻 Rust `conversation_feedback` 已从结构校验后的 RunReport 生成 JSON/human 状态、规则 ID、可用的位置、未完成原因与复检 argv;`lint python` 把真实 Ruff 扫描配置、诊断、故障及 backlog 同步状态渲染成 CLI human/JSON,存储失败仍显示原生 finding,均排除原始工具文案;见 `codeguard-cli/tests/acceptance/{conversation-feedback-baseline,python-lint-scan,work-sync-ruff-baseline}.md`。可信来源绑定、完整规则解释与三宿主自动对话接线未完成,故不勾选。 - -## 12. S12 质量评测与验收 - -依赖:S08、S09、S10、S11。覆盖:全部十一个规格能力。 - -- [ ] 12.1 全量执行 F01–F26 适用矩阵与 schema/协议 golden 测试;验收:必备场景零假通过、零工具故障误判。 -- [ ] 12.2 冻结分层语料、oracle和统计门槛,划分独立holdout;验收:样本/来源/裁定与批准阈值可追溯,不为提高结果改动holdout;计算器由12.10实现,实际评测由12.11执行。 -- [ ] 12.3 完成真实旧新对照及人工差异裁定;验收:历史错误不作为新 oracle,兼容回归与意图纠偏分开。 -- [ ] 12.4 测量冷/热启动、p50/p95、内存和并发;验收:覆盖与 findings 等价后再比较性能,不以跳检提速。 -- [ ] 12.5 执行策略弱化、缓存污染、错误快照、报告缺项和修复越界测试;验收:本地边界如实记录,受保护 CI 不接受未批准策略;项目脚本无法改写可信政策、工具锁或签发收据。 -- [ ] 12.6 Codex/ZCode/Kimi 各做真实命令、MCP、保存与 Git 阻断流程;验收:绑定预期二进制,失效场景不能假通过。 -- [ ] 12.7 完整运行发现→同步→next→attempt→修复→verify→关闭/重开→全量 gate;验收:跨类别报告不丢失、失败可恢复、耗尽重试不逃逸、任务勾选或清空不改变真实门禁。 -- [ ] 12.8 完整运行项目 init→AGENTS 读取→准备任务→检查→修改构建输入→画像刷新;验收:混合语言、版本冲突、架构未知与人工内容均处理正确,初始化不签发交付认证。 -- [ ] 12.9 按 C01–C36 建立逐命令验收矩阵;验收:合法/非法参数、格式、操作退出码、副作用、未初始化、取消/重放/恢复及核心服务复用均有证据,MCP请求失败与服务生命周期分离。 -- [ ] 12.10 实现分层评测计算与证据不足判定;依赖1.4、12.2的语料/阈值冻结产物;验收:TP/FP/FN、Wilson区间、零分母、争议样本和覆盖差异有已知期望值,不能以零finding报100%准确。进行中:相邻 Rust Core 已实现纯分层计算与相关正反例,见 `codeguard-cli/tests/acceptance/quality-evaluation-baseline.md`;尚未接入经批准冻结的 oracle/阈值与真实回放,不能勾选。 -- [ ] 12.11 建立并执行确定性离线回归、独立holdout与真实工具/漏洞库评测的分离入口和报告归档;依赖12.2、12.10;验收:按语言/类别公布n/TP/FP/FN/区间及库身份/freshness/日期,网络波动不污染离线oracle,性能比较先证明发现/覆盖等价,不自动创建云定时任务。 -- [ ] 12.12 完成误报白名单正反例与全格式门禁验收;验收:用户指出误判后能沿同一稳定 finding 完成原工具复核、候选、独立批准、再次检查与对话反馈;精确命中为 allow_with_exceptions、真实阻断为 deny、工具/覆盖未完成为 incomplete;过期/错文件/错内容/错版本/自批/原生 suppression 均不放行,原始 finding、审批引用及到期提示在 CLI/MCP/Hook/SARIF 一致。 - -## 13. S13 发布、文档与规格收敛 - -依赖:S12 通过且获得相应发布授权。覆盖:binary-distribution、全部规格。 - -- [ ] 13.1 对照全部 requirement/scenario/tasks 建立最终证据索引;验收:缺证据的项目仍未完成,不为发布删除要求。 -- [ ] 13.2 完成 Rust fmt/clippy/tests、工具链回归、插件既有适用测试、vendor 离线与在线检查、OpenSpec strict;记录真实结果。 - 2026-09-27终态补证:依赖边界修复后的同一轮Rust全工作区测试退出0,149组、880通过/0失败/91忽略;fmt及all-targets Clippy在同一源码状态此前通过。旧插件unittest运行632项(621通过、11跳过),独立协议集142通过/0失败/1跳过,旧注册表/架构/Ruff及OpenSpec strict均退出0,vendor离线/在线已有终态。详细证据见verification.md及相邻Rust工程tests/acceptance/workspace-regression-20260927.md;忽略/跳过不算通过,旧协议模拟不证明新Rust宿主接线,MSRV与跨平台/完整工具链矩阵仍未验收,暂不勾选。 -- [ ] 13.3 形成 release notes、CLI/策略迁移指南和实际能力矩阵;验收:候选、stable、planned 与未验证平台表述一致。 -- [ ] 13.4 发布并逐层核对源码/tag/制品/插件 lock/market/installed runtime;验收:版本及摘要闭环,不以本地成功替代安装证据。 -- [ ] 13.5 完成受保护 CI 与已安装三宿主的最终运行复核;验收:实际检查链全部可追溯且未发生自动降级。 -- [ ] 13.6 只有全部实施验收完成后 sync/verify/archive 本 change;保留本次设计验证与后续运行验证的独立记录。 -- [ ] 13.7 对照实施覆盖索引验证规格、命令、语言、平台、宿主和任务的双向追踪;验收:没有无任务需求或无依据任务,新增设计同步索引,证据缺失仍保留未完成。 - -### 2026-09-27 ESLint 工作台连接进展(7.3 / 9.7 未完成) - -显式 lint typescript --workspace 已通过Rust保存脱敏观察、严格同步并生成稳定finding/七项Markdown任务,对话反馈返回next及next_error。重复扫描保留同一开放任务和用户备注;status/task show可读该任务。已消费历史按原报告摘要收据确认,修复源码后不会重演历史输入导致误报。最新报告、当前输入与首次工具/配置不连续、抑制、未完成或局部零诊断都要求复检;任务文字不改变状态。 - -配置变化备用指引误选Python的问题由回归先RED确认,现保留ESLint命令和待核验上下文。33项普通相关回归与补充查询联通测试通过,当前feedback0.2及两类简报schema通过;真实原生与最终检查记录见verification。Node环境任务、原生证据完整保留、正式关闭/重开、完整项目/TS插件/配置闭包和门禁仍缺,7.3/9.7不勾选。验收见相邻codeguard-cli/tests/acceptance/eslint-workbench-sync.md。 - -### 2026-09-27 ESLint 环境任务进展(7.3 / 9.7 未完成) - -缺调用上下文、工具/输入不可读及版本/配置/报告未完成现产生独立准备观察和开放环境任务,不伪造源码finding。身份按工作区/当前源码范围固定,重复诊断或原因变化复用任务;外部目标拒绝。next核对最新已消费观察、当前源码及收据,较新同范围扫描恢复后转verification_required,不继续沿用旧故障;human/JSON采用任务步骤。 - -缺上下文入队测试先RED后通过,相关35项回归及反馈/准备简报schema通过。实际既有ESLint10.11.0拒绝不存在规则的公开CLI测试13.71秒通过:环境任务1、源码finding0、门禁未判定。完整关闭/重开、原生证据、构建模型/跨文件环境归并和宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-preparation-workbench.md。 - -### 2026-09-27 ESLint task verify 进展(7.3 / 9.7 未完成) - -ESLint源码/准备任务现可按显式Node、入口、版本、原配置和cwd运行原工具复检;沿用租约、统一执行截止时间、报告同步和失败尝试预算。缺上下文也保存明确未完成开放事件,不改用其它语言检查器。复检绑定首次工具/配置连续性,仍存在、局部消失、抑制、环境恢复和上下文变化分别处理,始终不关闭任务。next/status/attempt已适配ESLint报告和时间顺序。 - -入口缺口先RED,57项相关回归加1分类用例通过;既有真实Node/ESLint通过公开发现、任务复检仍存在、同配置修复复扫及任务局部消失四轮194.36秒验收,事件保存,门禁未判定。公开输出schema实测发现统一schema缺ESLint分支并修正,两种task verify反馈通过。完整配置/插件/源集覆盖、可信策略及正式关闭重开仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-task-verification.md。 - - -### 2026-09-27 ESLint 原规则有效配置核查 - -Rust task verify 增加同轮原生 --print-config 查询,绑定显式源码/主配置/Node/入口前后字节与统一截止时间;只保存规则级别、原因和摘要。复检协议0.2新增effective_rule,历史0.1仍只读识别。规则关闭或缺失时零诊断必须rule_coverage_requires_review,查询损坏/输入变化为未完成,next指向配置核查;不批准白名单或关闭任务。 - -44项普通相关回归及分类单元用例通过,最终9项规则解析/公开CLI普通测试、目标Clippy -D warnings和fmt通过。既有Node24.18.0/ESLint10.11.0原生启用/off/缺规则三轮38.50秒通过;实际公开CLI只改导入mode.cjs关规则、主配置和源码不变的反例108.38秒通过,仍要求覆盖核查且保存事件,无安装升级。受控CLI实际产物通过统一复检、ESLint复检及简报三份Draft202012 schema;简报lint-only复检ID正则先失败后补入eslint-task前缀。schema产物使用受控协议夹具,不冒充原生工具验收。 - -完整导入/插件闭包、TS/全项目源集、required规则批准覆盖、可信宿主门禁和正式关闭重开仍缺,7.3/9.7保持未完成。验收见相邻codeguard-cli/tests/acceptance/eslint-effective-settings.md。 - - -### 2026-09-27 ESLint 有效配置查询取消 - -公开task verify受控进程反例先RED:查询收到SIGINT后,原因丢失并保存成still_present。Rust查询与任务复检现优先保留取消/期限;共享任务入口取消后不保存正常复检事件,并释放自有租约。真实进程组延迟写副作用未出现,再次复检能获取租约。目标用例3.84秒通过,36项相关普通回归、目标Clippy -D warnings和fmt通过。脚本仅为受控协议夹具,不冒充原生ESLint;Windows、跨宿主、中断历史协议及完整I/O预算仍缺,3.3/7.3/9.7不勾选。见相邻tests/acceptance/eslint-effective-interruption.md。 - - -### 2026-09-27 ESLint 项目本地插件原生验收 - -使用既有Node24.18.0/ESLint10.11.0及项目原flat config加载guard.cjs本地规则。公开lint保留完整workspace/no-debugger ID并生成稳定任务;只修源码后,task verify通过原扫描及原生print-config确认规则仍启用,保存局部消失候选,插件与主配置不改,status门禁未评估。真实测试91.56秒通过,没有安装/升级。 - -此证据补齐局部本地插件规则穿过公开CLI/任务复检的真实样本,不证明完整插件闭包或可信批准。TS parser/tsconfig、monorepo完整范围、依赖审计、required规则/正式关闭及宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-local-plugin.md。取消路径及本地插件两项增量在同一change跟踪,不同步或归档未完成计划。 - - -### 2026-09-27 ESLint 显式目录调度 - -lint typescript PATH现支持有界目录清单及逐文件原工具执行,保留排序相对路径、局部反馈、跳过项和未执行清单;共享deadline,前后清单/显式输入变化、单文件失败及工作台保存失败均未完成。codeguard内用户源码照常扫描,点条目/node_modules/链接未选择原因显式反馈。仍使用调用者指定的单一原配置/cwd,不声称自动选择monorepo子配置。 - -目录入口先RED,配置源码又复现输入冲突及同步路径重复拒绝;现只允许原配置与源码共享同一只读字节身份,报告覆盖/其它输入别名及重复源码仍拒绝。受控样本首次4稳定任务、重复0新增,单文件退出2保留其它发现,链接跳过、100ms共同预算3文件未执行及画像缺失工作台失败反例通过。48项普通相关回归通过,最终目标Clippy -D warnings/fmt通过,公开目录JSON通过Draft202012 schema。实际既有Node24.18.0/ESLint10.11.0公开目录三文件(违规、干净、配置源码)62.34秒验收通过,无安装升级;schema样本是受控夹具,与原生证据分开。 - -完整TS/tsconfig、monorepo原生源集及配置归属、插件闭包、依赖/CVE、聚合硬I/O预算、原生证据及可信正式关闭/宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-directory-feedback.md。 - - -### 2026-09-27 ESLint 显式子项目配置映射 - -目录入口新增--config-map绝对路径,1.0有界协议逐项声明项目根/原配置/cwd,组件边界及最深显式根匹配,未命中沿用原参数。不从目录名推断原cwd,不批准规则。重复根/字段、未知字段、越界/链接或不可读配置启动前拒绝,映射与全配置摘要纳入前后及子任务前检查。反馈0.2保留逐文件配置范围和来源及映射摘要,schema仍接受历史0.1。 - -未知选项先RED;受控a/ab边界、根`.`选择、重复/越界/approved字段及首轮改写映射后停止余下三文件反例通过。45项普通相关回归通过,最终补充根`.`用例及目标Clippy/fmt通过;映射及当前公开反馈Draft202012 schema通过受控实际产物,越界schema反例被拒绝。既有Node24.18.0/ESLint10.11.0真实双项目四文件80.78秒通过,根规则没有强加子项目,保留配置源码检查,无安装升级。 - -自动配置归属、完整TS/插件闭包/源集、依赖审计、批准覆盖、聚合硬I/O与正式关闭/宿主门禁仍缺;7.3/9.7不勾选,不归档change。验收见相邻tests/acceptance/eslint-config-map.md。 - - -### 2026-09-27 npm原生审计基础 - -Rust新增npm11/auditReportVersion2有界观察及离线原生命令计划,保留组件、严重度、范围、节点、原生advisory source和间接关系;版本/计数/定位/退出/重复JSON键或error对象不自成干净结果。原生source不是CVE编号,range不是解析版本;依赖类别有重叠,不简单相加。只读package脚本配置API区分明确声明、未观察到、复杂调用和损坏,不执行清单脚本,也不能证明外部CI未配置。 - -缺API先RED;组件低危但直接advisory高危反例再RED后修正。5项协议/参数/配置用例及9项既有ESLint回归通过,共14项普通测试;CLI目标、adapter库Clippy -D warnings及fmt通过。既有Node24.18.0/npm11.16.0经统一runtime验证版本、空锁JSON及缺锁error,0.68秒通过,包/锁字节不变,无node_modules或脚本副作用,无安装升级。合成advisory是协议夹具,不冒充真实漏洞数据库检出。 - -配置API尚未接detect/init,公开CVE/依赖命令、非空依赖/真实漏洞、解析版本/图绑定、漏洞库时效、稳定任务/原工具复检及可信门禁仍缺;7.3/7.5不勾选。见相邻tests/acceptance/npm-audit-observation.md。 - -## 2026-09-27 npm锁文件节点关联进展 - -新增 Rust v3 普通安装节点解析与原生审计精确位置/名称/版本关联;两项锁文件契约及五项 npm 审计回归通过。链接、别名、缺版本、重复字段和身份不匹配保持未完成。仅协议夹具,不是实际非空依赖审计;依赖边、范围求值、库新鲜度、公开命令及工作台闭环仍缺,7.3/7.5 保持未勾选。验收见相邻 `codeguard-cli/tests/acceptance/npm-lock-binding.md`。 - -## 2026-09-27 npm离线非空依赖反例 - -扩展实际 Node 24.18.0/npm 11.16.0 原生验收为私有空缓存的空锁、一个普通依赖节点的非空锁、缺锁三种情况。实验发现非空离线审计也能退出0并返回零漏洞,不能把零发现当成库覆盖或CVE通过。Rust观察新增固定 `advisory_coverage=not_evaluated`,节点关联保持局部身份观察。测试检查清单/锁不变、无安装及脚本副作用;尚缺在线/可信缓存的真实漏洞正例及库新鲜度、完整命令/工作台,因此7.3/7.5不勾选。 - -## 2026-09-27 npm原生advisory与复检 - -显式无凭据registry命令API已提供HTTPS根源及验收loopback HTTP源,固定audit-registry、不安装/不执行脚本;受控原生npm执行证实1.2.3被advisory命中、修订2.0.0后同工具复检无发现,503源失败为npm_native_error。两项原生测试通过(0.58秒),六项审计契约、Clippy/格式通过。受控源不是可信库,coverage固定not_evaluated;早期一次原生正例出现未分类错误,已增加诊断而不能宣称稳定性完全证明。真实库/时效、公开命令及完整工作台仍缺,7.3/7.5不勾选。见相邻`codeguard-cli/tests/acceptance/npm-native-advisory.md`。 - -## 2026-09-27 npm审计配置发现与预览接线 - -node.npm.audit已按原package.json摘要逐根进入共享发现、init数据来源及detect/plan/check all的配置反馈;manifest重读变更/不可读保留unknown与观察未完成。修复plan按语言筛选遗漏node检查器的问题,typescript/all预览均保留四态;check all人类反馈显示根、原因与下一步。新binary流程与发现/计划/初始化70项不同用例通过,Clippy/格式通过。仍未自动执行npm审计、覆盖其它包管理器/CI声明、库时效、稳定任务和门禁,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-audit-discovery.md`。 - -## 2026-09-27 npm输入绑定runtime服务 - -新增独立请求/结果及Rust原生版本-audit-报告-锁节点关联服务,冻结精确输入SHA及npmrc存在性;缺身份、版本错配、输入修改/配置新增、取消与超时均未完成、不提供可用于关闭任务的解析结论。三模式反例与八项审计/锁回归通过;真实npm局部服务首轮通过,最终版本参数修改后复验。完整工具/配置/环境闭包、可信库时效、公开命令与任务闭环仍缺,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-input-bound-probe.md`。 - -## 2026-09-27 npm公开CVE局部反馈 - -Unix `cve typescript` 已接显式Node/npm/版本/用户与全局配置/可选审计源,冻结输入并以human/JSON返回脱敏原生组件、锁版本、严重度、advisory source及下一步。缺上下文给准备状态,局部零发现仍not_evaluated;未接工作台,不假称关闭。10项普通契约、真实binary npm空锁(21.75秒)、两份实际schema报告及四个伪造权威反例通过,Clippy/格式及OpenSpec严格校验通过。真实库、自动check all、完整预算默认来源及持久任务闭环仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-public-cve-feedback.md`。 - -## 2026-09-27 npm共享预算默认值接线 - -公开npm CVE入口复用CLI/登记环境/项目runtime/内置默认值选择器,坏候选项目文件或符号链接在原生执行前返回准备未完成,显式高优先级值不受低优先级坏配置影响。反馈0.2记录预算/来源及native_execution_only,保留严格旧0.1schema。预算、公开命令、发现与输入绑定四项普通测试通过,哨兵未启动;Clippy/格式及OpenSpec严格校验通过。真实命令及实际schema结果后补。硬I/O预算、可信库与工作台仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-runtime-defaults.md`。 - -## 2026-09-27 npm稳定工作台与next接线 - -初始化根中的公开npm审计自动保存脱敏原生组件/advisory/锁版本观察,严格复核输入与字段,经现有同步器创建按根稳定的CVE完整性任务;执行原因作为诊断历史,不伪装源码漏洞或关闭。next识别检查器并给原工具复检步骤。重复扫描一张任务、坏节点/重复字段不产生新任务;反馈0.3及持久观察schema已提供,旧0.1/0.2反馈保留。24项不同普通回归与真实npm公开命令持久化(21.50秒)、实际schema通过,Clippy/格式及OpenSpec严格校验通过。自动check all、早期准备阻塞全覆盖、父工作区映射、npm task verify与可信库/门禁仍缺,7.3/7.5不勾选。验收见相邻`codeguard-cli/tests/acceptance/npm-workbench.md`。 - - -## 2026-09-27 npm显式父工作区与白名单纠错约定 - -公开npm入口新增--workspace物理父目录,原生cwd保持子项目,预算默认读取所选父工作区,持久任务按构建根分离;next保留归属。8项相关普通测试通过,目标Clippy及格式通过,见相邻tests/acceptance/npm-workspace-scope.md。可信库、自动调度、完整关闭与门禁仍缺,7.3/7.5不勾选。 - -白名单文档补齐用户新增/修改/撤销/失效的操作与对话状态,OpenSpec明确修改字节须重新批准、不能记为源码修复。既有精确身份5项、报告处置7项、只读查询8项、提案4项普通契约通过;2项需要指定原生Ruff的测试未运行。这是现有局部契约回归,不是正式审批发布或宿主门禁验收,4.8/4.10/12.12保持未完成。 - - -## 2026-09-27 npm task verify原工具复检 - -稳定npm完整性任务接入task verify、共享预算、借用/自有租约、原服务及锁内输入复核;保存严格npm观察和关联尝试的verification事件,next/历史识别npm序列并给下一步,输入变化不沿用旧结果。局部一致为still_blocked,原生失败为incomplete,任务仍open、无白名单批准。缺参数入口先RED;随后测试暴露两个事件消费者未接npm时间序列,已补齐。 - -36项不同普通相关用例通过;真实Node24.18.0/npm11.16.0公开扫描+原工具task verify通过(43.44秒)。实际复检反馈schema通过,三项伪造覆盖/权威/allow反例被拒;目标Clippy/格式最终检查后补。8项依赖显式原生Ruff的复检用例本轮未运行。完整漏洞库/策略覆盖、正式关闭/重开、宿主门禁及自动check all仍缺,7.3/7.5/9.7不勾选;见相邻tests/acceptance/npm-task-verification.md。 - -最终检查:目标Clippy(-D warnings)及fmt通过;最终局部回归11项通过,human实际复检显示原生诊断/组件数/下一步并保存记录,OpenSpec严格校验与diff检查通过。未增加完整能力勾选。 - - -## 2026-09-27 npm复检收据严格归属与过期分流 - -next与尝试历史新增npm原字节重复键拒绝、同任务检查器/稳定义务/构建根核验;报告解析先完成静态结构再核对当前工作区与清单/锁摘要及节点,锁重读也核对摘要。只有结构有效但输入已变/不可读的历史观察失效后允许重新复检,损坏证据不冒充输入过期。 - -新增十个组合反例(五种篡改乘当前输入未变/已变),同时改写报告、验证事件及消费收据摘要;错构建根先RED,旧实现曾接受另一个根的incomplete失败结果并确认当前尝试已经复检,补精确归属后拒绝。49项不同普通回归通过;10项需要指定原生Ruff的用例本轮未运行。真实既有Node24.18.0/npm11.16.0公开扫描与task verify通过(45.05秒);目标Clippy、fmt、OpenSpec严格校验及diff检查通过。 - -完整受保护工具/配置/审计源上下文、可信漏洞覆盖、正式关闭/重开及宿主门禁仍缺,7.3/7.5/9.7保持未勾选。验收见相邻tests/acceptance/npm-verification-receipt-integrity.md。 - - -## 2026-09-27 check all npm逐根原生编排 - -显式Node/npm/版本/用户与全局配置上下文接入共享任务图,每个发现package根独立cwd/私有运行区,统一jobs和deadline;执行后串行同步稳定npm完整性任务并反馈next,原生失败不变源码违规。缺上下文保持配置发现,check java拒绝npm选项,预算到期不启动剩余任务。协议check_feedback0.24/check_aborted0.5新增npm逐根结果,旧0.23/0.4 schema保留。 - -新入口参数先RED;实际schema验收发现候选原因码遗漏并补齐。两根并发/稳定任务、混合成功失败、500ms统一截止时间、参数及语言范围反例已通过。早期并发回归出现临时私有目录创建失败;源码旧运行ID仅PID/时间不能保证并发唯一,已增加原子序列,同刻度64个ID用例先RED再通过。不将原失败误归为代码违规,具体当次OS失败原因未单独留存。 - -真实既有Node24.18.0/npm11.16.0 check all→稳定任务→next初次21.80秒、最终22.30秒通过;无安装、包脚本或node_modules,清单和锁不变。当前含npm/无上下文实际反馈schema、三项伪造门禁/权威/覆盖反例及旧0.23形状校验通过。最终普通回归、Clippy/格式结果待追加。 - -可信上下文自动解析、早期阻塞全覆盖、完整漏洞库/依赖图及关闭/重开、其它语言/类别调度、跨平台与宿主门禁仍缺,7.3/7.5保持未勾选。验收见相邻tests/acceptance/check-all-npm.md。 - -最终检查:66项不同普通用例通过(63项integration、3项领域/调度单元),目标Clippy(-D warnings)和fmt通过;真实npm check all最终22.30秒通过。其它9项显式原生用例本轮未运行,不将普通夹具作为它们的验收证明。OpenSpec严格校验及diff检查通过。7.3/7.5不勾选,不归档change。 - - -## 2026-09-27 npm缺少上下文的准备阻塞持久化 - -已有可读清单/锁的初始化工作区,公开cve缺参数与显式选择npm的check all部分参数,现在保存本地未验证准备观察并生成稳定CVE完整性任务;随后原生检查复用任务。task verify缺上下文也保留incomplete复检事件,不签发关闭。准备观察固定零组件、空advisory;矛盾记录被严格解析器及当前报告schema拒绝。先通过缺任务和虚构advisory两个RED反例确认问题,再实现修复。 - -36项受影响普通回归通过,实际准备反馈/观察/复检通过Draft202012 schema验证,四个伪造变体被拒;CLI及相关测试Clippy -D warnings通过。真实npm回归结果另附。缺锁/坏清单的独立准备协议、没有显式npm上下文的check all自动任务、工具上下文可信来源、覆盖/审批/真实门禁仍缺。7.3/7.5/9.7及相关完整任务保持未完成;本进展不是完整CVE或白名单放行验收。详见相邻codeguard-cli/tests/acceptance/npm-missing-context-workbench.md。 - -补充验收:显式使用既有Node v24.18.0/npm11.16.0的公开CVE原生回归通过(44.13秒);不安装、不执行包脚本。实际check all准备反馈schema通过,当前嵌入观察schema与独立schema字节结构一致;fmt检查通过。其余2项本轮普通命令忽略的原生测试未运行,不当作通过。 - - -## 2026-09-27 npm缺锁准备协议与稳定任务 - -初始化工作区、可绑定清单且确实缺package-lock.json时,CVE/check all显式npm/task verify在启动工具前保存schema0.2本地准备观察:lock_state=missing、lock_sha256=null、零组件和空advisory;缺锁不伪装为漏洞。补齐锁后旧观察失效,后续普通0.1观察复用稳定任务。悬空链接、伪造状态/摘要/覆盖、未知版本及缺锁收据在锁恢复后重放均被拒;取消、时间预算及物理路径约束继续生效。 - -消费者版本同步为check_feedback0.25、task_verification_preview0.5、check_aborted0.6;独立npm观察读取0.1/0.2,历史schema原字节归档。51项普通集成回归通过;真实npm check all回归通过(22.98秒),原清单/锁不被修改、不安装或执行包脚本。实际缺锁观察/check/verify通过Draft202012校验,五个伪造变体及旧版观察消费者拒绝。abort实际中断运行未在本轮外部schema验收,不将schema静态有效当作运行通过。 - -仍缺不可读/坏清单的独立准备任务、未显式选择npm的check all自动准备调度、可信上下文、完整CVE覆盖和正式任务关闭/宿主门禁;7.3/7.5/9.7保持未完成。验收文档:相邻codeguard-cli/tests/acceptance/npm-missing-lock-workbench.md。 - -最终补充:2项check_command中断/兄弟结果保留单元测试通过,连同51项集成共53项普通用例;Clippy -D warnings、fmt、当前四schema Draft202012静态校验及嵌入协议一致性回归通过。OpenSpec严格校验及diff空白检查通过。观察0.1不能声称npm_lock_missing,缺锁必须采用0.2明确状态。 - - -## 2026-09-27 npm坏清单启动前诊断与任务 - -RED用例证实已识别无效清单仍启动工具,错误被表达成npm_version_mismatch。现将无效JSON、重复字段和非法scripts类型在原生启动前拦截;绑定清单/锁及当前配置解析,保存零组件/空advisory的准备观察,CVE/check all显式npm/task verify复用稳定任务。next及可读任务明确检查package.json语法/重复字段/scripts类型和锁文件,再恢复原工具;修正输入后旧复检收据失效。当前字节有效却声称清单坏的伪造报告被拒。 - -35项不同普通回归通过;实际坏清单观察/check/verify通过Draft202012,3个伪造组件/advisory/覆盖变体拒绝。真实Node v24.18.0/npm11.16.0 check all回归通过(22.50秒),不安装/执行包脚本;其余10项普通命令忽略的原生测试本轮未执行。观察0.1/缺锁0.2与check0.25/verify0.5协议字段不变,仅准备原因的结构约束同步加固;旧schema归档不改。详见相邻codeguard-cli/tests/acceptance/npm-invalid-manifest-workbench.md。 - -不可读或缺清单/目录输入的持久准备协议、可信上下文、完整CVE覆盖与正式任务关闭/门禁仍缺;7.3/7.5/9.7未完成,不以本轮回归代替全计划验收。 - -最终检查:CLI和新增用例Clippy -D warnings、fmt、OpenSpec严格验证及diff空白检查通过。 - - -## 2026-09-27 check all默认自动npm准备任务 - -RED确认无参数check all发现两个npm根却无准备任务。现Unix支持平台默认将发现的npm根接入共享任务图;缺显式上下文只保存准备观察与稳定任务,不启动原工具、不安装/继承凭据。重复扫描、随后补齐上下文的原生检查复用任务,串行同步及next无需调用者手工串接。未初始化项目仅反馈workspace_not_initialized、不创建codeguard;Java-only检查不触发npm。 - -47项不同普通用例通过,涵盖多根准备/后续原生调用、Java隔离、缺锁/坏清单、预算/取消、SARIF与新未初始化反例。实际默认多根check all通过Draft202012,首次两任务、重扫零新增;真实Node v24.18.0/npm11.16.0 check all回归通过(23.03秒),不安装/执行包脚本。其余7项本轮普通命令忽略的原生用例未执行。Clippy -D warnings、fmt通过。 - -只接通CLI默认准备调度;未取得可信工具上下文自动解析、完整CVE覆盖、宿主Hook和正式任务关闭/门禁。Windows该路径仍未支持;不可读/缺清单的持久状态仍缺。7.3/7.5/9.7保持未完成。详见相邻codeguard-cli/tests/acceptance/npm-automatic-preparation.md。 - - -## 2026-09-27 npm不可用输入状态协议与历史 - -新增Rust有界输入状态观察及严格准备报告0.3:present/missing/not_regular/path_alias/unavailable,可读普通文件有SHA,其余null;原因与状态严格一致,零组件/空advisory。公共CVE及task verify可在清单缺失、目录、悬空链接或超限时保存稳定环境任务,不读取链接目标;锁非普通文件也可在默认check all中产生准备任务。旧0.1普通观察/0.2缺锁继续严格识别,消费者升至check0.26/verify0.6/abort0.7,旧schema原字节归档。 - -RED先暴露缺失被当作缺上下文;随后反例暴露目录使next返回attempt_input_unreadable。npm阻塞任务现在以有界输入状态形成尝试指纹,可读与缺失沿用原摘要格式,其余只记录状态,不能成为关闭证明。当前输入恢复后旧复检不再解释本轮;6种结构/身份伪造及一个过期报告被拒,不增任务。 - -78项不同普通回归通过(76集成+2中断单元),包括租约/无进展预算、Java、SARIF、任务复检与旧协议;真实Node v24.18.0/npm11.16.0 check all回归通过(22.42秒)。实际新观察/check/verify通过Draft202012,6个伪造变体拒绝、旧消费者拒绝新协议;其余16项忽略的原生用例本轮未执行。有界不可用fixture为超限,不声称已完成独立权限EACCES运行验收。abort本轮仅既有单位用例和schema静态检查,未外部验证真实中断新观察。 - -仍缺丢失清单后从历史/基线恢复完整根发现、外部工具/配置文件不可用的持久准备、Windows、可信上下文/完整CVE覆盖、宿主Hook及正式关闭/门禁。7.3/7.5/9.7保持未完成,见相邻codeguard-cli/tests/acceptance/npm-input-state-workbench.md。 - -最终核验:最新新增用例及CLI的Clippy -D warnings、fmt、OpenSpec严格验证与diff空白检查通过;输入状态及坏清单最新修复指引回归实际执行通过。 - - -## 2026-09-27 npm历史构建根的准备恢复 - -默认check all现可从与本地受管摘要一致的0.3初始化画像恢复清单不可用但物理目录仍存在的npm准备范围。严格校验递归重复字段、协议标记、相对路径/别名、物理归属及有界输入状态;历史根不使用旧摘要或显式工具参数启动原工具。当前兄弟根仍正常调度,画像错误以historical_npm_scope_unavailable及具体原因反馈,不吞掉其结果。清单恢复后重新发现,稳定任务不重复。 - -新增npm_historical_roots_cli由双根只剩一根的RED推进到通过,覆盖重复同步、混合原生参数调用轨迹及画像失配/越界/别名/错类型/重复字段反例。最终新增矩阵通过;CLI及新增测试Clippy -D warnings、fmt通过。相邻验收:codeguard-cli/tests/acceptance/npm-historical-roots-workbench.md。 - -这是本地准备范围恢复,非可信审批或CVE覆盖。目录整体消失只明示未完成;旧画像版本、刷新画像删除旧根后的完整义务恢复、外部工具/配置、Windows、可信上下文、完整覆盖及宿主闭环仍未完成。7.3/7.5/9.7保持未勾选。 - -最终普通验收:61项不同普通集成用例通过(Java24、check all npm2、部分契约13、SARIF6、npm audit1、历史根1、输入状态1、坏清单1、缺锁1、父工作区1、task verify10);17项显式原生用例在普通命令中忽略。独立执行的历史-only默认检查实际反馈通过Draft202012,两轮稳定任务且历史清单摘要null。OpenSpec严格校验、diff空白检查通过。真实npm回归单独记录。 - -原生补充:显式既有Node v24.18.0/npm11.16.0的check all回归实际通过(22.45秒);不安装、不执行包脚本。普通命令忽略的其余16项原生用例本轮未执行。准备恢复和本地一致性不等于漏洞库覆盖或白名单批准,完整计划仍未完成。 - - -## 2026-09-27 npm画像刷新后保留已记录准备范围 - -RED证实清单删除后再次init刷新画像,默认check all遗漏已有稳定npm问题。现从本工作区有界普通物理finding.json恢复清单不可用、物理目录仍存在的准备范围;核对结构、工作区/检查器、稳定指纹与ID、scope、两项输入归属及状态。画像与事实两类来源独立,不因画像失配吞掉可核验事实范围。只恢复本地准备,不沿用旧结果或启动该根的原工具。可编辑Markdown附件删除/勾选不能消除该范围;附件缺失仍暴露同步问题,不宣称任务已修复。 - -新增npm_recorded_roots_cli覆盖刷新后重复检查、附件删除、事实身份/路径损坏、当前兄弟根保留及输入恢复;已有画像拒绝测试更新为事实恢复仍保留范围,同时明示画像错误。目录整体丢失、删除全部事实且画像已刷新后的防逃逸仍需独立受保护义务来源;本地记录不是可信批准。完整7.3/7.5/9.7保持未完成,不据此归档。 - - -最终验收:27项不同普通集成用例通过(默认npm2、部分契约13、SARIF6、历史画像1、输入状态1、坏清单1、缺锁1、已记录根1、父工作区1)。最新已记录根用例扩展到9项身份/状态/范围错误反例,当前兄弟根均保留;其中运行ID反例用非法分隔符,普通字母本身合法,不为迎合测试收紧契约。实际刷新画像后仅事实来源的两轮check反馈通过Draft202012,清单摘要null,new_blockers=0。显式既有Node v24.18.0/npm11.16.0原生check all回归通过(23.40秒),无安装或包脚本;普通命令忽略的另一项Ruff原生用例本轮未执行。CLI/新增测试Clippy -D warnings、fmt及OpenSpec严格校验、diff空白检查通过。完整计划仍未完成。 - - -## 2026-09-27 Rust全工作区回归与严格静态检查(进行中) - -扩大到cargo test --workspace与cargo clippy --workspace --all-targets -- -D warnings。首次全目标Clippy发现work_sync.rs在测试模块后定义validate_eslint_observation(items_after_test_module);已将同一函数原样移到测试模块之前,无行为或协议变更,不以allow压制告警。fmt检查通过。全目标Clippy复检和同步模块单元回归仍在运行,未提前记录通过;全工作区测试沿原进程继续,当前已收集15组结论、60通过/0失败/3忽略,为中间进度而非整轮验收。 - -已确认普通工作区回归不执行显式ignored原生工具用例;MSRV1.85工具链当前未安装,Windows/宿主验收未运行。13.2及全计划保持未完成。此记录需待同一运行终态更新,不因等待超时重复启动。 - -后续终态:修复后的全工作区all-targets Clippy -D warnings实际通过(1分32秒),同步模块3项恢复/重放单元测试实际通过。全工作区普通测试仍沿原进程运行,尚未签发整轮通过结论。 - - -## 2026-09-27 全工作区依赖边界失败与修复 - -上一全工作区测试已终止为exit101:52组结论累计271通过、1失败、23忽略,失败为crate_boundaries的真实Cargo metadata检查;不记录整轮通过。核对发现adapters两个原生测试调用runtime造成dev越层,且网络下载实现新增的runtime依赖和CLI测试异步依赖未登记。已将Checkstyle原生重放和Node字面参数原生测试移入CLI测试层,删除adapters→runtime dev依赖;保留adapters任何kind不得依赖runtime的红线。仅允许runtime normal reqwest/tokio/tokio-util/futures-util/idna_adapter与runtime dev rustls;CLI tokio只允许dev。新增对应正常/错误crate、build/dev/normal反例,现6项依赖边界与4项纯ESLint命令契约通过。迁移保留原生用例内容及ignored边界,不靠放宽生产依赖方向消除失败。 - -额外原生证据:已实时核验既有/opt/anaconda3/bin/ruff为0.16.8,check all部分结果1项、task verify8项、whitelist propose2项共11项真实Ruff用例通过;包含noqa、规则关闭、per-file-ignore、恢复环境不假关闭及纠错提案不自批。106份schema的静态合法性与本地引用检查通过,不能代替运行报告验收。MSRV1.85、Windows、三宿主仍未验收。修复后全工作区测试与all-targets Clippy重新运行,结果另附;13.2保持未完成。 - -补充终态:修复后all-targets Clippy -D warnings通过(29.62秒),fmt通过;迁移后的Node v24.18.0原生字面参数用例实际通过(1项),只证明argv安全转发,不冒充真实ESLint规则检查。Checkstyle重放迁移保留且本轮未运行。新的全工作区回归仍在原进程运行。 - - -## 2026-09-27 当前规格到任务的覆盖索引修正 - -只读审计发现implementation-coverage.md缺43个后来新增的Requirement映射。已按当前正式规格追加binary-distribution7、execution-kernel5、native-tool-adapters15、remediation-workflow12、unified-cli-contract4项,引用已有实施任务而非另建任务。检查108个当前Requirement各有唯一精确spec/title映射,追踪ID不重复、没有失效Requirement、任务ID及任务区间均存在。每行仍覆盖该Requirement全部Scenario,不拿局部契约通过替代整项验收。 - -此为13.7的规格→任务追踪部分修复,未证明命令/语言/平台/宿主实现及全量双向验收,13.7与完整计划保持未完成。修复依赖边界后的工作区测试仍沿原运行继续;当前23组中间结论95通过/0失败/4忽略,不签发整轮通过。 - - -## 2026-09-27 Checkstyle原生补充与受管技能一致性 - -实时核验现有Checkstyle10.21.4 all.jar(19631994字节,SHA256 3c1d94d6ecc83e02dff587c9ba5b6b4ec4fec38c7a958eb587efec9b28e2f318)与本机JDK21.0.12.1。迁至CLI层的原生重放1项、record/继承/生成范围1项实际通过。首次一并调用Lombok变体时缺CODEGUARD_LOMBOK_JAR,测试在读取该前置条件时失败,不归因于产品误报;随后明确选择本机Lombok1.18.38(SHA256 1e1e427c36ff63c44fd30ef292d9e773ea3154460ab6265d3fed7e6f5bc50fb9)重跑失败项,实际通过(8.99秒)。没有下载或安装新工具,本地摘要不是独立发行批准。java_checkstyle_workbench的13项原生验收仍运行,终态另附。 - -skill_vendor.py check --offline与在线check均实际通过;在线核验codeguard-skills v0.1.2锁定提交2c0c8071f96de48dc53e11de2499c083c100e44c。不修改受管技能或lock,检查脚本不是Rust产品运行时。修复依赖边界后的全工作区普通回归仍沿同一进程运行,未签发整轮通过;13.2及完整计划保持未完成。 - -原生终态:java_checkstyle_workbench 13项全部通过(68.70秒);连同迁移重放、record/继承/生成与补齐参数后的Lombok变体,本轮共16项不同Checkstyle原生用例通过。范围含字段/枚举、方法/构造器、参数返回/泛型、类型选项、原配置抑制、准备恢复、稳定任务和原工具复检。旧失败保留,不把本地原生观察升级为完整项目覆盖、可信规则/白名单批准或任务关闭。6.3/9.7仍未完成。 - - -## 2026-09-27 Cargo Clippy原生补充验收 - -明确选择本机stable-aarch64-apple-darwin的真实Cargo(Rust工具链1.98.1),执行check_all_rust_native两项ignored用例,实际2项通过(6.70秒)。包含原生局部扫描及已初始化稳定任务复检;原生allow抑制经force-warn对照不能解释成已修复,局部缺失仅为未核验策略的候选,任务不自动关闭。此结果不是MSRV1.85实测、完整features/targets覆盖、可信工具/规则政策、Windows或交付门禁验收,7.1/9.7及全计划保持未完成。 - -修复依赖边界后的全工作区测试仍沿同一运行继续,最新中间结果105组、581通过/0失败/72忽略;忽略项不算通过,原生补充另列,未提前签发整轮成功。 - -## 2026-09-27 Rustdoc逐问题修复简报 - -comments rust报告0.3为每条原生发现生成七项修复信息;missing_docs区分内部/外部文档,broken_intra_doc_links要求核对真实符号及作用域。简报绑定本轮源摘要、原生范围及复检argv,修改范围限于原目标;输入变化/身份歧义等未完成观察只给调查及重新检查,修改范围为空。attempt_history空数组明确history_status=not_integrated,不能证明没有历史失败。保留0.2 schema,当前协议升级0.3。 - -TDD先验证缺简报的两项失败;实现后7项普通CLI和3项身份测试通过,1项真实Cargo CLI独立执行通过(4.34秒,含缺文档、补齐、中文坏链接),相关Clippy -D warnings通过(5.77秒)。真实原生报告通过Draft202012协议;删除七项修复字段的七个变体及未完成却保留源码修复指引的变体均被拒。Python校验仅为独立验收,不在Rust产品执行路径。 - -尚未实现Rustdoc持久同步、task verify、尝试历史读取、抑制对照、正式关闭/复发重开、check all调度和完整配置/工具/策略覆盖;7.1、9.7保持未完成。全工作区未重跑,完整目标继续。验收见相邻codeguard-cli/tests/acceptance/rustdoc-repair-brief.md。 - -## 2026-09-27 Rustdoc自动持久同步与next - -comments rust报告0.4加入工作区绑定、独立run_id和原生目标相对路径,保留0.3历史schema。已初始化时保存queued报告并自动调用统一work sync;新原生发现生成稳定fact、Markdown七项任务与观察,同一问题再次扫描不重复建任务。导入重建原生范围指纹和简报,核对源码、清单及锁的当前字节;陈旧证据作为历史并生成重扫准备阻塞,坏身份/额外字段/范围或工具状态矛盾拒绝导入。未完成观察只生成检查准备任务,不创建源码违规。next识别rust.cargo_rustdoc并给同一原工具重扫指引;尚无task verify时不指示自动关闭。 - -TDD初始化扫描缺持久同步时先RED;新增重复扫描/next、缺工具准备、队列入库后清单变化、伪造指纹四个契约。最终相关普通回归:rust_comments_cli 11、identity 3、work_sync 15、cross_category 1、next 6,共36项通过,3项默认忽略不计通过。真实Cargo CLI显式独立运行1项通过(5.56秒),追加初始化、真实发现任务文件及自动同步检查;相关Clippy -D warnings终态通过(10.28秒)。实际绑定反馈与queued报告通过Draft202012,task文件存在,缺工作区ID反例被拒。fmt/OpenSpec结果另记。 - -7.1/9.4/9.7未完成:原配置/完整目标覆盖、可信工具规则、文档task verify/尝试历史/抑制对照/关闭复发及跨宿主尚缺。旧全工作区回归不代表本轮全量;验收见相邻tests/acceptance/rustdoc-workbench-sync.md。 - -## 2026-09-27 Rustdoc任务复检与原生抑制对照 - -复用comments rust的同一观察服务,接通task verify --cargo-tool;同一预算与任务租约内执行普通rustdoc及force-warn对照,捕获全部已发现Rust源/清单/锁并核验两轮输入与工具摘要。原问题仍在为still_present,同文件同规则身份变化为rule_coverage_requires_review,抑制重现为suppression_requires_review;两轮局部零发现仅candidate_absent_unverified_policy,任务保持open。环境恢复同样待策略核验。复检保存同一问题事件并关联准备好的attempt;next/历史读取识别rustdoc时间序列,源码/清单/锁变化后不沿用旧观察。未稳定封套的导入不生成源码修复任务。 - -协议:rustdoc_task_recheck 0.1封套包含普通/强制原生观察与输入身份;文档task_verification_preview升级0.7,其它既有预览继续0.6。保留原0.6schema;当前schema接受具名旧协议及新封套,不赋予门禁/关闭权威。实际原生预览及两轮嵌套报告通过Draft202012,校验Python仅独立验收。 - -TDD缺入口先RED,随后暴露历史读取器缺新checker与序列格式导致第二次复检失败,补齐后连续仍在/抑制/缺失契约通过。相关普通回归:文档CLI12、next6、同步15、任务租约16、任务复检10,共59项不同测试通过;11项默认忽略不计通过。原生CLI独立1项实际通过(14.07秒),包括初始化/稳定任务、真实缺文档复检、补齐文档与源码allow的force-warn反例、中文坏链接;同一测试多轮不重复计数。相关最终Clippy结果另附。 - -仍缺正式关闭与复发重开、完整原配置/workspace/features/targets/符号归属、可信工具/规则/批准、全部语言类别及宿主;7.1/9.7不勾选。未来工具文件变化的旧复检不能作为批准工具证明,本地来源始终未核验。本轮没有全工作区回归。验收见相邻tests/acceptance/rustdoc-task-recheck.md。 - -## 2026-09-27 Rustdoc强制对照导入身份修正 - -反例先RED:普通观察合法时,强制对照的伪造指纹及重复输入归属均被旧同步器消费,failed_reports=0。现把复检导入交给独立Rustdoc封套解析:严格检查顶层键与唯一输入路径归属,稳定输入绑定源/目标及清单/锁;普通和强制观察分别进入同一严格原生范围/指纹解析。强制argv及原始证据保留在封套,只在内部核验投影规范化参数,不修改原始报告或将抑制当修复。输入不稳定/当前失配时只导入准备阻塞,不生成源码任务。 - -同一反例验收三种变体:伪造强制指纹和重复输入被拒,不稳定封套只生成一项重扫阻塞;没有新增源码任务。相关普通回归13项文档CLI、15项同步、6项next,共34项通过;3项默认忽略不算通过。真实Cargo CLI独立1项通过(14.49秒),覆盖正常文档发现/修复复检、原生allow/force-warn和中文链接;相关Clippy -D warnings退出0(7.18秒)。真实报告协议验收另记;schema增加重复行拒绝,唯一字段归属仍由Rust核验。 - -这是任务复检证据的完整性修正,不是正式批准或关闭;7.1/9.7保持未完成。全工作区未重跑,完整目标仍需持续推进。验收见相邻tests/acceptance/rustdoc-forced-evidence-binding.md。 - - -## 2026-09-27 Rustdoc 接入 check all - -完整检查入口新增独立 rust.comments 节点,复用 comments rust 观察服务与持久同步;与 Clippy 共用总预算和 Cargo 资源互斥,分别保留结果/完成状态/准备任务。取消标记传入原生进程,避免新节点绕开任务取消。文档原生发现进入统一对话反馈和 next;检查器成功不覆盖其它未完成。check_feedback 0.27、check_aborted 0.8 自包含嵌入 Rustdoc 0.4,旧 0.26/0.7 协议保留。 - -TDD:缺调度时新契约先失败;接线后回归暴露旧任务计数、协议自包含以及独立准备任务 next 预期,已修正。真实验收新增断言最初误用 local_complete 字段失败,改为既有 local_scan_complete 后通过,不改生产协议迎合测试。普通相关 Go3/Java24/npm2/部分结果13/Rust11/文档14,共67项通过,12项默认忽略不算通过。显式既有 Cargo 原生3项通过:Clippy两项7.03秒、Rustdoc一项12.96秒;增强后的原生完整检查实际断言 missing_docs 及独立两节点。相关 Clippy -D warnings 通过(1.20秒)。 - -真实未初始化/初始化 check_feedback 0.27 均通过 Draft202012,初始化文档同步状态 synced;check_aborted 0.8 仅静态 schema 合法性,本轮未声称实际异常中止协议验收。Python仅独立验收,不在产品执行路径。正式规则/完整构建组合、可信工具策略、关闭复发与宿主仍缺;7.1/9.7不勾选,全工作区未重跑。详见相邻 tests/acceptance/rustdoc-check-all.md。 - - -## 2026-09-27 当前 Rustdoc 集成后的全工作区验收启动 - -当前源在完整 Rustdoc/check all 接线后启动 cargo test --workspace 和 cargo clippy --workspace --all-targets -- -D warnings。两项运行尚未终止,不能以旧880项通过替代本轮终态;测试日志 /tmp/codeguard-workspace-current-20260927.log,Clippy日志 /tmp/codeguard-clippy-current-20260927.log。本轮首批13组59项通过/0失败/0忽略,只是中间结果,13.2保持未完成。 - -独立协议静态审计115份schema合法且本地引用可解析;实施索引核对108项Requirement均有对应行且无重复标题,仅证明映射。OpenSpec strict及git diff --check退出0。未安装工具、未修改规格要求、未发布;完整计划继续,后续沿同一进程核验终态,不因观察等待重启。 - - -## 2026-09-27 全目标 Clippy 终态 - -同一运行 cargo clippy --workspace --all-targets -- -D warnings 已退出0,耗时2m01s,日志SHA256 ba479f2fe8cb4e988013460eed8c16cd6d506830b65530f8804107cf89c7695d。不是部分目标检查。全工作区测试仍运行,中间17组、74通过/0失败/1忽略;不得用中间结果宣布全通过。13.2及完整计划保持未完成。 - - -## 2026-09-27 插件兼容静态与 vendor 校验终态 - -既有架构脚本通过,语言注册57条(54 stable/3 planned)及11项schema规则通过;受管技能离线和在线check均退出0,在线核验 v0.1.2 -> 2c0c8071f96de48dc53e11de2499c083c100e44c。未更新lock、未安装或发布。旧Python脚本只是既有插件兼容验收,不新增Rust产品中的Python检测路径。 - -Rust全工作区测试同一运行仍在继续,本次中间25组/103通过/0失败/4忽略,不能宣布终态。全目标Clippy本轮已通过,115 schema静态校验和108 Requirement映射也通过,均不等于所有原生/平台/宿主验收。13.2不勾选。 - - -## 2026-09-27 既有插件测试与解释器边界 - -协议模拟 tests/run_all.py 终态142通过/0失败/1跳过。第一轮unittest实际632项/93.819秒,1失败/21跳过:主进程3.13.5而Bash CLI子进程PATH选到系统3.9,zip(strict=True)报错,不能将该轮计通过。仓库CI明确3.11/3.12/3.13。统一PATH到既有/opt/anaconda3/bin后,失败所在CLI合同3项实际通过(0.539秒),随后启动同一环境完整unittest,日志 /tmp/codeguard-plugin-unittest-python313-20260927.log,尚未终态。未修改Python生产逻辑、未安装解释器;保留首轮失败。Rust全量沿原进程继续,完整验收仍未完成。 - - -## 2026-09-27 统一解释器插件 unittest 终态 - -明确 PATH=/opt/anaconda3/bin:$PATH,主/子进程使用既有Python3.13.5;完整unittest退出0,632项/99.003秒,其中621通过、11跳过。日志SHA256 10f2e398b7d644ab8abf9cb3efebdfd637efc9994fd80fb41b454f12b0eff71e;首轮3.9子进程失败仍保留,不伪称系统3.9兼容。协议模拟142通过/1跳过、全目标Rust Clippy、架构/语言/schema/OpenSpec/vendor检查分别记录。Rust测试同一运行仍在继续,中间74组/432通过/0失败/34忽略,尚无完整终态;13.2及总目标保持未完成。 - - -## 2026-09-27 Rust 构建实现前验收约束 - -继续既有7.1与Rust command plans SHALL preserve explicit build levels要求,追加原生Cargo check的可归属编译错误与报告损坏两场景;不新增change或改验收目标。后续适配须保留package/manifest/target与原生诊断,类型检查固定test_execution=false,不改称Clippy/文档/安全违规。成功/失败结束、原生退出、重复键、结束后事件及无可归属诊断的失败须分别核验;裸退出不生成源码违规或通过。当前只有规格补齐,尚无Cargo构建实现或测试通过声明;7.1仍未完成。OpenSpec strict和git diff --check退出0。现有Rust全工作区测试继续原运行,未因等待重启。 - - -## 2026-09-27 Rustdoc集成后全工作区测试终态 - -同一 cargo test --workspace 运行已退出0:154组、910通过、0失败、93忽略。包括当前Rustdoc/check all/任务复检及所有既有普通回归;忽略原生测试、MSRV1.85、Windows和宿主不计通过。日志 /tmp/codeguard-workspace-current-20260927.log,SHA256 8d647e591bac5d2d247e33a3e648922d102da3639c72909a0513ecb3b91c5ff8。当前 source 的全目标Clippy已退出0,既有插件unittest621通过/11跳过、协议模拟142通过/1跳过,115schema静态/OpenSpec/架构/语言/vendor另有终态。 - -当前全量结果替代旧880项基线,不抹去首轮Python3.9子进程失败;93项忽略须各自具备条件后独立验收。实际原生Cargo3项和反馈0.27的两种绑定情况验收另列,不把普通协议夹具当真实工具。原配置/全构建组合、可信策略、关闭复发、全部语言类别与发布宿主仍缺,13.2及完整目标不勾选。下一实现为已有7.1下Cargo原生构建契约,新增两场景只是验收准备。 - - -## 2026-09-27 Cargo 原生构建解析前置 - -新增独立 CargoBuildDiagnostic/CargoBuildParsed 对象与 Cargo check JSON流解析,保留编译器错误码、package/manifest/target及唯一主定位范围,不借Clippy/文档规则过滤。结束成功与退出、成功却带error、失败无可归属错误、坏/重复键/未知记录/结束后事件、规模上限等均未完成;前序有效观察保留仅供调查。纯解析尚无源字节/工具/配置绑定,不授予正式源码finding、覆盖或交付权威。 - -TDD缺入口先因unresolved import失败;实现后8项新协议、adapter库6项、Rustdoc7项、依赖边界6项,共27项普通回归通过。真实既有Cargo原生1项通过(0.94秒),包括E0308类型错误、成功但故意失败测试未运行、build.rs执行失败不被误报为源码;首次路径断言因macOS临时路径别名失败,核对实际manifest路径后通过,未改生产解析规则。相关Clippy -D warnings退出0(10.63秒)。未安装或下载工具。 - -公开build rust、共享runtime服务、原输入/工具/目标归属、持久修复任务、复检、check all与完整构建组合仍缺,7.1不勾选。此前154组/910通过全量是本前置之前的基线,本轮新源仅上述受影响验证,不宣称重跑全量;完整目标继续。验收见相邻tests/acceptance/cargo-build-native-observation.md。 - - -## 2026-09-27 build rust 公开类型检查探针 - -新增 build rust [path] --cargo-tool ABS_PATH --timeout DURATION --format human|json,使用共享预算/runtime/SourceSnapshot与私有target调用原生Cargo check --locked --offline --all-targets --message-format=json;不执行测试,不生成锁,不安装工具。前后核验已发现源码集合、根清单/锁和工具字节,原生目标须归属本轮源及根清单,UTF8范围及行列重建候选指纹。保留包身份摘要和原生目标类别,避免公开本机package路径;不同目标类别同候选指纹不按原生顺序消歧。输入/工具变化、取消/超时等不给源码修改范围;取消优先130,普通局部命令保持3/not_evaluated/coverage_proven=false。 - -每发现给七项静态修复/调查信息,历史not_integrated且不授权关闭。反馈 rust_build_local_observation 0.1及严格自包含schema新增build_level=type_check/test_execution=false/build_success;没有队列、任务或门禁接线。真实错误和成功反馈均通过Draft202012,六个伪造授权/覆盖/状态及缺包身份变体被拒;独立Python只验收,不在产品路径。 - -TDD缺公开入口先RED。最终相关普通26项(build6、Rustdoc14、边界6)通过、2项默认忽略不计通过;真实公开Cargo1项通过(7.15秒),包含E0308、补齐成功但panic测试未执行、构建脚本失败不生成源码违规;相关Clippy -D warnings最终退出0(5.63秒)。中途一次输入变化测试得到source_discovery_incomplete,已加强fixture的原子序列路径隔离,之后全组通过;该次底层原因未完全归属,保留失败,不改生产失败判定。 - -7.1/9.7仍未完成:公开命令仅原生类型检查局部探针,缺完整配置/workspace/features/targets/可信工具策略及任务同步/verify/关闭复发/check all接线;新源未重跑全工作区,此前910项基线不覆盖本次新增行为。验收见相邻tests/acceptance/rust-build-cli.md。 - - -## 2026-09-28 Rust构建报告自动同步与next - -build rust局部观察协议升级0.2,保存0.1原始schema;每条finding增目标源码摘要,初始化工作区自动入队并sync。严格导入核对工作区/run/file键、原生状态、根清单锁与当前源码及目标普通文件字节,重算UTF8原生范围指纹;导入改用SourceSnapshot读取源码/目标以拒绝路径别名。包摘要保持未核验观察,不冒充可信来源。有效发现生成稳定fact和七项任务,同一问题重复扫描只更新观察。旧目标即使错误源码未变也只留历史并生成重扫准备任务;伪造指纹拒绝。缺工具生成稳定准备任务,next显示同一原生构建复扫指引。 - -TDD缺自动同步先RED。相关普通:build9、work sync15、next6,共30项通过,3项默认忽略不计通过;真实公开Cargo1项通过(7.70秒);实际绑定反馈与queued 0.2均通过Draft202012,任务文件存在,缺目标摘要反例拒绝。Clippy第一次发现一处不必要借用,已按诊断修正且重新执行,终态见后续证据。 - -7.1/9.7/9.4均未完成:正式task verify、关闭复发、可信包工具/规则策略、完整workspace/features/targets及check all仍缺。0.2队列同步不是构建通过、风险接受或白名单批准;历史0.1不能作为当前可导入报告。全工作区当前新源码尚未重跑;旧910项基线不得挪用。验收见相邻tests/acceptance/rust-build-workbench-sync.md。 - -## 2026-09-28 Rust 构建任务的原工具复检与白名单边界 - -延续既有7.1/9.7/9.4,不新建OpenSpec change。先以已同步编译任务的 `task verify` 返回 `task_checker_unsupported` 作RED;现将 `rust.cargo_check` 接入任务租约、统一截止时间、原生Cargo check、全部已发现Rust源/根清单/锁快照和本轮工具摘要。复检封套 `rust_build_task_recheck` 0.1 与任务、运行和输入绑定;`task_verification_preview` 0.8 保留旧0.7 schema。有效相同错误为still_present,局部零诊断仅candidate_absent_unverified_policy,环境任务仅恢复候选;事件与本地报告持久化并供next/尝试历史核验。保存前重抓输入且拒绝源集变化,报告导入严格复核原生诊断身份。next复检命令指向同一task verify,不自行关闭或批准白名单。 - -白名单仍按已有规则体系处理:候选/本地决策无门禁效力;原生工具故障、配置或覆盖未完成不能转成误报放行。Rust构建任务的局部复检只提供纠错证据,不证明可信白名单批准、完整构建组合、测试执行或最终交付。受影响普通测试41项(build10、work sync15、next6、task verify10)通过,12项条件性忽略;真实既有Cargo任务复检1项通过。Clippy受影响包all-targets -D warnings退出0;119份schema静态合法性与引用存在性通过。此前910项全量基线早于此新代码,不能作为当前全量证明。7.1/9.7/9.4/4.8/12.12均保持未完成,待可信策略、白名单批准/正式门禁、完整构建目标、任务关闭复发和跨宿主验收。详见相邻codeguard-cli/tests/acceptance/rust-build-task-verification.md。 - -## 2026-09-28 npm 审计异常退出的局部证据 - -延续 F05、2.3、5.5 和 7.3;未新建 change。受控 npm 11.16.0 命令输出完整且与锁节点绑定的 advisory 后异常码 2 退出,旧公开反馈丢弃 finding;目标测试先 RED。现严格解析与再次核对输入后保留脱敏证据,原因仍为 npm_audit_execution_incomplete、交付未评估;check all 执行节点为 native_incomplete,不因报告有效而显示任务成功。截断 JSON 反例仍零 finding。同一工作台只维持稳定的 npm CVE 完整性任务,不把局部观察改成漏洞确认或放行。 - -该阶段目标 npm_audit_cli/check_all_npm、全工作区 cargo test --workspace --offline -q、全目标 Clippy -D warnings、fmt 和 OpenSpec strict 均退出 0。详见相邻 codeguard-cli/tests/acceptance/npm-partial-native.md。此阶段仅覆盖异常退出后的完整报告;超时与输出上限的后续进展见下段。真实 npm 故障、数据库来源及时效及跨语言 F05 矩阵未验收,2.3/5.5/7.3 与总计划继续未勾选。 - -后续 F05 增量:同一 npm 原生观察现对完整 stdout 报告后超时、其它输出超出共享上限继续执行严格 JSON/锁节点/输入摘要核对;分别保留 `deadline` 和 `npm_audit_output_limit` 及局部 finding,不将零漏洞报告当作未完成执行的干净证明。超时后不跨截止时间持久化;输出超限仍可同步稳定完整性任务,`check all` 节点保持 `native_incomplete`。工具运行中变更或 JSON 截断都不产生 finding。完整 5.5/7.3 与 F05 跨适配器验收仍未完成。 diff --git a/openspec/changes/introduce-rust-codeguard-cli/verification.md b/openspec/changes/introduce-rust-codeguard-cli/verification.md deleted file mode 100644 index b782206..0000000 --- a/openspec/changes/introduce-rust-codeguard-cli/verification.md +++ /dev/null @@ -1,2041 +0,0 @@ -# 本次设计交付验证 - -## 2026-09-26 `lint go` 原生局部 CLI - -相邻 Rust CLI 已接入 `codeguard lint go`,从显式 Go 1.23.4 二进制执行版本探测及 `go vet -json ./...`,把原生规则、相对路径、行列与诊断文本摘要送入 human/JSON 反馈。运行前后复核工具、`go.mod`、可选 `go.sum` 和发现的 Go 源文件;继承环境被清空,Go 工具链/模块网络下载关闭,缓存位于私有临时目录。无工具或无关二进制不产生干净结果,真实违规、干净和编译错误分别有独立反馈,所有结果仍退出 3、交付未评估。反馈 schema 和真实验收范围见 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。任务同步、完整项目/平台覆盖、可信工具与策略,以及注释原生工具尚缺,8.2 未完成。 - -## 2026-09-26 Go vet JSON 原生局部解析 - -相邻 Rust `codeguard-adapters` 新增 Go 1.23.4 `go vet -json` 的局部报告解析;本机原生违规、干净、编译失败三样本分别得到 `FindingsObservedUnverified`、`CleanObservedUnverified`、`Incomplete`。JSON 模式中违规样本退出 0、诊断位于 stderr,排除了“退出 0 即无违规”的错误适配。真实测试首次因 macOS `/var`/`/private/var` 路径别名失败,修复根路径归属后通过。坏版本/JSON/包/位置/多包坏块均不生成部分 finding。CLI 调用、Staticcheck 注释、完整覆盖和工具锁尚缺,8.2 继续未完成。详细证据见 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 - -验证:`cargo test -p codeguard-adapters --test go_vet_contract --offline` 为 5 通过、1 显式原生用例跳过;`CODEGUARD_GO_TOOL=/usr/local/go/bin/go cargo test -p codeguard-adapters --test go_vet_contract --offline -- --ignored` 为 1 通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。默认工作区回归跳过其余需要显式原生工具的用例。 - -## 2026-09-26 Go 六类别候选档案 - -相邻 Rust `rulepacks/go_static_candidate_v1.json` 固化 Go Modules 的 lint/comments/dependencies/cve/security/build 六个适用类别、候选原生工具与版本、五个待验收平台及每类覆盖缺口;Rust 解析器拒绝缺项、重复、虚报 implemented/not_applicable、错类别工具、`gofmt` 冒充注释检测和 CVE 漏数据库新鲜度要求。旧注册表的 Go `stable` 仅保留为迁移元数据,新能力矩阵仍全为 `gap`。这完成 OpenSpec 8.1 的候选/缺口账本,不证明 8.2/8.3 的真实检查能力。依据见 `codeguard-cli/tests/acceptance/go-candidate-baseline.md`。 - -TDD:新增契约测试先因缺档案/接口失败,补齐后通过;错类别工具反例再次先失败后修正。`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 均退出 0;显式原生测试仍按原设置跳过。 - -## 2026-09-25 Maven Javadoc 多文件原生 CLI 探针 - -相邻 Rust `check java`/`check all` 对已静态配置的 Maven 构建根增加独立多文件 Javadoc 探针:有界源码快照、新私有项目、固定 POM、离线 Maven/JDK 21、原生输出解析与输入/制品复核。真实两文件违规样本产生多条缺注释诊断;源码修正后重新建快照得到 `clean_log_unverified`。两轮均退出 3、交付未评估;固定探针 POM 与项目生效配置/完整类路径不等价,6.3 保持未完成。首次原生失败说明离线仓库中的 Maven 镜像 ID 必须由匹配的 settings 提供;改用现有隔离 settings 后原生用例通过。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0;默认工作区测试跳过显式真实 Maven 用例,该用例另行通过。证据见相邻 `codeguard-cli/tests/acceptance/maven-javadoc-multifile-probe.md`。 - -## 2026-09-25 源码快照目录替换反例 - -相邻 Rust runtime 的 `SourceSnapshot` 在 Unix 上改为固定根目录描述符、逐级 `openat`/`O_NOFOLLOW` 读取及复核。测试将子目录反复在真实目录和指向范围外文件的符号链接之间切换,1,000 次捕获只能得到根内预期字节或错误;目标 `source_snapshot_contract` 4 项、`java_javadoc_cli` 普通 4 项和显式 JDK 21 的 1 项均通过。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt 与 OpenSpec strict 均退出 0。仍须区分该输入读取保护与项目级 Maven 执行沙箱:副本写入、插件副作用及完整源集尚未证明,3.7/6.3 不勾选。 - -## 2026-09-25 Javadoc 输入快照执行边界 - -项目级 Maven Javadoc 仍不能直接交给当前工作树执行:实际 POM 可能触发额外插件和生成源码,而现有单文件探针没有完整项目配置归属。相邻 Rust runtime 增加有界 `SourceSnapshot`,并接入 JDK Javadoc 单文件入口。相对路径逃逸、重复、预算超限、符号链接文件/父目录、原件或私有副本改变均有负例;快照不宣称源集完整或内核级抵御恶意并发目录替换。`source_snapshot_contract` 3 项、`java_javadoc_cli` 普通 4 项及显式真实 JDK 21 1 项通过;`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。完整项目级 Maven 运行和 3.7/6.3 验收仍未完成。 - -## 2026-09-25 Maven Javadoc 干净日志与旧产物反例 - -本机 Maven 3.9.16/JDK 21/离线 Javadoc Plugin 3.12.0 的完整注释项目,首轮和同目录重跑都成功且没有 Javadoc 诊断块;日志本身不能证明第二轮重新生成了文档。相邻 Rust 解析器新增 `CleanLogUnverified`,只允许已观察的编码提示,保留零诊断但明确 `javadoc_fresh_execution_unverified`;未知警告、额外错误与失败结果仍为 `Incomplete`。这一状态不是项目检查通过,也不能关闭修复任务。独立快照执行器、产物归属和生效配置证明仍缺,6.3 不勾选。 - -验证:`maven_javadoc_output_contract` 普通 5 项及显式真实 Maven 2 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。默认工作区测试仍跳过需要显式本机原生工具的用例;项目执行器尚未实现。 - -## 2026-09-25 Maven Javadoc 原生输出双路径 - -在独立临时 Maven 项目上,本机 Maven 3.9.16/JDK 21/离线 Javadoc Plugin 3.12.0 的原生执行证明:`failOnWarnings=false` 时 `BUILD SUCCESS` 仍有缺注释警告;`true` 时 `BUILD FAILURE` 和同一诊断。相邻 Rust adapters 新增有界解析器,只有单一 goal、已知插件版本、完整警告数量、源码字节与规则归属及可信失败签名同时匹配才保留局部诊断;其它结果为 `Incomplete`、不生成部分 finding。首次真实测试发现同目录第二次执行可能复用 `target/site/apidocs`,改为每轮独立项目副本后两种原生路径均通过。这是项目级执行器需要隔离快照的验收前提,并非执行器已实现。 - -验证:解析器目标测试 3 通过、1 个显式原生测试默认跳过;显式设置 Maven/JDK 路径后真实原生测试 1 通过;`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`cargo test --workspace --offline -q`、`openspec validate introduce-rust-codeguard-cli --strict` 与 `git diff --check` 均退出 0。默认完整测试仍跳过需显式环境的原生用例。6.3 保持未完成。 - -## 2026-09-25 `check java` Javadoc 局部原生反馈 - -相邻 Rust CLI 的 `check java`/`check all` 新增条件调度的 `java.javadoc` 任务:仅静态配置确认为 `configured` 才调用 JDK 21 原生单文件探针,并在 JSON/human 显示缺注释位置与规则。无 Javadoc 配置时不调度,也不把缺失检查器自动升级为必需义务;配置无效/未知仍由 discovery 给出原因。检查反馈协议增量为 0.9.0,Javadoc 结果固定 `project_checker_attribution=unverified`、`coverage_proven=false`、`delivery_decision=not_evaluated`,不进入任务同步、白名单生效或门禁。 - -验收:目标集成测试先因 `native_results.java_javadoc` 缺失失败,接线后通过;显式本机 JDK 21 的真实最小 Maven 项目用例通过 1 项,返回 `JavadocMissingComment`。把调度条件收紧为“仅已配置”后,相关 `check_all_java_p3c` 为 15 通过/4 显式原生跳过,`check_all_partial_contract` 为 13 通过/1 跳过,真实 JDK 用例再次通过;最终 `cargo test --workspace --offline -q` 退出 0。Clippy、格式检查及 OpenSpec 严格校验也退出 0。项目 Maven Javadoc 插件生命周期、effective model/类路径、Checkstyle、生成源码和完整源集未验收,6.3 保持未完成。 - -## 2026-09-25 Javadoc 配置误报反例 - -相邻 Rust Maven 静态探测修正了“声明 Javadoc 插件即认为缺失注释规则可用”的误判:`doclint=none`、`all,-missing`、仅 `syntax`、`failOnError=false` 及未被插件配置覆盖的 `maven.javadoc.skip=true` 均不再返回 `configured`;动态 doclint 返回 `unknown`。`check java` 的 discovery 同轮反馈 `invalid/javadoc_missing_check_disabled`,仍未把这项配置观察当成项目原生执行或门禁通过。 - -TDD 证据:新增 `detect_cli` 反例先失败(既有输出错误地为 `configured`),实现后目标用例通过。`cargo test -p codeguard-cli --test detect_cli --offline -q` 为 19 通过;`cargo test -p codeguard-cli --test check_all_java_p3c --offline -q` 为 14 通过、3 个显式原生用例跳过;`cargo clippy --workspace --all-targets --offline -- -D warnings` 与 `cargo fmt --all --check` 退出 0。该切片未运行完整 workspace 回归,也未证明 Maven effective model、跨父 POM 属性覆盖或项目级 Javadoc 执行,5.10/6.3 继续未完成。 - -## 2026-09-25 JDK Javadoc 单文件原生诊断切片 - -相邻 Rust CLI 新增 `lint java FILE --checker javadoc --java-home ABS_PATH`;JDK 21 `-Xdoclint:missing` 的已知缺失注释、参数和返回诊断可映射到原源码。未知文本、缺少类路径、进程失败或缺失原生产物保持未完成;无诊断只标为 `clean_scope_unproven`,一律退出 3、不签发项目通过。`lint java` 缺省 P3C 行为仍保留。本单文件切片当时尚未接入 `check java`;项目生效配置、任务、白名单生效门禁及 Checkstyle、完整项目级验收仍未完成。 - -验证:`cargo test --workspace --offline -q` 退出 0;`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、`openspec validate introduce-rust-codeguard-cli --strict` 均退出 0。显式本机 JDK 21 的 `CODEGUARD_JAVA_HOME=... cargo test -p codeguard-cli --test java_javadoc_cli --offline -- --ignored` 通过 1 个真实原生测试,覆盖缺类注释、参数/返回、`{@inheritDoc}`、record 与 Lombok 类路径缺失。默认工作区测试跳过显式原生工具用例;P3C 局部回归 6 通过、2 跳过。P3C 报告 schema 的规则集下限对齐固定原生计划的 10 组。 - -日期:2026-09-24。性质:架构与规格文档验证,**不是 Rust 实现、真实扫描器或发布验收**。 - -本文件保留设计阶段的历史快照;文内“未建立 Rust 源码仓”“267 项未勾选”等数字描述的是当时状态。随后启动的实施以 [tasks.md](tasks.md) 为唯一勾选状态,独立 Rust 工程证据记录在相邻 `codeguard-cli/tests/acceptance/`,最新旧源码增量见 [核对记录](../../../docs/rust-cli/legacy-delta-20260924.zh-CN.md)。 - -## 交付范围 - -- [设计文档入口](../../../docs/rust-cli/README.md):架构、技术方案、57 项语言迁移与验收、项目内持久修复工作流、项目初始化与 AGENTS 接入、逐指令架构。 -- 本 change 的 proposal、design、11 个 capability delta 和可执行 tasks。 -- 持久工作区使用 `./codeguard/`,含自有 .gitignore;以问题、阻塞、任务和复检事件指导修复,规则和最终门禁不由任务文件决定。 - -## 实际检查 - -`openspec validate introduce-rust-codeguard-cli --strict --json --no-interactive` 已通过,无 issue。最初的校验发现 MODIFIED scenario 标题未保留,已恢复原 scenario 名称并显式限定旧协议范围,再次校验通过;未删除旧场景来绕过验证。 - -初始设计交付使用只读脚本核对 Markdown 本地链接、代码围栏、JSON 示例、语言 ID/状态、重复任务编号、proposal/spec 目录和规范任务追踪,最终退出 0、issues=[]。初始范围为 19 份 Markdown、40 个本地链接、57 个语言条目、10 个 capability、43 条 requirement、89 个 scenario、228 项未勾选实现任务。Mermaid 有 9 个代码块,已检查围栏与人工语法,未执行渲染器视觉验收。 - -`git diff --check` 与 `git diff --cached --check` 在本次文档路径范围均通过。任务初次语言 ID 机器核对发现三项仅写了大小写不同的展示名,已补充 canonical ID 并复核 57 项全部可追踪。 - -OpenSpec 的 planning artifacts 为 complete 只说明 proposal/design/specs/tasks 已齐备,不意味着实施完成。实现任务全部未勾选;不得据 status 的 isComplete 字段声称二进制可用。 - -## 初始化设计增量复核 - -同日补充 init 的项目画像、分类型模块图、AGENTS 受管摘要、静态观察与写入边界、画像刷新和准备状态。沿用同一 change,未建立第二套规格事实源。 - -增量完成后重新执行 OpenSpec 严格校验,通过且无 issue。文档核对范围为 21 份 Markdown、48 个本地链接、11 个 capability、50 条 requirement、104 个 scenario、240 项未勾选任务;本地链接、代码围栏、JSON 示例、任务编号连续性/唯一性、proposal/spec 目录及能力任务追踪均通过。Mermaid 共 11 个代码块,未执行渲染器视觉验收。`git diff --check` 通过。 - -独立读者复核促成两项补充:dry-run 仅返回拟创建的任务,apply 才持久化;readiness 只按适用必需前置条件汇总,区分已确认阻塞、未探测和已就绪,避免可选工具缺失误阻塞。init 成功与质量通过继续保持独立。 - -## 逐指令架构增量复核 - -同日新增 [逐指令架构](../../../docs/rust-cli/command-architecture.zh-CN.md),覆盖 C01–C35 的职责/价值、输入输出、副作用、失败恢复、应用服务与调用旅程。细化统一操作协议、准备证据、工具安装、交付输入、执行预算和任务租约/attempt接入,并同步既有规格和任务。 - -最终 OpenSpec 严格校验与文档静态核对通过:22份 Markdown、57个本地链接、14个Mermaid代码块、11个capability、57条requirement、122个scenario、248项未勾选任务;C01–C35目录与独立章节一一对应,F01–F26场景编号连续。核对覆盖本地链接、代码围栏、JSON示例、任务编号、proposal/spec一致性及能力任务追踪;`git diff --check`通过。Mermaid未执行渲染器视觉验收。 - -独立读者指出并完成修订:fix缺少已领取任务的租约传参、doctor准备证据缺少明确导入身份、执行预算缺少默认和总deadline;二轮复核进一步区分已初始化批量fix与未初始化私有证据路径。另明确已落盘finish的幂等读取不受后续租约到期影响,不能重新写入新租约状态。 - -以上只验证设计产物;未构建或运行35项新命令、MCP服务、安装器、租约或真实检查器,未初始化被检查项目。预算默认值仍需实施阶段按真实项目验证,不作为已测性能承诺。 - -## 实施前规范与计划覆盖审计 - -同日按用户要求核对全部已确认设计是否落入规范与任务,新增 [实施覆盖索引](implementation-coverage.md),逐条连接Requirement、命令、语言、平台/宿主及任务,并补充执行里程碑、责任边界与待定参数的关闭任务。索引不维护第二份实施状态。 - -本轮补齐5条正式Requirement、17个Scenario、19项任务,并强化既有9.4/9.10/9.27的故障验收。具体包括detect/capabilities查询处理、事件/游标中断恢复、过期租约接管、环境任务原义务复检、关联追踪、证据保留、分层评测以及逐平台/宿主验收。独立读者复核5项命令缺口均闭合,执行顺序未见明确循环;评测依赖拆为12.2冻结输入→12.10计算器→12.11真实评测。 - -当前审计范围为23份Markdown、126个本地链接、15个Mermaid代码块、11项capability、62条Requirement、139个Scenario、267项未勾选任务。机器核对证明每个Requirement恰有一条索引映射、全部267项任务均有规格关联(未映射为0);35项命令与设计章节一致,57个语言与当前注册表集合及stable/planned状态一致,5个平台和3个宿主均有有效任务引用。Markdown围栏、JSON示例、本地链接、任务编号、proposal/spec及阶段追踪检查通过。 - -`openspec validate introduce-rust-codeguard-cli --strict --json --no-interactive`通过且无issue;`git diff --check`通过。Mermaid未运行视觉渲染。此结论限定于当前已确认设计的拆分与追踪;P3C兼容版本、平台ABI、签名身份、语料和性能等待实测参数已绑定任务,不声称已确定。代码实现、原生工具、平台/宿主运行及发布仍全部未完成;未运行apply/sync/archive。 - -## 初始设计独立读者检查 - -两轮只读审查识别并修订以下六项: - -1. 例外同时绑定范围、内容身份和到期时间,不允许无期限例外。 -2. 离线执行必须具备可验证的网络隔离条件,不能只转发参数。 -3. 可信 CI 验证端与被测脚本执行区隔离,防止项目脚本篡改策略或签发结果。 -4. work sync 幂等消费全部匹配未导入报告,不只取最后一次检查。 -5. 已启用插件工作流必须经过 scan→sync→RepairBrief;存储失败可见。 -6. attempt 开始/结束记录复检前失败和无修改尝试,避免预算失效。 - -语言任务已细分到具体 language ID;每种语言均有适用性、lint/comments、CVE/security/build 与真实工具验收要求,不用大组汇总掩盖缺项。 - -## 当前证据边界 - -源码观察基线为 `03ebb24`,读到的注册表为 54 stable/3 planned。工作过程中存在其他任务切换分支、暂存 release/manifest 文件;本次不创建或切换分支、不修改这些发布文件、不代替其他任务提交。文档最终实现基线须在实施开始时再次核对。 - -没有建立 Rust 源码仓、编译或执行新 CLI,没有安装工具、测量实际误报率、发布制品、同步市场或验收宿主;没有运行 openspec apply/sync/archive。既有代码全量测试不用于证明本次文档设计已运行。后续实现与发布证据按 tasks 逐项记录。 - -## 2026-09-24 静态检测族增量 - -用户明确补充 Javadoc、CVE、依赖检测及其他静态检测。现有 change 增加六类别/28 检测族契约、`dependencies` 命令 C36、逐族义务与真实工具验收任务;相关设计见 [静态检测目录](../../../docs/rust-cli/static-check-catalog.zh-CN.md)。相邻 Rust 工作区的能力矩阵协议从 `0.1.0` 升到 `0.2.0`,57×5×6 共 1710 个能力单元继续全部为 `gap`;计划协议 `1.1` 要求检测族,解析器仍兼容只读 `1.0` 计划。新增 schema/解析器一致性与类别错配反例。 - -验证:`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、能力矩阵生成器 `--check`、`openspec validate introduce-rust-codeguard-cli --strict` 和 `git diff --check` 均通过。原生 Javadoc、依赖治理、CVE 及其余检测族尚无执行适配器和误报率验收,不能由分类、schema 或通过的单元测试推断为已支持。 - -## 2026-09-24 配置探测与智能体反馈纠偏 - -按用户最新说明,上节“逐族义务”不再表示每个项目必须逐项证明执行。28 个检测族改为候选目录;目标流程是“识别项目是否配置检查器 → Rust 调用已配置的原生工具 → 将结果和修复/配置建议送到智能体对话”。`missing/invalid/unknown` 与代码诊断、工具故障分开表达;只有批准策略要求的缺项影响交付门禁。新增对话反馈 Requirement 和 11.16 实施任务。相邻 Rust RunReport 协议升级到 1.1,新增 `checker_statuses` 并校验“未配置不能声称运行结果”,1.0 报告兼容读取;2.2 在协议测试通过后重新勾选,项目配置探测与宿主对话接线仍未完成。 - -同日继续实施 5.10 的 Maven 切片:Rust `detect` 的 `0.2.0` 报告现在按构建根返回检查器配置状态,`codeguard-adapters` 纯解析 POM,CLI 只做只读观察和 human/JSON 展示。直接声明的 Javadoc/PMD/Checkstyle/Dependency/Dependency-Check/FindSecBugs、未声明、pluginManagement、父 POM、坏 XML/DTD 和 Gradle 未解析模型均有集成样本;详情见相邻 `codeguard-cli/tests/acceptance/maven-config-discovery.md`。配置发现不执行检查器,也不代表能力矩阵可从 gap 升级。其他生态与真实对话宿主仍为未完成。 - -补充误判边界:Maven 插件显式 `skip=true` 返回 `invalid`,动态 skip 值或动态插件坐标返回 `unknown`,均不标记为 `configured`。`detect_cli` 集成测试 9 项通过;随后 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、OpenSpec 严格校验及 `git diff --check` 全部通过。默认忽略的原生 P3C 回放未在本轮重跑,且这些检查不构成 5.10 全生态完成或 11.16 宿主对话验收。 - -再次核对用户的“配置发现与对话反馈”要求后,统一命令与覆盖规格明确:实际义务来自项目已配置且可适配的检查器及批准策略,不来自 28 个候选检测族目录;未配置且非必需的 Javadoc 样本只给建议,明确必需但未配置才导致 incomplete。另将 POM 读取失败与 XML 错误区分:前者 `unknown/pom_unreadable` 且发现操作不完整,后者 `invalid/pom_invalid_xml`。本次有界观察端口回归覆盖了读取失败;修改后重新执行完整 workspace 测试、Clippy、格式检查、OpenSpec 严格校验与 `git diff --check`,均退出 0。默认忽略的原生回放仍不计入本轮验收。 - -实际运行 `cargo run --offline -q --bin codeguard -- detect tests/fixtures/p3c_native --format human` 退出 0,终端反馈 PMD `configured` 与 Checkstyle、Javadoc、Dependency、Dependency-Check、FindSecBugs 的 `missing` 和逐项下一步。这证明当前 CLI 能把**配置探测**渲染给调用它的智能体;原生检查结果尚无完整 `check` 命令,Codex/ZCode/Kimi Hook 对话接线未验收,不能将终端输出冒充 11.16 完成。 - -## 2026-09-24 运行结果对话摘要切片 - -相邻 Rust CLI 增加 `conversation_feedback`:从结构已校验的 RunReport 生成宿主可消费的 JSON/human 摘要,区分配置状态、运行状态、有效规则 ID、未完成义务和复检 argv,输出显式标记“来源尚未绑定”。自由文本原生诊断、summary 和 next_actions 不进入反馈;注入和凭据样本断言两个格式均无泄漏。RunReport 升级到 1.2,finding 要求源码/依赖/项目定位并校验相对路径和一基行列;检查器状态按构建根区分,旧 1.0/1.1 报告继续可读取。目标报告测试 14 项通过,反馈 JSON schema 与生成物顶层字段一致;详情见 `codeguard-cli/tests/acceptance/conversation-feedback-baseline.md`。这还不能代替来源校验、真实检查报告、规则公开解释或三宿主现场验收;11.16 保持未完成。 - -此切片完成后复跑 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict` 与 `git diff --check`,均退出 0。默认忽略的原生 P3C 和依赖外部环境的回放未作为本轮通过证据。 - -## 2026-09-24 Ruff 项目配置与原生规则切片 - -沿 Python 文件目录层级只读探测 Ruff 配置,依官方优先级区分 `.ruff.toml`、`ruff.toml`、含 `[tool.ruff]` 的 `pyproject.toml`,用 Rust TOML 解析器区分明确 lint、仅格式化、坏配置与未解析 extend。既有单文件 Ruff probe 新增可选的项目配置绑定;绑定时禁止沿用忽略配置的 `--isolated`,执行前后校验配置摘要,并通过原生 `--show-files` 核对目标确实被选中。未绑定模式仍只作隔离基线。 - -`detect_cli` 12 项通过;`ruff_probe_contract` 默认 4 项通过、5 项需 Ruff 的真实测试在 `/opt/anaconda3/bin/ruff` 0.16.8 上通过。原生 E501 样本证明非默认项目规则加载,被 `force-exclude` 排除的文件明确未完成;具体命令与边界见相邻 `codeguard-cli/tests/acceptance/ruff-config-discovery.md`。这不等于项目全量 Python lint、正式 `check` 或三宿主对话接线,5.10/7.2/11.16 均保持未完成。 - -随后 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 均退出 0;真实 Ruff 5 项在最终代码状态复跑也通过。新增 TOML 解析依赖的 crate 边界白名单已同步,仅允许 adapter 使用;初次全量测试发现旧发现测试按全局总数断言 Maven 六项、以及白名单未包含 TOML,均按新范围修正后复跑通过。OpenSpec 严格校验与插件 `git diff --check` 通过。原生 P3C 等其他忽略测试本轮未运行。 - -## 2026-09-24 Python 项目扫描与对话数据切片 - -相邻 Rust CLI 的库服务现按 Python 文件匹配已发现的 Ruff 项目配置,逐文件调用原生 Ruff 并保留诊断与未完成原因。发现器不再把 `.venv` 等点目录当普通源码,但仍读取 `.ruff.toml`;`python_lint_feedback` 将配置、规则 ID、行列、运行状态、修复建议和复检 argv 输出为可展示 JSON,原始原生消息不进入反馈,交付判定固定为 `not_evaluated`。无需为每个候选检测族额外生成执行证明。见相邻 `codeguard-cli/tests/acceptance/python-lint-scan.md`。 - -`python_lint_scan_contract` 默认 3 项通过、2 项忽略;在 `/opt/anaconda3/bin/ruff` 0.16.8 上真实 2 项通过,覆盖配置规则发现与排除文件不假通过。`detect_cli` 13 项通过。该切片验证时,`cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict`、插件 `git diff --check` 均退出 0。当时尚无公开项目 `lint python` 命令;后续入口见下一节。完整 Python 六类适配、已批准策略门禁及 Codex/ZCode/Kimi 宿主接线仍未完成,5.10/7.2/11.16 仍不勾选。 - -## 2026-09-24 公开 Python lint 入口 - -相邻 Rust CLI 现提供 `codeguard lint python [path] [--ruff-tool ABS_PATH] [--format human|json]` 的局部原生入口。先探测项目配置,未配置时不启动 Ruff;已配置时查找可执行文件、通过受控 runtime 读取原生版本,再逐文件调用 Ruff。JSON/human 都反馈配置、运行状态、有效规则和位置、修复建议与复检信息。工具来源尚未获批准,完整 Python 六类别与项目政策门禁未完成,因此 `tool_approval=unverified`、`delivery_decision=not_evaluated`,命令固定退出 3;它不签发局部或项目质量通过。 - -新 `lint_python_cli` 默认 5 项通过、2 项需 Ruff 的真实测试在 `/opt/anaconda3/bin/ruff` 0.16.8 上通过,覆盖缺配置不调用、缺工具、错误程序、human 输出、显式路径与 PATH 自动发现的原生 F401 到 CLI JSON。最终 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 退出 0;`cargo fmt --all` 已执行,OpenSpec 严格校验和插件 `git diff --check` 通过。三宿主自动对话接线、可信工具锁和完整策略未实现,7.2/11.16 不勾选。 - -## 2026-09-24 Ruff 报告归属与多配置回归 - -相邻 Rust CLI 新增真实嵌套配置样本:根目录 E501、子目录 F401 均仅由自身生效 Ruff 配置产生,`python_lint_scan_contract` 的真实工具样本增至 3 项通过。另用受控假 Ruff 返回混合 JSON,证实旧 `ruff_probe` 会把别的文件诊断误归到当前源文件;修复后先将报告路径解析回本次源,再过滤异源诊断。同文件有效发现仍保留,整次标记 `report_source_mismatch`/未完成,不把异源发现展示为当前文件的问题。目标反例先失败后通过,原生 Ruff 5 项回归通过。该修复只覆盖本次文件归属,工具批准、策略、全项目覆盖与宿主接线仍缺。 - -最终 `cargo fmt --all --check`、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 退出 0;真实 Ruff 的 CLI 2 项、单文件探测 5 项、项目扫描 3 项分别通过;`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 退出 0。未运行的其它外部工具测试不计入本次验收。 - -## 2026-09-24 误报白名单规格补充 - -新增精确误报白名单设计,并将匹配、可信审批、失效重审、任务归因、带例外交付决策及协议升级写入 rulepack-governance、verdict-integrity、unified-cli-contract、remediation-workflow,映射到 S02/S04/S09/S12 的未完成任务。此轮只验证文档和规格一致性;Rust 1.2 报告、CLI 命令、白名单匹配器与宿主门禁尚未实现本设计,不能声称白名单已经生效。 - -`openspec validate introduce-rust-codeguard-cli --strict` 与 `git diff --check` 均退出 0。本次未改 Rust 源码,因此未把既有 Rust 测试作为白名单实现证据。 - -## 2026-09-24 误报白名单精确身份匹配切片 - -相邻 Rust Core 新增精确身份模型与纯比较函数:源码路径/内容,或依赖组件/版本/图/advisory,连同 finding、原生规则、工具、适配器和 rulepack 身份必须完全一致;通配、越界与缺摘要失败。目标契约测试先因接口缺失失败,随后 5 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check` 均退出 0。详见 `codeguard-cli/tests/acceptance/false-positive-identity-baseline.md`。此函数不验证批准,不能改变 gate;OpenSpec 4.8 及后续协议/宿主/验收任务仍未完成。 - -该切片随后补充版本化候选 schema 与 Rust 严格解析器:6 个目标契约测试先因接口/schema 缺失失败,随后通过;补充未知检查类别反例也先失败后通过。全工作区测试、Clippy、`cargo fmt --all --check`、OpenSpec 严格校验与插件 `git diff --check` 均通过。`approved=true`、坏身份、无期限、错 kind/版本和缺复现/批准引用均不能形成合法候选。解析成功仍不验证批准来源或到期时钟,不能接入放行门禁;4.8 仍保持未完成。 - -继续实现候选集合纯筛选:四个目标测试先因接口缺失失败,后共 10 项通过;同一精确身份的两条候选即使其中一条已过期仍报冲突,缺上下文、策略修订不符、未来生效、到期和超过政策期限上限均拒绝进入权威核验。`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、OpenSpec 严格校验与插件 `git diff --check` 均通过。返回的 `ReadyForAuthorityCheck` 不是批准;可信策略/时钟来源、批准凭据、同 PR 自批与门禁接线仍缺,4.8 不勾选。 - -## 2026-09-24 RunReport 1.3 误报处置消费协议 - -新增 RunReport 1.3 的原始/已处置/活跃阻断集合与 `allow_with_exceptions` 结构消费,conversation feedback 0.2 对话摘要显示批准引用和到期时间并注明来源未核验;局部检查、另一真实阻断、另一未完成义务、错策略修订、重复处置、坏引用及未完成的原检查均有反例。7 项目标测试先因字段缺失失败,随后通过;旧报告 14 项回归及全工作区测试、Clippy、fmt 均通过。详见相邻 `codeguard-cli/tests/acceptance/run-report-allowlist-protocol.md`。这尚不是可信报告生产或全格式宿主门禁,2.10/12.12 保持未完成。 - -## 2026-09-25 批准快照字节绑定切片 - -相邻 Rust CLI 增加 `approval-snapshot:1.0` 严格协议与纯比较器。候选须存在于快照的 ID/原始字节摘要集合,快照须与外部预期摘要一致,并与传入的原生发现身份精确匹配;候选更改批准文字、同次新增、快照篡改、重复条目、未知字段、不同原生发现、缺时钟和到期均有拒绝测试。目标测试先因模块不存在失败,随后 7 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、OpenSpec 严格校验及插件 `git diff --check` 均退出 0。`BoundToPinnedSnapshot` 只证明输入间绑定:外部摘要可能由项目自行计算,调用方传入的 finding/时钟来源也尚未核验,所以不签发批准或交付放行。4.5/4.8/12.12 仍未完成。 - -## 2026-09-25 分层质量评测纯计算切片 - -相邻 Rust Core 新增 `evaluate_quality`,按 cohort/语言/类别/适配器分层统计 TP/FP/FN、precision/recall 和双侧 95% Wilson 区间。零发现不可估计,争议/未裁定、覆盖差异、未完成和工具故障误判单列;真问题漏报与假通过失败,任一分层未达或证据不足不由其它层平均覆盖。目标测试先因模块缺失失败,扩展后 8 项通过。详见 `codeguard-cli/tests/acceptance/quality-evaluation-baseline.md`。正式 12.2 冻结配置和 12.11 真实回放尚无证据;12.10 仍不勾选。 - -## 2026-09-25 点前缀范围汇总切片 - -相邻 Rust `detect` 的 DiscoveryReport 升级为 0.3.0,普通发现点前缀排除根和配置例外文件在 `scope_summary` 中按总数显示,不输出普通排除路径的逐文件报告;入库安全明确 `not_evaluated`。`.hidden.py`、`.hidden_dir`、`.env` 及两项配置例外的目标测试先因旧协议失败,随后 `detect_cli` 14 项通过。详见 `codeguard-cli/tests/acceptance/dot-prefix-scope-baseline.md`。这不是 F18 全部验收:Git 安全例外和完整检查范围仍缺,4.6 不勾选。 - -## 2026-09-25 Git index 路径安全预览 - -相邻 Rust Core 实现旧插件入库路径政策的纯判定;Rust CLI 通过受控 Git 原生命令按 NUL 协议读取真实 index,校验记录、对象格式、阶段、OID 和前后列表,并尊重替代 `GIT_INDEX_FILE`。公开 `codeguard gate pre-commit` 只报告拟提交路径违规,固定 3/incomplete/not_evaluated;公开预览 schema 不含 allow。纯路径测试 3 项、真实 Git/CLI 测试 9 项通过,含真实 SHA-256 仓库;目标测试先因模块缺失失败,随后通过。全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。Git 工具批准、对象内容、完整质量义务、真实 Hook/pre-push/CI 与宿主接线仍缺,相关任务均未勾选。 - -## 2026-09-25 Git index blob 字节核验增量 - -相邻 Rust CLI 增加受控 `git cat-file --batch-check/--batch`,独立按 Git blob framing 重算 SHA-1/SHA-256 OID,记录脱敏的内容 SHA-256、长度与类型;symlink、gitlink、LFS 指针、超出预算或读取失败保持 unresolved,且路径违规不会因对象读取失败消失。公开预览 schema 升至 0.2.0,区分 verified/unresolved/failed/not_observed,仍固定 3/incomplete/not_evaluated。真实 Git/CLI 目标测试 13 项通过,含暂存与工作树字节分离、特殊对象和超预算失败;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/git-index-safety-preview.md`。Git 工具批准、工作树/ref 原子快照、完整质量义务及真实 Hook/CI 仍缺,相关任务未勾选。 - -## 2026-09-25 白名单候选只读查询切片 - -相邻 Rust CLI 接入 `rules whitelist list/explain --candidate FILE`;候选文件经既有严格解析器校验,输出始终 `authority=unverified`、`gate_effect=none`,不回显自由文本依据。错误文档、重复 ID 或不存在的 explain 目标为 incomplete/退出 3;有效查询退出 0 只表示查询完成。目标测试先因命令不存在失败,随后 `whitelist_command_contract` 4 项通过;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/whitelist-candidate-inspection.md`。自动发现、propose、可信批准及本次原生 finding 的门禁绑定仍缺,4.9 与 12.12 未勾选。 - -## 2026-09-25 `init` 工作区预览与局部 apply - -相邻 Rust CLI 接入 `init` 的默认只读预览和显式 `--apply`:复用静态发现,生成项目画像、仅有 contains 边的模块图及用户指定的工作区目录;受管文件预检冲突、逐项创建并记录已创建目录/文件,现有 AGENTS 人工内容不触碰。为维持重复 init 的稳定性,普通发现精确排除受管文件及记录目录,仍保留 `codeguard/src` 用户源码。目标测试先因命令缺失失败,随后 `init_command_contract` 7 项通过;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 退出 0。见 `codeguard-cli/tests/acceptance/init-workspace-preview.md`。该实现缺 AGENTS 受管摘要、准备任务、可信策略、画像刷新及完整来源身份,apply 固定 partial/退出3;9.1/9.2/9.15–9.25 仍未勾选。 - -## 2026-09-25 AGENTS 受管摘要增量 - -相邻 Rust CLI 在 `init --apply` 时生成根 AGENTS Codeguard 区块,链接项目画像、模块图和架构观察,仅引用已生成文件的 SHA-256 与当前可用命令,不复制项目自由文本。规划时解析成对 marker,写前再次核对 AGENTS 原字节,保留区块外人工内容/其它工具块及原权限;异常/重复 marker、人工改写、符号链接或规划后字节变化均返回冲突。为避免自身生成的 AGENTS 造成画像循环漂移,普通发现精确排除根 AGENTS;Git 入库安全入口仍独立。目标测试先因行为缺失失败,随后 `init_command_contract` 11 项与规划后修改单测通过。跨外部编辑器的强制并发锁、刷新事务、准备任务及完整检查仍缺,相关任务保持未勾选。 - -## 2026-09-25 画像刷新与白名单纠错边界 - -相邻 Rust CLI 将工作区/画像/init 计划协议升级为 0.2,记录受管投影摘要、清单和锁文件字节摘要,以及源码路径集合摘要。重新 init 可以刷新仍与旧摘要一致的投影和 AGENTS 区块;人工修改或无效工作区身份返回冲突,workspace 最后更新,findings/tasks 保留。刷新目标测试先因旧实现失败,随后 `init_command_contract` 17 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings` 和 `cargo fmt --all --check` 通过。OpenSpec strict 与插件 `git diff --check` 通过。9.23 的规则配置语义、完整源码关系和强制跨进程锁尚未实现,继续未勾选。 - -补充误报白名单的纠错分流:精确误判才走候选和独立批准;系统性规则不适用走规则包修订,真实问题走风险接受,工具/配置/覆盖问题保持 incomplete。现有 `rules whitelist list/explain` 仅检查候选结构,固定 `authority=unverified`、`gate_effect=none`;未实现可信批准及本轮 finding 的门禁绑定,不声称白名单已放行。 - -## 2026-09-25 规则配置刷新与版本语义增量 - -相邻 Rust CLI 将 Ruff/预提交配置的原始字节 SHA-256 加入项目画像;同名配置的新增、修改、删除触发受管刷新,无法有界读取时 `observation_complete=false` 且 `profile_stale=null`。`package.json` 的包版本独立存为 `package_declared_versions`,语言目标版本仍为 unknown,不据包版本选择检查规则。规则变更与包版本目标测试先因旧行为失败,随后 `init_command_contract` 20 项通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件 `git diff --check` 均退出 0。其它语言配置和源码关系尚未完成,9.23 不勾选。 - -## 2026-09-25 受管刷新恢复反例 - -相邻 Rust CLI 新增 AGENTS 区块外人工文本保留及“画像已更新、workspace 标记仍旧”的中断重试契约;重试可继续完成并在下一次运行保持幂等。`init_command_contract` 增至 22 项且通过。完整事务日志、外部编辑器的强制并发保护与其它语言配置仍未完成,9.21–9.23 保持未勾选。 - -## 2026-09-25 跨语言精确配置输入观察 - -相邻 Rust adapter 读取旧语言清单的 `linter_config_files` 候选字段;discover 只读取其中精确单文件名,包含受配置发现例外保护的点文件,不遍历普通点前缀源码。注册表解析拒绝通配、路径穿越、控制字符与同语言重复配置名。`checkstyle.xml`、`eslint.config.mjs` 与 `.eslintrc` 的变更均使 init 画像过期;存在配置文件不升级为“检查器已配置”。相关测试先因旧实现缺失失败,随后 `init_command_contract` 24 项、`detect_cli` 14 项及 adapter 注册表目标测试通过;全工作区 `cargo test --workspace --offline -q`、Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。嵌套点目录、未登记配置、实际规则解析和源码关系仍缺,9.23 继续未勾选。 - -## 2026-09-25 Python 局部修复提示与输入失效 - -相邻 Rust CLI 的 Python Ruff 局部反馈升为 0.2:完成的 F401/E501 提供限定文件、扫描前源码摘要、谨慎修复步骤与原工具复检条件;未知规则只给调查提示,原生自由文本不进入对话。若后续文件扫描改动先前源码或 Ruff 配置,受影响文件转为 incomplete,原诊断保留待复查且不产生可执行修复提示。模拟原生工具跨文件改动的反例通过,`python_lint_scan_contract` 5 项普通与固定 Ruff 0.16.8 的 3 项原生测试均通过;全工作区测试及 Clippy 通过。该局部提示不构成持久 RepairBrief、可信白名单或完整交付门禁;7.2、9.7、12.12 保持未完成。 - -## 2026-09-25 白名单候选身份纠错查询 - -相邻 Rust CLI 的 `rules whitelist explain` 可选择显式观察身份文件,复用核心精确匹配并报告身份相同或失配。坏观察文件、坏候选、重复 ID 和不同 ID 重复处置同一身份均不展示有效匹配;schema 0.2 固定 `authority=unverified`、`gate_effect=none`。发现身份文件是普通本地输入,并非本轮原生检查证据;匹配不能作为批准。`whitelist_command_contract` 6 项、全工作区测试与 Clippy 通过,OpenSpec strict 与 `git diff --check` 通过。可信身份来源、候选期限/审批核验、propose、config validate 和真实门禁仍缺,4.8/4.9/12.12 未勾选。 - -## 2026-09-25 Ruff 局部稳定发现身份 - -相邻 Rust CLI 对本轮完成且源码稳定的 Ruff 诊断生成行号无关的 `finding_id`/完整指纹。源码行锚点、原生规则与私有消息摘要共同区分同文件问题;跨文件、跨规则或重复同源诊断不误合并。两项身份单测与固定 Ruff 0.16.8 双轮扫描验证:前插一行后 ID 不变而文件 SHA-256 改变;无法核对定位或输入变化时不签发身份。`python_lint_feedback` 升至 0.3,仍固定局部 `not_evaluated`。持久归并、重命名匹配、环境 blocker 和复检关闭尚未实现,9.3 未勾选。 - -## 2026-09-25 工作区 ID 与局部报告绑定 - -相邻 Rust `workspace.json` 0.3/init 计划 0.3 加入稳定 `workspace_id`,刷新沿用既有身份;旧版工作区能升级且不清理 findings,损坏身份拒绝刷新。`lint python` CLI 反馈 0.4 在工作区有效时引用该 ID,未初始化、旧版未绑定和损坏状态分开报告;始终为局部 `not_evaluated`。目标 `init_command_contract` 25 项、`lint_python_cli` 6 项普通测试及固定 Ruff 0.16.8 的 2 项真实 CLI 测试通过;全 Rust 工作区测试、Clippy、fmt、OpenSpec strict、插件 diff 检查均通过。此处只完成未来 `(workspace_id, run_id, report_digest)` 导入键的前置身份,不表示 `work sync` 已实现;9.4 保持未完成。 - -## 2026-09-25 Ruff 报告持久同步与自动串接 - -相邻 Rust CLI 加入 `work sync` 初版及已初始化 `lint python` 的自动保存→同步链路。脱敏局部报告保存在 Git 忽略的 reports,按 workspace_id/run_id/原报告字节摘要核对;完整且源码仍匹配的 Ruff finding 创建首次 fact、observed event 和任务 Markdown,重复扫描只更新 Git 忽略的消费标记。写入先暂存并同步到忽略的 state 后硬链接创建目标,标记最后持久化;标记丢失重试、旧源码历史化、同 run ID 摘要冲突、坏报告与好报告并存均有反例。固定 Ruff 0.16.8 的真实两轮扫描只生成一张任务;记录目录不可用时 CLI 仍显示原生 F401 并报告 `backlog_update_failed`。任务不含原生消息,所有同步结果 `not_evaluated`/退出 3。`work_sync_contract` 4 项普通和 2 项固定 Ruff 原生测试、全 Rust 工作区测试、Clippy、fmt、OpenSpec strict 与插件 diff 检查通过。见相邻 `codeguard-cli/tests/acceptance/work-sync-ruff-baseline.md`。该切片尚无环境 blocker、跨类别 RunReport、完整事件状态机、attempt/lease、`next` 和复检门禁,相关 9.3–9.14/11.16 仍未完成。 - -## 2026-09-25 白名单纠错规则体系补充 - -在既有精确误报白名单设计上,明确了白名单只位于原生 finding 之后的处置层、单点误报与系统性规则误报的不同纠正路径,以及候选/驳回/批准/过期/撤销/失配与稳定任务的关联。OpenSpec 增加系统性误报和撤销反例,tasks 新增 4.10;白名单前原始发现与人工裁定仍纳入误报/漏报评测。本轮为设计与规格更新,未改变 Rust CLI 行为,可信批准、纠错事件流与真实门禁仍未实现。 - -`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。 - -## 2026-09-25 Ruff 环境 blocker 持久归并 - -相邻 Rust CLI 的 `work sync` 对 Ruff 局部 `incomplete` 文件新增稳定环境 blocker:同构建根、同原因归并多个文件,不同构建根分别建任务;每轮观察事件保留受影响路径。缺工具与缺配置的真实 CLI 反例产生环境准备任务,不伪装成源码违规或质量通过。同步预览 schema 升至 0.2,新增 blocker record/event schema;`lint python` 对话反馈的 `backlog_sync` 新增 `new_blockers`。详见相邻 `codeguard-cli/tests/acceptance/work-sync-ruff-blockers.md`。 - -`work_sync_contract` 7 项普通测试及固定 Ruff 0.16.8 的 2 项显式原生测试、Rust 全工作区测试、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均通过。跨语言工具链依赖、正式任务依赖图、复检关闭和完整门禁仍缺,9.3/9.6/9.7 保持未完成。 - -## 2026-09-25 本地只读 next 简报预览 - -相邻 Rust CLI 新增 `codeguard next [path] --format human|json`,从工作区 Ruff finding/blocker 事实生成结构化局部简报。未初始化提示 init;未消费报告先提示 sync;任务空但无全量认证证据时返回 verification_required。缺配置要求决策,缺工具指向环境准备;源码内容变化后不再推荐旧修复步骤。任务 Markdown 自由文本不进入简报,损坏事实和消费标记不能被解释成可交付。协议固定 `authority=local_unverified`、`delivery_decision=not_evaluated`;成功 exit 0 只表示视图完整。见相邻 `codeguard-cli/tests/acceptance/next-local-brief-preview.md`。 - -`next_command_contract` 6 项、Rust 全工作区测试、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均通过。完整 status/show、任务依赖/租约/attempt 预算、版本化 recipe、跨类别选择及任务关闭仍缺,9.7、9.13、9.26 保持未完成。 - -## 2026-09-25 Python 扫描自动返回局部简报 - -相邻 Rust `lint python` 现在复用 `next` 的只读服务,在已初始化工作区的本地报告保存与同步成功后,直接把结构化下一步放入同一 CLI 对话反馈。公开版本为 0.5,私有本地报告仍为 0.4;失败时分别呈现 backlog 与简报读取状态,不丢原生诊断。缺配置的普通 CLI 测试得到 needs_decision;固定 Ruff 0.16.8 的真实 F401 扫描在同一响应中得到 actionable 简报。见相邻 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md`。 - -`lint_python_cli` 8 项普通与 3 项显式原生 Ruff 测试通过;这仅证明 Rust CLI 内的 Python/Ruff 局部链,插件 Hook/MCP、多语言检测族、可信策略与完整交付门禁仍未完成,9.13/11.16 不勾选。 - -## 2026-09-25 Ruff 任务原工具复检观察 - -相邻 Rust CLI 新增 `codeguard task verify `,复用公开 Python/Ruff 的同一原生扫描路径,保存本轮局部报告、同步新发现,并为原任务追加 `verification_observed` 事件。`next` 核对任务、工作区、事件和报告摘要后,才将原问题缺失或环境恢复显示为待策略核验候选;再次扫描检出问题会恢复待处理指引。本地忽略的复检报告在另一机器缺失时,不沿用未核验的恢复结论。fact 始终 open,CLI 固定 `local_unverified`、`not_evaluated`、退出 3,不能因此签发白名单或关闭任务。 - -`task_verify_contract` 的 5 项普通测试、固定 Ruff 0.16.8 的 2 项显式原生测试、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check` 均通过。见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`。可信工具/规则/覆盖、任务租约与 token、正式 resolved/reopen、跨类别复检仍缺,9.10 保持未完成。 - -## 2026-09-25 白名单候选缺证据边界 - -复核现有 `codeguard/findings` Ruff fact 与误报候选 schema 后确认:fact 只存首次规则、路径和发现指纹,缺本轮工具制品、适配器、rulepack 身份,不能安全拼成可批准候选。已在白名单设计、rulepack-governance、unified-cli-contract 与任务 4.9 固化 `propose` 的前置条件和反例:证据不全返回未完成及补证据动作,不猜测摘要、不写候选、不改变门禁。`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 通过。此时只更新规格;命令预览进展见下一节。 - -## 2026-09-25 白名单 propose 缺证据预览 - -相邻 Rust CLI 已实现 `rules whitelist propose [path]` 的保守入口:读取稳定任务并返回复检命令与本轮缺失的工具/适配器/rulepack 身份;环境 blocker 和未知任务不能产生候选。输出协议固定 `candidate=null`、`authority=unverified`、`gate_effect=none`、`not_evaluated`、退出 3,不写 decisions。目标测试先因命令不存在失败;实现后 2 项普通测试及固定 Ruff 0.16.8 的 1 项显式原生测试、Rust 全工作区测试、全目标 Clippy 和 fmt 通过。见相邻 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`。完整候选生成、批准来源与门禁仍未实现,4.9 保持未完成。 - -## 2026-09-25 Ruff 完整文件的工具与配置观察摘要 - -相邻 Rust 扫描结果仅对原生证据完整且输入稳定的文件携带本轮工具/配置字节 SHA-256;扫描结束后再复核工具,身份变化使相关文件 incomplete 并清空摘要。公开反馈 0.6、本地持久报告 0.5;同步器兼容旧 0.4,但新版完整文件缺有效摘要或未完成文件虚报摘要均拒绝导入。局部 `next` 接受两版复检报告,保留原任务 open。`lint_python_cli` 8 项普通/3 项真实 Ruff、`python_lint_scan_contract` 5 项普通/3 项真实 Ruff、`work_sync_contract` 8 项普通及 `task_verify_contract` 5 项普通/2 项真实 Ruff 测试通过;全 Rust 工作区测试、Clippy、fmt 与 JSON 语法检查通过。见相邻 `codeguard-cli/tests/acceptance/ruff-observed-artifact-identity.md`。这不是可信工具批准;适配器、rulepack、候选绑定及完整门禁仍缺,相关 4.8/4.9/5.2/9.10 保持未完成。 - -## 2026-09-25 propose 最新本地观察绑定 - -相邻 Rust `rules whitelist propose` 预览升至 0.2:只选择最新的本地 Ruff 报告,先核对工作区、结构化报告、当前源码与已同步标记,再展示同一稳定 finding 的报告/源码/工具/配置摘要。真实 Ruff 测试先因旧预览不含观察而失败;实现后覆盖最新观察、较新报告未同步、源码变化及新扫描问题消失,均不会用旧记录生成候选。2 项普通与 1 项真实 Ruff 目标测试通过。`candidate=null`、退出 3、`not_evaluated` 保持不变;`rulepacks/` 当前只有旧语言清单,不能用配置摘要冒充受批准 Ruff rulepack,适配器及可信批准身份仍缺,4.8/4.9/12.12 不勾选。见相邻 `codeguard-cli/tests/acceptance/whitelist-propose-incomplete-preview.md`。 - -## 2026-09-25 Ruff 候选规则映射观察身份 - -相邻 Rust 工程加入 `rulepacks/ruff_lint_preview_v1.json`,精确映射 Ruff 0.16.8 的 F401/E501,记录版本、来源、许可、原生/CodeGuard 规则 ID 与原始字节 SHA-256,状态固定 `candidate_unapproved`。解析拒绝通配、重复、错误来源/许可和自批准。完整局部报告 0.6 仅在版本匹配且 finding 原生规则已映射时附观察身份;未知规则及版本不匹配仍保留原生诊断但无映射。同步器拒绝改写映射摘要;公开反馈为 0.7。`propose` 0.3 从最新已同步、源码及配置未变的报告展示该观察,并明列 `approved_rulepack_identity` 缺失,固定 `candidate=null`、门禁 none、退出 3。见相邻 `codeguard-cli/tests/acceptance/ruff-rulepack-observation.md`。 - -`ruff_rulepack_contract` 3 项、`work_sync_contract` 普通测试、`lint_python_cli` 8 项普通与 3 项真实 Ruff、`whitelist_propose_contract` 2 项普通与 1 项真实 Ruff 均通过;Rust 全工作区离线测试、全目标 Clippy `-D warnings`、fmt、四个 JSON 文件语法检查、OpenSpec strict 和插件 `git diff --check` 通过。P3C 等未显式运行的原生忽略测试仍不计入本次证据。候选清单不配置 Ruff 覆盖,不具受保护批准或可信策略身份,4.3/4.8/4.9 均保留未完成。 - -## 2026-09-25 Ruff 原生设置与规则覆盖缺口 - -相邻 Rust runtime 在配置项目的 Ruff 0.16.8 扫描中新增 `check --show-settings` 原生步骤;受限解析器只提取 F401/E501 全局启用状态、是否配置逐文件忽略和设置输出摘要。公开反馈升为 0.8、本地报告升为 0.7;二者均明确 `coverage_proven=false`。设置输出损坏或找不到、规则未启用却返回相应诊断时,局部扫描 incomplete 并保留已有诊断。同步器仅对 0.7 完整文件接受结构有效且不自称覆盖已证明的设置观察;缺失或伪称的报告拒绝导入。真实 Ruff 的 E501/F401、逐文件忽略及原任务复检链均通过,见相邻 `codeguard-cli/tests/acceptance/ruff-effective-settings-observation.md`。 - -适配器解析 2 项、局部扫描 6 项普通及 4 项真实 Ruff、同步 10 项普通、`lint_python_cli` 8 项普通及 3 项真实 Ruff、白名单 propose 1 项真实 Ruff、任务 verify 2 项真实 Ruff测试通过;Rust 全工作区离线测试与全目标 Clippy通过。`noqa` 与其它原生 suppression、批准 required rule 集合、完整目标覆盖及可信门禁仍缺,OpenSpec 5.4/7.2 保持未完成。 - -## 2026-09-25 Ruff 源码注释抑制原生对照与任务复检 - -相邻 Rust runtime 对配置项目的 Ruff 0.16.8 在普通 JSON 扫描后以同一总截止时间执行 `--ignore-noqa` 原生对照,校验工具/配置/源码、报告归属及普通诊断包含关系;损坏或矛盾的对照不能变成干净证据。公开反馈升为 0.9、本地报告升为 0.8;仅被注释抑制且无活动 finding 的文件标记 `suppressed`,公开展示对照摘要、抑制数和规则 ID,但抑制诊断不生成活动 finding。`task verify` 预览/事件升为 0.2:原 F401 添加 `# noqa: F401` 后返回 `suppression_requires_review`,`next` 要求核查抑制,原 fact 保持 open;真正移除违规仍只形成待策略核验候选。见相邻 `codeguard-cli/tests/acceptance/ruff-native-suppression-observation.md`。 - -固定 Ruff 0.16.8 原生样本已验证 `# noqa`、`ruff: ignore`、文件级注释抑制与无抑制行为;`python_lint_scan_contract` 5 项真实样本、`lint_python_cli` 4 项真实样本及 `task_verify_contract` 5 项真实样本通过。额外真实反例证明禁用原规则与新增逐文件 ignore 都不会被当成修复。同步器 0.8 缺抑制观察或伪称计数的反例通过。Rust 全工作区离线测试、全目标 Clippy `-D warnings`、fmt、三个更新 schema JSON 语法检查、OpenSpec strict 和插件 `git diff --check` 均退出 0;真实 human CLI 对 `# noqa` 显示 `suppressed`、抑制数 1、退出 3 和 `not_evaluated`。批准策略、逐文件配置忽略的精确目标归属、完整覆盖及正式交付门禁仍缺,4.2/5.4/7.2/9.10 不勾选。 - -随后收紧 0.8 本地报告导入:`suppressed` 必须有非零抑制差额且无活动 finding,普通 `passed` 不能隐藏抑制;旧报告不能凭新增状态绕过。合法 `suppressed` 可同步但不产生新活动 finding。`work_sync_contract` 11 项普通测试和全目标 Clippy 通过;这项校验不把本地报告提升为可信交付证据。 - -## 2026-09-25 C06 只读计划预览 - -相邻 Rust CLI 新增 `codeguard plan <类别|check> <语言|all> [path]`,优先校验类别与 canonical 语言 ID,然后复用静态项目发现。预览 0.1 列出选中类别、语言、检查器配置、待定候选和未解析条件;`policy_identity=null`、`obligations=[]`、候选命令 null,固定 `not_evaluated` 与退出 3。它不伪造正式 CheckPlan、批准规则或原生执行能力。见相邻 `codeguard-cli/tests/acceptance/plan-readonly-preview.md`。 - -目标测试先因命令缺失失败;实现后首 2 项通过,含伪造 Ruff 工具不执行、项目目录不新增文件、非法类别与未知语言在观察前返回 2;随后增补 P3C 静态候选反例,现为 3 项。`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all` 与新 schema JSON 语法检查通过。可信策略、完整义务/DAG、工具锁和正式计划身份仍缺,2.1/2.4/2.7 保持未完成。 - -## 2026-09-25 Maven P3C 静态配置独立识别 - -相邻 Rust `detect` 将 `java.maven.p3c` 与通用 `java.maven.pmd` 分开。明确的 P3C 2.1.1 制品依赖、已核对的内置规则路径和 `skipPmdError=false` 形成静态 configured;缺项、动态值和处理错误跳过有独立状态及恢复动作。测试先因没有 P3C 检查器项失败,随后 `detect_cli` 的正反例及 `plan_preview_cli` 的 Java 候选测试通过。见相邻 `codeguard-cli/tests/acceptance/maven-config-discovery.md`。此处只确认直接 POM 声明,未验证 Maven effective model 或原生规则运行,5.10/6.2 保持未完成。 - -全工作区测试首次指出不可读 POM 的静态检查器数由 6 增至 7;修正该旧断言后全工作区测试退出 0。随后补齐父 POM 下直接 PMD 声明的保守 unknown 反例,定向 `detect_cli` 16 项与 `plan_preview_cli` 3 项、全目标 Clippy、OpenSpec strict、插件 `git diff --check` 均通过。此补充没有重新执行显式 ignored 的原生 Maven/P3C 哨兵,不将静态配置探测当作原生运行证明。 - -## 2026-09-25 冻结义务清单对照 - -相邻 Rust Core 的交付判定增加应有义务 ID 与实际计划的集合对照。新的反例先证明旧代码会在遗漏 `java/cve` 时给出 `Allow`;实现后漏项、额外项与重复冻结 ID 都为 incomplete,`conclude_check` 还把漏项带到请求退出 3。见相邻 `codeguard-cli/tests/acceptance/frozen-obligation-ledger.md`。这只是纯领域一致性校验,可信清单来源及正式 CLI 接线未实现,OpenSpec 2.4 保留未完成。 - -`delivery_gate_contract` 14 项、`check_session_contract` 6 项及 `cargo test --workspace --offline -q` 全部通过;`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 退出 0。显式 ignored 的原生外部工具测试不计入此轮执行证据。 - -## 2026-09-25 C09/C10 只读配置观察与白名单自授权隔离 - -相邻 Rust CLI 新增 `config validate/explain [path]` 的保守入口:有界只读解析旧 `codeguard.json` 和结构化工具锁,计数并标记旧 `exclude`、`gate_scope=delta`、`java.commands` 为待批准迁移;未知/损坏字段、坏工具锁和符号链接为未完成。项目内伪造 `codeguard/decisions/` 批准无效。输出协议 `config_inspection` 0.1 固定 `authority=unverified`、`gate_effect=none`、`effective_policy=null`、`not_evaluated` 与退出 3。目标测试先因命令缺失失败,实施后 6 项通过,见相邻 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`。 - -`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 均退出 0。完整可信质量策略、正式 config schema 迁移、原生配置差异、白名单独立审批和真实交付门禁未接通;4.1、4.2、4.5、4.7、4.9、12.12 均保持未完成。 - -## 2026-09-25 质量策略候选协议与工具锁引用 - -相邻 Rust CLI 增加 `quality-policy-candidate` 1.0 严格解析与 `config validate/explain --policy-candidate FILE` 只读展示。候选要求非空必需检查、已登记语言/检测族、具体规则与源集、阻断严重度、规则包/工具锁摘要、CVE 库时效和测试要求。候选源码排除限定精确单文件路径、内容摘要、结构化原因和到期字段;未知字段、自写批准、通配/路径穿越、重复或空义务均拒绝。工具锁原始字节相符显示 `matched_untrusted`,失配显示 `mismatch`,均不赋予策略权威。`config_inspection` 升至 0.2,含请求 ID、命令状态与警示,固定 `effective_policy=null`、`gate_effect=none`、退出 3。设计与测试见相邻 `codeguard-cli/tests/acceptance/config-readonly-inspection.md`。 - -新增 7 项质量策略候选测试与 6 项配置观察测试通过;最终代码状态的 `cargo test --workspace --offline -q` 全工作区回归、全目标 Clippy、fmt、两个 JSON schema 语法检查、OpenSpec strict 与插件 `git diff --check` 均退出 0。部分依赖外部原生工具的测试按显式 ignored 保持未运行,不能算本轮验收。可信基线/批准来源、同 PR 策略变更隔离、有效策略绑定、逐项原生配置差异、规则/覆盖和交付门禁仍缺,4.1、4.5、4.7、4.9、12.12 不勾选。 - -## 2026-09-25 公开 Java P3C 单文件原生诊断 - -相邻 Rust CLI 新增 `lint java FILE` 局部入口,用固定的 Maven PMD 3.11.0/P3C 2.1.1/PMD 6.15.0 配置,在私有临时项目中复制单个 Java 输入并通过统一 runtime 调用原生 Maven;固定 `-o` 和显式离线仓,前后复核源码、复制件、POM/settings、Maven/JDK 入口及仓库树。公开只展示规则/规则集/位置,不回显原生消息。结构报告 `java_p3c_local_feedback` 0.1 固定 `coverage_proven=false`、`checker_identity=unverified`、`delivery_decision=not_evaluated`、退出 3。假 Maven 退出 0 却不生成报告、错误仓库摘要及复制源码被修改均为未完成。 - -本机 4.4 GiB 通用 Maven 仓超过运行时 512 MiB 树预算,故从已缓存制品复制出 340 MiB 测试仓,并在 `-o` 下先验证真实 Maven 生成含 `ClassNamingShouldBeCamelRule`/`AlibabaJavaNaming` 的 XML。其观测树摘要为 `ead9fd901ba10e3bddf60cc3543b64839d7650f967326b2c94b9442d556cedef`;以该临时仓显式运行 `java_p3c_cli` 的两个原生 ignored 测试,违规样本返回结构化 finding,干净样本返回 `clean_scope_unproven`,两者均退出 3,测试退出 0。原生测试仓和显式摘要只是本地观察,不构成独立批准或离线网络隔离证明。详见相邻 `codeguard-cli/tests/acceptance/java-p3c-cli-native-local.md`。 - -正式多模块扫描、有效项目原生配置/覆盖证明、工具与规则批准身份、finding/task 同步、Java 注释/CVE/安全/构建及 `check java/check all` 仍缺;5.4、6.2、6.6、6.7 保持未完成。 - -进一步用同一 340 MiB 仓和 JDK 26 显式复跑原有 `p3c_native_replay --ignored`:违规、干净和坏规则集三项原生哨兵及执行前后树摘要均通过。新增 Java 分派首次全工作区回归暴露 Python `lint` 参数截断;已修正分派,并把未知语言反例改为 Ruby。修正后 Python 与 Java 两组目标测试、最终代码的全工作区离线测试、全目标 Clippy、fmt、JSON schema 语法检查、OpenSpec strict 和插件 `git diff --check` 退出 0。随后仅调整 human 输出去掉 JSON 引号,目标测试与 Clippy 再通过;真实 human CLI 在最终代码上显示 `Bad_Name.java:1 ClassNamingShouldBeCamelRule` 与未核验提示,命令退出 3。未把任何局部结果算作交付允许。 - -## 2026-09-25 误报白名单撤销快照切片 - -相邻 Rust `approval-snapshot` 增加 1.1 协议与必填 `revoked_decision_ids`。被撤销的决策即使其原字节摘要还在快照中也返回 `Revoked`;同一修订可固定替代候选,重复/通配撤销 ID、1.1 缺字段及 1.0 越权添加撤销字段使快照无效。旧 1.0 快照仍可读取。目标测试先因缺 `Revoked` 变体编译失败,实施后 10 项通过;全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。撤销表达仍只证明本地快照与候选输入之间的关系;可信快照来源、修订历史事件、独立批准、真实门禁和任务重开未接通,4.8、4.10、12.12 仍未完成。 - -## 2026-09-25 重复扫描的本地证据与审计事件去重 - -相邻 Rust `work sync` 修正同一 Ruff finding 的重复扫描证据:每轮当前源码匹配的发现都在默认忽略的 `state/observations//.json` 记录报告与源码摘要、位置和工作区身份;相同内容不重复改 tracked finding/task/event。复检后重新检出只增加一次恢复观察事件,后续相同扫描继续记本地证据。坏报告、过时源码仍不生成当前问题或认证。目标测试先因缺第二轮观察失败,复检去重反例先因第四轮多出事件失败;实现后十轮扫描只保留一个问题、一个任务、一条首次事件与十份本地观察,复检后重现只多一条事件,消费标记丢失重试幂等。 - -`work_sync_contract` 12 项普通测试及固定 Ruff 0.16.8 的两项原生测试通过;最终状态的全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。当前本地观察不作为可信规则/工具批准或交付证据,跨语言同步、重命名、父事件关系、并发事务与正式关闭仍缺,9.3–9.5 保持未完成。 - -## 2026-09-25 Unix 本地任务租约基础 - -相邻 Rust CLI 新增 `task claim/heartbeat/release`:在 runtime 的独占文件锁下,以稳定任务 ID 串行化本地状态;32 字节随机 token 只返回领取者,本地仅保存 token SHA-256,generation 防止同名 owner 的旧 token 操作新租约。默认期限 5 分钟,释放同 token 可幂等重放,过期且没有公开 attempt 状态时可被新一代领取。无效任务不建锁、符号链接状态拒绝、四进程并发只有一个领取成功;锁繁忙立即返回未完成,不无限等待;所有输出均固定 `local_unverified`/`not_evaluated`。目标测试初次因命令不存在失败,随后 6 项通过。首次全工作区测试暴露 CLI 直接依赖 libc 违反 crate 方向;已将文件锁移至 runtime,crate 边界测试与全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict、插件 `git diff --check` 均退出 0。之后补充非阻塞锁目标测试及 Clippy 通过;全工作区需在最终状态复跑。 - -最终非阻塞锁改动后的 `cargo test --workspace --offline -q` 再次退出 0。以上还不是 S09 租约验收:未结束 attempt 的过期接管与 abandoned 事务、token 绑定的 verify/fix、Windows 实现及跨机器行为均未完成,9.8、9.9、9.10、9.27 保持未勾选。详见相邻 `codeguard-cli/tests/acceptance/task-lease-local.md`。 - -## 2026-09-25 Unix 修复尝试与无进展预算切片 - -相邻 Rust CLI 新增 `task attempt start/finish`,并将 RepairBrief 接到受控 action-id 和本地历史。首次定向测试因 action-id/attempt 命令不存在而失败;实现后 13 项 `task_lease_contract` 通过,覆盖错误 token、动作改名、不可重复 open attempt、未结束拒绝 release、同结果 finish 重放、矛盾的 no-change、两次同输入无进展停止推荐、过期接管先记 abandoned、旧 token 不能改写,以及环境 blocker 不改源码仍可进入待复检。新事件采用不可覆盖的 start/finish 文件;事件/响应和扩展简报各有版本化 schema。`cargo test --workspace --offline`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。详情见相邻 `codeguard-cli/tests/acceptance/task-attempt-local-ledger.md`。 - -该切片仅记录任务受影响路径的字节变化,不等同完整 patch 或环境工具身份;`ready-to-verify` 不证明原检查器复检或受保护规则覆盖,正式 fix 自动登记、verify 租约绑定、Windows 等价实现与故障注入矩阵仍缺。真实 Ruff/P3C 原生验收未因这组本地契约测试自动完成,9.8、9.9、9.10、9.27 继续未勾选。 - -## 2026-09-25 task verify 租约绑定 - -相邻 Rust CLI 的 `task verify` 新增 Unix 本地租约预检和提交前再核验。无占用时短期自领并在复检后释放;已有占用时只借用匹配的 owner/token,错误 token 和未带凭据的冲突请求在调用原生扫描前返回 3,借用结束不释放别人的租约。定向测试先因缺 `--owner` 参数与自有租约而失败,实现后 `task_verify_contract` 普通 7 项及 `task_lease_contract` 13 项通过。固定 Ruff 0.16.8 的显式原生复检 6 项通过,其中新增真实 finding 下错误 token 不产生 native_scan/新报告、正确 token 保留 active 借用租约的样本,详见相邻 `codeguard-cli/tests/acceptance/task-verify-lease-binding.md`。可信身份、长操作自动续租与取消、Windows、正式任务关闭/重开仍缺,9.10 不勾选。 - -最终状态下 `cargo test --workspace --offline`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 和插件 `git diff --check` 均退出 0;工作区默认测试不包含显式 ignored 的原生样本,上述 6 项 Ruff 用例已单独运行。 - -## 2026-09-25 attempt 与原工具复检关联 - -此前 `ready-to-verify` 可在没有新复检的情况下再次 start,绕开无进展预算。现由验证事件 0.3 记录对应 attempt-id;下一次 start 在该尝试没有可核对原工具报告时返回 `verification_required_before_retry`。同一输入的复检仍显示问题或检查未完成时计入预算;复检确认问题不再出现时清除等待,但仍不自动关闭 finding。丢失 Git 忽略的本地原报告后旧事件不作为复检凭据,重新运行原工具可恢复。定向契约测试先因缺这项约束失败,随后新增的等待/两次复检预算/报告丢失恢复用例通过;本机 Ruff 0.16.8 显式原生复检 7 项通过,新增修复后任务仍 open 的实测样本。完整 patch/环境身份、可信规则覆盖、正式关闭/重开和跨平台语义仍缺,9.9/9.10 不勾选。 - -最终状态下 `cargo test --workspace --offline`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。默认工作区测试未包含显式 ignored 的真实 Ruff 样本;7 项原生复检已单独执行。 - -## 2026-09-25 源码变化后的复检状态转换 - -修复 `next` 对同一问题的状态死角:源码变化先要求复检;`task verify` 原生 Ruff 仍检出同一稳定 finding,且报告中的目标源码摘要与当前文件一致时,简报恢复 `actionable`,展示复检观察和 run/report 摘要;复检后源码再变则重新要求复检。`task attempt start` 只接受当前 actionable 简报,防止借租约绕过复检继续修改。两个定向测试先分别因旧行为失败,再在实现后通过;其中一个使用固定 Ruff 0.16.8 的真实原生复检。最终 `cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 及插件 `git diff --check` 均退出 0。该局部状态仍不关闭 finding、不产生交付认证;9.7、9.9、9.10、9.27 仍未完成。 - -误报白名单另有独立的精确处置规格与 4.8–4.10、9.28、12.12 验收任务。当前未将本次复检观察用于白名单批准或放行;可信审批、本轮完整身份及真实门禁仍缺。 - -## 2026-09-25 白名单替代候选与撤销的局部绑定 - -相邻 Rust 增加 `false-positive-decision` 1.1 替代候选协议:必须指明不同于新 ID 的 `replaces_decision_id`,1.0 仍拒绝该字段。`approval-snapshot` 1.1 绑定要求在同次快照撤销旧 ID;普通绑定在缺旧决策时返回未核验,专用绑定核对旧 ID、稳定 finding、原生检查器/规则/类别和精确目标归属,防止把一个目标的误报纠正扩到另一个目标。定向测试先因缺字段/返回类型编译失败,随后候选与快照共 24 项通过;全工作区离线测试、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。详见相邻 `codeguard-cli/tests/acceptance/whitelist-replacement-binding.md`。 - -这些是本地结构与字节绑定,不证明旧决策来自此前受保护修订,也未校验多级修订链无环、本轮复检引用或执行真实门禁。OpenSpec 4.10 和 12.12 继续未完成。 - -## 2026-09-25 白名单前序快照关系核对 - -相邻 Rust 新增替代候选的前序快照绑定:除同轮新候选与撤销集合外,还核对旧决策字节已列入另一份固定摘要的前序快照、旧决策声明的策略修订一致、前序未撤销且新旧修订不同。缺前序摘要、错误摘要、旧字节更改、前序撤销和同修订反例均拒绝绑定。定向测试先因前序接口缺失编译失败,随后 `approval_snapshot_contract` 14 项通过;最终 `cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。旧摘要来源和修订时间顺序仍须由受保护 CI/宿主证明,不能用本地生成的两份摘要自签授权;多级无环修订链、纠错 CLI、任务事件与真实门禁仍未完成,4.10/12.12 保持未勾选。 - -## 2026-09-25 白名单多跳修订链结构校验 - -相邻 Rust 新增最多 32 跳的前序链绑定:从当前替代候选向前追溯至普通根候选,逐跳验证决策字节所属快照、前驱引用、同一 finding/精确目标、子快照撤销前驱、策略修订唯一及当时允许的最大有效期。完整 A→B→C 样本通过;截断、乱序、根后多余节点、重复 ID 成环及超长链拒绝。目标测试先因接口缺失编译失败,随后 `approval_snapshot_contract` 15 项通过;最终 `cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。 随后的 schema 审核移除了 check feedback 与纠错事件的跨文件相对 `$ref`,避免 URN `$id` 下引用不可解析;两个受影响的集成测试文件及 JSON 语法复核通过。可信快照来源、真实修订时间顺序、纠错命令/任务事件与实际门禁仍缺,4.10/12.12 不勾选。 - -## 2026-09-25 白名单纠错只读提案 - -相邻 Rust `rules whitelist propose` 增加 `--correct-decision/--correction-reason/--verification-run` 及可选 `--replacement`。旧候选必须与稳定 finding 的 Ruff 规则/目标一致;run ID 必须绑定最近由 `task verify` 保存、事件及报告摘要可复核的原工具结果。原 finding 仍存在时可预览撤销,问题消失且复检后源码未再变化时支持 `root_cause_fixed` 仅撤销;错误 run、环境 blocker、扩大到其它文件、源码再次变化均不生成提案。替代草稿只展示 ID 与候选摘要,本轮观察可核对的源码/工具/发现指纹必须匹配,但由于适配器和已批准 rulepack 身份缺失,状态保持 `evidence_incomplete`。输出始终退出 3、`authority=unverified`、`gate_effect=none`,不写 `decisions/`、不关闭任务、不放行。 - -普通 `whitelist_propose_contract` 4 项通过(2 项需原生工具而默认忽略);固定 Ruff 0.16.8 的纠错端到端样本显式通过,`task_verify_contract` 的 8 项原生复检回归显式通过。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 最终退出 0。完整批准身份、可信旧决策来源、持久纠错事件/任务投影、原生跨语言复检与真实门禁仍缺,4.10/12.12 保持未完成。见相邻 `codeguard-cli/tests/acceptance/whitelist-correction-preview.md`。 - -## 2026-09-25 白名单纠错本地事件 - -相邻 Rust CLI 的 `rules whitelist propose --record` 在任务锁下重新核对原生复检与精确范围,把纠错提案写入稳定 finding 的追加事件目录。相同提案由内容摘要确定文件名,重放不重复;环境 blocker、证据过期和源码变化不能新增事件。事件与输出均为 `authority=unverified`、`gate_effect=none`,不触碰 `decisions/` 或交付门禁。原生 Ruff 端到端及普通契约测试通过;`next` 会在本轮复检引用仍匹配时给原稳定任务添加待审事件引用和 `needs_decision` 指引,过期事件不能占用当前任务。持久任务 Markdown 投影、可信批准和策略发布仍未实现,4.10 保持未完成。 - -## 2026-09-25 白名单领域门禁聚合 - -相邻 Rust Core 增加 `AllowlistDisposition` 和原始/已批准/活跃 finding 集合,以及独立的 `allow_with_exceptions` 交付决策与 `passed_with_exceptions` 请求结论。先写的反例揭露同一批准 ID 可跨两条 finding 复用、取消后仍保留 allow;修正后定向 `delivery_gate_contract` 18 项与 `check_session_contract` 8 项通过。过期、目标失配、自批、重复批准、混合真实阻断及不完整义务也保持不放行。当前数据仍由测试显式提供;真实 CLI 没有受保护批准输入,不能据此宣称白名单已经生效。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0;新增 serde 默认值后定向 26 项回归及 Clippy 再次通过。 - -## 2026-09-25 全项目检查局部入口 - -相邻 Rust CLI 初版新增 `check all` 0.1,复用现有 Python Ruff 原生扫描→本地报告保存→`work sync`→`next`;初版把其它语言/六类别称为未完成义务,这一语义已由下方 0.2 纠正。先写的测试因命令不存在失败;实现后普通 4 项、固定 Ruff 0.16.8 的 F401 原生样本显式通过。JSON/human 均保留配置、原生违规与未完成原因,固定退出 3/incomplete,不签发项目 allow。完整 RunReport、可信策略/工具锁、其余适配器及正式项目门禁仍缺,2.3/2.4/12.7 不勾选。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。 - -## 2026-09-25 `check all` 候选/义务边界纠正 - -复核 native-tool-adapters 与 verdict-integrity 规格后,发现初版 `check all` 把每个已发现语言的六类别称为“未完成义务”,会错误暗示所有候选检测器都是项目必需项。修订 `check_feedback` 为 0.2:`category_candidates` 仅是能力候选,`required_obligations=null`、`obligation_status=unresolved` 明示尚无可信策略;Ruff 原生失败为 `native_incomplete`,仅本轮局部扫描完整才为 `observed_unverified`。先改反例使普通测试失败,修复后普通与真实 Ruff 测试均通过。完整策略、冻结义务及正式门禁仍缺,任务保持未完成。`cargo test --workspace --offline -q`、全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。 - -## 2026-09-25 `check all` 局部总预算接线 - -相邻 Rust `check all` 新增 `--timeout`(正整数加 ms/s/m/h,默认 30m、最大 24h),参数错误在原生执行前返回 2。参数解析后建立一次 `Instant` 截止时间,并传入已接入的 Ruff 版本探测与逐文件扫描;原生超时给出 `request_deadline_exceeded`,不生成局部完整证明,整体仍为 `incomplete`/退出 3。测试先证明原命令拒绝有效 `--timeout`,接线后 `check_all_partial_contract` 6 项通过、1 项默认忽略;固定 Ruff 0.16.8 的 F401 真实用例显式通过。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件 `git diff --check` 均退出 0。此切片尚未使发现、持久同步、简报和清理受到硬截止时间约束,也未统一 jobs、重试或其它命令预算;2.8 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 - -## 2026-09-25 `lint python` 检查类预算复用 - -相邻 Rust `check_budget` 现统一解析检查类 `--timeout`(默认 30m、最大 24h),`lint python` CLI 与 `check all` 共享同一参数契约;CLI 在参数解析后建立一次截止时间,传给 Ruff 版本探测与逐文件扫描。先写的原生探测超时用例因旧 CLI 拒绝有效 `--timeout` 失败;接线后 `lint_python_cli` 普通 10 项通过、4 项默认忽略,固定 Ruff 0.16.8 的原生 F401 反馈用例显式通过。非法预算在启动前返回 2,原生超时保留 `request_deadline_exceeded` 和 `not_evaluated`,无假通过。全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict、插件 `git diff --check` 均退出 0。任务复检、预算来源报告、持久 I/O/清理硬截止时间及其它命令仍未实现,2.8 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/lint-python-auto-brief.md`。 - -## 2026-09-25 `task verify` 局部预算与超时复检 - -相邻 Rust `task verify` 现复用检查类 `--timeout` 解析和默认 30m 截止时间,并将同一时间传入原生 Ruff 探测与逐文件扫描。先写的有效预算用例在旧 CLI 返回 2;接线后非法预算在获取租约前返回 2,超时扫描显示 `request_deadline_exceeded`,复检观察为 `incomplete`、不追加验证事件,自有租约释放,稳定任务保持待处理。`task_verify_contract` 普通 9 项通过、8 项默认忽略,固定 Ruff 0.16.8 的源码修复复检用例显式通过;全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 及插件 `git diff --check` 均退出 0。租约、持久 I/O、清理的硬截止时间与完整来源报告仍缺,2.8/9.10 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/task-verify-native-observation.md`。 - -## 2026-09-25 检查预算公开来源协议 - -相邻 Rust `check_feedback` 0.3、Python 对话反馈 0.10 与任务复检预览 0.3 新增严格的 `execution_budget`:最终 `timeout_ms`、`source=cli|builtin_default`、`enforcement=native_execution_only`。三个入口的默认 30m 和显式 100ms 路径都有 CLI 契约断言;前置任务不可用的复检 JSON 也保留来源字段。先改 schema 测试确认旧协议失败,再升级 schema/输出与消费者版本断言。原始 0.8 扫描报告保持独立;其它语言、项目/环境预算来源与全 I/O 硬截止时间仍待接线,不能把公开值当作完整预算验收。全工作区离线测试、全目标 Clippy `-D warnings`、fmt、固定 Ruff 0.16.8 的三个真实 CLI 样本、OpenSpec strict 和插件 `git diff --check` 均退出 0;前置任务不可用的新增断言随后单独通过。见相邻 `codeguard-cli/tests/acceptance/{check-all-partial-native,lint-python-auto-brief,task-verify-native-observation}.md`,2.8 仍未勾选。 - -## 2026-09-25 已登记超时环境变量优先级 - -相邻 Rust 三个局部入口现在只读取明确登记的 `CODEGUARD_TIMEOUT`,按显式 CLI > 环境变量 > 内置 30m 解析,公开 `execution_budget.source` 新增 `registered_environment`。先写的 `check all` 250ms 环境来源用例因旧实现仍取 30m 失败;实现后 CLI 覆盖、非法环境值在原生/租约前拒绝及两个其它入口的契约测试通过。非 UTF-8 环境值由解析拒绝;未登记变量不会改变预算。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、固定 Ruff 0.16.8 的 `check all` F401 样本、OpenSpec strict 与插件 `git diff --check` 均退出 0。项目运行默认值、jobs 和全部 I/O/清理总预算尚未实现;2.8 保持未完成。 - -## 2026-09-25 项目运行默认值及优先级 - -相邻 Rust 增加可选 `codeguard/runtime.json` 1.0,仅允许 `timeout`,有界普通文件读取并拒绝文件/父目录链接、错误协议、非法预算、过大文件及任何额外质量排除字段。三个局部入口在无显式 CLI 和已登记环境值时读取项目默认,公开反馈显示 `project_default`;截止时间从请求解析后开始计,不把配置读取成本重置掉。先写的项目默认测试在旧实现仍返回内置 30m 而失败;实现后 `check_all_partial_contract` 普通 10 项、`lint_python_cli` 普通 11 项、`task_verify_contract` 普通 10 项通过,其余真实工具用例保持显式运行。固定 Ruff 0.16.8 的 `check all` F401 样本现用项目默认 30s 并显式通过,原发现仍可见。全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。运行默认值不构成规则/白名单授权;jobs、跨命令预算及持久 I/O/清理硬截止时间仍缺,2.8 保持未完成。见相邻 `codeguard-cli/schemas/runtime-options.schema.json` 和 `tests/acceptance/check-all-partial-native.md`。 - -## 2026-09-25 `check all` 双语言局部原生观察 - -相邻 Rust CLI 新增 Cargo Clippy 机器报告解析和局部调用,`check all` 对适用的 Python/Ruff、Rust/Clippy 建立两个独立 DAG 节点。先写的 Rust 原生契约在旧 CLI 的 `--cargo-tool` 路径上失败;接线后普通目标测试 13+6 项通过、各 1 项原生用例默认忽略,真实 Cargo Clippy 临时项目的显式用例通过。混合项目测试验证 Python 工具缺失不吞掉 Rust 的有效诊断;编译错误、坏报告、缺 Cargo 工具都保持 incomplete,已解析的有效部分发现保留。human/JSON 反馈显示检查器配置观察、原生状态、Clippy 规则/位置和复检命令,`check_feedback` 升至 0.6,交付始终为 incomplete/退出 3。 - -变更后 `cargo test --workspace --offline -q` 退出 0;最后补充的人类可读输出和非零退出细分又经两个目标契约测试、真实 Cargo Clippy、全目标 Clippy `-D warnings` 与 fmt 检查通过。OpenSpec strict 和插件 `git diff --check` 通过。此结果只证明本地默认 features/all-targets 的局部原生观察;可信工具锁、批准规则包、完整 workspace/features、构建脚本隔离、Rust finding 任务同步、其它五类别及全格式门禁仍缺,2.3/2.8/3.4/7.1 均不勾选。见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 - -## 2026-09-25 Rust Clippy 任务同步与白名单自批反例 - -相邻 Rust CLI 的 `check all` 现在为已初始化工作区保存 Clippy 局部原生报告,将当前源码仍匹配的 finding 与缺 Cargo blocker 归并为稳定任务,并在 JSON/human 反馈返回 `next` 简报。重复扫描不复制任务;Rust `task verify` 尚未接通,明确返回 `rust_checker_verify_not_integrated`,原任务不会借 Ruff 复检关闭。新增反例在项目可写 `codeguard/decisions/` 写入 `approved=true` 后重新运行 Clippy,原始 finding 和修复任务仍可见,交付仍为 incomplete。这仅验证本地自批不会在当前局部链隐藏问题,不证明可信白名单已经生效。 - -目标契约测试先因 Rust 缺同步字段失败,接线后 `check_all_rust_native` 普通 9 项通过、1 项默认忽略,相关 `check_all_partial_contract`、`work_sync_contract`、`next_command_contract`、`task_verify_contract` 定向测试通过,真实 Cargo Clippy 临时项目显式通过。首轮全工作区测试仅在 SIGINT 时序测试未等到原生启动标记而失败;该测试单独重跑通过,第二轮 `cargo test --workspace --offline -q` 退出 0。全目标 Clippy `-D warnings`、fmt、JSON schema 解析、OpenSpec strict 与插件 `git diff --check` 均通过。工具/规则权威、跨类别义务、Rust 原工具复检、可信批准及正式交付门禁仍缺,4.8/7.1/9.3/9.10/9.13/12.12 保持未完成。见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 - -## 2026-09-25 Rust Clippy 原工具任务复检 - -相邻 Rust CLI 的 `task verify --cargo-tool ABS_PATH` 现在对 Rust Clippy finding/blocker 复用任务租约、项目发现、原生 Cargo Clippy、报告同步及 `verification_observed` 事件。`next` 按 checker 身份核对保存报告和事件摘要;同一发现仍在为 `still_present`,检查完成但未再报告时为 `rule_coverage_requires_review`,因为当前尚不能排除 `allow`、Cargo lints、特性组合及规则身份变化。环境任务恢复为 `environment_restored_unverified_policy`。任务事实始终 open,交付仍为 `not_evaluated`/退出 3;不存在 Rust 到 Ruff 的替代复检。 - -先修改的 Rust 任务测试因旧 CLI 不接受 `--cargo-tool` 而失败;接线后 `check_all_rust_native` 普通 10 项通过、2 项默认忽略,`task_verify_contract` 普通 10 项与 `next_command_contract` 6 项通过。显式真实 Cargo Clippy 样本确认持久任务复检先得到 `still_present`,再对源码加 `#[allow(clippy::needless_return)]` 得到 `rule_coverage_requires_review` 且 fact 仍 open。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings` 与 fmt 通过。可信工具/规则、Rust 原生抑制对照、完整特性覆盖、正式关闭/重开和跨平台租约仍缺,7.1/9.10 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md`。 - -## 2026-09-25 Clippy 原生强制告警抑制对照 - -本机独立原生探针确认:同一带 `#[allow(clippy::needless_return)]` 的源码,普通 Cargo Clippy 零诊断,`--force-warn clippy::needless_return` 返回原规则诊断。相邻 Rust `task verify` 现在只在普通 Clippy 完整且原稳定 finding 消失时对该规则执行同截止时间的原生对照;把两轮脱敏报告、目标源码摘要、工具与 manifest 身份放入同一 0.3 本地报告。对照重现原 finding 为 `suppression_requires_review`,两轮均无发现为 `candidate_absent_unverified_policy`;对照坏报告、工具/manifest/源码变化或超时保持 incomplete。`next` 复核事件和报告摘要,源码再变化时要求重跑,任务不关闭;白名单和门禁不因本地观察生效。 - -先把真实抑制用例改为期望原生对照识别,旧实现失败;接线后 `check_all_rust_native` 普通 11 项通过、2 项默认忽略,真实 Cargo Clippy 复检用例显式通过,坏强制告警报告反例也通过。`cargo test --workspace --offline -q` 与全目标 Clippy `-D warnings` 通过。局部对照仍不证明受保护工具锁、完整 features/targets、批准规则覆盖或正式解决,7.1/9.10/12.12 保持未完成。详见相邻 `codeguard-cli/tests/acceptance/check-all-partial-native.md` 和 `task-verify-native-observation.md`。 - -## 2026-09-25 Java/P3C 进入 `check all` 的局部原生观察 - -相邻 Rust CLI 的 `check all` 0.7 新增 `java.p3c` DAG 节点。Java 源文件根据最近 Maven 构建根的 P3C 配置逐份决定是否运行隔离的原生 Maven/PMD 探针;未配置的源码不会借其它模块的配置启动 Maven。文件级 JSON/human 反馈保留配置状态、原生原因、P3C 规则与位置。节点使用整轮截止时间和取消标志;原生探针仍只加载 P3C 2.1.1 命名规则集,故即使出现真实 finding,Java lint 候选仍标 `native_incomplete/p3c_naming_subset_only`,覆盖与交付保持未完成。 - -普通契约覆盖未配置不启动、已配置诊断可见及嵌套模块配置归属;显式真实 Maven/JDK 21 用例使用本机 340 MiB 固定离线仓,使 `Bad_Name.java` 的 `ClassNamingShouldBeCamelRule` 出现在 `check all`,命令仍退出 3。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、JSON schema 解析、OpenSpec strict 与插件 `git diff --check` 均退出 0。此局部接线没有完成 `check java`、全部 P3C/其它 Java 规则、finding→稳定任务→原工具复检、可信白名单/策略或代表性项目修复前后对照;2.3、3.4、6.2、6.7、9.13 均不勾选。证据见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 - -## 2026-09-25 Java/P3C 稳定任务与原工具复检 - -相邻 Rust CLI 的 Java/P3C 局部报告现在绑定已初始化工作区和本轮 run;`work sync` 从原生诊断生成稳定 finding,并将缺配置或原生前置条件按 Maven 构建根归并为 blocker。重复扫描只保留一张任务,`check all` 的 JSON/human 反馈显示同步状态及下一步。`task verify` 对 Java 任务重新运行原生 Maven/P3C,保存报告与 `verification_observed` 事件;原问题仍在返回 `still_present`,干净单文件报告仅为 `rule_coverage_requires_review`,配置恢复仍为 `environment_restored_unverified_policy`。任务事实保持 open、正式交付固定未评估;源码在复检和落盘之间变化时拒绝沿用观察。schema 已允许 Java 原生扫描对象。 - -`check_all_java_p3c` 普通契约 6 项通过、2 项真实用例默认忽略;显式真实 Maven/JDK 21 与固定离线依赖仓的两个用例均通过,包括初始化工作区复检后仍存在的原生 `ClassNamingShouldBeCamelRule`。`cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、JSON 语法、OpenSpec strict 和插件 `git diff --check` 退出 0。仍未验收 POM/源码并发变化的全部窗口、完整 P3C 规则覆盖、可信白名单批准、原生 suppression 对照、正式关闭/重开与完整 Java 门禁;2.3、3.4、6.2、6.7、9.3、9.10、9.13、12.12 保持未勾选。证据见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 - -## 2026-09-25 P3C 十规则集声明与第二规则正例 - -相邻 Rust CLI 的隔离单文件 POM 从 `ali-naming.xml` 扩展为 P3C 2.1.1 制品里的十个 `ali-*.xml` 规则集。公开本地反馈升至 0.2,列出声明清单与受控 POM SHA-256;`check all` 的 Java lint 原因改为 `p3c_declared_rulesets_unverified_coverage`,仍为 incomplete。固定 340 MiB 离线仓内的 P3C JAR 列出了全部十个资源;独立原生试跑同时检出 `ClassNamingShouldBeCamelRule` 与 `ClassMustHaveAuthorRule`。先在 CLI 真实用例中新增第二规则期望,旧单规则实现确实失败;扩展后,公开类 `Bad_Name` 同时检出两条,包内可见类没有作者注释诊断,原命名 finding 的任务复检仍为 `still_present`、fact 保持 open。两条真实 CLI 用例在 JDK 21、固定离线仓显式运行并通过。 - -这组证据证明两个规则在所测上下文真实触发,不能证明十个规则集全部规则均有效、项目 POM 的生效模型或全源集覆盖;可信工具/规则包批准和白名单门禁也未取得。局部报告始终 `coverage_proven=false`、交付未评估。OpenSpec 2.3、6.2、6.3、6.7 仍不勾选。详见相邻 `codeguard-cli/tests/acceptance/{java-p3c-cli-native-local,check-all-java-p3c-partial}.md`。 - -最终验证:本轮 `cargo test --workspace --offline -q` 退出 0;新增的声明清单与受控 POM 一致性契约另经 `java_p3c_cli` 目标测试通过,`check_all_java_p3c` 目标普通 6 项通过、真实 2 项显式通过。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0。全工作区默认测试跳过需要原生 Maven/JDK 的用例,真实 2 项是单独运行的验收。 - -## 2026-09-25 `check java` 局部语言选择 - -相邻 Rust CLI 新增 `codeguard check java [path]`,沿用 `check all` 的原生 Java/P3C DAG 节点、报告持久同步与任务简报。混合 Python/Rust/Java 项目只启动 Java 节点,只列 Java 候选;Java 简报按 checker 过滤已有其它语言任务。公开 `check_feedback` 升至 0.8,以协议条件绑定 `selection=java`、`delivery_decision=not_evaluated`、退出 3;`check all` 仍为全项目 `incomplete`。无 Java 目标明确 `java_target_absent_or_unobserved`,不从空选区推断通过。新增目标测试先因旧入口拒绝 `java` 而失败,实施后普通混合项目、现存 Python 任务和空 Java 目标反例通过;真实 Maven/JDK 21 固定离线仓的 `check java` 显式测试同时返回 `ClassNamingShouldBeCamelRule` 与 `ClassMustHaveAuthorRule`,交付未评估。 - -这仍是局部 P3C 观察,不证明 Javadoc、CVE、依赖、安全、构建等 Java 义务已实现,也没有可信策略、完整项目覆盖或交付 gate。OpenSpec 2.3、6.2、6.3–6.8 保持未完成。证据见相邻 `codeguard-cli/tests/acceptance/check-all-java-p3c-partial.md`。 - -最终 `cargo test --workspace --offline -q` 退出 0;`check_all_java_p3c` 普通 9 项、`check_all_partial_contract` 普通 13 项通过,真实 `check java` 用例另行显式通过。全目标 Clippy `-D warnings`、fmt、JSON schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认工作区测试跳过原生工具用例,真实 Maven 测试的通过只覆盖所述 JDK、离线仓与样本。 - -## 2026-09-25 P3C 项目规则集误报纠正 - -复核发现前述“项目真实 POM 命中两条规则”的结论混淆了配置发现和隔离探针:验收 POM 实际只启用 `ali-naming.xml`,探针却固定执行十个规则集,因此原作者注释诊断不能算该项目有效 finding。相邻 Rust CLI 现从已发现且摘要稳定的直接 POM 提取精确 P3C 规则集子集,构造仅含该子集的隔离 POM;扫描前后及任务复检/同步时核对项目 POM 字节。未知规则、动态/继承配置或 POM 变化保持未完成,不能借误报白名单掩盖适配器错误。无项目上下文的 `lint java FILE` 仍为十规则集的未授权局部诊断。 - -真实 Maven/JDK 21、固定离线仓的三个显式用例重新运行通过:只配置 naming 的 `check all` 不再报告 `ClassMustHaveAuthorRule`;同时配置 naming/comment 的 `check java` 报告两条原生规则;原命名任务 `task verify` 仍保持 open。普通反例新增未知规则集不启动 Maven和扫描中 POM 变化丢弃 finding。此修复仅减少局部观察的配置外误报,仍未实现可信白名单批准、完整生效 Maven 模型或 Java 交付门禁;OpenSpec 2.3、6.1、6.2、6.7、9.10、12.12 保持未完成。 - -## 2026-09-25 P3C 原生诊断规则归属与报告重放复核 - -相邻 Rust adapter 增加 P3C 2.1.1 的十个规则集、56 个规则 ID 的归属目录。对本地 JAR(SHA-256 `e7afec9340a0f30f56f4fdcd3b9c49e79ed24253719fcb9f457f5bcb43e54860`)只读提取 XML `name` 和各规则 ID,对照 Rust 目录,十组及 56 个 ID 完全一致。`java_p3c_command` 在生成 finding 前核对规则集已被本轮 POM 选择、原生 ruleset 名称和规则 ID 归属;错误归属只返回 `native_rule_outside_selected_rulesets` 与 incomplete。 - -持久化边界发现真实缺口:将已保存的有效 Java 报告改写 `ruleset` 并以新 run ID 重放时,旧 `work sync` 的定向测试先以 `failed_reports=0` 失败,证明它会接受改写。修复后,同步重新核对当前 POM 子集、探针 POM 摘要及每条诊断归属;改写 ruleset、声明子集或探针摘要的三份报告均导入失败,不新增 finding。adapter 目标测试、`check_all_java_p3c` 普通 13 项、Rust 全工作区离线测试、全目标 Clippy `-D warnings`、fmt、OpenSpec strict、JSON schema 语法和插件 `git diff --check` 均通过。最终代码上显式真实 Maven/JDK 21 固定离线仓的三项项目扫描与原工具任务复检也通过,仍固定交付未完成/未评估。此处只是局部低误报证据,不证明受保护 rulepack、全部规则执行覆盖或正式交付门禁;6.2、9.10、12.12 保持未完成。 - -## 2026-09-25 白名单身份失配解释 - -相邻 Rust CLI 的 `rules whitelist explain` 只读查询协议升至 0.3.0:对显式提供的候选与观察身份,列出源码/依赖目标、finding、原生规则及工具/适配器/rulepack 的**失配字段名**,并提供原工具复检、修复候选或核验独立批准的下一步动作;不回显观察值。先新增目标反例,旧实现缺字段且协议仍为 0.2.0,测试失败;实施后 `whitelist_command_contract` 8 项通过。`authority=unverified`、`gate_effect=none` 保持不变,查询不签发批准,也不把候选文件当成门禁授权。 - -本轮 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、JSON schema 语法、OpenSpec strict 和插件 `git diff --check` 均退出 0。需原生工具的默认忽略用例未由这次改动重新验收。可信本轮 finding、独立批准、期限与正式门禁仍缺,4.8–4.10、12.12 保持未完成;局部行为见相邻 `codeguard-cli/tests/acceptance/whitelist-candidate-inspection.md`。 - -## 2026-09-25 Maven Javadoc 原 POM 私有重放 - -此前 `check java` 的 Maven 多文件探针使用固定 POM,即使项目声明不同构建内容也会得到配置外的局部诊断。相邻 Rust adapter 现在只接受无继承、依赖、profile、模块、扩展或其它插件的简单静态 POM,直接固定 Javadoc Plugin 3.12.0 与 `doclint=missing`;Rust runtime 将原 POM 和显式 Java 文件同批快照复制到私有新目录,核对与配置发现一致的 POM 字节摘要,并在原生命令后复核原件及副本。其它 POM 在运行前返回 `project_pom_replay_ineligible`,不以合成 POM 替代。公开 `check-feedback` schema 同步描述现有 `java_javadoc` 0.2 多文件字段及原 POM 模式。 - -adapter 正反例覆盖简单/命名空间 POM、父 POM、动态属性、其它插件、DTD、未知配置与重复字段;CLI 单元反例确认复杂 POM 及发现后 POM 摘要变化不会启动原生探针。真实 Maven 3.9.16、JDK 21、固定离线仓的两文件违规和修正样本显式重跑通过,报告 `native_plan_sha256` 等于项目 POM 字节摘要;修正后的干净日志仍为 `clean_log_unverified`。有效 Maven 生效模型、完整类路径/源集、生成源码、可信规则策略和交付门禁尚未证明,6.3 保持未完成。局部验收见相邻 `codeguard-cli/tests/acceptance/maven-javadoc-multifile-probe.md`。 -## 2026-09-25 Java 依赖、CVE 与安全检查器配置反馈 - -相邻 Rust CLI 的 `check java`/`check all` 现按 Java 源码最近构建根,分别反馈 Maven Dependency、OWASP Dependency-Check、FindSecBugs 的静态声明状态、检查器身份和下一步。已声明但未执行的检查器为 `native_incomplete`,缺失声明为 `not_configured`;动态或混合模块配置保持 `configuration_unresolved`,Gradle 和 Maven/Gradle 混合项目不冒称 Maven 检查器。FindSecBugs 依赖要求完整 groupId/artifactId,避免同名伪依赖造成“已配置”误判。原生依赖图、CVE 数据时效和安全扫描尚未接入,交付保持 `incomplete`,OpenSpec 6.8 不勾选。 - -本轮 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、反馈 schema JSON 解析、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。普通测试通过,显式要求真实 Maven/JDK 等工具的 ignored 用例不计入本轮验收。白名单仍只在精确 finding、原生复检、独立批准和有效期限齐备后才允许例外;这轮配置反馈既不产生漏洞扫描结论,也不提供白名单授权。 - -## 2026-09-25 Maven 原生依赖图解析基线 - -相邻 Rust 适配器新增 Maven Dependency Plugin JSON 依赖树解析。4 项目标契约先因接口缺失失败、实现后通过;显式真实测试用 Maven 3.9.16 离线调用插件 3.8.1,JUnit 4.13.2 → Hamcrest Core 1.3 的边与组件版本均可解析。官方格式依据见 [Maven Dependency Plugin 文档](https://maven.apache.org/plugins/maven-dependency-plugin/examples/tree-mojo.html)。解析器不运行 CodeGuard 原生任务,也不形成漏洞结论;隔离调用、项目生效模型、私服/动态版本、CVE 数据库身份和对话反馈仍缺,6.8 不勾选。目标验收见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-native-parser.md`。 - -本次修改后 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0;真实 Maven 用例另以 `--ignored` 显式运行通过。全工作区普通测试并不包含被忽略的其它原生工具用例。 - -## 2026-09-26 Maven 依赖图原生 `check java` 接线 - -相邻 Rust CLI 0.11 在 Java 项目中将已声明的 Maven Dependency Plugin 作为独立 DAG 节点,使用私有原 POM 快照、显式 Maven/JDK/离线仓库树摘要运行原生 `tree`,把节点与传递边反馈到 JSON/human。配置缺失、POM 不适合静态重放、工具/仓库/原 POM 不稳定或报告不完整均保持未完成。真实离线测试揭示 Maven 的 `BUILD SUCCESS` 可伴随 POM 缺失警告并漏掉传递依赖;新增日志反例使这种结果返回 `native_dependency_resolution_warning`,不把图当作完整。随后在约 420 MiB 的测试专用离线闭包中对齐 JUnit 元数据来源,Maven 3.9.16/JDK 21 真实 `check java` 用例确认 JUnit→Hamcrest 原生边可见,CVE 类别仍未验证。此为局部原生观察,未认证项目全量依赖治理、漏洞匹配或交付。见相邻 `codeguard-cli/tests/acceptance/maven-dependency-tree-check-java.md`。 - -本轮全工作区 `cargo test --workspace --offline -q` 退出 0;之后因 Clippy 指出的同分支重复而合并条件,相关 `check_all_java_p3c` 21 项普通测试和 `check_all_partial_contract` 13 项普通测试复跑通过。全目标 Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict、插件 `git diff --check` 均退出 0。真实 Maven 用例需显式 `--ignored` 和经准备的离线仓库;最初缺闭包、随后镜像来源不一致的失败也保留为诊断证据,不计作通过。 - -## 2026-09-26 无源码 Maven 依赖构建根调度 - -复核 `check java` 发现依赖任务曾以 `.java` 源码存在为前提,因此只有 POM/依赖声明的项目完全没有依赖图任务;父根有 Java 源码而子根无源码时也会漏掉子 POM。新增 CLI 反例先失败,再改为按每个静态确认配置了 Maven Dependency Plugin 的构建根调度,候选结果显式给出 `java.maven.dependency`、`native_incomplete` 和缺少原生前置条件。`check all` 同样保留该任务;P3C/Javadoc 仍由源码存在决定。无源码不再等于无依赖义务,缺 Maven/JDK/离线仓库时不会生成空图通过。 - -定向 `check_all_java_p3c` 23 项普通测试通过、6 项需要原生工具的用例保持忽略;全工作区 `cargo test --workspace --offline -q` 在功能改动后退出 0,随后仅将空源码集合改为具名局部变量,定向测试再通过。全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。该修复只补静态已配置构建根的调度,未证明 Maven 生效多模块模型、动态版本、许可证、SBOM、CVE、可信执行边界或交付门禁,OpenSpec 6.8 仍未完成。 - -## 2026-09-26 OWASP Dependency-Check JSON 解析基线 - -相邻 Rust adapter 新增有界 OWASP JSON 1.1 解析器,依据官方 `jsonReport.vsl` 的 `scanInfo`、`projectInfo`、`dependencies`、活动与原生抑制漏洞字段。目标测试先因接口缺失失败;实施后又添加重复 `dependencies` 键反例,旧解析会以后值覆盖前值并通过,现递归拒绝所有重复 JSON 键。坏 schema、缺依赖数组、分析异常、错误标志、坏组件摘要、坏漏洞 ID/分数均返回解析错误;无评分漏洞、原生 suppression 和空数据源保留为事实,不推导为清洁或数据库新鲜。输出不保留原生文件路径。 - -`cargo test -p codeguard-adapters --test owasp_dependency_check_contract --offline -q` 5 项通过;全工作区 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 diff 检查均退出 0。默认测试不含需真实 OWASP 插件及漏洞库的原生验收。尚缺本轮原生执行、数据库时效、Maven 图归属、对话结果和正式门禁;OpenSpec 6.4/6.8 保持未完成。局部范围见相邻 `codeguard-cli/tests/acceptance/owasp-dependency-check-json-parser.md`。 - -## 2026-09-26 OWASP 与 Maven 图精确归属候选 - -相邻 Rust adapter 新增独立归属函数:只有 OWASP 包标识中的唯一 Maven PURL 与原生 Maven 图中唯一非根节点的 group/artifact/version/type/classifier 完全一致,才返回坐标候选及节点索引。错误版本、组、类型、classifier、缺 PURL、未知/私服限定符、多个冲突标识及图中重复坐标均不能归属;原生 suppression 仍由漏洞观察保留。先写的接口契约因缺函数而失败,实施后目标 3 项测试通过。它只证明报告与图的精确坐标关系,不能证明两份报告来自同轮可信执行、制品摘要相同、漏洞库新鲜或 CVE 真实有效。真实 OWASP 调用、对话反馈与门禁仍未接线,6.4/6.8 保持未完成。见相邻 `codeguard-cli/tests/acceptance/owasp-maven-attribution.md`。 - -本轮 `cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0。普通测试中的 ignored 原生用例未算入此次验收。 - -## 2026-09-26 OWASP/Maven 制品字节身份候选 - -相邻 Rust adapter 在既有精确坐标归属之后新增 SHA-256 比较:OWASP 报告和 Maven 制品观察任一方缺摘要、摘要损坏或值冲突,均不能得到同一制品候选;只有相等摘要返回 `ExactDigestCandidate`,仍不证明报告或仓库来源可信。先写的接口契约因缺类型/函数失败;实施后 4 项 OWASP–Maven 定向测试通过。Maven 原生图探针从固定离线仓库读取可无损定位的普通制品字节并在读取后复核仓库树摘要,缺文件/未知类型保持 null;CLI 反例先因缺摘要字段失败,实施后真实字节摘要进入 JSON 反馈。`check_feedback` 协议升至 0.12、依赖图局部协议升至 0.2,schema 同步,零源码依赖构建根的计数下限也对齐为 0。真实 OWASP 调用、数据库身份/时效、同轮报告绑定和最终 CVE 门禁尚未实现,6.4/6.8 仍未完成。见相邻 `codeguard-cli/tests/acceptance/{owasp-maven-attribution,maven-dependency-tree-check-java}.md`。 - -复查接口后将摘要绑定改为从本次报告与图重算坐标归属,不接收外部旧归属列表;错误版本反例返回未归属,定向 4 项再次通过。摘要向量来源仍待受保护运行时核验。 - -本轮 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict 及插件 `git diff --check` 均退出 0。普通测试仍跳过显式依赖原生工具的 ignored 用例;CLI 制品摘要测试使用模拟 Maven/JDK 和固定离线仓库,不能替代真实 OWASP 验收。 - -## 2026-09-26 OWASP Maven 原生局部反馈 - -相邻 Rust CLI 为直接声明 OWASP Maven 插件的构建根新增 `java.cve` 任务和 `check_feedback` 0.13 的 `java_cve` 局部结果。静态 POM 计划先以 3 项契约暴露缺接口,现只接受固定版本的简单直接项目;父 POM、动态版本、额外插件及跳过/排除配置在执行前返回不适用。原生探针读取并核对 Maven/JDK/离线仓库和 CVE 数据目录字节身份,将原 POM 与数据库复制到私有工作区,调用插件固定版本的 JSON goal;本轮解析后的漏洞来源、ID、分数、包标识及 suppression 进入 JSON/human 对话反馈。CLI 两项目标测试先因命令不接受数据目录参数和缺 `java_cve` 结果失败,接线后通过。错误项目名或数据库摘要变化的反例保持 `incomplete` 且不输出 advisory;旧配置测试确认混合 Maven/Gradle 与多构建根仍保持范围未解析,不因某一 POM 已配置而概括全项目。 - -本地数据库摘要不证明漏洞库时效,原生报告也不自证完整扫描。现在 `database_freshness=unverified`、`coverage_proven=false`、交付仍未评估;真实 OWASP 插件/合格数据库、系统级网络隔离、同轮依赖图与制品绑定及受保护策略门禁均未验收,6.4/6.8 不勾选。局部验收见相邻 `codeguard-cli/tests/acceptance/owasp-maven-check-java.md`。 - -定向 POM 3 项、模拟 CLI 2 项、既有 Java 29 项(其中 6 项 ignored)、检查反馈 14 项(其中 1 项 ignored)均通过。全工作区 `cargo test --workspace --offline -q` 退出 0;全目标 Clippy 首次指出既有测试在更新预期后的相同 if 分支,合并断言后 Clippy `-D warnings`、fmt、schema JSON 解析及受影响 Java 29 项复测均退出 0。OpenSpec strict 与插件 `git diff --check` 退出 0。本机可见 Maven/JDK 和部分 OWASP 插件 jar,但未找到可用的离线漏洞数据库,故没有真实 OWASP/数据库时效验收;普通全工作区测试中的 ignored 用例未计入通过范围。 - -后续补充“根 Maven 报告已有漏洞、子根为 Gradle”的端到端反例:局部原生报告仍可见,但项目级 CVE 候选保持 `checker_build_systems_mixed`、无 Maven checker ID,防止一处成功覆盖未解析的其它模块。定向 CLI 2 项、既有 Java 29 项及全目标 Clippy 复测退出 0;全工作区测试是在此新增反例之前运行,未把后续改动说成再次全量回归。 - -## 2026-09-26 CVE 反馈脱敏与白名单边界 - -模拟 OWASP 报告加入携带私服 `repository_url` 的 Maven PURL,先证实原反馈会回显地址,再将对话 JSON 中的未知限定符包标识替换为稳定 `redacted-sha256`;标准 Maven PURL 保留,异常 advisory 来源、ID 和数据库来源/时间戳也只显示安全格式或摘要。定向 `check_java_cve_native` 2 项通过,确认私服地址不进入反馈。误报白名单设计同步明确:脱敏摘要不可当作 CVE 组件身份,只有本轮原生 advisory、依赖图/制品身份和新鲜数据库可核验时才可能进入精确误报裁定;当前 `database_freshness=unverified`、`coverage_proven=false`,白名单不放行。 - -本次改动后 `cargo test --workspace --offline -q`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。真实 OWASP 与数据库验收、可信白名单批准及门禁绑定仍未实现,6.4/6.8/4.9/12.12 均保持未完成;ignored 原生测试不计入通过范围。 - -## 2026-09-26 OWASP 与 Maven 图同轮候选归属 - -此前两个私有原生探针都只接受自身一个插件,同一 POM 无法同时执行依赖图和 OWASP。相邻 Rust adapter 现在只增开“固定 Maven Dependency Plugin 3.8.1 + 固定 OWASP 插件”的严格双插件形状,重复、额外、动态和复杂插件仍拒绝。`check_feedback` 升至 0.14:同一 `check` 的两个构建根、POM、Maven/JDK 和离线仓库摘要一致时,逐条展示精确 Maven PURL、图节点与制品 SHA-256 的候选状态;身份失配或图缺失不复用历史观察。公开反馈中若另有被脱敏的私服 PURL,即使同时有标准 PURL,也标为 `unsupported_purl`,防止在信息损失后误归属。 - -先写的双插件资格契约因旧单插件限制失败,修复后 adapter 4+2 项定向测试通过。模拟原生 CLI 的双插件正例、制品摘要冲突和私服限定符反例通过;另有不同 POM 摘要及图未完成的定向单元反例。最终生产代码与集成反例后的 `cargo test --workspace --offline -q` 退出 0;最后新增的单元反例另由 `cargo test -p codeguard-cli --lib java_cve_attribution::tests --offline -q` 验证通过。全目标 Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict 与插件 `git diff --check` 退出 0。测试中的 Maven/JDK/数据库仍为模拟,真实 OWASP 与可信漏洞库、数据库 freshness、工具锁、全构建范围和正式门禁未验收,6.4/6.8 保持未完成;ignored 原生测试不计入通过范围。 - -## 2026-09-26 CVE 局部报告持久任务 - -相邻 Rust `check java` 把 0.3 CVE 局部报告绑定到已初始化工作区的 `workspace_id/run_id`,自动保存后由 `work sync` 按摘要导入。原生 OWASP 有 advisory 或空报告但数据库 freshness 未核验时,生成 `cve_database_freshness_unverified` 环境/证据 blocker;缺数据库或工具时按原生结构化原因生成 blocker。任务引用报告、构建根和复检参数,`java_cve.next` 返回只读 RepairBrief。此切片**不**将未经核验的 advisory 升为源码 finding,不关闭旧问题,也不改变交付门禁。未初始化项目不写受管目录。 - -先写的集成反例因 `backlog_status` 缺失失败;实施后模拟原生报告、重复扫描仍只有一张同身份任务、缺数据库的环境任务、已消费报告被改后 `work sync` 拒绝摘要冲突均通过。`check_feedback` 协议升至 0.15;`cargo test --workspace --offline -q`、Clippy `--all-targets -D warnings`、fmt、schema JSON 解析、OpenSpec strict 与插件 `git diff --check` 退出 0。真实 OWASP/合格数据库、CVE 任务的 `task verify` 关闭与重开、跨类别完整报告事务及可信门禁仍缺,6.4/9.4/9.7 保持未完成;ignored 原生用例不计入通过范围。 - -## 2026-09-26 CVE 任务原工具复检观察 - -先写 `cve_blocker_verify_uses_original_checker_and_keeps_task_open` 集成测试,旧路由实际返回 `python_lint_feedback` 而失败。现按 CVE checker ID 重跑原生 OWASP Maven 探针,显式接受 Maven/JDK/离线仓库/漏洞库路径和摘要;复检报告经 `work sync` 后附带 `verification_observed`,`next` 与 attempt 历史校验事件的原报告身份。缺库任务仍为 `still_blocked`;模拟 advisory 再现时漏洞库时效仍未核验,亦为 `still_blocked`。两者均保持 open、`local_unverified`、退出 3。POM 复检后变动不沿用恢复候选,需重新扫描。 - -`check_java_cve_native` 三项集成测试通过;`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict` 与插件 `git diff --check` 均退出 0。ignored 原生用例不计入通过范围。此处仅证明任务分派和本地事件链,真实 OWASP 插件与合格漏洞库、CVE 正式关闭/重开、跨类别完整门禁仍未验收,9.10 保持未完成。 - -## 2026-09-26 Blocker 重复扫描的本地证据与 Git 噪声 - -新增集成反例:同一 CVE 前置阻塞扫描两次原先留下两条 tracked `observed` 事件,断言期望仅一条而失败。现有 blocker 与 finding 一样,每轮在忽略入库的 `state/observations//.json` 保存脱敏报告摘要和受影响路径;首见写一条 tracked 事件,复检后再现补一条,之后重复扫描不再增加 tracked 事件。Rust `work sync` 同时识别 Ruff、Rust Clippy、Java P3C 和 CVE 的 run 序列以判断复检后的再现;重复导入仍受 `write_once` 和消费标记保护。新增 `local-blocker-observation` 0.1 schema。`check_java_cve_native` 的重复/复检/再现样本与 `work_sync_contract` 的 Ruff 多文件归并样本通过。跨模块公共前置关系、正式状态机、可信门禁仍缺,9.3/9.5/9.6 不勾选。 - -回归时一条 `task_verify_contract` 旧断言仍期待“重复扫描新增 tracked 事件”,改为核对首次与复检事件以及两轮本地观察后通过。最终 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、JSON schema 语法、OpenSpec strict 与插件 `git diff --check` 退出 0;默认忽略的原生用例未纳入通过范围。 - -## 2026-09-26 status 与 task show 局部只读视图 - -先写 CLI 集成反例,旧入口对 `status` 和 `task show` 返回未知命令且无 JSON。相邻 Rust CLI 现复用 `next` 的受限 fact/事件检查,`status` 汇总开放 finding/blocker、待同步报告和下一步,`task show` 定位指定任务的结构化 RepairBrief。恶意任务 Markdown 不进入输出;坏 ID 返回 2,缺失或损坏事实返回 3;未初始化与空任务均不表示门禁通过。两份局部结果 schema 已加入;`status_show_contract` 四项定向测试通过。完整事件父关系、历史通过证据 freshness、依赖和正式关闭/重开仍缺,9.7/9.26 保持未完成。 - -最终 `cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、fmt、两份 schema JSON 语法、OpenSpec strict 与插件 `git diff --check` 退出 0;默认 ignored 的真实原生用例未纳入通过范围。 - -## 2026-09-26 Ruff→CVE 跨类别待导入与游标恢复 - -同一初始化项目先生成 Ruff 报告再生成 CVE 报告,阻断自动 sync 后仍保留两份本地报告。恢复后添加一份坏 JSON,单次 `work sync` 同时导入两类 blocker、坏报告单独失败;再次删除两份消费标记并同步,标记恢复且任务/事件数量不变。`cargo test -p codeguard-cli --test work_sync_cross_category --offline` 的一项 CLI 集成验收通过。此切片不包含任意崩溃点或多进程并发的事务证明,也不代表可信 CVE 或完整 gate,OpenSpec 9.4 保持未完成。 - -## 2026-09-26 失败报告收据与误报白名单边界 - -在上述跨类别验收中加入坏报告的后续 `next`/`status` 断言:原实现反复返回 `pending_reports_require_sync`,目标测试先失败。现在每次可归属且有界的导入失败都留下忽略入库的脱敏收据,绑定工作区、run ID、报告 SHA-256 和静态错误码;`next` 返回 `failed_report_requires_repair` 与安全的报告引用,不重复推荐无变化的同步。改写坏报告后,旧收据不适用,重新同步才记录新失败。收据写入失败时先尝试处理其余报告,然后明确返回未完成。收据不是 finding 或白名单批准;该反例已补入 rulepack 与修复流程规格。 - -最初新增的 RepairBrief schema 少一个闭合括号,首轮全工作区测试的 schema 契约因此失败;修正后 `next_command_contract` 6 项及跨类别集成 1 项通过。之后全工作区离线测试退出 0;最后调整失败收据写入错误的批处理边界后,受影响两组测试再次通过。全目标 Clippy `-D warnings`、fmt、两份 JSON schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。普通测试中的 ignored 原生工具用例没有运行。正式可信批准、完整门禁、并发与崩溃矩阵仍未实现,4.8–4.10、9.4、12.12 保持未完成。 - -## 2026-09-26 同工作区同步互斥与失败协议 - -先写 `sync_rejects_a_concurrent_import_before_writing_records`:测试进程持有现有跨进程文件锁,另一个 `work sync` 原先照样导入报告,反例失败。现同步在枚举报告前取得 `state/work-sync.lock` 的非阻塞独占锁,忙碌时先返回 `work_sync_busy`,不写 finding、任务、事件或消费标记;释放后重试导入一次,再重试只计已消费报告。用例同时发现失败响应仍使用 0.1 协议,与已发布的 0.2 work-sync schema 不符;已统一为 0.2。`work_sync_contract` 普通 13 项(2 项原生依赖 ignored)及 Ruff/CVE 跨类别 1 项通过。 - -本轮最终 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 的真实原生工具用例没有运行。互斥只在当前 Unix 本地同步入口证明;跨平台并发、任意崩溃点事务和完整 RunReport 尚未验收,9.4 不勾选。 - -## 2026-09-26 首轮报告导入持久边界重放 - -在四个独立初始化工作区中,先取得同一 Ruff finding 的完整原始记录,然后分别重建“仅任务”“任务加 fact”“已写本地观察”“已写 tracked 事件但尚无消费标记”的持久状态。`work sync` 重放后逐字恢复 fact、任务、观察和事件,恢复消费标记,事件目录仍只有一条。另用真实缺 Ruff 工具的扫描形成环境 blocker,重建已写 fact、未写观察/事件/标记的状态,同样可重放。两项新定向用例和 `work_sync_contract` 普通 15 项、跨类别同步 1 项均通过;2 项显式 ignored 原生用例未运行。全目标 Clippy、fmt、OpenSpec strict 与插件 `git diff --check` 退出 0。本次只重建了磁盘中间态,未实际强杀进程或注入磁盘故障;9.4 继续未完成。 - -## 2026-09-26 事件落盘后子进程退出验收 - -新增仅在 Rust `cfg(test)` 构建存在的故障注入点,位于 `import_one` 已持久化 finding/观察/事件之后、写消费标记之前。父测试建立真实初始化工作区和未消费 Ruff 报告;子进程在该点直接退出 97。父进程确认事件存在、标记不存在,随后同一报告重新同步,标记恢复、原事件字节不变且仅一条;这同时验证进程退出后同步文件锁可重新取得。测试先因缺注入点以退出 101 失败,接线后通过。生产构建不包含注入入口。 - -最终 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0。默认 ignored 的原生工具用例没有运行。此结果证明该单一真实进程退出点;磁盘故障、其它中断点、多记录/CVE 事务及跨平台仍未验收,9.4 不勾选。 - -## 2026-09-26 残留 staging 与 PID 复用恢复 - -`write_once` 原先用 PID 加进程内计数形成一次性 staging 名;若旧进程留下同名临时文件且 PID 复用,`create_new` 直接失败,目标记录无法在重试中写入。先写的目标契约因缺有界重试接口而编译失败;实现后,写入器遇 `AlreadyExists` 最多尝试 32 个新名字,绝不读取、覆盖或删除旧文件。单个残留名测试证明目标写入且旧字节不变;全部 32 个名字占满时返回 `staging_name_exhausted`,目标仍不存在,全部旧文件保留。这里是恢复活性改进,不是自动垃圾清理或断电持久性证明。 - -两项定向单元测试、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0;默认 ignored 原生用例未运行。磁盘写失败、跨平台文件系统语义、全类别事务及完整门禁仍未验收,9.4 保持未完成。 - -## 2026-09-26 白名单与重复 finding ID 的门禁碰撞 - -审计纯领域门禁发现:若两个义务的原生 finding 意外共用一个 ID,但规则不同,原实现把原始阻断 ID 收进集合;一条精确批准只匹配其中一个原生规则,却会按同一 ID 从活跃阻断集合中移除两者。先写的 `same_finding_id_from_another_rule_cannot_be_waived_by_one_exact_decision` 实际得到错误的 `AllowWithExceptions`,目标断言失败。现门禁先统计全轮 finding ID;重复 ID 使每个受影响义务账本无效,白名单对该 ID 失效,活跃阻断保留,交付为 `Incomplete`。无白名单的单义务重复 ID 也保持未完成,防止集合去重掩盖报告错误。原始 finding 仍留在传入的原生结果中,不按文本相似度合并。 - -`delivery_gate_contract` 20 项、`check_session_contract` 8 项、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件 `git diff --check` 均退出 0;默认 ignored 原生工具用例未运行。这是领域门禁反例与修复,不证明 CLI/宿主已绑定可信策略、批准、时钟和真实原生身份;2.4、4.8、12.12 均未完成。 - -## 2026-09-26 内部故障仍返回已取得的原生发现 - -`check all/java` 原先在任务图返回任一 `InternalFailure` 时立即退出 4,兄弟任务槽位中已经取得的原生 finding 不进入对话反馈。先写的定向契约因缺报告构造函数而编译失败;现增加 `check_aborted` 0.2 局部报告,记录失败任务 ID、所有执行任务状态、项目发现和各原生结果。只有内部任务故障时退出 4,同轮取消优先退出 130;`check all` 的交付状态为 incomplete,局部 `check java` 为 not_evaluated。Python 扫描若只留下内部错误结果,也按同一路径反馈。白名单不能利用内部故障把已发现的问题转为通过。 - -定向单元测试构造 Python F401 与 Rust 内部故障,验证 F401 未丢失、失败任务可定位和 schema 可解析。`cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、`openspec validate introduce-rust-codeguard-cli --strict`、插件 `git diff --check` 均退出 0。默认 ignored 的真实原生用例未运行;调度器自身失败、真实同轮工具异常注入、取消路径、完整义务账本与可信白名单门禁仍待验收,2.3 不勾选。 - -## 2026-09-26 SIGINT 取消优先级与并行原生发现 - -既有 SIGINT 集成测试暴露 `check all` 已把任务标成 cancelled,却仍以普通未完成退出 3。先把同一用例的目标改为 130,实测失败(实际 3);接着将 `check_feedback` 协议升至 0.16,在任务取消或进程 SIGINT 时输出 `command_status=cancelled`、`reason=request_cancelled` 和退出 130,交付依然 incomplete/not_evaluated。测试进一步放入并行 Rust Clippy 原生诊断:Ruff 子进程收到 SIGINT 并清理后,已经取得的 `clippy::needless_return` finding 留在 `native_results`,延迟写入标记仍证明 Ruff 后台子进程已终止。该定向集成测试通过。 - -另以纯单元反例构造“Python 已有 F401、Rust 内部故障、Java 取消”,核对 `check_aborted` 0.2 优先返回 130,保留 F401 和故障任务 ID。局部 `check all/java` 取消反馈仍不是完整 RunReport,也未证明 `lint python` 等其它入口遵循 130、调度器自身异常携带全部部分证据或可信白名单门禁。OpenSpec 2.3 不勾选。 - -最终 `cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、两份相关 schema 的 JSON 解析、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 的真实原生工具用例未运行。 - -## 2026-09-26 `lint python` 取消出口对齐 - -既有真实 SIGINT 用例中 Ruff 原生探测取消并回收子孙进程,但 CLI 固定退出 3。先把目标断言改为 130,实测仍为 3;修复后公开 `python_lint_feedback` 0.11 在收到 SIGINT 或扫描明确返回 `request_cancelled` 时,标记 cancelled、退出 130,保留原局部反馈与取消原因。定向 SIGINT 用例通过。原始工作区扫描报告仍保持 0.8,未把对话协议字段写回发现事实。其它命令的取消语义和完整聚合尚未证明,2.3 不勾选。 - -本轮最终 `cargo test --workspace --offline -q --no-fail-fast`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all -- --check`、三份相关 schema 的 JSON 解析、OpenSpec strict 与插件 `git diff --check` 均退出 0;默认 ignored 的真实原生工具用例未运行。 - -## 2026-09-26 三种 planned 语言的显式缺口验收 - -COBOL、ArkTS、Metal 原先在能力查询中可见 planned/gap,但含 `.cbl`、`.ets`、`.metal` 源码的 `check all` 仅输出通用 `not_integrated`,未把旧登记与当前能力缺口带给智能体。先写集成反例,因候选缺 `legacy_status` 而失败;现 `check_feedback` 升至 0.17,每语言六类别候选同时列出旧登记 planned、当前能力矩阵一致为 gap、`planned_language_adapter_gap` 和原生适配/正反例的下一步。请求固定退出 3、交付 incomplete、正式义务仍为 null;没有空适配器或 `not_applicable`。跨平台能力不一致时,单一候选能力字段为空,避免把某平台结果概括到所有平台。 - -定向 `planned_language_gaps` 集成测试覆盖三种真实扩展名、18 个候选、能力查询、缺口条件与不生成正式义务;加入 `capability_status` 后复测通过。最终全工作区 `cargo test --workspace --offline -q --no-fail-fast`、Clippy `-D warnings`、fmt、schema JSON 解析、OpenSpec strict 和插件 `git diff --check` 均退出 0;默认 ignored 的真实原生用例未运行。8.145–8.147 的显式 planned/gap 验收已满足;54 个旧 stable 语言的原生适配与 8.148 汇总仍未完成。 - -## 2026-09-26 白名单 finding 与未完成状态的 SARIF 投影 - -相邻 Rust CLI 增加 `feedback_sarif` 纯转换器。定向测试先因模块缺失编译失败;实现后,结构有效 RunReport 中的白名单 finding 仍是 SARIF `result`,附处置与批准引用但不生成 `suppressions`,并标明报告所称批准来源未核验。同轮另有活跃阻断时两个结果都保留且总体为 `deny`。未完成且零 finding 的报告仍以 `executionSuccessful=false`、错误级工具通知及未完成义务计数显式表达。原生消息、路径和证据引用不复制到公开 SARIF,规则与 finding ID 用哈希投影。见相邻 `codeguard-cli/tests/acceptance/sarif-feedback-baseline.md`。 - -定向 `sarif_feedback_contract` 3 项、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 的原生工具用例未运行;转换器尚未接入正式 CLI/MCP/Hook,报告来源、内容身份及批准权威未被验证,2.5、2.10、12.12 均保持未完成。 - -## 2026-09-26 `check all/java` 局部 SARIF 命令输出 - -当前实际检查入口使用 `check_feedback`/`check_aborted`,不是完整 RunReport;直接复用上节转换器会丢失局部原生发现。先写 `check_sarif_cli` 2 项命令反例,旧参数解析均退出 2;实现后 `check all/java --format sarif` 由同轮局部报告投影嵌套原生 finding,固定 `executionSuccessful=false` 与失败通知,保留原退出码 3/4/130。模拟 Clippy finding 可见,诊断内 `token=private` 不公开;零 finding 的 Java 局部检查仍为 `not_evaluated`。另有内部故障保留两个检查器已取得 finding 的单元反例。CVE advisory 与依赖图节点未经归属,不伪装为 SARIF finding。见相邻 `codeguard-cli/tests/acceptance/check-partial-sarif.md`。 - -定向 CLI 2 项及转换器单元 1 项通过。首次全工作区并行回归中 `check_sarif_cli` 曾间歇失败,单独重跑及第二次全工作区回归退出 0;失败断言未保存,仍需后续观察。全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 原生工具用例未运行;完整 RunReport、其它检查类格式、`--output`、可信门禁及白名单批准仍未接通,2.5/2.10/12.12 不勾选。 - -## 2026-09-26 JSON/SARIF 局部报告原子导出 - -在 `check all/java` 上实现 `--output PATH` 的 JSON/SARIF 局部导出:同目录创建私有暂存文件,完整写入与同步后原子发布;新目标用不覆盖现有路径的硬链接创建,替换目标只接受可解析的既有 CodeGuard 报告。目标父目录不存在时,扫描已经取得的 finding 仍完整输出到 stdout,stderr 提供 `output_parent_unavailable` 恢复原因,退出保持未完成 3;已有源码文件不会被输出覆盖。目标可写时,导出文件与 stdout 是同一所选格式的文档。先写的导出成功/失败反例因旧解析器拒绝 `--output` 而失败;已有源码保护反例也先证实旧实现会覆盖源码,修复后通过。 - -定向 `check_sarif_cli` 6 项、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认 ignored 原生工具用例未运行。当前输出仍是局部 `check_feedback`/`check_aborted`,human/其它检查命令未接入,非 UTF-8 可逆路径、多位置/包身份、完整 RunReport 与跨工具等价归并尚未实现;2.9 保持未完成。 - -## 2026-09-26 导出失败进入智能体结构化反馈 - -上一节导出失败只写 stderr;若宿主只消费 stdout,智能体看不到保存失败。先把 `check_sarif_cli` 改为要求失败时 SARIF `codeguardExportStatus=failed`/受限原因码,成功文件与 stdout 同报 `saved`,JSON 成功报告也带 `export.status=saved`;旧行为的 3 项断言均实际失败。现 `check_feedback` 0.18、`check_aborted` 0.3 要求结构化 `export`,默认 `not_requested`;尝试导出前构造 `saved` 文档,仅成功发布才输出该版本,失败则输出 `failed` 文档并保留同轮发现。局部 SARIF 从同一状态投影。没有扩大白名单或签发完整检查。 - -定向 `check_sarif_cli` 6 项、`check_all_partial_contract` 13 项普通/1 项忽略、`check_all_java_p3c` 23 项普通/6 项忽略、全工作区 `cargo test --workspace --offline -q --no-fail-fast`、全目标 Clippy `-D warnings`、fmt、两份 JSON schema 语法、OpenSpec strict 和插件 `git diff --check` 均退出 0。默认 ignored 的真实原生工具用例未运行;宿主对 stderr/stdout 的消费、human/其它命令导出与完整 RunReport 仍待验收,2.9 不勾选。 - -## 2026-09-26 Go vet 局部 CLI、白名单纠错场景与并行回归 - -相邻 Rust 工程新增 `codeguard lint go` 局部入口:显式 Go 1.23.4 工具路径、离线隔离执行、原生 `go vet -json ./...`、本轮源码/manifest/工具摘要复核和脱敏 JSON/human 对话反馈。原生诊断与清洁样本均已在本机 Go 1.23.4 下执行;编译错误保持 incomplete。CLI 始终退出 3、`coverage_proven=false`、`delivery_decision=not_evaluated`,尚未接入 `check all`、工作任务和正式门禁。见相邻 `codeguard-cli/tests/acceptance/go-vet-json-local-probe.md`。 - -用户要求能通过纠正白名单处置不合理误判。本 change 已有精确身份、原生复检、候选/独立批准/撤销链与 `allow_with_exceptions` 设计;本次补充从用户反馈到再次检查、对话说明的可观察场景,并写入 12.12 验收。可信批准、任务闭环、真实门禁和 CLI/MCP/Hook/SARIF 一致性仍未实现,相关任务保持未勾选。 - -全工作区首轮并行回归暴露 `check_sarif_cli` 间歇失败:已有源码文件有时在读取前变空,报告暂存文件有时在发布前消失,替换返回 OS 错误 2。测试用进程 ID 与时钟纳秒生成临时目录,缺进程内唯一序号;给目录名增加原子递增编号后,该测试并行连续运行 10 轮均通过。`cargo test --workspace --offline -q`、`cargo fmt --all --check`、OpenSpec strict 和插件 `git diff --check` 均退出 0;此前全目标 Clippy `-D warnings` 与本轮 Go 真实忽略用例分别通过。并行失败的根因由症状和修复后稳定性推断,未取得碰撞路径日志;原生 P3C 等默认忽略用例不在全工作区通过范围。 - -## 2026-09-26 Go 多模块与诊断源集归属 - -`lint go` 的局部扫描使用根模块 `go vet ./...`。新反例先证实:当目标下存在第二份 `go.mod` 时,旧 CLI 继续进入版本探测,没有向智能体指出嵌套模块漏检。现只读发现同时保存 Go manifest 集合;非单一根 `go.mod` 返回 `go_multiple_modules_unvalidated`,提示逐模块核查。另构造有界假原生报告,其位置在根内但文件未列入本轮源码集合:解析后整轮返回 `go_vet_diagnostic_outside_discovered_sources`,不输出该诊断为 finding。该测试首次因 macOS `/var` 与 `/private/var` 路径别名得到解析层拒绝,改用规范根路径后命中目标归属检查。 - -`cargo test -p codeguard-cli --test go_lint_cli --offline` 4 项普通测试通过、1 项原生测试默认忽略;显式 `CODEGUARD_GO_TOOL=/usr/local/go/bin/go ... -- --ignored` 的真实 Go 1.23.4 违规/干净/编译错误用例通过。仍无逐模块执行、完整 build tags/目标平台证明、可信工具/规则策略或 Go 注释适配,8.2 不勾选。 - -本次修改后的 `cargo test --workspace --offline -q`、`cargo fmt --all --check`、全目标 Clippy `-D warnings`、OpenSpec strict 与插件 `git diff --check` 均退出 0;全工作区默认忽略的原生环境用例不计入通过范围。 - -## 2026-09-26 Go 多模块原生复检 - -上一节只识别嵌套模块并返回范围阻塞。本轮从真实反例继续:根模块干净而嵌套模块含 `printf` 违规时,旧 CLI 返回 incomplete,未运行第二个模块;先写的验收断言失败。现对只读发现的最多 64 个 `go.mod` 按相对根逐一执行 `go vet -json ./...`,把诊断绑定到已发现源码及其所属模块,反馈 0.2 列出每模块状态。根模块有原生违规、嵌套模块编译失败时,公开结果保持 incomplete,已完成根模块的 finding 仍保留。若工具/任一模块 manifest、可选 `go.sum` 或源码在检查中变化,丢弃本轮 finding。模拟报告指向未发现源码或从根模块指向嵌套模块时,该模块保持未完成,不把报告位置误认作有效发现。 - -本机 Go 1.23.4 的真实单/双模块、局部干净、违规及失败样本通过;普通 CLI 4 项通过。仍未验收 build tags、目标平台/CGO、完整依赖图及规则策略,也未接入 `check all`、任务同步、注释检查和可信门禁,8.2 不勾选。 - -修改后全工作区 `cargo test --workspace --offline -q`、`cargo fmt --all --check`、全目标 Clippy `-D warnings`、Go 反馈 schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认忽略的其它原生用例仍不计入全工作区通过范围。 - -## 2026-09-26 Go 接入统一局部检查 - -新 `check_all_go` 反例先要求 Go 项目在统一检查中保留缺工具原因和 `go.lint` 任务,旧行为缺 `native_results.go_lint`,断言失败。现 `check all --go-tool ABS_PATH` 复用 `lint go` 的受控观察服务,接入共享 TaskGraph、deadline/jobs、类别候选、内部故障快照及 JSON/human/SARIF 汇总。真实 Go 1.23.4 的 `printf` 诊断在统一 JSON 与 SARIF 保留,SARIF 仍 `executionSuccessful=false`;整体交付为 incomplete,Go 子报告仍不签发质量通过。缺工具、相对路径、Java 选择误用 Go 参数和 2 秒预算下的慢版本探测均有明确反例;超时映射为 `deadline_exceeded`。Go 子报告沿用 0.2,统一检查反馈升为 0.19、内部故障反馈升为 0.4。 - -`check_all_go` 普通 3 项、Go CLI 普通 4 项通过;显式真实 Go 的统一检查 JSON/SARIF 及单/双模块用例各 1 项通过。使用已安装的 `/opt/anaconda3/bin/python3`/jsonschema 对真实违规、缺工具和 Java 选择的实际输出执行 Draft 2020-12 校验通过;项目 shell 的另一个 Python 缺 jsonschema,未安装依赖。此验证辅助程序不属于 Rust 产品运行时。Go 尚无持久任务/原工具任务复检、完整规则/平台覆盖或可信门禁,8.2/9.13 仍未完成。 - -本次修改后全工作区 `cargo test --workspace --offline -q`、`cargo fmt --all --check`、全目标 Clippy `-D warnings`、相关 schema 语法、OpenSpec strict 与插件 `git diff --check` 均退出 0。默认忽略的其它原生环境用例未包含在全工作区通过范围。 - -## 2026-09-26 Go 稳定发现身份前置能力 - -新增 `go_finding_identity` 契约测试先因模块未导出而编译失败,随后实现稳定身份并接入原生观察。Go 子反馈 0.3 与统一反馈 0.20 要求稳定 ID、完整指纹和本轮源码摘要。指纹以模块/package/路径/原生规则/源码行锚点/原生消息/重复锚点序号绑定;绝对行号与整文件摘要不参与稳定 ID。排序原生发现和同位置诊断去重避免原生数组顺序制造重复任务;字节摘要独立绑定本次输入。模块内任一位置越界不发布部分有效发现,输入变化清空本轮发现。 - -纯身份 3 项、Go CLI 普通 5 项、统一 Go 普通 3 项通过。显式 Go 1.23.4 的 CLI 原生验收和统一 JSON/SARIF 各 1 项通过,CLI 包含重复扫描/插入空行、修复、编译错误、双模块和部分模块失败。两种实际含违规输出通过 Draft 2020-12 schema 校验。局部能力没有新增交付批准;Go 持久报告工作区/运行归属、同步、next 和 task verify 未实现,8.2 保持未完成。 - -本轮全工作区回归退出 101:`maven_probe_contract::delegated_bundle_mutation_during_validate_invalidates_local_evidence` 期望 `bundle_identity_changed`,实际 `version_execution_incomplete`。该测试使用 2 秒总预算,但现有结果不含该次进程具体终止原因,不能据此确认是超时。单独重跑该测试文件的 7 个普通用例通过、3 个原生环境用例忽略;原失败尚未解释,不报告全工作区通过。Go 相关普通/显式原生专项、实际 schema 验证、全目标 Clippy、fmt 和 OpenSpec strict 通过。后续须保留进程终止证据定位 Maven 回归干扰,再重新取得完整回归退出 0。 - -## 2026-09-26 Maven 版本失败可诊断性 - -从上一轮全量失败继续:检查发现 `run_maven_probe` 对所有非零/异常版本阶段统一返回 `version_execution_incomplete`,无法区分时间预算、启动权限或执行层故障。新增 100ms 预算的长进程反例和普通文件缺可执行权限反例,两者先按期失败(得到通用原因),实现后分别得到超时/启动前耗尽和启动失败原因,均不启动 validate、不生成源码违规。其余终止类别也显式保留;没有放宽产品或测试截止时间。 - -Maven 普通契约现为 9 项,连续五轮均通过,各轮 3 个本机原生环境验收未执行;全目标 Clippy、格式、OpenSpec strict 和 diff 检查通过。此前 bundle mutation 的一次失败仍无法恢复具体终止原因,重复通过不等于根因确认。完整工作区回归的终态另行记录;6.1 及完整计划保持未完成。 - -本轮完整 `cargo test --workspace --offline -q` 最终退出 0,原 Maven bundle mutation 用例通过,新增超时/启动失败反例也包含在该轮回归。全量日志 `/tmp/codeguard-maven-reason-workspace.log` 仅作本地执行记录,不作为长期规格事实源。默认忽略的原生工具用例仍未计入本轮全量通过范围;偶发失败根因不因本轮成功而标为已确认。 - -## 2026-09-26 Go 报告归属与持久修复任务 - -缺工具场景的新 `go_work_sync` 测试先因缺 `backlog_status` 失败,接通保存与同步后又暴露 next 拒绝 Go checker;现已统一 `lint go` 和 `check all` 的本地保存/同步函数,并让 next 返回 Go 原工具参数及环境/策略指引。Go 子反馈 0.4、统一反馈 0.21 新增 workspace/run、各模块 manifest/go.sum 身份和同步反馈。尚未初始化或无效工作区不写队列,保存失败不改变原生 finding 或签发门禁。 - -同步器验证工作区和运行文件名、已完成模块、诊断计数、归属及源码位置;单模块计数有上限,过大输入不让求和溢出。源码或模块内容已改变的报告只计历史;错工作区、计数矛盾、越界路径、模块错属和坏位置不生成源码任务。合成报告测试只验证本地一致性,字段及摘要不能自证可信原生来源或策略批准。 - -Go 同步普通 3 项通过,包含多个畸形报告与历史输入子场景;显式本机 Go 1.23.4 原生 1 项通过,发现自动生成具备证据/规则/范围/步骤/复检/历史/关闭条件的 Markdown 任务,重复扫描不复制,修复后任务仍 open。Go CLI 普通 5 项、统一 Go 普通 3 项及统一协议普通 13 项通过。已初始化项目的实际 Go 和统一含违规输出通过 Draft 2020-12 schema 校验;Clippy 与 fmt 通过。Go task verify、可信规则/平台覆盖及正式关闭/重开仍缺,8.2/9.13 不勾选。 - -当前 Go next 源码分支按首次事实摘要保守提示是否需要复扫;新报告的当前源码摘要已写入独立本地观察,但完整最新复检观察消费仍待 Go task verify 接线。不能把当前简报或同步成功说成修复闭环完成。 - -本轮全工作区回归最终退出 0。计数上限和 human 工作台提示的最后调整另经 Go 同步/CLI 专项、统一协议专项、最终全目标 Clippy 与 fmt 验证;默认忽略的原生环境用例不因全量通过而变为已执行。实际 Go 原生同步与报告 schema 验证如上;完整目标的剩余任务不因这轮回归成功而勾选。 - -最终版本显式重跑本地 Go 1.23.4 的 `check_all_go`、`go_lint_cli`、`go_work_sync` 三个原生验收,各 1 项全部通过,覆盖初始化/未初始化、统一 JSON/SARIF、单/双模块、稳定身份、修复、编译失败和持久任务同步;不涉及自动安装或网络下载。 - -## 2026-09-26 Go 原工具任务复检与简报消费 - -环境任务复检新测试先得到 task_checker_unsupported,接通原生调用后又暴露旧事件消费者不识别 Go run ID/report;现 task verify、next、尝试历史与同步事件排序均识别 Go。复检使用显式绝对 Go 路径、同一 runtime 和预算,沿用任务租约/锁、完成尝试绑定和事件原子写入。Go 源码复检子报告 0.5 带 task/path/本轮源码摘要与输入稳定标记,公开任务反馈升为 0.4,追加事件保持 0.3/state_after=open。普通扫描仍为 Go 0.4/check 0.21。 - -真实 Go 1.23.4 环境下仍有原发现为 still_present;同文件同规则出现另一指纹为 rule_coverage_requires_review,不能凭指纹变化推导修复;修复后为 candidate_absent_unverified_policy,编译失败为 incomplete。缺工具环境复检为 still_blocked 并保留事件;原覆盖/策略任务不会因为原工具能运行而标为恢复。next 绑定同一报告字节,原生观察后源码或模块配置变化会要求重新复检,均不关闭任务或签发门禁。 - -普通 Go 同步/复检 4 项通过,显式本机 Go 的同步与任务复检 2 项通过(任务复检还验证模块清单变更使候选失效)。使用现有 jsonschema 对四种实际任务反馈与 Go 子反馈执行 Draft 2020-12 验证通过。一个专项命令误写不存在的 task_attempt_contract,未执行测试;已改用实际包含尝试流程的 task_lease_contract,与 Go/next/task_verify 回归重新运行,原错误不计通过。Clippy 和 fmt 通过;全工作区回归终态另记。正式关闭/重开、全语言完整覆盖、策略批准和宿主接线仍未完成。 - -本轮全工作区 `cargo test --workspace --offline -q` 最终退出 0(默认忽略的原生环境用例未计执行)。末尾的同规则身份变化分流和 Go 参数归属检查经 Go/next/task_verify/task_lease 目标回归、实际 Go 四类输出 schema、最终 Clippy 和 fmt 验证;显式 Go 原生任务 2 项通过。计划仍有正式关闭/重开、完整覆盖与策略/宿主接线缺口,不因本地通过而归档该 change。 - -## 2026-09-26 Go 原生文件范围与观察失效 - -先实际复现 RED:旧源码复检在目标被 build tag 排除时返回未检出候选。新增 go list 连续 JSON 解析与复检范围观察后,标签、CGO 和非宿主平台三种排除均为 rule_coverage_requires_review,保持 open,并提示构建范围复核;清单或身份失败为 incomplete。普通 Go 0.6、源码复检 0.7、check 0.22 绑定整组源码摘要,vet/list 之间及事件采纳时输入变化不可用;next 在后续任一 Go 源码变化时要求复扫,同步旧源码仅保留历史。 - -解析器两项、普通 go_work_sync 四项、next 六项及 task_verify 十项通过。显式 Go 1.23.4 原生 go_work_sync 三项退出 0,包含排除三子场景及后续源码变更。独立临时工作区的 still_present、excluded、candidate_absent_unverified_policy、incomplete 四类实际 task verify 与其 Go 子报告,以及普通 Go/统一检查输出通过 Draft 2020-12 JSON Schema;版本为 Go 0.6/0.7、check 0.22、task preview 0.4。 - -全工作区离线回归最终退出 0;整组源码历史校验的最后调整另经普通 Go 同步回归与最终真实原生/schema 检查。默认忽略用例不计执行。fmt 校验与最终 `cargo clippy --workspace --all-targets --offline -- -D warnings` 均退出 0。完整 Go 注释、平台/规则策略与正式关闭/重开尚未完成;8.2/9.13 不勾选,全部计划仍有 265 项未勾选。 - -## 2026-09-26 白名单纠错可读任务附件 - -RED:真实 Ruff 纠错测试在旧实现缺 projection_status/可读文件时失败。现显式 --record 在同一任务锁内复核收据、生成事件与历史附件,反馈用锁内提案,避免锁前预览与记录混合。附件含七项任务信息,引用同一稳定 finding、旧决策、本轮复检与事件;候选 Markdown/HTML 标点实体化。事件成功但附件失败单独反馈,无覆盖用户编辑;重复记录能恢复删除的附件。next 只展示匹配当前事件重建字节的附件,不从 Markdown 执行或授权。 - -普通 next 六项、白名单提案四项和转义反例一项通过;显式 Ruff 0.16.8 原生提案两项通过。纠错原生用例额外核对七节投影、幂等引用、用户编辑保留、冲突不丢事件、删除重建及 next 对修改附件不采信。0.2 投影状态协议保留 0.1 读取,recorded/failed 区分引用与失败原因;独立临时 Ruff 项目的预览、已记录、附件冲突、删除重建、事件及 next 实际输出通过 Draft 2020-12 Schema;最后添加具体检查器/规则/目标展示后,原生两项与转义反例再次通过,最终 Clippy 与 fmt 均退出 0。完整工作区离线回归最终退出 0;最后的具体检查器/规则/目标展示补充另经最终原生两项、转义反例、Clippy 和 fmt 验证。默认忽略的原生环境用例不计执行。独立批准、可信发布、全事件链和正式任务处置仍缺,4.10/9.28 未勾选。 - -## 2026-09-26 Ruff 复检配置变化与优先级 - -真实 RED 一:F401→E501 修改配置后,next 仍以 still_present 复检驱动旧纠错事件和附件。真实 RED 二:在原 ruff.toml 字节未变时新增同内容 .ruff.toml,普通误报 propose 仍返回旧本地观察。现用当前只读项目发现核对目标所选配置路径和字节摘要;发现不完整、配置缺失/无效/未知、路径或摘要变化及旧报告缺配置身份均不沿用旧观察。next 要求原工具复检,纠错不产生新提案,普通 propose 不展示旧身份;历史记录保留。 - -普通 next 六项、task_verify 十项、白名单提案四项及 work_sync 十五项通过。显式 Ruff 原生任务复检八项与白名单提案两项通过;新增反例覆盖规则配置修改、高优先级配置切换以及未检出候选后再改配置。独立临时项目对配置内容变化、配置优先级变化、删除配置及恢复原配置的实际 next/correction/propose 输出通过 Draft 2020-12 Schema,失效时没有旧事件/附件引用或新提案,恢复后原事件可继续调查且不产生批准。fmt 与最终 Clippy 均退出 0;完整工作区离线回归最终退出 0。普通 propose 优先级核对的最后调整另经上述四组目标回归、原生两项与实际 Schema 验证,默认忽略的原生用例不计执行。 - -本增量只复核当前项目配置,不执行项目脚本、不认证规则包或独立批准;完整候选生成、可信发布、正式门禁及任务关闭仍缺,4.9/4.10 不勾选。 - -## 2026-09-26 批准签名与严格快照桥接 - -两个 RED 分别为签名核验 API 缺失与核验后候选绑定入口缺失。Rust 新增 Ed25519 原文/域分隔核验、宿主上下文和非授权结果类型,依赖 ring 0.17.14 从已有缓存离线解析。载荷绑定工作区、修订、受保护基线、序号、期限及快照原始字节;普通候选桥接仍严格解析快照并核对内外修订,最后使用签名得出的摘要走原有精确绑定。未提供项目自选公钥、自批开关或生产签发 CLI。 - -签名四项、原批准快照十五项通过;反例包括换私钥/目标/基线/快照、签名原文空白变化、错误签名域、密钥撤销/失效/未来、批准未来/过期、无时钟、回滚/超期限、重复已知字段、额外 approved、坏版本/长度/零签名、快照内外修订错配和候选字节篡改。Clippy 通过;格式、schema、OpenSpec 和完整工作区终态另记。当前仅证明给定宿主输入下的密码学核验;公钥来源、可信时钟/防回滚持久状态、完整签名修订链及实际门禁接入仍缺,4.5/4.8 不勾选。 - -分层完整回归首先退出 101:crate_boundaries 拒绝 CLI 直接生产依赖 ring。此失败未忽略,未以目标测试通过替代。密码学原语已移至 runtime;CLI 保留协议解析且仅 dev 依赖 ring 用于测试签名,边界新增 CLI normal/build 和 core 直接 ring 的拒绝反例。修正后的目标边界/签名/快照通过,后续完整回归结果见下。 - -修正后边界三项、签名四项及批准快照十五项退出 0;实际 Cargo metadata 仅有 runtime normal 与 CLI dev 两条 ring 边。另从 RFC 8032 §7.1 TEST 1 获取独立公钥/签名向量,runtime 原语两项验证标准向量、篡改、无效公钥/签名及超限输入均通过;Clippy 与 fmt 通过。封装/载荷 schema 的结构及拒绝自写 approved 样本通过 Draft 2020-12 校验;这些结构样本不证明签名有效,密码学证据来自 Rust 测试。OpenSpec 严格校验及 diff check 通过。修正后的完整工作区离线回归最终退出 0;启动后新增的 runtime 标准向量两项另经目标执行与最终 Clippy/fmt 验证,未计为该次默认套件的已运行项。默认忽略的原生环境用例不计执行。 - -## 2026-09-26 多跳签名白名单修订链 - -RED 为签名链入口与前序输入类型缺失。局部实现逐跳核验签名和快照内外修订,再沿用精确替代/撤销绑定;历史摘要只由验签结果推导。前序序号严格递减,历史签发/审核不得越过子批准签发,旧候选必须在受保护历史审核时刻有效。历史今天过期不抹去当时合法记录,但本轮宿主提供的撤销状态仍须生效。当前批准按本轮时钟核验;超 32 跳在验签前拒绝。 - -首次目标执行有一项测试错误地 unwrap 乱序链的拒绝错误,已修正拒绝断言,并保留失败记录。最终签名链三项、单快照签名四项、旧快照十五项和依赖边界三项共 25 项通过,覆盖正常三修订链、截断/乱序/多余节点、前序私钥不符、序号回滚、未来批准、跨工作区、缺历史时钟、旧候选未生效、历史密钥撤销、空链及上限。最终 fmt 和全目标 Clippy 退出 0。完整工作区回归终态另记;默认忽略的原生环境用例不计执行。宿主信任来源、Git 基线祖先关系、可信发布与实际门禁仍缺,4.10 不勾选。 - -补充时序分支反例:前序签名在历史审核时刻有效,但审核晚于替代批准签发,明确返回 approval_revision_order_invalid。最终链测试四项全部通过,fmt 与全目标 Clippy 再次退出 0。此新增反例在已经启动的完整回归之外单独执行,不将其追溯算入那轮全量套件。 - -完整工作区离线回归最终退出 0,日志为本地 /tmp/codeguard-signed-chain-workspace.log;默认忽略的原生环境用例未计执行。新增第四项时序反例另经专项执行,最终 fmt/Clippy 和 OpenSpec 严格校验、git diff check 通过。完整计划与可信门禁仍未完成,change 不归档。 - -## 2026-09-26 签名链的原生 Git 基线关系 - -两次 RED 分别为 runtime 原生祖先观察缺失、CLI 联合入口缺失。实现后在宿主明确指定的 Git/仓库上,先核验签名与精确替代链,再逐跳检查完整非零同格式提交 ID、commit 对象类型、非浅历史及祖先关系。Git 参数/环境禁用 replace、graft、commit-graph 加速、lazy fetch 和可选锁,所有步骤与各跳共享宿主截止时间及取消标记。Git 失败/未知输出不能转为批准。 - -本机 Git 2.54.0 的 runtime 四项通过,涵盖 SHA-1/SHA-256、同提交/反向/无关、tree/短引用/零/缺对象、replace/graft、浅历史、缺工具/取消/超预算,以及 config/index 字节不变;部分克隆本地假传输有正对照确认能被普通 Git 启动,而 Codeguard 禁取对象观察不启动它,不接外部服务。签名链五项(含真实三提交链、签名有效但无关基线、浅历史)、单快照四项、旧快照十五项及边界三项通过。完整工作区和最终 Clippy/fmt/OpenSpec 终态另记。联合入口不证明公钥/历史时刻/最低序号与仓库/工具可信来源,不签发门禁,4.5/4.10 未勾选。 - -补充签名链用例确认上层取消标记确实传递,不在每跳重置;随后 RED 复现普通签名入口接受有效签名中的全零基线。Rust 与 signed-approval-payload schema 现统一拒绝两种零 ID。最终单快照五项、签名链五项、旧快照十五项和边界三项通过;Draft 2020-12 六个基线结构样本通过(不作为签名证据)。这些后补调整单独执行,不追溯计入已启动的全量回归。 - -本轮完整工作区离线回归最终退出 0,日志为本地 /tmp/codeguard-git-approval-workspace.log。后补的取消与全零基线调整另经上述最终专项、全目标 Clippy 和 fmt 验证;OpenSpec 严格校验与 git diff check 通过。默认忽略的原生环境用例未计执行。联合 Git/签名入口没有升级为可信策略发布或最终门禁,完整计划继续保持未完成。 - -## 2026-09-26 白名单处置与原生主目标关联 - -RED 一/二分别复现原生 finding 工具不同、主目标不同或缺主定位时仍被处置为白名单。DeliveryInput 增加默认空的 native_checker_bindings,宿主须冻结 checker/tool/category/obligation 关联;领域门禁核对唯一映射与实际 finding 工具/义务、类别,再核对第一处主定位。源码/项目核对精确路径,依赖核对组件和非缺省版本;次要位置不能替代不同主目标。旧输入可读,但缺映射不应用白名单;普通无白名单结果保留兼容。 - -RED 三复现冲突输入的首条仍在 whitelisted 集合。门禁现预先统计所有重复 finding 引用与重复批准决策 ID,冲突双方全部不应用;原始/活动阻断保留,反转输入顺序结果相同。正例现提供明确主定位与冻结映射,不将缺定位伪装为完整。 - -最终门禁 26 项、会话汇总 8 项、RunReport 14 项、带例外报告反馈 7 项与 SARIF 3 项通过;core 自身回归通过,最终全目标 Clippy 与 fmt 通过。专项第一次误用不存在的 conversation_feedback_contract 等 target,命令退出 101 未执行测试;改为实际目标后上述回归通过。完整工作区终态另记。以上是合成领域/协议用例,不证明真实原生或批准来源;制品/源内容/依赖图/advisory 归属及签名批准到实际宿主的完整接线仍缺,4.8/4.10 未勾选。 - -后补 RED 四复现错误义务归属仍留下 whitelisted 状态;现在源结果 ID 与 finding.obligation_id 必须一致,源义务无 invalid/incomplete/coverage_mismatch 标记才可参与处置。第 27 项包含错归属、未知义务与覆盖失配,要求保留活动阻断。此修改在已启动的完整回归之外单独验证,终态另记。 - -后补修改的最终目标结果:门禁 27 项、会话 8 项、RunReport 14 项、带例外反馈 7 项及 SARIF 3 项通过;core 自身回归全部通过,全目标 Clippy 与 fmt 退出 0。OpenSpec 严格校验及 diff check 通过。完整工作区终态另记;未将这些合成域模型用例计为真实宿主或原生完整验收。 - -完整工作区离线回归最终退出 0,日志为本地 /tmp/codeguard-native-disposition-workspace.log;默认忽略的原生环境用例未计执行。启动后补充的源义务有效性检查另经上述最终专项、core 回归、Clippy 与 fmt 验证,不追溯计入原全量快照。完整计划和实际宿主门禁仍未完成,change 不归档。 - -## 2026-09-26 最终门禁时钟与签名到期元数据 - -两个 RED 分别为 DeliveryInput 缺最终判定时钟、已验签结果缺只读到期方法。领域门禁现要求非零最终时刻满足 observed_at <= gate_time_unix < expires_at;到期瞬间、缺最终时钟或时钟回退均保留活动阻断与未完成,不能沿用旧取证时间。旧输入可读,无白名单普通门禁不因缺新增时钟改变结论。VerifiedApprovalSnapshot 的私有到期值来自已验签载荷,不新增授权效果;宿主应约束当前批准的最早到期边界,不将历史合法记录的旧期限套到当前替代条目。 - -第一轮目标门禁 29 项、会话 8 项、RunReport 14 项、带例外反馈 7 项、SARIF 3 项、签名与签名链各 5 项及快照 15 项、core 回归通过,Clippy 与 fmt 退出 0。补充只读到期元数据后相同受影响目标、依赖边界与最终静态检查终态另记。本轮未改原生进程或适配器,不重跑无关原生环境用例,也不将合成时刻视为真实宿主时钟验收;可信时钟来源、批准生产及宿主门禁仍缺,4.5/4.8 未勾选。 - -最终相同受影响目标、依赖边界三项及 core 回归全部退出 0;全目标 Clippy、fmt、OpenSpec 严格校验及 diff check 通过。本轮没有执行完整工作区或原生环境套件,不将前轮全量结果当作本轮证据。完整计划与真实宿主门禁仍未完成,change 不归档。 - -## 2026-09-26 当前策略修订与签名处置预览 - -两个 RED 分别为 DeliveryInput 缺当前策略修订、签名处置入口缺失。领域门禁现要求待应用处置与宿主独立冻结的当前修订完全一致,缺/空/不同修订均保留活动阻断。新增只读 BoundFalsePositiveDisposition,普通入口先核验签名/快照/候选,替代入口先核验完整签名/Git 链;候选有 64 KiB 上限。结果固定候选及快照摘要、范围、精确身份、引用、序号与最早当前期限;内部构造且不支持从项目 JSON 反序列化,独立批准标记始终 false。 - -最终门禁 30 项、会话 8 项、处置 3 项、签名与签名链各 5 项、快照 15 项、边界 3 项、RunReport 14 项、带例外反馈 7 项、SARIF 3 项与 core 回归通过,全目标 Clippy/fmt 退出 0。实际 Git 链用例补充合法替代的预览期限、普通入口拒绝替代及无关基线拒绝;其它原生 identity/来源审核为合成模型。测试中显式模拟独立来源审核只为检验字段消费,不是产品批准接口,也不认证真实宿主来源。未执行完整工作区或其它原生工具套件;OpenSpec/diff 终态另记。可信来源、真实批准生产与宿主门禁仍缺,4.5/4.8 未勾选。 - -## 2026-09-26 批准范围到最终门禁 - -相邻 Rust 工程新增 `ApprovalScope`,独立冻结的门禁范围与处置批准范围必须精确一致;签名预览保留范围且仍没有独立批准权威。跨工作区、错基线、缺范围,以及双方同填全零/HEAD/大写/短摘要等非法身份均不能处置 finding。基线指当前批准上下文,不从工作树 HEAD 推导;旧 JSON 可读,但缺范围的白名单不能放行。 - -新增测试先因范围类型与字段缺失失败;实现后受影响 CLI 契约 80 项(含门禁 32、会话 8、签名预览 3、签名链 5、普通签名 5、边界 3、报告 14/7、SARIF 3)及 core 单元/契约 9/8/5/3 均通过。领域门禁的独立来源为合成输入;签名链含本地实际 Git,均不能证明可信宿主批准或全语言交付。OpenSpec strict 与 git diff --check 通过。workspace all-target Clippy(-D warnings)与格式检查均终态通过。验收说明:相邻 `codeguard-cli/tests/acceptance/approval-scope-gate-binding.md`。完整计划仍有 265 项未勾选;4.8 不勾选,本轮未运行 workspace 全测试。 - -## 2026-09-26 Maven 静态模块关系与画像刷新 - -相邻 Rust 工程新增同次清单字节绑定的 Maven 模块观察模型与图 0.2;contains、aggregation、declared build_dependency 分开。完整唯一直接坐标才连接本地依赖,记录来源、SHA-256、scope/声明条件;变量、父模型、profile、依赖管理、特殊属性、重复坐标及逃逸/未知模块保留具体 unresolved。图不能用于缩小扫描范围,不等于 Maven 生效模型。历史 0.1 schema 单独保留。 - -新增 init 用例先因旧图仍为 0.1 且无直接声明关系失败,实现后 init 28 项通过;受影响 check-plan/config/边界/detect/plan 共 38 项及 CLI 库 18 项通过,adapter 常规测试通过(8 项 ignored 原生用例未执行)。曾因回归目标名写错而未运行 CLI 回归,已更正实际目标名后通过;Clippy 首次发现新导出位于 test module 之后;首次调整漏掉了导出,第二次已恢复到测试模块之前,新增 adapter 3 项与 init 28 项重跑通过;该阶段 Clippy/格式已通过;分段文本修复后的最终轮次见补充记录。 - -真实 CLI init 输出经现有 JSON Schema 验证:当前图正例与历史图正例有效,6 个错误状态/摘要/条件/scope/来源/完整性反例拒绝;验证辅助不是产品 Python 实现。初始化未执行 Maven 或 wrapper,刷新依赖版本改变图且保留人工任务备注、重复刷新幂等。OpenSpec strict 与 diff 检查通过,完整计划仍未完成,9.18 不勾选。验收:相邻 codeguard-cli/tests/acceptance/maven-static-module-graph.md。 - -补充:复核发现 XML 注释切分文本时首段可能错误匹配另一模块;新增反例先失败,现拒绝分段标量并记录 unresolved。adapter 4 项与受影响 CLI 66 项重跑通过;追加 Scenario 的 OpenSpec strict 与 diff 校验通过。最后一轮 workspace all-target Clippy(-D warnings)与格式检查均终态通过。 - -## 2026-09-26 Cargo 静态模块图 - -同次 Cargo.toml 字节观察新增 CargoModuleModel;模块图 0.3 区分成员聚合与 path 依赖,保留 normal/build/dev、来源清单摘要与声明条件。package 重命名核对真实目标包名;workspace/optional/target、通配/排除、外部/缺失/逃逸目标及版本/feature 解析缺口保持 unresolved。依赖完整性 false,不用于缩小检查。历史 0.1/0.2 schema 单独保留。 - -新增 init 用例先因旧图 0.2 没有 Cargo 声明而失败。实现后 Cargo adapter 3 项、Maven adapter 4 项,CLI 受影响契约 69 项(init 31、detect 20、check-plan/config 各 6、边界/plan 各 3)与 CLI 库 18 项通过。刷新更名依赖会移除旧边并保留人工备注,重复刷新幂等;没有生成 Cargo.lock/target,也没有执行 build.rs。 - -实际 CLI 产物通过 JSON Schema 验证,5 个错误 scope/basis/status/摘要/完整性反例拒绝,0.1/0.2 历史正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查均终态通过。产品观察/投影是 Rust,schema 辅助不作为产品 Python 实现。未执行 Cargo 有效模型、完整 workspace/所有原生语言检查或端到端交付;完整计划仍在实施,9.18 不勾选。验收:相邻 codeguard-cli/tests/acceptance/cargo-static-module-graph.md。 - -## 2026-09-26 逐清单 Java/Rust 语言目标 - -相邻 Rust adapter 扩展同次清单模型;project profile 0.3 保留 Java compiler release/source/target 与 Rust rust-version/edition 的逐清单 declared_only 事实、构建根和原始摘要。汇总语言版本、本机版本保持 unknown/null,不用包版本、默认值、父/profile/workspace 推断。变量、重复/嵌套/分段 XML、继承/错类型/非法值记录具体缺口;旧 profile 0.2 schema 单独保留。 - -新增 init 用例先因 profile 仍为 0.2 失败,实现后语言目标 adapter 4 项、Cargo/Maven 3/4 项、CLI 契约 71 项与 CLI 库 18 项通过。声明由变量变为 17 后画像刷新并保留人工任务备注,重复刷新幂等。实际 CLI profile 通过 JSON Schema,6 个语言/edition/status/摘要/来源/伪造本机版本反例拒绝,历史 0.2 正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。 - -没有执行原生有效构建模型、安装或本机版本探测;没有运行完整 workspace/全语言/端到端交付,不能把声明当检查能力或质量通过。9.16/9.17 保持未勾选,完整计划仍有 265 项未完成。验收:相邻 codeguard-cli/tests/acceptance/declared-language-target-profile.md。 - -## 2026-09-26 init 画像的 JSON/human 反馈 - -init_plan 0.4 新增 profile_summary,在默认 dry-run 和 apply 反馈语言/文件数量、构建根、逐清单目标与未知状态。human 从同一结构投影,所有不可信路径/字段及已创建/冲突路径均转义;不公开原始清单、本机根路径,不把声明或写文件变成准备/质量通过。旧 init_plan 0.3 schema 单独保留。 - -新增用例先因旧输出 0.3 无摘要失败,实现后 init 36 项与受影响其它 CLI 契约 38 项、CLI 库 18 项通过。真实 CLI 验证 dry-run 不写文件、与 apply 摘要一致、两种格式同目标/未知状态、换行/ESC 目录名不生成伪造状态行,根路径不公开。真实 JSON 通过 schema,6 个伪造就绪/架构/有效模型/目标确认、缺摘要、交付 allow 反例拒绝;历史 0.3 正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 和 diff 检查终态通过。 - -未运行完整 workspace/原生全语言/宿主对话端到端,完整 readiness、准备任务及接线仍缺,9.25 不勾选,完整计划继续实施。验收:相邻 codeguard-cli/tests/acceptance/init-profile-conversation-feedback.md。 - -## 2026-09-26 init 检查配置反馈 - -init_plan 0.5 按构建根展示静态检查器配置的 configured/missing/invalid/unknown、来源、原因和下一步。每条固定 not_run、required_by_policy=null、gate_effect=none,整体 checker_inventory=partial;不把缺配置变成源码违规或把声明当执行成功,未知继承保持未知。旧 init_plan 0.4 schema 单独保留。 - -新增用例先因旧 0.4 无检查配置反馈失败,实现后 init 39 项与其它受影响 CLI 契约 38 项、CLI 库 18 项通过。实际临时项目验证四个 Maven 构建根状态及 human/JSON 一致;Python 缺 Ruff 配置不产生 finding,源码不变,dry-run 不落盘或启动检查。真实四状态输出通过 schema,6 个伪造配置通过/执行完成/必需策略/门禁/完整清单/缺下一步反例拒绝,旧 0.4 正例有效。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。 - -没有运行完整 workspace/全语言原生检查或宿主对话端到端;批准义务、准备任务与完整 readiness 仍未接入,9.24/9.25 不勾选,完整计划继续推进。验收:相邻 codeguard-cli/tests/acceptance/init-checker-configuration-feedback.md。 - -## 2026-09-26 preparation readiness 领域判定 - -新增分文件的要求/观察/状态/输入/结果契约和纯 evaluate_readiness。只处理批准且适用必需前置,以当前绑定和可信时钟检查证据;有效必需缺失/不兼容/冲突优先 incomplete,未探测/未解析/过期/错绑定/歧义为 unknown,完整非空适用集合全部满足才 ready。可选失败与旧证据不影响汇总。verified 字段是宿主输入约定,不构成本地 JSON 授权;CLI 未接入可信来源,init 仍 unknown。 - -新用例先因类型/函数不存在编译失败,实现后 readiness 8 项、受影响会话 8/门禁 32/init 39/边界 3 共 90 项,以及 core 单元/契约 9/8/5/3 通过。联合用例确认准备 ready 不提供缺失的原生检查证据,交付仍 incomplete;不从零阻塞/零必需集合或可选缺工具推导假就绪。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 和 diff 检查终态通过。 - -这些是领域合成输入,不证明真实工具探测或批准/来源核验;未运行完整 workspace/原生全语言或宿主端到端。可信来源、实际准备清单、任务规划/持久化及 CLI接线仍缺,9.25 不勾选,完整计划继续实施。验收:相邻 codeguard-cli/tests/acceptance/preparation-readiness-domain.md。 - -## 2026-09-26 Maven/Cargo 直接包版本画像 - -已有 package_declared_versions 现在记录当前清单直接包版本,绑定同批原始字节 SHA-256。Maven 不要求完整 GAV,不从父/profile 或变量恢复;只观察有界字面值,不证明 Maven 生效语义。Cargo 使用本地已缓存 semver 1.0.28(锁文件固定)校验直接字符串,保留预发布和构建标识;继承、错类型和非法版本保持未知。包版本与语言目标/本机版本分离,画像刷新保留人工任务记录并幂等,不执行项目构建器。 - -新增混合项目用例先因包版本字段 Null 而失败,实现后 init 41 项通过。package version 2 项、Cargo 模块 3 项、Maven 模块 4 项通过;检测/配置/检查计划/计划预览共 35 项与 CLI 库 18 项通过。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查通过。验收入口及反例见相邻 codeguard-cli/tests/acceptance/declared-package-version-profile.md。 - -依赖边界检查首次因新增 semver 未登记而失败;将其限定为 adapters 普通解析依赖后,4 项边界用例通过,反例拒绝 core/runtime/CLI 和 adapter 构建依赖。重新运行 all-target Clippy 与格式检查均终态通过。 - -未运行完整 workspace、全语言原生检查或宿主端到端。其它生态、有效构建模型、解析依赖版本、本机版本探测与可信准备任务仍缺,9.16/9.17 不勾选;完整计划保持进行中。 - -## 2026-09-26 准备任务领域规划 - -核心 plan_preparation 使用同一 readiness 输入与当前判定。已确认必需缺失/不兼容/冲突分别规划恢复、兼容复核、冲突决策;未知只要求重新核验,不保留过期或错绑定的旧诊断。工作区内稳定逻辑键不受绑定/状态变化影响,当前绑定更新,任务排序与重复规划幂等。未核验来源、非法/重复要求不生成行动任务,可选/不适用/满足条件不生成修复任务。固定中文步骤和关闭条件不拼接项目命令,不自动执行/安装或产生质量 allow。 - -目标用例先因类型/函数缺失失败。实现后规划 7 项、readiness 8 项、init 41 项、边界 4 项、交付门禁 32 项、检查会话 8 项共 100 项通过,core 单元/契约 9/8/5/3 共 25 项通过。部分清单仍保留已确认阻塞与未知兄弟,旧证据不误导安装;向计划注入 delivery_decision 被严格消费拒绝。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。验收见相邻 codeguard-cli/tests/acceptance/preparation-task-planning.md。 - -证据为合成领域输入,不证明真实工具探测或批准来源。未运行完整 workspace/全语言原生或宿主端到端。真实要求生产、证据/历史关联、工作区持久化、doctor/check/sync/next 与 CLI 接线尚缺,9.25 不勾选;完整计划保持进行中。 - -## 2026-09-26 tools verify 只读 CLI 接线 - -新增 tools verify 入口及 human/JSON 同源反馈,默认读取 codeguard.lock.json 或显式候选,有界普通文件读取拒绝链接锁。复用工具三来源及独立 runtime/bundle 核验,逐项展示摘要/可执行位、issue 和恢复建议,隐去路径与锁原文。仅当前平台条目形成观察,版本保持 lock_declared_only,字节匹配仅 matched_untrusted。固定 incomplete、authority=unverified、readiness=unknown、gate_effect=none 与退出 3,不启动 wrapper、联网、安装或写工作区。 - -入口缺失时最初 4 个用例因无 JSON 输出失败;实现及扩展后 CLI 8 项、静态身份 8 项、配置 6 项、边界 4 项共 26 项通过。测试 wrapper 含副作用但没有运行;运行时/目录包缺口与入口匹配分开。跨平台测试首次用了非协议平台名,改用正式平台清单反例后通过,未放宽解析。报告 0.1 schema 验证 2 份实际 CLI 输出及 6 项伪造批准/就绪/门禁/执行/版本反例。workspace all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查通过。 - -mock 及静态制品核验不是原生启动或可信工具锁来源证明。未执行完整 workspace/全语言原生或宿主端到端;tools list/install、可信锁来源、doctor 有界原生诊断、准备报告持久化及 work sync 仍缺,5.2/5.6 不勾选。验收见相邻 codeguard-cli/tests/acceptance/tools-verify-command.md;完整计划保持进行中。 - -## 2026-09-26 原生版本探测故障分类 - -runtime 新增分文件的原生版本请求/观察与共享探测服务,限制版本参数并核对工具前后字节、精确 stdout、无异常 stderr、私有日志及共同截止时间。超时/启动前耗尽/取消/spawn/signal/输出超限/管道/清理/平台/非零退出分别保留诊断码和 termination;版本不符、stderr、字节变化和记录失败不再合并。现有 Ruff 版本启动阶段复用服务,失败不继续源码扫描,结果没有策略批准或质量通过权限。 - -目标用例先因类型/函数缺失失败。模拟探测与显式选择真实 Ruff 的 7 项、边界 4 项、默认 Ruff probe 5 项、Python scan 6 项、runtime process 15 项/private log 6 项共 43 项通过。随后明确设置 CODEGUARD_RUFF_BIN,补跑原有两套各 5 项 ignored 真实 Ruff 0.16.8 扫描回归,共 10 项全部通过;没有把默认跳过当成通过。all-target Clippy(-D warnings)、格式、OpenSpec strict 与 diff 检查终态通过。 - -测试目录最初含 macOS 临时路径链接导致私有日志被拒,改用规范化路径而未放宽守卫。执行期间字节变化测试最初追加非法命令导致真实非零退出,修正成合法注释以验证零退出但制品变化。真实版本用例只调用版本;真实扫描用例单独证明已有局部 Ruff 配置/范围/报告行为,均不代表完整策略门禁。 - -doctor CLI、可信工具锁来源、完整兼容/环境诊断、其它适配器复用及准备报告持久化/同步仍缺;未运行完整 workspace、全语言或宿主端到端,5.2/5.6 不勾选。验收见相邻 codeguard-cli/tests/acceptance/native-version-diagnostics.md;完整计划保持进行中。 - -## 2026-09-26 doctor 局部配置/Ruff 入口 - -新增 doctor 命令及 human/JSON 反馈;默认只观察项目配置,工具未选择不等于缺失。仅显式绝对路径 Ruff 进入固定版本参数探测,复用统一 runtime、0700 私有临时运行区及空继承环境。单探测上限 10s 并受剩余总预算约束(默认 2m,静态发现非硬预算覆盖);脚本入口无隔离时启动前拒绝,Mach-O/ELF 格式筛选不代表批准或网络隔离。本地原生成功仅 observed_untrusted、版本 Ruff 0.16.8,公开输出无工具/临时路径或原生文本;readiness unknown、交付 not_evaluated、quality_checks not_run、gate_effect none。取消退出 130,其它局部状态退出 3。 - -目标行为缺失时三个用例因没有 JSON 输出失败;实现后 doctor 6 项(含显式真实 Ruff)、版本观察 7 项、初始化 41 项、工具核验 8 项、边界 4 项共 66 项通过。四份实际 CLI 未选择/缺工具/脚本拒绝/原生版本输出及项目摘要通过 doctor 0.1 和现有 init 摘要 schema;7 项伪造批准、ready、交付、质量执行、门禁、保存或必需策略反例拒绝。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查终态通过。 - -临时日志仅本次观察使用,不写 codeguard/ 或导入准备任务,persistence=not_saved;输出不是正式 PrerequisiteReport。可信锁/必需前置绑定、其它工具与运行环境、完整隔离/预算覆盖、持久报告与 work sync/next 仍缺。未运行完整 workspace/全语言原生或宿主端到端,5.2/5.6 不勾选;验收见相邻 codeguard-cli/tests/acceptance/doctor-local-ruff.md,完整计划继续实施。 - -## 2026-09-26 doctor 报告持久化与稳定环境任务 - -doctor 0.2 已在绑定工作区保存不可变报告并自动同步;显式 Ruff 失败产生稳定环境调查任务,原因变化记录独立观察且不增生任务。未选择不制造必需缺失,真实 Ruff 版本恢复后原任务仍 open;next 返回 doctor 恢复路径,不修改无关源码。落盘 queued 与对话 synced_partial/backlog_update_failed 分开,报告不原地改写。导入检查严格字段、预算、工作区及未获授权状态,拒绝伪造批准/就绪;保存目录链接被拒。旧检查器没有新增 null 诊断字段。 - -目标回归 54 项通过、10 项 ignored;CODEGUARD_TEST_RUFF 明确指向本机 Ruff 0.16.8,doctor 原生版本与恢复用例实际运行。10 份实际输出/落盘记录通过公开 schema;6 项伪造授权与通过反例拒绝。首次 Clippy 指出函数置于测试模块之后;移动时误放入局部函数,编译检查发现后改至模块级。最终 all-target Clippy(-D warnings)通过,格式、OpenSpec strict 与 diff 检查通过。详情见相邻 tests/acceptance/doctor-workspace-sync.md。 - -完整可信 PrerequisiteReport、批准义务/工具锁来源、其它工具、doctor 专用原生复检关闭及宿主端到端仍缺。没有运行全 workspace 测试、发布或安装,不勾选完整任务,目标保持进行中。 - -## 2026-09-26 doctor 环境任务原生复检 - -task verify 识别 python.ruff.doctor,复用固定版本诊断、剩余预算及报告同步,失败保留具体原因,未选择不推导恢复;成功仅 environment_restored_unverified_policy,原任务保持 open。next、同步时间序列及尝试账本接入 doctor 运行身份和严格报告分类。next 提示仅版本观察、核验批准前置并运行原受阻质量检查,未关闭或签发质量通过。 - -最初两个新增用例因不支持检查器失败;实现后 next 查询暴露尝试账本不识别 doctor run_id,补齐该消费者后通过。65 项相关测试通过、10 项 ignored;真实版本恢复用例显式指定 Ruff 0.16.8,默认不把未选原生环境算通过。12 份实际复检/原生/落盘/事件 schema 验证与 allow 篡改反例通过。all-target Clippy(-D warnings)及格式通过,OpenSpec strict/diff 检查通过。详见相邻 tests/acceptance/doctor-task-verification.md。 - -正式 PrerequisiteReport、可信义务来源、当前证据时效、全工具及正式关闭/重开尚缺;全 workspace 测试、其它原生与宿主端到端未运行,不勾选完整任务,目标保持进行中。 - -## 2026-09-26 tools list 声明库存入口 - -新增 tools list,共用有界锁读取、严格解析、三来源及独立运行时/发行包制品核验。稳定列出声明版本、适配器/规则来源、平台及具体制品缺口;其它平台仅 not_inspected,候选锁不获得必需策略或准备权限。公开报告固定 declared_lock_only、required_inventory unverified、required_by_policy null、readiness unknown、gate none 与退出 3,不启动 wrapper、联网、安装或写工作区。现有 verify 报告字段保持。 - -四项入口缺失测试先失败,实施后六项库存用例加八项原有 verify、八项身份、六项配置,共 28 项通过。五份实际库存 schema 验证覆盖缺锁、三来源及其它平台,五项批准/就绪/必需/门禁篡改被拒。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tools-list-command.md。 - -可信完整必需库存、tools install 与发行恢复未实现,全 workspace 测试/原生启动/宿主端到端未运行;5.6 保持未完成,继续原目标。 - -## 2026-09-26 受管安装原子缓存发布基础 - -新增 runtime 冻结字节发布 API,128 MiB 上限、非零预期 SHA-256、取消/预算检查;缓存根归属和权限检查,固定目录 FD 独占暂存、0700、同步/重读校验、linkat 不覆盖原子发布、最终普通文件再核验。正常清理本次暂存,不删除遗留/冲突目标;相同制品重新核验后复用。收据不表达批准或质量状态,正式来源批准/下载/CLI 尚缺。 - -初始五项测试因 API 缺失失败;补齐后十项普通发布用例通过,覆盖摘要、取消、期限、链接/FIFO、权限、硬链接、超限、遗留及并发恢复。fresh_report/private_log/边界/身份/工具 CLI 相关用例共 53 项通过。另显式指定本机 Ruff 0.16.8,1 项原生临时缓存发布及统一版本观察实际通过;未用默认 ignored 代替执行。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tool-cache-publication.md。 - -该基础不证明可信发行来源或全平台安装;不可中断文件系统调用和同用户改写不具有强隔离保证,发布后失败可保留完整制品并需重验。未运行全 workspace/Windows/网络下载/压缩包/宿主端到端,不勾选 5.3/5.6,继续完整目标。 - -## 2026-09-27 tools install 候选预览与 apply 边界 - -新增显式 --lock、默认 dry-run 的安装预览入口,共用有界静态锁/制品核验。候选报告绑定锁、二进制和来源引用摘要,区分当前/其它平台及恢复动作。来源尚未批准时 apply 明确 blocked_before_mutation,不启动、下载、写入或调用发布服务,固定 unknown/unverified/无门禁效果。 - -三个入口用例先失败;实施后工具 CLI/身份/配置共 32 项通过。三份实际输出 schema、两种模式冲突和四项伪造完成反例通过;all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tools-install-preview.md。可信源披露/批准、下载、发行包、正式 apply 与全平台/宿主验收仍缺,全 workspace 未运行;5.3/5.6 不勾选,目标继续。 - -## 2026-09-27 发行清单解析与精确锁绑定 - -新增 distribution-manifest 1.0 schema、严格有界解析及绑定 API,核对锁原始字节和精确制品身份;绑定重新验证对象,raw 交叉字段及两种归档相对入口分别限定。http 1.5.0 只解析 URI,无网络客户端;新增依赖边界验证。 - -11 项契约与 4 项 crate 边界通过(无 ignored);schema 4 正例/16 反例通过,all-target Clippy(-D warnings)通过。详细验收见相邻 tests/acceptance/distribution-manifest-binding.md。清单只表达声明子集;可信来源、下载、展开及正式 apply/CLI 接线仍缺,5.3/5.6 不勾选,完整目标继续。未运行全 workspace 或宿主端到端。 - -## 2026-09-27 tools install 显式清单预览 - -新增 --distribution-manifest FILE,0.2 报告及旧 0.1 schema 保留;有界读取、严格解析、原始锁精确绑定,固定状态和逐工具脱敏包声明。子集声明不证明其它工具/独立运行时覆盖,apply 继续写前阻塞。 - -22 项 CLI、11 项清单、4 项边界共 37 项通过;7 份实际报告 schema 和 4 项伪造权限反例通过。见相邻 tests/acceptance/tools-install-manifest-preview.md。可信下载、展开、批准发布、完整 apply/宿主验收仍缺,5.3/5.6 不勾选;未运行全 workspace,目标继续。 - -## 2026-09-27 展开前发行包流验证 - -新增 runtime 有界包流校验 API,精确大小、SHA-256 和共享截止时间;超长最多读取声明加一,读取前后检查预算/取消,中断继承预算,固定脱敏失败。验证只是冻结字节,不授予发行来源或安装权限。 - -6 项初始缺 API 测试失败,补齐及扩充后包流 9 项和缓存发布 10 项通过。临时缓存串联验证 raw 字节发布/复用;错误包不进入发布。1 项原生 Ruff 用例本轮 ignored,未计运行。all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/package-stream-verification.md。网络层单次超时、HTTPS/TLS、可信下载及归档/正式 apply/宿主仍未接通;全 workspace 未运行,5.3/5.6 保持未完成,完整目标继续。 - -## 2026-09-27 静态输入 FIFO 卡住修复 - -先以独立子进程复现共享静态读取器在无写入端 FIFO 的 open 上阻塞,父进程超时后终止并回收,回归失败。Unix 打开增加 O_NONBLOCK/O_CLOEXEC,仍拒绝目标链接,并由同一句柄类型/大小检查拒绝特殊输入。 - -修复后 runtime 库 4 项、真实 FIFO 读取 1 项、CLI 命令 23 项和 crate 边界 4 项,共 32 项通过,无 ignored。CLI 中 install 的锁及清单 FIFO 均明确 unreadable/退出 3,不写工作区、无准备通过。格式、OpenSpec strict/diff 检查通过;见相邻 tests/acceptance/bounded-input-fifo.md。 - -此修复不保证任意文件系统硬超时或 Windows 特殊文件语义,未完成发行授权、网络下载、归档、正式 apply/宿主验收;全 workspace 未运行,完整目标继续。 - -## 2026-09-27 ZIP/tar.gz 内存展开基础 - -新增 runtime 归档请求/冻结文件及内存展开 API,固定 tar/zip/flate2 Rust 后端依赖且只允许 runtime 普通依赖接入。核对包/入口摘要,全成员路径、文件类型、重复/大小写/祖先冲突;最多 10000 成员、512 MiB 文件预算,tar 头和填充另给有界 16 MiB。gzip/ZIP 完整读取、损坏与隐藏尾部拒绝,ZIP 注释仍支持,SFX/加密/不支持算法及 tar GNU/PAX 等明确未完成。 - -三项缺 API 测试先失败,补齐后归档逐步扩充至 11 项;两格式均实际串联包流校验→内存展开→临时受管缓存发布。相关包流 9 项、缓存 10 项、crate 边界 5 项、清单 11 项和工具 CLI 23 项通过,共 69 项(1 项原生工具 ignored 不计运行)。见相邻 tests/acceptance/package-archive-expansion.md。 - -尚未实现全 tar 扩展、bundle 树核验/完整目录发布、实际下载、可信发行批准或正式 CLI apply;当前工具链不等于实际 MSRV/全平台验收,未运行全 workspace/宿主端到端。5.3/5.6 不勾选,完整目标继续。 - -## 2026-09-27 GNU/PAX 有界局部扩展 - -新增 TarExtensionState,逐记录精确长度及完整消费校验,GNU 有界 NUL 路径、局部 PAX path/size、无害全局描述。拒绝危险/重复/矛盾/孤立扩展、大小溢出及不支持的全局路径/大小、sparse/linkpath/字符集变换;不恢复权限、时间、所有权或 xattr。 - -两项正例先因不支持类型失败;PAX size 合法覆盖旧头又因相等限制失败,随后改为用 tar 头字段解析与校验和核对、按生效大小推进实际数据边界。标准 tar 迭代交叉核对旧头为零而 PAX size=4 的样本及后续 LICENSE 边界。完整 GNU UTF-8 路径覆盖旧头截断字节回归通过,局部扩展不跨成员。 - -归档 17 项、包流 9 项、缓存发布 10 项、crate 边界 5 项,共 41 项通过;1 项原生缓存用例 ignored 不计运行。最终 all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/tar-extension-verification.md。全局 PAX/sparse/链接、bundle/目录发布、可信下载批准、CLI apply 与全平台/宿主尚缺,全 workspace 未运行;5.3/5.6 不勾选,完整目标继续。 - -## 2026-09-27 完整内存树与既有 bundle 摘要关联 - -新增 UnpackedArchive、完整树展开入口及内存 hash/verify;保留空目录、补全父目录,旧文件集合接口仍可用。公开对象重验规范路径/父目录/冲突/总量,单文件和树资源边界与既有本机 bundle-tree-v1 对齐;按本机 Path 排序及原目录栈顺序记录,内容按块检查共享预算/取消。 - -三项初始 API 缺失测试失败;实施后真实临时目录和内存树摘要精确相同,乱序不变、库篡改/空目录缺失/伪造形状/无效预期摘要/取消到期均拒绝或失配。两种归档验证空目录及隐式父目录保留,父目录大小写冲突拒绝。归档 19、包流 9、缓存 10、原有制品身份 8、边界 5、完整树 3,共 54 项通过;1 项原生缓存用例 ignored 不计运行。最终 all-target Clippy(-D warnings)、格式、OpenSpec strict/diff 检查通过。见相邻 tests/acceptance/unpacked-bundle-tree.md。 - -此处仅本机内容等价验证,不是可信批准或正式安装。包前缀到锁 bundle 根的映射、完整目录原子发布、网络下载/批准、CLI apply/恢复及全平台/宿主尚缺,全 workspace 未运行;5.3/5.6 不勾选,完整目标继续。 - -## 2026-09-27 显式归档目录投影 - -完整原树先验证,显式规范目录按路径边界去前缀;选中空目录保留,未消费成员以原路径和内容返回,不复制文件内容。只读投影核对既有 bundle 树摘要,不授予来源或安装批准。初始四项契约因 API 缺失失败;实施后 projection 4、归档 19、包流 9、缓存 10、完整树 4、制品身份 8、crate 边界 5,共 59 项通过。包括投影实际写入临时目录与既有 CLI 摘要一致,以及兄弟目录、非法外部成员、缺根/错根、篡改和取消/预算反例。1 项原生缓存用例 ignored,不计运行。all-target Clippy -D warnings 通过。详见相邻 tests/acceptance/bundle-root-projection.md。 - -正式发行清单映射、可信来源、实际下载、目录发布、CLI apply/恢复及平台/宿主验收仍未完成;未运行全 workspace,5.3 不勾选。 - -## 2026-09-27 发行清单 1.1 与 bundle 内容关联 - -两项清单测试先因不支持版本/字段失败,三项内容关联测试先因 API 缺失编译失败。实现后清单 13、关联 3、安装观察回归 23,共 39 项通过。固定 ZIP 实测包大小/摘要、精确入口、完整树与指定 bundle 根;错包/入口/根/锁、缺映射、取消和到期均拒绝。schema 4 正例/10 反例通过,旧 1.0 schema 单独保存。all-target Clippy -D warnings、格式检查通过。见相邻 tests/acceptance/distribution-bundle-binding.md。 - -内容关联不授予批准或安装完成;实际缓存根映射、可信来源/下载、目录发布、CLI apply/恢复与平台/宿主验收仍缺,未运行全 workspace,5.3 保持未完成。 - -## 2026-09-27 完整工具目录发布基础 - -新增 macOS/Linux publish_tool_bundle、目录 FD I/O、独占暂存清理与 InstalledBundle。冻结完整树/预期摘要先验证;成员以 0700 写入,文件/目录同步并重新比较成员集合、内容及类型/权限/单链接,原生独占重命名发布,不覆盖已有目标。最终再次核验,同树并发只有一个新发布,另一方核验后复用。发布收据不包含批准权威。 - -初始 5 项 API 缺失编译失败;实施后 6 项目录发布、4 项投影、10 项已有缓存及 57 项 CLI 相关测试,共 77 项通过。1 项原生缓存 ignored,不计运行。包括真实暂存出现后取消清理,以及固定发行包经清单/锁/入口/子树关联后发布,并与既有磁盘 bundle 摘要精确一致。Clippy 曾指出新增测试无用闭包/单位绑定,已修正,重跑串联 4 项和最终 all-target Clippy -D warnings 通过。OpenSpec strict/diff 检查通过。 - -本机仅 macOS 实测;Linux/Windows、跨进程及故障注入全集、同权限恶意进程隔离未验收。缓存根到锁路径映射、未消费包成员与运行时、可信下载/批准、正式 CLI apply/恢复/宿主验收仍缺;未运行全 workspace,5.3 保持未完成。详见相邻 tests/acceptance/tool-bundle-publication.md。 - -## 2026-09-27 完整安装布局与原锁定位 - -清单 1.2 声明完整 install_tree_sha256,归档必需/raw 禁止,旧 1.0/1.1 保持观察但不能猜布局。绑定精确锁入口和可选 bundle 根到同一完整树内容寻址目录,不重写锁。只读布局保留全部原包路径/普通成员/空目录,核验完整树及可选子树;空包内根与无 bundle 均可核验。 - -新增契约先因 API 缺失编译失败;5 项包/布局、14 项清单、23 项观察、8 项制品身份、5 项边界,共 55 项通过。实际临时缓存发布后原锁的入口摘要/基础可执行位和 bundle 摘要一致。bundle 外内容不符即使重建相符声明/锁路径也被完整树拒绝,错入口/根亦拒绝。schema 5 正例/7 反例与 all-target Clippy -D warnings 通过;增强精确错误码后目标契约重跑通过。见相邻 tests/acceptance/distribution-layout-binding.md。 - -正式 CLI 布局反馈、可信来源/下载、raw/运行时安装、恢复及其它平台/宿主尚缺;未运行全 workspace,5.3 不勾选。 - -## 2026-09-27 安装布局预览反馈 0.3 - -新契约先因反馈仍是 0.2 失败;新增脱敏 layout 投影与 JSON/human 阶段解释,完整声明绑定、缺完整树及 raw 不适用分别显示,内容核验 not_run,未批准 apply 不写入/不准备/不放行。0.2 schema 独立保存,新枚举覆盖 bundle/完整布局错误原因,禁止格式/阶段矛盾。 - -24 项命令、14 项清单、5 项包/布局、5 项边界,共 48 项通过;补 human 与 raw 断言后命令 24 项再次通过。最终 schema 的 8 份真实命令输出通过;4 个伪造批准/准备/写入/内容完成与 2 个阶段矛盾被拒,旧 schema 拒绝新版本。all-target Clippy、目标 Clippy、格式检查通过。见相邻 tests/acceptance/tools-install-layout-preview.md。 - -来源批准、实际包下载/核验/安装、raw 定位、恢复与平台/宿主仍缺;未运行全 workspace,5.3/5.6 保持未完成。 - -## 2026-09-27 raw 内容与原锁缓存定位 - -新增 1.2 raw 精确入口约束和不可变借用内容 API;旧清单不猜定位,错误路径连同相符来源摘要仍拒绝,包长度/摘要/原锁字节与共享期限/取消均核对。结果不复制制品内容,Debug 不输出原字节,不赋予来源/门禁权威;预览相符新版定位指向后续包内容核验,旧版要求映射,content_verification 仍 not_run。 - -初始因 API 缺失编译失败;4 raw、14 清单、5 包/完整布局、25 命令、5 边界,共 53 项普通测试通过。另显式 CODEGUARD_TEST_RUFF=/opt/anaconda3/bin/ruff 执行真实 0.16.8 字节关联/临时私有缓存发布/runtime 原生版本观察,1 项通过,2.17 秒。该未批准测试声明未下载或执行 lint,不证明规则覆盖/发行批准。4 份实际 raw 预览 schema 与伪造内容完成反例通过;all-target Clippy -D warnings 通过。见相邻 tests/acceptance/distribution-raw-binding.md。 - -可信来源/真实下载、运行时安装、正式 apply/恢复和平台/宿主仍缺,未运行全 workspace,5.3 保持未完成。 - - -## 2026-09-27 有界 HTTPS 包传输 - -新增冻结请求与异步 runtime API,采用 TLS 验证、精确长度/摘要、五跳手动 HTTPS 重定向、显式 authority 范围、共享绝对期限/取消和固定诊断。不采用环境代理、自动重试或内容解压,不写缓存、不授予来源/安装权威。仅 cfg(test) 信任本地测试 CA;生产无根替换/关闭验证参数。 - -API 缺失先编译失败,TLS 正例在测试服务显式清除 macOS 接受连接的非阻塞继承后通过。加强反例要求请求已到达且诊断精确;gzip, chunked 新例先意外返回成功,生产增加编码校验后通过。11 TLS 与 96 相关不同回归通过;两个真实 Ruff ignored 不计已运行。154 已缓存 registry manifest 无高于 1.85 的声明,14 非本机/wasm 未缓存未核验;不是实际 1.85 或跨平台验证。见相邻 tests/acceptance/package-https-transport.md。 - -完整发行源/网络授权、清单到下载及发布正式接线、运行时安装、apply/恢复与宿主仍缺,未运行全 workspace,5.3 不勾选。 - -最终 runtime/CLI all-target Clippy -D warnings、cargo fmt --check、OpenSpec 严格校验与插件 git diff --check 均通过。 - - -## 2026-09-27 下载归档完整树及临时发布串联 - -新增 download_verified_archive,请求前校验包声明一致及展开输入,下载后原归档解析与入口/完整树核验使用共享预算。新测试最初因 API 缺失失败,实现后 15 HTTPS 目标项通过;新增 ZIP/tar.gz 和 raw 实际本地 TLS 至私有临时缓存证据,空目录/入口完整,错误树/包摘要拒绝,声明冲突/坏展开输入不发请求。见相邻 tests/acceptance/downloaded-package-publication.md。 - -来源与网络授权、正式 CLI 下载到安装编排、运行时/恢复、远端发行源及全平台/宿主仍缺,5.3 不勾选,未运行全 workspace。 - -最终回归:runtime 单元 19、归档 19、完整树发布 6、raw 缓存 10,共 54 项通过;1 项真实 Ruff ignored 不计已执行。runtime all-target Clippy -D warnings、格式、OpenSpec 严格校验及插件 diff 检查通过。 - - -## 2026-09-27 发行专属签名与清单/锁绑定 - -新增独立 distribution.v1 Ed25519 域和版本化载荷/封装,精确固定原始清单/锁、范围、序号和有效期,并继续严格制品绑定。API 缺失先编译失败;8 项目标签名契约覆盖篡改/协议重放/失效或撤销/回滚/范围/坏清单锁/输入限制。两份 schema 结构正例与必填缺失/未知批准反例单独校验,不等于密码学验证。见相邻 tests/acceptance/signed-distribution-binding.md。 - -独立宿主真实信任来源、轮换撤销及防回滚持久状态、网络许可、最终时钟和正式下载/install 编排仍缺,5.3 不勾选,未运行全 workspace。 - -最终验证:签名 8、清单 14、完整布局 5、raw 4、tools 预览 25,共 56 项通过;1 项真实 Ruff ignored 不计运行。两份 Schema 2 个结构正例/15 个缺字段或未知批准反例通过。CLI all-target Clippy -D warnings、格式检查、OpenSpec 严格校验和插件 diff 检查通过。 - - -## 2026-09-27 签名发行包与缓存发布编排 - -新增明确调用的离线包编排,绑定签名/原始锁与清单、本机平台和精确工具;raw 与完整归档布局在同一预算下核验并调用受控缓存发布,入口保持原锁。前/发布前/发布后可信时钟与签名复核,取消和截止共享,发布后失败不返回成功且重试必须重验。5 项目标契约先因缺 API 失败、实现后通过,见相邻 tests/acceptance/signed-package-publication.md。 - -真实宿主信任/撤销及防回滚来源、网络授权、正式 CLI 下载至安装编排、运行时/恢复、其它平台/宿主仍缺,5.3 不勾选,未运行全 workspace。 - -最终验证:发布编排 5、签名 8、完整布局 5、raw 4、tools 预览 25,共 47 项通过;1 项真实 Ruff ignored 不计运行。CLI all-target Clippy -D warnings、格式检查、OpenSpec 严格校验及插件 diff 检查通过。 - - -## 2026-09-27 签名网络下载及缓存发布编排 - -新增网络服务请求前核对签名/本机平台/精确工具/清单 1.2/宿主精确 authority,下载后进入签名包发布服务共享预算。前置五类反例无写入;显式固定 Rust 官方仓库提交 LICENSE-MIT,以测试 key/时钟调用生产公共 TLS 客户端,真实下载及临时发布 1 项通过(0.70 秒),内容不执行,未替代真实发行根。见相邻 tests/acceptance/signed-network-publication.md。 - -真实宿主信任/网络许可来源、正式 CLI apply 接线、原生工具包/运行时/恢复与全平台仍缺,5.3 不勾选,未运行全 workspace。 - -最终回归:网络前置 1、签名 8、发布 5、tools 预览 25、runtime HTTPS 15,共 54 项普通测试通过;另 1 项显式真实公共 HTTPS 下载发布通过。CLI/runtime all-target Clippy -D warnings、格式、OpenSpec 严格校验与插件 diff 检查通过。 - - -## 2026-09-27 Javadoc 明确 Maven 模式不回退单文件 - -真实 First 引用 Second 样本先复现孤立 JDK 探针的无关 native_execution_incomplete;现在明确 Maven 时只运行原 POM 多文件检查,缺前置保留具体原因而不回退,未选择 Maven 的 JDK 局部模式保留。反馈 0.23.0/Javadoc 0.3.0 显式区分模式及检查器,旧 schema 单独保留。真实警告与文档完整两轮均成功,不签发项目覆盖;两份实际反馈 schema 正例及四个混合模式/错检查器反例通过。见相邻 tests/acceptance/javadoc-project-mode-selection.md。 - -并行回归的 schema 旧版本断言已更新;另取消用例未在两秒内观察到任务齐备,独立重跑通过但根因未定位,不能声称消除。生效模型/类路径/生成源码/Checkstyle/任务门禁等仍缺,6.3 不勾选。 - -最终验证:Java check 24、partial 13(随后串行)、Javadoc CLI 4,共 41 项普通测试通过;另 3 项明确执行的真实 Maven/JDK 测试通过。2 个实际 Maven 报告与 1 个实际 JDK 单文件报告通过新 schema,4 个混合模式/错检查器反例被拒,旧 schema 拒绝新版。CLI all-target Clippy -D warnings、格式、OpenSpec 严格校验和插件 diff 检查通过。取消用例先前一次并行启动窗口失败仍未归因,不作为已解决问题。 - -## 2026-09-27 取消夹具准备屏障 - -受控慢准备复现旧断言失败,但实际报告确认两个任务已启动;旧 Rust 标记代表诊断准备而非启动。仅修正测试夹具,分离准备窗口与取消屏障并回收失败子进程,仍核验退出 130、诊断保留与子孙进程无迟到写入。默认并行 partial 13 项通过;随后三份受影响测试共 41 项通过、8 项真实工具未执行,Clippy 通过。见相邻 tests/acceptance/cancellation-preparation-barrier.md。此前偶发失败的主机负载原因未独立证实;生产取消代码未修改,完整 OpenSpec 任务不因此勾选。 - -## 2026-09-27 Checkstyle XML 纯解析 - -6.3 新增 Checkstyle 原生 XML 的 Rust 有界解析,保留完整 source/模块 ID、严重度、文件级零行与可选列;异常与无文件事件不制造源码违规。先因缺 API 编译失败,再完成协议夹具正反例。适配器整包回归 89 项通过、8 项原生工具未执行(其中 Checkstyle 当时 5 项);随后新增边界及混合异常断言,最新 Checkstyle 6 项全部通过。格式、adapter all-target Clippy -D warnings、OpenSpec 严格校验与插件 diff 检查通过。见相邻 tests/acceptance/checkstyle-xml-observation.md。 - -未执行真实 Checkstyle,原生执行/配置/范围/报告 freshness、任务/白名单/门禁和完整 Java 注释正反例仍缺;6.3 不勾选,未运行全 workspace。 - -## 2026-09-27 Checkstyle 原生参数和版本差异 - -参数规划先因缺 API 编译失败,新增 Rust CheckstyleCommand 后 2 项契约通过;XML 6 项回归通过。新增显式 Java/10.21.4 JAR 原生正反例入口,20 秒截止与回收/临时清理,但本机相关缓存没有找到 JAR,1 项真实测试未执行。原生源码核对发现 10.21.4 自定义 ID 在 source 中单独输出,修正了原生验收断言,并新增旧版 ID 原样保留测试;不猜测规则类名。adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验与 diff 检查通过,见相邻 tests/acceptance/checkstyle-native-command.md。生产执行及正式配置/任务/门禁仍未完成,6.3 不勾选。 - -## 2026-09-27 Checkstyle 真实运行与配置纠偏 - -从官方固定 release 获取临时测试 JAR,内容摘要见相邻 checkstyle-native-command.md;该摘要是本地观察,不是发行批准。真实测试先因无 DOCTYPE 的配置被原工具拒绝且无报告失败;采用原版 ConfigurationLoader 映射的内置标准 DTD 后,将验收调用接入统一 runtime 新鲜报告/私有日志/清空环境/20 秒截止。真实公共类型、缺 @param/@return、自定义模块 ID 及补全文档两轮 1 项通过(0.63 秒);另参数与解析 8 项通过。adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过。 - -没有任意项目配置的独立网络隔离或身份/范围证明;生产 Checkstyle 服务/正式 CLI、完整 Java 注释变体、任务/白名单/门禁仍缺,6.3 不勾选,未运行全 workspace。 - -## 2026-09-27 Checkstyle 退出/范围判定 - -新增 Rust evaluate_checkstyle_report,独立版本/冻结文件集合/正常退出一致性;空或重复预期范围、实际范围不符、异常/坏报告/退出冲突保持未完成。warning/info 退出零和 Unix 256 错误退出截断均保留诊断,未知版本/平台不套用本契约。目标 API 缺失先编译失败,4 项契约通过;连同解析/参数共 12 项通过。真实 10.21.4/Java 21 通过统一 runtime 运行 error/clean/warning 三轮,实际 XML 均经新判定,1 项通过(0.81 秒)。256 错误为协议夹具,非真实大规模执行证明。 - -adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过;见相邻 tests/acceptance/checkstyle-exit-scope-coherence.md。项目原配置/身份/范围权威及正式 CLI/任务/门禁仍缺,6.3 不勾选,未运行全 workspace。 - -## 2026-09-27 Checkstyle 输入绑定执行 - -新增单对象文件请求/结果与 runtime 编排,独立冻结四个不同物理路径摘要,执行前后复核且共同预算/取消贯穿。新鲜 XML/私有日志及原生范围退出已接线,输入变化保留局部报告但不产生完整结论。缺 API 先编译失败;4 项模拟契约覆盖配置中途变更、陈旧报告、摘要、截止取消和缺失/额外/别名身份,8 项 PMD 执行回归通过。另真实 10.21.4/Java 21 通过该生产服务进行缺注释/补全文档两轮,1 项通过(最终 4.93 秒)。CLI all-target Clippy -D warnings、格式、OpenSpec 严格校验与 diff 检查通过,见相邻 tests/acceptance/checkstyle-input-bound-probe.md。 - -该局部服务尚未接正式 CLI/project check;JDK 动态闭包、配置资源/自定义模块闭包、独立网络隔离、同用户篡改恢复竞争及可信原项目身份/规则范围仍未证明。完整注释变体、任务/白名单/交付门禁仍缺,6.3 不勾选,未运行全 workspace。 - -## 2026-09-27 Checkstyle 正式局部 CLI - -lint java --checker checkstyle 接入显式 Java/JAR/原配置与私有源码/配置快照,结束复核原输入;仅已支持的静态注释配置可直接调用,其它上下文不替换默认规则。缺入口时目标断言先失败,接入后命令 2、Javadoc 4、配置识别 2 共 8 项普通测试通过;实际 binary/Checkstyle 10.21.4/Java 21 1 项通过(3.94 秒),显示 1 条公共类型诊断。两份实际缺前置/原生反馈 schema 正例与 4 个伪造权威反例通过。CLI/adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过。见相邻 tests/acceptance/java-checkstyle-cli-local.md。 - -公开反馈 0.1.0 仍固定本地未核验、覆盖 false、交付 not_evaluated/退出 3;正式 project check、完整配置与工具闭包、所有注释变体、任务/白名单/门禁仍缺,6.3 不勾选,未运行全 workspace。 - -## 2026-09-27 Checkstyle 原生来源歧义纠偏 - -新增共享模块 ID 反例先复现旧配置识别错误接受;现在重复默认检查来源、共享自定义来源和同模块重复属性保持上下文待解析,不自动合并或选先/后值。同类检查的不同 ID 静态正例保留。真实 CLI 验证单规则原生诊断、两个模块共享 ID 时不生成活动 finding、改为独立 ID 后原生类型及参数/返回三条诊断,1 项通过(7.71 秒)。CLI 2、Javadoc 4、配置 3、退出/范围 4 共 13 项普通回归通过;CLI/adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验及 diff 检查通过。 - -见相邻 tests/acceptance/checkstyle-rule-source-ambiguity.md。该修正尚不证明批准规则/义务绑定、稳定任务或白名单门禁已接通;完整项目和配置上下文仍缺,6.3 不勾选,未运行全 workspace。 - -## 2026-09-27 Checkstyle 注释变体与生成范围 - -新增 MissingJavadocMethod/JavadocType 原模块识别,目标配置断言先失败后通过。实际 10.21.4/Java 21 CLI 验收 record 参数文档正反例、带参数/返回的 inheritDoc、Override/Generated 默认例外及移除注解的缺文档,保留同一行类/方法及单行方法体的原生行为差异;最终该真实用例通过(28.63 秒)。前两次期望 missingMethod 的断言失败,随后保持原生输出并新增多行方法体的正例,不删除诊断、不自动批准白名单。 - -另真实 Lombok 1.18.38(缓存 Manifest 与本地摘要核对)delombok 对照用例通过:原 @Getter 文件零诊断,展开 getter 文件 missingMethod;路径保持展开范围,不冒充原注解行。两个真实用例分别通过,普通配置/退出/CLI/Javadoc 回归共 14 项通过。CLI/adapter all-target Clippy -D warnings、格式、OpenSpec 严格校验和 diff 检查通过,见相邻 tests/acceptance/checkstyle-comment-variants.md。 - -样本不能证明所有 record 构造器、继承形式或 Lombok 注解/版本/编译类路径;生成来源、完整项目/规则范围与任务/白名单门禁仍缺,6.3 不勾选,未运行全 workspace。 - -## Checkstyle 修复反馈关联增量 - -局部反馈升级 0.2.0;普通 CLI 两项、绑定两项与真实 10.21.4 CLI 一项通过。验收说明见相邻 codeguard-cli/tests/acceptance/checkstyle-repair-feedback-binding.md。此增量不完成 6.3 的完整配置、项目覆盖与门禁。 - -补充验证:配置/退出范围/XML 回归 14 项通过,CLI/适配器全目标 Clippy 与格式检查通过;schema 两份真实输出通过、五个错误变体被拒、旧 0.1 消费者拒绝 0.2。首次路径断言按未规范化临时目录比较失败,改为规范化原输入路径后通过;未修改产品路径行为。OpenSpec 严格校验和差异空白检查通过。 - -## Checkstyle 显式工作台连接 - -新增局部报告、稳定 finding 导入、可读任务与 next 修复依据恢复;任务关闭与完整宿主门禁尚未完成。TDD 与历史收据误报修复详见相邻 codeguard-cli/tests/acceptance/checkstyle-local-workbench.md。 - -本轮最终验证:25 项普通回归通过;一项真实 Checkstyle 10.21.4 工作台回放通过(10.53 秒),覆盖同任务重复扫描、无关空行、配置变化、手工勾选及陈旧新报告拒绝。四份实际产物 schema 通过,三种错误授权/关闭变体及旧 0.2 消费者拒绝新反馈。CLI 全目标 Clippy、OpenSpec 严格校验及差异空白检查通过。 - -## Checkstyle 稳定任务原工具复检 - -34 项普通回归、六轮真实复检及工作台真实回归通过。暂未检出、规则失配和工具失败均不关闭任务;首次工具身份固定,后续观察不自授权。实现与反例详见相邻 codeguard-cli/tests/acceptance/checkstyle-task-recheck.md。 - -补充协议验收:两轮真实 still_present/缺前置复检及对应 next 产物通过三个专用 schema;错误 coverage_proven=true 被拒。首次 next schema 仍沿用 Ruff 的 lint-复检 ID 和缺少 incomplete 枚举而拒绝真实输出,已改为 Checkstyle 专用 run ID 与明确未完成值;未放宽授权字段。CLI 全目标及后续局部变更 Clippy、格式、OpenSpec 严格校验和差异空白检查均通过。 - -## Checkstyle 环境准备槽位 - -新增稳定环境任务、最新诊断投影与同范围后续原生观察指引;普通来源/幂等/备注/范围反例及真实原工具回归见相邻 codeguard-cli/tests/acceptance/checkstyle-preparation-tasks.md。正式关闭、模块粒度与可信批准仍未完成。 - -最终验证:27 项普通回归通过;已有源码工作台真实回归通过(10.03 秒),准备恢复真实回放通过(8.36 秒)。四份实际反馈/观察/任务/next 产物 schema 通过,旧 0.3 消费者拒绝新反馈;取消观察的 schema 与导入反例拒绝。后续同范围原生观察和配置变化失效均按实际产物验证。全目标 Clippy、格式、OpenSpec 严格校验与差异空白检查通过。 - -## Checkstyle 环境准备任务复检 - -原工具 task verify 接通准备任务,局部恢复产生的原生源码 finding 进入稳定任务;仍受阻与恢复均保存原因/历史且保持任务 open。53 项普通受影响回归通过,真实 Java/Checkstyle 恢复回放通过(8.36 秒);实际 blocked/recovered 报告、反馈与 next 专用 schema 通过,错误覆盖声明被拒。租约反例无执行与事件;临时工作区字段对历史读取的误报已修正。完整准备义务与可信关闭尚缺,详见相邻 codeguard-cli/tests/acceptance/checkstyle-preparation-recheck.md。 - -本轮最后检查:Rust 全 workspace/all-targets Clippy(-D warnings)、格式检查、OpenSpec 严格校验和插件差异空白检查通过;不扩大为完整计划验收。 - -## Checkstyle 准备尝试无进展闭环 - -专用测试先复现失败复检导致第二次修复 task_not_actionable,随后修正有效输入下的前置恢复指引。两轮 ready-to-verify 的 still_blocked 原生复检各自绑定尝试并计入预算,第三次重复动作被拒,next 要求决策且任务 open;源码变化反例仍要求复检。29 项相关普通回归与显式真实恢复回放(9.28 秒)通过,详见相邻 tests/acceptance/checkstyle-preparation-recheck.md。正式关闭与完整义务仍未实现。 - -## Checkstyle 恢复尝试交接与工具观察失效 - -真实准备恢复事件关联 ready-to-verify 尝试,解除等待状态且保留开放任务;修改测试复制 JAR 的字节后旧恢复结论不能继续用于 task show/next。原反例在正确 task 字段上复现旧恢复仍显示,产品修复后扩展回放通过(10.28 秒)。39 项普通受影响回归、CLI 全目标 Clippy(-D warnings)、格式、OpenSpec 严格校验与插件差异空白检查通过;仍不代表批准或正式关闭。 - -本轮后续六轮真实 Checkstyle 源码复检回归通过(45.25 秒),未扩大为完整项目验收。 - -## Checkstyle 失效原因与状态消费者 - -原复检原因与当前输入失效原因分开,status 任务摘要保留二者;真实 JAR 改动和删除回放通过(9.77 秒)。17 项普通相关回归、CLI 全目标 Clippy、格式、OpenSpec 严格校验与差异空白检查通过。实际反馈/简报/status schema 通过,覆盖伪造和任务 closed 变体被拒;不代表完整批准与关闭协议。详见相邻 tests/acceptance/checkstyle-preparation-recheck.md。 - -## Checkstyle 当前失效优先于历史 still_present - -真实配置改动反例先复现失效状态被旧 still_present 覆盖成 actionable。调整当前工具、配置、已绑定源码核对的优先级后,扩展六轮真实回放通过(57.00 秒),覆盖配置注释和源码空行变化后的 task show。33 项普通相关回归、实际三类失效简报/schema、CLI 全目标 Clippy、格式、OpenSpec 严格校验及差异空白检查通过。任务保持 open,完整义务和可信关闭仍缺;详见相邻 tests/acceptance/checkstyle-task-recheck.md。 - -## 原生字段 Javadoc 适配 - -增加 JavadocVariable 精确原配置绑定和本版 scope/excludeScope/ignoreNamePattern 原参数;原生报告生成字段修复任务并支持同任务复检。TDD 暴露未知类与范围参数被拒后完成修正。26 项普通回归、三轮真实字段回放(24.99 秒)、实际字段 finding/任务/复检/失效简报 schema、覆盖与关闭伪造反例通过。CLI/adapter 全目标 Clippy、格式、OpenSpec 严格校验及差异空白检查通过。只验证 public 范围与指定忽略/字段/局部变量边界,不冒充枚举常量及完整 Java 义务验收;6.3 保持未勾选,详见相邻 tests/acceptance/checkstyle-field-javadoc.md。 - -## 字段访问范围与原生必需 token - -静态 JavadocVariable tokens 支持经 TDD 先失败后实现,未知 token 和跨模块借用拒绝。七组真实范围/枚举回放通过(32.86 秒);scope public/protected/package/private、excludeScope、配置字段 token 和配置枚举 token 的结果逐项核验。固定 10.21.4 JAR 的 getRequiredTokens 返回 VARIABLE_DEF,因此仅枚举配置仍检出字段,修正规格和预期而不篡改原输出。同行枚举 Javadoc 被原工具检出的首次假设错误已记录,正常文档夹具改为独立行。17 项普通回归、全目标 Clippy、格式、OpenSpec 严格校验和差异空白检查通过。完整项目义务及其它语法仍缺,6.3 不勾选;详见相邻 tests/acceptance/checkstyle-field-javadoc.md。 - -## Checkstyle 官方名称与稳定任务归属 - -官方完整名称的纯绑定先因返回 None 失败,再完成固定名称映射;支持既有五类 Javadoc 检查的短名/Check 后缀短名/官方完整名及 Checker/TreeWalker 完整名。未知包名和同 source 的短名/完整名重复声明拒绝,原 XML 不重写。28 项普通相关回归、字段四轮真实名称与复检回放(21.95 秒)、CLI/adapter 全目标 Clippy、格式、OpenSpec 严格校验和差异空白检查通过。字段三种名称复用同一 finding/task,无伪配置 blocker;其余检查类本轮仅有名称绑定回归,完整配置及门禁仍缺。6.3 保持未勾选,详见相邻 tests/acceptance/checkstyle-official-module-names.md。 - -## MissingJavadocMethod 原配置参数 - -静态原参数绑定先因不支持返回 None 失败,实现后支持范围、注解、属性方法、方法长度和名称正则,原 XML 保留,非法及跨模块静态参数拒绝。19 项普通相关回归、四组真实配置筛选回放(19.03 秒)、CLI/adapter 全目标及最终夹具单测试 Clippy、格式、OpenSpec 严格校验和差异空白检查通过。单行非空方法不检出的最初误解由固定 JAR 行数/默认阈值逻辑核对后纠正,多行夹具区分属性 true/false;原工具规则未重写,零诊断不关闭历史任务。完整构造器/record/token 和项目生效模型仍缺,6.3 不勾选,详见相邻 tests/acceptance/checkstyle-missing-method-properties.md。 - - -## 2026-09-27 MissingJavadocMethod 原生 token 选择 - -静态绑定新增模块限定的 METHOD_DEF/CTOR_DEF/ANNOTATION_FIELD_DEF/COMPACT_CTOR_DEF,跨模块或未知 token 不猜测。目标测试先失败,修改后绑定七项及配置四项通过;真实 Checkstyle 10.21.4/Java 21 五组选择与两次紧凑构造器复检共七轮通过(51.11 秒),稳定任务不重复、原生修复候选不关闭事实。见相邻 codeguard-cli/tests/acceptance/checkstyle-method-tokens.md。任务 6.3 仍未完成,未宣称完整项目或批准门禁。 - -该增量的 20 项普通目标/回归测试通过(adapter 11、CLI/workbench 9);显式原生用例单独运行通过,不将其它 ignored 用例计入已运行证据。受影响两 crate 全目标 Clippy、cargo fmt --all --check、OpenSpec strict 与 git diff --check 均退出 0。 - - -## 2026-09-27 Checkstyle 原始配置连续性 - -真实字段任务在增加 ignoreNamePattern 后原生零诊断,旧复检错误显示缺失候选;先 RED 后修正,简报现从首次摘要绑定报告恢复 original_configuration_input,classify 在问题缺失时核对首轮配置摘要,连续两轮配置排除要求 rule_coverage_requires_review。恢复原配置并实际补注释后仅给 candidate_absent_unverified_policy,事实仍 open。四轮原生执行通过(40.99 秒);可选新增 schema 字段保留旧简报可读性,缺身份不沿用修复候选。语义等价配置、批准来源及正式关闭仍缺,9.7 不勾选。 - -该修正的 CLI/workbench 九项普通回归、实际原生准备/源码报告与简报 schema、全目标 Clippy、fmt、OpenSpec strict 和 diff whitespace 检查通过。token 矩阵原首轮使用全 token,后续使用仅紧凑构造器 token;其源码补文档后的期望须随本修正改为 rule_coverage_requires_review,早前该矩阵给出局部候选的验收结论不再代表当前行为。首次配置不变的字段修复正例仍给出局部候选。 - -最终代码下,调整期望的 token 矩阵七轮原生复跑通过(42.08 秒),目标测试 Clippy 与 fmt 再检查通过。 - - -## 2026-09-27 JavadocMethod 原生标签参数 - -核对固定 Checkstyle 制品 API/token 后,新增 JavadocMethod 专属访问修饰符、允许缺参数/返回、throws 校验与共享注解/token 静态适配;未重写原 XML。合法参数测试先 RED 后修正,绑定八项及配置四项通过;真实六组原生配置按预期产生 4/2/2/0/2/5 项诊断,恢复首次配置后 still_present 与真实文档修复局部候选的两次复检通过,八轮共 57.23 秒。稳定事实保持 open,允许标签选项不自成白名单。全语法、项目配置/覆盖及批准仍缺,6.3 不勾选,验收见相邻 tests/acceptance/checkstyle-method-tag-options.md。 - -该增量 21 项普通目标/回归(adapter 12、CLI/workbench 9)通过;上述八轮原生测试单独显式运行通过,其它 ignored 用例不计入本轮运行证据。受影响两 crate 全目标 Clippy、fmt、OpenSpec strict 与 git diff --check 均退出 0;未修改反馈协议字段。 - - -## 2026-09-27 原生类型注释配置 - -核对固定制品 API/token 后补齐类型检查范围/注解/标签参数,原 XML 不重写;合法参数先 RED 后修正,绑定九项及配置四项通过。十组原生配置按预期产生 MissingJavadocType 5/4/1/1 与 JavadocType 2/1/1/0/1/1 项诊断;恢复首次 typeTags 配置并真实修正文档复检形成局部候选,事件保存、事实均 open,十一轮 58.02 秒。作者/版本格式只有静态适配证据,其它 Scope/全部 token 语法、完整配置与批准覆盖仍缺,6.3 不勾选。验收见相邻 tests/acceptance/checkstyle-type-options.md。 - -该增量 22 项普通测试(adapter 13、CLI/workbench 9)通过;原生十一轮单独显式执行,其它 ignored 不计入本轮证据。Adapter 全目标和受影响 CLI 工作台目标 Clippy、fmt 检查通过。 -OpenSpec strict 与插件 git diff --check 均退出 0。 - - -## 2026-09-27 类型作者/版本格式及修复指引 - -原 JavadocType 指引只有参数核对,作者/版本诊断缺实际修复方向;目标断言先 RED,修正后保留项目事实及不编造约束。固定 10.21.4/Java 21 的原 author/version 正则对缺失、错误、部分及完整补齐产生 2/2/1/0 诊断,原配置 task verify 为局部候选;无效正则两轮保持 incomplete,配置准备任务只新增一次、无源码 finding,事实仍 open。七轮真实执行通过(38.35 秒)。静态绑定十项及配置四项通过;完整正则/标签变体、项目模型及批准门禁仍缺,6.3 不勾选。验收见相邻 tests/acceptance/checkstyle-type-formats.md。 - -该增量普通目标/回归共 23 项通过(adapter 14、CLI/workbench 9);原生七轮单独显式运行,其它 ignored 不计入。Adapter 全目标与 CLI 工作台目标 Clippy、fmt、OpenSpec strict 和插件 git diff --check 均退出 0;未新增反馈字段。 - - -## 2026-09-27 原生正则配置失败修复方向 - -核对固定原生 stderr 后新增有界纯失败分类:254 正常退出、官方非法属性和正则因果异常组合;只有不一致/缺失报告时细分,不向对话回显值或堆栈。公开反馈与准备简报新增正则配置修复方向。分类 API 缺失先 RED 后实现,probe 缺报告且输入变化再 RED 后修正为冻结输入/取消/截止优先;正常一致报告仍保留。真实七轮格式回放通过(38.75 秒),验证特定 reason、对话动作与准备简报,事实保持 open。未知失败/其它版本/完整项目及批准覆盖仍缺,6.3 不勾选,验收见相邻 tests/acceptance/checkstyle-regex-failure-guidance.md。 - -普通目标/回归共 49 项通过(adapter 15、probe 5、CLI/workbench 9、next 6、status/show 4、task verify 10)。原生七轮显式回放通过,另一次实际原生配置失败的反馈与准备简报 schema 校验通过;未计入其它 ignored。两 crate 全目标 Clippy 通过;随后缺报告输入变化修正的 CLI lib/probe Clippy 与五项 probe 回归通过。最终 fmt、OpenSpec strict 和 git diff --check 退出 0。 - - -## 2026-09-27 ESLint JSON 原生报告协议原型 - -核对 ESLint 官方 formatter 与 exit/max-warnings 文档后新增按对象拆分的有界 Rust 解析,保留 warning 和有效规则,区分 fatal/无 ruleId/suppression,核对具体版本、文件集合和计数。API 缺失先 RED 后实现;dot 路径额外反例因 Path 组件折叠再 RED 后修正为原始段检查。此为协议夹具,未安装/执行 ESLint,未接通生效 JS 配置、TS parser/monorepo、Node 闭包、CLI/依赖及任务门禁;7.3 保持未完成。验收见相邻 tests/acceptance/eslint-json-observation.md。 - -最终 22 项目标/回归测试通过(ESLint 7、既有 Checkstyle 15);adapter 全目标 Clippy、fmt、OpenSpec strict 与 git diff --check 均退出 0。当前原生 ESLint 执行为 NOT_RUN,JSON 夹具版本仅用于具体身份比较反例,不证明所标版本制品兼容。 - - -## 2026-09-27 ESLint 原生字面命令计划 - -缺 EslintCommand API 先 RED 后补齐固定字面 argv;显式 Node/JS/原配置/完整源码/独立报告与可选 max-warnings,禁用自动配置查找,不 Shell/npx/隐式改源码。四项路径/参数/重复/冲突/预算契约通过。显式 Node 24.18.0 的统一 runtime argv 观察脚本通过(0.05 秒),保留 metacharacters 字面、源文件/配置原字节,无 Shell 展开;不等于 ESLint 原生执行。闭包、物理别名、有效项目配置、ESLint/TS/monorepo/CLI/依赖及批准仍缺,7.3 不勾选,见相邻 tests/acceptance/eslint-native-command-plan.md。 - -最终 13 项普通目标/回归通过(ESLint 命令 4、报告 7、Checkstyle 命令 2),Node 字面 argv 原生测试另行显式运行通过;ESLint 原生仍 NOT_RUN。Adapter 全目标 Clippy、fmt、OpenSpec strict 和插件 git diff --check 均退出 0。 - -## 2026-09-27 ESLint 输入绑定受控执行 - -Rust 公开执行服务现通过统一 runtime 运行显式 Node/ESLint JS 入口的版本探测与扫描。完整显式摘要集合、物理路径、精确稳定版本、安全 run_id、私有新鲜报告、共享截止时间/取消和扫描前后输入复核均接入;错误不转换为源码违规。缺 API 编译 RED 后补齐模块与入口。初次实际 Node 夹具因原10秒预算在调试摘要校验阶段耗尽返回未完成;正常测试改60秒,独立截止时间拒绝反例保留。 - -最终19项普通目标/回归测试通过(ESLint 命令4、报告7、执行前检查1、Checkstyle 命令2及执行5)。实际 Node 七种受控 JSON 模式单项测试113.72秒通过,包括干净、warning、error、坏报告、错版本、扫描时输入变化、退出2/缺报告。它是项目自有JS夹具,不是 ESLint 原生检查;原生 ESLint NOT_RUN。CLI lib/新执行测试 Clippy、adapter 全目标 Clippy、fmt、OpenSpec strict 和插件 git diff --check 均退出0。验收见相邻 tests/acceptance/eslint-input-bound-probe.md。 - -JS配置/插件闭包、TS parser/tsconfig、monorepo、可信工具和项目有效配置、公开CLI/依赖审计及完整任务门禁仍未完成,7.3保持未勾选;局部执行一致不授予覆盖或白名单权威。 - -## 2026-09-27 ESLint 运行中断诊断 - -扫描实际启动后取消/超时,分别覆盖已写有效零诊断报告与未写报告四种 Unix 受控模式。扫描标记及报告存在性明确验证前提。取消且无报告反例先RED(一般报告失败覆盖取消),修正为请求中断/真实终止原因优先;版本留证失败也沿用。其它失败明确区分报告预检、执行留证、报告读取;退出2/无报告仍未完成,不是源码违规。 - -最终18项普通受影响/回归测试通过(ESLint 执行2、报告7、命令4、Checkstyle执行5),新增中断四模式测试3.28秒;实际Node七模式受控JSON复跑109.10秒通过。CLI lib/新执行测试Clippy、fmt、OpenSpec strict及git diff --check均退出0。夹具不是ESLint原生检查,原生ESLint仍NOT_RUN,完整7.3和整体实现验收仍未完成。 - -## 2026-09-27 ESLint 静态配置发现接入 detect/init - -按 ESLint 官方配置文件文档核对六种 flat config 文件名、TS loader 与配置选择上下文,新增 Rust 静态候选观察。package.json 再次读取须匹配本轮原摘要;配置候选字节纳入原有画像输入。嵌套配置所在根分别保留,不将文件存在当成规则生效、不执行JS、不隐式迁移旧配置。未观察到配置不证明外部/显式参数不存在,保持unknown并给原生核查动作。 - -新增两项先RED(无候选观察),实现后加嵌套TS配置反例。初次回归暴露既有init测试仍断言空列表;更新为精确node.eslint/unknown,保留不能声称就绪和改/删配置导致画像过期的原契约。最终67项通过(detect23、init41、discovery端口3),CLI相关Clippy、fmt、OpenSpec strict和git diff --check通过。原生ESLint、逐文件规则/导入插件闭包、TS parser/monorepo实际执行及完整7.3仍未完成。验收见相邻 tests/acceptance/eslint-static-configuration-discovery.md。 - -## 2026-09-27 ESLint 原生核心规则验收及发现补充 - -两项缺口先RED后修正:独立JS无package/config原来无准备反馈;package复核变更或不可读原来仍可能发现完整(flat config存在时还会隐藏具体原因)。现提供源码引用/核查动作,输入失效标发现不完整及清单阻塞路径。66项目标/回归通过(detect24、init41、发现端口1),执行层2项普通回归通过,共68项;相关CLI Clippy/fmt通过。 - -本轮找到本机既有npm缓存ESLint10.11.0,无安装/升级,使用显式Node24.18.0通过Rust runtime运行六轮真实原生检查:干净、no-unused-vars warning、no-debugger error、解析失败、eslint-disable抑制、同原配置修复复检,104.56秒通过。warning/error保留,解析/抑制待核查,零诊断不签发任务关闭或门禁允许。早先记录的原生ESLint NOT_RUN为当时边界,现只对该核心规则测试完成原生验收;TS/parser/tsconfig、插件/导入闭包、有效配置归属、完整CLI/任务/门禁仍未完成,7.3不勾选。见相邻 tests/acceptance/eslint-native-core-rules.md。OpenSpec严格校验与插件diff检查通过。 - -## 2026-09-27 ESLint 公开局部lint命令 - -接通lint typescript FILE与help,显式Node/JS入口/版本/原flat config/原cwd,避免按配置目录猜原调用上下文。缺上下文先RED(旧路由退出2),实现后返回准备反馈3;非法参数仍2。JSON/human显示原规则、位置、严重度与下一步;原生消息仅输出摘要,明确临时证据退出清理、workbench未接入、coverage=false、门禁未判定。 - -23项普通相关回归通过(CLI3/probe2/Go5/Python12/语言缺口1);本机既有ESLint10.11.0/Node24.18.0经过公开CLI检出no-debugger,源码修复后同配置零诊断,两轮35.44秒通过,均不签发项目通过。CLI lib/bin/新测试Clippy、fmt、公开缺上下文反馈Draft202012 schema校验、OpenSpec strict与git diff --check通过。未安装工具。完整项目、持久任务、TS/plugin/闭包/依赖和7.3仍未完成,验收见相邻tests/acceptance/eslint-public-lint-feedback.md。 - -## 2026-09-27 ESLint 稳定任务输入前置 - -持久化接线审查发现需要先稳定问题身份与原生Unicode定位。缺API先RED后新增投影:相对路径/规则/锚点/序号,排序去重;源码行号与原生措辞变更不重复建问题,错误范围/定位使整组失败。UTF16列与CRLF、CR/LF、U2028/U2029处理避免字节列误判。 - -四项身份契约及CLI/probe共9项普通回归通过;现有Node/ESLint10.11.0原生定位三条no-debugger,emoji后列7与后两行2/3均与投影一致,0.23秒通过。Clippy/fmt、OpenSpec strict/diff检查通过,无安装。这里只完成稳定任务输入,未完成队列/任务/next接线,当前公开反馈仍workbench未接入,7.3/9.7不勾选;见相邻tests/acceptance/eslint-stable-task-input.md。 - -## 2026-09-27 ESLint 脱敏观察入队及稳定任务连接 - -当前公开lint typescript FILE --workspace ABS_PATH复核摘要后保存eslint_workbench_observation并同步稳定finding/任务;反馈0.2返回同步状态、next或next_error。严格导入拒绝自授权allow、错误范围/投影/输入;历史已消费报告按不可变字节收据处理。重复扫描保留同一任务与用户备注,status/task show展示开放状态。next核查本轮报告及首次工具/配置连续性,不从局部零诊断、抑制或勾选推断关闭。 - -配置改变后的备用指引回归先失败(recheck_argv[2]为python),修正后选择typescript及显式待核验的ESLint上下文。33项相关普通回归通过(身份4、CLI4、next6、status/show4、sync15);补充CLI工作台status/task show联通再跑1项通过。受控插件ID只是协议样例,未执行TS插件。当前公开feedback及actionable/失效配置两类简报以Draft202012 schema实测通过,目标CLI lib/bin/eslint_lint_cli Clippy -D warnings与fmt通过。 - -本机既有Node24.18.0与ESLint10.11.0通过公开CLI执行初始化后两轮真实检查,no-debugger发现入队,原配置修复源码后零诊断,next转verification_required、任务仍open,两轮均退出3且coverage=false/delivery not_evaluated。显式ignored原生用例本轮69.88秒通过,无安装或升级。原生临时输出退出后仍清理,仅脱敏结构化观察持久保存。验收见相邻tests/acceptance/eslint-workbench-sync.md。 - -Node环境阻塞任务、原生完整证据留存、正式task verify关闭/重开、全项目/多文件、TS插件及配置闭包、依赖/CVE与真实宿主门禁未完成,7.3/9.7不勾选。全计划未完成,不同步/归档当前change。 - -## 2026-09-27 ESLint 检查完整性准备任务 - -早期缺上下文以及工具/配置/版本/报告未完成路径接通Rust准备观察、严格同步和环境任务,源码finding与准备任务分开。取消、外部目标、不支持范围与未初始化工作区不制造成功。诊断变化保留同目标稳定任务。next从最新已消费摘要绑定报告核对当前范围,较新有效扫描使旧环境任务转正式核查而非继续重复旧动作;仍不能关闭任务。human/JSON直接反馈当前任务步骤。 - -缺上下文用例先RED(not_connected),实现后重复两次只建一个blocker;缺工具更新最新诊断不建第二张任务,受控恢复后next转verification_required且复检路径仍为原源码;外部工作区目标拒绝。相关普通回归35项通过(身份4、CLI6、next6、status/show4、sync15),准备feedback及独立简报Draft202012 schema通过。实际现有Node24.18.0/ESLint10.11.0遇原配置不存在规则,公开CLI生成环境任务1/源码finding0,不签发门禁,显式ignored原生验收13.71秒通过,无安装/升级。最终Clippy/fmt检查见本轮结果。 - -完整构建模型和跨文件共同环境根因归并、正式关闭/重开、完整原生证据及真实宿主门禁仍未完成;7.3/9.7不勾选。验收见相邻tests/acceptance/eslint-preparation-workbench.md。 - -## 2026-09-27 ESLint 稳定任务原工具复检 - -task verify接通源码/准备任务,显式Node/ESLint入口/版本/原配置/cwd,参数预检查、租约、统一截止时间、同步与尝试历史复用现有Rust流程。不执行Markdown或历史报告里的程序。当前输入与首次原工具/配置连续性不一致时需核查;原生抑制不当修复。仍存在、局部消失候选、环境恢复或未完成均保留任务open,不签发allow或resolved。 - -缺上下文入口先RED(task_checker_unsupported),新事件又复现attempt历史不认识ESLint报告/时间,修正后next/status/attempt和重复扫描一致。57项相关回归通过(ESLint6、next6、status/show4、租约/尝试16、verify10、sync15),另分类1项通过,覆盖上下文变化、仍存在、抑制和目标错误。CLI夹具显式复检still_present与无上下文事件保存通过。实际既有Node24.18.0/ESLint10.11.0通过公开发现、任务复检仍存在、修复源码后同配置复扫、任务复检局部消失四轮,194.36秒通过;事件保存但任务保持开放,均局部门禁未判定,无安装/升级。 - -公开未完成及原生观察task verify反馈分别通过统一preview与eslint-task-recheck schema;实测发现原统一schema不认识ESLint,追加严格分支后通过。临时原生输出仍清理,只有脱敏结构化观察持久化。完整JS配置/导入闭包、required规则覆盖、TS插件/全项目源集、可信宿主策略和正式关闭重开仍缺,7.3/9.7不勾选,change不归档。验收见相邻tests/acceptance/eslint-task-verification.md。 - - -## 2026-09-27 ESLint 原规则有效配置核查 - -Rust task verify 增加同轮原生 --print-config 查询,绑定显式源码/主配置/Node/入口前后字节与统一截止时间;只保存规则级别、原因和摘要。复检协议0.2新增effective_rule,历史0.1仍只读识别。规则关闭或缺失时零诊断必须rule_coverage_requires_review,查询损坏/输入变化为未完成,next指向配置核查;不批准白名单或关闭任务。 - -44项普通相关回归及分类单元用例通过,最终9项规则解析/公开CLI普通测试、目标Clippy -D warnings和fmt通过。既有Node24.18.0/ESLint10.11.0原生启用/off/缺规则三轮38.50秒通过;实际公开CLI只改导入mode.cjs关规则、主配置和源码不变的反例108.38秒通过,仍要求覆盖核查且保存事件,无安装升级。受控CLI实际产物通过统一复检、ESLint复检及简报三份Draft202012 schema;简报lint-only复检ID正则先失败后补入eslint-task前缀。schema产物使用受控协议夹具,不冒充原生工具验收。 - -完整导入/插件闭包、TS/全项目源集、required规则批准覆盖、可信宿主门禁和正式关闭重开仍缺,7.3/9.7保持未完成。验收见相邻codeguard-cli/tests/acceptance/eslint-effective-settings.md。 - - -## 2026-09-27 ESLint 有效配置查询取消 - -公开task verify受控进程反例先RED:查询收到SIGINT后,原因丢失并保存成still_present。Rust查询与任务复检现优先保留取消/期限;共享任务入口取消后不保存正常复检事件,并释放自有租约。真实进程组延迟写副作用未出现,再次复检能获取租约。目标用例3.84秒通过,36项相关普通回归、目标Clippy -D warnings和fmt通过。脚本仅为受控协议夹具,不冒充原生ESLint;Windows、跨宿主、中断历史协议及完整I/O预算仍缺,3.3/7.3/9.7不勾选。见相邻tests/acceptance/eslint-effective-interruption.md。 - - -## 2026-09-27 ESLint 项目本地插件原生验收 - -使用既有Node24.18.0/ESLint10.11.0及项目原flat config加载guard.cjs本地规则。公开lint保留完整workspace/no-debugger ID并生成稳定任务;只修源码后,task verify通过原扫描及原生print-config确认规则仍启用,保存局部消失候选,插件与主配置不改,status门禁未评估。真实测试91.56秒通过,没有安装/升级。 - -此证据补齐局部本地插件规则穿过公开CLI/任务复检的真实样本,不证明完整插件闭包或可信批准。TS parser/tsconfig、monorepo完整范围、依赖审计、required规则/正式关闭及宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-local-plugin.md。取消路径及本地插件两项增量在同一change跟踪,不同步或归档未完成计划。 - - -## 2026-09-27 ESLint 显式目录调度 - -lint typescript PATH现支持有界目录清单及逐文件原工具执行,保留排序相对路径、局部反馈、跳过项和未执行清单;共享deadline,前后清单/显式输入变化、单文件失败及工作台保存失败均未完成。codeguard内用户源码照常扫描,点条目/node_modules/链接未选择原因显式反馈。仍使用调用者指定的单一原配置/cwd,不声称自动选择monorepo子配置。 - -目录入口先RED,配置源码又复现输入冲突及同步路径重复拒绝;现只允许原配置与源码共享同一只读字节身份,报告覆盖/其它输入别名及重复源码仍拒绝。受控样本首次4稳定任务、重复0新增,单文件退出2保留其它发现,链接跳过、100ms共同预算3文件未执行及画像缺失工作台失败反例通过。48项普通相关回归通过,最终目标Clippy -D warnings/fmt通过,公开目录JSON通过Draft202012 schema。实际既有Node24.18.0/ESLint10.11.0公开目录三文件(违规、干净、配置源码)62.34秒验收通过,无安装升级;schema样本是受控夹具,与原生证据分开。 - -完整TS/tsconfig、monorepo原生源集及配置归属、插件闭包、依赖/CVE、聚合硬I/O预算、原生证据及可信正式关闭/宿主门禁仍缺,7.3/9.7不勾选。见相邻tests/acceptance/eslint-directory-feedback.md。 - - -## 2026-09-27 ESLint 显式子项目配置映射 - -目录入口新增--config-map绝对路径,1.0有界协议逐项声明项目根/原配置/cwd,组件边界及最深显式根匹配,未命中沿用原参数。不从目录名推断原cwd,不批准规则。重复根/字段、未知字段、越界/链接或不可读配置启动前拒绝,映射与全配置摘要纳入前后及子任务前检查。反馈0.2保留逐文件配置范围和来源及映射摘要,schema仍接受历史0.1。 - -未知选项先RED;受控a/ab边界、根`.`选择、重复/越界/approved字段及首轮改写映射后停止余下三文件反例通过。45项普通相关回归通过,最终补充根`.`用例及目标Clippy/fmt通过;映射及当前公开反馈Draft202012 schema通过受控实际产物,越界schema反例被拒绝。既有Node24.18.0/ESLint10.11.0真实双项目四文件80.78秒通过,根规则没有强加子项目,保留配置源码检查,无安装升级。 - -自动配置归属、完整TS/插件闭包/源集、依赖审计、批准覆盖、聚合硬I/O与正式关闭/宿主门禁仍缺;7.3/9.7不勾选,不归档change。验收见相邻tests/acceptance/eslint-config-map.md。 - - -## 2026-09-27 npm原生审计基础 - -Rust新增npm11/auditReportVersion2有界观察及离线原生命令计划,保留组件、严重度、范围、节点、原生advisory source和间接关系;版本/计数/定位/退出/重复JSON键或error对象不自成干净结果。原生source不是CVE编号,range不是解析版本;依赖类别有重叠,不简单相加。只读package脚本配置API区分明确声明、未观察到、复杂调用和损坏,不执行清单脚本,也不能证明外部CI未配置。 - -缺API先RED;组件低危但直接advisory高危反例再RED后修正。5项协议/参数/配置用例及9项既有ESLint回归通过,共14项普通测试;CLI目标、adapter库Clippy -D warnings及fmt通过。既有Node24.18.0/npm11.16.0经统一runtime验证版本、空锁JSON及缺锁error,0.68秒通过,包/锁字节不变,无node_modules或脚本副作用,无安装升级。合成advisory是协议夹具,不冒充真实漏洞数据库检出。 - -配置API尚未接detect/init,公开CVE/依赖命令、非空依赖/真实漏洞、解析版本/图绑定、漏洞库时效、稳定任务/原工具复检及可信门禁仍缺;7.3/7.5不勾选。见相邻tests/acceptance/npm-audit-observation.md。 - -## 2026-09-27 npm锁文件节点关联进展 - -新增 Rust v3 普通安装节点解析与原生审计精确位置/名称/版本关联;两项锁文件契约及五项 npm 审计回归通过。链接、别名、缺版本、重复字段和身份不匹配保持未完成。仅协议夹具,不是实际非空依赖审计;依赖边、范围求值、库新鲜度、公开命令及工作台闭环仍缺,7.3/7.5 保持未勾选。验收见相邻 `codeguard-cli/tests/acceptance/npm-lock-binding.md`。 - -## 2026-09-27 npm离线非空依赖反例 - -扩展实际 Node 24.18.0/npm 11.16.0 原生验收为私有空缓存的空锁、一个普通依赖节点的非空锁、缺锁三种情况。实验发现非空离线审计也能退出0并返回零漏洞,不能把零发现当成库覆盖或CVE通过。Rust观察新增固定 `advisory_coverage=not_evaluated`,节点关联保持局部身份观察。测试检查清单/锁不变、无安装及脚本副作用;尚缺在线/可信缓存的真实漏洞正例及库新鲜度、完整命令/工作台,因此7.3/7.5不勾选。 - -本轮验证:原生三场景测试通过(0.77秒),7项普通契约通过;adapter lib与CLI三项test target的Clippy(-D warnings)、格式及OpenSpec严格校验通过。此前把非空离线结果预期为原生错误的测试失败,实际观察到零发现后修正覆盖语义;新增覆盖字段验收先因API缺失失败,再实现通过。 - -## 2026-09-27 npm原生advisory与复检 - -显式无凭据registry命令API已提供HTTPS根源及验收loopback HTTP源,固定audit-registry、不安装/不执行脚本;受控原生npm执行证实1.2.3被advisory命中、修订2.0.0后同工具复检无发现,503源失败为npm_native_error。两项原生测试通过(0.58秒),六项审计契约、Clippy/格式通过。受控源不是可信库,coverage固定not_evaluated;早期一次原生正例出现未分类错误,已增加诊断而不能宣称稳定性完全证明。真实库/时效、公开命令及完整工作台仍缺,7.3/7.5不勾选。见相邻`codeguard-cli/tests/acceptance/npm-native-advisory.md`。 - -最终重复原生验收2项通过(0.55秒);审计与锁关联8项普通契约通过,OpenSpec严格校验及diff检查通过。重复运行未再次出现早期原生正例错误,其原因仍未确定。 - -## 2026-09-27 npm审计配置发现与预览接线 - -node.npm.audit已按原package.json摘要逐根进入共享发现、init数据来源及detect/plan/check all的配置反馈;manifest重读变更/不可读保留unknown与观察未完成。修复plan按语言筛选遗漏node检查器的问题,typescript/all预览均保留四态;check all人类反馈显示根、原因与下一步。新binary流程与发现/计划/初始化70项不同用例通过,Clippy/格式通过。仍未自动执行npm审计、覆盖其它包管理器/CI声明、库时效、稳定任务和门禁,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-audit-discovery.md`。 - -## 2026-09-27 npm输入绑定runtime服务 - -新增独立请求/结果及Rust原生版本-audit-报告-锁节点关联服务,冻结精确输入SHA及npmrc存在性;缺身份、版本错配、输入修改/配置新增、取消与超时均未完成、不提供可用于关闭任务的解析结论。三模式反例与八项审计/锁回归通过;真实npm局部服务首轮通过,最终版本参数修改后复验。完整工具/配置/环境闭包、可信库时效、公开命令与任务闭环仍缺,7.3/7.5保持未完成。见相邻`codeguard-cli/tests/acceptance/npm-input-bound-probe.md`。 - -最终验证:九项普通契约通过(1项输入服务三模式、6项审计、2项锁关联),两项真实npm验收通过(21.68秒);CLI lib与输入服务/原生测试target的Clippy(-D warnings)、格式、OpenSpec严格校验和diff检查通过。服务未接入公开CVE入口,任务仍不勾选。 - -## 2026-09-27 npm公开CVE局部反馈 - -Unix `cve typescript` 已接显式Node/npm/版本/用户与全局配置/可选审计源,冻结输入并以human/JSON返回脱敏原生组件、锁版本、严重度、advisory source及下一步。缺上下文给准备状态,局部零发现仍not_evaluated;未接工作台,不假称关闭。10项普通契约、真实binary npm空锁(21.75秒)、两份实际schema报告及四个伪造权威反例通过,Clippy/格式及OpenSpec严格校验通过。真实库、自动check all、完整预算默认来源及持久任务闭环仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-public-cve-feedback.md`。 - -## 2026-09-27 npm共享预算默认值接线 - -公开npm CVE入口复用CLI/登记环境/项目runtime/内置默认值选择器,坏候选项目文件或符号链接在原生执行前返回准备未完成,显式高优先级值不受低优先级坏配置影响。反馈0.2记录预算/来源及native_execution_only,保留严格旧0.1schema。预算、公开命令、发现与输入绑定四项普通测试通过,哨兵未启动;Clippy/格式及OpenSpec严格校验通过。真实命令及实际schema结果后补。硬I/O预算、可信库与工作台仍缺,7.3/7.5不勾选;验收见相邻`codeguard-cli/tests/acceptance/npm-runtime-defaults.md`。 - -最终验证:真实Node/npm公开命令通过(21.50秒);三份实际0.2预算反馈通过schema,历史0.1兼容输入通过,四项非法预算反例被拒。最终diff检查通过;不把预算接线当成完整CVE或工作台验收。 - -## 2026-09-27 npm稳定工作台与next接线 - -初始化根中的公开npm审计自动保存脱敏原生组件/advisory/锁版本观察,严格复核输入与字段,经现有同步器创建按根稳定的CVE完整性任务;执行原因作为诊断历史,不伪装源码漏洞或关闭。next识别检查器并给原工具复检步骤。重复扫描一张任务、坏节点/重复字段不产生新任务;反馈0.3及持久观察schema已提供,旧0.1/0.2反馈保留。24项不同普通回归与真实npm公开命令持久化(21.50秒)、实际schema通过,Clippy/格式及OpenSpec严格校验通过。自动check all、早期准备阻塞全覆盖、父工作区映射、npm task verify与可信库/门禁仍缺,7.3/7.5不勾选。验收见相邻`codeguard-cli/tests/acceptance/npm-workbench.md`。 - -追加正例验收:公开受控组件报告保留advisory及解析版本,依赖变更仍复用同一任务。测试先暴露已消费npm历史报告被当前锁变化错误重演的问题;现纳入不可变字节收据消费分支,新报告仍复核当前输入。历史字节变化仍按run_id_digest_conflict拒绝。最终24项普通回归及Clippy/格式结果见本轮输出。 - - -## 2026-09-27 npm显式父工作区与白名单纠错约定 - -公开npm入口新增--workspace物理父目录,原生cwd保持子项目,预算默认读取所选父工作区,持久任务按构建根分离;next保留归属。8项相关普通测试通过,目标Clippy及格式通过,见相邻tests/acceptance/npm-workspace-scope.md。可信库、自动调度、完整关闭与门禁仍缺,7.3/7.5不勾选。 - -白名单文档补齐用户新增/修改/撤销/失效的操作与对话状态,OpenSpec明确修改字节须重新批准、不能记为源码修复。既有精确身份5项、报告处置7项、只读查询8项、提案4项普通契约通过;2项需要指定原生Ruff的测试未运行。这是现有局部契约回归,不是正式审批发布或宿主门禁验收,4.8/4.10/12.12保持未完成。 - - -## 2026-09-27 npm task verify原工具复检 - -稳定npm完整性任务接入task verify、共享预算、借用/自有租约、原服务及锁内输入复核;保存严格npm观察和关联尝试的verification事件,next/历史识别npm序列并给下一步,输入变化不沿用旧结果。局部一致为still_blocked,原生失败为incomplete,任务仍open、无白名单批准。缺参数入口先RED;随后测试暴露两个事件消费者未接npm时间序列,已补齐。 - -36项不同普通相关用例通过;真实Node24.18.0/npm11.16.0公开扫描+原工具task verify通过(43.44秒)。实际复检反馈schema通过,三项伪造覆盖/权威/allow反例被拒;目标Clippy/格式最终检查后补。8项依赖显式原生Ruff的复检用例本轮未运行。完整漏洞库/策略覆盖、正式关闭/重开、宿主门禁及自动check all仍缺,7.3/7.5/9.7不勾选;见相邻tests/acceptance/npm-task-verification.md。 - -最终检查:目标Clippy(-D warnings)及fmt通过;最终局部回归11项通过,human实际复检显示原生诊断/组件数/下一步并保存记录,OpenSpec严格校验与diff检查通过。未增加完整能力勾选。 - - -## 2026-09-27 npm复检收据严格归属与过期分流 - -next与尝试历史新增npm原字节重复键拒绝、同任务检查器/稳定义务/构建根核验;报告解析先完成静态结构再核对当前工作区与清单/锁摘要及节点,锁重读也核对摘要。只有结构有效但输入已变/不可读的历史观察失效后允许重新复检,损坏证据不冒充输入过期。 - -新增十个组合反例(五种篡改乘当前输入未变/已变),同时改写报告、验证事件及消费收据摘要;错构建根先RED,旧实现曾接受另一个根的incomplete失败结果并确认当前尝试已经复检,补精确归属后拒绝。49项不同普通回归通过;10项需要指定原生Ruff的用例本轮未运行。真实既有Node24.18.0/npm11.16.0公开扫描与task verify通过(45.05秒);目标Clippy、fmt、OpenSpec严格校验及diff检查通过。 - -完整受保护工具/配置/审计源上下文、可信漏洞覆盖、正式关闭/重开及宿主门禁仍缺,7.3/7.5/9.7保持未勾选。验收见相邻tests/acceptance/npm-verification-receipt-integrity.md。 - - -## 2026-09-27 check all npm逐根原生编排 - -显式Node/npm/版本/用户与全局配置上下文接入共享任务图,每个发现package根独立cwd/私有运行区,统一jobs和deadline;执行后串行同步稳定npm完整性任务并反馈next,原生失败不变源码违规。缺上下文保持配置发现,check java拒绝npm选项,预算到期不启动剩余任务。协议check_feedback0.24/check_aborted0.5新增npm逐根结果,旧0.23/0.4 schema保留。 - -新入口参数先RED;实际schema验收发现候选原因码遗漏并补齐。两根并发/稳定任务、混合成功失败、500ms统一截止时间、参数及语言范围反例已通过。早期并发回归出现临时私有目录创建失败;源码旧运行ID仅PID/时间不能保证并发唯一,已增加原子序列,同刻度64个ID用例先RED再通过。不将原失败误归为代码违规,具体当次OS失败原因未单独留存。 - -真实既有Node24.18.0/npm11.16.0 check all→稳定任务→next初次21.80秒、最终22.30秒通过;无安装、包脚本或node_modules,清单和锁不变。当前含npm/无上下文实际反馈schema、三项伪造门禁/权威/覆盖反例及旧0.23形状校验通过。最终普通回归、Clippy/格式结果待追加。 - -可信上下文自动解析、早期阻塞全覆盖、完整漏洞库/依赖图及关闭/重开、其它语言/类别调度、跨平台与宿主门禁仍缺,7.3/7.5保持未勾选。验收见相邻tests/acceptance/check-all-npm.md。 - -最终检查:66项不同普通用例通过(63项integration、3项领域/调度单元),目标Clippy(-D warnings)和fmt通过;真实npm check all最终22.30秒通过。其它9项显式原生用例本轮未运行,不将普通夹具作为它们的验收证明。OpenSpec严格校验及diff检查通过。7.3/7.5不勾选,不归档change。 - - -## 2026-09-27 npm缺少上下文的准备阻塞持久化 - -已有可读清单/锁的初始化工作区,公开cve缺参数与显式选择npm的check all部分参数,现在保存本地未验证准备观察并生成稳定CVE完整性任务;随后原生检查复用任务。task verify缺上下文也保留incomplete复检事件,不签发关闭。准备观察固定零组件、空advisory;矛盾记录被严格解析器及当前报告schema拒绝。先通过缺任务和虚构advisory两个RED反例确认问题,再实现修复。 - -36项受影响普通回归通过,实际准备反馈/观察/复检通过Draft202012 schema验证,四个伪造变体被拒;CLI及相关测试Clippy -D warnings通过。真实npm回归结果另附。缺锁/坏清单的独立准备协议、没有显式npm上下文的check all自动任务、工具上下文可信来源、覆盖/审批/真实门禁仍缺。7.3/7.5/9.7及相关完整任务保持未完成;本进展不是完整CVE或白名单放行验收。详见相邻codeguard-cli/tests/acceptance/npm-missing-context-workbench.md。 - -补充验收:显式使用既有Node v24.18.0/npm11.16.0的公开CVE原生回归通过(44.13秒);不安装、不执行包脚本。实际check all准备反馈schema通过,当前嵌入观察schema与独立schema字节结构一致;fmt检查通过。其余2项本轮普通命令忽略的原生测试未运行,不当作通过。 - - -## 2026-09-27 npm缺锁准备协议与稳定任务 - -初始化工作区、可绑定清单且确实缺package-lock.json时,CVE/check all显式npm/task verify在启动工具前保存schema0.2本地准备观察:lock_state=missing、lock_sha256=null、零组件和空advisory;缺锁不伪装为漏洞。补齐锁后旧观察失效,后续普通0.1观察复用稳定任务。悬空链接、伪造状态/摘要/覆盖、未知版本及缺锁收据在锁恢复后重放均被拒;取消、时间预算及物理路径约束继续生效。 - -消费者版本同步为check_feedback0.25、task_verification_preview0.5、check_aborted0.6;独立npm观察读取0.1/0.2,历史schema原字节归档。51项普通集成回归通过;真实npm check all回归通过(22.98秒),原清单/锁不被修改、不安装或执行包脚本。实际缺锁观察/check/verify通过Draft202012校验,五个伪造变体及旧版观察消费者拒绝。abort实际中断运行未在本轮外部schema验收,不将schema静态有效当作运行通过。 - -仍缺不可读/坏清单的独立准备任务、未显式选择npm的check all自动准备调度、可信上下文、完整CVE覆盖和正式任务关闭/宿主门禁;7.3/7.5/9.7保持未完成。验收文档:相邻codeguard-cli/tests/acceptance/npm-missing-lock-workbench.md。 - -最终补充:2项check_command中断/兄弟结果保留单元测试通过,连同51项集成共53项普通用例;Clippy -D warnings、fmt、当前四schema Draft202012静态校验及嵌入协议一致性回归通过。OpenSpec严格校验及diff空白检查通过。观察0.1不能声称npm_lock_missing,缺锁必须采用0.2明确状态。 - - -## 2026-09-27 npm坏清单启动前诊断与任务 - -RED用例证实已识别无效清单仍启动工具,错误被表达成npm_version_mismatch。现将无效JSON、重复字段和非法scripts类型在原生启动前拦截;绑定清单/锁及当前配置解析,保存零组件/空advisory的准备观察,CVE/check all显式npm/task verify复用稳定任务。next及可读任务明确检查package.json语法/重复字段/scripts类型和锁文件,再恢复原工具;修正输入后旧复检收据失效。当前字节有效却声称清单坏的伪造报告被拒。 - -35项不同普通回归通过;实际坏清单观察/check/verify通过Draft202012,3个伪造组件/advisory/覆盖变体拒绝。真实Node v24.18.0/npm11.16.0 check all回归通过(22.50秒),不安装/执行包脚本;其余10项普通命令忽略的原生测试本轮未执行。观察0.1/缺锁0.2与check0.25/verify0.5协议字段不变,仅准备原因的结构约束同步加固;旧schema归档不改。详见相邻codeguard-cli/tests/acceptance/npm-invalid-manifest-workbench.md。 - -不可读或缺清单/目录输入的持久准备协议、可信上下文、完整CVE覆盖与正式任务关闭/门禁仍缺;7.3/7.5/9.7未完成,不以本轮回归代替全计划验收。 - -最终检查:CLI和新增用例Clippy -D warnings、fmt、OpenSpec严格验证及diff空白检查通过。 - - -## 2026-09-27 check all默认自动npm准备任务 - -RED确认无参数check all发现两个npm根却无准备任务。现Unix支持平台默认将发现的npm根接入共享任务图;缺显式上下文只保存准备观察与稳定任务,不启动原工具、不安装/继承凭据。重复扫描、随后补齐上下文的原生检查复用任务,串行同步及next无需调用者手工串接。未初始化项目仅反馈workspace_not_initialized、不创建codeguard;Java-only检查不触发npm。 - -47项不同普通用例通过,涵盖多根准备/后续原生调用、Java隔离、缺锁/坏清单、预算/取消、SARIF与新未初始化反例。实际默认多根check all通过Draft202012,首次两任务、重扫零新增;真实Node v24.18.0/npm11.16.0 check all回归通过(23.03秒),不安装/执行包脚本。其余7项本轮普通命令忽略的原生用例未执行。Clippy -D warnings、fmt通过。 - -只接通CLI默认准备调度;未取得可信工具上下文自动解析、完整CVE覆盖、宿主Hook和正式任务关闭/门禁。Windows该路径仍未支持;不可读/缺清单的持久状态仍缺。7.3/7.5/9.7保持未完成。详见相邻codeguard-cli/tests/acceptance/npm-automatic-preparation.md。 - - -## 2026-09-27 npm不可用输入状态协议与历史 - -新增Rust有界输入状态观察及严格准备报告0.3:present/missing/not_regular/path_alias/unavailable,可读普通文件有SHA,其余null;原因与状态严格一致,零组件/空advisory。公共CVE及task verify可在清单缺失、目录、悬空链接或超限时保存稳定环境任务,不读取链接目标;锁非普通文件也可在默认check all中产生准备任务。旧0.1普通观察/0.2缺锁继续严格识别,消费者升至check0.26/verify0.6/abort0.7,旧schema原字节归档。 - -RED先暴露缺失被当作缺上下文;随后反例暴露目录使next返回attempt_input_unreadable。npm阻塞任务现在以有界输入状态形成尝试指纹,可读与缺失沿用原摘要格式,其余只记录状态,不能成为关闭证明。当前输入恢复后旧复检不再解释本轮;6种结构/身份伪造及一个过期报告被拒,不增任务。 - -78项不同普通回归通过(76集成+2中断单元),包括租约/无进展预算、Java、SARIF、任务复检与旧协议;真实Node v24.18.0/npm11.16.0 check all回归通过(22.42秒)。实际新观察/check/verify通过Draft202012,6个伪造变体拒绝、旧消费者拒绝新协议;其余16项忽略的原生用例本轮未执行。有界不可用fixture为超限,不声称已完成独立权限EACCES运行验收。abort本轮仅既有单位用例和schema静态检查,未外部验证真实中断新观察。 - -仍缺丢失清单后从历史/基线恢复完整根发现、外部工具/配置文件不可用的持久准备、Windows、可信上下文/完整CVE覆盖、宿主Hook及正式关闭/门禁。7.3/7.5/9.7保持未完成,见相邻codeguard-cli/tests/acceptance/npm-input-state-workbench.md。 - -最终核验:最新新增用例及CLI的Clippy -D warnings、fmt、OpenSpec严格验证与diff空白检查通过;输入状态及坏清单最新修复指引回归实际执行通过。 - - -## 2026-09-27 npm历史构建根的准备恢复 - -默认check all现可从与本地受管摘要一致的0.3初始化画像恢复清单不可用但物理目录仍存在的npm准备范围。严格校验递归重复字段、协议标记、相对路径/别名、物理归属及有界输入状态;历史根不使用旧摘要或显式工具参数启动原工具。当前兄弟根仍正常调度,画像错误以historical_npm_scope_unavailable及具体原因反馈,不吞掉其结果。清单恢复后重新发现,稳定任务不重复。 - -新增npm_historical_roots_cli由双根只剩一根的RED推进到通过,覆盖重复同步、混合原生参数调用轨迹及画像失配/越界/别名/错类型/重复字段反例。最终新增矩阵通过;CLI及新增测试Clippy -D warnings、fmt通过。相邻验收:codeguard-cli/tests/acceptance/npm-historical-roots-workbench.md。 - -这是本地准备范围恢复,非可信审批或CVE覆盖。目录整体消失只明示未完成;旧画像版本、刷新画像删除旧根后的完整义务恢复、外部工具/配置、Windows、可信上下文、完整覆盖及宿主闭环仍未完成。7.3/7.5/9.7保持未勾选。 - -最终普通验收:61项不同普通集成用例通过(Java24、check all npm2、部分契约13、SARIF6、npm audit1、历史根1、输入状态1、坏清单1、缺锁1、父工作区1、task verify10);17项显式原生用例在普通命令中忽略。独立执行的历史-only默认检查实际反馈通过Draft202012,两轮稳定任务且历史清单摘要null。OpenSpec严格校验、diff空白检查通过。真实npm回归单独记录。 - -原生补充:显式既有Node v24.18.0/npm11.16.0的check all回归实际通过(22.45秒);不安装、不执行包脚本。普通命令忽略的其余16项原生用例本轮未执行。准备恢复和本地一致性不等于漏洞库覆盖或白名单批准,完整计划仍未完成。 - - -## 2026-09-27 npm画像刷新后保留已记录准备范围 - -RED证实清单删除后再次init刷新画像,默认check all遗漏已有稳定npm问题。现从本工作区有界普通物理finding.json恢复清单不可用、物理目录仍存在的准备范围;核对结构、工作区/检查器、稳定指纹与ID、scope、两项输入归属及状态。画像与事实两类来源独立,不因画像失配吞掉可核验事实范围。只恢复本地准备,不沿用旧结果或启动该根的原工具。可编辑Markdown附件删除/勾选不能消除该范围;附件缺失仍暴露同步问题,不宣称任务已修复。 - -新增npm_recorded_roots_cli覆盖刷新后重复检查、附件删除、事实身份/路径损坏、当前兄弟根保留及输入恢复;已有画像拒绝测试更新为事实恢复仍保留范围,同时明示画像错误。目录整体丢失、删除全部事实且画像已刷新后的防逃逸仍需独立受保护义务来源;本地记录不是可信批准。完整7.3/7.5/9.7保持未完成,不据此归档。 - - -最终验收:27项不同普通集成用例通过(默认npm2、部分契约13、SARIF6、历史画像1、输入状态1、坏清单1、缺锁1、已记录根1、父工作区1)。最新已记录根用例扩展到9项身份/状态/范围错误反例,当前兄弟根均保留;其中运行ID反例用非法分隔符,普通字母本身合法,不为迎合测试收紧契约。实际刷新画像后仅事实来源的两轮check反馈通过Draft202012,清单摘要null,new_blockers=0。显式既有Node v24.18.0/npm11.16.0原生check all回归通过(23.40秒),无安装或包脚本;普通命令忽略的另一项Ruff原生用例本轮未执行。CLI/新增测试Clippy -D warnings、fmt及OpenSpec严格校验、diff空白检查通过。完整计划仍未完成。 - - -## 2026-09-27 Rust全工作区回归与严格静态检查(进行中) - -扩大到cargo test --workspace与cargo clippy --workspace --all-targets -- -D warnings。首次全目标Clippy发现work_sync.rs在测试模块后定义validate_eslint_observation(items_after_test_module);已将同一函数原样移到测试模块之前,无行为或协议变更,不以allow压制告警。fmt检查通过。全目标Clippy复检和同步模块单元回归仍在运行,未提前记录通过;全工作区测试沿原进程继续,当前已收集15组结论、60通过/0失败/3忽略,为中间进度而非整轮验收。 - -已确认普通工作区回归不执行显式ignored原生工具用例;MSRV1.85工具链当前未安装,Windows/宿主验收未运行。13.2及全计划保持未完成。此记录需待同一运行终态更新,不因等待超时重复启动。 - -后续终态:修复后的全工作区all-targets Clippy -D warnings实际通过(1分32秒),同步模块3项恢复/重放单元测试实际通过。全工作区普通测试仍沿原进程运行,尚未签发整轮通过结论。 - - -## 2026-09-27 全工作区依赖边界失败与修复 - -上一全工作区测试已终止为exit101:52组结论累计271通过、1失败、23忽略,失败为crate_boundaries的真实Cargo metadata检查;不记录整轮通过。核对发现adapters两个原生测试调用runtime造成dev越层,且网络下载实现新增的runtime依赖和CLI测试异步依赖未登记。已将Checkstyle原生重放和Node字面参数原生测试移入CLI测试层,删除adapters→runtime dev依赖;保留adapters任何kind不得依赖runtime的红线。仅允许runtime normal reqwest/tokio/tokio-util/futures-util/idna_adapter与runtime dev rustls;CLI tokio只允许dev。新增对应正常/错误crate、build/dev/normal反例,现6项依赖边界与4项纯ESLint命令契约通过。迁移保留原生用例内容及ignored边界,不靠放宽生产依赖方向消除失败。 - -额外原生证据:已实时核验既有/opt/anaconda3/bin/ruff为0.16.8,check all部分结果1项、task verify8项、whitelist propose2项共11项真实Ruff用例通过;包含noqa、规则关闭、per-file-ignore、恢复环境不假关闭及纠错提案不自批。106份schema的静态合法性与本地引用检查通过,不能代替运行报告验收。MSRV1.85、Windows、三宿主仍未验收。修复后全工作区测试与all-targets Clippy重新运行,结果另附;13.2保持未完成。 - -补充终态:修复后all-targets Clippy -D warnings通过(29.62秒),fmt通过;迁移后的Node v24.18.0原生字面参数用例实际通过(1项),只证明argv安全转发,不冒充真实ESLint规则检查。Checkstyle重放迁移保留且本轮未运行。新的全工作区回归仍在原进程运行。 - - -## 2026-09-27 当前规格到任务的覆盖索引修正 - -只读审计发现implementation-coverage.md缺43个后来新增的Requirement映射。已按当前正式规格追加binary-distribution7、execution-kernel5、native-tool-adapters15、remediation-workflow12、unified-cli-contract4项,引用已有实施任务而非另建任务。检查108个当前Requirement各有唯一精确spec/title映射,追踪ID不重复、没有失效Requirement、任务ID及任务区间均存在。每行仍覆盖该Requirement全部Scenario,不拿局部契约通过替代整项验收。 - -此为13.7的规格→任务追踪部分修复,未证明命令/语言/平台/宿主实现及全量双向验收,13.7与完整计划保持未完成。修复依赖边界后的工作区测试仍沿原运行继续;当前23组中间结论95通过/0失败/4忽略,不签发整轮通过。 - - -## 2026-09-27 Checkstyle原生补充与受管技能一致性 - -实时核验现有Checkstyle10.21.4 all.jar(19631994字节,SHA256 3c1d94d6ecc83e02dff587c9ba5b6b4ec4fec38c7a958eb587efec9b28e2f318)与本机JDK21.0.12.1。迁至CLI层的原生重放1项、record/继承/生成范围1项实际通过。首次一并调用Lombok变体时缺CODEGUARD_LOMBOK_JAR,测试在读取该前置条件时失败,不归因于产品误报;随后明确选择本机Lombok1.18.38(SHA256 1e1e427c36ff63c44fd30ef292d9e773ea3154460ab6265d3fed7e6f5bc50fb9)重跑失败项,实际通过(8.99秒)。没有下载或安装新工具,本地摘要不是独立发行批准。java_checkstyle_workbench的13项原生验收仍运行,终态另附。 - -skill_vendor.py check --offline与在线check均实际通过;在线核验codeguard-skills v0.1.2锁定提交2c0c8071f96de48dc53e11de2499c083c100e44c。不修改受管技能或lock,检查脚本不是Rust产品运行时。修复依赖边界后的全工作区普通回归仍沿同一进程运行,未签发整轮通过;13.2及完整计划保持未完成。 - -原生终态:java_checkstyle_workbench 13项全部通过(68.70秒);连同迁移重放、record/继承/生成与补齐参数后的Lombok变体,本轮共16项不同Checkstyle原生用例通过。范围含字段/枚举、方法/构造器、参数返回/泛型、类型选项、原配置抑制、准备恢复、稳定任务和原工具复检。旧失败保留,不把本地原生观察升级为完整项目覆盖、可信规则/白名单批准或任务关闭。6.3/9.7仍未完成。 - - -## 2026-09-27 Cargo Clippy原生补充验收 - -明确选择本机stable-aarch64-apple-darwin的真实Cargo(Rust工具链1.98.1),执行check_all_rust_native两项ignored用例,实际2项通过(6.70秒)。包含原生局部扫描及已初始化稳定任务复检;原生allow抑制经force-warn对照不能解释成已修复,局部缺失仅为未核验策略的候选,任务不自动关闭。此结果不是MSRV1.85实测、完整features/targets覆盖、可信工具/规则政策、Windows或交付门禁验收,7.1/9.7及全计划保持未完成。 - -修复依赖边界后的全工作区测试仍沿同一运行继续,最新中间结果105组、581通过/0失败/72忽略;忽略项不算通过,原生补充另列,未提前签发整轮成功。 - -## 2026-09-27 全工作区回归终态与旧插件兼容验收 - -修复依赖边界后的同一轮 cargo test --workspace 已实际结束,退出码0;完整日志149组结果、880通过、0失败、91忽略(组数含零测试的doc-test组)。日志/private/tmp/codeguard-workspace-boundaries.5rmnN9,SHA256 61690f3e20d0eecb6e9ce06cf98814ba76428763037253214f398ed61c97e899。前述中间数字均为当时进度,本段才是整轮终态。忽略项不算通过,独立原生补充按各自范围记录;详细边界见相邻codeguard-cli/tests/acceptance/workspace-regression-20260927.md。 - -旧插件使用本机既有/opt/anaconda3/bin/python 3.13.5和Ruff 0.16.8执行兼容检查,不作为新Rust产品的实现路径: - -| 检查 | 实际终态 | 范围 | -|---|---|---| -| python -m unittest discover -s tests -q | 退出0;632项运行、621通过、11跳过;111.689秒 | 既有单元与跨进程兼容语义;跳过项未验收 | -| python tests/run_all.py | 退出0;142通过、0失败、1跳过 | 旧语言结构及宿主协议模拟;不等于已安装宿主运行 | -| python scripts/validate_languages_json.py | 退出0;57条目、11条schema规则通过 | 54 stable/3 planned的旧注册表结构,不证明新适配器可用 | -| python scripts/check_architecture.py | 退出0 | 旧实现声明依赖和导入环 | -| ruff check hooks scripts tests | 退出0 | 既有Python兼容代码静态检查 | -| openspec validate introduce-rust-codeguard-cli --strict --no-interactive | 退出0 | 当前增量规格格式与结构有效,不是实现验收 | - -旧协议测试中的CODEGUARD_SKIP_GATE等历史行为只证明兼容夹具期望,没有批准新Rust门禁沿用逃生机制。旧单元日志/private/tmp/codeguard-legacy-unittest-20260927.log,协议日志/private/tmp/codeguard-legacy-harness-20260927.log。未静默安装缺失检查器;跳过不改记为通过。此前相同Rust源码状态的fmt、all-targets Clippy和vendor离线/在线检查已记录;本段补全等待中的Rust回归终态及旧插件适用测试。 - -13.2取得当前macOS/既有工具链的新增回归证据;MSRV1.85、其它平台、三宿主、完整规则/审批/任务关闭与门禁仍缺,不能把本段提升为全计划完成或发布验收。 - -## 2026-09-27 rules list入口与候选规则目录 - -按既有4.7/C08及rulepack-governance规格实现Rust只读rules list [path],补充同一Requirement的三项Scenario,不另建事实源。复用静态发现与已有严格版本化Ruff映射,分别展示配置声明、候选映射和逐语言六类目录缺口;不执行动态配置/工具、不修改项目文件、项目同名规则包及自批字段不授权。配置存在不证明具体规则启用,候选始终unverified/not_run;报告0.1固定未完成/退出3,无门禁效果。Node检查器明确映射到TypeScript生态,不以语言前缀遗漏ESLint。 - -RED:初次新增5项测试在旧入口为1通过/4失败;实现后5项通过。增加Node配置归属反例后再现失败,明确生态映射后修复。中断前启动的相关回归和Clippy句柄后来不存在,且进程检查未见存活任务,不能推断那轮通过;本轮重新执行并保留日志。 - -当前终态:rules_list_cli 6项、config_inspection_contract 6项、whitelist_command_contract 8项,共20项通过/0失败/0忽略,进程退出0。实际二进制Python/TypeScript/Java/all四份输出通过rules-inventory Draft202012 schema,四种伪造批准/通过变体被拒,动态ESLint配置无副作用。fmt检查退出0;新源码的全工作区all-targets Clippy仍在运行,终态另附。当前OpenSpec strict及git diff空白检查退出0。日志/private/tmp/codeguard-rules-list-tests-20260927.log、/private/tmp/codeguard-rules-list-clippy-20260927.log;验收说明见相邻tests/acceptance/rules-list-static-inventory.md。 - -未证明完整项目有效规则目录、可信工具锁/政策、逐文件原生配置与suppression差异、已批准例外或三宿主接线;4.7与完整计划仍未完成。之前880项工作区通过属于本入口新增之前的源码状态,不升级为本次新源码全工作区回归证明。 - -静态检查终态:新源码的cargo clippy --workspace --all-targets -- -D warnings实际退出0(3m44s,含锁等待),没有以中断前未知结果替代;fmt及本轮最终OpenSpec严格校验/diff空白检查已退出0。入口既有单元回归另行运行,终态另附。 - -入口回归终态:cargo test -p codeguard-cli --bin codeguard退出0,5项既有参数/登记/发现测试通过。连同三个集成套件,本轮25项不同普通用例通过,无忽略;不等于所有工作区套件或原生工具/宿主验收。日志/private/tmp/codeguard-rules-list-entry-tests-20260927.log。 - -## 2026-09-27 Rustdoc原生适配验收 - -核对Cargo rustdoc官方命令与本机最小原生输出,确认missing_docs进入Cargo JSON诊断,不能复用Clippy过滤器。按现有7.1/原生证据Requirement增加独立Rust解析器及两项Scenario,保持同一OpenSpec事实源;规则/级别/唯一主定位及原生package/manifest/target仅作观察,待执行层绑定。重复键、歧义定位、异常结束、未知警告、编译错误为未完成,不按自由文本或退出非零生成注释违规。 - -初态新API缺失导致契约测试编译失败;实现后cargo_rustdoc_contract 7项通过。crate_boundaries 6项通过;显式已有CODEGUARD_CARGO_BIN的rustdoc_native_replay 1项通过(1.95秒),五种原生输入涵盖缺文档/正常/坏链接/编译失败/源码allow抑制,源码不变,无安装。总计14项不同测试通过;不能将五个循环输入写成五项独立测试。相关两测试目标的Clippy -D warnings退出0(15.09秒),fmt退出0。 - -原生重放使用Rust1.98.1,只执行局部库目标。未实现公开comments rust、稳定任务/复检闭环、原配置与完整目标归属、前后字节绑定、可信工具/规则、全部features/workspace、跨平台与宿主;7.1仍不勾选。验收说明见相邻codeguard-cli/tests/acceptance/rustdoc-native-observation.md;先前880项全工作区成功不是本次新增源码的全量证明。 - -## 2026-09-27 comments rust公开入口与输入归属 - -延续7.1,同一Rust服务接入comments rust,显式Cargo经共享runtime运行锁定离线库目标机器流,采用私有target目录和共享预算。SourceSnapshot捕获根清单/锁/全部本轮已发现Rust源码,运行后复核字节及发现集合;Cargo入口摘要前后绑定。原生主定位、根清单和库目标源码归属不匹配为未完成。human/JSON反馈明确显式规则探针、未批准政策/覆盖、任务尚未接入及原工具复检,不把零诊断解释为修复或交付。 - -RED:入口缺失时普通测试1通过/3失败、原生1忽略;实现阶段一次错误Result::filter调用导致编译失败,修正后4项普通CLI测试通过。显式本机Cargo/Rust1.98.1的原生CLI用例实际1通过(3.43秒),含补文档前后两轮;不是两项独立测试。随后最终源码4项CLI契约及5项入口单测通过(共9项普通、1项默认忽略);原生独立补充计1项,不能把忽略项重算为默认通过。相关CLI目标Clippy -D warnings通过(最终2.50秒)。 - -实际缺工具与原生有发现两份报告通过rustdoc-local-observation Draft202012,篡改授权/交付/覆盖/关闭的四个变体被拒。该校验的Python不在Rust产品运行链。验收说明见相邻tests/acceptance/rust-comments-cli.md。 - -当前backlog_status固定not_integrated;未实现稳定文档任务、task verify、抑制对照、check all调度、完整配置/运行时闭包、可信工具/规则、全部workspace/features/targets或跨平台/宿主,7.1仍未完成。旧全工作区回归不能升级为本次新增源码的全量证明。 - -取消反例追加:真实SIGINT与源码变化同轮发生时,首次测试失败,退出3而非130;修正取消优先级后rust_comments_cli 5项普通通过/1项默认忽略(1.39秒),相关CLI目标Clippy -D warnings退出0(6.54秒)。前面的4项为该反例加入前的历史记录。原生补文档前后用例在最终源码上再次运行,终态另附;5项入口单测已有通过,完整工作区未重跑,完整计划不勾选。 - -最终原生补充实际1项通过(3.45秒),普通5项及独立补充均不失败;fmt、OpenSpec strict和diff空白检查退出0。仍不提升为完整任务或全部工作区验收。 - -## 2026-09-27 Rustdoc范围身份与歧义反馈 - -持久任务接线前审计发现旧行锚点/序号可能错认同一行的crate与函数诊断。新增独立纯身份服务,保留原生字节范围并校验真实UTF8切片及行列;指纹采用规则、相对目标与原生范围字节,不采用行号或输出序号。完全相同原生记录去重;不同范围候选指纹碰撞时保留观察但finding_id为空、identity_status=ambiguous,运行未完成,不能生成正式任务身份。 - -新增身份API最初缺失导致编译失败;重复声明CLI反例最初错误返回native_observed_unverified。修复后3项身份契约、6项CLI普通及7项协议回归通过。反馈升级0.2,旧0.1 schema原字节副本保留;实际原生0.2报告通过schema,crate/函数ID不同,伪造歧义仍保留ID的变体被拒。之后补强范围与行列一致性并复跑普通回归仍通过;最终原生/静态结果另附,不复用补强前结果。 - -这是7.1/9.7的身份前置,不是完整符号身份、持久任务或task verify交付。已知同文件同声明的不同符号仍需语义归属,目前只调查歧义;完整配置/构建组合、可信来源、三宿主及任务关闭重开仍缺,不勾选。验收见相邻tests/acceptance/rustdoc-native-span-identity.md。 - -补强后终态:两项原生独立用例均通过,CLI用例追加中文文档坏链接的真实UTF8范围/行列核对(5.12秒),原生重放用例通过(1.26秒)。相关adapters/CLI测试目标Clippy -D warnings退出0(7.69秒),普通6+3与协议7已有通过;合计18项不同测试,两个原生测试均显式独立执行,不把默认忽略计为通过。全工作区未重跑,完整计划保持未完成。 - -## 2026-09-27 Rustdoc逐问题修复简报 - -comments rust报告0.3为每条原生发现生成七项修复信息;missing_docs区分内部/外部文档,broken_intra_doc_links要求核对真实符号及作用域。简报绑定本轮源摘要、原生范围及复检argv,修改范围限于原目标;输入变化/身份歧义等未完成观察只给调查及重新检查,修改范围为空。attempt_history空数组明确history_status=not_integrated,不能证明没有历史失败。保留0.2 schema,当前协议升级0.3。 - -TDD先验证缺简报的两项失败;实现后7项普通CLI和3项身份测试通过,1项真实Cargo CLI独立执行通过(4.34秒,含缺文档、补齐、中文坏链接),相关Clippy -D warnings通过(5.77秒)。真实原生报告通过Draft202012协议;删除七项修复字段的七个变体及未完成却保留源码修复指引的变体均被拒。Python校验仅为独立验收,不在Rust产品执行路径。 - -尚未实现Rustdoc持久同步、task verify、尝试历史读取、抑制对照、正式关闭/复发重开、check all调度和完整配置/工具/策略覆盖;7.1、9.7保持未完成。全工作区未重跑,完整目标继续。验收见相邻codeguard-cli/tests/acceptance/rustdoc-repair-brief.md。 - -## 2026-09-27 Rustdoc自动持久同步与next - -comments rust报告0.4加入工作区绑定、独立run_id和原生目标相对路径,保留0.3历史schema。已初始化时保存queued报告并自动调用统一work sync;新原生发现生成稳定fact、Markdown七项任务与观察,同一问题再次扫描不重复建任务。导入重建原生范围指纹和简报,核对源码、清单及锁的当前字节;陈旧证据作为历史并生成重扫准备阻塞,坏身份/额外字段/范围或工具状态矛盾拒绝导入。未完成观察只生成检查准备任务,不创建源码违规。next识别rust.cargo_rustdoc并给同一原工具重扫指引;尚无task verify时不指示自动关闭。 - -TDD初始化扫描缺持久同步时先RED;新增重复扫描/next、缺工具准备、队列入库后清单变化、伪造指纹四个契约。最终相关普通回归:rust_comments_cli 11、identity 3、work_sync 15、cross_category 1、next 6,共36项通过,3项默认忽略不计通过。真实Cargo CLI显式独立运行1项通过(5.56秒),追加初始化、真实发现任务文件及自动同步检查;相关Clippy -D warnings终态通过(10.28秒)。实际绑定反馈与queued报告通过Draft202012,task文件存在,缺工作区ID反例被拒。fmt/OpenSpec结果另记。 - -7.1/9.4/9.7未完成:原配置/完整目标覆盖、可信工具规则、文档task verify/尝试历史/抑制对照/关闭复发及跨宿主尚缺。旧全工作区回归不代表本轮全量;验收见相邻tests/acceptance/rustdoc-workbench-sync.md。 - -## 2026-09-27 Rustdoc任务复检与原生抑制对照 - -复用comments rust的同一观察服务,接通task verify --cargo-tool;同一预算与任务租约内执行普通rustdoc及force-warn对照,捕获全部已发现Rust源/清单/锁并核验两轮输入与工具摘要。原问题仍在为still_present,同文件同规则身份变化为rule_coverage_requires_review,抑制重现为suppression_requires_review;两轮局部零发现仅candidate_absent_unverified_policy,任务保持open。环境恢复同样待策略核验。复检保存同一问题事件并关联准备好的attempt;next/历史读取识别rustdoc时间序列,源码/清单/锁变化后不沿用旧观察。未稳定封套的导入不生成源码修复任务。 - -协议:rustdoc_task_recheck 0.1封套包含普通/强制原生观察与输入身份;文档task_verification_preview升级0.7,其它既有预览继续0.6。保留原0.6schema;当前schema接受具名旧协议及新封套,不赋予门禁/关闭权威。实际原生预览及两轮嵌套报告通过Draft202012,校验Python仅独立验收。 - -TDD缺入口先RED,随后暴露历史读取器缺新checker与序列格式导致第二次复检失败,补齐后连续仍在/抑制/缺失契约通过。相关普通回归:文档CLI12、next6、同步15、任务租约16、任务复检10,共59项不同测试通过;11项默认忽略不计通过。原生CLI独立1项实际通过(14.07秒),包括初始化/稳定任务、真实缺文档复检、补齐文档与源码allow的force-warn反例、中文坏链接;同一测试多轮不重复计数。相关最终Clippy结果另附。 - -仍缺正式关闭与复发重开、完整原配置/workspace/features/targets/符号归属、可信工具/规则/批准、全部语言类别及宿主;7.1/9.7不勾选。未来工具文件变化的旧复检不能作为批准工具证明,本地来源始终未核验。本轮没有全工作区回归。验收见相邻tests/acceptance/rustdoc-task-recheck.md。 - -最终补充:相关五个CLI测试目标Clippy -D warnings退出0(9.51秒);fmt --check退出0,OpenSpec严格校验及git diff --check退出0。原生验收后仅调整next/任务说明文字和复检argv指向,CLI12与next6再通过;全工作区及完整正式闭环仍未验收。 - -## 2026-09-27 Rustdoc强制对照导入身份修正 - -反例先RED:普通观察合法时,强制对照的伪造指纹及重复输入归属均被旧同步器消费,failed_reports=0。现把复检导入交给独立Rustdoc封套解析:严格检查顶层键与唯一输入路径归属,稳定输入绑定源/目标及清单/锁;普通和强制观察分别进入同一严格原生范围/指纹解析。强制argv及原始证据保留在封套,只在内部核验投影规范化参数,不修改原始报告或将抑制当修复。输入不稳定/当前失配时只导入准备阻塞,不生成源码任务。 - -同一反例验收三种变体:伪造强制指纹和重复输入被拒,不稳定封套只生成一项重扫阻塞;没有新增源码任务。相关普通回归13项文档CLI、15项同步、6项next,共34项通过;3项默认忽略不算通过。真实Cargo CLI独立1项通过(14.49秒),覆盖正常文档发现/修复复检、原生allow/force-warn和中文链接;相关Clippy -D warnings退出0(7.18秒)。真实报告协议验收另记;schema增加重复行拒绝,唯一字段归属仍由Rust核验。 - -这是任务复检证据的完整性修正,不是正式批准或关闭;7.1/9.7保持未完成。全工作区未重跑,完整目标仍需持续推进。验收见相邻tests/acceptance/rustdoc-forced-evidence-binding.md。 - -协议终态:真实本机Cargo文档task verify报告及嵌套普通/强制观察通过当前Draft202012;重复输入行变体被schema拒绝。独立校验退出0;fmt --check、OpenSpec严格校验及git diff --check均退出0。没有全工作区或完整交付批准验收。 - - -## 2026-09-27 Rustdoc 接入 check all - -完整检查入口新增独立 rust.comments 节点,复用 comments rust 观察服务与持久同步;与 Clippy 共用总预算和 Cargo 资源互斥,分别保留结果/完成状态/准备任务。取消标记传入原生进程,避免新节点绕开任务取消。文档原生发现进入统一对话反馈和 next;检查器成功不覆盖其它未完成。check_feedback 0.27、check_aborted 0.8 自包含嵌入 Rustdoc 0.4,旧 0.26/0.7 协议保留。 - -TDD:缺调度时新契约先失败;接线后回归暴露旧任务计数、协议自包含以及独立准备任务 next 预期,已修正。真实验收新增断言最初误用 local_complete 字段失败,改为既有 local_scan_complete 后通过,不改生产协议迎合测试。普通相关 Go3/Java24/npm2/部分结果13/Rust11/文档14,共67项通过,12项默认忽略不算通过。显式既有 Cargo 原生3项通过:Clippy两项7.03秒、Rustdoc一项12.96秒;增强后的原生完整检查实际断言 missing_docs 及独立两节点。相关 Clippy -D warnings 通过(1.20秒)。 - -真实未初始化/初始化 check_feedback 0.27 均通过 Draft202012,初始化文档同步状态 synced;check_aborted 0.8 仅静态 schema 合法性,本轮未声称实际异常中止协议验收。Python仅独立验收,不在产品执行路径。正式规则/完整构建组合、可信工具策略、关闭复发与宿主仍缺;7.1/9.7不勾选,全工作区未重跑。详见相邻 tests/acceptance/rustdoc-check-all.md。 - - -## 2026-09-27 当前 Rustdoc 集成后的全工作区验收启动 - -当前源在完整 Rustdoc/check all 接线后启动 cargo test --workspace 和 cargo clippy --workspace --all-targets -- -D warnings。两项运行尚未终止,不能以旧880项通过替代本轮终态;测试日志 /tmp/codeguard-workspace-current-20260927.log,Clippy日志 /tmp/codeguard-clippy-current-20260927.log。本轮首批13组59项通过/0失败/0忽略,只是中间结果,13.2保持未完成。 - -独立协议静态审计115份schema合法且本地引用可解析;实施索引核对108项Requirement均有对应行且无重复标题,仅证明映射。OpenSpec strict及git diff --check退出0。未安装工具、未修改规格要求、未发布;完整计划继续,后续沿同一进程核验终态,不因观察等待重启。 - - -## 2026-09-27 全目标 Clippy 终态 - -同一运行 cargo clippy --workspace --all-targets -- -D warnings 已退出0,耗时2m01s,日志SHA256 ba479f2fe8cb4e988013460eed8c16cd6d506830b65530f8804107cf89c7695d。不是部分目标检查。全工作区测试仍运行,中间17组、74通过/0失败/1忽略;不得用中间结果宣布全通过。13.2及完整计划保持未完成。 - - -## 2026-09-27 插件兼容静态与 vendor 校验终态 - -既有架构脚本通过,语言注册57条(54 stable/3 planned)及11项schema规则通过;受管技能离线和在线check均退出0,在线核验 v0.1.2 -> 2c0c8071f96de48dc53e11de2499c083c100e44c。未更新lock、未安装或发布。旧Python脚本只是既有插件兼容验收,不新增Rust产品中的Python检测路径。 - -Rust全工作区测试同一运行仍在继续,本次中间25组/103通过/0失败/4忽略,不能宣布终态。全目标Clippy本轮已通过,115 schema静态校验和108 Requirement映射也通过,均不等于所有原生/平台/宿主验收。13.2不勾选。 - - -## 2026-09-27 既有插件测试与解释器边界 - -协议模拟 tests/run_all.py 终态142通过/0失败/1跳过。第一轮unittest实际632项/93.819秒,1失败/21跳过:主进程3.13.5而Bash CLI子进程PATH选到系统3.9,zip(strict=True)报错,不能将该轮计通过。仓库CI明确3.11/3.12/3.13。统一PATH到既有/opt/anaconda3/bin后,失败所在CLI合同3项实际通过(0.539秒),随后启动同一环境完整unittest,日志 /tmp/codeguard-plugin-unittest-python313-20260927.log,尚未终态。未修改Python生产逻辑、未安装解释器;保留首轮失败。Rust全量沿原进程继续,完整验收仍未完成。 - - -## 2026-09-27 统一解释器插件 unittest 终态 - -明确 PATH=/opt/anaconda3/bin:$PATH,主/子进程使用既有Python3.13.5;完整unittest退出0,632项/99.003秒,其中621通过、11跳过。日志SHA256 10f2e398b7d644ab8abf9cb3efebdfd637efc9994fd80fb41b454f12b0eff71e;首轮3.9子进程失败仍保留,不伪称系统3.9兼容。协议模拟142通过/1跳过、全目标Rust Clippy、架构/语言/schema/OpenSpec/vendor检查分别记录。Rust测试同一运行仍在继续,中间74组/432通过/0失败/34忽略,尚无完整终态;13.2及总目标保持未完成。 - - -## 2026-09-27 Rust 构建实现前验收约束 - -继续既有7.1与Rust command plans SHALL preserve explicit build levels要求,追加原生Cargo check的可归属编译错误与报告损坏两场景;不新增change或改验收目标。后续适配须保留package/manifest/target与原生诊断,类型检查固定test_execution=false,不改称Clippy/文档/安全违规。成功/失败结束、原生退出、重复键、结束后事件及无可归属诊断的失败须分别核验;裸退出不生成源码违规或通过。当前只有规格补齐,尚无Cargo构建实现或测试通过声明;7.1仍未完成。OpenSpec strict和git diff --check退出0。现有Rust全工作区测试继续原运行,未因等待重启。 - - -## 2026-09-27 Rustdoc集成后全工作区测试终态 - -同一 cargo test --workspace 运行已退出0:154组、910通过、0失败、93忽略。包括当前Rustdoc/check all/任务复检及所有既有普通回归;忽略原生测试、MSRV1.85、Windows和宿主不计通过。日志 /tmp/codeguard-workspace-current-20260927.log,SHA256 8d647e591bac5d2d247e33a3e648922d102da3639c72909a0513ecb3b91c5ff8。当前 source 的全目标Clippy已退出0,既有插件unittest621通过/11跳过、协议模拟142通过/1跳过,115schema静态/OpenSpec/架构/语言/vendor另有终态。 - -当前全量结果替代旧880项基线,不抹去首轮Python3.9子进程失败;93项忽略须各自具备条件后独立验收。实际原生Cargo3项和反馈0.27的两种绑定情况验收另列,不把普通协议夹具当真实工具。原配置/全构建组合、可信策略、关闭复发、全部语言类别与发布宿主仍缺,13.2及完整目标不勾选。下一实现为已有7.1下Cargo原生构建契约,新增两场景只是验收准备。 - - -## 2026-09-27 Cargo 原生构建解析前置 - -新增独立 CargoBuildDiagnostic/CargoBuildParsed 对象与 Cargo check JSON流解析,保留编译器错误码、package/manifest/target及唯一主定位范围,不借Clippy/文档规则过滤。结束成功与退出、成功却带error、失败无可归属错误、坏/重复键/未知记录/结束后事件、规模上限等均未完成;前序有效观察保留仅供调查。纯解析尚无源字节/工具/配置绑定,不授予正式源码finding、覆盖或交付权威。 - -TDD缺入口先因unresolved import失败;实现后8项新协议、adapter库6项、Rustdoc7项、依赖边界6项,共27项普通回归通过。真实既有Cargo原生1项通过(0.94秒),包括E0308类型错误、成功但故意失败测试未运行、build.rs执行失败不被误报为源码;首次路径断言因macOS临时路径别名失败,核对实际manifest路径后通过,未改生产解析规则。相关Clippy -D warnings退出0(10.63秒)。未安装或下载工具。 - -公开build rust、共享runtime服务、原输入/工具/目标归属、持久修复任务、复检、check all与完整构建组合仍缺,7.1不勾选。此前154组/910通过全量是本前置之前的基线,本轮新源仅上述受影响验证,不宣称重跑全量;完整目标继续。验收见相邻tests/acceptance/cargo-build-native-observation.md。 - - -## 2026-09-27 build rust 公开类型检查探针 - -新增 build rust [path] --cargo-tool ABS_PATH --timeout DURATION --format human|json,使用共享预算/runtime/SourceSnapshot与私有target调用原生Cargo check --locked --offline --all-targets --message-format=json;不执行测试,不生成锁,不安装工具。前后核验已发现源码集合、根清单/锁和工具字节,原生目标须归属本轮源及根清单,UTF8范围及行列重建候选指纹。保留包身份摘要和原生目标类别,避免公开本机package路径;不同目标类别同候选指纹不按原生顺序消歧。输入/工具变化、取消/超时等不给源码修改范围;取消优先130,普通局部命令保持3/not_evaluated/coverage_proven=false。 - -每发现给七项静态修复/调查信息,历史not_integrated且不授权关闭。反馈 rust_build_local_observation 0.1及严格自包含schema新增build_level=type_check/test_execution=false/build_success;没有队列、任务或门禁接线。真实错误和成功反馈均通过Draft202012,六个伪造授权/覆盖/状态及缺包身份变体被拒;独立Python只验收,不在产品路径。 - -TDD缺公开入口先RED。最终相关普通26项(build6、Rustdoc14、边界6)通过、2项默认忽略不计通过;真实公开Cargo1项通过(7.15秒),包含E0308、补齐成功但panic测试未执行、构建脚本失败不生成源码违规;相关Clippy -D warnings最终退出0(5.63秒)。中途一次输入变化测试得到source_discovery_incomplete,已加强fixture的原子序列路径隔离,之后全组通过;该次底层原因未完全归属,保留失败,不改生产失败判定。 - -7.1/9.7仍未完成:公开命令仅原生类型检查局部探针,缺完整配置/workspace/features/targets/可信工具策略及任务同步/verify/关闭复发/check all接线;新源未重跑全工作区,此前910项基线不覆盖本次新增行为。验收见相邻tests/acceptance/rust-build-cli.md。 - - -## 2026-09-28 Rust构建报告自动同步与next - -build rust局部观察协议升级0.2,保存0.1原始schema;每条finding增目标源码摘要,初始化工作区自动入队并sync。严格导入核对工作区/run/file键、原生状态、根清单锁与当前源码及目标普通文件字节,重算UTF8原生范围指纹;导入改用SourceSnapshot读取源码/目标以拒绝路径别名。包摘要保持未核验观察,不冒充可信来源。有效发现生成稳定fact和七项任务,同一问题重复扫描只更新观察。旧目标即使错误源码未变也只留历史并生成重扫准备任务;伪造指纹拒绝。缺工具生成稳定准备任务,next显示同一原生构建复扫指引。 - -TDD缺自动同步先RED。相关普通:build9、work sync15、next6,共30项通过,3项默认忽略不计通过;真实公开Cargo1项通过(7.70秒);实际绑定反馈与queued 0.2均通过Draft202012,任务文件存在,缺目标摘要反例拒绝。Clippy第一次发现一处不必要借用,已按诊断修正且重新执行,终态见后续证据。 - -7.1/9.7/9.4均未完成:正式task verify、关闭复发、可信包工具/规则策略、完整workspace/features/targets及check all仍缺。0.2队列同步不是构建通过、风险接受或白名单批准;历史0.1不能作为当前可导入报告。全工作区当前新源码尚未重跑;旧910项基线不得挪用。验收见相邻tests/acceptance/rust-build-workbench-sync.md。 - -## 2026-09-28 Rust 构建任务局部复检 - -任务从RED `task_checker_unsupported` 到同一原生Cargo的复检事件。41项受影响普通回归通过(build10、work sync15、next6、task verify10);12项条件性忽略不算通过。显式既有Cargo真实复检1项通过,证明E0308持续与修复后局部零诊断两条路径,后者仍为`candidate_absent_unverified_policy`、`test_execution=false`、`delivery_decision=not_evaluated`。相关all-targets Clippy -D warnings退出0;119份schema静态合法性及本地引用存在性通过。实际本地任务复检封套与公开反馈通过Draft202012验证,伪造delivery allow反例被拒;该局部验收不替代全工作区回归、可信批准、正式门禁、关闭复发、MSRV/Windows/宿主验收。 - -全工作区当前源码的 `cargo test --workspace` 已以退出0结束,覆盖适配器、CLI、核心、运行时的默认测试和doc-tests;默认跳过的显式原生/平台条件用例仍不计通过。此次全量是在Rust构建任务复检代码和回归测试加入后执行,替代旧910项基线,但不证明全部OpenSpec计划已实现。受影响包all-targets Clippy及OpenSpec strict通过;正式白名单宿主审批、关闭复发、完整语言与构建矩阵仍未完成。 - -## 2026-09-28 check all 接入 Rust 原生类型检查 - -TDD 首先复现 `check all` 虽运行 Rust Clippy/rustdoc,却把构建类别留在 `not_integrated`。现新增独立 `rust.build` 节点,在现有共享预算与 Cargo 目标资源下调用原生 Cargo check;编译诊断独立于 Clippy/文档发现,完成后同步本地稳定任务,环境或报告故障保留具体未完成原因。旧 Clippy 待修任务继续优先显示,构建任务可独立从 next 读取;不把任务清空、零诊断、项目可写批准候选解释为交付通过。反馈 0.28 增 `rust_build`、`rust.build`,故障反馈 0.9 增构建结果,旧协议 schema 原字节留存。 - -新场景先 RED 后通过。调整后受影响的 Rust 原生/部分合同/Java/npm/SARIF/rustdoc 集成测试全部通过;一次回归揭示旧 Clippy 下一步被构建环境任务抢占,已修正优先顺序。另一次实际报告验证揭示 schema 漏列 `rust.build` 节点,已补齐。最终 `cargo test --workspace --quiet` 完整退出 0;当前反馈实际 JSON 通过 Draft202012,121 份 schema 文档静态合法;schema 改动后再次运行的 Rust 与部分合同两组分别为 12/13 通过、2/1 忽略。`cargo fmt --check`、CLI 全目标 `cargo clippy -D warnings`、OpenSpec strict、插件 `git diff --check` 均退出 0。 - -这只验收局部原生类型检查与任务指引;未证明全部 Cargo workspace/features/targets、测试执行、受批准规则/工具、白名单可信批准、正式关闭复发或交付门禁。7.1/9.7/4.8/13.2 保持未完成,默认忽略的原生条件用例不计本轮通过。 - -## 2026-09-28 白名单原生 finding 身份二次绑定 - -新增失败反例先证明:裁定和附带观察身份相等,但原始 finding 缺完整身份时,旧领域门禁错误返回 allow_with_exceptions。现领域 finding 可携本轮完整身份,只有它与裁定观察逐字段相同且既有原生规则、工具、主定位、义务及宿主冻结映射均匹配时,才可能标精确误报。旧报告缺字段、源码内容/指纹/工具/适配器/rulepack 摘要、依赖图或 advisory 变化均保留原始及活动阻断,结论 incomplete。项目 JSON 自填该字段不能证明它来自真实原工具;可信宿主来源和正式白名单门禁仍缺,4.8 未完成。 - -受影响门禁 34 项、会话 8 项、签名处置 3 项、core 包普通测试均退出 0。全工作区 `cargo clippy --workspace --all-targets -- -D warnings`、`cargo fmt --check`、OpenSpec strict 与插件 diff 空白检查均退出 0。随后首次全工作区测试在编译阶段退出 101:另一个进程同时对同一 CLI workspace 执行 `cargo clean --manifest-path .../codeguard-cli/Cargo.toml`,删除 `target/debug/.fingerprint`,Cargo 报多个 dep-info 目录不存在。该次不是测试通过,也不是源码失败;在清理结束、构建目录稳定后须重新运行完整回归。 - -## 2026-09-28 RunReport 1.4 白名单身份声明约束 - -新增 1.4 报告协议:每条 finding 带完整 `native_identity`,每条误报处置带 `decision_identity`,解析时要求两者逐字段相等,并核对规则、声明的工具摘要、检查器类别及主目标。历史 1.3 schema 原样保留,旧版本不能借新字段伪称 1.4;未来未知版本拒绝。新增目标反例先因解析器不认识 `native_identity` 失败,随后 9 项白名单合同、14 项既有报告合同、4 项 SARIF 合同通过。依赖图/advisory 改变复用旧处置被拒,SARIF 仍保留未核验处置结果且不泄露私有令牌。独立 Draft202012 对实际 1.4 正例接受,对缺 finding 身份、缺处置身份的变体拒绝。详见相邻 `codeguard-cli/tests/acceptance/run-report-allowlist-protocol.md`。 - -字段仍由报告自行声明,结构解析不证明本轮原生工具输出或真实源码/依赖图字节,更不证明受保护审批、撤销和可信时钟。真实报告生产、独立来源核验、正式 CLI/MCP/Hook 门禁仍未完成;2.10、4.8 均不勾选。全工作区回归和当前源码的全目标 Clippy 结果在本节记录时仍待重跑,不沿用前一源码基线。 - -本轮随后重跑得到终态:当前源码 `cargo test --workspace --quiet` 退出 0,全部默认运行的测试组通过;需显式原生工具或平台条件的忽略用例未计为通过。`cargo clippy --workspace --all-targets -- -D warnings`、`cargo fmt --all --check`、122 份 schema 的 Draft202012 静态校验、OpenSpec strict 与插件差异空白检查均退出 0。上述结果证明回归和协议静态有效,不把报告自填身份提升为可信来源,也不把 2.10/4.8 标为完成。 - -## 2026-09-28 RunReport 源码覆盖和独立字节复核 - -TDD 先复现报告漏洞:把源码 finding 的主定位、原生身份及白名单决策身份一同改为义务覆盖范围外的路径,旧 1.4 解析仍接受带例外结论。现每个源码目标必须属于其义务预期与实际覆盖集合,反例被拒。另为受信宿主提供 `compare_claimed_source_hashes`,由宿主独立指定工作区根并通过 `SourceSnapshot` 安全读取全部声明的源码目标,比较当前普通文件 SHA-256。目标测试先因接口缺失编译失败;实现后覆盖真实字节匹配、内容变化、文件删除、Unix 链接、旧报告及同文件冲突摘要。白名单合同 12 项、既有报告 14 项、SARIF 4 项通过。 - -当前源码完整 `cargo test --workspace --quiet` 退出 0:157 组、937 通过、0 失败、96 忽略;日志 `/tmp/codeguard-workspace-report-source-20260928.log`,SHA-256 `3b0bb42977983a8c2a05ba559ea5220f3afcf17f6beafb1a4681bb5e75b5c965`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件 diff 空白检查通过。该内容比较是当前时刻的局部证据,不证明报告来源、原生工具运行、批准与终局输入不变;正式门禁尚未调用,2.10/4.8/12.12 保持未完成。 - -## 2026-09-28 Ruff 本轮适配器摘要进入误报调查 - -真实 Ruff 0.16.8 用例先因误报提案没有 `adapter_sha256` 失败。Ruff 局部报告 0.9 现只在有原生 finding、未取消且预算仍有效时计算当前 CodeGuard 可执行制品摘要;工作台读取本轮已同步发现后再次比较当前二进制。反例同时改写本地报告与消费标记的报告摘要,仍因适配器字节不符拒绝候选;规则包保持 `candidate_unapproved`,提案仍 `candidate=null`、退出 3、无门禁效果。公开 lint 升 0.12、误报预览升 0.4、Ruff task verify 升 0.9,三份前版 schema 保存供历史读取;实际三种新输出均通过 Draft202012,其中 task verify 使用本地 schema 引用注册。见相邻 `codeguard-cli/tests/acceptance/ruff-adapter-identity.md`。 - -首次实现在原生探测前两次哈希整个二进制,引发短预算与 SIGINT 两项回归失败;改为 finding 返回后按需计算并在哈希后再次核对截止时间。最终当前源码全工作区测试退出 0:157 组、937 通过、0 失败、96 忽略,日志 `/tmp/codeguard-workspace-adapter-final-20260928.log`,SHA-256 `63a22f4bba2daf1a006ce0c4bcf917cdba192892712aceeed1f052ba3b18611e`。另外显式运行原生 Ruff 任务复检 8 项、白名单/纠错 2 项,全部通过;125 份 schema 静态校验、全目标 Clippy、格式、OpenSpec strict 和插件差异空白检查通过。二进制摘要仍不是可信发行签名,报告/消费标记仍由项目可写,批准 rulepack、人工裁定与正式门禁尚缺;4.8/4.9/12.12 不勾选。 - -## 2026-09-28 legacy-v1 逐入口协议映射 - -任务 2.6 已完成具名映射与参数验收,映射表见 [旧入口协议表](../../../docs/rust-cli/legacy-v1-protocol-map.zh-CN.md),Rust 证据见相邻 `codeguard-cli/tests/acceptance/legacy-v1-protocol-map.md`。旧 check/CVE 对混合 FAIL 与 UNVERIFIED 返回 2,Dockerfile 返回 1 且保留已确认风险;CVE 参数错误为旧 3,PreToolUse 的 2 是宿主拦截。`fix` 的无语言、无改动、无适用文件分别登记;没有上下文的空结果不猜数字。旧 MCP 四个工具不具有逐请求进程退出码,五类 Hook 的生命周期成功不能当新版质量通过。所有 Rust 兼容投影固定 `not_evaluated`,C35 实际运行时和宿主迁移仍未完成。 - -真实旧插件相关测试在 PATH 前置已有 Python 3.13.5 后 164 项通过,MCP server 7 项通过;若由系统 Python 3.9 执行旧包装器,一项 `fix` 用例会因 `zip(..., strict=True)` 抛错,这一旧环境差异已保留为迁移缺口。当前 Rust workspace 全量测试 158 组、941 通过、0 失败、96 条件忽略,`legacy_v1_protocol_contract` 3/3,all-targets Clippy `-D warnings`、格式检查、OpenSpec strict 与插件差异空白检查均通过。此验收仅证明旧协议映射,不证明新版统一 CLI、MCP/Hook 或交付门禁完成。 - -## 2026-09-28 Rust 原生 cargo-audit 局部 CVE 观察 - -延续既有 OpenSpec 7.1,先新增原生 JSON 契约与公开命令目标测试,分别因解析入口和 `cve rust` 不存在失败,再实现 Rust 受控调用原生 `cargo-audit audit --no-fetch --no-yanked --json`。JSON 递归拒绝重复键,核对原生退出/计数/忽略配置,将每条 advisory 的包名、解析版本、来源与校验和绑定本轮 `Cargo.lock` 字节;报告无授权门禁或白名单效力。真实本机 `cargo-audit` 0.22.2 对当前 Rust 工程扫描 172 个锁定依赖、零漏洞,另对 `time 0.1.40` 样本检出 `RUSTSEC-2020-0071`;两份实际反馈均通过新 Draft202012 schema,均为 `database_freshness=unverified`、退出 3、`not_evaluated`。本机原生报告的数据库提交和更新时间均为 null,绝不据此称安全通过或签发误报例外。公开反馈只含依赖来源摘要;警告存在时仍保留已解析漏洞事实。 - -最终源码完整 `cargo test --workspace --offline -q` 退出 0:160 组、947 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-workspace-cargo-audit-final-state-20260928.log`,SHA-256 `a6872d6e2a888580533f5191ae035949e29601c09fe3d240aab1ace48ddca674`。新增 adapter 普通测试 5 项、CLI 普通测试 1 项;真实 cargo-audit 条件测试另显式执行 1 项并通过。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、126 份 schema 静态校验、OpenSpec strict 与插件 diff 空白检查均通过;新报告对 false allow/coverage/database freshness 三种篡改被 schema 拒绝。验收详见相邻 `codeguard-cli/tests/acceptance/cargo-audit-native-observation.md`。 - -这只是局部原生观察:漏洞库可信身份和时效、已批准工具/策略、完整 workspace/features/targets、依赖治理和安全义务、任务同步与复检、`check all`、MCP/Hook/宿主和带例外门禁均未完成。7.1、4.8、12.12 及总体计划保持未完成。 - -## 2026-09-28 Rust CVE 统一检查与白名单边界 - -相邻 Rust CLI 将已有 cargo-audit 局部观察接入 `check all` 的独立 `rust.cve` 节点。显式工具与离线库提供的 advisory 保留在 JSON,对应脱敏发现进入 SARIF,human 显示漏洞和下一步;缺工具明确返回环境阻塞。反馈 0.29 和故障反馈 0.10 均加入 `rust_cve`,前一版本 schema 留存。CVE 类别即使观察到 `RUSTSEC-2020-0071`,仍因数据库时效和可信策略未核验保持 `incomplete`、退出 3;没有自写白名单放行路径。OpenSpec rulepack 场景和误报白名单设计补充了 Rust CVE 的待审边界,详见相邻 `codeguard-cli/tests/acceptance/check-all-cargo-audit.md`。 - -新增目标测试先因 `rust.cve` 缺失失败,接线后通过。完整回归初次揭示旧 Rust 文档测试仍断言三个节点,第二次揭示两项 CVE 测试临时目录并发重名;更新旧断言并给夹具加唯一序号后,最终 `cargo test --workspace --offline -q` 退出 0:161 组、949 通过、0 失败、97 条件忽略。日志 `/tmp/codeguard-workspace-rust-cve-all-20260928.log`,SHA-256 `e4ec3b345fa111ffa18bef11199a5b3f34ce1407aa43646082210844c6a2be0c`。额外显式运行真实 cargo-audit 条件用例 1 项,通过。全目标 Clippy `-D warnings`、格式、128 份 JSON Schema 静态校验、两份实际 `check all` JSON 的 Draft202012 验证、OpenSpec strict 和插件 `git diff --check` 均通过。 - -本轮没有可信漏洞库来源/时效、完整 Cargo 构建组合、受保护批准、稳定 CVE 任务/复检或正式宿主门禁;白名单当前仍是设计和局部纯领域/候选能力,不能实际替原生发现签发有效例外。7.1、4.8 和总体计划保持未完成。 - -## 2026-09-28 Rust CVE 工作台与复检增量 - -先以已初始化 Rust 项目重复原生审计仍无 `rust.cargo_audit` 稳定任务作为失败验收,再实现局部观察封套、持久同步、`next` 修复指引和 `task verify` 原工具复检。相同构建根重复扫描保留一张开放的 CVE 覆盖任务;原生 advisory 留在本地观察,数据库时效仍未核验。复检重新检查清单/锁身份并记录 `still_blocked` 事件,任务不会因勾选、零发现或本地白名单候选关闭。 - -目标 `check_all_cargo_audit` 3 项、受影响 `check_all_rust_native` 12 项通过,另 2 项条件性忽略。首次全量回归发现新 CVE 任务改变旧 Clippy 用例的 `next` 顺序及任务总数;现将待外部库核验的 CVE 任务排在可直接修复的源码问题之后,更新任务数量预期,受影响组复跑通过。完整 Rust 工作区离线测试最终 161 组、950 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-workspace-rust-cve-workbench-final-20260928.log` 的 SHA-256 为 `f14638de101e33499308d9ced02632eecd0ab8e032363c345a9ab3bad339a5d6`。全量开始后追加的缺工具阻塞断言另在目标组三项中复跑通过。130 份 schema 通过 Draft202012 静态校验,实际 CVE 封套与复检预览通过 Draft202012;全目标 Clippy `-D warnings`、格式、OpenSpec strict 和插件差异空白检查通过。验收详情见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 - -本地报告及任务身份仍属 `local_unverified`;可信漏洞库身份/时效、批准工具/策略、精确白名单独立批准及正式交付门禁未实现,7.1、4.8 和总体计划保持未完成。 - -## 2026-09-28 Rust CVE 尝试历史、无进展预算与简报协议 - -以已初始化 CVE 任务走 claim→attempt ready-to-verify→同租约原生 `task verify` 的端到端回归。首次目标测试发现 `next` 虽能核验复检事件和历史,却没有展示 `still_blocked`;增加 Rust CVE 结果分支后,简报保留未核验库的具体下一步。`still_blocked` 计入同动作无进展预算;追加一次 `no-change` 后,`next` 返回 `needs_decision`,再次启动同动作明确返回 `no_progress_budget_exhausted`。目标 `check_all_cargo_audit` 4 项通过。 - -另用实际 `next` JSON 发现旧 `repair-brief-preview` 0.1 schema 只容纳 Ruff,现加入严格 Rust CVE blocker 分支,不放宽原 Ruff 约束。实际简报通过 Draft202012;检查器、复检结论、范围三种篡改均被拒。完整 Rust 工作区离线测试最终 161 组、951 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-workspace-rust-cve-attempt-20260928.log`,SHA-256 `4e172eedebc6e7f235425613f5126910860ebdf1eb403dba31259b6822572427`。新增 schema 在全量 Rust 运行后加入,另经 130 份 Draft202012 静态校验和实际输出验证;全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。验收见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 - -这仅证明本地工作台防重复动作,不具漏洞库来源/时效证明、精确白名单独立批准或最终门禁授权。其它语言的 `next` 严格 schema 覆盖仍缺,7.1/4.8/9.7 和总体计划保持未完成。 - -## 2026-09-28 尝试结束后的输入变化不得误归因复检 - -以 Rust CVE 稳定任务构造反例:claim 和 ready-to-verify 已结束,随后 `Cargo.lock` 发生字节变化,再运行原工具复检。旧代码把新输入的复检事件归到旧 attempt。现在通用尝试账本仅在当前任务输入摘要等于该次 finish 的 `after_sha256` 时允许绑定;输入变化时新复检仍可保存,但 `attempt_id=null`,旧尝试仅留在历史,不继续阻塞当前输入的动作或继承其无进展预算。目标集成测试先失败后通过,并确认新输入可登记新 attempt。 - -受影响普通测试:Rust CVE 5 项、Checkstyle 7 项、租约/尝试 16 项、复检 10 项,合计 38 项通过;Checkstyle 13 项与复检 8 项条件性忽略,不计通过。完整 Rust 工作区离线测试终态为 161 组、952 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-workspace-attempt-input-binding-20260928.log`,SHA-256 `48f8939abf9d724c00b99e9a1ce8213eca5009c283fbf893919889be8138113d`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。此修正不证明外部工具/漏洞库字节或策略来源已冻结,也不签发白名单批准、任务关闭或交付许可。9.27/7.1/4.8 保持未完成,验收见相邻 `codeguard-cli/tests/acceptance/rust-cve-workbench-task.md`。 - -## 2026-09-28 白名单候选复用 finding ID 的冲突纠正 - -新增两条反例:同一稳定 finding ID 的候选分别指向两个源码目标。旧 `rules whitelist explain` 会选中其中一条并返回 `identity_matched`、退出 0;旧纯候选筛选器会返回 `ReadyForAuthorityCheck`。两项测试在修改实现前实际失败;现在查询将双方标为冲突、退出 3,筛选器返回 `ConflictingCandidates`。受影响的两个 Rust 测试组共 21 项通过;完整 Rust 工作区离线测试 161 组、954 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-whitelist-conflict-20260928.log`,SHA-256 `db31e7f66efbfbeb8bb35a2699c61bc959c3d3d2b257c3dcf6d4be16a966e45f`。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件差异空白检查通过。候选查询仍为 `authority=unverified`、`gate_effect=none`;可信批准来源与真实交付门禁仍未接入,4.8/4.9 和总体计划保持未完成。 - -## 2026-09-28 公共检查请求与 RunReport 原始 JSON 重复键拒绝 - -增加检查请求嵌套 `jobs`、RunReport 顶层 `delivery_gate`、内层 `decision` 及内嵌请求 `jobs` 重复键反例。旧解析先覆盖重复值,这两项目标测试修改前均失败;现公共入口复用已有递归无重复键解析器与 16 MiB 字节预算,整份原始输入被拒绝,不生成经过结构校验的对话反馈。请求、报告、白名单报告三个受影响测试组共 33 项通过;完整 Rust 工作区离线测试 161 组、956 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-strict-public-json-20260928.log`,SHA-256 `cf278e412fb09f368636ae6a938187ae8538d78b16829630f084c9cb7a6e6197`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。这仅加固协议消费;真实原生报告生产、可信来源及最终门禁仍缺,2.3/2.10/12.12 和总体计划未完成。 - -## 2026-09-28 `check all/java` 本轮项目范围复核 - -以真实伪 Ruff 子进程在初次项目发现后写入 `late.py`:旧 `check all` 没有标记范围变化,目标测试先失败。现在原生任务结束后重新静态发现,比较源码/清单集合、构建根、清单/锁/规则配置摘要及配置状态;源码新增或规则配置变化时公开 `unresolved_conditions` 记录 `project_scope_changed_during_check`,human 反馈要求重新发现和原工具复检。`codeguard/state` 自有受管记录写入不触发该项;已超过总截止时间则不做无预算末次发现,标记未复核。目标测试组 15 通过、1 条需原生 Ruff 的用例条件忽略;完整 Rust 工作区离线测试 161 组、958 通过、0 失败、97 条件忽略,日志 `/tmp/codeguard-check-scope-recheck-20260928.log`,SHA-256 `aada412ef433de5b3447ca339c2e05de48a77ef28f6147862d6e2cbf2875734b`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。 - -该复核只比较发现范围和已静态观察到的配置身份,不冻结每个源码文件的全程字节、不检测改后又改回,也不能把本地候选转换为可信必需义务。因此 3.7/2.4 和总体计划保持未完成。 - -## 2026-09-28 `check all/java` 同路径源码字节复核 - -初次发现的源码路径在原生任务前建立有界快照;任务结束后从固定根目录描述符读取同路径文件并比较字节。先增加真实伪 Ruff 子进程把 `app.py` 的 `import os` 改为等长 `import io` 的反例,以及 runtime 的原路径字节复核契约;后者先因接口不存在而编译失败。现在 CLI 报 `project_source_changed_during_check`,human 提示核对并发编辑或检查器副作用,保留已有原生诊断和 incomplete 判定。单文件超过 16 MiB 的反例报 `project_source_snapshot_unavailable`;仅改 `codeguard/state` 不报源码变化。`ruff.toml` 同时是 TOML 源文件,配置变更触发源码变化提示符合当前发现分类。 - -目标 `check_all_partial_contract` 17 通过、1 条条件忽略,`source_snapshot_contract` 5 通过。首次并行全工作区运行在既有 `process_contract::argv_metacharacters_are_literal_and_cannot_spawn_a_shell` 的 `ReadFailure` 失败;第二次在既有 `eslint_probe_contract::interrupted_scan_preserves_cancel_and_deadline_reason_with_or_without_report` 的启动标记断言失败;两项单独复跑均通过,不将两次失败计为全量验收通过。随后 `cargo test --workspace --offline -q -- --test-threads=1` 退出 0:161 组、961 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-source-byte-recheck-serial-20260928.log`,SHA-256 `f1d7855414a4c1b0e7bfcd4bfa67eaf7e296660ee9d145c2acf94b38ec037772`。全目标 Clippy `-D warnings`、`cargo fmt --all --check`、OpenSpec strict 与插件 `git diff --check` 均通过。 - -当前快照仅覆盖初次静态发现的源码,捕获过程不是原子项目切面,改后又改回、末次复核之后的修改以及未发现的目标仍无法保证识别;完整沙箱、受保护义务账本和正式门禁亦未完成。因此 3.7/2.4 与总体计划保持未完成。 - -## 2026-09-28 原生进程读流排空与并行回归稳定性 - -上一轮同路径源码复核后的两次并行全量运行分别在 `process_contract` 的短命令读取和 `eslint_probe_contract` 的扫描启动前提上失败,单独复跑通过;这暴露了运行时固定 150ms 排空窗口及测试使用过紧整轮期限的时序边界。现成功退出的原生进程继续按原请求绝对期限排空 stdout/stderr,不另造固定短期限;期限耗尽仍不可返回完整。ESLint 反例把伪扫描时间维持长于总期限,并把准备阶段预算增大,使实际取消和期限行为仍被执行。 - -目标 `process_contract` 15 项通过,`eslint_probe_contract` 2 项通过、2 项条件忽略。当前源码 `cargo test --workspace --offline -q` 并行运行退出 0:161 组、961 通过、0 失败、97 条件忽略;日志 `/tmp/codeguard-runtime-drain-parallel-20260928.log`,SHA-256 `bbb5ee8768ed3baaa1d0337c4f932410c32cfcb631c14797c7641b09353abf4d`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 和插件差异空白检查均通过。先前并行失败记录不被抹除;单次并行通过不能证明所有负载和平台无时序问题。持久化 I/O 硬截止时间、Windows 对等行为及正式门禁仍缺,3.2/3.3 与总体计划继续未完成。 - -## 2026-09-28 Ruff D100 原生注释问题归类 - -先用本机 Ruff 0.16.8 和项目 `ruff.toml` 显式选择 D100,复现公共 Python 模块缺少顶层 docstring:原有 `check all` 已保留 D100 原生诊断,但 `comments` 候选仍显示未接入,目标验收先失败。现在仅在本轮原生 D100 实际检出时,将 Python 注释候选关联 `python.ruff`、显示 `observed_unverified` 并给出模块文档修复/同工具复检动作;D100 诊断摘要与修复任务提示也明确说明模块 docstring。补上准确 docstring 后再次运行原生 Ruff,D100 观察消失,注释候选不伪称完整通过,交付仍为 incomplete。规则包未映射的原生诊断保持未批准身份;没有从配置文本或零诊断推断全量注释覆盖。 - -真实 `native_ruff_d100_is_reported_as_python_comment_evidence` 用例显式执行并通过,普通受影响三个测试目标合计 38 项通过、9 项条件忽略。当前源码并行 `cargo test --workspace --offline -q` 退出 0:161 组、961 通过、0 失败、98 条件忽略;日志 `/tmp/codeguard-python-d100-parallel-20260928.log`,SHA-256 `93e1db0e071bcf6bec16c60916624d8ca4e2c6ba4fa8cbbc14444bdd3ceccbd9`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 与插件差异空白检查通过。D100 以外的注释规则、生效规则集证明、配置级 suppression、可信规则包和完整交付门禁仍缺,7.2 与总体计划不勾选。 - -## 2026-09-28 D100 稳定任务复检与生效规则交叉核对 - -实际初始化工作区后,以固定 Ruff 0.16.8 运行 `check all`:D100 原生诊断同步为一张稳定任务,`next` 给出同一任务和规则;`task verify` 在问题仍存在时记录 `still_present`,补充模块 docstring 后再次调用原工具记录 `candidate_absent_unverified_policy`。复检事件已持久化,finding 事实保持 open,没有把任务勾选或局部零诊断当作正式关闭与交付许可。该真实链的显式条件测试通过。 - -另构造伪 Ruff:JSON 报告声称 D100,但同轮 `--show-settings` 的启用规则集合为空。旧实现错误地返回本地扫描完整;反例先失败。解析器现内部保留精确原生启用集合,D100 与本轮设置矛盾时返回 `rule_settings_report_mismatch`、保留诊断并取消本地完整结论。内部集合不序列化,公开候选映射、规则包批准与既有 schema 形状均未扩大。`ruff_settings_contract` 3 项通过,目标伪报告反例通过;两条真实 Ruff D100 用例显式运行通过。 - -当前源码并行 `cargo test --workspace --offline -q` 退出 0:161 组、963 通过、0 失败、99 条件忽略;日志 `/tmp/codeguard-d100-workbench-settings-20260928.log`,SHA-256 `7327ce6eee24a47ef34e50fb3390b2a9a2a6c29065faa263445bab7fb9815787`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查通过。配置级 suppression、全部注释规则及完整源集、可信工具/规则政策和正式任务关闭门禁仍未完成,7.2/9.7 与总体计划保持未完成。 - -## 2026-09-28 Ruff pydocstyle 规则族局部归类 - -将 Python 注释候选从仅识别 D100 扩为精确 D### 原生诊断,并逐项交叉核对同轮 Ruff 生效规则集合。真实 Ruff 0.16.8 的 D101 公共类缺文档测试先因未归类而失败,修正后通过;适配器格式边界 4 项测试通过,D1000/DOC201 等不会归入该类。伪原生报告 D100/D101 但启用集合为空的反例通过,均保留诊断、取消本地完整结论。真实 D100/D101 两项显式运行通过;全工作区离线测试 161 组、964 通过、0 失败、100 条件忽略,日志 `/tmp/codeguard-d-family-20260928.log`,SHA-256 `5c70119ce9172ee39688a0ef35dae8f38a15e0f58e48366409e1b614619bd98c`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。完整 D/DOC 覆盖、配置级 suppression、可信规则批准和交付门禁仍缺,7.2 保持未完成。 - -## 2026-09-28 D101 可执行修复与原生抑制对照 - -真实 Ruff D101 样本对“公共类缺少文档字符串”和明确的类 docstring 修复步骤先 RED 后通过。初始化工作区的稳定任务文件给出相同范围与原工具复检命令;在类声明加 `# noqa: D101` 时,`task verify` 的原生无抑制对照检出原问题并记录 `suppression_requires_review`,不能把绕过当修复。补充真实类文档后的复检仅记录 `candidate_absent_unverified_policy`,finding 仍 open。两项真实 Ruff 目标测试均通过;变更后全工作区离线测试 161 组、964 通过、0 失败、101 条件忽略,日志 `/tmp/codeguard-d101-guidance-20260928.log`,SHA-256 `b5d3fe1171c54f4cc85ca13c02c194c583867fa53f71a0f99af4ece2a7a70f26`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 和插件差异空白检查均退出 0。7.2/9.7 仍未完成。 - -## 2026-09-28 D101 项目自批白名单反例 - -在真实 Ruff D101 稳定任务已经存在后,向项目自有 `codeguard/decisions/forged.json` 写入同一 finding 和 `approved=true`。重跑原生 `check all` 仍返回 D101、同一唯一稳定任务和 incomplete;只读 `rules whitelist propose` 固定 candidate=null、authority=unverified、gate_effect=none。原逻辑只笼统报告批准规则包缺失,现将尚无核对映射的 D101 标记 `rulepack_mapping_unavailable`,分别列出 `reviewed_native_rule_mapping` 与 `approved_rulepack_identity`,human 输出也显示核对动作。该具体期望先 RED 后通过;已有 F401 候选映射的真实回归通过,仍不获批准。该证据只覆盖未接可信批准时的拒绝路径,不能证明未来独立签发、密钥来源与正式交付例外已接通;4.8/4.9 仍未完成。 - -分流改动后全工作区离线测试 161 组、964 通过、0 失败、101 条件忽略,日志 `/tmp/codeguard-rulepack-mapping-20260928.log`,SHA-256 `be05119f7a9fcc5cd7b9029b611f2975d54c1f06531dae81f7741376f8994663`;真实 D101 和 F401 白名单提案用例分别显式通过。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 和插件差异空白检查退出 0。完整可信签发及门禁仍未实现,保持原任务未完成状态。 - -## 2026-09-28 Python 依赖输入的逐构建根只读发现 - -相邻 Rust 工程新增 Python requirements 的保守行级分类和逐构建根 CVE 输入说明。先写的 `detect` 与 `check all` 目标回归分别因缺少 `python.pip_audit` 发现、类别反馈而失败;实施后,逐行固定版本、动态约束、uv 锁存在未解析、无依赖输入与根/子项目锁归属的正反例通过。包名大小写及 `-`/`_`/`.` 等价形式的重复声明也保持未解析。`plan cve python` 不生成已可执行扫描任务;`check all` human/JSON 报告配置未知、依赖图及原生工具待核验,交付固定 incomplete。源码/依赖输入变化的故障注入分支尚无独立测试,不能以这些回归代替原生漏洞验收。 - -`detect_cli` 27 项、`check_all_partial_contract` 17 项通过/3 条件忽略;adapter 分类定向测试通过。当前源码 `cargo test --workspace --offline -q` 退出 0:161 组、968 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-cve-input-20260928.log`,SHA-256 `87716b999b0a9a171c5d04dc76ab76176911b1bcbad0d293752c5a7b0cd17b17`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。未安装或调用 pip-audit,锁图、传递依赖、漏洞数据库身份与时效、真实 advisory、稳定 CVE 修复任务及正式门禁均未验收;5.10、7.2 与总体计划继续未完成。 - -## 2026-09-28 Python 标准锁与专用锁的原生入口边界 - -依据 [pip-audit 官方项目模式](https://github.com/pypa/pip-audit/blob/main/README.md?plain=1)及 [PyPA pylock 文件名规范](https://packaging.python.org/en/latest/specifications/pylock-toml/),新增对 `pylock.toml` 和单段命名 `pylock.ci.toml` 的只读识别;它们仍标为标准锁模型未解析。`uv.lock`/`poetry.lock` 保留独立状态及需选原生工具或显式导出的动作;同根并存多锁时返回选择歧义,不默认让 pip-audit `--locked` 消费专用锁。公开 `detect` 真实文件样本先因标准锁未识别而 RED,实施后单标准锁、命名标准锁、多锁和仅 uv 锁四阶段回归通过。 - -`detect_cli` 28 项及 `check_all_partial_contract` 17 项通过/3 条件忽略。变更后 `cargo test --workspace --offline -q` 退出 0:161 组、969 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-pylock-20260928.log`,SHA-256 `598ccc575996826a30917de38b9f308a975ce5abdaf5bd8eeb46c970c19ecf03`。全目标 Clippy `-D warnings`、格式、OpenSpec strict 和插件差异空白检查退出 0。此轮没有调用 pip-audit,PEP 751 内容/环境、完整依赖图、真实 advisory 和漏洞数据库时效仍未核验;5.10/7.2 不勾选。 - -## 2026-09-28 pip-audit 项目锁命令计划与 JSON 协议观察 - -对照 [pip-audit 当前 JSON formatter 源码](https://github.com/pypa/pip-audit/blob/main/pip_audit/_format/json.py)与 [官方 CLI/退出码说明](https://github.com/pypa/pip-audit/blob/main/README.md?plain=1),相邻 Rust adapter 新增标准锁项目模式的字面参数计划及 2.x JSON 保守解析。命令固定 strict、JSON、别名、关闭描述与进度、项目外缓存,不含修复或忽略参数;相对路径及项目内缓存拒绝。解析器只接当前对象结构,递归拒绝重复字段;跳过依赖、意外 fixes、重复组件、版本或退出矛盾和不符命令形状的原始描述都保持未完成。有效原生 advisory、组件解析版本及 CVE 别名仅为观察,空 JSON 仍固定 `advisory_coverage=not_evaluated`。 - -测试先因缺 `parse_pip_audit_json` 编译失败,解析实施后 4 项通过;再因缺 `PipAuditCommand` 编译失败,命令计划实施后 6 项全部通过。最终全工作区 `cargo test --workspace --offline -q` 退出 0:162 组、975 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-pip-audit-protocol-20260928.log`,SHA-256 `927b942584ebcb6a4a37b9dacaea6d8ca70c90186ad84ffff9cc13562398020f`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。测试 JSON 按上游源码构造;当前机器未安装/调用 pip-audit,本阶段没有真实原生输出、同轮锁身份、漏洞库时效、CLI/任务/门禁证据;7.2 和总体计划均不勾选。 - -## 2026-09-28 Python 标准锁局部 CVE 入口与归属门槛 - -公开 `cve python` 先因被旧 npm 分派接管而两项 RED。现使用显式工具/版本、共同截止时间和受控进程,在独占私有目录复放项目 pyproject 与唯一标准 pylock;工具版本、原清单/锁、私有副本与工具字节在执行前后核对。human/JSON 提供局部 advisory、缺锁及输入变化反馈,始终退出 3、`not_evaluated`、`coverage_proven=false`。本机模拟原生可执行文件测试证明:原生漏洞可见,原生零项不放行,私有锁改动使结果无效且原项目不变。macOS `/var` 到 `/private/var` 的祖先路径规范化曾使首次正例误判工具不可用;现拒绝工具自身符号链接,同时允许祖先目录规范化,目标测试通过。 - -复核又发现原生报告的组件若不在锁中仍会显示为项目局部 finding;缺包反例先 RED。现在只抽取 PEP 751 锁中的显式包名/版本,与原生报告整组解析组件作规范化精确对照;缺包、错版本、无版本源码包、损坏锁均不生成项目 finding。五项公开 CLI、七项 adapter 协议/绑定测试通过。试图构造非 UTF-8 文件名作 CLI 反例时,本机 APFS 在建文件阶段返回 `Illegal byte sequence`;该夹具移除,代码对不可解码目录项保持未完成,但没有声称此边界经真实文件系统验收。 - -独立 Draft 2020-12 校验通过原生零项与缺锁两份当前 CLI 报告,并拒绝 `coverage_proven=true`、`delivery_decision=allow`、已观察却 `native_report_valid=false` 三个伪授权变体;Python 只用于验收,不在 Rust 产品执行路径。最终当前源码 `cargo test --workspace --offline -q` 退出 0:163 组、981 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-cve-lock-binding-20260928.log`,SHA-256 `b9740ce886402146cd68a9ac30203d01dd580c7ff62731d01484f4bff7325b12`。全目标 Clippy `-D warnings`、Rust 格式、OpenSpec strict 与插件差异空白检查退出 0。模拟程序不是 pip-audit 本体;PEP 751 环境/依赖组及文件哈希、真实漏洞库身份与时效、完整原生运行、稳定修复任务和 check all/宿主门禁仍缺,7.2 与总体计划不勾选。 - -## 2026-09-28 Python 条件锁的错误归属防护 - -依据 [PyPA pylock 规范](https://packaging.python.org/en/latest/specifications/pylock-toml/),`environments`、`requires-python`、extras、依赖组、default-groups 和包级 marker 会改变实际选用的包。原解析器把带环境条件的 `[[packages]]` 当成同一组显式包身份;先写的反例对此返回 `Ok`,RED 已复现。现在没有目标环境和组选择上下文时,Rust adapter 返回 `python_lock_selection_unresolved`;已配置工具时 `cve python` 与 `check all` 仍调用原生审计,公开版本、退出码和待归属 advisory 数量,但保留退出 3、零项目 finding 和具体核对动作。显式空 extras/组仍可用于局部观察。已初始化项目的实际 CLI 扫描仍创建一张稳定的 Python CVE 完整性任务,故该不确定性不会因无法归属而从修复工作台消失。 - -适配器 8 项协议测试和 Python CVE CLI 10 项测试通过;独立 Draft 2020-12 对实际条件锁报告验证通过(退出 3、零 finding、无 schema 错误)。全工作区 `cargo test --workspace --offline -q` 退出 0:163 组、987 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-lock-selection-20260928.log`,SHA-256 `0668b596522484e7a12455cc760323120830a00e73f955e556a64f2ef66ac1b4`。全目标 Clippy `-D warnings`、Rust fmt、OpenSpec strict 和插件 `git diff --check` 退出 0。模拟工具与静态格式核对不证明真实 pip-audit、环境选择、漏洞库及时效;7.2 与总体计划保持未完成。 - -后续检查发现首次条件锁保护把原生工具也提前跳过,不符合已配置检查器仍应反馈执行结果的设计。新 CLI 反例先显示 `native_version=null`(RED);修正后同一模拟原生程序实际返回版本 `2.10.0`、退出 `1` 和一条待归属 advisory,公开结果仅反馈待归属数量、保留零项目 finding/退出 3,并自动同步同一稳定 CVE 完整性任务。真实 `cve python`、`check all` 和工作台报告的三份 JSON 均通过独立 Draft 2020-12 校验;脚本首次缺本地 schema registry 的错误已在验收脚本中修正,不属于产品。最终 `cargo test --workspace --offline -q` 退出 0:163 组、987 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-conditional-native-20260928.log`,SHA-256 `676bc207d7b9eb4e79e0045fc1ebc903ab475a9436b79dc04291182c94605ac7`。全目标 Clippy `-D warnings`、fmt、OpenSpec strict 和插件差异空白检查退出 0。未运行真实 pip-audit,环境/组精确选择、漏洞库身份与时效、全量义务及可信门禁仍缺,7.2 和总目标保持未完成。 - -## 2026-09-28 Rust CVE 原生异常后的部分发现 - -延续 F05、5.5 和 7.1。受控原生 `cargo-audit` 先输出与当前 `Cargo.lock` 匹配的完整 advisory JSON,再以异常码 2 退出;旧 CLI 把该有效 finding 丢弃,目标集成测试先 RED。修正后从完整报告独立解析并核对锁、清单及工具字节,公开一条待核验 RUSTSEC finding,`local_scan_complete=false`、`cargo_audit_execution_incomplete`、退出 3、交付 `not_evaluated`。保存的本地报告保留该发现,已初始化工作区同步唯一稳定 CVE 完整性任务;部分证据不升级为已批准漏洞或放行。截断 JSON/异常码 2 的负例仍为零 finding。独立 Draft 2020-12 核验实际局部与工作台 JSON,两份 schema 均通过;详见相邻 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。 - -首轮全量回归在测试夹具建临时目录时因并发重名失败(`File exists`),未运行到产品断言。夹具增加进程内原子序号后,Rust CVE 测试文件 2 项普通测试通过、1 项显式真实工具测试默认忽略;最终 `cargo test --workspace --offline -q` 退出 0:163 组、988 通过、0 失败、101 条件忽略。日志 `/tmp/codeguard-rust-cve-f05-full-20260928.log`,SHA-256 `74b54089afe874b71cf1551f9453d13d5bf76b15dcf8de3ba2f6182183b3412f`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-rust-cve-f05-clippy-20260928.log`,SHA-256 `417b2ef0e9e174870bcbecb513216af0b5b02ef5e7c4e7271bc740d04b6c55b7`;Rust fmt、OpenSpec strict 和插件差异空白检查退出 0。原生程序为受控模拟器;真实 `cargo-audit` 崩溃、超时后部分输出、其它适配器及通用 F01–F10/F17 矩阵未验收,5.5/7.1 与总体计划均不勾选。 - -## 2026-09-28 Rust CVE 完整报告后超时的部分发现 - -延续 F05。模拟原生程序先输出完整且与本轮 `Cargo.lock` 匹配的 advisory,然后保持运行到超时;旧入口直接返回空 finding,目标测试先 RED。现对已捕获 stdout 做严格 JSON 与锁文件绑定,且复核工具、清单、锁字节;保留 advisory,但原生超时原因 `request_deadline_exceeded`、`local_scan_complete=false`、退出 3 和 `not_evaluated` 不变。已初始化工作区保存包含该部分 finding 的本地报告并同步稳定完整性任务,不能因此关闭漏洞义务或认定数据库时效。200ms 初始夹具在并行负载下无法稳定证明“报告已输出”,改为报告输出后停留 5s、2s 超时的明确顺序。独立 Draft 2020-12 对实际公开报告及保存的工作台报告均通过;首次验收脚本缺 URN 本地引用注册,修正脚本后两份 schema 零错误。详见相邻 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。 - -最终 `cargo test --workspace --offline -q` 退出 0:163 组、988 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-rust-cve-f05-timeout-full-20260928.log`,SHA-256 `08e75244e07486cf28879a5c2d2b40e39834bddb314e5939cc3815dc3db3fbd4`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-rust-cve-f05-timeout-clippy-20260928.log`,SHA-256 `06deecc3c68c7e0b91ffbd05c208056b55458616edaf89af53d7e94c7a765e53`;fmt、OpenSpec strict 和插件差异空白检查退出 0。当前仍为模拟原生进程;实际 cargo-audit 卡死、输出超限/坏报告、其它语言适配器及通用 conformance 矩阵未完成,5.5/7.1 与总体计划保持未勾选。 - -## 2026-09-28 Rust CVE 输出超限的发现与故障分类 - -延续 F05。受控原生程序先向 stdout 输出完整、与本轮锁绑定的 advisory JSON,再向 stderr 写入超过共同 16 MiB 配额的数据;原 CLI 虽保留 finding,却把输出上限折叠为通用执行未完成,具体原因断言先 RED。现在明确反馈 `cargo_audit_output_limit`,仍为退出 3、`local_scan_complete=false`、`not_evaluated`,保留局部 advisory 并同步稳定 CVE 完整性任务。对照程序只输出残缺 stdout JSON 后触发同一上限,零 finding;没有从 JSON 前缀推断漏洞。独立 Draft 2020-12 对正反两组实际公开报告与各自保存的工作台报告均为零 schema 错误,见相邻 `codeguard-cli/tests/acceptance/rust-cve-partial-native.md`。 - -最终 `cargo test --workspace --offline -q` 退出 0:163 组、988 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-rust-cve-f05-output-limit-full-20260928.log`,SHA-256 `6e84ccc6450917fdece4ace379430543b8d72c9cc941821be5f59fad96eaa340`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-rust-cve-f05-output-limit-clippy-20260928.log`,SHA-256 `598bb85a445f943398014aad58e8f987aef829bd392bac6f17fbaa7339d267d3`;Rust fmt、OpenSpec strict 与插件差异空白检查退出 0。此处原生程序为受控模拟器,验证的是完整 stdout 报告后其它输出超限;cargo-audit 单体 JSON 自身截断不可据前缀恢复,真实工具故障、其它适配器和通用 F01–F10/F17 矩阵仍缺,5.5/7.1 与总体计划不勾选。 - -## 2026-09-28 Python CVE 原生故障后的部分发现 - -延续 F05、5.5 与 7.2。受控 `pip-audit` 先返回已独立核验的 2.10.0 版本,再输出与本轮 PEP 751 唯一锁整组组件匹配的 Flask advisory,最后异常码 2 退出;旧 CLI 丢弃 finding,目标测试先 RED。修正后严格解析完整 JSON,复核项目原清单/锁、私有副本与工具字节,并用既有锁归属比较保留局部 advisory。`native_report_valid=true` 只表示报告内容可核对;真实退出码 2、`pip_audit_execution_incomplete`、`local_scan_complete=false`、退出 3 和 `not_evaluated` 保留。工作台仍只生成稳定的 Python CVE 完整性任务,不将部分 advisory 认定为获批准的项目漏洞。残缺 JSON 或原生包不在锁中均保持零 finding。继续用同一目标测试验证完整报告后超时与其它输出超限:分别保留 `request_deadline_exceeded` 和 `pip_audit_output_limit`,无原生整数退出码,部分 finding 不放行;残缺 JSON 后超限仍零 finding。普通 Python CVE CLI 文件 11 项测试通过。 - -独立 Draft 2020-12 对异常退出、超时、输出超限、残缺报告四组实际公开报告及各自保存的工作台报告验证通过,finding 数依次为 1/1/1/0,四组均退出 3、未完成、零 schema 错误。第一次复跑时仓库默认 `target/` 在编译过程中消失,链接器报依赖 `.rlib` 缺失;核对时目录已不存在,磁盘尚余 37 GiB,未把此记作产品测试失败,也未重置源码。改用独立 `CARGO_TARGET_DIR=/tmp/codeguard-python-f05-target-20260928` 后目标和全量测试通过。最终 `cargo test --workspace --offline -q`:163 组、989 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-f05-full-20260928.log`,SHA-256 `eefa91a2e73154944bdd3881c18fbd9c8ec62e48bdf1d06ee3ec6b19ed2d820b`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-python-f05-clippy-20260928.log`,SHA-256 `465c3e723d436ef227a04a77e3404e82b7aad5eec3c1ff9080a6f3f7d0447e7f`;fmt、OpenSpec strict 和插件差异空白检查退出 0。验收详见相邻 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。真实 pip-audit 故障、PEP 751 条件环境/依赖组、数据库来源及时效、其它语言适配器和通用 F01–F10/F17 矩阵仍未证明,5.5/7.2 与总体计划保持未完成。 - -## 2026-09-28 `check all` 对 Python CVE 部分报告的状态修正 - -延续 2.3 和 7.2。局部报告在异常退出后 `native_report_valid=true` 是完整 JSON 与锁身份可核对,不等于原生命令按退出契约完成;旧总入口据此把执行节点和类别候选误标为已观察。新增已初始化工作区的 `check all` 反例,目标断言 `native_incomplete` 先 RED。修正后仅 `native_advisories_observed_unverified` 和 `native_zero_advisories_unverified` 这两种正常退出结果使 Python CVE 执行节点成功;异常码 2、输出超限保留本轮 finding,同时任务节点和类别候选为 `native_incomplete`,未解决条件含 `python_cve_task_incomplete`,工作台继续同步稳定完整性任务。11 项 Python CVE 目标文件测试通过。独立 Draft 2020-12 对异常退出及输出超限两份实际 `check all` JSON 验证通过:均退出 3、各一条 advisory、执行/候选未完成、零 schema 错误。详见相邻 `codeguard-cli/tests/acceptance/python-cve-partial-native.md`。 - -最终在独立构建目录中 `cargo test --workspace --offline -q` 退出 0:163 组、989 通过、0 失败、101 条件忽略;日志 `/tmp/codeguard-python-f05-check-all-full-20260928.log`,SHA-256 `be71ff67c3344e6a483c2c0d7c014a4bf2ce5d0d7cd00b12781d9747c43ac30a`。全目标 Clippy `-D warnings` 退出 0,日志 `/tmp/codeguard-python-f05-check-all-clippy-20260928.log`,SHA-256 `d0492b6f8a4a276e8cbe4f385278c6e748acbd88b449f60d9e35ee9707c6b123`;fmt、OpenSpec strict 和插件差异空白检查退出 0。只覆盖 Python CVE 局部到总入口的这一状态链;完整跨语言 findings/completion 聚合、真实 pip-audit/漏洞库、受批准策略与宿主门禁仍缺,2.3/7.2 与总体计划不勾选。 - -## 2026-09-28 npm CVE 异常退出后的证据与执行状态 - -受控 Node/npm 11.16.0 程序在输出与当前锁节点匹配的完整一条 advisory 后以 2 退出;旧 `cve typescript` 报告零 finding,目标断言先失败。修正后公开反馈保留一条脱敏局部发现及 `npm_audit_execution_incomplete`,工作台维持同一稳定 CVE 完整性任务。`check all` 原生结果仍显示该发现,但执行节点为 `native_incomplete`。截断 JSON 后以 2 退出的对照仍零 finding。局部报告可核对不等于原生命令完成,退出 3、覆盖和交付未评估不变。 - -该阶段 `npm_audit_cli` 和 `check_all_npm` 目标测试、`cargo test --workspace --offline -q`、`cargo clippy --workspace --all-targets --offline -- -D warnings`、`cargo fmt --all --check` 及 OpenSpec strict 均退出 0。此阶段只覆盖异常退出;超时与输出上限的后续进展见下段。受控替身未证明真实 npm 故障、数据库新鲜度与全部 F05 矩阵,2.3/5.5/7.3 和完整目标保持未完成。详见相邻 `codeguard-cli/tests/acceptance/npm-partial-native.md`。 - -后续补齐完整报告后超时和其它输出超限两种模拟故障:公开反馈均保留一条局部 advisory,原因分别为 `deadline` 与 `npm_audit_output_limit`,交付未评估;截断 JSON 的超限对照零 finding,工具文件变化也使结果失效。输出超限的实际 `check all` 反馈包含 finding,但执行节点 `native_incomplete`。已初始化工作区在超时后不给截止时间外的持久化成功,输出超限仍同步稳定任务。独立 Draft 2020-12 对异常退出的实际反馈、工作台和完整检查三个 JSON 验证通过。首次全量败于新增 npm 测试替身过早退出,第二次败于既有 Rust CVE 测试替身的同类时序;两者调整后目标回归及最终全工作区退出 0:163 组、989 通过、0 失败、101 条件忽略,日志 `/tmp/codeguard-npm-f05-full-final-20260928.log`,SHA-256 `a008b5049c919c7cc9fa43d968e0be936e43d5631d9c6f5acd2c35c080eaa5f5`。全目标 Clippy `-D warnings`、fmt 退出 0。真实 npm 故障、取消、全部原生优先级及跨语言 F05 矩阵仍缺,不勾选 2.3/5.5/7.3。 From 973eeddb1dca4b17a5d725c21b82fd00ee504d43 Mon Sep 17 00:00:00 2001 From: loong10k <20489781+loong10k@users.noreply.github.com> Date: Tue, 29 Sep 2026 00:33:13 +0800 Subject: [PATCH 4/6] =?UTF-8?q?feat(engine):=20=E5=BB=BA=E7=AB=8B=20Legacy?= =?UTF-8?q?/Rust=20=E5=BC=95=E6=93=8E=E8=BE=B9=E7=95=8C=EF=BC=8C=E7=BB=93?= =?UTF-8?q?=E8=AE=BA=E7=AD=BE=E5=8F=91=E6=96=B9=E6=98=BE=E5=BC=8F=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 插件与独立 Rust 内核各自都能给出检查结论,但此前没有一处声明"谁签发"。 两者的退出码语义也不相同:Legacy 的 3 是参数错误,Rust 的 3 是检查未完成—— 按同一张表翻译会把"没跑完"读成"通过"。 - `scripts/codeguard/engine.py`:登记两个引擎与其权威性,提供退出码翻译表。 未知码一律按 UNVERIFIED 阻塞(fail closed)。 - `scripts/engine_report.py` + `codeguard engine`:只读报告签发方与 Rust 组件 探测结果。Legacy 无 --version(未知子命令退出 1),Rust 以 report_type=version 的 JSON 应答,两者可无歧义区分。 - `resolve_authoritative(rust_available=True)` 仍返回 Legacy:二进制存在 不改变权威性,Rust 在能力矩阵 gap 清空前不能签发质量结论。 - 新增 `engine` 子命令并登记进 SCRIPT_ROLES / CORE_DEPENDENCIES。 13 项契约测试覆盖:两引擎退出码不共享语义、仅 0 可通过、未知码 fail closed、 探测到 Rust 仍不夺权、Legacy 形态不被误判为 Rust。 架构门禁 / run_all 144 / 可移植性校验均绿;unittest discover 645 项中唯一 失败为 test_add_all_widens_to_three_lanes,已 stash 验证为预先存在。 --- bin/codeguard | 6 +- scripts/check_architecture.py | 3 + scripts/codeguard/engine.py | 116 +++++++++++++++++++++++++ scripts/engine_report.py | 116 +++++++++++++++++++++++++ tests/test_engine_boundary.py | 155 ++++++++++++++++++++++++++++++++++ 5 files changed, 395 insertions(+), 1 deletion(-) create mode 100644 scripts/codeguard/engine.py create mode 100644 scripts/engine_report.py create mode 100644 tests/test_engine_boundary.py diff --git a/bin/codeguard b/bin/codeguard index 2c3a399..459c299 100755 --- a/bin/codeguard +++ b/bin/codeguard @@ -10,6 +10,7 @@ # # 退出码: 0 通过 / 1 无法验证 / 2 存在漏洞 / 3 参数错误 # codeguard dockerfile [--json] [path] # Dockerfile 安全风险检查(hadolint + trivy config) # codeguard detect [path] # 检测项目语言 +# codeguard engine [--format human|json] # 报告由哪个引擎签发质量结论 # # 安装到 PATH: # ln -s "$(pwd)/bin/codeguard" /usr/local/bin/codeguard @@ -39,6 +40,9 @@ case "$cmd" in detect) exec python3 "$ROOT/scripts/detect_lang.py" "${1:-.}" ;; + engine) + exec python3 "$ROOT/scripts/engine_report.py" "$@" + ;; init) cat >&2 <<'EOF' [codeguard] 项目初始化引导: @@ -53,7 +57,7 @@ EOF ;; *) echo "codeguard: 未知子命令 '$cmd'" >&2 - echo "可用: check | fix | cve | dockerfile | detect | java-plan | init" >&2 + echo "可用: check | fix | cve | dockerfile | detect | java-plan | engine | init" >&2 exit 1 ;; esac diff --git a/scripts/check_architecture.py b/scripts/check_architecture.py index b107bc7..cd142d6 100644 --- a/scripts/check_architecture.py +++ b/scripts/check_architecture.py @@ -20,6 +20,7 @@ "cve_check.py": "entry", "detect_lang.py": "entry", "dockerfile_security.py": "entry", + "engine_report.py": "entry", "fix.py": "entry", "gen_language_docs.py": "entry", "java_project.py": "entry", @@ -41,6 +42,8 @@ } CORE_DEPENDENCIES = { + # 引擎边界:纯数据与退出码翻译,不执行进程(探测由调用方注入)。 + "codeguard.engine": {"__future__", "dataclasses", "typing"}, "codeguard.cve_policy": {"__future__", "dataclasses"}, "codeguard.cve_reports": {"__future__", "json", "math", "codeguard.cve_policy"}, "codeguard.cve_scanners": {"__future__", "tempfile", "pathlib", "codeguard.cve_policy", diff --git a/scripts/codeguard/engine.py b/scripts/codeguard/engine.py new file mode 100644 index 0000000..31cca7b --- /dev/null +++ b/scripts/codeguard/engine.py @@ -0,0 +1,116 @@ +"""判定引擎边界:谁签发质量结论,以及各引擎退出码如何翻译成门禁动作。 + +插件自带的 Legacy Python 引擎随包发布,可以签发 PASS/FAIL。 +Rust ``codeguard`` 组件是后续统一内核,但当前对所有质量路径固定返回退出码 3 +(检查未完成),能力矩阵全部条目为 ``gap``。在它自行解除未完成状态之前, +不得用它签发任何质量结论。 + +本模块只做数据与规则,不执行进程:探测结果由调用方注入,便于在不启动外部 +工具的情况下验证门禁语义。 +""" +from __future__ import annotations + +from dataclasses import dataclass +from typing import Literal + +EngineId = Literal["legacy", "rust"] +Verdict = Literal["PASS", "FAIL", "UNVERIFIED", "INCOMPLETE"] + + +@dataclass(frozen=True) +class EngineSpec: + """一个候选判定引擎的登记信息;权威性是显式事实,不由存在性推导。""" + + id: EngineId + label: str + authoritative: bool + version_command: tuple[str, ...] + note: str + + +LEGACY = EngineSpec( + id="legacy", + label="Legacy Python 引擎(随插件发布)", + authoritative=True, + version_command=("codeguard", "detect"), + note="可签发 PASS/FAIL;fix、dockerfile、--lang、--ecosystem、--severity 仅此侧存在。", +) + +RUST = EngineSpec( + id="rust", + label="Rust codeguard 组件(独立内核)", + authoritative=False, + version_command=("codeguard", "--version"), + note=( + "对所有质量路径固定返回退出码 3(未完成),能力矩阵全部 gap;" + "只可作只读观察,命令面改用位置参数,无 fix/dockerfile/--lang/--ecosystem/--severity。" + ), +) + +ENGINES: dict[EngineId, EngineSpec] = {LEGACY.id: LEGACY, RUST.id: RUST} + + +@dataclass(frozen=True) +class GateOutcome: + """一次引擎执行翻译出的门禁动作。 + + ``blocks`` 只表示"是否挡住交付",与"是否有问题"是两件事: + UNVERIFIED 与 INCOMPLETE 都没有发现违规,但同样不允许放行。 + """ + + engine: EngineId + exit_code: int + verdict: Verdict + blocks: bool + reason: str + + +# Legacy:0 通过 / 1 无法验证 / 2 存在违规 / 3 参数错误。 +LEGACY_EXIT: dict[int, tuple[Verdict, bool]] = { + 0: ("PASS", False), + 1: ("UNVERIFIED", True), + 2: ("FAIL", True), + 3: ("UNVERIFIED", True), +} + +# Rust:0 通过 / 1 违规 / 2 参数错误 / 3 检查未完成 / 4 内部故障 / 130 用户中断。 +RUST_EXIT: dict[int, tuple[Verdict, bool]] = { + 0: ("PASS", False), + 1: ("FAIL", True), + 2: ("UNVERIFIED", True), + 3: ("INCOMPLETE", True), + 4: ("INCOMPLETE", True), + 130: ("INCOMPLETE", True), +} + +_EXIT_TABLES: dict[EngineId, dict[int, tuple[Verdict, bool]]] = { + LEGACY.id: LEGACY_EXIT, + RUST.id: RUST_EXIT, +} + + +def translate(engine_id: EngineId, exit_code: int) -> GateOutcome: + """把某引擎的退出码翻译成门禁动作;未知码一律按未验证处理。""" + spec = ENGINES[engine_id] + verdict, blocks = _EXIT_TABLES[engine_id].get( + exit_code, ("UNVERIFIED", True) + ) + reason = spec.note if not spec.authoritative else "Legacy 退出码语义" + return GateOutcome( + engine=engine_id, + exit_code=exit_code, + verdict=verdict, + blocks=blocks, + reason=reason, + ) + + +def resolve_authoritative(*, rust_available: bool) -> EngineSpec: + """选择签发质量结论的引擎。 + + Rust 二进制存在并不改变权威性:只要它仍对质量路径返回未完成,签发方就必须 + 是 Legacy。``rust_available`` 只影响调用方是否需要提示"检测到新内核"。 + """ + if rust_available and not RUST.authoritative: + return LEGACY + return LEGACY if LEGACY.authoritative else RUST diff --git a/scripts/engine_report.py b/scripts/engine_report.py new file mode 100644 index 0000000..23b81eb --- /dev/null +++ b/scripts/engine_report.py @@ -0,0 +1,116 @@ +#!/usr/bin/env python3 +"""engine —— 报告当前由哪个引擎签发质量结论,以及是否检测到 Rust 组件。 + +这是插件侧唯一需要回答"结论是谁给的"的地方。只读,不执行任何检查: +本命令既不扫描代码,也不安装工具,更不会因为发现 Rust 内核就切换签发方。 +""" +from __future__ import annotations + +import argparse +import json +import shutil +import subprocess +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) + +from codeguard.engine import ENGINES, resolve_authoritative # noqa: E402 + +PROBE_TIMEOUT = 10 + + +def probe_rust() -> dict: + """探测 PATH 上的 codeguard 是否为 Rust 组件。 + + Legacy CLI 没有 --version(会落入未知子命令并以 1 退出),Rust 组件则以 + report_type=version 的 JSON 应答。两者因此可以无歧义区分。 + """ + candidate = shutil.which("codeguard") + if not candidate: + return {"available": False, "reason": "PATH 上没有 codeguard"} + try: + proc = subprocess.run( + [candidate, "--version", "--format", "json"], + capture_output=True, text=True, timeout=PROBE_TIMEOUT, check=False, + ) + except (OSError, subprocess.SubprocessError) as exc: + return {"available": False, "reason": f"探测失败:{exc}"} + if proc.returncode != 0: + return {"available": False, + "reason": f"不是 Rust 协议(exit {proc.returncode})"} + try: + payload = json.loads(proc.stdout) + except ValueError: + return {"available": False, "reason": "版本输出不是 JSON"} + if not isinstance(payload, dict) or payload.get("report_type") != "version": + return {"available": False, "reason": "缺少 report_type=version 标记"} + return { + "available": True, + "path": candidate, + "cli_version": payload.get("cli_version"), + "target": payload.get("target"), + "build_identity": payload.get("build_identity"), + "rulepack_compatibility": payload.get("rulepack_compatibility"), + } + + +def build_report() -> dict: + rust = probe_rust() + authoritative = resolve_authoritative(rust_available=rust["available"]) + return { + "report_type": "engine", + "authoritative_engine": authoritative.id, + "authoritative_label": authoritative.label, + "engines": [ + { + "id": spec.id, + "label": spec.label, + "authoritative": spec.authoritative, + "note": spec.note, + } + for spec in (ENGINES["legacy"], ENGINES["rust"]) + ], + "rust_component": rust, + } + + +def render_human(report: dict) -> str: + lines = ["Codeguard 引擎边界", ""] + lines.append(f"质量结论签发方:{report['authoritative_label']}({report['authoritative_engine']})") + for entry in report["engines"]: + mark = "签发方" if entry["authoritative"] else "非签发方" + lines.append(f" - {entry['label']}:{mark}") + lines.append(f" {entry['note']}") + rust = report["rust_component"] + lines.append("") + if rust["available"]: + lines.append( + f"检测到 Rust 组件:{rust['path']}(cli_version={rust['cli_version']}," + f"target={rust['target']},build_identity={rust['build_identity']}," + f"rulepack_compatibility={rust['rulepack_compatibility']})" + ) + lines.append(" 它当前不签发质量结论:检测到 ≠ 可用于门禁。") + else: + lines.append(f"未检测到 Rust 组件:{rust['reason']}") + return "\n".join(lines) + + +def main(argv: list[str] | None = None) -> int: + parser = argparse.ArgumentParser( + prog="codeguard engine", + description="报告由哪个引擎签发质量结论(只读,不执行检查)", + ) + parser.add_argument("--format", choices=("human", "json"), default="human") + args = parser.parse_args(argv) + + report = build_report() + if args.format == "json": + print(json.dumps(report, ensure_ascii=False, indent=2)) + else: + print(render_human(report)) + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/tests/test_engine_boundary.py b/tests/test_engine_boundary.py new file mode 100644 index 0000000..942ee74 --- /dev/null +++ b/tests/test_engine_boundary.py @@ -0,0 +1,155 @@ +"""引擎边界契约:Rust 内核存在时也不得签发质量结论。""" +from __future__ import annotations + +import json +import os +import stat +import sys +import tempfile +import unittest +from pathlib import Path + +PLUGIN = Path(__file__).resolve().parents[1] +sys.path.insert(0, str(PLUGIN / "scripts")) + +import engine_report # noqa: E402 +from codeguard.engine import ( # noqa: E402 + ENGINES, + LEGACY, + LEGACY_EXIT, + RUST, + RUST_EXIT, + resolve_authoritative, + translate, +) + + +class EngineRegistryTests(unittest.TestCase): + def test_both_engines_are_registered(self): + self.assertEqual({"legacy", "rust"}, set(ENGINES)) + + def test_rust_is_not_authoritative_while_it_returns_incomplete(self): + """Rust 对所有质量路径固定返回 3,因此它不能是签发方。""" + self.assertFalse(RUST.authoritative) + self.assertTrue(LEGACY.authoritative) + + def test_rust_incomplete_exit_still_blocks(self): + outcome = translate("rust", 3) + self.assertEqual("INCOMPLETE", outcome.verdict) + self.assertTrue(outcome.blocks) + self.assertFalse(outcome.verdict == "PASS") + + +class ExitTranslationTests(unittest.TestCase): + def test_legacy_two_is_a_failing_verdict(self): + outcome = translate("legacy", 2) + self.assertEqual("FAIL", outcome.verdict) + self.assertTrue(outcome.blocks) + + def test_legacy_one_is_unverified_not_pass(self): + outcome = translate("legacy", 1) + self.assertEqual("UNVERIFIED", outcome.verdict) + self.assertTrue(outcome.blocks) + + def test_rust_and_legacy_do_not_share_exit_code_meaning(self): + """同一个退出码在两个引擎下含义不同,不能互相套用。""" + self.assertNotEqual(LEGACY_EXIT[3], RUST_EXIT[3]) + self.assertEqual("UNVERIFIED", translate("legacy", 3).verdict) + self.assertEqual("INCOMPLETE", translate("rust", 3).verdict) + + def test_unknown_exit_code_fails_closed(self): + for engine in ("legacy", "rust"): + outcome = translate(engine, 99) + self.assertEqual("UNVERIFIED", outcome.verdict, engine) + self.assertTrue(outcome.blocks, engine) + + def test_only_exit_zero_passes(self): + for engine in ("legacy", "rust"): + passing = [code for code, (verdict, _) in + (LEGACY_EXIT if engine == "legacy" else RUST_EXIT).items() + if verdict == "PASS" and not _blocks(engine, code)] + self.assertEqual([0], passing, engine) + + +def _blocks(engine: str, code: int) -> bool: + return translate(engine, code).blocks # type: ignore[arg-type] + + +class AuthoritativeSelectionTests(unittest.TestCase): + def test_rust_availability_does_not_change_the_signing_engine(self): + self.assertIs(resolve_authoritative(rust_available=False), LEGACY) + self.assertIs(resolve_authoritative(rust_available=True), LEGACY) + + def test_rust_presence_is_still_reported_for_operator_awareness(self): + """存在性要能被调用方感知,但只作为提示,不改变权威性。""" + self.assertTrue(RUST.authoritative is False) + self.assertIn("gap", RUST.note) + + +class EngineReportProbeTests(unittest.TestCase): + """engine_report 必须在探测到 Rust 后仍把签发方留在 Legacy。""" + + RUST_VERSION_JSON = json.dumps({ + "schema_version": "0.1.0", "report_type": "version", + "cli_version": "0.1.0", "target": "darwin-arm64", + "build_identity": None, "check_protocol_major": 1, + "rulepack_compatibility": "unverified", + }) + + def _stub(self, directory: Path, body: str) -> Path: + stub = directory / "codeguard" + stub.write_text(body, encoding="utf-8") + stub.chmod(stub.stat().st_mode | stat.S_IEXEC | stat.S_IXGRP | stat.S_IXOTH) + return stub + + def _with_path(self, directory: Path): + original = os.environ.get("PATH", "") + os.environ["PATH"] = f"{directory}{os.pathsep}{original}" + self.addCleanup(lambda: os.environ.__setitem__("PATH", original)) + + def test_rust_stub_is_detected_but_does_not_take_over(self): + with tempfile.TemporaryDirectory() as tmp: + directory = Path(tmp) + self._stub(directory, ( + "#!/usr/bin/env bash\n" + f"cat <<'JSON'\n{self.RUST_VERSION_JSON}\nJSON\n" + "exit 0\n" + )) + self._with_path(directory) + report = engine_report.build_report() + self.assertTrue(report["rust_component"]["available"]) + self.assertEqual("0.1.0", report["rust_component"]["cli_version"]) + self.assertEqual("legacy", report["authoritative_engine"]) + + def test_legacy_shaped_codeguard_is_not_mistaken_for_rust(self): + """Legacy 没有 --version(未知子命令退出 1),不能被判成 Rust。""" + with tempfile.TemporaryDirectory() as tmp: + directory = Path(tmp) + self._stub(directory, "#!/usr/bin/env bash\necho '未知子命令' >&2\nexit 1\n") + self._with_path(directory) + report = engine_report.build_report() + self.assertFalse(report["rust_component"]["available"]) + self.assertEqual("legacy", report["authoritative_engine"]) + + def test_json_output_reports_engines_and_rust_presence(self): + with tempfile.TemporaryDirectory() as tmp: + directory = Path(tmp) + self._stub(directory, ( + "#!/usr/bin/env bash\n" + f"cat <<'JSON'\n{self.RUST_VERSION_JSON}\nJSON\n" + "exit 0\n" + )) + self._with_path(directory) + report = engine_report.build_report() + payload = json.loads(json.dumps(report, ensure_ascii=False)) + self.assertEqual("engine", payload["report_type"]) + self.assertEqual({"legacy", "rust"}, + {entry["id"] for entry in payload["engines"]}) + # 显式断言:Rust 存在但非签发方,这是本模块存在的唯一理由。 + rust = next(e for e in payload["engines"] if e["id"] == "rust") + self.assertFalse(rust["authoritative"]) + self.assertEqual("legacy", payload["authoritative_engine"]) + + +if __name__ == "__main__": + unittest.main() From 1ea4cc6f7bc0ce0d83ec6d0777252e4338c7d259 Mon Sep 17 00:00:00 2001 From: loong10k <20489781+loong10k@users.noreply.github.com> Date: Tue, 29 Sep 2026 00:45:24 +0800 Subject: [PATCH 5/6] =?UTF-8?q?chore(skills):=20=E5=90=8C=E6=AD=A5=20codeg?= =?UTF-8?q?uard-skills=20v0.1.3=EF=BC=8C=E9=87=8D=E6=96=B0=E5=AF=B9?= =?UTF-8?q?=E9=BD=90=E5=BC=95=E6=93=8E=E5=A5=91=E7=BA=A6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit lock 由 v0.1.2 / 2c0c807 升至 v0.1.3 / 33d737f,68 个受管技能快照与摘要整体刷新。 本次同步带入源仓的引擎契约修正:新增 `codeguard/references/operations/engine-contract.md` 作为双引擎命令面的唯一权威对照,并修正 5 个技能与 Rust 内核的调用不一致—— `fix` / `dockerfile` / `--lang` / `--ecosystem` / `--severity` / `--json` 在 Rust 侧不存在。 与本仓新增的 `codeguard engine` 边界报告配套:Rust 组件对所有质量路径固定返回 退出码 3(未完成),不能签发质量结论;`codeguard-check` 的状态语义因此新增 INCOMPLETE,以区分"未完成"与"通过"。 验证:架构门禁 OK / run_all 144 通过 / 可移植性 PASS / skill_vendor check PASS / unittest discover 645 项中唯一失败为预先存在的 test_add_all_widens_to_three_lanes。 --- skills.lock.json | 128 +++++++++--------- skills/codeguard-ansible/SKILL.md | 5 +- skills/codeguard-arkts/SKILL.md | 5 +- skills/codeguard-astro/SKILL.md | 5 +- skills/codeguard-c/SKILL.md | 5 +- skills/codeguard-cfml/SKILL.md | 5 +- skills/codeguard-check/SKILL.md | 42 ++++-- skills/codeguard-clojure/SKILL.md | 5 +- skills/codeguard-cobol/SKILL.md | 5 +- skills/codeguard-cpp/SKILL.md | 5 +- skills/codeguard-crystal/SKILL.md | 5 +- skills/codeguard-csharp/SKILL.md | 5 +- skills/codeguard-css/SKILL.md | 5 +- skills/codeguard-cuda/SKILL.md | 5 +- skills/codeguard-cve/SKILL.md | 18 ++- skills/codeguard-dart/SKILL.md | 5 +- skills/codeguard-dockerfile/SKILL.md | 5 +- skills/codeguard-elixir/SKILL.md | 5 +- skills/codeguard-elm/SKILL.md | 5 +- skills/codeguard-erlang/SKILL.md | 5 +- skills/codeguard-fix/SKILL.md | 5 + skills/codeguard-fsharp/SKILL.md | 5 +- skills/codeguard-go/SKILL.md | 7 +- skills/codeguard-graphql/SKILL.md | 5 +- skills/codeguard-groovy/SKILL.md | 5 +- skills/codeguard-haskell/SKILL.md | 5 +- skills/codeguard-html/SKILL.md | 5 +- skills/codeguard-java/SKILL.md | 7 +- skills/codeguard-julia/SKILL.md | 5 +- skills/codeguard-kotlin/SKILL.md | 5 +- skills/codeguard-liquid/SKILL.md | 5 +- skills/codeguard-lua/SKILL.md | 5 +- skills/codeguard-luau/SKILL.md | 5 +- skills/codeguard-markdown/SKILL.md | 5 +- skills/codeguard-metal/SKILL.md | 5 +- skills/codeguard-nim/SKILL.md | 5 +- skills/codeguard-nix/SKILL.md | 5 +- skills/codeguard-objc/SKILL.md | 5 +- skills/codeguard-ocaml/SKILL.md | 5 +- skills/codeguard-pascal/SKILL.md | 5 +- skills/codeguard-perl/SKILL.md | 5 +- skills/codeguard-php/SKILL.md | 5 +- skills/codeguard-powershell/SKILL.md | 5 +- skills/codeguard-protobuf/SKILL.md | 5 +- skills/codeguard-python/SKILL.md | 7 +- skills/codeguard-r/SKILL.md | 5 +- skills/codeguard-ruby/SKILL.md | 5 +- skills/codeguard-rust/SKILL.md | 7 +- skills/codeguard-scala/SKILL.md | 5 +- skills/codeguard-security-code/SKILL.md | 10 ++ skills/codeguard-shell/SKILL.md | 5 +- skills/codeguard-solidity/SKILL.md | 5 +- skills/codeguard-sql/SKILL.md | 5 +- skills/codeguard-svelte/SKILL.md | 5 +- skills/codeguard-swift/SKILL.md | 5 +- skills/codeguard-terraform/SKILL.md | 5 +- skills/codeguard-toml/SKILL.md | 5 +- skills/codeguard-typescript/SKILL.md | 7 +- skills/codeguard-vbnet/SKILL.md | 5 +- skills/codeguard-vue/SKILL.md | 5 +- skills/codeguard-yaml/SKILL.md | 5 +- skills/codeguard-zig/SKILL.md | 5 +- skills/codeguard/SKILL.md | 14 +- .../references/operations/engine-contract.md | 84 ++++++++++++ 64 files changed, 459 insertions(+), 137 deletions(-) create mode 100644 skills/codeguard/references/operations/engine-contract.md diff --git a/skills.lock.json b/skills.lock.json index a99c3a6..8919876 100644 --- a/skills.lock.json +++ b/skills.lock.json @@ -4,8 +4,8 @@ { "package": "codeguard-skills", "repo": "https://github.com/full-stack-skills/codeguard-skills.git", - "ref": "v0.1.2", - "sha": "2c0c8071f96de48dc53e11de2499c083c100e44c", + "ref": "v0.1.3", + "sha": "33d737f4cf46e5d6d1d1f8dce85d7923e4ad626f", "skills": [ "codeguard", "codeguard-ansible", @@ -78,74 +78,74 @@ ], "dest": "skills/", "sha256": { - "codeguard": "9c6810ccf82c2add76506ee16c28f6809fd6285472d5a8d7107ca354e6fe1d8e", - "codeguard-ansible": "b4d78a74ea3ce4d98c9a53a9c45e488a24f418397b554590dffc34d3ca3b1337", - "codeguard-arkts": "ae1e5c637b77f0fcd247eb47d3700ab621e2ca857d3b57785dad1ab3daaaa4c7", - "codeguard-astro": "15a7a31cac804070b825ab1677ed8cef2e7626e062ebf9112acf71f7ef86ceb4", - "codeguard-c": "1c9e6b74ea93c6b57902c4938e2107403dae81aeebcf533dbede44f66992eac6", - "codeguard-cfml": "e4d00cfd229c5e5fcdd808ceb23d5183a8a95f61c365e95937c076aa28273ffa", - "codeguard-check": "b0de6755927aab088e65f9c104ba3b5b42a31f2bb5e16e3c34a22721059723a4", - "codeguard-clojure": "6328245808d55dd11efa20e83711dce4b39c7b0f793dcde3a23cad9a3742ed8a", - "codeguard-cobol": "129b220e75e7429dfd593fff3b48fa97436370dbf892baee14bdf27c48e78bf8", - "codeguard-cpp": "e7cb2f9d2aac5279f53a26f92819376b1efd74964260a7fa01beeae4e46bd038", - "codeguard-crystal": "a73d4f07d136b81f09f2337f655eff2160b3f37ad0e3ec4d8599825ccaf0bc33", - "codeguard-csharp": "0d81c07a32d8bfc1e9b55a293a99d5e7733ee5636ba6640c323921f053f08427", - "codeguard-css": "5e38b1113fcd87d180928bdf400d9a109b5a4c88491e5d15ce8fc43851ce446b", - "codeguard-cuda": "9ee291bba0ac014140fa638a028ca5f77c09a28b49792e8c1fa96fd46e727859", - "codeguard-cve": "9db89a123c2da9228bc770618ea53eaa944ab76f87dc5a1c1ee4ce595a4b7482", - "codeguard-dart": "d40b0e9bd4810cc47101fb66d9c66ee0b816e07b75bfd1a3614c34d2c5eb1d93", + "codeguard": "d748dd00e15c4d9d2188e951835190fbbd0c8c41d682dc70ec73ca33a574c9f0", + "codeguard-ansible": "a63c35e676c13071e32f41f666fd054332cbf8cfff4f1366859f45ce1b619a33", + "codeguard-arkts": "6d3a82230e07ded3e47f4b581d71bbc1241d3cee0b7cb5b39ff8344fe16492fa", + "codeguard-astro": "0e9cb912d19c77fd91893f43b1a52331e4d77ebab6ba58e03acd3cb00a53613d", + "codeguard-c": "ea2c7e9f285f762779fbf15aa84a6cd987e6dcd62fac0e1e629c71a693909d4c", + "codeguard-cfml": "822ee8d30d28c3fbd9fe6cafa24c89d8aa3da2a57a8965c4b33c481d3e76ea2a", + "codeguard-check": "081dd38b45e56f56d774a2bd2474030549f2d1b6022edfc9b90934b5c5802c56", + "codeguard-clojure": "97ca79125de12677977a7ef786832d5245393d0ce0e30162740e90e0ae709bc1", + "codeguard-cobol": "2e47cc38704c6f4ff4063115f0c31c93c23451d4765ad3e2d003416f13a28fd6", + "codeguard-cpp": "8f8c06e105f121fd839c6ee713254dc342524af851683bd0e25e57cd34ddf386", + "codeguard-crystal": "678bd84523c51a33ef34bcd6a73da024d37a5499c27e81e4fbfe40d5693447cc", + "codeguard-csharp": "0c01e1ba88cb3240fcf114cdbce1a90b1259fa1ed3c80080b022d749462c4ecb", + "codeguard-css": "5f199f164bdbf2c688b96d5484a87ed8883540c696a98c8b7c4d8d21f598964a", + "codeguard-cuda": "52e8e7394227fb3715a00549b4c109d89d15ffc34b73c55c969af0c015aa8940", + "codeguard-cve": "12e166a536e430f2e11b3a09508f16a4bb0e1dd15dc5b9c0d60437cd6b11f4f0", + "codeguard-dart": "ab49d3412fb7c2703f168836c90a787e8aceab46709a52e220269aa8bb7496ce", "codeguard-detect": "56a6509aa250f6a508c088c421f98de623d94f15bb12f8c5067005d7d095842f", - "codeguard-dockerfile": "b95aafae842b8d474da7ddfe0c20c070080b35519c4d18b244dbb028f3f98ce0", - "codeguard-elixir": "bbac0b5691c678b2f944cb28061f05f99cd6683ce1099ced7416508aea638d72", - "codeguard-elm": "16cb94dba06adc95e6740687afcfe904297aa84ca2e7884e48c265df1f584da1", - "codeguard-erlang": "0ad262c45a3d1782c7cf18c702e973899a6f8798b54c4ddec94c868a569745cd", - "codeguard-fix": "f65ceabeda84f5c51ecac111cad059be86503be2335a48623cb2c09104c2d92e", - "codeguard-fsharp": "a8ea7769eb6b88d85b65b88e5f3aa36250a682047e8222dffb3e5737d7f3de00", + "codeguard-dockerfile": "e6f43977a3373f7ec3b5da31d4d8cf38b980c63b7b5985e46fb9e8e5494d41d1", + "codeguard-elixir": "fd70d9daf00520b0470b4721124673ff157eacd9bdc22221491c32b6db3e0b14", + "codeguard-elm": "30b2655492101b5abb9960e52cad09967251fdc8aeb9caded17a6d92176d0bfe", + "codeguard-erlang": "6753ab7a5bdf3668ea71cec8e0a1de41c4ad0dfed15845e7cb0d54597d5aef23", + "codeguard-fix": "0aa2a9ab223a9d04b0c4704c13dafbd463fecb40364c70ebe33b3e46ef34c5d9", + "codeguard-fsharp": "dc3e251b17342cfe936b1700ae008e86c6c88a60bd09d736add1ed5ab005004a", "codeguard-git-branch": "cf8c7814b2f7a0326470d87db18d37feb933f2d71c4152e57ba6f368c24f5e37", "codeguard-git-commit": "f930708f666b40361a5e82d11834bb2f9862368213ce5397d2393f342316165a", - "codeguard-go": "c45b4a657acaf67f922a7145492d5273d7e5b70fa58deb3c886ee338aa015d36", - "codeguard-graphql": "053e66e72304fb736f7115a6dad844ee3718613d09939a3abf06791848aecba4", - "codeguard-groovy": "5c80ca5d19ca3a39b6f3879a20317542334878ae7767cbf84ec87a669f66fdd9", - "codeguard-haskell": "e6ae6d01e2f7c7a31edd7b97381b612f76e235d73ae1f88b9704b2540a83a923", - "codeguard-html": "9cf8f6cb8d9411fc942a24efa507a19ef304d2db4587d1f742c48e3f9ee9abe3", + "codeguard-go": "e3eb115b65cf40f8a917fd58371ee7b5139fb7cb6749146c1c6f2a6d99c4710b", + "codeguard-graphql": "dffb6e58c135006929e75d1029d4737497dcfbb42740d79d7b86be819ef768bd", + "codeguard-groovy": "a62482c54247439a12b78bb025286927b41a71ee9b311deaad1aa47414110a57", + "codeguard-haskell": "8ac301d3ffb75140bebcd89c34f3a85b68d6623dea3efdc95eedcf1be3f7b684", + "codeguard-html": "d8b4aaf68d3232634b4f63b5afd452ec145b54e40dd49cf766e7f179c1331edd", "codeguard-init": "e76b00dea455c3354b67b060d7ef2f3ac15c6af7c2f0eed8fb944b3c26e7aea1", - "codeguard-java": "3832f00a0a26badf80de805b0b1276109343bb711ffce60e63fad127b848843c", - "codeguard-julia": "0b4a32b0bf402ae3bbd5ce79a81144bf33f6e8f5d75feab5f1aba81e7b27b6a7", - "codeguard-kotlin": "0b7ac4c541d9d5dcdfead174d19f012427202e894f07d34254b568af9664c25f", - "codeguard-liquid": "d95db9bc6f7c180f85b62a0b6a4163c29056cbcb9c0d734e68e7c6a6190c586e", - "codeguard-lua": "950ff2e34fdeb5521f6c7a5d9a9928362a1d6ffbf9742130172b667fa4bff13d", - "codeguard-luau": "c988eb250e9b543be6b979852c7acc9e3093dec6929d1d3bd30da6a10269d91e", - "codeguard-markdown": "d4af5e6e63ddfb7664f376861ecc4ccf9ab76e8d70780120267761eb4c72fb62", - "codeguard-metal": "15c7bd82c506297fe7519b21812d1c26a8cb8385a91c43c2f47752ac5c9a8b67", - "codeguard-nim": "55fe4ead57cc373cd7641b6f68595b5ab53fcb673ead7d77e9ee48e6793b1ed8", - "codeguard-nix": "fb982830a842ca705b8b2e24d2eac85cbd36f526008e6f2954d697391f422359", - "codeguard-objc": "63b6369f9fc9d00bd5f8628a6f8e5127a9e1be3a0f9d03b57a9378b0d9e5b84d", - "codeguard-ocaml": "ce45d7e4559f7db3c3f287120d210b6f88d2cb7bb1d75ad7a7dba74d0e6e2d23", - "codeguard-pascal": "13a999918191e6ad3134ef2c997f46c9ea997272f4ec914c6b2b31343ec0cd6a", - "codeguard-perl": "61fb37f073eaedfce6fce46ef4564d97a3eddbbc75b25e926fcb28ce15348d34", - "codeguard-php": "b9139ab6b11499884d743880578bc01b108edd43498accfd40c2c86c98f8d4fd", - "codeguard-powershell": "573187f67123cb4ad9c04b4017351cfd69add325fc6afb5489f81dfcc3e0246f", - "codeguard-protobuf": "2096b8c0b97df8ac007e757e4052543b98a88cc2fec40a4eab712c68205de5b1", - "codeguard-python": "3893b3b90acb45f0e96ab94a3a1407ceb6c15b1a3f8f5708f3db63fa38d78aa2", - "codeguard-r": "1df4b652585676c78bacdc0170937f7ee4dac4e137bd358c7079a6deba7dd4b5", - "codeguard-ruby": "0645355f9b1a122baa79725e4a5cf4365555447bf8728ab6c5b444292655994b", - "codeguard-rust": "455c337fa1d6395983a80d185f951c15e3e9bd7ed12ea4638f53bcb824495f82", - "codeguard-scala": "52fe5b0ec76311db87142ffedb37b3b1110c851a380c927c8d0de7a4c811fafa", + "codeguard-java": "afaa8598f69dc7aa413a10786d476942cc27e6f9e2bed0acc193703857ac13c3", + "codeguard-julia": "221490e160235a3c3a2b2e1111319fd6e1b9d100c4250282d2b474f71b64f1f0", + "codeguard-kotlin": "624dffe94d277a5da86bf60d5a4c2d08dbaeb8a7ab3918a1e0b898017976b2b0", + "codeguard-liquid": "ce67913a5ff5ba9e3057abcc25fee34bd9a5240b7485939eca73f624722b881e", + "codeguard-lua": "0bf132085334ced92317984cffd4158d2ae20861b4fc4fb1aa4cf7f87093ea37", + "codeguard-luau": "d8c271f1c39fec06d461c11444ad480a05a0d26263f1ca98b68056f6f9aa51e1", + "codeguard-markdown": "0a278b086184f39fddc550a3212e8922c754dc9e06a2e23727a5b2fb90d1a174", + "codeguard-metal": "dad3aaf2dce039406f40df31a9a747d3d0a589825d5624fc824717ae0e31c7e8", + "codeguard-nim": "0b73e7699afd322e632a846d952d5eac6c57781cb12107094823ef0e83a12ae1", + "codeguard-nix": "256bfe3aca876d4466a8c7c356446c179919e5094356da755f2b611bec1a2520", + "codeguard-objc": "b85421c89af6dfff8cfb2846f7d8895f8070ef3e2e2d00f8b73cd4dd45dc1869", + "codeguard-ocaml": "e1ba599242319aa87a51ca8920b3f5b41d9e3c2425a4cf9b54d1070ed9ac9260", + "codeguard-pascal": "5d0b2f40981d01678e7922c4f4bc8fdd901121d8e4b36619f6fdad0316b7a6d7", + "codeguard-perl": "9e1ebe246c5baa6a1851fc9ef999bec0e54418f2e474259c542508b7e2fda029", + "codeguard-php": "6b75513b49704e833bb0082a9cfed359f794661e51d11e1d629fded638b6d3ab", + "codeguard-powershell": "18a672b10c79553d21673571ad4e8c82c10974bc7be8bc3b459a36414f90e669", + "codeguard-protobuf": "917350f5c2cf88e5522f2d69a8fe240c324b16ede390c5a2684bf3d66bd1d7bd", + "codeguard-python": "d129a5b8e38dba9af141b4daacf3daf1e08ba7365b2250163bb0b68118fcb187", + "codeguard-r": "48c063277dee8132003742682b54458b75bebf50fdd4eedb06ccebdbafcdebf0", + "codeguard-ruby": "c6f02a02d7e07f09a7d01158187101ffc2e3f068055b2527ff4180d642b13c4a", + "codeguard-rust": "0b9c180351055950986286642c21a200bd2b0aeae52db8faa3d3e3846828d618", + "codeguard-scala": "ba7c20c01094c8377915b845d088f4aae3d76ca35e99d70dbf66b48d11793ac2", "codeguard-security-api": "8ee9900353bf58b80f25868829d84b047ccc6e1d8a28d53e2b88c3e822b5fbe1", - "codeguard-security-code": "7d7d82cc21f75b1ff4bbcab92b14607e652980a833ebc4a6357f28ceaba8c22d", + "codeguard-security-code": "152ede19c341e11d623973ec8951d88b335b5e30218fbf309636ab822067adc3", "codeguard-security-data": "185432d5dd2106506afe4f355108778ef9661ebf3e0ec253c35129b5d373cb38", - "codeguard-shell": "413477839e8748bd32d38646d00828470a7f2b168dedc2f2f4917cdfe053225a", - "codeguard-solidity": "8750aa66c12b02ce4c7a7096bf9c9fabe034cc7aeb8f6a0e5e4a0f94ffb97d54", - "codeguard-sql": "f4bc3f1b3e6f737b895f2cb018edfe68de386536b200879e0459b218ea336887", - "codeguard-svelte": "fbd6d282527f209c507229336fcc0c834ec03481a4835beaeff0bb071c19da5e", - "codeguard-swift": "b96e08a9442ca22ed6252f73622f267e38b5d9d8f08b85f401768c1220a8e255", - "codeguard-terraform": "bad531ce883507dd92fdd77c388b7f5d456507bfdd86dfb002e0bb2b410651e8", - "codeguard-toml": "93e66e8d97a15f436bb097438e04f011c49404c680a1d29d3f497eec6b8d7bab", - "codeguard-typescript": "c86714abd36b2e46b52ab4071d1936ceeb8f76f178d2497b05e498a8c82581bf", - "codeguard-vbnet": "d1f62359f13d2f581b446e39a7fecd34db4f8a085644a3ab5b906d5c55c35f55", - "codeguard-vue": "0df651c06a4a3b468027b1c3ad913c2808682c90890ddd109a9fe5632d064b9c", - "codeguard-yaml": "66b65f6aec5114d2a726726c03c39234fc13bd06ebb398277d22325a3e35af13", - "codeguard-zig": "329fdce6062c1b6e6d2889b1b36c0d50e6b29e384bb9794a3bc879d8df7c3d6a" + "codeguard-shell": "dc40f0312b2ee97d55d78d5c858267354f75b93f9293b050ff8bec32b85ce757", + "codeguard-solidity": "d4888e0bcc462f63377d1bd564e5e15cb261751515590ec831cc2764a3d96eea", + "codeguard-sql": "14058cc8dc6f10137dc652944c17e9c84d3dfc38c805059bbab330e6fa7df2a9", + "codeguard-svelte": "51bbf35bd53f8f7c7841dee25b26d28ae19181ccbb0bbc457943d65124b023e0", + "codeguard-swift": "5b9d7abf41c6ba2973b8f35a2d78b7b6eae0f0092b55ad034762a2fbff1beb43", + "codeguard-terraform": "f5aceb158af7d889cf6732b4b415b44e7e4c5d20e896d3f272309d6eab3b230b", + "codeguard-toml": "3a712fe2f2005e1360376d5874a3d22c3d513214cf9d0ba2a8c73c4a6d89008e", + "codeguard-typescript": "451d5e29d21c232015c71fdecd785166083efe3027a3a914709360ca09ab76ee", + "codeguard-vbnet": "b6bd8495c5ae68bc883ef327ca1f205266d02133275ed6c3db21ee470023e95c", + "codeguard-vue": "776bf9805e5af115253a75aa651a6594f8c44f515e8b3e0a6479ad7ad3b8e31b", + "codeguard-yaml": "bae3b43f8f4849ab4743d2aee381a0f4845fb1f54994015cb44c1e45da4830cd", + "codeguard-zig": "c736d678429fb44847f9fe5e3de0029102ea4c684f6a70aa80280ba88f744126" } } ] diff --git a/skills/codeguard-ansible/SKILL.md b/skills/codeguard-ansible/SKILL.md index 23e41d9..d52ee8b 100644 --- a/skills/codeguard-ansible/SKILL.md +++ b/skills/codeguard-ansible/SKILL.md @@ -138,7 +138,10 @@ Ansible Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 当前条目标记为 planned;不得把 YAML 通道的结果冒充 Ansible 语义门禁。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 当前条目标记为 planned;不得把 YAML 通道的结果冒充 Ansible 语义门禁。 ## 信息不足时 diff --git a/skills/codeguard-arkts/SKILL.md b/skills/codeguard-arkts/SKILL.md index cf6ee88..1eb074b 100644 --- a/skills/codeguard-arkts/SKILL.md +++ b/skills/codeguard-arkts/SKILL.md @@ -138,7 +138,10 @@ ArkTS (HarmonyOS) Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 当前条目标记为 planned;需要 HarmonyOS/DevEco 官方诊断证据后才能升级。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 当前条目标记为 planned;需要 HarmonyOS/DevEco 官方诊断证据后才能升级。 ## 信息不足时 diff --git a/skills/codeguard-astro/SKILL.md b/skills/codeguard-astro/SKILL.md index 7c50385..d1f1534 100644 --- a/skills/codeguard-astro/SKILL.md +++ b/skills/codeguard-astro/SKILL.md @@ -148,7 +148,10 @@ Astro Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Astro 文件需要专用 parser;只检查脚本区不能代表整个组件通过。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Astro 文件需要专用 parser;只检查脚本区不能代表整个组件通过。 ## 信息不足时 diff --git a/skills/codeguard-c/SKILL.md b/skills/codeguard-c/SKILL.md index efcae2f..b57e06a 100644 --- a/skills/codeguard-c/SKILL.md +++ b/skills/codeguard-c/SKILL.md @@ -148,7 +148,10 @@ C Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — clang-tidy 需要可靠的编译参数;复杂项目优先提供 `compile_commands.json`。 + +### 领域陷阱与修复 + +1. **领域陷阱** — clang-tidy 需要可靠的编译参数;复杂项目优先提供 `compile_commands.json`。 ## 信息不足时 diff --git a/skills/codeguard-cfml/SKILL.md b/skills/codeguard-cfml/SKILL.md index 3b85eab..c8fa100 100644 --- a/skills/codeguard-cfml/SKILL.md +++ b/skills/codeguard-cfml/SKILL.md @@ -148,7 +148,10 @@ CFML (ColdFusion) Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — CFML 方言与引擎差异会影响 CFLint 结果;需注明 Adobe CF 或 Lucee。 + +### 领域陷阱与修复 + +1. **领域陷阱** — CFML 方言与引擎差异会影响 CFLint 结果;需注明 Adobe CF 或 Lucee。 ## 信息不足时 diff --git a/skills/codeguard-check/SKILL.md b/skills/codeguard-check/SKILL.md index 7efd12e..634b8e4 100644 --- a/skills/codeguard-check/SKILL.md +++ b/skills/codeguard-check/SKILL.md @@ -1,7 +1,7 @@ --- name: codeguard-check license: Apache-2.0 -description: 对 Codeguard 支持的仓库执行只读 lint 门禁并解释结果;当用户说 check、跑检查、lint 报告、提交前检查,或 CI 的 Codeguard 检查失败时使用。必须区分 PASS、FAIL、UNVERIFIED 与 PLANNED。 +description: 对 Codeguard 支持的仓库执行只读 lint 门禁并解释结果;当用户说 check、跑检查、lint 报告、提交前检查,或 CI 的 Codeguard 检查失败时使用。必须区分 PASS、FAIL、UNVERIFIED、INCOMPLETE 与 PLANNED,并写明结果由 legacy 还是 rust 引擎签发。 compatibility: 需要 Codeguard CLI 和目标语言工具链;默认不修改源码、不安装工具。 --- @@ -11,13 +11,27 @@ compatibility: 需要 Codeguard CLI 和目标语言工具链;默认不修改 ## 30 秒开始 +先判定引擎(`codeguard --version --format json`),再选择命令面。完整对照见 `codeguard` 技能的 `references/operations/engine-contract.md`。 + +Legacy Python 引擎: + ```bash bin/codeguard detect . bin/codeguard check . bin/codeguard check --lang java,python --timeout 60 . ``` -执行前记录工作目录、当前分支、目标模块和工具版本。若 `bin/codeguard` 不存在,不要猜测命令或声称通过;改用仓库的权威 CI/lint 命令或报告 `UNVERIFIED`。 +Rust 组件(当前对质量路径固定返回未完成): + +```bash +codeguard detect . --format json +codeguard plan check all . +codeguard check all . --format json +``` + +Rust 侧的 `check` 只接受位置参数 `all|java`,没有 `--lang`;`--timeout` 接受 duration(如 `30m`)而非裸秒数。Rust 组件返回退出码 3,只能表述为局部原生观察或未完成,**不能作为门禁通过结论**。 + +执行前记录工作目录、当前分支、目标模块和工具版本,并写明结果由哪个引擎签发。若 `bin/codeguard` 不存在,不要猜测命令或声称通过;改用仓库的权威 CI/lint 命令或报告 `UNVERIFIED`。 ## 能力边界 @@ -25,8 +39,8 @@ bin/codeguard check --lang java,python --timeout 60 . 1. 自动检测项目语言,一次跑多语言 lint。 2. 表格化报告每种语言的命令、退出码、耗时和状态。 -3. 使用 `--lang` 和 `--timeout` 缩小故障范围。 -4. 区分代码违规、配置错误、工具缺失和执行器错误。 +3. Legacy 下用 `--lang` 和 `--timeout` 缩小故障范围;Rust 下先用 `plan` 看只读计划。 +4. 区分代码违规、配置错误、工具缺失、未完成和执行器错误。 5. 为修复与 CI 复现产出结构化证据。 ### ⚠️ Prerequisites @@ -62,13 +76,22 @@ bin/codeguard check --lang java,python --timeout 60 . ## 命令契约 +Legacy Python 引擎: + ```bash bin/codeguard check # 全量 bin/codeguard check --lang java,python # 限定语言 -bin/codeguard check --timeout 60 path/ # 指定项目与超时 +bin/codeguard check --timeout 60 path/ # 指定项目与超时(裸秒数) +``` + +Rust 引擎(`--lang` 不存在,`--timeout` 用 duration,退出码 3 表示未完成): + +```bash +codeguard check all path/ --timeout 30m --format json +codeguard check java path/ --format json ``` -实际 CLI 参数以 `bin/codeguard check --help` 为准。技能包只提供操作知识,不假装包含 Codeguard 运行时。 +实际 CLI 参数以 `bin/codeguard check --help`(Legacy)或 `codeguard --help`(Rust)为准。技能包只提供操作知识,不假装包含 Codeguard 运行时。 ## 状态语义 @@ -77,6 +100,7 @@ bin/codeguard check --timeout 60 path/ # 指定项目与超时 | `PASS` | 权威检查命令在明确范围内退出 0 | 可报告该 lint 门禁通过 | | `FAIL` | 工具成功运行并发现违规 | 按格式/规则/配置分类修复 | | `UNVERIFIED` | 工具、配置、权限、版本、超时或环境不足 | 补齐前置条件,不得写通过 | +| `INCOMPLETE` | 检查按契约未跑完(Rust 引擎退出码 3、必需检查缺失、部分模块未覆盖) | 列出未完成项,**不得写通过**,也不得表述为零违规 | | `PLANNED` | 注册表仅有识别能力,没有可执行门禁 | 列出待接入工具与验收条件 | ## 标准 Workflow @@ -113,7 +137,7 @@ bin/codeguard check --timeout 60 path/ # 指定项目与超时 ### Step 7:输出结果 -按语言列出 PASS/FAIL/UNVERIFIED/PLANNED,并将 lint、test、build、security 证据分开。 +按语言列出 PASS/FAIL/UNVERIFIED/INCOMPLETE/PLANNED,并将 lint、test、build、security 证据分开。 ## Rules @@ -127,13 +151,15 @@ bin/codeguard check --timeout 60 path/ # 指定项目与超时 ```text Codeguard check 结果 +- 引擎: - 范围: - 检测语言: - 命令: - 工具: -- 结果: PASS/FAIL/UNVERIFIED/PLANNED> +- 结果: PASS/FAIL/UNVERIFIED/INCOMPLETE/PLANNED> - 发现: - 未验证: +- 未完成: ``` ## Gotchas diff --git a/skills/codeguard-clojure/SKILL.md b/skills/codeguard-clojure/SKILL.md index dac67da..08def1f 100644 --- a/skills/codeguard-clojure/SKILL.md +++ b/skills/codeguard-clojure/SKILL.md @@ -148,7 +148,10 @@ Clojure Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — clj-kondo cache 与 classpath 会影响宏分析;宏项目需提供导出配置。 + +### 领域陷阱与修复 + +1. **领域陷阱** — clj-kondo cache 与 classpath 会影响宏分析;宏项目需提供导出配置。 ## 信息不足时 diff --git a/skills/codeguard-cobol/SKILL.md b/skills/codeguard-cobol/SKILL.md index d98321e..8fd6837 100644 --- a/skills/codeguard-cobol/SKILL.md +++ b/skills/codeguard-cobol/SKILL.md @@ -138,7 +138,10 @@ COBOL Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 当前条目标记为 planned;依赖具体编译器/IDE,不能虚构通用 CLI。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 当前条目标记为 planned;依赖具体编译器/IDE,不能虚构通用 CLI。 ## 信息不足时 diff --git a/skills/codeguard-cpp/SKILL.md b/skills/codeguard-cpp/SKILL.md index e5c8c42..57f5cd7 100644 --- a/skills/codeguard-cpp/SKILL.md +++ b/skills/codeguard-cpp/SKILL.md @@ -148,7 +148,10 @@ C++ Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 模板、宏和条件编译高度依赖真实编译数据库;不要凭单文件默认参数宣布通过。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 模板、宏和条件编译高度依赖真实编译数据库;不要凭单文件默认参数宣布通过。 ## 信息不足时 diff --git a/skills/codeguard-crystal/SKILL.md b/skills/codeguard-crystal/SKILL.md index 08026d8..6303f45 100644 --- a/skills/codeguard-crystal/SKILL.md +++ b/skills/codeguard-crystal/SKILL.md @@ -148,7 +148,10 @@ Crystal Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Ameba 配置和 Crystal 版本需匹配;格式化不替代 `crystal spec`。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Ameba 配置和 Crystal 版本需匹配;格式化不替代 `crystal spec`。 ## 信息不足时 diff --git a/skills/codeguard-csharp/SKILL.md b/skills/codeguard-csharp/SKILL.md index 63135f5..4c474c4 100644 --- a/skills/codeguard-csharp/SKILL.md +++ b/skills/codeguard-csharp/SKILL.md @@ -148,7 +148,10 @@ C# Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 + +### 领域陷阱与修复 + +1. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 ## 信息不足时 diff --git a/skills/codeguard-css/SKILL.md b/skills/codeguard-css/SKILL.md index 49dc82c..f84f06b 100644 --- a/skills/codeguard-css/SKILL.md +++ b/skills/codeguard-css/SKILL.md @@ -148,7 +148,10 @@ CSS / SCSS / Sass / LESS Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Stylelint glob 必须覆盖 SCSS/Sass/LESS 时显式扩展,默认 `**/*.css` 不会自动覆盖全部预处理器。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Stylelint glob 必须覆盖 SCSS/Sass/LESS 时显式扩展,默认 `**/*.css` 不会自动覆盖全部预处理器。 ## 信息不足时 diff --git a/skills/codeguard-cuda/SKILL.md b/skills/codeguard-cuda/SKILL.md index 4123ab7..960aea3 100644 --- a/skills/codeguard-cuda/SKILL.md +++ b/skills/codeguard-cuda/SKILL.md @@ -148,7 +148,10 @@ CUDA Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — CUDA 文件同时受主机编译器与 nvcc 约束;clang-tidy 不能替代真实 CUDA 构建。 + +### 领域陷阱与修复 + +1. **领域陷阱** — CUDA 文件同时受主机编译器与 nvcc 约束;clang-tidy 不能替代真实 CUDA 构建。 ## 信息不足时 diff --git a/skills/codeguard-cve/SKILL.md b/skills/codeguard-cve/SKILL.md index 4bbb27d..990151e 100644 --- a/skills/codeguard-cve/SKILL.md +++ b/skills/codeguard-cve/SKILL.md @@ -32,6 +32,10 @@ compatibility: 需要目标生态的锁文件、扫描工具及可用漏洞数 ## 命令 +先判定引擎,两套命令面不同。Rust `codeguard` 组件的 `cve` 用位置参数选择生态,且没有 `--severity` / `--fix` / `--json`;它对质量路径固定返回未完成(退出码 3),不能用来签发"无漏洞"结论。 + +**Legacy Python 引擎:** + ```bash bin/codeguard cve # 全生态扫描 bin/codeguard cve --ecosystem node # 只扫 node @@ -40,6 +44,16 @@ bin/codeguard cve --severity MEDIUM # 门禁阈值调到中危(发版 bin/codeguard cve --json path/ # 结构化输出 ``` +**Rust 组件(局部原生观察,结论保持未完成):** + +```bash +codeguard cve typescript [path] --node-tool ABS_PATH --npm-entry ABS_PATH --npm-version VERSION +codeguard cve rust [path] --cargo-audit-tool ABS_PATH --db ABS_PATH +codeguard cve python [path] --pip-audit-tool ABS_PATH --pip-audit-version VERSION +``` + +引擎判定与两套命令面对照见 `codeguard` 技能的 `references/operations/engine-contract.md`。 + ## 三态语义(门禁必须遵守) | 退出码 | 含义 | 门禁动作 | @@ -47,6 +61,7 @@ bin/codeguard cve --json path/ # 结构化输出 | 0 | 全部通过 | 允许提交 | | 1 | 无法验证(工具缺失/超时) | **不视为通过**——先装工具 | | 2 | 发现漏洞 | 必须修复(升级/替换/登记缓解),禁止只报告不处理 | +| 3 | 检查未完成(Rust 组件当前对所有质量路径返回) | **不视为通过**——只能表述为未完成或局部观察 | ## Workflow @@ -78,7 +93,7 @@ bin/codeguard cve --json path/ # 结构化输出 ### Step 3:执行只读扫描 -优先 `bin/codeguard cve --json ` 保存结构化证据,不在首次扫描时带 `--fix`。 +优先 `bin/codeguard cve --json ` 保存结构化证据,不在首次扫描时带 `--fix`。Rust 引擎下改用 `--format json` 的 `cve <生态>` 调用,并如实标注该结果为未完成。 ### Step 4:确认可利用性与引入路径 @@ -103,6 +118,7 @@ bin/codeguard cve --json path/ # 结构化输出 3. 不只复制 scanner 标题;必须确认依赖路径和可用修复版本。 4. 缓解不等于修复,必须写明残余风险与追踪日期。 5. 报告必须记录扫描日期和数据库新鲜度。 +6. 必须写明本次扫描由哪个引擎签发;Rust 组件的未完成结果不得表述为零漏洞。 ## 输出模板 diff --git a/skills/codeguard-dart/SKILL.md b/skills/codeguard-dart/SKILL.md index 1bb459d..61fc88d 100644 --- a/skills/codeguard-dart/SKILL.md +++ b/skills/codeguard-dart/SKILL.md @@ -148,7 +148,10 @@ Dart / Flutter Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `dart analyze` 与 Flutter widget/integration tests 是不同证据层级。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `dart analyze` 与 Flutter widget/integration tests 是不同证据层级。 ## 信息不足时 diff --git a/skills/codeguard-dockerfile/SKILL.md b/skills/codeguard-dockerfile/SKILL.md index 5be86ba..9a9cdf7 100644 --- a/skills/codeguard-dockerfile/SKILL.md +++ b/skills/codeguard-dockerfile/SKILL.md @@ -148,7 +148,10 @@ Dockerfile Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Hadolint 通过不证明镜像安全;仍需检查基础镜像摘要、SBOM 与漏洞扫描结果。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Hadolint 通过不证明镜像安全;仍需检查基础镜像摘要、SBOM 与漏洞扫描结果。 ## 信息不足时 diff --git a/skills/codeguard-elixir/SKILL.md b/skills/codeguard-elixir/SKILL.md index f930a97..ff640d2 100644 --- a/skills/codeguard-elixir/SKILL.md +++ b/skills/codeguard-elixir/SKILL.md @@ -148,7 +148,10 @@ Elixir Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 + +### 领域陷阱与修复 + +1. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 ## 信息不足时 diff --git a/skills/codeguard-elm/SKILL.md b/skills/codeguard-elm/SKILL.md index 1ea51bc..5524841 100644 --- a/skills/codeguard-elm/SKILL.md +++ b/skills/codeguard-elm/SKILL.md @@ -148,7 +148,10 @@ Elm Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — elm-review 依赖项目 review 配置;未初始化时应报告不可验证。 + +### 领域陷阱与修复 + +1. **领域陷阱** — elm-review 依赖项目 review 配置;未初始化时应报告不可验证。 ## 信息不足时 diff --git a/skills/codeguard-erlang/SKILL.md b/skills/codeguard-erlang/SKILL.md index 7559767..89b16f5 100644 --- a/skills/codeguard-erlang/SKILL.md +++ b/skills/codeguard-erlang/SKILL.md @@ -148,7 +148,10 @@ Erlang Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Elvis 与 erlfmt 依赖 rebar 项目上下文;OTP 版本也会改变可用语法。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Elvis 与 erlfmt 依赖 rebar 项目上下文;OTP 版本也会改变可用语法。 ## 信息不足时 diff --git a/skills/codeguard-fix/SKILL.md b/skills/codeguard-fix/SKILL.md index 60a3be8..fcf29cf 100644 --- a/skills/codeguard-fix/SKILL.md +++ b/skills/codeguard-fix/SKILL.md @@ -23,12 +23,16 @@ compatibility: 需要 Codeguard CLI、对应 formatter/linter 和可写工作树 ## 命令 +`fix` 只在 Legacy Python 引擎下存在。Rust `codeguard` 组件当前没有自动修复命令,探测到 Rust 引擎时不要凭空构造 `codeguard fix`。 + ```bash bin/codeguard fix --dry-run # 预览(不实际修改) bin/codeguard fix # 执行修复 bin/codeguard fix --lang python # 只修 Python ``` +引擎判定与两套命令面对照见 `codeguard` 技能的 `references/operations/engine-contract.md`。 + ## Workflow 1. `bin/codeguard check` 确认失败项 @@ -112,6 +116,7 @@ Codeguard fix 结果 ## 按需加载资源 +- 判定当前引擎与可用命令时读取 **`codeguard`** 技能的 `references/operations/engine-contract.md`。安装:`npx skills add full-stack-skills/codeguard-skills --skill codeguard`。 - 判断是否可自动修复时读取 `references/rules/autofix-boundary.md`。 - 设计分批修复时读取 `references/operations/recheck-playbook.md`。 - 根据用户场景只读取 `examples/` 中的对应示例。 diff --git a/skills/codeguard-fsharp/SKILL.md b/skills/codeguard-fsharp/SKILL.md index 518bcc2..b15f8e2 100644 --- a/skills/codeguard-fsharp/SKILL.md +++ b/skills/codeguard-fsharp/SKILL.md @@ -148,7 +148,10 @@ F# Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Fantomas 主要处理格式,不替代编译器、测试与 analyzers。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Fantomas 主要处理格式,不替代编译器、测试与 analyzers。 ## 信息不足时 diff --git a/skills/codeguard-go/SKILL.md b/skills/codeguard-go/SKILL.md index 0740cf2..4df4a3e 100644 --- a/skills/codeguard-go/SKILL.md +++ b/skills/codeguard-go/SKILL.md @@ -148,8 +148,11 @@ Go Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `gofmt` 只处理格式;`go vet` 与 `go test` 仍需独立运行。 -8. **领域陷阱** — 多模块仓库可能包含多个 `go.mod`,从错误根目录执行会漏检。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `gofmt` 只处理格式;`go vet` 与 `go test` 仍需独立运行。 +2. **领域陷阱** — 多模块仓库可能包含多个 `go.mod`,从错误根目录执行会漏检。 ## 信息不足时 diff --git a/skills/codeguard-graphql/SKILL.md b/skills/codeguard-graphql/SKILL.md index c124311..ef763fc 100644 --- a/skills/codeguard-graphql/SKILL.md +++ b/skills/codeguard-graphql/SKILL.md @@ -148,7 +148,10 @@ GraphQL Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — GraphQL lint 依赖 schema;无 schema 时只能验证有限的文档规则。 + +### 领域陷阱与修复 + +1. **领域陷阱** — GraphQL lint 依赖 schema;无 schema 时只能验证有限的文档规则。 ## 信息不足时 diff --git a/skills/codeguard-groovy/SKILL.md b/skills/codeguard-groovy/SKILL.md index e895122..c0b807e 100644 --- a/skills/codeguard-groovy/SKILL.md +++ b/skills/codeguard-groovy/SKILL.md @@ -148,7 +148,10 @@ Groovy Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Groovy 动态特性使静态 lint 覆盖有限;Gradle/Jenkins DSL 需结合宿主验证。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Groovy 动态特性使静态 lint 覆盖有限;Gradle/Jenkins DSL 需结合宿主验证。 ## 信息不足时 diff --git a/skills/codeguard-haskell/SKILL.md b/skills/codeguard-haskell/SKILL.md index 02af3c0..cc3146e 100644 --- a/skills/codeguard-haskell/SKILL.md +++ b/skills/codeguard-haskell/SKILL.md @@ -148,7 +148,10 @@ Haskell Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — HLint 建议不总是语义等价;涉及 strictness 或性能时禁止盲目批量应用。 + +### 领域陷阱与修复 + +1. **领域陷阱** — HLint 建议不总是语义等价;涉及 strictness 或性能时禁止盲目批量应用。 ## 信息不足时 diff --git a/skills/codeguard-html/SKILL.md b/skills/codeguard-html/SKILL.md index d7afbed..ba173a9 100644 --- a/skills/codeguard-html/SKILL.md +++ b/skills/codeguard-html/SKILL.md @@ -148,7 +148,10 @@ HTML Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 模板文件可能包含服务端语法;HTMLHint 解析失败时先确认是否应交给模板专用工具。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 模板文件可能包含服务端语法;HTMLHint 解析失败时先确认是否应交给模板专用工具。 ## 信息不足时 diff --git a/skills/codeguard-java/SKILL.md b/skills/codeguard-java/SKILL.md index d0a480e..10ad0ee 100644 --- a/skills/codeguard-java/SKILL.md +++ b/skills/codeguard-java/SKILL.md @@ -148,8 +148,11 @@ Java Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `mvn compile` 不执行 Javadoc 门禁;发布链失败时必须单独运行 `mvn javadoc:jar`。 -8. **领域陷阱** — JDK 版本会改变 doclint 严格度;本地和 CI 必须使用同一主版本。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `mvn compile` 不执行 Javadoc 门禁;发布链失败时必须单独运行 `mvn javadoc:jar`。 +2. **领域陷阱** — JDK 版本会改变 doclint 严格度;本地和 CI 必须使用同一主版本。 ## 信息不足时 diff --git a/skills/codeguard-julia/SKILL.md b/skills/codeguard-julia/SKILL.md index 5ebf465..247e733 100644 --- a/skills/codeguard-julia/SKILL.md +++ b/skills/codeguard-julia/SKILL.md @@ -148,7 +148,10 @@ Julia Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 只有 formatter 时必须明确标为 format-only,不能把它当作语义 lint 通过。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 只有 formatter 时必须明确标为 format-only,不能把它当作语义 lint 通过。 ## 信息不足时 diff --git a/skills/codeguard-kotlin/SKILL.md b/skills/codeguard-kotlin/SKILL.md index 20f9882..59ddf5e 100644 --- a/skills/codeguard-kotlin/SKILL.md +++ b/skills/codeguard-kotlin/SKILL.md @@ -148,7 +148,10 @@ Kotlin Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Detekt 与 ktlint 是不同门禁;Gradle wrapper 版本和插件配置必须以项目为准。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Detekt 与 ktlint 是不同门禁;Gradle wrapper 版本和插件配置必须以项目为准。 ## 信息不足时 diff --git a/skills/codeguard-liquid/SKILL.md b/skills/codeguard-liquid/SKILL.md index ccef77c..ac60cf8 100644 --- a/skills/codeguard-liquid/SKILL.md +++ b/skills/codeguard-liquid/SKILL.md @@ -148,7 +148,10 @@ Liquid (Shopify) Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Shopify Theme Check 面向 Shopify Liquid;其他 Liquid 方言需单独确认。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Shopify Theme Check 面向 Shopify Liquid;其他 Liquid 方言需单独确认。 ## 信息不足时 diff --git a/skills/codeguard-lua/SKILL.md b/skills/codeguard-lua/SKILL.md index 7e9d228..f5bf88d 100644 --- a/skills/codeguard-lua/SKILL.md +++ b/skills/codeguard-lua/SKILL.md @@ -148,7 +148,10 @@ Lua Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Lua 版本和宿主环境差异大;Luacheck globals 必须与运行时一致。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Lua 版本和宿主环境差异大;Luacheck globals 必须与运行时一致。 ## 信息不足时 diff --git a/skills/codeguard-luau/SKILL.md b/skills/codeguard-luau/SKILL.md index 3bf04f9..6ba29a1 100644 --- a/skills/codeguard-luau/SKILL.md +++ b/skills/codeguard-luau/SKILL.md @@ -148,7 +148,10 @@ Luau Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Luau 与标准 Lua 类型/语法不同,禁止用普通 Lua linter 代替。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Luau 与标准 Lua 类型/语法不同,禁止用普通 Lua linter 代替。 ## 信息不足时 diff --git a/skills/codeguard-markdown/SKILL.md b/skills/codeguard-markdown/SKILL.md index b436166..cc6cdd8 100644 --- a/skills/codeguard-markdown/SKILL.md +++ b/skills/codeguard-markdown/SKILL.md @@ -148,7 +148,10 @@ Markdown Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Markdown 方言和文档生成器规则不同;先读取 `.markdownlint*` 与站点配置。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Markdown 方言和文档生成器规则不同;先读取 `.markdownlint*` 与站点配置。 ## 信息不足时 diff --git a/skills/codeguard-metal/SKILL.md b/skills/codeguard-metal/SKILL.md index f77f21d..5c8181e 100644 --- a/skills/codeguard-metal/SKILL.md +++ b/skills/codeguard-metal/SKILL.md @@ -138,7 +138,10 @@ Metal Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 当前条目标记为 planned;需要 Xcode/metal 编译链证据后才能升级。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 当前条目标记为 planned;需要 Xcode/metal 编译链证据后才能升级。 ## 信息不足时 diff --git a/skills/codeguard-nim/SKILL.md b/skills/codeguard-nim/SKILL.md index 16396c5..d2ae243 100644 --- a/skills/codeguard-nim/SKILL.md +++ b/skills/codeguard-nim/SKILL.md @@ -148,7 +148,10 @@ Nim Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `nim check` 仍依赖项目 defines 与搜索路径;单文件默认上下文可能误报。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `nim check` 仍依赖项目 defines 与搜索路径;单文件默认上下文可能误报。 ## 信息不足时 diff --git a/skills/codeguard-nix/SKILL.md b/skills/codeguard-nix/SKILL.md index 8932f64..0164e1a 100644 --- a/skills/codeguard-nix/SKILL.md +++ b/skills/codeguard-nix/SKILL.md @@ -148,7 +148,10 @@ Nix Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — deadnix 发现未使用表达式,nixpkgs-fmt 只格式化;仍需执行 flake/check 或真实构建。 + +### 领域陷阱与修复 + +1. **领域陷阱** — deadnix 发现未使用表达式,nixpkgs-fmt 只格式化;仍需执行 flake/check 或真实构建。 ## 信息不足时 diff --git a/skills/codeguard-objc/SKILL.md b/skills/codeguard-objc/SKILL.md index 0caca34..5451bc9 100644 --- a/skills/codeguard-objc/SKILL.md +++ b/skills/codeguard-objc/SKILL.md @@ -148,7 +148,10 @@ Objective-C Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Objective-C++ 的 `.mm` 文件必须使用匹配的 SDK 与编译参数,单独 clang-tidy 结果可能失真。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Objective-C++ 的 `.mm` 文件必须使用匹配的 SDK 与编译参数,单独 clang-tidy 结果可能失真。 ## 信息不足时 diff --git a/skills/codeguard-ocaml/SKILL.md b/skills/codeguard-ocaml/SKILL.md index 450b451..7720dc7 100644 --- a/skills/codeguard-ocaml/SKILL.md +++ b/skills/codeguard-ocaml/SKILL.md @@ -148,7 +148,10 @@ OCaml Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — ocamlformat 版本是格式契约的一部分;不同版本可能产生大面积无意义 diff。 + +### 领域陷阱与修复 + +1. **领域陷阱** — ocamlformat 版本是格式契约的一部分;不同版本可能产生大面积无意义 diff。 ## 信息不足时 diff --git a/skills/codeguard-pascal/SKILL.md b/skills/codeguard-pascal/SKILL.md index 1a79722..5c58936 100644 --- a/skills/codeguard-pascal/SKILL.md +++ b/skills/codeguard-pascal/SKILL.md @@ -148,7 +148,10 @@ Pascal / Delphi Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 只有格式化能力时不得声称完成静态检查;仍需编译器或 IDE 诊断。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 只有格式化能力时不得声称完成静态检查;仍需编译器或 IDE 诊断。 ## 信息不足时 diff --git a/skills/codeguard-perl/SKILL.md b/skills/codeguard-perl/SKILL.md index 35f3b63..6fde78d 100644 --- a/skills/codeguard-perl/SKILL.md +++ b/skills/codeguard-perl/SKILL.md @@ -148,7 +148,10 @@ Perl Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Perl::Critic profile 决定严重级别;必须读取项目 `.perlcriticrc`。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Perl::Critic profile 决定严重级别;必须读取项目 `.perlcriticrc`。 ## 信息不足时 diff --git a/skills/codeguard-php/SKILL.md b/skills/codeguard-php/SKILL.md index 2424ee1..898034d 100644 --- a/skills/codeguard-php/SKILL.md +++ b/skills/codeguard-php/SKILL.md @@ -148,7 +148,10 @@ PHP Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `php -l` 只验证语法,不覆盖类型、风格或框架规则;不要把语法通过写成质量全绿。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `php -l` 只验证语法,不覆盖类型、风格或框架规则;不要把语法通过写成质量全绿。 ## 信息不足时 diff --git a/skills/codeguard-powershell/SKILL.md b/skills/codeguard-powershell/SKILL.md index 066d3b1..b003f1d 100644 --- a/skills/codeguard-powershell/SKILL.md +++ b/skills/codeguard-powershell/SKILL.md @@ -148,7 +148,10 @@ PowerShell Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Windows PowerShell 与 PowerShell 7 规则/模块不同,先确认目标运行时。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Windows PowerShell 与 PowerShell 7 规则/模块不同,先确认目标运行时。 ## 信息不足时 diff --git a/skills/codeguard-protobuf/SKILL.md b/skills/codeguard-protobuf/SKILL.md index 11a54d3..77ba250 100644 --- a/skills/codeguard-protobuf/SKILL.md +++ b/skills/codeguard-protobuf/SKILL.md @@ -148,7 +148,10 @@ Protobuf Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Buf lint 通过后仍应检查 breaking changes;风格合规不等于 wire compatibility。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Buf lint 通过后仍应检查 breaking changes;风格合规不等于 wire compatibility。 ## 信息不足时 diff --git a/skills/codeguard-python/SKILL.md b/skills/codeguard-python/SKILL.md index f87b2c2..a90b369 100644 --- a/skills/codeguard-python/SKILL.md +++ b/skills/codeguard-python/SKILL.md @@ -148,8 +148,11 @@ Python Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Ruff 的 `check --fix` 与 `format` 职责不同;需要格式化时两者应分别执行。 -8. **领域陷阱** — 先读取 `pyproject.toml` 的 target-version 与 per-file-ignores,不能用全局默认覆盖项目契约。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Ruff 的 `check --fix` 与 `format` 职责不同;需要格式化时两者应分别执行。 +2. **领域陷阱** — 先读取 `pyproject.toml` 的 target-version 与 per-file-ignores,不能用全局默认覆盖项目契约。 ## 信息不足时 diff --git a/skills/codeguard-r/SKILL.md b/skills/codeguard-r/SKILL.md index c5af0b2..283ef52 100644 --- a/skills/codeguard-r/SKILL.md +++ b/skills/codeguard-r/SKILL.md @@ -148,7 +148,10 @@ R Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — R 包项目与普通脚本目录的 lint 范围不同;包项目还需 R CMD check。 + +### 领域陷阱与修复 + +1. **领域陷阱** — R 包项目与普通脚本目录的 lint 范围不同;包项目还需 R CMD check。 ## 信息不足时 diff --git a/skills/codeguard-ruby/SKILL.md b/skills/codeguard-ruby/SKILL.md index 0801c3d..2e3a380 100644 --- a/skills/codeguard-ruby/SKILL.md +++ b/skills/codeguard-ruby/SKILL.md @@ -148,7 +148,10 @@ Ruby Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 + +### 领域陷阱与修复 + +1. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 ## 信息不足时 diff --git a/skills/codeguard-rust/SKILL.md b/skills/codeguard-rust/SKILL.md index 15f8b73..2ad1e37 100644 --- a/skills/codeguard-rust/SKILL.md +++ b/skills/codeguard-rust/SKILL.md @@ -148,8 +148,11 @@ Rust Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `cargo fmt` 通过不代表 Clippy 通过;格式和语义 lint 是两条独立门禁。 -8. **领域陷阱** — Workspace 必须从根 `Cargo.toml` 执行,否则可能漏掉成员 crate。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `cargo fmt` 通过不代表 Clippy 通过;格式和语义 lint 是两条独立门禁。 +2. **领域陷阱** — Workspace 必须从根 `Cargo.toml` 执行,否则可能漏掉成员 crate。 ## 信息不足时 diff --git a/skills/codeguard-scala/SKILL.md b/skills/codeguard-scala/SKILL.md index 279bf93..74275fb 100644 --- a/skills/codeguard-scala/SKILL.md +++ b/skills/codeguard-scala/SKILL.md @@ -148,7 +148,10 @@ Scala Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 + +### 领域陷阱与修复 + +1. **项目配置优先** — 工具默认值不能覆盖仓库已提交的规则和版本约束。 ## 信息不足时 diff --git a/skills/codeguard-security-code/SKILL.md b/skills/codeguard-security-code/SKILL.md index 1b4f260..e6334e3 100644 --- a/skills/codeguard-security-code/SKILL.md +++ b/skills/codeguard-security-code/SKILL.md @@ -50,12 +50,22 @@ AI 行为:**禁止**把密钥/密码写死进代码或提交;发现已泄露 ### 统一入口(推荐) +先判定引擎:`codeguard --version --format json`。对照见 `codeguard` 技能的 `references/operations/engine-contract.md`。 + +Legacy Python 引擎: + ```bash codeguard cve # 自动检测生态并扫描(maven/node/python/rust) codeguard cve --fix # 允许自动修复(npm audit fix) codeguard cve --severity MEDIUM # 失败阈值调到中危 ``` +Rust 引擎用位置参数选生态,且没有 `--fix` / `--severity`;它当前对质量路径返回未完成(退出码 3),不能用来签发"无漏洞"结论: + +```bash +codeguard cve typescript [path] # / cve rust / cve python +``` + ### 各生态原生命令 ```bash diff --git a/skills/codeguard-shell/SKILL.md b/skills/codeguard-shell/SKILL.md index ecbffd8..691c44f 100644 --- a/skills/codeguard-shell/SKILL.md +++ b/skills/codeguard-shell/SKILL.md @@ -148,7 +148,10 @@ Shell Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — ShellCheck 必须匹配脚本 shebang;bash、sh、zsh 的语义不能混用。 + +### 领域陷阱与修复 + +1. **领域陷阱** — ShellCheck 必须匹配脚本 shebang;bash、sh、zsh 的语义不能混用。 ## 信息不足时 diff --git a/skills/codeguard-solidity/SKILL.md b/skills/codeguard-solidity/SKILL.md index 09dcb79..2ffd5ec 100644 --- a/skills/codeguard-solidity/SKILL.md +++ b/skills/codeguard-solidity/SKILL.md @@ -148,7 +148,10 @@ Solidity Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Solhint 是风格/静态检查,不替代 Slither、Foundry 测试或合约审计。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Solhint 是风格/静态检查,不替代 Slither、Foundry 测试或合约审计。 ## 信息不足时 diff --git a/skills/codeguard-sql/SKILL.md b/skills/codeguard-sql/SKILL.md index 93b030c..e61ed7a 100644 --- a/skills/codeguard-sql/SKILL.md +++ b/skills/codeguard-sql/SKILL.md @@ -148,7 +148,10 @@ SQL Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — SQLFluff 必须设置正确 dialect;未指定方言的通过结果不能用于数据库兼容性结论。 + +### 领域陷阱与修复 + +1. **领域陷阱** — SQLFluff 必须设置正确 dialect;未指定方言的通过结果不能用于数据库兼容性结论。 ## 信息不足时 diff --git a/skills/codeguard-svelte/SKILL.md b/skills/codeguard-svelte/SKILL.md index 8854eb8..452e8a0 100644 --- a/skills/codeguard-svelte/SKILL.md +++ b/skills/codeguard-svelte/SKILL.md @@ -148,7 +148,10 @@ Svelte Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Svelte parser 与 ESLint 主版本需要兼容;解析失败不能降级为跳过。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Svelte parser 与 ESLint 主版本需要兼容;解析失败不能降级为跳过。 ## 信息不足时 diff --git a/skills/codeguard-swift/SKILL.md b/skills/codeguard-swift/SKILL.md index 1d4c826..40889ea 100644 --- a/skills/codeguard-swift/SKILL.md +++ b/skills/codeguard-swift/SKILL.md @@ -148,7 +148,10 @@ Swift Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — SwiftLint 的规则来自仓库配置;不得用个人全局配置覆盖团队 `.swiftlint.yml`。 + +### 领域陷阱与修复 + +1. **领域陷阱** — SwiftLint 的规则来自仓库配置;不得用个人全局配置覆盖团队 `.swiftlint.yml`。 ## 信息不足时 diff --git a/skills/codeguard-terraform/SKILL.md b/skills/codeguard-terraform/SKILL.md index 79d3378..3dcd39a 100644 --- a/skills/codeguard-terraform/SKILL.md +++ b/skills/codeguard-terraform/SKILL.md @@ -148,7 +148,10 @@ Terraform / OpenTofu Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — `terraform fmt`、`terraform validate` 与 TFLint 是三类门禁,不能互相替代。 + +### 领域陷阱与修复 + +1. **领域陷阱** — `terraform fmt`、`terraform validate` 与 TFLint 是三类门禁,不能互相替代。 ## 信息不足时 diff --git a/skills/codeguard-toml/SKILL.md b/skills/codeguard-toml/SKILL.md index cf036c2..f3743dd 100644 --- a/skills/codeguard-toml/SKILL.md +++ b/skills/codeguard-toml/SKILL.md @@ -148,7 +148,10 @@ TOML Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Taplo 格式化会重排布局;先确认生成文件和锁文件是否允许修改。 + +### 领域陷阱与修复 + +1. **领域陷阱** — Taplo 格式化会重排布局;先确认生成文件和锁文件是否允许修改。 ## 信息不足时 diff --git a/skills/codeguard-typescript/SKILL.md b/skills/codeguard-typescript/SKILL.md index 97487c7..78dcb8d 100644 --- a/skills/codeguard-typescript/SKILL.md +++ b/skills/codeguard-typescript/SKILL.md @@ -148,8 +148,11 @@ TypeScript / JavaScript Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — 坚持 `npx --no-install`,避免检查过程静默下载与改变依赖树。 -8. **领域陷阱** — ESLint flat config 与旧 `.eslintrc` 的解析规则不同,先确认项目实际采用哪一套。 + +### 领域陷阱与修复 + +1. **领域陷阱** — 坚持 `npx --no-install`,避免检查过程静默下载与改变依赖树。 +2. **领域陷阱** — ESLint flat config 与旧 `.eslintrc` 的解析规则不同,先确认项目实际采用哪一套。 ## 信息不足时 diff --git a/skills/codeguard-vbnet/SKILL.md b/skills/codeguard-vbnet/SKILL.md index 44342ad..781e8a1 100644 --- a/skills/codeguard-vbnet/SKILL.md +++ b/skills/codeguard-vbnet/SKILL.md @@ -148,7 +148,10 @@ Visual Basic .NET Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — dotnet format 需要解析 solution/project;只有散落 `.vb` 文件时不可宣布通过。 + +### 领域陷阱与修复 + +1. **领域陷阱** — dotnet format 需要解析 solution/project;只有散落 `.vb` 文件时不可宣布通过。 ## 信息不足时 diff --git a/skills/codeguard-vue/SKILL.md b/skills/codeguard-vue/SKILL.md index 3f0f572..ca251cc 100644 --- a/skills/codeguard-vue/SKILL.md +++ b/skills/codeguard-vue/SKILL.md @@ -148,7 +148,10 @@ Vue Codeguard 结果 4. **占位符不是字面参数** — `{file}` 必须替换为真实、已授权路径。 5. **自动修复可能扩大 diff** — 修复后先审查 diff,再运行回归门禁。 6. **生成与 vendor 目录需显式策略** — 不得随意全仓扫描或修改第三方内容。 -7. **领域陷阱** — Vue SFC 需要匹配 Vue 版本的 parser/plugin;普通 ESLint 配置可能跳过 `