冻结验收契约并验证长任务是否真正完成
29.2/100
综合分
0
GitHub 星标
—
npm 周下载
—/5
用户评分
数据截至 2026/9/26 · 周下载取自 npm 全网(含 CI / 镜像),非本站安装数;综合分由星标、活跃度与兼容性检查合成。
安装命令 · 需先装 dsh CLI 引擎
dsh plugin --profile web add alex-spacemit/longloop该包不可直接 npm 安装,改从 GitHub 源安装(明细见下方安装检查)
状态速览
判定依据:实装验证 · 静态安装检查 · 自动扫描 · 仓库维护状态信任档位:已验证
是什么
dsh 原生插件 · dev
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 43 天前
档位由哪些信号合成
本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码v2.7.0🔵 扫描:含敏感能力尚无人工评估展开查看扫描说明与证据 ↓
安全扫描自动 · 静态分析源码
v2.7.0静态扫描发现插件具备触达本地系统的能力:执行外部命令、读写/删除本地文件、读取剪贴板或密钥类环境变量(至少其一)。这是能力清单,不是危险判定——具体能力项与证据见下方,安装前请自行判断是否需要。
读写/删除本地文件发起外部网络请求
查看扫描证据(共 82 处,展示前 48 条)
- 读取本地文件lib/index.js:210
await stat(path) - 读取本地文件lib/index.js:222
const parsed = JSON.parse(await readFile(file, 'utf8')) - 写入本地文件lib/index.js:238
await mkdir(dir, { recursive: true }) - 写入本地文件lib/index.js:241
await writeFile(tmp, `${JSON.stringify({ version: 1, tasks }, null, 2)}\n`, 'utf8') - 写入本地文件lib/index.js:242
await rename(tmp, file) - 读取本地文件lib/index.js:257
const names = (await readdir(dir, { withFileTypes: true })) - 读取本地文件lib/index.js:267
content = await readFile(full, 'utf8') - 读取本地文件lib/index.js:268
updatedAt = (await stat(full)).mtimeMs - 读取本地文件lib/index.js:287
const entries = await readdir(dir, { withFileTypes: true }) - 写入本地文件lib/index.js:556
await mkdir(dir, { recursive: true }) - 删除本地文件lib/index.js:560
await rm(file, { force: true }) - 写入本地文件lib/index.js:565
await writeFile(file, content.endsWith('\n') ? content : `${content}\n`, 'utf8') - 写入本地文件lib/index.js:579
await mkdir(dir, { recursive: true }) - 发起网络请求lib/client.js:94
const response = await fetch(path, { - 读取本地文件lib/run.js:43
const parsed = JSON.parse(await readFile(file, 'utf8')) - 写入本地文件lib/run.js:52
await mkdir(longloopDir, { recursive: true }) - 写入本地文件lib/run.js:55
await writeFile(tmp, `${JSON.stringify(run, null, 2)}\n`, 'utf8') - 写入本地文件lib/run.js:56
await rename(tmp, file) - 写入本地文件lib/run.js:70
await mkdir(longloopDir, { recursive: true }) - 读取本地文件lib/run.js:74
existing = await readFile(file, 'utf8') - 写入本地文件lib/run.js:79
await writeFile(file, existing + line, 'utf8') - 读取本地文件lib/run.js:84
const text = await readFile(ledgerFile(longloopDir), 'utf8') - 读取本地文件lib/run.js:250
entries = await readdir(dir, { withFileTypes: true }) - 读取本地文件lib/run.js:263
const info = await stat(full) - 发起网络请求src/client.js:94
const response = await fetch(path, { - 读取本地文件src/index.js:210
await stat(path) - 读取本地文件src/index.js:222
const parsed = JSON.parse(await readFile(file, 'utf8')) - 写入本地文件src/index.js:238
await mkdir(dir, { recursive: true }) - 写入本地文件src/index.js:241
await writeFile(tmp, `${JSON.stringify({ version: 1, tasks }, null, 2)}\n`, 'utf8') - 写入本地文件src/index.js:242
await rename(tmp, file) - 读取本地文件src/index.js:257
const names = (await readdir(dir, { withFileTypes: true })) - 读取本地文件src/index.js:267
content = await readFile(full, 'utf8') - 读取本地文件src/index.js:268
updatedAt = (await stat(full)).mtimeMs - 读取本地文件src/index.js:287
const entries = await readdir(dir, { withFileTypes: true }) - 写入本地文件src/index.js:556
await mkdir(dir, { recursive: true }) - 删除本地文件src/index.js:560
await rm(file, { force: true }) - 写入本地文件src/index.js:565
await writeFile(file, content.endsWith('\n') ? content : `${content}\n`, 'utf8') - 写入本地文件src/index.js:579
await mkdir(dir, { recursive: true }) - 读取本地文件src/run.js:43
const parsed = JSON.parse(await readFile(file, 'utf8')) - 写入本地文件src/run.js:52
await mkdir(longloopDir, { recursive: true }) - 写入本地文件src/run.js:55
await writeFile(tmp, `${JSON.stringify(run, null, 2)}\n`, 'utf8') - 写入本地文件src/run.js:56
await rename(tmp, file) - 写入本地文件src/run.js:70
await mkdir(longloopDir, { recursive: true }) - 读取本地文件src/run.js:74
existing = await readFile(file, 'utf8') - 写入本地文件src/run.js:79
await writeFile(file, existing + line, 'utf8') - 读取本地文件src/run.js:84
const text = await readFile(ledgerFile(longloopDir), 'utf8') - 读取本地文件src/run.js:250
entries = await readdir(dir, { withFileTypes: true }) - 读取本地文件src/run.js:263
const info = await stat(full)
扫描于 2026/10/31(1 天前) · 范围 入口闭包 + 发布文件清单 · 来源 GitHub 仓库
静态扫描只反映源码中出现的调用,不构成安全背书;人工评估与自动扫描相互独立、互不覆盖。
给这个插件打分还没有人投票↓
用户评分
还没有人投票,来当第一个
功能亮点
- 冻结验收契约
- 验证门禁
- 漂移治理与崩溃恢复
README
由 DeepSeek 最新模型翻译生成LongLoop Console
一个 DeepSeek Harness(dsh)插件,用于必须证明自己已完成的长时程智能体工作。
harness 已经运行了一个智能体循环。LongLoop 增加了长任务需要而短任务不需要的部分:一个在工作开始前就冻结的契约、一个运行契约而非询问模型是否完成的验证门、一个在仍有预算时就能察觉漂移的治理循环,以及一个能在进程结束后存活的账本。
一切都位于 /.longloop/ 下,因此每个工作区都携带自己的运行记录。
- 设计文档:docs/longloop-framework-design.md
- 包清单:package.json(dsh.bundle.patch、dsh.client)
- 源码:src/ — 运行时产物:lib/(相同文件,见下文构建)
它做什么
| 部分 | 它带来什么 |
| 运行 + 契约 | 一个目标、一个交付物、验收标准、硬约束、冻结的测试文件。契约只写一次,之后无法编辑——模型不能,运行也不能。 |
| 验证门 | 每条标准都变成一个 shell 检查(退出码 0 / stdout /re/ / 文件 path)。判定结果是 executable(检查已运行)或 independent(一个与执行器不共享任何内容的全新上下文评估器)。self 判定被记录为声明,绝不计为证据。
展开完整文档(README 剩余 1 节)
LongLoop Console 一个 DeepSeek Harness(dsh)插件,用于必须证明自己已完成的长时程智能体工作。 harness 已经运行了一个智能体循环。LongLoop 增加了长任务需要而短任务不需要的部分:一个在工作开始前就冻结的契约、一个运行契约而非询问模型是否完成的验证门、一个在仍有预算时就能察觉漂移的治理循环,以及一个能在进程结束后存活的账本。 一切都位于 /.longloop/ 下,因此每个工作区都携带自己的运行记录。 - 设计文档:docs/longloop-framework-design.md - 包清单:package.json(dsh.bundle.patch、dsh.client) - 源码:src/ — 运行时产物:lib/(相同文件,见下文构建) 它做什么 | 部分 | 它带来什么 | | 运行 + 契约 | 一个目标、一个交付物、验收标准、硬约束、冻结的测试文件。契约只写一次,之后无法编辑——模型不能,运行也不能。 | | 验证门 | 每条标准都变成一个 shell 检查(退出码 0 / stdout /re/ / 文件 path)。判定结果是 executable(检查已运行)或 independent(一个与执行器不共享任何内容的全新上下文评估器)。self 判定被记录为声明,绝不计为证据。 | | 契约冻结 | 只要运行处于活动状态(armed/running/paused/suspended),tools.guard 就会拒绝任何对冻结路径的写入。一个能重写自己验收测试的执行器最终会收敛到编辑测试。 | | 污染控制 | 检查命令不得读取答案:git 历史、.git、.env、密钥和凭据存储在执行前被拒绝,而通过符号链接逃逸自身的目录树会完全拒绝验证。 | | 治理循环 | 基于八个信号(工作区未变化、看板未变化、重复阻塞、只读轮次……)的停滞评分驱动一个阶梯:提醒 → 重新规划 → 切换模式(全新上下文轮次)→ 诊断 → 报告;外加一个在接近上限时收窄范围的预算阶梯。 | | 上下文治理 | 测量 harness 进行压缩时所依据的同一压力,并在轮次提示组装之前的空闲边界主动压缩。 | | 过程验证 | 每 K 轮,即使没有完成声明,也会运行最便宜的冻结检查,而一个不再通过的检查会变成停滞信号——因此错误假设会在第 3 轮而非上限时被捕获。 | | 恢复 | 每一轮都携带一个持久 id;没有完成的分派被记录为未知结果,运行会暂停而不是自行恢复,并且下一轮会被告知在重做副作用之前先核对状态。 | | 账本 + 会话事件 | 每行一条仅追加的事实(/.longloop/ledger.jsonl),并将相同的事实以 longloop/ 事件镜像到会话日志中,带有三个投影,以便控制台可以回读它们。 | | 控制台 | 工作区上的一个抽屉:运行页面(契约、预算、停滞、上下文、裁决、交接、指标)、任务板、长期记忆、工作区技能、多智能体名册。 | | 指标(§12) | 完成率、不同轮次计数、验证覆盖率和可执行通过率、契约质量、漂移、死胡同、未知结果——外加一份账本无法证明的内容的明确列表。 | 安装 安装到 dsh 配置文件中,来自 GitHub: dsh plugin --profile web add github:alex-spacemit/longloop 这与任何其他插件所走的路径相同:它将包添加到配置文件的 package.json 依赖项以及 dsh.profile.bundles 中。如果你改为从本地检出安装: dsh plugin --profile web add link:/path/to/longloop 然后启动配置文件,并在侧边栏中寻找 任务台(或会话头部中的同一按钮)。不需要其他任何东西:宿主部分通过插件附带的补丁层(cordis.patch.yml)到达,浏览器部分在 package.json 中的 dsh.client 下声明。 使用 从控制台,或从编辑器中: /longloop start 修好登录接口 --accept "测试全绿 | npm test | 退出码 0" --freeze tests/auth.test.ts /longloop status | pause | resume | stop [原因] | verify | handoff | metrics /longloop start 在一行中接收整个契约: - --accept "陈述 | 命令 | 期望",可重复。期望是 退出码 0、stdout /正则/,或 文件 path;省略它意味着退出码 0。没有命令的行会被接受,并报告为无法机器判定,因为没人能判定的标准正是这个插件存在所要防止的失败。 - --freeze 路径,可重复:检查所依赖的文件。没有它,运行可以编辑它自己的裁判,控制台会如此说明。 - --rounds N、--deliverable 文字。 模型通过设计的九个工具驱动相同的生命周期: run_start、run_plan、run_note、run_evidence、run_status、run_verify、run_finish、 run_block、run_handoff。 其中两个值得了解: - run_plan(tasks[]) 替换计划,并且每个任务都必须指明它所针对的标准 (addresses: ["C1"])。不针对任何标准的任务会被拒绝,契约中不存在的 id 会被拒绝, 并且回复会指明没有任务覆盖的标准——计划由契约评分,而不是由它自己评分。 - run_evidence(kind, pointer, addresses) 登记某个声明所依据的内容——一个文件、一个命令、一个 URL、一个提交、一个观察——以及它所对应的标准。框架会对工件进行哈希(文件按内容,其他任何东西按指针,记录会说明是哪种),并且回复会指明仍然没有证据的标准。然后 run_finish 通过 id 引用证据,而一个 id 从未注册的内容会被报告,而不是被计数。 - run_verify(criteria?) 按需运行门禁。不带参数时,它就是真正的门禁:如果每个必需的标准都通过,运行就完成。带 criteria 时,它只验证这些标准,并且不能*完成运行,这正是关键所在——一个子集答案不算完成。 配置 该插件只有一行,且只有一个有意义的选项: - id: longloop-console config: driver: false # true = 循环自行排队其轮次;false = 由人工点击 processVerifyEveryRounds: 10 driver: false 是有意作为默认发布值:重启不得恢复未经任何人重新授权的工作。 构建 src/ 是源码;lib/ 是 dsh 加载的内容,已提交,因此 git 安装无需构建步骤即可工作。 npm run build # src/ → lib/(逐字节) npm run check # 验证 lib/ 已同步,然后运行测试套件 npm test # 263 个测试,除 Node 的测试运行器外无依赖 该插件是无依赖的 ESM JavaScript:它只使用 Node 内置模块以及宿主通过 ctx 交给它的能力(工具、守卫、路由、提示上下文、会话投影、命令、子代理)。这也是为什么没有 dependencies 或 peerDependencies——运行时不会从 harness 包中导入任何内容。 状态 已在 macOS 上针对实时 dsh web 实现并演练:运行/契约、验证门禁(包括独立评估器)、工具门禁处的契约冻结、隔离、治理与预算阶梯、上下文治理、流程验证、账本 + 会话事件 + 投影、控制台以及指标。 已知缺口,保持可见,而不是通过缺少说明来暗示: - 验证沙箱是就地进行的,带有隔离规则,而不是复制的工作区。 - 没有对照组。指标描述的是系统本来的样子;它们并不衡量治理增加了什么(§12 在报告本身中如此说明)。 - 验证沙箱是就地进行的,带有隔离规则,而不是复制的工作区。 - 设计中的多包/多平面拆分被交付为一个包(设计 §11.7 将此记录为有意的 M0 收敛)。 许可证 MIT——见 LICENSE。
预览分享卡片长什么样 ↓
分享 · DeepSeek Harness Hub
alex-spacemit/longloop
冻结验收契约并验证长任务是否真正完成
相关插件 · 开发 / 工程
隐私简历生成器reactive-resume/reactive-resume
Reactive Resume 已迁至 GitHub 上的…
★ 45,125已汉化MCP
71.7
AI 架构文档生成器sopaco/deepwiki-rs
🚀 Litho 已进化为 Terrain —— 给你的 AI 智能体一张会呼吸的代码库地图。
★ 3,157已汉化DSH
70.8
长时任务执行闭环AMAP-ML/LongHorizon-Harness
面向 Computer-Use Agent 的 Loop Engineering
★ 1,764已汉化DSH
70.5
AI 编程纪律方法包GanyuanRan/Aegis
让 AI 编程 agent 变得可信:少返工、更安全、说“完成”前先给证据。
★ 1,384已汉化DSH
69.6
多代理编排运行时Enderfga/claw-orchestrator
面向编程智能体的运行时。把 Claude Code、Codex、Antigravity、Grok…
★ 586已汉化MCP
69.4
记忆进化插件csyangwen/dsh-memory-evolve
dsh-memory-evolve 使用场景指南
★ 461已汉化DSH
67.9