dsh-anic — AI-Native Iteration Cycle(DSH 插件)
ANIC 技能(.dsh/skills/ai-native-iteration-cycle/)插件化的独立工程。可行性研究、
需求分析、架构与里程碑见 docs/anic/(README + 01–17 + spike 报告)。
定位:通用插件(零项目假设)。本仓库只是它的第一个验证场——快照数据来自本仓库真实的
.cycles/,但生成器只读结构化字段(INV-21 合规),不解析自由文本。
安装(DSH ≥ 0.2.0-rc.2,网页端与桌面端)
dsh plugin --profile <你的 profile> add github:<owner>/dsh-anic
安装后重启对应宿主(bundle 在启动时装载),会话页即出现 ANIC 顶层标签。插件声明
engines.dsh: ">=0.2.0-rc.2 <0.4.0-0" 与 peerDependencies: @deepseek-ai/dsh——
宿主不在该范围时 pnpm 会先拒绝。首次使用时插件会把内联技能(assets/skill/,含
SHA-256 安装清单)自动安装到工作区 .dsh/skills/ai-native-iteration-cycle/;anic_install
工具与 POST /anic/skill/install 路由提供等价的显式安装 / 状态查询 / 损坏修复入口。
- 24 个
anic_*LLM 工具(含 2 个渐进式披露加载器 anic_tool_detail / anic_tools_search)(评估 / 门禁 / 自举 / 跨项目自举「举他」anic_bootstrap_other/ 流程状态机 / 技能网关 / 完整性修复 / 自主级升级 / 热重载anic_reload_self) - 77 个 HTTP 路由注册(六域分区:data / cycle / review / evolution / governance / self;含 flows/native/truth-audit/dual/skill 域扩展 + cycle-72 闭环体检
/anic/api/closure-audit+ cycle-80 热重载POST /anic/api/reload+ cycle-82 配置与路径GET/POST /anic/api/config+ cycle-83 路径覆盖POST /anic/api/config/paths与备份回滚POST /anic/api/config/rollback+ cycle-83 产物治理/anic/api/archive/baseline+ cycle-89 跨项目自举POST /anic/self/bootstrap-other、技术债分诊POST /anic/api/tech-debt/triage、流程归属矩阵GET /anic/api/flows/matrix、生命周期指标GET /anic/api/flows/lifecycle与 cycle-91 开关解析态GET /anic/api/flows/resolved、cycle-93 披露运行时读数GET /anic/api/disclosure+ cycle-101 有界视图读数GET /anic/api/flows/view) - 白盒面板:工作流图 + 实时调用流 + 自主级仪表带 + 技能健康 + 门禁账本 + HITL 队列
- cycle-91 新增:工作流图可达性(
next:顺序边 + Tarjan SCC 断环 ⇒ 宏观主线真实可推)- 节点健康度(
testReport的通过/失败/错误进图:分段条 + 数字摘要) - 边语义图例(6 种边类型的线型可查)+ 开关解析态(客户端可见工作区/部署层的真实生效值)
- 节点健康度(
- cycle-91 治本:flow-tracker append-only 历史(统计样本不再被滚动淘汰截断)
- 流程
reset真实触发器(IDLE从此可达)+ 三个空心开关接上运行时消费面
- 流程
截图见 docs/screenshots/(市场详情页通过仓库根 screenshots.json 自动展示)。
不用 DSH?技能-only 分发(npx)
Claude Code / Codex / 任意 MCP 客户端用户可不装宿主,一条命令把技能装进项目:
npx dsh-anic init <project-dir> --name "<项目名>" [--framework claude|codex] [--dry-run]
只做两件事(「插件装引擎,入口装工作流」):① assets/skill/ 65 文件 → <project-dir>/.dsh/skills/ai-native-iteration-cycle/(与插件内 anic_install 同构落点,含幂等与版本锚点检测)② .cycles/ 工作流骨架脚手架。之后让模型读 SKILL.md,或把 scripts/mcp-server.mjs(15 工具)注册为 MCP server。零依赖,--dry-run 只打印不写盘。
当前形态(M1..M11 + R3 流程状态机;cycle-71 时点 v0.40.0)
阻断级 P0 修复 + 用户核心 UI 要求 + 三路研究(v0.40.0 系列 / cycle-71): ① H2 扫描死循环 P0 闭环——
classifyDestructiveLine对非全局正则调exec()循环: 非全局exec忽略lastIndex、每次返回同一命中且lastIndex恒 0,零宽保护永不触发 → 死循环;后果实测两处:pnpm run test跑完 121/122 文件后永不收敛(挂死 >25min),checkH2同路径可挂住宿主进程。修复 = 模块级全局副本 +matchAll(克隆迭代、天然有界)。 补全第二缺陷:设计定义引用上下文含「注释/文档块」而首版只做引号 → 本体 JSDoc 说明行 自触发熔断;补四类(散文行/字符串///注释/行内代码)+ URL scheme 漏报面防线 + 自免疫钉。 ② mcp-server 命令注入(安全 P0)——execSync模板串拼接projectDir,独立复核确认 真实可利用(恶意路径下写出哨兵);修复 =spawnSyncargv 形态 + 形状校验 + 反向自检。 ③ 自举「缺前置被折叠成 0 分」(L4 收敛不可能的结构根因)——专用前置码 + HTTP 412; 伴生取证面缺位(self 端点零 FlowTracker)修复并真机复核新增记录。 ④ 用户核心 UI 要求——面板默认只展开最近一次已完成调用(10 分区收为 8 闭/2 开)+ 「最近完成全貌卡」(七段,⑤⑥ 按 INV-27 刻意留空)+ 折叠记忆(真机跨 2 轮 tick 不弹回)。 ⑤ DSH 规范校正——宿主实测基线 0.2.1-rc.2(非长期所写 0.2.0-rc.2)+ B9 作废 (engines.dsh 优先且单独决定)+ 桌面端实为dsh-app://同源代理(非file://)+ B12-B18 新变更类。 ⑥ 文档册 17→19:新增《工具面参考》(19 工具零覆盖 + 册⇄源码双向契约)与 《自举与健康取证》(取证面/时间窗根因/「能力就位≠真机收敛」)。 ⑦ 测试塔 129 文件 / 1632 用例(本轮 +8 文件 +117 用例);新增 5 条契约守卫(双锚/同源/版本锚/ 三集合/文档⇄源码)。G0-G3 全过;真机 Chrome DevTools MCP 验证 PASS。 诚实边界:未宣称自举已收敛(本轮修根因);白盒四元组「流程流向/运行产物」两元仍缺 (调用与 cycle/phase/门禁零 join key);j0-probe 因@playwright/test不可达未跑(改 MCP 等价验证)。研究驱动深挖轮(v0.39.0 / cycle-40):迁移合法性矩阵 5/5 收口(
validateRecordShape记录类型白名单 +cycleRunner.advanceCycle哈希链 fail-closed 校验);文档审计 P0×2/P1×8/P2×5/P3×6 全修(G-IND 颠倒 / inject 四元 / 62 端点闭合 / flows 域补录);KB 吸收toolsSlot(timeoutMs/isConcurrencySafe);UI 研究 Top1/Top3(usePanelFetch退避 + abort + 稳定 key);iterate 超时参数化 + Post-Verify 环;技能 v2.3.0→2.4.0。研究驱动优化轮(v0.38.0 / cycle-39):P0-DAG-PARSE——stateMachine 解析器只认纯文本边+大写 Gate,真实 workflow-graph.yaml(本仓/技能模板/测试场地三处同形状)是流式边+小写 gate → cycle 状态机全链空转(advance 前驱检查恒过、gate 批准检查恒不触发);修复双边形态+类型归一+迁移合法性矩阵 3/5 条(门匹配/done 拒绝/前驱边),新契约
tests/contract/stateMachineGraphShape.test.ts13 用例。quick-validate 网关相对路径自动解析(flow #29 实证修复);journey_coverage 门禁双侧实现(gate-check.mjs + gateEngine,差分钉死)+ chaos_coverage 装饰性声明删除;W-3 全档测试报告行投影进节点详情;19/19 工具 presentCall 完备 + TerminalCallView 官方字段名(summary→description,DSH 规范审计 P1);skillRoute 4 路由行为测试补齐(唯一零行为测试路由文件);技能 v2.2.0→2.3.0;文档数字契约钉死(readmeNumbers.test.ts:README 数字==glob 计数)。技能目录可见性 + 生态对照 + L4 架构决策(v0.36.0 / cycle-37):DSH 规范审计发现 SKILL.md description 折叠后 800 字符 > 官方
catalogDescriptionMaxLength(500,skills.md:233)——模型可见目录里触发词整段被截(真机实证);重写为 455 字符触发词前置 + 新契约守卫tests/contract/skillCatalogDescription.test.ts(4 用例钉死:≤500/Triggers 前置/双语触发面/whenToUse 完整)。生态研究(anthropics/skills + superpowers + ECC)吸收三件:SKILL.md 补「会话恢复协议」小节(planning-with-files 模式)、auto-cycle.md 补「任务级派遣编排」(superpowers 子代理编排:2-5 分钟任务粒度 + fresh context + 两段评审)、task-list 模板补派遣记录表(G1 判定免疫——首列状态约定不变)。L4 自主性原生化决策书落docs/anic/18-L4自主性原生化评估与生态对照研究.md(结论:维持「插件承载状态机与引擎 + 技能脚本正典双实现 + 差分契约防漂移」路线,不全面原生化——双真相源守卫是差异化资产)。docs/anic 15 号文档过时表刷新 + 18 号新增;README 数字校准(19 工具/62 路由/106 测试文件——cycle-39 复核修正)。布局根解析统一 + 自举链双缺陷根除(v0.17.0 / cycle-15,P0-DIR-ROOT/D-1415):真机验证暴露 truthAuditRoute 的
resolve(file,'../../../')在 dist 单文件布局下审计了仓库父目录(T1-T4 全 MISSING、version vunknown——且源码布局下也错,两种布局从未正确工作过;旧测试只断言路由注册故恒绿),dualBootstrap 同病。新建src/host/pluginRoot.ts标记驱动向上查找(package.json name=dsh-anic),四处调用点(truthAudit/dualBootstrap/agents/skill)统一,根未解析双路由显式 500;pluginRoot 9 用例双布局钉死 + truthAuditRouteBehavior 行为级回归钉(T2 version=真实版本、15 cards——修复前必红)。真机复验 truth-audit T1-T4 全 100、dual-evaluate 双向真实数据。收口期再抓两枚同型漏网:band-detector.mjs:141 越界变量v(ReferenceError——规则 2 首真触发即崩,历史快照统计量漂移使其「时好时坏」)+ eval-runner checkComplexity|| truefail-open(D-1404 漏网同型)→ execFileSync 直跑非零取 stdout。E1/E2 自举诚实化(intent 模板桩 → 真实三件套)。自举评估 15 PASS + 1 结构性 SKIP(历史最佳)。自举评估链主平台复活(v0.16.0 / cycle-14,D-1401~D-1408):eval-runner 的质量门在 Windows(DSH 宿主主平台)上此前系统性失明——四子检查
grep|wcshell-ism 恒 SKIP、环检测 madge 恒 SKIP 且真环被|| true吞掉(fail-open)、依赖审计 npm audit 无 true 命令恒 SKIP、秘钥扫描 138 命中全假阳性(design-token 惯用形态误伤)。本轮全部根治:scanSourceLines 纯 Node 行扫描、importGraph 纯 Node import 图 + DFS 三色环检测(scripts/lib/importGraph.mjs,零外部依赖)、pnpm audit 回退链(npmmirror 无 bulk 端点 → registry.npmjs.org)、秘钥两段式精筛(pre 粗筛 + 紧邻赋值精筛)。供应链修复:tinypool critical×2 + valibot high(全 dev 链)经 pnpm-workspace.yaml overrides 清零(824 包污染锁 → 239 包)。自证闭环:修复后首次真实环检测在自家仓抓到 truthAudit↔truthAuditChecks 真环(type 回边),类型下沉 truthAuditTypes.ts 断环复验 PASS。自举审计 16 维度 14 PASS + 2 结构性 SKIP(历史最佳);69 文件 852 用例全绿。双格式报告解析 + 抖动加固(v0.15.0 / cycle-13,D-1103/F-T1/F-T2):auto-fix 报告计数此前只认旧键值「失败:N」,而正典模板与 G2 门禁规定的是 §2 汇总管道表「| 失败 | N |」——两套正典解析器互不相交,正典报告被读成 0(fail-open 假绿);现技能脚本(auto-fix-loop.mjs v1.8.5-fork)与原生引擎(autoFixAnalyze.parseReportContent)双侧支持管道表优先 + 键值回退,且引擎侧重复解析器消重为单一源;差分第 4 场景红→绿实证(命令过 + 正典报告 3 失败 → 双侧 circuit/exit 2/repeating),真实宿主(3080)script 模式端到端 409 circuit。F-T1:atomicWriteFileSync rename 瞬时错误重试(EPERM/EACCES 类,1/5/25ms 退避);F-T2:macroPhaseDifferential 补 afterEach 清理(原先每轮泄漏 ~20 个临时目录)。69 文件 849 用例全绿。
终态重入四流程修复(v0.14.0 / cycle-12,D-1101):task 型流程终态后可重新入轮——gate-check(PASSED/FAILED→RUNNING)、archive(DONE→RUNNING)、hitl(PASSED/FAILED→RUNNING)三流程补 run 边,macro-phase 经正典比对排除(maintain 是末相无 reset 语义);
tests/unit/flowTerminalReentry.test.ts四层 9 用例(描述子齐全性/机器层放行/集成层二轮/排除钉)。桌面端宿主实证(D-1102):桌面宿主上插件 fiberPhase active、anic_* 工具真实执行、org-status/workflow-snapshot 路由 200、plugin_manager 禁用→启用往返无 duplicate-route(R12 HMR 安全性真机实证);v0.13.0+ 新面受 Node 模块缓存限制需宿主自然重启生效。67 文件 837 用例全绿。客户端贡献:
conversation.view顶层标签ANIC(kind:'list'可叠加,不顶掉既有标签)。渲染真实
.cycles/:嵌入快照随构建更新(基线重置后:活跃 5 轮 / 归档 78 轮 / 当前 38 节点 / 48 边 / 折叠 68 组账本 / autonomy L4,以 smoke 遥测为准)。窗口默认只放最近 8 轮(.cycles/config.yml的snapshotWindow,合法区间 1–64),被折叠的账本组在evt:folded、归档轮次在evt:archived节点如实可见——「避免过度产物影响判断」的可视化形态。产物治理(cycle-83 能力 · cycle-86 首次真机执行):
POST /anic/api/archive/baseline两段式(dryRun 与真写共用同一判据)把可完成的历史轮搬进.cycles/archive/,账本只读不动(INV-9),落manifest.json+baseline-reset.json审计;未完成轮逐个点名保留。本仓实测归档 77 轮、扫描面降 94%、账本 210 条与链头零变化。图谱可导航(cycle-84/85):搜索跳转(回车直达 + 命中胶囊 + 计数)、↑/↓ 遍历候选(
aria-current单值)、双击节点上下游路径追溯(双向有界 BFS,root/up/down 三色描边 + 状态条 + 三条退出通道)、双击空白适配视图、hover 抬升与追溯投影;全部带data-anic-*可断言锚点与 jsdom 契约。健康度语义(cycle-85):裁决类脚本的
exit 1(门禁正确拒绝)不再计为故障——健康面同时输出「原始成功率 / 有效成功率 / 有效负裁决次数」三个数,建议严重度按有效成功率定。本仓实测:gate-check由 degraded 纠正为 healthy(有效负裁决 15 次),eval-runner由「假故障」纠正为 expensive(真的慢,均值 69s)。流程状态机(R3):FlowRegistry 5 流程(gate-check/macro-phase/archive/hitl/auto-fix)专属状态机 + 模块引擎;面板 flows 分区实时可视化;Tier-2 多智能体 LLM 评审通道(真模型逐门逐角色)。
零 bundle 依赖(react 之外全部外置或内联);SVG 渲染,无布局引擎。
M1 四路由 + 三面板区 + 九开关 + 十五 agent 卡
| 域 | 路由 / 面板 | 说明 |
|---|---|---|
| V 可视化 | GET /anic/api/workflow-snapshot |
现场构建快照(与嵌入快照共用 snapshotCore.ts),no-store + CORS + digest 头 |
| W 白盒 | GET /anic/api/step-trace |
四源投影(workflow-graph × state × ledger × cycle 工件);cycle 归属只用位置法(INV-27) |
| 自检 | GET /anic/api/self-check |
6 探针(INV-13 确定性 / INV-21 结构化 / INV-25 配置单入口 / agent 卡装载 / INV-18 投影可重算 / INV-26 只读) |
| B 自举 | POST /anic/self/init |
flow.selfInit 门控;定位技能 init-workflow.mjs 并 spawnSync;幂等(已有 config→409) |
| 面板 | 工具栏三动作 | 刷新(data-anic-refresh)/ 偏好抽屉(data-anic-prefs-toggle)/ 自举(data-anic-self-init) |
| 开关 | src/shared/flows.ts |
9 flow 开关三层合并(user prefs > workspace config > deployment > 默认 true);核心链路不可关(INV-29) |
| agent | assets/agents/*.json |
5 门 × 3 角色 = 15 张资产卡(闭合 JSON 输出协议 + evidenceIds 禁编造 + doubt 语义,INV-23) |
M2-a 运行时接管:状态机 + 账本 + 多栈 + cycle 生命周期
| 域 | 路由 / 模块 | 说明 |
|---|---|---|
| F1 状态机 | host/runtime/stateMachine.ts |
parseWorkflowGraph / initState / advance(前驱检查 + gate 需 gateApproved)/ checkStrict |
| F2 账本 | host/runtime/ledger.ts |
哈希链(sha256 canonical 六字段键序)/ appendEntry 原子写 / verifyLedger / isDuplicate 幂等查重 |
| F3 多栈 | host/runtime/stackProbe.ts |
探测 node/cargo/python/go/generic → 生成建议 config.yml |
| F8 cycle | host/runtime/cycleRunner.ts |
initCycle / advanceCycle(状态机 + 账本)/ closeCycle(严格门禁 + 账本验证)/ listCycles 数值序 |
| F15 单写者 | POST /anic/api/ledger/append |
幂等查重 + 哈希链追加;与 tool 面同一路径 |
| 路由 | 5 cycle + 3 ledger + 1 stack-probe | POST /anic/cycle/{init,advance,close} + GET /anic/cycle/{state,list} + GET /anic/api/ledger + POST /anic/api/ledger/append + GET /anic/api/ledger/verify + GET /anic/api/stack-probe |
- 配置管理:
host/config.ts唯一 loader(canonical.cycles/config.yml→ legacycycle-config.yml告警 → 缺失响亮,INV-25)。 - 日志错误:
host/logger.tsscoped 前缀[dsh-anic]+ requestId 贯穿;四域错误码ANIC_{ROUTE|FETCH|RENDER|CONFIG}_*;诊断域隔离(插件错误永不写.cycles/incidents/,INV-26)。 - 原子写:
shared/fs-safe.tswrite-then-rename(INV-7 前置)。 - M2-b 分段账本:
host/runtime/segmentedLedger.tshead.json + seg-NNNNNN.jsonl 只追加(O(1) append,消除单文件 O(n²) 重写);4 路由 init/append/verify/read。 - M3 可视化完整版:
client/features/graph/gateColors.ts三态色(PASS 绿/FAIL 红/doubt 黄/pending 灰)+ FAIL 脉冲 CSS(prefers-reduced-motion 禁用)+ 控制带 2σ/3σ + 节点详情抽屉;renderGraph接受 verdicts map + onNodeClick。 - M4 LLM 评审引擎(条件):
host/llm/reviewEngine.tsprobeLlm(ctx.get('llm', false),INV-24 不进 inject)+ 闭合 JSON 协议校验(INV-23 fail-closed → doubt)+ Tier-1 启发式降级(诚实标注「非模型评审」);POST /anic/review。 - M5 动态自主进化引擎:
host/evolution/trustModel.ts信任度累积(阈值 L2→L3 ≥70 / L3→L4 ≥85)+autonomyGovernor.ts8 熔断(先修复后降级)+patchEngine.tstech-debt 提案(不自我改码 R-31);4 路由。 - M5-a 规模治理:
host/governance/Archiver(移动不删除)+ Budget(三级阈值)+ Sweep(删空+过期 .tmp)+ Prune(孤儿检测);4 路由。 - M6 通用性收口 v0.1.0:i18n 双语(zh + en,panel/flows/gate 三域)+ CHANGELOG.md + private:false。
- M7 自举闭环:
host/selfBootstrap.ts状态机 IDLE→EVALUATING→GATE_CHECKING→FIXING→VERIFYING→CONVERGED/EXHAUSTED +host/skillInvoker.ts15 脚本白名单 + 路径遍历防护;4 路由。 - M8 跨项目+DSH 工具:
host/tools.ts+toolsPointerGateway.ts+toolsSkillGateway.ts+toolsEvolutionGateway.ts+toolsFlowsGateway.ts共 16 DSH 工具(anic_evaluate/iterate/gate_check/bootstrap/snapshot/self_check/hitl/install/status/skill/bootstrap_cycle/bootstrap_analyze/autonomy_downgrade/flows_gate_check/flows_advance/flows_archive)+ skillRoute 4 路由;inject=['tools','webServer','sessions','skills']。 - M9 结构优化:
host/routes/routeContext.ts提取共享依赖 +routes/index.ts瘦身至 ~75 行纯组合 + 六域分区(data/cycle/review/evolution/governance/self)。 - M10 发布 v0.2.0:CHANGELOG + README + package.json 0.2.0。
- M11 技能内联+原生等价物+双向自举:
assets/skill/65 文件内联(安装即用)+skillInstallRoute自动安装/更新 + 7 原生模块(hitlAudit/bandDetector/orgStatus/factBaseVerify/planSync/multiAgentGate/fixLoop)+dualBootstrap.ts双向自举(插件⇄技能)+ org 面板。 - 真实性审计(自举目标):
host/evolution/truthAudit.ts+truthAuditChecks.ts— T1 真实性(文件存在)/ T2 准确性(计数+版本)/ T3 结构性(250 行模块限制)/ T4 逻辑性(路由注册+工具数);dualBootstrap评估权重 60% 基线 + 40% 审计分;GET/anic/api/truth-audit。 - 数据结构优化:snapshotCore O(n²)→O(n)(Map 替 find/some);stateMachine O(n)→O(1)(buildGraphIndex nodeMap+predecessors 邻接表)。
- 适配器层:
adapters/index.ts— FsAdapter/ExecAdapter/HttpAdapter 三接口隔离外部依赖(Q5 架构约束,eval-runner PASS)+ spawnSync env 清洗(*KEY*/*SECRET*/*TOKEN*/*PASSWORD*剥除)。 - 模块化:WorkflowGraphPanel 303→~140 行,纯渲染提取至
features/graph/renderGraph.ts(155 行)。 - P0-BODY 真实宿主请求体修复(v0.8.0):真实宿主 webServer 的 handler 收到的是 Node IncomingMessage 流(
dsh-host-webserver无 body 解析层),旧parseBody只读req.body→ 11 个 POST 路由的体参数在真实宿主全部静默丢弃(桩宿主挂对象故测试全绿)。修复:routeContext.ts readBody()双形态兼容(桩对象同步 / 流式 on('data')/'end'/'error'/'close' 收集 + 1MB 上限),11 个 POST handler 全部改造;回归守卫tests/unit/httpBodyStreaming.test.ts(流式分片/error settle/上限/路由级端到端)。 - R3 阶段 2 流程状态机引擎(v0.8.0):
host/flows/—contracts.ts(L0:FlowDescriptor/FlowTransition/GuardFn 引用键禁内联闭包/ModuleEngine long|per-call)+machine.ts(L1 纯函数:apply 唯一写点/replayEvents 崩溃恢复 INV-13/未知守卫 fail-closed)+registry.ts(L3:同 id 首个胜出 no-op disposer,HMR 语义)+persistence.ts(L2:投影唯一写者原子写,禁成第二真相源)+gateCheckFlow.ts(首个实例:IDLE→RUNNING→PASSED/FAILED,守卫消费引擎裁决 INV-28)+gateCheckRunners.ts(script 正典/native 原生/diff 双跑对账,双不写账本防双写)+gateEngine.ts/gateArtifacts.ts/gateTypes.ts(G0-G3 判定逐字对齐技能 gate-check.mjs);3 路由(GET /anic/flows、GET /anic/flows/state、POST /anic/flows/gate-check/run)+ 第 14 个工具anic_flows_gate_check;差分契约tests/contract/flowDifferential.test.ts(同 fixture native vs script 逐字段全等)+ 真实宿主 diff 模式 drift=null 现场实证。 - R3 阶段 4 前半 Tier-2 LLM 评审通道(v0.11.0):
multiAgentTier2.ts逐门逐角色真模型评审(证据接地 INV-23 幻觉引用过滤 + 授权带越界不烧配额 + 单角色失败独立降级)+llm/jsonExtract.ts(围栏/花括号平衡扫描,闭合 schema 不放松)+llm/providerResolve.ts(宿主无名 default 事实下的诚实解析)+ LlmChunk/GenerateOptions 契约按 dsh-llm 权威类型重写(systemPrompt 槽位 + ContentBlock[] + reason.failure 终点)+GET /anic/flows/status一站式 + 面板 flows 分区(第 10 开关)+ org band.weViolations(rule:number)接线;真机 15 角色全走真 LLM 通道实证(MISSING_CREDENTIAL 诚实终态)。 - R3 阶段 4 后半 HITL 三段修复流程(v0.12.0):
host/governance/hitlFix.ts(H1-H4 修复器逐字对齐技能 hitl-audit.mjs:H1 .gitignore 模式族追加 / H2 git init 基线或拒绝 / H3 指向 gate-check 或建审计日志 / H4 append-only 永拒——改历史毁哈希链)+hitlThreePhase.ts(Phase0 全审计落审计行 → 无熔断二元判定 → Phase1 仅熔断门修复 → Phase2 全修复成功才重审;fix 失败不重审不落 incident)+flows/hitlFlow.ts(第 4 流程状态机:IDLE→RUNNING→PASSED/FAILED/BLOCKED,BLOCKED→RUNNING 重试恢复边;投影flows/hitl.json)+ 路由POST /anic/flows/hitl/run(状态码语义 pass→200/fail→422/circuit→409)+ 第 16 工具anic_flows_hitl+ 面板 flows 分区卡片;存量 P1 连带修复:latestCycleDir绝对路径 bug(H3 审计日志检查自 cycle-5 起从未工作过)+ J0-2 遥测陈旧(syncTelemetryCounts——live 到达后遥测如实反映渲染面,「渲染=遥测」强不变量);差分契约tests/contract/hitlDifferential.test.ts(孪生夹具 native vs script 逐字节/逐字段对账);真机双模式实证(BLOCKED/exit 2/suggestedNextStep=autonomy-fallback,面板卡片实时态)。 - R3 阶段 5 自动修复循环流程(v0.13.0):
evolution/autoFixAnalyze.ts(纯函数:报告计数解析/失败识别/repeating-cascading-transient 三模式,技能 mjs:57-140 逐字)+autoFixEngine.ts(IO+编排:test→失败识别→retest→判定主循环 + onProgress 逐轮回调)+autoFixReport.ts(落盘三件:审计行/incident/修复报告)+flows/autoFixFlow.ts(第 5 流程状态机:IDLE→RUNNING→ITERATING↺→CONVERGED/CIRCUIT;ITERATING 自环轨迹进投影历史——迭代过程可回放;终态重入边 CONVERGED/CIRCUIT→RUNNING——真机发现「终态不可重入」框架级 P1 后当场修复)+ 路由POST /anic/flows/auto-fix/run+ 第 17 工具anic_flows_auto_fix+ 差分孪生契约;双 fork 修复(上游技能缺陷):H3 per-gate-latest(gate-check 去重×末4条窗口互斥——cycle-10 发现的结构性误熔断,双侧同步修)+ auto-fix-loop readdirSync 未 import(test-reports 目录存在时 ReferenceError,真机复现修复);面板轮询修复(usePolledSection.ts):org/flows 分区从静态单拉改 4s 轮询——POST 后 6s 内卡片 CIRCUIT→CONVERGED 实时更新实证(动态白盒补全)。 - 冒烟 21/21 PASS · 规范门 12/12 · vitest 105 文件全绿(见测试体系表) · typecheck 0/0 ·(历史 v0.3.0 时点行,当前以 CHANGELOG 为准)。
热加载与热更新(四层机制)
| 层 | 机制 | 生效方式 |
|---|---|---|
| host bundle 热重载 | 宿主 ctx.hmr(dsh-hmr 已启用时)重组合 profile 并替换运行中的插件实例——link: 安装下 dist/ 正是它的 "linked package targets" 命中面 |
anic_reload_self(工具,参数 reason)或 POST /anic/api/reload;先 build(dist 落后 src 会被 refused 拒绝,可用 force 仅演示时跳过)→ 触发后新实例自动完成 in-flight 握手;headless/SDK profile 无 hmr ⇒ 返回 unavailable(诚实降级,绝不假装成功) |
| bundle 热更新 | link: 安装(Junction 指向本工程)——宿主加载的就是 dist/client.js 本体 |
pnpm --dir dsh-anic run build:watch(tsdown --watch 重建 + 自动重 wrap)→ 保存源码 → 浏览器刷新即生效;无需重装/重启宿主 |
| 数据热更新 | 宿主路由现场构建快照 + 面板 live fetch + 「刷新」按钮 | .cycles/ 一变(新 cycle/新账本事件),点刷新即见;路由不可用时自动回退嵌入快照 |
| 运行时热卸载 | 遥测句柄 + kill-switch | DevTools:__ANIC_TAB_SPIKE__.unregister() / .reregister();localStorage['anic-workflow-tab']='off' 零注册 |
四层各自的"我到底有没有生效"都可观测:
org-status.reload(面板「构建与重载」小节) 显示当前 dist revision、是否 stale(dist 比 src 旧)、最近一次重载的终态。 重载史落.cycles/reload-history.json;tests/contract/deployFreshnessContract.test.ts保证"改了 src 忘 build"这一点在 CI/离线金字塔里必红。
构建
pnpm --dir dsh-anic run snapshot # .cycles/ → src/client/workflowGraphData.ts(已生成)
pnpm --dir dsh-anic run typecheck # client + host(0 错误)
pnpm --dir dsh-anic run build # dist/client.js + dist/host.js
pnpm --dir dsh-anic run build:watch # 热更新开发模式(watch + 自动重 wrap)
pnpm --dir dsh-anic run test # 全链离线测试:规范门 12 + vitest 147 + 冒烟 19
typecheck/build 依赖父工作区
node_modules(typescript/tsdown/@types/react 走目录向上解析)。
测试体系
四层金字塔(node scripts/run-tests.mjs 一条命令,fail-fast,--only=<id> 单跑):
| 层 | 命令 | 内容 | 数量 |
|---|---|---|---|
| L1 规范门 | pnpm run validate:dsh |
C1-C12 DSH 清单/exports/locale/icon/产物契约(依据 docs/anic/07 §2 asar 取证,每条注出处) | 12 |
| L2 单元 | pnpm run test:unit |
九域全覆盖(flows/evolution/governance/llm/routes/runtime/skill 网关/client/shared)——零直测清单已清零(cycle-36) | 104 文件 |
| L3 契约守卫 | (同上,vitest 内) | 源码形状守卫:register 原型形态(禁未绑定提取,放行 disposer 捕获)/inject 回调形态/disposer 不丢弃/遥测+kill-switch/src 零 console.*;差分契约(native vs script 逐字段对账);SKILL.md 目录描述 ≤500 字符 | 20 文件 |
| L4 机制冒烟 | pnpm run test:smoke |
stub 宿主 21 断言(ModuleLoader 契约/169 点 217 线/热卸载/kill-switch) | 21 |
| L5 真实宿主 | pnpm run j0 |
j0-probe.mjs 经 CDP(9222) 六判据:标签可见/共存/图渲染/遥测/来源如实/热卸载+恢复/kill-switch | 8 |
测试环境脚本(派生自父工程 scripts/start-dsh-test.mjs 895 行,实测修复全保留;PID/日志改 dsh-anic-*,遮蔽预检针对 dsh-anic):
pnpm run test:dsh:start # 启动 DSH(3080) + 调试 Chrome(9222),捕获认证 URL
pnpm run test:dsh:stop|restart|status|check
pnpm run test:live # = run-tests --live(离线三层 + j0-probe)
纪律:j0-probe 绝不启动/杀死宿主进程(前置 = start-dsh-test 启动的调试 Chrome);本脚本与父工程
脚本共用 3080,同时只跑一个测试宿主,切换前先 stop;check 只读评估端口,绝不越权杀进程。
安装(已完成:web + desktop 双 profile)
网页端(%USERPROFILE%\.dsh\profiles\web\):dependencies["dsh-anic"] = "link:D:/Projects/TraeProjects/dsh-codegraph-visualizer/dsh-anic"
dsh.profile.bundles追加"dsh-anic",pnpm install完成(Junction 已验证,node_modules/dsh-anic/dist/client.js经链接可达且语法可解析;父插件链接未受影响)。
桌面端(%USERPROFILE%\.dsh\profiles\desktop\,2026-10-13 同步):同款 link: 依赖 + bundles 末尾追加;
pnpm install 后 Junction、served bundle node --check、locale/icon 可达性全部验证;18 个既有 bundle 行
逐一在 node_modules 解析通过(4 个 @deepseek-ai/* 行是宿主内建,从安装锚点解析,不在 profile 依赖里——安装前后一致)。
dsh-anic 无 @deepseek-ai/dsh* peer 依赖 ⇒ 兼容门必过;桌面端是 dsh-anic 在 0.4.x 生态宿主上的首次挂载(07 §3 unknown 宿主姿态的实测场)。
两端生效都需要重启对应宿主(bundle 在启动时装载);link: 安装下重启后再次 build 即热更新。
J0 验证清单(重启宿主后逐条勾)
- 顶层标签栏出现
ANIC,可点击,SVG 图渲染 138 圆点 / 164 边线; - 底行显示
live …(宿主路由生效);把.cycles/里造一个变化后点「刷新」→ 数字变化; - DevTools:
window.__ANIC_TAB_SPIKE__.registered === true,nodes/edges/autonomy与快照一致; - 既有「对话 / 代码图谱」等标签不受影响(
kind:'list'共存); __ANIC_TAB_SPIKE__.unregister()→ 标签消失;reregister()→ 重现(dispose 干净);- 停用开关:
localStorage['anic-workflow-tab'] = 'off'后重载 → 零注册、零遥测副作用; - 卸载 = 从 profile
package.json移除依赖与 bundle 行 +pnpm install+ 重启(无残留注册)。
观察点(CLAUDE.md 纪律)
ctx.slots.register必须保持原型方法调用(否则 per-plugin disposal 失效);- apply() 内不做能力快照门控;slots 缺失走
skipped='slots-absent'响亮降级; - 路由注册经
ctx.effect,disposer 不丢弃(插件级卸载 = 路由注销)。
目录
dsh-anic/
package.json # name=dsh-anic, manifestVersion 1, client.platform web, inject=['slots']
icon.svg locale/ # DSH 清单资产(en/zh)
src/index.ts # 宿主入口:inject=['webServer','sessions'],注册四路由(ctx.effect)
src/host/snapshotRoute.ts # GET /anic/api/workflow-snapshot(现场构建,no-store+CORS)
src/host/routes/selfInitRoute.ts # POST /anic/self/init(自举,flow.selfInit 门控)
src/host/routes/selfCheckRoute.ts # GET /anic/api/self-check(6 探针)
src/host/routes/index.ts # 路由聚合 + makeSend(requestId 头)
src/host/config.ts # C 域唯一 loader(canonical/legacy/missing,INV-25)
src/host/logger.ts # scoped logger + requestId(M2 宿主日志服务唯一缝)
src/host/agents.ts # agent 卡 loader(5 门 × 3 角色,闭合 schema 校验)
src/shared/snapshotCore.ts # 快照构建唯一实现(生成器与宿主路由共用)
src/shared/stepTrace.ts # 四源投影(INV-27 诚实标注,位置法归属)
src/shared/flows.ts # 9 flow 开关三层合并(INV-29 核心不可关)
src/shared/errors.ts # 四域错误码 anicError()(client/host 共用)
src/client/index.ts # 客户端入口(name='dsh-anic-client',inject=['slots'])
src/client/integrations/WorkflowTabIntegration.ts
src/client/WorkflowGraphPanel.ts # 取数组件 + 三工具栏按钮 + 三面板区(stepTrace/diagnostics/prefs)
src/client/features/stepTrace/renderStepTrace.ts # 纯渲染:步骤轨迹树
src/client/features/diagnostics/renderDiagnostics.ts # 纯渲染:自检探针行
src/client/features/prefs/prefsDrawer.ts # 纯渲染:偏好抽屉 + localStorage 读写
src/client/workflowGraphData.ts # 生成文件(嵌入快照)
assets/agents/ # 15 张 agent 资产卡({gate}-{role}.json)
scripts/generate-snapshot.mjs # 薄封装(import snapshotCore.ts,Node≥22.18 原生 TS)
scripts/build-client.mjs # 构建 + --watch 热更新模式
scripts/wrap-client-bundle.mjs # 与父工程同契约的包装器(styleId=dsh-anic-styles)
scripts/offline-smoke.mjs # 机制冒烟(stub 宿主,19 断言)
scripts/validate-dsh.mjs # L1 规范门 C1-C12(--json 可选)
scripts/run-vitest.mjs vitest.config.ts # L2/L3 测试执行器与配置(pool=forks)
scripts/run-tests.mjs # 测试编排器(validate→vitest→smoke[→j0],fail-fast)
scripts/start-dsh-test.mjs # 测试宿主环境(DSH 3080 + 调试 Chrome 9222,PID/日志隔离)
scripts/j0-probe.mjs # L5 真实宿主探针(CDP 六判据,绝不启停宿主)
tests/unit/snapshotCore.test.ts # 13 用例
tests/unit/snapshotRoute.test.ts # 13 用例
tests/contract/dshConformance.test.ts # 15 用例(含源码形状守卫)
artifacts/workflow-snapshot.json # 快照留档(审计/复现)
与父插件的关系
- 独立工程:不 import 父项目源码;tsconfig 严格分立(client/host 隔离沿用父纪律)。
- 父插件
src/保持零变更(本切片未触碰);两插件可并存(bundle id / 样式 id / 标签 id 均隔离)。 - 评测产物(契约套件、基准、技能快照)在
.anic-skill-evo/,不放本工程。
M11 技能内联 + 原生插件化 + 双向自举(v0.3.0)
来源:用户 m04286「将项目技能实现原生插件,安装即用,双向自举自进化」。
技能内联与自动安装
assets/skill/:技能全量内联(63 文件),安装插件即含技能底座。POST /anic/skill/install:自动安装/更新技能到工作区.dsh/skills/(幂等版本比对)。GET /anic/skill/status:查询已安装版本 / 来源(workspace / repo / inline)。resolveSkillScriptsDir三层混合查找:workspace.dsh→ repo.dsh→ inlineassets/skill。
7 脚本原生等价物
| 脚本 | 原生模块 | 路由 |
|---|---|---|
| hitl-audit | governance/hitlAudit.ts |
POST /anic/hitl-audit |
| band-detector | evolution/bandDetector.ts |
GET /anic/band-detect |
| org-status | evolution/orgStatus.ts |
GET /anic/org-status |
| fact-base-verify | governance/factBaseVerify.ts |
GET /anic/fact-base |
| plan-sync-check | governance/planSync.ts |
GET /anic/plan-sync |
| multi-agent-gate | llm/multiAgentGate.ts |
POST /anic/multi-agent-gate |
| auto-fix-loop | evolution/fixLoop.ts |
POST /anic/fix-loop |
双向自举
dualBootstrap.ts:DualBootstrapState { plugin, skill, crossProposals }。evaluatePluginSelf:统计 src/test 文件比 → 综合分。evaluateSkillSelf:检查.cycles/工件完整性 → 综合分。advanceDualBootstrap:推进一轮,失败时产跨向提案(不互相改码,R-31)。- 3 路由:
POST /anic/self/dual-evaluate/POST /anic/self/dual-advance/GET /anic/self/dual-status。
24 DSH 工具
anic_evaluate / anic_iterate / anic_gate_check / anic_bootstrap / anic_snapshot / anic_self_check / anic_hitl / anic_install / anic_skill_repair(eco P0:技能副本 doctor/repair——只重装差异文件,integrity 清单随修复重写)/ anic_status / anic_skill(15 脚本通用网关,M10-a 流程跟踪)/ anic_bootstrap_cycle / anic_bootstrap_analyze(M10-b/c 自举链)/ anic_bootstrap_other(cycle-96:举他工具化——跨项目自举此前只有 POST /anic/self/bootstrap-other 与外部调度器能触发,模型不可达;现 in-process 复用 runtime/crossBootstrapExecute.ts 的 runCrossBootstrap(与路由同一执行体、不 HTTP 自调),返回 sourceFingerprint / sourceFingerprintAfter 两个真实计算的 .cycles/** 指纹作为「源零写入」凭据,sourceUntouched 由二者比对得出,源不可解析时如实降级为 null)/ anic_autonomy_upgrade(cycle-77:证据化自主级升级——相邻档 / 无 tripped 熔断 / 信任阈值 / 人类授权四条件机器判定;拒绝零写入并点名缺失前置;成功走 Post-Verify 回读并写结构化 .cycles/autonomy-history.json;L3→L4 强制 humanAuthorized,信任不足的覆盖以 trustExemption 如实入账)/ anic_autonomy_downgrade(R3 阶段 1:证据化自主级回退——评估八熔断信号,仅证据支持时降一级,Post-Verify 回读 + 事故留痕;无熔断维持不动,L1/L2 地板拒绝)/ anic_flows_gate_check(R3 阶段 2:gate-check 流程状态机运行入口,mode=script 正典 / native 原生 / diff 双跑对账)/ anic_flows_advance(R3 阶段 3:宏观循环相位推进,6 相 15 条前向边 + phase-gates-passed 守卫,mode=native/script,dryRun 仅 native)/ anic_flows_archive(R3 阶段 3 后半:归档流程——cycle 归档已完成循环 / clean 清旧 / list 清单;完成判定与 G1 共用解析器;账本永不触碰 INV-9)/ anic_flows_hitl(R3 阶段 4 后半:HITL 三段修复流程——Phase0 审计 → Phase1 仅熔断门修复 → Phase2 全修复才重审;gate=all|H1..H4;mode=native 缺省/script)/ anic_flows_auto_fix(R3 阶段 5:自动修复循环流程——test→失败识别→retest→判定主循环,maxRetries 1-10;报告计数双格式解析 D-1103;ITERATING 自环轨迹进投影可回放)/ anic_reload_self(cycle-80:宿主 HMR 热重载——reason 必填;先探测 ctx.hmr(headless/SDK 无服务 ⇒ unavailable 诚实降级、零写入)→ dist 落后 src 则 refused(force 仅演示)→ 触发前落 in-flight 凭据 → runExclusive(reconcileProfile) 换实例,新实例启动时 finalizeInFlight 闭环;重载史落 .cycles/reload-history.json,org-status.reload 只读投影给面板)。工具计数权威源:src/host/toolIds.ts(双向集合比对,多一个少一个都红);README 数字由 tests/contract/readmeNumbers.test.ts 契约钉死(数字 == glob 计数)。
透明性 + 连通性增强
- 面板新增 org status 全景区:cycle 列表 + 信任分 + 自主级 + 熔断 + 带检测 + 警告。
- 并行 fetch snapshot / step-trace / self-check / org-status(各自 404 降级,不伪造空数据)。
验证
typecheck client 0 host 0
vitest 105 文件全绿(v0.36.0 时点,含 4 条新增契约)
smoke 21/21 ALL PASS
validate 12/12 (dsh-anic@0.36.0)
build dist/client.js + dist/host.js OK
No comments yet. Be the first to write one.