@lqc123qwe/car-runtime 1.0.0-rc.1 → 1.0.0

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.
Files changed (58) hide show
  1. package/.gitattributes +11 -0
  2. package/.github/workflows/ci.yml +273 -4
  3. package/.github/workflows/release.yml +10 -2
  4. package/README.md +50 -12
  5. package/adr/mlps-audit-checklist.md +8 -0
  6. package/docs/plugin-authoring.md +82 -0
  7. package/native/landlock-run/Makefile +19 -0
  8. package/native/landlock-run/landlock-run.c +162 -0
  9. package/package.json +4 -1
  10. package/scripts/contract-check.ts +56 -0
  11. package/scripts/invariant-n1.ts +96 -0
  12. package/scripts/package-check.ts +29 -0
  13. package/scripts/ptc-baseline/run-baseline.ts +1 -1
  14. package/scripts/release-pipeline.ts +47 -9
  15. package/scripts/secrets-baseline.ts +33 -0
  16. package/scripts/secrets-scan.ts +56 -0
  17. package/scripts/win32-ffi-debug.ts +143 -0
  18. package/scripts/win32-koffi-spike.ts +524 -21
  19. package/src/cli.ts +153 -17
  20. package/src/dx/doctor.ts +64 -0
  21. package/src/host/facade.ts +27 -1
  22. package/src/host/hostGateway.ts +7 -4
  23. package/src/host/stdio.ts +1 -1
  24. package/src/kernel/context.ts +2 -1
  25. package/src/load/loader.ts +7 -1
  26. package/src/load/report.ts +386 -0
  27. package/src/load/sigGate.ts +87 -0
  28. package/src/load/verifier.ts +6 -0
  29. package/src/mcp/gateway.ts +5 -2
  30. package/src/ptc/schemaRender.ts +96 -0
  31. package/src/ptc/sdk.ts +23 -7
  32. package/src/security/secrets-baseline.ts +191 -0
  33. package/src/security/secrets.ts +28 -3
  34. package/src/session/export.ts +3 -1
  35. package/src/session/fork.ts +89 -0
  36. package/src/session/format.ts +61 -0
  37. package/src/session/indexStore.ts +110 -0
  38. package/src/session/log.ts +54 -11
  39. package/src/session/store.ts +39 -0
  40. package/test/contract/eventmap.golden.json +7 -0
  41. package/test/fixtures/hello-plugin.ts +5 -0
  42. package/test/registry-e2e/run-e2e.ts +213 -0
  43. package/test/s11.spec.ts +2 -2
  44. package/test/s12.spec.ts +2 -2
  45. package/test/s16.spec.ts +133 -0
  46. package/test/s18.spec.ts +1 -1
  47. package/test/s19.spec.ts +138 -0
  48. package/test/s20.spec.ts +241 -0
  49. package/test/s21.spec.ts +231 -0
  50. package/test/s22-m7-store-format.spec.ts +135 -0
  51. package/test/s23-m7-export-index.spec.ts +189 -0
  52. package/test/s24-signature-gate.spec.ts +185 -0
  53. package/test/s4.spec.ts +1 -1
  54. package/test/s7.spec.ts +2 -1
  55. package/test/s7b-baseline.spec.ts +20 -0
  56. package/test/sandbox-escape/j17-orchestrate.sh +30 -0
  57. package/test/sandbox-escape/run-matrix.sh +98 -0
  58. package/tsconfig.json +18 -0
package/.gitattributes ADDED
@@ -0,0 +1,11 @@
1
+ # 行尾纪律:Windows runner checkout 默认 autocrlf=true 会把文本文件打成 CRLF,
2
+ # WSL 内 bash 脚本遇 \r 即炸(run 35314482866:set: pipefail\r invalid option)。
3
+ * text=auto
4
+ *.sh text eol=lf
5
+ *.c text eol=lf
6
+ *.h text eol=lf
7
+ Makefile text eol=lf
8
+ *.md text eol=lf
9
+ *.yml text eol=lf
10
+ *.json text eol=lf
11
+ *.ts text eol=lf
@@ -1,12 +1,281 @@
1
+ # CI 门禁矩阵(M2部署设计增补 §2.3 16 Job + M3部署设计增补 §2.2 增列 J-17/J-18 = 18 Job ≤ 20)
2
+ #
3
+ # 落地口径(2026-09-18,实施记录见 car-docs/10-内核v1/M3部署设计增补.md 追记):
4
+ # - 矩阵 Job 名对齐文档编号(j01-.../j02-...),required check = j05/j07/j17/j18(G-07 载体 + E-2 收编 + WSL2 对等层 + registry E2E);
5
+ # - 测试/逃逸 Job 禁止重试(M2 §2.4 纪律);仅打包 Job 允许维护者判定后 rerun;
6
+ # - 构建单源:landlock-run 仅在 j01 编译(linux-x64-gnu),j05/j17 消费 artifact 并校验 sha256,禁止平台内重编译(M3 §2.1.2);
7
+ # - J-06 escape-macos = 冻结态登记(M3 §2.4 纪律):macOS Seatbelt 仅 M2-S7 生成器实装,
8
+ # 实跑用例不存在——不设 Job,非 CI 项登记于本注释与文档追记,复核时点 = macOS 实装启动;
9
+ # darwin 逃逸回归的现状覆盖 = j03 全量单测(含 buildSeatbeltProfile 生成器断言);
10
+ # - J-16 release-merge = release.yml(tag 触发:SBOM/SHA256SUMS + npm publish --provenance);
11
+ # - typecheck 门禁范围 = src/ + scripts/(tsconfig include);test/ 为宽松 fixture 风格,
12
+ # 由 node --experimental-transform-types 运行时承载(erasable-TS,类型剥离语义)——显式登记,非遗漏。
1
13
  name: ci
2
14
  on: [push, pull_request]
15
+
16
+ # CodeQL SARIF 上传需要 security-events: write(run 35312565781 首跑 j01 analyze 403 教训)
17
+ permissions:
18
+ contents: read
19
+ security-events: write
20
+
3
21
  jobs:
4
- test:
22
+ # ── J-01 lint-scan-build:typecheck + CodeQL + 依赖审计 + 密钥扫描 + landlock-run 单点编译 ──
23
+ j01-lint-scan-build:
5
24
  runs-on: ubuntu-24.04
25
+ timeout-minutes: 15
6
26
  steps:
7
27
  - uses: actions/checkout@v4
8
28
  - uses: actions/setup-node@v4
9
29
  with: { node-version: '22.19' }
10
- - run: node --experimental-transform-types --test test/*.spec.ts
11
- # N1 日志不变量断言已内嵌于测试(SessionLog.assertModelVisibleLogged)
12
- # S3 追加门禁:沙箱逃逸回归矩阵(tests/sandbox-escape)+ 密钥扫描 + 依赖审计
30
+ - name: cache(键 = 源码哈希 + 工具链 + 三元组,M3 §2.1.2)
31
+ uses: actions/cache@v4
32
+ with:
33
+ path: native/landlock-run/landlock-run
34
+ key: landlock-run-${{ hashFiles('native/landlock-run/**') }}-gcc-${{ runner.os }}-linux-x64-gnu
35
+ - run: npm install
36
+ - name: typecheck(strict,src+scripts 生产面)
37
+ run: npx -y -p typescript tsc --noEmit -p tsconfig.json
38
+ - name: CodeQL(M2 §2.3 J-01 静态分析面)
39
+ uses: github/codeql-action/init@v3
40
+ with: { languages: javascript-typescript }
41
+ - uses: github/codeql-action/analyze@v3
42
+ - name: 依赖审计(npm audit,lockfile 口径;非阻塞登记——升级为阻塞需评审)
43
+ run: npm audit --omit=dev --audit-level=high || echo "::warning::npm audit findings — 见日志"
44
+ - name: 密钥扫描(仓库级 fail-closed)
45
+ run: node --experimental-transform-types scripts/secrets-scan.ts
46
+ - name: landlock-run 单点编译(M3 §2.1.2 构建单源)
47
+ run: |
48
+ make -C native/landlock-run
49
+ sha256sum native/landlock-run/landlock-run > native/landlock-run/landlock-run.sha256
50
+ - uses: actions/upload-artifact@v4
51
+ with:
52
+ name: landlock-run-linux-x64-gnu
53
+ path: |
54
+ native/landlock-run/landlock-run
55
+ native/landlock-run/landlock-run.sha256
56
+ retention-days: 7
57
+
58
+ # ── J-02/J-03/J-04 三平台全量单测(179/179 基线不回退)+ G-06 Node 一致性 ──
59
+ # M7 能力真跑:sqlite(22.5+ 带 flag)flag 直挂测试命令行——不能走 NODE_OPTIONS(白名单拒绝,run 35451413014 实证;
60
+ # 且 job 级 env 会炸 actions 自身 node24)。zstd 为 22.15+ 原生内置(无 flag,Stability 1 实验标记),能力探测自动在场
61
+ j02-test-linux:
62
+ needs: [j01-lint-scan-build]
63
+ runs-on: ubuntu-24.04
64
+ timeout-minutes: 15
65
+ steps:
66
+ - uses: actions/checkout@v4
67
+ - uses: actions/setup-node@v4
68
+ with: { node-version: '22.19' }
69
+ - run: node -p "'G-06 node ' + process.version"
70
+ - run: node --experimental-sqlite --experimental-transform-types --test "test/*.spec.ts"
71
+
72
+ j03-test-macos:
73
+ needs: [j01-lint-scan-build]
74
+ runs-on: macos-14
75
+ timeout-minutes: 25
76
+ steps:
77
+ - uses: actions/checkout@v4
78
+ - uses: actions/setup-node@v4
79
+ with: { node-version: '22.19' }
80
+ - run: node -p "'G-06 node ' + process.version"
81
+ - run: node --experimental-sqlite --experimental-transform-types --test "test/*.spec.ts"
82
+
83
+ j04-test-windows:
84
+ needs: [j01-lint-scan-build]
85
+ runs-on: windows-2022
86
+ timeout-minutes: 25
87
+ steps:
88
+ - uses: actions/checkout@v4
89
+ - uses: actions/setup-node@v4
90
+ with: { node-version: '22.19' }
91
+ - run: node -p "'G-06 node ' + process.version"
92
+ - run: node --experimental-sqlite --experimental-transform-types --test "test/*.spec.ts"
93
+
94
+ # ── J-05 escape-linux(required check,G-07 转 PASS 载体):20 条 POC-4 移植用例常驻 + 审计 JSONL 常驻上传 ──
95
+ j05-escape-linux:
96
+ needs: [j02-test-linux] # 传递依赖 j01(消费其 landlock-run 产物,禁止重编译)
97
+ runs-on: ubuntu-24.04
98
+ timeout-minutes: 30
99
+ steps:
100
+ - uses: actions/checkout@v4
101
+ - uses: actions/download-artifact@v4
102
+ with: { name: landlock-run-linux-x64-gnu, path: dist/ci-artifacts }
103
+ - name: 恢复可执行位(artifact zip 不保留 +x;run 35313717410 教训)
104
+ run: chmod +x dist/ci-artifacts/landlock-run
105
+ - name: 产物指纹校验(防制品传递错位,对齐 M2 §3.5)
106
+ run: |
107
+ EXPECTED="$(cut -d' ' -f1 dist/ci-artifacts/landlock-run.sha256)"
108
+ ACTUAL="$(sha256sum dist/ci-artifacts/landlock-run | cut -d' ' -f1)"
109
+ echo "expected=$EXPECTED actual=$ACTUAL"
110
+ [ "$EXPECTED" = "$ACTUAL" ] || { echo "::error::landlock-run artifact sha256 mismatch"; exit 1; }
111
+ - name: 环境自检 + 逃逸矩阵实跑(20 条 × 5 类;exit 2 = 环境失败,§2.1.3)
112
+ run: bash test/sandbox-escape/run-matrix.sh "$(pwd)/dist/ci-artifacts/landlock-run" "$(pwd)/dist/ci-audit"
113
+ - name: 审计 JSONL 常驻上传(无论成败,§2.1.1 步骤 6)
114
+ if: always()
115
+ uses: actions/upload-artifact@v4
116
+ with: { name: j05-escape-audit, path: dist/ci-audit/escape-audit.jsonl, retention-days: 90 }
117
+
118
+ # ── J-07 escape-windows(required check,E-2 实装态收编):受限 token + Job Object 四判据 ──
119
+ j07-escape-windows:
120
+ needs: [j04-test-windows]
121
+ runs-on: windows-2022
122
+ timeout-minutes: 30
123
+ steps:
124
+ - uses: actions/checkout@v4
125
+ - uses: actions/setup-node@v4
126
+ with: { node-version: '22.19' }
127
+ - run: npm install
128
+ - name: FFI debug matrix(diagnostic,S26 0xC0000142 排查)
129
+ run: node --experimental-transform-types scripts/win32-ffi-debug.ts
130
+ - name: 四判据沙箱 spike(FAIL 即非零退出,脚本退出码直连)
131
+ run: node --experimental-transform-types scripts/win32-koffi-spike.ts
132
+
133
+ # ── J-08 invariant-n1:N1 不变量 100 回放 fixtures(含篡改检出防假绿自检) ──
134
+ j08-invariant-n1:
135
+ needs: [j02-test-linux]
136
+ runs-on: ubuntu-24.04
137
+ timeout-minutes: 15
138
+ steps:
139
+ - uses: actions/checkout@v4
140
+ - uses: actions/setup-node@v4
141
+ with: { node-version: '22.19' }
142
+ - run: node --experimental-transform-types scripts/invariant-n1.ts
143
+ - uses: actions/upload-artifact@v4
144
+ with: { name: j08-invariant-n1, path: dist/ci/invariant-n1.jsonl, retention-days: 90 }
145
+
146
+ # ── J-09 contract:SessionEventMap 快照只增不删 + 公共 API 兼容 ──
147
+ j09-contract:
148
+ needs: [j02-test-linux]
149
+ runs-on: ubuntu-24.04
150
+ timeout-minutes: 10
151
+ steps:
152
+ - uses: actions/checkout@v4
153
+ - uses: actions/setup-node@v4
154
+ with: { node-version: '22.19' }
155
+ - run: node --experimental-transform-types scripts/contract-check.ts
156
+
157
+ # ── J-10/J-11/J-12 dx-smoke:QS-05 首跑通冒烟(doctor + reload 五阶段报告) ──
158
+ j10-dx-smoke-linux:
159
+ needs: [j02-test-linux]
160
+ runs-on: ubuntu-24.04
161
+ timeout-minutes: 15
162
+ steps:
163
+ - uses: actions/checkout@v4
164
+ - uses: actions/setup-node@v4
165
+ with: { node-version: '22.19' }
166
+ - run: node --experimental-transform-types src/cli.ts doctor
167
+ - run: node --experimental-transform-types src/cli.ts reload test/fixtures/hello-plugin.ts
168
+
169
+ j11-dx-smoke-macos:
170
+ needs: [j03-test-macos]
171
+ runs-on: macos-14
172
+ timeout-minutes: 20
173
+ steps:
174
+ - uses: actions/checkout@v4
175
+ - uses: actions/setup-node@v4
176
+ with: { node-version: '22.19' }
177
+ - run: node --experimental-transform-types src/cli.ts doctor
178
+ - run: node --experimental-transform-types src/cli.ts reload test/fixtures/hello-plugin.ts
179
+
180
+ j12-dx-smoke-windows:
181
+ needs: [j04-test-windows]
182
+ runs-on: windows-2022
183
+ timeout-minutes: 20
184
+ steps:
185
+ - uses: actions/checkout@v4
186
+ - uses: actions/setup-node@v4
187
+ with: { node-version: '22.19' }
188
+ - run: node --experimental-transform-types src/cli.ts doctor
189
+ - run: node --experimental-transform-types src/cli.ts reload test/fixtures/hello-plugin.ts
190
+
191
+ # ── J-13/J-14/J-15 package-*:npm pack 干跑 + files 白名单/包名断言(唯一允许 rerun 的 Job 组) ──
192
+ j13-package-linux:
193
+ needs: [j05-escape-linux, j10-dx-smoke-linux]
194
+ runs-on: ubuntu-24.04
195
+ timeout-minutes: 20
196
+ steps:
197
+ - uses: actions/checkout@v4
198
+ - uses: actions/setup-node@v4
199
+ with: { node-version: '22.19' }
200
+ - run: node --experimental-transform-types scripts/package-check.ts
201
+
202
+ # 依赖调整登记:J-14 原依赖 J-06(冻结态未设 Job)→ 回退 J-03(darwin 测试面),见文件头 J-06 冻结登记
203
+ j14-package-macos:
204
+ needs: [j03-test-macos, j11-dx-smoke-macos]
205
+ runs-on: macos-14
206
+ timeout-minutes: 25
207
+ steps:
208
+ - uses: actions/checkout@v4
209
+ - uses: actions/setup-node@v4
210
+ with: { node-version: '22.19' }
211
+ - run: node --experimental-transform-types scripts/package-check.ts
212
+
213
+ j15-package-windows:
214
+ needs: [j07-escape-windows, j12-dx-smoke-windows]
215
+ runs-on: windows-2022
216
+ timeout-minutes: 25
217
+ steps:
218
+ - uses: actions/checkout@v4
219
+ - uses: actions/setup-node@v4
220
+ with: { node-version: '22.19' }
221
+ - run: node --experimental-transform-types scripts/package-check.ts
222
+
223
+ # ── J-17 escape-wsl2(required check,M3 新增):§2.1.1 六步编排,企业代表拓扑对等回归 ──
224
+ j17-escape-wsl2:
225
+ needs: [j02-test-linux]
226
+ runs-on: windows-2022
227
+ timeout-minutes: 40
228
+ steps:
229
+ - uses: actions/checkout@v4
230
+ - uses: actions/download-artifact@v4
231
+ with: { name: landlock-run-linux-x64-gnu, path: dist/ci-artifacts }
232
+ - name: 步骤 1 · WSL 启用自检(内核缺失时 wsl --update 自愈;run 35312957963 教训)
233
+ shell: pwsh
234
+ run: |
235
+ wsl --status; if ($LASTEXITCODE -ne 0) { wsl --update --web-download }
236
+ # run 35315242805 教训:默认版本可能是 1(无内核翻译层,Landlock 不可用)——强制 WSL2
237
+ wsl --set-default-version 2; if ($LASTEXITCODE -ne 0) { wsl --update; wsl --set-default-version 2 }
238
+ wsl --status
239
+ - name: 步骤 2 · Ubuntu 24.04 发行版导入(web-download 绕 Store;失败 = 环境失败 §2.1.3)
240
+ shell: pwsh
241
+ run: |
242
+ wsl --install -d Ubuntu-24.04 --no-launch --web-download
243
+ wsl --set-version Ubuntu-24.04 2
244
+ wsl -d Ubuntu-24.04 -e uname -r
245
+ - name: 步骤 3-5 · 环境自检 + 工作区迁移 ext4 + 20 条实跑
246
+ shell: bash
247
+ run: |
248
+ set -e
249
+ # run 35313717410 教训:runner 的 D 盘不一定被 automount(/mnt/d 不存在)——
250
+ # 全部经 tar 流直灌 ext4(~/car-import),绕开 /mnt 依赖;编排器从该路径自取 native/test
251
+ wsl -d Ubuntu-24.04 -e bash -c "rm -rf ~/car-import && mkdir -p ~/car-import"
252
+ tar -cf - native test dist/ci-artifacts | wsl -d Ubuntu-24.04 -e bash -c "tar -xf - -C ~/car-import && chmod +x ~/car-import/dist/ci-artifacts/landlock-run"
253
+ # 防御性去 CR:runner checkout 可能仍产 CRLF(\r 会让 set -euo pipefail 直接 invalid option)
254
+ wsl -d Ubuntu-24.04 -e bash -c "sed -i 's/\r\$//' ~/car-import/test/sandbox-escape/*.sh"
255
+ wsl -d Ubuntu-24.04 -e bash -c "bash ~/car-import/test/sandbox-escape/j17-orchestrate.sh ~/car-import ~/car-import/dist/ci-artifacts/landlock-run"
256
+ - name: 步骤 6 · 审计 JSONL 回传(无论成败)
257
+ if: always()
258
+ shell: bash
259
+ run: |
260
+ REPO_WSL="/mnt/$(pwd | sed 's#^/##')"
261
+ mkdir -p dist/ci-audit
262
+ wsl -d Ubuntu-24.04 -e bash -c "cp ~/car-matrix/audit/escape-audit.jsonl '$REPO_WSL/dist/ci-audit/escape-audit.jsonl' 2>/dev/null || true" || true
263
+ # /mnt 不可用时兜底:cat 直出(run 35313717410 教训)
264
+ [ -s dist/ci-audit/escape-audit.jsonl ] || wsl -d Ubuntu-24.04 -e bash -c "cat ~/car-matrix/audit/escape-audit.jsonl" > dist/ci-audit/escape-audit.jsonl 2>/dev/null || true
265
+ - uses: actions/upload-artifact@v4
266
+ if: always()
267
+ with: { name: j17-escape-audit, path: dist/ci-audit/escape-audit.jsonl, retention-days: 90 }
268
+
269
+ # ── J-18 registry-e2e(required check,M3 新增):Verdaccio 实跑 + §3.6 六用例组 ──
270
+ j18-registry-e2e:
271
+ needs: [j02-test-linux]
272
+ runs-on: ubuntu-24.04
273
+ timeout-minutes: 20
274
+ steps:
275
+ - uses: actions/checkout@v4
276
+ - uses: actions/setup-node@v4
277
+ with: { node-version: '22.19' }
278
+ - run: node --experimental-transform-types test/registry-e2e/run-e2e.ts
279
+ - uses: actions/upload-artifact@v4
280
+ if: always()
281
+ with: { name: j18-registry-e2e, path: dist/ci/registry-e2e.jsonl, retention-days: 90 }
@@ -6,8 +6,10 @@ on:
6
6
  permissions:
7
7
  contents: read
8
8
  id-token: write
9
+ # J-16 release-merge(M2 §2.3):tag/Release 触发 → npm publish --provenance。
10
+ # SBOM/SHA256SUMS/cosign 由 scripts/release-pipeline.ts 承载(本地/沙箱外轨,M3 §2.1.2 单源编译已入 CI j01)。
9
11
  jobs:
10
- publish:
12
+ j16-release-merge:
11
13
  runs-on: ubuntu-latest
12
14
  steps:
13
15
  - uses: actions/checkout@v4
@@ -16,6 +18,12 @@ jobs:
16
18
  node-version: 22
17
19
  registry-url: https://registry.npmjs.org/
18
20
  - name: Publish to npm with provenance
19
- run: npm publish --provenance --tag rc
21
+ # dist-tag 按版本形态动态选择:prerelease(如 1.0.0-rc.1)→ rc;稳定版(1.0.0)→ latest。
22
+ # M5 §1.1 口径:1.0 发布时 latest→1.0.0,rc tag 保留指向 rc.1 不回指——稳定版禁止 --tag rc。
23
+ run: |
24
+ VERSION=$(node -p "require('./package.json').version")
25
+ if echo "$VERSION" | grep -q -- '-'; then TAG=rc; else TAG=latest; fi
26
+ echo "version=$VERSION -> dist-tag=$TAG"
27
+ npm publish --provenance --tag "$TAG"
20
28
  env:
21
29
  NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
package/README.md CHANGED
@@ -68,8 +68,8 @@ node --experimental-transform-types --test test/*.spec.ts
68
68
  | `test/s9.spec.ts` | 5 项断言(配置树/产消图/取证包/篡改拒绝/三标分层) | F14/F15/D-4 |
69
69
 
70
70
  | `src/host/mappings.ts` | S11 T-1 归一化 schema(host-mappings-v1):session id 确定性派生(SH-+sha256)+ 两宿主纯数据 profile + hostRaw 零静默降级通道 | 决议⑤、T-1 |
71
- | `src/host/hostGateway.ts` | S11 HostGateway 骨架:9 tool 会话级能力面(step 循环不暴露)+ hostId 登记制(A050001)+ RuntimeFacade 分发(snake→camel)+ 审计全留痕 | M3系统设计增补 T-1 |
72
- | `test/s11.spec.ts` | 10 项断言(幂等派生/跨宿主隔离/归一化等价/降级留痕/登记制/9 tool 面/契约测试 v0/宿主标识静态断言) | 双宿主等价基线 |
71
+ | `src/host/hostGateway.ts` | S11 HostGateway 骨架:10 tool 会话级能力面(step 循环不暴露)+ hostId 登记制(A050001)+ RuntimeFacade 分发(snake→camel)+ 审计全留痕 | M3系统设计增补 T-1 |
72
+ | `test/s11.spec.ts` | 10 项断言(幂等派生/跨宿主隔离/归一化等价/降级留痕/登记制/10 tool 面/契约测试 v0/宿主标识静态断言) | 双宿主等价基线 |
73
73
 
74
74
  ## 状态
75
75
 
@@ -107,16 +107,54 @@ node --experimental-transform-types --test test/*.spec.ts
107
107
 
108
108
  | `scripts/ptc-baseline/` | S19 T-7 评测脚本实装:12 任务五类 + 逐任务 N 次对照(非 PTC 基线)+ JSONL 明细/汇总——**首份实测:PTC 60/60=100% ≥ 非 PTC 100%,P1-4 ✅** | PRD P1-4 |
109
109
 
110
+ | `src/ptc/schemaRender.ts` | M5 DEC-4①:JSON Schema→TS 深度参数渲染(const/enum 字面量、嵌套 object required/optional、数组/元组 prefixItems、additionalProperties、anyOf/oneOf/allOf;$ref/not/畸形/超深 fail-visible 落 unknown 带原因) | M3-S16 评估项转正 |
111
+ | `src/session/fork.ts` | M5 DEC-4②:跨宿主 fork/resume——链逐字节迁移 + fork 标记落链(fromSessionId/target/upToSeq)+ 目标会话 id 确定性派生 + 断链拒绝 + 归属校验 + #tail 恢复续跑 | M3 §1.7 延后项转正 |
112
+ | `test/s16.spec.ts` + `test/s19.spec.ts` | M5 断言:s16 深渲 10 项 + s19 fork 7 项(含双宿主 facade E2E) | 全量 156/156 |
113
+
114
+ | `src/load/report.ts` + `src/dx/doctor.ts` | M6 DX 工具链:loadPlugins 五阶段编排(discover→parse→validate→topo→register,FAIL 短路 SKIPPED)+ LoadReportVO/renderLoadReport(§3.2.M6.3 逐字对齐)+ ReloadManager(epoch+1 击穿缓存 → invalidate 旧实例 → 重装配,FAIL 不静默回退)+ doctor 凭据/连通性(值不打印、离线 SKIPPED 不失败) | §3.2.M6、QS-05 |
115
+ | `src/cli.ts` +2 | M6:car reload <file\|dir>(五阶段报告 + 退出码 0/1/2)+ doctor 增强(凭据/连通性) | §3.2.M6.2 |
116
+ | `docs/plugin-authoring.md` | 插件作者指南:文件形态 + 四条红线(fiber 作用域 invalidate / apply disposer / CAR-STUB 分层 / CAR-INVALIDATED)+ 五阶段表 | POC-2 红线 |
117
+ | `test/s20.spec.ts` + `test/s21.spec.ts` | M6 测试:10 + 13 个 test(五阶段/短路/冲突链/热重载/并发 reload 不变量/doctor 离线/QS-05 P95 最近邻秩) | §3.2.M6 AC |
118
+
119
+ | `src/session/store.ts` + `src/session/format.ts` | M7 存储层+格式层:SessionFileStore(O_APPEND 单 write 行级原子 + fsyncSync,sink throw = fail-fast 事件不入内存)+ 撕裂尾显式格式校验(崩溃半行显式丢弃报告,与 CAR-E-FORMAT/断链三语义互斥)+ zstd 能力探测 codec(magic 嗅探 layout-blind 直读,缺席显式 CAR-E-ZSTD;实测压缩比 6.21x ≥ 3x 规格口径) | §3.2.M7.1 第 4 点、§3.2.M7.5 |
120
+ | `src/session/indexStore.ts` | M7 C-02 SQLite 会话索引:node:sqlite 动态探测(静态 import 会崩模块加载)+ 单事务幂等重建(DELETE+INSERT)+ 断链/坏格式文件入 errors 不中断(索引只收链完整会话) | §3.2.M7.2 索引行、§3.2.M7.5 Step 3 |
121
+ | `src/cli.ts` session 扩展 + `src/session/log.ts` | M7:car session export(SQ-06 全流程:断链中止 + 取证包落盘 + 读回重验四重 + 离线自证 + --zstd 物理布局双锚点登记)/ rebuild-index / run 全程逐事件 fsync(「先落日志后放行」物理兑现)+ attachSink + loadSessionLog 格式层接入 + deriveSessionId(修路径当 sessionId 旧账) | §3.2.M7.2 导出行 |
122
+ | `test/s22-m7-store-format.spec.ts` + `test/s23-m7-export-index.spec.ts` | M7 测试:8 + 7 个 test(sink 落盘/fail-fast/撕裂尾/格式三语义/zstd 压缩比 ≥3x 与缺席显式/export 离线自证/断链中止/索引幂等/errors 通道) | §3.2.M7 AC |
123
+
124
+ | `src/load/sigGate.ts` + `src/load/report.ts` verify 阶段 | M5-S28 装载签名门接线:manifestHash = 插件入口文件裸字节 sha256 hex(`<file>.minisig` sidecar,被签消息 = hex 串 UTF-8 字节)+ 流水线五阶段→**六阶段**(discover→**verify**→parse→…,先于 import() 模块执行前拦截)+ `car run` 直载门 + `car reload` 透传 + `car_load_total`/`car_unsigned_confirmed` 生产计数 + `CAR_TRUST_ROOT`/`CAR_SIG_ENFORCE`/`CAR_UNSIGNED_ALLOW` env 通道 + unsignedAllow→confirmed=yes 豁免改写 + fp 指纹横幅 | ADR-003 追记、DEC-1 ②、S20 §5 复评行 |
125
+ | `test/s24-signature-gate.spec.ts` | M5-S28 测试:8 个 test(warn 缺签横幅+fp+confirmed=no / unsignedAllow=yes 改写+横幅保留 / enforce 缺签 FAIL+空 plugins / 坏签名硬拒绝不可豁免 / 好签名静默 / load_total 分母 / reload 透传 / 单文件门+env 映射) | 全量 204 |
126
+
127
+ ## M5 状态
128
+
129
+ - **M5 收口(2026-09-12)**:三项 deferred 全部转正并验证——win32 sandbox spike 四判据自动断言全 PASS(S24/S25/S26)、JSON Schema→TS 深度参数渲染(dee4d67)、跨宿主 fork/resume(03c0fec)。全量 **156/156**。
130
+ - 工具面 9→10(新增 `session_fork`);`session_start` 增 importJsonl 导入路径;RC-3 冻结未生效(1.0-rc tag 未切),工具面契约变更合规登记。
131
+ - **S28 收口(2026-09-26)**:**DEC-1 裁决 = ②**(warn + 《签名强制启用指南》组合发布 + RC-3 承诺显式降级;数据窗口 0 会话不满足切 enforce 前提,D-2 红线禁止无数据 enforce;宽限期 = 1.0 发布日 + 90 天,到期 enforce 默认值翻转为**计划内变更**——S20 §5 复评行归档)。配套工程同日收口:**装载签名门接线**——verifier 自 M2-S6(e11d23b)入库零生产调用点的缺口补齐(此前「已实装仅切默认值」口径经双向核查不成立,S20 §6 勘误登记):loadPlugins 五阶段→六阶段(verify 先于 parse 的 import(),模块执行前拦截)+ car run 直载门 + car reload 透传 + car_load_total/car_unsigned_confirmed 生产计数 + manifestHash 指纹兜底实装 + CAR_TRUST_ROOT/CAR_SIG_ENFORCE/CAR_UNSIGNED_ALLOW env 通道。全量 **204(201 PASS + 3 能力门控 skip / 0 fail)**。S29 前置三修复(ce0bf65):G-01 钉 tap reporter(Node 23 spec 默认致解析落空)/ G-03 豁免清单对齐 CI 权威版 / release.yml publish tag 动态化(1.0.0→latest,rc 保留指向 rc.1)。**GO-1 复跑达成:12 PASS / 1 DRY-RUN / 0 FAIL**(G-10 Release 实查挂 GO-7 token rotate 后全链验证收口)。
132
+
133
+ ## M6 状态
134
+
135
+ - **CI 门禁矩阵落地(09-18)**:ci.yml 重写为 16 Job + release.yml=j16(18/18 对齐 M2§2.3+M3§2.2 全景);新增 landlock-run 原生组件(构建单源 j01)、20 条逃逸矩阵用例(WSL2 实跑 20/20)、Verdaccio registry E2E(15/15)、N1 不变量 100 回放(含篡改检出防假绿)、secrets-scan/contract-check/package-check 脚本门禁、tsc strict 门禁(tsconfig 此前不存在——幽灵门禁同类项)。J-06 macOS 冻结态登记不设 Job。幽灵注释三项门禁全部兑现。
136
+ - **CI 首跑全绿(09-18,run 35315943540)**:16/16 Job 在 GitHub Actions 实跑通过——三平台全量 179/179、j05 Linux 逃逸 20/20、**j17 WSL2 逃逸 20/20**(hosted windows-2022 + WSL2 Ubuntu-24.04 实装,E-1 常驻门禁判据兑现)、j07 win32 四判据、j18 registry E2E 全部转正式门禁。首跑排障四连修:CodeQL SARIF 403(补 security-events:write)、j05 artifact 丢执行位(chmod 恢复)、j17 /mnt 不可用(tar 流直灌 ext4)+ WSL1 缺 Landlock(强制 set-version 2)+ CRLF 脚本炸(.gitattributes eol=lf + sed 去 CR)。
137
+ - **E-5 万级 secrets 基准集闭环(09-18,M2 退出标准 #4)**:确定性生成 1000 正(25 族)+ 9000 负(5 类对抗面)实测 **漏报 0% / FPR 0% / precision 100%**(D-3 判据 <1.5%/≤5%/≥80% 全过)。基准集首跑即校准出扫描器三处缺陷并修复:AWS Secret 正则对 `aws_secret_access_key` 规范形失配(漏报源)、kv 熵口径算在含键名全 token(弱值逃逸)、连接串占位口令无降级。载体:`test/s7b-baseline.spec.ts` 常驻回归 + `scripts/secrets-baseline.ts` 终验 CLI。180/180 全绿。
138
+
139
+ - **M6 收口(2026-09-15)**:**179/179 全绿(s1–s20 166 + s21 13,零回归)**;QA 两轮制——Round 1 发现 M6-BUG-1(重名插件被 topo 误报 CAR-E-DEPCYCLE,register CAR-E-DUP 守卫不可达),工程师修复(topoSort 重名安全:pushed/pushedNames 双轨;register DUP 守卫恢复可达 + 全量同名文件冲突链)后 Round 2 PASS。CLI 实测 reload 退出码 0/1/2 ✅、CAR_OFFLINE=1 doctor 离线 PASS ✅。QS-05:20 轮缓存击穿热重载 × 5 插件 P95 个位数 ms(目标 ≤800ms)。
140
+ - 口径备注:DUP 拦截点钉在 register 阶段(QA 裁定接受:文档口径 + 冲突链定位质量更优);topoSort 仅对真实依赖环报 CAR-E-DEPCYCLE。
141
+ - 环境备注:测试命令须用 glob 形态 `node --experimental-transform-types --test "test/*.spec.ts"`(目录参数在 Node 22.22.2 下 MODULE_NOT_FOUND)。
142
+
143
+ ## M7 状态
144
+
145
+ - **M7 收口(2026-09-19)**:§3.2.M7 会话日志与审计规格差距五项全部兑现——W1 落盘存储层(SessionFileStore 单 write 行级原子 + fsync,car run 全程逐事件落盘,「先落日志后放行」从语义到物理);W2 撕裂尾显式格式校验(崩溃半行显式丢弃报告,撕裂尾/CAR-E-FORMAT/断链三失败语义互斥可判);W3 zstd 存储增强(能力探测 codec,实测压缩比 6.21x ≥ 3x 规格口径,缺席显式 CAR-E-ZSTD 不静默;热路径恒明文——fail-fast 优先,zstd 定位归档/导出);W4 `car session export` 取证包 CLI(SQ-06 断链中止 + 落盘读回重验四重 + 离线自证 + --zstd 物理布局双锚点);W5 `car session rebuild-index`(node:sqlite 单事务幂等重建,errors 通道不吞错,索引只收链完整会话)。全量 **195 测试(192 PASS + 3 能力门控 skip,0 fail)** + tsc strict 0 错。
146
+ - **CI 能力真跑(防幽灵门禁)**:j02/j03/j04 测试命令直挂 `--experimental-sqlite`(22.5+ 带 flag 引入);zstd 为 **22.15+ 原生内置(无 CLI flag**,Stability: 1 实验标记),22.19 原生在场直跑。排障两轮(run 35451413014/35451612564):①node 运行时 flag 不能走 `NODE_OPTIONS`(白名单拒绝 + job 级 env 炸 actions 自身 node24),必须直挂命令行;②「not allowed in NODE_OPTIONS」是通用拒绝文案、**不代表 flag 存在**——`--experimental-zstd` 从未存在过。zstd 在场/缺席双路径各由在场/缺席环境实跑(skip 显式登记非静默)。**CI 收官(run 35452486131):16/16 全绿**,三平台 195 用例实跑(zstd 在场路径含 ≥3x 压缩比断言 CI 首次实测通过)。
147
+ - 口径备注:§3.2.M7.2 的 `--session id` 形态以 index(sessionId→file 映射)为底座登记后续增强,export 本迭代以文件路径为入口(与 verify/replay 形态一致);运行时 append 异步索引自动更新登记后续(缺失由 rebuild 兜底,异步可容忍语义自洽);deriveMessages 的 roleConsistencyChecked 在 v1 无消息改写面,登记 N/A。详见 `car-docs/10-内核v1/M7-会话日志与审计收口.md`。
148
+
110
149
  ## 状态
111
150
 
112
- - S1-S4:48/48 ✅ | M2:89/89(v0.2.0)| M3:127/127(v0.3.0)| M4:S17→S18→S19→S20→S21→**S22 rc 彩排 ✅(139/139 @ 1.0.0-rc.1,9 PASS/4 DRY-RUN/0 FAIL;彩排捕获 3 真问题:koffi 依赖分类/非法 semver/tgz 膨胀信号)**
113
- - **GO 清单**(S22-rc发布彩排报告.md §3):E-1/E-3(轨道 A)+ T-1/T-4 决策 + 试点数据 + npm pack 制品复核——全部按清单打勾即发布 1.0.0-rc.1。
114
- - M4 待办:**S21 rc 准入核查已出(M4-rc准入核查报告.md)**——RC-4 ✅ 实测、RC-1/2/3/5/6 待评审定稿+环境动作+试点数据,工程侧证据链 80%+ 齐备、无设计/代码缺口;S22 预演 13/13 + 1.0-rc 发布(待轨道 A E-1/E-2/E-3 与 T-1/T-4 决策)。
115
- - M4 待办:S18 Claude Code 实连 + 采集窗口开启(采集面已就位);S19 Codex 实连 + registry 增补评审;S20 enforce 决策 + PTC 评测(脚本 2 人日待实装);轨道 A(你):E-1/E-2/E-3 沙箱外。
116
- - 环境动作清单(E-1~E-4 + E-6 宿主实连试点)与遗留移交见 delivery/M3收口终验报告.md;M4 预埋:fork 跨宿主/深度参数渲染/定时导出。
151
+ - **版本主线**:S1-S4 48/48 | M2 89/89(v0.2.0)| M3 127/127(v0.3.0)| M4 139/139(**1.0.0-rc.1 已发布**)| M5 156/156(DEC-4 预埋项转正)| M6 179/179(2026-09-15 收口)| M7 全量 195(192 PASS + 3 能力门控 skip,2026-09-19 收口)| **M5-S28 装载签名门 全量 204(201 PASS + 3 skip,2026-09-26)**
152
+ - **1.0.0-rc.1 已发布(2026-09-09)**:npm `@lqc123qwe/car-runtime@1.0.0-rc.1`(rc + latest 双 tag,SLSA provenance 在案)+ GitHub Release 6 制品;发布预演 **13 PASS / 0 DRY-RUN / 0 FAIL**(c762b72)。S22 GO 清单已全绿收口。
153
+ - **轨道 A 三项全部完成**:E-1 WSL2 逃逸矩阵 **20/20 PASS 零逃逸**(2026-09-07,G-07 转 PASS)| E-3 远端发布通道 **13/13 全门禁 PASS**(2026-09-09,G-08/09/10 转 PASS)| E-2 Windows koffi FFI **四判据双环境全 PASS**(S24/S25/S26,2026-09-09~10;本机非提权 + windows-latest 提权 runner 双绿,CI 门禁已接入)。
154
+ - **决策已闭环**:**T-1** enforce 阈值定稿 **A=5% / B=2% / C=30 会话** + 裁决**显式延期**(2026-09-09,S20 §5 归档;红线禁止以 warn 静默进 1.0)|**T-4** MLPS-G1 定时导出维持部署方配套(2026-09-09,D-4 追记)|**DEC-2** Windows CI 接入 / **DEC-3** 发布前 token rotate / **DEC-4** M3 预埋项纳入 1.0(均 2026-09-09 裁决)。
155
+ - **1.0-GO 七项全部闭环(2026-09-26)**:GO-1 ✅ **13 PASS / 0 DRY-RUN / 0 FAIL**(全口径复跑——G-10 随 GO-7 新 PAT 转实查 PASS)| GO-2/3 ✅ E-2 四判据(S24-S26 双环境)| GO-4 ✅ DEC-1 ②(warn 形态,S20 §5 归档)| GO-5 由 DEC-1 ② 承接(R-1 缓解路径:试点 0 家不阻塞 ② 形态发布,征集转运营侧持续项)| GO-6 ✅ 部署设计 §4.5.5 | GO-7 ✅ token rotate(npm granular token 入 repo secret + PAT `*0Fbq`;旧凭证双撤销;全链 13 PASS)。同日收口 S29 前置修复(`ce0bf65` G-01 钉 tap / G-03 豁免对齐 CI / release.yml tag 动态化;`4c84b17` G-09 期望 tag 按版本形态动态选择——硬编码查 rc 会把 1.0.0 post-publish 复跑误判 FAIL)。**剩余 = S29 发布编排 → S30 收口终验**。
156
+ - M4 预埋项**已全部出清**:fork 跨宿主 / 深度参数渲染于 2026-09-12 转正(dee4d67 + 03c0fec);定时导出经 T-4 裁决维持部署方配套。
117
157
  - **内核行为修复(S14 捕获)**:工具异常原会终止 turn(reason=error)——已修为「成对错误 toolResult 交回模型」(US-5/D5 语义:工具错误是结果而非 turn 中断),121 断言零回退。
118
- - 环境动作清单(E-1~E-5)与遗留移交(T-8 等)见 delivery/M2收口终验报告.md;G-03 豁免机制:secrets 规则库/标定基准显式列文件豁免,清单变更需评审。
119
- - M2 待办:S6 验签器实装(ADR-003)+ F13 五层停止(M2系统设计增补 T-1);S7/S8 跨平台沙箱(Windows koffi spike);S9 治理+导出;S10 收口。
120
- - **N2 实测**:首插件跑通 3ms(目标 ≤300s,余量 10 万倍)
121
- - **Q-06 定标回填**:装配 20 插件 <1ms;serial 分发 1000 次 6ms;日志 1 万事件追加+哈希链 125ms、回放+校验 21ms
122
- - 待办:jiti 实装补测首载时延(载体替身已验证不变量);POC-4 Linux/WSL2 实跑;发布工程预演(dist-tag beta)
158
+ - **性能定标(回填)**:N2 首插件跑通 3ms(目标 ≤300s,余量 10 万倍)| Q-06 装配 20 插件 <1ms、serial 分发 1000 次 6ms、日志 1 万事件追加+哈希链 125ms、回放+校验 21ms | QS-05 20 轮缓存击穿热重载 × 5 插件 P95 个位数 ms(目标 ≤800ms)。
159
+ - **历史留存**(早期里程碑,均已闭环或经裁决移交):M3 环境动作清单 E-1~E-4 + E-6 宿主实连试点见 `car-docs/10-内核v1/M3收口终验报告.md`;M2 清单 E-1~E-5 与 T-8 移交见 `M2收口终验报告.md`;G-03 豁免机制——secrets 规则库/标定基准显式列文件豁免,清单变更需评审。
160
+ - **遗留(非阻塞)**:jiti 实装补测首载时延(载体替身已验证不变量)。POC-4 Linux/WSL2 实跑已随 E-1 完成(20/20)。
@@ -31,3 +31,11 @@
31
31
 
32
32
  - 正式测评口径以测评机构现场判定为准;本清单为产品侧证据准备。
33
33
  - M3 backlog:可选定时导出(若企业深访显示备份自动化是采购关键)。
34
+
35
+ ## D-4 追记 · MLPS-G1 处置定稿(2026-09-09 主理人裁决)
36
+
37
+ > **裁决:维持部署方配套,运行时不实装定时导出**(M3 backlog 保留观察)。
38
+ >
39
+ > 依据:①运行时侧 c) 项证据链已闭环(append-only + SHA-256 哈希链 + verifyChain + 零删除路径 + 导出副本/完整性清单能力),「定期备份调度」属部署方运维域;②等保三级才是审计备份强约束场景,rc 阶段无企业等保客户在途,提前实装属过度供给;③零依赖红线(G-04)下新增定时器为纯增量代码重量。
40
+ >
41
+ > 关闭条件重开:企业深访中「备份自动化」成为采购关键,或首个等保定级客户接入时,从 M3 backlog 提级(预估 0.5 人日:定时器 + 导出副本 + 完整性清单 + 关闭开关)。
@@ -0,0 +1,82 @@
1
+ # CAR 插件作者指南(M6 DX)
2
+
3
+ 面向插件作者的写码红线与热重载实操。本文所述行为均为实测口径(POC-2 + S1–S3 红线),不是"建议"。
4
+
5
+ ## 插件文件形态
6
+
7
+ CAR 免编译加载插件(Node type-stripping 载体),一个插件 = 一个 `.ts` 文件:
8
+
9
+ ```ts
10
+ // my-plugin.ts
11
+ export const manifest = { name: 'my-plugin', version: '1.2.3' } // 命名导出,可省略(省略则按文件名合成)
12
+
13
+ export default function apply(api) {
14
+ api.registerTool({ name: 'hello', run: async () => 'world' })
15
+ api.registerCommand({ name: 'hi', run: async (args) => console.log('hi', args) })
16
+ }
17
+ ```
18
+
19
+ - `manifest.version` 必须是**精确 semver**(`x.y.z`),版本区间仅用于 peer 校验;
20
+ - `manifest.peers` 声明 peer 约束:`{ peer, range, optional? }`;冲突即加载期硬报错,
21
+ 放宽需 `manifest.peerPolicyOverride = { relaxed: true, reason: '…' }`(reason 必填,审计留痕);
22
+ - 插件源码只接受 **erasable TS**(禁 enum/namespace/装饰器等需转换的语法,loader 挂点显式拒绝)。
23
+
24
+ ## 写码红线(违反 = 运行期错位,已实证)
25
+
26
+ ### 1. invalidate 必须包裹插件 fiber 作用域 ctx,而非根 ctx
27
+
28
+ POC-2 实证:把根 ctx 透传给插件工厂会导致 effect 注册到错误 fiber——**effect 注册错位、
29
+ dispose 回卷不到**。热重载失效旧实例时,只能失效插件自身作用域的 ctx(`api` 句柄),
30
+ 根 ctx 与其它插件不受影响。插件作者视角:不要保存/传递宿主根 ctx,只使用 `apply(api)` 收到的 `api`。
31
+
32
+ ### 2. apply 不能返回非 disposer 对象
33
+
34
+ cordis 语义:`apply` 返回值 = effect body。CAR 内核同步约定——`apply` 同步完成注册,
35
+ 需要异步初始化请走 `ctx.effect(async () => { … })`。返回 Promise/普通对象 = 加载期显式报错。
36
+
37
+ ### 3. getRegisteredTools 在 bindCore 前调用即抛 CAR-STUB
38
+
39
+ Stub 语义分层(红线 5):
40
+ - **注册类动作**(`registerTool`/`registerCommand`)Stub 期始终可用——收集待注册项,`bindCore` 后冲刷;
41
+ - **能力查询**(`getRegisteredTools`)依赖宿主绑定,bindCore 前一调用即抛
42
+ `CAR-STUB`——用启动期显式失败换运行期时序正确。
43
+
44
+ ### 4. 旧 ctx 访问抛 CAR-INVALIDATED
45
+
46
+ `car reload`(或 `ReloadManager.reload()`)后,旧插件实例的 `api` 句柄**任何属性访问**都抛
47
+ `CAR-INVALIDATED: … (旧上下文已失效,请重新加载)`。持有旧句柄的闭包不会静默失效——显式报错定位。
48
+
49
+ ## 热重载实操
50
+
51
+ ```bash
52
+ car reload my-plugin.ts # 单文件
53
+ car reload ./plugins/ # 目录(扫描 *.ts,排除 .d.ts/.spec.ts)
54
+ ```
55
+
56
+ 五阶段流水线(任一 FAIL 短路,后续 SKIPPED,FAIL 附文件+原因定位):
57
+
58
+ | 阶段 | 内容 | 典型 FAIL |
59
+ |------|------|-----------|
60
+ | discover | 扫描插件文件;git 直载来源产生 CAR-W-GIT-DIRECT 告警(E-03) | 路径不存在 / 无 .ts |
61
+ | parse | 读 manifest(命名导出,缺失按文件名合成)+ parseManifest | version 非精确 semver |
62
+ | validate | peer 约束校验,冲突链进报告 `conflicts` | peer 区间不符且未豁免 |
63
+ | topo | peer 依赖边 Kahn 拓扑排序 | 依赖环(CAR-E-DEPCYCLE) |
64
+ | register | mountPlugin 逐个装配(拓扑序) | 工厂非默认导出 / erasable 违规 / 重名 |
65
+
66
+ 成功输出含 `installId`、`startedTime`、`durationMs`(QS-05 基线 P95 ≤ 800ms)与 `warnings`。
67
+
68
+ 程序化热重载:
69
+
70
+ ```ts
71
+ import { ReloadManager } from '../src/load/report.ts'
72
+ const mgr = new ReloadManager()
73
+ const { report, plugins } = await mgr.reload('./plugins/') // epoch 每次 +1 击穿模块缓存
74
+ ```
75
+
76
+ ## peer 冲突链示例
77
+
78
+ ```
79
+ [validate] FAIL — ./plugins/b.ts: peer dep-p@^2.0.0 required but 1.0.0 installed (path: manifest.peers)
80
+ ```
81
+
82
+ 冲突链定位三要素:**文件**(谁声明的)、**区间 vs 实际版本**、**依赖路径**。按此修版本或走豁免流程。
@@ -0,0 +1,19 @@
1
+ # landlock-run 构建单源(M3部署设计增补 §2.1.2:J-01 单点编译,J-05/J-17 消费产物,禁止平台内重编译)
2
+ # 目标三元组:linux-x64-gnu;产物指纹随 J-01 SBOM 下发,消费方启动时校验 sha256
3
+ CC ?= cc
4
+ CFLAGS ?= -O2 -std=c11 -Wall -Wextra -Werror
5
+ TARGET := landlock-run
6
+
7
+ .PHONY: all clean verify
8
+
9
+ all: $(TARGET)
10
+
11
+ $(TARGET): landlock-run.c
12
+ $(CC) $(CFLAGS) -o $@ $<
13
+
14
+ # 消费方(J-05/J-17)产物指纹校验入口
15
+ verify: $(TARGET)
16
+ sha256sum $(TARGET)
17
+
18
+ clean:
19
+ rm -f $(TARGET)