Repository navigation
[REQ-128][CODE] 发布 HostExtensionPackageV1 contract、profiles 与 legacy oracle #694
Description
⚠️ 本期范围裁决(2026-07-30,owner)—— 优先于下方原文与基线REQ-128 分四相交付,本期只做 Phase 1 原生主干(
#694、alpha-web#95、
alpha-web#97、#702、#695、#696、#713),只支持单组件 package
(Skill / Agent / MCP),不含 Bundle。裁决记录见
alpha-work#49分期裁决。本票被删除的范围(不要实现,不要写它们的测试):
compileLegacyProjection()与"唯一 legacy transform 权威";- v0.1.0 / v0.1.1 / v0.1.2 三版 old-host oracle 与 canonical projection bytes;
- prelude 里的
legacyProjectionDigest与 package↔legacy entry 绑定;- 同 ID shadow、malformed/binding-mismatch 的 no-fallback、LKG 规则;
- 下方 Development plan 第 3 条的 projection digest 部分、第 4 条整条、第 6 条整条;
- Acceptance 里 "old-host oracle 对三个 release commit 的 parser/planner 预期 plan"。
理由(实读,非推断):
v0.1.2:packages/ui-mac/src/main/remote-catalog.ts
的saneCatalog()只校验{version:string, entries:非空数组},新增同级
packages[]会被旧壳直接忽略;App 走 electron-updater 自动更新,旧宿主人群自然收敛。
因此packages[]定为新宿主专用,旧宿主看不见新内容即为正确行为。替代进来的两条闸门(便宜、必须有):
entries[]永不为空 —— 旧壳saneCatalog要求非空,空数组会让旧宿主整份拒绝并回落缓存;- 一条回归测试:目录顶层新增同级键后,v0.1.x 的壳解析语义仍然成功。
其余(shallow header、payload-ref-only、profile/capability 前置门、unknown/missing 下
fetch/decoder/secret/OAuth/planner 调用数为零、limits/负向、artifact path+SHA +
generator--check)照原文做,不打折。禁止扩张:不新建通用框架 / 抽象层 / registry 引擎;不为"以后可能有 Phase 2"预留
插槽;发现超范围缺陷写回本票,不顺手修。
Outcome
由 Alpha 宿主先发布 HostExtensionPackageV1 contract artifact:稳定浅
AlphaPackageEnvelopeV1、strict component payload profiles、正交 capability vocabulary、
synthetic decoder corpus。它是跨仓关键路径第一张可开发票。
Covers
alpha-work#49 AC2/AC3/AC7 的 host contract foundation。
Solution baseline
Accepted REQ-128 baseline
§2.1、§2.3、§5 —— 但 §2.3 中 legacy projection / old-host oracle / 同 ID shadow 部分
已由上方裁决删除,以裁决为准。
Code boundary
packages/ui-mac/src/shared/host-extension-package-contract/**CONTRACT.md- shallow envelope/profile payload JSON schemas
- capability/profile registry artifact
- strict pure decoder/registry module(无 Electron、网络或磁盘副作用)
- artifact path+SHA/generator checks供
alpha-web#95git-vendor
Development plan
- Envelope只允许固定浅header与content-addressed payload ref,禁止inline object payload。
- profileId/version负责payload schema gate;capability只表达跨profile行为,package union
由compiler派生,作者不声明raw token。 - prelude固定
{packageId, version}与 canonical bytes 算法(不含 projection digest)。 legacy oracle—— 已删除,见顶部裁决。改为:entries[]非空不变量 + 旧壳同级键容忍回归测试。- decoder固定顺序:header limits → profile/capability → fetch/decode payload;
unknown/missing门下fetch/decoder/secret/OAuth/planner为零。 malformed/binding mismatch 与 foundation shadow/no-fallback/LKG—— 已删除,见顶部裁决。
保留:malformed package 本身被拒(无 fallback 语义可言,因为不存在同 ID legacy 对偶)。- 仅发布contract/synthetic decoder;production Catalog/UI/IPC接线归[REQ-128][CODE] 将 package compatibility 单一权威接入 Catalog、详情与安装预检 #702。
Acceptance and named gates
host-extension-package-artifact.test.tspackage-envelope-v1.test.ts- depth/count/bytes/control/prototype/unknown version/profile/capability负向。
entries[]非空不变量;旧壳同级键容忍回归测试。- artifact可由commit+SHA固定且generator
--check。
Dependencies
仅依赖accepted baseline与顶部裁决;可立即进入Ready/开发。
Out of scope
web Declaration/compiler、production Catalog wiring、auth/transaction、dynamic registry/decoder、
legacy projection 与 old-host oracle(本期删除)、Bundle 相关一切(Phase 2)。
Exit condition
Merged host artifact + pure decoder/testvectors + docs contract;解除 alpha-web#95 阻塞。
Activity
[-][REQ-128][CODE] 实现稳定 Package Envelope 与 Host Capability negotiation[/-][+][REQ-128][CODE] 发布 HostExtensionPackageV1 contract、profiles 与 legacy oracle[/+]jinjunnn commentedon Jul 30, 2026
R1 跨模型对抗审计记录(2026-07-30)
实现方 codex,审计方 Opus(只读)。审计做了真实 mutation 测试:30 处生产检查逐个禁用,
20 处零红存活;并实测
--check漂移门、顺序门、计数器断言均绕不过去。预算:M 级 ≤2 轮,本轮 R1,R2 只判闭合 + 修复 diff。
采纳并回传实现方(编排者过筛后)
bun test src3214/1,gate-files.tsv未登记三个新测试文件)bun-test-floor.sh 3000await、两处测试名超卖实际断言编排者对 M2 的裁决:比审计建议更进一步
审计判定 capability 词表在这份 decoder 里就是白名单(在册即放行),因此写进词表 =
肯定式声明"宿主支持"。
alpha.mcp-oauth.v1(#703)与alpha.connection-prerequisite.v1(#704)均在 Phase 2、桌面侧零实现。审计要求 owner 在"cloud profile 属不属 Phase 1"上二选一。
裁决:连
cloudprofile 一起删。 依据:①owner 分期裁决原文是"单组件 package:Skill/Agent/MCP";②cloud 今天经 legacy
entries[]正常交付且是 receipts-only(不写盘、不写配置),没有本期用户需求要把它搬进
packages[];③它是唯一恒定派生 Connection 前置的profile,删它一刀解开整个结。删除属删除动作,不是重新设计。
Phase 1 收敛为:profile =
skill/agent/mcp-local/mcp-remote(auth 去掉oauth与alpha-connection);capability 词表 =alpha.secret-prerequisite.v1一个。未在册者一律fail-closed。并新增一条类级闸门:枚举全部 profile schema 可达取值,断言
derivePayloadCapabilitiesV1派生出的 capability 全部落在词表内 —— 防这一类复发。已知不修 + 理由(留痕)
validateSchemaLitecanonicalArtifactJsonBytesV1与catalog-curation.ts的canonicalJsonBytes--check加"语义快照"inspectValue的 node 计数早于 depth 检查maxHeaderNodes=128偏紧decodeString用 UTF-16 长度比max、字节上限用 UTF-8sha256Hex三处重复payloadRef.bytesdecodeMcpLocalPayload不校验command[0]附带核实(编排者自验,非审计方结论)
packages/ui-mac,不触UPSTREAM_PATHS。readCachedCatalog;且审计逐字比对确认
v0.1.1/v0.1.2的saneCatalog()与今天main相同(v0.1.0尚无此文件)。entries[]非空的生产端强制不在本仓(本仓不产 catalog),已作为硬要求带入alpha-web#95。[#694][CODE] 发布 HostExtensionPackageV1 contract、profiles 与 strict dec…
jinjunnn commentedon Jul 30, 2026
R2 审计记录与合并裁决(2026-07-30)
R2 结论:
RECOMMEND: MERGE—— R1 六条(B1/M1/M2/M3/minor/F6)全部 FIXED,ed2917c4..fb85d3ac内无新 Blocker/Major。审计方在本轮又做了 43 处 mutation(实现方自测 8 处),并单独验证了 M2 新增的类级闸门双向都拦得住
(词表多一个没人派生的 token → 红;schema 派生出一个不在词表的 token → 红;
把
derivePayloadCapabilitiesV1打空 → 红)。M2 的删除经两条独立检索轴交叉验证(符号轴 + 键名轴)在
packages/、scripts/、docs/contracts/全部零命中,无死路径、无孤儿类型、无悬挂引用。编排者从 out-of-round 里捞出来自行修掉的一条(未开第三轮)
synthetic-decoder.ts的 secret 前置阶段零语义覆盖 —— 假闸门。整段删掉、再照
CONTRACT.md的正常流程重新生成 artifact,48 条测试全绿。而
CONTRACT.md把它作为固定顺序第 5 步公开承诺,scripts/gate-files.tsv的 guarantee写着「变异即红」—— 登记簿在替它撒谎。
过三问:①对应 AC3/AC4 的固定顺序;②闸门是假的,且契约与登记簿都在超卖;③修法是既有循环加一行断言。
三条全中,且属"删代码/加断言"类而非扩张类,故按预算规则(Major 及以下筛完直接修、修完不复审、直接合)
自行修掉,不开第三轮。
反向验证(编排者自跑):加断言后 0 fail → 删掉整个 secret 阶段 3 fail →
改成无条件触发 3 fail → 恢复 0 fail。
注:这一条不是修复 diff 引入的,R1 自己的枚举就漏了(
ed2917c4同一段也只断言fetch/decoder/planner 三个计数器)。记下来作为「枚举漏」的又一实例。
同批修掉的文档漂移
已批基线
docs/design/2026-07-30-req128-extension-package-baseline.md顶部加相位勘误框:标注 legacy projection 半场与 §2.9 自缚作废、§6 的
package-mcp-oauth.wiring.test.ts/package-alpha-connection.test.ts随#703/#704移入 Phase 2。理由:基线是下一轮 review 的对照物,对不上会误导。
结转的 follow-up(本票不做,已记录)
HEADER_NAME_RE、requiredSecrets名字正则、command条数、assettext/markdown绑定、asset 5 MiB 上限、decodeString单字段 max / 空串、record 32 属性上限)behavior.properties取不到即退化为单变体;认死requiredSecrets字面名)docs/contracts/host-extension-package-v1.md里的 aggregate SHA 无门钉住alpha-web#95照文档 pin 会在消费端硬失败,不会放坏字节过)PROFILE_ID_RE/CAPABILITY_RE/component.required/envelope 对象性)合并
PR #718 已 squash 合并为
55890367。下游 pin 三件套:commit
55890367、路径packages/ui-mac/src/shared/host-extension-package-contract/、aggregate SHA
c3c53e0580782884d441ed04064e31020949bef87ae01b4a0403f8576e3fd483。[#696][CODE] secret prerequisite 消费 host Envelope + 删除 renderer 明文回显 (#…