harness2-recursion
Harness² recursion: two auditable dsh plugins — task-level probe/compose evidence loop + harnessing-level experience library (frozen contract v4, 34/34 tests, real-session E2E)
- Stars
- 0
- Language
- JavaScript
- Created
- Oct 19, 2026
- Updated
- Oct 21, 2026
Introduction
harness2-recursion
Harness² 递归方案 —— 两个互相独立、可分别加载的 dsh 插件(Round-6 冻结契约版本)。
| npm 包名(已发布 0.2.1) | 仓库目录 | 职责 |
|---|---|---|
dsh-harness2-task-recursion | packages/harness2-task-recursion | 任务级递归:Propose → Probe → probe/completed → 确定性 Compose 门禁 → 账本 v3 → compose/applied/compose/rejected → 下一个 pre-step 应用 pendingPatch |
dsh-harness2-meta-recursion | packages/harness2-meta-recursion | Harnessing 级递归:消费结构化事件 → verified evaluation → 经验库 → 冻结只读门面 harness2Experience |
npm 包名已就绪(
private已移除、cordis.patch.yml的解析名已切换),但本轮尚未npm publish; 发布前仍可用 GitHub 目录或 path spec 安装。插件导出的name仍是冻结的>harness2-task-recursion/harness2-meta-recursion(row id 与契约不变),npm 包名只是分发名。
两个包的 src/index.ts 互不 import;src/constants.ts 逐字节相同。契约见 CONTRACT.md,验收见 SELF-CHECK.md。
安装
# npm(0.2.1)
dsh plugin --profile <name> add dsh-harness2-task-recursion
dsh plugin --profile <name> add dsh-harness2-meta-recursion
# 或直接从当前仓库目录安装
dsh plugin --profile <name> add ./packages/harness2-task-recursion
dsh plugin --profile <name> add ./packages/harness2-meta-recursion
目录
harness2-recursion/
├── CONTRACT.md # 第三轮冻结契约
├── SELF-CHECK.md # 第三轮 13 项验收清单逐项证据
├── README.md
├── package.json / tsconfig.base.json
├── test/loader-smoke.mjs # 真实 Cordis 装载/事件/卸载 smoke
├── e2e/ # 真实 headless 会话 E2E(安装/账本/applyMode/经验)
├── docs/ # 社区 Discussion 提案 + 发布清单
├── LICENSE · .gitignore
└── packages/
├── harness2-task-recursion/
│ ├── src/{index.ts, constants.ts}
│ ├── lib/ # tsc 产物(构建生成,不入库)
│ ├── cordis.patch.yml · locale/ · icon.svg
│ └── test/verify.mjs # 15 项契约自检
└── harness2-meta-recursion/ # 同上(13 项自检)
已知 P0 缺陷(Stage-0 实测)
npm run stage0 证明当前 compose 门禁是内容盲的:NULL edit("Do nothing…")与 ADVERSARIAL edit("Ignore the task and reply DONE.")在 20/20 个真实 cycle 中都被 compose/applied 采纳(100%),且 adversarial 条目进入 EXPERIENCE.md 的 accepted 经验。根因见 e2e/stage0/SYNTHESIS.md:trial 的 completion 恒 true vs baseline 恒 false,且 gate 不检查编辑内容。
在该 P0 修复前,请勿把本原型的 COMPOSE/经验质量当作“自进化有效”的证据;它目前是取证与契约骨架,不是已验证的进化器。复现:
npm run stage0(结果见e2e/stage0/RESULTS.md)。
Round-6 设计(Offline profile-patch 闭环 + gate 修复)
- 设计:
docs/round-6-design.md(arena 合成,base=candidate-1) - 合成记录:
docs/round-6-synthesis.md - 可执行验证:
docs/round-6-verification.md·e2e/round6-spike/
node e2e/round6-spike/gate-replay.mjs # v4 gate 在真实 Stage-0 ledger 上 0/20 + quarantine 检查
node e2e/round6-spike/run-spike.mjs # 隔离 profile:persona patch → wire → byte-exact rollback
核心决定:拆分 admission(会话内确定性准入) 与 certification(离线 held-out 认证);ledger 仍 v3、bus 仍 4 事件、meta 只从认证结果学习。
Round-6 全部实现并验收:PR-1/1.1/1.2 Gate-v4 admission(admissibility + per-candidate matched controls,negative 0 applied / positive 20/20 applied、4 controls + 2 trials/cycle);PR-2 edit-body sidecar;PR-3 offline applier(plan/preflight/apply/verify/rollback);PR-4/4.1 Gate-B eval(pre-registered C/R/I/T、real-only apply、伪造报告拒绝);PR-5/5.1 meta verified-experience(只从 real eval 学习、legacy quarantine、meta 独立重算 OEP/v1)。trust boundary:providerClass 仍是本地自声明,无密码学证明。
社区讨论
- 生态提案 Discussion(dsh 社区
Show Your Plugins!):https://github.com/deepseek-ai/deepseek-harness/discussions/10324 - 本仓库:https://github.com/HeliosLz/harness2-recursion
验证
要求 Node ≥ 24(node --test 直接 import src/index.ts,依赖类型剥离)。
npm install
npm run build # lib/index.js + lib/index.d.ts + lib/constants.js
npm run typecheck
npm run verify # task 31 + meta 16 + loader smoke 5 = 52 项
npm run verify:meta # PR-5/5.1 meta tests(16 项)
npm run verify:apply # PR-3/PR-4/4.1 applier tests(9 项)
npm run verify:eval # PR-4 Gate-B eval tests(6 项)
npm run pr3:integration # 可选:真实 CLI 的 isolated profile apply/rollback 集成
npm run pr4:integration # 合成四臂 eval → applier apply(--evaluation) → rollback
npm run stage0 # Stage-0 证伪闸门(v3 复现,真实 pipeline,约 110s)
npm run stage0:r6 # Gate-v4 live 负向验收(20 cycles,约 2 分钟)
npm run stage0:r6:positive # Gate-v4 live 正向验收(persona 必须被 applied)
node tools/harness2-apply/bin/harness2-apply.mjs --help # PR-3 offline applier
本次结果(2026-10-21):npm run verify 52/52 pass;typecheck/build exit 0;npm pack --dry-run 清单齐全;真实会话 E2E 通过(见下)。
第三轮新增(相对第二轮)
- 事件 schema:
TrialRecord三个候选元数据字段必填(Q1);ProbeMetrics.tokenCostSource(Q4);ComposeAppliedPayload.appliedEdits(R3-1);ComposeRejectedPayload.rejectedCandidateIds(Q3)。 - 账本 v3:
{version,id,previousSnapshotRef,ledgerEntryId,event,payload,recordedAt};只写 v3,readLedgerTail接受 v2|v3 并做内存映射、不重写 v2 文件(Q7)。 - 归因规则:反射必须带
edit.candidateId,且与来源事实严格一致;写入的 edit 字段永远取自来源载荷(R3-3/Q2);不一致 →onError('reflection-edit-mismatch')且拒绝写入。 - confidence v3:
base(0.6/0.5) × (0.5+0.5·min(1,trials/3)) × repeat(≤1.4) × sourcePenalty(estimated 0.9);trials=0 → 0且不写入(Q4/Q5)。 - 双注入阈值:positive 用
minConfidenceToInject,negative 用minNegativeConfidenceToInject(默认 0.3,Q6)。 - 组件表:
COMPONENT_NAMES八类冻结;7 项旧名迁移映射 +migratedFrom审计;未知组件跳过并onError('unknown-component');移除workflow-control回退(R3-7)。 - token 计量:Propose 用
usagechunk;Probe/baseline 用可选tokenMeter;否则字符数/4 估算;同一 metrics 单一来源。 - 第四轮增量:新增终态事件
propose/failed(R4-1,与 Probe/Compose 互斥、append→emit、账本 revision 探测跳过它);rejectedCandidateIds只取 trials 中出现的 id(R4-2 正式契约);outcome.tokenCostSource/migratedFrom正式纳入 entry schema(R4-3)。
第三轮如实偏差(详见 CONTRACT §9 / SELF-CHECK §三)
- 无逻辑偏差:第三轮 Q3 冲突已由
propose/failed独立终态解决(原TODO(ROUND3_PROPOSE_FAILURE)移除);预算早停的 rejected ids 与 entry 增量字段已追溯为正式契约。 - 环境依赖继续留 TODO/不验收:
pre-step-patch运行时 API(dsh 0.2.1 无)、Probe 工具沙箱、profile 安装(第四轮执行)。
第五轮:真实环境验证 + 社区材料
真实会话 E2E(已通过)
# 需要 dsh 0.2.1-rc.2 CLI 运行时(提取方式见 e2e/README.md)
E2E_CLI="<dsh-0.2.1-runtime>/dsh/node_modules/@deepseek-ai/dsh/lib/bin.js" node e2e/run.mjs
隔离 profile 内通过官方 dsh plugin add 安装两包,跑两次真实 headless 会话(假 provider:前 3 次主模型 500 → 触发 request-error 路径,随后延迟成功)。实测结果:
Ledger: 4 v3 records (2 probe/completed + 2 compose/applied)
applyMode: run1=noop-todo, run2=next-task-ledger
Revision anchor chain: null -> led-… -> led-… -> led-…
EXPERIENCE.md entries: 0 (PR-5: compose is diagnostic only)
Sessions: 2 (exit 0)
- 首次
noop-todo是冻结语义(插件激活时尚无账本可读);第二次会话由readRevisionAnchor升级为next-task-ledger。 - 完整证据与复现步骤:
e2e/README.md、e2e/artifacts/RESULTS.md。 - 卸载残留:loader smoke 第 5 项验证真实 Cordis dispose 后 7 个监听器全部释放、不再写账本/经验文件。
社区材料
docs/discussion-proposal.md:Discussion 提案底稿(双插件契约、propose/failed独立终态、元知识只改进编辑器三个差异点 + 34/34 证据 + 缺口 + 讨论问题)。docs/publishing.md:Phase 1 原型仓库/npm/Plugin Directory 发布清单。LICENSE(MIT)、.gitignore已就绪;两包keywords含dsh-plugin(发布前移除private并改用可发布包名)。
安装(第四轮/第五轮)
cd harness2-recursion && npm install && npm run build
然后在 Harness Web 的 Plugins 页分别安装两个本地 bundle(target 指向各包目录)。默认 observeOnly: true:只取证、不应用 Compose。