🎁 福利专区全网大模型免费应用 + 新用户福利 + 注册活动入口,低成本玩转 AI

长程验收 alex-spacemit/longloop

DeepSeek Harness
alex-spacemit43 天前有提交已提供中文文档扫描:含敏感能力

冻结验收契约并验证长任务是否真正完成

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
装得上吗
本站已真实安装成功
非静态推断
L4 · 真实安装等级说明 →
安全吗
本站尚未对该插件做风险分级
暂未覆盖,不等同于无风险
还在维护吗
更新放缓:最近一次提交在 43 天前
档位由哪些信号合成

本站实装验证(真实安装 L4 覆盖全站;L5 为运行时冒烟或实机截图,覆盖范围小于 L4) · 验证所用 dsh 版本 · 静态安装检查 · 风险分级 · 仓库维护状态。 下方各区块是它的证据明细。

验证判据与等级说明 →
社区实装还没有人打卡 · 装过的第一个就是你
安全扫描自动 · 静态分析源码
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。
预览分享卡片长什么样 ↓alex-spacemit/longloop
分享 · DeepSeek Harness Hub
alex-spacemit/longloop

冻结验收契约并验证长任务是否真正完成

回到顶部