Skip to content

Commit f3bcda6

Browse files
committed
fix: return operation permissions to hosts
1 parent bb94abf commit f3bcda6

28 files changed

Lines changed: 597 additions & 355 deletions

‎changelogs/unreleased.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
66
## 当前未发布实现候选
77

8+
- **宿主权限归属与多呈现面文件打开修复**:`PreToolUse/PermissionRequest` 在 lifecycle、输出 builder 与 Codex/Claude/Gemini/Copilot/Grok/Cursor adapter 三层统一为 advisory-only,剥离遗留 `allow/deny/ask/block/continue:false`,DevCodex 继续记录风险与 typed workflow-invalid,但不再形成任何操作权限判断。新增 `HostLinkCapabilityDecisionV2`,把 `hostSurface` 与 `presentationSurface` 分开,为 Codex Desktop、VS Code、Zed、WebStorm、Codex CLI、Claude/unknown 选择经证据绑定的 native action、终端命令或绝对路径 copy fallback;持久化记忆链接继续保留 `LinkCapabilityDecisionV1`。
89
- **正式任务跨根续接与 Skill 精确读取(PI-306~PI-308 / PF-373~PF-375 / GR-096~GR-098)**:TaskIdentity 首次 root digest 仅作 provenance,Admission/Lifecycle/Stop/MCP takeover 共用 portable binding decision;共享决定先验证不可变 V2 identity/digest,损坏身份失败关闭。新根重新取得 live authority,旧 root 热槽和 BudgetCard/owner/lease 不迁移且不删除。宿主 Skill 隐私规则只放行精确 `SKILL.md` 文件,skills 根目录 list/glob/recurse 仍阻断。跨根 admission/Stop/MCP、tampered identity、真实 D 盘 session remap、Codex system Skill 与危险命令分类定向回归均 PASS。
910
- **ProfilePathPortabilityGate(PI-305 / PF-372 / GR-095)**:新生成 Profile 采用 opt-in `portable-v1`,项目内长期路径使用 `<workspace-root>` / `<project-root>` / `<active-root>` 或相对路径,真实本机外部路径用同一行 machine-local marker 标注。validator 仅检查显式目标 Profile 顶层 Markdown,不枚举其他项目;legacy 未声明契约时兼容读取,历史报告/receipt 不改写。D 盘迁移已把 DevCodex 自身 12 处旧工作盘符改为语义根并保留 2 处真实 E 盘 DevDocs 例外;隔离 Windows/Unix/URL/legacy 回归、active Profile 残留探针、control-content、duplication、CSD 与治理台账均 PASS。
1011
- **CP3 v1.6 工作流与任务所有权 P0 候选(发布资格验证中)**:新增 `ActualInstructionEnvelopeV1 → WorkItemSetV1 → WorkflowRouteDecisionV2`,附件、截图/OCR、引用文档、工具输出与 ambient UI 仅作证据,不能反向覆盖用户真实指令。`WorkspaceSessionRouteIndexV1` 只提供 hint,`ProjectTargetLeaseV2` 精确绑定 session/project/root/context/route;正式任务由 server-owned `TaskAdmissionTransactionV1` 一次性写入 task identity、`00-需求概况.md` 与用户原样 `01-产品需求.md`,以 ingress idempotency 和 `FencedTaskWriteOwnerLeaseV2` 阻止重复准入、跨项目/跨任务写入、mtime 选错任务及 terminal 旧绑定复活。Simple task 仅使用 server-issued 两路径/两次租约,漂移立即升级正式流程。

‎content/duplication-inventory.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"schemaVersion": "ControlContentDuplicationInventoryV1",
3-
"sourceBundleDigest": "5056411c034e70f59edb1e9329411b3b55c23f69dbe4476aeaafb279781948bc",
3+
"sourceBundleDigest": "6b7d25e46271f269d5523906774ec7ba4e1f989c2ad73bbfdfd1ed916933c695",
44
"thresholds": {
55
"minParagraphChars": 100,
66
"sectionThreshold": 0.94,

‎content/instructions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -659,7 +659,7 @@ CP1(问题确认)→ CP2(方案确认)→ [impact-review] → [CP3] →
659659
| FC2 | 报告文件已写入(chat 豁免)|
660660
| FC3 | CP 按序执行(dev/fix;其他 N/A)|
661661
| FC4 | 文件名/路径合规(`NN--` 双横杠开头;本轮无报告产物时 N/A)|
662-
| FC5 | `ArtifactDeliveryManifestV1` 已完整对账,`UserFacingArtifactSetV1` required hidden=0、计数守恒,并按已验证 `LinkCapabilityDecisionV1` 输出 |
662+
| FC5 | `ArtifactDeliveryManifestV1` 已完整对账,`UserFacingArtifactSetV1` required hidden=0、计数守恒;持久化 `LinkCapabilityDecisionV1` 与用户面 `HostLinkCapabilityDecisionV2` renderer 均有证据 |
663663
| FC6 | 新增 DevCodex 规范资产 `.md` 超 500 行须按 C13 拆分(业务产物不强制)|
664664
| FC7 | 用户决策选项与报告决策点必带推荐 + 理由 |
665665

‎content/instructions/02-output-paths.instructions.md‎

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ reports/<子目录>/<agent>/YYYYMMDD/NN--<简述>.md
148148

149149
用户可见文件交付统一由 `skills/user-visible-output-contract/SKILL.md` 管理。执行链固定为:
150150

151-
`ArtifactDeliveryManifestV1(内部完整)→ UserFacingArtifactSetV1(用户最小必要)→ FinalValidationSummaryV1(dev/fix/self-fix 完成态验证摘要)→ PostCompletionActionSetV1(真实且有授权边界的后续动作)→ DevCodexVisibleEnvelopeV2 → LinkCapabilityDecisionV1 renderer`。V1 仅允许一个兼容窗口的只读解析,新生产者不得写入。
151+
`ArtifactDeliveryManifestV1(内部完整)→ UserFacingArtifactSetV1(用户最小必要)→ FinalValidationSummaryV1(dev/fix/self-fix 完成态验证摘要)→ PostCompletionActionSetV1(真实且有授权边界的后续动作)→ DevCodexVisibleEnvelopeV2 → HostLinkCapabilityDecisionV2 renderer`。`LinkCapabilityDecisionV1` 继续供持久化记忆/产物相对链接投影和兼容读取使用,不得被宿主展示面的 V2 反向替换。
152152

153153
### 内部完整与用户可见分层
154154

@@ -175,7 +175,16 @@ reports/<子目录>/<agent>/YYYYMMDD/NN--<简述>.md
175175

176176
### LinkCapabilityDecision 客户端兼容矩阵
177177

178-
能力必须按当前 surface 的可验证证据选择,禁止只按宿主名称硬编码:
178+
能力必须按 `hostSurface + presentationSurface + rendererId + evidenceState` 的可验证证据选择,禁止只按宿主名称推定可点击。`HostLinkCapabilityDecisionV2` 用于用户可见最终回复;同一逻辑宿主的 Desktop、CLI、IDE 面必须分别判定:
179+
180+
| hostSurface / presentationSurface | 首选 renderer | 未验证或失败时 |
181+
|---|---|---|
182+
| Codex Desktop / desktop panel | `codex-native-file-panel`(native action) | 绝对路径 copy |
183+
| VS Code + Codex / terminal | `vscode-cli-goto`(`code --goto`) | 绝对路径 copy |
184+
| Zed / terminal | `zed-cli-open` | 绝对路径 copy |
185+
| WebStorm / JetBrains terminal | `webstorm-cli-open` | 绝对路径 copy |
186+
| Codex CLI、Claude Code / terminal | `absolute-path-copy` | 绝对路径 copy |
187+
| unknown / unknown | `unavailable-renderer` | 绝对路径 copy 或 unavailable + reason |
179188

180189
| capability mode | 主表示 | 路径列(强制) | 绝对路径 fallback | 证据边界 |
181190
|---|---|---|---|---|
@@ -213,7 +222,7 @@ Portable 示例保持同一语义项,链接 target 与路径列均为工作区
213222
- [最终执行与验证报告](.devcodex/devcodex/reports/requirements/codex/20260719/12--最终执行报告.md) — 汇总完成范围、验证结果和残余风险;路径:`.devcodex/devcodex/reports/requirements/codex/20260719/12--最终执行报告.md`;操作:查看结论
214223
```
215224

216-
Portable/Plain 在同一 semanticDigest 下只改变链接形式,不改变文件集合、顺序、状态、动作或路径列语义。legacy “主要产物 + 绝对路径”文本最多识别为 `unverified-legacy`,不能作为 verified delivery receipt。当且仅当 fallback 激活时,可追加 `绝对路径:E:/...` 并记录 reason。
225+
Portable/Plain 在同一 semanticDigest 下只改变链接形式,不改变文件集合、顺序、状态、动作或路径列语义。V2 的 `hostSurface / presentationSurface / rendererId / openMode` 属于宿主展示语义并进入 V2 semantic core。legacy “主要产物 + 绝对路径”文本最多识别为 `unverified-legacy`,不能作为 verified delivery receipt。当且仅当 fallback 激活时,可追加 `绝对路径:E:/...` 并记录 reason。
217226
### MCP profile fallback
218227

219228
若 Copilot / Codex 等非 Claude Code 宿主调用 `profile_load`、`profile_get_mode` 或其他 DevCodex MCP 工具时出现 `TypeError: Cannot read properties of undefined (reading 'invoke')`、工具桥接不可用、MCP server 未连接等错误,视为**宿主 MCP bridge 失败**,不得反复重试同一 MCP 调用。AI 必须立即降级:

‎content/instructions/17-compliance.instructions.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ version: 1.19.1
149149
| FC2 | 报告文件已写入(chat 豁免) |
150150
| FC3 | CP 按序执行(dev/fix;其他 N/A) |
151151
| FC4 | 文件名/路径合规(`NN--` 双横杠开头;本轮无报告产物时标 N/A) |
152-
| FC5 | `ArtifactDeliveryManifestV1` 完整对账;`UserFacingArtifactSetV1` required hidden=0、计数守恒;semantic name/action/order 与 `LinkCapabilityDecisionV1` capability renderer 有效 |
152+
| FC5 | `ArtifactDeliveryManifestV1` 完整对账;`UserFacingArtifactSetV1` required hidden=0、计数守恒;持久化投影 `LinkCapabilityDecisionV1` 与用户面 `HostLinkCapabilityDecisionV2`(host/presentation/renderer/evidence/fallback)各自有效 |
153153
| FC6 | 新增 DevCodex 规范资产 `.md` 行数检查(instructions / skills / prompts / templates / 规范源等超 500 行须按 C13 拆分;业务项目需求、技术方案、报告和正式项目文档不因 C13 强制拆分) |
154154
| FC7 | 用户决策选项与报告决策点必带推荐 + 理由:所有 AskUserQuestion / 多选项呈现 / CP 范围选择 / 方案对比 / analyze-audit 报告决策点必须有且仅有 1 个 🟢 推荐项(首位置 + 标签含"(推荐)"或表格标 ⭐),并附一句话推荐理由;**完成态「下一步/后续建议」适用 UniqueNextStepRecommendationGate**(禁止用「或/或者」并列 ≥2 条可执行路径;探针 `classifyNextStepOrForkSample`);没有可推荐动作时必须显式写 `推荐:无后续动作` 与原因 |
155155

‎content/prompts/delivery-checklist.prompt.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ applyTo: .devcodex/**/requirements/**
5757
4. 把所有 planned/observed/internal-delivered 文件登记到 `ArtifactDeliveryManifestV1`,rename/move/delete 保留 previousPath/tombstone;
5858
5. 由 `UserFacingArtifactSetV1` 投影默认交付,检查 required hidden=0、`listed+remaining=total`;session/daily/SUMMARY/task/checkpoint/raw receipt/manifest/ledger 默认 internal-only;
5959
6. 可见项必须使用 displayName/purposeText/userAction 与稳定 readingOrder,禁止“主要产物”;
60-
7. 按当前 surface 的 `LinkCapabilityDecisionV1` 选择 rich/portable/plain/failed;Rich clickable 不在路径列外重复 `绝对路径:` 行;
60+
7. 持久化投影继续使用 `LinkCapabilityDecisionV1`;用户面按 `HostLinkCapabilityDecisionV2.hostSurface + presentationSurface + rendererId + evidenceState` 选择 native-action/markdown-link/terminal-command/portable-path/absolute-copy/unavailable,未验证时降级而不推定可点击;
6161
8. **ArtifactPathColumnGate(PF-175)**:每项必须有路径列/字段,默认 workspace-relative portable;自由文本表默认列=语义名称\|用途\|路径\|操作;
6262
9. **禁止** 交付表只有「文件 \| 内容」+ 短文件名、无路径列(Grok 用户不可定位;与 PF-175 冲突);
6363
10. 完成后在报告中记录 `delivery-checklist: PASS`、manifestId、setId、semanticDigest 与 reconciliation。

‎content/prompts/report-dev.prompt.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ dev 中含 repair 切片时追加 `RepairPreventionAssessment`:只引用 Owner
8888

8989
ECR/确认后复审追加 **ReviewGradeCard**:`c19Label`(轻量/标准/全面/发布安全)· `reviewClass`(默认 R2)· `riskClass`/`riskFlags` · `contentPack` · `result`;R1 降级须 `skipReason`;禁止「永远轻量」无理由收口。
9090

91-
命中用户可见输出时追加 `VisibleOutputContract`:引用同一 `ArtifactDeliveryManifestV1.manifestDigest`、`UserFacingArtifactSetV1` 计数、`PostCompletionActionSetV1`、`DevCodexVisibleEnvelopeV2.semanticDigest`、`LinkCapabilityDecisionV1` 和 renderer parity;V1 只读兼容不得作为新产物。session/daily/SUMMARY/task/checkpoint/raw receipt/manifest/ledger 默认 internal-only,但仍参与 ECR。宿主 capability 未 direct 验证时写 portable/plain/unverified,不得按宿主名推断。
91+
命中用户可见输出时追加 `VisibleOutputContract`:引用同一 `ArtifactDeliveryManifestV1.manifestDigest`、`UserFacingArtifactSetV1` 计数、`PostCompletionActionSetV1`、`DevCodexVisibleEnvelopeV2.semanticDigest`、持久化 `LinkCapabilityDecisionV1`、用户面 `HostLinkCapabilityDecisionV2` 的 hostSurface/presentationSurface/rendererId/evidenceState/openMode/fallbackReason 和 renderer parity。session/daily/SUMMARY/task/checkpoint/raw receipt/manifest/ledger 默认 internal-only,但仍参与 ECR。宿主 capability 未 direct 验证时写 absolute-copy/unverified,不得按宿主名推断。
9292

9393
命中 `evidence-freshness` 时追加 `EvidenceFreshness`:记录 `ClaimEvidenceIndexV1.indexDigest`、`StaleEvidenceLintDecisionV1.status/mode`、downgrade/rerun 计数、summary-only 边界、artifact anchor / final validation summary binding 与 `npm run test:evidence-freshness` exitCode。报告只写摘要,不复制内部 receipt 全文。
9494

‎content/prompts/report-fix.prompt.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ applyTo: .devcodex/**/reports/bugs/**
7777

7878
ECR 的 review 状态必须来自唯一 `ReviewStateSnapshotV1`,并引用 planId、candidate/stage、fresh receipt digests、EvidenceSaturation 与 StageTiming;不得在报告手写另一套 open/blocker/stale 计数。
7979

80-
命中用户可见输出时追加 `VisibleOutputContract`:引用同一 `ArtifactDeliveryManifestV1.manifestDigest`、`UserFacingArtifactSetV1` 计数、`PostCompletionActionSetV1`、`DevCodexVisibleEnvelopeV2.semanticDigest`、`LinkCapabilityDecisionV1` 和 renderer parity;V1 只读兼容不得作为新产物。默认用户列表不包含 session/daily/SUMMARY/task/checkpoint/raw receipt/manifest/ledger,但这些内部产物仍须写入、验证和参与 ECR。
80+
命中用户可见输出时追加 `VisibleOutputContract`:引用同一 `ArtifactDeliveryManifestV1.manifestDigest`、`UserFacingArtifactSetV1` 计数、`PostCompletionActionSetV1`、`DevCodexVisibleEnvelopeV2.semanticDigest`、持久化 `LinkCapabilityDecisionV1`、用户面 `HostLinkCapabilityDecisionV2` 的 hostSurface/presentationSurface/rendererId/evidenceState/openMode/fallbackReason 和 renderer parity。默认用户列表不包含 session/daily/SUMMARY/task/checkpoint/raw receipt/manifest/ledger,但这些内部产物仍须写入、验证和参与 ECR。
8181

8282
<!-- devcodex:include shared/report/mcp-fallback-recording.md -->
8383

‎content/skills/compliance/SKILL.md‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,8 @@ dev 模式 PC4 至少输出:
4848
> ⛔ 宣称完成却只有“全绿/详见报告” → `DevModeCompletionCheckDetailGate` 未通过。
4949
> ⛔ 未宣称完成时 **不得** 为过 Stop 而硬贴长完成检查(Stop 以 `workDoneClaimed` 为准)。
5050
> ℹ️ 六宿主同源:`user-visible-output-contract` · UserVisibleReplyLayoutV1 + UserVisibleNoisePolicyV1。
51-
> ⚠️ **FC5 填写规则**:触发 `user-visible-output-contract`。`ArtifactDeliveryManifestV1` 必须 planned=observed=internalDelivered,`UserFacingArtifactSetV1` 必须 required hidden=0 且 `listed+remaining=total`;session/daily/SUMMARY/task/checkpoint/raw ledger 默认 internal-only 但仍参与 ECR。链接按 `LinkCapabilityDecisionV1` 输出;Rich clickable 不重复绝对路径。Hook 未观察 payload 时只能 `unverified`,legacy 格式最多 `unverified-legacy`。
51+
> ⚠️ **FC5 填写规则**:触发 `user-visible-output-contract`。`ArtifactDeliveryManifestV1` 必须 planned=observed=internalDelivered,`UserFacingArtifactSetV1` 必须 required hidden=0 且 `listed+remaining=total`;session/daily/SUMMARY/task/checkpoint/raw ledger 默认 internal-only 但仍参与 ECR。持久化投影使用 `LinkCapabilityDecisionV1`,用户面使用 `HostLinkCapabilityDecisionV2`;Rich clickable 不重复绝对路径。Hook 未观察 payload 时只能 `unverified`,legacy 格式最多 `unverified-legacy`。
52+
> ⚠️ **HostPermissionAuthorityInvariant**:`PreToolUse/PermissionRequest` 的文件、命令、删除和工具操作权限仅由宿主决定。DevCodex 可以记录 advisory/workflow-invalid,但输出及宿主 adapter 不得含 `allow/deny/ask/block/continue:false` 操作权限载荷;负向测试必须覆盖六宿主遗留载荷剥离。
5253
> ℹ️ prod 模式不执行合规检查,不输出状态块。
5354
> ℹ️ chat 工作流豁免此输出。
5455
@@ -167,7 +168,7 @@ chat / 纯确认短答:TTFV 可 `N/A + skipReason=chat-or-ack`。
167168
| FC2 | 报告文件已写入(chat 豁免) |
168169
| FC3 | CP 按序执行(dev/fix;其他 N/A) |
169170
| FC4 | 文件名/路径合规(`NN--` 双横杠开头) |
170-
| FC5 | `ArtifactDeliveryManifestV1` 完整对账;`UserFacingArtifactSetV1` required hidden=0、计数守恒;semantic name/action/order 与 `LinkCapabilityDecisionV1` capability renderer 有效 |
171+
| FC5 | `ArtifactDeliveryManifestV1` 完整对账;`UserFacingArtifactSetV1` required hidden=0、计数守恒;semantic name/action/order、`LinkCapabilityDecisionV1` 持久化投影与 `HostLinkCapabilityDecisionV2` 用户面 renderer 有效 |
171172
| FC6 | 新增 DevCodex 规范资产 `.md` 行数检查(instructions / skills / prompts / templates / 规范源等超 500 行须按 [C13](../../instructions/01-common.instructions.md) 拆分;业务项目需求、技术方案、报告和正式项目文档不因 C13 强制拆分) |
172173
| FC7 | 用户决策选项与报告决策点必带推荐 + 理由:所有 AskUserQuestion / 多选项呈现 / CP 选项 / 方案对比 / analyze-audit 报告决策点必须有且仅有 1 个推荐项,推荐项置首且说明推荐理由;**完成态「下一步/后续建议」适用 UniqueNextStepRecommendationGate**(禁止「或」并列双主动作);无后续动作时写明 `推荐:无后续动作` |
173174

‎content/skills/document-sync/SKILL.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ description: 文档同步规范 — 代码变更后同步必查与条件文档
115115
- 历史 Vxx、CrossProject 与 A1~A10 名称只通过 registry `legacyAnchors` 检索;找不到等强度承接方时标记 `legacy-index-retained`,不得直接删除或继续扩展长清单。
116116
- 文档定义阅读/审查/实施顺序时,Concept Sync Map 必须对账正文、导航/sidebar 与 README/索引顺序;故意不同须说明理由。
117117
- 宿主契约和多批次任务分别保留 HostContractRoute 证据与最新 `05-实施进度.md`。
118-
- 用户可见输出契约变化时,把 `ArtifactDeliveryManifestV1 → UserFacingArtifactSetV1 → PostCompletionActionSetV1 → DevCodexVisibleEnvelopeV2 → LinkCapabilityDecisionV1` 同步到 instructions、report/memory/compliance/TestRoute、precheck/progress/delivery/report prompts、visible Hook、README、website、Profile、plugin/portfolio、package 与 validate probes;V1 只保留兼容读取,历史归档可保留旧表述,但当前消费者不得继续写 V1、按宿主名强制绝对路径或把 internal-only 文件默认列给用户。
118+
- 用户可见输出契约变化时,把 `ArtifactDeliveryManifestV1 → UserFacingArtifactSetV1 → PostCompletionActionSetV1 → DevCodexVisibleEnvelopeV2 → HostLinkCapabilityDecisionV2` 同步到 instructions、report/memory/compliance/TestRoute、precheck/progress/delivery/report prompts、visible Hook、README、website、Profile、plugin/portfolio、package 与 validate probes;`LinkCapabilityDecisionV1` 保留给持久化相对链接投影和兼容读取。历史归档可保留旧表述,但当前消费者不得按宿主名推定可点击、强制单一路径表示或把 internal-only 文件默认列给用户。
119119

120120
### ProfileImpactCheck
121121

0 commit comments

Comments
 (0)