Skip to content

fix(plugin): 保持批准 receipt 读写兼容 - #2880

Open
jiajiayao wants to merge 2 commits into
makecindy:mainfrom
jiajiayao:codex/fix-ghost-receipt-roundtrip
Open

fix(plugin): 保持批准 receipt 读写兼容#2880
jiajiayao wants to merge 2 commits into
makecindy:mainfrom
jiajiayao:codex/fix-ghost-receipt-roundtrip

Conversation

@jiajiayao

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

修复 Ghost 安装批准 receipt 的读写不对称:writer 为 v0.1.48 兼容写作者格式,reader 现在严格兼容作者格式与受影响构建写出的 normalized 格式;同时把 containment 根解析为 realpath,避免 macOS /var → /private/var 或 linked ancestor 将根内普通 receipt 误判为越界。

变更类型

  • fix 缺陷修复

范围

  • 关联 Issue / 需求:fix(orca): invalidate ended team queue messages #1792 的本地提交硬门禁暴露;与 Orca 业务无关,故拆分。
  • 本 PR 包含:receipt 双格式严格读取兼容;linked-ancestor containment 修复;回归测试。
  • 明确不包含:receipt schema、权限集合、manifest 作者契约、安装布局或 UI 变化。
  • 用户可见变化:已批准插件不会因上述两类合法落盘/路径形态被误判失效。
  • 是否存在 breaking change:无。

UI 变化

不涉及。

  • 引用的设计规范:不涉及。

怎么验证的

自动验证

pnpm --filter desktop exec vitest run src/main/cindy-brain/__tests__/ghostInstallReceipt.test.ts
结果:12/12 通过

pnpm test:unit:related
结果:通过(apps/desktop related)

pnpm --filter desktop run --if-present typecheck
结果:通过

pnpm check:dco
结果:1/1 commit signed off

手工验证

不涉及。

未执行的验证

未运行 Desktop 全量测试;相关测试门禁已覆盖本次 2 个变更文件。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:只影响 Host receipt 读取;仍需通过两套既有严格 manifest 校验与原有 receipt 全字段授权校验。
  • 存量插件影响:无。v0.1.48 作者格式与受影响构建的 normalized 格式均保持可读,无需重装、重新确认或迁移。升级用例位于 ghostInstallReceipt.test.ts 的两条既有格式回归;linked ancestor 新增跨平台回归。
  • 手册同步:无需同步;不改变插件作者可见 manifest 契约。
  • 白名单确认:本 PR 触及插件批准状态读取基座,按 plugin-security-and-authoring.md 需要把关人明确 Approve。
  • 回滚 / 降级方式:单提交 revert;未写入新 schema 或新落盘格式,旧版本仍可读取作者格式 receipt。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名
  • UI 改动不涉及
  • 未提交凭证、令牌或授权文件
  • 已补充必要测试;无需作者手册变更
  • 已确认测试结果

Signed-off-by: jiajiayao <48589551+jiajiayao@users.noreply.github.com>
@jiajiayao
jiajiayao requested a review from a team as a code owner August 17, 2026 07:54
@greptile-apps

greptile-apps Bot commented Aug 17, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 修复 Ghost 安装批准 receipt 的兼容读取与 linked-ancestor 路径 containment。

  • receipt 校验统一使用兼容作者格式和受影响 normalized 格式的 validator
  • containment 根目录在同步读取前解析为 realpath
  • 新增 linked ancestor 与两类 receipt 格式的回归覆盖

Confidence Score: 5/5

当前修改看起来可以安全合并。

原线程指出的不可达回退已从当前代码中移除,现有校验路径覆盖两种 receipt 格式,未发现仍然存在的阻塞性故障。

Important Files Changed

Filename Overview
apps/desktop/src/main/cindy-brain/ghostInstallReceipt.ts 删除了原线程指出的冗余回退路径,并将 containment 根规范化为真实路径;未发现仍然存在的阻塞问题。
apps/desktop/src/main/cindy-brain/tests/ghostInstallReceipt.test.ts 增加 linked-ancestor 回归测试,并覆盖作者格式与 normalized 格式 receipt 的读取兼容性。

Reviews (2): Last reviewed commit: "fix(plugin): remove redundant receipt fa..." | Re-trigger Greptile

Comment thread apps/desktop/src/main/cindy-brain/ghostInstallReceipt.ts Outdated
Signed-off-by: jiajiayao <48589551+jiajiayao@users.noreply.github.com>
@jiajiayao

Copy link
Copy Markdown
Contributor Author

@MagicLizi @dash-s-cindy 该 PR 是从 #1792 验证过程中拆出的独立基线回归修复:pnpm test:unit:related 原先稳定失败于 Ghost receipt 的 macOS realpath containment,导致 #1792 无法满足根级提交门禁。最新 head 9135a21c7 已处理 Greptile 提到的冗余 validator fallback,DCO / design-basis / Desktop Git / Linux / Windows / verify / Greptile 均已通过;不改变插件 schema、permissions 或 author contract,存量插件影响为无。按 plugin whitelist 门禁,请维护者审查后 Approve/合并;合入后我会同步 main 到 #1792,完成其最后一条 P1 cleanup-intent 修复。

@MagicLizi

Copy link
Copy Markdown
Contributor

这个 PR 修改了插件基座(批准 receipt 的读写兼容与 containment 判定),会作用到全部已装插件,自动流程已暂停合并,需要维护者对存量插件兼容明确确认。

维护者确认方式:直接在 PR 上 Approve;需要修改就 Request Changes,作者改完后再 Approve 即放行。在维护者确认前,这个 PR 会保持在待确认队列中,不会自动合并。

讨论 issue:#2885

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示) labels Aug 17, 2026

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查通过。修复 symlink 祖先路径导致 containment 比对失败的问题——用 realpathSync 统一双侧路径基准,调用点在既有 try 块内,安全边界未削弱。

@MagicLizi MagicLizi added status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Aug 21, 2026

lizzjin commented Aug 21, 2026

Copy link
Copy Markdown

补充一条当前对外部贡献者的实际影响:我在 macOS arm64 上基于干净的 origin/main@f7e3de5e 复跑 pnpm test:unit:related,稳定只剩以下两条失败:

  • writes setup in the author format accepted by the v0.1.48 receipt reader
  • still reads normalized setup receipts emitted by affected builds

两条都位于 ghostInstallReceipt.test.ts,在未应用任何业务改动的 main 基线上同样复现;定向 maker-core 等相关测试均通过。结合本 PR 已定位的 macOS /var → /private/var realpath containment 差异,当前未合并状态会让 Mac 贡献者无法满足仓库要求的根级 test:unit:related 提交门禁,即使其 PR 与 Ghost receipt 完全无关,RepoSteward 这类 fail-closed 流程也会直接阻止后续提交。

目前该 PR 已 Approved,且 DCO、Linux、Windows、Desktop Git、verify 等检查均通过。@MagicLizi 烦请考虑尽快合并;如果仍需等待,也建议明确给出这两条已知基线失败的临时处理口径,避免 Mac 用户重复排查或重复实现同一修复。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) touches:plugin-base 改动碰到插件基座(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants