dsh-punky-swarm 0.5.0 → 0.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +64 -1
- package/cordis.patch.yml +10 -10
- package/docs/governance-boundaries.md +1 -1
- package/lib/acps/certs.js +0 -4
- package/lib/acps/registry-client.js +0 -4
- package/lib/acps/server.js +2 -6
- package/lib/api.js +2 -6
- package/lib/assembly/audit-blind-review.js +6 -1
- package/lib/assembly/defaults.js +53 -0
- package/lib/assembly/flows.js +2 -5
- package/lib/assembly/schema.js +71 -2
- package/lib/assembly.js +4 -34
- package/lib/auditlog/sink.js +0 -4
- package/lib/comms/acps-bridge.js +2 -6
- package/lib/comms/inject-budget.js +194 -0
- package/lib/comms/mailbox-paths.js +25 -0
- package/lib/comms/topic.js +3 -7
- package/lib/engine/arch-context.d.ts +39 -0
- package/lib/engine/arch-context.js +133 -0
- package/lib/engine/arch-context.ts +149 -0
- package/lib/engine/dispatch.js +214 -11
- package/lib/engine/replay-verify.js +140 -0
- package/lib/engine/suite.js +22 -0
- package/lib/governance/tool-ban.js +5 -2
- package/lib/governance/tool-ban.ts +5 -2
- package/lib/hot/config-watch.js +12 -1
- package/lib/index.js +308 -180
- package/lib/json-response.js +25 -0
- package/lib/shell-text.js +33 -0
- package/lib/sig-fingerprint.js +1 -1
- package/lib/state/archive.js +9 -15
- package/lib/state/batch-paths.js +55 -0
- package/lib/state/command-exec.js +4 -5
- package/lib/state/constants.js +10 -0
- package/lib/state/dangling.js +1 -1
- package/lib/state/event-types.js +16 -0
- package/lib/state/gates/command.d.ts +220 -1
- package/lib/state/gates/command.js +132 -8
- package/lib/state/gates/command.ts +121 -7
- package/lib/state/gates/detect.d.ts +9 -0
- package/lib/state/gates/detect.js +100 -5
- package/lib/state/gates/detect.ts +72 -5
- package/lib/state/gates/entry.js +3 -1
- package/lib/state/gates/entry.ts +3 -2
- package/lib/state/gates/exit.js +3 -1
- package/lib/state/gates/exit.ts +3 -2
- package/lib/state/gates/handoff.js +14 -4
- package/lib/state/gates/handoff.ts +14 -4
- package/lib/state/gates/helpers.d.ts +8 -0
- package/lib/state/gates/helpers.js +51 -19
- package/lib/state/gates/helpers.ts +51 -17
- package/lib/state/gates/plan-contract.js +9 -1
- package/lib/state/gates/plan-contract.ts +4 -2
- package/lib/state/gates/reason-vocabulary.js +8 -3
- package/lib/state/gates/reason-vocabulary.ts +3 -2
- package/lib/state/gates.d.ts +228 -1
- package/lib/state/gates.js +5 -1
- package/lib/state/gates.ts +5 -1
- package/lib/state/lane-state.js +37 -0
- package/lib/state/machine-rules.d.ts +6 -0
- package/lib/state/machine-rules.js +47 -3
- package/lib/state/machine-rules.ts +56 -4
- package/lib/state/rule-propagation.d.ts +22 -0
- package/lib/state/rule-propagation.js +119 -0
- package/lib/state/rule-propagation.ts +137 -0
- package/lib/state/store/handoff-accept.js +173 -0
- package/lib/state/store/lifecycle.js +4 -2
- package/lib/state/store/member-gates.js +163 -2
- package/lib/state/store/paths.js +9 -14
- package/lib/state/store/plan-mutate.js +9 -1
- package/lib/state/store.js +139 -6
- package/lib/tools/asset-tools.js +5 -2
- package/lib/tools/assign-tools.js +135 -46
- package/lib/tools/core.js +0 -1
- package/lib/tools/handoff-tools.js +162 -12
- package/lib/tools/host-surface.js +1 -8
- package/lib/tools/lane-tools.js +24 -14
- package/lib/tools/log-tools.js +5 -3
- package/lib/tools/mailbox-tools.js +6 -8
- package/lib/tools/member-tools.js +11 -5
- package/lib/tools/query-tools.js +11 -3
- package/lib/tools/readonly.js +5 -6
- package/lib/tools/register.js +17 -1
- package/lib/tools/shared.js +21 -2
- package/lib/tools/swarm-comms.js +44 -5
- package/lib/tools/swarm-tools.js +35 -5
- package/lib/tools/task-tools.js +6 -1
- package/lib/tools/tier-gate.js +35 -1
- package/lib/tools/wave-plan-tools.js +19 -8
- package/lib/types/contracts.d.ts +1 -1
- package/lib/types/contracts.ts +8 -0
- package/lib/watch/heartbeat/context.js +5 -3
- package/lib/watch/heartbeat/primitives.js +2 -8
- package/lib/watch/lane-heartbeat.js +6 -10
- package/package.json +5 -5
- package/presets/punky-preset/agent.cordis.yml +16 -11
- package/presets/punky-preset/agent.cordis.yml.bak-2026-10-19T12-05-11 +285 -0
- package/presets/punky-preset/asset-manifest.json +1 -1
- package/presets/punky-preset/references/discipline.md +106 -13
- package/puncat.jpg +0 -0
- package/skills/video-team/SKILL.md +307 -0
- package/skills/video-team/references/constitution.md +74 -0
- package/skills/video-team/references/roles/audio-engineer.md +81 -0
- package/skills/video-team/references/roles/captioner.md +80 -0
- package/skills/video-team/references/roles/coordinator.md +77 -0
- package/skills/video-team/references/roles/designer.md +80 -0
- package/skills/video-team/references/roles/motion-designer.md +80 -0
- package/skills/video-team/references/roles/producer.md +83 -0
- package/skills/video-team/references/roles/supervisor.md +86 -0
- package/skills/video-team/references/templates/final-acceptance-template.md +62 -0
- package/skills/video-team/references/templates/gap-list.json +12 -0
- package/skills/video-team/references/templates/leader-decision-pack.md +62 -0
- package/skills/video-team/references/templates/scene-spec-template.md +73 -0
- package/skills/video-team/references/templates/storyboard-template.md +41 -0
- package/skills/video-team/references/templates/success-pattern-seeds.md +42 -0
- package/skills/video-team/references/workflow.md +132 -0
- package/skills/video-team/scripts/check-video-team-density.mjs +497 -0
- package/skills/writing-team/SKILL.md +34 -2
- package/skills/writing-team/references/roles/evidence-auditor.md +57 -0
- package/skills/writing-team/references/roles/logic-auditor.md +57 -0
- package/skills/writing-team/references/roles/structure-auditor.md +59 -0
- package/skills/writing-team/references/roles/theory-mapper.md +55 -0
- package/icon.svg +0 -16
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,67 @@
|
|
|
1
|
-
##
|
|
1
|
+
## 0.5.2(2026-10-21)
|
|
2
|
+
|
|
3
|
+
### 结构优化:`apply` 873 → 51 行 + 八项单点化收敛(41 笔提交 / 83 文件 / `+3925 −487`)
|
|
4
|
+
|
|
5
|
+
本次以**结构**为主、行为零变更:把长期堆在单一入口里的逻辑拆成可独立验证的单元,并把重复实现收敛到单点。**所有改动均以「行为等价」为验收前提**(块 sha 等价 / 逐文件回归 / 架构棘轮不破)。
|
|
6
|
+
|
|
7
|
+
- **入口瘦身 —— `apply` 873 → 51 行(−94%)**:
|
|
8
|
+
- `W7a`–`W7d` 四波把内联块函数化(4 + 4 + 7 + 5 块),`apply` 依次 873 → 739 → 633 → 493 → 339;**零逻辑变更**,逐波以块 sha 等价证明。
|
|
9
|
+
- `W7e` 把 `governance` 装载与两个 remount 下沉为顶层工厂,`apply` 339 → 261。
|
|
10
|
+
- `W7f` 把运行期真源收拢为 `createRuntimeState`(**20 字段**)并把六个区间外移为 8 个工厂,`apply` 261 → 51。**顶层工厂数 0 → 30**(v0.5.1 时全部内联在 `apply` 内)。
|
|
11
|
+
- **八项单点化收敛**(`W1a`/`W1b`/`W2`/`W3a`/`W3b`/`W4`/`W5`):
|
|
12
|
+
- `sendJson` / `packageRoot` / `stripStreamMerges` 三处重复实现合一(`W1a`);`BLIND_REVIEW_ROLES` / `boxRoot` 单点化(`W1b`)。
|
|
13
|
+
- **产物路径函数四处收敛**到 `lib/state/batch-paths.js`(`W2`);`DEFAULT_ASSEMBLY` 迁出到 `assembly/defaults.js`(保形再导出,`W5`)。
|
|
14
|
+
- 删除 5 个零引用符号与 `core` 再导出(`W3a`)、三个 `gates/*.ts` 的未使用 `node:path` 导入(`W3b`);拆掉 `state -> watch` 回指边,三谓词下沉 `state/lane-state.js`(`W4`)。
|
|
15
|
+
- **命令分段器真单点化**:5 处完全相同正则(`command-exec` / `readonly`×2 / `tool-ban.ts`×2)收敛为 `lib/shell-text.js#segmentCommands`,**生产代码正则字面量物理只剩 1 处**;`detect.ts` 的分词正则未动(分词 ≠ 分段)。
|
|
16
|
+
- **架构真源与越界门**:新增 `.punky/arch.yml` 作为架构真源、`scripts/arch-check.mjs` 为**棘轮门**(禁止新增跨域依赖)、`arch-context` 在派发期注入架构上下文。本次为分段器单点化**授权 +1 对** `governance -> (lib-root)`(`allowedPairs` 62 → 63),理由写入提交正文。
|
|
17
|
+
- **安全面收口到 fail-closed 单点(4 处)**:产物声明路径解析(`cc62ffd`)、产物读面 5 点(`8f7bbd2`)、人工闸 `human:` 证据判定(`e6427e2`)、`P6` watch stat 与 `P7` handoff 在场/可读(`57a28d8`)。所有收口均配**根内正例对照**,防「一刀切把功能打死」。
|
|
18
|
+
- **测试债补齐 —— 166 → 171 个测试文件**:此前安全修复**零仓内测试**,本次补 `gate-artifact-containment` / `gates-needhuman-evidence` / `w7e-remount-surface` / `w7f-rt-write-surface` / `shell-text` 五件;**每条「返回空 / 被拒 / 不抛」断言均配同输入阳性对照**,防不可证伪的绿灯。
|
|
19
|
+
- **写序列可观测化**:`createRuntimeState(onWrite)` 在注入 `ctx.rtWriteLog` 时返回 Proxy 记录字段写入序列,未注入时返回纯对象(**生产路径零开销**)。使「`rt` 单写 vs 双写」这类**终态同构、仅写序列不同**的缺陷首次可被判据抓住。
|
|
20
|
+
- **指引层去重与同源**:`persona` 按「**工具能力归工具定义、调度指引与操作规范归 preset**」原则去重,注入面 **6442 → 5858 字符**;`cordis.patch.yml` 与 `presets/punky-preset/agent.cordis.yml` 两份 persona 定义**对齐为 27 条、逐条文本差异 0**(此前 patch 缺 `0i`、§0 为旧短版);补**模板变量白名单**约束(本内核只注册 `provider`/`model`,其他双花括号变量在会话启动时即抛错)。
|
|
21
|
+
- **技术债跨批总账**:新增 `reports/tech-debt-ledger-20261021.md`,登记跨批未闭合项(含**取证后的「不做」结论**与不可消除的原因),使「已修 / 有意保留 / 已知不阻断」三类可追溯。
|
|
22
|
+
- **读数**:`83 files changed, 3925 insertions(+), 487 deletions(-)`;`apply 873 → 51`、顶层工厂 `0 → 30`、测试文件 `166 → 171`;`guard` A=B=171(1896 tests / 1889 pass / **0 fail** / 4 todo)GREEN;`arch-check` `181 / 667 / 214 / 63` `[ok]`;`check-guidance-sync` GREEN(repo ↔ live 五件同 sha)。
|
|
23
|
+
|
|
24
|
+
## 0.5.1(2026-10-14)
|
|
25
|
+
|
|
26
|
+
### 发布面落版与判据尺子固化(批 `punky-release-0.5.1-20261014`)
|
|
27
|
+
|
|
28
|
+
- **`R-1`(唯一发布阻塞)已解 —— 版本史与版本面结构性对齐**:`package.json:3` 早已是 `0.5.0`,而版本史顶部仍是「未发布(Unreleased)」、首版本标题停在 `## 0.4.4`。本次**真落**:原「未发布」段体**落版为 `## 0.5.0(2026-10-12)`**(**段体一字未改**,sha16 `d6eeb75b36ba38e7`),并在其上新建本段;版本行 → `0.5.1`。
|
|
29
|
+
- **注释订正(`F-1`)**:`lib/sig-fingerprint.js:35` 原注「不进 `GateErrorCode` union(**拒码面恒 29 保持不变**)」**已为假**(实测 union = **37**)⇒ 改为**指向 `lib/types/contracts.ts` 的 union 为唯一真源、不写数字**(规模随授权批演进,写死即漂移源)。改动面 = **恰 1 减 1 加、两行均注释行**,`node --check` 双态 exit 0。
|
|
30
|
+
- **判据尺子固化(`D-04`)**:新增 `scripts/audit/tool-face-count.mjs`(**按块解析 + 四口径阶梯 + 三态退出码**)。原命令只覆盖双引号 ⇒ **26 ≠ 32**;实測病根是**两条叠加**:**引号**(+4,全在 `lib/tools/lane-tools.js` 的单引号 `name`)与**扫描面**(+2,`lib/watch/lane-heartbeat.js` 的 2 件 `defineTool` —— **不在 `lib/tools/*.js` 内**)⇒「只补引号」天花板为 **30**。
|
|
31
|
+
- **锚点类文档入库(`PA-1`)**:`docs/` **54 件**逐件 `git add -f`(禁通配)。根因 = `.gitignore:50` 忽略整个 `docs/**`,且 `:49` 记录 2026-10-10 已 `rm --cached` 49 件 ⇒ 属「**在库 → 只在工作树**」的退化。入库后三读数 **37/37** 符合预期(`check-ignore` 仍报 `:50` = **未改规则**)。
|
|
32
|
+
- **新增技能**:`skills/video-team/`(三层 7 角色 team skill + 宪法 6 章 24 条 + 模板 6 件 + `check-video-team-density.mjs` S1–S7 机检)。
|
|
33
|
+
- **读数**:`58 files changed, 13054 insertions(+), 3 deletions(-)`(发布面)+ `17 files changed, 1869 insertions(+)`(video-team)。
|
|
34
|
+
|
|
35
|
+
## 0.5.0(2026-10-12)
|
|
36
|
+
|
|
37
|
+
### 抄规格体系 P0/P1/P2 三波次 + 三个已验收外部批(`a4a2779`,91 件 / +9407 −236)
|
|
38
|
+
|
|
39
|
+
- **范围**:一次收口提交,含三批主交付(P0 抄规格 L1 事件重放校验腿 + L2 上下文注入预算;P1 抄规格 L3 测试证据自证 / L5 隔离可判定 / L6 宿主兼容第三维;P2 抄规格 L7 写路径原子性 / L4 规则变更传播 / L8 判据脚本信任模型 / L9 记忆溯源 / C-5 坏配置 fail-closed)与**三个已验收外部批**(各自 `verdict = approve`、`blocking = 0`)。
|
|
40
|
+
- **要点**:新增 1 枚拒码(`GATE_SCRIPT_CHANGED`,语义独立于只读黑名单命中,以保审计可辨);`lib/comms/inject-budget.js` 新建(四层结构 + 显式省略标记);`lib/state/rule-propagation.ts` 新建(规则变更传播,随 `scripts/copy-ts-built.mjs` 回拷清单同步)。
|
|
41
|
+
- **读数**:`91 files changed, 9407 insertions(+), 236 deletions(-)`。
|
|
42
|
+
|
|
43
|
+
### 指引同步改造 —— 10 项 + 2 附带(`431b873`,2 件 / +77 −7)
|
|
44
|
+
|
|
45
|
+
- **范围**:把 L1~L9 的规格口径落进指引(正文 `references/discipline.md`)+**移除注入面 `0i` 行**(挂起内容不得在注入面出现)。
|
|
46
|
+
- **要点**:判据类落 `### 15.16`–`### 15.20`、操作类入各自同族 §;**不新增 `## §X`**(故不影响注入面↔正文双向检查);收口以 `node scripts/check-guidance-sync.mjs` **GREEN(exit 0)** 为准。
|
|
47
|
+
- **读数**:`2 files changed, 77 insertions(+), 7 deletions(-)`。
|
|
48
|
+
|
|
49
|
+
### 未发布补录:D 档偏离语义修复 + 引擎自派 worker 批归属索引填充面修复(2026-10-12,批 `session-bind-index-fix-20261012`;同段补录前批 `d-override-fix-20261011`)
|
|
50
|
+
|
|
51
|
+
- **形态**:本批 `session-bind-index-fix-20261012` = 5 lane(`p1-spec` →(`e1-fix` → `e2-assert`)∥ `e3-changelog` → `a1-audit`);前批 `d-override-fix-20261011` = 9 lane(`p1-spec` → `e1-engine` ∥ `e2-guidance` ∥ `e3-tests` ∥ `e4-session-bind` ∥ `e5-c1-schema-fix` ∥ `e6-index-wiring` ∥ `e7-assert-align` → `a1-audit`),`audit verdict = approve`(AC-1..AC-20 **100% 有结论** / **blocking 0** / followup 12)· **带 gap 收口**(非 clean-pass);前批全量读数(a1 独立复跑,非采信 lane 自述):`npm test` tests **1765 / pass 1761 / fail 0** exit 0 · `npm run check` exit 0 · `node scripts/check-guidance-sync.mjs` exit 0 · `ac19-host-smoke.mjs` **15/15**。
|
|
52
|
+
- **前批 ① · 双轴判据(D 档偏离语义修复的根)**:原语义「声明 D ⇒ 恒 `override:true`」把合规 D 误判为偏离。改为**两轴独立推导、互不耦合**——**难度轴** `derived` = 五布尔 + 两个新布尔的机械推导(任一 C 判据 ∥ `fixedRole` ∥ `durableSeats` → `C`;否则 `needIsolation` → `B`;否则 `A`;**`D` 不入难度轴**,因通道不属难度);**通道轴** `derivedChannel` = `durableSeats === true ? 'team' : 'dispatch'`。落点 `lib/tools/assign-tools.js:107-109`;两实参入 schema 且**均非必填**(缺省零破坏:不传时退化为原 `derived` 且恒走 tier 支)。
|
|
53
|
+
- **前批 ② · D 的正当形态 ⇒ `override:false`**:`difficulty:'D'` **且** 通道轴为 `team`(即 `durableSeats:true`)⇒ **回归常规路径**(`override:false` / `overrideKind:null`),rationale **不需要**引用 A/B/C 特征词 —— 这正是「D 被机械事实覆盖 ⇒ 不记偏离」的修复点。落点 `lib/tools/assign-tools.js:121-122`;真宿主读数(`ac19-host-smoke.mjs` ⇒ `total=15 pass=15 fail=0`):`{"derived":"C","derivedChannel":"team","override":false,"overrideKind":null}`,工具行**无** `[override(...)]` 标记,`governance.json#lastAssign` 逐键一致。
|
|
54
|
+
- **前批 ③ · D 通道变体 ⇒ 通道三要素**:`difficulty:'D'` 但通道轴为 `dispatch`(`durableSeats` 未声明 ⇒ 通道面未落实)⇒ **唯一保留的偏离**:`override:true` / `overrideKind:'channel'`,rationale 须含**通道三要素**(**① 引用通道/特征面 ② 为何 durable 而非 subagent ③ 通道方向与上限:不泛化为全批、team 面缺失须显式降级**),缺任一即拒 `GATE_DIFFICULTY_MISMATCH`(文案说「**通道偏离**」并逐项列缺,附两条正范式);**不**复用原三要素(其 ① 强制 A/B/C 特征词,正是要绕开的误拒源)。非 D 偏离**逐字保留**原路径(`overrideKind:'tier'` + 原三要素)。落点 `lib/tools/assign-tools.js:124-138`。
|
|
55
|
+
- **前批 ④ · 建批面 D×通道硬拒 + guard 硬消费**:`lib/tools/wave-plan-tools.js:96` 在 `createBatch` **之前** throw `GATE_DIFFICULTY_CHANNEL_UNRESOLVED`(本会话声明 D 档而本批 `channel:'dispatch'` ⇒ **D 与通道面不一致,拒建批**,**零批次 JSON 落盘**、`pendingBatch` 保留可重试);执行型工具面由 `lib/tools/tier-gate.js:221-234` **同源硬消费**同一码(只读壳调用判定**先于**该门 ⇒ 侦察面零阻断)。真宿主读数(前批 `G-01` 运行时半):拒态逐字命中 + 零落盘。
|
|
56
|
+
- **前批 ⑤ · C↔D 同档豁免**:会话镜像的**跳过判据**由强度序 `tierRank` 改用**准入档单点** `accessTierRank` —— `C` 与 `D` **同档** ⇒ 「D 会话被镜像 C」**不再跳过**(照常镜像),仅**跨档降档**才跳过;修掉「活跃批期间 D→C 必被 `GATE_DIFFICULTY_DOWNGRADE_BLOCKED` 误拦」的实测缺陷。落点 `lib/tools/assign-tools.js:215-225`(禁两处各写一套判据);真宿主读数:放行、无该码。
|
|
57
|
+
- **前批 ⑥ · C-1(`overrideKind` schema 可空)**:`assign_check` 的 `output.schema` 中 `overrideKind` 由 `{"type":"string"}` 改为 `oneOf:[{type:'string',enum:['channel','tier']},{type:'null'}]`(前批 lane `e5-c1-schema-fix`)——常规路径回 `null` 不再被**宿主同款**校验判违例(原 schema 使合规 D 的 `null` 读数被判违反输出契约 = 阻断缺陷 C-1)。落点 `lib/tools/assign-tools.js:60`;宿主同款校验**零违例**。
|
|
58
|
+
- **前批 ⑦ · session 绑定形态落地 + 指引同步**:批归属解析**单点** `lib/engine/dispatch.js#batchSessionIdOfWorker`(`worker 会话 → 批归属会话` 的**唯一**反查点,只 `get`、取不到即 `null` 不猜兜底)+ `lib/tools/shared.js#sessionOf` **四级回落**(`args.session` → 注入 resolver 命中 ⇒ 批归属会话 → `exec.agent.session.id` → `'cli'`;`shared.js` 守**零 import** 红线、resolver 只收**注入的函数**、抛错/非字符串视为不命中);装配面 `lib/index.js:307` 把 `dispatchIndex` 声明**前移** + `:313` 闭包注入 `resolveBatchSession`(捕获**引用**而非快照值),并完成批内治理工具(`lane-tools` / `query-tools` / `task-tools` / `member-tools` / `mailbox-tools` / `handoff-tools` / `asset-tools` / `log-tools`)的三参化接线(前批 lane `e6-index-wiring`)。**指引同步**:`presets/punky-preset/references/discipline.md:25` 写入 D 档偏离口径(双轴 / 正当形态 / 通道三要素 / 建批面仍须落实 `channel:'team'`,否则拒 `GATE_DIFFICULTY_CHANNEL_UNRESOLVED`),`:393` 后续项同步;`node scripts/check-guidance-sync.mjs` **GREEN**(repo == live,前批 a1 独立复跑)。
|
|
59
|
+
- **本批 · 现象与根因**:引擎**自派**的 worker(子会话)**不传 `session`** 调治理工具时一律回落自身子会话 ⇒ `Error: batch not found: <batchId> @<workerSessionId>`;`lane_checkpoint`(写)与只读 `batch_status` **同形失败**,lane worktree **零提交**。根因 = **索引填充面缺口**(**不是**接线逻辑错误,前批已逐条排除「宿主未加载新码」「闭包 Map ≠ 登记 Map」两候选):内存索引 `dispatchIndex` 的三条既有填充路径在自派场景**全部缺席** —— ① 启动重建(`lib/index.js:545-563`)**只跑一次**且早于批创建;② 热登记(`lib/bridge/dispatch-register.js:108`)只订阅宿主 `tools/post-execute` 且名单 `DEFAULT_DISPATCH_TOOLS = ['subagent','subagent_fork']`;③ **引擎自派写点**(`lib/engine/dispatch.js:884`)虽为「唯一写路径」写 `member.dispatch` 事件,却**不写 `dispatchIndex`** ⇒ 「**事件在盘上、索引里没有**」,resolver 恒未命中。旁证:同一份绑定数据在**磁盘扫描路命中**(`laneBindingOf`,`swarm_report` 回执自证)而**内存索引路未命中** ⇒ 失败点收敛在**填充面**,非绑定数据缺失。
|
|
60
|
+
- **本批 · 修复(三处)**:① **自派同步写(主路,确定性根源修复)**:自派成功写 `member.dispatch` 事件的**同一段同步代码内**同步 `dispatchIndex.set(...)`,消除「事件有、索引无」的分裂(`lib/engine/dispatch.js:884` 侧);② **未命中回填(兜底)**:resolver **未命中内存索引**时回落**扫事件流反查**(复用同文件既有 `laneBindingOf` 的 `member.dispatch` 判据),命中后**回填同一索引**(经 `dispatchIndexEntryOf` **单点构造**,保持既有 3 键形状与非枚举 `ownerSessionId`);③ **登记名单(防御性)**:`DEFAULT_DISPATCH_TOOLS` 补 `lane_dispatch` —— 引擎自派路径**直接调 `rt.start`**、**不经** `tools/post-execute` ⇒ 本条**不产生覆盖面**,仅为防御性登记,**不得**作为本缺陷的补救依据。**索引填充五路时序**(本批核心关系):① 启动重建(存量回溯,仅 t0)→ ② 热登记(宿主工具面增量)→ ③ **自派同步写(本批新增主路)** → ④ 结算路惰性重建(既有先例,本批**不动**)→ ⑤ **未命中回填(本批新增兜底)**;③ **先于** ⑤(自派写点在派发返回前同步落 Map ⇒ worker 首个治理调用即命中,⑤ 不触发);③⑤ **共用同一值构造单点**(冷/热读数逐字相同);⑤ **复用** ①④ 的同一事件事实源、**不新建第二套索引**,且是 ① 的**运行期补位**(① 时窗仅启动,由 ⑤ 在运行期补齐,两者判据同源、幂等同形)。
|
|
61
|
+
- **兼容性(红线,逐条钉死)**:`lib/tools/shared.js#sessionOf` 四级回落**顺序逐字不变**、`'cli'` 兜底取值式不变;**未命中且无反查数据源**(无 `store` / 反查无命中 / 反查抛错)⇒ **逐字**保持既有回落,Leader 自身行为**零变化**;`batchSessionIdOfWorker` **纯函数契约不动**(只 `get`、只认 `Map`);worker→批 反查仍**单点**(无第二套索引、**无负缓存**);索引值形状**冻结**(`Object.keys(entry)` 恰 `['sessionId','batchId','lane']`);回填**幂等**(同键覆盖 ⇒ 键数不增、不产生重复事件);导出面 / 事件常量 / `GATE_*` 码**净增 0**。⚠ 前批教训(已写入前批记录):**接线形态 ≠ 运行时连通** —— 不得以「接线在源码面在位」或「手塞 deps 的探针通过」代替数据面读数。
|
|
62
|
+
- **验证面**:单元判据(冷索引反查命中 + Map 事后含键可核 / 自派返回后**无需任何反查**即可查 / 索引形状与单点结构锁 / 回填幂等)交本批 `e2-assert` 承接并留读数;**宿主级 DoD 尚未执行**(见下「未闭合项」)。
|
|
63
|
+
- **⚠ 未闭合项(如实登记,不美化)**:**worker 侧自动会话解析的宿主级验证,在前批 `d-override-fix-20261011` 批末未通过** —— 前批 `e4-AC-8` 实拒 `Error: batch not found: smoke-session-bind-20261012 @b6d520d3-7d5a-443a-a652-7db7cc1a678f`,只读 `batch_status` 同形失败、lane worktree 零提交;**根因 = 上述索引填充面缺口**(前批按用户裁决**另开本批修**、以**带 gap** 形态收口,未冒认通过)。⇒ **本批修复后需重启宿主复验**:一次重启后真宿主演一遍 —— 引擎**自派** worker **刻意不传 `session`** 调 `lane_checkpoint` **成功提交**(事件流出现 `worktree.checkpoint`、`git log` 可见提交),并附**只读工具同形复现**(`batch_status` 不传 `session` 应可达)作为**数据面被真实填充**的证据;**补 `session` 参数重试的那次调用不属于判据**。前批另有一项未闭合(一并如实登记):建批面**非 dispatch 通道**(team 系)的**放行**半**未取运行时读数**(前批为 dispatch 通道,同批无法验)。
|
|
64
|
+
- **不升版声明 + 生效面**:本段两条批**均不升版** —— `package.json` 的 `version` **逐字保持 `0.5.0`**(Q-F:补条目但**不升版**;本批**未**改写版本号、**未**打 tag、**未**发布)。引擎代码(`lib/**`)与数据面(`presets/punky-preset/references/discipline.md`)⇒ 随宿主重启一次生效。
|
|
2
65
|
|
|
3
66
|
### 清理波:构建面收口(TD-09 + TD-21/N-13 + G-2)与长尾清理并行(2026-09-18,批 `cleanup-wave-20260918`)
|
|
4
67
|
|
package/cordis.patch.yml
CHANGED
|
@@ -151,33 +151,33 @@
|
|
|
151
151
|
name: '@deepseek-ai/dsh-persona'
|
|
152
152
|
config:
|
|
153
153
|
prefix: >-
|
|
154
|
-
你是蟛蜞模式(集群治理 on dsh)的 Leader Agent,运行于 {{model}}
|
|
154
|
+
你是蟛蜞模式(集群治理 on dsh)的 Leader Agent,运行于 {{model}},工作目录以系统提示中的 Working Directory 段为准。
|
|
155
155
|
|
|
156
156
|
职责面 = 分级 / 三层拆解(plan/exec/audit)/ wavePlan 派发 / 成员治理 / 门禁裁决;被派发的角色活由 worker 承担,简单任务由 Leader 自主完成。工具面 = assign_check(委派形态判定)+ gate_status(门禁状态查询)。纪律索引(27 条):评估派发 0/0a/0b/1/2/3/9/10 | 批与交接 0c/0e/4/5/6/0i | 运行模式 11 | 审计验收 0k/12 | 结算 0t | 恢复监管 7/0d | 输出·能力·指引 8/13/14/15 | 两方向·编号 0p/0s | 执行前检索 0u。细则面见 `references/discipline.md`。
|
|
157
|
-
0. 难度路由门禁(每轮必评,**无默认档**):先做只读侦察,再调 `assign_check
|
|
158
|
-
0a. 会话显式化:评估 / 建批 / 结算三件套传同一 session(会话 ID 或命名黑板 `<task>-<date
|
|
159
|
-
0b. 三层门禁:C 必先 `wave_plan`
|
|
157
|
+
0. 难度路由门禁(每轮必评,**无默认档**):先做只读侦察,再调 `assign_check` 写入 difficulty 与 rationale(`scope:"full"`);**单线程一律不建批**;判 C/D 而未建批前**禁执行型动作**;声明 D 而通道未落实 ⇒ 须重评或显式降级为 C,**禁静默降级**。档位取值域、双轴判定与偏离三要素见工具定义。细则见 #§0。
|
|
158
|
+
0a. 会话显式化:评估 / 建批 / 结算三件套传同一 session(会话 ID 或命名黑板 `<task>-<date>`);**隐式 session 与执行会话不一致时以显式为准**。镜像语义见工具定义。细则见 #§0a。
|
|
159
|
+
0b. 三层门禁:C 必先 `wave_plan` 建批,装配声明 `auditLane` 必填;`team` 为可选自由标签。门禁判定见工具定义。细则见 #§0b。
|
|
160
160
|
0c. 任务粗拆:拆到可派发粒度即可(角色 / 目标 / 契约 / 验收 / 产物格式)。细则见 #§0c。
|
|
161
161
|
0e. 执行 lane 任务包只含(角色 / 目标 / 关键契约 / 验收标准 / 产物契约 / 期望输出格式);实现由被指派 worker 完成。细则见 #§0e。
|
|
162
|
-
1. 任务指派:`wave_plan` 按依赖 DAG
|
|
163
|
-
2.
|
|
162
|
+
1. 任务指派:`wave_plan` 按依赖 DAG 分层;`member_status` 派发。分层语义见工具定义。细则见 #§1。
|
|
163
|
+
2. 状态:以状态文件为唯一事实源,**勿凭回执或口述推断**。细则见 #§2。
|
|
164
164
|
3. 并发与锁:写同一 lane 前 `lane_claim` 取单写者锁;同 wave 同物理资源域先取域级隔离单元并把路径注入任务包。细则见 #§3。
|
|
165
165
|
4. 黑板:治理真源 = 批次黑板(`wavePlan.tasks[]` + `handoffs` + 事件流);跨上下文只写元数据、不复制正文。细则见 #§4。
|
|
166
166
|
5. 结算与终门禁:完成 / 失败用 `member_settle`;终门禁先消重、标注冲突、核证据再下结论。细则见 #§5。
|
|
167
167
|
6. 门禁:review 阶段按门禁语义裁决 merged / conflict;批次终态后不再写。细则见 #§6。
|
|
168
|
-
7. 恢复:`idle`
|
|
168
|
+
7. 恢复:`idle` 是空闲态,`idle→running` 即返工 / 续跑入口;重启后须先 `batch_status` 核对再重派。细则见 #§7。
|
|
169
169
|
8. 输出偏好:总结用「对比表 + 清单 + 摘要」三层;对用户只报治理结论与关键状态。细则见 #§8。
|
|
170
170
|
9. 消费方契约摸底先行:实现前先摸底被消费方约束(摸底归 plan 层 produce、实现 lane 只 consume,缺则拒派);产物 `survey/<target>-contract.md`。细则见 #§9。
|
|
171
171
|
10. 宿主级自验证 DoD:产出运行于真实宿主 / 消费路径时,完成判据必含宿主级加载 / 启动冒烟(RED→GREEN 作中间 checkpoint)。细则见 #§10。
|
|
172
|
-
11. 运行模式:星型直驱(`leader-direct
|
|
173
|
-
12. **audit 非盲审**:audit 审核 exec 层必须**消费 plan
|
|
172
|
+
11. 运行模式:星型直驱(`leader-direct`)——结算即派、复核并行、单点派发、真源 = `lanes[].deps` + `handoffs`、监管二源、模式可退出。细则见 #§11。
|
|
173
|
+
12. **audit 非盲审**:audit 审核 exec 层必须**消费 plan 层产物做对照**(`consume` 缺 `plan/` 锚点即拒派,锚点正文须含裸标题 `## 验收标准`)。**`consume` 与 `deps` 须逐条对齐**,且**上游结算后缺边永久不可补** ⇒ 写 `consume` 时即核 `deps`。拒建批码、三档分流与豁免条件见工具定义(`wave_plan`)。细则见 #§12。
|
|
174
174
|
13. **指引维护**:改注入面或正文后必须跑 `node scripts/check-guidance-sync.mjs`(五件同 sha + 双向指针);**GREEN(exit 0)才算收口**。细则见 #§13。
|
|
175
175
|
14. **任务包预算**:单 lane `W` ∈ 4M–10M(`W ≈ 轮次 × 232K`);派发前必带预算行(`预算:W≈…M;切法:…`)。细则见 #§14。
|
|
176
176
|
15. 判据 / 基线 / 并行读数:判据带限定量词;改动前落 sha256 快照;`baselines/**` 单写者 = Leader;并行窗口 lane 自证写域子集;新增校验须给可达构造;批边界归属须留痕。细则见 #§15。
|
|
177
177
|
0d. 记忆语义:复盘 / 归档产物落盘即可,记忆沉淀优先 dsh-mneme。细则见 #§0d。
|
|
178
178
|
0i. 执行形态:C 类批一律走 wavePlan lane 派发;每完成一子步骤即落 `<lane>/progress/NN-<slug>.md` 进度快照,禁攒批。
|
|
179
179
|
0k. audit 收敛口径:audit 层 = 验收,按 plan 验收标准逐条核对;未决项进 `gap-list`(标 blocking / followup)。细则见 #§0k。
|
|
180
|
-
0p. 两方向规格:dispatch
|
|
180
|
+
0p. 两方向规格:dispatch = 写黑板后引擎自动派发;team = `spawn_teammate` 拉起并写黑板、由事件队列交接;**一批一方向,不混用**。细则见 #§0p 与 #§0o。
|
|
181
181
|
0s. 编号规范:跨批引用带批次短码(如 `AG-04@realign`);`AG-xx` 权威定义面 = 批 A `audit/gap-list.md`。
|
|
182
182
|
0t. 完成发现与结算:audit lane 不自动结算 ⇒ 显式 `member_status(review)` → `member_settle(merged|conflict)`;完成发现靠三查(`batch_status` / `log_export` / 产物根 glob);abort 批的 `danglingLanes` 属预期残留。
|
|
183
183
|
0u. 执行前经验检索:每任务第一步 = `weknora_search` 查知识库经验;命中即按其「正向做法」执行并登记来源,无命中照常推进;库不可达记一行后继续。细则见 #§0u。
|
|
@@ -49,7 +49,7 @@
|
|
|
49
49
|
|
|
50
50
|
- **能力结论**:`toolBan` 是**启发式、非沙箱**的写通道路由判定——只收敛「无意识地用 shell(pwsh)写盘代替 edit/write」这一主路径;别名(`sc` / `ni` / `ri` / `mi`)、脚本文件(`pwsh -File x.ps1`)、转义参数、编码方式均可绕过;「内联解释器写」(`node -e "fs.writeFileSync(...)"` / `python -c "open(...,'w')"`)**首批不覆盖**(followup)。**不承诺**等价于 OS 级隔离,也**不承诺**编码安全——真正的编码保证来自 edit/write 工具链本身(UTF-8 无 BOM)。
|
|
51
51
|
- **拦截面收窄**(用户裁决 Q3/Q6):只判「修改或写文件」这一类动作;执行 / 构建 / 测试 / 包管理 / 只读命令一律放行(`npm run build`、`npm test`、`node x.mjs`、`git status`、`Get-ChildItem` 均不命中)——构建与测试本身要写盘,拦它们会断裂常规开发闭环。
|
|
52
|
-
- **与执行引擎无关**(用户裁决 Q4):判定实现在护栏内(`lib/governance/tool-ban.ts`),**不 import / 不修改** `lib/tools/readonly.js
|
|
52
|
+
- **与执行引擎无关**(用户裁决 Q4):判定实现在护栏内(`lib/governance/tool-ban.ts`),**不 import / 不修改** `lib/tools/readonly.js`(任务难度门禁「只读侦察面」在执行侧使用的共享判定,服务的是另一个问题:评估前能否跑侦察命令);两处**判定逻辑**各自独立、互不影响。**唯一共享面 = shell 文本预处理单点** `lib/shell-text.js`(`stripStreamMerges` + `segmentCommands`,DEBT-3 真单点化):护栏**不再自抄第三份分段器**,`.punky/arch.yml` 已登记授权对 `governance -> (lib-root)`(理由见该次提交信息)。
|
|
53
53
|
- **生效通道**:① 热加载(`<root>/config/runtime.json` 的 `governance.hook.toolBan`——进 resolved 快照 ⇒ 既有 remount 比较器零改动感知变化 → dispose + 重挂,**免重启**);② 随包 preset `l3-tool-ban`(引用键,注册 id 枚举需 boot 装载一次,即**重启宿主一次**)。
|
|
54
54
|
- **出厂默认**:`toolBan: []` = 零拦截(与 `rules: []` 同口径,装上即用、不改变既有行为)。
|
|
55
55
|
- **证据位点**:判定链与条目结构见 [guardrails-hook.md](guardrails-hook.md) §2「第三类判定面」与 §3 配置;逐条清单见 `presets/hook-rules/README.md`「L3 工具黑名单」表。
|
package/lib/acps/certs.js
CHANGED
|
@@ -190,10 +190,6 @@ function b64url(buf) {
|
|
|
190
190
|
return buf.toString('base64').replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
function unb64url(str) {
|
|
194
|
-
return Buffer.from(str.replace(/-/g, '+').replace(/_/g, '/'), 'base64');
|
|
195
|
-
}
|
|
196
|
-
|
|
197
193
|
// 加密 EAB 凭据(keyId/macKey 不落明文)→ 信封对象 { v, alg, aic, expiresAt, iv, tag, ct }
|
|
198
194
|
export function encryptEabCredential(credential, keyInput) {
|
|
199
195
|
if (!credential || typeof credential !== 'object') {
|
package/lib/acps/server.js
CHANGED
|
@@ -39,6 +39,8 @@ import { DEFAULT_ASSEMBLY } from '../assembly.js';
|
|
|
39
39
|
import { engineVersion } from '../aip/tool-descriptor.js';
|
|
40
40
|
import { ensureAcpsCerts } from './certs.js';
|
|
41
41
|
import { AIP_COMMAND_TYPES as TASK_COMMAND_TYPES, TASK_STATES } from '../comms/aip-format.js';
|
|
42
|
+
// JSON 响应写端单点((lib-root) 中立件;与 lib/api.js 同源)
|
|
43
|
+
import { sendJson } from '../json-response.js';
|
|
42
44
|
|
|
43
45
|
// ── AIP RPC 常量(对齐参考实现 aip_base_model.py:23-49 / aip_rpc_model.py:15-57)──
|
|
44
46
|
export const JSONRPC_VERSION = '2.0';
|
|
@@ -169,12 +171,6 @@ function readBody(req) {
|
|
|
169
171
|
return Promise.resolve({});
|
|
170
172
|
}
|
|
171
173
|
|
|
172
|
-
function sendJson(res, status, data) {
|
|
173
|
-
const body = JSON.stringify(data);
|
|
174
|
-
res.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
175
|
-
res.end(body);
|
|
176
|
-
}
|
|
177
|
-
|
|
178
174
|
/**
|
|
179
175
|
* 创建 ACPs 对外 mTLS 服务端点(纯工厂,不自动 listen)
|
|
180
176
|
* @param {object} opts { config, logger?, acsProvider?, rpcHandler?, healthProvider?, certDir? }
|
package/lib/api.js
CHANGED
|
@@ -31,12 +31,8 @@ import * as EVT from './state/event-types.js';
|
|
|
31
31
|
// WebUI 治理配置写通道:/config 端点 trusted 判定(自复刻宿主 /api
|
|
32
32
|
// 护栏语义,宿主未导出故复刻——插件 exact 路由不经宿主护栏,写端点须自理,见 config-trust.js)
|
|
33
33
|
import { isTrustedConfigRequest } from './webui/config-trust.js';
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
const body = JSON.stringify(data);
|
|
37
|
-
res.writeHead(status, { 'Content-Type': 'application/json; charset=utf-8' });
|
|
38
|
-
res.end(body);
|
|
39
|
-
}
|
|
34
|
+
// JSON 响应写端单点((lib-root) 中立件;与 lib/acps/server.js 同源)
|
|
35
|
+
import { sendJson } from './json-response.js';
|
|
40
36
|
|
|
41
37
|
function q(url) {
|
|
42
38
|
return Object.fromEntries(new URL(url, 'http://localhost').searchParams.entries());
|
|
@@ -33,7 +33,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
33
33
|
// 范围红线:零引擎改动(wave-plan.js / gates.js / store.js 等一律不碰)——盲审 = 装配数据 + 既有工具编排。
|
|
34
34
|
|
|
35
35
|
// ── 三角色映射(layer=audit,skills 手册前缀;Leader 显式声明或经 applyAssemblyExtensions 合并补全)──
|
|
36
|
-
|
|
36
|
+
// 单点 = `lib/assembly/schema.js:BLIND_REVIEW_ROLES`(W1b/A-2 收敛);本文件**保留同名 re-export**
|
|
37
|
+
// (`test/audit-blind-review.test.js` 从本文件 import 该符号,导入面不得断)。
|
|
38
|
+
// 两条语句各有职责:`import` 供本文件内部消费(:applyAssemblyExtensions 遍历),
|
|
39
|
+
// `export … from` 保导出面 —— 纯 re-export **不创建本地绑定**,故不可省 import。
|
|
40
|
+
import { BLIND_REVIEW_ROLES } from './schema.js';
|
|
41
|
+
export { BLIND_REVIEW_ROLES } from './schema.js';
|
|
37
42
|
|
|
38
43
|
export const BLIND_REVIEW_SKILLS = {
|
|
39
44
|
'audit-panelist': ['report-blind-audit', 'code-review-guideline'], // 事实核验 + 对抗式打分(rubric/checklist)
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/*
|
|
2
|
+
Copyright (C) 2025-2026 Punky
|
|
3
|
+
|
|
4
|
+
This program is free software: you can redistribute it and/or modify
|
|
5
|
+
it under the terms of the GNU Affero General Public License as
|
|
6
|
+
published by the Free Software Foundation, either version 3 of the
|
|
7
|
+
License, or (at your option) any later version.
|
|
8
|
+
|
|
9
|
+
This program is distributed in the hope that it will be useful,
|
|
10
|
+
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
11
|
+
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
12
|
+
GNU Affero General Public License for more details.
|
|
13
|
+
|
|
14
|
+
You should have received a copy of the GNU Affero General Public License
|
|
15
|
+
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
// 装配解析(【2026-09-27 · team-asset 全量退役】已无资产读端)与包根解析
|
|
19
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
20
|
+
// 现语义:**装配数据唯一真源 = `config.assembly`**(外部覆盖层,整份优先);无覆盖层 ⇒ `null`
|
|
21
|
+
// (调用方自行回落内置常量,如 `lib/tools/register.js` / `lib/acps/server.js` 用 `DEFAULT_ASSEMBLY`)。
|
|
22
|
+
// 「包内 `presets/<team>/team-asset.yml` 的 `layers` 段」这一权威源**已随资产面整体删除**
|
|
23
|
+
// (A-5 判据:本文件对 `team-asset` 的 import 面归零)。
|
|
24
|
+
// **零新默认值**:不得在此代造任何 `team → 装配` 映射(`team` 参数自 2026-09-27 起 = 纯归类标签)。
|
|
25
|
+
// punky-preset 团队装配**已弃用**(同上);`DEFAULT_ASSEMBLY` = **活路径**:它是 `lib/tools/register.js:64` 与 `lib/acps/server.js:134` 的**缺省回落值**,并供 `lib/index.js:321` 派生 agent descriptors;内容 = software-team 装配。
|
|
26
|
+
// 历史(保留可读):原解析顺序 = ① `config.assembly` → ② 包内团队资产 → ③ 无资产即 `null`。
|
|
27
|
+
// 【W5/R-9 · 2026-10-18】本常量自 `lib/assembly.js` **原样迁出**(内容与注释逐字未改)——
|
|
28
|
+
// 单点 = 本文件;包级根 `lib/assembly.js` 保形再导出,消费方一行不改。
|
|
29
|
+
export const DEFAULT_ASSEMBLY = {
|
|
30
|
+
team: 'software-team',
|
|
31
|
+
layers: {
|
|
32
|
+
plan: {
|
|
33
|
+
roles: ['coordinator', 'designer'],
|
|
34
|
+
skills: { coordinator: ['brainstorming', 'writing-plans'], designer: ['brainstorming', 'writing-plans', 'spec-writing'] },
|
|
35
|
+
},
|
|
36
|
+
exec: {
|
|
37
|
+
roles: ['coder', 'tester', 'reviewer'],
|
|
38
|
+
skills: {
|
|
39
|
+
coder: ['test-driven-development', 'codebase-design', 'receiving-code-review', 'requesting-code-review'],
|
|
40
|
+
tester: ['verification-before-completion', 'systematic-debugging'],
|
|
41
|
+
reviewer: ['review-execution'],
|
|
42
|
+
},
|
|
43
|
+
},
|
|
44
|
+
audit: {
|
|
45
|
+
roles: ['supervisor', 'doc-manager'],
|
|
46
|
+
skills: {
|
|
47
|
+
supervisor: ['acceptance-gate', 'verification-before-completion'],
|
|
48
|
+
'doc-manager': ['doc-generator', 'retro-and-memory'],
|
|
49
|
+
reviewer: ['review-execution'],
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
},
|
|
53
|
+
};
|
package/lib/assembly/flows.js
CHANGED
|
@@ -43,15 +43,12 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
43
43
|
// 零读端声明 → declarationSummaryOf(flows) 汇总 `unwired`(state_machine / progress_contract /
|
|
44
44
|
// rework 的**未接线标注**,来源 team-asset.js 的台账;`consume_field` 已于 S19① 接线 ⇒ 不在台账)
|
|
45
45
|
|
|
46
|
-
import { fileURLToPath } from 'node:url';
|
|
47
46
|
// 【2026-09-27 · team-asset 全量退役】原 import 面(资产装载器 / 资产签名 / 码族常量表 /
|
|
48
47
|
// 严重级常量表 / blocking 判据 / 未接线台账读函数 —— 字面量见上游 team-asset.js)
|
|
49
48
|
// 随资产读端**整体删除**(A-5 / A-6 判据:本文件对 `team-asset` 的 import 面与码面归零)。
|
|
50
49
|
|
|
51
|
-
/**
|
|
52
|
-
export
|
|
53
|
-
return fileURLToPath(new URL('../../', import.meta.url));
|
|
54
|
-
}
|
|
50
|
+
/** 包根目录:**单点** = `lib/assets.js`(W1a/A-4 收敛;本文件不再自算 `import.meta.url` 深度)。 */
|
|
51
|
+
export { packageRoot } from '../assets.js';
|
|
55
52
|
|
|
56
53
|
/**
|
|
57
54
|
* 引擎基线:**验收标准(criteria)章节名** —— 判据「全中文」的**单一真源**(2026-09-21 用户裁定)。
|
package/lib/assembly/schema.js
CHANGED
|
@@ -24,8 +24,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
24
24
|
import { WATCH_DEFAULTS, TRAJECTORY_DEFAULTS, VERIFY_DEFAULTS, DISCOVERY_DEFAULTS, ACPS_DEFAULTS } from '../schema.js';
|
|
25
25
|
import { AUDITLOG_DEFAULTS } from '../auditlog/config.js';
|
|
26
26
|
|
|
27
|
-
// ── 能力注册表(
|
|
28
|
-
// path = config 取值路径;default = 缺省值(
|
|
27
|
+
// ── 能力注册表(13 键:aip/identity/discovery/verify/watch/worktree/budget/injectBudget/trajectory/acps/auditlog/logs/topic)──
|
|
28
|
+
// path = config 取值路径;default = 缺省值(9 键默认开——aip/discovery/verify/watch/worktree/budget/injectBudget/trajectory/auditlog;
|
|
29
29
|
// 显式 enabled:false 可逐键关闭;4 键默认关——identity/acps/logs/topic,需显式开启);
|
|
30
30
|
// consumers = 既有消费点(键路径一致性依据)
|
|
31
31
|
// identity 键:身份体系默认关——config.aip.identity.enabled === true 时
|
|
@@ -43,6 +43,12 @@ export const CAPABILITY_REGISTRY = [
|
|
|
43
43
|
{ key: 'watch', path: ['capabilities', 'watch'], default: WATCH_DEFAULTS, consumers: ['index.js watchdog + watch/lane-heartbeat.js'] },
|
|
44
44
|
{ key: 'worktree', path: ['capabilities', 'worktree'], default: { enabled: true, mergeAgent: { enabled: false, model: null, timeoutMs: 600000 } }, consumers: ['tools/lane-tools.js 三工具注册'] },
|
|
45
45
|
{ key: 'budget', path: ['capabilities', 'budget'], default: { enabled: true, maxChainHops: 4, maxChainRoundTrips: 2 }, consumers: ['comms/budget.js + mailbox-tools.js 发送检查'] },
|
|
46
|
+
// injectBudget 键:注入面字节预算(四层:每源软上限 / 总量硬上限 / head-tail 截断 / 显式省略标记)。
|
|
47
|
+
// 与上一行 budget 键**语义正交、互不复用**:budget = mailbox 链环防护(hop/round-trip),本键 = 注入文本字节上限。
|
|
48
|
+
// 默认开 ⇒ 与「零回归靠未超限不动作、不靠默认关」的取值口径一致(无需进测试 OFF_KEYS)。
|
|
49
|
+
// 阈值取值唯一源 = 本条目;实现侧禁止散落字面量。位宽对齐宿主日志行物理上限(auditlog 的 MAX_LINE_BYTES)。
|
|
50
|
+
// 消费点:engine/dispatch.js 任务包、tools/handoff-tools.js 交接注入、tools/swarm-comms.js lane 回报。
|
|
51
|
+
{ key: 'injectBudget', path: ['capabilities', 'injectBudget'], default: { enabled: true, perItemBytes: 3072, perBlockBytes: 12288, totalBytes: 32768, headBytes: 2048, tailBytes: 1024 }, consumers: ['comms/inject-budget.js + engine/dispatch.js + tools/handoff-tools.js + tools/swarm-comms.js'] },
|
|
46
52
|
{ key: 'trajectory', path: ['capabilities', 'trajectory'], default: TRAJECTORY_DEFAULTS, consumers: ['index.js 桥接订阅'] },
|
|
47
53
|
// logs 键:日志导出工具注册开关——默认关(与 cordis.patch.yml 显式 logs.enabled:true 相合);
|
|
48
54
|
// 消费点经 readCapability(config,'logs') 缺省读取,显式 enabled:false 可关。
|
|
@@ -93,6 +99,55 @@ export function readCapability(config, key) {
|
|
|
93
99
|
return deepMerge(entry.default, val);
|
|
94
100
|
}
|
|
95
101
|
|
|
102
|
+
// ── C-5 · 坏配置加载期 fail-closed(消除静默降级)────────────────────────────
|
|
103
|
+
// 存在理由:`capabilities.injectBudget` 的五个阈值此前**无任何校验** ⇒ `runtime.json` 写
|
|
104
|
+
// `{enabled:true,totalBytes:-1}` 会**通过白名单后静默降级**(`inject-budget.js` 的「无可用阈值 ⇒ 零动作」
|
|
105
|
+
// 是**契约**,故不会报错,只会静默地把整条预算关掉)⇒ 本组校验把该形态改为**可见的拒绝**。
|
|
106
|
+
// 语义边界(**不得混淆**):本组只管「**坏配置**」;`inject-budget.js` 中「未超限 / 开关关 / 无可用阈值 ⇒
|
|
107
|
+
// 返回入参原值本身、零省略」是**文档化契约**(`:165` 逐字),**不是**本组要消除的对象 —— 该件一字不动。
|
|
108
|
+
//
|
|
109
|
+
// 五个阈值字段(**唯一字段清单**;禁第二套字面量表)。
|
|
110
|
+
export const INJECT_BUDGET_LIMIT_FIELDS = Object.freeze([
|
|
111
|
+
'perItemBytes',
|
|
112
|
+
'perBlockBytes',
|
|
113
|
+
'totalBytes',
|
|
114
|
+
'headBytes',
|
|
115
|
+
'tailBytes',
|
|
116
|
+
]);
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* **单一判定点**(`DEP-N` 值校验):`injectBudget` 是否为**可用的有限正数阈值**。
|
|
120
|
+
* 两个调用方共用本函数 ⇒ 启动期与热更通道**同判、文案同源、零漂移**:
|
|
121
|
+
* · `validateCapabilities`(本文件;经 `lib/index.js` 装配期 warn)
|
|
122
|
+
* · `validateOverlay`(`lib/hot/config-watch.js`;**热更通道**,拒则整份 overlay 不采用)
|
|
123
|
+
*
|
|
124
|
+
* 判定口径:
|
|
125
|
+
* · `enabled !== true` ⇒ **零校验**(与 DEP-1..DEP-5 同形:禁用能力零校验零开销);
|
|
126
|
+
* · 五字段**逐个**:`!== undefined` 才查(缺省不误伤),须为**有限正数**
|
|
127
|
+
* (`0` / 负 / `NaN` / `Infinity` / 字符串 全拒);文案含**字段名**与**实得值**。
|
|
128
|
+
* @param {unknown} block `capabilities.injectBudget` 显式声明的值
|
|
129
|
+
* @returns {string[]} 错误文案(空数组 = 合法)
|
|
130
|
+
*/
|
|
131
|
+
export function injectBudgetValueErrors(block) {
|
|
132
|
+
const errors = [];
|
|
133
|
+
if (block === undefined || block === null) return errors;
|
|
134
|
+
if (typeof block !== 'object' || Array.isArray(block)) {
|
|
135
|
+
// 非对象(`5` / `"on"` / `true`):`?.enabled` 取不到 ⇒ 预算会被**静默禁用且无痕**(同族静默面)。
|
|
136
|
+
errors.push('DEP-6: capabilities.injectBudget must be an object (got ' + JSON.stringify(block) + ')');
|
|
137
|
+
return errors;
|
|
138
|
+
}
|
|
139
|
+
if (block.enabled !== true) return errors;
|
|
140
|
+
for (const field of INJECT_BUDGET_LIMIT_FIELDS) {
|
|
141
|
+
const v = block[field];
|
|
142
|
+
if (v === undefined) continue;
|
|
143
|
+
if (typeof v !== 'number' || !Number.isFinite(v) || v <= 0) {
|
|
144
|
+
errors.push('DEP-6: capabilities.injectBudget.' + field
|
|
145
|
+
+ ' must be a finite positive number (got ' + JSON.stringify(v) + ')');
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return errors;
|
|
149
|
+
}
|
|
150
|
+
|
|
96
151
|
// ── 校验:仅对显式 enabled 的非法组合报错;禁用能力零校验零开销 ──
|
|
97
152
|
export function validateCapabilities(config = {}) {
|
|
98
153
|
const errors = [];
|
|
@@ -135,6 +190,20 @@ export function validateCapabilities(config = {}) {
|
|
|
135
190
|
}
|
|
136
191
|
}
|
|
137
192
|
|
|
193
|
+
// DEP-6(包内写作 `DEP-N`):injectBudget 五阈值在 `enabled === true` 时须为**有限正数**。
|
|
194
|
+
// 落点理由:该键此前**零校验** ⇒ `totalBytes:-1` 一类坏值通过白名单后被**静默降级**(无任何报错)。
|
|
195
|
+
// 与 DEP-1..DEP-5 **同形**:仅显式 `enabled === true` 时校验值、字段缺省不误伤、文案 `DEP-6: …(got …)`。
|
|
196
|
+
//
|
|
197
|
+
// ⚠ **调用门不得写成 `c.injectBudget?.enabled === true`**(本 lane 自测抓出的真实缺陷,见 progress 03):
|
|
198
|
+
// 非对象形态(`injectBudget: 5`)取 `?.enabled` 得 `undefined` ⇒ 门为假 ⇒ **判定点根本看不到它**
|
|
199
|
+
// ⇒ 「坏配置被静默吞掉」的原病照旧(`5` 经 `deepMerge` 后同样让预算静默失效)。
|
|
200
|
+
// ⇒ 门只按「**是否显式声明**」开:`!== undefined` 即交判定点;`enabled !== true` 的**零校验**语义
|
|
201
|
+
// 由判定点自己实现(`injectBudgetValueErrors`),**既不误伤禁用态、也不漏放非对象**。
|
|
202
|
+
// `null` 不入判定点:`deepMerge(default, null)` 回落到注册表默认(预算照常生效)⇒ 无静默危害,不拒。
|
|
203
|
+
if (c.injectBudget !== undefined) {
|
|
204
|
+
errors.push(...injectBudgetValueErrors(c.injectBudget));
|
|
205
|
+
}
|
|
206
|
+
|
|
138
207
|
// MUTEX:互斥表(当前空表,无天然互斥;心跳/预算/worktree/verify/trajectory/aip 两两可叠加)
|
|
139
208
|
for (const ex of EXCLUSIONS) {
|
|
140
209
|
const on = ex.keys.filter((k) => readCapability(config, k)?.enabled === true);
|
package/lib/assembly.js
CHANGED
|
@@ -15,40 +15,10 @@ You should have received a copy of the GNU Affero General Public License
|
|
|
15
15
|
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
16
16
|
*/
|
|
17
17
|
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
|
|
22
|
-
// 「包内 `presets/<team>/team-asset.yml` 的 `layers` 段」这一权威源**已随资产面整体删除**
|
|
23
|
-
// (A-5 判据:本文件对 `team-asset` 的 import 面归零)。
|
|
24
|
-
// **零新默认值**:不得在此代造任何 `team → 装配` 映射(`team` 参数自 2026-09-27 起 = 纯归类标签)。
|
|
25
|
-
// punky-preset 团队装配**已弃用**(同上);`DEFAULT_ASSEMBLY` = **活路径**:它是 `lib/tools/register.js:64` 与 `lib/acps/server.js:134` 的**缺省回落值**,并供 `lib/index.js:321` 派生 agent descriptors;内容 = software-team 装配。
|
|
26
|
-
// 历史(保留可读):原解析顺序 = ① `config.assembly` → ② 包内团队资产 → ③ 无资产即 `null`。
|
|
27
|
-
export const DEFAULT_ASSEMBLY = {
|
|
28
|
-
team: 'software-team',
|
|
29
|
-
layers: {
|
|
30
|
-
plan: {
|
|
31
|
-
roles: ['coordinator', 'designer'],
|
|
32
|
-
skills: { coordinator: ['brainstorming', 'writing-plans'], designer: ['brainstorming', 'writing-plans', 'spec-writing'] },
|
|
33
|
-
},
|
|
34
|
-
exec: {
|
|
35
|
-
roles: ['coder', 'tester', 'reviewer'],
|
|
36
|
-
skills: {
|
|
37
|
-
coder: ['test-driven-development', 'codebase-design', 'receiving-code-review', 'requesting-code-review'],
|
|
38
|
-
tester: ['verification-before-completion', 'systematic-debugging'],
|
|
39
|
-
reviewer: ['review-execution'],
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
audit: {
|
|
43
|
-
roles: ['supervisor', 'doc-manager'],
|
|
44
|
-
skills: {
|
|
45
|
-
supervisor: ['acceptance-gate', 'verification-before-completion'],
|
|
46
|
-
'doc-manager': ['doc-generator', 'retro-and-memory'],
|
|
47
|
-
reviewer: ['review-execution'],
|
|
48
|
-
},
|
|
49
|
-
},
|
|
50
|
-
},
|
|
51
|
-
};
|
|
18
|
+
// 缺省装配数据单点已迁出(W5/R-9):`lib/assembly/defaults.js`;本文件**保形再导出**,
|
|
19
|
+
// 消费方(`lib/acps/server.js` / `lib/tools/register.js` / `lib/index.js`)一行不改。
|
|
20
|
+
// 语义注释与常量内容随迁(逐字未改)。
|
|
21
|
+
export { DEFAULT_ASSEMBLY } from './assembly/defaults.js';
|
|
52
22
|
|
|
53
23
|
/**
|
|
54
24
|
* 装配解析(**唯一真源 = `config.assembly`**)。
|
package/lib/auditlog/sink.js
CHANGED
|
@@ -440,10 +440,6 @@ function segmentPath(day, segment) {
|
|
|
440
440
|
: path.join(state.sinkDir, 'audit-' + day + '.' + segment + '.jsonl');
|
|
441
441
|
}
|
|
442
442
|
|
|
443
|
-
function mainSegmentPath() {
|
|
444
|
-
return segmentPath(localDateKey(new Date()), 0);
|
|
445
|
-
}
|
|
446
|
-
|
|
447
443
|
function currentSegmentPath() {
|
|
448
444
|
return segmentPath(localDateKey(new Date()), state.segment);
|
|
449
445
|
}
|
package/lib/comms/acps-bridge.js
CHANGED
|
@@ -27,8 +27,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
27
27
|
// 桥不自带监听——/rpc 监听归 endpoint 侧(衔接点见 handleInbound/toTaskResult 签名)。
|
|
28
28
|
// - 生命周期:start/stop/dispose 幂等(开→关销毁、关→开重建,秒级无迁移)。
|
|
29
29
|
|
|
30
|
-
import { join } from 'node:path';
|
|
31
30
|
import * as mailbox from './mailbox.js';
|
|
31
|
+
import { mailboxRootOf } from './mailbox-paths.js';
|
|
32
32
|
import {
|
|
33
33
|
toAipMessage,
|
|
34
34
|
toAipTask,
|
|
@@ -42,10 +42,6 @@ import { resolveBridgeConfig } from '../schema.js';
|
|
|
42
42
|
// lane 合法性(与 mailbox.js sanitizeLane 同正则,fail-soft:外部输入不合法 → null 而非 throw)
|
|
43
43
|
const LANE_RE = /^[a-zA-Z0-9._-]+$/;
|
|
44
44
|
|
|
45
|
-
function boxRoot(root, sessionId, batchId) {
|
|
46
|
-
return join(root, 'sessions', sessionId, 'mailbox', batchId);
|
|
47
|
-
}
|
|
48
|
-
|
|
49
45
|
// ── inbound:ACPs TaskCommand → mailbox 消息(纯转换,不写存储)──
|
|
50
46
|
// lane 推导:mentions 单元素数组/非 'all' 字符串 → 该值;否则 groupId;均非法 → null(inbox 无 lane 概念,
|
|
51
47
|
// lane 仅为路由元数据)。mentions='all'(广播语义)外部投递不支持 → null(外部不可写 broadcast,红线)。
|
|
@@ -86,7 +82,7 @@ export function deliverInbound(root, sessionId, batchId, taskCommand, { inboundE
|
|
|
86
82
|
return { ok: false, code: 'INBOUND_DISABLED', detail: 'acps.bridge.inbound is false: external writes to mailbox disabled' };
|
|
87
83
|
}
|
|
88
84
|
const { message, meta } = taskCommandToInbound(taskCommand);
|
|
89
|
-
const res = mailbox.send(
|
|
85
|
+
const res = mailbox.send(mailboxRootOf(root, sessionId, batchId), { type: 'inbox' }, message, meta);
|
|
90
86
|
return { ok: res.ok, ackId: res.ackId, lane: meta.lane };
|
|
91
87
|
}
|
|
92
88
|
|