职责:本文件是稳定 Finding Registry。同一根因更新原 ID;详细任务覆盖见 Task Results,总体摘要见 Report.md,运行状态见 Dashboard.md。
| Field | Value |
|---|---|
| Audit Run | codews-20260819-705aff0 |
| Base SHA / Branch | 705aff047a1b40b45d6478ee6841a0f3ffc70ccf / master |
| Context Fingerprint | 91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d |
| Registry Last Verified | final report gate |
| Drift Status | valid |
| ID | Severity | Status | Summary | Source Tasks | Last Verified Snapshot |
|---|---|---|---|---|---|
| AUD-001 | P1 | confirmed |
base 缺失时继续并执行部分 workspace,循环时递归溢出 | A01, A03 | 705aff0/91941f7e |
| AUD-002 | P1 | confirmed |
配置路径可越界并成为 clone/Git 目标 | A02, A03 | 705aff0/91941f7e |
| AUD-003 | P2 | confirmed |
force 仅 reset,不 clean/复检,却返回 true | A02 Result | 705aff0/91941f7e |
| AUD-004 | P2 | confirmed |
commit-only clone 拼入 -b undefined |
A03 Result | 705aff0/91941f7e |
| AUD-005 | P1 | confirmed |
顺序切换没有 rollback,失败后留下部分状态 | A03 Result | 705aff0/91941f7e |
| AUD-006 | P2 | confirmed |
clone 动态参数以未引用 shell 字符串执行 | A03 Result | 705aff0/91941f7e |
| AUD-007 | P2 | confirmed |
严格状态检查异常时仍退出 0 | A04 Result | 705aff0/91941f7e |
| AUD-008 | P3 | confirmed |
默认扫描只覆盖一层子目录 | A04 Result | 705aff0/91941f7e |
| AUD-009 | P3 | confirmed |
npm test 是失败占位,HARNESS 命令为空 | A04 Result | 705aff0/91941f7e |
| AUD-010 | P3 | confirmed |
lockfile 根包名、版本、许可证与 package 不一致 | A04 Result | 705aff0/91941f7e |
- 每个 Finding 在自己的
Finding Evidence小节维护path:line、命令/artifact、反证和 Result 链接。 - Evidence 必须绑定该 Finding 的 Snapshot;Dashboard 和 Report 只链接,不复制详细证据。
- 无代码或运行 Evidence 的条目不得标
confirmed。
- Status:
confirmed - Severity:
P1 - Category: 配置继承 / 状态安全
- Confidence: high
- Source Tasks: A01 Result, A03 Result; A04 output review pending
当派生配置引用不存在的 base 时,解析器只告警并返回仅含 overlay 的 workspace;当 base 图成环时,递归没有终止保护并触发栈溢出。
缺失 base 会把要求完整基线的环境降为部分仓库集合并对这些仓库执行 clone/checkout;循环 base 会让相关命令失败。两者都破坏配置继承的 fail-closed 语义。
CLI env → loadConfig → getResolvedWorkspace(raw.base) → returned workspace / RangeError → CLI consumer → Git boundary
- 搜索 schema、visited-set、cycle guard、missing-base throw、调用端二次校验、替代 resolver 和测试,均未找到。
switch的顶层 catch 能报告递归异常,但 missing-base 路径不抛错,因而不受该保护。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A03 completion
src/config.js:34-42— 缺失 base 仅告警,已有 base 直接递归。src/config.js:45-60— overlay 在 base 缺失后仍被合并并返回。src/cli.js:48-66—switch直接把解析结果交给预检和执行。/tmpprobes — 缺失 base 返回部分 workspace;两节点循环触发RangeError。/tmpintegration probe — partial workspace 通过 dirty gate 并只 cloneOnlyOverlay后正常返回。- A01 evidence table
- A03 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: 缺失或成环的 base 图在任何仓库 mutation 前以非零状态终止,并显示可定位的继承链。
- Status:
confirmed - Severity:
P1 - Category: 路径所有权 / 写入边界
- Confidence: high
- Source Tasks: A02 Result, A03 Result
config.path 可通过 .. 或绝对语义解析到 workspaceRoot 外部,且当前没有 containment 或 Git identity 校验阻止该路径成为仓库 cwd。
配置错误或恶意配置可让 clone/status/reset/fetch/checkout/pull/hooks 作用于不属于当前 workspace 的路径或仓库;clone sink 已由受控探针确认。
config.path → resolved workspace → path.resolve(workspaceRoot, path) → repoPath → Git cwd / filesystem target
- 搜索全部路径消费者,未找到 realpath/relative/isAbsolute/containment 或 Git top-level 身份校验。
- 默认 dirty gate 会阻断脏的越界仓库,但干净仓库仍通过,force 分支还可能先 reset。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A03 completion
src/git.js:42-46,81-88— 预检与执行都直接使用 unconstrainedpath.resolve。/tmpprobe —../outside被解析并作为/tmp/codews-audit-A02/outside的 Git cwd。/tmpclone probe —../escaped-target在 workspace 外创建了 Git 仓库,workspace 内对应目标不存在。- A02 evidence table
- A03 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: 每个仓库目标在任何 status/reset/fs/Git/hook 操作前证明位于 canonical workspace root 内,越界配置 fail closed。
- Status:
confirmed - Severity:
P2 - Category: 脏状态门禁 / destructive option
- Confidence: high
- Source Tasks: A02 Result; A03 boundary input
--force 对非空 dirty status 只执行 git reset --hard,既不执行声明中的 clean,也不复检;因此 untracked 文件仍存在时 checkDirty 返回 true。
CLI 随后进入 checkout,可能因残留文件失败,或在成功后保留不属于目标环境的内容;同时输出语义与 force 的 clean 承诺不一致。
switch --force → checkDirty → getRealDirtyStatus → git reset --hard → true → checkoutWorkspace
- Stash 路径在执行后调用
getRealDirtyStatus复检,force 路径没有。 - 搜索所有源码未找到
git clean、force 后复检或替代清理实现。 /tmp探针只触及专用测试仓库;返回 true 后 Git 仍报告 untracked 文件。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A02 completion
src/git.js:50-61— force 仅 reset;只有 stash 分支复检。src/cli.js:56-64— true 直接进入 checkout。ARCHITECTURE.md:65-70,src/cli.js:43-45— 当前产品/CLI clean 契约。/tmpprobe —forceCheckDirty=true且随后仍有?? untracked.txt。- A02 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: force 路径要么按已确认产品语义清理 untracked,要么在残留 dirty status 时返回 false;任何 destructive behavior 必须有回归测试。
- Status:
confirmed - Severity:
P2 - Category: Git clone / commit pinning
- Confidence: high
- Source Tasks: A03 Result
缺失目标仓库且配置只有 commit、没有 branch 时,默认 depth 为 0,但普通 clone 无条件拼接 -b ${branch},实际执行 -b undefined 并在 commit checkout 前失败。
架构文档明确支持跳过 branch 的 pinned commit;该合法配置在首次拉取时不可用。已有仓库路径或显式 depth>0 的 targeted 分支不能覆盖默认首次 clone。
config.commit → depth=0 / branch=undefined → cloneCmd -b undefined → git clone failure → CLI catch
- 显式正 depth 会进入 targeted/full fallback,能够绕开普通 clone;commit-only 默认不会进入该分支。
- 继承配置可能保留 branch,但直接 commit-only 是文档声明的独立能力。
- clone 后的
git checkout commit存在,但永远晚于失败命令。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A03 completion
src/git.js:84-90,138-145— 默认 depth 与无条件-b branchclone 构造。ARCHITECTURE.md:71-74— branch 可省略的 commit pinning 契约。/tmpprobe — 失败命令为git clone ... -b undefined CommitOnly。- A03 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: commit-only 首次 clone 在本地和远端 fixture 中成功落到指定 detached commit,且不构造 undefined branch。
- Status:
confirmed - Severity:
P1 - Category: 多仓生命周期 / 原子性
- Confidence: high
- Source Tasks: A03 Result; A04 reporting review pending
checkoutWorkspace 按顺序立即改变每个仓库;任一后续仓库失败时异常直接传播,之前完成的 clone/checkout/pull/hook 没有 rollback、补偿记录或恢复步骤。
一次失败的多仓切换会留下与目标环境不一致的部分状态,违背项目的“防撕裂”定位;开发者只收到整体失败,没有机器可读的已变更集合。
switch → all-clean gate → repo[0] mutation → repo[1] failure → exception → CLI failure; repo[0] remains mutated
- 搜索 rollback/restore/compensation/transaction/journal 和失败后状态修复,未找到实现。
- CLI catch 会显示失败,但不会还原或枚举已经成功处理的仓库。
/tmp两仓探针确认第二仓失败后第一仓的.git仍存在。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A03 completion
src/git.js:77-83,113-175— 顺序 mutation 循环且无补偿。src/cli.js:63-69— 失败仅进入 catch。ARCHITECTURE.md:61-65— 避免中间撕裂态的产品约束。/tmpprobe — 第二 clone 失败,firstRepoRemains=true。- A03 evidence table
- Handoff:
dev-harness-planning先确定事务/补偿策略,再由dev-harness-auto-fix实现明确范围 - Acceptance direction: 失败注入测试证明切换要么回到原状态,要么生成准确、可执行的部分状态恢复信息,且产品契约同步。
- Status:
confirmed - Severity:
P2 - Category: 子进程参数边界
- Confidence: high
- Source Tasks: A03 Result
缺失仓库的 clone 命令把 URL、branch 和目标 basename 插入单个 shell 字符串;目标路径 basename 含空格时被拆为多个 Git 参数,clone 失败。
合法的自定义目录名称在首次 clone 时不可用;同一构造方式也扩大了所有配置派生 shell operand 的审查面,但本 Finding 只确认空格 tokenization 缺陷。
config.path → repoPath → path.basename(repoPath) → cloneCmd string → /bin/sh tokenization → git clone failure
- 已存在仓库通过独立
cwd执行 Git,不需要把目录名放入命令,因此该路径不受同一空格问题影响。 - 缺失仓库 clone 没有 argv/spawn 或 quoting 替代实现。
post_hooks的信任语义与此不同;未用它扩大安全结论。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A03 completion
src/git.js:11-18,138-141— 字符串 shell 执行与未引用 clone operands。/tmpprobe —Repo With Space出现在未引用命令中并导致 clone 失败。- A03 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: 用 argv 形式执行 Git;覆盖带空格的目标路径与 URL,并验证参数不会被 shell 重新解释。
- Status:
confirmed - Severity:
P2 - Category: 状态契约 / 自动化退出码
- Confidence: high
- Source Tasks: A04 Result
配置感知的 status -e 只打印 missing、branch/commit mismatch、dirty 或 error 状态,不聚合失败结果;CLI action 返回后进程仍以 0 退出。
脚本和 CI 无法用退出码判断 workspace 是否符合环境配置,可能把缺仓、错分支或读取失败误当作验证成功。
codews status -e → getResolvedWorkspace → statusWorkspace → printed mismatch/missing/error → undefined return → process exit 0
- 缺失配置文件会显式
process.exit(1),但仓库级 mismatch/missing/error 不会。 - 搜索未找到 aggregate boolean、throw、exitCode 或另一条 strict verification 命令。
/tmp探针同时包含错分支和缺失仓库,最终exitCode=0。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A04 completion
src/git.js:179-212— 所有异常状态仅格式化输出。src/cli.js:73-88— 调用后没有返回值检查或退出码。/tmpprobe — mismatch + missing 输出后exitCode=0。- A04 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: status 聚合每仓结果;
-e在 missing/dirty/mismatch/error 时非零退出,并保留人类可读明细与自动化回归。
- Status:
confirmed - Severity:
P3 - Category: 仓库发现 / 状态覆盖
- Confidence: high
- Source Tasks: A04 Result
无 -e 的 status 只检查当前目录与直接子目录,因而不会发现第二层及更深的 Git 仓库。
在项目已支持嵌套仓库的情况下,默认状态视图会漏报深层仓库的 branch 和 dirty 状态,给开发者不完整的工作区视图。
codews status → statusWorkspace(null) → readdirSync(currentDir) → immediate child check only
status -e会按配置路径检查嵌套仓库,但需要显式环境且不修复默认命令的覆盖承诺。- 配置枚举自身是递归的,说明递归能力存在但未用于 repo discovery。
/tmp两层嵌套仓库探针确认 Git 仓库存在,而默认扫描没有输出它。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A04 completion
src/git.js:213-242— 只遍历 immediate subdirectories。/tmpprobe —Level1/Level2/.git存在,输出只含扫描标题且退出 0。- A04 evidence table
- Handoff:
dev-harness-auto-fix - Acceptance direction: 明确默认发现边界并覆盖嵌套 fixture;若承诺“所有仓库”,递归扫描需有 symlink、vendor、性能和重复仓库保护。
- Status:
confirmed - Severity:
P3 - Category: 验证契约
- Confidence: high
- Source Tasks: A04 Result
仓库唯一的 npm test script 是固定输出错误并 exit 1 的占位命令,且 Context/HARNESS 未找到 test、quick、bugfix 或 full 验证入口。
涉及 reset、clone、checkout、路径和 shell 边界的回归无法通过统一入口验证;本次审计只能依赖一次性受控探针。
package scripts / repository files → Context evidence → HARNESS command mapping → no successful verification command
- 搜索了 package scripts、全部仓库文件、tests 和 CI 配置;没有替代入口。
- 未把安装或运行命令冒充测试命令。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A04 completion
package.json:9-10— test 是失败占位。HARNESS.md:17-30— test/quick/bugfix/full 全为 Unknown。- 仓库文件清单 — 不存在 tests 或 CI 配置。
- A04 evidence table
- Handoff:
dev-harness-commands - Acceptance direction: 建立可重复的 quick/bugfix/full 入口,至少覆盖配置继承、路径 containment、dirty gate 与本地 Git 生命周期 fixture。
- Status:
confirmed - Severity:
P3 - Category: 包元数据 / 发布一致性
- Confidence: high
- Source Tasks: A04 Result
package-lock.json 的根包仍声明 codeworkspace@1.0.0 和 ISC,而 package.json 已是 codews-cli@1.2.0 和 MIT。
依赖安装工具、版本审计和发布自动化看到互相冲突的根包身份与许可证,增加不可复现或错误发布元数据的风险。
package.json release identity ↔ package-lock root package record → npm/release tooling
- Commander 依赖版本在两份文件中一致,因此不是依赖解析漂移。
- CLI 硬编码版本与 package.json 当前同为 1.2.0;不把未来漂移风险计入本 Finding。
- Run / Base SHA / Branch:
codews-20260819-705aff0/705aff047a1b40b45d6478ee6841a0f3ffc70ccf/master - Context / Dirty Fingerprint:
91941f7e01fae2887ea110260295a3e9a0cc4140ff710e4ffb636d3e756a788d/ddf17939ff1d0855eddf6c0df61cc43f3bee6450b88647f75b9cc4796b0370ec - Last verified: A04 completion
package.json:2-3,25— 当前根包名、版本和许可证。package-lock.json:2-10— 旧的根包元数据。- A04 evidence table
- Handoff:
dev-harness-git-workflow - Acceptance direction: 在确认发布身份后重建/刷新 lockfile,验证 name/version/license 与 package.json 一致且依赖树不变。
confirmed必须有当前 Snapshot、代码或运行 Evidence、反证检查和完成的 cross-module reconciliation。漂移后移入stale,不得继续作为当前事实。