From c12969b2c0e46c701842128e6d97d9065d0277a4 Mon Sep 17 00:00:00 2001 From: whitelonng Date: Wed, 22 Jul 2026 04:54:25 +0800 Subject: [PATCH 1/6] feat: complete continuity governance evolution --- .gitignore | 23 +- README.en.md | 72 +- README.md | 70 +- docs/12-lifecycle.md | 250 +----- docs/README.md | 35 + docs/architecture.md | 74 ++ docs/engineering.md | 49 ++ docs/platform-adapters.md | 44 + docs/project-intelligence.md | 50 ++ docs/release-acceptance.md | 48 + docs/workflows.md | 92 ++ package-lock.json | 4 +- package.json | 2 +- src/cli.ts | 63 ++ src/commands/adapter.ts | 128 +++ src/commands/context.ts | 61 +- src/commands/init.ts | 43 +- src/commands/install.ts | 44 +- src/commands/project.ts | 72 ++ src/commands/refresh-style.ts | 6 +- src/commands/status.ts | 94 +- src/commands/v3-init.ts | 17 +- src/commands/version.ts | 2 +- src/commands/workflow.ts | 74 ++ src/context/compatibility.ts | 159 +++- src/context/greenfield-init.ts | 150 +++- src/context/manifest.ts | 214 ++++- src/context/migrate.ts | 2 +- src/context/plan-revision.ts | 161 ++-- src/context/project-policy-upgrade.ts | 709 +++++++++++++++ src/context/reframe.ts | 753 ++++++++++++++++ src/context/resolver.ts | 5 +- src/context/store.ts | 4 +- src/context/task-head-reconcile.ts | 4 +- src/context/workflow-create.ts | 80 +- src/context/workflow-metadata.ts | 67 +- src/installers/adapter-upgrade.ts | 831 ++++++++++++++++++ src/installers/claude-code.ts | 4 +- src/installers/cursor.ts | 3 +- src/installers/managed-block.ts | 35 +- src/installers/mode-skills.ts | 8 +- src/installers/shared-content.ts | 4 +- src/installers/v3-adapter.ts | 560 +++++++++++- src/runtime/beta-gate.ts | 15 +- src/runtime/operation-definition.ts | 84 ++ src/runtime/operation-journal.ts | 6 + src/runtime/operation-recovery-executor.ts | 32 +- src/runtime/operation-recovery-payload.ts | 264 ++++++ src/runtime/project-write-barrier.ts | 45 + src/runtime/projection-outbox.ts | 19 +- src/runtime/task-operation.ts | 285 +++++- src/system/scan-aesthetics.ts | 8 +- src/system/workflow.ts | 2 +- src/team/authorization.ts | 21 +- src/team/checkpoints.ts | 2 + src/team/git-ref-client.ts | 4 +- src/templates/agents/film-analyst-defense.ts | 2 +- src/templates/agents/film-analyst-offense.ts | 2 +- src/templates/agents/head-coach.ts | 29 +- src/templates/agents/plan-coach.ts | 43 +- src/templates/agents/scout.ts | 44 +- src/templates/defaults.ts | 4 +- src/templates/inline.ts | 26 +- src/templates/skills/man.ts | 12 +- src/templates/skills/mansolo.ts | 2 +- src/templates/skills/manteam.ts | 6 +- tests/adapter-upgrade-contracts.test.ts | 340 +++++++ tests/agents.test.ts | 59 ++ tests/aggregate-contracts.test.ts | 2 +- tests/authorization-contracts.test.ts | 25 +- tests/beta-gate-contracts.test.ts | 8 + tests/cli-v3-surface-contracts.test.ts | 7 + tests/compatibility-contracts.test.ts | 124 ++- tests/context-resolver-contracts.test.ts | 2 + tests/cursor-adapter.test.ts | 4 + tests/greenfield-init-contracts.test.ts | 47 + tests/manifest-session-contracts.test.ts | 49 ++ tests/migrate-contracts.test.ts | 2 +- tests/operation-definition-contracts.test.ts | 2 +- .../project-policy-upgrade-contracts.test.ts | 311 +++++++ ...rojection-eventual-consistency-e2e.test.ts | 157 +++- tests/shared-content.test.ts | 5 + tests/skills.test.ts | 40 + tests/status.test.ts | 16 + tests/v3-adapter-contracts.test.ts | 74 +- tests/v3-adapter-read-retry-contracts.test.ts | 11 +- tests/v3-command-contracts.test.ts | 143 +++ tests/v3-init-command.test.ts | 34 +- tests/v3-reframe-contracts.test.ts | 732 +++++++++++++++ tests/v3-reframe-recovery-contracts.test.ts | 403 +++++++++ ...v3-requirements-finalize-contracts.test.ts | 89 +- tests/v3-workflow-create-contracts.test.ts | 1 + tests/website-docs.test.ts | 2 + tests/workflow-metadata-contracts.test.ts | 36 +- website/PLAN.md | 83 -- website/docs.html | 29 +- website/docs.zh-CN.html | 29 +- website/index.html | 2 +- website/index.zh-CN.html | 2 +- 99 files changed, 8242 insertions(+), 755 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/architecture.md create mode 100644 docs/engineering.md create mode 100644 docs/platform-adapters.md create mode 100644 docs/project-intelligence.md create mode 100644 docs/release-acceptance.md create mode 100644 docs/workflows.md create mode 100644 src/commands/adapter.ts create mode 100644 src/commands/project.ts create mode 100644 src/context/project-policy-upgrade.ts create mode 100644 src/context/reframe.ts create mode 100644 src/installers/adapter-upgrade.ts create mode 100644 src/runtime/project-write-barrier.ts create mode 100644 tests/adapter-upgrade-contracts.test.ts create mode 100644 tests/project-policy-upgrade-contracts.test.ts create mode 100644 tests/v3-reframe-contracts.test.ts create mode 100644 tests/v3-reframe-recovery-contracts.test.ts delete mode 100644 website/PLAN.md diff --git a/.gitignore b/.gitignore index 536a5b3..21af5ff 100644 --- a/.gitignore +++ b/.gitignore @@ -2,27 +2,27 @@ # mancode .gitignore # =================================== -# 内部开发文档(包含借鉴对象名,不公开) -DEVELOPMENT.md +# 内部法律文档(包含借鉴对象名,不公开) LEGAL.md *.backup -# 设计文档(内部参考,不公开) +# 历史设计文档默认不公开;当前文档白名单见下方 docs/ # Claude Code 开发配置(本地测试用) .claude/ -# 技术实现文档(包含借鉴对象名和完整实现细节,不公开) -docs/12-lifecycle.md -docs/13-scanning.md -docs/14-orchestration.md -docs/15-adapters.md - -# 公开优化决策文档:PostToolUse P0 设计决策需要随代码提交 +# 当前维护文档 !docs/ docs/* +!docs/README.md +!docs/architecture.md +!docs/workflows.md +!docs/project-intelligence.md +!docs/platform-adapters.md +!docs/engineering.md !docs/12-lifecycle.md +!docs/release-acceptance.md # Node.js node_modules/ @@ -94,6 +94,5 @@ output/ # Demo projects (local only, not published) examples/ -# Local-only publishing and planning documents +# Local-only publishing configuration .npmrc -CONTEXT_TEAM_REFACTOR_PLAN.md diff --git a/README.en.md b/README.en.md index c86082b..3456194 100644 --- a/README.en.md +++ b/README.en.md @@ -17,7 +17,7 @@

License: AGPL-3.0 npm version - Status: mancode Continuity v0.3.18 + Status: mancode Continuity v0.4.0 Platforms: Claude Code, Cursor, Codex in ChatGPT desktop and CLI, GitHub Copilot, ZCode

@@ -107,10 +107,15 @@ one window's temporary state as another window's identity. ```bash mancode status --brief --json mancode context session new --client claude-code +mancode context session show --session --client claude-code --json mancode context resume --session --client claude-code mancode context show --purpose orient --session --client claude-code ``` +When the project has a local mancode install, pin one CLI binary for the whole +task: prefer `./node_modules/.bin/mancode`, otherwise use `mancode`. Check the +selected binary with `--version` once and do not mix versions afterward. + The original `/man`, `/manba`, and `/manteam` entries handle these steps. The CLI form above is useful for diagnostics, automation, or manual recovery. @@ -353,7 +358,7 @@ it should behave, and why previous decisions were made. ## Installation -**Status**: mancode Continuity v0.3.18. Claude Code, Cursor, Codex in the ChatGPT +**Status**: mancode Continuity v0.4.0. Claude Code, Cursor, Codex in the ChatGPT desktop app and CLI, GitHub Copilot, and ZCode adapters are included. Requires Node.js 20 or newer. macOS, Linux, Windows CMD, PowerShell, and Git Bash @@ -394,8 +399,9 @@ mancode init --platform PLATFORMS # One or more: claude-code,cursor,codex,copilo mancode init --empty # Allow a safe empty directory in non-interactive scripts mancode init --lang zh-CN # Explicit initialization language (zh-CN or en) mancode refresh-project # Refresh facts after Git or project files are added -mancode install --force # Repair or reinstall the selected adapter -mancode install --minimal # The bootstrap is already minimal; retained for compatibility +mancode adapter status --json # Inspect actual managed-content digests +mancode adapter upgrade --platform codex --dry-run # Stage a preview only +mancode adapter upgrade --platform codex --confirm --operation-id --session --client ``` ## Agent Modes @@ -424,10 +430,16 @@ mancode init --legacy mancode status mancode status --json mancode status --brief --json -mancode install +mancode install --confirm --operation-id --session --client +mancode adapter status [--platform ] --json +mancode adapter upgrade <--all|--platform > --dry-run +mancode adapter upgrade <--all|--platform > --confirm --operation-id --session --client +mancode project upgrade --policy 2 --dry-run +mancode project upgrade --policy 2 --operation-id --session --client mancode list-platforms mancode team identity create --name "" mancode context session new --client +mancode context session show --session --client --json mancode workflow create "" --session mancode workflow list --json mancode workflow show --json @@ -438,6 +450,7 @@ mancode workflow plan confirm --plan-decision --status --expected-revision --session mancode workflow review apply --file --expected-revision --session mancode workflow verify apply --file --expected-revision --session +mancode workflow reframe --expected-revision --checkpoint-id --session mancode workflow complete --expected-revision --session mancode manps [area] mancode refresh-project @@ -452,7 +465,7 @@ mancode version Simplified output: ```text -mancode v0.3.18 +mancode v0.4.0 Project: my-app Runtime: ready @@ -594,14 +607,16 @@ mancode/ - Irreversible operations such as force pushes, schema migrations, and bulk deletes require explicit human confirmation. -## Roadmap +## Remaining Work + +- Complete real-host session acceptance for Claude Code, Codex, Cursor, + GitHub Copilot, and ZCode on one release candidate. +- Complete cross-host recovery and two-clone git-ref manual acceptance. +- Confirm ZCode project-skill discovery and workspace-command paths; keep the + adapter provisional until then. +- Evaluate Windsurf, Cline, and Roo Code adapters based on real demand. -| Phase | Focus | -|---|---| -| MVP-1 | solo mode, aesthetics, and Claude Code hooks | -| MVP-2 | `/manba`, `/man`, `/manteam`, `/manps`, and coaching-staff subagents | -| MVP-3 | Cursor, Codex (ChatGPT desktop/CLI), and GitHub Copilot adapters | -| Public Release | stable npm release, marketplace distribution, docs, and demos | +See [V3 Release Acceptance](./docs/release-acceptance.md) for the complete gate. ## Troubleshooting @@ -616,21 +631,26 @@ a deliberately empty directory. ### Claude Code hooks not triggering After `mancode init`, restart Claude Code so it reloads `.claude/settings.json`. -Run `mancode status` to verify hooks are registered. If hooks are still missing, -run `mancode install claude-code --force` to rewrite the settings. +Run `mancode status` to verify hooks are registered. For V3 adapter drift, preview +`mancode adapter upgrade --platform claude-code --dry-run`, then repair that +preview with its `--operation-id`, an active session, and `--confirm`. The legacy +hook architecture still uses `mancode init --legacy --force`. ### `mancode status` shows a platform as "not ready" -This means the platform's target files are missing. Run -`mancode install --force` to regenerate them. For managed-block +This means the platform's target files are missing or their digest is stale. +Preview `mancode adapter upgrade --platform --dry-run`, inspect the +staged result, then run it with the returned `--operation-id`, an active session, +and `--confirm`. For managed-block platforms (Codex, ZCode, Copilot), the managed block in `AGENTS.md` or `.github/copilot-instructions.md` may have been manually edited or deleted. ### AGENTS.md or copilot-instructions.md managed block was accidentally deleted -Run `mancode install codex --force` (or `zcode`, or `copilot`) to reinsert the -managed block. User-authored content outside the relevant mancode managed -markers is preserved. +Preview `mancode adapter upgrade --platform codex --dry-run` (or `zcode`, or +`copilot`), then run it with the returned `--operation-id`, an active session, +and `--confirm` to reinsert the managed block. User-authored content outside the +relevant markers is preserved. ### ZCode skills not appearing @@ -648,16 +668,8 @@ description field — invoke them by asking for `/manba` or similar. ### How to reinstall Continuity adapters ```bash -mancode uninstall claude-code --force -mancode uninstall cursor --force -mancode uninstall codex --force -mancode uninstall copilot --force -mancode uninstall zcode --force -mancode install claude-code -mancode install cursor -mancode install codex -mancode install copilot -mancode install zcode +mancode adapter upgrade --all --dry-run +mancode adapter upgrade --all --confirm --operation-id --session --client ``` Continuity authority is protected, so `mancode uninstall --all` does not delete workflow diff --git a/README.md b/README.md index d818221..f9314eb 100644 --- a/README.md +++ b/README.md @@ -17,7 +17,7 @@

许可证:AGPL-3.0 npm 版本 - 状态:mancode Continuity v0.3.18 + 状态:mancode Continuity v0.4.0 平台:Claude Code、Cursor、ChatGPT 桌面端 Codex、Codex CLI、GitHub Copilot、ZCode

@@ -118,6 +118,16 @@ mancode context session new --client claude-code mancode list-platforms ``` +要只读检查一个 session(例如确认 Codex 续接时仍使用同一身份),使用: + +```bash +mancode context session show --session --client --json +``` + +在项目同时安装 mancode 时,整项任务应固定使用项目本地 CLI:优先 +`./node_modules/.bin/mancode`,否则再使用 PATH 中的 `mancode`;先运行一次 +`--version`,后续不要混用不同版本。 + 普通 `mancode init` 会生成原来的 `man`、`manba`、`manteam`、`manps`、 `mansolo` 平台命令,不需要改用另一套命令名。确实需要旧 `state.json` 架构时才使用 `mancode init --legacy`。 @@ -307,7 +317,7 @@ src/components/ ## 安装 -**状态**:mancode Continuity v0.3.18。Claude Code、Cursor、ChatGPT 桌面端中的 +**状态**:mancode Continuity v0.4.0。Claude Code、Cursor、ChatGPT 桌面端中的 Codex、Codex CLI、GitHub Copilot 和 ZCode adapter 均已接入。 需要 Node.js 20 或更高版本。原生支持 macOS、Linux、Windows CMD、 @@ -346,8 +356,9 @@ mancode init --platform PLATFORMS # 一个或多个:claude-code,cursor,codex,c mancode init --empty # 非交互脚本中允许安全的空目录 mancode init --lang zh-CN # 显式指定初始化语言(zh-CN 或 en) mancode refresh-project # 后续加入 Git 或项目文件后刷新项目事实 -mancode install --force # 修复或重装所选 adapter -mancode install --minimal # bootstrap 已是最小形态;保留兼容参数 +mancode adapter status --json # 检查实际 managed content digest +mancode adapter upgrade --platform codex --dry-run # 只生成 staging 预览 +mancode adapter upgrade --platform codex --confirm --operation-id --session --client ``` ## Agent Modes @@ -376,10 +387,16 @@ mancode init --legacy mancode status mancode status --json mancode status --brief --json -mancode install +mancode install --confirm --operation-id --session --client +mancode adapter status [--platform ] --json +mancode adapter upgrade <--all|--platform > --dry-run +mancode adapter upgrade <--all|--platform > --confirm --operation-id --session --client +mancode project upgrade --policy 2 --dry-run +mancode project upgrade --policy 2 --operation-id --session --client mancode list-platforms mancode team identity create --name "" mancode context session new --client +mancode context session show --session --client --json mancode workflow create "" --session mancode workflow list --json mancode workflow show --json @@ -390,6 +407,7 @@ mancode workflow plan confirm --plan-decision --status --expected-revision --session mancode workflow review apply --file --expected-revision --session mancode workflow verify apply --file --expected-revision --session +mancode workflow reframe --expected-revision --checkpoint-id --session mancode workflow complete --expected-revision --session mancode manps [area] mancode refresh-project @@ -404,7 +422,7 @@ mancode version 以下是简化输出示例: ```text -mancode v0.3.18 +mancode v0.4.0 Project: my-app Runtime: ready @@ -537,14 +555,14 @@ mancode/ - `/manps` 默认只扫描;进入整改前应明确确认代码改动。 - force push、schema migration、批量删除等不可逆操作需要明确人工确认。 -## 路线图 +## 仍在推进 + +- 在同一发布候选上完成 Claude Code、Codex、Cursor、GitHub Copilot 和 ZCode 的真实宿主 session 验收。 +- 完成跨真实宿主恢复与双 clone git-ref 人工验收。 +- 确认 ZCode 项目级 skill 发现和 workspace command 路径;完成前继续标记为 provisional。 +- 根据真实需求评估 Windsurf、Cline 和 Roo Code adapter。 -| 阶段 | 重点 | -|---|---| -| MVP-1 | solo 模式、审美扫描、Claude Code hooks | -| MVP-2 | `/manba`、`/man`、`/manteam`、`/manps` 和教练组 subagents | -| MVP-3 | Cursor、Codex(ChatGPT 桌面端/CLI)、GitHub Copilot 适配 | -| 公开发布 | npm 稳定版、marketplace 分发、文档和演示 | +完整发布条件见 [V3 发布验收](./docs/release-acceptance.md)。 ## 故障排查 @@ -557,18 +575,24 @@ mancode/ ### Claude Code hooks 不生效 `mancode init` 后需要重启 Claude Code 以重新加载 `.claude/settings.json`。 -运行 `mancode status` 确认 hooks 已注册。如果仍不生效,运行 -`mancode install claude-code --force` 重写配置。 +运行 `mancode status` 确认 hooks 已注册。V3 adapter 内容异常时,先运行 +`mancode adapter upgrade --platform claude-code --dry-run`,再用该预览返回的 +`--operation-id`、active session 和 `--confirm` 完成修复。legacy hook 架构仍使用 +`mancode init --legacy --force`。 ### `mancode status` 显示某平台 "not ready" -该平台的目标文件缺失。运行 `mancode install --force` 重新生成。 +该平台的目标文件缺失或 digest 不匹配。先运行 +`mancode adapter upgrade --platform --dry-run`,确认 staging 结果后再用 +该预览返回的 `--operation-id` 和 active session 执行 `--confirm`。 对于 Codex、ZCode 和 Copilot,`AGENTS.md` 或 `.github/copilot-instructions.md` 中的受控区可能被手动编辑或删除了。 ### AGENTS.md 或 copilot-instructions.md 受控区被误删 -运行 `mancode install codex --force`(或 `zcode`、`copilot`)重新插入受控区。 +运行 `mancode adapter upgrade --platform codex --dry-run`(或 `zcode`、`copilot`) +检查差异,再用该预览返回的 `--operation-id` 和 active session 执行 `--confirm` +重新插入受控区。 对应 mancode 受控标记外的用户内容会被保留。 ### ZCode skills 未出现 @@ -586,16 +610,8 @@ manps)按 description 触发——输入 `/manba` 等关键词即可激活。 ### 如何重装 Continuity 适配器 ```bash -mancode uninstall claude-code --force -mancode uninstall cursor --force -mancode uninstall codex --force -mancode uninstall copilot --force -mancode uninstall zcode --force -mancode install claude-code -mancode install cursor -mancode install codex -mancode install copilot -mancode install zcode +mancode adapter upgrade --all --dry-run +mancode adapter upgrade --all --confirm --operation-id --session --client ``` Continuity authority 受保护,`mancode uninstall --all` 不会删除工作流权威数据。需要 diff --git a/docs/12-lifecycle.md b/docs/12-lifecycle.md index 9dfde5c..45e7524 100644 --- a/docs/12-lifecycle.md +++ b/docs/12-lifecycle.md @@ -1,237 +1,59 @@ -# 12 - Harness 生命周期 +# Continuity 生命周期 -mancode 的运行时生命周期:跨平台 hook、上下文注入、状态管理与团队检测。 +本文描述默认 V3 路径。旧 `state.json` 生命周期仅用于显式 `--legacy` 兼容。 ---- - -## 1. 生命周期概览 +## 初始化 ```text -用户执行 mancode init - ↓ -Node CLI 检测项目 profile - ↓ -Git 可用 → 读取团队活动 -Git 不可用 → 使用 solo 默认值,不阻止初始化 - ↓ -创建 .mancode/state.json 与平台适配文件 - ↓ -Claude Code 启动 - ↓ -node .mancode/hooks/session-start.mjs - ↓ 注入模式与项目上下文 -用户提交 prompt - ↓ -node .mancode/hooks/user-prompt-submit.mjs - ↓ 注入 solo 六问、自动路由与条件审美 token -Claude 处理请求 +mancode init + → 检查项目与 legacy/V3 物理布局 + → 检测 Project Profile + → 创建 schema.json,状态 initializing + → 写 shared/local/runtime 基础权威 + → 安装所选平台 bootstrap + → 校验 adapter 与 runtime binding + → 最后切换为 v3_active ``` -当前两个 runtime hook 都是 Node `.mjs` 脚本。它们不依赖 Bash、jq、grep、 -sed 或 Git,因此可以从 macOS、Linux、Windows CMD、PowerShell 与 Git Bash -运行。 - ---- - -## 2. Hook 详细说明 - -### 2.1 SessionStart Hook - -**位置**:`.mancode/hooks/session-start.mjs` - -**触发时机**:Claude Code 启动会话并加载项目。 - -**职责**: - -1. 从 hook 文件位置计算项目根目录,不依赖当前 shell 或 Git。 -2. 读取 `.mancode/state.json` 与 `.mancode/project-profile.json`。 -3. 注入当前模式、技术栈、UI 能力和最小改动原则。 -4. 已检测到团队且仍处于 solo 时,提示按需使用 `/manteam`。 -5. 状态不存在或 JSON 无法读取时安全退出,不抛出未处理异常。 - -动态值会移除换行并限制为 200 个字符,避免项目状态污染 prompt 结构。 - -### 2.2 UserPromptSubmit Hook - -**位置**:`.mancode/hooks/user-prompt-submit.mjs` - -**触发时机**:用户提交 prompt 后、Claude 开始处理前。 - -**职责**: - -1. 在 solo 模式下注入六个动手前问题。 -2. 从 stdin 读取 Claude Code 提供的 JSON,并提取原始 prompt。 -3. 识别规划或调研请求,提示路由到 `man` skill。 -4. 只有项目 profile 确认存在 UI 资产且 prompt 涉及 UI 时,才注入审美摘要。 -5. 对颜色、字体、组件和 CSS variable 设置数量与字符上限。 - -Node 直接解析 JSON。不存在 jq fallback,也不会调用任何外部进程。 - -### 2.3 PostToolUse Hook(计划中,尚未实现) - -未来如果实现 PostToolUse,必须继续满足同一跨平台约束: - -- 使用 Node 脚本,不调用 Bash 或 POSIX 管道。 -- 默认 opt-in,只处理本次修改的项目内文本文件。 -- 不格式化整仓,不修改未触达文件。 -- 子进程使用 `execFile` / `spawn` 参数数组,不拼接 shell 字符串。 -- 单次执行设置超时;超时提示但不无限阻塞编辑流程。 -- lint/typecheck 的失败必须保留真实退出状态。 +已有 legacy authority 时,普通初始化会拒绝覆盖。使用 `mancode migrate context --dry-run` 检查,再通过 stage、resolve 和显式 activation 迁移。 ---- +## 会话与任务 -## 3. 团队检测 - -团队检测发生在 CLI 初始化和状态查询阶段,不在 hook 内执行。 - -判定为团队需要同时满足: - -1. Git 历史贡献者超过 1 人。 -2. 存在 GitHub、GitLab 或 Bitbucket remote。 -3. 最近 30 天活跃贡献者超过 1 人。 - -实现通过 Node `execFile('git', args)` 直接调用 Git,并在 Node 中拆分、去重邮箱; -不使用 `/bin/bash`、`sort`、`grep`、重定向或管道。以下情况统一安全降级: - -- Git 未安装或不在 PATH。 -- 项目来自 ZIP,没有 `.git`。 -- Git 历史为空或命令执行失败。 -- 当前目录不是独立仓库根目录。 - -降级结果为 `isTeam: false`、`contributors: 1`、`recentActive: 1`,不会阻止 -`mancode init`。用户仍可通过 `--team` 或 `--no-team` 明确覆盖。 - ---- - -## 4. `.mancode/state.json` - -```json -{ - "version": "0.3.14", - "currentMode": "solo", - "lastMode": "solo", - "platform": "claude-code", - "initializedAt": "2026-07-11T10:30:00.000Z", - "techStack": "JavaScript/TypeScript + React", - "uiLibrary": "Tailwind CSS", - "currentTask": null, - "currentWorkflowMode": null, - "skippedSteps": [], - "activeSoloPlan": null, - "teamModeAutoDetected": false, - "contributors": 1 -} -``` - -| 字段 | 说明 | -|---|---| -| `currentMode` / `lastMode` | 当前和上一次工作流模式 | -| `platform` | 初始化时选择的默认适配器 | -| `techStack` / `uiLibrary` | 从 project profile 得到的摘要 | -| `currentTask` / `currentWorkflowMode` | 当前持久化工作流信息 | -| `skippedSteps` | 用户明确跳过的工作流步骤 | -| `activeSoloPlan` | `/man` 计划交给 solo 后保留的 taskId 与 planVersion;solo 验证完成后由 `workflow handoff --complete` 原子清理 | -| `teamModeAutoDetected` | 自动检测或显式配置后的团队状态 | -| `contributors` | 检测到的贡献者数量;降级时为 1 | - -CLI 负责写入 state;hooks 只读,不在会话启动或 prompt 提交时修改磁盘状态。 - ---- - -## 5. Claude Code 集成 - -### 5.1 settings.json - -```json -{ - "hooks": { - "SessionStart": [ - { - "hooks": [ - { - "type": "command", - "command": "node \".mancode/hooks/session-start.mjs\"" - } - ] - } - ], - "UserPromptSubmit": [ - { - "hooks": [ - { - "type": "command", - "command": "node \".mancode/hooks/user-prompt-submit.mjs\"" - } - ] - } - ] - } -} +```text +宿主或用户创建 session + → workflow create 生成 TaskRef 与四个治理实体 + → context resume 绑定当前 session + → context show 解析一致的 Context Pack + → mutation 使用 expected revision 执行 ``` -命令只使用 `node` 和带引号的相对路径,在 CMD、PowerShell、Git Bash 与 POSIX -shell 中语义一致。 - -### 5.2 旧版本迁移 - -`mancode init --force` 或 `mancode install claude-code --force` 会: - -1. 识别并移除 mancode 生成的旧命令: - `bash .mancode/hooks/session-start.sh` 与 - `bash .mancode/hooks/user-prompt-submit.sh`。 -2. 注册新的 Node hook 命令。 -3. 删除两个旧 `.sh` 文件并生成 `.mjs` 文件。 -4. 保留无法精确识别为 mancode 生成内容的用户 hook。 - -卸载同样同时识别新旧 mancode hook,不会删除无关用户命令。 - ---- +session 是本地便利状态。关闭一个 session 不会关闭任务,也不会影响其他 session。宿主 identity key 只保存不可逆 lookup hash;显式 session 不保存原始宿主 key。 -## 6. `/man` 受管验证门禁 +## 写入与恢复 -新创建的 `/man` 与 `/manteam` workflow 使用 policy v2: +简单单实体 cache 写入可以原子替换。影响任务语义、claim、handoff、迁移或 transport 的写入必须经过 operation journal。 -1. Step 2 把目标、非空范围、排除项、技术决策、默认值、阻塞未知项、七个 coverage 维度和带稳定 ID 的验收标准写入结构化输入。 -2. `workflow requirements finalize --file ` 校验输入,并确定性生成 `requirements.json` 和 `requirements.md`;readiness 由 `blockingUnknowns` 是否为空推导。 -3. Step 6 初始化 `verification-ledger.json`。每个 required 验收项按 `automated`、`manual` 或 `hybrid` 记录证据;自动 passed/failed 包含命令和退出码。 -4. `manual_required` 会把主 workflow 标为 blocked;普通 `workflow update --status in_progress` 不能绕过,必须在取得用户明确确认后通过 `verify ... confirm-manual` 恢复。 -5. 台账绑定 requirements digest、planVersion 与 remediation round。任一发生变化,旧验证自动失效;remediation 后在 Step 9 重新登记全部 required 验收。 -6. 验证未全部通过时,CLI 同时拒绝 Step 7、review 初始化和 completed。完成还要求 `summary.md`。review 只能在 Step 6 通过专用 skip 命令和理由跳过。 +发现 `operation_pending`、reservation、task-head fence 漂移或未完成 git-ref receipt 时: -review policy v2 只允许 `clarification` 和用户明确要求跳过的整个 `review` 出现在 `skippedSteps`。targeted review 的第二领域是不适用,不写入 skippedSteps。旧 policy v1 workflow 保持兼容读取。 +- read-only 命令返回可证明的一致子集和 repair 信息。 +- 普通 mutation 被拒绝。 +- `context doctor`、`operation repair` 或 transport recovery 继续原 operation。 +- 只有尚未产生可见业务写时才允许 abort。 ---- +## 完成与保留 -## 7. 验证矩阵 +完成门禁读取整个 Task Aggregate。requirements、plan、review、verification、子任务、claim 与 repair 状态必须同时满足策略。 -本地测试覆盖: +`mancode context compact` 先列出候选,再删除符合 retention policy 的本地 cache、终态 workflow 产物或 repair journal。active task、milestone、被引用 checkpoint 和未完成 operation 不会被静默删除;shared 删除需要显式确认。 -- Git 存在与 PATH 中没有 Git。 -- 非 Git manifest 项目正常初始化。 -- 团队检测的单人、多人、remote 与近期活跃组合。 -- Node hooks 的上下文输出、自动路由、token cap 与不可信 token 清洗。 -- 旧 Bash hook 设置迁移、新 hook 状态检查与卸载。 +## 团队与跨 clone -Windows CI 会在同一个 `windows-latest` runner 上分别从 CMD、PowerShell 和 Git -Bash 执行 smoke test。测试清空子进程 PATH 来模拟 Git/Bash 不可用,验证 Codex -初始化、solo 降级、Claude Code 初始化和两个 Node hooks 均能完成。它还会让 -PowerShell 以不允许删除的共享模式实际打开 session evidence 文件,再运行一次 -`context session spike`;原子替换必须在句柄释放后自行重试并成功。该 job 名为 -`Windows compatibility gate`;其 `windows-shells` check 已配置为 `main` 的发布必需检查。 +本地 transport 在同一 Git common directory 内共享协调权威。git-ref transport 只在显式 pull/push 后更新,并通过 remote revision 与 ownership fence 做 CAS。 -发布候选还必须在目标项目执行内部发布证据命令。该门禁会拒绝 -未激活或不兼容的 mancode 工作流、未安装的平台 bootstrap、未完成的 repair journal、 -缺失 checkout binding,以及没有绑定当前发布候选的五个平台真实双窗口、子命令传播和子 agent -继承证据的项目。session evidence 文件不保存宿主 session key;`context session spike` 不会从临时 -环境变量自动推断传播结果,只有在每个平台宿主中完成真实 spike 后才能通过。 +业务 Git 内容、分支和 worktree 不由 mancode 自动同步。跨 clone handoff 的接收者必须同时取得对应代码基线。 ---- +## 发布证据 -## 8. 实施状态 +`context session spike` 记录真实宿主的窗口隔离、子命令传播、子 agent 继承和 hook approval,但不保存原始宿主 session key。内部 `context beta` 要求所有证据绑定同一个 immutable release candidate。 -| 阶段 | 内容 | -|---|---| -| MVP-1 | SessionStart、UserPromptSubmit、state.json | -| MVP-2 | 多模式切换;PostToolUse 仍为计划项 | -| MVP-3 | Claude Code、Cursor、Codex、Copilot、ZCode 适配 | -| Windows native | Node hooks、无 shell 团队检测、Git 可选、三 shell smoke | +尚未完成的验收见 [release-acceptance.md](./release-acceptance.md)。 diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..6b31245 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,35 @@ +# mancode 开发文档 + +这里记录当前实现的稳定契约。历史 MVP 计划、一次性审核报告和已完成的网站计划不再保留在仓库中。 + +## 信息来源 + +发生冲突时,按以下优先级判断: + +1. `src/` 中的 schema、CLI 注册和运行时代码。 +2. 对应的自动化测试。 +3. `README.md` 与 `README.en.md` 的公开使用说明。 +4. 本目录中的开发说明。 + +文档不能把计划中的功能写成已支持,也不能用旧测试数量或版本号证明当前状态。 + +## 文档索引 + +| 文档 | 内容 | +|---|---| +| [architecture.md](./architecture.md) | V3 权威模型、目录、Task Aggregate 和一致性 | +| [workflows.md](./workflows.md) | 模式、工作流状态、治理门禁与团队协作 | +| [project-intelligence.md](./project-intelligence.md) | 项目检测、设计资产扫描和 preseason | +| [platform-adapters.md](./platform-adapters.md) | 五个平台的 bootstrap、能力差异与边界 | +| [12-lifecycle.md](./12-lifecycle.md) | 初始化、会话、任务、恢复和迁移生命周期 | +| [engineering.md](./engineering.md) | 开发原则、验证要求和代码地图 | +| [release-acceptance.md](./release-acceptance.md) | 尚未完成的真实宿主与发布验收 | + +法律和许可证边界单独保存在仓库根目录的 `LEGAL.md`。 + +## 维护规则 + +- 新文档优先更新现有专题,不创建新的阶段计划副本。 +- 已完成计划应删除;仍有长期价值的决策应写成当前约束。 +- 仅在真实宿主验证完成后更新平台能力声明。 +- 命令示例必须能在当前 `src/cli.ts` 中找到对应入口。 diff --git a/docs/architecture.md b/docs/architecture.md new file mode 100644 index 0000000..336f986 --- /dev/null +++ b/docs/architecture.md @@ -0,0 +1,74 @@ +# V3 架构 + +mancode Continuity 把跨会话任务状态、治理证据和团队协调放在显式、可校验的本地权威中。平台适配器只负责入口与 bootstrap,不保存任务副本。 + +## 核心模型 + +一个任务由 `TaskRef` 标识: + +```text +local: +shared: +``` + +`local` 任务只属于当前 checkout;`shared` 任务可以参与团队协调。可见性与协作方式是两个维度:`visibility=local|shared`,`coordination=single|team`。 + +任务的稳定视图是 Task Aggregate,由以下实体共同组成: + +- `metadata.json`:生命周期、owner、revision、scope 和治理摘要。 +- `requirements.json`:目标、范围、未知项和验收标准。 +- `review-ledger.json`:审查领域、报告与 blocker。 +- `verification-ledger.json`:自动或人工验证证据。 +- checkpoint、claim、handoff 和 task-head fence:团队协调与恢复状态。 + +Markdown 计划和报告是人类可读产物。完成门禁以结构化实体及其 digest 为准。 + +## 目录与权威 + +```text +.mancode/ +├── schema.json # V3 激活状态和兼容门禁 +├── shared/ +│ ├── config.json # 项目策略与 transport 配置 +│ ├── context/project.json # 可共享项目事实 +│ ├── workflows/ # shared Task Aggregate +│ ├── team/ # actor、claim、handoff、checkpoint +│ └── memory/decisions/ # 明确确认的共享决策 +├── local/ +│ ├── sessions/ # checkout-local 会话 +│ ├── workflows/ # local Task Aggregate +│ ├── cache/ # 可重建扫描与 transport 缓存 +│ └── preseason-* # 本地健康扫描产物 +└── runtime/ # operation journal、reservation、repair +``` + +旧架构的 `state.json`、`config.json`、`project-profile.json`、`workflows/` 和 `memory/` 与 V3 目录物理隔离。普通 `mancode init` 创建 V3;只有显式 `--legacy` 才创建旧布局。 + +## 一致性与恢复 + +所有跨实体业务写入都使用 durable operation: + +1. 写入带预期 revision 的 operation journal。 +2. 获取本地锁并校验 session、Task Aggregate、checkout binding 和 coordination freshness。 +3. 为受影响实体写 reservation 或 `operation_pending` 状态。 +4. 按 operation definition 幂等应用步骤。 +5. 最后发布稳定 metadata,并清理 reservation。 + +进程中断后,普通 writer 不会把新旧实体拼成稳定结果。`mancode context doctor` 和 `mancode operation` 根据 journal 继续 repair;只有能证明没有可见业务写时才允许 abort。 + +## 版本与兼容 + +`schema.json` 支持 manifest version 1 和 2,layout version 固定为 3。0.4.0 新初始化项目直接写入 V2;历史 V1 项目只有完成显式 Policy 2 upgrade 后才写入 V2。激活状态包括 `initializing`、`dual_read`、`activating`、`v3_active` 和 `repair_required`。 + +Reader 和 writer 必须先通过兼容门禁。legacy 迁移采用隔离 stage、显式确认和 journaled activation;不能把当前 Git HEAD 或当前用户伪装成历史事实。 + +## Transport + +默认 `local` transport 在同一 Git common directory 内协调。可选 `git-ref` transport 使用 `refs/mancode/team` 在不同 clone 间显式同步: + +```bash +mancode team sync pull +mancode team sync push shared: --expected-task-revision N --session +``` + +远端不会自动同步业务代码。bundle、ownership fence 和 remote revision 只协调 mancode 权威;调用者仍需自行同步 Git 分支。 diff --git a/docs/engineering.md b/docs/engineering.md new file mode 100644 index 0000000..f808690 --- /dev/null +++ b/docs/engineering.md @@ -0,0 +1,49 @@ +# 工程约定 + +mancode 的实现原则是:外科手术式修改、可验证、可恢复。 + +## 开发规则 + +- 只修改需求涉及的路径,不顺带重构相邻模块。 +- 优先复用现有实现、标准库、平台能力和已安装依赖。 +- schema parser 拒绝未知字段;跨实体写入必须有 revision 和 operation journal。 +- shared 内容先做隐私筛查,再 canonicalize 和计算 digest。 +- adapter 只管理自己的文件或明确标记的托管区。 +- 探测失败应安全降级;业务一致性失败应停止写入并进入 repair。 + +## 代码地图 + +| 目录 | 职责 | +|---|---| +| `src/context/` | schema、Task Aggregate、任务 mutation 和 Context Pack | +| `src/runtime/` | session、锁、operation、reservation、recovery 和 retention | +| `src/team/` | actor、claim、handoff、checkpoint 和 transport | +| `src/installers/` | 平台 bootstrap、managed block 和 capability 检查 | +| `src/commands/` | CLI 解析后的应用服务边界 | +| `src/system/` | 项目检测、扫描和 legacy 辅助功能 | +| `tests/` | contract、crash matrix、E2E 和 adapter 回归 | + +## 验证 + +从最窄验证开始,再按风险扩大: + +```bash +npx vitest run tests/.test.ts +npm run typecheck +npm run lint +npm test +npm run build +npm run test:dist +``` + +发布前运行 `npm run prepublishOnly`。涉及 Windows 原子文件行为时追加 `npm run test:windows-smoke`;涉及网站时运行对应网站测试和浏览器检查。 + +不要把历史测试数量写入长期文档。报告当前命令、退出码和失败原因即可。 + +## 文档与发布 + +- `README.md` 和 `README.en.md` 面向用户并保持功能声明一致。 +- `docs/` 只描述当前契约和未完成验收,不保存已完成实施计划。 +- 新 CLI 入口必须同步 help、测试和公开参考。 +- 平台能力声明必须区分自动化 contract 与真实宿主证据。 +- 发布版本由 `package.json` 与 `src/version.ts` 共同约束。 diff --git a/docs/platform-adapters.md b/docs/platform-adapters.md new file mode 100644 index 0000000..3b27da7 --- /dev/null +++ b/docs/platform-adapters.md @@ -0,0 +1,44 @@ +# 平台适配器 + +平台适配器把相同的 Continuity workflow 暴露给不同宿主。它们安装 bootstrap 和 mode 入口,但任务、session、review 与 verification 只存于 `.mancode/`。 + +## 能力矩阵 + +| 平台 | 入口与文件 | 动态能力 | 当前边界 | +|---|---|---|---| +| Claude Code | `.claude/skills/` | skills;legacy 模式可用 hooks | 默认 V3 不依赖旧 `state.json` hooks | +| Cursor | `.cursor/rules/`、`.cursor/commands/` | rules 与 commands | 无 mancode 原生 session API | +| Codex | `AGENTS.md` 托管区、`.agents/skills/` | `$man*` skills | session 传播需真实宿主证据 | +| GitHub Copilot | instruction 托管区、`.github/prompts/` | instructions 与 prompts | 能力依具体 Copilot 宿主而异 | +| ZCode | `AGENTS.md` 托管区、`.agents/skills/` | provisional `$man*` skills | 项目级发现与命令路径仍需真实 UI 验证 | + +安装示例: + +```bash +mancode init --platform codex,cursor +mancode adapter upgrade --platform copilot --dry-run +mancode adapter upgrade --platform copilot --confirm --operation-id --session --client +mancode status +``` + +manifest 的 `managedAdapters` key 是项目登记的 required 平台集合。greenfield init 只登记所选平台;后续新增或修复平台必须通过带 active session 和显式确认的 adapter upgrade journal。`AGENTS.md` 和 Copilot instruction 文件中托管区外的用户内容必须原样保留。 + +## Bootstrap 合约 + +每个平台都必须: + +- 能发现原来的 `man`、`manba`、`manteam`、`manps` 和 `mansolo` 入口。 +- 在开始任务前解析 V3 schema、session、TaskRef 和 Context Pack。 +- 不保存易过期的 task/session 状态副本。 +- 未证明宿主 session 传播时要求显式 session。 +- 保留用户自写配置,并支持重复安装和安全卸载。 + +## Legacy hooks + +只有 `mancode init --legacy` 安装读取 `.mancode/state.json` 的旧 Claude Code hooks。V3 adapter 不应创建、读取或刷新 legacy authority。 + +Windows 上的脚本与文件替换不能依赖 Bash、jq 或 Unix rename 行为。发布流程包含 CMD、PowerShell 和 Git Bash smoke test。 + +## 发布声明 + +“文件能生成”不等于“宿主已验证”。每个平台的双窗口 session、子命令传播和子 agent 继承必须在同一发布候选上记录,才能通过内部 Beta gate。ZCode 在完成该验证前保持 provisional 描述。 diff --git a/docs/project-intelligence.md b/docs/project-intelligence.md new file mode 100644 index 0000000..18201d2 --- /dev/null +++ b/docs/project-intelligence.md @@ -0,0 +1,50 @@ +# 项目检测与健康扫描 + +mancode 先检测项目事实,再决定可用工作流和验证方式。扫描结果是证据,不是对技术栈的猜测。 + +## Project Profile + +Project Profile 记录: + +- 项目类型:backend、web、mobile、desktop、CLI、library、data、mixed 或 unknown。 +- 语言、framework、manifest 和源码根目录。 +- 可用的 build、lint、test 与平台验证命令。 +- 是否检测到 UI 资产和浏览器自动化能力。 +- high、medium 或 low 置信度。 + +普通 V3 初始化把可共享项目事实写入 `.mancode/shared/context/project.json`。项目结构变化后运行: + +```bash +mancode refresh-project +``` + +检测不到的 framework 不会写入 profile。Git、manifest 或源码目录缺失时,初始化可以安全降级,但不会把 unknown 项目伪装成 Web 项目。 + +## 设计资产扫描 + +只有 profile 确认存在 UI 资产时,mancode 才扫描设计信号。当前实现识别: + +- Tailwind 配置中的顶层颜色、字体和 dark mode。 +- CSS custom properties。 +- 常见组件文件名。 +- 已检测到的 UI library。 + +结果写入 checkout-local cache。`matchLevel=high` 表示存在可复用配置、CSS token 或组件;`low` 只表示依赖提示;`none` 表示没有可靠资产。 + +```bash +mancode refresh-style +``` + +扫描器不解析任意 `theme.json`、Design Tokens Community Group 文件、Figma 或运行时动态主题。Agent 可以人工读取这些资料,但必须标明它们不是自动检测结果。 + +## Preseason + +`mancode manps` 是确定性健康扫描,支持 `all`、`deps`、`security`、`dead-code` 和 `config`。它检查脚本、依赖重叠、TODO、测试、配置、审美、架构和基础安全信号。 + +```bash +mancode manps deps +mancode manps all --json +mancode manps config --remediate +``` + +报告和问题库保存在 `.mancode/local/`。`--remediate` 仍逐项要求决定,只自动执行白名单内的低风险修复。扫描结果不授权批量改代码,也不能代替项目测试或人工安全审查。 diff --git a/docs/release-acceptance.md b/docs/release-acceptance.md new file mode 100644 index 0000000..c7e1cac --- /dev/null +++ b/docs/release-acceptance.md @@ -0,0 +1,48 @@ +# 0.4.0 发布验收 + +自动化 contract 必须覆盖 V3 schema、Policy 2、project upgrade、local reframe、operation recovery、团队协调、git-ref hard reject、五个平台生成结果和 Windows smoke path。以下证据完成前,不得发布 mancode 0.4.0 或执行 `npm publish`。 + +## 发布条件 + +- 在最终发布候选的干净 checkout 运行 `npm ci` 和 `npm run prepublishOnly`。 +- 先运行 `npm pack --dry-run` 检查包内容,再执行实际 `npm pack`,使用生成的 tarball 完成安装和 CLI 启动 smoke test;不使用 npm beta/rc 发布代替该验证。 +- Windows required check 在 CMD、PowerShell 和 Git Bash 上通过。 +- Claude Code、Codex、Cursor、GitHub Copilot 和 ZCode 都完成真实双窗口 session 验证。 +- 每个平台证明子命令传播;支持子 agent 的平台还需证明继承,或记录合法的 `not_applicable` 原因。 +- 完成跨真实宿主 resume、claim、handoff 和恢复路径。 +- 两个独立 clone 完成 git-ref pull、并发 CAS、handoff、receipt recovery 和代码基线交接。 +- legacy fixture 完成 stage、activation、中断恢复和严格条件下的 rollback。 +- 最终执行 `mancode context beta --release-candidate --json` 返回 `ready: true` 和空 blockers。 +- 候选提交已经推送到 `origin/develop`,且本地 `HEAD`、`origin/develop`、全部验收证据和待发布 package version 指向同一提交。 +- 记录验收前后的 `origin/main` commit,并证明它没有变化。禁止 push、merge、rebase 或创建以 `main` 为目标的发布操作。 +- 上述条件全部成功后才允许执行 `npm publish`;npm 发布成功后也不得更新 `main`。 + +## 发布顺序 + +1. 在本地 `develop` 完成唯一 release candidate。 +2. 完成全部自动化、跨平台、恢复和真实宿主验收。 +3. 只执行 `git push origin develop`。 +4. 从远程 `develop` 的同一提交建立干净 checkout,并重跑 `npm ci`、`npm run prepublishOnly`、平台 smoke test、tarball 安装测试和最终 Beta gate。 +5. 所有证据一致且 `origin/main` 未变化后,执行唯一一次正式 `npm publish`。 + +任何测试失败或候选提交变化都会使已有验收失效。修复后必须重新验证;不得先发布 npm 再补证据。 + +## 证据规则 + +所有证据必须绑定同一个 `origin/develop` commit、mancode version、操作系统和宿主版本。历史祖先提交、未推送提交或替代宿主结果只能用于调试,不能用于最终 Beta gate。 + +session evidence 不保存原始 key、token、绝对业务路径或任务正文。屏幕截图和日志应脱敏,并保存在发布流程约定的本地证据目录,而不是长期开发文档中。 + +## 当前未完成项 + +- 五个平台在最终候选上的完整 session spike。 +- Windows CMD、PowerShell 和 Git Bash 的 required smoke check。 +- 跨真实宿主协作与恢复验收。 +- 当前候选上的双 clone git-ref 人工验收。 +- legacy fixture 的 stage、activation、中断恢复和受约束 rollback 验收。 +- ZCode 项目级 skill 发现和 workspace command 路径确认。 +- `origin/develop` 候选提交上的干净 checkout、tarball 安装和 CLI 启动验收。 +- 验收前后 `origin/main` 未变化的记录。 +- 汇总全部证据后的最终 Beta gate。 + +完成一项时更新本文件的未完成列表;不要创建新的平行验收计划。 diff --git a/docs/workflows.md b/docs/workflows.md new file mode 100644 index 0000000..a306912 --- /dev/null +++ b/docs/workflows.md @@ -0,0 +1,92 @@ +# 工作流与团队协作 + +mancode 不把“当前模式”保存成全局开关。平台入口创建或恢复显式 session 与 TaskRef,再读取 Context Pack。 + +## 模式 + +| 模式 | 用途 | 持久任务 | +|---|---|---| +| `solo` | 小改、最窄验证和一次受限 diff 自检 | 否;可执行已确认的 solo handoff | +| `manba` | 复现、根因诊断、最小修复或真实验证 | 是,5 步 | +| `man` | 需求对齐、计划及可选完整治理 | 是,9 步 | +| `manteam` | 带 owner、participant、scope 和 claim 的团队治理 | 是,9 步 | +| `manps` | 确定性项目健康扫描 | 否 | + +平台入口分别表现为 `/man`、`$man` 或 prompt,具体映射见 [platform-adapters.md](./platform-adapters.md)。 + +## `man` 流程 + +1. 调研已有实现、复用点、风险和未知项。 +2. 澄清会改变范围、架构、成本或验收的问题。 +3. 建立带版本的计划。 +4. 用户选择只保留计划、solo handoff、完整治理或修订计划。 +5. 按确认范围实施。 +6. 运行验证并确定 targeted/full 审查范围。 +7. 质量审查。 +8. 仅在 full 深度执行安全与边界审查。 +9. 最多一轮 blocker 修复、复验、summary 和完成。 + +需求未 ready、计划未确认、验证失败、审查 blocker 未清零、存在活动子任务或未完成 repair 时,任务不能完成。 + +## 状态与 revision + +工作流状态为 `in_progress`、`planned`、`blocked`、`completed` 或 `abandoned`。终态不可恢复;`blocked` 只能在阻塞条件被显式处理后回到 `in_progress`。 + +每个写命令都需要当前 `expected-revision`。这是一条 compare-and-swap 约束,不是可选提示。revision、requirements digest 或 plan version 变化后,旧 review 和 verification 可能变为 `stale`。 + +典型路径: + +```bash +mancode context session new --client codex --json +mancode context session show --session --client codex --json +mancode workflow create man "添加导出功能" --session --json +mancode workflow requirements local: finalize \ + --file requirements.json --expected-revision 1 --session +mancode workflow plan local: revise \ + --file plan.md --expected-revision 2 --session +``` + +用 `mancode workflow show --json` 获取最新 revision,不要手工编辑 metadata 或 ledger。 + +## Policy 2 与需求重新对齐 + +项目治理升级是显式操作,不会批量重写已有 workflow: + +```bash +mancode project upgrade --policy 2 --dry-run +mancode project upgrade --policy 2 --operation-id --session --client +``` + +升级后的项目只对新建 `/man` workflow 默认使用 planning Policy 2;历史 workflow 继续使用创建时记录的 policy。 + +当新证据推翻已确认需求时,local workflow 可以从现有 checkpoint 执行原子 reframe: + +```bash +mancode workflow reframe local: \ + --expected-revision N --checkpoint-id --session +``` + +reframe 会归档当前 requirements、plan 和 ledger,释放有效 claim,并把任务带回需求对齐步骤。它只接受 requirements 已确认、且不存在 active child、open handoff 或 active solo assignment 的 local workflow;git-ref transport 明确拒绝该操作。 + +## Session 与 Context Pack + +session 是 checkout-local 的调用身份,不决定任务是否完成。没有真实宿主传播证据时,mutating command 必须显式传 `--session`。 + +`mancode context show` 按 `bootstrap`、`task` 或 `full` 级别生成 Context Pack。它只返回与当前 revision 和 digest 一致的内容;发现未完成 operation 时返回 repair envelope。 + +## 团队协作 + +团队任务使用显式 actor、participant 和 implementation scope: + +```bash +mancode team identity create --name "Alice" +mancode team join --name "Alice" --session +mancode team claim shared: \ + --path 'src/api/**' --expected-task-revision N --session +``` + +claim 声明 path、module、API 或 schema 边界。任务或代码基线漂移后需要 revalidate;lease 过期不自动授权另一个 writer 接管。 + +handoff 必须经过 `draft → offered → accepted|rejected|cancelled`。accept 会在同一个 journaled operation 中更新 owner、claim、checkpoint 和 task head,避免出现两个合法 owner。 + +只有经过明确确认且通过隐私筛查的决策才能进入 shared memory。任务文本、绝对路径、凭据和宿主 session key 不应写入共享 transport。 diff --git a/package-lock.json b/package-lock.json index 61744e8..3ad16a1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "mancode", - "version": "0.3.18", + "version": "0.4.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "mancode", - "version": "0.3.18", + "version": "0.4.0", "license": "AGPL-3.0-only", "dependencies": { "commander": "^12.1.0", diff --git a/package.json b/package.json index b2e9989..1501e57 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "mancode", - "version": "0.3.18", + "version": "0.4.0", "description": "AI coding agent workflow harness with mancode Continuity for cross-conversation tasks, decisions, verification, and team coordination.", "type": "module", "license": "AGPL-3.0-only", diff --git a/src/cli.ts b/src/cli.ts index 2f1e0e2..4784c3c 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -1,5 +1,6 @@ #!/usr/bin/env node import { Option, program } from 'commander'; +import { adapterStatus, adapterUpgrade } from './commands/adapter.js'; import { contextBeta, contextClose, @@ -10,6 +11,7 @@ import { contextReconcileTaskHead, contextResume, contextSessionNew, + contextSessionShow, contextSessionSpike, contextShow, contextWorktreeRegister, @@ -24,6 +26,7 @@ import { operationRepair, operationShow, } from './commands/operation.js'; +import { projectUpgrade } from './commands/project.js'; import { refreshProject } from './commands/refresh-project.js'; import { refreshStyle } from './commands/refresh-style.js'; import { status } from './commands/status.js'; @@ -99,6 +102,10 @@ program '--shadow', 'Stage a mancode bootstrap candidate without changing live files', ) + .option('--confirm', 'Confirm a journaled adapter install or repair') + .option('--operation-id ', 'Operation ID returned by adapter dry-run') + .option('--session ', 'mancode session ID (otherwise MANCODE_SESSION_ID)') + .option('--client ', 'Client identity (default: mancode-cli)') .action(async (platform, options) => { const code = await install( process.cwd(), @@ -108,6 +115,34 @@ program process.exitCode = code; }); +const adapterProgram = program + .command('adapter') + .description('Inspect and explicitly upgrade managed platform adapters'); + +adapterProgram + .command('status') + .description('Inspect managed adapter content on disk') + .option('--platform ', 'Inspect one platform adapter') + .option('--json', 'Output as JSON (for scripts)') + .action(async (options) => { + process.exitCode = await adapterStatus(process.cwd(), options); + }); + +adapterProgram + .command('upgrade') + .description('Preview or repair managed adapter content') + .option('--all', 'Upgrade all platform adapters') + .option('--platform ', 'Upgrade one platform adapter') + .option('--dry-run', 'Stage and report changes without writing live targets') + .option('--confirm', 'Confirm the journaled adapter upgrade') + .option('--operation-id ', 'Operation ID returned by adapter dry-run') + .option('--session ', 'mancode session ID (otherwise MANCODE_SESSION_ID)') + .option('--client ', 'Client identity (default: mancode-cli)') + .option('--json', 'Output as JSON (for scripts)') + .action(async (options) => { + process.exitCode = await adapterUpgrade(process.cwd(), options); + }); + program .command('status') .description('Show current mancode project status') @@ -118,6 +153,23 @@ program process.exitCode = code; }); +const projectProgram = program + .command('project') + .description('Manage project-level mancode policy and compatibility'); + +projectProgram + .command('upgrade') + .description('Upgrade project governance policy explicitly') + .requiredOption('--policy ', 'Target planning policy version (2)') + .option('--dry-run', 'Preview the upgrade without writing') + .option('--operation-id ', 'Operation ID returned by project dry-run') + .option('--session ', 'Session ID (otherwise MANCODE_SESSION_ID)') + .option('--client ', 'Client identity (default: mancode-cli)') + .option('--json', 'Output as JSON (for scripts)') + .action(async (options) => { + process.exitCode = await projectUpgrade(process.cwd(), options); + }); + program .command('list-platforms') .description('List available and installed mancode platform adapters') @@ -159,6 +211,7 @@ program .option('--session ', 'mancode session ID (otherwise MANCODE_SESSION_ID)') .option('--client ', 'Client identity (default: mancode-cli)') .option('--expected-revision ', 'Expected task revision for mutations') + .option('--checkpoint-id ', 'Checkpoint ID for a requirements reframe') .option('--child-revision ', 'Expected child task revision for merge') .option('--summary ', 'Privacy-screened child result summary') .option('--next-action ', 'Next parent action after a child merge') @@ -250,6 +303,16 @@ contextSessionProgram process.exitCode = await contextSessionNew(process.cwd(), options); }); +contextSessionProgram + .command('show') + .description('Show one explicit session without changing it') + .requiredOption('--session ', 'Session ID') + .option('--client ', 'Expected client identity') + .option('--json', 'Output as JSON (for scripts)') + .action(async (options) => { + process.exitCode = await contextSessionShow(process.cwd(), options); + }); + contextSessionProgram .command('spike') .description('Record real-host session evidence without persisting host keys') diff --git a/src/commands/adapter.ts b/src/commands/adapter.ts new file mode 100644 index 0000000..b200f6e --- /dev/null +++ b/src/commands/adapter.ts @@ -0,0 +1,128 @@ +import { assertUlid } from '../context/ids.js'; +import { V3ContextStore } from '../context/store.js'; +import { upgradeV3Adapters } from '../installers/adapter-upgrade.js'; +import { + type PlatformName, + getPlatformInstaller, +} from '../installers/registry.js'; +import { + V3_ADAPTER_PLATFORMS, + inspectV3Adapter, +} from '../installers/v3-adapter.js'; +import { + printV3Error, + printV3Result, + readV3CommandProject, + resolveV3CommandSession, + v3ErrorCode, +} from './v3-support.js'; + +export interface AdapterStatusOptions { + platform?: string; + json?: boolean; +} + +export interface AdapterUpgradeOptions extends AdapterStatusOptions { + all?: boolean; + dryRun?: boolean; + confirm?: boolean; + operationId?: string; + session?: string; + client?: string; +} + +export async function adapterStatus( + rootDir: string, + options: AdapterStatusOptions, +): Promise { + try { + const platforms = selectStatusPlatforms(options.platform); + const project = await new V3ContextStore(rootDir).readProjectSnapshot(); + const entries = await Promise.all( + platforms.map( + async (platform) => + [platform, await inspectV3Adapter(rootDir, platform)] as const, + ), + ); + const adapters = Object.fromEntries(entries); + return printV3Result(options.json, { + schemaVersion: 1, + renderer: 'mancode-adapter-digest-v1', + ready: entries.every(([, status]) => status.ready), + manifestAdapters: Object.fromEntries( + platforms.map((platform) => [ + platform, + project.manifest.managedAdapters[platform], + ]), + ), + adapters, + }); + } catch (error) { + return printV3Error( + options.json, + v3ErrorCode(error, 'MANCODE_ADAPTER_STATUS_FAILED'), + error instanceof Error ? error.message : 'Unable to inspect adapters.', + ); + } +} + +export async function adapterUpgrade( + rootDir: string, + options: AdapterUpgradeOptions, +): Promise { + try { + const platforms = selectUpgradePlatforms(options); + if (options.operationId !== undefined) { + assertUlid(options.operationId, 'adapter upgrade operationId'); + } + let sessionId: string | undefined; + if (options.dryRun !== true && options.confirm === true) { + const project = await readV3CommandProject(rootDir); + sessionId = ( + await resolveV3CommandSession(project, { + session: options.session, + client: options.client, + }) + ).sessionId; + } + const result = await upgradeV3Adapters({ + projectRoot: rootDir, + platforms, + dryRun: options.dryRun, + explicitConfirmation: options.confirm, + ...(options.operationId === undefined + ? {} + : { operationId: options.operationId }), + ...(sessionId === undefined ? {} : { sessionId }), + }); + return printV3Result(options.json, result); + } catch (error) { + return printV3Error( + options.json, + v3ErrorCode(error, 'MANCODE_ADAPTER_UPGRADE_FAILED'), + error instanceof Error ? error.message : 'Unable to upgrade adapters.', + ); + } +} + +function selectStatusPlatforms(platform: string | undefined): PlatformName[] { + if (platform === undefined) return [...V3_ADAPTER_PLATFORMS]; + const installer = getPlatformInstaller(platform); + if (installer === null) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PLATFORM_INVALID'); + } + return [installer.name]; +} + +function selectUpgradePlatforms( + options: AdapterUpgradeOptions, +): PlatformName[] { + if ((options.all === true) === (options.platform !== undefined)) { + throw new Error( + 'MANCODE_ADAPTER_UPGRADE_SELECTION_REQUIRED: choose exactly one of --all or --platform.', + ); + } + return options.all === true + ? [...V3_ADAPTER_PLATFORMS] + : selectStatusPlatforms(options.platform); +} diff --git a/src/commands/context.ts b/src/commands/context.ts index 9d64da9..3fd46ae 100644 --- a/src/commands/context.ts +++ b/src/commands/context.ts @@ -1,4 +1,7 @@ +import { CURRENT_WRITER_CAPABILITIES } from '../context/compatibility.js'; import type { ContextLevel, ContextPurpose } from '../context/context-pack.js'; +import { isUlid } from '../context/ids.js'; +import { managedAdapterNames } from '../context/manifest.js'; import { previewV3TaskPromotion, promoteV3Task, @@ -10,6 +13,7 @@ import { reconcileV3TaskHead, } from '../context/task-head-reconcile.js'; import { parseTaskRef } from '../context/task-ref.js'; +import { inspectV3AdapterVersions } from '../installers/v3-adapter.js'; import { evaluateV3BetaGate } from '../runtime/beta-gate.js'; import { readLocalDiagnostics, @@ -52,6 +56,7 @@ import { type SessionStateV1, closeSession, createBootstrapSession, + readSession, resumeSession, } from '../runtime/session.js'; import { readLocalActor } from '../team/actor.js'; @@ -82,6 +87,12 @@ export interface ContextSessionNewOptions { json?: boolean; } +export interface ContextSessionShowOptions { + session?: string; + client?: string; + json?: boolean; +} + export interface ContextSessionSpikeOptions { platform?: string; hostSessionSource?: string; @@ -180,6 +191,49 @@ export async function contextSessionNew( } } +/** Implements `mancode context session show --session ...`. */ +export async function contextSessionShow( + rootDir: string, + options: ContextSessionShowOptions, +): Promise { + if (options.session === undefined) { + return printV3Error( + options.json, + 'MANCODE_SESSION_REQUIRED', + 'context session show requires --session .', + EXIT_V3_INVALID_ARGUMENT, + ); + } + if (!isUlid(options.session)) { + return printV3Error( + options.json, + 'MANCODE_SESSION_INVALID', + 'context session show requires a canonical ULID in --session .', + EXIT_V3_INVALID_ARGUMENT, + ); + } + try { + const project = await readV3CommandProject(rootDir); + const session = await readSession(project.projectRoot, options.session); + if (session === null) { + throw new Error('MANCODE_SESSION_NOT_FOUND'); + } + if ( + options.client !== undefined && + session.client !== commandClient(options.client) + ) { + throw new Error('MANCODE_SESSION_NOT_FOUND'); + } + return printV3Result(options.json, { schemaVersion: 1, session }); + } catch (error) { + return printV3Error( + options.json, + v3ErrorCode(error, 'MANCODE_CONTEXT_SESSION_SHOW_FAILED'), + error instanceof Error ? error.message : 'Unable to show the session.', + ); + } +} + /** * Records one real-host session spike without accepting or persisting host * keys as command-line arguments. Operators supply the two window values via @@ -824,6 +878,10 @@ async function resolveContext( ), ) : undefined; + const adapterVersions = await inspectV3AdapterVersions( + project.projectRoot, + managedAdapterNames(project.project.manifest.managedAdapters), + ); return resolver.resolve({ session, taskRef: request.taskRef, @@ -834,7 +892,8 @@ async function resolveContext( expectedSchemaEpoch: project.project.manifest.epoch, readerVersion: VERSION, writerVersion: VERSION, - adapterVersions: project.project.manifest.managedAdapters, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, + adapterVersions, }, codeHead: await readCheckoutCodeHead(project.projectRoot), ...(capabilities === undefined ? {} : { capabilities }), diff --git a/src/commands/init.ts b/src/commands/init.ts index e609552..9fe6785 100644 --- a/src/commands/init.ts +++ b/src/commands/init.ts @@ -15,8 +15,9 @@ import { getPlatformInstallers, } from '../installers/registry.js'; import { + V3_ADAPTER_VERSION, assertV3AdapterInstallable, - installV3Adapter, + inspectV3Adapter, } from '../installers/v3-adapter.js'; import { detectTeamStatus } from '../system/detect-team.js'; import { detectSystemDeps } from '../system/detect.js'; @@ -39,7 +40,7 @@ import { VERSION } from '../version.js'; import { initializeV3Project } from './v3-init.js'; /** - * 退出码契约 — 见 docs/08-cli-spec.md §2.5 + * 退出码契约见 docs/workflows.md。 */ export const EXIT_OK = 0; export const EXIT_ALREADY_INITIALIZED = 1; @@ -123,7 +124,7 @@ export function resolveInitAuthority(options: InitOptions): 'legacy' | 'v3' { /** * `mancode init` 命令(完整版)。 * - * 职责(docs/08-cli-spec.md §2.1-2.4): + * 职责见 docs/12-lifecycle.md: * 1. 检测可选系统依赖(git) * 2. 检测中立 project profile(类型、语言、框架与验证能力) * 3. 创建 8 个文件/目录(.mancode/ + .claude/) @@ -698,6 +699,7 @@ async function initializeV3( } const schemaPath = path.join(rootDir, '.mancode', 'schema.json'); let existingV3 = false; + let registeredAdapters = new Set(); if (await pathExists(schemaPath)) { try { const manifest = parseSchemaManifest( @@ -709,6 +711,9 @@ async function initializeV3( ); } existingV3 = true; + registeredAdapters = new Set( + Object.keys(manifest.managedAdapters) as PlatformName[], + ); if (options.platform === undefined) { console.log('ℹ️ mancode is already initialized.'); return EXIT_ALREADY_INITIALIZED; @@ -744,29 +749,39 @@ async function initializeV3( return EXIT_INIT_FAILED; } try { + if ( + existingV3 && + selectedPlatforms.some((platform) => !registeredAdapters.has(platform)) + ) { + throw new Error( + 'MANCODE_ADAPTER_REGISTRATION_REQUIRED: run `mancode adapter upgrade --platform --dry-run`, then confirm that operation with an active session.', + ); + } for (const platform of selectedPlatforms) { await assertV3AdapterInstallable(rootDir, platform); } if (existingV3) { - for (const platform of selectedPlatforms) { - await installV3Adapter(rootDir, platform); - } - console.log('ℹ️ mancode is already initialized.'); - if (selectedPlatforms.length > 0) { - console.log( - ` mancode bootstrap repaired: ${selectedPlatforms.join(', ')}`, + const statuses = await Promise.all( + selectedPlatforms.map((platform) => + inspectV3Adapter(rootDir, platform), + ), + ); + if (statuses.some((status) => !status.ready)) { + throw new Error( + 'MANCODE_ADAPTER_REPAIR_REQUIRED: run `mancode adapter status --json`, then preview and confirm the required platform upgrade with an active session.', ); } + console.log('ℹ️ mancode is already initialized.'); return EXIT_ALREADY_INITIALIZED; } const result = await initializeV3Project({ projectRoot: rootDir, + managedAdapters: Object.fromEntries( + selectedPlatforms.map((platform) => [platform, V3_ADAPTER_VERSION]), + ), teamPolicy: options.team === undefined ? 'auto' : options.team ? 'on' : 'off', }); - for (const platform of selectedPlatforms) { - await installV3Adapter(rootDir, platform); - } console.log('✓ Initialized mancode project.'); console.log(` workspace: ${result.runtime.workspaceId}`); console.log(` operation: ${result.journal.operationId}`); @@ -777,7 +792,7 @@ async function initializeV3( } if (selectedPlatforms.length === 0) { console.log( - ' No platform bootstrap selected. Run `mancode install `.', + ' No platform bootstrap selected. Run `mancode adapter upgrade --platform --dry-run`, then confirm that operation with an active session.', ); } else { console.log(` mancode bootstrap: ${selectedPlatforms.join(', ')}`); diff --git a/src/commands/install.ts b/src/commands/install.ts index 01641bb..7278433 100644 --- a/src/commands/install.ts +++ b/src/commands/install.ts @@ -1,22 +1,25 @@ import { promises as fs } from 'node:fs'; import path from 'node:path'; import process from 'node:process'; +import { assertUlid } from '../context/ids.js'; import { V3ContextStore } from '../context/store.js'; +import { upgradeV3Adapters } from '../installers/adapter-upgrade.js'; import { checkPlatformStatus } from '../installers/platform-status.js'; import { formatPlatformName, getPlatformInstaller, getPlatformInstallers, } from '../installers/registry.js'; -import { installV3Adapter, stageV3Adapter } from '../installers/v3-adapter.js'; +import { stageV3Adapter } from '../installers/v3-adapter.js'; import { detectProjectProfile, primaryUiLibrary, } from '../system/project-profile.js'; import { DEFAULT_CONFIG } from '../templates/defaults.js'; +import { readV3CommandProject, resolveV3CommandSession } from './v3-support.js'; /** - * 退出码契约 — 见 docs/08-cli-spec.md §3 + * 退出码契约见 docs/workflows.md。 */ export const EXIT_OK = 0; export const EXIT_NOT_INITIALIZED = 1; @@ -35,12 +38,17 @@ export interface InstallOptions { minimal?: boolean; /** Render a V3 adapter candidate under staging without changing live files. */ shadow?: boolean; + /** Confirm a journaled V3 adapter install or repair. */ + confirm?: boolean; + operationId?: string; + session?: string; + client?: string; } /** * `mancode install ` 命令。 * - * 职责(docs/08-cli-spec.md §3 + docs/15-adapters.md §8): + * 职责见 docs/workflows.md 和 docs/platform-adapters.md: * 1. 检查项目已初始化(state.json 存在) * 2. 验证平台名 * 3. 调用对应适配器安装 @@ -205,11 +213,35 @@ async function installV3( 'ℹ️ mancode adapters are already bootstrap-only; --minimal has no additional effect.', ); } - const installed = await installV3Adapter(rootDir, installer.name); + let sessionId: string | undefined; + if (options.operationId !== undefined) { + assertUlid(options.operationId, 'adapter install operationId'); + } + if (options.confirm === true) { + const commandProject = await readV3CommandProject(rootDir); + sessionId = ( + await resolveV3CommandSession(commandProject, { + session: options.session, + client: options.client, + }) + ).sessionId; + } + const installed = await upgradeV3Adapters({ + projectRoot: rootDir, + platforms: [installer.name], + explicitConfirmation: options.confirm, + ...(options.operationId === undefined + ? {} + : { operationId: options.operationId }), + ...(sessionId === undefined ? {} : { sessionId }), + }); console.log( - `✓ ${formatPlatformName(platform)} mancode bootstrap installed.`, + installed.state === 'already_ready' + ? `ℹ️ ${formatPlatformName(platform)} mancode bootstrap is already ready.` + : `✓ ${formatPlatformName(platform)} mancode bootstrap installed.`, ); - console.log(` ${installed.target}`); + for (const target of installed.filePlans) + console.log(` ${target.target}`); return EXIT_OK; } catch (err) { const message = err instanceof Error ? err.message : String(err); diff --git a/src/commands/project.ts b/src/commands/project.ts new file mode 100644 index 0000000..1ee0c5f --- /dev/null +++ b/src/commands/project.ts @@ -0,0 +1,72 @@ +import { assertUlid } from '../context/ids.js'; +import { + dryRunProjectPolicyUpgrade, + upgradeProjectPolicy, +} from '../context/project-policy-upgrade.js'; +import { + EXIT_V3_INVALID_ARGUMENT, + printV3Error, + printV3Result, + readV3CommandProject, + resolveV3CommandSession, + v3ErrorCode, +} from './v3-support.js'; + +export interface ProjectUpgradeOptions { + policy?: string; + dryRun?: boolean; + session?: string; + client?: string; + operationId?: string; + json?: boolean; +} + +export async function projectUpgrade( + rootDir: string, + options: ProjectUpgradeOptions, +): Promise { + if (options.policy !== '2') { + return printV3Error( + options.json, + 'MANCODE_POLICY_VERSION_UNSUPPORTED', + 'project upgrade currently supports only --policy 2.', + EXIT_V3_INVALID_ARGUMENT, + ); + } + try { + if (options.operationId !== undefined) { + assertUlid(options.operationId, 'project upgrade operationId'); + } + if (options.dryRun === true) { + return printV3Result( + options.json, + await dryRunProjectPolicyUpgrade({ + projectRoot: rootDir, + policyVersion: 2, + ...(options.operationId === undefined + ? {} + : { operationId: options.operationId }), + }), + ); + } + const project = await readV3CommandProject(rootDir); + const session = await resolveV3CommandSession(project, options); + return printV3Result( + options.json, + await upgradeProjectPolicy({ + projectRoot: project.projectRoot, + policyVersion: 2, + sessionId: session.sessionId, + ...(options.operationId === undefined + ? {} + : { operationId: options.operationId }), + }), + ); + } catch (error) { + return printV3Error( + options.json, + v3ErrorCode(error, 'MANCODE_PROJECT_UPGRADE_FAILED'), + error instanceof Error ? error.message : 'Project upgrade failed.', + ); + } +} diff --git a/src/commands/refresh-style.ts b/src/commands/refresh-style.ts index 1c3636d..d2b525a 100644 --- a/src/commands/refresh-style.ts +++ b/src/commands/refresh-style.ts @@ -13,7 +13,7 @@ import { import { scanAesthetics } from '../system/scan-aesthetics.js'; /** - * 退出码契约 — 见 docs/08-cli-spec.md §7 + * 退出码契约见 docs/workflows.md。 */ export const EXIT_OK = 0; export const EXIT_NOT_INITIALIZED = 1; @@ -22,13 +22,13 @@ export const EXIT_V3_REFRESH_FAILED = 2; /** * `mancode refresh-style` 命令。 * - * 职责(docs/08-cli-spec.md §7 + docs/06-aesthetics.md §9.2): + * 职责见 docs/project-intelligence.md: * 1. 检查项目已初始化 * 2. 重新扫描项目审美 token * 3. 覆盖 .mancode/aesthetics/style-tokens.json * 4. 输出扫描结果摘要 * - * 触发场景(docs/06-aesthetics.md §9.2): + * 触发场景见 docs/project-intelligence.md: * - 用户改了 tailwind.config.js * - 用户改了 package.json dependencies * - 用户手动执行 diff --git a/src/commands/status.ts b/src/commands/status.ts index 499a0bb..60939a2 100644 --- a/src/commands/status.ts +++ b/src/commands/status.ts @@ -2,9 +2,13 @@ import { spawn } from 'node:child_process'; import { promises as fs } from 'node:fs'; import path from 'node:path'; import process from 'node:process'; -import { evaluateCompatibilityGate } from '../context/compatibility.js'; +import { + CURRENT_WRITER_CAPABILITIES, + evaluateCompatibilityGate, +} from '../context/compatibility.js'; import { assertUlid } from '../context/ids.js'; import { scanLegacyAuthority } from '../context/layout.js'; +import { managedAdapterNames } from '../context/manifest.js'; import { V3ContextStore } from '../context/store.js'; import { type PlatformStatus, @@ -18,7 +22,9 @@ import { import { type V3PlatformAdapterStatus, inspectV3Adapter, + inspectV3AdapterVersions, } from '../installers/v3-adapter.js'; +import { listUnfinishedOperationRecoveries } from '../runtime/operation-recovery-executor.js'; import { listPlatformSessionSpikes } from '../runtime/platform-spike-store.js'; import { type SessionSpikePlatform, @@ -51,7 +57,7 @@ import { VERSION } from '../version.js'; const HOOK_ESTIMATE_TIMEOUT_MS = 2000; /** - * 退出码契约 — 见 docs/08-cli-spec.md §4 + * 退出码契约见 docs/workflows.md。 */ export const EXIT_OK = 0; export const EXIT_NOT_INITIALIZED = 1; @@ -141,7 +147,7 @@ export interface V3StatusResult { state: string; epoch: string; activatedAt: string | null; - managedAdapters: Record; + managedAdapters: Partial>; }; compatibility: { readAllowed: boolean; @@ -201,6 +207,11 @@ export interface V3StatusResult { explicitRequiredPlatforms: SessionSpikePlatform[]; }; adapters: Record; + unfinishedOperations: Array<{ + operationId: string; + type: string; + state: string; + }>; legacyAuthorityPresent: boolean; } @@ -233,7 +244,7 @@ interface StatusConfig { /** * `mancode status` 命令。 * - * 职责(docs/08-cli-spec.md §4 + progress.md Step 3): + * 职责见 docs/workflows.md: * 1. 读取 .mancode/state.json(未初始化则报错退出) * 2. 显示项目状态(mode/platform/techStack/uiLibrary) * 3. 显示初始化时间 @@ -333,8 +344,29 @@ async function statusV3( ): Promise { try { const store = new V3ContextStore(rootDir); + const snapshot = await store.readProjectSnapshot(); + let runtime: V3StatusResult['runtime']; + try { + const context = await readProjectRuntimeContext(rootDir); + runtime = { + binding: 'ready', + workspaceId: context.workspaceId, + checkoutId: context.checkoutId, + repositoryBindingId: context.repositoryBindingId, + gitCommonDir: context.gitCommonDir, + error: null, + }; + } catch (error) { + runtime = { + binding: 'registration_required', + workspaceId: snapshot.config.workspaceId, + checkoutId: null, + repositoryBindingId: null, + gitCommonDir: null, + error: error instanceof Error ? error.message : String(error), + }; + } const [ - snapshot, project, legacy, actor, @@ -342,8 +374,9 @@ async function statusV3( sessionSpikes, assessmentSignals, currentSession, + adapterVersions, + unfinishedOperations, ] = await Promise.all([ - store.readProjectSnapshot(), getProjectName(rootDir), scanLegacyAuthority(rootDir), readLocalActor(rootDir).catch(() => null), @@ -358,13 +391,21 @@ async function statusV3( listPlatformSessionSpikes(rootDir), detectTeamAssessmentSignals(rootDir), readV3StatusSession(rootDir), + inspectV3AdapterVersions( + rootDir, + managedAdapterNames(snapshot.manifest.managedAdapters), + ), + runtime.binding === 'ready' + ? listUnfinishedOperationRecoveries(rootDir) + : Promise.resolve([]), ]); const compatibility = evaluateCompatibilityGate({ manifest: snapshot.manifest, expectedSchemaEpoch: snapshot.manifest.epoch, readerVersion: VERSION, writerVersion: VERSION, - adapterVersions: snapshot.manifest.managedAdapters, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, + adapterVersions, currentLegacyBaseline: legacy.baseline, legacyAuthorityPresent: legacy.authorityPresent, operation: 'read', @@ -392,27 +433,6 @@ async function statusV3( revision: task.metadata.revision, })) .catch(() => null); - let runtime: V3StatusResult['runtime']; - try { - const context = await readProjectRuntimeContext(rootDir); - runtime = { - binding: 'ready', - workspaceId: context.workspaceId, - checkoutId: context.checkoutId, - repositoryBindingId: context.repositoryBindingId, - gitCommonDir: context.gitCommonDir, - error: null, - }; - } catch (error) { - runtime = { - binding: 'registration_required', - workspaceId: snapshot.config.workspaceId, - checkoutId: null, - repositoryBindingId: null, - gitCommonDir: null, - error: error instanceof Error ? error.message : String(error), - }; - } const result: V3StatusResult = { schemaVersion: 1, authority: 'v3', @@ -465,6 +485,11 @@ async function statusV3( currentTask, sessionEvidence: platformSpikeFreezeStatus(sessionSpikes), adapters, + unfinishedOperations: unfinishedOperations.map((operation) => ({ + operationId: operation.journal.operationId, + type: operation.journal.type, + state: operation.journal.state, + })), legacyAuthorityPresent: legacy.authorityPresent, }; const output = options.brief ? toContinuityStatus(result) : result; @@ -488,12 +513,16 @@ function toContinuityStatus(result: V3StatusResult): ContinuityStatusResult { const blockers = [ ...result.compatibility.failures, ...(result.runtime.error === null ? [] : [result.runtime.error]), + ...(result.unfinishedOperations.length === 0 + ? [] + : ['MANCODE_OPERATION_REPAIR_REQUIRED']), ]; const ready = result.activation.state === 'v3_active' && result.compatibility.readAllowed && result.compatibility.writeAllowed && - result.runtime.binding === 'ready'; + result.runtime.binding === 'ready' && + result.unfinishedOperations.length === 0; return { schemaVersion: 1, runtime: 'mancode-continuity', @@ -805,7 +834,7 @@ function runHookEstimate(rootDir: string, hookPath: string): Promise { } /** - * 文本格式输出(默认),字段命名对齐 docs/08-cli-spec.md §4.3。 + * 文本格式输出(默认),字段命名对齐 docs/workflows.md。 */ function printText(r: StatusResult): void { const publicMode = r.mode === 'mamba' ? 'manba' : r.mode; @@ -931,6 +960,11 @@ function printV3Text(result: V3StatusResult): void { if (result.compatibility.failures.length > 0) { console.log(`Compatibility: ${result.compatibility.failures.join(', ')}`); } + if (result.unfinishedOperations.length > 0) { + console.log( + `Recovery: required (${result.unfinishedOperations.map((operation) => operation.operationId).join(', ')})`, + ); + } if (result.legacyAuthorityPresent) { console.log( 'Legacy: legacy authority detected; mancode writes may be blocked.', diff --git a/src/commands/v3-init.ts b/src/commands/v3-init.ts index c9be17a..de18fc2 100644 --- a/src/commands/v3-init.ts +++ b/src/commands/v3-init.ts @@ -3,9 +3,8 @@ import { initializeGreenfield, } from '../context/greenfield-init.js'; import { type Ulid, createUlid } from '../context/ids.js'; -import type { ManagedAdapter } from '../context/manifest.js'; +import type { ManagedAdapterInventory } from '../context/manifest.js'; import { createProjectFacts } from '../context/project-facts.js'; -import { V3_ADAPTER_VERSION } from '../installers/v3-adapter.js'; import { type ProjectRuntimeContext, ensureProjectRuntimeContext, @@ -23,7 +22,7 @@ export interface InitializeV3ProjectInput { operationId?: Ulid; workspaceId?: Ulid; schemaEpoch?: Ulid; - managedAdapters?: Record; + managedAdapters?: ManagedAdapterInventory; /** Explicit init preference; omitted keeps V3's evidence-based auto mode. */ teamPolicy?: TeamRecommendationPolicy; now?: Date; @@ -84,7 +83,7 @@ export async function initializeV3Project( schemaEpoch, minReaderVersion: VERSION, minWriterVersion: VERSION, - managedAdapters: input.managedAdapters ?? defaultManagedAdapters(), + managedAdapters: input.managedAdapters ?? {}, projectConfig, teamPolicy, projectFacts, @@ -102,13 +101,3 @@ export async function initializeV3Project( } return { journal, runtime }; } - -function defaultManagedAdapters(): Record { - return { - 'claude-code': V3_ADAPTER_VERSION, - codex: V3_ADAPTER_VERSION, - cursor: V3_ADAPTER_VERSION, - copilot: V3_ADAPTER_VERSION, - zcode: V3_ADAPTER_VERSION, - }; -} diff --git a/src/commands/version.ts b/src/commands/version.ts index 9873949..66856d1 100644 --- a/src/commands/version.ts +++ b/src/commands/version.ts @@ -4,7 +4,7 @@ import { VERSION } from '../version.js'; /** * `mancode version` 命令。 * - * 输出格式(docs/08-cli-spec.md §5.3): + * 输出格式见 docs/workflows.md: * ``` * mancode/0.1.0 * node/20.10.0 diff --git a/src/commands/workflow.ts b/src/commands/workflow.ts index cc8c133..ebb5e1d 100644 --- a/src/commands/workflow.ts +++ b/src/commands/workflow.ts @@ -8,6 +8,7 @@ import { previewV3TaskPromotion, promoteV3Task, } from '../context/publish-promote.js'; +import { reframeV3Workflow } from '../context/reframe.js'; import { finalizeV3Requirements } from '../context/requirements-finalize.js'; import { applyV3ReviewLedger } from '../context/review-remediation.js'; import { changeV3WorkflowScope } from '../context/scope-change.js'; @@ -129,6 +130,7 @@ export interface WorkflowOptions { exitCode?: string; evidenceFile?: string; reason?: string; + checkpointId?: string; } interface WorkflowView extends WorkflowMeta { @@ -250,6 +252,9 @@ async function workflowV3( if (subcommand === 'scope') { return workflowScopeChangeV3(rootDir, args, options); } + if (subcommand === 'reframe') { + return workflowReframeV3(rootDir, args, options); + } if (subcommand === 'child') { return workflowChildResultMergeV3(rootDir, args, options); } @@ -846,6 +851,75 @@ async function workflowScopeChangeV3( } } +async function workflowReframeV3( + rootDir: string, + args: string[], + options: WorkflowOptions, +): Promise { + const task = args[0]; + if (!task || args.length !== 1) { + return printV3Error( + options.json, + 'MANCODE_REFRAME_ARGUMENT_INVALID', + 'Use: workflow reframe --expected-revision --checkpoint-id .', + EXIT_INVALID_ARG, + ); + } + const expectedTaskRevision = parseExpectedTaskRevision(options); + if (expectedTaskRevision === null) { + return printV3Error( + options.json, + 'MANCODE_EXPECTED_REVISION_REQUIRED', + 'Workflow reframe requires --expected-revision .', + EXIT_INVALID_ARG, + ); + } + if (!options.checkpointId) { + return printV3Error( + options.json, + 'MANCODE_REFRAME_CHECKPOINT_REQUIRED', + 'Workflow reframe requires --checkpoint-id .', + EXIT_INVALID_ARG, + ); + } + try { + const project = await readV3CommandProject(rootDir); + const session = await resolveV3CommandSession(project, options); + assertUlid(options.checkpointId, 'checkpointId'); + const result = await reframeV3Workflow({ + projectRoot: project.projectRoot, + taskRef: parseTaskRef(task), + sessionId: session.sessionId, + expectedTaskRevision, + checkpointId: options.checkpointId, + summary: options.summary, + nextAction: options.nextAction, + }); + return printV3Result(options.json, { + schemaVersion: 1, + taskRef: result.metadata.taskRef, + metadata: result.metadata, + requirements: result.requirements, + review: result.review, + verification: result.verification, + checkpoint: result.checkpoint, + releasedClaims: result.releasedClaims, + archive: result.archive, + aggregate: result.aggregate, + taskHeadFence: result.taskHeadFence, + operation: result.operation, + }); + } catch (error) { + return printV3Error( + options.json, + v3ErrorCode(error, 'MANCODE_V3_REFRAME_FAILED'), + error instanceof Error + ? error.message + : 'Unable to reframe the mancode workflow.', + ); + } +} + async function workflowCompleteV3( rootDir: string, args: string[], diff --git a/src/context/compatibility.ts b/src/context/compatibility.ts index 4140b4d..60613d7 100644 --- a/src/context/compatibility.ts +++ b/src/context/compatibility.ts @@ -1,20 +1,38 @@ import type { LegacyBaseline, ManagedAdapter, - SchemaManifestV1, + SchemaManifest, } from './manifest.js'; export type CompatibilityOperation = | 'read' | 'v3_business_write' + | 'reframe' | 'migration_stage' | 'activation_repair' - | 'greenfield_initialize'; + | 'greenfield_initialize' + | 'adapter_upgrade' + | 'project_policy_upgrade'; + +export type WriterCapability = + | 'planning-policy:1' + | 'planning-policy:2' + | 'adapter-digest:1' + | 'reframe-local:1'; + +export const CURRENT_WRITER_CAPABILITIES: readonly WriterCapability[] = [ + 'planning-policy:1', + 'planning-policy:2', + 'adapter-digest:1', + 'reframe-local:1', +]; export type CompatibilityFailureCode = | 'MANCODE_SCHEMA_EPOCH_MISMATCH' | 'MANCODE_READER_VERSION_TOO_OLD' | 'MANCODE_WRITER_VERSION_TOO_OLD' + | 'MANCODE_WRITER_CAPABILITY_MISSING' + | 'MANCODE_ADAPTER_CONTENT_STALE' | 'MANCODE_ADAPTER_VERSION_MISMATCH' | 'MANCODE_LEGACY_BASELINE_CHANGED' | 'MANCODE_LEGACY_AUTHORITY_PRESENT' @@ -23,16 +41,27 @@ export type CompatibilityFailureCode = | 'MANCODE_REPAIR_REQUIRED'; export interface CompatibilityGateInput { - manifest: SchemaManifestV1; + manifest: SchemaManifest; expectedSchemaEpoch: string; readerVersion: string; writerVersion: string; + writerCapabilities: readonly WriterCapability[]; adapterVersions: Partial>; currentLegacyBaseline: LegacyBaseline | null; legacyAuthorityPresent: boolean; operation: CompatibilityOperation; } +export class CompatibilityGateError extends Error { + constructor( + readonly code: CompatibilityFailureCode, + readonly details: Record, + ) { + super(`${code}: ${JSON.stringify(details)}`); + this.name = 'CompatibilityGateError'; + } +} + export interface CompatibilityGateResult { readAllowed: boolean; writeAllowed: boolean; @@ -60,8 +89,12 @@ export function evaluateCompatibilityGate( ) { failures.push('MANCODE_WRITER_VERSION_TOO_OLD'); } - if (!adaptersMatch(input.manifest, input.adapterVersions)) { - failures.push('MANCODE_ADAPTER_VERSION_MISMATCH'); + if (missingWriterCapabilities(input).length > 0) { + failures.push('MANCODE_WRITER_CAPABILITY_MISSING'); + } + const adapterFailure = adapterFailureFor(input); + if (adapterFailure !== null) { + failures.push(adapterFailure); } const baselineFailure = baselineFailureFor(input); if (baselineFailure !== null) failures.push(baselineFailure); @@ -79,7 +112,12 @@ export function assertCompatibilityGate(input: CompatibilityGateInput): void { const allowed = input.operation === 'read' ? result.readAllowed : result.writeAllowed; if (!allowed) { - throw new Error(result.failures[0] ?? 'MANCODE_COMPATIBILITY_BLOCKED'); + const code = result.failures[0]; + if (code === undefined) throw new Error('MANCODE_COMPATIBILITY_BLOCKED'); + throw new CompatibilityGateError( + code, + compatibilityFailureDetails(input, code), + ); } } @@ -157,15 +195,118 @@ function stateFailureFor( } } +function adapterFailureFor( + input: CompatibilityGateInput, +): CompatibilityFailureCode | null { + if (input.operation === 'adapter_upgrade') return null; + const entries = Object.entries(input.adapterVersions) as Array< + [ManagedAdapter, string] + >; + if ( + entries.some( + ([, version]) => + version === 'missing' || + version === 'stale' || + version === 'unreadable', + ) + ) { + return 'MANCODE_ADAPTER_CONTENT_STALE'; + } + return adaptersMatch(input.manifest, input.adapterVersions) + ? null + : 'MANCODE_ADAPTER_VERSION_MISMATCH'; +} + function adaptersMatch( - manifest: SchemaManifestV1, + manifest: SchemaManifest, actual: Partial>, ): boolean { - return (Object.keys(manifest.managedAdapters) as ManagedAdapter[]).every( - (adapter) => actual[adapter] === manifest.managedAdapters[adapter], + const expectedAdapters = Object.keys( + manifest.managedAdapters, + ) as ManagedAdapter[]; + const actualAdapters = Object.keys(actual) as ManagedAdapter[]; + return ( + expectedAdapters.length === actualAdapters.length && + expectedAdapters.every( + (adapter) => actual[adapter] === manifest.managedAdapters[adapter], + ) + ); +} + +function requiredWriterCapabilities( + input: CompatibilityGateInput, +): readonly WriterCapability[] { + if (input.operation === 'read') return []; + if (input.operation === 'adapter_upgrade') { + return ['planning-policy:1', 'adapter-digest:1']; + } + if (input.operation === 'reframe') { + return [ + 'planning-policy:1', + ...(input.manifest.manifestVersion === 2 + ? (['planning-policy:2'] as const) + : []), + 'adapter-digest:1', + 'reframe-local:1', + ]; + } + if ( + input.operation === 'project_policy_upgrade' || + input.manifest.manifestVersion === 2 + ) { + return ['planning-policy:1', 'planning-policy:2', 'adapter-digest:1']; + } + return ['planning-policy:1']; +} + +function missingWriterCapabilities( + input: CompatibilityGateInput, +): WriterCapability[] { + const declared = new Set(input.writerCapabilities); + return requiredWriterCapabilities(input).filter( + (capability) => !declared.has(capability), ); } +function compatibilityFailureDetails( + input: CompatibilityGateInput, + code: CompatibilityFailureCode, +): Record { + switch (code) { + case 'MANCODE_WRITER_VERSION_TOO_OLD': + return { + observedVersion: input.writerVersion, + requiredWriter: input.manifest.minWriterVersion, + }; + case 'MANCODE_WRITER_CAPABILITY_MISSING': + return { + missingCapabilities: missingWriterCapabilities(input), + declaredCapabilities: [...input.writerCapabilities], + requiredWriter: input.manifest.minWriterVersion, + }; + case 'MANCODE_ADAPTER_CONTENT_STALE': { + const adapters = Object.fromEntries( + Object.entries(input.adapterVersions).filter( + ([, version]) => + version === 'missing' || + version === 'stale' || + version === 'unreadable', + ), + ); + return { + adapters, + repair: Object.keys(adapters).map((platform) => ({ + platform, + previewCommand: `mancode adapter upgrade --platform ${platform} --dry-run`, + confirmCommand: `mancode adapter upgrade --platform ${platform} --confirm --operation-id --session `, + })), + }; + } + default: + return {}; + } +} + function sameBaseline(left: LegacyBaseline, right: LegacyBaseline): boolean { return ( left.stateDigest === right.stateDigest && diff --git a/src/context/greenfield-init.ts b/src/context/greenfield-init.ts index f8912d4..d4ddd44 100644 --- a/src/context/greenfield-init.ts +++ b/src/context/greenfield-init.ts @@ -7,6 +7,14 @@ import { writeFile, } from 'node:fs/promises'; import path from 'node:path'; +import { + type V3AdapterFilePlan, + type V3AdapterFileTarget, + V3_ADAPTER_FILE_TARGETS, + applyV3AdapterFilePlan, + inspectV3AdapterVersions, + planV3AdapterUpgradeFiles, +} from '../installers/v3-adapter.js'; import { throwIfOperationCrashInjected } from '../runtime/operation-crash-injection.js'; import { type ProjectConfigV1, @@ -16,13 +24,17 @@ import { parseTeamPolicy, } from '../team/policy.js'; import { digestCanonicalJson } from './canonical.js'; +import { compareSemver } from './compatibility.js'; import { type Ulid, assertUlid } from './ids.js'; import { assertGreenfieldInitializationPreflight } from './layout.js'; import { - type ManagedAdapter, - type SchemaManifestV1, + type ManagedAdapterInventory, + type SchemaManifest, + type SchemaManifestV2, assertSchemaManifestTransition, + managedAdapterNames, parseSchemaManifest, + parseSchemaManifestV2, } from './manifest.js'; import { type ProjectFactsV1, @@ -49,6 +61,7 @@ export interface GreenfieldInitializationJournalV1 { configDigest: string; policyDigest: string; projectFactsDigest: string; + adapterPlans: V3AdapterFilePlan[]; bindingRegistered: boolean; createdAt: string; updatedAt: string; @@ -61,7 +74,7 @@ export interface GreenfieldInitializationInput { schemaEpoch: Ulid; minReaderVersion: string; minWriterVersion: string; - managedAdapters: Record; + managedAdapters: ManagedAdapterInventory; projectConfig: ProjectConfigV1; teamPolicy: TeamPolicyV1; /** Optional detected facts; omitted inputs receive a safe unknown record. */ @@ -122,6 +135,14 @@ export async function stageGreenfieldInitialization( const now = (normalized.now ?? new Date()).toISOString(); const manifest = initializationManifest(normalized, now); + const requiredAdapters = managedAdapterNames(normalized.managedAdapters); + const adapterPlans = + requiredAdapters.length === 0 + ? [] + : await planV3AdapterUpgradeFiles( + normalized.projectRoot, + requiredAdapters, + ); const config = initializationConfig( normalized.projectConfig, normalized, @@ -140,6 +161,7 @@ export async function stageGreenfieldInitialization( configDigest: digestCanonicalJson(config), policyDigest: digestCanonicalJson(policy), projectFactsDigest: digestCanonicalJson(projectFacts), + adapterPlans, bindingRegistered: false, createdAt: now, updatedAt: now, @@ -180,6 +202,12 @@ export async function publishGreenfieldInitialization( throw new Error('MANCODE_GREENFIELD_STAGING_STATE_INVALID'); } await assertStageMatchesJournal(stagingRoot, journal); + const stagedManifest = await readManifest(stagingRoot); + await assertAdapterPlansAtBeforeState( + root, + managedAdapterNames(stagedManifest.managedAdapters), + journal.adapterPlans, + ); if ((await lstatOrNull(targetRoot)) !== null) { throw new Error('MANCODE_V3_TARGET_EXISTS'); } @@ -320,6 +348,7 @@ export function parseGreenfieldInitializationJournal( 'configDigest', 'policyDigest', 'projectFactsDigest', + 'adapterPlans', 'bindingRegistered', 'createdAt', 'updatedAt', @@ -374,6 +403,7 @@ export function parseGreenfieldInitializationJournal( value.projectFactsDigest, 'projectFactsDigest', ), + adapterPlans: parseAdapterPlans(value.adapterPlans), bindingRegistered: value.bindingRegistered, createdAt: parseTimestamp(value.createdAt, 'createdAt'), updatedAt: parseTimestamp(value.updatedAt, 'updatedAt'), @@ -407,7 +437,41 @@ async function finishPublishedInitialization( 'register-workspace-binding', ); const manifest = await readManifest(targetRoot); - const activeManifest: SchemaManifestV1 = { + try { + for (const plan of published.adapterPlans) { + await applyV3AdapterFilePlan(input.projectRoot, plan); + throwIfOperationCrashInjected( + 'greenfield_initialize', + `publish-managed-adapters:${plan.target}`, + ); + } + const requiredAdapters = managedAdapterNames(manifest.managedAdapters); + const actualAdapters = await inspectV3AdapterVersions( + input.projectRoot, + requiredAdapters, + ); + if ( + requiredAdapters.some( + (adapter) => + actualAdapters[adapter] !== manifest.managedAdapters[adapter], + ) + ) { + throw new Error('MANCODE_GREENFIELD_ADAPTER_VERIFY_FAILED'); + } + } catch (error) { + await writeJournalAt(targetRoot, { + ...published, + state: 'repair_required', + bindingRegistered: true, + updatedAt: (input.now ?? new Date()).toISOString(), + }); + throw error; + } + throwIfOperationCrashInjected( + 'greenfield_initialize', + 'publish-managed-adapters', + ); + const activeManifest: SchemaManifest = { ...manifest, activationState: 'v3_active', activatedAt: (input.now ?? new Date()).toISOString(), @@ -430,7 +494,7 @@ async function finishPublishedInitialization( async function writeGreenfieldLayout( stagingRoot: string, - manifest: SchemaManifestV1, + manifest: SchemaManifest, config: ProjectConfigV1, policy: TeamPolicyV1, projectFacts: ProjectFactsV1, @@ -502,7 +566,7 @@ async function readGreenfieldJournal( } } -async function readManifest(root: string): Promise { +async function readManifest(root: string): Promise { try { return parseSchemaManifest( JSON.parse(await readFile(path.join(root, 'schema.json'), 'utf8')), @@ -679,21 +743,85 @@ function normalizeInput( function initializationManifest( input: GreenfieldInitializationInput, _now: string, -): SchemaManifestV1 { - return parseSchemaManifest({ - manifestVersion: 1, +): SchemaManifestV2 { + return parseSchemaManifestV2({ + manifestVersion: 2, layoutVersion: 3, epoch: input.schemaEpoch, activationState: 'initializing', - minReaderVersion: input.minReaderVersion, - minWriterVersion: input.minWriterVersion, + minReaderVersion: minimumVersion(input.minReaderVersion, '0.4.0'), + minWriterVersion: minimumVersion(input.minWriterVersion, '0.4.0'), activatedAt: null, legacyBaseline: null, managedAdapters: input.managedAdapters, lastOperationId: input.operationId, + workflowPolicyDefaults: { planning: 2 }, }); } +function minimumVersion(observed: string, required: string): string { + return compareSemver(observed, required) >= 0 ? observed : required; +} + +function parseAdapterPlans(value: unknown): V3AdapterFilePlan[] { + if (!Array.isArray(value)) { + throw new Error( + 'greenfield initialization journal adapterPlans is invalid', + ); + } + const seen = new Set(); + return value.map((candidate) => { + assertRecord(candidate, 'greenfield initialization adapter plan'); + assertKnownKeys( + candidate, + ['target', 'beforeContent', 'targetContent'], + 'greenfield initialization adapter plan', + ); + if ( + typeof candidate.target !== 'string' || + !V3_ADAPTER_FILE_TARGETS.includes( + candidate.target as V3AdapterFileTarget, + ) || + seen.has(candidate.target as V3AdapterFileTarget) || + (candidate.beforeContent !== null && + typeof candidate.beforeContent !== 'string') || + typeof candidate.targetContent !== 'string' || + !candidate.targetContent.trim() + ) { + throw new Error( + 'greenfield initialization journal adapterPlans is invalid', + ); + } + const target = candidate.target as V3AdapterFileTarget; + seen.add(target); + return { + target, + beforeContent: candidate.beforeContent as string | null, + targetContent: candidate.targetContent, + }; + }); +} + +async function assertAdapterPlansAtBeforeState( + projectRoot: string, + requiredAdapters: ReturnType, + plans: readonly V3AdapterFilePlan[], +): Promise { + if (requiredAdapters.length === 0) { + if (plans.length !== 0) { + throw new Error('MANCODE_GREENFIELD_ADAPTER_TARGET_CONFLICT'); + } + return; + } + const currentPlans = await planV3AdapterUpgradeFiles( + projectRoot, + requiredAdapters, + ); + if (JSON.stringify(currentPlans) !== JSON.stringify(plans)) { + throw new Error('MANCODE_GREENFIELD_ADAPTER_TARGET_CONFLICT'); + } +} + function initializationConfig( config: ProjectConfigV1, input: GreenfieldInitializationInput, diff --git a/src/context/manifest.ts b/src/context/manifest.ts index dbbf6df..f0b05f4 100644 --- a/src/context/manifest.ts +++ b/src/context/manifest.ts @@ -15,6 +15,8 @@ export type ManagedAdapter = | 'copilot' | 'zcode'; +export type ManagedAdapterInventory = Partial>; + export interface LegacyBaseline { stateDigest: string; workflowIndexDigest: string; @@ -29,10 +31,28 @@ export interface SchemaManifestV1 { minWriterVersion: string; activatedAt: string | null; legacyBaseline: LegacyBaseline | null; - managedAdapters: Record; + managedAdapters: ManagedAdapterInventory; + lastOperationId: Ulid | null; +} + +export interface SchemaManifestV2 { + manifestVersion: 2; + layoutVersion: 3; + epoch: Ulid; + activationState: ActivationState; + minReaderVersion: string; + minWriterVersion: string; + activatedAt: string | null; + legacyBaseline: LegacyBaseline | null; + managedAdapters: ManagedAdapterInventory; lastOperationId: Ulid | null; + workflowPolicyDefaults: { + planning: 2; + }; } +export type SchemaManifest = SchemaManifestV1 | SchemaManifestV2; + const ACTIVATION_STATES = new Set([ 'initializing', 'dual_read', @@ -50,8 +70,14 @@ const MANAGED_ADAPTERS: ManagedAdapter[] = [ const VERSION_PATTERN = /^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/; const DIGEST_PATTERN = /^sha256:[a-f0-9]{64}$/; -export function parseSchemaManifest(value: unknown): SchemaManifestV1 { +export function parseSchemaManifest(value: unknown): SchemaManifest { assertRecord(value, 'schema manifest'); + if (value.manifestVersion !== 1 && value.manifestVersion !== 2) { + throw new Error( + `MANCODE_MANIFEST_VERSION_UNSUPPORTED: observed=${String(value.manifestVersion)} supported=1,2 requiredWriter=0.4.0`, + ); + } + const manifestVersion = value.manifestVersion; assertKnownKeys( value, [ @@ -65,13 +91,12 @@ export function parseSchemaManifest(value: unknown): SchemaManifestV1 { 'legacyBaseline', 'managedAdapters', 'lastOperationId', + ...(manifestVersion === 2 ? ['workflowPolicyDefaults'] : []), ], 'schema manifest', ); - if (value.manifestVersion !== 1 || value.layoutVersion !== 3) { - throw new Error( - 'schema manifest must use manifestVersion 1 and layoutVersion 3', - ); + if (value.layoutVersion !== 3) { + throw new Error('schema manifest must use layoutVersion 3'); } assertUlid(value.epoch, 'schema manifest epoch'); if ( @@ -80,9 +105,8 @@ export function parseSchemaManifest(value: unknown): SchemaManifestV1 { ) { throw new Error('schema manifest activationState is invalid'); } - const manifest: SchemaManifestV1 = { - manifestVersion: 1, - layoutVersion: 3, + const common = { + layoutVersion: 3 as const, epoch: value.epoch, activationState: value.activationState as ActivationState, minReaderVersion: parseVersion(value.minReaderVersion, 'minReaderVersion'), @@ -92,19 +116,70 @@ export function parseSchemaManifest(value: unknown): SchemaManifestV1 { managedAdapters: parseManagedAdapters(value.managedAdapters), lastOperationId: parseUlidOrNull(value.lastOperationId, 'lastOperationId'), }; + const manifest: SchemaManifest = + manifestVersion === 1 + ? { manifestVersion: 1, ...common } + : { + manifestVersion: 2, + ...common, + workflowPolicyDefaults: parseWorkflowPolicyDefaults( + value.workflowPolicyDefaults, + ), + }; assertManifestStateShape(manifest); + if ( + manifest.manifestVersion === 2 && + (compareVersions(manifest.minReaderVersion, '0.4.0') < 0 || + compareVersions(manifest.minWriterVersion, '0.4.0') < 0) + ) { + throw new Error( + 'schema manifest V2 requires minReaderVersion and minWriterVersion 0.4.0 or newer', + ); + } + return manifest; +} + +export function serializeSchemaManifest(value: unknown): string { + return `${JSON.stringify(parseSchemaManifest(value), null, 2)}\n`; +} + +export function managedAdapterNames( + inventory: ManagedAdapterInventory, +): ManagedAdapter[] { + return MANAGED_ADAPTERS.filter((adapter) => inventory[adapter] !== undefined); +} + +export function parseSchemaManifestV1(value: unknown): SchemaManifestV1 { + const manifest = parseSchemaManifest(value); + if (manifest.manifestVersion !== 1) { + throw new Error( + `MANCODE_MANIFEST_VERSION_UNSUPPORTED: observed=${manifest.manifestVersion} supported=1 requiredWriter=0.3.x`, + ); + } + return manifest; +} + +export function parseSchemaManifestV2(value: unknown): SchemaManifestV2 { + const manifest = parseSchemaManifest(value); + if (manifest.manifestVersion !== 2) { + throw new Error( + `MANCODE_MANIFEST_VERSION_UNSUPPORTED: observed=${manifest.manifestVersion} supported=2 requiredWriter=0.4.0`, + ); + } return manifest; } export function assertSchemaManifestTransition( - previous: SchemaManifestV1, - next: SchemaManifestV1, + previous: SchemaManifest, + next: SchemaManifest, ): void { if ( previous.manifestVersion !== next.manifestVersion || previous.layoutVersion !== next.layoutVersion || previous.epoch !== next.epoch || - !sameLegacyBaseline(previous.legacyBaseline, next.legacyBaseline) + !sameLegacyBaseline(previous.legacyBaseline, next.legacyBaseline) || + compareVersions(next.minReaderVersion, previous.minReaderVersion) < 0 || + compareVersions(next.minWriterVersion, previous.minWriterVersion) < 0 ) { throw new Error( 'schema manifest identity and legacy baseline are immutable', @@ -122,14 +197,38 @@ export function assertSchemaManifestTransition( } } +export function assertSchemaManifestPolicyUpgrade( + previous: SchemaManifest, + next: SchemaManifest, +): asserts next is SchemaManifestV2 { + if ( + previous.manifestVersion !== 1 || + next.manifestVersion !== 2 || + previous.layoutVersion !== next.layoutVersion || + previous.epoch !== next.epoch || + previous.activationState !== 'v3_active' || + next.activationState !== 'v3_active' || + previous.activatedAt !== next.activatedAt || + !sameLegacyBaseline(previous.legacyBaseline, next.legacyBaseline) || + !sameManagedAdapters(previous.managedAdapters, next.managedAdapters) || + compareVersions(next.minReaderVersion, previous.minReaderVersion) < 0 || + compareVersions(next.minWriterVersion, previous.minWriterVersion) < 0 || + next.workflowPolicyDefaults.planning !== 2 || + next.lastOperationId === null || + next.lastOperationId === previous.lastOperationId + ) { + throw new Error('invalid schema manifest Policy 2 upgrade'); + } +} + /** * Activation rollback is intentionally not a general manifest transition. * The caller must separately prove that the activation's exact targets have * not been followed by a V3 business write. */ export function assertActivationRollbackManifestTransition( - previous: SchemaManifestV1, - next: SchemaManifestV1, + previous: SchemaManifest, + next: SchemaManifest, ): void { if ( previous.manifestVersion !== next.manifestVersion || @@ -145,6 +244,23 @@ export function assertActivationRollbackManifestTransition( } } +function parseWorkflowPolicyDefaults( + value: unknown, +): SchemaManifestV2['workflowPolicyDefaults'] { + assertRecord(value, 'schema manifest workflowPolicyDefaults'); + assertKnownKeys( + value, + ['planning'], + 'schema manifest workflowPolicyDefaults', + ); + if (value.planning !== 2) { + throw new Error( + `MANCODE_POLICY_VERSION_UNSUPPORTED: component=planning observed=${String(value.planning)} supported=2 requiredWriter=0.4.0`, + ); + } + return { planning: 2 }; +} + function parseVersion(value: unknown, label: string): string { if (typeof value !== 'string' || !VERSION_PATTERN.test(value)) { throw new Error(`schema manifest ${label} must be a semantic version`); @@ -186,15 +302,19 @@ function parseLegacyBaseline(value: unknown): LegacyBaseline | null { }; } -function parseManagedAdapters(value: unknown): Record { +function parseManagedAdapters(value: unknown): ManagedAdapterInventory { assertRecord(value, 'schema manifest managedAdapters'); assertKnownKeys(value, MANAGED_ADAPTERS, 'schema manifest managedAdapters'); - const adapters = {} as Record; + const adapters: ManagedAdapterInventory = {}; for (const adapter of MANAGED_ADAPTERS) { - if (typeof value[adapter] !== 'string' || !value[adapter].trim()) { - throw new Error(`schema manifest managedAdapters.${adapter} is required`); + const version = value[adapter]; + if (version === undefined) continue; + if (typeof version !== 'string' || !version.trim()) { + throw new Error( + `schema manifest managedAdapters.${adapter} must be a non-empty version`, + ); } - adapters[adapter] = value[adapter]; + adapters[adapter] = version; } return adapters; } @@ -205,7 +325,7 @@ function parseUlidOrNull(value: unknown, label: string): Ulid | null { return value; } -function assertManifestStateShape(manifest: SchemaManifestV1): void { +function assertManifestStateShape(manifest: SchemaManifest): void { if ( manifest.activationState === 'initializing' && manifest.legacyBaseline !== null @@ -241,6 +361,60 @@ function assertManifestStateShape(manifest: SchemaManifestV1): void { } } +function sameManagedAdapters( + left: ManagedAdapterInventory, + right: ManagedAdapterInventory, +): boolean { + const leftKeys = managedAdapterNames(left); + const rightKeys = managedAdapterNames(right); + return ( + leftKeys.length === rightKeys.length && + leftKeys.every( + (adapter, index) => + adapter === rightKeys[index] && left[adapter] === right[adapter], + ) + ); +} + +function compareVersions(left: string, right: string): number { + const [leftCore = '', leftPrerelease] = left.split('-', 2); + const [rightCore = '', rightPrerelease] = right.split('-', 2); + const leftParts = leftCore.split('.').map(Number); + const rightParts = rightCore.split('.').map(Number); + for (let index = 0; index < 3; index += 1) { + const delta = (leftParts[index] ?? 0) - (rightParts[index] ?? 0); + if (delta !== 0) return delta; + } + if (leftPrerelease === rightPrerelease) return 0; + if (leftPrerelease === undefined) return 1; + if (rightPrerelease === undefined) return -1; + return comparePrerelease(leftPrerelease, rightPrerelease); +} + +function comparePrerelease(left: string, right: string): number { + const leftParts = left.split('.'); + const rightParts = right.split('.'); + for ( + let index = 0; + index < Math.max(leftParts.length, rightParts.length); + index += 1 + ) { + const leftPart = leftParts[index]; + const rightPart = rightParts[index]; + if (leftPart === undefined) return -1; + if (rightPart === undefined) return 1; + if (leftPart === rightPart) continue; + const leftNumeric = /^\d+$/.test(leftPart); + const rightNumeric = /^\d+$/.test(rightPart); + if (leftNumeric && rightNumeric) + return Number(leftPart) - Number(rightPart); + if (leftNumeric) return -1; + if (rightNumeric) return 1; + return leftPart.localeCompare(rightPart, 'en'); + } + return 0; +} + function sameLegacyBaseline( left: LegacyBaseline | null, right: LegacyBaseline | null, diff --git a/src/context/migrate.ts b/src/context/migrate.ts index 5e3b5a7..10937a9 100644 --- a/src/context/migrate.ts +++ b/src/context/migrate.ts @@ -97,7 +97,7 @@ import { type SchemaManifestV1, assertActivationRollbackManifestTransition, assertSchemaManifestTransition, - parseSchemaManifest, + parseSchemaManifestV1 as parseSchemaManifest, } from './manifest.js'; import type { ManagedAdapter } from './manifest.js'; import { diff --git a/src/context/plan-revision.ts b/src/context/plan-revision.ts index 0ca64a5..ab54e14 100644 --- a/src/context/plan-revision.ts +++ b/src/context/plan-revision.ts @@ -3,6 +3,10 @@ import { createTaskAuthorityFileRecoveryAction, createTaskHeadFenceRecoveryAction, } from '../runtime/operation-recovery-payload.js'; +import { + enqueueSessionPointerProjection, + reconcileProjectionIntents, +} from '../runtime/projection-outbox.js'; import type { TaskHeadFenceV1 } from '../runtime/task-head-fence.js'; import { replaceTaskHeadFence } from '../runtime/task-head-store.js'; import { @@ -69,8 +73,8 @@ export interface RevisedV3Plan { } /** - * Writes a new plan version and makes every prior review and verification - * result explicitly stale before the task becomes stable again. + * Writes a new plan version when content changes, or records a plan decision + * against the existing content without invalidating its evidence. */ export async function reviseV3Plan( input: ReviseV3PlanInput, @@ -106,26 +110,33 @@ export async function reviseV3Plan( if (context.task.plan?.content === plan && planDecision === null) { throw new Error('MANCODE_PLAN_CONTENT_UNCHANGED'); } + const planChanged = context.task.plan?.content !== plan; const timestamp = context.now.toISOString(); - const planDigest = digestCanonicalJson({ - artifactRef: { taskRef, kind: 'plan' }, - content: plan, - }); - const review = markTaskReviewStale( - context.task.review, - context.operationId, - timestamp, - ); - const verification = markTaskVerificationStale( - context.task.verification, - context.operationId, - timestamp, - ); + const planDigest = planChanged + ? digestCanonicalJson({ + artifactRef: { taskRef, kind: 'plan' }, + content: plan, + }) + : context.task.plan?.digest; + if (planDigest === undefined) { + throw new Error('MANCODE_PLAN_FILE_REQUIRED'); + } + const review = planChanged + ? markTaskReviewStale(context.task.review, context.operationId, timestamp) + : context.task.review; + const verification = planChanged + ? markTaskVerificationStale( + context.task.verification, + context.operationId, + timestamp, + ) + : context.task.verification; const metadata = updateMetadata( context.task.metadata, context.task.requirements, review, verification, + planChanged, planDecision, context.operationId, timestamp, @@ -140,6 +151,19 @@ export async function reviseV3Plan( }); const taskHeadFence = nextTaskHeadFence(context, aggregate, timestamp); + if (planDecision === 'plan_only') { + await enqueueSessionPointerProjection(context.projectRoot, { + operationId: context.operationId, + action: 'clear', + sessionId: context.session.sessionId, + expectedPreviousTaskRef: context.session.activeTaskRef, + taskRef, + workflowMode: metadata.workflowMode, + taskRevision: metadata.revision, + now: context.now, + }); + } + journal = await createTaskOperationJournal(context, { type: 'plan_revision', action: @@ -153,13 +177,17 @@ export async function reviseV3Plan( ]), recovery: { actions: [ - createTaskAuthorityFileRecoveryAction({ - stepId: 'write-plan', - taskRef, - fileName: 'plan.md', - beforeContent: context.task.plan?.content ?? null, - targetContent: plan, - }), + ...(planChanged + ? [ + createTaskAuthorityFileRecoveryAction({ + stepId: 'write-plan', + taskRef, + fileName: 'plan.md', + beforeContent: context.task.plan?.content ?? null, + targetContent: plan, + }), + ] + : []), createTaskAuthorityFileRecoveryAction({ stepId: 'update-metadata', taskRef, @@ -167,20 +195,26 @@ export async function reviseV3Plan( beforeContent: serializeTaskAuthority(context.task.metadata), targetContent: serializeTaskAuthority(metadata), }), - createTaskAuthorityFileRecoveryAction({ - stepId: 'mark-review-verification-stale', - taskRef, - fileName: 'review-ledger.json', - beforeContent: serializeTaskAuthority(context.task.review), - targetContent: serializeTaskAuthority(review), - }), - createTaskAuthorityFileRecoveryAction({ - stepId: 'mark-review-verification-stale', - taskRef, - fileName: 'verification-ledger.json', - beforeContent: serializeTaskAuthority(context.task.verification), - targetContent: serializeTaskAuthority(verification), - }), + ...(planChanged + ? [ + createTaskAuthorityFileRecoveryAction({ + stepId: 'mark-review-verification-stale', + taskRef, + fileName: 'review-ledger.json', + beforeContent: serializeTaskAuthority(context.task.review), + targetContent: serializeTaskAuthority(review), + }), + createTaskAuthorityFileRecoveryAction({ + stepId: 'mark-review-verification-stale', + taskRef, + fileName: 'verification-ledger.json', + beforeContent: serializeTaskAuthority( + context.task.verification, + ), + targetContent: serializeTaskAuthority(verification), + }), + ] + : []), ...(taskHeadFence === null ? [] : [ @@ -191,13 +225,20 @@ export async function reviseV3Plan( }), ]), ], - noOpStepIds: taskHeadFence === null ? ['update-task-head-fence'] : [], + noOpStepIds: [ + ...(planChanged + ? [] + : ['write-plan', 'mark-review-verification-stale']), + ...(taskHeadFence === null ? ['update-task-head-fence'] : []), + ], }, }); journal = await advanceTaskOperation(context, journal, 'validate', true); journal = await advanceTaskOperation(context, journal, 'write-plan', false); - await writeTaskAuthorityFile(context, 'plan.md', plan); + if (planChanged) { + await writeTaskAuthorityFile(context, 'plan.md', plan); + } journal = await advanceTaskOperation( context, @@ -217,16 +258,18 @@ export async function reviseV3Plan( 'mark-review-verification-stale', false, ); - await writeTaskAuthorityFile( - context, - 'review-ledger.json', - `${JSON.stringify(review, null, 2)}\n`, - ); - await writeTaskAuthorityFile( - context, - 'verification-ledger.json', - `${JSON.stringify(verification, null, 2)}\n`, - ); + if (planChanged) { + await writeTaskAuthorityFile( + context, + 'review-ledger.json', + `${JSON.stringify(review, null, 2)}\n`, + ); + await writeTaskAuthorityFile( + context, + 'verification-ledger.json', + `${JSON.stringify(verification, null, 2)}\n`, + ); + } journal = await advanceTaskOperation( context, @@ -239,6 +282,17 @@ export async function reviseV3Plan( await replaceTaskHeadFence(context.homeStore, taskHeadFence); } const operation = await commitTaskOperation(context, journal); + if (planDecision === 'plan_only') { + try { + await reconcileProjectionIntents( + context.projectRoot, + context.operationId, + context.now, + ); + } catch { + // Planned authority is committed; doctor can finish the projection. + } + } return { metadata, review, @@ -306,6 +360,7 @@ function updateMetadata( requirements: RequirementsLedgerV1, review: ReviewLedgerV1, verification: VerificationLedgerV1, + planChanged: boolean, planDecision: V3PlanDecision | null, operationId: Ulid, updatedAt: string, @@ -323,11 +378,13 @@ function updateMetadata( ...previous.governance, requirementsStatus: 'ready', requirementsDigest: requirements.contentDigest, - planVersion: previous.governance.planVersion + 1, + planVersion: previous.governance.planVersion + (planChanged ? 1 : 0), planDecision, - reviewStatus: 'stale', + reviewStatus: planChanged ? 'stale' : previous.governance.reviewStatus, reviewLedgerDigest: review.contentDigest, - verificationStatus: 'stale', + verificationStatus: planChanged + ? 'stale' + : previous.governance.verificationStatus, verificationLedgerDigest: verification.contentDigest, }, updatedAt, diff --git a/src/context/project-policy-upgrade.ts b/src/context/project-policy-upgrade.ts new file mode 100644 index 0000000..4651d40 --- /dev/null +++ b/src/context/project-policy-upgrade.ts @@ -0,0 +1,709 @@ +import { lstat, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import path from 'node:path'; +import { inspectV3AdapterVersions } from '../installers/v3-adapter.js'; +import { replaceFileAtomically } from '../runtime/atomic-file.js'; +import { + type EntityHomeStore, + resolveLocalEntityHomeStore, +} from '../runtime/entity-home-store.js'; +import { + type LocalLockHandle, + acquireOperationEntityLocks, +} from '../runtime/local-lock.js'; +import { + armOperationCrashAfterVisibleWrite, + throwIfDeferredOperationCrashInjected, + throwIfOperationCrashInjected, +} from '../runtime/operation-crash-injection.js'; +import { + assertOperationJournalMatchesDefinition, + getOperationDefinition, +} from '../runtime/operation-definition.js'; +import type { + OperationJournalV1, + OperationStep, +} from '../runtime/operation-journal.js'; +import { + executeOperationRecovery, + listUnfinishedOperationRecoveries, +} from '../runtime/operation-recovery-executor.js'; +import { + assertOperationRecoveryPayloadCoversJournal, + createProjectAuthorityFileRecoveryAction, + operationRecoveryPayloadDigest, + parseOperationRecoveryPayload, +} from '../runtime/operation-recovery-payload.js'; +import { writeOperationRecoveryPayload } from '../runtime/operation-recovery-store.js'; +import { + createPreparedOperationJournal, + readOperationJournal, + updateOperationJournal, +} from '../runtime/operation-store.js'; +import { readProjectRuntimeContext } from '../runtime/project-runtime.js'; +import { PROJECT_SCHEMA_LOCK } from '../runtime/project-write-barrier.js'; +import { type SessionStateV1, readSession } from '../runtime/session.js'; +import { createAuthorizationBasis } from '../team/authorization.js'; +import { VERSION } from '../version.js'; +import { digestCanonicalJson } from './canonical.js'; +import { + CURRENT_WRITER_CAPABILITIES, + assertCompatibilityGate, + compareSemver, +} from './compatibility.js'; +import { type Ulid, assertUlid, createUlid } from './ids.js'; +import { scanLegacyAuthority } from './layout.js'; +import { managedAdapterNames } from './manifest.js'; +import { + type SchemaManifestV2, + assertSchemaManifestPolicyUpgrade, + parseSchemaManifest, + serializeSchemaManifest, +} from './manifest.js'; +import { V3ContextStore } from './store.js'; + +export interface ProjectPolicyUpgradeInput { + projectRoot: string; + policyVersion?: 2; + sessionId: Ulid; + operationId?: Ulid; + now?: Date; +} + +export interface ProjectPolicyUpgradePreviewInput { + projectRoot: string; + policyVersion?: 2; + operationId?: Ulid; + now?: Date; +} + +export interface ProjectPolicyUpgradePreview { + schemaVersion: 1; + policy: 2; + currentManifestVersion: 1 | 2; + willUpgrade: boolean; + beforeDigest: string; + afterDigest: string | null; + minReaderVersion: string; + minWriterVersion: string; + blockers: string[]; + operationId: Ulid; +} + +interface ProjectPolicyUpgradePreviewReceiptV1 { + schemaVersion: 1; + operationId: Ulid; + projectFingerprint: string; + beforeDigest: string; + afterDigest: string; + createdAt: string; +} + +export interface ProjectPolicyUpgradeResult { + schemaVersion: 1; + policy: 2; + state: 'committed' | 'already_upgraded'; + operation: OperationJournalV1 | null; + manifest: SchemaManifestV2; +} + +const UPGRADE_OPERATION = 'project_policy_upgrade' as const; + +export async function dryRunProjectPolicyUpgrade( + input: ProjectPolicyUpgradePreviewInput, +): Promise { + assertPolicyVersion(input.policyVersion); + const root = path.resolve(input.projectRoot); + const project = await new V3ContextStore(root).readProjectSnapshot(); + const beforeDigest = digestManifest(project.manifest); + const now = input.now ?? new Date(); + const operationId = input.operationId ?? createUlid(now.getTime()); + assertUlid(operationId, 'project policy upgrade preview operationId'); + const blockers = await collectUpgradeBlockers(root, project); + let afterDigest: string | null = null; + let minReaderVersion = project.manifest.minReaderVersion; + let minWriterVersion = project.manifest.minWriterVersion; + if (project.manifest.manifestVersion === 1 && blockers.length === 0) { + const candidate = buildV2Manifest(project.manifest, operationId); + afterDigest = digestManifest(candidate); + minReaderVersion = candidate.minReaderVersion; + minWriterVersion = candidate.minWriterVersion; + await stageProjectPolicyUpgrade( + root, + { + schemaVersion: 1, + operationId, + projectFingerprint: project.fingerprint, + beforeDigest, + afterDigest, + createdAt: now.toISOString(), + }, + serializeSchemaManifest(candidate), + ); + } + return { + schemaVersion: 1, + policy: 2, + currentManifestVersion: project.manifest.manifestVersion, + willUpgrade: + project.manifest.manifestVersion === 1 && blockers.length === 0, + beforeDigest, + afterDigest, + minReaderVersion, + minWriterVersion, + blockers, + operationId, + }; +} + +export async function upgradeProjectPolicy( + input: ProjectPolicyUpgradeInput, +): Promise { + assertPolicyVersion(input.policyVersion); + assertUlid(input.sessionId, 'project policy upgrade sessionId'); + const root = path.resolve(input.projectRoot); + const now = input.now ?? new Date(); + const operationId = input.operationId; + if (operationId === undefined) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_REQUIRED'); + } + assertUlid(operationId, 'project policy upgrade operationId'); + const runtime = await readProjectRuntimeContext(root); + const store = new V3ContextStore(root); + const localStore = resolveLocalEntityHomeStore( + runtime.entityHomeStoreContext, + ); + const session = await readSession(root, input.sessionId); + if (session === null || session.status !== 'active') { + throw new Error('MANCODE_SESSION_NOT_FOUND'); + } + const initial = await store.readProjectSnapshot(); + if (initial.manifest.manifestVersion === 2) { + const recovered = await recoverInterruptedProjectPolicyUpgrade({ + root, + store, + localStore, + session, + operationId, + now, + }); + if (recovered !== null) return recovered; + return { + schemaVersion: 1, + policy: 2, + state: 'already_upgraded', + operation: null, + manifest: initial.manifest, + }; + } + await assertUpgradePreflight(root, initial); + await assertProjectPolicyUpgradePreview(root, operationId, initial); + const locks = await acquireOperationEntityLocks( + operationId, + [{ store: localStore, entityLockKeys: [PROJECT_SCHEMA_LOCK] }], + { now }, + ); + let journal: OperationJournalV1 | null = null; + try { + const project = await store.readProjectSnapshot(); + if (project.manifest.manifestVersion !== 1) { + if (project.manifest.manifestVersion === 2) { + return { + schemaVersion: 1, + policy: 2, + state: 'already_upgraded', + operation: null, + manifest: project.manifest, + }; + } + throw new Error('MANCODE_EXPECTED_REVISION_CONFLICT'); + } + await assertUpgradePreflight(root, project); + await assertProjectPolicyUpgradePreview(root, operationId, project); + const target = buildV2Manifest(project.manifest, operationId); + const beforeContent = await readSchemaContent(root); + const targetContent = serializeSchemaManifest(target); + const payload = parseOperationRecoveryPayload({ + schemaVersion: 1, + operationId, + type: UPGRADE_OPERATION, + primaryStoreId: localStore.storeId, + actions: [ + createProjectAuthorityFileRecoveryAction({ + stepId: 'write-manifest', + fileName: 'schema.json', + beforeContent, + targetContent, + }), + ], + noOpStepIds: ['verify-manifest'], + }); + const authorizationBasis = createAuthorizationBasis( + { + action: 'project_maintenance', + actorId: session.actorId, + session: { + sessionId: session.sessionId, + actorId: session.actorId, + status: session.status, + }, + joined: false, + sharedWriteGuard: 'enforced', + task: null, + claim: null, + handoff: null, + evidence: null, + profileActorId: null, + conditions: { + expectedRevisionMatches: true, + explicitConfirmation: true, + }, + }, + now, + ); + journal = { + schemaVersion: 1, + operationId, + type: UPGRADE_OPERATION, + state: 'prepared', + primaryStoreId: localStore.storeId, + checkoutId: runtime.checkoutId, + secondaryReservations: [], + actorId: session.actorId, + sessionId: session.sessionId, + authorizationBasis, + recoveryPayloadDigest: operationRecoveryPayloadDigest(payload), + entityLocks: [PROJECT_SCHEMA_LOCK], + expectedRevisions: { [PROJECT_SCHEMA_LOCK]: 1 }, + steps: getOperationDefinition(UPGRADE_OPERATION).steps.map((step) => ({ + id: step.id, + state: 'pending', + })), + startedAt: now.toISOString(), + updatedAt: now.toISOString(), + }; + assertOperationJournalMatchesDefinition(journal); + assertOperationRecoveryPayloadCoversJournal(journal, payload); + await writeOperationRecoveryPayload(localStore, payload); + journal = await createPreparedOperationJournal(localStore, journal); + throwIfOperationCrashInjected(UPGRADE_OPERATION, 'prepared'); + + journal = await advance(localStore, journal, 'validate', now, true); + journal = await advance(localStore, journal, 'write-manifest', now, false); + await writeSchemaContent(root, operationId, targetContent); + armOperationCrashAfterVisibleWrite(UPGRADE_OPERATION, 'write-manifest'); + journal = await advance(localStore, journal, 'verify-manifest', now, false); + const verified = parseSchemaManifest( + JSON.parse(await readSchemaContent(root)), + ); + assertSchemaManifestPolicyUpgrade(project.manifest, verified); + if (digestManifest(verified) !== digestManifest(target)) { + throw new Error('MANCODE_OPERATION_RECOVERY_CONFLICT'); + } + journal = await commit(localStore, journal, now); + return { + schemaVersion: 1, + policy: 2, + state: 'committed', + operation: journal, + manifest: verified, + }; + } catch (error) { + if (journal !== null && journal.state !== 'committed') { + try { + const current = + (await readOperationJournal(localStore, operationId)) ?? journal; + const hasWrite = current.steps.some( + (step, index) => + step.state === 'completed' && + getOperationDefinition(UPGRADE_OPERATION).steps[index] + ?.visibility === 'business_write', + ); + await updateOperationJournal( + localStore, + { + ...current, + state: hasWrite ? 'repair_required' : 'aborted', + updatedAt: now.toISOString(), + }, + { canAbort: !hasWrite }, + ); + } catch { + // The durable journal remains the source of truth for repair. + } + } + throw error; + } finally { + await releaseLocks(locks); + } +} + +async function recoverInterruptedProjectPolicyUpgrade(input: { + root: string; + store: V3ContextStore; + localStore: EntityHomeStore; + session: SessionStateV1; + operationId: Ulid; + now: Date; +}): Promise { + const journal = await readOperationJournal( + input.localStore, + input.operationId, + ); + if ( + journal === null || + journal.state === 'committed' || + journal.state === 'aborted' + ) { + return null; + } + if (journal.type !== UPGRADE_OPERATION) { + throw new Error('MANCODE_OPERATION_JOURNAL_CONFLICT'); + } + const recovered = await executeOperationRecovery({ + projectRoot: input.root, + operationId: input.operationId, + actorId: input.session.actorId, + sessionId: input.session.sessionId, + mode: 'repair', + now: input.now, + }); + if (recovered.journal.state !== 'committed') { + throw new Error('MANCODE_OPERATION_RECOVERY_CONFLICT'); + } + const project = await input.store.readProjectSnapshot(); + if (project.manifest.manifestVersion !== 2) { + throw new Error('MANCODE_OPERATION_RECOVERY_CONFLICT'); + } + return { + schemaVersion: 1, + policy: 2, + state: 'committed', + operation: recovered.journal, + manifest: project.manifest, + }; +} + +async function collectUpgradeBlockers( + root: string, + project: Awaited>, +): Promise { + const blockers: string[] = []; + if (project.manifest.manifestVersion !== 1) return blockers; + try { + await assertUpgradePreflight(root, project); + } catch (error) { + blockers.push(errorCode(error)); + } + return [...new Set(blockers)]; +} + +async function assertUpgradePreflight( + root: string, + project: Awaited>, +): Promise { + if (project.manifest.manifestVersion !== 1) { + throw new Error('MANCODE_PROJECT_POLICY_ALREADY_UPGRADED'); + } + if (project.manifest.activationState !== 'v3_active') { + throw new Error('MANCODE_V3_WRITE_REQUIRES_ACTIVATION'); + } + const unfinished = await listUnfinishedOperationRecoveries(root); + if (unfinished.length > 0) + throw new Error('MANCODE_OPERATION_REPAIR_REQUIRED'); + const legacy = await scanLegacyAuthority(root); + const adapterVersions = await inspectV3AdapterVersions( + root, + managedAdapterNames(project.manifest.managedAdapters), + ); + assertCompatibilityGate({ + manifest: project.manifest, + expectedSchemaEpoch: project.manifest.epoch, + readerVersion: VERSION, + writerVersion: VERSION, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, + adapterVersions, + currentLegacyBaseline: legacy.baseline, + legacyAuthorityPresent: legacy.authorityPresent, + operation: 'project_policy_upgrade', + }); +} + +function buildV2Manifest( + manifest: Extract< + Awaited>['manifest'], + { manifestVersion: 1 } + >, + operationId: Ulid, +): SchemaManifestV2 { + const candidate = parseSchemaManifest({ + ...manifest, + manifestVersion: 2, + minReaderVersion: maxVersion(manifest.minReaderVersion, '0.4.0'), + minWriterVersion: maxVersion(manifest.minWriterVersion, '0.4.0'), + workflowPolicyDefaults: { planning: 2 }, + lastOperationId: operationId, + }); + assertSchemaManifestPolicyUpgrade(manifest, candidate); + return candidate; +} + +async function readSchemaContent(root: string): Promise { + return readFile(path.join(root, '.mancode', 'schema.json'), 'utf8'); +} + +async function writeSchemaContent( + root: string, + operationId: Ulid, + content: string, +): Promise { + const directory = path.join(root, '.mancode'); + const target = path.join(directory, 'schema.json'); + const stat = await lstat(target); + if (!stat.isFile() || stat.isSymbolicLink()) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + const temporary = path.join( + directory, + `.schema.json.${operationId}.${process.pid}.tmp`, + ); + await writeFile(temporary, content, { encoding: 'utf8', flag: 'wx' }); + try { + await replaceFileAtomically(temporary, target); + } catch (error) { + await rm(temporary, { force: true }); + throw error; + } +} + +async function advance( + store: EntityHomeStore, + previous: OperationJournalV1, + stepId: string, + now: Date, + canAbort: boolean, +): Promise { + throwIfDeferredOperationCrashInjected(UPGRADE_OPERATION); + const result = await updateOperationJournal( + store, + { + ...previous, + state: 'applying', + steps: completeStep(previous.steps, stepId), + updatedAt: now.toISOString(), + }, + { canAbort }, + ); + if (stepId !== 'write-manifest') { + throwIfOperationCrashInjected(UPGRADE_OPERATION, stepId); + } + return result; +} + +async function commit( + store: EntityHomeStore, + previous: OperationJournalV1, + now: Date, +): Promise { + throwIfDeferredOperationCrashInjected(UPGRADE_OPERATION); + const result = await updateOperationJournal( + store, + { + ...previous, + state: 'committed', + steps: completeStep(previous.steps, 'commit'), + updatedAt: now.toISOString(), + }, + { canAbort: false }, + ); + throwIfOperationCrashInjected(UPGRADE_OPERATION, 'commit'); + return result; +} + +function completeStep( + steps: OperationStep[], + requested: string, +): OperationStep[] { + const index = steps.findIndex((step) => step.id === requested); + if (index < 0 || steps[index]?.state === 'completed') { + throw new Error('MANCODE_OPERATION_STEP_INVALID'); + } + if (steps.slice(0, index).some((step) => step.state !== 'completed')) { + throw new Error('MANCODE_OPERATION_STEP_ORDER_INVALID'); + } + return steps.map((step, stepIndex) => + stepIndex === index ? { ...step, state: 'completed' } : step, + ); +} + +function digestManifest(manifest: unknown): string { + return digestCanonicalJson(parseSchemaManifest(manifest)); +} + +function maxVersion(left: string, right: string): string { + return compareSemver(left, right) >= 0 ? left : right; +} + +function assertPolicyVersion(value: unknown): void { + if (value !== undefined && value !== 2) { + throw new Error( + `MANCODE_POLICY_VERSION_UNSUPPORTED: component=planning observed=${String(value)} supported=2 requiredWriter=0.4.0`, + ); + } +} + +function errorCode(error: unknown): string { + return error instanceof Error && error.message.startsWith('MANCODE_') + ? (error.message.split(':', 1)[0] ?? 'MANCODE_PROJECT_UPGRADE_BLOCKED') + : 'MANCODE_PROJECT_UPGRADE_BLOCKED'; +} + +async function releaseLocks(locks: LocalLockHandle[]): Promise { + await Promise.allSettled([...locks].reverse().map((lock) => lock.release())); +} + +function projectUpgradePreviewRoot(root: string, operationId: Ulid): string { + return path.join(root, '.mancode', 'staging', 'project-upgrade', operationId); +} + +async function stageProjectPolicyUpgrade( + root: string, + receipt: ProjectPolicyUpgradePreviewReceiptV1, + manifestContent: string, +): Promise { + const directory = projectUpgradePreviewRoot(root, receipt.operationId); + const receiptPath = path.join(directory, 'preview.json'); + const manifestPath = path.join(directory, 'schema.json'); + await mkdir(path.dirname(directory), { recursive: true }); + try { + await mkdir(directory); + } catch (error) { + if (isAlreadyExists(error)) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_EXISTS'); + } + throw error; + } + try { + await writeFile(receiptPath, `${JSON.stringify(receipt, null, 2)}\n`, { + encoding: 'utf8', + flag: 'wx', + }); + await writeFile(manifestPath, manifestContent, { + encoding: 'utf8', + flag: 'wx', + }); + } catch (error) { + await rm(directory, { recursive: true, force: true }); + throw error; + } +} + +async function assertProjectPolicyUpgradePreview( + root: string, + operationId: Ulid, + project: Awaited>, +): Promise { + const directory = projectUpgradePreviewRoot(root, operationId); + const [receiptContent, manifestContent] = await Promise.all([ + readSafePreviewFile(path.join(directory, 'preview.json')), + readSafePreviewFile(path.join(directory, 'schema.json')), + ]); + let receipt: ProjectPolicyUpgradePreviewReceiptV1; + try { + receipt = parseProjectPolicyUpgradePreviewReceipt( + JSON.parse(receiptContent), + ); + } catch (error) { + if (error instanceof SyntaxError) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_INVALID'); + } + throw error; + } + if (project.manifest.manifestVersion !== 1) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_STALE'); + } + const target = buildV2Manifest(project.manifest, operationId); + if ( + receipt.operationId !== operationId || + receipt.projectFingerprint !== project.fingerprint || + receipt.beforeDigest !== digestManifest(project.manifest) || + receipt.afterDigest !== digestManifest(target) || + manifestContent !== serializeSchemaManifest(target) + ) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_STALE'); + } +} + +async function readSafePreviewFile(target: string): Promise { + try { + const stat = await lstat(target); + if (!stat.isFile() || stat.isSymbolicLink()) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_INVALID'); + } + return readFile(target, 'utf8'); + } catch (error) { + if (isNotFound(error)) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_REQUIRED'); + } + throw error; + } +} + +function parseProjectPolicyUpgradePreviewReceipt( + value: unknown, +): ProjectPolicyUpgradePreviewReceiptV1 { + if (typeof value !== 'object' || value === null || Array.isArray(value)) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_INVALID'); + } + const record = value as Record; + const keys = Object.keys(record).sort(); + const expected = [ + 'afterDigest', + 'beforeDigest', + 'createdAt', + 'operationId', + 'projectFingerprint', + 'schemaVersion', + ]; + if ( + keys.length !== expected.length || + keys.some((key, index) => key !== expected[index]) || + record.schemaVersion !== 1 || + typeof record.projectFingerprint !== 'string' || + !/^sha256:[a-f0-9]{64}$/.test(record.projectFingerprint) || + typeof record.beforeDigest !== 'string' || + !/^sha256:[a-f0-9]{64}$/.test(record.beforeDigest) || + typeof record.afterDigest !== 'string' || + !/^sha256:[a-f0-9]{64}$/.test(record.afterDigest) || + typeof record.createdAt !== 'string' || + !Number.isFinite(Date.parse(record.createdAt)) + ) { + throw new Error('MANCODE_PROJECT_UPGRADE_PREVIEW_INVALID'); + } + assertUlid(record.operationId, 'project upgrade preview operationId'); + return { + schemaVersion: 1, + operationId: record.operationId, + projectFingerprint: record.projectFingerprint, + beforeDigest: record.beforeDigest, + afterDigest: record.afterDigest, + createdAt: record.createdAt, + }; +} + +function isNotFound(error: unknown): boolean { + return ( + typeof error === 'object' && + error !== null && + 'code' in error && + error.code === 'ENOENT' + ); +} + +function isAlreadyExists(error: unknown): boolean { + return ( + typeof error === 'object' && + error !== null && + 'code' in error && + error.code === 'EEXIST' + ); +} diff --git a/src/context/reframe.ts b/src/context/reframe.ts new file mode 100644 index 0000000..e6ceb24 --- /dev/null +++ b/src/context/reframe.ts @@ -0,0 +1,753 @@ +import { updateClaim } from '../runtime/claim-store.js'; +import { resolveTaskEntityHomeStore } from '../runtime/entity-home-store.js'; +import type { OperationJournalV1 } from '../runtime/operation-journal.js'; +import { + type TaskArchiveManifestV1, + type TaskArchiveRecoveryAction, + createCheckpointRecoveryAction, + createClaimRecoveryAction, + createTaskArchiveRecoveryAction, + createTaskAuthorityFileRecoveryAction, + createTaskHeadFenceRecoveryAction, + taskArchiveManifest, +} from '../runtime/operation-recovery-payload.js'; +import { + readCheckoutBranch, + readProjectRuntimeContext, +} from '../runtime/project-runtime.js'; +import type { TaskHeadFenceV1 } from '../runtime/task-head-fence.js'; +import { replaceTaskHeadFence } from '../runtime/task-head-store.js'; +import { + type OpenedV3TaskOperation, + advanceTaskOperation, + commitTaskOperation, + createTaskOperationJournal, + handleTaskOperationFailure, + openV3TaskOperation, + readTaskAuthorityFileAtRoot, + serializeTaskAuthority, + taskHeadEntityKey, + writeTaskArchive, + writeTaskAuthorityFile, + writeTaskCheckpoint, +} from '../runtime/task-operation.js'; +import { type CheckpointV1, parseCheckpoint } from '../team/checkpoints.js'; +import { + type ClaimV1, + assertClaimTransition, + parseClaim, +} from '../team/claims.js'; +import { deriveClaimValidity } from '../team/conflicts.js'; +import type { HandoffV1 } from '../team/handoff.js'; +import { + type TaskAggregateManifestV1, + buildTaskAggregateManifest, +} from './aggregate.js'; +import { type Ulid, assertUlid, createUlid } from './ids.js'; +import { + type RequirementsLedgerV1, + assertRequirementsLedgerTransition, + parseRequirementsLedger, + requirementsLedgerDigest, +} from './requirements-ledger.js'; +import type { ReviewLedgerV1 } from './review-ledger.js'; +import { V3ContextStore } from './store.js'; +import { + assertTaskCodeHeadUnchanged, + markTaskReviewStale, + markTaskVerificationStale, + nextTaskHeadFence, + taskMutationExpectedRevisions, +} from './task-mutation.js'; +import { type TaskRef, parseTaskRefValue } from './task-ref.js'; +import type { VerificationLedgerV1 } from './verification-ledger.js'; +import { + type WorkflowMetadataV3, + assertWorkflowMetadataTransition, + parseWorkflowMetadata, +} from './workflow-metadata.js'; + +export interface ReframeV3WorkflowInput { + projectRoot: string; + taskRef: TaskRef; + sessionId: Ulid; + expectedTaskRevision: number; + checkpointId: Ulid; + summary?: string; + nextAction?: string; + operationId?: Ulid; + now?: Date; +} + +export type ReframeArchiveSummary = Pick< + TaskArchiveManifestV1, + | 'archiveId' + | 'taskRef' + | 'sourceTaskRevision' + | 'sourceRequirementsRevision' + | 'sourceRequirementsDigest' + | 'sourcePlanVersion' + | 'sourcePlanDigest' + | 'createdAt' +>; + +export interface ReframedV3Workflow { + metadata: WorkflowMetadataV3; + requirements: RequirementsLedgerV1; + review: ReviewLedgerV1; + verification: VerificationLedgerV1; + checkpoint: CheckpointV1; + releasedClaims: ClaimV1[]; + archive: ReframeArchiveSummary; + aggregate: TaskAggregateManifestV1; + taskHeadFence: TaskHeadFenceV1 | null; + operation: OperationJournalV1; +} + +/** Reopens requirements clarification without losing prior authority evidence. */ +export async function reframeV3Workflow( + input: ReframeV3WorkflowInput, +): Promise { + const taskRef = parseTaskRefValue(input.taskRef); + assertUlid(input.checkpointId, 'reframe checkpointId'); + const now = input.now ?? new Date(); + const operationId = input.operationId ?? createUlid(now.getTime()); + assertUlid(operationId, 'reframe operationId'); + + const opened = await openReframeContext({ + projectRoot: input.projectRoot, + taskRef, + sessionId: input.sessionId, + expectedTaskRevision: input.expectedTaskRevision, + checkpointId: input.checkpointId, + operationId, + now, + }); + const { context, activeClaims, openHandoffs, activeChildren } = opened; + let journal: OperationJournalV1 | null = null; + try { + assertReframeEligible(context, activeClaims, openHandoffs, activeChildren); + assertReframeClaimsFresh(context, activeClaims); + + const timestamp = context.now.toISOString(); + const archivedRequirementsContent = await readTaskAuthorityFileAtRoot( + context.task.location.taskRoot, + 'requirements.json', + ); + if (archivedRequirementsContent === null) { + throw new Error('MANCODE_REFRAME_REQUIREMENTS_MISSING'); + } + const pendingMetadata = markReframeOperationPending( + context.task.metadata, + context.operationId, + timestamp, + ); + const requirements = createReframedRequirements( + context.task.requirements, + context.operationId, + timestamp, + ); + const review = markTaskReviewStale( + context.task.review, + context.operationId, + timestamp, + ); + const verification = markTaskVerificationStale( + context.task.verification, + context.operationId, + timestamp, + ); + const releasedClaims = activeClaims.map((claim) => + releaseClaimForReframe(claim, context.operationId, timestamp), + ); + const archiveAction = createTaskArchiveRecoveryAction({ + stepId: 'archive-requirements-plan', + taskRef, + archiveId: context.operationId, + sourceTaskRevision: context.task.metadata.revision, + sourcePlanVersion: context.task.metadata.governance.planVersion, + createdAt: timestamp, + requirementsContent: archivedRequirementsContent, + planContent: context.task.plan?.content ?? null, + }); + const branch = await readCheckoutBranch(context.projectRoot); + const checkpoint = buildReframeCheckpoint({ + context, + checkpointId: input.checkpointId, + taskRevision: pendingMetadata.revision + 1, + requirements, + review, + verification, + summary: input.summary, + nextAction: input.nextAction, + branch, + timestamp, + }); + const metadata = completeReframeMetadata( + pendingMetadata, + requirements, + review, + verification, + checkpoint, + context.operationId, + timestamp, + ); + const aggregate = buildTaskAggregateManifest({ + metadata, + requirements, + review, + verification, + planDigest: context.task.plan?.digest ?? null, + latestCheckpoint: checkpoint, + }); + const taskHeadFence = nextTaskHeadFence(context, aggregate, timestamp); + + journal = await createTaskOperationJournal(context, { + type: 'reframe', + action: + taskRef.namespace === 'shared' + ? 'shared_metadata_plan_mutation' + : 'local_workflow_mutation', + expectedRevisions: reframeExpectedRevisions( + context, + input.checkpointId, + activeClaims, + ), + recovery: { + actions: [ + createTaskAuthorityFileRecoveryAction({ + stepId: 'mark-task-operation-pending', + taskRef, + fileName: 'metadata.json', + beforeContent: serializeTaskAuthority(context.task.metadata), + targetContent: serializeTaskAuthority(pendingMetadata), + }), + archiveAction, + ...releasedClaims.map((claim, index) => + createClaimRecoveryAction({ + stepId: 'release-active-claims', + before: activeClaims[index] ?? null, + claim, + }), + ), + createTaskAuthorityFileRecoveryAction({ + stepId: 'write-requirements-draft', + taskRef, + fileName: 'requirements.json', + beforeContent: serializeTaskAuthority(context.task.requirements), + targetContent: serializeTaskAuthority(requirements), + }), + createTaskAuthorityFileRecoveryAction({ + stepId: 'mark-review-verification-stale', + taskRef, + fileName: 'review-ledger.json', + beforeContent: serializeTaskAuthority(context.task.review), + targetContent: serializeTaskAuthority(review), + }), + createTaskAuthorityFileRecoveryAction({ + stepId: 'mark-review-verification-stale', + taskRef, + fileName: 'verification-ledger.json', + beforeContent: serializeTaskAuthority(context.task.verification), + targetContent: serializeTaskAuthority(verification), + }), + createCheckpointRecoveryAction({ + stepId: 'write-reframe-checkpoint', + before: null, + checkpoint, + }), + createTaskAuthorityFileRecoveryAction({ + stepId: 'commit-reframed-metadata', + taskRef, + fileName: 'metadata.json', + beforeContent: serializeTaskAuthority(pendingMetadata), + targetContent: serializeTaskAuthority(metadata), + }), + ...(taskHeadFence === null + ? [] + : [ + createTaskHeadFenceRecoveryAction({ + stepId: 'update-task-head-fence', + before: context.coordination.taskHeadFence, + fence: taskHeadFence, + }), + ]), + ], + noOpStepIds: [ + ...(releasedClaims.length === 0 ? ['release-active-claims'] : []), + ...(taskHeadFence === null ? ['update-task-head-fence'] : []), + ], + }, + }); + journal = await advanceTaskOperation(context, journal, 'validate', true); + + journal = await advanceTaskOperation( + context, + journal, + 'mark-task-operation-pending', + false, + ); + await assertReframeCodeHeadUnchanged(context); + await writeTaskAuthorityFile( + context, + 'metadata.json', + serializeTaskAuthority(pendingMetadata), + ); + + journal = await advanceTaskOperation( + context, + journal, + 'archive-requirements-plan', + false, + ); + await assertReframeCodeHeadUnchanged(context); + await writeTaskArchive(context, archiveAction); + + journal = await advanceTaskOperation( + context, + journal, + 'release-active-claims', + false, + ); + await assertReframeCodeHeadUnchanged(context); + for (const [index, claim] of releasedClaims.entries()) { + const previous = activeClaims[index]; + if (previous === undefined) throw new Error('MANCODE_CLAIM_SET_CHANGED'); + await updateClaim(context.homeStore, claim, previous.revision); + } + + journal = await advanceTaskOperation( + context, + journal, + 'write-requirements-draft', + false, + ); + await assertReframeCodeHeadUnchanged(context); + await writeTaskAuthorityFile( + context, + 'requirements.json', + serializeTaskAuthority(requirements), + ); + + journal = await advanceTaskOperation( + context, + journal, + 'mark-review-verification-stale', + false, + ); + await assertReframeCodeHeadUnchanged(context); + await writeTaskAuthorityFile( + context, + 'review-ledger.json', + serializeTaskAuthority(review), + ); + await writeTaskAuthorityFile( + context, + 'verification-ledger.json', + serializeTaskAuthority(verification), + ); + + journal = await advanceTaskOperation( + context, + journal, + 'write-reframe-checkpoint', + false, + ); + await assertReframeCodeHeadUnchanged(context); + await writeTaskCheckpoint(context, checkpoint); + + journal = await advanceTaskOperation( + context, + journal, + 'commit-reframed-metadata', + false, + ); + await assertReframeCodeHeadUnchanged(context); + await writeTaskAuthorityFile( + context, + 'metadata.json', + serializeTaskAuthority(metadata), + ); + + journal = await advanceTaskOperation( + context, + journal, + 'update-task-head-fence', + false, + ); + if (taskHeadFence !== null) { + await assertTaskCodeHeadUnchanged(context.projectRoot, context.codeHead); + await replaceTaskHeadFence(context.homeStore, taskHeadFence); + } + const operation = await commitTaskOperation(context, journal); + const archive = archiveSummary(archiveAction); + return { + metadata, + requirements, + review, + verification, + checkpoint, + releasedClaims, + archive, + aggregate, + taskHeadFence, + operation, + }; + } catch (error) { + if (journal !== null) { + try { + await handleTaskOperationFailure(context, journal); + } catch { + // The journal and recovery payload still block ordinary mutation. + } + } + throw error; + } finally { + await context.release(); + } +} + +interface OpenReframeContextInput { + projectRoot: string; + taskRef: TaskRef; + sessionId: Ulid; + expectedTaskRevision: number; + checkpointId: Ulid; + operationId: Ulid; + now: Date; +} + +interface OpenedReframeContext { + context: OpenedV3TaskOperation; + activeClaims: ClaimV1[]; + openHandoffs: HandoffV1[]; + activeChildren: TaskRef[]; +} + +async function openReframeContext( + input: OpenReframeContextInput, +): Promise { + for (let attempt = 0; attempt < 3; attempt += 1) { + const runtime = await readProjectRuntimeContext(input.projectRoot); + const store = new V3ContextStore(input.projectRoot); + const project = await store.readProjectSnapshot(); + if (project.config.transport.mode !== 'local') { + throw new Error('MANCODE_REFRAME_GIT_REF_UNSUPPORTED'); + } + const homeStore = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + input.taskRef, + ); + const preflight = await store.readCoordinationSnapshot( + input.taskRef, + homeStore, + ); + const preflightClaims = activeTaskClaims(preflight.claims); + const preflightHandoffs = openTaskHandoffs(preflight.handoffs); + const context = await openV3TaskOperation({ + projectRoot: input.projectRoot, + taskRef: input.taskRef, + sessionId: input.sessionId, + expectedTaskRevision: input.expectedTaskRevision, + operationId: input.operationId, + compatibilityOperation: 'reframe', + extraEntityLocks: [ + `archive:${input.operationId}`, + `checkpoint:${input.checkpointId}`, + ...(input.taskRef.namespace === 'shared' + ? [taskHeadEntityKey(input.taskRef)] + : []), + ...preflightClaims.map((claim) => `claim:${claim.claimId}`), + ...preflightHandoffs.map((handoff) => `handoff:${handoff.handoffId}`), + ], + now: input.now, + }); + const lockedClaims = activeTaskClaims(context.coordination.claims); + const lockedHandoffs = openTaskHandoffs(context.coordination.handoffs); + if ( + sameIds( + preflightClaims.map((claim) => claim.claimId), + lockedClaims.map((claim) => claim.claimId), + ) && + sameIds( + preflightHandoffs.map((handoff) => handoff.handoffId), + lockedHandoffs.map((handoff) => handoff.handoffId), + ) + ) { + try { + const activeChildren = await context.store.listActiveChildTaskRefs( + input.taskRef, + ); + return { + context, + activeClaims: lockedClaims, + openHandoffs: lockedHandoffs, + activeChildren, + }; + } catch (error) { + await context.release(); + throw error; + } + } + await context.release(); + } + throw new Error('MANCODE_REFRAME_COORDINATION_SET_CHANGED'); +} + +function assertReframeEligible( + context: OpenedV3TaskOperation, + _claims: ClaimV1[], + openHandoffs: HandoffV1[], + activeChildren: TaskRef[], +): void { + const metadata = context.task.metadata; + if (context.project.config.transport.mode !== 'local') { + throw new Error('MANCODE_REFRAME_GIT_REF_UNSUPPORTED'); + } + if (metadata.workflowMode !== 'man' && metadata.workflowMode !== 'manteam') { + throw new Error('MANCODE_REFRAME_WORKFLOW_MODE_INVALID'); + } + if (!['in_progress', 'planned', 'blocked'].includes(metadata.status)) { + throw new Error('MANCODE_REFRAME_WORKFLOW_NOT_ACTIVE'); + } + if (metadata.ownerActorId !== context.session.actorId) { + throw new Error('MANCODE_TASK_OWNER_REQUIRED'); + } + if (activeChildren.length > 0) { + throw new Error('MANCODE_REFRAME_ACTIVE_CHILD'); + } + if (openHandoffs.length > 0) { + throw new Error('MANCODE_REFRAME_OPEN_HANDOFF'); + } + if (metadata.soloExecution !== null) { + throw new Error('MANCODE_REFRAME_ACTIVE_SOLO'); + } + if (context.task.requirements.status !== 'confirmed') { + throw new Error('MANCODE_REFRAME_REQUIREMENTS_NOT_CONFIRMED'); + } +} + +function assertReframeClaimsFresh( + context: OpenedV3TaskOperation, + claims: ClaimV1[], +): void { + if (claims.length === 0) return; + const codeHead = context.codeHead; + if (codeHead === null) + throw new Error('MANCODE_TASK_HEAD_CODE_REF_UNAVAILABLE'); + for (const claim of claims) { + const validity = deriveClaimValidity(claim, { + taskRef: context.taskRef, + taskRevision: context.task.metadata.revision, + implementationScopeDigest: + context.task.metadata.implementationScope.digest, + ownershipEpoch: context.task.metadata.ownershipEpoch, + codeRefHead: codeHead, + now: context.now, + transportFreshness: 'fresh', + }); + if (validity !== 'fresh') { + throw new Error('MANCODE_CLAIM_REVALIDATION_REQUIRED'); + } + } +} + +function activeTaskClaims(claims: ClaimV1[]): ClaimV1[] { + return claims + .filter((claim) => claim.state === 'active') + .sort((left, right) => left.claimId.localeCompare(right.claimId)); +} + +function openTaskHandoffs(handoffs: HandoffV1[]): HandoffV1[] { + return handoffs + .filter( + (handoff) => handoff.state === 'draft' || handoff.state === 'offered', + ) + .sort((left, right) => left.handoffId.localeCompare(right.handoffId)); +} + +function sameIds(left: string[], right: string[]): boolean { + return ( + left.length === right.length && + left.every((value, index) => value === right[index]) + ); +} + +function markReframeOperationPending( + previous: WorkflowMetadataV3, + operationId: Ulid, + updatedAt: string, +): WorkflowMetadataV3 { + const next = parseWorkflowMetadata({ + ...previous, + revision: previous.revision + 1, + transitionState: 'operation_pending', + lastOperationId: operationId, + updatedAt, + }); + assertWorkflowMetadataTransition(previous, next, 'ordinary'); + return next; +} + +function createReframedRequirements( + previous: RequirementsLedgerV1, + operationId: Ulid, + updatedAt: string, +): RequirementsLedgerV1 { + const draft: RequirementsLedgerV1 = { + ...previous, + revision: previous.revision + 1, + status: 'draft', + contentDigest: '', + lastOperationId: operationId, + updatedAt, + }; + const next = parseRequirementsLedger({ + ...draft, + contentDigest: requirementsLedgerDigest(draft), + }); + assertRequirementsLedgerTransition(previous, next); + return next; +} + +function releaseClaimForReframe( + previous: ClaimV1, + operationId: Ulid, + updatedAt: string, +): ClaimV1 { + const next = parseClaim({ + ...previous, + state: 'released', + revision: previous.revision + 1, + lastOperationId: operationId, + updatedAt, + }); + assertClaimTransition(previous, next); + return next; +} + +function buildReframeCheckpoint(input: { + context: OpenedV3TaskOperation; + checkpointId: Ulid; + taskRevision: number; + requirements: RequirementsLedgerV1; + review: ReviewLedgerV1; + verification: VerificationLedgerV1; + summary?: string; + nextAction?: string; + branch: string | null; + timestamp: string; +}): CheckpointV1 { + return parseCheckpoint({ + schemaVersion: 1, + checkpointId: input.checkpointId, + operationId: input.context.operationId, + taskRef: input.context.taskRef, + taskRevision: input.taskRevision, + ownershipEpochAtOffer: input.context.task.metadata.ownershipEpoch, + kind: 'requirements_reframed', + git: { + branch: input.branch, + head: input.context.codeHead, + base: input.context.task.metadata.base?.head ?? null, + }, + summary: + input.summary ?? + 'Archived the previous requirements and plan before reopening clarification.', + governance: { + requirementsDigest: input.requirements.contentDigest, + planVersion: input.context.task.metadata.governance.planVersion, + reviewLedgerDigest: input.review.contentDigest, + verificationLedgerDigest: input.verification.contentDigest, + }, + nextAction: + input.nextAction ?? + 'Clarify the reframed requirements before revising the plan.', + createdBy: { + actorId: input.context.session.actorId, + client: input.context.session.client, + }, + createdAt: input.timestamp, + }); +} + +function completeReframeMetadata( + previous: WorkflowMetadataV3, + requirements: RequirementsLedgerV1, + review: ReviewLedgerV1, + verification: VerificationLedgerV1, + checkpoint: CheckpointV1, + operationId: Ulid, + updatedAt: string, +): WorkflowMetadataV3 { + const next = parseWorkflowMetadata({ + ...previous, + status: 'in_progress', + currentStep: 2, + blockingReason: null, + revision: previous.revision + 1, + transitionState: 'stable', + lastOperationId: operationId, + governance: { + ...previous.governance, + requirementsStatus: 'needs_clarification', + requirementsDigest: requirements.contentDigest, + planDecision: null, + reviewStatus: review.status, + reviewLedgerDigest: review.contentDigest, + verificationStatus: verification.status, + verificationLedgerDigest: verification.contentDigest, + }, + latestCheckpointRef: { + taskRef: checkpoint.taskRef, + kind: 'checkpoint', + artifactId: checkpoint.checkpointId, + }, + updatedAt, + }); + assertWorkflowMetadataTransition(previous, next, 'ordinary'); + return next; +} + +function reframeExpectedRevisions( + context: OpenedV3TaskOperation, + checkpointId: Ulid, + claims: ClaimV1[], +): Record { + const expected = taskMutationExpectedRevisions(context, [ + 'requirements', + 'plan', + 'review', + 'verification', + ]); + expected[`archive:${context.operationId}`] = 0; + expected[`checkpoint:${checkpointId}`] = 0; + for (const claim of claims) { + expected[`claim:${claim.claimId}`] = claim.revision; + } + return expected; +} + +async function assertReframeCodeHeadUnchanged( + context: OpenedV3TaskOperation, +): Promise { + if (context.taskRef.namespace === 'shared') { + await assertTaskCodeHeadUnchanged(context.projectRoot, context.codeHead); + } +} + +function archiveSummary( + action: TaskArchiveRecoveryAction, +): ReframeArchiveSummary { + const manifest = taskArchiveManifest(action); + return { + archiveId: manifest.archiveId, + taskRef: manifest.taskRef, + sourceTaskRevision: manifest.sourceTaskRevision, + sourceRequirementsRevision: manifest.sourceRequirementsRevision, + sourceRequirementsDigest: manifest.sourceRequirementsDigest, + sourcePlanVersion: manifest.sourcePlanVersion, + sourcePlanDigest: manifest.sourcePlanDigest, + createdAt: manifest.createdAt, + }; +} diff --git a/src/context/resolver.ts b/src/context/resolver.ts index d1431ce..ba993a1 100644 --- a/src/context/resolver.ts +++ b/src/context/resolver.ts @@ -15,6 +15,7 @@ import type { TaskAggregateManifestV1 } from './aggregate.js'; import { digestCanonicalJson } from './canonical.js'; import { type CompatibilityFailureCode, + type WriterCapability, evaluateCompatibilityGate, } from './compatibility.js'; import { @@ -69,7 +70,8 @@ export interface ContextResolverCompatibility { expectedSchemaEpoch: string; readerVersion: string; writerVersion: string; - adapterVersions: Record; + writerCapabilities: readonly WriterCapability[]; + adapterVersions: Partial>; } export interface ContextResolveRequest { @@ -205,6 +207,7 @@ export class ContextResolver { expectedSchemaEpoch: request.compatibility.expectedSchemaEpoch, readerVersion: request.compatibility.readerVersion, writerVersion: request.compatibility.writerVersion, + writerCapabilities: request.compatibility.writerCapabilities, adapterVersions: request.compatibility.adapterVersions, currentLegacyBaseline: snapshot.legacy.baseline, legacyAuthorityPresent: snapshot.legacy.authorityPresent, diff --git a/src/context/store.ts b/src/context/store.ts index b4a1531..88bc920 100644 --- a/src/context/store.ts +++ b/src/context/store.ts @@ -40,7 +40,7 @@ import { listConfirmedDecisions, } from './confirmed-decision.js'; import { assertUlid } from './ids.js'; -import { type SchemaManifestV1, parseSchemaManifest } from './manifest.js'; +import { type SchemaManifest, parseSchemaManifest } from './manifest.js'; import { type ParentSnapshotSource, parentSnapshotStaleReasons, @@ -88,7 +88,7 @@ export interface StoredTaskSnapshot { } export interface StoredProjectSnapshot { - manifest: SchemaManifestV1; + manifest: SchemaManifest; config: ProjectConfigV1; policy: TeamPolicyV1; projectFacts: ProjectFactsV1 | null; diff --git a/src/context/task-head-reconcile.ts b/src/context/task-head-reconcile.ts index 28b1a92..46ffbb8 100644 --- a/src/context/task-head-reconcile.ts +++ b/src/context/task-head-reconcile.ts @@ -39,7 +39,7 @@ import { taskAggregateDigest, } from './aggregate.js'; import { type Ulid, assertUlid, createUlid } from './ids.js'; -import type { SchemaManifestV1 } from './manifest.js'; +import type { SchemaManifest } from './manifest.js'; import { type StoredTaskSnapshot, V3ContextStore } from './store.js'; import { assertTaskCodeHeadUnchanged } from './task-mutation.js'; import { type TaskRef, parseTaskRefValue, sameTaskRef } from './task-ref.js'; @@ -434,7 +434,7 @@ async function assertRemoteTaskUnpublished(input: { projectRoot: string; taskRef: TaskRef; config: ProjectConfigV1; - manifest: SchemaManifestV1; + manifest: SchemaManifest; }): Promise { if (input.config.transport.mode !== 'git-ref') return; const snapshot = await createGitRefTeamManifestStore( diff --git a/src/context/workflow-create.ts b/src/context/workflow-create.ts index 558d440..90ea0b2 100644 --- a/src/context/workflow-create.ts +++ b/src/context/workflow-create.ts @@ -7,11 +7,15 @@ import { writeFile, } from 'node:fs/promises'; import path from 'node:path'; +import { inspectV3AdapterVersions } from '../installers/v3-adapter.js'; import { type EntityHomeStore, resolveTaskEntityHomeStore, } from '../runtime/entity-home-store.js'; -import { acquireEntityLocks } from '../runtime/local-lock.js'; +import { + type LocalLockHandle, + acquireEntityLocks, +} from '../runtime/local-lock.js'; import { armOperationCrashAfterVisibleWrite, throwIfDeferredOperationCrashInjected, @@ -41,6 +45,7 @@ import { readCheckoutCodeHead, readProjectRuntimeContext, } from '../runtime/project-runtime.js'; +import { acquireProjectWriteBarrier } from '../runtime/project-write-barrier.js'; import { completeProjectionIntent, enqueueSessionPointerProjection, @@ -65,13 +70,17 @@ import { taskAggregateDigest, } from './aggregate.js'; import { digestCanonicalJson, sortUtf8StringSet } from './canonical.js'; -import { assertCompatibilityGate } from './compatibility.js'; +import { + CURRENT_WRITER_CAPABILITIES, + assertCompatibilityGate, +} from './compatibility.js'; import { type WorkflowCreationResolution, resolveWorkflowCreation, } from './creation-resolution.js'; import { type Ulid, assertUlid, createUlid } from './ids.js'; import { scanLegacyAuthority } from './layout.js'; +import { managedAdapterNames } from './manifest.js'; import type { ParentSnapshot } from './parent-snapshot.js'; import { type RequirementsLedgerV1, @@ -178,16 +187,21 @@ export async function createV3Workflow( const runtime = await readProjectRuntimeContext(projectRoot); const contextStore = new V3ContextStore(projectRoot); - const [project, legacy] = await Promise.all([ - contextStore.readProjectSnapshot(), + const project = await contextStore.readProjectSnapshot(); + const [legacy, adapterVersions] = await Promise.all([ scanLegacyAuthority(projectRoot), + inspectV3AdapterVersions( + projectRoot, + managedAdapterNames(project.manifest.managedAdapters), + ), ]); assertCompatibilityGate({ manifest: project.manifest, expectedSchemaEpoch: project.manifest.epoch, readerVersion: VERSION, writerVersion: VERSION, - adapterVersions: project.manifest.managedAdapters, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, + adapterVersions, currentLegacyBaseline: legacy.baseline, legacyAuthorityPresent: legacy.authorityPresent, operation: 'v3_business_write', @@ -259,6 +273,12 @@ export async function createV3Workflow( ? 0 : 1, timestamp, + planningPolicyVersion: + parent === null + ? project.manifest.manifestVersion === 2 + ? project.manifest.workflowPolicyDefaults.planning + : 1 + : parent.metadata.governance.policyVersions.planning, }); const homeStore = resolveTaskEntityHomeStore( runtime.entityHomeStoreContext, @@ -341,22 +361,34 @@ export async function createV3Workflow( assertOperationRecoveryPayloadCoversJournal(operation, recoveryPayload); assertOperationJournalMatchesDefinition(operation); - const taskParent = await ensureSafeTaskParent(projectRoot, taskRef); - const targetDirectory = path.join(taskParent, taskRef.taskId); - const stagingDirectory = path.join( - taskParent, - `.${taskRef.taskId}.${operationId}.staging`, - ); - const locks = await acquireEntityLocks( - homeStore, + const projectBarrier = await acquireProjectWriteBarrier( + runtime, operationId, - operation.entityLocks, - { now }, + now, ); + let projectBarrierReleased = false; + let locks: LocalLockHandle[] = []; + let stagingDirectory: string | null = null; let journal = operation; let journalCreated = false; let sessionProjectionId: string | null = null; try { + const lockedProject = await contextStore.readProjectSnapshot(); + if (lockedProject.fingerprint !== project.fingerprint) { + throw new Error('MANCODE_REVISION_CONFLICT'); + } + const taskParent = await ensureSafeTaskParent(projectRoot, taskRef); + const targetDirectory = path.join(taskParent, taskRef.taskId); + stagingDirectory = path.join( + taskParent, + `.${taskRef.taskId}.${operationId}.staging`, + ); + locks = await acquireEntityLocks( + homeStore, + operationId, + operation.entityLocks, + { now }, + ); if (taskRef.namespace === 'shared') { await assertTransportCoordinationWriteAllowed(homeStore, project.config); } @@ -396,6 +428,8 @@ export async function createV3Workflow( await writeOperationRecoveryPayload(homeStore, recoveryPayload); journal = await createPreparedOperationJournal(homeStore, journal); journalCreated = true; + await projectBarrier.release(); + projectBarrierReleased = true; throwIfOperationCrashInjected('workflow_create', 'prepared'); journal = await advanceJournal(homeStore, journal, 'validate', now, true); @@ -441,7 +475,7 @@ export async function createV3Workflow( try { if (hasBusinessWriteIntent(journal)) { await markRepairRequired(homeStore, journal, now); - } else { + } else if (stagingDirectory !== null) { await abortPreparedCreate(homeStore, journal, stagingDirectory, now); } } catch { @@ -451,9 +485,10 @@ export async function createV3Workflow( } throw error; } finally { - await Promise.allSettled( - [...locks].reverse().map((lock) => lock.release()), - ); + await Promise.allSettled([ + ...[...locks].reverse().map((lock) => lock.release()), + ...(projectBarrierReleased ? [] : [projectBarrier.release()]), + ]); } let sessionResumed = true; @@ -630,6 +665,7 @@ function buildInitialEntities(input: { explicitScope: WorkflowCreateScope | undefined; ownershipEpoch: number; timestamp: string; + planningPolicyVersion: number | null; }): InitialEntities { const scope = initialScope(input.parent, input.explicitScope); const requirementsDraft: RequirementsLedgerV1 = { @@ -739,7 +775,11 @@ function buildInitialEntities(input: { requirementsDigest: requirements.contentDigest, planVersion: 1, planDecision: null, - policyVersions: { planning: 1, review: 1, verification: 1 }, + policyVersions: { + planning: input.planningPolicyVersion, + review: 1, + verification: 1, + }, reviewStatus: review.status, reviewLedgerDigest: review.contentDigest, verificationStatus: verification.status, diff --git a/src/context/workflow-metadata.ts b/src/context/workflow-metadata.ts index 9368bea..609d096 100644 --- a/src/context/workflow-metadata.ts +++ b/src/context/workflow-metadata.ts @@ -49,6 +49,30 @@ export type PlanDecision = | 'governed_execution' | null; +export type WorkflowPolicyComponent = 'planning' | 'review' | 'verification'; + +export const SUPPORTED_WORKFLOW_POLICY_VERSIONS = { + planning: [1, 2], + review: [1, 2], + verification: [1], +} as const; + +export class WorkflowPolicyVersionUnsupportedError extends Error { + readonly code = 'MANCODE_POLICY_VERSION_UNSUPPORTED' as const; + + constructor( + readonly component: WorkflowPolicyComponent, + readonly observedVersion: unknown, + readonly supportedVersions: readonly number[], + readonly requiredWriter: string, + ) { + super( + `MANCODE_POLICY_VERSION_UNSUPPORTED: component=${component} observed=${String(observedVersion)} supported=${supportedVersions.join(',')} requiredWriter=${requiredWriter}`, + ); + this.name = 'WorkflowPolicyVersionUnsupportedError'; + } +} + export interface WorkflowMetadataV3 { schemaVersion: 3; taskRef: TaskRef; @@ -588,21 +612,33 @@ function parsePolicyVersions( 'workflow metadata policyVersions', ); return { - planning: parsePositiveIntegerOrNull( - value.planning, - 'workflow metadata planning policy version', - ), - review: parsePositiveIntegerOrNull( - value.review, - 'workflow metadata review policy version', - ), - verification: parsePositiveIntegerOrNull( - value.verification, - 'workflow metadata verification policy version', - ), + planning: parsePolicyVersionOrNull(value.planning, 'planning'), + review: parsePolicyVersionOrNull(value.review, 'review'), + verification: parsePolicyVersionOrNull(value.verification, 'verification'), }; } +function parsePolicyVersionOrNull( + value: unknown, + component: WorkflowPolicyComponent, +): number | null { + if (value === null) return null; + const supported = SUPPORTED_WORKFLOW_POLICY_VERSIONS[component]; + if ( + typeof value !== 'number' || + !Number.isSafeInteger(value) || + !supported.some((version) => version === value) + ) { + throw new WorkflowPolicyVersionUnsupportedError( + component, + value, + supported, + component === 'planning' && value === 2 ? '0.4.0' : '>0.4.0', + ); + } + return value; +} + function parsePlanDecision(value: unknown): PlanDecision { if (value === null) return null; if ( @@ -861,13 +897,6 @@ function parsePositiveInteger(value: unknown, label: string): number { return value; } -function parsePositiveIntegerOrNull( - value: unknown, - label: string, -): number | null { - return value === null ? null : parsePositiveInteger(value, label); -} - function parseNonNegativeInteger(value: unknown, label: string): number { if (typeof value !== 'number' || !Number.isSafeInteger(value) || value < 0) { throw new Error(`${label} must be a non-negative integer`); diff --git a/src/installers/adapter-upgrade.ts b/src/installers/adapter-upgrade.ts new file mode 100644 index 0000000..b28d46a --- /dev/null +++ b/src/installers/adapter-upgrade.ts @@ -0,0 +1,831 @@ +import { + lstat, + mkdir, + readFile, + rename, + rm, + writeFile, +} from 'node:fs/promises'; +import path from 'node:path'; +import { digestCanonicalJson } from '../context/canonical.js'; +import { assertCompatibilityGate } from '../context/compatibility.js'; +import { type Ulid, assertUlid, createUlid } from '../context/ids.js'; +import { scanLegacyAuthority } from '../context/layout.js'; +import { + type SchemaManifest, + assertSchemaManifestTransition, + managedAdapterNames, + parseSchemaManifest, + serializeSchemaManifest, +} from '../context/manifest.js'; +import { V3ContextStore } from '../context/store.js'; +import { assertKnownKeys, assertRecord } from '../context/validation.js'; +import { resolveLocalEntityHomeStore } from '../runtime/entity-home-store.js'; +import { + type LocalLockHandle, + acquireOperationEntityLocks, +} from '../runtime/local-lock.js'; +import { + armOperationCrashAfterVisibleWrite, + throwIfDeferredOperationCrashInjected, + throwIfOperationCrashInjected, +} from '../runtime/operation-crash-injection.js'; +import { assertOperationJournalMatchesDefinition } from '../runtime/operation-definition.js'; +import type { OperationJournalV1 } from '../runtime/operation-journal.js'; +import { listUnfinishedOperationRecoveries } from '../runtime/operation-recovery-executor.js'; +import { + assertOperationRecoveryPayloadCoversJournal, + createProjectAuthorityFileRecoveryAction, + createV3AdapterFileRecoveryAction, + operationRecoveryPayloadDigest, + parseOperationRecoveryPayload, +} from '../runtime/operation-recovery-payload.js'; +import { writeOperationRecoveryPayload } from '../runtime/operation-recovery-store.js'; +import { + createPreparedOperationJournal, + updateOperationJournal, +} from '../runtime/operation-store.js'; +import { readProjectRuntimeContext } from '../runtime/project-runtime.js'; +import { type SessionStateV1, readSession } from '../runtime/session.js'; +import { createAuthorizationBasis } from '../team/authorization.js'; +import { capabilitiesFromProjectConfig } from '../team/transport.js'; +import { VERSION } from '../version.js'; +import type { PlatformName } from './registry.js'; +import { + type V3AdapterContentStatus, + type V3AdapterFilePlan, + type V3AdapterManagedTargetStatus, + type V3PlatformAdapterStatus, + V3_ADAPTER_PLATFORMS, + V3_ADAPTER_VERSION, + adapterManagedContentDigest, + applyV3AdapterFilePlan, + inspectV3Adapter, + planV3AdapterUpgradeFiles, + stageV3AdapterUpgradeFiles, +} from './v3-adapter.js'; + +export interface AdapterUpgradeInput { + projectRoot: string; + platforms: readonly PlatformName[]; + dryRun?: boolean; + explicitConfirmation?: boolean; + sessionId?: Ulid; + operationId?: Ulid; + now?: Date; +} + +export interface AdapterUpgradeChange { + platform: PlatformName; + identity: string; + target: string; + status: V3AdapterContentStatus; + actualDigest: string | null; + expectedDigest: string; + rendererVersion: string; + repair: string; +} + +export interface AdapterUpgradeResult { + schemaVersion: 1; + operation: 'adapter_upgrade'; + operationId: Ulid; + platforms: PlatformName[]; + dryRun: boolean; + state: 'preview' | 'already_ready' | 'committed'; + changes: AdapterUpgradeChange[]; + filePlans: Array<{ + target: string; + beforeDigest: string | null; + targetDigest: string; + }>; + stagedTargets: string[]; + manifest: { + changed: boolean; + beforeVersion: 1 | 2; + targetVersion: 1 | 2; + }; + status: Record; + journal: OperationJournalV1 | null; +} + +interface AdapterUpgradePreviewV1 { + schemaVersion: 1; + operationId: Ulid; + platforms: PlatformName[]; + projectFingerprint: string; + plansDigest: string; + manifestTargetDigest: string; + stagedTargets: string[]; + createdAt: string; +} + +/** Performs a read-only preview or journaled local adapter repair. */ +export async function upgradeV3Adapters( + input: AdapterUpgradeInput, +): Promise { + const root = path.resolve(input.projectRoot); + const platforms = normalizePlatforms(input.platforms); + const operationIdProvided = input.operationId !== undefined; + const operationId = + input.operationId ?? createUlid((input.now ?? new Date()).getTime()); + assertUlid(operationId, 'adapter upgrade operationId'); + const now = input.now ?? new Date(); + const dryRun = input.dryRun === true; + const projectRuntime = await readProjectRuntimeContext(root); + const store = new V3ContextStore(root); + const [project, legacy, unfinished] = await Promise.all([ + store.readProjectSnapshot(), + scanLegacyAuthority(root), + listUnfinishedOperationRecoveries(root), + ]); + if (unfinished.length > 0) { + throw new Error('MANCODE_ADAPTER_UPGRADE_OPERATION_PENDING'); + } + const actualVersions = await import('./v3-adapter.js').then( + ({ inspectV3AdapterVersions }) => + inspectV3AdapterVersions( + root, + managedAdapterNames(project.manifest.managedAdapters), + ), + ); + assertCompatibilityGate({ + manifest: project.manifest, + expectedSchemaEpoch: project.manifest.epoch, + readerVersion: VERSION, + writerVersion: VERSION, + writerCapabilities: [ + 'planning-policy:1', + 'planning-policy:2', + 'adapter-digest:1', + 'reframe-local:1', + ], + adapterVersions: actualVersions, + currentLegacyBaseline: legacy.baseline, + legacyAuthorityPresent: legacy.authorityPresent, + operation: 'adapter_upgrade', + }); + const statusEntries = await Promise.all( + platforms.map( + async (platform) => + [platform, await inspectV3Adapter(root, platform)] as const, + ), + ); + const status = Object.fromEntries(statusEntries) as Record< + PlatformName, + V3PlatformAdapterStatus + >; + const changes = statusEntries.flatMap(([platform, adapter]) => + adapter.targets + .filter((target) => target.status !== 'ready') + .map((target) => changeFor(platform, target)), + ); + const plans = await planV3AdapterUpgradeFiles(root, platforms); + const manifestTarget = targetManifest( + project.manifest, + platforms, + operationId, + ); + const manifestChanged = manifestTarget !== null; + const previewCandidate = adapterUpgradePreview({ + operationId, + platforms, + projectFingerprint: project.fingerprint, + plans, + manifestTarget: manifestTarget ?? project.manifest, + stagedTargets: [], + now, + }); + let stagedTargets: string[] = []; + if (dryRun) { + const existingPreview = await readAdapterUpgradePreview(root, operationId); + if (existingPreview === null) { + const staged = await stageV3AdapterUpgradeFiles(root, operationId, plans); + stagedTargets = staged.map((item) => item.stagingTarget); + await writeAdapterUpgradePreview(root, { + ...previewCandidate, + stagedTargets, + }); + } else { + assertAdapterUpgradePreviewMatches(existingPreview, previewCandidate); + await assertStagedAdapterFiles(root, existingPreview, plans); + stagedTargets = existingPreview.stagedTargets; + } + } + const resultBase = { + schemaVersion: 1 as const, + operation: 'adapter_upgrade' as const, + operationId, + platforms, + dryRun, + changes, + filePlans: plans.map((plan) => ({ + target: plan.target, + beforeDigest: + plan.beforeContent === null + ? null + : adapterManagedContentDigest(plan.target, plan.beforeContent), + targetDigest: adapterManagedContentDigest( + plan.target, + plan.targetContent, + ), + })), + stagedTargets, + manifest: { + changed: manifestChanged, + beforeVersion: project.manifest.manifestVersion, + targetVersion: + manifestTarget?.manifestVersion ?? project.manifest.manifestVersion, + }, + status, + }; + if (dryRun) { + return { ...resultBase, state: 'preview', journal: null }; + } + if (plans.length === 0 && !manifestChanged) { + return { ...resultBase, state: 'already_ready', journal: null }; + } + if (input.explicitConfirmation !== true) { + throw new Error('MANCODE_EXPLICIT_CONFIRMATION_REQUIRED'); + } + if (!operationIdProvided) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_REQUIRED'); + } + if (input.sessionId === undefined) { + throw new Error('MANCODE_SESSION_REQUIRED'); + } + assertUlid(input.sessionId, 'adapter upgrade sessionId'); + const session = await readSession(root, input.sessionId); + if (session === null || session.status !== 'active') { + throw new Error('MANCODE_SESSION_NOT_FOUND'); + } + const preview = await readAdapterUpgradePreview(root, operationId); + if (preview === null) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_REQUIRED'); + } + assertAdapterUpgradePreviewMatches(preview, previewCandidate); + await assertStagedAdapterFiles(root, preview, plans); + resultBase.stagedTargets = preview.stagedTargets; + const journalResult = await commitAdapterUpgrade({ + root, + runtime: projectRuntime, + project, + platforms, + plans, + manifestTarget, + session, + operationId, + now, + }); + const finalEntries = await Promise.all( + platforms.map( + async (platform) => + [platform, await inspectV3Adapter(root, platform)] as const, + ), + ); + return { + ...resultBase, + state: 'committed', + status: Object.fromEntries(finalEntries) as Record< + PlatformName, + V3PlatformAdapterStatus + >, + journal: journalResult, + }; +} + +async function commitAdapterUpgrade(input: { + root: string; + runtime: Awaited>; + project: Awaited>; + platforms: PlatformName[]; + plans: V3AdapterFilePlan[]; + manifestTarget: SchemaManifest | null; + session: SessionStateV1; + operationId: Ulid; + now: Date; +}): Promise { + const localStore = resolveLocalEntityHomeStore( + input.runtime.entityHomeStoreContext, + ); + const adapterTargets = new Set(); + for (const platform of input.platforms) { + adapterTargets.add(`adapter:${primaryTargetForPlatform(platform)}`); + for (const mode of ['manba', 'man', 'manteam', 'manps', 'mansolo']) { + adapterTargets.add(`adapter:${modeTargetForPlatform(platform, mode)}`); + } + } + for (const plan of input.plans) adapterTargets.add(`adapter:${plan.target}`); + const entityLocks = [...adapterTargets].sort(compareUtf8); + const expectedRevisions: Record = Object.fromEntries( + entityLocks.map((key) => [key, 0]), + ); + if (input.manifestTarget !== null) { + entityLocks.push('schema:project'); + entityLocks.sort(compareUtf8); + expectedRevisions['schema:project'] = + input.project.manifest.manifestVersion; + } + const authorizationBasis = createAuthorizationBasis( + { + action: 'project_maintenance', + actorId: input.session.actorId, + session: { + sessionId: input.session.sessionId, + actorId: input.session.actorId, + status: input.session.status, + }, + joined: false, + sharedWriteGuard: capabilitiesFromProjectConfig(input.project.config) + .writeGuard, + task: null, + claim: null, + handoff: null, + evidence: null, + profileActorId: null, + conditions: { + expectedRevisionMatches: true, + explicitConfirmation: true, + }, + }, + input.now, + ); + const manifestAction = + input.manifestTarget === null + ? null + : createProjectAuthorityFileRecoveryAction({ + stepId: 'update-adapter-inventory', + fileName: 'schema.json', + beforeContent: serializeSchemaManifest(input.project.manifest), + targetContent: serializeSchemaManifest(input.manifestTarget), + }); + const payload = parseOperationRecoveryPayload({ + schemaVersion: 1, + operationId: input.operationId, + type: 'adapter_upgrade', + primaryStoreId: localStore.storeId, + actions: [ + ...input.plans.map((plan) => + createV3AdapterFileRecoveryAction({ + stepId: 'replace-managed-adapters', + target: plan.target, + beforeContent: plan.beforeContent, + targetContent: plan.targetContent, + }), + ), + ...(manifestAction === null ? [] : [manifestAction]), + ], + noOpStepIds: [ + ...(input.plans.length === 0 ? ['replace-managed-adapters'] : []), + ...(manifestAction === null ? ['update-adapter-inventory'] : []), + ], + }); + let journal: OperationJournalV1 = { + schemaVersion: 1, + operationId: input.operationId, + type: 'adapter_upgrade', + state: 'prepared', + primaryStoreId: localStore.storeId, + checkoutId: input.runtime.checkoutId, + secondaryReservations: [], + actorId: input.session.actorId, + sessionId: input.session.sessionId, + authorizationBasis, + recoveryPayloadDigest: operationRecoveryPayloadDigest(payload), + entityLocks, + expectedRevisions, + steps: [ + 'validate', + 'replace-managed-adapters', + 'update-adapter-inventory', + 'verify', + 'commit', + ].map((id) => ({ id, state: 'pending' as const })), + startedAt: input.now.toISOString(), + updatedAt: input.now.toISOString(), + }; + assertOperationJournalMatchesDefinition(journal); + assertOperationRecoveryPayloadCoversJournal(journal, payload); + const locks = await acquireOperationEntityLocks( + input.operationId, + [{ store: localStore, entityLockKeys: entityLocks }], + { now: input.now }, + ); + let durable = false; + try { + const lockedProject = await new V3ContextStore( + input.root, + ).readProjectSnapshot(); + const lockedPlans = await planV3AdapterUpgradeFiles( + input.root, + input.platforms, + ); + if ( + lockedProject.fingerprint !== input.project.fingerprint || + JSON.stringify(lockedPlans) !== JSON.stringify(input.plans) + ) { + throw new Error('MANCODE_REVISION_CONFLICT'); + } + await writeOperationRecoveryPayload(localStore, payload); + await createPreparedOperationJournal(localStore, journal); + durable = true; + throwIfOperationCrashInjected('adapter_upgrade', 'prepared'); + journal = await completeAdapterStep( + localStore, + journal, + 'validate', + input.now, + ); + journal = await completeAdapterStep( + localStore, + journal, + 'replace-managed-adapters', + input.now, + ); + for (const plan of input.plans) { + await renewLocks(locks); + await applyV3AdapterFilePlan(input.root, plan); + throwIfOperationCrashInjected( + 'adapter_upgrade', + `replace-managed-adapters:${plan.target}`, + ); + } + journal = await completeAdapterStep( + localStore, + journal, + 'update-adapter-inventory', + input.now, + ); + if (input.manifestTarget !== null) { + await writeSchemaManifest(input.root, input.manifestTarget); + } + journal = await completeAdapterStep( + localStore, + journal, + 'verify', + input.now, + ); + const verified = await Promise.all( + input.platforms.map((platform) => inspectV3Adapter(input.root, platform)), + ); + if (verified.some((status) => !status.ready)) { + throw new Error('MANCODE_ADAPTER_CONTENT_STALE'); + } + if (input.manifestTarget !== null) { + const after = await new V3ContextStore(input.root).readProjectSnapshot(); + if (after.manifest.lastOperationId !== input.operationId) { + throw new Error('MANCODE_ADAPTER_MANIFEST_VERIFY_FAILED'); + } + } + journal = await completeAdapterStep( + localStore, + journal, + 'commit', + input.now, + true, + ); + return journal; + } catch (error) { + if ( + durable && + journal.state !== 'committed' && + journal.state !== 'aborted' + ) { + const hasWriteIntent = journal.steps.some((step) => + step.id === 'replace-managed-adapters' || + step.id === 'update-adapter-inventory' + ? step.state === 'completed' + : false, + ); + await updateOperationJournal( + localStore, + { + ...journal, + state: hasWriteIntent ? 'repair_required' : 'aborted', + updatedAt: input.now.toISOString(), + }, + { canAbort: !hasWriteIntent }, + ).catch(() => undefined); + } + throw error; + } finally { + await Promise.allSettled(locks.map((lock) => lock.release())); + } +} + +async function completeAdapterStep( + store: ReturnType, + previous: OperationJournalV1, + stepId: string, + now: Date, + commit = false, +): Promise { + throwIfDeferredOperationCrashInjected(previous.type); + const index = previous.steps.findIndex((step) => step.id === stepId); + if (index < 0 || previous.steps[index]?.state === 'completed') { + throw new Error('MANCODE_OPERATION_STEP_INVALID'); + } + if ( + previous.steps.slice(0, index).some((step) => step.state !== 'completed') + ) { + throw new Error('MANCODE_OPERATION_STEP_ORDER_INVALID'); + } + const next: OperationJournalV1 = { + ...previous, + state: commit ? 'committed' : 'applying', + steps: previous.steps.map((step, current) => + current === index ? { ...step, state: 'completed' as const } : step, + ), + updatedAt: now.toISOString(), + }; + const updated = await updateOperationJournal(store, next, { + canAbort: !commit && index === 0, + }); + if (commit) { + throwIfOperationCrashInjected(previous.type, 'commit'); + } else { + const definitionWrite = + stepId === 'replace-managed-adapters' || + stepId === 'update-adapter-inventory'; + if (definitionWrite) { + armOperationCrashAfterVisibleWrite(previous.type, stepId); + } else { + throwIfOperationCrashInjected(previous.type, stepId); + } + } + return updated; +} + +function targetManifest( + manifest: SchemaManifest, + platforms: readonly PlatformName[], + operationId: Ulid, +): SchemaManifest | null { + const managedAdapters = { ...manifest.managedAdapters }; + let changed = false; + for (const platform of platforms) { + if (managedAdapters[platform] !== V3_ADAPTER_VERSION) { + managedAdapters[platform] = V3_ADAPTER_VERSION; + changed = true; + } + } + if (!changed) return null; + const next = parseSchemaManifest({ + ...manifest, + managedAdapters, + lastOperationId: operationId, + }); + assertSchemaManifestTransition(manifest, next); + return next; +} + +function changeFor( + platform: PlatformName, + target: V3AdapterManagedTargetStatus, +): AdapterUpgradeChange { + return { + platform, + identity: target.identity, + target: target.target, + status: target.status, + actualDigest: target.actualDigest, + expectedDigest: target.expectedDigest, + rendererVersion: target.rendererVersion, + repair: target.repair, + }; +} + +function normalizePlatforms( + platforms: readonly PlatformName[], +): PlatformName[] { + if (!Array.isArray(platforms) || platforms.length === 0) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PLATFORM_REQUIRED'); + } + const set = new Set(platforms); + if ( + [...set].some( + (platform) => !V3_ADAPTER_PLATFORMS.includes(platform as PlatformName), + ) + ) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PLATFORM_INVALID'); + } + return V3_ADAPTER_PLATFORMS.filter((platform) => set.has(platform)); +} + +function primaryTargetForPlatform(platform: PlatformName): string { + return platform === 'claude-code' + ? 'claude-skill' + : platform === 'cursor' + ? 'cursor-rule' + : platform === 'copilot' + ? 'copilot-instructions' + : 'agents'; +} + +function modeTargetForPlatform(platform: PlatformName, mode: string): string { + const family = + platform === 'claude-code' + ? 'claude' + : platform === 'codex' || platform === 'zcode' + ? 'agents' + : platform; + return `${family}-mode-${mode}`; +} + +function compareUtf8(left: string, right: string): number { + return Buffer.from(left, 'utf8').compare(Buffer.from(right, 'utf8')); +} + +async function renewLocks(locks: LocalLockHandle[]): Promise { + await Promise.all(locks.map((lock) => lock.renew())); +} + +async function writeSchemaManifest( + projectRoot: string, + manifest: SchemaManifest, +): Promise { + const target = path.join(projectRoot, '.mancode', 'schema.json'); + const temporary = path.join( + path.dirname(target), + `.schema.adapter-upgrade.${process.pid}.${Date.now()}.tmp`, + ); + try { + await writeFile(temporary, serializeSchemaManifest(manifest), { + encoding: 'utf8', + flag: 'wx', + }); + await rename(temporary, target); + } finally { + await rm(temporary, { force: true }).catch(() => undefined); + } +} + +function adapterUpgradePreview(input: { + operationId: Ulid; + platforms: PlatformName[]; + projectFingerprint: string; + plans: V3AdapterFilePlan[]; + manifestTarget: SchemaManifest; + stagedTargets: string[]; + now: Date; +}): AdapterUpgradePreviewV1 { + return { + schemaVersion: 1, + operationId: input.operationId, + platforms: [...input.platforms], + projectFingerprint: input.projectFingerprint, + plansDigest: digestCanonicalJson(input.plans), + manifestTargetDigest: digestCanonicalJson(input.manifestTarget), + stagedTargets: [...input.stagedTargets], + createdAt: input.now.toISOString(), + }; +} + +function adapterUpgradePreviewPath(root: string, operationId: Ulid): string { + return path.join( + root, + '.mancode', + 'staging', + 'adapters', + 'upgrade', + operationId, + 'preview.json', + ); +} + +async function readAdapterUpgradePreview( + root: string, + operationId: Ulid, +): Promise { + const target = adapterUpgradePreviewPath(root, operationId); + try { + const stat = await lstat(target); + if (!stat.isFile() || stat.isSymbolicLink()) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + return parseAdapterUpgradePreview( + JSON.parse(await readFile(target, 'utf8')), + ); + } catch (error) { + if (isNotFound(error)) return null; + if (error instanceof SyntaxError) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + throw error; + } +} + +async function writeAdapterUpgradePreview( + root: string, + preview: AdapterUpgradePreviewV1, +): Promise { + const target = adapterUpgradePreviewPath(root, preview.operationId); + await mkdir(path.dirname(target), { recursive: true }); + await writeFile(target, `${JSON.stringify(preview, null, 2)}\n`, { + encoding: 'utf8', + flag: 'wx', + }); +} + +function parseAdapterUpgradePreview(value: unknown): AdapterUpgradePreviewV1 { + assertRecord(value, 'adapter upgrade preview'); + assertKnownKeys( + value, + [ + 'schemaVersion', + 'operationId', + 'platforms', + 'projectFingerprint', + 'plansDigest', + 'manifestTargetDigest', + 'stagedTargets', + 'createdAt', + ], + 'adapter upgrade preview', + ); + if (value.schemaVersion !== 1) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + assertUlid(value.operationId, 'adapter upgrade preview operationId'); + const platforms = normalizePlatforms( + Array.isArray(value.platforms) ? (value.platforms as PlatformName[]) : [], + ); + if ( + !isDigest(value.projectFingerprint) || + !isDigest(value.plansDigest) || + !isDigest(value.manifestTargetDigest) || + !Array.isArray(value.stagedTargets) || + value.stagedTargets.some( + (target) => typeof target !== 'string' || !target.trim(), + ) || + typeof value.createdAt !== 'string' || + !Number.isFinite(Date.parse(value.createdAt)) + ) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + return { + schemaVersion: 1, + operationId: value.operationId, + platforms, + projectFingerprint: value.projectFingerprint, + plansDigest: value.plansDigest, + manifestTargetDigest: value.manifestTargetDigest, + stagedTargets: [...value.stagedTargets] as string[], + createdAt: value.createdAt, + }; +} + +function assertAdapterUpgradePreviewMatches( + preview: AdapterUpgradePreviewV1, + candidate: AdapterUpgradePreviewV1, +): void { + if ( + preview.operationId !== candidate.operationId || + JSON.stringify(preview.platforms) !== JSON.stringify(candidate.platforms) || + preview.projectFingerprint !== candidate.projectFingerprint || + preview.plansDigest !== candidate.plansDigest || + preview.manifestTargetDigest !== candidate.manifestTargetDigest + ) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_STALE'); + } +} + +async function assertStagedAdapterFiles( + root: string, + preview: AdapterUpgradePreviewV1, + plans: readonly V3AdapterFilePlan[], +): Promise { + if (preview.stagedTargets.length !== plans.length) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + for (const [index, plan] of plans.entries()) { + const relative = preview.stagedTargets[index]; + if (relative === undefined) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + const target = path.resolve(root, relative); + if (!target.startsWith(`${root}${path.sep}`)) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + const stat = await lstat(target); + if (!stat.isFile() || stat.isSymbolicLink()) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_INVALID'); + } + if ((await readFile(target, 'utf8')) !== plan.targetContent) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PREVIEW_STALE'); + } + } +} + +function isDigest(value: unknown): value is string { + return typeof value === 'string' && /^sha256:[a-f0-9]{64}$/.test(value); +} + +function isNotFound(error: unknown): boolean { + return ( + typeof error === 'object' && + error !== null && + 'code' in error && + error.code === 'ENOENT' + ); +} diff --git a/src/installers/claude-code.ts b/src/installers/claude-code.ts index d09b0f9..ba98f21 100644 --- a/src/installers/claude-code.ts +++ b/src/installers/claude-code.ts @@ -46,7 +46,7 @@ const LEGACY_MVP2_SKILL_NAMES = ['mamba', 'man8'] as const; /** * Claude Code 平台安装器。 * - * 职责(docs/08-cli-spec.md §2.4): + * 职责见 docs/platform-adapters.md: * 1. 创建/修复平台无关的 .mancode/ 文件(通过 installMancodeCore) * 2. 创建 .claude/settings.json(幂等合并,不覆盖用户已有配置) * 3. 创建 .claude/skills//SKILL.md @@ -163,7 +163,7 @@ async function installSoloSkill( } /** - * 写入 MVP-2 skill 目录(/man /manba /mansolo,docs/03)。 + * 写入 mode skill 目录(/man /manba /mansolo,见 docs/workflows.md)。 * * 目录:.claude/skills//SKILL.md(Claude Code 通过目录名识别命令)。 * `--force` 重装时只覆盖可识别的 mancode 生成文件。 diff --git a/src/installers/cursor.ts b/src/installers/cursor.ts index b2324d6..197ae06 100644 --- a/src/installers/cursor.ts +++ b/src/installers/cursor.ts @@ -262,7 +262,8 @@ function renderSoloRule(): string { '- Read `.mancode/project-profile.json` before choosing tools or validation. For detected UI assets and UI work, read `.mancode/aesthetics/style-tokens.json` and inspect existing components before inventing new styles.', '- Verify with the narrowest meaningful test, lint, build, or smoke check.', '- Perform one bounded self-check limited to the current diff. Do not start another reviewer, create a review artifact, or repeat the review.', - '- Recommend /man only for auth, payment, sensitive data, migrations/deletion, public APIs, untrusted input, concurrency, or infrastructure risk.', + '- Recommend /man and explain why when platform entry/flow differs, the semantic owner or source of truth is unclear, status/contract/policy semantics change, scope/architecture/cost/acceptance crosses files or modules, or historical compatibility, migration, cross-platform, or team evidence is required. Auth, payment, sensitive data, deletion, public APIs, untrusted input, concurrency, and infrastructure remain hard-risk signals. Advice alone never changes mode, step, policy, or authority.', + '- While executing confirmed requirements/plan, new evidence that invalidates its goal, owner, source of truth, acceptance, or scope, or a stale adapter/incompatible writer/unfinished operation/active child/open handoff/active solo assignment, requires the read-only diagnostic `NEEDS_REALIGNMENT` with reason `MANCODE_REFRAME_REQUIRED`. Preserve authority and do not call generic workflow update or modify metadata, requirements, plan, ledgers, claims, or handoffs.', ].join('\n'); } diff --git a/src/installers/managed-block.ts b/src/installers/managed-block.ts index 09894f3..3e7f4ed 100644 --- a/src/installers/managed-block.ts +++ b/src/installers/managed-block.ts @@ -29,6 +29,26 @@ export function hasManagedBlock( return start !== null && end !== null && end.start > start.start; } +/** Returns the exact managed block bytes-as-text, including both markers. */ +export function extractManagedBlock( + existing: string, + startMarker = DEFAULT_MANCODE_START_MARKER, + endMarker = DEFAULT_MANCODE_END_MARKER, +): string | null { + const starts = findMarkerLines(existing, startMarker); + const ends = findMarkerLines(existing, endMarker); + if (starts.length === 0 && ends.length === 0) return null; + if (starts.length !== 1 || ends.length !== 1) { + throw new Error('managed block is malformed: marker count is invalid'); + } + const start = starts[0]; + const end = ends[0]; + if (!start || !end || end.start < start.start) { + throw new Error('managed block is malformed: marker order is invalid'); + } + return existing.slice(start.start, end.end); +} + function cleanUpOrphanedNewlines(content: string): string { const trimmed = content.replace(/\n{3,}/gu, '\n\n').replace(/\n+$/u, '\n'); return trimmed || ''; @@ -92,8 +112,16 @@ function findMarkerLine( content: string, marker: string, ): { start: number; end: number } | null { + return findMarkerLines(content, marker)[0] ?? null; +} + +function findMarkerLines( + content: string, + marker: string, +): Array<{ start: number; end: number }> { let offset = 0; let inFence: { char: '`' | '~'; length: number } | null = null; + const matches: Array<{ start: number; end: number }> = []; for (const lineWithBreak of content.matchAll(/[^\n]*(?:\n|$)/gu)) { const rawLine = lineWithBreak[0]; @@ -109,14 +137,13 @@ function findMarkerLine( inFence = null; } } else if (!inFence && line === marker) { - return { + matches.push({ start: offset, end: offset + marker.length, - }; + }); } offset += rawLine.length; } - - return null; + return matches; } diff --git a/src/installers/mode-skills.ts b/src/installers/mode-skills.ts index 870f971..fb8847d 100644 --- a/src/installers/mode-skills.ts +++ b/src/installers/mode-skills.ts @@ -508,9 +508,9 @@ const MODE_META: Record = { 'After each completed phase, advance through the CLI to the next numbered step;', 'never advance state merely because a report was requested or an agent was called.', '', - 'Step 1 — Scout: inspect the profile, existing implementation, dependencies, risks, and unknowns; write `scout-report.md`.', + 'Step 1 — Scout: inspect the profile, existing implementation, dependencies, risks, and unknowns; write `scout-report.md`. When relevant and verifiable, include Current Behavior Evidence, Candidate Semantic Owner with confidence/conflict, Source of Truth split into authority/readers/writer/derived copies, and Historical / Compatibility Impact for existing workflows, legacy fixtures, transport, migration, and rollback. Never invent fields to fill the template.', 'Step 2 — Clarify by readiness, not a fixed round or question count. Ask every decision-changing question that cannot be resolved from project facts; use as many batches as needed without repeating confirmed answers. Classify unknowns as blocking, recommendable, or defaultable. When a good approach exists, present 2–3 options and make a clear recommendation. Create structured input with non-empty scope, exclusions, technical decisions, defaults, blocking unknowns, stable acceptance IDs, and explicit confirmed/defaulted/not-applicable coverage for platform, core scope, stack, data, performance, compatibility, and security. Run `mancode workflow requirements finalize --file `; only advance to Step 3 when the CLI returns ready.', - 'Step 3 — Plan Coach first returns READY_FOR_PLAN or NEEDS_CLARIFICATION. Never hide blocking gaps inside assumptions. When ready, write `plan.md` with confirmed scope, technical choices and reasons, reuse, exclusions, behavior, risks/rollback, completion criteria, defaults, and real validation. First plan is v1; revisions use `--plan-version `.', + 'Step 3 — Plan Coach first returns READY_FOR_PLAN or NEEDS_CLARIFICATION. Never hide blocking gaps inside assumptions. Every option must solve the same goal, acceptance boundary, and scope; name its complexity bearer and observable cost; return exactly one recommendation with rejection reasons and stop conditions. A simple task may have one real direction and must not manufacture alternatives. When ready, write `plan.md` with confirmed scope, technical choices and reasons, reuse, exclusions, behavior, risks/rollback, completion criteria, defaults, and real validation. For cross-platform entry differences, unclear owner/source of truth, contract/state changes, cross-workflow/team/transport work, or multi-version compatibility, add an optional Domain Matrix inside plan.md; it is not authority. First plan is v1; revisions use `--plan-version `.', 'Step 4 — Plan gate: recommend based on risk and let the user choose (1) hand the confirmed plan to lightweight solo via `mancode workflow handoff --to solo`, (2) continue full governed execution via `mancode workflow decide --plan-decision governed_execution` before Step 5, (3) keep the plan only via `mancode workflow decide --plan-decision plan_only`, or (4) revise. Do not implement before this choice. Before either execution path, echo the plan version, delivery, stack, inclusions, exclusions, validation, and residual assumptions.', 'Step 5 — Implement the confirmed minimum change.', 'Step 6 — Run `workflow verify init`, execute detected build/lint/typecheck/test and smoke checks, and record every required acceptance ID with reproducible evidence; automated passed/failed records include the command and exit code. Use require-manual when a foreground browser, device, or human judgment is necessary; stop for explicit user confirmation before confirm-manual. The CLI blocks Step 7 and review until all checks pass. Then write `review-scope.md` and initialize targeted or full review. An explicit user review skip uses `workflow review skip --reason ` at Step 6, never generic skipped metadata.', @@ -518,6 +518,8 @@ const MODE_META: Record = { 'Step 8 — Only full review runs the security/boundary reviewer. It must read Film #1, mark the same root cause duplicate, and stay within security, permissions, recovery, resources, and boundaries. A targeted review treats the second domain as not applicable; it is never recorded as a skipped step.', 'Step 9 — If open blockers exist, fix them in one remediation round and record resolved IDs through `workflow review ... remediate`; remediation invalidates all earlier acceptance evidence, so re-run and re-record every required check at Step 9 without re-running completed reviewers. Write `summary.md` and set completed only when verification and required review domains are complete and blockers are zero.', '', + 'Stop and return the read-only diagnostic `NEEDS_REALIGNMENT` with reason `MANCODE_REFRAME_REQUIRED` when new evidence invalidates the confirmed goal, semantic owner, source of truth, or acceptance; platform entries would produce different semantics; status/contract/policy/transition meaning must change; an adapter is stale, the writer is incompatible, an operation is unfinished, an active child/open handoff/active solo assignment exists; or the change exceeds the current requirements/plan scope. Preserve metadata, requirements, plan, ledgers, claims, and handoffs. Do not call generic workflow update, write blocked/currentStep/planning, archive files, release claims, or claim to be back at Step 2.', + '', 'A solo handoff keeps the workflow planned and stores activeSoloPlan in state; solo reads requirements.md and plan.md, implements the confirmed scope with narrow validation and one bounded self-check, and does not run the /man reviewers. After successful solo verification, run `mancode workflow handoff --complete` to atomically clear the pointer, complete the workflow at Step 4, and remove it from Active Plans. After plan-only/completed/abandoned, return state to solo. On blocked, preserve enough state to resume. A CLI rejection is a hard stop, never a reason to bypass metadata validation.', ].join('\n'), }, @@ -578,6 +580,8 @@ const MODE_META: Record = { '- Reuse existing functions, components, styles, and dependencies.', '- Read project-profile first; for detected UI assets and UI work, read `.mancode/aesthetics/style-tokens.json`.', '- Verify with the narrowest meaningful test, lint, build, or smoke check.', + '- Recommend man and explain why when platform entry/flow differs, the semantic owner or source of truth is unclear, status/contract/policy semantics change, scope/architecture/cost/acceptance crosses files or modules, or historical compatibility, migration, cross-platform, or team evidence is required. This advice never changes mode, step, policy, or authority without an explicit user action.', + '- While executing an existing requirements/plan, if new evidence invalidates its goal, owner, source of truth, acceptance, or scope, or a stale adapter/incompatible writer/unfinished operation/active child/open handoff/active solo assignment is found, stop with `NEEDS_REALIGNMENT` and reason `MANCODE_REFRAME_REQUIRED`. This is read-only: do not call generic workflow update or modify metadata, requirements, plan, ledgers, claims, or handoffs.', ].join('\n'), }, }; diff --git a/src/installers/shared-content.ts b/src/installers/shared-content.ts index 5ac2b16..44e69d1 100644 --- a/src/installers/shared-content.ts +++ b/src/installers/shared-content.ts @@ -116,7 +116,9 @@ function renderPracticeRules(): string { '', 'For every task, consider: why this change, what already exists, and what is the smallest useful diff?', '', - 'In solo mode, use the narrowest meaningful validation and one bounded self-check limited to the current diff. Do not start another reviewer or repeat the review. Only recommend man for auth, payment, sensitive data, migrations/deletion, public APIs, untrusted input, concurrency, or infrastructure risk.', + 'In solo mode, use the narrowest meaningful validation and one bounded self-check limited to the current diff. Do not start another reviewer or repeat the review.', + 'Recommend man and explain the trigger when platform entry/flow differs, the semantic owner or source of truth is unclear, status/contract/policy semantics change, scope/architecture/cost/acceptance crosses files or modules, or historical compatibility, migration, cross-platform, or team evidence is required. Auth, payment, sensitive data, deletion, public APIs, untrusted input, concurrency, and infrastructure remain hard-risk signals. Advice alone never changes mode, step, policy, or authority.', + 'While executing confirmed requirements/plan, new evidence that invalidates its goal, owner, source of truth, acceptance, or scope, or a stale adapter/incompatible writer/unfinished operation/active child/open handoff/active solo assignment, requires the read-only diagnostic `NEEDS_REALIGNMENT` with reason `MANCODE_REFRAME_REQUIRED`. Preserve metadata, requirements, plan, ledgers, claims, and handoffs; do not call generic workflow update, write blocked/currentStep/planning, archive files, release claims, or claim to be back at Step 2.', ].join('\n'); } diff --git a/src/installers/v3-adapter.ts b/src/installers/v3-adapter.ts index c9b2cce..1dc23ad 100644 --- a/src/installers/v3-adapter.ts +++ b/src/installers/v3-adapter.ts @@ -1,3 +1,4 @@ +import { createHash } from 'node:crypto'; import { lstat, mkdir, @@ -8,7 +9,9 @@ import { writeFile, } from 'node:fs/promises'; import path from 'node:path'; +import { TextDecoder } from 'node:util'; import { + extractManagedBlock, hasManagedBlock, removeManagedBlock, replaceManagedBlock, @@ -28,6 +31,8 @@ export const V3_ADAPTER_MANAGED_MARKER = export const V3_MODE_ENTRY_MANAGED_MARKER = ''; +export const V3_ADAPTER_DIGEST_DOMAIN = 'mancode-adapter-digest-v1'; + export const V3_MODE_NAMES = [ 'manba', 'man', @@ -90,11 +95,38 @@ export interface V3PlatformAdapterStatus { version: string; installed: boolean; ready: boolean; + status: V3AdapterContentStatus; target: string; detail: string; + targets: V3AdapterManagedTargetStatus[]; capabilities: V3AdapterCapabilities; } +export type V3AdapterContentStatus = + | 'ready' + | 'missing' + | 'stale' + | 'unreadable'; + +export interface V3AdapterManagedTargetStatus { + identity: string; + target: string; + status: V3AdapterContentStatus; + actualDigest: string | null; + expectedDigest: string; + rendererVersion: string; + repair: string; + detail: string; +} + +interface V3AdapterManagedTargetSpec { + identity: string; + target: string; + fileTarget: V3AdapterFileTarget; + expectedManagedContent: string; + blockMarkers: readonly [string, string] | null; +} + /** * A physical file touched by the V3 bootstrap renderer. Codex and ZCode * deliberately share the AGENTS target, so activation journals these files @@ -136,12 +168,25 @@ export type V3AdapterFileTarget = | V3ModeEntryFileTarget | V3LegacyAdapterFileTarget; +export const V3_ADAPTER_PLATFORMS: readonly PlatformName[] = [ + 'claude-code', + 'codex', + 'cursor', + 'copilot', + 'zcode', +]; + export interface V3AdapterFilePlan { target: V3AdapterFileTarget; beforeContent: string | null; targetContent: string; } +export interface V3StagedAdapterFilePlan { + target: V3AdapterFileTarget; + stagingTarget: string; +} + export interface V3StagedAdapter { platform: PlatformName; /** The corresponding live target, relative to the project root. */ @@ -192,6 +237,28 @@ export const V3_ADAPTER_FILE_TARGETS: readonly V3AdapterFileTarget[] = [ ...V3_LEGACY_ADAPTER_FILE_TARGETS, ]; +/** Computes the content digest for one logical managed target. */ +export function adapterManagedContentDigest( + targetIdentity: string, + managedContent: string | Uint8Array, +): string { + if (!targetIdentity.trim() || targetIdentity.includes('\0')) { + throw new Error('MANCODE_V3_ADAPTER_TARGET_IDENTITY_INVALID'); + } + const content = + typeof managedContent === 'string' + ? Buffer.from(managedContent, 'utf8') + : Buffer.from(managedContent); + const digest = createHash('sha256') + .update(Buffer.from(V3_ADAPTER_DIGEST_DOMAIN, 'utf8')) + .update(Buffer.from([0])) + .update(Buffer.from(targetIdentity, 'utf8')) + .update(Buffer.from([0])) + .update(content) + .digest('hex'); + return `sha256:${digest}`; +} + /** * Calculates exact file replacements without publishing them. This lets a * migration journal bind the combined AGENTS.md result before its first @@ -256,6 +323,88 @@ export async function planV3AdapterFiles( return plans; } +/** Plans a selected-platform repair while composing shared AGENTS targets once. */ +export async function planV3AdapterUpgradeFiles( + projectRoot: string, + platforms: readonly PlatformName[], +): Promise { + const root = path.resolve(projectRoot); + const selected = normalizeUpgradePlatforms(platforms); + const targetSet = new Set(); + for (const platform of selected) { + targetSet.add(primaryFileTarget(platform)); + for (const mode of V3_MODE_NAMES) { + targetSet.add(modeEntryFileTarget(platform, mode)); + } + for (const target of legacyAdapterTargetsForPlatform(platform, true)) { + targetSet.add(target); + } + } + const existing = new Map(); + for (const target of targetSet) { + existing.set(target, await readAdapterTarget(root, target)); + } + const desired = new Map(existing); + for (const platform of selected) { + planPlatformBootstrapUpgrade(desired, platform); + for (const mode of V3_MODE_NAMES) { + const target = modeEntryFileTarget(platform, mode); + const current = desired.get(target) ?? null; + desired.set( + target, + managedModeEntryPlan(target, current, renderV3ModeEntry(mode, platform)) + .targetContent, + ); + } + } + const plans = [...desired.entries()] + .filter(([target, targetContent]) => existing.get(target) !== targetContent) + .map(([target, targetContent]) => ({ + target, + beforeContent: existing.get(target) ?? null, + targetContent: targetContent ?? '', + })); + const legacyPlans = planLegacyAdapterRetirement(existing).filter( + (legacyPlan) => + !plans.some((candidate) => candidate.target === legacyPlan.target), + ); + return [...plans, ...legacyPlans]; +} + +/** Writes immutable upgrade candidates below .mancode staging, never live targets. */ +export async function stageV3AdapterUpgradeFiles( + projectRoot: string, + operationId: string, + plans: readonly V3AdapterFilePlan[], +): Promise { + if (!/^[0-7][0-9A-HJKMNP-TV-Z]{25}$/.test(operationId)) { + throw new Error('MANCODE_ADAPTER_UPGRADE_OPERATION_ID_INVALID'); + } + const root = path.resolve(projectRoot); + const staged: V3StagedAdapterFilePlan[] = []; + for (const plan of plans) { + const liveTarget = v3AdapterTargetPath(root, plan.target); + const relative = relativeAdapterPath(root, liveTarget); + const stagingTarget = path.join( + '.mancode', + 'staging', + 'adapters', + 'upgrade', + operationId, + relative, + ); + const destination = path.join(root, stagingTarget); + await assertAdapterPathSafe(root, destination); + await mkdir(path.dirname(destination), { recursive: true }); + await atomicWrite(destination, plan.targetContent); + staged.push({ + target: plan.target, + stagingTarget: relativeAdapterPath(root, destination), + }); + } + return staged; +} + /** Publishes one precomputed fixed-target replacement with atomic rename. */ export async function applyV3AdapterFilePlan( projectRoot: string, @@ -270,6 +419,11 @@ export async function applyV3AdapterFilePlan( } const target = v3AdapterTargetPath(root, plan.target); await assertAdapterPathSafe(root, target); + const current = await readAdapterTarget(root, plan.target); + if (current === plan.targetContent) return; + if (current !== plan.beforeContent) { + throw new Error('MANCODE_V3_ADAPTER_TARGET_CONFLICT'); + } await mkdir(path.dirname(target), { recursive: true }); await atomicWrite(target, plan.targetContent); } @@ -474,25 +628,29 @@ export async function inspectV3Adapter( platform: PlatformName, ): Promise { const root = path.resolve(projectRoot); - await assertPlatformAdapterPathsSafe(root, platform); const target = targetFor(platform); - const bootstrapInstalled = await adapterTargetPresent(root, platform); - const modeEntriesInstalled = ( - await Promise.all( - V3_MODE_NAMES.map((mode) => - v3ModeEntryPresent(v3ModeEntryPath(root, platform, mode)), - ), - ) - ).every(Boolean); - const installed = bootstrapInstalled && modeEntriesInstalled; + const targets: V3AdapterManagedTargetStatus[] = []; + for (const spec of managedTargetSpecs(root, platform)) { + targets.push(await inspectManagedTarget(root, platform, spec)); + } + const ready = targets.every((item) => item.status === 'ready'); + const installed = targets.every((item) => item.status !== 'missing'); + const status = aggregateAdapterStatus(targets); return { version: V3_ADAPTER_VERSION, installed, - ready: installed, + ready, + status, target, - detail: installed - ? 'mancode bootstrap and original mode entries are present; session identity is explicit-required.' - : 'mancode bootstrap or one of its original mode entries is not installed.', + detail: + status === 'ready' + ? 'Managed adapter content matches the current renderer.' + : status === 'missing' + ? 'One or more managed adapter targets are missing.' + : status === 'stale' + ? 'Managed adapter content differs from the current renderer.' + : 'One or more managed adapter targets cannot be read safely.', + targets, capabilities: capabilitiesFor(platform), }; } @@ -500,7 +658,8 @@ export async function inspectV3Adapter( /** Actual on-disk inventory for compatibility gates; never trust manifest echo. */ export async function inspectV3AdapterVersions( projectRoot: string, -): Promise> { + requiredPlatforms: readonly PlatformName[] = [], +): Promise>> { const platforms: PlatformName[] = [ 'claude-code', 'codex', @@ -508,13 +667,21 @@ export async function inspectV3AdapterVersions( 'copilot', 'zcode', ]; + const required = new Set(requiredPlatforms); const entries = await Promise.all( platforms.map(async (platform) => { const status = await inspectV3Adapter(projectRoot, platform); - return [platform, status.ready ? status.version : 'missing'] as const; + const primaryPresent = status.targets[0]?.status !== 'missing'; + return required.has(platform) || primaryPresent + ? ([platform, status.ready ? status.version : status.status] as const) + : null; }), ); - return Object.fromEntries(entries) as Record; + return Object.fromEntries( + entries.filter( + (entry): entry is NonNullable => entry !== null, + ), + ) as Partial>; } /** Removes only the V3 bootstrap owned by this renderer, never V3 authority. */ @@ -597,7 +764,10 @@ export function renderV3Bootstrap(platform: PlatformName): string { '', `- Platform: ${platformLabel}. This file is a non-authoritative bootstrap.`, '- Locate the project root before running mancode commands.', + '- Before the first command, choose one CLI binary for the entire task: use `./node_modules/.bin/mancode` when it exists, otherwise use `mancode`. Run that selected binary with `--version` once and never mix binaries or versions.', + '- In every command below, `mancode` means that selected binary; when the local binary exists, invoke the command as `./node_modules/.bin/mancode ...` rather than falling back to a global executable.', '- Reuse a `mancode status --brief --json` snapshot already obtained in this conversation. Only when no such snapshot exists, run it once from the project root.', + '- Inspect a session read-only with `mancode context session show --session --client --json`; do not invent other session subcommands.', '- The compact status is the public mancode Continuity runtime view. In operator-facing narration, say `mancode` or `mancode Continuity`; never prefix a mode or action with a version label.', '- An explicitly invoked original `man`, `manba`, `manteam`, `manps`, or `mansolo` entry supplies its authorized action. Its mode-specific steps override conflicting generic no-task or mutation guidance below.', '- In particular, `manps` may run local health scans without an actor, session, or TaskRef. `mansolo` needs them only for an explicit governed handoff.', @@ -629,6 +799,8 @@ export function renderV3ModeEntry( const sessionClientGuidance = sessionClientGuidanceFor(platform); const statusGuidance = 'Reuse a `mancode status --brief --json` snapshot already obtained in this conversation. Only when none exists, run it once from the project root.'; + const cliSelectionGuidance = + 'Before the first command, use `./node_modules/.bin/mancode` when it exists, otherwise `mancode`; check that selected binary with `--version` once and never mix binaries or versions. In every command below, replace the literal `mancode` with that selected binary path when the local binary exists.'; const sessionCreationGuidance = platform === 'codex' || platform === 'zcode' ? 'If status has no current session, reuse an explicit session ID already retained in this conversation. Only if neither exists, run `mancode context session new --client codex` in Codex or `mancode context session new --client zcode` in ZCode exactly once, then retain the returned session ID.' @@ -696,6 +868,7 @@ export function renderV3ModeEntry( '', '## Enter through mancode', '', + cliSelectionGuidance, ...authoritySteps, '', '## Mode action', @@ -743,9 +916,13 @@ const V3_MODE_DEFINITIONS: Record< actions: [ '- For a read-only project orientation, inspect and answer directly; do not create governance records.', '- For a new task, run `mancode workflow create man "" --session `.', - '- Write requirements as semantic JSON with `version: 1`, `goal`, `confirmedScope`, `excludedScope`, `technicalDecisions`, `defaults`, `blockingUnknowns`, all seven `coverage` dimensions, and `acceptanceCriteria`; mancode generates canonical internal IDs and digests.', + '- Write requirements as semantic JSON with `version: 1`, a non-empty `goal`, non-empty `confirmedScope`, and the arrays `excludedScope`, `technicalDecisions`, `defaults`, and `blockingUnknowns`. Every array item must be a non-empty string; an array may be empty except `confirmedScope`, and `technicalDecisions` must be non-empty whenever `technical_stack` applies.', + '- `coverage` must contain exactly one item for each dimension: `platform`, `core_scope`, `technical_stack`, `data_and_persistence`, `performance`, `compatibility`, and `security`. Each item has the shape `{ "dimension": "platform", "status": "confirmed", "rationale": "..." }`; `status` is exactly `confirmed`, `defaulted`, or `not_applicable`, and `rationale` is non-empty.', + '- `acceptanceCriteria` must contain at least one required item shaped as `{ "id": "AC-1", "description": "...", "required": true, "method": "automated" }`; `method` is exactly `automated`, `manual`, or `hybrid`.', '- Finalize requirements with `mancode workflow requirements finalize --file --expected-revision --session `.', + '- Let mancode assign internal IDs and digests; do not invent canonical IDs or digests in the semantic input.', '- Revise or confirm the plan with `mancode workflow plan revise|confirm --expected-revision ... --session `.', + "- Confirming with `--plan-decision plan_only` keeps the plan as planned authority and clears this session's active workflow pointer. Resume the TaskRef explicitly before any later governed mutation.", '- Apply verification and review ledgers with their mancode `apply --file` commands, then use `mancode workflow complete --expected-revision --session `.', ], }, @@ -868,40 +1045,322 @@ function renderCursorRule(content: string): string { ].join('\n'); } -async function adapterTargetPresent( +function managedTargetSpecs( root: string, platform: PlatformName, -): Promise { +): V3AdapterManagedTargetSpec[] { + const primary = primaryManagedTargetSpec(platform); + const modes = V3_MODE_NAMES.map((mode) => { + const fileTarget = modeEntryFileTarget(platform, mode); + return { + identity: fileTarget, + target: relativeAdapterPath(root, v3ModeEntryPath(root, platform, mode)), + fileTarget, + expectedManagedContent: renderV3ModeEntry(mode, platform), + blockMarkers: null, + } satisfies V3AdapterManagedTargetSpec; + }); + return [primary, ...modes]; +} + +function normalizeUpgradePlatforms( + platforms: readonly PlatformName[], +): PlatformName[] { + if (!Array.isArray(platforms) || platforms.length === 0) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PLATFORM_REQUIRED'); + } + const selected = new Set(); + for (const platform of platforms) { + if (!V3_ADAPTER_PLATFORMS.includes(platform)) { + throw new Error('MANCODE_ADAPTER_UPGRADE_PLATFORM_INVALID'); + } + selected.add(platform); + } + return V3_ADAPTER_PLATFORMS.filter((platform) => selected.has(platform)); +} + +function primaryFileTarget(platform: PlatformName): V3AdapterFileTarget { switch (platform) { case 'claude-code': - return managedFilePresent( - path.join(root, '.claude', 'skills', 'mancode-v3', 'SKILL.md'), + return 'claude-skill'; + case 'cursor': + return 'cursor-rule'; + case 'codex': + case 'zcode': + return 'agents'; + case 'copilot': + return 'copilot-instructions'; + } +} + +function planPlatformBootstrapUpgrade( + desired: Map, + platform: PlatformName, +): void { + const target = primaryFileTarget(platform); + const current = desired.get(target) ?? null; + switch (platform) { + case 'claude-code': + desired.set( + target, + managedFilePlan( + target, + current, + renderClaudeSkill(renderV3Bootstrap(platform)), + ).targetContent, ); + return; case 'cursor': - return managedFilePresent( - path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + desired.set( + target, + managedFilePlan( + target, + current, + renderCursorRule(renderV3Bootstrap(platform)), + ).targetContent, ); + return; case 'codex': - return managedBlockPresent( - path.join(root, 'AGENTS.md'), + desired.set( + target, + replaceManagedV3BlockText( + removeLegacyAgentsBlocks(current ?? ''), + V3_CODEX_START_MARKER, + V3_CODEX_END_MARKER, + renderV3Bootstrap(platform), + ), + ); + return; + case 'zcode': + desired.set( + target, + replaceManagedV3BlockText( + removeLegacyAgentsBlocks(current ?? ''), + V3_ZCODE_START_MARKER, + V3_ZCODE_END_MARKER, + renderV3Bootstrap(platform), + ), + ); + return; + case 'copilot': + desired.set( + target, + replaceManagedV3BlockText( + removeManagedBlock(current ?? ''), + V3_COPILOT_START_MARKER, + V3_COPILOT_END_MARKER, + renderV3Bootstrap(platform), + ), + ); + } +} + +function primaryManagedTargetSpec( + platform: PlatformName, +): V3AdapterManagedTargetSpec { + const target = targetFor(platform); + switch (platform) { + case 'claude-code': + return { + identity: 'claude-skill', + target, + fileTarget: 'claude-skill', + expectedManagedContent: renderClaudeSkill(renderV3Bootstrap(platform)), + blockMarkers: null, + }; + case 'cursor': + return { + identity: 'cursor-rule', + target, + fileTarget: 'cursor-rule', + expectedManagedContent: renderCursorRule(renderV3Bootstrap(platform)), + blockMarkers: null, + }; + case 'codex': + return embeddedManagedTargetSpec( + target, + 'agents#codex', + 'agents', V3_CODEX_START_MARKER, V3_CODEX_END_MARKER, + renderV3Bootstrap(platform), ); case 'copilot': - return managedBlockPresent( - path.join(root, '.github', 'copilot-instructions.md'), + return embeddedManagedTargetSpec( + target, + 'copilot-instructions#copilot', + 'copilot-instructions', V3_COPILOT_START_MARKER, V3_COPILOT_END_MARKER, + renderV3Bootstrap(platform), ); case 'zcode': - return managedBlockPresent( - path.join(root, 'AGENTS.md'), + return embeddedManagedTargetSpec( + target, + 'agents#zcode', + 'agents', V3_ZCODE_START_MARKER, V3_ZCODE_END_MARKER, + renderV3Bootstrap(platform), ); } } +function embeddedManagedTargetSpec( + target: string, + identity: string, + fileTarget: V3AdapterFileTarget, + startMarker: string, + endMarker: string, + content: string, +): V3AdapterManagedTargetSpec { + return { + identity, + target, + fileTarget, + expectedManagedContent: [startMarker, content, endMarker].join('\n'), + blockMarkers: [startMarker, endMarker], + }; +} + +function modeEntryFileTarget( + platform: PlatformName, + mode: V3ModeName, +): V3ModeEntryFileTarget { + const family = + platform === 'claude-code' + ? 'claude' + : platform === 'codex' || platform === 'zcode' + ? 'agents' + : platform; + return `${family}-mode-${mode}` as V3ModeEntryFileTarget; +} + +async function inspectManagedTarget( + root: string, + platform: PlatformName, + spec: V3AdapterManagedTargetSpec, +): Promise { + const expectedDigest = adapterManagedContentDigest( + spec.identity, + spec.expectedManagedContent, + ); + const repair = [ + `Preview with \`mancode adapter upgrade --platform ${platform} --dry-run\`.`, + `Confirm that exact preview with \`mancode adapter upgrade --platform ${platform} --confirm --operation-id --session \`.`, + ].join(' '); + try { + const bytes = await readAdapterBytesIfExists( + root, + v3AdapterTargetPath(root, spec.fileTarget), + ); + if (bytes === null) { + return managedTargetStatus( + spec, + 'missing', + null, + expectedDigest, + repair, + 'Managed target does not exist.', + ); + } + const content = new TextDecoder('utf-8', { fatal: true }).decode(bytes); + let managedContent: string; + if (spec.blockMarkers === null) { + managedContent = content; + } else { + try { + const extracted = extractManagedBlock( + content, + spec.blockMarkers[0], + spec.blockMarkers[1], + ); + if (extracted === null) { + return managedTargetStatus( + spec, + 'missing', + null, + expectedDigest, + repair, + 'Managed block is absent from the target file.', + ); + } + managedContent = extracted; + } catch (error) { + return managedTargetStatus( + spec, + 'stale', + null, + expectedDigest, + repair, + error instanceof Error + ? error.message + : 'Managed block is malformed.', + ); + } + } + const actualDigest = adapterManagedContentDigest( + spec.identity, + managedContent, + ); + const status = actualDigest === expectedDigest ? 'ready' : 'stale'; + return managedTargetStatus( + spec, + status, + actualDigest, + expectedDigest, + status === 'ready' ? 'none' : repair, + status === 'ready' + ? 'Managed content matches the current renderer.' + : 'Managed content differs from the current renderer.', + ); + } catch (error) { + return managedTargetStatus( + spec, + 'unreadable', + null, + expectedDigest, + `Resolve the filesystem or UTF-8 error, then ${repair}`, + error instanceof Error ? error.message : 'Managed target is unreadable.', + ); + } +} + +function managedTargetStatus( + spec: V3AdapterManagedTargetSpec, + status: V3AdapterContentStatus, + actualDigest: string | null, + expectedDigest: string, + repair: string, + detail: string, +): V3AdapterManagedTargetStatus { + return { + identity: spec.identity, + target: spec.target, + status, + actualDigest, + expectedDigest, + rendererVersion: V3_ADAPTER_VERSION, + repair, + detail, + }; +} + +function aggregateAdapterStatus( + targets: V3AdapterManagedTargetStatus[], +): V3AdapterContentStatus { + if (targets.every((target) => target.status === 'ready')) return 'ready'; + if (targets.some((target) => target.status === 'unreadable')) { + return 'unreadable'; + } + if (targets.some((target) => target.status === 'stale')) return 'stale'; + return 'missing'; +} + +function relativeAdapterPath(root: string, target: string): string { + return path.relative(root, target).split(path.sep).join('/'); +} + async function writeManagedFile( filePath: string, content: string, @@ -960,11 +1419,6 @@ async function removeV3ModeEntry(filePath: string): Promise { } } -async function v3ModeEntryPresent(filePath: string): Promise { - const existing = await readTextIfExists(filePath); - return existing?.includes(V3_MODE_ENTRY_MANAGED_MARKER) ?? false; -} - async function removeDirectoryIfEmpty(directory: string): Promise { try { await rmdir(directory); @@ -1536,11 +1990,6 @@ async function removeManagedV3Block( } } -async function managedFilePresent(filePath: string): Promise { - const content = await readTextIfExists(filePath); - return content?.includes(V3_ADAPTER_MANAGED_MARKER) ?? false; -} - async function managedBlockPresent( filePath: string, startMarker: string, @@ -1550,6 +1999,37 @@ async function managedBlockPresent( return content !== null && hasManagedBlock(content, startMarker, endMarker); } +async function readAdapterBytesIfExists( + root: string, + filePath: string, +): Promise { + await assertAdapterPathSafe(root, filePath); + try { + const entry = await lstat(filePath); + if (!entry.isFile() || entry.isSymbolicLink()) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + } catch (error) { + if (isNodeError(error) && error.code === 'ENOENT') return null; + throw error; + } + for (let attempt = 1; attempt <= ADAPTER_READ_MAX_ATTEMPTS; attempt += 1) { + try { + return await readFile(filePath); + } catch (error) { + if (isNodeError(error) && error.code === 'ENOENT') return null; + if ( + !isRetriableAdapterReadError(error) || + attempt === ADAPTER_READ_MAX_ATTEMPTS + ) { + throw error; + } + await delay(ADAPTER_READ_RETRY_DELAY_MS * attempt); + } + } + throw new Error('MANCODE_V3_ADAPTER_READ_RETRY_EXHAUSTED'); +} + async function readTextIfExists(filePath: string): Promise { for (let attempt = 1; attempt <= ADAPTER_READ_MAX_ATTEMPTS; attempt += 1) { try { diff --git a/src/runtime/beta-gate.ts b/src/runtime/beta-gate.ts index 7796acf..1830f73 100644 --- a/src/runtime/beta-gate.ts +++ b/src/runtime/beta-gate.ts @@ -1,5 +1,9 @@ -import { evaluateCompatibilityGate } from '../context/compatibility.js'; +import { + CURRENT_WRITER_CAPABILITIES, + evaluateCompatibilityGate, +} from '../context/compatibility.js'; import { scanLegacyAuthority } from '../context/layout.js'; +import { managedAdapterNames } from '../context/manifest.js'; import { V3ContextStore } from '../context/store.js'; import type { PlatformName } from '../installers/registry.js'; import { @@ -55,8 +59,8 @@ export async function evaluateV3BetaGate( throw new Error('MANCODE_BETA_RELEASE_CANDIDATE_REQUIRED'); } const store = new V3ContextStore(projectRoot); + const snapshot = await store.readProjectSnapshot(); const [ - snapshot, legacy, adapterVersions, adapterEntries, @@ -64,9 +68,11 @@ export async function evaluateV3BetaGate( unfinished, unfinishedGitRefWorkflowRepairs, ] = await Promise.all([ - store.readProjectSnapshot(), scanLegacyAuthority(projectRoot), - inspectV3AdapterVersions(projectRoot), + inspectV3AdapterVersions( + projectRoot, + managedAdapterNames(snapshot.manifest.managedAdapters), + ), Promise.all( BETA_PLATFORMS.map( async (platform) => @@ -82,6 +88,7 @@ export async function evaluateV3BetaGate( expectedSchemaEpoch: snapshot.manifest.epoch, readerVersion: VERSION, writerVersion: VERSION, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, adapterVersions, currentLegacyBaseline: legacy.baseline, legacyAuthorityPresent: legacy.authorityPresent, diff --git a/src/runtime/operation-definition.ts b/src/runtime/operation-definition.ts index 6c12483..1e02417 100644 --- a/src/runtime/operation-definition.ts +++ b/src/runtime/operation-definition.ts @@ -72,6 +72,7 @@ export const OPERATION_AUTHORIZATION_ACTIONS: Record< 'shared_metadata_plan_mutation', ], solo_handoff: ['local_workflow_mutation'], + reframe: ['local_workflow_mutation', 'shared_metadata_plan_mutation'], child_result_merge: [ 'local_workflow_mutation', 'task_complete_scope_change_child_merge', @@ -79,6 +80,8 @@ export const OPERATION_AUTHORIZATION_ACTIONS: Record< task_head_reconcile: ['task_head_reconcile'], transport_migrate: ['team_policy_config_transport'], greenfield_initialize: ['team_policy_config_transport'], + adapter_upgrade: ['project_maintenance'], + project_policy_upgrade: ['project_maintenance'], v3_activate: ['team_policy_config_transport'], }; @@ -448,6 +451,49 @@ export const OPERATION_DEFINITIONS: Record< commit('commit', ['task:'], ['task:']), ], ), + reframe: definition('reframe', 'commit-reframed-metadata', true, false, [ + prepare( + 'validate', + [ + 'task:', + 'requirements:', + 'plan:', + 'review:', + 'verification:', + 'archive:', + 'checkpoint:', + ], + ['task:', 'archive:', 'checkpoint:'], + { + expectedRevisionPrefixes: ['claim:'], + requiredLockPrefixes: ['claim:'], + }, + ), + write('mark-task-operation-pending', ['task:'], ['task:']), + write( + 'archive-requirements-plan', + ['archive:', 'requirements:', 'plan:', 'task:'], + ['archive:', 'task:'], + ), + write('release-active-claims', ['task:'], ['task:'], { + expectedRevisionPrefixes: ['claim:'], + requiredLockPrefixes: ['claim:'], + }), + write('write-requirements-draft', ['requirements:', 'task:'], ['task:']), + write( + 'mark-review-verification-stale', + ['review:', 'verification:', 'task:'], + ['task:'], + ), + write( + 'write-reframe-checkpoint', + ['checkpoint:', 'task:'], + ['checkpoint:', 'task:'], + ), + write('commit-reframed-metadata', ['task:'], ['task:']), + write('update-task-head-fence', ['task_head:', 'task:'], ['task:']), + commit('commit', ['task_head:', 'task:'], ['task:']), + ]), child_result_merge: definition( 'child_result_merge', 'update-parent-metadata', @@ -537,10 +583,48 @@ export const OPERATION_DEFINITIONS: Record< ), write('publish-v3-root', ['schema:', 'config:'], ['schema:']), write('register-workspace-binding', ['binding:'], ['binding:']), + write('publish-managed-adapters', ['adapter:'], ['adapter:']), write('activate-v3-manifest', ['schema:'], ['schema:']), commit('commit', ['schema:'], ['schema:']), ], ), + adapter_upgrade: definition( + 'adapter_upgrade', + 'replace-managed-adapters', + false, + false, + [ + prepare('validate', ['adapter:'], ['adapter:'], { + expectedRevisionPrefixes: ['schema:'], + requiredLockPrefixes: ['schema:'], + }), + write('replace-managed-adapters', ['adapter:'], ['adapter:']), + write('update-adapter-inventory', [], [], { + expectedRevisionPrefixes: ['schema:'], + requiredLockPrefixes: ['schema:'], + }), + commit('verify', ['adapter:'], ['adapter:'], { + expectedRevisionPrefixes: ['schema:'], + requiredLockPrefixes: ['schema:'], + }), + commit('commit', ['adapter:'], ['adapter:'], { + expectedRevisionPrefixes: ['schema:'], + requiredLockPrefixes: ['schema:'], + }), + ], + ), + project_policy_upgrade: definition( + 'project_policy_upgrade', + 'write-manifest', + false, + false, + [ + prepare('validate', ['schema:'], ['schema:']), + write('write-manifest', ['schema:'], ['schema:']), + write('verify-manifest', ['schema:'], ['schema:']), + commit('commit', ['schema:'], ['schema:']), + ], + ), v3_activate: definition('v3_activate', 'activate-manifest', true, true, [ prepare( 'validate-staged-migration', diff --git a/src/runtime/operation-journal.ts b/src/runtime/operation-journal.ts index f7d1c5f..fb14c9c 100644 --- a/src/runtime/operation-journal.ts +++ b/src/runtime/operation-journal.ts @@ -28,10 +28,13 @@ export type OperationType = | 'claim_revalidation' | 'checkpoint_create' | 'solo_handoff' + | 'reframe' | 'child_result_merge' | 'task_head_reconcile' | 'transport_migrate' | 'greenfield_initialize' + | 'adapter_upgrade' + | 'project_policy_upgrade' | 'v3_activate'; export type OperationState = @@ -98,10 +101,13 @@ const OPERATION_TYPES = new Set([ 'claim_revalidation', 'checkpoint_create', 'solo_handoff', + 'reframe', 'child_result_merge', 'task_head_reconcile', 'transport_migrate', 'greenfield_initialize', + 'adapter_upgrade', + 'project_policy_upgrade', 'v3_activate', ]); const OPERATION_STATES = new Set([ diff --git a/src/runtime/operation-recovery-executor.ts b/src/runtime/operation-recovery-executor.ts index a0d76aa..1987dbc 100644 --- a/src/runtime/operation-recovery-executor.ts +++ b/src/runtime/operation-recovery-executor.ts @@ -12,6 +12,7 @@ import path from 'node:path'; import { digestCanonicalJson } from '../context/canonical.js'; import { type Ulid, assertUlid } from '../context/ids.js'; import { + assertSchemaManifestPolicyUpgrade, assertSchemaManifestTransition, parseSchemaManifest, } from '../context/manifest.js'; @@ -74,8 +75,10 @@ import { assertRecoveryActor, planOperationRecovery } from './reconciler.js'; import { readSession } from './session.js'; import { readTaskHeadFence, replaceTaskHeadFence } from './task-head-store.js'; import { + readTaskArchiveDigestAtRoot, readTaskAuthorityFileAtRoot, readTaskCheckpointAtRoot, + writeTaskArchiveAtRoot, writeTaskAuthorityFileAtRoot, writeTaskCheckpointAtRoot, } from './task-operation.js'; @@ -466,6 +469,7 @@ async function applyPayload( stores, journal.operationId, journal.actorId, + journal.type, action, ); } @@ -516,6 +520,7 @@ async function applyAction( stores: EntityHomeStore[], operationId: Ulid, actorId: Ulid, + operationType: OperationJournalV1['type'], action: OperationRecoveryActionV1, ): Promise { switch (action.kind) { @@ -529,6 +534,11 @@ async function applyAction( ); return; } + case 'task_archive': { + const root = await taskRoot(projectRoot, action.taskRef); + await writeTaskArchiveAtRoot(root, operationId, action); + return; + } case 'workflow_task_directory': await publishWorkflowDirectory(projectRoot, operationId, action); return; @@ -536,7 +546,7 @@ async function applyAction( await publishMigrationDirectory(projectRoot, operationId, action); return; case 'project_authority_file': - assertProjectAuthorityTransition(action); + assertProjectAuthorityTransition(action, operationType); await writeProjectAuthorityFile( projectRoot, operationId, @@ -599,17 +609,22 @@ function assertProjectAuthorityTransition( OperationRecoveryActionV1, { kind: 'project_authority_file' } >, + operationType: OperationJournalV1['type'], ): void { if (action.beforeContent === null) { throw new Error('MANCODE_OPERATION_RECOVERY_CONFLICT'); } switch (action.fileName) { - case 'schema.json': - assertSchemaManifestTransition( - parseSchemaManifest(JSON.parse(action.beforeContent)), - parseSchemaManifest(JSON.parse(action.targetContent)), - ); + case 'schema.json': { + const previous = parseSchemaManifest(JSON.parse(action.beforeContent)); + const next = parseSchemaManifest(JSON.parse(action.targetContent)); + if (operationType === 'project_policy_upgrade') { + assertSchemaManifestPolicyUpgrade(previous, next); + } else { + assertSchemaManifestTransition(previous, next); + } return; + } case 'shared/config.json': assertProjectConfigTransition( parseProjectConfig(JSON.parse(action.beforeContent)), @@ -663,6 +678,11 @@ async function currentActionDigest( ? null : taskAuthorityContentDigest(action.fileName, content); } + case 'task_archive': + return readTaskArchiveDigestAtRoot( + await taskRoot(projectRoot, action.taskRef), + action, + ); case 'workflow_task_directory': return currentWorkflowDirectoryDigest(projectRoot, action); case 'migration_task_directory': diff --git a/src/runtime/operation-recovery-payload.ts b/src/runtime/operation-recovery-payload.ts index eaa2dc9..bff383d 100644 --- a/src/runtime/operation-recovery-payload.ts +++ b/src/runtime/operation-recovery-payload.ts @@ -55,6 +55,39 @@ export interface TaskAuthorityFileRecoveryAction { targetContent: string; } +export interface TaskArchiveManifestV1 { + schemaVersion: 1; + archiveId: Ulid; + operationId: Ulid; + taskRef: TaskRef; + sourceTaskRevision: number; + sourceRequirementsRevision: number; + sourceRequirementsDigest: string; + sourcePlanVersion: number; + sourcePlanDigest: string | null; + requirementsFileDigest: string; + planFileDigest: string | null; + archiveDigest: string; + createdAt: string; +} + +/** Immutable requirements/plan snapshot at a fixed operation-owned path. */ +export interface TaskArchiveRecoveryAction { + kind: 'task_archive'; + stepId: string; + taskRef: TaskRef; + archiveId: Ulid; + sourceTaskRevision: number; + sourceRequirementsRevision: number; + sourceRequirementsDigest: string; + sourcePlanVersion: number; + sourcePlanDigest: string | null; + createdAt: string; + requirementsContent: string; + planContent: string | null; + beforeDigest: null; +} + export interface WorkflowTaskDirectoryRecoveryAction { kind: 'workflow_task_directory'; stepId: string; @@ -159,6 +192,7 @@ export interface HandoffRecoveryAction { export type OperationRecoveryActionV1 = | TaskAuthorityFileRecoveryAction + | TaskArchiveRecoveryAction | WorkflowTaskDirectoryRecoveryAction | MigrationTaskDirectoryRecoveryAction | ProjectAuthorityFileRecoveryAction @@ -217,6 +251,15 @@ export function parseOperationRecoveryPayload( throw new Error('operation recovery payload primaryStoreId is invalid'); } const actions = parseActions(value.actions); + if ( + actions.some( + (action) => + action.kind === 'task_archive' && + action.archiveId !== value.operationId, + ) + ) { + throw new Error('operation recovery task archive operationId is invalid'); + } const noOpStepIds = parseStepIds(value.noOpStepIds, 'noOpStepIds'); const actionSteps = new Set(actions.map((action) => action.stepId)); if (noOpStepIds.some((stepId) => actionSteps.has(stepId))) { @@ -353,6 +396,40 @@ export function createTaskAuthorityFileRecoveryAction(input: { return parseTaskAuthorityFileAction(action); } +export function createTaskArchiveRecoveryAction(input: { + stepId: string; + taskRef: TaskRef; + archiveId: Ulid; + sourceTaskRevision: number; + sourcePlanVersion: number; + createdAt: string; + requirementsContent: string; + planContent: string | null; +}): TaskArchiveRecoveryAction { + const taskRef = parseTaskRefValue(input.taskRef); + const requirements = parseRequirementsLedger( + parseJson(input.requirementsContent, 'task archive requirements'), + ); + if (!sameTaskRef(requirements.taskRef, taskRef)) { + throw new Error('operation recovery task archive TaskRef is invalid'); + } + return parseTaskArchiveAction({ + kind: 'task_archive', + stepId: input.stepId, + taskRef, + archiveId: input.archiveId, + sourceTaskRevision: input.sourceTaskRevision, + sourceRequirementsRevision: requirements.revision, + sourceRequirementsDigest: requirements.contentDigest, + sourcePlanVersion: input.sourcePlanVersion, + sourcePlanDigest: taskArchivePlanDigest(taskRef, input.planContent), + createdAt: input.createdAt, + requirementsContent: input.requirementsContent, + planContent: input.planContent, + beforeDigest: null, + }); +} + export function createWorkflowTaskDirectoryRecoveryAction(input: { stepId: string; taskRef: TaskRef; @@ -519,6 +596,14 @@ function assertActionLockCoverage( throw new Error('MANCODE_OPERATION_RECOVERY_LOCK_MISSING'); } return; + case 'task_archive': + if ( + !hasLock(taskKey(action.taskRef)) || + !hasLock(`archive:${action.archiveId}`) + ) { + throw new Error('MANCODE_OPERATION_RECOVERY_LOCK_MISSING'); + } + return; case 'project_authority_file': if ( !hasLock( @@ -690,6 +775,8 @@ export function recoveryActionResourceKey( switch (action.kind) { case 'task_authority_file': return `task-file:${action.taskRef.namespace}:${action.taskRef.taskId}:${action.fileName}`; + case 'task_archive': + return `task-archive:${action.taskRef.namespace}:${action.taskRef.taskId}:${action.archiveId}`; case 'workflow_task_directory': return `workflow-directory:${action.taskRef.namespace}:${action.taskRef.taskId}`; case 'migration_task_directory': @@ -717,6 +804,8 @@ export function recoveryActionTargetDigest( switch (action.kind) { case 'task_authority_file': return taskAuthorityContentDigest(action.fileName, action.targetContent); + case 'task_archive': + return taskArchiveDigest(action); case 'workflow_task_directory': return workflowTaskDirectoryDigest(action); case 'migration_task_directory': @@ -753,6 +842,8 @@ function parseActions(value: unknown): OperationRecoveryActionV1[] { switch (action.kind) { case 'task_authority_file': return parseTaskAuthorityFileAction(action); + case 'task_archive': + return parseTaskArchiveAction(action); case 'workflow_task_directory': return parseWorkflowTaskDirectoryAction(action); case 'migration_task_directory': @@ -1157,6 +1248,95 @@ function parseTaskAuthorityFileAction( }; } +function parseTaskArchiveAction( + value: Record, +): TaskArchiveRecoveryAction { + assertKnownKeys( + value, + [ + 'kind', + 'stepId', + 'taskRef', + 'archiveId', + 'sourceTaskRevision', + 'sourceRequirementsRevision', + 'sourceRequirementsDigest', + 'sourcePlanVersion', + 'sourcePlanDigest', + 'createdAt', + 'requirementsContent', + 'planContent', + 'beforeDigest', + ], + 'operation recovery task archive action', + ); + if (value.kind !== 'task_archive' || value.beforeDigest !== null) { + throw new Error('operation recovery task archive action is invalid'); + } + const taskRef = parseTaskRefValue(value.taskRef); + assertUlid(value.archiveId, 'operation recovery task archive archiveId'); + const sourceTaskRevision = parsePositiveInteger( + value.sourceTaskRevision, + 'task archive sourceTaskRevision', + ); + const sourceRequirementsRevision = parsePositiveInteger( + value.sourceRequirementsRevision, + 'task archive sourceRequirementsRevision', + ); + const sourceRequirementsDigest = requireDigest( + value.sourceRequirementsDigest, + 'task archive sourceRequirementsDigest', + ); + const sourcePlanVersion = parsePositiveInteger( + value.sourcePlanVersion, + 'task archive sourcePlanVersion', + ); + const sourcePlanDigest = parseDigestOrNull( + value.sourcePlanDigest, + 'task archive sourcePlanDigest', + ); + const createdAt = parseTimestamp(value.createdAt, 'task archive createdAt'); + const requirementsContent = parseText( + value.requirementsContent, + 'task archive requirementsContent', + ); + const requirements = parseRequirementsLedger( + parseJson(requirementsContent, 'task archive requirements'), + ); + if ( + !sameTaskRef(requirements.taskRef, taskRef) || + requirements.revision !== sourceRequirementsRevision || + requirements.contentDigest !== sourceRequirementsDigest + ) { + throw new Error('operation recovery task archive requirements are invalid'); + } + const planContent = + value.planContent === null + ? null + : parseText(value.planContent, 'task archive planContent'); + if (planContent !== null && !planContent.trim()) { + throw new Error('operation recovery task archive plan is invalid'); + } + if (sourcePlanDigest !== taskArchivePlanDigest(taskRef, planContent)) { + throw new Error('operation recovery task archive plan digest is invalid'); + } + return { + kind: 'task_archive', + stepId: parseStepId(value.stepId), + taskRef, + archiveId: value.archiveId, + sourceTaskRevision, + sourceRequirementsRevision, + sourceRequirementsDigest, + sourcePlanVersion, + sourcePlanDigest, + createdAt, + requirementsContent, + planContent, + beforeDigest: null, + }; +} + function parseCheckpointAction( value: Record, ): CheckpointRecoveryAction { @@ -1278,6 +1458,40 @@ function parseText(value: unknown, label: string): string { return value; } +function parseJson(content: string, label: string): unknown { + try { + return JSON.parse(content); + } catch { + throw new Error(`operation recovery ${label} JSON is invalid`); + } +} + +function parsePositiveInteger(value: unknown, label: string): number { + if (!Number.isSafeInteger(value) || (value as number) < 1) { + throw new Error(`operation recovery ${label} is invalid`); + } + return value as number; +} + +function parseTimestamp(value: unknown, label: string): string { + if ( + typeof value !== 'string' || + !value.trim() || + !Number.isFinite(Date.parse(value)) + ) { + throw new Error(`operation recovery ${label} is invalid`); + } + return value; +} + +function requireDigest(value: unknown, label: string): string { + const digest = parseDigestOrNull(value, label); + if (digest === null) { + throw new Error(`operation recovery ${label} is invalid`); + } + return digest; +} + function parseDigestOrNull(value: unknown, label: string): string | null { if (value === null) return null; if (typeof value !== 'string' || !DIGEST_PATTERN.test(value)) { @@ -1304,6 +1518,56 @@ export function workflowTaskDirectoryDigest( }); } +export function taskArchiveDigest(action: TaskArchiveRecoveryAction): string { + return digestCanonicalJson({ + archiveId: action.archiveId, + operationId: action.archiveId, + taskRef: action.taskRef, + sourceTaskRevision: action.sourceTaskRevision, + sourceRequirementsRevision: action.sourceRequirementsRevision, + sourceRequirementsDigest: action.sourceRequirementsDigest, + sourcePlanVersion: action.sourcePlanVersion, + sourcePlanDigest: action.sourcePlanDigest, + createdAt: action.createdAt, + requirementsContent: action.requirementsContent, + planContent: action.planContent, + }); +} + +export function taskArchiveManifest( + action: TaskArchiveRecoveryAction, +): TaskArchiveManifestV1 { + return { + schemaVersion: 1, + archiveId: action.archiveId, + operationId: action.archiveId, + taskRef: action.taskRef, + sourceTaskRevision: action.sourceTaskRevision, + sourceRequirementsRevision: action.sourceRequirementsRevision, + sourceRequirementsDigest: action.sourceRequirementsDigest, + sourcePlanVersion: action.sourcePlanVersion, + sourcePlanDigest: action.sourcePlanDigest, + requirementsFileDigest: digestCanonicalJson({ + content: action.requirementsContent, + }), + planFileDigest: + action.planContent === null + ? null + : digestCanonicalJson({ content: action.planContent }), + archiveDigest: taskArchiveDigest(action), + createdAt: action.createdAt, + }; +} + +function taskArchivePlanDigest( + taskRef: TaskRef, + content: string | null, +): string | null { + return content === null + ? null + : digestCanonicalJson({ artifactRef: { taskRef, kind: 'plan' }, content }); +} + export function migrationTaskDirectoryDigest( action: MigrationTaskDirectoryRecoveryAction, ): string { diff --git a/src/runtime/project-write-barrier.ts b/src/runtime/project-write-barrier.ts new file mode 100644 index 0000000..325a1a8 --- /dev/null +++ b/src/runtime/project-write-barrier.ts @@ -0,0 +1,45 @@ +import type { Ulid } from '../context/ids.js'; +import { resolveLocalEntityHomeStore } from './entity-home-store.js'; +import { type LocalLockHandle, acquireEntityLocks } from './local-lock.js'; +import { listUnfinishedOperationJournals } from './operation-store.js'; +import type { ProjectRuntimeContext } from './project-runtime.js'; + +export const PROJECT_SCHEMA_LOCK = 'schema:project'; + +/** + * Serializes the start of ordinary writes with project-authority transitions. + * The caller keeps this lock until its prepared journal is durable, allowing a + * project upgrade to observe and reject every in-flight business operation. + */ +export async function acquireProjectWriteBarrier( + runtime: ProjectRuntimeContext, + operationId: Ulid, + now: Date, +): Promise { + const localStore = resolveLocalEntityHomeStore( + runtime.entityHomeStoreContext, + ); + const [lock] = await acquireEntityLocks( + localStore, + operationId, + [PROJECT_SCHEMA_LOCK], + { now }, + ); + if (lock === undefined) { + throw new Error('MANCODE_LOCK_HELD'); + } + try { + const unfinished = await listUnfinishedOperationJournals(localStore); + if ( + unfinished.some((journal) => + journal.entityLocks.includes(PROJECT_SCHEMA_LOCK), + ) + ) { + throw new Error('MANCODE_OPERATION_REPAIR_REQUIRED'); + } + return lock; + } catch (error) { + await lock.release().catch(() => undefined); + throw error; + } +} diff --git a/src/runtime/projection-outbox.ts b/src/runtime/projection-outbox.ts index 42e2370..238a288 100644 --- a/src/runtime/projection-outbox.ts +++ b/src/runtime/projection-outbox.ts @@ -621,15 +621,15 @@ async function inspectSessionProjection( return 'conflict'; } if (task.metadata.revision < target.taskRevision) return 'conflict'; - const terminal = isTerminalWorkflowStatus(task.metadata.status); + const clearsPointer = workflowRequiresClearedSession(task.metadata); if (target.action === 'clear') { - if (!terminal) return 'conflict'; + if (!clearsPointer) return 'conflict'; if (session.activeTaskRef === null) return 'present'; return sameTaskRef(session.activeTaskRef, target.taskRef) ? 'missing' : 'not_applicable'; } - if (terminal) { + if (clearsPointer) { if (session.activeTaskRef === null) return 'not_applicable'; return sameTaskRef(session.activeTaskRef, target.taskRef) ? 'missing' @@ -668,7 +668,7 @@ async function applySessionProjection( if (task.metadata.revision < target.taskRevision) return; if ( target.action === 'clear' || - isTerminalWorkflowStatus(task.metadata.status) + workflowRequiresClearedSession(task.metadata) ) { await clearSessionTaskPointer(projectRoot, target.sessionId, { expectedTaskRef: target.taskRef, @@ -843,6 +843,17 @@ function isTerminalWorkflowStatus(status: string): boolean { ); } +function workflowRequiresClearedSession(metadata: { + status: string; + governance: { planDecision: string | null }; +}): boolean { + return ( + isTerminalWorkflowStatus(metadata.status) || + (metadata.status === 'planned' && + metadata.governance.planDecision === 'plan_only') + ); +} + async function pathExists(target: string): Promise { try { await lstat(target); diff --git a/src/runtime/task-operation.ts b/src/runtime/task-operation.ts index ebe1102..0685b11 100644 --- a/src/runtime/task-operation.ts +++ b/src/runtime/task-operation.ts @@ -1,11 +1,24 @@ import { execFile as execFileCallback } from 'node:child_process'; -import { lstat, mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { + lstat, + mkdir, + readFile, + readdir, + rename, + rm, + writeFile, +} from 'node:fs/promises'; import path from 'node:path'; import { promisify } from 'node:util'; import { taskAggregateDigest } from '../context/aggregate.js'; -import { assertCompatibilityGate } from '../context/compatibility.js'; +import { + CURRENT_WRITER_CAPABILITIES, + type CompatibilityOperation, + assertCompatibilityGate, +} from '../context/compatibility.js'; import { type Ulid, assertUlid, createUlid } from '../context/ids.js'; import { scanLegacyAuthority } from '../context/layout.js'; +import { managedAdapterNames } from '../context/manifest.js'; import { type StoredCoordinationSnapshot, type StoredProjectSnapshot, @@ -18,6 +31,7 @@ import { sameTaskRef, } from '../context/task-ref.js'; import { assertParentWorkflowRelation } from '../context/workflow-metadata.js'; +import { inspectV3AdapterVersions } from '../installers/v3-adapter.js'; import { readSharedActorProfile } from '../team/actor.js'; import { type AuthorizationAction, @@ -64,10 +78,13 @@ import type { import { type OperationRecoveryActionV1, TASK_AUTHORITY_FILE_NAMES, + type TaskArchiveRecoveryAction, type TaskAuthorityFileName, assertOperationRecoveryPayloadCoversJournal, operationRecoveryPayloadDigest, parseOperationRecoveryPayload, + taskArchiveDigest, + taskArchiveManifest, } from './operation-recovery-payload.js'; import { writeOperationRecoveryPayload } from './operation-recovery-store.js'; import { @@ -79,6 +96,7 @@ import { readCheckoutCodeHead, readProjectRuntimeContext, } from './project-runtime.js'; +import { acquireProjectWriteBarrier } from './project-write-barrier.js'; import { type SessionStateV1, readSession } from './session.js'; import { assertTaskHeadFenceMatchesAggregate } from './task-head-fence.js'; @@ -90,6 +108,10 @@ export interface OpenV3TaskOperationInput { sessionId: Ulid; expectedTaskRevision: number; operationId?: Ulid; + compatibilityOperation?: Extract< + CompatibilityOperation, + 'v3_business_write' | 'reframe' + >; /** Additional entities use the same task-store lock family. */ extraEntityLocks?: string[]; /** @@ -117,6 +139,7 @@ export interface OpenedV3TaskOperation { codeHead: string | null; entityLocks: string[]; renewLocks(): Promise; + releaseProjectBarrier(): Promise; release(): Promise; } @@ -159,43 +182,60 @@ export async function openV3TaskOperation( const operationId = input.operationId ?? createUlid(now.getTime()); assertUlid(operationId, 'task operation operationId'); const runtime = await readProjectRuntimeContext(projectRoot); - const store = new V3ContextStore(projectRoot); - const [project, legacy, session] = await Promise.all([ - store.readProjectSnapshot(), - scanLegacyAuthority(projectRoot), - readSession(projectRoot, input.sessionId), - ]); - if (session === null || session.status !== 'active') { - throw new Error('MANCODE_SESSION_NOT_FOUND'); - } - assertCompatibilityGate({ - manifest: project.manifest, - expectedSchemaEpoch: project.manifest.epoch, - readerVersion: VERSION, - writerVersion: VERSION, - adapterVersions: project.manifest.managedAdapters, - currentLegacyBaseline: legacy.baseline, - legacyAuthorityPresent: legacy.authorityPresent, - operation: 'v3_business_write', - }); - const homeStore = resolveTaskEntityHomeStore( - runtime.entityHomeStoreContext, - taskRef, - ); - const taskKey = taskEntityKey(taskRef); - const entityLocks = uniqueEntityLocks([ - taskKey, - ...(input.extraEntityLocks ?? []), - ]); - const locks = await acquireOperationEntityLocks( + const projectBarrier = await acquireProjectWriteBarrier( + runtime, operationId, - [ - { store: homeStore, entityLockKeys: entityLocks }, - ...(input.additionalEntityLockTargets ?? []), - ], - { now }, + now, ); + let projectBarrierReleased = false; + const releaseProjectBarrier = async (): Promise => { + if (projectBarrierReleased) return; + await projectBarrier.release(); + projectBarrierReleased = true; + }; + const store = new V3ContextStore(projectRoot); + let locks: LocalLockHandle[] = []; try { + const homeStore = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + taskRef, + ); + const taskKey = taskEntityKey(taskRef); + const entityLocks = uniqueEntityLocks([ + taskKey, + ...(input.extraEntityLocks ?? []), + ]); + const project = await store.readProjectSnapshot(); + const [legacy, session, adapterVersions] = await Promise.all([ + scanLegacyAuthority(projectRoot), + readSession(projectRoot, input.sessionId), + inspectV3AdapterVersions( + projectRoot, + managedAdapterNames(project.manifest.managedAdapters), + ), + ]); + if (session === null || session.status !== 'active') { + throw new Error('MANCODE_SESSION_NOT_FOUND'); + } + assertCompatibilityGate({ + manifest: project.manifest, + expectedSchemaEpoch: project.manifest.epoch, + readerVersion: VERSION, + writerVersion: VERSION, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, + adapterVersions, + currentLegacyBaseline: legacy.baseline, + legacyAuthorityPresent: legacy.authorityPresent, + operation: input.compatibilityOperation ?? 'v3_business_write', + }); + locks = await acquireOperationEntityLocks( + operationId, + [ + { store: homeStore, entityLockKeys: entityLocks }, + ...(input.additionalEntityLockTargets ?? []), + ], + { now }, + ); if (taskRef.namespace === 'shared') { await assertTransportCoordinationWriteAllowed(homeStore, project.config); } @@ -254,14 +294,22 @@ export async function openV3TaskOperation( codeHead, entityLocks, async renewLocks(): Promise { - await Promise.all(locks.map((lock) => lock.renew())); + await Promise.all([ + ...locks.map((lock) => lock.renew()), + ...(projectBarrierReleased ? [] : [projectBarrier.renew()]), + ]); + }, + async releaseProjectBarrier(): Promise { + await releaseProjectBarrier(); }, async release(): Promise { await releaseLocks(locks); + await releaseProjectBarrier(); }, }; } catch (error) { await releaseLocks(locks); + await releaseProjectBarrier().catch(() => undefined); await recordV3ErrorDiagnostic(projectRoot, error).catch(() => undefined); throw error; } @@ -418,6 +466,7 @@ export async function createTaskOperationJournal( context.homeStore, journal, ); + await context.releaseProjectBarrier(); throwIfOperationCrashInjected(input.type, 'prepared'); return created; } @@ -511,6 +560,127 @@ export async function writeTaskAuthorityFile( ); } +export async function writeTaskArchive( + context: OpenedV3TaskOperation, + action: TaskArchiveRecoveryAction, +): Promise { + if ( + !sameTaskRef(action.taskRef, context.taskRef) || + action.archiveId !== context.operationId + ) { + throw new Error('MANCODE_REFRAME_ARCHIVE_OPERATION_MISMATCH'); + } + await writeTaskArchiveAtRoot( + context.task.location.taskRoot, + context.operationId, + action, + ); +} + +/** Atomically publishes one immutable operation-owned archive directory. */ +export async function writeTaskArchiveAtRoot( + taskRoot: string, + operationId: Ulid, + action: TaskArchiveRecoveryAction, +): Promise { + assertUlid(operationId, 'task archive operationId'); + if (action.archiveId !== operationId) { + throw new Error('MANCODE_REFRAME_ARCHIVE_OPERATION_MISMATCH'); + } + await assertSafeTaskDirectory(taskRoot); + const archiveRoot = await ensureSafeTaskChildDirectory(taskRoot, 'archives'); + if ((await readTaskArchiveDigestAtRoot(taskRoot, action)) !== null) return; + + const staging = path.join(archiveRoot, `.${operationId}.staging`); + const target = path.join(archiveRoot, operationId); + await removeSafeArchiveStaging(staging); + await mkdir(staging); + try { + await writeFile( + path.join(staging, 'archive.json'), + serializeTaskAuthority(taskArchiveManifest(action)), + { encoding: 'utf8', flag: 'wx' }, + ); + await writeFile( + path.join(staging, 'requirements.json'), + action.requirementsContent, + { encoding: 'utf8', flag: 'wx' }, + ); + if (action.planContent !== null) { + await writeFile(path.join(staging, 'plan.md'), action.planContent, { + encoding: 'utf8', + flag: 'wx', + }); + } + await rename(staging, target); + } catch (error) { + await removeSafeArchiveStaging(staging); + if (isAlreadyExists(error) || isDirectoryNotEmpty(error)) { + const existing = await readTaskArchiveDigestAtRoot(taskRoot, action); + if (existing === taskArchiveDigest(action)) return; + throw new Error('MANCODE_REFRAME_ARCHIVE_CONFLICT'); + } + throw error; + } +} + +export async function readTaskArchiveDigestAtRoot( + taskRoot: string, + action: TaskArchiveRecoveryAction, +): Promise { + await assertSafeTaskDirectory(taskRoot); + const archiveRoot = path.join(taskRoot, 'archives'); + try { + const rootEntry = await lstat(archiveRoot); + if (!rootEntry.isDirectory() || rootEntry.isSymbolicLink()) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + } catch (error) { + if (isNotFound(error)) return null; + throw error; + } + const target = path.join(archiveRoot, action.archiveId); + try { + const targetEntry = await lstat(target); + if (!targetEntry.isDirectory() || targetEntry.isSymbolicLink()) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + } catch (error) { + if (isNotFound(error)) return null; + throw error; + } + const expectedNames = [ + 'archive.json', + 'requirements.json', + ...(action.planContent === null ? [] : ['plan.md']), + ].sort(); + const names = (await readdir(target)).sort(); + if ( + names.length !== expectedNames.length || + names.some((name, index) => name !== expectedNames[index]) + ) { + throw new Error('MANCODE_REFRAME_ARCHIVE_CONFLICT'); + } + const archiveContent = await readImmutableArchiveFile( + path.join(target, 'archive.json'), + ); + const requirementsContent = await readImmutableArchiveFile( + path.join(target, 'requirements.json'), + ); + const planContent = + action.planContent === null + ? null + : await readImmutableArchiveFile(path.join(target, 'plan.md')); + if ( + archiveContent !== serializeTaskAuthority(taskArchiveManifest(action)) || + requirementsContent !== action.requirementsContent || + planContent !== action.planContent + ) { + throw new Error('MANCODE_REFRAME_ARCHIVE_CONFLICT'); + } + return taskArchiveDigest(action); +} + /** Fixed-name authority reader used by forward repair; it never follows links. */ export async function readTaskAuthorityFileAtRoot( taskRoot: string, @@ -738,7 +908,7 @@ async function assertSafeTaskDirectory(taskRoot: string): Promise { async function ensureSafeTaskChildDirectory( taskRoot: string, - child: 'checkpoints', + child: 'checkpoints' | 'archives', ): Promise { const directory = path.join(taskRoot, child); try { @@ -753,6 +923,36 @@ async function ensureSafeTaskChildDirectory( return directory; } +async function readImmutableArchiveFile(target: string): Promise { + const before = await lstat(target); + if (!before.isFile() || before.isSymbolicLink()) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + const content = await readFile(target, 'utf8'); + const after = await lstat(target); + if ( + !after.isFile() || + after.isSymbolicLink() || + before.dev !== after.dev || + before.ino !== after.ino + ) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + return content; +} + +async function removeSafeArchiveStaging(staging: string): Promise { + try { + const entry = await lstat(staging); + if (!entry.isDirectory() || entry.isSymbolicLink()) { + throw new Error('MANCODE_ARTIFACT_PATH_UNSAFE'); + } + await rm(staging, { recursive: true }); + } catch (error) { + if (!isNotFound(error)) throw error; + } +} + async function readImmutableCheckpoint(target: string): Promise { let before: Awaited>; try { @@ -812,6 +1012,15 @@ function isAlreadyExists(error: unknown): error is NodeJS.ErrnoException { ); } +function isDirectoryNotEmpty(error: unknown): error is NodeJS.ErrnoException { + return ( + typeof error === 'object' && + error !== null && + 'code' in error && + (error as NodeJS.ErrnoException).code === 'ENOTEMPTY' + ); +} + function isNotFound(error: unknown): error is NodeJS.ErrnoException { return ( typeof error === 'object' && diff --git a/src/system/scan-aesthetics.ts b/src/system/scan-aesthetics.ts index b767ebc..b3a5689 100644 --- a/src/system/scan-aesthetics.ts +++ b/src/system/scan-aesthetics.ts @@ -5,8 +5,8 @@ import path from 'node:path'; /** * 审美扫描结果。 * - * 结构对齐 docs/06-aesthetics.md §9.3 和 docs/13-scanning.md §8.2。 - * MVP-2 beta 提取 Tailwind colors/fonts、darkMode、uiLibrary、 + * 结构对齐 docs/project-intelligence.md。 + * 当前实现提取 Tailwind colors/fonts、darkMode、uiLibrary、 * 常见组件名和 CSS custom properties。 */ export interface AestheticsTokens { @@ -28,12 +28,12 @@ const MAX_COMPONENT_FILES = 2000; /** * 扫描项目审美 token。 * - * 职责(docs/13-scanning.md §4 + docs/06-aesthetics.md §3): + * 职责见 docs/project-intelligence.md: * 1. 检测 tailwind.config.{js,ts,cjs,mjs},提取 colors 和 fontFamily * 2. 检测 darkMode 策略 * 3. matchLevel: 检测到配置、CSS token 或组件 → high;只有 UI 依赖 → low;否则 none * - * MVP-2 beta 仍不做: + * 当前仍不做: * - theme.json / tokens.json 等非 Tailwind token 文件 * * @param projectRoot 项目根目录 diff --git a/src/system/workflow.ts b/src/system/workflow.ts index caeba7e..6ceb9be 100644 --- a/src/system/workflow.ts +++ b/src/system/workflow.ts @@ -23,7 +23,7 @@ import { * Workflow 元数据。 * * 每个 /man、/manba 或 /manteam 任务在 .mancode/workflows//metadata.json 里 - * 存一份,记录任务进度(docs/14-orchestration.md §2.1)。 + * 存一份,记录任务进度(见 docs/workflows.md)。 */ export interface WorkflowMeta { /** YYYYMMDD-HHMMSS- 格式 */ diff --git a/src/team/authorization.ts b/src/team/authorization.ts index 56d3f78..d084515 100644 --- a/src/team/authorization.ts +++ b/src/team/authorization.ts @@ -22,6 +22,7 @@ export type AuthorizationAction = | 'handoff_offer_cancel' | 'handoff_accept_reject' | 'review_skip_or_waiver' + | 'project_maintenance' | 'team_policy_config_transport' | 'actor_profile_publish' | 'confirmed_decision_publish'; @@ -156,6 +157,7 @@ const AUTHORIZATION_ACTIONS = new Set([ 'handoff_offer_cancel', 'handoff_accept_reject', 'review_skip_or_waiver', + 'project_maintenance', 'team_policy_config_transport', 'actor_profile_publish', 'confirmed_decision_publish', @@ -224,6 +226,11 @@ export const AUTHORIZATION_MATRIX: readonly AuthorizationMatrixEntry[] = [ actorRule: 'current task owner', requiredGuards: ['reason', 'P0/legacy_unknown waiver prohibition'], }, + { + action: 'project_maintenance', + actorRule: 'active local session actor', + requiredGuards: ['expected revision', 'explicit confirmation'], + }, { action: 'team_policy_config_transport', actorRule: 'joined actor', @@ -251,7 +258,10 @@ export function evaluateAuthorization( validateRequest(input); const failures: AuthorizationFailureCode[] = []; requireActiveSession(input, failures); - if (input.action !== 'local_workflow_mutation') { + if ( + input.action !== 'local_workflow_mutation' && + input.action !== 'project_maintenance' + ) { if (input.action !== 'actor_profile_publish' && !input.joined) { failures.push('MANCODE_JOIN_REQUIRED'); } @@ -423,6 +433,15 @@ export function evaluateAuthorization( failures.push('MANCODE_WAIVER_FORBIDDEN'); } break; + case 'project_maintenance': + requireExpectedRevision(input, failures); + requireCondition( + input, + 'explicitConfirmation', + 'MANCODE_EXPLICIT_CONFIRMATION_REQUIRED', + failures, + ); + break; case 'team_policy_config_transport': requireExpectedRevision(input, failures); requireCondition( diff --git a/src/team/checkpoints.ts b/src/team/checkpoints.ts index ea07c79..05418e9 100644 --- a/src/team/checkpoints.ts +++ b/src/team/checkpoints.ts @@ -7,6 +7,7 @@ import { assertKnownKeys, assertRecord } from '../context/validation.js'; export type CheckpointKind = | 'plan_confirmed' | 'scope_changed' + | 'requirements_reframed' | 'diagnostic_started' | 'base_changed' | 'verification_completed' @@ -46,6 +47,7 @@ export interface CheckpointV1 { const CHECKPOINT_KINDS = new Set([ 'plan_confirmed', 'scope_changed', + 'requirements_reframed', 'diagnostic_started', 'base_changed', 'verification_completed', diff --git a/src/team/git-ref-client.ts b/src/team/git-ref-client.ts index f1069a7..6726a29 100644 --- a/src/team/git-ref-client.ts +++ b/src/team/git-ref-client.ts @@ -1,4 +1,4 @@ -import type { SchemaManifestV1 } from '../context/manifest.js'; +import type { SchemaManifest } from '../context/manifest.js'; import { GitRefTeamManifestStore } from './git-ref-transport.js'; import { type ProjectConfigV1, projectConfigDigest } from './policy.js'; @@ -6,7 +6,7 @@ import { type ProjectConfigV1, projectConfigDigest } from './policy.js'; export function createGitRefTeamManifestStore( projectRoot: string, config: ProjectConfigV1, - manifest: SchemaManifestV1, + manifest: SchemaManifest, ): GitRefTeamManifestStore { if (config.transport.mode !== 'git-ref' || config.transport.remote === null) { throw new Error('MANCODE_TRANSPORT_UNAVAILABLE'); diff --git a/src/templates/agents/film-analyst-defense.ts b/src/templates/agents/film-analyst-defense.ts index 1342346..77aedf5 100644 --- a/src/templates/agents/film-analyst-defense.ts +++ b/src/templates/agents/film-analyst-defense.ts @@ -1,7 +1,7 @@ import type { AgentSpec } from './index.js'; /** - * Film Analyst #2(录像分析师·防守)agent — 边界/安全审查(docs/05-agents.md §5)。 + * Film Analyst #2(录像分析师·防守)agent — 边界/安全审查(见 docs/workflows.md)。 * * 触发:/man Step 8、/manteam Step 8。 * 审查维度:边界条件、安全(XSS/SQL/越权/敏感信息)、性能、资源管理、错误恢复;UI 任务还要审查可访问性与失败路径。 diff --git a/src/templates/agents/film-analyst-offense.ts b/src/templates/agents/film-analyst-offense.ts index 4896bca..f836a46 100644 --- a/src/templates/agents/film-analyst-offense.ts +++ b/src/templates/agents/film-analyst-offense.ts @@ -1,7 +1,7 @@ import type { AgentSpec } from './index.js'; /** - * Film Analyst #1(录像分析师·进攻)agent — 代码质量审查(docs/05-agents.md §4)。 + * Film Analyst #1(录像分析师·进攻)agent — 代码质量审查(见 docs/workflows.md)。 * * 触发:/man Step 7、/manteam Step 7。 * 审查维度:可读性、可维护性、风格一致性、DRY、YAGNI、复杂度、错误处理;UI 任务还要审查交互与视觉层级。 diff --git a/src/templates/agents/head-coach.ts b/src/templates/agents/head-coach.ts index 79267ea..eeb9b96 100644 --- a/src/templates/agents/head-coach.ts +++ b/src/templates/agents/head-coach.ts @@ -1,11 +1,11 @@ import type { AgentSpec } from './index.js'; /** - * Head Coach(主教练)agent — 主决策者(docs/05-agents.md §3 + docs/11)。 + * Head Coach(主教练)agent — 主决策者(见 docs/workflows.md 和 docs/engineering.md)。 * * 触发:solo 主代理;/man Step 3、5、7、9。 * 职责:整合 Scout Report → 写 plan → 实施 → 自测 → 修复 → 收尾。 - * 包含完整的 5 条铁律和 Phase 1-3 执行协议(docs/11)。 + * 包含完整的 5 条铁律和执行协议(见 docs/engineering.md)。 */ export const HEAD_COACH_AGENT: AgentSpec = { name: 'head-coach', @@ -81,6 +81,31 @@ export const HEAD_COACH_AGENT: AgentSpec = { - **验证依赖**:用某库前确认项目已检测到的 manifest、锁文件或现有 import 中确实存在 - **委托子代理**:深度探索、大范围搜索 → Scout agent +### Solo 升级建议 + +Solo 中出现以下任一情况时,停在当前动作并建议改用 \`/man\`,同时说明命中的事实: + +- 平台入口或流程不一致; +- semantic owner 不清; +- source of truth 或唯一 writer 不清; +- status、contract、policy 或 workflow transition 的语义会变化; +- scope、架构、成本或验收出现跨文件/跨模块变化; +- 需要历史兼容、迁移、跨平台或团队协调证据。 + +这只是建议。除非用户明确发起新的 \`/man\` workflow,否则不自动改变 mode、current step、policy 或任何 authority。 + +### 停止并重新对齐 + +执行现有 requirements/plan 时,如果新证据推翻已确认的目标、owner、source of truth 或验收,出现会导致不同语义的跨平台入口、stale adapter、不兼容 writer、未完成 operation、active child、open handoff、active solo assignment,或需求已超出当前 scope,立即停止并返回: + +\`\`\`text +NEEDS_REALIGNMENT +reason: MANCODE_REFRAME_REQUIRED +trigger: <具体事实> +\`\`\` + +这是只读诊断。保留 requirements、plan、review/verification ledger、claims、handoff 和 metadata;不调用通用 \`workflow update\`,不写 blocked/currentStep/planning,不归档旧文件,不释放 claim,也不宣称已经回到 Step 2。 + --- ## 4. Phase 2:外科手术式执行 diff --git a/src/templates/agents/plan-coach.ts b/src/templates/agents/plan-coach.ts index f48499a..6797db3 100644 --- a/src/templates/agents/plan-coach.ts +++ b/src/templates/agents/plan-coach.ts @@ -27,11 +27,34 @@ export const PLAN_COACH_AGENT: AgentSpec = { 先读取 \`requirements.json\`,以其中的 confirmedScope、excludedScope、technicalDecisions、defaults、blockingUnknowns、coverage 和 acceptanceCriteria 为权威输入;\`requirements.md\` 只用于阅读。逐项检查 platform、core_scope、technical_stack、data_and_persistence、performance、compatibility、security 的状态和理由是否与事实一致。检查需求是否覆盖任务实际适用的用户目标、核心流程、首期范围、排除项、技术与运行约束、数据/状态/集成、关键性能/兼容性/安全要求和验收标准。blockingUnknowns 非空、coverage 用无根据的 not_applicable 掩盖决策、核心行为缺少验收 ID,或文档与结构化输入矛盾时必须返回 NEEDS_CLARIFICATION。 +同时执行方案完整性检查: + +1. 所有候选方案必须解决同一个用户目标、同一验收边界和同一 scope;偷换目标或把问题改成另一个问题时返回 \`NEEDS_CLARIFICATION\`。 +2. 每个方案必须说明复杂度由谁承担以及可观察成本,承担者可以是实现代码、迁移、运行维护、用户操作、兼容层或测试;不能只写“更简单”。 +3. 必须给出唯一 recommendation,并说明拒绝其他方向的主要理由;不能把多个未决方向原样交给用户。 +4. 简单任务没有真实替代方案时只列一个明显可行方向,并解释为什么不存在真实替代;不得制造伪选项。这个单一方向仍必须成为 recommendation 并有 stop conditions。 + +Scout 若给出两个同等候选 semantic owner、无法确定 authority/writer,或 evidence 与 confirmed requirements 冲突,不能自行选一个继续。 + 只能返回两种结果: 1. \`NEEDS_CLARIFICATION\`:存在 blocking 缺口时,不生成计划。列出缺失决策、对计划的影响、2–3 个可行选项、明确推荐和建议问题。 2. \`READY_FOR_PLAN\`:没有 blocking 缺口时,输出标记后再生成完整计划。defaultable 细节必须作为显式默认值写入计划。 +\`READY_FOR_PLAN\` 先返回以下机器可辨认的决策摘要,再返回 Markdown 计划: + +\`\`\`text +READY_FOR_PLAN +goal: +options: + - id: + solves: + complexity_bearer: + tradeoffs: +recommendation: +stop_conditions: +\`\`\` + ## 输出格式 \`\`\`markdown @@ -56,8 +79,26 @@ export const PLAN_COACH_AGENT: AgentSpec = { ## 验证计划 - 把每个 required 验收 ID 映射到 automated / manual / hybrid 验证,不得用页面加载或代码阅读代替核心交互 - build / lint / typecheck / test / smoke test +## Domain Matrix(仅高风险任务) +| Domain | Current behavior/evidence | Candidate owner | Source of truth | Contract/state impact | Compatibility/history | Validation | Rollback/stop | +| --- | --- | --- | --- | --- | --- | --- | --- | +| | | | | | | | | ## 预估 \`\`\` -如果任务不应继续实施,返回 NEEDS_CLARIFICATION,不要用一份看似完整的计划掩盖缺失需求。`, +Domain Matrix 只是高风险 \`plan.md\` 的可选章节,不是新的 authority。入口/流程跨平台不一致、owner/source of truth 不清、状态或 contract 语义变化、跨 workflow/child/team/transport,或迁移/兼容影响超过一个版本时加入;普通局部任务省略。 + +## 停止并重新对齐 + +若新证据推翻已确认的目标、owner、source of truth 或验收,发现平台入口产生不同语义,需要改变 status/contract/policy/workflow transition 的含义,发现 stale adapter、不兼容 writer、未完成 operation、active child、open handoff、active solo assignment,或用户变化超出当前 requirements/plan scope,不返回 \`NEEDS_CLARIFICATION\` 或计划,而只返回: + +\`\`\`text +NEEDS_REALIGNMENT +reason: MANCODE_REFRAME_REQUIRED +trigger: <具体事实> +\`\`\` + +这是只读诊断:保留现有 requirements、plan、ledgers、claims、handoff 和 metadata;不调用通用 \`workflow update\`,不写 blocked/currentStep/planning,不归档或释放任何 authority,也不宣称已回到 Step 2。重复检查必须返回同一类诊断,而不能把它升级为持久 blocker。 + +普通 blocking 决策缺口返回 NEEDS_CLARIFICATION;只有命中上述已确认契约失效条件才返回 NEEDS_REALIGNMENT。两种情况都不要用一份看似完整的计划掩盖问题。`, }; diff --git a/src/templates/agents/scout.ts b/src/templates/agents/scout.ts index 76a2096..383257f 100644 --- a/src/templates/agents/scout.ts +++ b/src/templates/agents/scout.ts @@ -1,7 +1,7 @@ import type { AgentSpec } from './index.js'; /** - * Scout(球探)agent — 调研代码库(docs/05-agents.md §2)。 + * Scout(球探)agent — 调研代码库(见 docs/workflows.md)。 * * 触发:/man Step 1。 * 职责:找相似实现、可复用资源、风险点,输出 Scout Report 给 Head Coach。 @@ -48,6 +48,14 @@ export const SCOUT_AGENT: AgentSpec = { - README / docs / STYLE.md 是否有相关说明 - 是否有相关的设计文档 +5. **治理证据** + - 记录至少一个可复现的当前行为,并引用仓库路径、测试或实际命令;只有推测时明确写 unknown + - 区分候选 semantic owner 与最终 owner;写明置信度和未解决冲突,不替 Head Coach 猜结论 + - 区分 source of truth 与 derived copy;adapter、cache 和 Markdown 默认不是任务状态 authority + - 检查旧 workflow、legacy fixture、transport、迁移和 rollback;不受影响的项也明确写 no change + +四个治理小节按相关性填写。不能从项目事实验证时可以省略,但不得为了填满模板编造 owner 或 source of truth;一旦写 Current Behavior Evidence,就必须同时给出可复现观察与证据。 + ## 输出格式(严格遵守) \`\`\`markdown @@ -56,6 +64,28 @@ export const SCOUT_AGENT: AgentSpec = { ## 项目 Profile - 项目类型 / 语言 / framework / source roots / manifests / 可用验证 / UI 资产 / 置信度 +## Current Behavior Evidence +- Observation: <当前真实行为;未知时写 unknown,不把推测写成事实> +- Evidence: \`\` +- Reproduction/validation: <如何复现或验证> + +## Candidate Semantic Owner +- Candidate: <模块、实体或命令> +- Confidence: high | medium | low +- Unresolved conflict: + +## Source of Truth +- Authority: <结构化文件、ledger、manifest 或外部系统> +- Readers: <读取方> +- Writers: <唯一写入路径或 operation> +- Derived copies: + +## Historical / Compatibility Impact +- Existing workflows: <影响或 no change> +- Legacy fixtures: <影响或 no change> +- Transport/platform: <影响或 no change> +- Migration/rollback: <需要的证据或 no change> + ## 相似实现 - \`/:\` — 简述可复用的逻辑 @@ -75,6 +105,18 @@ export const SCOUT_AGENT: AgentSpec = { - 是否需要支持 X?(请 Head Coach 确认) \`\`\` +## 停止并重新对齐 + +新证据若推翻已确认的目标、semantic owner、source of truth 或验收,或暴露会产生不同语义的跨平台入口、status/contract/policy/transition 语义变化,立即停止调研后的推进,只返回: + +\`\`\`text +NEEDS_REALIGNMENT +reason: MANCODE_REFRAME_REQUIRED +trigger: <被新证据推翻或超出当前 requirements/plan 的事实> +\`\`\` + +这是只读诊断。不要调用通用 \`workflow update\`,不要写 metadata、step、policy、requirements、plan、claim 或 handoff,也不要归档文件、释放 claim 或宣称已经回到 Step 2。保留当前 authority,等待用户显式选择新的 \`/man\` workflow 或受支持的 reframe operation。 + ## 工具使用 - 用 Grep / Glob 找代码,不要 cat 整个文件 diff --git a/src/templates/defaults.ts b/src/templates/defaults.ts index 40ffd4e..61a7d1f 100644 --- a/src/templates/defaults.ts +++ b/src/templates/defaults.ts @@ -1,7 +1,7 @@ /** * 默认的 .mancode/config.json 内容。 * - * 见 docs/08-cli-spec.md §11.1 + * 见 docs/workflows.md。 */ export const DEFAULT_CONFIG = { version: '1.0.0', @@ -25,7 +25,7 @@ export const DEFAULT_CONFIG = { * 空的 style-tokens.json(非前端项目或 matchLevel=none 时用)。 * * 结构对齐 src/system/scan-aesthetics.ts 的 AestheticsTokens。 - * 审美扫描见 docs/13-scanning.md。 + * 审美扫描见 docs/project-intelligence.md。 */ export const EMPTY_STYLE_TOKENS = { version: '1.0.0', diff --git a/src/templates/inline.ts b/src/templates/inline.ts index 88ef0ce..36be0ee 100644 --- a/src/templates/inline.ts +++ b/src/templates/inline.ts @@ -307,9 +307,31 @@ export const SOLO_SKILL = `# mancode · solo mode 1. 读取对应 workflow 的 \`requirements.md\` 和 \`plan.md\`,确认 taskId 与 planVersion。 2. 开工前回执目标、技术方案、包含范围、排除范围、验证方式和残余假设。 3. 只按计划轻量实施;不重新规划、不调用 Film Reviewer、不创建新的 /man workflow。 -4. 发现会改变架构、范围或验收的缺口时暂停并询问,不自行扩大计划。 +4. 发现会改变架构、范围或验收的缺口时按下方 realignment 契约停止,不自行扩大计划。 5. 完成最窄有效验证和一次受限 diff 自检后,运行 \`mancode workflow handoff --complete\`;由 CLI 原子清理 \`activeSoloPlan\`、把 workflow 标记 completed 并移出 Active Plans,保留计划文件。 +### 何时建议升级到 /man +以下任一情况出现时,停止当前动作并建议 \`/man\`,说明具体原因: +1. 平台入口或流程不一致 +2. semantic owner 不清 +3. source of truth 或唯一 writer 不清 +4. status、contract、policy 或 workflow transition 的语义会变化 +5. scope、架构、成本或验收出现跨文件/跨模块变化 +6. 需要历史兼容、迁移、跨平台或团队协调证据 + +这只是建议;用户未明确发起新的 \`/man\` workflow 时,不自动改变 mode、current step、policy 或 authority。 + +### 停止并重新对齐 +执行已有 requirements/plan 时,如果新证据推翻已确认的目标、owner、source of truth 或验收,平台入口会产生不同语义,发现 stale adapter、不兼容 writer、未完成 operation、active child、open handoff、active solo assignment,或变化已超出当前 scope,只返回: + +\`\`\`text +NEEDS_REALIGNMENT +reason: MANCODE_REFRAME_REQUIRED +trigger: <具体事实> +\`\`\` + +这是只读诊断。保留 requirements、plan、review/verification ledger、claims、handoff 和 metadata;不调用通用 \`workflow update\`,不写 blocked/currentStep/planning,不归档旧文件,不释放 claim,不取消 handoff,也不宣称已回到 Step 2。 + ### UI 任务(条件执行) 仅当 project-profile 确认有 UI 资产且任务确实涉及界面时: 1. UserPromptSubmit hook 会注入项目审美 token(如有) @@ -330,7 +352,7 @@ export const SOLO_SKILL = `# mancode · solo mode - 只做一次,只看本次 diff、需求和直接受影响路径;不调用额外 reviewer,不生成审查报告,不重复巡检。 - 验证失败、行为回归或遗留 debug 可直接修复并复验;复验不是新一轮 review。 - 命名、可读性、DRY、loading/error 形式等建议不自动扩大改动;与需求无关时不输出。 -- 只有鉴权、支付、敏感数据、迁移/删除、公开 API、未可信输入、并发或基础设施等硬风险出现时,才用一句话建议 \`/man\`;用户说“继续 solo”即可继续。 +- 鉴权、支付、敏感数据、删除、公开 API、未可信输入、并发或基础设施等硬风险同样属于升级信号;若没有触发 realignment,用户明确选择继续 solo 后可以继续。 ## 你的风格 diff --git a/src/templates/skills/man.ts b/src/templates/skills/man.ts index 1538ada..92f1cdf 100644 --- a/src/templates/skills/man.ts +++ b/src/templates/skills/man.ts @@ -19,7 +19,7 @@ export const MAN_SKILL: SkillSpec = { ### Step 1: Scout 调研 -调用 \`scout\`,写 \`scout-report.md\`。报告必须包含“**不确定的地方**”。运行 \`mancode workflow update --step 2\`。 +调用 \`scout\`,写 \`scout-report.md\`。报告必须包含“**不确定的地方**”,并按可验证事实补充 Current Behavior Evidence、Candidate Semantic Owner、Source of Truth、Historical / Compatibility Impact;字段不相关或无法验证时可以省略,不能编造。Current Behavior Evidence 至少有一个可复现观察和仓库路径、测试或命令证据;owner 写置信度与冲突;source of truth 区分 authority 和 derived copy;兼容影响覆盖旧 workflow、legacy fixture、transport、迁移和 rollback。运行 \`mancode workflow update --step 2\`。 ### Step 2: 需求澄清 @@ -38,7 +38,9 @@ export const MAN_SKILL: SkillSpec = { 调用只读 \`plan-coach\`,输入 task、scout-report、\`requirements.json\` 和渲染后的 \`requirements.md\`。Plan Coach 先返回 \`READY_FOR_PLAN\` 或 \`NEEDS_CLARIFICATION\`。后者只列缺失决策、影响、推荐和问题;主 skill 将 workflow 退回 Step 2 并重新 finalize requirements,不得强行补全计划。前者返回计划文本,由主 skill 写入 \`plan.md\`。 -计划必须含需求摘要、任务分级、技术选择及理由、模块索引、复用资源与 scout 行号、核心行为、最小策略、不做什么、步骤、风险/回退、完成定义、真实验证与 smoke test、预估和非阻塞默认值。首次计划写入成功后运行 \`mancode workflow update --step 4\`;重写计划时保持 Step 4,运行 \`--plan-version <当前版本+1>\`,不得直接编辑 planVersion。 +Plan Coach 必须证明所有选项解决同一个 goal、验收边界和 scope;逐项写明 complexity bearer 及可观察成本;给出且只给出一个 recommendation、拒绝其他方向的主要理由和 stop conditions。简单任务没有真实替代时只列一个方向并说明原因,不制造伪选项。两个同等 owner 候选或 authority writer 未决时返回 \`NEEDS_CLARIFICATION\`。 + +计划必须含需求摘要、任务分级、技术选择及理由、模块索引、复用资源与 scout 行号、核心行为、最小策略、不做什么、步骤、风险/回退、完成定义、真实验证与 smoke test、预估和非阻塞默认值。入口/流程跨平台不一致、owner/source of truth 不清、状态或 contract 语义变化、跨 workflow/child/team/transport,或迁移/兼容影响超过一个版本时,在 \`plan.md\` 内加入可选 Domain Matrix,列出 Domain、当前行为/证据、候选 owner、source of truth、contract/state 影响、compatibility/history、validation 和 rollback/stop;它不是新的 authority。首次计划写入成功后运行 \`mancode workflow update --step 4\`;重写计划时保持 Step 4,运行 \`--plan-version <当前版本+1>\`,不得直接编辑 planVersion。 ### Step 4: 计划关卡 @@ -52,6 +54,12 @@ export const MAN_SKILL: SkillSpec = { 确认执行后、修改业务文件前输出开工回执:计划版本、执行方式、目标与交付物、技术方案、包含范围、排除范围、验证方式和残余假设。仍有 blocking 未知项时不得声称开始实施。 +### 实施期间停止与重新对齐 + +以下任一情况出现时立即停止当前代理执行:新证据推翻已确认的目标、owner、source of truth 或验收;平台入口/流程会产生不同语义;需要改变 status、contract、policy 或 workflow transition 的含义;发现 adapter stale、writer 不兼容、未完成 operation、active child、open handoff 或 active solo assignment;用户变化超出当前 requirements/plan scope。 + +只返回 \`NEEDS_REALIGNMENT\`、原因 \`MANCODE_REFRAME_REQUIRED\` 和具体 trigger。该诊断只读:保留 requirements、plan、review/verification ledger、claims、handoff 和 metadata;不得调用通用 \`workflow update\` 写 blocked,不得手改 currentStep/planning,不归档旧文件,不释放 claim,不取消 handoff,也不宣称已回到 Step 2。等待用户显式选择新的 \`/man\` workflow 或受支持的 reframe operation。 + ### Step 5: 实施 调用 \`head-coach\` 按确认计划实施。多文件、新模块或高风险任务可建议 worktree,必须先获用户同意。实施完成后通过 CLI 更新至 Step 6。 diff --git a/src/templates/skills/mansolo.ts b/src/templates/skills/mansolo.ts index ff5b277..d636ed2 100644 --- a/src/templates/skills/mansolo.ts +++ b/src/templates/skills/mansolo.ts @@ -1,7 +1,7 @@ import type { SkillSpec } from './index.js'; /** - * /mansolo skill — Back to Practice(docs/03 §6)。 + * /mansolo skill — Back to Practice(见 docs/workflows.md)。 * * 切回 solo 模式:清理 state.json 里的 workflow 状态。 */ diff --git a/src/templates/skills/manteam.ts b/src/templates/skills/manteam.ts index f3582db..37b6609 100644 --- a/src/templates/skills/manteam.ts +++ b/src/templates/skills/manteam.ts @@ -50,9 +50,9 @@ export const MANTEAM_SKILL: SkillSpec = { 按 \`/man\` 的 9 步流程执行(含澄清、计划关卡和增强收尾),但每一步增加团队约束: -1. Scout Report:必须列出共享文件、近期相关提交、潜在冲突文件。 +1. Scout Report:必须列出共享文件、近期相关提交、潜在冲突文件,并按事实补充 Current Behavior Evidence、Candidate Semantic Owner、Source of Truth、Historical / Compatibility Impact;authority 与 Markdown/adapter 等 derived copy 必须区分。 2. 澄清:沿用 /man 的需求就绪门槛,不设固定轮数或每批问题数量;问出所有会改变决策且无法从项目事实查清的疑问,不重复已确认内容。有合适方案时直接给出选项、优缺点和明确推荐。通过 \`workflow requirements ... finalize\` 固化七个 coverage 维度、结构化需求和带验证方式的验收 ID,只有 CLI 判定 ready 才进入计划。 -3. Game Plan:Plan Coach 先做输入就绪检查;计划里必须包含变更边界、技术选择理由、兼容性风险、回滚方式,禁止提前修改业务文件或团队 memory。 +3. Game Plan:Plan Coach 先做输入就绪检查;所有选项必须解决同一目标和验收边界,写明 complexity bearer,只保留一个 recommendation 和 stop conditions;简单任务可以只有一个真实方向。计划里必须包含变更边界、技术选择理由、兼容性风险、回滚方式;高风险或跨 team/transport/owner/authority 的任务在 plan.md 内加入非权威 Domain Matrix。禁止提前修改业务文件或团队 memory。 4. 计划关卡:用户可只保留计划、继续完整团队执行、明确交给 solo 轻量执行或重写计划;Active Plans 按 taskId 更新。团队共享文件或交接风险存在时推荐完整团队执行。 5. 实施:改动前再次检查 \`git status --short\`,避免踩用户或队友改动。 6. Self-test:在 Step 6 初始化 verification ledger,把每个 required 验收 ID 的自动、人工或 hybrid 结果和证据通过 CLI 记录;自动结果包含命令与退出码,未全部通过不得进入 review。优先跑项目已有验证命令;失败两次停下诊断根因。需要人工验证时标记 require-manual 并等待用户明确确认,不得自动恢复。remediation 后在 Step 9 重新登记全部验收。 @@ -60,6 +60,8 @@ export const MANTEAM_SKILL: SkillSpec = { 8. Film #2:仅 full 执行,先读 Film #1 报告并去重,只审查边界、安全、性能、并发和兼容性。targeted 的第二审是不适用,不能记为 skipped;只有用户明确要求才可跳过全部 review,并写入 \`review\` 和残余风险。 9. Post-game:汇总 blocker,只做一轮修复并用 \`workflow review ... remediate\` 记录;复验后写 summary 与 hand-off。验证失败、审查不完整或仍有 blocker 时标记 blocked,不得标 completed。 +实施中新证据若推翻已确认的目标、owner、source of truth 或验收,入口/流程会产生不同语义,status/contract/policy/transition 含义要变,发现 stale adapter、writer 不兼容、未完成 operation、active child/open handoff/active solo assignment,或变化超出 requirements/plan scope,立即停止,只返回 \`NEEDS_REALIGNMENT\` 和 \`MANCODE_REFRAME_REQUIRED\`。这是只读诊断:不得调用通用 workflow update 写 blocker,不改 metadata/step/policy/requirements/plan/claims/handoff,不归档或释放 authority。 + 如果用户在确认阶段选择"退出"或放弃团队 workflow:用 \`mancode workflow update --status abandoned\` 更新并清理 Active Plans;若有活跃 manba 子任务,先取得确认并逐个 abandoned。成功后再用 Edit 更新 state 回 solo。不要直接改 metadata,也不要把 abandoned workflow 留在 active state。 ## Team Hand-off Summary diff --git a/tests/adapter-upgrade-contracts.test.ts b/tests/adapter-upgrade-contracts.test.ts new file mode 100644 index 0000000..d87fe71 --- /dev/null +++ b/tests/adapter-upgrade-contracts.test.ts @@ -0,0 +1,340 @@ +import { createHash } from 'node:crypto'; +import { mkdir, readFile, rm, unlink, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { initializeV3Project } from '../src/commands/v3-init.js'; +import { type Ulid, createUlid } from '../src/context/ids.js'; +import { V3ContextStore } from '../src/context/store.js'; +import { upgradeV3Adapters } from '../src/installers/adapter-upgrade.js'; +import { + V3_ADAPTER_DIGEST_DOMAIN, + V3_ADAPTER_PLATFORMS, + adapterManagedContentDigest, + inspectV3Adapter, + inspectV3AdapterVersions, + installV3Adapter, + v3ModeEntryPath, +} from '../src/installers/v3-adapter.js'; +import { withOperationCrashInjectionForTesting } from '../src/runtime/operation-crash-injection.js'; +import { executeOperationRecovery } from '../src/runtime/operation-recovery-executor.js'; +import { createSession } from '../src/runtime/session.js'; +import { createLocalActor } from '../src/team/actor.js'; + +const NOW = new Date('2026-07-21T12:00:00.000Z'); + +describe('adapter managed-content digest and upgrade', () => { + let root: string; + let actorId: Ulid; + let sessionId: Ulid; + + beforeEach(async () => { + root = path.join( + tmpdir(), + `mancode-adapter-upgrade-${Date.now()}-${Math.random().toString(16).slice(2)}`, + ); + await mkdir(root, { recursive: true }); + await initializeV3Project({ + projectRoot: root, + operationId: id(1), + workspaceId: id(2), + schemaEpoch: id(3), + now: NOW, + }); + actorId = id(4); + sessionId = id(5); + await createLocalActor(root, { + actorId, + displayName: 'Adapter Maintainer', + now: NOW, + }); + await createSession(root, { + actorId, + sessionId, + client: 'vitest', + identitySource: 'explicit', + now: NOW, + }); + }); + + afterEach(async () => { + await rm(root, { recursive: true, force: true }); + }); + + it('uses the frozen domain-separated digest byte sequence', () => { + const expected = createHash('sha256') + .update(Buffer.from(V3_ADAPTER_DIGEST_DOMAIN, 'utf8')) + .update(Buffer.from([0])) + .update(Buffer.from('agents#codex', 'utf8')) + .update(Buffer.from([0])) + .update(Buffer.from('managed\nbytes', 'utf8')) + .digest('hex'); + + expect(adapterManagedContentDigest('agents#codex', 'managed\nbytes')).toBe( + `sha256:${expected}`, + ); + expect( + adapterManagedContentDigest('agents#zcode', 'managed\nbytes'), + ).not.toBe(`sha256:${expected}`); + }); + + it('inspects all five renderers and ignores user-owned embedded content', async () => { + for (const platform of V3_ADAPTER_PLATFORMS) { + await installV3Adapter(root, platform); + } + await writeFile( + path.join(root, 'AGENTS.md'), + `${await readFile(path.join(root, 'AGENTS.md'), 'utf8')}\n# User-owned note\n`, + ); + + const statuses = await Promise.all( + V3_ADAPTER_PLATFORMS.map((platform) => inspectV3Adapter(root, platform)), + ); + expect(statuses.every((status) => status.status === 'ready')).toBe(true); + const codexMode = statuses[1]?.targets.find( + (target) => target.identity === 'agents-mode-man', + ); + const zcodeMode = statuses[4]?.targets.find( + (target) => target.identity === 'agents-mode-man', + ); + expect(codexMode?.actualDigest).toBe(zcodeMode?.actualDigest); + }); + + it('classifies content, CRLF, truncation, missing files, and invalid UTF-8', async () => { + await installV3Adapter(root, 'codex'); + const agentsPath = path.join(root, 'AGENTS.md'); + const original = await readFile(agentsPath, 'utf8'); + + await writeFile( + agentsPath, + original.replace('mancode bootstrap', 'changed bootstrap'), + ); + await expect(inspectV3Adapter(root, 'codex')).resolves.toMatchObject({ + status: 'stale', + ready: false, + }); + + await writeFile(agentsPath, original.replaceAll('\n', '\r\n')); + await expect(inspectV3Adapter(root, 'codex')).resolves.toMatchObject({ + status: 'stale', + }); + + await writeFile( + agentsPath, + original.replace('', ''), + ); + await expect(inspectV3Adapter(root, 'codex')).resolves.toMatchObject({ + status: 'stale', + }); + + await writeFile(agentsPath, original); + await unlink(v3ModeEntryPath(root, 'codex', 'man')); + await expect(inspectV3Adapter(root, 'codex')).resolves.toMatchObject({ + status: 'missing', + installed: false, + }); + + await writeFile(v3ModeEntryPath(root, 'codex', 'man'), Buffer.from([0xff])); + await expect(inspectV3Adapter(root, 'codex')).resolves.toMatchObject({ + status: 'unreadable', + ready: false, + }); + }); + + it('keeps required missing platforms in inventory without inferring shared hosts', async () => { + await installV3Adapter(root, 'codex'); + + await expect( + inspectV3AdapterVersions(root, ['codex', 'zcode', 'cursor']), + ).resolves.toEqual({ + codex: '3', + cursor: 'missing', + zcode: 'missing', + }); + }); + + it('stages a dry-run without publishing live targets, then commits explicitly', async () => { + const live = path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'); + const preview = await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + dryRun: true, + operationId: id(10), + now: NOW, + }); + expect(preview).toMatchObject({ + state: 'preview', + dryRun: true, + journal: null, + status: { cursor: { status: 'missing' } }, + }); + await expect( + new V3ContextStore(root).readProjectSnapshot(), + ).resolves.toMatchObject({ manifest: { managedAdapters: {} } }); + await expect(readFile(live, 'utf8')).rejects.toThrow(); + await expect( + readFile(path.join(root, preview.stagedTargets[0] ?? ''), 'utf8'), + ).resolves.toContain('# mancode bootstrap'); + + const committed = await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + explicitConfirmation: true, + sessionId, + operationId: id(10), + now: NOW, + }); + expect(committed).toMatchObject({ + state: 'committed', + journal: { state: 'committed', type: 'adapter_upgrade' }, + status: { cursor: { status: 'ready' } }, + }); + await expect( + new V3ContextStore(root).readProjectSnapshot(), + ).resolves.toMatchObject({ + manifest: { managedAdapters: { cursor: '3' } }, + }); + await expect(readFile(live, 'utf8')).resolves.toContain( + '# mancode bootstrap', + ); + }); + + it('does not create staging or live targets without dry-run or confirmation', async () => { + const operationId = id(12); + await expect( + upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + operationId, + now: NOW, + }), + ).rejects.toThrow('MANCODE_EXPLICIT_CONFIRMATION_REQUIRED'); + await expect( + readFile(path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), 'utf8'), + ).rejects.toThrow(); + await expect( + readFile( + path.join( + root, + '.mancode', + 'staging', + 'adapters', + 'upgrade', + operationId, + '.cursor', + 'rules', + 'mancode-v3.mdc', + ), + 'utf8', + ), + ).rejects.toThrow(); + }); + + it('rejects a confirmation when the previewed adapter plan has changed', async () => { + const operationId = id(13); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + dryRun: true, + operationId, + now: NOW, + }); + await mkdir(path.join(root, '.cursor', 'rules'), { recursive: true }); + await writeFile( + path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + '# User-owned cursor rule\n', + ); + + await expect( + upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + explicitConfirmation: true, + sessionId, + operationId, + now: NOW, + }), + ).rejects.toThrow(); + }); + + it('upgrades all platforms while journaling shared targets only once', async () => { + await upgradeV3Adapters({ + projectRoot: root, + platforms: V3_ADAPTER_PLATFORMS, + dryRun: true, + operationId: id(14), + now: NOW, + }); + const upgraded = await upgradeV3Adapters({ + projectRoot: root, + platforms: V3_ADAPTER_PLATFORMS, + explicitConfirmation: true, + sessionId, + operationId: id(14), + now: NOW, + }); + + expect( + V3_ADAPTER_PLATFORMS.every( + (platform) => upgraded.status[platform].status === 'ready', + ), + ).toBe(true); + expect( + upgraded.filePlans.filter((plan) => plan.target === 'agents'), + ).toHaveLength(1); + expect( + upgraded.filePlans.filter((plan) => plan.target === 'agents-mode-man'), + ).toHaveLength(1); + const agents = await readFile(path.join(root, 'AGENTS.md'), 'utf8'); + expect(agents).toContain(''); + expect(agents).toContain(''); + }); + + it('repairs forward after a crash following one visible target write', async () => { + const operationId = id(20); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + dryRun: true, + operationId, + now: NOW, + }); + await expect( + withOperationCrashInjectionForTesting( + { + operationType: 'adapter_upgrade', + crashAfter: 'replace-managed-adapters:cursor-rule', + }, + () => + upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + explicitConfirmation: true, + sessionId, + operationId, + now: NOW, + }), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + + const repaired = await executeOperationRecovery({ + projectRoot: root, + operationId, + actorId, + sessionId, + now: new Date(NOW.getTime() + 1_000), + }); + expect(repaired).toMatchObject({ + state: 'repaired', + journal: { state: 'committed', type: 'adapter_upgrade' }, + }); + await expect(inspectV3Adapter(root, 'cursor')).resolves.toMatchObject({ + status: 'ready', + ready: true, + }); + }); +}); + +function id(offset: number): Ulid { + return createUlid(NOW.getTime() + offset, new Uint8Array(10).fill(offset)); +} diff --git a/tests/agents.test.ts b/tests/agents.test.ts index eabfc66..9fb9fe2 100644 --- a/tests/agents.test.ts +++ b/tests/agents.test.ts @@ -49,6 +49,27 @@ describe('coaching staff agents', () => { expect(SCOUT_AGENT.tools).not.toContain('Edit'); }); + it('scout records planning-governance evidence without claiming authority', () => { + for (const heading of [ + 'Current Behavior Evidence', + 'Candidate Semantic Owner', + 'Source of Truth', + 'Historical / Compatibility Impact', + ]) { + expect(SCOUT_AGENT.body).toContain(heading); + } + expect(SCOUT_AGENT.body).toMatch(/可复现观察/); + expect(SCOUT_AGENT.body).toMatch(/Confidence: high \| medium \| low/); + expect(SCOUT_AGENT.body).toMatch(/Authority:.*结构化文件/); + expect(SCOUT_AGENT.body).toMatch(/Existing workflows:.*no change/); + expect(SCOUT_AGENT.body).toContain('NEEDS_REALIGNMENT'); + expect(SCOUT_AGENT.body).toContain('MANCODE_REFRAME_REQUIRED'); + expect(SCOUT_AGENT.body).toMatch(/不(?:要)?调用通用.*workflow update/); + expect(SCOUT_AGENT.body).not.toMatch( + /workflow update[^\n]*--status blocked/, + ); + }); + it('plan coach is read-only and owns pre-confirmation plans', () => { expect(PLAN_COACH_AGENT.body).toMatch(/只读/); expect(PLAN_COACH_AGENT.body).toMatch(/plan\.md/); @@ -61,6 +82,44 @@ describe('coaching staff agents', () => { expect(PLAN_COACH_AGENT.tools).not.toContain('Bash'); }); + it('plan coach enforces comparable options and one recommendation', () => { + expect(PLAN_COACH_AGENT.body).toMatch(/同一个用户目标/); + expect(PLAN_COACH_AGENT.body).toContain('complexity_bearer'); + expect(PLAN_COACH_AGENT.body).toMatch(/唯一 recommendation/); + expect(PLAN_COACH_AGENT.body).toMatch(/简单任务.*只列一个/); + expect(PLAN_COACH_AGENT.body).toContain( + 'recommendation: ', + ); + expect(PLAN_COACH_AGENT.body).toContain('stop_conditions:'); + expect(PLAN_COACH_AGENT.body).toContain('Domain Matrix'); + expect(PLAN_COACH_AGENT.body).toContain('NEEDS_REALIGNMENT'); + expect(PLAN_COACH_AGENT.body).toContain('MANCODE_REFRAME_REQUIRED'); + expect(PLAN_COACH_AGENT.body).toMatch(/重复检查.*同一类诊断/); + expect(PLAN_COACH_AGENT.body).not.toMatch( + /workflow update[^\n]*--status blocked/, + ); + }); + + it('head coach keeps solo escalation advisory and realignment read-only', () => { + const routingSignals = [ + /平台入口或流程不一致/, + /semantic owner 不清/, + /source of truth.*不清/, + /status、contract、policy.*语义会变化/, + /scope、架构、成本或验收.*跨文件\/跨模块/, + /历史兼容/, + /迁移、跨平台/, + /团队协调证据/, + ]; + for (const signal of routingSignals) { + expect(HEAD_COACH_AGENT.body).toMatch(signal); + } + expect(HEAD_COACH_AGENT.body).toMatch(/不自动改变 mode/); + expect(HEAD_COACH_AGENT.body).toContain('NEEDS_REALIGNMENT'); + expect(HEAD_COACH_AGENT.body).toContain('MANCODE_REFRAME_REQUIRED'); + expect(HEAD_COACH_AGENT.body).toMatch(/这是只读诊断/); + }); + it('head coach body includes 5 core principles', () => { // 五条铁律的关键词(中文) expect(HEAD_COACH_AGENT.body).toMatch(/不做无关修改/); diff --git a/tests/aggregate-contracts.test.ts b/tests/aggregate-contracts.test.ts index ec134ca..f4edc7c 100644 --- a/tests/aggregate-contracts.test.ts +++ b/tests/aggregate-contracts.test.ts @@ -277,7 +277,7 @@ function metadata( requirementsDigest: requirements.contentDigest, planVersion: 2, planDecision: 'governed_execution', - policyVersions: { planning: 2, review: 2, verification: 1 }, + policyVersions: { planning: 2, review: 1, verification: 1 }, reviewStatus: review.status, reviewLedgerDigest: review.contentDigest, verificationStatus: verification.status, diff --git a/tests/authorization-contracts.test.ts b/tests/authorization-contracts.test.ts index e370e98..02d3932 100644 --- a/tests/authorization-contracts.test.ts +++ b/tests/authorization-contracts.test.ts @@ -14,7 +14,7 @@ const SESSION_ID = '01JZ4B6W5Z0A1B2C3D4E5F6G7K'; describe('cooperative authorization matrix', () => { it('freezes all documented mutating actor rules and keeps the trust boundary explicit', () => { - expect(AUTHORIZATION_MATRIX).toHaveLength(15); + expect(AUTHORIZATION_MATRIX).toHaveLength(16); const decision = evaluateAuthorization(baseRequest()); expect(decision).toEqual({ allowed: true, @@ -47,6 +47,29 @@ describe('cooperative authorization matrix', () => { ).toThrow('MANCODE_SCOPE_OUTSIDE_IMPLEMENTATION_SCOPE'); }); + it('authorizes explicit project maintenance without requiring team join', () => { + const maintenance: AuthorizationRequest = { + ...baseRequest(), + action: 'project_maintenance', + joined: false, + sharedWriteGuard: 'unavailable', + task: null, + }; + expect(evaluateAuthorization(maintenance)).toMatchObject({ + allowed: true, + failures: [], + }); + expect(() => + assertAuthorized({ + ...maintenance, + conditions: { + ...maintenance.conditions, + explicitConfirmation: false, + }, + }), + ).toThrow('MANCODE_EXPLICIT_CONFIRMATION_REQUIRED'); + }); + it('forbids P0 waivers and binds repair to the original actor/session authorization', () => { const waiver = { ...baseRequest(), diff --git a/tests/beta-gate-contracts.test.ts b/tests/beta-gate-contracts.test.ts index d5eb67b..4e6622e 100644 --- a/tests/beta-gate-contracts.test.ts +++ b/tests/beta-gate-contracts.test.ts @@ -26,6 +26,13 @@ describe('V3 Beta gate', () => { await mkdir(root, { recursive: true }); await initializeV3Project({ projectRoot: root, + managedAdapters: { + 'claude-code': '3', + codex: '3', + cursor: '3', + copilot: '3', + zcode: '3', + }, operationId: id(1), workspaceId: id(2), schemaEpoch: id(3), @@ -38,6 +45,7 @@ describe('V3 Beta gate', () => { }); it('refuses Beta while real-host spike evidence and adapters are missing', async () => { + await rm(path.join(root, '.cursor', 'rules', 'mancode-v3.mdc')); const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); try { expect( diff --git a/tests/cli-v3-surface-contracts.test.ts b/tests/cli-v3-surface-contracts.test.ts index 84c75ca..75b5229 100644 --- a/tests/cli-v3-surface-contracts.test.ts +++ b/tests/cli-v3-surface-contracts.test.ts @@ -17,14 +17,21 @@ describe('V3 CLI command surface', () => { 'operation', 'team', 'migrate', + 'adapter', ]), ); expect(commandAt(cliProgram, 'context', 'session', 'new')).toBeDefined(); + expect(commandAt(cliProgram, 'context', 'session', 'show')).toBeDefined(); + expect( + requiredOptions(commandAt(cliProgram, 'context', 'session', 'show')), + ).toEqual(['--session']); expect( commandAt(cliProgram, 'context', 'session', 'spike'), ).toBeDefined(); expect(commandAt(cliProgram, 'operation', 'repair')).toBeDefined(); expect(commandAt(cliProgram, 'operation', 'abort')).toBeDefined(); + expect(commandAt(cliProgram, 'adapter', 'status')).toBeDefined(); + expect(commandAt(cliProgram, 'adapter', 'upgrade')).toBeDefined(); expect(commandAt(cliProgram, 'team', 'sync', 'pull')).toBeDefined(); expect(commandAt(cliProgram, 'team', 'sync', 'push')).toBeDefined(); expect(commandAt(cliProgram, 'team', 'handoff', 'accept')).toBeDefined(); diff --git a/tests/compatibility-contracts.test.ts b/tests/compatibility-contracts.test.ts index acecbd6..d905c8b 100644 --- a/tests/compatibility-contracts.test.ts +++ b/tests/compatibility-contracts.test.ts @@ -1,12 +1,16 @@ import { describe, expect, it } from 'vitest'; import { + CURRENT_WRITER_CAPABILITIES, type CompatibilityFailureCode, type CompatibilityGateInput, assertCompatibilityGate, compareSemver, evaluateCompatibilityGate, } from '../src/context/compatibility.js'; -import type { SchemaManifestV1 } from '../src/context/manifest.js'; +import type { + SchemaManifestV1, + SchemaManifestV2, +} from '../src/context/manifest.js'; const EPOCH = '01JZ4B6W5Z0A1B2C3D4E5F6G7H'; const BASELINE = { @@ -65,9 +69,52 @@ describe('schema compatibility gate', () => { ); }); - it('blocks writes for both missing and mismatched managed adapters', () => { + it('requires the registered adapter inventory to match disk exactly', () => { const active = activeInput(); + const codexOnly = activeInput({ managedAdapters: { codex: '3' } }); + expect( + evaluateCompatibilityGate({ + ...codexOnly, + operation: 'v3_business_write', + }), + ).toMatchObject({ writeAllowed: true, failures: [] }); + expectWriteBlocked( + { + ...active, + adapterVersions: { + ...active.adapterVersions, + codex: 'missing', + }, + operation: 'v3_business_write', + }, + ['MANCODE_ADAPTER_CONTENT_STALE'], + true, + ); + try { + assertCompatibilityGate({ + ...codexOnly, + adapterVersions: { codex: 'stale' }, + operation: 'v3_business_write', + }); + throw new Error('expected stale adapter compatibility failure'); + } catch (error) { + expect(error).toMatchObject({ + details: { + repair: [ + { + platform: 'codex', + previewCommand: + 'mancode adapter upgrade --platform codex --dry-run', + confirmCommand: expect.stringContaining( + '--platform codex --confirm --operation-id ', + ), + }, + ], + }, + }); + expect(JSON.stringify(error)).not.toContain('--all'); + } expectWriteBlocked( { ...active, @@ -77,6 +124,15 @@ describe('schema compatibility gate', () => { ['MANCODE_ADAPTER_VERSION_MISMATCH'], true, ); + expectWriteBlocked( + { + ...codexOnly, + adapterVersions: { ...codexOnly.adapterVersions, cursor: '3' }, + operation: 'v3_business_write', + }, + ['MANCODE_ADAPTER_VERSION_MISMATCH'], + true, + ); expectWriteBlocked( { ...active, @@ -88,6 +144,56 @@ describe('schema compatibility gate', () => { ); }); + it('requires explicit writer capabilities before any Policy 2 write', () => { + const base = activeInput(); + const manifest: SchemaManifestV2 = { + ...base.manifest, + manifestVersion: 2, + workflowPolicyDefaults: { planning: 2 }, + }; + const input = { ...base, manifest }; + expectWriteBlocked( + { + ...input, + writerCapabilities: ['planning-policy:1'], + operation: 'v3_business_write', + }, + ['MANCODE_WRITER_CAPABILITY_MISSING'], + true, + ); + expect(() => + assertCompatibilityGate({ + ...input, + writerCapabilities: ['planning-policy:1'], + operation: 'v3_business_write', + }), + ).toThrow(/planning-policy:2/); + }); + + it('requires the adapter digest and local reframe capabilities for reframe', () => { + const input = activeInput(); + expectWriteBlocked( + { + ...input, + writerCapabilities: ['planning-policy:1', 'adapter-digest:1'], + operation: 'reframe', + }, + ['MANCODE_WRITER_CAPABILITY_MISSING'], + true, + ); + expect( + evaluateCompatibilityGate({ + ...input, + writerCapabilities: [ + 'planning-policy:1', + 'adapter-digest:1', + 'reframe-local:1', + ], + operation: 'reframe', + }), + ).toMatchObject({ writeAllowed: true, failures: [] }); + }); + it('blocks writes when the legacy authority drifts from its baseline', () => { expectWriteBlocked( { @@ -113,7 +219,7 @@ describe('schema compatibility gate', () => { { ...active, expectedSchemaEpoch: '01JZ4B6W5Z0A1B2C3D4E5F6G7J', - adapterVersions: withoutCodex(active.adapterVersions), + adapterVersions: { ...active.adapterVersions, codex: '2' }, currentLegacyBaseline: { ...BASELINE, workflowIndexDigest: `sha256:${'c'.repeat(64)}`, @@ -168,19 +274,16 @@ function expectWriteBlocked( failures, }); expect(() => assertCompatibilityGate(input)).toThrowError( - new RegExp(`^${failures[0]}$`), + new RegExp(`^${failures[0]}:`), ); } function withoutCodex( adapters: SchemaManifestV1['managedAdapters'], ): CompatibilityGateInput['adapterVersions'] { - return { - 'claude-code': adapters['claude-code'], - cursor: adapters.cursor, - copilot: adapters.copilot, - zcode: adapters.zcode, - }; + return Object.fromEntries( + Object.entries(adapters).filter(([adapter]) => adapter !== 'codex'), + ); } function baseInput(overrides: Partial) { @@ -208,6 +311,7 @@ function baseInput(overrides: Partial) { expectedSchemaEpoch: EPOCH, readerVersion: '0.4.0', writerVersion: '0.4.0', + writerCapabilities: CURRENT_WRITER_CAPABILITIES, adapterVersions: { ...manifest.managedAdapters }, currentLegacyBaseline: manifest.legacyBaseline, legacyAuthorityPresent: manifest.legacyBaseline !== null, diff --git a/tests/context-resolver-contracts.test.ts b/tests/context-resolver-contracts.test.ts index d2f3b59..941365b 100644 --- a/tests/context-resolver-contracts.test.ts +++ b/tests/context-resolver-contracts.test.ts @@ -7,6 +7,7 @@ import { taskAggregateDigest, } from '../src/context/aggregate.js'; import { digestCanonicalJson } from '../src/context/canonical.js'; +import { CURRENT_WRITER_CAPABILITIES } from '../src/context/compatibility.js'; import { type RequirementsLedgerV1, requirementsLedgerDigest, @@ -297,6 +298,7 @@ async function createFixture() { expectedSchemaEpoch: EPOCH, readerVersion: '1.0.0', writerVersion: '1.0.0', + writerCapabilities: CURRENT_WRITER_CAPABILITIES, adapterVersions: adapters(), }, resolver: new ContextResolver({ diff --git a/tests/cursor-adapter.test.ts b/tests/cursor-adapter.test.ts index 9154f9a..daff11b 100644 --- a/tests/cursor-adapter.test.ts +++ b/tests/cursor-adapter.test.ts @@ -66,6 +66,10 @@ describe('Cursor adapter', () => { expect(solo).toContain('read `.mancode/aesthetics/style-tokens.json`'); expect(solo).toContain('one bounded self-check'); expect(solo).toContain('Do not start another reviewer'); + expect(solo).toContain('semantic owner or source of truth is unclear'); + expect(solo).toContain('NEEDS_REALIGNMENT'); + expect(solo).toContain('MANCODE_REFRAME_REQUIRED'); + expect(solo).toContain('do not call generic workflow update'); const man = await readRule('mancode-man.mdc'); expect(man).toContain('alwaysApply: false'); diff --git a/tests/greenfield-init-contracts.test.ts b/tests/greenfield-init-contracts.test.ts index bdadc18..3105334 100644 --- a/tests/greenfield-init-contracts.test.ts +++ b/tests/greenfield-init-contracts.test.ts @@ -18,6 +18,7 @@ import { stageGreenfieldInitialization, } from '../src/context/greenfield-init.js'; import { parseSchemaManifest } from '../src/context/manifest.js'; +import { inspectV3AdapterVersions } from '../src/installers/v3-adapter.js'; import { withOperationCrashInjectionForTesting } from '../src/runtime/operation-crash-injection.js'; import { OPERATION_CRASH_FIXTURES } from '../src/runtime/operation-definition.js'; @@ -59,8 +60,10 @@ describe('journaled greenfield initialization contract', () => { ), ); expect(manifest).toMatchObject({ + manifestVersion: 2, activationState: 'v3_active', legacyBaseline: null, + workflowPolicyDefaults: { planning: 2 }, }); expect( await readFile(path.join(root, '.mancode', '.gitignore'), 'utf8'), @@ -196,6 +199,50 @@ describe('journaled greenfield initialization contract', () => { expect(registrations).toBeGreaterThanOrEqual(1); } }); + + it('keeps V2 inactive and forward-repairs a crash after the first adapter target', async () => { + const recoveryInput = { + projectRoot: root, + operationId: OPERATION_ID, + registerWorkspaceBinding: async () => {}, + now: new Date('2026-07-17T12:03:00.000Z'), + }; + await expect( + withOperationCrashInjectionForTesting( + { + operationType: 'greenfield_initialize', + crashAfter: 'publish-managed-adapters:claude-skill', + }, + () => initializeGreenfield(input(root), recoveryInput), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + + expect( + parseSchemaManifest( + JSON.parse( + await readFile(path.join(root, '.mancode', 'schema.json'), 'utf8'), + ), + ).activationState, + ).toBe('initializing'); + await expect(recoverGreenfieldInitialization(recoveryInput)).resolves.toBe( + 'forward_repaired', + ); + await expect( + inspectV3AdapterVersions(root, [ + 'claude-code', + 'codex', + 'cursor', + 'copilot', + 'zcode', + ]), + ).resolves.toEqual({ + 'claude-code': '3', + codex: '3', + cursor: '3', + copilot: '3', + zcode: '3', + }); + }); }); async function pathExists(target: string): Promise { diff --git a/tests/manifest-session-contracts.test.ts b/tests/manifest-session-contracts.test.ts index 3baabc5..614c0b9 100644 --- a/tests/manifest-session-contracts.test.ts +++ b/tests/manifest-session-contracts.test.ts @@ -88,6 +88,55 @@ describe('schema manifest contract', () => { /invalid schema manifest transition/, ); }); + + it('strictly separates V1 from the Policy 2 V2 manifest shape', () => { + expect(() => + parseSchemaManifest({ + ...manifest({}), + workflowPolicyDefaults: { planning: 2 }, + }), + ).toThrow(/unknown field\(s\): workflowPolicyDefaults/); + + const v2 = parseSchemaManifest({ + ...manifest({}), + manifestVersion: 2, + workflowPolicyDefaults: { planning: 2 }, + }); + expect(v2).toMatchObject({ + manifestVersion: 2, + workflowPolicyDefaults: { planning: 2 }, + }); + expect(() => + parseSchemaManifest({ + ...v2, + minWriterVersion: '0.4.0-beta.1', + }), + ).toThrow(/V2 requires minReaderVersion and minWriterVersion 0.4.0/); + expect(() => + parseSchemaManifest({ + ...manifest({}), + manifestVersion: 2, + workflowPolicyDefaults: { + planning: 2, + review: 1, + }, + }), + ).toThrow(/unknown field\(s\): review/); + }); + + it('treats managedAdapters as the registered required-platform inventory', () => { + expect( + parseSchemaManifest(manifest({ managedAdapters: {} })).managedAdapters, + ).toEqual({}); + expect( + parseSchemaManifest( + manifest({ managedAdapters: { codex: '3', cursor: '3' } }), + ).managedAdapters, + ).toEqual({ codex: '3', cursor: '3' }); + expect(() => + parseSchemaManifest(manifest({ managedAdapters: { codex: '' } })), + ).toThrow(/managedAdapters\.codex must be a non-empty version/); + }); }); describe('session identity contract', () => { diff --git a/tests/migrate-contracts.test.ts b/tests/migrate-contracts.test.ts index 626d443..ec465f5 100644 --- a/tests/migrate-contracts.test.ts +++ b/tests/migrate-contracts.test.ts @@ -551,7 +551,7 @@ async function writeLegacyFixture(root: string): Promise { status: 'in_progress', planVersion: 2, planningPolicyVersion: 2, - reviewPolicyVersion: 2, + reviewPolicyVersion: 1, verificationPolicyVersion: 1, requirementsStatus: 'ready', requirementsDigest: diff --git a/tests/operation-definition-contracts.test.ts b/tests/operation-definition-contracts.test.ts index f22a301..7874dde 100644 --- a/tests/operation-definition-contracts.test.ts +++ b/tests/operation-definition-contracts.test.ts @@ -11,7 +11,7 @@ const ID = '01JZ4B6W5Z0A1B2C3D4E5F6G7H'; describe('machine-readable operation definitions', () => { it('gives every hard-consistency operation steps, a visible commit point, and crash recovery fixtures', () => { - expect(Object.keys(OPERATION_DEFINITIONS)).toHaveLength(23); + expect(Object.keys(OPERATION_DEFINITIONS)).toHaveLength(26); for (const definition of Object.values(OPERATION_DEFINITIONS)) { expect(definition.steps.at(-1)).toMatchObject({ id: 'commit', diff --git a/tests/project-policy-upgrade-contracts.test.ts b/tests/project-policy-upgrade-contracts.test.ts new file mode 100644 index 0000000..e4efccb --- /dev/null +++ b/tests/project-policy-upgrade-contracts.test.ts @@ -0,0 +1,311 @@ +import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { status } from '../src/commands/status.js'; +import { initializeV3Project } from '../src/commands/v3-init.js'; +import { digestCanonicalJson } from '../src/context/canonical.js'; +import { type Ulid, createUlid } from '../src/context/ids.js'; +import { + dryRunProjectPolicyUpgrade, + upgradeProjectPolicy, +} from '../src/context/project-policy-upgrade.js'; +import { taskRootPath } from '../src/context/task-locator.js'; +import { createV3Workflow } from '../src/context/workflow-create.js'; +import { parseWorkflowMetadata } from '../src/context/workflow-metadata.js'; +import { updateV3Workflow } from '../src/context/workflow-update.js'; +import { withOperationCrashInjectionForTesting } from '../src/runtime/operation-crash-injection.js'; +import { OPERATION_CRASH_FIXTURES } from '../src/runtime/operation-definition.js'; +import { + executeOperationRecovery, + listUnfinishedOperationRecoveries, +} from '../src/runtime/operation-recovery-executor.js'; +import { createSession } from '../src/runtime/session.js'; +import { createLocalActor } from '../src/team/actor.js'; + +const NOW = new Date('2026-07-21T10:00:00.000Z'); + +describe('project Policy 2 upgrade', () => { + let root: string; + + beforeEach(async () => { + root = path.join( + tmpdir(), + `mancode-project-policy-${Date.now()}-${Math.random().toString(16).slice(2)}`, + ); + await mkdir(root, { recursive: true }); + }); + + afterEach(async () => { + await rm(root, { recursive: true, force: true }); + }); + + it('dry-runs without writes, commits V1 to V2, and preserves old workflow provenance', async () => { + const { actorId, sessionId } = await bootstrap(root, 0); + const oldWorkflow = await createV3Workflow({ + projectRoot: root, + task: 'Preserve the Policy 1 workflow.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(10), + operationId: id(11), + now: NOW, + }); + expect(oldWorkflow.metadata.governance.policyVersions.planning).toBe(1); + const schemaPath = path.join(root, '.mancode', 'schema.json'); + const oldMetadataPath = path.join( + taskRootPath(root, oldWorkflow.taskRef), + 'metadata.json', + ); + const [schemaBefore, oldMetadataBefore] = await Promise.all([ + readFile(schemaPath, 'utf8'), + readFile(oldMetadataPath, 'utf8'), + ]); + + const preview = await dryRunProjectPolicyUpgrade({ + projectRoot: root, + policyVersion: 2, + operationId: id(12), + now: NOW, + }); + expect(preview).toMatchObject({ + policy: 2, + currentManifestVersion: 1, + willUpgrade: true, + blockers: [], + operationId: id(12), + minReaderVersion: '0.4.0', + minWriterVersion: '0.4.0', + }); + await expect(readFile(schemaPath, 'utf8')).resolves.toBe(schemaBefore); + + const upgraded = await upgradeProjectPolicy({ + projectRoot: root, + policyVersion: 2, + sessionId, + operationId: id(12), + now: NOW, + }); + expect(upgraded).toMatchObject({ + state: 'committed', + manifest: { + manifestVersion: 2, + workflowPolicyDefaults: { planning: 2 }, + lastOperationId: id(12), + }, + operation: { type: 'project_policy_upgrade', state: 'committed' }, + }); + expect(digestCanonicalJson(upgraded.manifest)).toBe(preview.afterDigest); + await expect(readFile(oldMetadataPath, 'utf8')).resolves.toBe( + oldMetadataBefore, + ); + + const newWorkflow = await createV3Workflow({ + projectRoot: root, + task: 'Use the upgraded planning policy.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(14), + operationId: id(15), + now: new Date(NOW.getTime() + 1_000), + }); + expect(newWorkflow.metadata.governance.policyVersions).toEqual({ + planning: 2, + review: 1, + verification: 1, + }); + const oldMetadata = parseWorkflowMetadata( + JSON.parse(await readFile(oldMetadataPath, 'utf8')), + ); + expect(oldMetadata.governance.policyVersions.planning).toBe(1); + }); + + it('repairs or safely aborts every declared project-upgrade crash point', async () => { + for (const [ + index, + fixture, + ] of OPERATION_CRASH_FIXTURES.project_policy_upgrade.entries()) { + const caseRoot = path.join(root, `crash-${index}`); + await mkdir(caseRoot, { recursive: true }); + const { actorId, sessionId } = await bootstrap(caseRoot, index + 20); + const operationId = id(index + 100); + + await dryRunProjectPolicyUpgrade({ + projectRoot: caseRoot, + policyVersion: 2, + operationId, + now: NOW, + }); + + await expect( + withOperationCrashInjectionForTesting(fixture, () => + upgradeProjectPolicy({ + projectRoot: caseRoot, + policyVersion: 2, + sessionId, + operationId, + now: NOW, + }), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + + const recovered = await executeOperationRecovery({ + projectRoot: caseRoot, + operationId, + actorId, + sessionId, + now: NOW, + }); + const manifest = JSON.parse( + await readFile(path.join(caseRoot, '.mancode', 'schema.json'), 'utf8'), + ) as { manifestVersion: number }; + if (fixture.expectedRecovery === 'safe_abort') { + expect(recovered.journal.state).toBe('aborted'); + expect(manifest.manifestVersion).toBe(1); + } else { + expect(recovered.journal.state).toBe('committed'); + expect(manifest.manifestVersion).toBe(2); + } + } + }); + + it('blocks ordinary writes after a visible upgrade crash and repairs on retry', async () => { + const { sessionId } = await bootstrap(root, 40); + const existing = await createV3Workflow({ + projectRoot: root, + task: 'Keep an existing Policy 1 workflow stable during repair.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(50), + operationId: id(51), + now: NOW, + }); + const operationId = id(52); + await dryRunProjectPolicyUpgrade({ + projectRoot: root, + policyVersion: 2, + operationId, + now: NOW, + }); + + await expect( + withOperationCrashInjectionForTesting( + { + operationType: 'project_policy_upgrade', + crashAfter: 'write-manifest', + }, + () => + upgradeProjectPolicy({ + projectRoot: root, + policyVersion: 2, + sessionId, + operationId, + now: NOW, + }), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + await expect( + listUnfinishedOperationRecoveries(root), + ).resolves.toMatchObject([ + { journal: { operationId, state: 'repair_required' } }, + ]); + + const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); + try { + await expect(status(root, { brief: true, json: true })).resolves.toBe(0); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + state: 'unavailable', + ready: false, + blockers: expect.arrayContaining(['MANCODE_OPERATION_REPAIR_REQUIRED']), + }); + } finally { + logs.mockRestore(); + } + + await expect( + createV3Workflow({ + projectRoot: root, + task: 'Do not create authority while project repair is required.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(53), + operationId: id(54), + now: new Date(NOW.getTime() + 1_000), + }), + ).rejects.toThrow('MANCODE_OPERATION_REPAIR_REQUIRED'); + await expect( + updateV3Workflow({ + projectRoot: root, + taskRef: existing.taskRef, + sessionId, + expectedTaskRevision: existing.metadata.revision, + status: 'blocked', + blockingReason: 'Project policy repair must finish first.', + operationId: id(55), + now: new Date(NOW.getTime() + 1_000), + }), + ).rejects.toThrow('MANCODE_OPERATION_REPAIR_REQUIRED'); + + await expect( + upgradeProjectPolicy({ + projectRoot: root, + policyVersion: 2, + sessionId, + operationId, + now: new Date(NOW.getTime() + 2_000), + }), + ).resolves.toMatchObject({ + state: 'committed', + operation: { operationId, state: 'committed' }, + manifest: { manifestVersion: 2 }, + }); + await expect(listUnfinishedOperationRecoveries(root)).resolves.toEqual([]); + }); +}); + +async function bootstrap( + projectRoot: string, + offset: number, +): Promise<{ actorId: Ulid; sessionId: Ulid }> { + await initializeV3Project({ + projectRoot, + operationId: id(offset + 1), + workspaceId: id(offset + 2), + schemaEpoch: id(offset + 3), + now: NOW, + }); + const schemaPath = path.join(projectRoot, '.mancode', 'schema.json'); + const historical = JSON.parse(await readFile(schemaPath, 'utf8')) as Record< + string, + unknown + >; + historical.manifestVersion = 1; + historical.workflowPolicyDefaults = undefined; + await writeFile(schemaPath, `${JSON.stringify(historical, null, 2)}\n`); + const actorId = id(offset + 4); + const sessionId = id(offset + 5); + await createLocalActor(projectRoot, { + actorId, + displayName: 'Policy Upgrade User', + now: NOW, + }); + await createSession(projectRoot, { + actorId, + sessionId, + client: 'vitest', + identitySource: 'explicit', + now: NOW, + }); + return { actorId, sessionId }; +} + +function id(offset: number): Ulid { + return createUlid( + Date.parse('2026-07-21T00:00:00.000Z') + offset, + new Uint8Array(10).fill(offset), + ); +} diff --git a/tests/projection-eventual-consistency-e2e.test.ts b/tests/projection-eventual-consistency-e2e.test.ts index 3bafece..ff928dd 100644 --- a/tests/projection-eventual-consistency-e2e.test.ts +++ b/tests/projection-eventual-consistency-e2e.test.ts @@ -5,7 +5,16 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { contextDoctor } from '../src/commands/context.js'; import { initializeV3Project } from '../src/commands/v3-init.js'; import { createV3Checkpoint } from '../src/context/checkpoint-create.js'; +import { CURRENT_WRITER_CAPABILITIES } from '../src/context/compatibility.js'; import { type Ulid, createUlid } from '../src/context/ids.js'; +import { reviseV3Plan } from '../src/context/plan-revision.js'; +import { finalizeV3Requirements } from '../src/context/requirements-finalize.js'; +import { + REQUIREMENT_DIMENSIONS, + type RequirementsLedgerV1, + parseRequirementsLedger, + requirementsLedgerDigest, +} from '../src/context/requirements-ledger.js'; import { ContextResolver } from '../src/context/resolver.js'; import { V3ContextStore } from '../src/context/store.js'; import { taskRootPath } from '../src/context/task-locator.js'; @@ -15,6 +24,7 @@ import { OPERATION_CRASH_FIXTURES } from '../src/runtime/operation-definition.js import { readProjectRuntimeContext } from '../src/runtime/project-runtime.js'; import { type CacheInvalidationProjectionTargetV1, + enqueueSessionPointerProjection, listProjectionIntents, projectionCachePath, } from '../src/runtime/projection-outbox.js'; @@ -164,6 +174,107 @@ describe('eventual projection filesystem E2E', () => { await expect(listProjectionIntents(root)).resolves.toEqual([]); }); + it('repairs a failed plan-only clear and never lets an older resume projection rebind it', async () => { + const created = await createV3Workflow({ + projectRoot: root, + task: 'Keep plan-only authority detached from the active session.', + workflowMode: 'man', + sessionId: SESSION_ID, + client: 'vitest', + taskId: id(40), + operationId: id(41), + now: NOW, + }); + const finalized = await finalizeV3Requirements({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: SESSION_ID, + expectedTaskRevision: created.metadata.revision, + requirements: confirmedRequirements(created.requirements), + operationId: id(42), + now: NOW, + }); + const plan = '# Plan\n\n1. Keep this plan without executing it.\n'; + const revised = await reviseV3Plan({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: SESSION_ID, + expectedTaskRevision: finalized.metadata.revision, + plan, + operationId: id(43), + now: NOW, + }); + const staleResumeOperationId = id(44); + await enqueueSessionPointerProjection(root, { + operationId: staleResumeOperationId, + action: 'resume', + sessionId: SESSION_ID, + expectedPreviousTaskRef: null, + taskRef: created.taskRef, + workflowMode: created.metadata.workflowMode, + taskRevision: revised.metadata.revision, + now: NOW, + }); + const planOnlyOperationId = id(45); + const sessionLock = path.join( + root, + '.mancode', + 'local', + 'sessions', + `.${SESSION_ID}.lock`, + ); + await mkdir(sessionLock); + + const planned = await reviseV3Plan({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: SESSION_ID, + expectedTaskRevision: revised.metadata.revision, + plan, + planDecision: 'plan_only', + operationId: planOnlyOperationId, + now: NOW, + }); + expect(planned).toMatchObject({ + metadata: { + status: 'planned', + governance: { + planDecision: 'plan_only', + planVersion: revised.metadata.governance.planVersion, + }, + }, + operation: { state: 'committed' }, + }); + await expect(readSession(root, SESSION_ID)).resolves.toMatchObject({ + activeTaskRef: created.taskRef, + }); + await expect(listProjectionIntents(root)).resolves.toHaveLength(2); + + await rm(sessionLock, { recursive: true }); + await expect(runDoctorRepair(root, planOnlyOperationId)).resolves.toBe(0); + await expect(readSession(root, SESSION_ID)).resolves.toMatchObject({ + activeTaskRef: null, + activeMode: null, + lastSeenRevision: null, + }); + + await expect(runDoctorRepair(root, staleResumeOperationId)).resolves.toBe( + 0, + ); + await expect(readSession(root, SESSION_ID)).resolves.toMatchObject({ + activeTaskRef: null, + activeMode: null, + lastSeenRevision: null, + }); + await expect(listProjectionIntents(root)).resolves.toEqual([]); + await expect( + listProjectionIntents(root, { + operationId: staleResumeOperationId, + includeTerminal: true, + }), + ).resolves.toMatchObject([{ state: 'superseded' }]); + }); + it.each(['closed', 'missing'] as const)( 'supersedes a session projection when its target session is %s', async (targetState) => { @@ -359,7 +470,8 @@ async function resolveTask( expectedSchemaEpoch: project.manifest.epoch, readerVersion: project.manifest.minReaderVersion, writerVersion: project.manifest.minWriterVersion, - adapterVersions: project.manifest.managedAdapters, + writerCapabilities: CURRENT_WRITER_CAPABILITIES, + adapterVersions: {}, }, generatedAt: NOW, }); @@ -385,6 +497,49 @@ async function runDoctorRepair( } } +function confirmedRequirements( + previous: RequirementsLedgerV1, +): RequirementsLedgerV1 { + const draft: RequirementsLedgerV1 = { + ...previous, + revision: 99, + status: 'confirmed', + goal: 'Preserve a plan without retaining an active workflow pointer.', + functionalScope: { + inScope: ['Plan-only session projection'], + outOfScope: [], + }, + technicalDecisions: [], + defaults: [], + coverage: REQUIREMENT_DIMENSIONS.map((dimension, index) => ({ + coverageId: id(60 + index), + dimension, + status: dimension === 'technical_stack' ? 'not_applicable' : 'confirmed', + rationale: `Confirmed ${dimension} coverage.`, + })), + requirements: [], + acceptanceCriteria: [ + { + displayId: 'AC-1', + legacyId: null, + criterionId: id(68), + requirementIds: [], + statement: 'The active session pointer is cleared after plan-only.', + required: true, + verificationRequirement: 'automated', + }, + ], + blockingUnknowns: [], + contentDigest: '', + lastOperationId: id(69), + updatedAt: NOW.toISOString(), + }; + return parseRequirementsLedger({ + ...draft, + contentDigest: requirementsLedgerDigest(draft), + }); +} + function id(offset: number): Ulid { return createUlid( Date.parse('2026-07-18T00:00:00.000Z') + offset, diff --git a/tests/shared-content.test.ts b/tests/shared-content.test.ts index f604e24..cf9e1a4 100644 --- a/tests/shared-content.test.ts +++ b/tests/shared-content.test.ts @@ -52,6 +52,11 @@ describe('generateSharedContent', () => { expect(content).toContain('Platform Downgrade'); expect(content).toContain('Simulate the coaching staff'); expect(content).toContain('Scout, Plan Coach, Head Coach'); + expect(content).toContain('semantic owner or source of truth is unclear'); + expect(content).toContain('historical compatibility'); + expect(content).toContain('NEEDS_REALIGNMENT'); + expect(content).toContain('MANCODE_REFRAME_REQUIRED'); + expect(content).toContain('do not call generic workflow update'); }); it('renders the public manba name for legacy workflow state', async () => { diff --git a/tests/skills.test.ts b/tests/skills.test.ts index 50781fe..f961d54 100644 --- a/tests/skills.test.ts +++ b/tests/skills.test.ts @@ -66,6 +66,18 @@ describe('mvp-2 skills', () => { expect(MAN_SKILL.body).toMatch(/workflow decide/); expect(MAN_SKILL.body).toMatch(/solo 轻量执行/); expect(MAN_SKILL.body).toMatch(/开工回执/); + expect(MAN_SKILL.body).toMatch(/Current Behavior Evidence/); + expect(MAN_SKILL.body).toMatch(/Candidate Semantic Owner/); + expect(MAN_SKILL.body).toMatch(/Source of Truth/); + expect(MAN_SKILL.body).toMatch(/Historical \/ Compatibility Impact/); + expect(MAN_SKILL.body).toMatch(/complexity bearer/); + expect(MAN_SKILL.body).toMatch(/一个 recommendation/); + expect(MAN_SKILL.body).toMatch(/简单任务.*只列一个方向/); + expect(MAN_SKILL.body).toMatch(/stop conditions/); + expect(MAN_SKILL.body).toMatch(/Domain Matrix/); + expect(MAN_SKILL.body).toContain('NEEDS_REALIGNMENT'); + expect(MAN_SKILL.body).toContain('MANCODE_REFRAME_REQUIRED'); + expect(MAN_SKILL.body).toMatch(/不得调用通用.*workflow update.*blocked/); }); it('keeps solo review bounded and lightweight', () => { @@ -77,6 +89,22 @@ describe('mvp-2 skills', () => { expect(SOLO_SKILL).toMatch(/activeSoloPlan/); expect(SOLO_SKILL).toMatch(/不重新规划/); expect(SOLO_SKILL).toMatch(/handoff --complete/); + for (const signal of [ + /平台入口或流程不一致/, + /semantic owner 不清/, + /source of truth.*不清/, + /status、contract、policy.*语义会变化/, + /scope、架构、成本或验收.*跨文件\/跨模块/, + /历史兼容/, + /迁移、跨平台/, + /团队协调证据/, + ]) { + expect(SOLO_SKILL).toMatch(signal); + } + expect(SOLO_SKILL).toMatch(/不自动改变 mode/); + expect(SOLO_SKILL).toContain('NEEDS_REALIGNMENT'); + expect(SOLO_SKILL).toContain('MANCODE_REFRAME_REQUIRED'); + expect(SOLO_SKILL).toMatch(/这是只读诊断/); }); it('defines manba diagnosis and real browser validation boundaries', () => { @@ -122,6 +150,14 @@ describe('mvp-2 skills', () => { expect(man).toMatch(/targeted review/); expect(man).toMatch(/one remediation round/); expect(man).toMatch(/workflow review/); + expect(man).toMatch(/Current Behavior Evidence/); + expect(man).toMatch(/complexity bearer/); + expect(man).toMatch(/exactly one recommendation/); + expect(man).toMatch(/one real direction/); + expect(man).toMatch(/Domain Matrix/); + expect(man).toContain('NEEDS_REALIGNMENT'); + expect(man).toContain('MANCODE_REFRAME_REQUIRED'); + expect(man).toMatch(/Do not call generic workflow update/); const manba = renderModeSkill('manba', '/'); expect(manba).toMatch(/workflow create manba/); @@ -142,6 +178,10 @@ describe('mvp-2 skills', () => { const mansolo = renderModeSkill('mansolo', '/'); expect(mansolo).toMatch(/workflow show/); expect(mansolo).toMatch(/active children before their\s+parent/); + expect(mansolo).toMatch(/semantic owner or source of truth is unclear/); + expect(mansolo).toContain('NEEDS_REALIGNMENT'); + expect(mansolo).toContain('MANCODE_REFRAME_REQUIRED'); + expect(mansolo).toMatch(/This is read-only/); }); it('renders skill frontmatter', () => { diff --git a/tests/status.test.ts b/tests/status.test.ts index ce53417..1a16c5b 100644 --- a/tests/status.test.ts +++ b/tests/status.test.ts @@ -210,6 +210,22 @@ describe('mancode status', () => { expect(output).not.toContain('v3_active'); }); + it('--brief keeps an unregistered checkout in registration-required state', async () => { + await silentInit(dir, { v3: true, platform: 'codex' }); + await rm(path.join(dir, '.mancode', 'local', 'runtime', 'checkout.json')); + + const logs = await captureLog(() => + status(dir, { brief: true, json: true }), + ); + const result: ContinuityStatusResult = JSON.parse(logs.join('\n')); + + expect(result).toMatchObject({ + state: 'unavailable', + ready: false, + blockers: expect.arrayContaining(['MANCODE_WORKSPACE_BINDING_MISMATCH']), + }); + }); + it('omits top-level Hooks section for non-Claude Code projects', async () => { await silentInit(dir, { platform: 'codex' }); diff --git a/tests/v3-adapter-contracts.test.ts b/tests/v3-adapter-contracts.test.ts index d7aa4a9..0cd9594 100644 --- a/tests/v3-adapter-contracts.test.ts +++ b/tests/v3-adapter-contracts.test.ts @@ -2,15 +2,19 @@ import { mkdir, readFile, rm, symlink, writeFile } from 'node:fs/promises'; import { tmpdir } from 'node:os'; import path from 'node:path'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { contextSessionNew } from '../src/commands/context.js'; import { init } from '../src/commands/init.js'; import { install } from '../src/commands/install.js'; import { listPlatforms } from '../src/commands/list-platforms.js'; import { refreshProject } from '../src/commands/refresh-project.js'; import { type V3StatusResult, status } from '../src/commands/status.js'; +import { teamIdentityCreate } from '../src/commands/team.js'; import { EXIT_V3_AUTHORITY_PROTECTED, uninstall, } from '../src/commands/uninstall.js'; +import { parseSchemaManifest } from '../src/context/manifest.js'; +import { upgradeV3Adapters } from '../src/installers/adapter-upgrade.js'; import type { PlatformName } from '../src/installers/registry.js'; import { V3_MODE_NAMES, @@ -80,12 +84,45 @@ describe('V3 adapter bootstrap integration', () => { expect(textOutput).toContain('codex'); expect(textOutput).not.toContain('explicit required ()'); - expect(await install(root, 'cursor')).toBe(0); + expect( + await teamIdentityCreate(root, { + name: 'Adapter Maintainer', + json: true, + }), + ).toBe(0); + expect( + await contextSessionNew(root, { client: 'fixture', json: true }), + ).toBe(0); + const sessionId = ( + JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + } + ).session.sessionId; + const preview = await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + dryRun: true, + }); + expect( + await install(root, 'cursor', { + confirm: true, + operationId: preview.operationId, + session: sessionId, + client: 'fixture', + }), + ).toBe(0); const cursorRule = await readFile( path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), 'utf8', ); expect(cursorRule).toContain('# mancode bootstrap'); + expect( + parseSchemaManifest( + JSON.parse( + await readFile(path.join(root, '.mancode', 'schema.json'), 'utf8'), + ), + ).managedAdapters, + ).toMatchObject({ codex: '3', cursor: '3' }); await expect( readFile(path.join(root, '.mancode', 'config.json'), 'utf8'), ).rejects.toThrow(); @@ -115,6 +152,15 @@ describe('V3 adapter bootstrap integration', () => { const bootstrap = await readFile(target, 'utf8'); expect(bootstrap).toContain('# mancode bootstrap'); expect(bootstrap).toContain('mancode context show --purpose orient'); + expect(bootstrap).toContain( + './node_modules/.bin/mancode` when it exists, otherwise use `mancode', + ); + expect(bootstrap).toContain( + 'In every command below, `mancode` means that selected binary', + ); + expect(bootstrap).toContain( + 'mancode context session show --session --client --json', + ); expect(bootstrap).toContain('--session '); expect(bootstrap).toContain('mancode status --brief --json'); expect(bootstrap).toContain( @@ -175,6 +221,10 @@ describe('V3 adapter bootstrap integration', () => { expect(description).toContain('mancode'); expect(description).not.toContain('V3'); expect(entry).toContain('# mancode mode'); + expect(entry).toContain('./node_modules/.bin/mancode` when it exists'); + expect(entry).toContain( + 'replace the literal `mancode` with that selected binary path', + ); expect(entry).toContain('## Enter through mancode'); expect(entry).toContain('In operator-facing narration, say `mancode`'); expect(entry).not.toMatch(/\bV3\b/); @@ -199,6 +249,23 @@ describe('V3 adapter bootstrap integration', () => { 'without creating an actor, session, TaskRef, or workflow', ); expect(entry).toContain('internal IDs and digests'); + expect(entry).toContain( + 'must contain exactly one item for each dimension', + ); + expect(entry).toContain('platform'); + expect(entry).toContain('core_scope'); + expect(entry).toContain('technical_stack'); + expect(entry).toContain('data_and_persistence'); + expect(entry).toContain('performance'); + expect(entry).toContain('compatibility'); + expect(entry).toContain('security'); + expect(entry).toContain('"status": "confirmed"'); + expect(entry).toContain('"rationale": "..."'); + expect(entry).toContain('acceptanceCriteria'); + expect(entry).toContain('"method": "automated"'); + expect(entry).toContain( + "clears this session's active workflow pointer", + ); } if (mode === 'manps') { expect(entry).toContain( @@ -244,11 +311,10 @@ describe('V3 adapter bootstrap integration', () => { ); it('preserves user instructions outside the V3 managed block', async () => { - await init(root, { v3: true }); await writeFile(path.join(root, 'AGENTS.md'), '# User instructions\n'); - expect(await install(root, 'codex')).toBe(0); - expect(await install(root, 'codex')).toBe(0); + expect(await init(root, { v3: true, platform: 'codex' })).toBe(0); + expect(await init(root, { v3: true, platform: 'codex' })).toBe(1); const agents = await readFile(path.join(root, 'AGENTS.md'), 'utf8'); expect(agents).toContain('# User instructions'); expect(agents.match(/mancode:v3:codex:start/g)).toHaveLength(1); diff --git a/tests/v3-adapter-read-retry-contracts.test.ts b/tests/v3-adapter-read-retry-contracts.test.ts index 6b2e973..352ea41 100644 --- a/tests/v3-adapter-read-retry-contracts.test.ts +++ b/tests/v3-adapter-read-retry-contracts.test.ts @@ -63,9 +63,14 @@ describe('V3 adapter status reads', () => { it('keeps a persistent adapter read failure closed', async () => { reads.failuresRemaining = 4; - await expect(inspectV3Adapter(root, 'claude-code')).rejects.toMatchObject({ - code: 'EPERM', + await expect(inspectV3Adapter(root, 'claude-code')).resolves.toMatchObject({ + installed: true, + ready: false, + status: 'unreadable', + targets: expect.arrayContaining([ + expect.objectContaining({ status: 'unreadable', actualDigest: null }), + ]), }); - expect(reads.calls).toBe(4); + expect(reads.calls).toBe(V3_MODE_NAMES.length + 4); }); }); diff --git a/tests/v3-command-contracts.test.ts b/tests/v3-command-contracts.test.ts index f02d093..2dfa708 100644 --- a/tests/v3-command-contracts.test.ts +++ b/tests/v3-command-contracts.test.ts @@ -8,6 +8,7 @@ import { contextReconcileTaskHead, contextResume, contextSessionNew, + contextSessionShow, contextSessionSpike, contextShow, contextWorktreeRegister, @@ -92,6 +93,44 @@ describe('V3 CLI command contracts', () => { client: 'fixture', status: 'active', }); + + expect( + await contextSessionShow(root, { + session: payload.session.sessionId, + client: 'fixture', + json: true, + }), + ).toBe(0); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + session: { + sessionId: payload.session.sessionId, + client: 'fixture', + activeTaskRef: null, + activeMode: null, + lastSeenRevision: null, + }, + }); + + expect( + await contextSessionShow(root, { + session: payload.session.sessionId, + client: 'other-client', + json: true, + }), + ).toBe(3); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + error: { code: 'MANCODE_SESSION_NOT_FOUND' }, + }); + + expect( + await contextSessionShow(root, { + session: 'not-a-session-id', + json: true, + }), + ).toBe(2); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + error: { code: 'MANCODE_SESSION_INVALID' }, + }); } finally { errors.mockRestore(); logs.mockRestore(); @@ -712,6 +751,110 @@ describe('V3 CLI command contracts', () => { } }); + it('requires reframe concurrency inputs and returns the committed JSON contract', async () => { + const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); + const errors = vi.spyOn(console, 'error').mockImplementation(() => {}); + try { + await teamIdentityCreate(root, { name: 'Fixture User', json: true }); + await contextSessionNew(root, { client: 'fixture', json: true }); + const sessionId = ( + JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + } + ).session.sessionId; + await workflow(root, 'create', ['man', 'Reframe through the CLI.'], { + session: sessionId, + client: 'fixture', + json: true, + }); + const created = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + taskRef: TaskRef; + }; + const task = `${created.taskRef.namespace}:${created.taskRef.taskId}`; + const checkpointId = id(60); + + expect( + await workflow(root, 'reframe', [task], { + session: sessionId, + client: 'fixture', + checkpointId, + json: true, + }), + ).toBe(2); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + error: { code: 'MANCODE_EXPECTED_REVISION_REQUIRED' }, + }); + + expect( + await workflow(root, 'reframe', [task], { + session: sessionId, + client: 'fixture', + expectedRevision: '1', + json: true, + }), + ).toBe(2); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + error: { code: 'MANCODE_REFRAME_CHECKPOINT_REQUIRED' }, + }); + + const snapshot = await new V3ContextStore(root).readTaskSnapshot( + created.taskRef, + ); + const requirementsPath = path.join(root, 'reframe-requirements.json'); + await writeFile( + requirementsPath, + `${JSON.stringify(finalizedRequirements(snapshot.requirements), null, 2)}\n`, + ); + expect( + await workflow(root, 'requirements', [task, 'finalize'], { + session: sessionId, + client: 'fixture', + expectedRevision: '1', + file: requirementsPath, + json: true, + }), + ).toBe(0); + + const reframeCode = await workflow(root, 'reframe', [task], { + session: sessionId, + client: 'fixture', + expectedRevision: '2', + checkpointId, + summary: 'New evidence changes the requirements.', + nextAction: 'Clarify the replacement requirements.', + json: true, + }); + const reframeOutput = String(logs.mock.calls.at(-1)?.[0]); + expect(reframeCode, reframeOutput).toBe(0); + const result = JSON.parse(reframeOutput) as { + schemaVersion: number; + metadata: { revision: number; currentStep: number }; + requirements: { revision: number; status: string }; + checkpoint: { checkpointId: string; kind: string }; + archive: { archiveId: string; sourceTaskRevision: number }; + operation: { operationId: string; type: string; state: string }; + }; + expect(result).toMatchObject({ + schemaVersion: 1, + metadata: { revision: 4, currentStep: 2 }, + requirements: { revision: 3, status: 'draft' }, + checkpoint: { checkpointId, kind: 'requirements_reframed' }, + archive: { sourceTaskRevision: 2 }, + operation: { type: 'reframe', state: 'committed' }, + }); + expect(result.archive.archiveId).toBe(result.operation.operationId); + await expect( + new V3ContextStore(root).readTaskSnapshot(created.taskRef), + ).resolves.toMatchObject({ + metadata: { revision: 4, currentStep: 2 }, + requirements: { revision: 3, status: 'draft' }, + }); + } finally { + logs.mockRestore(); + errors.mockRestore(); + } + }); + it('accepts the documented semantic requirements format and allocates V3 identities', async () => { const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); const errors = vi.spyOn(console, 'error').mockImplementation(() => {}); diff --git a/tests/v3-init-command.test.ts b/tests/v3-init-command.test.ts index 4306e43..611348d 100644 --- a/tests/v3-init-command.test.ts +++ b/tests/v3-init-command.test.ts @@ -50,8 +50,14 @@ describe('journaled V3 init command', () => { JSON.parse( await readFile(path.join(root, '.mancode', 'schema.json'), 'utf8'), ), - ).activationState, - ).toBe('v3_active'); + ), + ).toMatchObject({ + manifestVersion: 2, + activationState: 'v3_active', + workflowPolicyDefaults: { planning: 2 }, + minReaderVersion: '0.4.0', + minWriterVersion: '0.4.0', + }); await expect( readFile(path.join(root, '.agents', 'skills', 'man', 'SKILL.md'), 'utf8'), ).resolves.toContain('mancode workflow create man'); @@ -78,7 +84,7 @@ describe('journaled V3 init command', () => { ).resolves.toContain('mancode workflow create man'); }); - it('repairs the selected original entry when ordinary init is repeated', async () => { + it('does not repair a missing registered adapter through repeated init', async () => { expect( await init(root, { fromCli: true, empty: true, platform: 'codex' }), ).toBe(EXIT_OK); @@ -88,16 +94,34 @@ describe('journaled V3 init command', () => { }); expect(await init(root, { fromCli: true, platform: 'codex' })).toBe( - EXIT_ALREADY_INITIALIZED, + EXIT_INIT_FAILED, ); await expect( readFile(path.join(root, '.agents', 'skills', 'man', 'SKILL.md'), 'utf8'), - ).resolves.toContain('# mancode mode: man'); + ).rejects.toThrow(); expect(await init(root, { fromCli: true, interactive: false })).toBe( EXIT_ALREADY_INITIALIZED, ); }); + it('does not register a new platform through repeated init', async () => { + expect(await init(root, { v3: true })).toBe(EXIT_OK); + + expect(await init(root, { v3: true, platform: 'codex' })).toBe( + EXIT_INIT_FAILED, + ); + await expect( + readFile(path.join(root, 'AGENTS.md'), 'utf8'), + ).rejects.toThrow(); + expect( + parseSchemaManifest( + JSON.parse( + await readFile(path.join(root, '.mancode', 'schema.json'), 'utf8'), + ), + ).managedAdapters, + ).toEqual({}); + }); + it('never creates legacy authority inside an active V3 project', async () => { expect(await init(root, { v3: true, platform: 'codex' })).toBe(EXIT_OK); const schemaBefore = await readFile( diff --git a/tests/v3-reframe-contracts.test.ts b/tests/v3-reframe-contracts.test.ts new file mode 100644 index 0000000..bb63f2e --- /dev/null +++ b/tests/v3-reframe-contracts.test.ts @@ -0,0 +1,732 @@ +import { execFile as execFileCallback } from 'node:child_process'; +import { mkdir, readFile, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { promisify } from 'node:util'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { initializeV3Project } from '../src/commands/v3-init.js'; +import { digestCanonicalJson } from '../src/context/canonical.js'; +import { type Ulid, createUlid } from '../src/context/ids.js'; +import { reviseV3Plan } from '../src/context/plan-revision.js'; +import { reframeV3Workflow } from '../src/context/reframe.js'; +import { finalizeV3Requirements } from '../src/context/requirements-finalize.js'; +import { + REQUIREMENT_DIMENSIONS, + type RequirementsLedgerV1, + parseRequirementsLedger, + requirementsLedgerDigest, +} from '../src/context/requirements-ledger.js'; +import { startV3SoloHandoff } from '../src/context/solo-handoff.js'; +import { V3ContextStore } from '../src/context/store.js'; +import { taskRootPath } from '../src/context/task-locator.js'; +import type { TaskRef } from '../src/context/task-ref.js'; +import { createV3Workflow } from '../src/context/workflow-create.js'; +import { + type WorkflowMetadataV3, + parseWorkflowMetadata, +} from '../src/context/workflow-metadata.js'; +import { updateV3Workflow } from '../src/context/workflow-update.js'; +import { resolveTaskEntityHomeStore } from '../src/runtime/entity-home-store.js'; +import { readOperationJournal } from '../src/runtime/operation-store.js'; +import { readProjectRuntimeContext } from '../src/runtime/project-runtime.js'; +import { createSession } from '../src/runtime/session.js'; +import { readTaskHeadFence } from '../src/runtime/task-head-store.js'; +import { + createLocalActor, + createSharedActorProfile, + publishSharedActorProfile, + readLocalActor, +} from '../src/team/actor.js'; +import { acquireV3Claim } from '../src/team/claim-acquisition.js'; +import { createV3HandoffDraft } from '../src/team/handoff-operation.js'; +import { parseProjectConfig } from '../src/team/policy.js'; +import { confirmManteamPlan } from './helpers/manteam-plan.js'; + +const execFile = promisify(execFileCallback); +const NOW = new Date('2026-07-21T12:00:00.000Z'); + +describe('V3 local workflow reframe', () => { + let root: string; + + beforeEach(async () => { + root = path.join( + tmpdir(), + `mancode-v3-reframe-${Date.now()}-${Math.random().toString(16).slice(2)}`, + ); + await mkdir(root, { recursive: true }); + }); + + afterEach(async () => { + await rm(root, { recursive: true, force: true }); + }); + + it('archives the confirmed contract, releases claims, and returns a shared workflow to clarification', async () => { + const actors = await bootstrap(root, { git: true, joined: true }); + const created = await createV3Workflow({ + projectRoot: root, + task: 'Reframe a shared workflow without losing its confirmed evidence.', + workflowMode: 'manteam', + sessionId: actors.sessionId, + client: 'vitest', + sharedPrivacyConfirmed: true, + implementationScope: { include: ['src/**'], modules: ['governance'] }, + taskId: id(10), + operationId: id(11), + now: NOW, + }); + const confirmed = await confirmManteamPlan({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: actors.sessionId, + requirements: created.requirements, + now: NOW, + }); + const acquired = await acquireV3Claim({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: confirmed.taskRevision, + scope: { + paths: ['src/context/**'], + modules: ['governance'], + apis: [], + schemas: [], + }, + claimId: id(12), + operationId: id(13), + now: NOW, + }); + const store = new V3ContextStore(root); + const before = await store.readTaskSnapshot(created.taskRef); + const taskRoot = taskRootPath(root, created.taskRef); + const [requirementsBytes, planBytes] = await Promise.all([ + readFile(path.join(taskRoot, 'requirements.json'), 'utf8'), + readFile(path.join(taskRoot, 'plan.md'), 'utf8'), + ]); + const operationId = id(14); + const checkpointId = id(15); + + const reframed = await reframeV3Workflow({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: before.metadata.revision, + checkpointId, + summary: 'New evidence changes the requirements semantic boundary.', + nextAction: 'Clarify and confirm the replacement requirements.', + operationId, + now: NOW, + }); + + expect(reframed).toMatchObject({ + metadata: { + status: 'in_progress', + currentStep: 2, + transitionState: 'stable', + blockingReason: null, + governance: { + requirementsStatus: 'needs_clarification', + planDecision: null, + reviewStatus: 'stale', + verificationStatus: 'stale', + }, + soloExecution: null, + latestCheckpointRef: { artifactId: checkpointId }, + lastOperationId: operationId, + }, + requirements: { + revision: before.requirements.revision + 1, + status: 'draft', + lastOperationId: operationId, + }, + review: { + revision: before.review.revision + 1, + status: 'stale', + lastOperationId: operationId, + }, + verification: { + revision: before.verification.revision + 1, + status: 'stale', + lastOperationId: operationId, + }, + checkpoint: { + checkpointId, + operationId, + kind: 'requirements_reframed', + summary: 'New evidence changes the requirements semantic boundary.', + nextAction: 'Clarify and confirm the replacement requirements.', + }, + archive: { + archiveId: operationId, + taskRef: created.taskRef, + sourceTaskRevision: before.metadata.revision, + sourceRequirementsRevision: before.requirements.revision, + sourceRequirementsDigest: before.requirements.contentDigest, + sourcePlanVersion: before.metadata.governance.planVersion, + sourcePlanDigest: before.plan?.digest, + createdAt: NOW.toISOString(), + }, + releasedClaims: [ + { + claimId: acquired.claim.claimId, + state: 'released', + revision: acquired.claim.revision + 1, + lastOperationId: operationId, + }, + ], + operation: { type: 'reframe', state: 'committed' }, + }); + + const archiveRoot = path.join(taskRoot, 'archives', operationId); + const [archive, archivedRequirements, archivedPlan] = await Promise.all([ + readFile(path.join(archiveRoot, 'archive.json'), 'utf8'), + readFile(path.join(archiveRoot, 'requirements.json'), 'utf8'), + readFile(path.join(archiveRoot, 'plan.md'), 'utf8'), + ]); + expect(JSON.parse(archive)).toMatchObject({ + ...reframed.archive, + schemaVersion: 1, + operationId, + requirementsFileDigest: expect.stringMatching(/^sha256:/), + planFileDigest: expect.stringMatching(/^sha256:/), + archiveDigest: expect.stringMatching(/^sha256:/), + }); + expect(archivedRequirements).toBe(requirementsBytes); + expect(archivedPlan).toBe(planBytes); + + const persisted = await store.readTaskSnapshot(created.taskRef); + expect(persisted.metadata).toEqual(reframed.metadata); + expect(persisted.requirements).toEqual(reframed.requirements); + expect(persisted.review).toEqual(reframed.review); + expect(persisted.verification).toEqual(reframed.verification); + expect(persisted.latestCheckpoint).toEqual(reframed.checkpoint); + expect(persisted.aggregate).toEqual(reframed.aggregate); + expect(persisted.aggregateError).toBeNull(); + + const runtime = await readProjectRuntimeContext(root); + const home = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + created.taskRef, + ); + const coordination = await store.readCoordinationSnapshot( + created.taskRef, + home, + ); + expect(coordination.claims).toEqual( + expect.arrayContaining([ + expect.objectContaining({ + claimId: acquired.claim.claimId, + state: 'released', + lastOperationId: operationId, + }), + ]), + ); + expect(await readTaskHeadFence(home, created.taskRef)).toMatchObject({ + taskRevision: reframed.metadata.revision, + lastOperationId: operationId, + }); + await expect( + readOperationJournal(home, operationId), + ).resolves.toMatchObject({ + type: 'reframe', + state: 'committed', + entityLocks: expect.arrayContaining([ + `task:shared:${created.taskRef.taskId}`, + `archive:${operationId}`, + `checkpoint:${checkpointId}`, + `claim:${acquired.claim.claimId}`, + `task_head:${created.taskRef.taskId}`, + ]), + }); + }); + + it('rejects active child, open handoff, and active solo before writing authority', async () => { + const childRoot = await caseRoot(root, 'active-child'); + const childActors = await bootstrap(childRoot); + const parent = await createV3Workflow({ + projectRoot: childRoot, + task: 'Keep the parent stable while its diagnostic child is active.', + workflowMode: 'man', + sessionId: childActors.sessionId, + client: 'vitest', + taskId: id(20), + operationId: id(21), + now: NOW, + }); + const parentAtVerification = parseWorkflowMetadata({ + ...parent.metadata, + revision: 2, + currentStep: 6, + updatedAt: NOW.toISOString(), + }); + await writeMetadata(childRoot, parent.taskRef, parentAtVerification); + await createV3Workflow({ + projectRoot: childRoot, + task: 'Diagnose the parent verification failure.', + workflowMode: 'manba', + sessionId: childActors.sessionId, + client: 'vitest', + parentTaskRef: parent.taskRef, + taskId: id(22), + operationId: id(23), + now: NOW, + }); + await expectRejectedWithoutAuthorityChange({ + projectRoot: childRoot, + taskRef: parent.taskRef, + sessionId: childActors.sessionId, + expectedTaskRevision: parentAtVerification.revision, + checkpointId: id(24), + operationId: id(25), + error: 'MANCODE_REFRAME_ACTIVE_CHILD', + }); + + const handoffRoot = await caseRoot(root, 'open-handoff'); + const handoffActors = await bootstrap(handoffRoot, { + git: true, + joined: true, + receiver: true, + }); + const shared = await createV3Workflow({ + projectRoot: handoffRoot, + task: 'Keep a draft handoff intact when reframe is rejected.', + workflowMode: 'manteam', + sessionId: handoffActors.sessionId, + client: 'vitest', + sharedPrivacyConfirmed: true, + participantActorIds: [handoffActors.receiverActorId as Ulid], + implementationScope: { include: ['src/**'], modules: ['handoff'] }, + taskId: id(30), + operationId: id(31), + now: NOW, + }); + const sharedPlan = await confirmManteamPlan({ + projectRoot: handoffRoot, + taskRef: shared.taskRef, + sessionId: handoffActors.sessionId, + requirements: shared.requirements, + now: NOW, + }); + await createV3HandoffDraft({ + projectRoot: handoffRoot, + taskRef: shared.taskRef, + sessionId: handoffActors.sessionId, + expectedTaskRevision: sharedPlan.taskRevision, + toActorId: handoffActors.receiverActorId as Ulid, + handoffId: id(32), + checkpointId: id(33), + checkpointOperationId: id(34), + operationId: id(35), + now: NOW, + }); + const sharedBefore = await new V3ContextStore(handoffRoot).readTaskSnapshot( + shared.taskRef, + ); + await expectRejectedWithoutAuthorityChange({ + projectRoot: handoffRoot, + taskRef: shared.taskRef, + sessionId: handoffActors.sessionId, + expectedTaskRevision: sharedBefore.metadata.revision, + checkpointId: id(36), + operationId: id(37), + error: 'MANCODE_REFRAME_OPEN_HANDOFF', + }); + + const soloRoot = await caseRoot(root, 'active-solo'); + const soloActors = await bootstrap(soloRoot); + const solo = await createV3Workflow({ + projectRoot: soloRoot, + task: 'Keep the active solo assignment intact.', + workflowMode: 'man', + sessionId: soloActors.sessionId, + client: 'vitest', + taskId: id(40), + operationId: id(41), + now: NOW, + }); + const soloRequirements = await finalizeV3Requirements({ + projectRoot: soloRoot, + taskRef: solo.taskRef, + sessionId: soloActors.sessionId, + expectedTaskRevision: solo.metadata.revision, + requirements: confirmedRequirements(solo.requirements), + operationId: id(42), + now: NOW, + }); + const soloPlan = await reviseV3Plan({ + projectRoot: soloRoot, + taskRef: solo.taskRef, + sessionId: soloActors.sessionId, + expectedTaskRevision: soloRequirements.metadata.revision, + plan: '# Plan\n\n1. Implement the confirmed local change.\n', + operationId: id(43), + now: NOW, + }); + const assignment = await startV3SoloHandoff({ + projectRoot: soloRoot, + taskRef: solo.taskRef, + sessionId: soloActors.sessionId, + expectedTaskRevision: soloPlan.metadata.revision, + operationId: id(44), + now: NOW, + }); + await expectRejectedWithoutAuthorityChange({ + projectRoot: soloRoot, + taskRef: solo.taskRef, + sessionId: soloActors.sessionId, + expectedTaskRevision: assignment.metadata.revision, + checkpointId: id(45), + operationId: id(46), + error: 'MANCODE_REFRAME_ACTIVE_SOLO', + }); + }); + + it('rejects terminal, repair-pending, manba, and git-ref workflows without a reframe journal', async () => { + const terminalRoot = await caseRoot(root, 'terminal'); + const terminalActors = await bootstrap(terminalRoot); + const terminal = await createV3Workflow({ + projectRoot: terminalRoot, + task: 'Do not reopen an abandoned workflow through reframe.', + workflowMode: 'man', + sessionId: terminalActors.sessionId, + client: 'vitest', + taskId: id(50), + operationId: id(51), + now: NOW, + }); + const abandoned = await updateV3Workflow({ + projectRoot: terminalRoot, + taskRef: terminal.taskRef, + sessionId: terminalActors.sessionId, + expectedTaskRevision: terminal.metadata.revision, + status: 'abandoned', + operationId: id(52), + now: NOW, + }); + await expectRejectedWithoutAuthorityChange({ + projectRoot: terminalRoot, + taskRef: terminal.taskRef, + sessionId: terminalActors.sessionId, + expectedTaskRevision: abandoned.metadata.revision, + checkpointId: id(53), + operationId: id(54), + error: /MANCODE_(?:REFRAME|WORKFLOW)_/, + }); + + const repairRoot = await caseRoot(root, 'pending-repair'); + const repairActors = await bootstrap(repairRoot); + const repair = await createV3Workflow({ + projectRoot: repairRoot, + task: 'Do not reframe a workflow that requires operation repair.', + workflowMode: 'man', + sessionId: repairActors.sessionId, + client: 'vitest', + taskId: id(60), + operationId: id(61), + now: NOW, + }); + const pendingRepair = parseWorkflowMetadata({ + ...repair.metadata, + revision: repair.metadata.revision + 1, + transitionState: 'pending_repair', + lastOperationId: id(62), + updatedAt: NOW.toISOString(), + }); + await writeMetadata(repairRoot, repair.taskRef, pendingRepair); + await expectRejectedWithoutAuthorityChange({ + projectRoot: repairRoot, + taskRef: repair.taskRef, + sessionId: repairActors.sessionId, + expectedTaskRevision: pendingRepair.revision, + checkpointId: id(63), + operationId: id(64), + error: /MANCODE_(?:REFRAME|TASK|OPERATION)_/, + }); + + const manbaRoot = await caseRoot(root, 'manba'); + const manbaActors = await bootstrap(manbaRoot); + const manba = await createV3Workflow({ + projectRoot: manbaRoot, + task: 'Do not apply requirements reframe to a diagnostic workflow.', + workflowMode: 'manba', + sessionId: manbaActors.sessionId, + client: 'vitest', + taskId: id(70), + operationId: id(71), + now: NOW, + }); + await expectRejectedWithoutAuthorityChange({ + projectRoot: manbaRoot, + taskRef: manba.taskRef, + sessionId: manbaActors.sessionId, + expectedTaskRevision: manba.metadata.revision, + checkpointId: id(72), + operationId: id(73), + error: /MANCODE_REFRAME_/, + }); + + const gitRefRoot = await caseRoot(root, 'git-ref'); + const gitRefActors = await bootstrap(gitRefRoot); + const gitRef = await createV3Workflow({ + projectRoot: gitRefRoot, + task: 'Reject reframe whenever project transport is git-ref.', + workflowMode: 'man', + sessionId: gitRefActors.sessionId, + client: 'vitest', + taskId: id(80), + operationId: id(81), + now: NOW, + }); + await forceGitRefTransport(gitRefRoot); + await expectRejectedWithoutAuthorityChange({ + projectRoot: gitRefRoot, + taskRef: gitRef.taskRef, + sessionId: gitRefActors.sessionId, + expectedTaskRevision: gitRef.metadata.revision, + checkpointId: id(82), + operationId: id(83), + error: 'MANCODE_REFRAME_GIT_REF_UNSUPPORTED', + }); + }); + + it('rejects a workflow that is already clarifying requirements without writing authority', async () => { + const actors = await bootstrap(root); + const created = await createV3Workflow({ + projectRoot: root, + task: 'Keep an existing clarification draft unchanged.', + workflowMode: 'man', + sessionId: actors.sessionId, + client: 'vitest', + taskId: id(80), + operationId: id(81), + now: NOW, + }); + + await expectRejectedWithoutAuthorityChange({ + projectRoot: root, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: created.metadata.revision, + checkpointId: id(82), + operationId: id(83), + error: 'MANCODE_REFRAME_REQUIREMENTS_NOT_CONFIRMED', + }); + }); +}); + +async function expectRejectedWithoutAuthorityChange(input: { + projectRoot: string; + taskRef: TaskRef; + sessionId: Ulid; + expectedTaskRevision: number; + checkpointId: Ulid; + operationId: Ulid; + error: string | RegExp; +}): Promise { + const before = await authorityDigest(input.projectRoot, input.taskRef); + const attempt = reframeV3Workflow({ + projectRoot: input.projectRoot, + taskRef: input.taskRef, + sessionId: input.sessionId, + expectedTaskRevision: input.expectedTaskRevision, + checkpointId: input.checkpointId, + operationId: input.operationId, + now: NOW, + }); + if (typeof input.error === 'string') { + await expect(attempt).rejects.toThrow(input.error); + } else { + await expect(attempt).rejects.toThrow(input.error); + } + expect(await authorityDigest(input.projectRoot, input.taskRef)).toBe(before); + + const runtime = await readProjectRuntimeContext(input.projectRoot); + const home = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + input.taskRef, + ); + await expect( + readOperationJournal(home, input.operationId), + ).resolves.toBeNull(); +} + +async function authorityDigest( + projectRoot: string, + taskRef: TaskRef, +): Promise { + const store = new V3ContextStore(projectRoot); + const runtime = await readProjectRuntimeContext(projectRoot); + const home = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + taskRef, + ); + const [project, task, coordination] = await Promise.all([ + store.readProjectSnapshot(), + store.readTaskSnapshot(taskRef), + store.readCoordinationSnapshot(taskRef, home), + ]); + return digestCanonicalJson({ + project: project.fingerprint, + task: task.fingerprint, + coordination: coordination.fingerprint, + }); +} + +async function bootstrap( + projectRoot: string, + options: { git?: boolean; joined?: boolean; receiver?: boolean } = {}, +): Promise<{ + actorId: Ulid; + sessionId: Ulid; + receiverActorId: Ulid | null; +}> { + if (options.git === true) await initializeGitFixture(projectRoot); + await initializeV3Project({ + projectRoot, + operationId: id(1), + workspaceId: id(2), + schemaEpoch: id(3), + now: NOW, + }); + const actorId = id(4); + const sessionId = id(5); + await createLocalActor(projectRoot, { + actorId, + displayName: 'Reframe Owner', + now: NOW, + }); + await createSession(projectRoot, { + actorId, + sessionId, + client: 'vitest', + identitySource: 'explicit', + now: NOW, + }); + if (options.joined === true) { + const actor = await readLocalActor(projectRoot); + if (actor === null) throw new Error('missing reframe owner actor'); + await publishSharedActorProfile( + projectRoot, + createSharedActorProfile(actor, NOW), + ); + } + const receiverActorId = options.receiver === true ? id(6) : null; + if (receiverActorId !== null) { + await publishSharedActorProfile(projectRoot, { + schemaVersion: 1, + actorId: receiverActorId, + displayName: 'Reframe Receiver', + joinedAt: NOW.toISOString(), + updatedAt: NOW.toISOString(), + }); + } + return { actorId, sessionId, receiverActorId }; +} + +async function initializeGitFixture(projectRoot: string): Promise { + await execFile('git', ['init'], { cwd: projectRoot }); + await execFile('git', ['config', 'user.email', 'vitest@example.test'], { + cwd: projectRoot, + }); + await execFile('git', ['config', 'user.name', 'Vitest'], { + cwd: projectRoot, + }); + await writeFile(path.join(projectRoot, 'README.md'), '# fixture\n'); + await execFile('git', ['add', 'README.md'], { cwd: projectRoot }); + await execFile('git', ['commit', '-m', 'fixture'], { cwd: projectRoot }); +} + +async function caseRoot(projectRoot: string, name: string): Promise { + const target = path.join(projectRoot, name); + await mkdir(target, { recursive: true }); + return target; +} + +async function writeMetadata( + projectRoot: string, + taskRef: TaskRef, + metadata: WorkflowMetadataV3, +): Promise { + await writeFile( + path.join(taskRootPath(projectRoot, taskRef), 'metadata.json'), + `${JSON.stringify(metadata, null, 2)}\n`, + ); +} + +async function forceGitRefTransport(projectRoot: string): Promise { + const project = await new V3ContextStore(projectRoot).readProjectSnapshot(); + const config = parseProjectConfig({ + ...project.config, + revision: project.config.revision + 1, + transport: { + mode: 'git-ref', + remote: 'origin/mancode-team', + epoch: project.config.transport.epoch + 1, + }, + lastOperationId: id(90), + updatedAt: NOW.toISOString(), + }); + await writeFile( + path.join(projectRoot, '.mancode', 'shared', 'config.json'), + `${JSON.stringify(config, null, 2)}\n`, + ); +} + +function confirmedRequirements( + previous: RequirementsLedgerV1, +): RequirementsLedgerV1 { + const requirementId = id(100); + const draft: RequirementsLedgerV1 = { + ...previous, + revision: 99, + status: 'confirmed', + goal: 'Implement the confirmed local plan.', + functionalScope: { + inScope: ['Local implementation'], + outOfScope: ['Unconfirmed changes'], + }, + technicalDecisions: [], + defaults: [], + coverage: REQUIREMENT_DIMENSIONS.map((dimension, index) => ({ + coverageId: id(110 + index), + dimension, + status: dimension === 'technical_stack' ? 'not_applicable' : 'confirmed', + rationale: `Confirmed ${dimension}.`, + })), + requirements: [ + { + displayId: 'REQ-1', + legacyId: null, + requirementId, + statement: 'The local plan remains explicit and testable.', + priority: 'must', + }, + ], + acceptanceCriteria: [ + { + displayId: 'AC-1', + legacyId: null, + criterionId: id(101), + requirementIds: [requirementId], + statement: 'The planned change has a reproducible validation.', + required: true, + verificationRequirement: 'automated', + }, + ], + blockingUnknowns: [], + contentDigest: '', + lastOperationId: id(102), + updatedAt: NOW.toISOString(), + }; + return parseRequirementsLedger({ + ...draft, + contentDigest: requirementsLedgerDigest(draft), + }); +} + +function id(offset: number): Ulid { + return createUlid( + Date.parse('2026-07-21T00:00:00.000Z') + offset, + new Uint8Array(10).fill(offset), + ); +} diff --git a/tests/v3-reframe-recovery-contracts.test.ts b/tests/v3-reframe-recovery-contracts.test.ts new file mode 100644 index 0000000..1df9d6f --- /dev/null +++ b/tests/v3-reframe-recovery-contracts.test.ts @@ -0,0 +1,403 @@ +import { execFile as execFileCallback } from 'node:child_process'; +import { mkdir, readFile, readdir, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { promisify } from 'node:util'; +import { afterEach, beforeEach, describe, expect, it } from 'vitest'; +import { initializeV3Project } from '../src/commands/v3-init.js'; +import { type Ulid, createUlid } from '../src/context/ids.js'; +import { reframeV3Workflow } from '../src/context/reframe.js'; +import { V3ContextStore } from '../src/context/store.js'; +import { taskRootPath } from '../src/context/task-locator.js'; +import type { TaskRef } from '../src/context/task-ref.js'; +import { createV3Workflow } from '../src/context/workflow-create.js'; +import { resolveTaskEntityHomeStore } from '../src/runtime/entity-home-store.js'; +import { withOperationCrashInjectionForTesting } from '../src/runtime/operation-crash-injection.js'; +import { OPERATION_CRASH_FIXTURES } from '../src/runtime/operation-definition.js'; +import { executeOperationRecovery } from '../src/runtime/operation-recovery-executor.js'; +import { + type OperationRecoveryActionV1, + type OperationRecoveryPayloadV1, + type TaskAuthorityFileName, + taskArchiveManifest, +} from '../src/runtime/operation-recovery-payload.js'; +import { readOperationRecoveryPayload } from '../src/runtime/operation-recovery-store.js'; +import { readOperationJournal } from '../src/runtime/operation-store.js'; +import { readProjectRuntimeContext } from '../src/runtime/project-runtime.js'; +import { createSession } from '../src/runtime/session.js'; +import { + createLocalActor, + createSharedActorProfile, + publishSharedActorProfile, + readLocalActor, +} from '../src/team/actor.js'; +import { acquireV3Claim } from '../src/team/claim-acquisition.js'; +import { confirmManteamPlan } from './helpers/manteam-plan.js'; + +const execFile = promisify(execFileCallback); +const NOW = new Date('2026-07-21T14:00:00.000Z'); + +describe('V3 reframe crash recovery', () => { + let root: string; + + beforeEach(async () => { + root = path.join( + tmpdir(), + `mancode-v3-reframe-recovery-${Date.now()}-${Math.random().toString(16).slice(2)}`, + ); + await mkdir(root, { recursive: true }); + }); + + afterEach(async () => { + await rm(root, { recursive: true, force: true }); + }); + + it('aborts preparation and forward-repairs every durable reframe write boundary exactly once', async () => { + const fixtures = OPERATION_CRASH_FIXTURES.reframe; + expect( + fixtures + .filter((fixture) => fixture.expectedRecovery === 'safe_abort') + .map((fixture) => fixture.crashAfter), + ).toEqual(['prepared', 'validate']); + + for (const [index, fixture] of fixtures.entries()) { + const caseRoot = path.join(root, `crash-${index}`); + await mkdir(caseRoot); + const actors = await bootstrap(caseRoot); + const created = await createV3Workflow({ + projectRoot: caseRoot, + task: 'Recover a shared reframe from every declared crash boundary.', + workflowMode: 'manteam', + sessionId: actors.sessionId, + client: 'vitest', + sharedPrivacyConfirmed: true, + implementationScope: { + include: ['src/context/**'], + modules: ['governance'], + }, + taskId: id(10), + operationId: id(11), + now: NOW, + }); + const confirmed = await confirmManteamPlan({ + projectRoot: caseRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + requirements: created.requirements, + now: NOW, + }); + const acquired = await acquireV3Claim({ + projectRoot: caseRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: confirmed.taskRevision, + scope: { + paths: ['src/context/**'], + modules: ['governance'], + apis: [], + schemas: [], + }, + claimId: id(12), + operationId: id(13), + now: NOW, + }); + const store = new V3ContextStore(caseRoot); + const beforeTask = await store.readTaskSnapshot(created.taskRef); + const runtime = await readProjectRuntimeContext(caseRoot); + const home = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + created.taskRef, + ); + const beforeCoordination = await store.readCoordinationSnapshot( + created.taskRef, + home, + ); + const operationId = id(100 + index); + const checkpointId = id(200 + index); + + await expect( + withOperationCrashInjectionForTesting(fixture, () => + reframeV3Workflow({ + projectRoot: caseRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: beforeTask.metadata.revision, + checkpointId, + summary: 'Recover the interrupted requirements reframe.', + nextAction: 'Clarify the replacement requirements.', + operationId, + now: NOW, + }), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + + const payload = await readOperationRecoveryPayload(home, operationId); + if (payload === null) throw new Error('missing reframe recovery payload'); + + const recovered = await executeOperationRecovery({ + projectRoot: caseRoot, + operationId, + actorId: actors.actorId, + sessionId: actors.sessionId, + now: NOW, + }); + + if (fixture.expectedRecovery === 'safe_abort') { + expect(['aborted', 'already_terminal']).toContain(recovered.state); + expect(recovered.journal.state).toBe('aborted'); + await expectAbortedAuthority({ + projectRoot: caseRoot, + taskRef: created.taskRef, + home, + beforeTask, + beforeCoordination, + operationId, + }); + } else { + expect(recovered.state).toBe( + fixture.crashAfter === 'commit' ? 'already_terminal' : 'repaired', + ); + await expectCommittedTarget({ + projectRoot: caseRoot, + taskRef: created.taskRef, + home, + payload, + operationId, + checkpointId, + beforeTask, + claimId: acquired.claim.claimId, + beforeClaimRevision: acquired.claim.revision, + }); + } + + const terminal = await executeOperationRecovery({ + projectRoot: caseRoot, + operationId, + actorId: actors.actorId, + sessionId: actors.sessionId, + now: NOW, + }); + expect(terminal).toMatchObject({ + state: 'already_terminal', + journal: { + state: + fixture.expectedRecovery === 'safe_abort' ? 'aborted' : 'committed', + }, + }); + } + }, 120_000); +}); + +async function expectAbortedAuthority(input: { + projectRoot: string; + taskRef: TaskRef; + home: ReturnType; + beforeTask: Awaited>; + beforeCoordination: Awaited< + ReturnType + >; + operationId: Ulid; +}): Promise { + const store = new V3ContextStore(input.projectRoot); + const [task, coordination, journal] = await Promise.all([ + store.readTaskSnapshot(input.taskRef), + store.readCoordinationSnapshot(input.taskRef, input.home), + readOperationJournal(input.home, input.operationId), + ]); + expect(task.metadata).toEqual(input.beforeTask.metadata); + expect(task.requirements).toEqual(input.beforeTask.requirements); + expect(task.review).toEqual(input.beforeTask.review); + expect(task.verification).toEqual(input.beforeTask.verification); + expect(task.plan).toEqual(input.beforeTask.plan); + expect(task.latestCheckpoint).toEqual(input.beforeTask.latestCheckpoint); + expect(coordination.claims).toEqual(input.beforeCoordination.claims); + expect(coordination.taskHeadFence).toEqual( + input.beforeCoordination.taskHeadFence, + ); + expect(journal?.state).toBe('aborted'); + expect( + await directoryNames( + path.join(taskRootPath(input.projectRoot, input.taskRef), 'archives'), + ), + ).toEqual([]); +} + +async function expectCommittedTarget(input: { + projectRoot: string; + taskRef: TaskRef; + home: ReturnType; + payload: OperationRecoveryPayloadV1; + operationId: Ulid; + checkpointId: Ulid; + beforeTask: Awaited>; + claimId: Ulid; + beforeClaimRevision: number; +}): Promise { + const store = new V3ContextStore(input.projectRoot); + const [task, coordination, journal] = await Promise.all([ + store.readTaskSnapshot(input.taskRef), + store.readCoordinationSnapshot(input.taskRef, input.home), + readOperationJournal(input.home, input.operationId), + ]); + expect(task.metadata).toEqual( + authorityTarget(input.payload, 'metadata.json'), + ); + expect(task.requirements).toEqual( + authorityTarget(input.payload, 'requirements.json'), + ); + expect(task.review).toEqual( + authorityTarget(input.payload, 'review-ledger.json'), + ); + expect(task.verification).toEqual( + authorityTarget(input.payload, 'verification-ledger.json'), + ); + expect(task.plan).toEqual(input.beforeTask.plan); + expect(task.aggregateError).toBeNull(); + expect(task.aggregate).not.toBeNull(); + + const checkpoint = singleAction(input.payload, 'checkpoint').checkpoint; + expect(checkpoint.checkpointId).toBe(input.checkpointId); + expect(task.latestCheckpoint).toEqual(checkpoint); + + const targetClaim = singleAction(input.payload, 'claim').claim; + const persistedClaim = coordination.claims.find( + (claim) => claim.claimId === input.claimId, + ); + expect(targetClaim).toMatchObject({ + claimId: input.claimId, + state: 'released', + revision: input.beforeClaimRevision + 1, + lastOperationId: input.operationId, + }); + expect(persistedClaim).toEqual(targetClaim); + + const targetFence = singleAction(input.payload, 'task_head_fence').fence; + expect(coordination.taskHeadFence).toEqual(targetFence); + expect(targetFence).toMatchObject({ + taskRevision: task.metadata.revision, + lastOperationId: input.operationId, + }); + expect(coordination.pendingOperations).toEqual([]); + expect(journal).toMatchObject({ + operationId: input.operationId, + type: 'reframe', + state: 'committed', + }); + + const archive = singleAction(input.payload, 'task_archive'); + const archiveParent = path.join( + taskRootPath(input.projectRoot, input.taskRef), + 'archives', + ); + const archiveRoot = path.join(archiveParent, input.operationId); + expect(await directoryNames(archiveParent)).toEqual([input.operationId]); + expect(await directoryNames(archiveRoot)).toEqual( + ['archive.json', 'plan.md', 'requirements.json'].sort(), + ); + const [manifest, requirements, plan] = await Promise.all([ + readFile(path.join(archiveRoot, 'archive.json'), 'utf8'), + readFile(path.join(archiveRoot, 'requirements.json'), 'utf8'), + readFile(path.join(archiveRoot, 'plan.md'), 'utf8'), + ]); + expect(JSON.parse(manifest)).toEqual(taskArchiveManifest(archive)); + expect(requirements).toBe(archive.requirementsContent); + expect(plan).toBe(archive.planContent); +} + +function authorityTarget( + payload: OperationRecoveryPayloadV1, + fileName: TaskAuthorityFileName, +): unknown { + const action = payload.actions + .filter( + (candidate) => + candidate.kind === 'task_authority_file' && + candidate.fileName === fileName, + ) + .at(-1); + if (action?.kind !== 'task_authority_file') { + throw new Error(`missing ${fileName} recovery target`); + } + return JSON.parse(action.targetContent); +} + +function singleAction( + payload: OperationRecoveryPayloadV1, + kind: K, +): Extract { + const matches = payload.actions.filter((action) => action.kind === kind); + if (matches.length !== 1 || matches[0] === undefined) { + throw new Error(`expected one ${kind} recovery action`); + } + return matches[0] as Extract; +} + +async function directoryNames(directory: string): Promise { + try { + return (await readdir(directory)).sort(); + } catch (error) { + if ( + typeof error === 'object' && + error !== null && + 'code' in error && + error.code === 'ENOENT' + ) { + return []; + } + throw error; + } +} + +async function bootstrap( + projectRoot: string, +): Promise<{ actorId: Ulid; sessionId: Ulid }> { + await initializeGitFixture(projectRoot); + await initializeV3Project({ + projectRoot, + operationId: id(1), + workspaceId: id(2), + schemaEpoch: id(3), + now: NOW, + }); + const actorId = id(4); + const sessionId = id(5); + await createLocalActor(projectRoot, { + actorId, + displayName: 'Reframe Recovery Owner', + now: NOW, + }); + await createSession(projectRoot, { + actorId, + sessionId, + client: 'vitest', + identitySource: 'explicit', + now: NOW, + }); + const actor = await readLocalActor(projectRoot); + if (actor === null) throw new Error('missing reframe recovery actor'); + await publishSharedActorProfile( + projectRoot, + createSharedActorProfile(actor, NOW), + ); + return { actorId, sessionId }; +} + +async function initializeGitFixture(projectRoot: string): Promise { + await execFile('git', ['init'], { cwd: projectRoot }); + await execFile('git', ['config', 'user.email', 'vitest@example.test'], { + cwd: projectRoot, + }); + await execFile('git', ['config', 'user.name', 'Vitest'], { + cwd: projectRoot, + }); + await writeFile(path.join(projectRoot, 'README.md'), '# fixture\n'); + await execFile('git', ['add', 'README.md'], { cwd: projectRoot }); + await execFile('git', ['commit', '-m', 'fixture'], { cwd: projectRoot }); +} + +function id(offset: number): Ulid { + return createUlid( + Date.parse('2026-07-21T00:00:00.000Z') + offset, + new Uint8Array(10).fill(offset), + ); +} diff --git a/tests/v3-requirements-finalize-contracts.test.ts b/tests/v3-requirements-finalize-contracts.test.ts index 7140f64..9c114e8 100644 --- a/tests/v3-requirements-finalize-contracts.test.ts +++ b/tests/v3-requirements-finalize-contracts.test.ts @@ -36,7 +36,8 @@ import { OPERATION_CRASH_FIXTURES } from '../src/runtime/operation-definition.js import { executeOperationRecovery } from '../src/runtime/operation-recovery-executor.js'; import { readOperationJournal } from '../src/runtime/operation-store.js'; import { readProjectRuntimeContext } from '../src/runtime/project-runtime.js'; -import { createSession } from '../src/runtime/session.js'; +import { listProjectionIntents } from '../src/runtime/projection-outbox.js'; +import { createSession, readSession } from '../src/runtime/session.js'; import { readTaskHeadFence } from '../src/runtime/task-head-store.js'; import { createLocalActor, @@ -364,6 +365,92 @@ describe('V3 requirements finalization operation', () => { }); }); + it('does not create a new plan version when confirming the existing plan', async () => { + const { sessionId } = await bootstrap(root, false, false); + const created = await createV3Workflow({ + projectRoot: root, + task: 'Confirm an existing plan without invalidating its evidence.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(100), + operationId: id(101), + now: NOW, + }); + const finalized = await finalizeV3Requirements({ + projectRoot: root, + taskRef: created.taskRef, + sessionId, + expectedTaskRevision: 1, + requirements: finalizedRequirements( + created.requirements, + created.taskRef, + ), + operationId: id(102), + now: NOW, + }); + const plan = '# Plan\n\n1. Confirm the existing plan.\n'; + const revised = await reviseV3Plan({ + projectRoot: root, + taskRef: created.taskRef, + sessionId, + expectedTaskRevision: finalized.metadata.revision, + plan, + operationId: id(103), + now: NOW, + }); + const beforeConfirmation = await new V3ContextStore(root).readTaskSnapshot( + created.taskRef, + ); + + const confirmed = await reviseV3Plan({ + projectRoot: root, + taskRef: created.taskRef, + sessionId, + expectedTaskRevision: revised.metadata.revision, + plan, + planDecision: 'plan_only', + operationId: id(104), + now: NOW, + }); + + expect(confirmed.metadata).toMatchObject({ + revision: revised.metadata.revision + 1, + status: 'planned', + currentStep: 4, + governance: { + planVersion: revised.metadata.governance.planVersion, + planDecision: 'plan_only', + }, + }); + expect(confirmed.planDigest).toBe(revised.planDigest); + expect(confirmed.review).toEqual(beforeConfirmation.review); + expect(confirmed.verification).toEqual(beforeConfirmation.verification); + expect(confirmed.metadata.governance.reviewLedgerDigest).toBe( + beforeConfirmation.metadata.governance.reviewLedgerDigest, + ); + expect(confirmed.metadata.governance.verificationLedgerDigest).toBe( + beforeConfirmation.metadata.governance.verificationLedgerDigest, + ); + await expect(readSession(root, sessionId)).resolves.toMatchObject({ + activeTaskRef: null, + activeMode: null, + lastSeenRevision: null, + }); + await expect(listProjectionIntents(root)).resolves.toEqual([]); + await expect( + listProjectionIntents(root, { + operationId: id(104), + includeTerminal: true, + }), + ).resolves.toMatchObject([ + { + state: 'completed', + target: { action: 'clear', taskRef: created.taskRef }, + }, + ]); + }); + it('releases every active shared claim before committing a completed task and fence', async () => { const { sessionId } = await bootstrap(root, true, true); const created = await createV3Workflow({ diff --git a/tests/v3-workflow-create-contracts.test.ts b/tests/v3-workflow-create-contracts.test.ts index 660b7fb..eb219c7 100644 --- a/tests/v3-workflow-create-contracts.test.ts +++ b/tests/v3-workflow-create-contracts.test.ts @@ -65,6 +65,7 @@ describe('V3 workflow create operation', () => { expect(created.metadata.governance.requirementsStatus).toBe( 'needs_clarification', ); + expect(created.metadata.governance.policyVersions.planning).toBe(2); expect(created.operation.state).toBe('committed'); expect( created.operation.steps.every((step) => step.state === 'completed'), diff --git a/tests/website-docs.test.ts b/tests/website-docs.test.ts index 686ca72..95e9879 100644 --- a/tests/website-docs.test.ts +++ b/tests/website-docs.test.ts @@ -66,7 +66,9 @@ describe('website documentation', () => { '.github/prompts/', 'ZCode', 'context session new --client', + 'context session show --session', 'context resume <namespace:ULID>', + '--confirm --operation-id <operationId> --session', ]) { expect(html, `${name} is missing ${requiredText}`).toContain( requiredText, diff --git a/tests/workflow-metadata-contracts.test.ts b/tests/workflow-metadata-contracts.test.ts index 5a34d95..5bba01e 100644 --- a/tests/workflow-metadata-contracts.test.ts +++ b/tests/workflow-metadata-contracts.test.ts @@ -124,6 +124,40 @@ describe('workflow metadata V3 contract', () => { }); expect(metadata.skippedSteps).toEqual(['review', 'clarification']); }); + + it('rejects unknown policy versions with stable component details', () => { + expect(() => + parseWorkflowMetadata({ + ...rawMetadata(), + governance: { + ...rawMetadata().governance, + policyVersions: { planning: 2, review: 2, verification: 1 }, + }, + }), + ).not.toThrow(); + expect(() => + parseWorkflowMetadata({ + ...rawMetadata(), + governance: { + ...rawMetadata().governance, + policyVersions: { planning: 3, review: 1, verification: 1 }, + }, + }), + ).toThrow( + /MANCODE_POLICY_VERSION_UNSUPPORTED: component=planning observed=3 supported=1,2 requiredWriter=>0.4.0/, + ); + expect(() => + parseWorkflowMetadata({ + ...rawMetadata(), + governance: { + ...rawMetadata().governance, + policyVersions: { planning: 2, review: 3, verification: 1 }, + }, + }), + ).toThrow( + /MANCODE_POLICY_VERSION_UNSUPPORTED: component=review observed=3 supported=1,2 requiredWriter=>0.4.0/, + ); + }); }); function rawMetadata(): WorkflowMetadataV3 { @@ -170,7 +204,7 @@ function rawMetadata(): WorkflowMetadataV3 { requirementsDigest: DIGEST, planVersion: 2, planDecision: 'governed_execution', - policyVersions: { planning: 2, review: 2, verification: 1 }, + policyVersions: { planning: 2, review: 1, verification: 1 }, reviewStatus: 'passed', reviewLedgerDigest: DIGEST, verificationStatus: 'passed', diff --git a/website/PLAN.md b/website/PLAN.md deleted file mode 100644 index fc9e694..0000000 --- a/website/PLAN.md +++ /dev/null @@ -1,83 +0,0 @@ -# mancode Website V1 Plan - -## Objective - -Turn the approved visual sample into a polished, deployable static landing page that explains why mancode exists, shows how its modes change workflow intensity, and gets a developer from first impression to installation without reading the full README. - -The page should feel like a live engineering broadcast: industrial, restrained, fast, and unmistakably tied to mancode's practice-to-playoffs metaphor. - -## Audience and primary action - -- Primary: developers already using Claude Code, Cursor, Codex, Copilot, or ZCode. -- Secondary: engineering teams that want repeatable AI-assisted planning and review without sending project memory to another service. -- Primary action: copy `npm install -g mancode`. -- Secondary actions: open GitHub and read the README. - -## Verified product claims - -Only claims already documented in the repository will appear on the page: - -- Five working modes: `solo`, `/manba`, `/man`, `/manteam`, and `/manps`. -- `/man` uses a nine-step workflow with targeted or full risk-based review and one remediation round. -- mancode detects project context and UI design signals when relevant. -- Workflow artifacts and team memory stay in the repository. -- mancode sends no telemetry. -- Adapters exist for Claude Code, Cursor, Codex, GitHub Copilot, and ZCode, with capability differences clearly represented. - -## Information architecture - -1. **Hero** — memorable outcome, install command, visual `/man` workflow card. -2. **Problem / response** — contrast generic AI over-building with mancode's reuse-first ladder. -3. **Mode selector** — interactive presentation of the five working modes and when to use each. -4. **Playoffs workflow** — compact nine-step `/man` sequence, grouped into scout, plan, execute, verify, and review phases. -5. **Project awareness** — show the files/signals mancode reads and the local artifacts it leaves behind. -6. **Platform matrix** — distinguish full Claude Code integration from adapter-based support without overstating parity. -7. **Quick start** — install, initialize, and choose a mode. -8. **Final call to action / footer** — repeat the install action and link to GitHub, English README, Chinese README, license, and privacy section. - -## Visual and interaction system - -- Keep the approved black, warm white, cyan, orange, and lime palette. -- Keep condensed sports-broadcast typography paired with monospace UI text. -- Extend the court-grid, scorebug, route, and numbered possession motifs through the page. -- Use large editorial section numbers instead of generic rounded feature cards. -- Add one mode-selector interaction, command copy buttons, anchor navigation, and scroll reveals. -- Respect `prefers-reduced-motion`; the page remains readable and complete with JavaScript disabled. - -## Technical implementation - -- Remain framework-free and deployable as a static directory. -- Split the current prototype into `index.html`, `styles.css`, and `site.js` so the completed page stays maintainable. -- Keep the existing local logo asset; add no external fonts, analytics, cookies, trackers, or third-party runtime dependencies. -- Use semantic sections, keyboard-accessible buttons, visible focus states, descriptive labels, and sufficient contrast. -- Use relative asset paths so the site works from a subdirectory or static host. - -## Responsive behavior - -- Desktop: asymmetric two-column hero and wide workflow/platform layouts. -- Tablet: collapse complex grids while keeping the visual card beside or below the copy. -- Mobile: single-column reading order, touch-friendly mode tabs, no horizontal page overflow, and preserved headline impact. - -## Verification - -- Run a local static server and inspect at 1440×900, 1024×768, and 390×844. -- Check the main navigation, all internal anchors, external links, mode selector, and every copy button. -- Check for console errors and horizontal overflow. -- Confirm reduced-motion and JavaScript-free fallbacks do not hide content. -- Run `git diff --check` and review the final change set for unrelated edits. - -## Explicitly out of scope - -- Deployment configuration or publishing to an external service. -- Blog, CMS, authentication, pricing, analytics, newsletter signup, or backend services. -- A separate documentation system or framework migration. -- Claims, testimonials, download numbers, or benchmarks not verified in this repository. - -## Plan self-review - -- **Value hierarchy:** The install action appears in the hero, quick start, and final CTA; supporting details do not block it. -- **Differentiation:** Modes, reuse-first behavior, project awareness, and the basketball workflow metaphor stay central instead of generic "AI productivity" claims. -- **Complexity:** A three-file static implementation is sufficient; no framework or build pipeline is justified. -- **Accuracy:** Platform parity is not implied, and all statements trace to the README. -- **Risk:** The main risks are mobile density, motion excess, and stale hard-coded metrics. The plan addresses these with responsive QA, reduced-motion support, and no volatile metrics. -- **Decision:** Approved for implementation with no blocking questions. diff --git a/website/docs.html b/website/docs.html index 71e8850..6927c88 100644 --- a/website/docs.html +++ b/website/docs.html @@ -24,7 +24,7 @@
mancode - Documentation / v0.3.18 + Documentation / v0.4.0 +
  • refresh-project updates detected project facts and reports stale adapters.
  • Claude Code reads refreshed context through hooks.
  • Cursor, Codex, Copilot, and ZCode use static files; publish a staged repair from an active session with --confirm --operation-id <operationId>.
  • Only UI projects receive design-token-specific guidance.
@@ -311,8 +316,8 @@

Uninstall safely

Remove one adapter

$ mancode uninstall cursor --force

Reinstall one adapter

-
$ mancode uninstall claude-code --force
-$ mancode install claude-code
+
$ mancode adapter upgrade --platform claude-code --dry-run
+$ mancode adapter upgrade --platform claude-code --confirm --operation-id <operationId> --session <id> --client <client>

Remove the CLI

$ npm uninstall -g mancode
@@ -322,9 +327,9 @@

Troubleshooting

mancode init rejects the directory

A safely empty directory is supported interactively, or explicitly with --empty. A non-empty directory still needs a recognized project marker or Git metadata so mancode does not initialize an arbitrary folder by accident.

The agent does not see a newly installed mode

-

Reload or restart the agent so it rereads repository instructions. Run mancode status; if the adapter is not ready, run mancode install <platform> --force. For ZCode and Copilot, also confirm that the installed client release supports repository skills or prompt files.

+

Reload or restart the agent so it rereads repository instructions. Run mancode status; if the adapter is not ready, preview mancode adapter upgrade --platform <platform> --dry-run, then repair it from an active session with --confirm --operation-id <operationId>. For ZCode and Copilot, also confirm that the installed client release supports repository skills or prompt files.

Claude Code hooks do not run

-

Restart Claude Code after initialization, then check mancode status for both hook files and registration in .claude/settings.json. Repair with mancode install claude-code --force. The hooks use Node.js and do not require Bash or jq.

+

Restart Claude Code after initialization, then check mancode status. Repair V3 managed content through the adapter preview and confirmation flow above; the legacy hook architecture uses mancode init --legacy --force. The hooks use Node.js and do not require Bash or jq.

Cursor rules do not trigger

Confirm that .cursor/rules/mancode-*.mdc and .cursor/commands/*.md exist. Core context and solo rules are persistent; higher-intensity rules are description-triggered, so invoke the generated mode command explicitly.

A workflow command is rejected

diff --git a/website/docs.zh-CN.html b/website/docs.zh-CN.html index ab1a377..29fdc9a 100644 --- a/website/docs.zh-CN.html +++ b/website/docs.zh-CN.html @@ -24,7 +24,7 @@
mancode - 文档 / v0.3.18 + 文档 / v0.4.0 +
  • refresh-project 更新项目事实并报告 stale adapter。
  • Claude Code 通过 hooks 读取刷新后的上下文。
  • Cursor、Codex、Copilot 和 ZCode 使用静态文件;从 active session 用 --confirm --operation-id <operationId> 发布 staging 修复。
  • 只有 UI 项目会生成设计 token 相关指导。
@@ -311,8 +316,8 @@

安全卸载

移除一个适配器

$ mancode uninstall cursor --force

重装一个适配器

-
$ mancode uninstall claude-code --force
-$ mancode install claude-code
+
$ mancode adapter upgrade --platform claude-code --dry-run
+$ mancode adapter upgrade --platform claude-code --confirm --operation-id <operationId> --session <id> --client <client>

移除 CLI

$ npm uninstall -g mancode
@@ -322,9 +327,9 @@

故障排查

mancode init 拒绝当前目录

安全的空目录支持交互初始化,也可以显式使用 --empty。非空目录仍需存在可识别的项目标记或 Git 元数据,防止 mancode 意外初始化任意文件夹。

Agent 看不到刚安装的模式

-

重载或重启 Agent,让它重新读取仓库 instructions。执行 mancode status;如果平台未 ready,运行 mancode install <platform> --force。ZCode 和 Copilot 还需要确认当前客户端版本支持仓库 skills 或 prompt files。

+

重载或重启 Agent,让它重新读取仓库 instructions。执行 mancode status;如果平台未 ready,先运行 mancode adapter upgrade --platform <platform> --dry-run,再从 active session 用 --confirm --operation-id <operationId> 修复。ZCode 和 Copilot 还需要确认当前客户端版本支持仓库 skills 或 prompt files。

Claude Code hooks 没有触发

-

初始化后重启 Claude Code,再用 mancode status 检查两个 hook 文件和 .claude/settings.json 注册状态。可执行 mancode install claude-code --force 修复。hooks 使用 Node.js,不依赖 Bash 或 jq。

+

初始化后重启 Claude Code,再用 mancode status 检查状态。V3 managed content 通过上面的 adapter 预览与确认流程修复;legacy hook 架构使用 mancode init --legacy --force。hooks 使用 Node.js,不依赖 Bash 或 jq。

Cursor rules 没有触发

确认 .cursor/rules/mancode-*.mdc.cursor/commands/*.md 都存在。核心上下文与 solo rules 持续生效;高强度规则按描述触发,因此应显式调用生成的模式命令。

workflow 命令被拒绝

diff --git a/website/index.html b/website/index.html index 2820c4d..4b39ca7 100644 --- a/website/index.html +++ b/website/index.html @@ -439,7 +439,7 @@

Stop babysitting
AI bloat.

中文 AGPL-3.0 - Continuity / v0.3.18 + Continuity / v0.4.0 diff --git a/website/index.zh-CN.html b/website/index.zh-CN.html index fbfb3e7..7763de5 100644 --- a/website/index.zh-CN.html +++ b/website/index.zh-CN.html @@ -88,6 +88,6 @@

一项任务。
下个会话继续。

简单任务少一点仪式。
关键任务多一点纪律。

别再替 AI
收拾臃肿。

> npm install -g mancode
GitHub 上查看 ↗
- + From 4dc2e7e556bcc0341f14cbd315bae0c5c85e86c7 Mon Sep 17 00:00:00 2001 From: whitelonng Date: Wed, 22 Jul 2026 14:17:08 +0800 Subject: [PATCH 2/6] fix: align planning governance release contracts --- .gitignore | 1 + docs/planning-governance-evolution.md | 443 ++++++++++++++++++ docs/release-acceptance.md | 4 +- src/context/resolver.ts | 56 ++- src/context/workflow-create.ts | 2 +- src/installers/adapter-upgrade.ts | 4 + src/runtime/operation-journal.ts | 2 +- tests/adapter-upgrade-contracts.test.ts | 147 ++++-- tests/compatibility-contracts.test.ts | 40 ++ tests/context-resolver-contracts.test.ts | 55 ++- tests/operation-journal-contracts.test.ts | 18 + .../project-policy-upgrade-contracts.test.ts | 11 + tests/v3-workflow-create-contracts.test.ts | 19 + 13 files changed, 748 insertions(+), 54 deletions(-) create mode 100644 docs/planning-governance-evolution.md diff --git a/.gitignore b/.gitignore index 21af5ff..5ef5f56 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,7 @@ docs/* !docs/engineering.md !docs/12-lifecycle.md !docs/release-acceptance.md +!docs/planning-governance-evolution.md # Node.js node_modules/ diff --git a/docs/planning-governance-evolution.md b/docs/planning-governance-evolution.md new file mode 100644 index 0000000..8abd7d4 --- /dev/null +++ b/docs/planning-governance-evolution.md @@ -0,0 +1,443 @@ +# 规划治理演进与安全发布契约 + +本文是 mancode 0.4.0 的规划治理实施与发布契约。它描述目标行为、兼容边界、验证证据和停止条件。`c12969b` 是开发集成基线;后续契约修复必须进入新的唯一候选。在最终发布门禁和 npm 发布完成前,本文的“已完成”只表示代码与自动化验证完成,不表示已经发布。 + +## 1. 决策摘要 + +| 阶段 | 发布内容 | 明确不做的事 | 放行前提 | +| --- | --- | --- | --- | +| 0.4.0 | additive advisory、adapter digest/upgrade、policy parser/capability gate、显式 project upgrade、已升级项目的 Policy 2 默认值,以及 local transport 的原子 `reframe` | 不强制 `solo -> /man`;不批量重写旧 workflow;不把项目升级伪装成普通 `refresh`;不自动降级 policy;git-ref transport 不执行 reframe | A–F 工作包、完整测试、真实宿主验收和 npm 发布前检查全部通过;只有完成 project upgrade 的项目启用 Policy 2 | + +这是唯一对外版本。工作包可以分 PR、独立合并和独立评审,但不产生中间发布。任何能力都必须一起通过 0.4.0 release gate;在此之前不得通过 feature flag、环境变量、手工 metadata 或 npm 预发布提前启用。 + +### 当前状态(2026-07-22) + +| 类别 | 状态 | 证据 | +| --- | --- | --- | +| A–F 实现工作包 | 工作树修复完成 | `c12969b` 为基线;Policy 2 mode scope、resolver 短路和 adapter target recovery 已修复,等待形成新候选 | +| 本地发布前检查 | 工作树通过 | `npm run prepublishOnly` 通过:lint、typecheck、build、dist adapter 验证、117 个测试文件/811 个测试;形成新候选后仍需重跑 | +| GitHub Quality gate | 需重跑 | 旧基线 run 29867788739 不能替代新候选证据 | +| GitHub Windows gate | 需重跑 | 旧基线 run 29867788958 不能替代新候选证据;目标仍是 Windows CMD、PowerShell、Git Bash | +| `develop` 远程一致性 | 候选失效 | 当前本地有候选后的实现、测试和文档修改;形成新候选后再与 `origin/develop` 对齐,`main` 未修改 | +| 最终发布验收 | 未完成 | 五平台真实宿主、跨 clone/legacy 人工验收、最终 Beta gate 和干净 checkout tarball 验收仍待完成 | +| npm 发布 | 未执行 | 在上项全部完成前保持禁止 | + +## 2. 目标、不变量与非目标 + +### 2.1 目标 + +1. 让 `/man` 在入口、语义 owner、source of truth、状态和 contract 发生不确定时停下来,而不是用默认值继续推进。 +2. 让旧 CLI 在 V2 manifest 的 reader/writer 边界显式拒绝,并让 0.4.x parser 拒绝未知 policy,避免“看起来成功但执行了旧规则”。 +3. 让新 policy 只影响新建 workflow;历史 workflow 按创建时记录的 policy 继续运行。 +4. 让 0.4.0 的 local `reframe` 具备单一 journal、单一 revision 线和可证明的中断恢复结果。 + +### 2.2 必须保持的不变量 + +- `.mancode/shared|local/workflows//metadata.json`、`requirements.json`、`plan.md`、review ledger、verification ledger、claim、handoff 和 task-head fence 的权威关系不变。 +- Markdown 是人类可读产物;完成门禁和兼容门禁读取结构化实体及 digest,不以文本存在代替权威状态。 +- 所有跨实体写入都经过 durable operation、expected revision、锁和 recovery action。 +- 任何重新对齐触发都先保留当前权威文件;不能通过手工编辑 `currentStep`、`planning`、requirements 或 plan 制造“回退”。 +- policy 版本是 workflow 创建时的事实。后续 CLI 升级不会静默把 `planning: 1` 改成 `2`。 + +### 2.3 非目标 + +- advisory 不改变 Solo 的执行授权,也不把提示性升级变成自动升级。 +- advisory 本身不写 `planning: 2`、`blocked`、`reframe` 事件或其他状态来模拟回 Step 2。 +- 不创建独立的 Domain Matrix 权威文件;它只能是高风险 `plan.md` 的可选章节。 +- 不用 scope-change 表达需求重构。scope-change 只处理 implementation scope 和 claim successor。 +- git-ref reframe 不属于本计划;在其具备跨 clone 原子语义前始终稳定拒绝,不发布本地成功、远端稍后同步的变体。 + +## 3. 基线证据与代码 owner + +以下证据以已验证的 V3 基线为准。实现开始前应重新运行对应 contract;如果在途改动改变了行号或行为,更新证据而不是沿用旧结论。 + +| 事实 | 当前证据 | 对本计划的影响 | +| --- | --- | --- | +| workflow create 的 Policy 1 基线 | 以 release candidate 的 public `workflow create` contract 和 [`src/context/workflow-create.ts`](../src/context/workflow-create.ts#L742) 共同复核 | 不以单个 builder 行号宣称基线;0.4.0 必须由“项目已升级”状态选择默认值,未升级项目仍写 1 | +| policy parser 接受任意正整数 | [`src/context/workflow-metadata.ts`](../src/context/workflow-metadata.ts#L581) | 必须改为显式白名单;未知版本要产生稳定错误码 | +| context compatibility 使用 manifest 中的 adapter 版本回显 | [`src/commands/context.ts`](../src/commands/context.ts#L833) | 不能把 manifest echo 当作磁盘内容证据 | +| adapter inspection 返回 renderer 当前常量 | [`src/installers/v3-adapter.ts`](../src/installers/v3-adapter.ts#L480) | 需要实际文件 digest 和 stale 分类 | +| requirements finalize 与 plan revise 已有 stale ledger 逻辑 | [`src/context/requirements-finalize.ts`](../src/context/requirements-finalize.ts#L263)、[`src/context/plan-revision.ts`](../src/context/plan-revision.ts#L280) | 可复用 ledger stale 的验证模式,但不能借此假装实现了 reframe | +| scope-change 会处理旧 claim 与 successor claim | [`src/context/scope-change.ts`](../src/context/scope-change.ts#L569) | 它不是需求重构;reframe 必须有独立 operation type 和 eligibility | +| parent contract 变化会使 child snapshot stale | [`src/context/child-result-merge.ts`](../src/context/child-result-merge.ts#L335) | reframe 必须在入口拒绝 active child,而不是事后合并 stale 结果 | +| solo handoff 目前有 start/complete,但没有取消或 reframe 路径 | [`src/context/solo-handoff.ts`](../src/context/solo-handoff.ts#L350) | advisory 只返回诊断;0.4.0 reframe 必须显式拒绝 active solo assignment | + +**实现 owner 约定:** workflow metadata/parser 负责 policy 结构和状态转换; adapter installer/status 负责渲染、digest 和物理文件; compatibility/resolver 负责 reader/writer 门;workflow operation 模块负责跨实体写入;templates 只负责 advisory 文本,不得直接写权威状态。 + +## 4. 0.4.0:Additive Advisory + +### 4.1 Scout 报告字段 + +在 `scout-report.md` 增加以下可选小节。它们是调研证据,不进入 workflow metadata,也不替代 requirements 的确认。 + +```markdown +## Current Behavior Evidence +- Observation: <当前真实行为> +- Evidence: `` +- Reproduction/validation: <如何复现或验证> + +## Candidate Semantic Owner +- Candidate: <模块、实体或命令> +- Confidence: high | medium | low +- Unresolved conflict: + +## Source of Truth +- Authority: <结构化文件、ledger、manifest 或外部系统> +- Readers: <读取方> +- Writers: <唯一写入路径或 operation> +- Derived copies: + +## Historical / Compatibility Impact +- Existing workflows: <影响或 no change> +- Legacy/transport: <影响或 no change> +- Migration/rollback: <需要的证据> +``` + +字段规则: + +- “可选”表示只有相关或能从项目事实验证时才写;不得为了填满模板编造 owner 或 source of truth。 +- `Current Behavior Evidence` 至少包含一个可复现观察和一个仓库路径、测试或命令证据;只有推测时必须标为未知。 +- `Candidate Semantic Owner` 可以不是最终 owner,但必须写置信度和冲突;存在两个同等候选时,Plan Coach 必须停在 `NEEDS_CLARIFICATION`。 +- `Source of Truth` 必须区分 authority 与 derived copy。adapter、cache、Markdown 默认不是任务状态的 owner。 +- `Historical / Compatibility Impact` 至少回答旧 workflow、legacy fixture、transport 和 rollback 是否受影响;不受影响也要明确写 `no change`。 + +### 4.2 Plan Coach 规则 + +Plan Coach 继续是只读组件。它在产生计划前执行以下检查: + +1. 所有候选方案是否针对同一个用户目标、同一验收边界和同一 scope。若某个选项偷偷改变目标或把问题改成另一个问题,返回 `NEEDS_CLARIFICATION`。 +2. 每个选项的复杂度由谁承担:实现代码、迁移、运行维护、用户操作、兼容层或测试。不能只写“更简单”,要写承担者和可观察成本。 +3. 输出唯一推荐,并给出拒绝其他选项的主要理由。推荐不是“由用户决定”;用户仍可否决,但计划不能同时保留多个未决方向。 +4. 简单任务可以只列一个明显可行方向,并标注为什么没有真实替代方案;不能为了满足“多选”制造伪选项。 + +建议的输出契约: + +```text +READY_FOR_PLAN +goal: +options: + - id: + solves: + complexity_bearer: + tradeoffs: +recommendation: +stop_conditions: +``` + +违反同目标、复杂度承担者或唯一推荐规则时,不写 `plan.md`,只返回 `NEEDS_CLARIFICATION` 及缺失决策。简单任务的单一方向仍必须有 `recommendation` 和停止条件。 + +### 4.3 Domain Matrix(仅高风险任务) + +Domain Matrix 是 `plan.md` 内的可选章节,不另建权威文件。以下任一条件成立时建议加入:入口或流程跨平台不一致、owner/source of truth 不清、状态或 contract 语义会变化、跨 workflow/child/team/transport、迁移或兼容影响超过一个版本。 + +推荐表格: + +| Domain | Current behavior/evidence | Candidate owner | Source of truth | Contract/state impact | Compatibility/history | Validation | Rollback/stop | +| --- | --- | --- | --- | --- | --- | --- | --- | +| `` | `` | `` | `` | `` | `` | `` | `` | + +表格只帮助计划审查,不产生运行时决策。最终实现仍必须由对应 authority writer 和 operation contract 证明。 + +### 4.4 Solo 到 `/man` 的升级条件 + +advisory 只增加建议,不改变 Solo 权限或当前 workflow: + +- 入口或流程不一致; +- semantic owner 不清; +- source of truth 不清; +- 状态或 contract 语义会变化; +- 任务范围、架构、成本或验收发生跨文件/跨模块变化; +- 需要历史兼容、迁移、跨平台或团队协调证据。 + +命中条件时,Solo/Head Coach 应建议改用 `/man` 并说明原因。除非用户明确发起新 `/man` workflow,否则不得自动改变 mode、current step、policy 或 authority。 + +### 4.5 停止与重新对齐诊断 + +以下任一条件出现,实施立即停止: + +- 新证据推翻已确认的目标、owner、source of truth 或验收; +- 发现入口/流程在平台间不一致,且会导致不同语义; +- 需要改变 status、contract、policy 或 workflow transition 的含义; +- 发现 adapter stale、writer 不兼容、未完成 operation、active child、open handoff 或 active solo assignment; +- 用户提出的变化已经超出当前 requirements/plan 的 scope。 + +advisory 的唯一结果是停止当前代理执行,并返回只读诊断 `NEEDS_REALIGNMENT` 与原因 `MANCODE_REFRAME_REQUIRED`。该诊断不写入 workflow authority,也不调用通用 `workflow update`。 + +- 保留当前 `requirements.json`、`plan.md`、review/verification ledger、claims 和 handoff,且不写入任何 metadata; +- 不手改 `currentStep`,不写 `planning: 2`,不归档旧文件; +- 不释放 claim,不取消 handoff,不宣称任务已回到 Step 2; +- 用户可以查看当前 authority,并明确选择新建 `/man` workflow 或显式执行第 7 节的 local `reframe`。旧 workflow 不因该诊断而自动获得新的状态转换。 + +这是“停止并保留证据”,不是 reframe。advisory 不得把诊断伪装成持久 blocker;真正返回 Step 2 只由第 7 节的独立 operation 完成。 + +## 5. 0.4.0 的 Policy 2 基础能力 + +以下四个能力是 0.4.0 的独立工作包和共同 release gate,不是中间发布版本。它们分别有失败测试;不能用 `VERSION` 常量、managed marker 存在或 manifest 回显互相替代。 + +### 5.1 Adapter 内容 digest 与 stale 检测 + +目标契约: + +- 对每个平台的每一个 managed target,以 `UTF-8("mancode-adapter-digest-v1") || 0x00 || UTF-8(target identity) || 0x00 || managed bytes` 作为 hash 输入,计算 `sha256:<64 hex>`。renderer 的 expected bytes 必须是规范化 UTF-8/LF;磁盘的 actual bytes 不先把 CRLF 转成 LF,否则换行漂移和截断会被掩盖。整文件 target 的 managed bytes 是整个文件,嵌入式 target 的 managed bytes 仅为 marker 边界内的 block,用户托管区域不参与 digest。 +- status 同时读取磁盘内容、manifest 的 renderer version 和 renderer 重建的期望内容,返回 `ready`、`missing`、`stale` 或 `unreadable`,并提供 target、actual digest、expected digest、renderer version 和修复建议。 +- 只有所有 required adapter 均 `ready`,compatibility gate 才允许需要 adapter 的 mutation。stale 读可以返回诊断,但不得继续执行新 policy。 +- digest 必须覆盖实际 managed 内容;仅检查 marker 或版本常量不能证明用户没有改动、文件没有截断、换行没有变化。 +- 首次落地时先对五个平台、共享 target(如 AGENTS)和 legacy marker 做 fixture,确认同一内容在支持的平台上得到同一 digest。 + +**本计划的选择:** 不把 content digest 写入 V1 或 V2 manifest。manifest 继续保存 renderer/schema version;status 每次从 renderer 重建 expected digest,并与磁盘 actual digest 比较。可重建的性能 cache 只能放在 local cache,不能成为 authority。性能问题不能在 0.4.0 临时扩展 schema;它必须作为后续独立设计重新评审。 + +`managedAdapters` 的 key 是 required adapter inventory,不是五个平台的固定全集。greenfield 只登记初始化时选择的平台;后续新增平台由 journaled adapter upgrade 同时发布 managed targets 和 inventory。compatibility 必须双向比较 manifest inventory 与实际主 target;required target 全部丢失时,空的实际集合不能通过门禁。 + +### 5.2 显式 adapter 升级命令 + +0.4.0 已固定并由 CLI contract 覆盖的命令: + +```bash +mancode adapter upgrade --all --dry-run +mancode adapter upgrade --all --confirm --operation-id --session --client +mancode adapter upgrade --platform --dry-run +mancode adapter status --json +``` + +升级命令必须: + +1. 先读取 project manifest、实际 adapter inventory、profile 和当前 writer capability;stale、路径冲突、未完成 operation 或版本门禁失败时只报告,不写文件。 +2. 在 staging 目录渲染所有目标,展示变更 target、digest 和托管区域差异;用户确认后才进入 journal。 +3. 在 adapter locks 下按目标写入,使用 before/target digest recovery action;中断后由 `operation repair` 继续或在无业务写的前提下 abort。 +4. 写完重新读取并验证每个 target;仅在 renderer version 变化时更新 manifest 的 adapter version/inventory,不写 content digest。任何一个 target 失败都不能报告整体成功。 +5. 不修改 task、requirements、plan、policy 或 step;adapter 升级与 workflow 语义升级是两个 operation。 + +`refresh-project` 可以发现并报告 stale,但不能悄悄完成 adapter upgrade。`install --force` 是否复用底层 writer 由实现决定,但必须保留一个语义明确、可审计的显式 upgrade 入口。 + +### 5.3 Policy parser 版本白名单 + +版本解析必须从“任意正整数”改为按组件白名单: + +| CLI/release | 可读取/写入的 planning policy | +| --- | --- | +| 既有 0.3.x CLI | 只支持 V1/Policy 1;遇到 V2 manifest 由 `minReaderVersion`/`minWriterVersion` 拒绝,不把旧 parser 行为当作未知 policy 拒绝证据 | +| 0.4.0(未升级项目) | 读取和写入已有 `1`;新建仍按项目记录的默认值 | +| 0.4.0(已升级项目) | `1` 和 `2`;新建 `/man` 默认 `2` | + +解析失败必须发生在 workflow mutation 之前,并携带 component、observed version、supported versions 和 required writer。不得把未知版本降为 1,也不得把缺省值自动解释成 2。 + +### 5.4 Writer capability 与 `minWriterVersion` + +兼容门分两层: + +- CLI 启动 mutation 前声明 capability 集合,例如 `planning-policy:1|2`、`adapter-digest:1`、`reframe-local:1`;resolver 根据 task/project 和 transport 需要的 capability 逐项检查。git-ref transport 不声明 `reframe` capability。 +- project manifest 使用已有的 `minWriterVersion` 作为粗粒度下限。启用 Policy 2 的升级操作必须把 `minReaderVersion` 和 `minWriterVersion` 都提高到能完整理解 Policy 2、adapter digest 和 recovery contract 的版本,确保旧 CLI 在解析 workflow policy 前被 manifest gate 阻断。 + +门禁顺序固定为:读取 manifest → 检查 reader/writer semver → 检查 capability → 检查 adapter 内容 digest → 解析 workflow policy → 获取 locks。任一失败都没有业务写入。 + +建议的稳定错误:`MANCODE_WRITER_VERSION_TOO_OLD`、`MANCODE_WRITER_CAPABILITY_MISSING`、`MANCODE_ADAPTER_CONTENT_STALE`、`MANCODE_POLICY_VERSION_UNSUPPORTED`。错误输出应指向显式升级命令,而不是建议手工编辑 manifest。 + +## 6. 0.4.0:项目升级后的 Policy 2 默认值 + +### 6.1 项目升级边界 + +0.4.0 已固定并由 CLI contract 覆盖的命令: + +```bash +mancode project upgrade --policy 2 --dry-run +mancode project upgrade --policy 2 --operation-id --session --client +``` + +升级是 project-level journaled operation,至少包含: + +1. 预检:所有 adapter digest fresh;没有 `operation_pending`/`repair_required`;没有正在进行的迁移;当前 writer 满足新 policy 和 adapter capability。 +2. 生成 staging manifest 和新默认策略,记录 before/after digest、minReader/minWriter、操作 ID 和 release version。 +3. 用户确认后原子提交 project policy marker/default 和兼容门;不改任何已有 workflow 的 `governance.policyVersions`。 +4. 重新读取 project 与 workflow fixture,证明新建路径选择 2、旧路径仍按记录选择 1。 + +升级失败或进程中断时,必须由 journal repair 恢复到升级前的 project authority;不能留下“默认值已变但门禁未变”的半状态。 + +**推荐的 source of truth:** 0.4.0 引入支持 V1/V2 白名单的 schema manifest parser;V2 保持 `layoutVersion=3`,只新增 `workflowPolicyDefaults: { planning }`,并提高 `minReaderVersion`/`minWriterVersion`。review 与 verification 没有本次升级的 policy 语义,不能提前加入 defaults。现有 V1 项目必须显式升级到 V2;0.4.0 新初始化项目只有在 adapter digest 校验完成后才创建 V2,因此视为已升级。不要把 planning policy 放进现有 `TeamPolicyV1`:该实体的 owner 是团队推荐、可见性和 retention,不是 workflow 治理版本。 + +### 6.2 新旧 workflow 规则 + +- 只有已完成项目升级的项目,之后新建的 `/man` workflow 才默认 `policyVersions.planning=2`。 +- 现有 workflow 的 planning/review/verification policy 按创建时记录保持不变;读取、plan revise、review 和 verification 不得因为 CLI 升级而批量重写。 +- 0.4.0 在未升级项目中不得隐式写 2。若用户需要 Policy 2,必须先完成显式 project upgrade 并通过所有门禁。 +- 删除、复制或导出 workflow 时保留 policy provenance;不能以“当前 CLI 版本”重算历史 policy。 + +### 6.3 回滚边界 + +- 在 project upgrade journal commit 前可 repair/abort,前提是没有可见业务写。 +- 一旦已有 Policy 2 workflow 被创建,不允许把 project `minWriterVersion` 或默认 policy 静默降回旧值;发布回滚只能停止创建新 workflow,保留已有 policy 事实。 +- 发现 adapter stale、旧 writer 或解析不支持时,阻塞 mutation 并要求 adapter/project upgrade;不能自动降级到 Policy 1。 + +## 7. 0.4.0:local transport 的独立原子 `reframe` operation + +`reframe` 是需求语义重构,不是 scope-change 的别名,也不是设置一个 step 数字。它随 0.4.0 发布,但只有 local transport 支持;完整 operation 和 recovery 是 0.4.0 的 release gate。 + +### 7.1 Eligibility 与拒绝条件 + +在获取 task、task-head、claims、handoffs、review、verification 的锁后,以 expected task revision 做一次完整检查: + +- task 必须是可继续的 active workflow,不能是终态、`operation_pending` 或 `repair_required`; +- 有 active child 时拒绝:`MANCODE_REFRAME_ACTIVE_CHILD`; +- 有 draft/offered/open handoff 时拒绝:`MANCODE_REFRAME_OPEN_HANDOFF`; +- 有 active solo assignment 时拒绝:`MANCODE_REFRAME_ACTIVE_SOLO`; +- git-ref transport 一律拒绝:`MANCODE_REFRAME_GIT_REF_UNSUPPORTED`;其跨 clone receipt/CAS 设计不属于本计划; +- 任一 claim、task head、review/verification digest 或 session freshness 过期时拒绝并要求重新读取 context。 + +拒绝发生在任何 authority 写入之前。特别是不能先释放 claim 再发现 child 或 handoff,不能先改 currentStep 再等待用户确认。 + +### 7.2 单一 journal 的原子步骤 + +建议 operation type 为 `reframe`,并为每个目标写 recovery action: + +1. 记录 before revision、requirements digest、plan digest、review/verification digest、active claim IDs、handoff IDs 和 code head。 +2. 写 `transitionState=operation_pending`,固定 operation ID 和 expected revisions。 +3. 将旧 `requirements.json` 和 `plan.md` 复制为不可变 archive artifact,保存内容 digest、来源 revision、operation ID 和时间;旧文件不被覆盖或删除。 +4. 在同一 operation 中释放所有 active claims;不能复用 claim identity,也不能把旧 claim 标记成新范围的 claim。 +5. 重置旧 plan decision,并将 review 与 verification ledger 标为 `stale`,保留原证据和 stale reason。`soloExecution` 必须已为 `null`;active assignment 在 eligibility 阶段拒绝,不能在 operation 中清除它来绕过拒绝。 +6. 写入新的 requirements draft/clarification-needed 状态、`currentStep=2`、`status=in_progress` 和 reframe checkpoint;这些字段只能作为同一 journal 的最终提交出现。 +7. 更新 aggregate 和 task-head fence,提交 journal,清理 reservation;最后才允许新的 Step 2 writer 继续。 + +中断恢复必须能重跑每一步而不重复归档、重复释放或生成两个合法 task head。若无法证明前后状态,保持 `operation_pending`/`repair_required` 并拒绝普通 mutation。 + +### 7.3 与现有操作的边界 + +| 操作 | 能改变什么 | 不能代替什么 | +| --- | --- | --- | +| requirements finalize | 确认当前需求并使旧 ledger stale | 不能归档旧需求并回 Step 2 | +| plan revise | 在允许的步骤更新计划并使 ledger stale | 不能清理 solo/claim/handoff | +| scope-change | 更换 implementation scope,释放/重建 successor claim | 不能改变需求语义或 workflow step | +| `reframe` | 归档旧 requirements/plan、释放 claim、使 ledger stale、回 Step 2 | 不能清除 active assignment 来绕过 eligibility,也不能在 active child/open handoff/git-ref transport 中强行执行 | + +## 8. 兼容矩阵 + +| Writer / project | 旧 Policy 1 workflow | Policy 2 workflow | 新建 `/man` | 结果 | +| --- | --- | --- | --- | --- | +| 0.3.x + V1 未升级项目 | 读写 Policy 1 | 不提供 Policy 2 创建 | 写 1 | 保持旧行为;Policy 2 需要显式升级 | +| 0.4.x + 未升级项目 | 读写 | 不创建、不接受未满足门禁的 2 | 写 1 | CLI 新,但 project policy 未升级 | +| 0.4.x + 已升级项目 | 读写且保留 provenance | 读写,要求 digest/capability | 写 2 | 目标 Policy 2 路径 | +| 0.3.x + V2 已升级项目 | 不允许绕过 `minWriterVersion` 写入 | 不允许绕过 `minReaderVersion` 读取/执行 | 不允许创建 | 显式 `MANCODE_WRITER_VERSION_TOO_OLD` 或 reader failure | +| 任意 CLI + stale adapter | 读诊断 | 拒绝 mutation | 拒绝创建 | 先执行显式 adapter upgrade | +| 任意 CLI + git-ref transport | 正常既有 transport contract | Policy 2 仍可按 transport contract 运行 | 不能 reframe | `MANCODE_REFRAME_GIT_REF_UNSUPPORTED` | + +“读”不等于“执行”:旧 CLI 只能在 V1/Policy 1 的兼容范围内展示安全诊断;遇到 V2 manifest 必须先由 reader gate 阻断,不能生成执行指令或写入任何 authority。 + +## 9. 验证矩阵 + +### 9.1 单元和 contract + +- policy parser:1 可接受;0、负数、小数、未知正整数、缺失值和错误 component 均拒绝。 +- workflow create:未升级项目只写 1;升级项目新 `/man` 写 2;已有 workflow 的 policy provenance 不变。 +- Plan Coach:不同目标、无复杂度承担者、多个 recommendation、无 stop condition 均返回 `NEEDS_CLARIFICATION`;简单任务单方向通过。 +- stop/re-align:触发时返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,且 authority 的前后 digest 完全相同。 +- Scout/Domain Matrix:可选字段不进入 metadata;高风险 plan 可包含章节;普通任务不被强制增加文件。 +- digest:内容、marker、路径、换行、截断、用户托管区域变化分别得到预期结果;manifest echo 与磁盘不一致必为 stale。 +- manifest:V1/V2 都拒绝 content digest 字段;expected digest 只能由 renderer 和 managed target 重建。 +- compatibility:reader、writer、capability、adapter digest、policy parser 按规定顺序短路,且失败前没有 journal 或业务写。 +- reframe:每个拒绝条件都在第一步失败;每个 recovery action 幂等;中断后不出现部分 Step 2。 + +### 9.2 集成和恢复 + +- 五个平台生成、status、stale 编辑、dry-run、确认升级、升级后重新读取。 +- adapter upgrade 在每个 target 写入前、写入后和中断点恢复;共享 `AGENTS` target 不能被两个平台重复覆盖。 +- local transport 下的 Policy 2 create/plan/review/verification 与旧 workflow 并存。 +- 两个 clone 的 git-ref 兼容门、旧 writer 拒绝、receipt recovery;所有 git-ref reframe 请求必须确认硬拒绝。 +- active child、open handoff、active solo assignment 的并发 race:先取得锁的一方决定,另一方得到 expected-revision 或明确 reframe error。 + +### 9.3 真实宿主和跨平台 + +发布候选必须在 Claude Code、Codex、Cursor、GitHub Copilot、ZCode 以及 Windows CMD/PowerShell/Git Bash 路径上验证:入口传播、session identity、adapter 文件、status/stale 诊断和升级命令。缺少真实宿主证据的平台只能标记 `not_applicable` 并阻止对应能力发布,不能用另一个宿主代替。 + +## 10. 单版本 release gate + +### 10.1 实施工作包 + +| 工作包 | 主要模块 | 必须新增的证据 | 完成定义 | +| --- | --- | --- | --- | +| A. advisory | `src/templates/agents/scout.ts`、Plan Coach template、`src/templates/skills/man.ts`、共享 adapter renderer | template snapshot、八类路由样例、简单任务单方向样例 | 所有 renderer 文案一致;advisory 不直接修改 metadata/schema | +| B. stop/re-align diagnostic | Scout/Plan Coach template、context 输出 | 触发器 contract、authority before/after digest、重复调用测试 | 只返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`;authority、step、requirements、plan、claim 不变 | +| C. adapter digest/upgrade | `src/installers/v3-adapter.ts`、status/context callsite、operation recovery、CLI registration | 五平台 target fixture、stale 分类、dry-run、每个 crash point | compatibility 使用实际磁盘 digest;显式 upgrade 可 repair | +| D. policy/version gate | workflow metadata parser、manifest parser、compatibility/resolver、workflow create | V1/V2 白名单、0.3.x + V2 reader/writer fixture、capability/minWriter matrix | 未知 policy/manifest 在写前拒绝;没有 fallback | +| E. project Policy 2 upgrade | 新 project upgrade command/operation、manifest V2 writer、workflow create | V1→V2 dry-run/commit/repair、旧 workflow provenance、新 workflow default | 只有 V2 项目新建 `/man` 写 2;历史 metadata 无 diff | +| F. atomic local reframe | 新 `reframe` context module、operation definition/recovery、archive store、claim/ledger writers | eligibility、并发、每步 crash、archive digest、task-head fence | 单 journal 全前/全后;0.4.0 local transport 发布,git-ref 一律硬拒绝 | + +每个工作包单独合并和评审。C、D 可以并行开发,E 依赖 C 和 D;F 与 E 可以分别完成,但二者都属于同一个 0.4.0 release gate,不能提前开启默认路径。 + +### 10.2 0.4.0 gate + +当前 gate 结果如下。`[x]` 仅表示实现和自动化证据完成;真实宿主或发布验收未完成时,仍不得发布 npm。 + +- [x] 模板和文档 contract 通过;advisory 不直接执行 schema migration、policy 写入或自动 step 变更。 +- [x] 旧 V3 fixture、legacy fixture、已有 adapter 和历史 workflow 通过原有测试。 +- [x] 触发 stop/re-align 时只返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,authority 文件内容和 claims 不变。 +- [x] Scout/Plan Coach 新字段和规则覆盖正常、缺失证据、冲突 owner、单方向简单任务。 +- [x] adapter digest algorithm、status 分类、stale error、explicit upgrade command 和 recovery contract 完成。 +- [x] policy parser 白名单、writer capability、`minWriterVersion`/reader gate 和 0.3.x + V2 manifest 拒绝测试在当前工作树通过;新候选仍需重跑。 +- [x] project upgrade dry-run、确认、commit、repair、abort 和 provenance 完成;现有 workflow 未被批量重写,新 `/man` Policy 2 默认值有明确创建证据。 +- [x] local transport 的完整原子 reframe、recovery、并发和 archive retention 通过;没有复用 scope-change,也没有 active child/open handoff/active solo assignment 的绕过路径。 +- [x] 已升级/未升级项目、旧/新 workflow、local/git-ref transport 的自动化兼容矩阵通过;git-ref reframe 稳定返回 `MANCODE_REFRAME_GIT_REF_UNSUPPORTED`。 +- [x] 5 个 adapter renderer、Windows path、line ending、用户托管区和每个 target 写前/写后中断恢复在当前工作树通过;新候选仍需重跑 dist/Windows/recovery gate。 +- [ ] Claude Code、Codex、Cursor、GitHub Copilot、ZCode 的最终候选真实宿主验收,以及 [`docs/release-acceptance.md`](./release-acceptance.md) 要求的跨 clone、legacy、Beta gate 和干净 checkout tarball 验收。 +- [x] 按开发集成要求将候选 `c12969b` 推送到远程 `develop`;这不等同于 release gate 通过。 +- [ ] 完成剩余发布验收后才允许进入 npm 发布检查;任何条件失败都不得发布 npm。 + +## 11. 发布回滚与停止策略 + +| 发现的问题 | 立即动作 | 禁止动作 | 恢复方式 | +| --- | --- | --- | --- | +| advisory 模板误导但无 authority 写 | 停止发布、修模板、重跑 snapshot | 不要求用户迁移 workflow | 发布前替换 adapter/模板;已有 authority 不变 | +| adapter stale 或 renderer mismatch | 阻塞 mutation,提示显式 upgrade | 自动 `--force`、手工改 digest | upgrade dry-run → 确认 → journal repair | +| Policy 2 parser/门禁错误 | 关闭 Policy 2 创建入口 | 把 2 降为 1 或修改旧 workflow | 修复 CLI 后重新读取;project marker 保持可审计 | +| project upgrade 中断 | 标记 pending/repair,禁止普通写 | 直接删除半成品或手改 minWriter | `operation repair` 恢复 before/target 状态 | +| reframe 中断或前置条件冲突 | 保留 operation journal,维持 blocked/repair_required | 手动写 Step 2、释放部分 claim | 修复原 operation;无法证明时人工处理后再重试 | +| git-ref reframe 请求 | 稳定返回 `MANCODE_REFRAME_GIT_REF_UNSUPPORTED` | 只在本 clone 先执行、以后同步 | 本计划不提供恢复路径;后续若要支持,必须另立协议设计与发布评审 | + +版本回滚只回滚代码入口和默认创建策略,不回写历史 policy、requirements、plan 或 task step。任何需要修改现有权威内容的“回滚”都必须成为另一个明确、journaled 的 migration,并经过独立评审。 + +## 12. 实施顺序与停止/重新对齐条件 + +截至 `c12969b`,步骤 1–4 是开发集成基线;当前修复尚未形成新的候选,步骤 2–5 和 7 需在新候选上重新完成。 + +1. [x] 冻结本文件中的错误码、字段语义、digest 规范和兼容矩阵,并复核 public workflow create 的 Policy 1 基线。 +2. [x] 完成 A–F 工作包;工作包可以独立合并,但不发布中间 npm 版本。 +3. [x] 完成 adapter digest/upgrade 和 parser/capability gate;当前工作树已通过 0.3.x + V2 manifest reader/writer fixture,新候选仍需重跑。 +4. [x] 完成 project upgrade 和 local reframe 的独立 operation/recovery;只在 upgraded marker 下打开 Policy 2 create default。 +5. [ ] 在同一个 release candidate 上通过第 10.2 节和 [`docs/release-acceptance.md`](./release-acceptance.md) 的全部真实宿主、跨 clone、legacy、Beta gate 和 tarball 检查。 +6. [x] 只把候选提交推送到远程 `develop`;禁止推送、合并或创建以 `main` 为目标的发布操作。 +7. [ ] 确认远程 `develop` 与完整验收证据完全一致后,才允许发布唯一的 npm 版本 0.4.0。git-ref reframe 始终拒绝,不进入本计划范围。 + +任何阶段出现下列情况,都回到“证据和契约评审”,而不是继续编码: + +- 发现两个入口给同一任务不同的 owner、scope 或状态语义; +- authority writer 与 derived copy 的责任无法唯一确定; +- status、contract、policy 或完成门禁的意义需要改变; +- digest 只反映版本常量、无法重建 expected bytes,或跨平台结果不稳定; +- 旧 CLI 能读到新 policy 却没有可靠的 reader/writer/capability 拒绝; +- operation 无法在任意中断点证明“全前或全后”; +- 需求变化需要同时改 requirements、plan、claims、handoff 或 step,但当前 operation 没有覆盖它们。 + +重新对齐完成的最低证据是:新的目标、候选 owner、source of truth、兼容影响、停止条件和唯一 recommendation 已被记录,并由相应 authority writer 重新确认。仅仅修改 Markdown 或手动调整 step 不算重新对齐。 + +## 13. 0.4.0 已定稿的四个实现选择 + +以下选择已由 compatibility contract 固定;发布前不得在缺少重新评审和对应证据时改变: + +1. **Public create 基线:** 用未升级项目的端到端 create contract 证明只写 Policy 1;不得把 CLI 选项、模板默认值或 builder 默认值中的任一项当成唯一证据。 +2. **Digest 的持久化位置:** 固定采用“renderer 重建 expected digest + local 非权威 cache”,不在 V1 或 V2 持久化 content digest。性能不足必须另立设计,不能阻塞后临时扩 schema。 +3. **升级命令的公开名称:** 以现有 `adapter status/install` 命令注册、JSON 输出和 shell 退出码测试确定名称;文档和实现必须只保留一个正式入口。 +4. **Capability 的编码:** 默认由 CLI 内置 capability set 加 project `minWriterVersion` 双门控制,不新增可被旧 CLI 忽略的 manifest capability 字段;local reframe 与 git-ref hard reject 必须使用不同 capability 结果。 + +这四项仍须与第 10.2 节的共同 release gate 一起通过,才允许发布 0.4.0。git-ref reframe 不在支持范围内。 + +## 14. 远程分支与 npm 发布顺序 + +0.4.0 只允许按以下顺序发布: + +`c12969b` 是当前开发集成基线;候选后的实现、测试和发布文档修改已使其失效。新的唯一候选必须重新完成第 1–3 步并推送到 `origin/develop`;第 4–6 步必须在任何 `npm publish` 前补齐。 + +1. 所有实现、修复和文档进入本地 `develop`,形成唯一 release candidate commit。 +2. 在该提交上完成第 10.2 节的全部自动化、恢复、跨平台和真实宿主验收。任何失败都必须修复并从头重跑受影响的 release gate。 +3. [x] 只执行 `git push origin develop`。禁止直接或间接更新远程 `main`,包括 push、merge、rebase、以 `main` 为目标的 PR 或自动化发布工作流。 +4. 从远程 `develop` 的同一提交创建干净 checkout,运行 `npm ci`、`npm run prepublishOnly`、要求的平台 smoke tests 和 `npm pack --dry-run`;随后执行实际 `npm pack`,验证生成 tarball 可安装、CLI 可启动。 +5. 确认 release candidate commit、远程 `develop` commit、测试证据和待发布 package version 完全一致。 +6. 前五步全部成功后才允许执行 `npm publish`。不发布 `0.4.0-beta`、`0.4.0-rc` 或其他中间 npm 版本。 + +若 `npm publish` 前发生任何代码、依赖、构建配置或发布文档变化,候选提交立即失效,必须重新执行步骤 2–5。npm 发布成功不授权更新远程 `main`。 diff --git a/docs/release-acceptance.md b/docs/release-acceptance.md index c7e1cac..05fac8d 100644 --- a/docs/release-acceptance.md +++ b/docs/release-acceptance.md @@ -36,7 +36,7 @@ session evidence 不保存原始 key、token、绝对业务路径或任务正文 ## 当前未完成项 - 五个平台在最终候选上的完整 session spike。 -- Windows CMD、PowerShell 和 Git Bash 的 required smoke check。 +- 当前候选上的 Windows CMD、PowerShell 和 Git Bash required smoke check。 - 跨真实宿主协作与恢复验收。 - 当前候选上的双 clone git-ref 人工验收。 - legacy fixture 的 stage、activation、中断恢复和受约束 rollback 验收。 @@ -45,4 +45,6 @@ session evidence 不保存原始 key、token、绝对业务路径或任务正文 - 验收前后 `origin/main` 未变化的记录。 - 汇总全部证据后的最终 Beta gate。 +开发基线证据:`c12969b` 的 [Windows compatibility gate](https://github.com/whitelonng/mancode/actions/runs/29867788958) 已在 Windows CMD、PowerShell 和 Git Bash 全部通过;本机 smoke 只跳过了非 Windows 环境无法执行的原生 open-file rename 断言。基线后的代码、测试和文档修改进入新候选后,Windows required check 必须重新执行。 + 完成一项时更新本文件的未完成列表;不要创建新的平行验收计划。 diff --git a/src/context/resolver.ts b/src/context/resolver.ts index ba993a1..45baa70 100644 --- a/src/context/resolver.ts +++ b/src/context/resolver.ts @@ -194,25 +194,27 @@ export class ContextResolver { throw new Error('MANCODE_SESSION_NOT_FOUND'); } const requestedTask = resolveRequestedTask(request.taskRef, session); - const taskRef = (await this.store.locateTask(requestedTask)).taskRef; const intent = request.intent ?? 'read'; const maxReadAttempts = parseMaxReadAttempts(request.maxReadAttempts); + const preflight = await this.readCompatibilityPreflight(request, intent); + if (!preflight.readAllowed) { + throw new Error(preflight.failures[0] ?? 'MANCODE_CONTEXT_READ_BLOCKED'); + } + if (intent === 'mutate' && !preflight.writeAllowed) { + throw new Error(preflight.failures[0] ?? 'MANCODE_CONTEXT_WRITE_BLOCKED'); + } + const taskRef = (await this.store.locateTask(requestedTask)).taskRef; const snapshot = await this.readStableSnapshot( taskRef, request, maxReadAttempts, ); - const compatibility = evaluateCompatibilityGate({ - manifest: snapshot.project.manifest, - expectedSchemaEpoch: request.compatibility.expectedSchemaEpoch, - readerVersion: request.compatibility.readerVersion, - writerVersion: request.compatibility.writerVersion, - writerCapabilities: request.compatibility.writerCapabilities, - adapterVersions: request.compatibility.adapterVersions, - currentLegacyBaseline: snapshot.legacy.baseline, - legacyAuthorityPresent: snapshot.legacy.authorityPresent, - operation: intent === 'read' ? 'read' : 'v3_business_write', - }); + const compatibility = this.evaluateCompatibility( + request, + intent, + snapshot.project, + snapshot.legacy, + ); if (!compatibility.readAllowed) { throw new Error( compatibility.failures[0] ?? 'MANCODE_CONTEXT_READ_BLOCKED', @@ -255,6 +257,36 @@ export class ContextResolver { return resolution; } + private async readCompatibilityPreflight( + request: ContextResolveRequest, + intent: ContextResolutionIntent, + ) { + const [project, legacy] = await Promise.all([ + this.store.readProjectSnapshot(), + scanLegacyAuthority(this.store.projectRoot), + ]); + return this.evaluateCompatibility(request, intent, project, legacy); + } + + private evaluateCompatibility( + request: ContextResolveRequest, + intent: ContextResolutionIntent, + project: StoredProjectSnapshot, + legacy: LegacyAuthorityScan, + ) { + return evaluateCompatibilityGate({ + manifest: project.manifest, + expectedSchemaEpoch: request.compatibility.expectedSchemaEpoch, + readerVersion: request.compatibility.readerVersion, + writerVersion: request.compatibility.writerVersion, + writerCapabilities: request.compatibility.writerCapabilities, + adapterVersions: request.compatibility.adapterVersions, + currentLegacyBaseline: legacy.baseline, + legacyAuthorityPresent: legacy.authorityPresent, + operation: intent === 'read' ? 'read' : 'v3_business_write', + }); + } + private async readStableSnapshot( taskRef: TaskRef, request: ContextResolveRequest, diff --git a/src/context/workflow-create.ts b/src/context/workflow-create.ts index 90ea0b2..2f6238a 100644 --- a/src/context/workflow-create.ts +++ b/src/context/workflow-create.ts @@ -275,7 +275,7 @@ export async function createV3Workflow( timestamp, planningPolicyVersion: parent === null - ? project.manifest.manifestVersion === 2 + ? project.manifest.manifestVersion === 2 && workflowMode === 'man' ? project.manifest.workflowPolicyDefaults.planning : 1 : parent.metadata.governance.policyVersions.planning, diff --git a/src/installers/adapter-upgrade.ts b/src/installers/adapter-upgrade.ts index b28d46a..89b2aa3 100644 --- a/src/installers/adapter-upgrade.ts +++ b/src/installers/adapter-upgrade.ts @@ -444,6 +444,10 @@ async function commitAdapterUpgrade(input: { ); for (const plan of input.plans) { await renewLocks(locks); + throwIfOperationCrashInjected( + 'adapter_upgrade', + `replace-managed-adapters:before:${plan.target}`, + ); await applyV3AdapterFilePlan(input.root, plan); throwIfOperationCrashInjected( 'adapter_upgrade', diff --git a/src/runtime/operation-journal.ts b/src/runtime/operation-journal.ts index fb14c9c..67bfebb 100644 --- a/src/runtime/operation-journal.ts +++ b/src/runtime/operation-journal.ts @@ -505,7 +505,7 @@ function allowedOperationTransitions( case 'applying': return new Set(['committed', 'repair_required', 'aborted']); case 'repair_required': - return new Set(['committed']); + return new Set(['committed', 'aborted']); case 'committed': case 'aborted': return new Set(); diff --git a/tests/adapter-upgrade-contracts.test.ts b/tests/adapter-upgrade-contracts.test.ts index d87fe71..b55731e 100644 --- a/tests/adapter-upgrade-contracts.test.ts +++ b/tests/adapter-upgrade-contracts.test.ts @@ -290,51 +290,122 @@ describe('adapter managed-content digest and upgrade', () => { expect(agents).toContain(''); }); - it('repairs forward after a crash following one visible target write', async () => { - const operationId = id(20); - await upgradeV3Adapters({ + it('recovers every five-platform target from its write-before and write-after boundary', async () => { + const discovery = await upgradeV3Adapters({ projectRoot: root, - platforms: ['cursor'], + platforms: V3_ADAPTER_PLATFORMS, dryRun: true, - operationId, + operationId: id(20), now: NOW, }); - await expect( - withOperationCrashInjectionForTesting( - { - operationType: 'adapter_upgrade', - crashAfter: 'replace-managed-adapters:cursor-rule', - }, - () => - upgradeV3Adapters({ - projectRoot: root, - platforms: ['cursor'], - explicitConfirmation: true, - sessionId, - operationId, - now: NOW, - }), - ), - ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + const targets = discovery.filePlans.map((plan) => plan.target); + expect(targets.length).toBeGreaterThan(1); + expect(new Set(targets).size).toBe(targets.length); - const repaired = await executeOperationRecovery({ - projectRoot: root, - operationId, - actorId, - sessionId, - now: new Date(NOW.getTime() + 1_000), - }); - expect(repaired).toMatchObject({ - state: 'repaired', - journal: { state: 'committed', type: 'adapter_upgrade' }, - }); - await expect(inspectV3Adapter(root, 'cursor')).resolves.toMatchObject({ - status: 'ready', - ready: true, - }); - }); + let caseIndex = 0; + for (const boundary of ['before', 'after'] as const) { + for (const [targetIndex, target] of targets.entries()) { + const caseRoot = path.join(root, `${boundary}-${caseIndex}`); + await mkdir(caseRoot, { recursive: true }); + const fixture = await bootstrapAdapterCase( + caseRoot, + 40 + caseIndex * 7, + ); + const operationId = id(45 + caseIndex * 7); + const preview = await upgradeV3Adapters({ + projectRoot: caseRoot, + platforms: V3_ADAPTER_PLATFORMS, + dryRun: true, + operationId, + now: NOW, + }); + expect(preview.filePlans.map((plan) => plan.target)).toEqual(targets); + + await expect( + withOperationCrashInjectionForTesting( + { + operationType: 'adapter_upgrade', + crashAfter: + boundary === 'before' + ? `replace-managed-adapters:before:${target}` + : `replace-managed-adapters:${target}`, + }, + () => + upgradeV3Adapters({ + projectRoot: caseRoot, + platforms: V3_ADAPTER_PLATFORMS, + explicitConfirmation: true, + sessionId: fixture.sessionId, + operationId, + now: NOW, + }), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + + const repaired = await executeOperationRecovery({ + projectRoot: caseRoot, + operationId, + actorId: fixture.actorId, + sessionId: fixture.sessionId, + now: new Date(NOW.getTime() + 1_000), + }); + if (boundary === 'before' && targetIndex === 0) { + expect(repaired).toMatchObject({ + state: 'aborted', + journal: { state: 'aborted', type: 'adapter_upgrade' }, + }); + } else { + expect(repaired).toMatchObject({ + state: 'repaired', + journal: { state: 'committed', type: 'adapter_upgrade' }, + }); + } + const statuses = await Promise.all( + V3_ADAPTER_PLATFORMS.map((platform) => + inspectV3Adapter(caseRoot, platform), + ), + ); + if (boundary === 'before' && targetIndex === 0) { + expect(statuses.every((status) => status.status === 'missing')).toBe( + true, + ); + } else { + expect(statuses.every((status) => status.ready)).toBe(true); + } + caseIndex += 1; + } + } + }, 30_000); }); +async function bootstrapAdapterCase( + projectRoot: string, + offset: number, +): Promise<{ actorId: Ulid; sessionId: Ulid }> { + await initializeV3Project({ + projectRoot, + operationId: id(offset), + workspaceId: id(offset + 1), + schemaEpoch: id(offset + 2), + now: NOW, + }); + const actorId = id(offset + 3); + const sessionId = id(offset + 4); + await createLocalActor(projectRoot, { + actorId, + displayName: 'Adapter Boundary Tester', + now: NOW, + }); + await createSession(projectRoot, { + actorId, + sessionId, + client: 'vitest', + identitySource: 'explicit', + now: NOW, + }); + return { actorId, sessionId }; +} + function id(offset: number): Ulid { return createUlid(NOW.getTime() + offset, new Uint8Array(10).fill(offset)); } diff --git a/tests/compatibility-contracts.test.ts b/tests/compatibility-contracts.test.ts index d905c8b..0a49186 100644 --- a/tests/compatibility-contracts.test.ts +++ b/tests/compatibility-contracts.test.ts @@ -170,6 +170,46 @@ describe('schema compatibility gate', () => { ).toThrow(/planning-policy:2/); }); + it('blocks a 0.3.x CLI at the V2 manifest boundary before policy execution', () => { + const base = activeInput({ + minReaderVersion: '0.4.0', + minWriterVersion: '0.4.0', + }); + const manifest: SchemaManifestV2 = { + ...base.manifest, + manifestVersion: 2, + workflowPolicyDefaults: { planning: 2 }, + }; + const result = evaluateCompatibilityGate({ + ...base, + manifest, + readerVersion: '0.3.18', + writerVersion: '0.3.18', + writerCapabilities: ['planning-policy:1'], + operation: 'v3_business_write', + }); + + expect(result).toEqual({ + readAllowed: false, + writeAllowed: false, + failures: [ + 'MANCODE_READER_VERSION_TOO_OLD', + 'MANCODE_WRITER_VERSION_TOO_OLD', + 'MANCODE_WRITER_CAPABILITY_MISSING', + ], + }); + expect(() => + assertCompatibilityGate({ + ...base, + manifest, + readerVersion: '0.3.18', + writerVersion: '0.3.18', + writerCapabilities: ['planning-policy:1'], + operation: 'v3_business_write', + }), + ).toThrow(/^MANCODE_READER_VERSION_TOO_OLD:/); + }); + it('requires the adapter digest and local reframe capabilities for reframe', () => { const input = activeInput(); expectWriteBlocked( diff --git a/tests/context-resolver-contracts.test.ts b/tests/context-resolver-contracts.test.ts index 941365b..e56910b 100644 --- a/tests/context-resolver-contracts.test.ts +++ b/tests/context-resolver-contracts.test.ts @@ -1,4 +1,11 @@ -import { mkdir, mkdtemp, rm, symlink, writeFile } from 'node:fs/promises'; +import { + mkdir, + mkdtemp, + readFile, + rm, + symlink, + writeFile, +} from 'node:fs/promises'; import os from 'node:os'; import path from 'node:path'; import { afterEach, describe, expect, it } from 'vitest'; @@ -166,6 +173,52 @@ describe('V3 Context Resolver', () => { }), ).rejects.toThrow('MANCODE_CONTEXT_PATH_UNSAFE'); }); + + it('short-circuits a stale adapter before parsing an unsupported workflow policy for mutation', async () => { + const fixture = await createFixture(); + const metadataPath = path.join( + fixture.root, + '.mancode', + 'shared', + 'workflows', + TASK_ID, + 'metadata.json', + ); + const metadata = JSON.parse(await readFile(metadataPath, 'utf8')) as { + governance: { + policyVersions: { planning: number | null }; + }; + }; + metadata.governance.policyVersions.planning = 3; + await writeJson(metadataPath, metadata); + + const request = { + session: fixture.session, + taskRef: `shared:${TASK_ID}`, + level: 'task' as const, + purpose: 'implement' as const, + intent: 'mutate' as const, + codeHead: 'abc1234', + }; + await expect( + fixture.resolver.resolve({ + ...request, + compatibility: { + ...fixture.compatibility, + adapterVersions: { + ...fixture.compatibility.adapterVersions, + codex: 'stale', + }, + }, + }), + ).rejects.toThrow('MANCODE_ADAPTER_CONTENT_STALE'); + await expect( + fixture.resolver.resolve({ + ...request, + compatibility: fixture.compatibility, + }), + ).rejects.toThrow('MANCODE_POLICY_VERSION_UNSUPPORTED'); + }); }); async function createFixture() { diff --git a/tests/operation-journal-contracts.test.ts b/tests/operation-journal-contracts.test.ts index 019e364..d17f035 100644 --- a/tests/operation-journal-contracts.test.ts +++ b/tests/operation-journal-contracts.test.ts @@ -113,6 +113,24 @@ describe('operation journal contract', () => { expect(() => assertOperationJournalTransition(applying, aborted, { canAbort: false }), ).toThrow(/cannot abort/); + const repairRequired = parseOperationJournal({ + ...applying, + state: 'repair_required', + }); + const safelyAbortedRepair = parseOperationJournal({ + ...repairRequired, + state: 'aborted', + }); + expect(() => + assertOperationJournalTransition(repairRequired, safelyAbortedRepair, { + canAbort: true, + }), + ).not.toThrow(); + expect(() => + assertOperationJournalTransition(repairRequired, safelyAbortedRepair, { + canAbort: false, + }), + ).toThrow(/cannot abort/); }); }); diff --git a/tests/project-policy-upgrade-contracts.test.ts b/tests/project-policy-upgrade-contracts.test.ts index e4efccb..4a4b5b5 100644 --- a/tests/project-policy-upgrade-contracts.test.ts +++ b/tests/project-policy-upgrade-contracts.test.ts @@ -116,6 +116,17 @@ describe('project Policy 2 upgrade', () => { review: 1, verification: 1, }); + const standaloneManba = await createV3Workflow({ + projectRoot: root, + task: 'Keep diagnosis on its established planning policy.', + workflowMode: 'manba', + sessionId, + client: 'vitest', + taskId: id(16), + operationId: id(17), + now: new Date(NOW.getTime() + 2_000), + }); + expect(standaloneManba.metadata.governance.policyVersions.planning).toBe(1); const oldMetadata = parseWorkflowMetadata( JSON.parse(await readFile(oldMetadataPath, 'utf8')), ); diff --git a/tests/v3-workflow-create-contracts.test.ts b/tests/v3-workflow-create-contracts.test.ts index eb219c7..113c0a9 100644 --- a/tests/v3-workflow-create-contracts.test.ts +++ b/tests/v3-workflow-create-contracts.test.ts @@ -92,6 +92,23 @@ describe('V3 workflow create operation', () => { ); }); + it('keeps standalone manba on planning Policy 1 in a Policy 2 project', async () => { + const { sessionId } = await bootstrap(root, false); + const created = await createV3Workflow({ + projectRoot: root, + task: 'Diagnose an isolated regression.', + workflowMode: 'manba', + sessionId, + client: 'vitest', + taskId: id(30), + operationId: id(31), + now: NOW, + }); + + expect(created.metadata.parent).toBeNull(); + expect(created.metadata.governance.policyVersions.planning).toBe(1); + }); + it('requires a privacy confirmation and joined profile before creating shared authority', async () => { const { actorId, sessionId } = await bootstrap(root, true); const taskId = id(8); @@ -136,6 +153,7 @@ describe('V3 workflow create operation', () => { sharedPrivacyConfirmed: true, }); expect(created.taskRef.namespace).toBe('shared'); + expect(created.metadata.governance.policyVersions.planning).toBe(1); const runtime = await readProjectRuntimeContext(root); const home = resolveTaskEntityHomeStore( runtime.entityHomeStoreContext, @@ -196,6 +214,7 @@ describe('V3 workflow create operation', () => { include: ['src/**'], modules: ['core'], }); + expect(child.metadata.governance.policyVersions.planning).toBe(2); expect(child.resolution.dimensions.visibility.source).toBe('parent'); const staleParent = parseWorkflowMetadata({ From 57855bfbbea8e71a6552ffb9171ff2ba4b520988 Mon Sep 17 00:00:00 2001 From: whitelonng Date: Wed, 22 Jul 2026 19:34:55 +0800 Subject: [PATCH 3/6] fix: harden planning reframe recovery --- docs/planning-governance-evolution.md | 54 +- docs/release-acceptance.md | 4 +- docs/workflows.md | 22 +- src/cli.ts | 2 +- src/commands/adapter.ts | 36 +- src/commands/context.ts | 28 +- src/commands/workflow.ts | 94 +++- src/context/compatibility.ts | 22 +- src/context/manifest.ts | 7 +- src/context/reframe.ts | 32 +- src/context/workflow-create.ts | 6 + src/installers/v3-adapter.ts | 36 +- src/runtime/operation-crash-injection.ts | 97 ++++ src/runtime/operation-recovery-executor.ts | 5 + src/runtime/projection-outbox.ts | 56 +++ src/runtime/task-operation.ts | 6 + tests/adapter-status-contracts.test.ts | 193 +++++++ tests/compatibility-contracts.test.ts | 2 +- tests/fixtures/legacy-cli/README.md | 21 + tests/fixtures/legacy-cli/mancode-0.3.18.tgz | Bin 0 -> 1131571 bytes ...legacy-cli-compatibility-contracts.test.ts | 306 ++++++++++++ ...ration-recovery-executor-contracts.test.ts | 2 + tests/v3-adapter-contracts.test.ts | 25 + tests/v3-command-contracts.test.ts | 52 ++ tests/v3-reframe-contracts.test.ts | 471 +++++++++++++++++- vitest.config.ts | 1 + 26 files changed, 1501 insertions(+), 79 deletions(-) create mode 100644 tests/adapter-status-contracts.test.ts create mode 100644 tests/fixtures/legacy-cli/README.md create mode 100644 tests/fixtures/legacy-cli/mancode-0.3.18.tgz create mode 100644 tests/legacy-cli-compatibility-contracts.test.ts diff --git a/docs/planning-governance-evolution.md b/docs/planning-governance-evolution.md index 8abd7d4..b67d75c 100644 --- a/docs/planning-governance-evolution.md +++ b/docs/planning-governance-evolution.md @@ -1,6 +1,6 @@ # 规划治理演进与安全发布契约 -本文是 mancode 0.4.0 的规划治理实施与发布契约。它描述目标行为、兼容边界、验证证据和停止条件。`c12969b` 是开发集成基线;后续契约修复必须进入新的唯一候选。在最终发布门禁和 npm 发布完成前,本文的“已完成”只表示代码与自动化验证完成,不表示已经发布。 +本文是 mancode 0.4.0 的规划治理实施与发布契约。它描述目标行为、兼容边界、验证证据和停止条件。`4dc2e7e` 是当前已验证的开发集成候选;后续契约修复必须进入新的唯一候选。在最终发布门禁和 npm 发布完成前,本文的“已完成”只表示代码与自动化验证完成,不表示已经发布。 ## 1. 决策摘要 @@ -14,11 +14,11 @@ | 类别 | 状态 | 证据 | | --- | --- | --- | -| A–F 实现工作包 | 工作树修复完成 | `c12969b` 为基线;Policy 2 mode scope、resolver 短路和 adapter target recovery 已修复,等待形成新候选 | -| 本地发布前检查 | 工作树通过 | `npm run prepublishOnly` 通过:lint、typecheck、build、dist adapter 验证、117 个测试文件/811 个测试;形成新候选后仍需重跑 | -| GitHub Quality gate | 需重跑 | 旧基线 run 29867788739 不能替代新候选证据 | -| GitHub Windows gate | 需重跑 | 旧基线 run 29867788958 不能替代新候选证据;目标仍是 Windows CMD、PowerShell、Git Bash | -| `develop` 远程一致性 | 候选失效 | 当前本地有候选后的实现、测试和文档修改;形成新候选后再与 `origin/develop` 对齐,`main` 未修改 | +| A–F 实现工作包 | 工作树生产加固完成 | `4dc2e7e` 包含 Policy 2 mode scope、resolver 短路和 adapter target recovery 修复;本轮又补齐 required adapter readiness、真实 reframe 并发和已发布旧 CLI 黑盒证据,等待形成下一候选 | +| 本地发布前检查 | 工作树通过 | 本轮 `npm run prepublishOnly` 通过:lint、typecheck、build、dist adapter 验证、119 个测试文件/824 个测试;`npm audit --omit=dev`、`npm pack --dry-run` 和实际 tarball 安装/CLI/module smoke 均通过,形成候选后仍需在干净 checkout 重跑 | +| GitHub Quality gate | 候选通过 | `4dc2e7e` 的 [Quality gate run 29896302856](https://github.com/whitelonng/mancode/actions/runs/29896302856) 成功;候选变化后必须重跑 | +| GitHub Windows gate | 候选通过 | `4dc2e7e` 的 [Windows gate run 29896302904](https://github.com/whitelonng/mancode/actions/runs/29896302904) 在 CMD、PowerShell、Git Bash 全部成功;候选变化后必须重跑 | +| `develop` 远程一致性 | 候选已对齐 | `4dc2e7e` 已与 `origin/develop` 对齐;后续工作树修复形成新候选后需重新推送和对齐,`main` 未修改 | | 最终发布验收 | 未完成 | 五平台真实宿主、跨 clone/legacy 人工验收、最终 Beta gate 和干净 checkout tarball 验收仍待完成 | | npm 发布 | 未执行 | 在上项全部完成前保持禁止 | @@ -49,18 +49,18 @@ ## 3. 基线证据与代码 owner -以下证据以已验证的 V3 基线为准。实现开始前应重新运行对应 contract;如果在途改动改变了行号或行为,更新证据而不是沿用旧结论。 +以下证据以当前工作树的 V3 实现为准。候选形成前后都应重新运行对应 contract;如果在途改动改变了行号或行为,更新证据而不是沿用旧结论。 | 事实 | 当前证据 | 对本计划的影响 | | --- | --- | --- | -| workflow create 的 Policy 1 基线 | 以 release candidate 的 public `workflow create` contract 和 [`src/context/workflow-create.ts`](../src/context/workflow-create.ts#L742) 共同复核 | 不以单个 builder 行号宣称基线;0.4.0 必须由“项目已升级”状态选择默认值,未升级项目仍写 1 | -| policy parser 接受任意正整数 | [`src/context/workflow-metadata.ts`](../src/context/workflow-metadata.ts#L581) | 必须改为显式白名单;未知版本要产生稳定错误码 | -| context compatibility 使用 manifest 中的 adapter 版本回显 | [`src/commands/context.ts`](../src/commands/context.ts#L833) | 不能把 manifest echo 当作磁盘内容证据 | -| adapter inspection 返回 renderer 当前常量 | [`src/installers/v3-adapter.ts`](../src/installers/v3-adapter.ts#L480) | 需要实际文件 digest 和 stale 分类 | -| requirements finalize 与 plan revise 已有 stale ledger 逻辑 | [`src/context/requirements-finalize.ts`](../src/context/requirements-finalize.ts#L263)、[`src/context/plan-revision.ts`](../src/context/plan-revision.ts#L280) | 可复用 ledger stale 的验证模式,但不能借此假装实现了 reframe | -| scope-change 会处理旧 claim 与 successor claim | [`src/context/scope-change.ts`](../src/context/scope-change.ts#L569) | 它不是需求重构;reframe 必须有独立 operation type 和 eligibility | -| parent contract 变化会使 child snapshot stale | [`src/context/child-result-merge.ts`](../src/context/child-result-merge.ts#L335) | reframe 必须在入口拒绝 active child,而不是事后合并 stale 结果 | -| solo handoff 目前有 start/complete,但没有取消或 reframe 路径 | [`src/context/solo-handoff.ts`](../src/context/solo-handoff.ts#L350) | advisory 只返回诊断;0.4.0 reframe 必须显式拒绝 active solo assignment | +| workflow create 保留 Policy 1 基线,只在 V2 已升级项目的新 `/man` 上使用 Policy 2 默认值 | 以 release candidate 的 public `workflow create` contract 和 [`src/context/workflow-create.ts`](../src/context/workflow-create.ts#L277) 共同复核 | 不以单个 builder 行号宣称基线;项目升级状态和 workflow mode 共同决定默认值 | +| policy parser 只接受各组件显式支持的版本白名单 | [`src/context/workflow-metadata.ts`](../src/context/workflow-metadata.ts#L621) | 未知版本产生稳定的 `WorkflowPolicyVersionUnsupportedError`,不能被当成未来版本静默接受 | +| context compatibility 使用 adapter 的实际磁盘 inventory | [`src/commands/context.ts`](../src/commands/context.ts#L881) | manifest echo 不作为磁盘内容证据;inventory、renderer version 和内容状态必须共同匹配 | +| adapter inspection 重建 expected bytes/digest,并分类 `ready`、`missing`、`stale`、`unreadable` | [`src/installers/v3-adapter.ts`](../src/installers/v3-adapter.ts#L626) | status 与 mutation gate 都以物理 target 为准,非 ready 状态不能与 manifest version 混淆 | +| requirements finalize 与 plan revise 显式把旧 review/verification ledger 标为 stale | [`src/context/requirements-finalize.ts`](../src/context/requirements-finalize.ts#L188)、[`src/context/plan-revision.ts`](../src/context/plan-revision.ts#L347) | 复用 ledger stale 的验证模式,但 reframe 仍使用独立原子 operation | +| scope-change 会处理旧 claim 与 successor claim | [`src/context/scope-change.ts`](../src/context/scope-change.ts#L637) | 它不是需求重构;reframe 使用独立 operation type 和 eligibility | +| parent contract 变化会使 child snapshot stale | [`src/context/child-result-merge.ts`](../src/context/child-result-merge.ts#L331) | reframe 在入口拒绝 active child,而不是事后合并 stale 结果 | +| reframe eligibility 显式拒绝 active child、open handoff 和 active solo assignment | [`src/context/reframe.ts`](../src/context/reframe.ts#L497) | advisory 只返回诊断;不得通过局部清理绕过跨实体约束 | **实现 owner 约定:** workflow metadata/parser 负责 policy 结构和状态转换; adapter installer/status 负责渲染、digest 和物理文件; compatibility/resolver 负责 reader/writer 门;workflow operation 模块负责跨实体写入;templates 只负责 advisory 文本,不得直接写权威状态。 @@ -215,7 +215,7 @@ mancode adapter status --json | CLI/release | 可读取/写入的 planning policy | | --- | --- | -| 既有 0.3.x CLI | 只支持 V1/Policy 1;遇到 V2 manifest 由 `minReaderVersion`/`minWriterVersion` 拒绝,不把旧 parser 行为当作未知 policy 拒绝证据 | +| 既有 0.3.x CLI | 只支持 V1/Policy 1;已发布的 0.3.18 在 V2 manifest schema parser 边界拒绝未知的 `workflowPolicyDefaults`,并在 policy 执行和 authority mutation 前终止;能解析 V2 的 reader/writer 仍由 `minReaderVersion`/`minWriterVersion` 拒绝 | | 0.4.0(未升级项目) | 读取和写入已有 `1`;新建仍按项目记录的默认值 | | 0.4.0(已升级项目) | `1` 和 `2`;新建 `/man` 默认 `2` | @@ -314,11 +314,11 @@ mancode project upgrade --policy 2 --operation-id --session - | 0.3.x + V1 未升级项目 | 读写 Policy 1 | 不提供 Policy 2 创建 | 写 1 | 保持旧行为;Policy 2 需要显式升级 | | 0.4.x + 未升级项目 | 读写 | 不创建、不接受未满足门禁的 2 | 写 1 | CLI 新,但 project policy 未升级 | | 0.4.x + 已升级项目 | 读写且保留 provenance | 读写,要求 digest/capability | 写 2 | 目标 Policy 2 路径 | -| 0.3.x + V2 已升级项目 | 不允许绕过 `minWriterVersion` 写入 | 不允许绕过 `minReaderVersion` 读取/执行 | 不允许创建 | 显式 `MANCODE_WRITER_VERSION_TOO_OLD` 或 reader failure | +| 0.3.x + V2 已升级项目 | 不允许写入 | 不允许读取后执行 | 不允许创建 | 0.3.18 在 manifest parser 边界拒绝;能解析 V2 的旧 reader/writer 返回 version-too-old failure | | 任意 CLI + stale adapter | 读诊断 | 拒绝 mutation | 拒绝创建 | 先执行显式 adapter upgrade | | 任意 CLI + git-ref transport | 正常既有 transport contract | Policy 2 仍可按 transport contract 运行 | 不能 reframe | `MANCODE_REFRAME_GIT_REF_UNSUPPORTED` | -“读”不等于“执行”:旧 CLI 只能在 V1/Policy 1 的兼容范围内展示安全诊断;遇到 V2 manifest 必须先由 reader gate 阻断,不能生成执行指令或写入任何 authority。 +“读”不等于“执行”:旧 CLI 只能在 V1/Policy 1 的兼容范围内展示安全诊断;遇到 V2 manifest 必须先由 manifest parser 或 reader gate 阻断,不能生成执行指令或写入任何 authority。 ## 9. 验证矩阵 @@ -370,13 +370,13 @@ mancode project upgrade --policy 2 --operation-id --session - - [x] 触发 stop/re-align 时只返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,authority 文件内容和 claims 不变。 - [x] Scout/Plan Coach 新字段和规则覆盖正常、缺失证据、冲突 owner、单方向简单任务。 - [x] adapter digest algorithm、status 分类、stale error、explicit upgrade command 和 recovery contract 完成。 -- [x] policy parser 白名单、writer capability、`minWriterVersion`/reader gate 和 0.3.x + V2 manifest 拒绝测试在当前工作树通过;新候选仍需重跑。 +- [x] policy parser 白名单、writer capability、`minWriterVersion`/reader gate 和 0.3.x + V2 manifest 拒绝 contract 完成;本轮已增加真实发布版 0.3.18 CLI 的黑盒写入拒绝与 authority 全树字节不变证据,后续候选仍需重跑。 - [x] project upgrade dry-run、确认、commit、repair、abort 和 provenance 完成;现有 workflow 未被批量重写,新 `/man` Policy 2 默认值有明确创建证据。 -- [x] local transport 的完整原子 reframe、recovery、并发和 archive retention 通过;没有复用 scope-change,也没有 active child/open handoff/active solo assignment 的绕过路径。 +- [x] local transport 的完整原子 reframe、recovery、archive retention,以及与 child create、handoff create/start、solo handoff start 的真实并发竞争通过;没有复用 scope-change,也没有部分 authority 或 eligibility 绕过路径。 - [x] 已升级/未升级项目、旧/新 workflow、local/git-ref transport 的自动化兼容矩阵通过;git-ref reframe 稳定返回 `MANCODE_REFRAME_GIT_REF_UNSUPPORTED`。 -- [x] 5 个 adapter renderer、Windows path、line ending、用户托管区和每个 target 写前/写后中断恢复在当前工作树通过;新候选仍需重跑 dist/Windows/recovery gate。 +- [x] 5 个 adapter renderer、Windows path、line ending、用户托管区和每个 target 写前/写后中断恢复在 `4dc2e7e` 通过;后续候选仍需重跑 dist/Windows/recovery gate。 - [ ] Claude Code、Codex、Cursor、GitHub Copilot、ZCode 的最终候选真实宿主验收,以及 [`docs/release-acceptance.md`](./release-acceptance.md) 要求的跨 clone、legacy、Beta gate 和干净 checkout tarball 验收。 -- [x] 按开发集成要求将候选 `c12969b` 推送到远程 `develop`;这不等同于 release gate 通过。 +- [x] 按开发集成要求将候选 `4dc2e7e` 推送到远程 `develop`,且 Quality 与 Windows gate 均通过;这不等同于 release gate 通过。 - [ ] 完成剩余发布验收后才允许进入 npm 发布检查;任何条件失败都不得发布 npm。 ## 11. 发布回滚与停止策略 @@ -394,14 +394,14 @@ mancode project upgrade --policy 2 --operation-id --session - ## 12. 实施顺序与停止/重新对齐条件 -截至 `c12969b`,步骤 1–4 是开发集成基线;当前修复尚未形成新的候选,步骤 2–5 和 7 需在新候选上重新完成。 +截至 `4dc2e7e`,步骤 1–4 是已验证的开发集成候选;本轮生产加固修复形成新候选后,受影响的自动化证据和步骤 5、7 仍需重新完成。 1. [x] 冻结本文件中的错误码、字段语义、digest 规范和兼容矩阵,并复核 public workflow create 的 Policy 1 基线。 2. [x] 完成 A–F 工作包;工作包可以独立合并,但不发布中间 npm 版本。 3. [x] 完成 adapter digest/upgrade 和 parser/capability gate;当前工作树已通过 0.3.x + V2 manifest reader/writer fixture,新候选仍需重跑。 4. [x] 完成 project upgrade 和 local reframe 的独立 operation/recovery;只在 upgraded marker 下打开 Policy 2 create default。 5. [ ] 在同一个 release candidate 上通过第 10.2 节和 [`docs/release-acceptance.md`](./release-acceptance.md) 的全部真实宿主、跨 clone、legacy、Beta gate 和 tarball 检查。 -6. [x] 只把候选提交推送到远程 `develop`;禁止推送、合并或创建以 `main` 为目标的发布操作。 +6. [ ] 将本轮加固后的唯一候选提交推送到远程 `develop`;`4dc2e7e` 的历史推送不替代新候选,且禁止推送、合并或创建以 `main` 为目标的发布操作。 7. [ ] 确认远程 `develop` 与完整验收证据完全一致后,才允许发布唯一的 npm 版本 0.4.0。git-ref reframe 始终拒绝,不进入本计划范围。 任何阶段出现下列情况,都回到“证据和契约评审”,而不是继续编码: @@ -422,7 +422,7 @@ mancode project upgrade --policy 2 --operation-id --session - 1. **Public create 基线:** 用未升级项目的端到端 create contract 证明只写 Policy 1;不得把 CLI 选项、模板默认值或 builder 默认值中的任一项当成唯一证据。 2. **Digest 的持久化位置:** 固定采用“renderer 重建 expected digest + local 非权威 cache”,不在 V1 或 V2 持久化 content digest。性能不足必须另立设计,不能阻塞后临时扩 schema。 -3. **升级命令的公开名称:** 以现有 `adapter status/install` 命令注册、JSON 输出和 shell 退出码测试确定名称;文档和实现必须只保留一个正式入口。 +3. **升级命令的公开名称:** 以现有 `adapter status/upgrade` 命令注册、JSON 输出和 shell 退出码测试确定名称;文档和实现必须只保留一个正式入口。 4. **Capability 的编码:** 默认由 CLI 内置 capability set 加 project `minWriterVersion` 双门控制,不新增可被旧 CLI 忽略的 manifest capability 字段;local reframe 与 git-ref hard reject 必须使用不同 capability 结果。 这四项仍须与第 10.2 节的共同 release gate 一起通过,才允许发布 0.4.0。git-ref reframe 不在支持范围内。 @@ -431,11 +431,11 @@ mancode project upgrade --policy 2 --operation-id --session - 0.4.0 只允许按以下顺序发布: -`c12969b` 是当前开发集成基线;候选后的实现、测试和发布文档修改已使其失效。新的唯一候选必须重新完成第 1–3 步并推送到 `origin/develop`;第 4–6 步必须在任何 `npm publish` 前补齐。 +`4dc2e7e` 是当前已验证的开发集成候选,其 [Quality gate](https://github.com/whitelonng/mancode/actions/runs/29896302856) 和 [Windows gate](https://github.com/whitelonng/mancode/actions/runs/29896302904) 均成功。候选后的任何实现、测试或发布文档修改都会使这些证据不再适用于新候选;新的唯一候选必须重新完成第 1–3 步并推送到 `origin/develop`,第 4–6 步必须在任何 `npm publish` 前补齐。 1. 所有实现、修复和文档进入本地 `develop`,形成唯一 release candidate commit。 2. 在该提交上完成第 10.2 节的全部自动化、恢复、跨平台和真实宿主验收。任何失败都必须修复并从头重跑受影响的 release gate。 -3. [x] 只执行 `git push origin develop`。禁止直接或间接更新远程 `main`,包括 push、merge、rebase、以 `main` 为目标的 PR 或自动化发布工作流。 +3. [ ] 对本轮形成的新候选只执行 `git push origin develop`。禁止直接或间接更新远程 `main`,包括 push、merge、rebase、以 `main` 为目标的 PR 或自动化发布工作流。 4. 从远程 `develop` 的同一提交创建干净 checkout,运行 `npm ci`、`npm run prepublishOnly`、要求的平台 smoke tests 和 `npm pack --dry-run`;随后执行实际 `npm pack`,验证生成 tarball 可安装、CLI 可启动。 5. 确认 release candidate commit、远程 `develop` commit、测试证据和待发布 package version 完全一致。 6. 前五步全部成功后才允许执行 `npm publish`。不发布 `0.4.0-beta`、`0.4.0-rc` 或其他中间 npm 版本。 diff --git a/docs/release-acceptance.md b/docs/release-acceptance.md index 05fac8d..d93f806 100644 --- a/docs/release-acceptance.md +++ b/docs/release-acceptance.md @@ -35,8 +35,8 @@ session evidence 不保存原始 key、token、绝对业务路径或任务正文 ## 当前未完成项 +- 本轮修复形成的新候选上的 Quality gate,以及 Windows CMD、PowerShell、Git Bash required gate。 - 五个平台在最终候选上的完整 session spike。 -- 当前候选上的 Windows CMD、PowerShell 和 Git Bash required smoke check。 - 跨真实宿主协作与恢复验收。 - 当前候选上的双 clone git-ref 人工验收。 - legacy fixture 的 stage、activation、中断恢复和受约束 rollback 验收。 @@ -45,6 +45,6 @@ session evidence 不保存原始 key、token、绝对业务路径或任务正文 - 验收前后 `origin/main` 未变化的记录。 - 汇总全部证据后的最终 Beta gate。 -开发基线证据:`c12969b` 的 [Windows compatibility gate](https://github.com/whitelonng/mancode/actions/runs/29867788958) 已在 Windows CMD、PowerShell 和 Git Bash 全部通过;本机 smoke 只跳过了非 Windows 环境无法执行的原生 open-file rename 断言。基线后的代码、测试和文档修改进入新候选后,Windows required check 必须重新执行。 +开发候选证据:`4dc2e7e` 的 [Quality gate](https://github.com/whitelonng/mancode/actions/runs/29896302856) 和 [Windows compatibility gate](https://github.com/whitelonng/mancode/actions/runs/29896302904) 均已通过,后者覆盖 Windows CMD、PowerShell 和 Git Bash。该证据只适用于 `4dc2e7e`;后续代码、测试或文档修改进入新候选后,两个 required check 都必须重新执行。 完成一项时更新本文件的未完成列表;不要创建新的平行验收计划。 diff --git a/docs/workflows.md b/docs/workflows.md index a306912..72227e4 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -44,9 +44,11 @@ mancode workflow requirements local: finalize \ --file requirements.json --expected-revision 1 --session mancode workflow plan local: revise \ --file plan.md --expected-revision 2 --session +mancode workflow plan local: confirm \ + --plan-decision governed_execution --expected-revision 3 --session ``` -用 `mancode workflow show --json` 获取最新 revision,不要手工编辑 metadata 或 ledger。 +`plan revise` 必须通过 `--file ` 读取 Markdown 计划。修订与确认是两个独立写操作;每次写入后都应从命令结果或 `mancode workflow show --json` 获取最新 revision,再用于下一次 `--expected-revision`。只保留计划时把确认参数改为 `--plan-decision plan_only`。不要手工编辑 metadata 或 ledger。 ## Policy 2 与需求重新对齐 @@ -62,11 +64,25 @@ mancode project upgrade --policy 2 --operation-id --session --session --client --json mancode workflow reframe local: \ - --expected-revision N --checkpoint-id --session + --expected-revision N \ + --checkpoint-id \ + --summary "新证据为何使当前需求失效" \ + --next-action "回到 Step 2 后要澄清的事项" \ + --session --json ``` -reframe 会归档当前 requirements、plan 和 ledger,释放有效 claim,并把任务带回需求对齐步骤。它只接受 requirements 已确认、且不存在 active child、open handoff 或 active solo assignment 的 local workflow;git-ref transport 明确拒绝该操作。 +仅在 session 尚未指向目标 TaskRef 时执行 `context resume`。`--checkpoint-id` 必须是本次操作新生成的规范 ULID,不能复用旧 checkpoint。reframe 会原子归档当前 requirements、plan 和 ledger,释放有效 claim,清除 plan decision,并把任务带回 Step 2 的 draft requirements;完成命令后应停止实施,先重新澄清、finalize requirements、revise plan,再由用户确认计划。它只接受 requirements 已确认、且不存在 active child、open handoff 或 active solo assignment 的 local workflow;git-ref transport 明确拒绝该操作。 + +reframe 的 JSON 结果会返回 `archive.archiveId` 与 `checkpoint.checkpointId`。可通过只读 CLI 检查证据,无需读取 `.mancode` 私有 authority 文件: + +```bash +mancode workflow archive local: show --json +mancode workflow checkpoint local: show --json +``` + +archive 输出会校验归档摘要,并返回 reframe 前的 requirements 与 plan;checkpoint 输出返回该次 reframe 的完整 checkpoint。这两个命令不修改 workflow,也不需要 `--session`。 ## Session 与 Context Pack diff --git a/src/cli.ts b/src/cli.ts index 4784c3c..020cf94 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -250,7 +250,7 @@ program ) .option( '--file ', - 'Semantic or canonical structured requirements JSON input file', + 'Semantic requirements JSON, plan Markdown, or ledger input file', ) .option('--acceptance ', 'Acceptance criterion id (for example AC-1)') .option('--method ', 'Verification method: automated or manual') diff --git a/src/commands/adapter.ts b/src/commands/adapter.ts index b200f6e..c8ebdda 100644 --- a/src/commands/adapter.ts +++ b/src/commands/adapter.ts @@ -1,4 +1,8 @@ import { assertUlid } from '../context/ids.js'; +import { + managedAdapterInventoriesMatch, + managedAdapterNames, +} from '../context/manifest.js'; import { V3ContextStore } from '../context/store.js'; import { upgradeV3Adapters } from '../installers/adapter-upgrade.js'; import { @@ -8,6 +12,7 @@ import { import { V3_ADAPTER_PLATFORMS, inspectV3Adapter, + v3AdapterVersionsFromStatuses, } from '../installers/v3-adapter.js'; import { printV3Error, @@ -45,16 +50,33 @@ export async function adapterStatus( ), ); const adapters = Object.fromEntries(entries); + const readinessPlatforms = + options.platform === undefined + ? new Set( + managedAdapterNames(project.manifest.managedAdapters), + ) + : new Set(platforms); + const manifestAdapters = Object.fromEntries( + platforms.flatMap((platform) => { + const version = project.manifest.managedAdapters[platform]; + return version === undefined ? [] : [[platform, version]]; + }), + ); + const actualAdapterVersions = v3AdapterVersionsFromStatuses( + entries, + readinessPlatforms, + ); + const actualAdaptersReady = entries.every( + ([platform, status]) => + actualAdapterVersions[platform] === undefined || status.ready, + ); return printV3Result(options.json, { schemaVersion: 1, renderer: 'mancode-adapter-digest-v1', - ready: entries.every(([, status]) => status.ready), - manifestAdapters: Object.fromEntries( - platforms.map((platform) => [ - platform, - project.manifest.managedAdapters[platform], - ]), - ), + ready: + actualAdaptersReady && + managedAdapterInventoriesMatch(manifestAdapters, actualAdapterVersions), + manifestAdapters, adapters, }); } catch (error) { diff --git a/src/commands/context.ts b/src/commands/context.ts index 3fd46ae..d4af111 100644 --- a/src/commands/context.ts +++ b/src/commands/context.ts @@ -355,7 +355,7 @@ export async function contextResume( const project = await readV3CommandProject(rootDir); const session = await resolveV3CommandSession(project, options); const taskRef = parseTaskRef(task); - const resolution = await resolveContext(project, session, { + let resolution = await resolveContext(project, session, { taskRef, level: 'bootstrap', purpose: 'orient', @@ -364,15 +364,29 @@ export async function contextResume( if (resolution.metadata === null || resolution.aggregate === null) { throw new Error('MANCODE_CONTEXT_WRITE_BLOCKED'); } - const resumed = await resumeSession( - project.projectRoot, - session.sessionId, - { + let resumed = session; + let packIsCurrent = false; + for (let attempt = 0; attempt < 3; attempt += 1) { + resumed = await resumeSession(project.projectRoot, session.sessionId, { taskRef: resolution.taskRef, workflowMode: resolution.metadata.workflowMode, taskRevision: resolution.aggregate.taskRevision, - }, - ); + }); + resolution = await resolveContext(project, resumed, { + taskRef, + level: 'bootstrap', + purpose: 'orient', + intent: 'mutate', + }); + if (resolution.metadata === null || resolution.aggregate === null) { + throw new Error('MANCODE_CONTEXT_WRITE_BLOCKED'); + } + if (resolution.aggregate.taskRevision === resumed.lastSeenRevision) { + packIsCurrent = true; + break; + } + } + if (!packIsCurrent) throw new Error('MANCODE_CONTEXT_CHANGED'); return printV3Result(options.json, { schemaVersion: 1, session: resumed, diff --git a/src/commands/workflow.ts b/src/commands/workflow.ts index ebb5e1d..13ef56f 100644 --- a/src/commands/workflow.ts +++ b/src/commands/workflow.ts @@ -17,11 +17,26 @@ import { startV3SoloHandoff, } from '../context/solo-handoff.js'; import { completeV3Task } from '../context/task-complete.js'; -import { formatTaskRef, parseTaskRef } from '../context/task-ref.js'; +import { + formatTaskRef, + parseTaskRef, + sameTaskRef, +} from '../context/task-ref.js'; import { recordV3Verification } from '../context/verification-record.js'; import { createV3Workflow } from '../context/workflow-create.js'; import type { WorkflowMetadataV3 } from '../context/workflow-metadata.js'; import { updateV3Workflow } from '../context/workflow-update.js'; +import { resolveTaskEntityHomeStore } from '../runtime/entity-home-store.js'; +import { + type TaskArchiveRecoveryAction, + taskArchiveManifest, +} from '../runtime/operation-recovery-payload.js'; +import { readOperationRecoveryPayload } from '../runtime/operation-recovery-store.js'; +import { readProjectRuntimeContext } from '../runtime/project-runtime.js'; +import { + readTaskArchiveDigestAtRoot, + readTaskCheckpointAtRoot, +} from '../runtime/task-operation.js'; import { detectTeamAssessmentSignals } from '../system/detect-team.js'; import { parseRequirementsLedger, @@ -255,6 +270,9 @@ async function workflowV3( if (subcommand === 'reframe') { return workflowReframeV3(rootDir, args, options); } + if (subcommand === 'archive' || subcommand === 'checkpoint') { + return workflowArtifactShowV3(rootDir, subcommand, args, options); + } if (subcommand === 'child') { return workflowChildResultMergeV3(rootDir, args, options); } @@ -385,6 +403,80 @@ async function workflowShowV3( } } +async function workflowArtifactShowV3( + rootDir: string, + kind: 'archive' | 'checkpoint', + args: string[], + options: WorkflowOptions, +): Promise { + const [task, action, artifactId] = args; + if (!task || action !== 'show' || !artifactId || args.length !== 3) { + return printV3Error( + options.json, + `MANCODE_${kind.toUpperCase()}_SHOW_ARGUMENT_INVALID`, + `Use: workflow ${kind} show <${kind}Id> [--json].`, + EXIT_INVALID_ARG, + ); + } + try { + assertUlid(artifactId, `${kind}Id`); + const project = await readV3CommandProject(rootDir); + const taskRef = parseTaskRef(task); + const snapshot = await project.store.readTaskSnapshot(taskRef); + if (kind === 'checkpoint') { + const checkpoint = await readTaskCheckpointAtRoot( + snapshot.location.taskRoot, + artifactId, + ); + if (checkpoint === null || !sameTaskRef(checkpoint.taskRef, taskRef)) { + throw new Error('MANCODE_CHECKPOINT_NOT_FOUND'); + } + return printV3Result(options.json, { + schemaVersion: 1, + taskRef, + checkpoint, + }); + } + + const runtime = await readProjectRuntimeContext(project.projectRoot); + const homeStore = resolveTaskEntityHomeStore( + runtime.entityHomeStoreContext, + taskRef, + ); + const payload = await readOperationRecoveryPayload(homeStore, artifactId); + const archive = payload?.actions.find( + (candidate): candidate is TaskArchiveRecoveryAction => + candidate.kind === 'task_archive' && + candidate.archiveId === artifactId && + sameTaskRef(candidate.taskRef, taskRef), + ); + if ( + archive === undefined || + (await readTaskArchiveDigestAtRoot( + snapshot.location.taskRoot, + archive, + )) === null + ) { + throw new Error('MANCODE_REFRAME_ARCHIVE_NOT_FOUND'); + } + return printV3Result(options.json, { + schemaVersion: 1, + taskRef, + archive: taskArchiveManifest(archive), + requirements: JSON.parse(archive.requirementsContent), + plan: archive.planContent, + }); + } catch (error) { + return printV3Error( + options.json, + v3ErrorCode(error, `MANCODE_V3_${kind.toUpperCase()}_SHOW_FAILED`), + error instanceof Error + ? error.message + : `Unable to show the mancode ${kind}.`, + ); + } +} + function workflowCleanV3(options: WorkflowOptions): number { return printV3Error( options.json, diff --git a/src/context/compatibility.ts b/src/context/compatibility.ts index 60613d7..9c95098 100644 --- a/src/context/compatibility.ts +++ b/src/context/compatibility.ts @@ -3,6 +3,7 @@ import type { ManagedAdapter, SchemaManifest, } from './manifest.js'; +import { managedAdapterInventoriesMatch } from './manifest.js'; export type CompatibilityOperation = | 'read' @@ -212,27 +213,14 @@ function adapterFailureFor( ) { return 'MANCODE_ADAPTER_CONTENT_STALE'; } - return adaptersMatch(input.manifest, input.adapterVersions) + return managedAdapterInventoriesMatch( + input.manifest.managedAdapters, + input.adapterVersions, + ) ? null : 'MANCODE_ADAPTER_VERSION_MISMATCH'; } -function adaptersMatch( - manifest: SchemaManifest, - actual: Partial>, -): boolean { - const expectedAdapters = Object.keys( - manifest.managedAdapters, - ) as ManagedAdapter[]; - const actualAdapters = Object.keys(actual) as ManagedAdapter[]; - return ( - expectedAdapters.length === actualAdapters.length && - expectedAdapters.every( - (adapter) => actual[adapter] === manifest.managedAdapters[adapter], - ) - ); -} - function requiredWriterCapabilities( input: CompatibilityGateInput, ): readonly WriterCapability[] { diff --git a/src/context/manifest.ts b/src/context/manifest.ts index f0b05f4..09ffd84 100644 --- a/src/context/manifest.ts +++ b/src/context/manifest.ts @@ -210,7 +210,10 @@ export function assertSchemaManifestPolicyUpgrade( next.activationState !== 'v3_active' || previous.activatedAt !== next.activatedAt || !sameLegacyBaseline(previous.legacyBaseline, next.legacyBaseline) || - !sameManagedAdapters(previous.managedAdapters, next.managedAdapters) || + !managedAdapterInventoriesMatch( + previous.managedAdapters, + next.managedAdapters, + ) || compareVersions(next.minReaderVersion, previous.minReaderVersion) < 0 || compareVersions(next.minWriterVersion, previous.minWriterVersion) < 0 || next.workflowPolicyDefaults.planning !== 2 || @@ -361,7 +364,7 @@ function assertManifestStateShape(manifest: SchemaManifest): void { } } -function sameManagedAdapters( +export function managedAdapterInventoriesMatch( left: ManagedAdapterInventory, right: ManagedAdapterInventory, ): boolean { diff --git a/src/context/reframe.ts b/src/context/reframe.ts index e6ceb24..b3f7e35 100644 --- a/src/context/reframe.ts +++ b/src/context/reframe.ts @@ -15,6 +15,10 @@ import { readCheckoutBranch, readProjectRuntimeContext, } from '../runtime/project-runtime.js'; +import { + enqueueSessionPointerProjection, + reconcileProjectionIntents, +} from '../runtime/projection-outbox.js'; import type { TaskHeadFenceV1 } from '../runtime/task-head-fence.js'; import { replaceTaskHeadFence } from '../runtime/task-head-store.js'; import { @@ -59,7 +63,7 @@ import { nextTaskHeadFence, taskMutationExpectedRevisions, } from './task-mutation.js'; -import { type TaskRef, parseTaskRefValue } from './task-ref.js'; +import { type TaskRef, parseTaskRefValue, sameTaskRef } from './task-ref.js'; import type { VerificationLedgerV1 } from './verification-ledger.js'; import { type WorkflowMetadataV3, @@ -201,6 +205,21 @@ export async function reframeV3Workflow( latestCheckpoint: checkpoint, }); const taskHeadFence = nextTaskHeadFence(context, aggregate, timestamp); + const refreshesSessionPointer = + context.session.activeTaskRef !== null && + sameTaskRef(context.session.activeTaskRef, taskRef); + if (refreshesSessionPointer) { + await enqueueSessionPointerProjection(context.projectRoot, { + operationId: context.operationId, + action: 'resume', + sessionId: context.session.sessionId, + expectedPreviousTaskRef: context.session.activeTaskRef, + taskRef, + workflowMode: metadata.workflowMode, + taskRevision: metadata.revision, + now: context.now, + }); + } journal = await createTaskOperationJournal(context, { type: 'reframe', @@ -380,6 +399,17 @@ export async function reframeV3Workflow( await replaceTaskHeadFence(context.homeStore, taskHeadFence); } const operation = await commitTaskOperation(context, journal); + if (refreshesSessionPointer) { + try { + await reconcileProjectionIntents( + context.projectRoot, + context.operationId, + context.now, + ); + } catch { + // Reframed authority is committed; doctor can finish the projection. + } + } const archive = archiveSummary(archiveAction); return { metadata, diff --git a/src/context/workflow-create.ts b/src/context/workflow-create.ts index 2f6238a..80d7ad3 100644 --- a/src/context/workflow-create.ts +++ b/src/context/workflow-create.ts @@ -18,6 +18,7 @@ import { } from '../runtime/local-lock.js'; import { armOperationCrashAfterVisibleWrite, + pauseIfOperationLockInjectedForTesting, throwIfDeferredOperationCrashInjected, throwIfOperationCrashInjected, } from '../runtime/operation-crash-injection.js'; @@ -431,6 +432,11 @@ export async function createV3Workflow( await projectBarrier.release(); projectBarrierReleased = true; throwIfOperationCrashInjected('workflow_create', 'prepared'); + const lockPause = pauseIfOperationLockInjectedForTesting( + operationId, + 'entity_locks_held', + ); + if (lockPause !== null) await lockPause; journal = await advanceJournal(homeStore, journal, 'validate', now, true); // Mark write intent before the visible effect. This makes a crash in the diff --git a/src/installers/v3-adapter.ts b/src/installers/v3-adapter.ts index 1dc23ad..fd04ca5 100644 --- a/src/installers/v3-adapter.ts +++ b/src/installers/v3-adapter.ts @@ -669,16 +669,31 @@ export async function inspectV3AdapterVersions( ]; const required = new Set(requiredPlatforms); const entries = await Promise.all( - platforms.map(async (platform) => { - const status = await inspectV3Adapter(projectRoot, platform); - const primaryPresent = status.targets[0]?.status !== 'missing'; - return required.has(platform) || primaryPresent - ? ([platform, status.ready ? status.version : status.status] as const) - : null; - }), + platforms.map( + async (platform) => + [platform, await inspectV3Adapter(projectRoot, platform)] as const, + ), ); + return v3AdapterVersionsFromStatuses(entries, required); +} + +/** Builds the same physical inventory used by compatibility from prior status reads. */ +export function v3AdapterVersionsFromStatuses( + entries: ReadonlyArray, + requiredPlatforms: ReadonlySet | readonly PlatformName[] = [], +): Partial> { + const required = + requiredPlatforms instanceof Set + ? requiredPlatforms + : new Set(requiredPlatforms); + const versions = entries.map(([platform, status]) => { + const primaryPresent = status.targets[0]?.status !== 'missing'; + return required.has(platform) || primaryPresent + ? ([platform, status.ready ? status.version : status.status] as const) + : null; + }); return Object.fromEntries( - entries.filter( + versions.filter( (entry): entry is NonNullable => entry !== null, ), ) as Partial>; @@ -921,8 +936,11 @@ const V3_MODE_DEFINITIONS: Record< '- `acceptanceCriteria` must contain at least one required item shaped as `{ "id": "AC-1", "description": "...", "required": true, "method": "automated" }`; `method` is exactly `automated`, `manual`, or `hybrid`.', '- Finalize requirements with `mancode workflow requirements finalize --file --expected-revision --session `.', '- Let mancode assign internal IDs and digests; do not invent canonical IDs or digests in the semantic input.', - '- Revise or confirm the plan with `mancode workflow plan revise|confirm --expected-revision ... --session `.', + '- Revise the plan with `mancode workflow plan revise --expected-revision --file --session `.', + '- Confirm the current plan with `mancode workflow plan confirm --expected-revision --plan-decision --session `.', "- Confirming with `--plan-decision plan_only` keeps the plan as planned authority and clears this session's active workflow pointer. Resume the TaskRef explicitly before any later governed mutation.", + '- When new evidence materially invalidates confirmed requirements and the operator explicitly chooses to realign the same local task, resume its TaskRef if needed, generate a fresh canonical checkpoint ULID, and run `mancode workflow reframe --expected-revision --checkpoint-id --summary "" --next-action "" --session `. Reframe archives the confirmed requirements and plan, clears the plan decision, and stops at Step 2 with draft requirements. Do not substitute plan revise, scope-change, or workflow update for reframe.', + '- Read reframe evidence without opening private authority files: `mancode workflow archive show --json` and `mancode workflow checkpoint show --json`.', '- Apply verification and review ledgers with their mancode `apply --file` commands, then use `mancode workflow complete --expected-revision --session `.', ], }, diff --git a/src/runtime/operation-crash-injection.ts b/src/runtime/operation-crash-injection.ts index bf69b0d..8b67d89 100644 --- a/src/runtime/operation-crash-injection.ts +++ b/src/runtime/operation-crash-injection.ts @@ -1,4 +1,5 @@ import { AsyncLocalStorage } from 'node:async_hooks'; +import { type Ulid, assertUlid } from '../context/ids.js'; import type { OperationType } from './operation-journal.js'; export interface OperationCrashInjection { @@ -13,6 +14,25 @@ interface ActiveCrashInjection extends OperationCrashInjection { const activeInjection = new AsyncLocalStorage(); +export type OperationLockPausePoint = 'entity_locks_held'; + +export interface OperationLockPauseController { + /** Resolves only after the selected operation holds its canonical locks. */ + readonly reached: Promise; + release(): void; + run(operation: () => Promise): Promise; +} + +interface ActiveLockPauseInjection { + operationId: Ulid; + pauseAfter: OperationLockPausePoint; + triggered: boolean; + signalReached(): void; + readonly resume: Promise; +} + +const activeLockPause = new AsyncLocalStorage(); + /** * Test harness only: simulate process loss immediately after a journal state * becomes durable. The async-local scope prevents one concurrent test from @@ -31,6 +51,83 @@ export async function withOperationCrashInjectionForTesting( ); } +/** + * Test harness only: pauses one explicitly selected operation after its + * prepared journal releases the project barrier while canonical entity locks + * remain held. Async-local scoping keeps unrelated concurrent operations and + * test workers completely unaffected. + */ +export function createOperationLockPauseForTesting(input: { + operationId: Ulid; + pauseAfter: OperationLockPausePoint; +}): OperationLockPauseController { + assertUlid(input.operationId, 'test lock pause operationId'); + if (input.pauseAfter !== 'entity_locks_held') { + throw new Error('MANCODE_TEST_LOCK_PAUSE_POINT_INVALID'); + } + let signalReached!: () => void; + let rejectReached!: (reason?: unknown) => void; + const reached = new Promise((resolve, reject) => { + signalReached = resolve; + rejectReached = reject; + }); + let resume!: () => void; + const resumed = new Promise((resolve) => { + resume = resolve; + }); + let started = false; + let released = false; + const state: ActiveLockPauseInjection = { + ...input, + triggered: false, + signalReached, + resume: resumed, + }; + return { + reached, + release(): void { + if (released) return; + released = true; + resume(); + }, + async run(operation: () => Promise): Promise { + if (started) throw new Error('MANCODE_TEST_LOCK_PAUSE_ALREADY_STARTED'); + started = true; + return activeLockPause.run(state, async () => { + try { + const result = await operation(); + if (!state.triggered) { + rejectReached(new Error('MANCODE_TEST_LOCK_PAUSE_NOT_REACHED')); + } + return result; + } catch (error) { + if (!state.triggered) rejectReached(error); + throw error; + } + }); + }, + }; +} + +/** Called only at the shared post-journal lock-holding boundary. */ +export function pauseIfOperationLockInjectedForTesting( + operationId: Ulid, + pauseAfter: OperationLockPausePoint, +): Promise | null { + const injection = activeLockPause.getStore(); + if ( + injection === undefined || + injection.triggered || + injection.operationId !== operationId || + injection.pauseAfter !== pauseAfter + ) { + return null; + } + injection.triggered = true; + injection.signalReached(); + return injection.resume; +} + export function throwIfOperationCrashInjected( operationType: OperationType, crashAfter: 'prepared' | string, diff --git a/src/runtime/operation-recovery-executor.ts b/src/runtime/operation-recovery-executor.ts index 1987dbc..153314a 100644 --- a/src/runtime/operation-recovery-executor.ts +++ b/src/runtime/operation-recovery-executor.ts @@ -71,6 +71,7 @@ import { updateOperationJournal, } from './operation-store.js'; import { readProjectRuntimeContext } from './project-runtime.js'; +import { inspectOperationProjectionState } from './projection-outbox.js'; import { assertRecoveryActor, planOperationRecovery } from './reconciler.js'; import { readSession } from './session.js'; import { readTaskHeadFence, replaceTaskHeadFence } from './task-head-store.js'; @@ -122,6 +123,10 @@ export async function inspectOperationRecovery( const plan = planOperationRecovery({ journal: located.journal, reservations: await readReservations(located.journal, stores), + projections: await inspectOperationProjectionState( + projectRoot, + operationId, + ), }); return { journal: located.journal, diff --git a/src/runtime/projection-outbox.ts b/src/runtime/projection-outbox.ts index 238a288..09e9378 100644 --- a/src/runtime/projection-outbox.ts +++ b/src/runtime/projection-outbox.ts @@ -27,6 +27,7 @@ import { writeTeamEvent, } from '../team/events.js'; import { replaceFileAtomically } from './atomic-file.js'; +import type { OperationProjectionState } from './reconciler.js'; import { clearSessionTaskPointer, readSession, @@ -267,6 +268,35 @@ export async function listProjectionIntents( ); } +/** + * Inspects the projections actually declared for one operation. An operation + * with no projection intents has no projection repair work. + */ +export async function inspectOperationProjectionState( + projectRoot: string, + operationId: Ulid, +): Promise { + assertUlid(operationId, 'projection operationId'); + const state: OperationProjectionState = { + auditEvent: 'not_applicable', + sessionPointer: 'not_applicable', + cache: 'not_applicable', + }; + const intents = await listProjectionIntents(projectRoot, { + operationId, + includeTerminal: true, + }); + for (const intent of intents) { + const key = projectionStateKey(intent.target.kind); + const availability = + intent.state === 'superseded' + ? 'not_applicable' + : await inspectProjection(projectRoot, intent.target); + state[key] = mergeProjectionAvailability(state[key], availability); + } + return state; +} + /** Applies only durable, fully specified targets and leaves conflicts pending. */ export async function reconcileProjectionIntents( projectRoot: string, @@ -521,6 +551,32 @@ async function inspectProjection( } } +function projectionStateKey( + kind: ProjectionTargetV1['kind'], +): keyof OperationProjectionState { + switch (kind) { + case 'audit_event': + return 'auditEvent'; + case 'session_pointer': + return 'sessionPointer'; + case 'cache_invalidation': + return 'cache'; + } +} + +function mergeProjectionAvailability( + left: ProjectionAvailability, + right: ProjectionAvailability, +): ProjectionAvailability { + const priority: Record = { + not_applicable: 0, + present: 1, + missing: 2, + conflict: 3, + }; + return priority[right] > priority[left] ? right : left; +} + async function applyProjection( projectRoot: string, target: ProjectionTargetV1, diff --git a/src/runtime/task-operation.ts b/src/runtime/task-operation.ts index 0685b11..10847e6 100644 --- a/src/runtime/task-operation.ts +++ b/src/runtime/task-operation.ts @@ -63,6 +63,7 @@ import { } from './local-lock.js'; import { armOperationCrashAfterVisibleWrite, + pauseIfOperationLockInjectedForTesting, throwIfDeferredOperationCrashInjected, throwIfOperationCrashInjected, } from './operation-crash-injection.js'; @@ -468,6 +469,11 @@ export async function createTaskOperationJournal( ); await context.releaseProjectBarrier(); throwIfOperationCrashInjected(input.type, 'prepared'); + const lockPause = pauseIfOperationLockInjectedForTesting( + context.operationId, + 'entity_locks_held', + ); + if (lockPause !== null) await lockPause; return created; } diff --git a/tests/adapter-status-contracts.test.ts b/tests/adapter-status-contracts.test.ts new file mode 100644 index 0000000..acbf1db --- /dev/null +++ b/tests/adapter-status-contracts.test.ts @@ -0,0 +1,193 @@ +import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; +import { + type AdapterStatusOptions, + adapterStatus, +} from '../src/commands/adapter.js'; +import { init } from '../src/commands/init.js'; +import type { PlatformName } from '../src/installers/registry.js'; +import { + type V3PlatformAdapterStatus, + installV3Adapter, +} from '../src/installers/v3-adapter.js'; + +interface AdapterStatusJson { + schemaVersion: 1; + renderer: 'mancode-adapter-digest-v1'; + ready: boolean; + manifestAdapters: Partial>; + adapters: Partial>; +} + +describe('adapter status command contracts', () => { + let root: string; + + beforeEach(async () => { + root = await mkdtemp(path.join(tmpdir(), 'mancode-adapter-status-')); + expect( + await withoutConsoleOutput(() => + init(root, { v3: true, platform: 'codex' }), + ), + ).toBe(0); + }); + + afterEach(async () => { + await rm(root, { recursive: true, force: true }); + }); + + it('reports a Codex-only project ready while retaining all-platform discovery', async () => { + const result = await captureJson({ json: true }); + + expect(result).toMatchObject({ + schemaVersion: 1, + renderer: 'mancode-adapter-digest-v1', + ready: true, + manifestAdapters: { codex: '3' }, + adapters: { + codex: { installed: true, ready: true, status: 'ready' }, + cursor: { installed: false, ready: false, status: 'missing' }, + }, + }); + expect(Object.keys(result.adapters)).toEqual([ + 'claude-code', + 'codex', + 'cursor', + 'copilot', + 'zcode', + ]); + }); + + it('reports not ready when a manifest-required adapter is incomplete', async () => { + await rm(path.join(root, '.agents', 'skills', 'man', 'SKILL.md')); + + const result = await captureJson({ json: true }); + + expect(result).toMatchObject({ + ready: false, + manifestAdapters: { codex: '3' }, + adapters: { codex: { installed: false, ready: false } }, + }); + }); + + it('scopes readiness to an explicitly selected platform', async () => { + const registered = await captureJson({ platform: 'codex', json: true }); + expect(registered).toMatchObject({ + ready: true, + manifestAdapters: { codex: '3' }, + adapters: { codex: { ready: true } }, + }); + expect(Object.keys(registered.adapters)).toEqual(['codex']); + + const unregistered = await captureJson({ + platform: 'cursor', + json: true, + }); + expect(unregistered).toMatchObject({ + ready: false, + manifestAdapters: {}, + adapters: { cursor: { installed: false, ready: false } }, + }); + expect(Object.keys(unregistered.adapters)).toEqual(['cursor']); + }); + + it('rejects a manifest renderer version that differs from ready disk content', async () => { + const schemaPath = path.join(root, '.mancode', 'schema.json'); + const manifest = JSON.parse(await readFile(schemaPath, 'utf8')) as { + managedAdapters: Record; + }; + manifest.managedAdapters.codex = '2'; + await writeFile(schemaPath, `${JSON.stringify(manifest, null, 2)}\n`); + + const result = await captureJson({ json: true }); + + expect(result).toMatchObject({ + ready: false, + manifestAdapters: { codex: '2' }, + adapters: { codex: { version: '3', ready: true } }, + }); + }); + + it.each(['missing', 'stale', 'unreadable'] as const)( + 'does not confuse the %s content status with a manifest version', + async (collision) => { + const target = path.join(root, '.agents', 'skills', 'man', 'SKILL.md'); + if (collision === 'missing') { + await rm(target); + } else if (collision === 'stale') { + await writeFile(target, 'stale adapter content\n'); + } else { + await writeFile(target, Buffer.from([0xff])); + } + const schemaPath = path.join(root, '.mancode', 'schema.json'); + const manifest = JSON.parse(await readFile(schemaPath, 'utf8')) as { + managedAdapters: Record; + }; + manifest.managedAdapters.codex = collision; + await writeFile(schemaPath, `${JSON.stringify(manifest, null, 2)}\n`); + + const result = await captureJson({ json: true }); + + expect(result).toMatchObject({ + ready: false, + manifestAdapters: { codex: collision }, + adapters: { codex: { status: collision, ready: false } }, + }); + }, + ); + + it('rejects an on-disk adapter that is absent from manifest inventory', async () => { + await installV3Adapter(root, 'cursor'); + + const result = await captureJson({ json: true }); + const selected = await captureJson({ platform: 'cursor', json: true }); + + expect(result).toMatchObject({ + ready: false, + manifestAdapters: { codex: '3' }, + adapters: { cursor: { version: '3', ready: true } }, + }); + expect(selected).toMatchObject({ + ready: false, + manifestAdapters: {}, + adapters: { cursor: { version: '3', ready: true } }, + }); + }); + + async function captureJson( + options: AdapterStatusOptions, + ): Promise { + const output: string[] = []; + const log = vi.spyOn(console, 'log').mockImplementation((value) => { + output.push(String(value)); + }); + const error = vi + .spyOn(console, 'error') + .mockImplementation(() => undefined); + try { + expect(await adapterStatus(root, options)).toBe(0); + const serialized = output.at(-1); + if (serialized === undefined) { + throw new Error('missing adapter status JSON output'); + } + return JSON.parse(serialized) as AdapterStatusJson; + } finally { + log.mockRestore(); + error.mockRestore(); + } + } +}); + +async function withoutConsoleOutput( + operation: () => Promise, +): Promise { + const log = vi.spyOn(console, 'log').mockImplementation(() => undefined); + const error = vi.spyOn(console, 'error').mockImplementation(() => undefined); + try { + return await operation(); + } finally { + log.mockRestore(); + error.mockRestore(); + } +} diff --git a/tests/compatibility-contracts.test.ts b/tests/compatibility-contracts.test.ts index 0a49186..bdd4dc5 100644 --- a/tests/compatibility-contracts.test.ts +++ b/tests/compatibility-contracts.test.ts @@ -170,7 +170,7 @@ describe('schema compatibility gate', () => { ).toThrow(/planning-policy:2/); }); - it('blocks a 0.3.x CLI at the V2 manifest boundary before policy execution', () => { + it('evaluates the declared 0.3.18 version and capability tuple at the V2 boundary', () => { const base = activeInput({ minReaderVersion: '0.4.0', minWriterVersion: '0.4.0', diff --git a/tests/fixtures/legacy-cli/README.md b/tests/fixtures/legacy-cli/README.md new file mode 100644 index 0000000..87caf87 --- /dev/null +++ b/tests/fixtures/legacy-cli/README.md @@ -0,0 +1,21 @@ +# mancode 0.3.18 CLI fixture + +`mancode-0.3.18.tgz` is the unmodified public npm package used by the +black-box V2 compatibility contract. + +- Package: `mancode@0.3.18` +- npm integrity: `sha512-7jqphIAgW+XlTZWFwK06ekPOt//g4q9A+3KZJeSjZCdh3d4Rsb0Akgn3ku5Ayc1URZAtPJVPqLdqgxfCaszlWg==` +- npm shasum: `f3b14e98a3426bf3f2cf6f2461698c9bd4c52d13` +- Release commit: `a0f39f75d50f3ff2e985cd3e45cc250100710e45` +- npm registry `gitHead`: `ff407d7b07c18d9b56cdf3a7e0bf35f2d9921fef` + +To verify the registry metadata without changing the fixture: + +```bash +npm view mancode@0.3.18 version dist.integrity dist.shasum +npm pack mancode@0.3.18 --dry-run --json +``` + +Do not replace this fixture with a root dev dependency alias. npm exposes the +aliased package's `mancode` binary in `node_modules/.bin`, which would make +repository commands run the legacy CLI instead of the current build. diff --git a/tests/fixtures/legacy-cli/mancode-0.3.18.tgz b/tests/fixtures/legacy-cli/mancode-0.3.18.tgz new file mode 100644 index 0000000000000000000000000000000000000000..0fb97fb5bcf9b1ea0428066f37ce5457ffbe1cef GIT binary patch literal 1131571 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∋0Nj~ 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

v12iNlzG+k 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 z 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⫬ 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 PJ|<4c3*LyAQCN?|ZCA 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

0hEUCxdxjN78 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�r@z729-y-Rx&K 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 lVQa<(^?y36|Ivl-^B-^YAO6FC_z(Xd_;1o8x { + const roots: string[] = []; + + afterEach(async () => { + await Promise.all( + roots.splice(0).map((root) => rm(root, { recursive: true, force: true })), + ); + }); + + it('rejects a V2 authority mutation before changing any authority bytes', async () => { + await expectRootBinUnregistered(); + const fixture = await readFile(LEGACY_FIXTURE); + expect( + `sha512-${createHash('sha512').update(fixture).digest('base64')}`, + ).toBe(LEGACY_INTEGRITY); + const extractionRoot = await mkdtemp( + path.join(process.cwd(), 'node_modules', '.mancode-legacy-cli-'), + ); + roots.push(extractionRoot); + const legacyPackageRoot = path.join(extractionRoot, 'package'); + await extractLegacyPackage(fixture, extractionRoot); + const legacyCli = path.join(legacyPackageRoot, 'dist', 'cli.js'); + const packageMetadata = JSON.parse( + await readFile(path.join(legacyPackageRoot, 'package.json'), 'utf8'), + ) as { + name: string; + version: string; + bin: Record; + exports: Record; + }; + expect(packageMetadata).toMatchObject({ + name: 'mancode', + version: '0.3.18', + bin: { mancode: 'dist/cli.js' }, + exports: { '.': './dist/index.js' }, + }); + expect(legacyCli).toBe( + path.join(legacyPackageRoot, packageMetadata.bin.mancode), + ); + await expect( + readFile(path.join(legacyPackageRoot, 'dist', 'index.js'), 'utf8'), + ).resolves.toContain('VERSION'); + const version = await runLegacyCli(legacyCli, ['--version'], process.cwd()); + expect(version).toMatchObject({ + exitCode: 0, + signal: null, + stderr: '', + }); + expect(version.stdout.trim()).toBe('0.3.18'); + + const root = await mkdtemp( + path.join(tmpdir(), 'mancode-legacy-cli-compatibility-'), + ); + roots.push(root); + await initializeV3Project({ + projectRoot: root, + operationId: id(1), + workspaceId: id(2), + schemaEpoch: id(3), + now: NOW, + }); + const actorId = id(4); + const sessionId = id(5); + const actor = await createLocalActor(root, { + actorId, + displayName: 'Legacy CLI Fixture', + now: NOW, + }); + await publishSharedActorProfile(root, createSharedActorProfile(actor, NOW)); + await createSession(root, { + actorId, + sessionId, + client: 'legacy-cli-contract', + identitySource: 'explicit', + now: NOW, + }); + + const manifest = JSON.parse( + await readFile(path.join(root, '.mancode', 'schema.json'), 'utf8'), + ) as { manifestVersion: number; minWriterVersion: string }; + expect(manifest).toMatchObject({ + manifestVersion: 2, + minWriterVersion: '0.4.0', + }); + const authorityBefore = await snapshotTree(path.join(root, '.mancode')); + + const result = await runLegacyCli( + legacyCli, + [ + 'team', + 'policy', + 'off', + '--expected-revision', + '1', + '--session', + sessionId, + '--client', + 'legacy-cli-contract', + '--json', + ], + root, + ); + + expect(result).toMatchObject({ exitCode: 3, signal: null, stderr: '' }); + expect(JSON.parse(result.stdout)).toEqual({ + schemaVersion: 1, + error: { + code: 'MANCODE_TEAM_POLICY_UPDATE_FAILED', + message: + 'schema manifest contains unknown field(s): workflowPolicyDefaults', + }, + }); + expect(await snapshotTree(path.join(root, '.mancode'))).toEqual( + authorityBefore, + ); + }); +}); + +interface CliResult { + exitCode: number; + signal: NodeJS.Signals | null; + stdout: string; + stderr: string; +} + +function runLegacyCli( + legacyCli: string, + args: string[], + cwd: string, +): Promise { + return new Promise((resolve, reject) => { + execFileCallback( + process.execPath, + [legacyCli, ...args], + { cwd, maxBuffer: 1024 * 1024 }, + (error, stdout, stderr) => { + if (error !== null && typeof error.code !== 'number') { + reject(error); + return; + } + const processError = error as ExecFileException | null; + resolve({ + exitCode: + processError !== null && typeof processError.code === 'number' + ? processError.code + : 0, + signal: processError?.signal ?? null, + stdout, + stderr, + }); + }, + ); + }); +} + +async function expectRootBinUnregistered(): Promise { + for (const name of ['mancode', 'mancode.cmd', 'mancode.ps1']) { + await expect( + lstat(path.join(process.cwd(), 'node_modules', '.bin', name)), + ).rejects.toMatchObject({ code: 'ENOENT' }); + } +} + +async function extractLegacyPackage( + fixture: Buffer, + destination: string, +): Promise { + const entries = readTarFiles(gunzipSync(fixture)); + const selected = [...entries].filter( + ([name]) => + name === 'package/package.json' || + (name.startsWith('package/dist/') && name.endsWith('.js')), + ); + if (selected.length < 2) { + throw new Error('legacy CLI fixture does not contain its published dist'); + } + for (const [name, bytes] of selected) { + const target = path.join(destination, name); + await mkdir(path.dirname(target), { recursive: true }); + await writeFile(target, bytes); + } +} + +function readTarFiles(archive: Buffer): Map { + const entries = new Map(); + let offset = 0; + while (offset + 512 <= archive.length) { + const header = archive.subarray(offset, offset + 512); + if (header.every((byte) => byte === 0)) break; + const name = tarText(header.subarray(0, 100)); + const prefix = tarText(header.subarray(345, 500)); + const entryName = prefix ? `${prefix}/${name}` : name; + const sizeText = tarText(header.subarray(124, 136)); + if (!/^[0-7]+$/.test(sizeText)) { + throw new Error( + `legacy CLI fixture has an invalid tar size: ${entryName}`, + ); + } + const size = Number.parseInt(sizeText, 8); + const dataStart = offset + 512; + const dataEnd = dataStart + size; + if (dataEnd > archive.length) { + throw new Error('legacy CLI fixture tar entry exceeds the archive'); + } + const type = header[156]; + if (type === 0 || type === 48) { + if ( + !entryName.startsWith('package/') || + entryName.split('/').includes('..') + ) { + throw new Error('legacy CLI fixture contains an unsafe tar path'); + } + entries.set(entryName, Buffer.from(archive.subarray(dataStart, dataEnd))); + } + offset = dataStart + Math.ceil(size / 512) * 512; + } + return entries; +} + +function tarText(field: Buffer): string { + const end = field.indexOf(0); + return field + .subarray(0, end === -1 ? field.length : end) + .toString() + .trim(); +} + +interface TreeEntry { + path: string; + type: 'directory' | 'file' | 'symlink' | 'other'; + bytes?: string; + target?: string; +} + +async function snapshotTree(root: string): Promise { + const snapshot: TreeEntry[] = []; + await visit(root, ''); + return snapshot; + + async function visit(absoluteDirectory: string, relativeDirectory: string) { + const names = (await readdir(absoluteDirectory)).sort(); + for (const name of names) { + const absolute = path.join(absoluteDirectory, name); + const relative = path.join(relativeDirectory, name); + const stats = await lstat(absolute); + if (stats.isDirectory()) { + snapshot.push({ path: relative, type: 'directory' }); + await visit(absolute, relative); + } else if (stats.isFile()) { + snapshot.push({ + path: relative, + type: 'file', + bytes: (await readFile(absolute)).toString('base64'), + }); + } else if (stats.isSymbolicLink()) { + snapshot.push({ + path: relative, + type: 'symlink', + target: await readlink(absolute), + }); + } else { + snapshot.push({ path: relative, type: 'other' }); + } + } + } +} + +function id(offset: number): Ulid { + return createUlid(NOW.getTime() + offset, new Uint8Array(10).fill(offset)); +} diff --git a/tests/operation-recovery-executor-contracts.test.ts b/tests/operation-recovery-executor-contracts.test.ts index 5e6fa43..3fce163 100644 --- a/tests/operation-recovery-executor-contracts.test.ts +++ b/tests/operation-recovery-executor-contracts.test.ts @@ -127,6 +127,8 @@ describe('operation recovery executor', () => { inspectOperationRecovery(root, operationId), ).resolves.toMatchObject({ journal: { state: 'committed' }, + recoveryAction: 'none', + recoveryReason: 'terminal', payloadBound: true, }); await expect(readLocalDiagnostics(root)).resolves.toMatchObject({ diff --git a/tests/v3-adapter-contracts.test.ts b/tests/v3-adapter-contracts.test.ts index 0cd9594..f1c6ce5 100644 --- a/tests/v3-adapter-contracts.test.ts +++ b/tests/v3-adapter-contracts.test.ts @@ -367,6 +367,31 @@ describe('V3 adapter bootstrap integration', () => { expect(agentsAfterCodex).toContain('Codex or ZCode'); }); + it('renders the complete plan and local reframe command contracts', async () => { + await init(root, { v3: true, platform: 'codex' }); + const man = await readFile(v3ModeEntryPath(root, 'codex', 'man'), 'utf8'); + + expect(man).toContain( + 'revise --expected-revision --file --session --client ', + ); + expect(man).toContain( + 'confirm --expected-revision --plan-decision --session --client ', + ); + expect(man).toContain( + 'workflow reframe --expected-revision --checkpoint-id ', + ); + expect(man).toContain('stops at Step 2 with draft requirements'); + expect(man).toContain( + 'Do not substitute plan revise, scope-change, or workflow update for reframe.', + ); + expect(man).toContain( + 'workflow archive show --json', + ); + expect(man).toContain( + 'workflow checkpoint show --json', + ); + }); + it('refuses to overwrite a user-authored original mode entry', async () => { await init(root, { v3: true }); const modePath = v3ModeEntryPath(root, 'codex', 'man'); diff --git a/tests/v3-command-contracts.test.ts b/tests/v3-command-contracts.test.ts index 2dfa708..a960583 100644 --- a/tests/v3-command-contracts.test.ts +++ b/tests/v3-command-contracts.test.ts @@ -388,6 +388,8 @@ describe('V3 CLI command contracts', () => { expect(await operationShow(root, operationId, { json: true })).toBe(0); expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ journal: { operationId, state: 'committed' }, + recoveryAction: 'none', + recoveryReason: 'terminal', payloadBound: true, }); expect( @@ -442,6 +444,20 @@ describe('V3 CLI command contracts', () => { json: true, }), ).toBe(0); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + session: { + activeTaskRef: createPayload.taskRef, + activeMode: 'man', + lastSeenRevision: 1, + }, + pack: { + session: { + activeTaskRef: createPayload.taskRef, + activeMode: 'man', + }, + snapshot: { taskRevision: 1 }, + }, + }); expect( await contextShow(root, { task, @@ -843,12 +859,48 @@ describe('V3 CLI command contracts', () => { operation: { type: 'reframe', state: 'committed' }, }); expect(result.archive.archiveId).toBe(result.operation.operationId); + expect( + await workflow( + root, + 'archive', + [task, 'show', result.archive.archiveId], + { json: true }, + ), + ).toBe(0); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + taskRef: created.taskRef, + archive: { + archiveId: result.archive.archiveId, + sourceTaskRevision: 2, + sourceRequirementsRevision: 2, + }, + requirements: { status: 'confirmed', revision: 2 }, + plan: null, + }); + expect( + await workflow(root, 'checkpoint', [task, 'show', checkpointId], { + json: true, + }), + ).toBe(0); + expect(JSON.parse(String(logs.mock.calls.at(-1)?.[0]))).toMatchObject({ + taskRef: created.taskRef, + checkpoint: { + checkpointId, + kind: 'requirements_reframed', + taskRevision: 4, + }, + }); await expect( new V3ContextStore(root).readTaskSnapshot(created.taskRef), ).resolves.toMatchObject({ metadata: { revision: 4, currentStep: 2 }, requirements: { revision: 3, status: 'draft' }, }); + await expect(readSession(root, sessionId)).resolves.toMatchObject({ + activeTaskRef: created.taskRef, + activeMode: 'man', + lastSeenRevision: 4, + }); } finally { logs.mockRestore(); errors.mockRestore(); diff --git a/tests/v3-reframe-contracts.test.ts b/tests/v3-reframe-contracts.test.ts index bb63f2e..6cce937 100644 --- a/tests/v3-reframe-contracts.test.ts +++ b/tests/v3-reframe-contracts.test.ts @@ -27,10 +27,13 @@ import { } from '../src/context/workflow-metadata.js'; import { updateV3Workflow } from '../src/context/workflow-update.js'; import { resolveTaskEntityHomeStore } from '../src/runtime/entity-home-store.js'; +import { readHandoff } from '../src/runtime/handoff-store.js'; +import { createOperationLockPauseForTesting } from '../src/runtime/operation-crash-injection.js'; import { readOperationJournal } from '../src/runtime/operation-store.js'; import { readProjectRuntimeContext } from '../src/runtime/project-runtime.js'; -import { createSession } from '../src/runtime/session.js'; +import { createSession, readSession } from '../src/runtime/session.js'; import { readTaskHeadFence } from '../src/runtime/task-head-store.js'; +import { readTaskCheckpointAtRoot } from '../src/runtime/task-operation.js'; import { createLocalActor, createSharedActorProfile, @@ -238,6 +241,11 @@ describe('V3 local workflow reframe', () => { `task_head:${created.taskRef.taskId}`, ]), }); + await expect(readSession(root, actors.sessionId)).resolves.toMatchObject({ + activeTaskRef: created.taskRef, + activeMode: 'manteam', + lastSeenRevision: reframed.metadata.revision, + }); }); it('rejects active child, open handoff, and active solo before writing authority', async () => { @@ -381,6 +389,43 @@ describe('V3 local workflow reframe', () => { }); }); + it('serializes reframe and child creation in both canonical parent-lock orders', async () => { + await assertChildReframeRace( + await caseRoot(root, 'concurrent-child-reframe-wins'), + 'reframe', + ); + await assertChildReframeRace( + await caseRoot(root, 'concurrent-child-create-wins'), + 'child', + ); + }); + + it('serializes reframe across both handoff checkpoint and draft lock phases', async () => { + await assertHandoffReframeRace( + await caseRoot(root, 'concurrent-handoff-reframe-wins'), + 'reframe', + ); + await assertHandoffReframeRace( + await caseRoot(root, 'concurrent-handoff-checkpoint-wins'), + 'handoff_checkpoint', + ); + await assertHandoffReframeRace( + await caseRoot(root, 'concurrent-handoff-draft-wins'), + 'handoff_draft', + ); + }); + + it('serializes reframe and solo handoff start in both canonical task-lock orders', async () => { + await assertSoloReframeRace( + await caseRoot(root, 'concurrent-solo-reframe-wins'), + 'reframe', + ); + await assertSoloReframeRace( + await caseRoot(root, 'concurrent-solo-start-wins'), + 'solo', + ); + }); + it('rejects terminal, repair-pending, manba, and git-ref workflows without a reframe journal', async () => { const terminalRoot = await caseRoot(root, 'terminal'); const terminalActors = await bootstrap(terminalRoot); @@ -514,6 +559,430 @@ describe('V3 local workflow reframe', () => { }); }); +async function assertChildReframeRace( + projectRoot: string, + winner: 'reframe' | 'child', +): Promise { + const actors = await bootstrap(projectRoot); + const parent = await createV3Workflow({ + projectRoot, + task: 'Race requirements reframe against a diagnostic child.', + workflowMode: 'man', + sessionId: actors.sessionId, + client: 'vitest', + taskId: id(200), + operationId: id(201), + now: NOW, + }); + const finalized = await finalizeV3Requirements({ + projectRoot, + taskRef: parent.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: parent.metadata.revision, + requirements: confirmedRequirements(parent.requirements), + operationId: id(202), + now: NOW, + }); + const planned = await reviseV3Plan({ + projectRoot, + taskRef: parent.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: finalized.metadata.revision, + plan: '# Plan\n\n1. Implement and verify the confirmed change.\n', + planDecision: 'governed_execution', + operationId: id(203), + now: NOW, + }); + await writeMetadata( + projectRoot, + parent.taskRef, + parseWorkflowMetadata({ ...planned.metadata, currentStep: 6 }), + ); + + const childTaskRef: TaskRef = { namespace: 'local', taskId: id(204) }; + const childOperationId = id(205); + const reframeOperationId = id(206); + const reframeCheckpointId = id(207); + const parentBefore = await authorityDigest(projectRoot, parent.taskRef); + const reframe = () => + reframeV3Workflow({ + projectRoot, + taskRef: parent.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: planned.metadata.revision, + checkpointId: reframeCheckpointId, + operationId: reframeOperationId, + now: NOW, + }); + const createChild = () => + createV3Workflow({ + projectRoot, + task: 'Diagnose the verification failure before parent reframe.', + workflowMode: 'manba', + sessionId: actors.sessionId, + client: 'vitest', + parentTaskRef: parent.taskRef, + taskId: childTaskRef.taskId, + operationId: childOperationId, + now: NOW, + }); + const store = new V3ContextStore(projectRoot); + const home = await taskHomeStore(projectRoot, parent.taskRef); + + if (winner === 'reframe') { + const result = await runPausedCanonicalLockRace( + reframeOperationId, + reframe, + createChild, + ); + const persisted = await store.readTaskSnapshot(parent.taskRef); + expect(persisted.metadata).toEqual(result.metadata); + expect(persisted.requirements).toEqual(result.requirements); + expect(persisted.aggregateError).toBeNull(); + await expect( + store.listActiveChildTaskRefs(parent.taskRef), + ).resolves.toEqual([]); + await expectTaskMissing(projectRoot, childTaskRef); + await expect( + readOperationJournal(home, childOperationId), + ).resolves.toBeNull(); + await expect( + readOperationJournal(home, reframeOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'reframe' }); + return; + } + + const result = await runPausedCanonicalLockRace( + childOperationId, + createChild, + reframe, + ); + expect(await authorityDigest(projectRoot, parent.taskRef)).toBe(parentBefore); + const child = await store.readTaskSnapshot(childTaskRef); + expect(child.metadata).toEqual(result.metadata); + expect(child.aggregateError).toBeNull(); + await expect(store.listActiveChildTaskRefs(parent.taskRef)).resolves.toEqual([ + childTaskRef, + ]); + await expect( + readOperationJournal(home, childOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'workflow_create' }); + await expect( + readOperationJournal(home, reframeOperationId), + ).resolves.toBeNull(); + await expectNoReframeArtifacts( + projectRoot, + parent.taskRef, + reframeOperationId, + reframeCheckpointId, + ); +} + +async function assertHandoffReframeRace( + projectRoot: string, + winner: 'reframe' | 'handoff_checkpoint' | 'handoff_draft', +): Promise { + const actors = await bootstrap(projectRoot, { + git: true, + joined: true, + receiver: true, + }); + const created = await createV3Workflow({ + projectRoot, + task: 'Race a named handoff against requirements reframe.', + workflowMode: 'manteam', + sessionId: actors.sessionId, + client: 'vitest', + sharedPrivacyConfirmed: true, + participantActorIds: [actors.receiverActorId as Ulid], + implementationScope: { include: ['src/**'], modules: ['handoff'] }, + taskId: id(300), + operationId: id(301), + now: NOW, + }); + const planned = await confirmManteamPlan({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + requirements: created.requirements, + now: NOW, + }); + const handoffId = id(302); + const handoffCheckpointId = id(303); + const handoffCheckpointOperationId = id(304); + const handoffOperationId = id(305); + const reframeOperationId = id(306); + const reframeCheckpointId = id(307); + const createHandoff = () => + createV3HandoffDraft({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: planned.taskRevision, + toActorId: actors.receiverActorId as Ulid, + handoffId, + checkpointId: handoffCheckpointId, + checkpointOperationId: handoffCheckpointOperationId, + operationId: handoffOperationId, + now: NOW, + }); + const reframe = () => + reframeV3Workflow({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: planned.taskRevision, + checkpointId: reframeCheckpointId, + operationId: reframeOperationId, + now: NOW, + }); + const store = new V3ContextStore(projectRoot); + const home = await taskHomeStore(projectRoot, created.taskRef); + + if (winner === 'reframe') { + const result = await runPausedCanonicalLockRace( + reframeOperationId, + reframe, + createHandoff, + ); + const persisted = await store.readTaskSnapshot(created.taskRef); + expect(persisted.metadata).toEqual(result.metadata); + expect(persisted.requirements).toEqual(result.requirements); + expect(persisted.aggregateError).toBeNull(); + await expect(readHandoff(home, handoffId)).resolves.toBeNull(); + await expect( + readTaskCheckpointAtRoot( + taskRootPath(projectRoot, created.taskRef), + handoffCheckpointId, + ), + ).resolves.toBeNull(); + await expect( + readOperationJournal(home, handoffCheckpointOperationId), + ).resolves.toBeNull(); + await expect( + readOperationJournal(home, handoffOperationId), + ).resolves.toBeNull(); + await expect( + readOperationJournal(home, reframeOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'reframe' }); + await expect( + readTaskHeadFence(home, created.taskRef), + ).resolves.toMatchObject({ + taskRevision: persisted.metadata.revision, + lastOperationId: reframeOperationId, + }); + return; + } + + const result = await runPausedCanonicalLockRace( + winner === 'handoff_checkpoint' + ? handoffCheckpointOperationId + : handoffOperationId, + createHandoff, + reframe, + ); + const persisted = await store.readTaskSnapshot(created.taskRef); + expect(persisted.aggregateError).toBeNull(); + expect(persisted.metadata).toMatchObject({ + lastOperationId: handoffCheckpointOperationId, + latestCheckpointRef: { artifactId: handoffCheckpointId }, + }); + expect(persisted.requirements.status).toBe('confirmed'); + await expect(readHandoff(home, handoffId)).resolves.toEqual(result.handoff); + await expect( + readOperationJournal(home, handoffCheckpointOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'checkpoint_create' }); + await expect( + readOperationJournal(home, handoffOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'handoff_transition' }); + await expect( + readOperationJournal(home, reframeOperationId), + ).resolves.toBeNull(); + await expect(readTaskHeadFence(home, created.taskRef)).resolves.toMatchObject( + { + taskRevision: persisted.metadata.revision, + lastOperationId: handoffCheckpointOperationId, + }, + ); + await expectNoReframeArtifacts( + projectRoot, + created.taskRef, + reframeOperationId, + reframeCheckpointId, + ); +} + +async function assertSoloReframeRace( + projectRoot: string, + winner: 'reframe' | 'solo', +): Promise { + const actors = await bootstrap(projectRoot); + const created = await createV3Workflow({ + projectRoot, + task: 'Race solo execution assignment against requirements reframe.', + workflowMode: 'man', + sessionId: actors.sessionId, + client: 'vitest', + taskId: id(400), + operationId: id(401), + now: NOW, + }); + const finalized = await finalizeV3Requirements({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: created.metadata.revision, + requirements: confirmedRequirements(created.requirements), + operationId: id(402), + now: NOW, + }); + const planned = await reviseV3Plan({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: finalized.metadata.revision, + plan: '# Plan\n\n1. Execute the bounded solo change.\n', + operationId: id(403), + now: NOW, + }); + const soloOperationId = id(404); + const reframeOperationId = id(405); + const reframeCheckpointId = id(406); + const startSolo = () => + startV3SoloHandoff({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: planned.metadata.revision, + operationId: soloOperationId, + now: NOW, + }); + const reframe = () => + reframeV3Workflow({ + projectRoot, + taskRef: created.taskRef, + sessionId: actors.sessionId, + expectedTaskRevision: planned.metadata.revision, + checkpointId: reframeCheckpointId, + operationId: reframeOperationId, + now: NOW, + }); + const store = new V3ContextStore(projectRoot); + const home = await taskHomeStore(projectRoot, created.taskRef); + + if (winner === 'reframe') { + const result = await runPausedCanonicalLockRace( + reframeOperationId, + reframe, + startSolo, + ); + const persisted = await store.readTaskSnapshot(created.taskRef); + expect(persisted.metadata).toEqual(result.metadata); + expect(persisted.requirements).toEqual(result.requirements); + expect(persisted.metadata.soloExecution).toBeNull(); + expect(persisted.aggregateError).toBeNull(); + await expect( + readOperationJournal(home, soloOperationId), + ).resolves.toBeNull(); + await expect( + readOperationJournal(home, reframeOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'reframe' }); + return; + } + + const result = await runPausedCanonicalLockRace( + soloOperationId, + startSolo, + reframe, + ); + const persisted = await store.readTaskSnapshot(created.taskRef); + expect(persisted.metadata).toEqual(result.metadata); + expect(persisted.metadata.soloExecution).toMatchObject({ state: 'active' }); + expect(persisted.requirements.status).toBe('confirmed'); + expect(persisted.aggregateError).toBeNull(); + await expect( + readOperationJournal(home, soloOperationId), + ).resolves.toMatchObject({ state: 'committed', type: 'solo_handoff' }); + await expect( + readOperationJournal(home, reframeOperationId), + ).resolves.toBeNull(); + await expectNoReframeArtifacts( + projectRoot, + created.taskRef, + reframeOperationId, + reframeCheckpointId, + ); +} + +async function runPausedCanonicalLockRace( + winnerOperationId: Ulid, + winner: () => Promise, + loser: () => Promise, +): Promise { + const pause = createOperationLockPauseForTesting({ + operationId: winnerOperationId, + pauseAfter: 'entity_locks_held', + }); + const winnerPromise = pause.run(winner); + void winnerPromise.catch(() => undefined); + await pause.reached; + const loserPromise = loser(); + const [loserWhilePaused] = await Promise.allSettled([loserPromise]); + pause.release(); + const [winnerResult, loserResult] = await Promise.allSettled([ + winnerPromise, + loserPromise, + ]); + + expect(loserWhilePaused).toMatchObject({ status: 'rejected' }); + expect(loserResult).toMatchObject({ status: 'rejected' }); + if (loserResult.status !== 'rejected') { + throw new Error('expected the lock contender to be rejected'); + } + expect( + loserResult.reason instanceof Error + ? loserResult.reason.message + : String(loserResult.reason), + ).toBe('MANCODE_LOCK_HELD'); + if (winnerResult.status === 'rejected') throw winnerResult.reason; + return winnerResult.value; +} + +async function taskHomeStore(projectRoot: string, taskRef: TaskRef) { + const runtime = await readProjectRuntimeContext(projectRoot); + return resolveTaskEntityHomeStore(runtime.entityHomeStoreContext, taskRef); +} + +async function expectTaskMissing( + projectRoot: string, + taskRef: TaskRef, +): Promise { + await expect( + readFile( + path.join(taskRootPath(projectRoot, taskRef), 'metadata.json'), + 'utf8', + ), + ).rejects.toMatchObject({ code: 'ENOENT' }); +} + +async function expectNoReframeArtifacts( + projectRoot: string, + taskRef: TaskRef, + operationId: Ulid, + checkpointId: Ulid, +): Promise { + const taskRoot = taskRootPath(projectRoot, taskRef); + await expect( + readTaskCheckpointAtRoot(taskRoot, checkpointId), + ).resolves.toBeNull(); + await expect( + readFile( + path.join(taskRoot, 'archives', operationId, 'archive.json'), + 'utf8', + ), + ).rejects.toMatchObject({ code: 'ENOENT' }); +} + async function expectRejectedWithoutAuthorityChange(input: { projectRoot: string; taskRef: TaskRef; diff --git a/vitest.config.ts b/vitest.config.ts index 38d90bf..ea62bee 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -4,6 +4,7 @@ export default defineConfig({ test: { environment: 'node', include: ['tests/**/*.test.ts'], + maxWorkers: 2, coverage: { provider: 'v8', reporter: ['text', 'text-summary', 'lcov'], From d04d70669f9a2e82d0647912c01f870eac5fb746 Mon Sep 17 00:00:00 2001 From: whitelonng Date: Wed, 22 Jul 2026 20:43:51 +0800 Subject: [PATCH 4/6] fix: restore conditional requirement clarification --- README.en.md | 8 ++++++- README.md | 7 ++++++- docs/planning-governance-evolution.md | 3 +++ docs/release-acceptance.md | 2 +- docs/workflows.md | 8 ++++++- src/installers/v3-adapter.ts | 6 ++++++ tests/v3-adapter-contracts.test.ts | 30 +++++++++++++++++++++++++++ 7 files changed, 60 insertions(+), 4 deletions(-) diff --git a/README.en.md b/README.en.md index 3456194..0694e3d 100644 --- a/README.en.md +++ b/README.en.md @@ -239,7 +239,9 @@ design tokens: ``` -The default workflow asks six questions before writing code: +The default workflow evaluates a conditional clarity gate before writing code: it asks the user +only when an unresolved decision could change the goal, scope, behavior, acceptance, or key +constraints, and it proceeds without ceremonial questions when the request is already clear. 1. What problem does this change solve? 2. Can an existing implementation be reused? @@ -248,6 +250,10 @@ The default workflow asks six questions before writing code: 5. What is the smallest meaningful runtime check? 6. What remains uncertain after checking the code and docs? +These are internal readiness checks, not a mandatory questionnaire. Any unresolved +decision-changing uncertainty becomes a focused question and blocks requirements finalization +until the user answers; clear requests continue directly. + ## Usage diff --git a/README.md b/README.md index f9314eb..05d93aa 100644 --- a/README.md +++ b/README.md @@ -238,7 +238,8 @@ mancode 不把“当前模式”写进持久状态。需要某种工作方式时 `/man` 既是正式计划入口,也是面向关键任务的季后赛模式。即使当前处于默认 `solo`,当用户要求先调研、给方案或出计划时,也会进入 `/man`。它会先了解项目, -只追问会改变范围、架构、成本或验收的问题;适合由系统推荐的决策会给出 2–3 个 +只追问会改变范围、架构、成本或验收的问题;需求足够清晰时不制造形式问题,需求 +不清晰时会停下等待用户回答;适合由系统推荐的决策会给出 2–3 个 方案、优缺点和明确建议。需求足够清楚后,计划才会写入 `.mancode/local/workflows//plan.md`。 @@ -258,6 +259,10 @@ mancode 不把“当前模式”写进持久状态。需要某种工作方式时 跳过的步骤会被记录。所有产物保留在本地,之后可以回看当时为什么做某个决策。 +默认 `solo` 也执行同一个轻量清晰度判断:清晰、窄范围的需求直接做最小改动;会改变 +行为、范围、验收或关键约束的歧义必须先提问。涉及架构、owner/source of truth、迁移、 +跨模块或团队决策时,`solo` 推荐 `/man`,但不会自行切换模式。 + ## 工作原理 ### Bootstrap 和 Adapters diff --git a/docs/planning-governance-evolution.md b/docs/planning-governance-evolution.md index b67d75c..40a79dd 100644 --- a/docs/planning-governance-evolution.md +++ b/docs/planning-governance-evolution.md @@ -109,6 +109,7 @@ Plan Coach 继续是只读组件。它在产生计划前执行以下检查: 2. 每个选项的复杂度由谁承担:实现代码、迁移、运行维护、用户操作、兼容层或测试。不能只写“更简单”,要写承担者和可观察成本。 3. 输出唯一推荐,并给出拒绝其他选项的主要理由。推荐不是“由用户决定”;用户仍可否决,但计划不能同时保留多个未决方向。 4. 简单任务可以只列一个明显可行方向,并标注为什么没有真实替代方案;不能为了满足“多选”制造伪选项。 +5. V3 mode entry 在 requirements finalize 前执行条件式 clarity gate:清晰需求不制造形式问题;仍有会改变目标、范围、行为、验收、owner/source of truth 或关键约束的歧义时,必须停下提问并等待用户回答,不得把未验证假设写成 confirmed requirements。 建议的输出契约: @@ -327,6 +328,7 @@ mancode project upgrade --policy 2 --operation-id --session - - policy parser:1 可接受;0、负数、小数、未知正整数、缺失值和错误 component 均拒绝。 - workflow create:未升级项目只写 1;升级项目新 `/man` 写 2;已有 workflow 的 policy provenance 不变。 - Plan Coach:不同目标、无复杂度承担者、多个 recommendation、无 stop condition 均返回 `NEEDS_CLARIFICATION`;简单任务单方向通过。 +- V3 `/man`、`/manteam` 和 Solo mode entry 的条件式 clarity gate:清晰请求直接继续,决策性歧义在 requirements finalize 或代码修改前停下并等待用户回答;不强制无意义提问。 - stop/re-align:触发时返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,且 authority 的前后 digest 完全相同。 - Scout/Domain Matrix:可选字段不进入 metadata;高风险 plan 可包含章节;普通任务不被强制增加文件。 - digest:内容、marker、路径、换行、截断、用户托管区域变化分别得到预期结果;manifest echo 与磁盘不一致必为 stale。 @@ -369,6 +371,7 @@ mancode project upgrade --policy 2 --operation-id --session - - [x] 旧 V3 fixture、legacy fixture、已有 adapter 和历史 workflow 通过原有测试。 - [x] 触发 stop/re-align 时只返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,authority 文件内容和 claims 不变。 - [x] Scout/Plan Coach 新字段和规则覆盖正常、缺失证据、冲突 owner、单方向简单任务。 +- [x] V3 mode entry 恢复条件式需求澄清:清晰需求不机械追问,决策性歧义必须在 finalize/实施前向用户提问并等待回答;五平台生成契约覆盖。 - [x] adapter digest algorithm、status 分类、stale error、explicit upgrade command 和 recovery contract 完成。 - [x] policy parser 白名单、writer capability、`minWriterVersion`/reader gate 和 0.3.x + V2 manifest 拒绝 contract 完成;本轮已增加真实发布版 0.3.18 CLI 的黑盒写入拒绝与 authority 全树字节不变证据,后续候选仍需重跑。 - [x] project upgrade dry-run、确认、commit、repair、abort 和 provenance 完成;现有 workflow 未被批量重写,新 `/man` Policy 2 默认值有明确创建证据。 diff --git a/docs/release-acceptance.md b/docs/release-acceptance.md index d93f806..5fd5c98 100644 --- a/docs/release-acceptance.md +++ b/docs/release-acceptance.md @@ -1,6 +1,6 @@ # 0.4.0 发布验收 -自动化 contract 必须覆盖 V3 schema、Policy 2、project upgrade、local reframe、operation recovery、团队协调、git-ref hard reject、五个平台生成结果和 Windows smoke path。以下证据完成前,不得发布 mancode 0.4.0 或执行 `npm publish`。 +自动化 contract 必须覆盖 V3 schema、条件式需求澄清、Policy 2、project upgrade、local reframe、operation recovery、团队协调、git-ref hard reject、五个平台生成结果和 Windows smoke path。条件式需求澄清必须证明清晰请求不被机械提问阻塞,决策性歧义会在 requirements finalize 或实施前停下、提问并等待用户回答。以下证据完成前,不得发布 mancode 0.4.0 或执行 `npm publish`。 ## 发布条件 diff --git a/docs/workflows.md b/docs/workflows.md index 72227e4..c3da8f4 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -6,7 +6,7 @@ mancode 不把“当前模式”保存成全局开关。平台入口创建或恢 | 模式 | 用途 | 持久任务 | |---|---|---| -| `solo` | 小改、最窄验证和一次受限 diff 自检 | 否;可执行已确认的 solo handoff | +| `solo` | 小改、最窄验证和一次受限 diff 自检;先判断需求是否清晰 | 否;可执行已确认的 solo handoff | | `manba` | 复现、根因诊断、最小修复或真实验证 | 是,5 步 | | `man` | 需求对齐、计划及可选完整治理 | 是,9 步 | | `manteam` | 带 owner、participant、scope 和 claim 的团队治理 | 是,9 步 | @@ -14,6 +14,12 @@ mancode 不把“当前模式”保存成全局开关。平台入口创建或恢 平台入口分别表现为 `/man`、`$man` 或 prompt,具体映射见 [platform-adapters.md](./platform-adapters.md)。 +### 条件式需求澄清 + +`solo` 和 `/man` 都先判断需求是否足够清晰,不机械追问。目标、范围、验收边界和关键约束可以从用户请求、项目事实或明确的安全默认值确定时,直接继续;不需要为了形式制造问题。 + +如果仍有会改变目标、范围、用户可见行为、验收、架构、数据、安全、兼容性、owner 或 source of truth 的歧义,必须先向用户提出聚焦问题并等待回答。回答前不得把假设写成 confirmed requirements;复杂度、owner、迁移、跨模块或团队决策超出 Solo 边界时,应推荐 `/man` 并等待用户选择。该判断属于 V3 mode skill 的固定行为契约。 + ## `man` 流程 1. 调研已有实现、复用点、风险和未知项。 diff --git a/src/installers/v3-adapter.ts b/src/installers/v3-adapter.ts index fd04ca5..f9cc7bc 100644 --- a/src/installers/v3-adapter.ts +++ b/src/installers/v3-adapter.ts @@ -931,6 +931,9 @@ const V3_MODE_DEFINITIONS: Record< actions: [ '- For a read-only project orientation, inspect and answer directly; do not create governance records.', '- For a new task, run `mancode workflow create man "" --session `.', + '- Before writing requirements, inspect the relevant project facts and implementation, then run a clarity gate. Treat the request as clear enough only when the goal, in-scope/out-of-scope behavior, acceptance boundary, semantic owner/source of truth, and decision-changing constraints are supplied, verifiable from the repository, or explicitly recorded as safe defaults. Do not ask ceremonial questions or manufacture alternatives when the request is already clear.', + '- If any unresolved ambiguity could change the goal, scope, user-visible behavior, acceptance, architecture, data, security, compatibility, owner, or source of truth, stop before requirements finalization, explain the missing decision, ask focused questions, and wait for the user answer. Ask in as many batches as needed, do not repeat answered questions, and never turn an unverified assumption into confirmed scope or confirmed coverage.', + '- After the user answers, summarize the resolved requirements and any remaining defaults. Continue only when no decision-changing blocking unknown remains; otherwise keep the task in clarification and ask again.', '- Write requirements as semantic JSON with `version: 1`, a non-empty `goal`, non-empty `confirmedScope`, and the arrays `excludedScope`, `technicalDecisions`, `defaults`, and `blockingUnknowns`. Every array item must be a non-empty string; an array may be empty except `confirmedScope`, and `technicalDecisions` must be non-empty whenever `technical_stack` applies.', '- `coverage` must contain exactly one item for each dimension: `platform`, `core_scope`, `technical_stack`, `data_and_persistence`, `performance`, `compatibility`, and `security`. Each item has the shape `{ "dimension": "platform", "status": "confirmed", "rationale": "..." }`; `status` is exactly `confirmed`, `defaulted`, or `not_applicable`, and `rationale` is non-empty.', '- `acceptanceCriteria` must contain at least one required item shaped as `{ "id": "AC-1", "description": "...", "required": true, "method": "automated" }`; `method` is exactly `automated`, `manual`, or `hybrid`.', @@ -961,6 +964,7 @@ const V3_MODE_DEFINITIONS: Record< actions: [ '- Confirm team membership with `mancode team status`; join invited participants before assigning shared work.', '- For a new shared task, run `mancode workflow create manteam "" --visibility shared --coordination team --confirm-shared --session `.', + '- Apply the same conditional clarity gate as `man` before finalizing requirements: if the goal, scope, acceptance, owner/source of truth, and constraints are clear from the request or project facts, continue without ceremonial questions; if a decision-changing ambiguity remains, ask focused questions and wait before writing confirmed requirements.', '- Use claims, checkpoints, sync, and handoffs through `mancode team`; never infer ownership from an adapter prompt.', '- Use the same mancode requirements, plan, verification, review, and completion commands as `man`, adding `--sync` whenever the active transport requires it.', ], @@ -980,6 +984,8 @@ const V3_MODE_DEFINITIONS: Record< contextPurpose: 'implement', actions: [ '- Do not create or persist a legacy solo mode. Ordinary focused work needs no TaskRef; if the operator expects a governed task, use its bound TaskRef or report that none is bound.', + '- Before editing, assess whether the request is clear and narrow using the project facts. If it is clear enough, proceed without ceremonial questions. If an unresolved ambiguity could materially change behavior, scope, acceptance, data, security, or compatibility, stop and ask focused questions; wait for the answer instead of silently choosing.', + '- If resolving the ambiguity requires architecture, semantic owner/source-of-truth, cross-module scope, migration, team coordination, or formal acceptance decisions, recommend `/man`, explain the trigger, and wait for the operator to choose; advice alone never changes mode or authority.', '- For a governed-to-solo transition, use `mancode workflow handoff --to solo --expected-revision --session `.', ], }, diff --git a/tests/v3-adapter-contracts.test.ts b/tests/v3-adapter-contracts.test.ts index f1c6ce5..9ef6046 100644 --- a/tests/v3-adapter-contracts.test.ts +++ b/tests/v3-adapter-contracts.test.ts @@ -266,6 +266,19 @@ describe('V3 adapter bootstrap integration', () => { expect(entry).toContain( "clears this session's active workflow pointer", ); + expect(entry).toContain('run a clarity gate'); + expect(entry).toContain( + 'Do not ask ceremonial questions or manufacture alternatives when the request is already clear.', + ); + expect(entry).toContain( + 'stop before requirements finalization, explain the missing decision, ask focused questions, and wait for the user answer.', + ); + expect(entry).toContain( + 'never turn an unverified assumption into confirmed scope or confirmed coverage.', + ); + expect(entry).toContain( + 'summarize the resolved requirements and any remaining defaults', + ); } if (mode === 'manps') { expect(entry).toContain( @@ -281,6 +294,23 @@ describe('V3 adapter bootstrap integration', () => { expect(entry).toContain( 'Only an explicit governed handoff mutation requires', ); + expect(entry).toContain( + 'assess whether the request is clear and narrow using the project facts', + ); + expect(entry).toContain( + 'If an unresolved ambiguity could materially change behavior, scope, acceptance, data, security, or compatibility, stop and ask focused questions', + ); + expect(entry).toContain( + 'recommend `/man`, explain the trigger, and wait for the operator to choose', + ); + } + if (mode === 'manteam') { + expect(entry).toContain( + 'same conditional clarity gate as `man` before finalizing requirements', + ); + expect(entry).toContain( + 'if a decision-changing ambiguity remains, ask focused questions and wait before writing confirmed requirements.', + ); } if (mode === 'man' || mode === 'manba' || mode === 'manteam') { expect(entry).toContain(`mancode workflow create ${mode}`); From 2c9d6976eefab630f07cd29220b131dbbff4b225 Mon Sep 17 00:00:00 2001 From: whitelonng Date: Wed, 22 Jul 2026 22:48:03 +0800 Subject: [PATCH 5/6] fix: restore Continuity requirement clarification --- README.en.md | 16 +- README.md | 11 +- docs/12-lifecycle.md | 4 +- docs/README.md | 2 +- docs/architecture.md | 8 +- docs/planning-governance-evolution.md | 15 +- docs/platform-adapters.md | 8 +- docs/project-intelligence.md | 2 +- docs/release-acceptance.md | 4 +- docs/workflows.md | 18 +- scripts/verify-dist-adapters.mjs | 11 +- scripts/windows-smoke.mjs | 2 +- src/commands/requirements-input.ts | 3 +- src/commands/workflow.ts | 24 +- src/context/requirements-finalize.ts | 44 ++- src/installers/v3-adapter.ts | 356 +++++++++++++----- src/runtime/operation-definition.ts | 22 ++ src/runtime/operation-journal.ts | 2 + src/system/requirements-ledger.ts | 20 +- tests/adapter-upgrade-contracts.test.ts | 182 ++++++++- tests/beta-gate-contracts.test.ts | 2 +- tests/migrate-contracts.test.ts | 4 +- tests/operation-definition-contracts.test.ts | 2 +- tests/v3-adapter-contracts.test.ts | 91 ++++- tests/v3-command-contracts.test.ts | 129 +++++++ ...v3-requirements-finalize-contracts.test.ts | 150 +++++++- 26 files changed, 970 insertions(+), 162 deletions(-) diff --git a/README.en.md b/README.en.md index 0694e3d..082cb28 100644 --- a/README.en.md +++ b/README.en.md @@ -34,8 +34,9 @@ different gears for different stakes: light solo mode for daily practice, `/man` for playoff-level engineering discipline, and coaching-staff subagents for research, planning, implementation, and review. -**mancode Continuity** is the continuous-context runtime that carries tasks, -decisions, and verification evidence safely into later conversations. +**mancode Continuity** is the cross-session and team-collaboration runtime that +carries tasks, decisions, and verification evidence safely into later +conversations. [Installation](#installation) · [Usage](#usage) @@ -622,7 +623,7 @@ mancode/ adapter provisional until then. - Evaluate Windsurf, Cline, and Roo Code adapters based on real demand. -See [V3 Release Acceptance](./docs/release-acceptance.md) for the complete gate. +See [0.4.0 Continuity Release Acceptance](./docs/release-acceptance.md) for the complete gate. ## Troubleshooting @@ -637,7 +638,7 @@ a deliberately empty directory. ### Claude Code hooks not triggering After `mancode init`, restart Claude Code so it reloads `.claude/settings.json`. -Run `mancode status` to verify hooks are registered. For V3 adapter drift, preview +Run `mancode status` to verify hooks are registered. For Continuity adapter drift, preview `mancode adapter upgrade --platform claude-code --dry-run`, then repair that preview with its `--operation-id`, an active session, and `--confirm`. The legacy hook architecture still uses `mancode init --legacy --force`. @@ -702,8 +703,11 @@ use. ### How is mancode different from a CLAUDE.md file? -A `CLAUDE.md` file is static guidance. mancode adds hooks, persisted workflow -state, slash-command skills, and separate review subagents with clean context. +A `CLAUDE.md` file is static guidance. Continuity maintains one always-loaded +Claude Code bootstrap block there, while sessions, TaskRefs, requirements, +plans, and review evidence remain structured authority under `.mancode/`. +mancode also adds mode skills, persisted workflows, and separate review +subagents with clean context. ### How is mancode different from Cursor rules, custom prompts, or agent instructions? diff --git a/README.md b/README.md index 05d93aa..82422c7 100644 --- a/README.md +++ b/README.md @@ -36,7 +36,7 @@ 日常任务用轻量 `solo`,关键任务用季后赛级别的 `/man`,复杂任务让教练组 subagents 负责调研、计划、实现和审查。 -**mancode Continuity(连续上下文运行时)**负责把任务、决策和验证证据安全地带到后续对话。 +**mancode Continuity(跨会话与团队协作运行时)**负责把任务、决策和验证证据安全地带到后续对话,并协调多人或多 Agent 的任务权威。 mancode 当前支持 Claude Code、Cursor、ChatGPT 桌面端中的 Codex、Codex CLI、 GitHub Copilot 和 ZCode。每个平台继续使用原来的 `man*` 入口,并通过静态 @@ -567,7 +567,7 @@ mancode/ - 确认 ZCode 项目级 skill 发现和 workspace command 路径;完成前继续标记为 provisional。 - 根据真实需求评估 Windsurf、Cline 和 Roo Code adapter。 -完整发布条件见 [V3 发布验收](./docs/release-acceptance.md)。 +完整发布条件见 [0.4.0 Continuity 发布验收](./docs/release-acceptance.md)。 ## 故障排查 @@ -580,7 +580,7 @@ mancode/ ### Claude Code hooks 不生效 `mancode init` 后需要重启 Claude Code 以重新加载 `.claude/settings.json`。 -运行 `mancode status` 确认 hooks 已注册。V3 adapter 内容异常时,先运行 +运行 `mancode status` 确认 hooks 已注册。Continuity adapter 内容异常时,先运行 `mancode adapter upgrade --platform claude-code --dry-run`,再用该预览返回的 `--operation-id`、active session 和 `--confirm` 完成修复。legacy hook 架构仍使用 `mancode init --legacy --force`。 @@ -641,8 +641,9 @@ npm uninstall -g mancode ### mancode 和 CLAUDE.md 有什么区别? -`CLAUDE.md` 是静态指导。mancode 增加 hooks、持久化工作流状态、slash-command skills -和独立审查 subagents。 +`CLAUDE.md` 是静态指导。Continuity 只在其中维护一段始终加载的 Claude Code bootstrap, +真正的 session、TaskRef、requirements、计划和审查证据仍由 `.mancode/` 的结构化权威管理; +mancode 还提供 mode skills、持久化工作流和独立审查 subagents。 ### mancode 和 Cursor rules、自定义 prompt、agent instructions 有什么区别? diff --git a/docs/12-lifecycle.md b/docs/12-lifecycle.md index 45e7524..b9c9392 100644 --- a/docs/12-lifecycle.md +++ b/docs/12-lifecycle.md @@ -1,12 +1,12 @@ # Continuity 生命周期 -本文描述默认 V3 路径。旧 `state.json` 生命周期仅用于显式 `--legacy` 兼容。 +本文描述默认 Continuity 路径。旧 `state.json` 生命周期仅用于显式 `--legacy` 兼容。 ## 初始化 ```text mancode init - → 检查项目与 legacy/V3 物理布局 + → 检查项目与 legacy/Continuity 物理布局 → 检测 Project Profile → 创建 schema.json,状态 initializing → 写 shared/local/runtime 基础权威 diff --git a/docs/README.md b/docs/README.md index 6b31245..c394bae 100644 --- a/docs/README.md +++ b/docs/README.md @@ -17,7 +17,7 @@ | 文档 | 内容 | |---|---| -| [architecture.md](./architecture.md) | V3 权威模型、目录、Task Aggregate 和一致性 | +| [architecture.md](./architecture.md) | Continuity 权威模型、目录、Task Aggregate 和一致性 | | [workflows.md](./workflows.md) | 模式、工作流状态、治理门禁与团队协作 | | [project-intelligence.md](./project-intelligence.md) | 项目检测、设计资产扫描和 preseason | | [platform-adapters.md](./platform-adapters.md) | 五个平台的 bootstrap、能力差异与边界 | diff --git a/docs/architecture.md b/docs/architecture.md index 336f986..0a9e8ff 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -1,6 +1,6 @@ -# V3 架构 +# Continuity 架构 -mancode Continuity 把跨会话任务状态、治理证据和团队协调放在显式、可校验的本地权威中。平台适配器只负责入口与 bootstrap,不保存任务副本。 +mancode Continuity(跨会话与团队协作运行时)把跨会话任务状态、治理证据和团队协调放在显式、可校验的本地权威中。平台适配器只负责入口与 bootstrap,不保存任务副本。内部 layout/schema version 仍为 3;它是存储兼容版本,不是产品名称。 ## 核心模型 @@ -27,7 +27,7 @@ Markdown 计划和报告是人类可读产物。完成门禁以结构化实体 ```text .mancode/ -├── schema.json # V3 激活状态和兼容门禁 +├── schema.json # Continuity 激活状态和兼容门禁 ├── shared/ │ ├── config.json # 项目策略与 transport 配置 │ ├── context/project.json # 可共享项目事实 @@ -42,7 +42,7 @@ Markdown 计划和报告是人类可读产物。完成门禁以结构化实体 └── runtime/ # operation journal、reservation、repair ``` -旧架构的 `state.json`、`config.json`、`project-profile.json`、`workflows/` 和 `memory/` 与 V3 目录物理隔离。普通 `mancode init` 创建 V3;只有显式 `--legacy` 才创建旧布局。 +旧架构的 `state.json`、`config.json`、`project-profile.json`、`workflows/` 和 `memory/` 与 Continuity 目录物理隔离。普通 `mancode init` 创建 Continuity 布局;只有显式 `--legacy` 才创建旧布局。 ## 一致性与恢复 diff --git a/docs/planning-governance-evolution.md b/docs/planning-governance-evolution.md index 40a79dd..62f3c21 100644 --- a/docs/planning-governance-evolution.md +++ b/docs/planning-governance-evolution.md @@ -14,11 +14,12 @@ | 类别 | 状态 | 证据 | | --- | --- | --- | -| A–F 实现工作包 | 工作树生产加固完成 | `4dc2e7e` 包含 Policy 2 mode scope、resolver 短路和 adapter target recovery 修复;本轮又补齐 required adapter readiness、真实 reframe 并发和已发布旧 CLI 黑盒证据,等待形成下一候选 | -| 本地发布前检查 | 工作树通过 | 本轮 `npm run prepublishOnly` 通过:lint、typecheck、build、dist adapter 验证、119 个测试文件/824 个测试;`npm audit --omit=dev`、`npm pack --dry-run` 和实际 tarball 安装/CLI/module smoke 均通过,形成候选后仍需在干净 checkout 重跑 | +| A–F 实现工作包 | 工作树生产加固完成 | `4dc2e7e` 包含 Policy 2 mode scope、resolver 短路和 adapter target recovery 修复;本轮又补齐 required adapter readiness、真实 reframe 并发、已发布旧 CLI 黑盒证据、条件式 decision-readiness、跨会话 requirements draft 和 Continuity 命名迁移,等待形成下一候选 | +| 本地发布前检查 | 工作树通过 | 本轮 `npm run prepublishOnly` 通过:lint、typecheck、build、dist adapter 验证、119 个测试文件/833 个测试;`npm audit --omit=dev`、`npm pack --dry-run` 和实际 tarball/Claude Code smoke 均通过,形成候选后仍需在干净 checkout 重跑 | | GitHub Quality gate | 候选通过 | `4dc2e7e` 的 [Quality gate run 29896302856](https://github.com/whitelonng/mancode/actions/runs/29896302856) 成功;候选变化后必须重跑 | | GitHub Windows gate | 候选通过 | `4dc2e7e` 的 [Windows gate run 29896302904](https://github.com/whitelonng/mancode/actions/runs/29896302904) 在 CMD、PowerShell、Git Bash 全部成功;候选变化后必须重跑 | | `develop` 远程一致性 | 候选已对齐 | `4dc2e7e` 已与 `origin/develop` 对齐;后续工作树修复形成新候选后需重新推送和对齐,`main` 未修改 | +| Claude Code 条件式澄清实测 | 工作树通过 | Claude Code 2.1.142 使用本地 0.4.0 tarball:清晰请求直接执行,需求不清晰时提问等待,明确但与证据冲突的请求被拦截;真实测试同时发现并修复了隐藏 bootstrap skill 未稳定加载的问题,最终改为 `CLAUDE.md` 受控区,候选形成后仍需重跑 | | 最终发布验收 | 未完成 | 五平台真实宿主、跨 clone/legacy 人工验收、最终 Beta gate 和干净 checkout tarball 验收仍待完成 | | npm 发布 | 未执行 | 在上项全部完成前保持禁止 | @@ -49,7 +50,7 @@ ## 3. 基线证据与代码 owner -以下证据以当前工作树的 V3 实现为准。候选形成前后都应重新运行对应 contract;如果在途改动改变了行号或行为,更新证据而不是沿用旧结论。 +以下证据以当前工作树的 Continuity 实现为准。候选形成前后都应重新运行对应 contract;如果在途改动改变了行号或行为,更新证据而不是沿用旧结论。 | 事实 | 当前证据 | 对本计划的影响 | | --- | --- | --- | @@ -109,7 +110,7 @@ Plan Coach 继续是只读组件。它在产生计划前执行以下检查: 2. 每个选项的复杂度由谁承担:实现代码、迁移、运行维护、用户操作、兼容层或测试。不能只写“更简单”,要写承担者和可观察成本。 3. 输出唯一推荐,并给出拒绝其他选项的主要理由。推荐不是“由用户决定”;用户仍可否决,但计划不能同时保留多个未决方向。 4. 简单任务可以只列一个明显可行方向,并标注为什么没有真实替代方案;不能为了满足“多选”制造伪选项。 -5. V3 mode entry 在 requirements finalize 前执行条件式 clarity gate:清晰需求不制造形式问题;仍有会改变目标、范围、行为、验收、owner/source of truth 或关键约束的歧义时,必须停下提问并等待用户回答,不得把未验证假设写成 confirmed requirements。 +5. Continuity mode entry 在 requirements finalize 前执行条件式 decision-readiness gate:同时检查清晰度、与项目证据的一致性和风险;清晰且可靠的需求不制造形式问题,仍有会改变目标、范围、行为、验收、owner/source of truth 或关键约束的歧义时,必须停下提问并等待用户回答,不得把未验证假设写成 confirmed requirements。 建议的输出契约: @@ -328,7 +329,7 @@ mancode project upgrade --policy 2 --operation-id --session - - policy parser:1 可接受;0、负数、小数、未知正整数、缺失值和错误 component 均拒绝。 - workflow create:未升级项目只写 1;升级项目新 `/man` 写 2;已有 workflow 的 policy provenance 不变。 - Plan Coach:不同目标、无复杂度承担者、多个 recommendation、无 stop condition 均返回 `NEEDS_CLARIFICATION`;简单任务单方向通过。 -- V3 `/man`、`/manteam` 和 Solo mode entry 的条件式 clarity gate:清晰请求直接继续,决策性歧义在 requirements finalize 或代码修改前停下并等待用户回答;不强制无意义提问。 +- Continuity `/man`、`/manteam` 和 Solo mode entry 的条件式 decision-readiness gate:清晰且可靠的请求直接继续,决策性歧义在 requirements finalize 或代码修改前停下并等待用户回答;不强制无意义提问。 - stop/re-align:触发时返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,且 authority 的前后 digest 完全相同。 - Scout/Domain Matrix:可选字段不进入 metadata;高风险 plan 可包含章节;普通任务不被强制增加文件。 - digest:内容、marker、路径、换行、截断、用户托管区域变化分别得到预期结果;manifest echo 与磁盘不一致必为 stale。 @@ -368,10 +369,10 @@ mancode project upgrade --policy 2 --operation-id --session - 当前 gate 结果如下。`[x]` 仅表示实现和自动化证据完成;真实宿主或发布验收未完成时,仍不得发布 npm。 - [x] 模板和文档 contract 通过;advisory 不直接执行 schema migration、policy 写入或自动 step 变更。 -- [x] 旧 V3 fixture、legacy fixture、已有 adapter 和历史 workflow 通过原有测试。 +- [x] 旧 layout-version-3 fixture、legacy fixture、已有 adapter 和历史 workflow 通过原有测试。 - [x] 触发 stop/re-align 时只返回 `NEEDS_REALIGNMENT + MANCODE_REFRAME_REQUIRED`,authority 文件内容和 claims 不变。 - [x] Scout/Plan Coach 新字段和规则覆盖正常、缺失证据、冲突 owner、单方向简单任务。 -- [x] V3 mode entry 恢复条件式需求澄清:清晰需求不机械追问,决策性歧义必须在 finalize/实施前向用户提问并等待回答;五平台生成契约覆盖。 +- [x] Continuity mode entry 恢复条件式需求澄清:清晰需求不机械追问,决策性歧义必须在 finalize/实施前向用户提问并等待回答;五平台生成契约覆盖。 - [x] adapter digest algorithm、status 分类、stale error、explicit upgrade command 和 recovery contract 完成。 - [x] policy parser 白名单、writer capability、`minWriterVersion`/reader gate 和 0.3.x + V2 manifest 拒绝 contract 完成;本轮已增加真实发布版 0.3.18 CLI 的黑盒写入拒绝与 authority 全树字节不变证据,后续候选仍需重跑。 - [x] project upgrade dry-run、确认、commit、repair、abort 和 provenance 完成;现有 workflow 未被批量重写,新 `/man` Policy 2 默认值有明确创建证据。 diff --git a/docs/platform-adapters.md b/docs/platform-adapters.md index 3b27da7..1e6a19e 100644 --- a/docs/platform-adapters.md +++ b/docs/platform-adapters.md @@ -6,7 +6,7 @@ | 平台 | 入口与文件 | 动态能力 | 当前边界 | |---|---|---|---| -| Claude Code | `.claude/skills/` | skills;legacy 模式可用 hooks | 默认 V3 不依赖旧 `state.json` hooks | +| Claude Code | `CLAUDE.md` 托管区、`.claude/skills/` | 项目 memory 与 mode skills;legacy 模式可用 hooks | 默认 Continuity 不依赖旧 `state.json` hooks | | Cursor | `.cursor/rules/`、`.cursor/commands/` | rules 与 commands | 无 mancode 原生 session API | | Codex | `AGENTS.md` 托管区、`.agents/skills/` | `$man*` skills | session 传播需真实宿主证据 | | GitHub Copilot | instruction 托管区、`.github/prompts/` | instructions 与 prompts | 能力依具体 Copilot 宿主而异 | @@ -28,14 +28,16 @@ manifest 的 `managedAdapters` key 是项目登记的 required 平台集合。gr 每个平台都必须: - 能发现原来的 `man`、`manba`、`manteam`、`manps` 和 `mansolo` 入口。 -- 在开始任务前解析 V3 schema、session、TaskRef 和 Context Pack。 +- 在开始任务前解析 Continuity manifest、session、TaskRef 和 Context Pack。 - 不保存易过期的 task/session 状态副本。 - 未证明宿主 session 传播时要求显式 session。 - 保留用户自写配置,并支持重复安装和安全卸载。 ## Legacy hooks -只有 `mancode init --legacy` 安装读取 `.mancode/state.json` 的旧 Claude Code hooks。V3 adapter 不应创建、读取或刷新 legacy authority。 +只有 `mancode init --legacy` 安装读取 `.mancode/state.json` 的旧 Claude Code hooks。Continuity adapter 不应创建、读取或刷新 legacy authority。 + +Continuity 的 Claude Code bootstrap 位于根目录 `CLAUDE.md` 的 `mancode:continuity:claude` 托管区,确保普通 Solo 请求也会加载;原有 mode skills 仍位于 `.claude/skills/`。Cursor bootstrap 位于 `.cursor/rules/mancode-continuity.mdc`,其他嵌入式托管区同样使用 `mancode:continuity:*` 标记。升级时只自动移除带 mancode 旧管理标记的 `mancode-v3`/旧 Continuity bootstrap 或托管区;用户在 `CLAUDE.md` 和同名旧文件中的自写内容会保留。 Windows 上的脚本与文件替换不能依赖 Bash、jq 或 Unix rename 行为。发布流程包含 CMD、PowerShell 和 Git Bash smoke test。 diff --git a/docs/project-intelligence.md b/docs/project-intelligence.md index 18201d2..50b9056 100644 --- a/docs/project-intelligence.md +++ b/docs/project-intelligence.md @@ -12,7 +12,7 @@ Project Profile 记录: - 是否检测到 UI 资产和浏览器自动化能力。 - high、medium 或 low 置信度。 -普通 V3 初始化把可共享项目事实写入 `.mancode/shared/context/project.json`。项目结构变化后运行: +普通 Continuity 初始化把可共享项目事实写入 `.mancode/shared/context/project.json`。项目结构变化后运行: ```bash mancode refresh-project diff --git a/docs/release-acceptance.md b/docs/release-acceptance.md index 5fd5c98..2a0c024 100644 --- a/docs/release-acceptance.md +++ b/docs/release-acceptance.md @@ -1,6 +1,6 @@ -# 0.4.0 发布验收 +# 0.4.0 Continuity 发布验收 -自动化 contract 必须覆盖 V3 schema、条件式需求澄清、Policy 2、project upgrade、local reframe、operation recovery、团队协调、git-ref hard reject、五个平台生成结果和 Windows smoke path。条件式需求澄清必须证明清晰请求不被机械提问阻塞,决策性歧义会在 requirements finalize 或实施前停下、提问并等待用户回答。以下证据完成前,不得发布 mancode 0.4.0 或执行 `npm publish`。 +自动化 contract 必须覆盖 Continuity runtime/schema、条件式需求澄清、Policy 2、project upgrade、local reframe、operation recovery、团队协调、git-ref hard reject、五个平台生成结果和 Windows smoke path。条件式需求澄清必须证明清晰请求不被机械提问阻塞,决策性歧义会在 requirements finalize 或实施前停下、提问并等待用户回答。以下证据完成前,不得发布 mancode 0.4.0 或执行 `npm publish`。 ## 发布条件 diff --git a/docs/workflows.md b/docs/workflows.md index c3da8f4..34751b0 100644 --- a/docs/workflows.md +++ b/docs/workflows.md @@ -18,7 +18,23 @@ mancode 不把“当前模式”保存成全局开关。平台入口创建或恢 `solo` 和 `/man` 都先判断需求是否足够清晰,不机械追问。目标、范围、验收边界和关键约束可以从用户请求、项目事实或明确的安全默认值确定时,直接继续;不需要为了形式制造问题。 -如果仍有会改变目标、范围、用户可见行为、验收、架构、数据、安全、兼容性、owner 或 source of truth 的歧义,必须先向用户提出聚焦问题并等待回答。回答前不得把假设写成 confirmed requirements;复杂度、owner、迁移、跨模块或团队决策超出 Solo 边界时,应推荐 `/man` 并等待用户选择。该判断属于 V3 mode skill 的固定行为契约。 +如果仍有会改变目标、范围、用户可见行为、验收、架构、数据、安全、兼容性、owner 或 source of truth 的歧义,必须先向用户提出聚焦问题并等待回答。回答前不得把假设写成 confirmed requirements;复杂度、owner、迁移、跨模块或团队决策超出 Solo 边界时,应推荐 `/man` 并等待用户选择。该判断属于 Continuity mode entry 的固定行为契约。 + +| 输入状态 | 处理方式 | +| --- | --- | +| 目标与需求清晰、与项目证据一致、风险低 | 默认 Solo 直接执行最窄改动,不创建 session 或 TaskRef,不做形式化追问 | +| 目标清晰、需求有缺口 | 先把未知项分成 blocking、recommendable、defaultable;只为会改变决策的 blocking 项停下提问 | +| 表述明确但与项目证据冲突,或涉及认证、支付、敏感数据、删除、迁移、公开 API、并发、基础设施等高风险边界 | 展示证据和影响,推荐更安全路径,取得聚焦确认后再继续;“明确”不等于“正确或安全” | +| 用户明确请求计划、架构、迁移设计或正式验收 | 可直接进入 `/man` 规划路径;普通实现中途遇到这类决策时只推荐 `/man`,不得静默切换权威 | + +受治理任务在等待 blocking 回答前,必须把已知事实、部分决定和开放问题写入 requirements draft: + +```bash +mancode workflow requirements local: draft \ + --file requirements.json --expected-revision N --session +``` + +draft 的 `blockingUnknowns` 必须列出开放决定;scope、coverage、technical decisions 或 acceptance 可以暂不完整。后续会话通过 TaskRef 恢复同一澄清状态,每次回答后更新 draft;只有 blocking 项清零且 requirements 完整时才能 `finalize`。`manba` 在修复前还必须先从复现、测试、文档、历史或语义 owner 建立预期行为,无法确定时先问一个聚焦问题。 ## `man` 流程 diff --git a/scripts/verify-dist-adapters.mjs b/scripts/verify-dist-adapters.mjs index 7f2caac..157a49f 100644 --- a/scripts/verify-dist-adapters.mjs +++ b/scripts/verify-dist-adapters.mjs @@ -19,9 +19,9 @@ try { runCli(['init', '--empty', '--platform', 'all', '--lang', 'en']); const generatedFiles = [ - '.claude/skills/mancode-v3/SKILL.md', + 'CLAUDE.md', '.claude/skills/man/SKILL.md', - '.cursor/rules/mancode-v3.mdc', + '.cursor/rules/mancode-continuity.mdc', '.cursor/commands/man.md', 'AGENTS.md', '.agents/skills/man/SKILL.md', @@ -30,7 +30,10 @@ try { ]; for (const relativePath of generatedFiles) { - const content = await readFile(path.join(projectRoot, relativePath), 'utf8'); + const content = await readFile( + path.join(projectRoot, relativePath), + 'utf8', + ); assertGeneratedContract(relativePath, content); } @@ -79,6 +82,8 @@ function assertGeneratedContract(relativePath, content) { 'mancode status --json', 'authority: "v3"', 'v3_active', + 'mancode-v3', + 'mancode:v3', ]) { assert( !content.includes(forbidden), diff --git a/scripts/windows-smoke.mjs b/scripts/windows-smoke.mjs index 259f48e..1e5c71a 100644 --- a/scripts/windows-smoke.mjs +++ b/scripts/windows-smoke.mjs @@ -36,7 +36,7 @@ try { ); await readFile(path.join(emptyProject, 'AGENTS.md'), 'utf8'); await readFile( - path.join(emptyProject, '.cursor', 'rules', 'mancode-v3.mdc'), + path.join(emptyProject, '.cursor', 'rules', 'mancode-continuity.mdc'), 'utf8', ); await readFile( diff --git a/src/commands/requirements-input.ts b/src/commands/requirements-input.ts index 0552485..18b130c 100644 --- a/src/commands/requirements-input.ts +++ b/src/commands/requirements-input.ts @@ -19,6 +19,7 @@ export function normalizeRequirementsInput( value: unknown, requestedTaskRef: TaskRef, now: Date = new Date(), + options: { allowIncomplete?: boolean } = {}, ): RequirementsLedgerV1 { if (isRecord(value) && 'schemaVersion' in value) { return parseRequirementsLedger(value); @@ -28,7 +29,7 @@ export function normalizeRequirementsInput( if (serialized === undefined) { throw new Error('requirements input must be valid JSON'); } - const semantic = parseSemanticRequirementsLedger(serialized); + const semantic = parseSemanticRequirementsLedger(serialized, options); return buildCanonicalRequirements(semantic, requestedTaskRef, now); } diff --git a/src/commands/workflow.ts b/src/commands/workflow.ts index 13ef56f..092156e 100644 --- a/src/commands/workflow.ts +++ b/src/commands/workflow.ts @@ -9,7 +9,10 @@ import { promoteV3Task, } from '../context/publish-promote.js'; import { reframeV3Workflow } from '../context/reframe.js'; -import { finalizeV3Requirements } from '../context/requirements-finalize.js'; +import { + finalizeV3Requirements, + saveV3RequirementsDraft, +} from '../context/requirements-finalize.js'; import { applyV3ReviewLedger } from '../context/review-remediation.js'; import { changeV3WorkflowScope } from '../context/scope-change.js'; import { @@ -1301,11 +1304,11 @@ async function workflowRequirementsV3( ): Promise { const task = args[0]; const action = args[1]; - if (!task || action !== 'finalize' || !options.file) { + if (!task || (action !== 'draft' && action !== 'finalize') || !options.file) { return printV3Error( options.json, 'MANCODE_REQUIREMENTS_ARGUMENT_INVALID', - 'Use: workflow requirements finalize --expected-revision --file .', + 'Use: workflow requirements --expected-revision --file .', EXIT_INVALID_ARG, ); } @@ -1314,7 +1317,7 @@ async function workflowRequirementsV3( return printV3Error( options.json, 'MANCODE_EXPECTED_REVISION_REQUIRED', - 'Requirements finalization requires --expected-revision .', + 'Requirements draft/finalization requires --expected-revision .', EXIT_INVALID_ARG, ); } @@ -1326,8 +1329,15 @@ async function workflowRequirementsV3( project.projectRoot, options.file, ); - const requirements = normalizeRequirementsInput(requirementsInput, taskRef); - const result = await finalizeV3Requirements({ + const requirements = normalizeRequirementsInput( + requirementsInput, + taskRef, + new Date(), + { allowIncomplete: action === 'draft' }, + ); + const writeRequirements = + action === 'draft' ? saveV3RequirementsDraft : finalizeV3Requirements; + const result = await writeRequirements({ projectRoot: project.projectRoot, taskRef, sessionId: session.sessionId, @@ -1351,7 +1361,7 @@ async function workflowRequirementsV3( v3ErrorCode(error, 'MANCODE_V3_REQUIREMENTS_FINALIZE_FAILED'), error instanceof Error ? error.message - : 'Unable to finalize mancode requirements.', + : `Unable to ${action === 'draft' ? 'save the mancode requirements draft' : 'finalize mancode requirements'}.`, ); } } diff --git a/src/context/requirements-finalize.ts b/src/context/requirements-finalize.ts index da50564..d698e57 100644 --- a/src/context/requirements-finalize.ts +++ b/src/context/requirements-finalize.ts @@ -53,6 +53,8 @@ export interface FinalizeV3RequirementsInput { now?: Date; } +export type SaveV3RequirementsDraftInput = FinalizeV3RequirementsInput; + export interface FinalizedV3Requirements { metadata: WorkflowMetadataV3; requirements: RequirementsLedgerV1; @@ -71,15 +73,42 @@ export interface FinalizedV3Requirements { */ export async function finalizeV3Requirements( input: FinalizeV3RequirementsInput, +): Promise { + return writeV3Requirements(input, 'finalize'); +} + +/** + * Persists an incomplete clarification ledger without claiming that its scope + * or coverage is confirmed. A later session can resume the TaskRef and read the + * open questions from the normal plan Context Pack. + */ +export async function saveV3RequirementsDraft( + input: SaveV3RequirementsDraftInput, +): Promise { + return writeV3Requirements(input, 'draft'); +} + +async function writeV3Requirements( + input: FinalizeV3RequirementsInput, + action: 'draft' | 'finalize', ): Promise { const taskRef = parseTaskRefValue(input.taskRef); const submitted = parseRequirementsLedger(input.requirements); if (!sameTaskRef(submitted.taskRef, taskRef)) { throw new Error('MANCODE_REQUIREMENTS_TASK_REF_MISMATCH'); } - if (submitted.status !== 'confirmed') { + if (action === 'finalize' && submitted.status !== 'confirmed') { throw new Error('MANCODE_REQUIREMENTS_CONFIRMATION_REQUIRED'); } + if (action === 'draft' && submitted.status !== 'draft') { + throw new Error('MANCODE_REQUIREMENTS_DRAFT_REQUIRED'); + } + if ( + action === 'draft' && + !submitted.blockingUnknowns.some((unknown) => unknown.status === 'open') + ) { + throw new Error('MANCODE_REQUIREMENTS_DRAFT_BLOCKER_REQUIRED'); + } const context = await openV3TaskOperation({ projectRoot: input.projectRoot, @@ -95,11 +124,12 @@ export async function finalizeV3Requirements( try { assertRequirementsFinalizeEligible(context.task.metadata); const timestamp = context.now.toISOString(); - const requirements = createFinalRequirements( + const requirements = createReplacementRequirements( context.task.requirements, submitted, context.operationId, timestamp, + action === 'draft' ? 'draft' : 'confirmed', ); const review = markTaskReviewStale( context.task.review, @@ -130,7 +160,7 @@ export async function finalizeV3Requirements( const taskHeadFence = nextTaskHeadFence(context, aggregate, timestamp); journal = await createTaskOperationJournal(context, { - type: 'requirements_finalize', + type: action === 'draft' ? 'requirements_draft' : 'requirements_finalize', action: taskRef.namespace === 'shared' ? 'shared_metadata_plan_mutation' @@ -271,17 +301,18 @@ function assertRequirementsFinalizeEligible( } } -function createFinalRequirements( +function createReplacementRequirements( previous: RequirementsLedgerV1, submitted: RequirementsLedgerV1, operationId: Ulid, updatedAt: string, + status: 'draft' | 'confirmed', ): RequirementsLedgerV1 { const draft: RequirementsLedgerV1 = { ...submitted, taskRef: previous.taskRef, revision: previous.revision + 1, - status: 'confirmed', + status, contentDigest: '', lastOperationId: operationId, updatedAt, @@ -310,7 +341,8 @@ function updateMetadata( lastOperationId: operationId, governance: { ...previous.governance, - requirementsStatus: 'ready', + requirementsStatus: + requirements.status === 'confirmed' ? 'ready' : 'needs_clarification', requirementsDigest: requirements.contentDigest, reviewStatus: review.status, reviewLedgerDigest: review.contentDigest, diff --git a/src/installers/v3-adapter.ts b/src/installers/v3-adapter.ts index f9cc7bc..f44f285 100644 --- a/src/installers/v3-adapter.ts +++ b/src/installers/v3-adapter.ts @@ -26,9 +26,14 @@ import type { PlatformName } from './registry.js'; export const V3_ADAPTER_VERSION = '3'; export const V3_ADAPTER_MANAGED_MARKER = - ''; + ''; export const V3_MODE_ENTRY_MANAGED_MARKER = + ''; + +const LEGACY_V3_ADAPTER_MANAGED_MARKER = + ''; +const LEGACY_V3_MODE_ENTRY_MANAGED_MARKER = ''; export const V3_ADAPTER_DIGEST_DOMAIN = 'mancode-adapter-digest-v1'; @@ -44,6 +49,7 @@ export const V3_MODE_NAMES = [ export type V3ModeName = (typeof V3_MODE_NAMES)[number]; const LEGACY_MODE_ENTRY_MANAGED_MARKERS = [ + LEGACY_V3_MODE_ENTRY_MANAGED_MARKER, '', '', '', @@ -70,12 +76,27 @@ const LEGACY_CLAUDE_SETTINGS_RAW_HINTS = [ ...LEGACY_CLAUDE_SKILL_PATHS, ] as const; -const V3_CODEX_START_MARKER = ''; -const V3_CODEX_END_MARKER = ''; -const V3_ZCODE_START_MARKER = ''; -const V3_ZCODE_END_MARKER = ''; -const V3_COPILOT_START_MARKER = ''; -const V3_COPILOT_END_MARKER = ''; +const CONTINUITY_CLAUDE_START_MARKER = + ''; +const CONTINUITY_CLAUDE_END_MARKER = ''; +const V3_CODEX_START_MARKER = ''; +const V3_CODEX_END_MARKER = ''; +const V3_ZCODE_START_MARKER = ''; +const V3_ZCODE_END_MARKER = ''; +const V3_COPILOT_START_MARKER = ''; +const V3_COPILOT_END_MARKER = ''; +const LEGACY_V3_CODEX_MARKERS = [ + '', + '', +] as const; +const LEGACY_V3_ZCODE_MARKERS = [ + '', + '', +] as const; +const LEGACY_V3_COPILOT_MARKERS = [ + '', + '', +] as const; const LEGACY_CODEX_START_MARKER = ''; const LEGACY_CODEX_END_MARKER = ''; const LEGACY_ZCODE_START_MARKER = ''; @@ -272,7 +293,13 @@ export async function planV3AdapterFiles( for (const target of V3_ADAPTER_FILE_TARGETS) { existing.set(target, await readAdapterTarget(root, target)); } - const agents = removeLegacyAgentsBlocks(existing.get('agents') ?? ''); + const agents = removeLegacyV3Block( + removeLegacyV3Block( + removeLegacyAgentsBlocks(existing.get('agents') ?? ''), + LEGACY_V3_CODEX_MARKERS, + ), + LEGACY_V3_ZCODE_MARKERS, + ); const nextAgents = replaceManagedV3BlockText( replaceManagedV3BlockText( agents, @@ -286,11 +313,16 @@ export async function planV3AdapterFiles( ); const legacyAdapterPlans = planLegacyAdapterRetirement(existing); const plans: V3AdapterFilePlan[] = [ - managedFilePlan( - 'claude-skill', - existing.get('claude-skill') ?? null, - renderClaudeSkill(renderV3Bootstrap('claude-code')), - ), + { + target: 'claude-skill', + beforeContent: existing.get('claude-skill') ?? null, + targetContent: replaceManagedV3BlockText( + existing.get('claude-skill') ?? '', + CONTINUITY_CLAUDE_START_MARKER, + CONTINUITY_CLAUDE_END_MARKER, + renderV3Bootstrap('claude-code'), + ), + }, managedFilePlan( 'cursor-rule', existing.get('cursor-rule') ?? null, @@ -305,7 +337,10 @@ export async function planV3AdapterFiles( target: 'copilot-instructions', beforeContent: existing.get('copilot-instructions') ?? null, targetContent: replaceManagedV3BlockText( - removeManagedBlock(existing.get('copilot-instructions') ?? ''), + removeLegacyV3Block( + removeManagedBlock(existing.get('copilot-instructions') ?? ''), + LEGACY_V3_COPILOT_MARKERS, + ), V3_COPILOT_START_MARKER, V3_COPILOT_END_MARKER, renderV3Bootstrap('copilot'), @@ -419,17 +454,36 @@ export async function applyV3AdapterFilePlan( } const target = v3AdapterTargetPath(root, plan.target); await assertAdapterPathSafe(root, target); + const retiredBootstrapPlatform = retiredBootstrapPlatformFor(plan.target); + if (retiredBootstrapPlatform !== null) { + for (const retired of retiredBootstrapSpecs( + root, + retiredBootstrapPlatform, + )) { + await assertAdapterPathSafe(root, retired.filePath); + } + } const current = await readAdapterTarget(root, plan.target); - if (current === plan.targetContent) return; + if (current === plan.targetContent) { + if (retiredBootstrapPlatform !== null) { + await removeRetiredBootstrapFiles(root, retiredBootstrapPlatform); + } + return; + } if (current !== plan.beforeContent) { throw new Error('MANCODE_V3_ADAPTER_TARGET_CONFLICT'); } await mkdir(path.dirname(target), { recursive: true }); await atomicWrite(target, plan.targetContent); + if (retiredBootstrapPlatform !== null) { + // The old bootstrap is non-authoritative and is retired only after its + // Continuity replacement is durable. A later repair safely retries this. + await removeRetiredBootstrapFiles(root, retiredBootstrapPlatform); + } } /** - * Renders a complete adapter candidate under V3 staging. Shadow integration + * Renders a complete adapter candidate under Continuity staging. Shadow integration * may inspect this exact replacement without changing a live managed file. */ export async function stageV3Adapter( @@ -444,7 +498,7 @@ export async function stageV3Adapter( '.mancode', 'staging', 'adapters', - 'v3', + 'continuity', platform, target, ); @@ -462,7 +516,7 @@ export async function stageV3Adapter( '.mancode', 'staging', 'adapters', - 'v3', + 'continuity', platform, modeTarget, ); @@ -492,9 +546,9 @@ export function v3AdapterTargetPath( if (legacyTarget !== null) return path.join(root, legacyTarget); switch (target) { case 'claude-skill': - return path.join(root, '.claude', 'skills', 'mancode-v3', 'SKILL.md'); + return path.join(root, 'CLAUDE.md'); case 'cursor-rule': - return path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'); + return path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'); case 'agents': return path.join(root, 'AGENTS.md'); case 'copilot-instructions': @@ -545,16 +599,20 @@ export async function installV3Adapter( const content = renderV3Bootstrap(platform); switch (platform) { case 'claude-code': - await writeManagedFile( - path.join(root, '.claude', 'skills', 'mancode-v3', 'SKILL.md'), - renderClaudeSkill(content), + await replaceManagedV3Block( + path.join(root, 'CLAUDE.md'), + CONTINUITY_CLAUDE_START_MARKER, + CONTINUITY_CLAUDE_END_MARKER, + content, ); + await removeRetiredBootstrapFiles(root, platform); break; case 'cursor': await writeManagedFile( - path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'), renderCursorRule(content), ); + await removeRetiredBootstrapFiles(root, platform); break; case 'codex': await replaceManagedV3Block( @@ -563,6 +621,7 @@ export async function installV3Adapter( V3_CODEX_END_MARKER, content, [ + LEGACY_V3_CODEX_MARKERS, [LEGACY_CODEX_START_MARKER, LEGACY_CODEX_END_MARKER], [LEGACY_ZCODE_START_MARKER, LEGACY_ZCODE_END_MARKER], ], @@ -574,7 +633,10 @@ export async function installV3Adapter( V3_COPILOT_START_MARKER, V3_COPILOT_END_MARKER, content, - [[LEGACY_CODEX_START_MARKER, LEGACY_CODEX_END_MARKER]], + [ + LEGACY_V3_COPILOT_MARKERS, + [LEGACY_CODEX_START_MARKER, LEGACY_CODEX_END_MARKER], + ], ); break; case 'zcode': @@ -584,6 +646,7 @@ export async function installV3Adapter( V3_ZCODE_END_MARKER, content, [ + LEGACY_V3_ZCODE_MARKERS, [LEGACY_CODEX_START_MARKER, LEGACY_CODEX_END_MARKER], [LEGACY_ZCODE_START_MARKER, LEGACY_ZCODE_END_MARKER], ], @@ -709,14 +772,18 @@ export async function removeV3Adapter( let preserveSharedModeEntries = false; switch (platform) { case 'claude-code': - await removeManagedFile( - path.join(root, '.claude', 'skills', 'mancode-v3', 'SKILL.md'), + await removeManagedV3Block( + path.join(root, 'CLAUDE.md'), + CONTINUITY_CLAUDE_START_MARKER, + CONTINUITY_CLAUDE_END_MARKER, ); + await removeRetiredBootstrapFiles(root, platform); break; case 'cursor': await removeManagedFile( - path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'), ); + await removeRetiredBootstrapFiles(root, platform); break; case 'codex': await removeManagedV3Block( @@ -724,10 +791,13 @@ export async function removeV3Adapter( V3_CODEX_START_MARKER, V3_CODEX_END_MARKER, ); - preserveSharedModeEntries = await managedBlockPresent( + await removeManagedV3Block( path.join(root, 'AGENTS.md'), - V3_ZCODE_START_MARKER, - V3_ZCODE_END_MARKER, + ...LEGACY_V3_CODEX_MARKERS, + ); + preserveSharedModeEntries = await anyManagedBlockPresent( + path.join(root, 'AGENTS.md'), + [[V3_ZCODE_START_MARKER, V3_ZCODE_END_MARKER], LEGACY_V3_ZCODE_MARKERS], ); break; case 'copilot': @@ -736,6 +806,10 @@ export async function removeV3Adapter( V3_COPILOT_START_MARKER, V3_COPILOT_END_MARKER, ); + await removeManagedV3Block( + path.join(root, '.github', 'copilot-instructions.md'), + ...LEGACY_V3_COPILOT_MARKERS, + ); break; case 'zcode': await removeManagedV3Block( @@ -743,10 +817,13 @@ export async function removeV3Adapter( V3_ZCODE_START_MARKER, V3_ZCODE_END_MARKER, ); - preserveSharedModeEntries = await managedBlockPresent( + await removeManagedV3Block( path.join(root, 'AGENTS.md'), - V3_CODEX_START_MARKER, - V3_CODEX_END_MARKER, + ...LEGACY_V3_ZCODE_MARKERS, + ); + preserveSharedModeEntries = await anyManagedBlockPresent( + path.join(root, 'AGENTS.md'), + [[V3_CODEX_START_MARKER, V3_CODEX_END_MARKER], LEGACY_V3_CODEX_MARKERS], ); break; } @@ -786,12 +863,18 @@ export function renderV3Bootstrap(platform: PlatformName): string { '- The compact status is the public mancode Continuity runtime view. In operator-facing narration, say `mancode` or `mancode Continuity`; never prefix a mode or action with a version label.', '- An explicitly invoked original `man`, `manba`, `manteam`, `manps`, or `mansolo` entry supplies its authorized action. Its mode-specific steps override conflicting generic no-task or mutation guidance below.', '- In particular, `manps` may run local health scans without an actor, session, or TaskRef. `mansolo` needs them only for an explicit governed handoff.', - '- If status has no `identity.actorId`, ask for a display name and run `mancode team identity create --name ""` before creating a session.', + '- Outside an explicitly invoked mode entry, treat an ordinary requested coding task as default Solo work. Ordinary Solo work requires no actor identity, session, TaskRef, or workflow; do not ask for a display name or create Continuity authority for it.', + "- Before editing in default Solo, inspect only the relevant project facts, implementation, tests, and contracts. A supplied instruction is not automatically sound: verify its factual assumptions and proposed solution against the repository and the operator's goal.", + '- If the goal and decision-changing requirements are clear, consistent with project evidence, and low risk, proceed with the narrowest useful change without ceremonial questions. Resolve repository-answerable unknowns yourself.', + '- When the goal is clear but requirements are incomplete, classify each remaining unknown as blocking, recommendable, or defaultable. Ask and wait only for blocking decisions that can materially change behavior, scope, acceptance, architecture, data, security, compatibility, or semantic ownership. For recommendable decisions, give bounded options and a clear recommendation. Use a default only when it is low-impact, reversible, consistent with repository conventions, and stated explicitly.', + "- If an explicit request conflicts with repository evidence or introduces a hard-risk change involving authentication, payment, sensitive data, deletion, migration, public APIs, untrusted input, concurrency, infrastructure, or another irreversible effect, stop before editing. Show the concrete conflict or impact, recommend the safer path, ask a focused confirmation or choice, and wait. Clarity never overrides safety or the operator's actual goal.", + '- A natural-language request explicitly asking for research, a plan, architecture, migration design, or formal acceptance authorizes the `man` planning path without a separate mode-confirmation question. For an ordinary implementation request whose blocking decision crosses modules or requires architecture, migration, semantic owner/source-of-truth, team coordination, or formal acceptance, recommend `/man`, explain why, and wait; never switch authority silently.', + '- For governed task work only, if status has no `identity.actorId`, ask for a display name and run `mancode team identity create --name ""` before creating a session.', '- If status reports `session`, reuse it. `task: null` and `MANCODE_TASK_REQUIRED` do not make a session stale.', `- ${sessionCreationGuidance} Pass its returned \`sessionId\` and matching client as \`${sessionArguments}\` to every later session command; an \`export\` inside one command tool does not persist to later command tools.`, - '- Outside an invoked original mode entry, if no current task and no task is explicitly supplied, report "no task bound" and stop. Do not probe workflow subcommands to work around `MANCODE_TASK_REQUIRED`.', + '- Outside an invoked original mode entry, if no coding, planning, diagnostic, or review task was requested and no TaskRef is explicitly supplied, report "no task bound" and stop. Do not probe workflow subcommands to work around `MANCODE_TASK_REQUIRED`.', '- Bootstrap discovery is read-only: before the operator explicitly requests task work, do not run `mancode init`, `mancode migrate`, `mancode workflow`, or inspect mancode installed package/source.', - `- With an existing or supplied task, read its Context Pack with \`mancode context show --purpose orient ${sessionArguments}\`; for anonymous diagnosis, include an explicit \`--task \`.`, + `- With an existing or explicitly supplied TaskRef, read its Context Pack with \`mancode context show --purpose orient ${sessionArguments}\`; for anonymous diagnosis, include an explicit \`--task \`. A plain-language Solo request is not a TaskRef and needs no Context Pack.`, '- After an operator explicitly requests task work, perform mutations only through `mancode workflow`, `mancode team`, and `mancode context` commands with their required revision and session arguments.', '- For a mode entry, request the matching Context Pack purpose: `plan`, `implement`, `review`, `verify`, or `handoff`.', '- Do not persist task, mode, or session state in this adapter file or any legacy state file.', @@ -931,8 +1014,11 @@ const V3_MODE_DEFINITIONS: Record< actions: [ '- For a read-only project orientation, inspect and answer directly; do not create governance records.', '- For a new task, run `mancode workflow create man "" --session `.', - '- Before writing requirements, inspect the relevant project facts and implementation, then run a clarity gate. Treat the request as clear enough only when the goal, in-scope/out-of-scope behavior, acceptance boundary, semantic owner/source of truth, and decision-changing constraints are supplied, verifiable from the repository, or explicitly recorded as safe defaults. Do not ask ceremonial questions or manufacture alternatives when the request is already clear.', + '- Before writing requirements, inspect the relevant project facts and implementation, then run a decision-readiness gate covering both clarity and soundness. Treat the request as ready only when the goal, in-scope/out-of-scope behavior, acceptance boundary, semantic owner/source of truth, and decision-changing constraints are supplied and consistent with evidence, verifiable from the repository, or explicitly recorded as safe defaults. A supplied instruction is not automatically correct. Do not ask ceremonial questions or manufacture alternatives when the request is already clear and sound.', + '- Classify unresolved decisions as blocking, recommendable, or defaultable. Ask and wait for blocking decisions; for recommendable decisions, present 2–3 bounded options with tradeoffs and one clear recommendation; use a default only when it is low-impact, reversible, consistent with repository conventions, and recorded with its reason.', '- If any unresolved ambiguity could change the goal, scope, user-visible behavior, acceptance, architecture, data, security, compatibility, owner, or source of truth, stop before requirements finalization, explain the missing decision, ask focused questions, and wait for the user answer. Ask in as many batches as needed, do not repeat answered questions, and never turn an unverified assumption into confirmed scope or confirmed coverage.', + '- Before waiting on a blocking answer, persist the known facts, partial decisions, and each open question with `mancode workflow requirements draft --file --expected-revision --session `. A draft may leave scope, coverage, technical decisions, or acceptance incomplete only while `blockingUnknowns` names the open decisions. After every answer, update the draft or finalize it so another session can resume the exact clarification state.', + '- If an explicit direction conflicts with repository evidence or creates a hard-risk authentication, payment, sensitive-data, deletion, migration, public-API, untrusted-input, concurrency, infrastructure, or irreversible change, stop before requirements finalization. Show the evidence and impact, recommend a safer path, ask for a focused confirmation or choice, and wait; clarity does not waive risk.', '- After the user answers, summarize the resolved requirements and any remaining defaults. Continue only when no decision-changing blocking unknown remains; otherwise keep the task in clarification and ask again.', '- Write requirements as semantic JSON with `version: 1`, a non-empty `goal`, non-empty `confirmedScope`, and the arrays `excludedScope`, `technicalDecisions`, `defaults`, and `blockingUnknowns`. Every array item must be a non-empty string; an array may be empty except `confirmedScope`, and `technicalDecisions` must be non-empty whenever `technical_stack` applies.', '- `coverage` must contain exactly one item for each dimension: `platform`, `core_scope`, `technical_stack`, `data_and_persistence`, `performance`, `compatibility`, and `security`. Each item has the shape `{ "dimension": "platform", "status": "confirmed", "rationale": "..." }`; `status` is exactly `confirmed`, `defaulted`, or `not_applicable`, and `rationale` is non-empty.', @@ -953,6 +1039,8 @@ const V3_MODE_DEFINITIONS: Record< contextPurpose: 'implement', actions: [ '- For a new diagnostic task, run `mancode workflow create manba "" --session `.', + '- Before changing code, establish the expected behavior from reproducible evidence, tests, documentation, history, or the current semantic owner. If the bug goal is clear but the correct behavior cannot be established, ask one focused question and wait instead of inventing product behavior.', + '- If the requested fix conflicts with repository evidence or crosses a hard-risk boundary, show the conflict and obtain a focused confirmation or route the decision through `/man`; do not treat an explicit but unsound fix instruction as sufficient evidence.', '- When this is a child investigation, add `--parent `; report and merge the typed outcome through the mancode child commands.', '- Change lifecycle only with `mancode workflow update --status --expected-revision --session ` and finish with `workflow complete` plus the typed `--outcome`.', ], @@ -964,7 +1052,8 @@ const V3_MODE_DEFINITIONS: Record< actions: [ '- Confirm team membership with `mancode team status`; join invited participants before assigning shared work.', '- For a new shared task, run `mancode workflow create manteam "" --visibility shared --coordination team --confirm-shared --session `.', - '- Apply the same conditional clarity gate as `man` before finalizing requirements: if the goal, scope, acceptance, owner/source of truth, and constraints are clear from the request or project facts, continue without ceremonial questions; if a decision-changing ambiguity remains, ask focused questions and wait before writing confirmed requirements.', + '- Apply the same decision-readiness gate as `man` before finalizing requirements: validate both clarity and soundness against project facts and team authority. If the goal, scope, acceptance, owner/source of truth, and constraints are clear and consistent, continue without ceremonial questions; if a decision-changing ambiguity, ownership conflict, or hard-risk direction remains, give evidence and a recommendation, ask focused questions, and wait before writing confirmed requirements.', + '- Persist unresolved team clarification through the same `workflow requirements draft --file ` command as `man`; do not leave ownership questions or partial answers only in chat history.', '- Use claims, checkpoints, sync, and handoffs through `mancode team`; never infer ownership from an adapter prompt.', '- Use the same mancode requirements, plan, verification, review, and completion commands as `man`, adding `--sync` whenever the active transport requires it.', ], @@ -984,7 +1073,8 @@ const V3_MODE_DEFINITIONS: Record< contextPurpose: 'implement', actions: [ '- Do not create or persist a legacy solo mode. Ordinary focused work needs no TaskRef; if the operator expects a governed task, use its bound TaskRef or report that none is bound.', - '- Before editing, assess whether the request is clear and narrow using the project facts. If it is clear enough, proceed without ceremonial questions. If an unresolved ambiguity could materially change behavior, scope, acceptance, data, security, or compatibility, stop and ask focused questions; wait for the answer instead of silently choosing.', + '- Before editing, assess both clarity and soundness using the project facts. If the request is clear, consistent, and low risk, proceed without ceremonial questions. Resolve repository-answerable unknowns yourself; classify the rest as blocking, recommendable, or defaultable. Ask and wait only when a blocking unknown could materially change behavior, scope, acceptance, data, security, compatibility, or ownership.', + '- A supplied implementation direction is not automatically safe. If it conflicts with repository evidence or involves authentication, payment, sensitive data, deletion, migration, public APIs, untrusted input, concurrency, infrastructure, or another irreversible effect, show the evidence and impact, recommend the safer path, ask for focused confirmation, and wait before editing.', '- If resolving the ambiguity requires architecture, semantic owner/source-of-truth, cross-module scope, migration, team coordination, or formal acceptance decisions, recommend `/man`, explain the trigger, and wait for the operator to choose; advice alone never changes mode or authority.', '- For a governed-to-solo transition, use `mancode workflow handoff --to solo --expected-revision --session `.', ], @@ -998,11 +1088,12 @@ async function renderV3AdapterCandidate( switch (platform) { case 'claude-code': { const existing = await readAdapterTarget(root, 'claude-skill'); - return managedFilePlan( - 'claude-skill', - existing, - renderClaudeSkill(renderV3Bootstrap(platform)), - ).targetContent; + return replaceManagedV3BlockText( + existing ?? '', + CONTINUITY_CLAUDE_START_MARKER, + CONTINUITY_CLAUDE_END_MARKER, + renderV3Bootstrap(platform), + ); } case 'cursor': { const existing = await readAdapterTarget(root, 'cursor-rule'); @@ -1015,7 +1106,10 @@ async function renderV3AdapterCandidate( case 'codex': { const existing = (await readAdapterTarget(root, 'agents')) ?? ''; return replaceManagedV3BlockText( - removeLegacyAgentsBlocks(existing), + removeLegacyV3Block( + removeLegacyAgentsBlocks(existing), + LEGACY_V3_CODEX_MARKERS, + ), V3_CODEX_START_MARKER, V3_CODEX_END_MARKER, renderV3Bootstrap(platform), @@ -1025,7 +1119,10 @@ async function renderV3AdapterCandidate( const existing = (await readAdapterTarget(root, 'copilot-instructions')) ?? ''; return replaceManagedV3BlockText( - removeManagedBlock(existing), + removeLegacyV3Block( + removeManagedBlock(existing), + LEGACY_V3_COPILOT_MARKERS, + ), V3_COPILOT_START_MARKER, V3_COPILOT_END_MARKER, renderV3Bootstrap(platform), @@ -1034,7 +1131,10 @@ async function renderV3AdapterCandidate( case 'zcode': { const existing = (await readAdapterTarget(root, 'agents')) ?? ''; return replaceManagedV3BlockText( - removeLegacyAgentsBlocks(existing), + removeLegacyV3Block( + removeLegacyAgentsBlocks(existing), + LEGACY_V3_ZCODE_MARKERS, + ), V3_ZCODE_START_MARKER, V3_ZCODE_END_MARKER, renderV3Bootstrap(platform), @@ -1043,19 +1143,6 @@ async function renderV3AdapterCandidate( } } -function renderClaudeSkill(content: string): string { - return [ - '---', - 'name: mancode-v3', - 'description: "Internal bootstrap for the original mancode mode entries."', - 'user-invocable: false', - '---', - '', - content, - '', - ].join('\n'); -} - function renderCursorRule(content: string): string { return [ '---', @@ -1127,11 +1214,12 @@ function planPlatformBootstrapUpgrade( case 'claude-code': desired.set( target, - managedFilePlan( - target, - current, - renderClaudeSkill(renderV3Bootstrap(platform)), - ).targetContent, + replaceManagedV3BlockText( + current ?? '', + CONTINUITY_CLAUDE_START_MARKER, + CONTINUITY_CLAUDE_END_MARKER, + renderV3Bootstrap(platform), + ), ); return; case 'cursor': @@ -1148,7 +1236,10 @@ function planPlatformBootstrapUpgrade( desired.set( target, replaceManagedV3BlockText( - removeLegacyAgentsBlocks(current ?? ''), + removeLegacyV3Block( + removeLegacyAgentsBlocks(current ?? ''), + LEGACY_V3_CODEX_MARKERS, + ), V3_CODEX_START_MARKER, V3_CODEX_END_MARKER, renderV3Bootstrap(platform), @@ -1159,7 +1250,10 @@ function planPlatformBootstrapUpgrade( desired.set( target, replaceManagedV3BlockText( - removeLegacyAgentsBlocks(current ?? ''), + removeLegacyV3Block( + removeLegacyAgentsBlocks(current ?? ''), + LEGACY_V3_ZCODE_MARKERS, + ), V3_ZCODE_START_MARKER, V3_ZCODE_END_MARKER, renderV3Bootstrap(platform), @@ -1170,7 +1264,10 @@ function planPlatformBootstrapUpgrade( desired.set( target, replaceManagedV3BlockText( - removeManagedBlock(current ?? ''), + removeLegacyV3Block( + removeManagedBlock(current ?? ''), + LEGACY_V3_COPILOT_MARKERS, + ), V3_COPILOT_START_MARKER, V3_COPILOT_END_MARKER, renderV3Bootstrap(platform), @@ -1185,13 +1282,14 @@ function primaryManagedTargetSpec( const target = targetFor(platform); switch (platform) { case 'claude-code': - return { - identity: 'claude-skill', + return embeddedManagedTargetSpec( target, - fileTarget: 'claude-skill', - expectedManagedContent: renderClaudeSkill(renderV3Bootstrap(platform)), - blockMarkers: null, - }; + 'claude-instructions#continuity', + 'claude-skill', + CONTINUITY_CLAUDE_START_MARKER, + CONTINUITY_CLAUDE_END_MARKER, + renderV3Bootstrap(platform), + ); case 'cursor': return { identity: 'cursor-rule', @@ -1390,7 +1488,11 @@ async function writeManagedFile( content: string, ): Promise { const existing = await readTextIfExists(filePath); - if (existing !== null && !existing.includes(V3_ADAPTER_MANAGED_MARKER)) { + if ( + existing !== null && + !existing.includes(V3_ADAPTER_MANAGED_MARKER) && + !existing.includes(LEGACY_V3_ADAPTER_MANAGED_MARKER) + ) { throw new Error('MANCODE_V3_ADAPTER_TARGET_USER_AUTHORED'); } await mkdir(path.dirname(filePath), { recursive: true }); @@ -1437,7 +1539,12 @@ async function assertV3ModeEntriesWritable( async function removeV3ModeEntry(filePath: string): Promise { const existing = await readTextIfExists(filePath); - if (existing?.includes(V3_MODE_ENTRY_MANAGED_MARKER)) { + if ( + existing?.includes(V3_MODE_ENTRY_MANAGED_MARKER) || + LEGACY_MODE_ENTRY_MANAGED_MARKERS.some((marker) => + existing?.includes(marker), + ) + ) { await rm(filePath, { force: true }); await removeDirectoryIfEmpty(path.dirname(filePath)); } @@ -1466,6 +1573,22 @@ async function removeManagedFile(filePath: string): Promise { } } +async function removeRetiredBootstrapFiles( + root: string, + platform: PlatformName, +): Promise { + if (platform !== 'claude-code' && platform !== 'cursor') return; + for (const retired of retiredBootstrapSpecs(root, platform)) { + await assertAdapterPathSafe(root, retired.filePath); + const existing = await readTextIfExists(retired.filePath); + if (!retired.managedMarkers.some((marker) => existing?.includes(marker))) { + continue; + } + await rm(retired.filePath, { force: true }); + await removeDirectoryIfEmpty(path.dirname(retired.filePath)); + } +} + async function replaceManagedV3Block( filePath: string, startMarker: string, @@ -1499,6 +1622,13 @@ function removeLegacyAgentsBlocks(existing: string): string { ); } +function removeLegacyV3Block( + existing: string, + markers: readonly [string, string], +): string { + return removeManagedBlock(existing, markers[0], markers[1]); +} + function replaceManagedV3BlockText( existing: string, startMarker: string, @@ -1520,7 +1650,8 @@ function managedFilePlan( ): V3AdapterFilePlan { if ( beforeContent !== null && - !beforeContent.includes(V3_ADAPTER_MANAGED_MARKER) + !beforeContent.includes(V3_ADAPTER_MANAGED_MARKER) && + !beforeContent.includes(LEGACY_V3_ADAPTER_MANAGED_MARKER) ) { throw new Error('MANCODE_V3_ADAPTER_TARGET_USER_AUTHORED'); } @@ -1960,6 +2091,11 @@ async function assertPlatformAdapterPathsSafe( v3AdapterTargetPath(root, target), ), ]); + if (platform === 'claude-code' || platform === 'cursor') { + for (const retired of retiredBootstrapSpecs(root, platform)) { + targets.add(retired.filePath); + } + } for (const target of targets) { await assertAdapterPathSafe(root, target); } @@ -2014,13 +2150,17 @@ async function removeManagedV3Block( } } -async function managedBlockPresent( +async function anyManagedBlockPresent( filePath: string, - startMarker: string, - endMarker: string, + markerPairs: readonly (readonly [string, string])[], ): Promise { const content = await readTextIfExists(filePath); - return content !== null && hasManagedBlock(content, startMarker, endMarker); + return ( + content !== null && + markerPairs.some(([startMarker, endMarker]) => + hasManagedBlock(content, startMarker, endMarker), + ) + ); } async function readAdapterBytesIfExists( @@ -2088,9 +2228,9 @@ async function atomicWrite(filePath: string, content: string): Promise { function targetFor(platform: PlatformName): string { switch (platform) { case 'claude-code': - return '.claude/skills/mancode-v3/SKILL.md'; + return 'CLAUDE.md'; case 'cursor': - return '.cursor/rules/mancode-v3.mdc'; + return '.cursor/rules/mancode-continuity.mdc'; case 'codex': case 'zcode': return 'AGENTS.md'; @@ -2099,6 +2239,54 @@ function targetFor(platform: PlatformName): string { } } +function retiredBootstrapPlatformFor( + target: V3AdapterFileTarget, +): 'claude-code' | 'cursor' | null { + if (target === 'claude-skill') return 'claude-code'; + if (target === 'cursor-rule') return 'cursor'; + return null; +} + +function retiredBootstrapSpecs( + root: string, + platform: 'claude-code' | 'cursor', +): Array<{ filePath: string; managedMarkers: readonly string[] }> { + const managedMarkers = [ + LEGACY_V3_ADAPTER_MANAGED_MARKER, + V3_ADAPTER_MANAGED_MARKER, + ] as const; + if (platform === 'claude-code') { + return [ + { + filePath: path.join( + root, + '.claude', + 'skills', + 'mancode-v3', + 'SKILL.md', + ), + managedMarkers, + }, + { + filePath: path.join( + root, + '.claude', + 'skills', + 'mancode-continuity', + 'SKILL.md', + ), + managedMarkers, + }, + ]; + } + return [ + { + filePath: path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + managedMarkers, + }, + ]; +} + function platformLabelFor(platform: PlatformName): string { switch (platform) { case 'claude-code': diff --git a/src/runtime/operation-definition.ts b/src/runtime/operation-definition.ts index 1e02417..f37ac68 100644 --- a/src/runtime/operation-definition.ts +++ b/src/runtime/operation-definition.ts @@ -43,6 +43,10 @@ export const OPERATION_AUTHORIZATION_ACTIONS: Record< > = { workflow_create: ['local_workflow_mutation', 'shared_create_publish_promote'], workflow_update: ['local_workflow_mutation', 'shared_metadata_plan_mutation'], + requirements_draft: [ + 'local_workflow_mutation', + 'shared_metadata_plan_mutation', + ], requirements_finalize: [ 'local_workflow_mutation', 'shared_metadata_plan_mutation', @@ -178,6 +182,24 @@ export const OPERATION_DEFINITIONS: Record< commit('commit', ['task_head:', 'task:'], ['task:']), ], ), + requirements_draft: definition( + 'requirements_draft', + 'update-metadata', + true, + false, + [ + prepare('validate', ['task:'], ['task:']), + write('write-requirements', ['requirements:', 'task:'], ['task:']), + write( + 'mark-review-verification-stale', + ['review:', 'verification:', 'task:'], + ['task:'], + ), + write('update-metadata', ['task:'], ['task:']), + write('update-task-head-fence', ['task_head:', 'task:'], ['task:']), + commit('commit', ['task_head:', 'task:'], ['task:']), + ], + ), requirements_finalize: definition( 'requirements_finalize', 'update-metadata', diff --git a/src/runtime/operation-journal.ts b/src/runtime/operation-journal.ts index 67bfebb..1c7b41a 100644 --- a/src/runtime/operation-journal.ts +++ b/src/runtime/operation-journal.ts @@ -12,6 +12,7 @@ import { export type OperationType = | 'workflow_create' | 'workflow_update' + | 'requirements_draft' | 'requirements_finalize' | 'plan_revision' | 'review_remediation' @@ -85,6 +86,7 @@ export interface OperationTransitionOptions { const OPERATION_TYPES = new Set([ 'workflow_create', 'workflow_update', + 'requirements_draft', 'requirements_finalize', 'plan_revision', 'review_remediation', diff --git a/src/system/requirements-ledger.ts b/src/system/requirements-ledger.ts index 9561c82..295fe84 100644 --- a/src/system/requirements-ledger.ts +++ b/src/system/requirements-ledger.ts @@ -54,7 +54,10 @@ export const REQUIREMENT_DIMENSIONS: RequirementDimension[] = [ 'security', ]; -export function parseRequirementsLedger(raw: string): RequirementsLedger { +export function parseRequirementsLedger( + raw: string, + options: { allowIncomplete?: boolean } = {}, +): RequirementsLedger { let value: unknown; try { value = JSON.parse(raw); @@ -108,18 +111,22 @@ export function parseRequirementsLedger(raw: string): RequirementsLedger { const missingDimensions = REQUIREMENT_DIMENSIONS.filter( (dimension) => !coverageDimensions.has(dimension), ); - if (missingDimensions.length > 0) { + if (!options.allowIncomplete && missingDimensions.length > 0) { throw new Error( `requirements coverage is missing: ${missingDimensions.join(', ')}`, ); } - if ((value.confirmedScope as string[]).length === 0) { + if ( + !options.allowIncomplete && + (value.confirmedScope as string[]).length === 0 + ) { throw new Error('requirements confirmedScope must not be empty'); } const stackCoverage = coverage.find( (item) => item.dimension === 'technical_stack', ); if ( + !options.allowIncomplete && stackCoverage?.status !== 'not_applicable' && (value.technicalDecisions as string[]).length === 0 ) { @@ -129,7 +136,7 @@ export function parseRequirementsLedger(raw: string): RequirementsLedger { } if ( !Array.isArray(value.acceptanceCriteria) || - value.acceptanceCriteria.length === 0 + (!options.allowIncomplete && value.acceptanceCriteria.length === 0) ) { throw new Error('requirements need at least one acceptance criterion'); } @@ -157,7 +164,10 @@ export function parseRequirementsLedger(raw: string): RequirementsLedger { method: item.method, }; }); - if (!acceptanceCriteria.some((item) => item.required)) { + if ( + !options.allowIncomplete && + !acceptanceCriteria.some((item) => item.required) + ) { throw new Error( 'requirements need at least one required acceptance criterion', ); diff --git a/tests/adapter-upgrade-contracts.test.ts b/tests/adapter-upgrade-contracts.test.ts index b55731e..35c9c7c 100644 --- a/tests/adapter-upgrade-contracts.test.ts +++ b/tests/adapter-upgrade-contracts.test.ts @@ -121,7 +121,7 @@ describe('adapter managed-content digest and upgrade', () => { await writeFile( agentsPath, - original.replace('', ''), + original.replace('', ''), ); await expect(inspectV3Adapter(root, 'codex')).resolves.toMatchObject({ status: 'stale', @@ -154,7 +154,7 @@ describe('adapter managed-content digest and upgrade', () => { }); it('stages a dry-run without publishing live targets, then commits explicitly', async () => { - const live = path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'); + const live = path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'); const preview = await upgradeV3Adapters({ projectRoot: root, platforms: ['cursor'], @@ -210,7 +210,10 @@ describe('adapter managed-content digest and upgrade', () => { }), ).rejects.toThrow('MANCODE_EXPLICIT_CONFIRMATION_REQUIRED'); await expect( - readFile(path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), 'utf8'), + readFile( + path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'), + 'utf8', + ), ).rejects.toThrow(); await expect( readFile( @@ -223,7 +226,7 @@ describe('adapter managed-content digest and upgrade', () => { operationId, '.cursor', 'rules', - 'mancode-v3.mdc', + 'mancode-continuity.mdc', ), 'utf8', ), @@ -241,7 +244,7 @@ describe('adapter managed-content digest and upgrade', () => { }); await mkdir(path.join(root, '.cursor', 'rules'), { recursive: true }); await writeFile( - path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'), '# User-owned cursor rule\n', ); @@ -257,6 +260,171 @@ describe('adapter managed-content digest and upgrade', () => { ).rejects.toThrow(); }); + it('migrates managed V3 bootstrap paths and markers to Continuity', async () => { + const legacyRule = path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'); + const legacyMode = path.join(root, '.cursor', 'commands', 'man.md'); + await mkdir(path.dirname(legacyRule), { recursive: true }); + await mkdir(path.dirname(legacyMode), { recursive: true }); + await writeFile( + legacyRule, + '\n# old bootstrap\n', + ); + await writeFile( + legacyMode, + '\n# old mode\n', + ); + + const operationId = id(15); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + dryRun: true, + operationId, + now: NOW, + }); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + explicitConfirmation: true, + sessionId, + operationId, + now: NOW, + }); + + await expect(readFile(legacyRule, 'utf8')).rejects.toThrow(); + await expect(readFile(legacyMode, 'utf8')).resolves.toContain( + 'mancode:continuity-mode-entry', + ); + await expect(inspectV3Adapter(root, 'cursor')).resolves.toMatchObject({ + status: 'ready', + target: '.cursor/rules/mancode-continuity.mdc', + }); + + const legacyClaudeSkill = path.join( + root, + '.claude', + 'skills', + 'mancode-v3', + 'SKILL.md', + ); + await mkdir(path.dirname(legacyClaudeSkill), { recursive: true }); + await writeFile( + legacyClaudeSkill, + '\n# old bootstrap\n', + ); + const retiredContinuitySkill = path.join( + root, + '.claude', + 'skills', + 'mancode-continuity', + 'SKILL.md', + ); + await mkdir(path.dirname(retiredContinuitySkill), { recursive: true }); + await writeFile( + retiredContinuitySkill, + '\n# retired bootstrap\n', + ); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['claude-code'], + dryRun: true, + operationId: id(19), + now: NOW, + }); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['claude-code'], + explicitConfirmation: true, + sessionId, + operationId: id(19), + now: NOW, + }); + await expect(readFile(legacyClaudeSkill, 'utf8')).rejects.toThrow(); + await expect(readFile(retiredContinuitySkill, 'utf8')).rejects.toThrow(); + await expect(inspectV3Adapter(root, 'claude-code')).resolves.toMatchObject({ + status: 'ready', + target: 'CLAUDE.md', + }); + }); + + it('preserves a user-authored file at the retired V3 path', async () => { + const legacyRule = path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'); + await mkdir(path.dirname(legacyRule), { recursive: true }); + await writeFile(legacyRule, '# User-owned legacy-named cursor rule\n'); + + const operationId = id(16); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + dryRun: true, + operationId, + now: NOW, + }); + await upgradeV3Adapters({ + projectRoot: root, + platforms: ['cursor'], + explicitConfirmation: true, + sessionId, + operationId, + now: NOW, + }); + + await expect(readFile(legacyRule, 'utf8')).resolves.toBe( + '# User-owned legacy-named cursor rule\n', + ); + await expect(inspectV3Adapter(root, 'cursor')).resolves.toMatchObject({ + status: 'ready', + }); + }); + + it.each([ + ['codex', 'AGENTS.md', 'codex'], + ['zcode', 'AGENTS.md', 'zcode'], + ['copilot', '.github/copilot-instructions.md', 'copilot'], + ] as const)( + 'replaces legacy embedded V3 markers for %s without touching user content', + async (platform, relativeTarget, markerName) => { + const target = path.join(root, relativeTarget); + await mkdir(path.dirname(target), { recursive: true }); + await writeFile( + target, + [ + '# User instructions', + ``, + '# old managed bootstrap', + ``, + '', + ].join('\n'), + ); + + const operationId = id(17); + await upgradeV3Adapters({ + projectRoot: root, + platforms: [platform], + dryRun: true, + operationId, + now: NOW, + }); + await upgradeV3Adapters({ + projectRoot: root, + platforms: [platform], + explicitConfirmation: true, + sessionId, + operationId, + now: NOW, + }); + + const content = await readFile(target, 'utf8'); + expect(content).toContain('# User instructions'); + expect(content).not.toContain(`mancode:v3:${markerName}`); + expect( + content.match( + new RegExp(`mancode:continuity:${markerName}:start`, 'g'), + ), + ).toHaveLength(1); + }, + ); + it('upgrades all platforms while journaling shared targets only once', async () => { await upgradeV3Adapters({ projectRoot: root, @@ -286,8 +454,8 @@ describe('adapter managed-content digest and upgrade', () => { upgraded.filePlans.filter((plan) => plan.target === 'agents-mode-man'), ).toHaveLength(1); const agents = await readFile(path.join(root, 'AGENTS.md'), 'utf8'); - expect(agents).toContain(''); - expect(agents).toContain(''); + expect(agents).toContain(''); + expect(agents).toContain(''); }); it('recovers every five-platform target from its write-before and write-after boundary', async () => { diff --git a/tests/beta-gate-contracts.test.ts b/tests/beta-gate-contracts.test.ts index 4e6622e..3c449c0 100644 --- a/tests/beta-gate-contracts.test.ts +++ b/tests/beta-gate-contracts.test.ts @@ -45,7 +45,7 @@ describe('V3 Beta gate', () => { }); it('refuses Beta while real-host spike evidence and adapters are missing', async () => { - await rm(path.join(root, '.cursor', 'rules', 'mancode-v3.mdc')); + await rm(path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc')); const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); try { expect( diff --git a/tests/migrate-contracts.test.ts b/tests/migrate-contracts.test.ts index ec465f5..a93d1db 100644 --- a/tests/migrate-contracts.test.ts +++ b/tests/migrate-contracts.test.ts @@ -255,8 +255,8 @@ describe('legacy migration stage contract', () => { expect(migratedAgents).toContain('# User instructions'); expect(migratedAgents).not.toContain('Legacy mancode instructions'); expect(migratedAgents).not.toContain('Legacy ZCode mancode instructions'); - expect(migratedAgents).toContain('mancode:v3:codex:start'); - expect(migratedAgents).toContain('mancode:v3:zcode:start'); + expect(migratedAgents).toContain('mancode:continuity:codex:start'); + expect(migratedAgents).toContain('mancode:continuity:zcode:start'); const migratedClaudeSettings = await readFile( path.join(root, '.claude', 'settings.json'), 'utf8', diff --git a/tests/operation-definition-contracts.test.ts b/tests/operation-definition-contracts.test.ts index 7874dde..a59a01a 100644 --- a/tests/operation-definition-contracts.test.ts +++ b/tests/operation-definition-contracts.test.ts @@ -11,7 +11,7 @@ const ID = '01JZ4B6W5Z0A1B2C3D4E5F6G7H'; describe('machine-readable operation definitions', () => { it('gives every hard-consistency operation steps, a visible commit point, and crash recovery fixtures', () => { - expect(Object.keys(OPERATION_DEFINITIONS)).toHaveLength(26); + expect(Object.keys(OPERATION_DEFINITIONS)).toHaveLength(27); for (const definition of Object.values(OPERATION_DEFINITIONS)) { expect(definition.steps.at(-1)).toMatchObject({ id: 'commit', diff --git a/tests/v3-adapter-contracts.test.ts b/tests/v3-adapter-contracts.test.ts index 9ef6046..0f194c7 100644 --- a/tests/v3-adapter-contracts.test.ts +++ b/tests/v3-adapter-contracts.test.ts @@ -112,7 +112,7 @@ describe('V3 adapter bootstrap integration', () => { }), ).toBe(0); const cursorRule = await readFile( - path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), + path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'), 'utf8', ); expect(cursorRule).toContain('# mancode bootstrap'); @@ -169,6 +169,30 @@ describe('V3 adapter bootstrap integration', () => { expect(bootstrap).toContain( 'In operator-facing narration, say `mancode`', ); + expect(bootstrap).toContain( + 'treat an ordinary requested coding task as default Solo work', + ); + expect(bootstrap).toContain( + 'Ordinary Solo work requires no actor identity, session, TaskRef, or workflow', + ); + expect(bootstrap).toContain( + 'A supplied instruction is not automatically sound', + ); + expect(bootstrap).toContain( + 'classify each remaining unknown as blocking, recommendable, or defaultable', + ); + expect(bootstrap).toContain( + 'hard-risk change involving authentication, payment, sensitive data, deletion, migration, public APIs, untrusted input, concurrency, infrastructure', + ); + expect(bootstrap).toContain( + 'explicitly asking for research, a plan, architecture, migration design, or formal acceptance authorizes the `man` planning path', + ); + expect(bootstrap).toContain( + 'For governed task work only, if status has no `identity.actorId`', + ); + expect(bootstrap).toContain( + 'A plain-language Solo request is not a TaskRef and needs no Context Pack.', + ); expect(bootstrap).toContain('mancode team identity create --name'); expect(bootstrap).toContain( '`task: null` and `MANCODE_TASK_REQUIRED` do not make a session stale', @@ -202,7 +226,8 @@ describe('V3 adapter bootstrap integration', () => { ), ).toBe(true); if (platform === 'claude-code') { - expect(bootstrap).toContain('user-invocable: false'); + expect(installed.target).toBe('CLAUDE.md'); + expect(bootstrap).toContain('mancode:continuity:claude:start'); } for (const mode of V3_MODE_NAMES) { @@ -266,19 +291,39 @@ describe('V3 adapter bootstrap integration', () => { expect(entry).toContain( "clears this session's active workflow pointer", ); - expect(entry).toContain('run a clarity gate'); + expect(entry).toContain('run a decision-readiness gate'); + expect(entry).toContain( + 'Do not ask ceremonial questions or manufacture alternatives when the request is already clear and sound.', + ); expect(entry).toContain( - 'Do not ask ceremonial questions or manufacture alternatives when the request is already clear.', + 'Classify unresolved decisions as blocking, recommendable, or defaultable.', ); + expect(entry).toContain('2–3 bounded options'); expect(entry).toContain( 'stop before requirements finalization, explain the missing decision, ask focused questions, and wait for the user answer.', ); expect(entry).toContain( 'never turn an unverified assumption into confirmed scope or confirmed coverage.', ); + expect(entry).toContain( + 'workflow requirements draft --file ', + ); + expect(entry).toContain( + 'another session can resume the exact clarification state', + ); expect(entry).toContain( 'summarize the resolved requirements and any remaining defaults', ); + expect(entry).toContain('clarity does not waive risk'); + } + if (mode === 'manba') { + expect(entry).toContain( + 'establish the expected behavior from reproducible evidence', + ); + expect(entry).toContain( + 'ask one focused question and wait instead of inventing product behavior', + ); + expect(entry).toContain('explicit but unsound fix instruction'); } if (mode === 'manps') { expect(entry).toContain( @@ -295,21 +340,25 @@ describe('V3 adapter bootstrap integration', () => { 'Only an explicit governed handoff mutation requires', ); expect(entry).toContain( - 'assess whether the request is clear and narrow using the project facts', + 'assess both clarity and soundness using the project facts', ); expect(entry).toContain( - 'If an unresolved ambiguity could materially change behavior, scope, acceptance, data, security, or compatibility, stop and ask focused questions', + 'classify the rest as blocking, recommendable, or defaultable', ); + expect(entry).toContain('A supplied implementation direction'); expect(entry).toContain( 'recommend `/man`, explain the trigger, and wait for the operator to choose', ); } if (mode === 'manteam') { expect(entry).toContain( - 'same conditional clarity gate as `man` before finalizing requirements', + 'same decision-readiness gate as `man` before finalizing requirements', ); expect(entry).toContain( - 'if a decision-changing ambiguity remains, ask focused questions and wait before writing confirmed requirements.', + 'ownership conflict, or hard-risk direction remains', + ); + expect(entry).toContain( + 'do not leave ownership questions or partial answers only in chat history', ); } if (mode === 'man' || mode === 'manba' || mode === 'manteam') { @@ -347,7 +396,24 @@ describe('V3 adapter bootstrap integration', () => { expect(await init(root, { v3: true, platform: 'codex' })).toBe(1); const agents = await readFile(path.join(root, 'AGENTS.md'), 'utf8'); expect(agents).toContain('# User instructions'); - expect(agents.match(/mancode:v3:codex:start/g)).toHaveLength(1); + expect(agents.match(/mancode:continuity:codex:start/g)).toHaveLength(1); + }); + + it('keeps the Claude bootstrap always loaded without replacing user memory', async () => { + const claudeMemory = path.join(root, 'CLAUDE.md'); + await writeFile(claudeMemory, '# User project memory\n\nKeep this rule.\n'); + + await installV3Adapter(root, 'claude-code'); + await installV3Adapter(root, 'claude-code'); + const installed = await readFile(claudeMemory, 'utf8'); + expect(installed).toContain('# User project memory'); + expect(installed).toContain('Keep this rule.'); + expect(installed.match(/mancode:continuity:claude:start/g)).toHaveLength(1); + + await removeV3Adapter(root, 'claude-code'); + const removed = await readFile(claudeMemory, 'utf8'); + expect(removed).toContain('# User project memory'); + expect(removed).not.toContain('mancode:continuity:claude'); }); it('stages the bootstrap and every original mode entry without changing live files', async () => { @@ -370,7 +436,10 @@ describe('V3 adapter bootstrap integration', () => { readFile(path.join(root, '.cursor', 'commands', 'man.md'), 'utf8'), ).rejects.toThrow(); await expect( - readFile(path.join(root, '.cursor', 'rules', 'mancode-v3.mdc'), 'utf8'), + readFile( + path.join(root, '.cursor', 'rules', 'mancode-continuity.mdc'), + 'utf8', + ), ).rejects.toThrow(); }); @@ -619,7 +688,7 @@ describe('V3 adapter bootstrap integration', () => { '.mancode', 'staging', 'adapters', - 'v3', + 'continuity', 'codex', 'AGENTS.md', ), diff --git a/tests/v3-command-contracts.test.ts b/tests/v3-command-contracts.test.ts index a960583..52c308a 100644 --- a/tests/v3-command-contracts.test.ts +++ b/tests/v3-command-contracts.test.ts @@ -767,6 +767,135 @@ describe('V3 CLI command contracts', () => { } }); + it('persists incomplete clarification and resumes it from another session', async () => { + const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); + const errors = vi.spyOn(console, 'error').mockImplementation(() => {}); + try { + await teamIdentityCreate(root, { name: 'Fixture User', json: true }); + await contextSessionNew(root, { client: 'fixture', json: true }); + const firstSessionId = ( + JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + } + ).session.sessionId; + await workflow( + root, + 'create', + ['man', 'Choose the durable notification owner.'], + { + session: firstSessionId, + client: 'fixture', + json: true, + }, + ); + const created = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + taskRef: TaskRef; + }; + const task = `${created.taskRef.namespace}:${created.taskRef.taskId}`; + const draftPath = path.join(root, 'requirements-draft.json'); + await writeFile( + draftPath, + `${JSON.stringify( + { + version: 1, + goal: 'Deliver durable notifications.', + confirmedScope: [], + excludedScope: [], + technicalDecisions: [], + defaults: [], + blockingUnknowns: [ + 'Choose whether the database or queue owns delivery state.', + ], + coverage: [], + acceptanceCriteria: [], + }, + null, + 2, + )}\n`, + ); + + expect( + await workflow(root, 'requirements', [task, 'draft'], { + session: firstSessionId, + client: 'fixture', + expectedRevision: '1', + file: draftPath, + json: true, + }), + ).toBe(0); + const saved = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + metadata: { + revision: number; + governance: { requirementsStatus: string }; + }; + requirements: RequirementsLedgerV1; + operation: { type: string; state: string }; + }; + expect(saved).toMatchObject({ + metadata: { + revision: 2, + governance: { requirementsStatus: 'needs_clarification' }, + }, + requirements: { + status: 'draft', + blockingUnknowns: [ + { + statement: + 'Choose whether the database or queue owns delivery state.', + status: 'open', + }, + ], + }, + operation: { type: 'requirements_draft', state: 'committed' }, + }); + + await contextSessionNew(root, { client: 'fixture', json: true }); + const secondSessionId = ( + JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + } + ).session.sessionId; + expect(secondSessionId).not.toBe(firstSessionId); + expect( + await contextResume(root, task, { + session: secondSessionId, + client: 'fixture', + json: true, + }), + ).toBe(0); + expect( + await contextShow(root, { + task, + session: secondSessionId, + client: 'fixture', + purpose: 'plan', + level: 'task', + json: true, + }), + ).toBe(0); + const resumed = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + pack: { + governance: { + requirements: RequirementsLedgerV1; + }; + }; + }; + expect(resumed.pack.governance.requirements).toMatchObject({ + status: 'draft', + blockingUnknowns: [ + { + statement: + 'Choose whether the database or queue owns delivery state.', + status: 'open', + }, + ], + }); + } finally { + logs.mockRestore(); + errors.mockRestore(); + } + }); + it('requires reframe concurrency inputs and returns the committed JSON contract', async () => { const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); const errors = vi.spyOn(console, 'error').mockImplementation(() => {}); diff --git a/tests/v3-requirements-finalize-contracts.test.ts b/tests/v3-requirements-finalize-contracts.test.ts index 9c114e8..30a3b2f 100644 --- a/tests/v3-requirements-finalize-contracts.test.ts +++ b/tests/v3-requirements-finalize-contracts.test.ts @@ -8,7 +8,10 @@ import { initializeV3Project } from '../src/commands/v3-init.js'; import { createV3Checkpoint } from '../src/context/checkpoint-create.js'; import { type Ulid, createUlid } from '../src/context/ids.js'; import { reviseV3Plan } from '../src/context/plan-revision.js'; -import { finalizeV3Requirements } from '../src/context/requirements-finalize.js'; +import { + finalizeV3Requirements, + saveV3RequirementsDraft, +} from '../src/context/requirements-finalize.js'; import { REQUIREMENT_DIMENSIONS } from '../src/context/requirements-ledger.js'; import { type RequirementsLedgerV1, @@ -157,6 +160,116 @@ describe('V3 requirements finalization operation', () => { ).rejects.toThrow('MANCODE_EXPECTED_REVISION_CONFLICT'); }); + it('requires an open blocker for an incomplete clarification draft', async () => { + const { sessionId } = await bootstrap(root, false, false); + const created = await createV3Workflow({ + projectRoot: root, + task: 'Persist an incomplete clarification safely.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(14), + operationId: id(15), + now: NOW, + }); + const invalid = { + ...clarificationDraft(created.requirements, created.taskRef), + blockingUnknowns: [], + }; + + await expect( + saveV3RequirementsDraft({ + projectRoot: root, + taskRef: created.taskRef, + sessionId, + expectedTaskRevision: 1, + requirements: { + ...invalid, + contentDigest: requirementsLedgerDigest(invalid), + }, + operationId: id(16), + now: NOW, + }), + ).rejects.toThrow('MANCODE_REQUIREMENTS_DRAFT_BLOCKER_REQUIRED'); + }); + + it('repairs or aborts an actual requirements draft at every declared crash point', async () => { + const fixtures = OPERATION_CRASH_FIXTURES.requirements_draft; + for (const [index, fixture] of fixtures.entries()) { + const caseRoot = path.join(root, `requirements-draft-crash-${index}`); + await mkdir(caseRoot); + const { sessionId } = await bootstrap(caseRoot, false, false); + const created = await createV3Workflow({ + projectRoot: caseRoot, + task: 'Resume clarification after an interrupted draft write.', + workflowMode: 'man', + sessionId, + client: 'vitest', + taskId: id(17), + operationId: id(18), + now: NOW, + }); + const operationId = id(120 + index); + + await expect( + withOperationCrashInjectionForTesting(fixture, () => + saveV3RequirementsDraft({ + projectRoot: caseRoot, + taskRef: created.taskRef, + sessionId, + expectedTaskRevision: created.metadata.revision, + requirements: clarificationDraft( + created.requirements, + created.taskRef, + ), + operationId, + now: NOW, + }), + ), + ).rejects.toThrow('MANCODE_TEST_OPERATION_CRASH_INJECTED'); + + const recovered = await executeOperationRecovery({ + projectRoot: caseRoot, + operationId, + actorId: id(4), + sessionId, + now: NOW, + }); + if (fixture.expectedRecovery === 'safe_abort') { + expect(recovered).toMatchObject({ + state: 'aborted', + journal: { state: 'aborted' }, + }); + } else if (fixture.crashAfter === 'commit') { + expect(recovered).toMatchObject({ + state: 'already_terminal', + journal: { state: 'committed' }, + }); + } else { + expect(recovered).toMatchObject({ + state: 'repaired', + journal: { state: 'committed' }, + }); + } + + const persisted = await new V3ContextStore(caseRoot).readTaskSnapshot( + created.taskRef, + ); + if (fixture.expectedRecovery === 'safe_abort') { + expect(persisted.requirements.revision).toBe(1); + } else { + expect(persisted).toMatchObject({ + metadata: { + revision: 2, + governance: { requirementsStatus: 'needs_clarification' }, + }, + requirements: { revision: 2, status: 'draft' }, + }); + expect(persisted.aggregateError).toBeNull(); + } + } + }); + it('requires the shared task-head fence and advances it with the aggregate', async () => { const { sessionId } = await bootstrap(root, true, true); const created = await createV3Workflow({ @@ -898,6 +1011,41 @@ function finalizedRequirements( }); } +function clarificationDraft( + previous: RequirementsLedgerV1, + taskRef: RequirementsLedgerV1['taskRef'], +): RequirementsLedgerV1 { + const draft: RequirementsLedgerV1 = { + ...previous, + taskRef, + revision: 99, + status: 'draft', + goal: 'Preserve the known goal while clarification remains open.', + functionalScope: { inScope: [], outOfScope: [] }, + technicalDecisions: [], + defaults: [], + coverage: [], + requirements: [], + acceptanceCriteria: [], + blockingUnknowns: [ + { + displayId: 'U-1', + legacyId: null, + unknownId: id(63), + statement: 'Choose the semantic owner before implementation.', + status: 'open', + }, + ], + contentDigest: '', + lastOperationId: id(64), + updatedAt: NOW.toISOString(), + }; + return parseRequirementsLedger({ + ...draft, + contentDigest: requirementsLedgerDigest(draft), + }); +} + async function bootstrap( projectRoot: string, withGit: boolean, From 91caac8f9056bc6c4788944f76b5f8a5e55dd21c Mon Sep 17 00:00:00 2001 From: whitelonng Date: Wed, 22 Jul 2026 23:19:45 +0800 Subject: [PATCH 6/6] fix: align release gates with explicit sessions --- README.en.md | 7 +- README.md | 4 +- docs/12-lifecycle.md | 4 +- docs/engineering.md | 2 +- docs/planning-governance-evolution.md | 20 +- docs/platform-adapters.md | 15 + docs/release-acceptance.md | 23 +- package.json | 1 + scripts/release-check.mjs | 317 +++++++++++++++++++ scripts/windows-smoke.mjs | 2 + src/cli.ts | 3 +- src/commands/context.ts | 75 ++++- src/runtime/platform-spike-store.ts | 2 +- src/runtime/platform-spike.ts | 199 +++++++++--- tests/beta-gate-contracts.test.ts | 9 +- tests/cli-v3-surface-contracts.test.ts | 1 + tests/platform-spike-contracts.test.ts | 69 +++- tests/platform-spike-store-contracts.test.ts | 5 +- tests/release-check-contracts.test.ts | 38 +++ tests/v3-command-contracts.test.ts | 98 ++++++ 20 files changed, 799 insertions(+), 95 deletions(-) create mode 100644 scripts/release-check.mjs create mode 100644 tests/release-check-contracts.test.ts diff --git a/README.en.md b/README.en.md index 082cb28..1f5390d 100644 --- a/README.en.md +++ b/README.en.md @@ -617,8 +617,11 @@ mancode/ ## Remaining Work - Complete real-host session acceptance for Claude Code, Codex, Cursor, - GitHub Copilot, and ZCode on one release candidate. -- Complete cross-host recovery and two-clone git-ref manual acceptance. + GitHub Copilot, and ZCode on one release candidate; verified host sessions + and isolated explicit sessions are both valid evidence paths. +- Run `npm run release:check -- --candidate ` for the clean + checkout, automated two-clone/legacy checks, tarball SHA-256, and install + smoke; complete cross-host recovery separately. - Confirm ZCode project-skill discovery and workspace-command paths; keep the adapter provisional until then. - Evaluate Windsurf, Cline, and Roo Code adapters based on real demand. diff --git a/README.md b/README.md index 82422c7..dc61761 100644 --- a/README.md +++ b/README.md @@ -562,8 +562,8 @@ mancode/ ## 仍在推进 -- 在同一发布候选上完成 Claude Code、Codex、Cursor、GitHub Copilot 和 ZCode 的真实宿主 session 验收。 -- 完成跨真实宿主恢复与双 clone git-ref 人工验收。 +- 在同一发布候选上完成 Claude Code、Codex、Cursor、GitHub Copilot 和 ZCode 的真实宿主 session 验收;宿主自动 session 和显式双 session 都是合法证据路径。 +- 使用 `npm run release:check -- --candidate <完整提交 SHA>` 完成干净 checkout、自动双 clone/legacy、tarball SHA-256 和安装 smoke;另完成跨真实宿主恢复。 - 确认 ZCode 项目级 skill 发现和 workspace command 路径;完成前继续标记为 provisional。 - 根据真实需求评估 Windsurf、Cline 和 Roo Code adapter。 diff --git a/docs/12-lifecycle.md b/docs/12-lifecycle.md index b9c9392..0f3f5c1 100644 --- a/docs/12-lifecycle.md +++ b/docs/12-lifecycle.md @@ -54,6 +54,8 @@ session 是本地便利状态。关闭一个 session 不会关闭任务,也不 ## 发布证据 -`context session spike` 记录真实宿主的窗口隔离、子命令传播、子 agent 继承和 hook approval,但不保存原始宿主 session key。内部 `context beta` 要求所有证据绑定同一个 immutable release candidate。 +`context session spike` 记录真实宿主的窗口隔离、子命令传播、子 agent 继承和 hook approval,但不保存原始宿主 session key 或显式 session ID。证据模式为 `host` 或 `explicit`:前者通过后可授权受信宿主身份,后者只证明两个已存在、active、client 匹配的显式 session 隔离,不改变运行时的 `explicit_required` 策略。内部 `context beta` 接受与平台能力匹配的任一路径,并要求所有证据绑定同一个 immutable release candidate。 + +`npm run release:check -- --candidate <完整提交 SHA>` 从 `origin/develop` 创建干净 checkout,运行完整自动化、真实双 clone/legacy fixture、audit、pack 与 tarball 安装 smoke,并把报告和候选 tarball 保存在 `.mancode/local/release-evidence/`。该命令不会执行 `npm publish` 或修改 dist-tag。 尚未完成的验收见 [release-acceptance.md](./release-acceptance.md)。 diff --git a/docs/engineering.md b/docs/engineering.md index f808690..e3d6cbd 100644 --- a/docs/engineering.md +++ b/docs/engineering.md @@ -36,7 +36,7 @@ npm run build npm run test:dist ``` -发布前运行 `npm run prepublishOnly`。涉及 Windows 原子文件行为时追加 `npm run test:windows-smoke`;涉及网站时运行对应网站测试和浏览器检查。 +发布候选先运行 `npm run prepublishOnly`。提交并推送最终 `develop` 后,运行 `npm run release:check -- --candidate <完整提交 SHA>`,由远端候选的干净 checkout 重跑完整门禁、跨 clone、legacy、audit、pack 和 tarball 安装 smoke,并生成本地 SHA-256 证据。涉及 Windows 原子文件行为时追加 `npm run test:windows-smoke`;涉及网站时运行对应网站测试和浏览器检查。 不要把历史测试数量写入长期文档。报告当前命令、退出码和失败原因即可。 diff --git a/docs/planning-governance-evolution.md b/docs/planning-governance-evolution.md index 62f3c21..0eced37 100644 --- a/docs/planning-governance-evolution.md +++ b/docs/planning-governance-evolution.md @@ -14,13 +14,13 @@ | 类别 | 状态 | 证据 | | --- | --- | --- | -| A–F 实现工作包 | 工作树生产加固完成 | `4dc2e7e` 包含 Policy 2 mode scope、resolver 短路和 adapter target recovery 修复;本轮又补齐 required adapter readiness、真实 reframe 并发、已发布旧 CLI 黑盒证据、条件式 decision-readiness、跨会话 requirements draft 和 Continuity 命名迁移,等待形成下一候选 | -| 本地发布前检查 | 工作树通过 | 本轮 `npm run prepublishOnly` 通过:lint、typecheck、build、dist adapter 验证、119 个测试文件/833 个测试;`npm audit --omit=dev`、`npm pack --dry-run` 和实际 tarball/Claude Code smoke 均通过,形成候选后仍需在干净 checkout 重跑 | -| GitHub Quality gate | 候选通过 | `4dc2e7e` 的 [Quality gate run 29896302856](https://github.com/whitelonng/mancode/actions/runs/29896302856) 成功;候选变化后必须重跑 | -| GitHub Windows gate | 候选通过 | `4dc2e7e` 的 [Windows gate run 29896302904](https://github.com/whitelonng/mancode/actions/runs/29896302904) 在 CMD、PowerShell、Git Bash 全部成功;候选变化后必须重跑 | -| `develop` 远程一致性 | 候选已对齐 | `4dc2e7e` 已与 `origin/develop` 对齐;后续工作树修复形成新候选后需重新推送和对齐,`main` 未修改 | +| A–F 实现工作包 | 工作树生产加固完成 | Policy 2、adapter recovery、reframe、旧 CLI 黑盒、decision-readiness、requirements draft 和 Continuity 命名已经完成;本轮继续修正平台发布证据与最终 release-check | +| 本地发布前检查 | 新候选待重跑 | 最终候选必须通过 `npm run prepublishOnly`,并由 `npm run release:check -- --candidate ` 从远端干净 checkout 重跑跨 clone、legacy、audit、pack 和 tarball 安装 smoke | +| GitHub Quality gate | 历史候选通过 | `2c9d697` 的 [Quality gate run 29930349142](https://github.com/whitelonng/mancode/actions/runs/29930349142) 成功;本轮形成新候选后必须重跑 | +| GitHub Windows gate | 历史候选通过 | `2c9d697` 的 [Windows gate run 29930353690](https://github.com/whitelonng/mancode/actions/runs/29930353690) 在 CMD、PowerShell、Git Bash 全部成功;本轮形成新候选后必须重跑 | +| `develop` 远程一致性 | 新候选待形成 | `2c9d697` 当前与 `origin/develop` 对齐;本轮工作树形成新候选后需重新推送和对齐,`main` 不得修改 | | Claude Code 条件式澄清实测 | 工作树通过 | Claude Code 2.1.142 使用本地 0.4.0 tarball:清晰请求直接执行,需求不清晰时提问等待,明确但与证据冲突的请求被拦截;真实测试同时发现并修复了隐藏 bootstrap skill 未稳定加载的问题,最终改为 `CLAUDE.md` 受控区,候选形成后仍需重跑 | -| 最终发布验收 | 未完成 | 五平台真实宿主、跨 clone/legacy 人工验收、最终 Beta gate 和干净 checkout tarball 验收仍待完成 | +| 最终发布验收 | 未完成 | 五平台真实宿主与跨宿主恢复、自动 release-check、最终 Beta gate 和候选 tarball 验收仍待完成 | | npm 发布 | 未执行 | 在上项全部完成前保持禁止 | ## 2. 目标、不变量与非目标 @@ -379,6 +379,8 @@ mancode project upgrade --policy 2 --operation-id --session - - [x] local transport 的完整原子 reframe、recovery、archive retention,以及与 child create、handoff create/start、solo handoff start 的真实并发竞争通过;没有复用 scope-change,也没有部分 authority 或 eligibility 绕过路径。 - [x] 已升级/未升级项目、旧/新 workflow、local/git-ref transport 的自动化兼容矩阵通过;git-ref reframe 稳定返回 `MANCODE_REFRAME_GIT_REF_UNSUPPORTED`。 - [x] 5 个 adapter renderer、Windows path、line ending、用户托管区和每个 target 写前/写后中断恢复在 `4dc2e7e` 通过;后续候选仍需重跑 dist/Windows/recovery gate。 +- [x] 平台证据区分 `host_session_verified` 与 `explicit_session_verified`;显式路径验证两个 active、不同且 client 匹配的 session,只满足发布证据,不提升运行时宿主信任。 +- [x] release-check 从远端候选创建干净 checkout,自动运行完整门禁、双 clone、legacy、audit、pack、tarball CLI/module smoke,并输出提交绑定的 SHA-256 证据;脚本不包含 npm publish 或 dist-tag 操作。 - [ ] Claude Code、Codex、Cursor、GitHub Copilot、ZCode 的最终候选真实宿主验收,以及 [`docs/release-acceptance.md`](./release-acceptance.md) 要求的跨 clone、legacy、Beta gate 和干净 checkout tarball 验收。 - [x] 按开发集成要求将候选 `4dc2e7e` 推送到远程 `develop`,且 Quality 与 Windows gate 均通过;这不等同于 release gate 通过。 - [ ] 完成剩余发布验收后才允许进入 npm 发布检查;任何条件失败都不得发布 npm。 @@ -404,7 +406,7 @@ mancode project upgrade --policy 2 --operation-id --session - 2. [x] 完成 A–F 工作包;工作包可以独立合并,但不发布中间 npm 版本。 3. [x] 完成 adapter digest/upgrade 和 parser/capability gate;当前工作树已通过 0.3.x + V2 manifest reader/writer fixture,新候选仍需重跑。 4. [x] 完成 project upgrade 和 local reframe 的独立 operation/recovery;只在 upgraded marker 下打开 Policy 2 create default。 -5. [ ] 在同一个 release candidate 上通过第 10.2 节和 [`docs/release-acceptance.md`](./release-acceptance.md) 的全部真实宿主、跨 clone、legacy、Beta gate 和 tarball 检查。 +5. [ ] 在同一个 release candidate 上通过第 10.2 节和 [`docs/release-acceptance.md`](./release-acceptance.md) 的全部真实宿主、release-check、Beta gate 和 tarball 检查。 6. [ ] 将本轮加固后的唯一候选提交推送到远程 `develop`;`4dc2e7e` 的历史推送不替代新候选,且禁止推送、合并或创建以 `main` 为目标的发布操作。 7. [ ] 确认远程 `develop` 与完整验收证据完全一致后,才允许发布唯一的 npm 版本 0.4.0。git-ref reframe 始终拒绝,不进入本计划范围。 @@ -435,12 +437,12 @@ mancode project upgrade --policy 2 --operation-id --session - 0.4.0 只允许按以下顺序发布: -`4dc2e7e` 是当前已验证的开发集成候选,其 [Quality gate](https://github.com/whitelonng/mancode/actions/runs/29896302856) 和 [Windows gate](https://github.com/whitelonng/mancode/actions/runs/29896302904) 均成功。候选后的任何实现、测试或发布文档修改都会使这些证据不再适用于新候选;新的唯一候选必须重新完成第 1–3 步并推送到 `origin/develop`,第 4–6 步必须在任何 `npm publish` 前补齐。 +`2c9d697` 是上一已验证开发候选,其 [Quality gate](https://github.com/whitelonng/mancode/actions/runs/29930349142) 和 [Windows gate](https://github.com/whitelonng/mancode/actions/runs/29930353690) 均成功。候选后的任何实现、测试或发布文档修改都会使这些证据不再适用于新候选;新的唯一候选必须重新完成第 1–3 步并推送到 `origin/develop`,第 4–6 步必须在任何正式 npm 发布前补齐。 1. 所有实现、修复和文档进入本地 `develop`,形成唯一 release candidate commit。 2. 在该提交上完成第 10.2 节的全部自动化、恢复、跨平台和真实宿主验收。任何失败都必须修复并从头重跑受影响的 release gate。 3. [ ] 对本轮形成的新候选只执行 `git push origin develop`。禁止直接或间接更新远程 `main`,包括 push、merge、rebase、以 `main` 为目标的 PR 或自动化发布工作流。 -4. 从远程 `develop` 的同一提交创建干净 checkout,运行 `npm ci`、`npm run prepublishOnly`、要求的平台 smoke tests 和 `npm pack --dry-run`;随后执行实际 `npm pack`,验证生成 tarball 可安装、CLI 可启动。 +4. 从远程 `develop` 的同一提交运行 `npm run release:check -- --candidate <完整 SHA>`;使用其保留的 tarball 完成真实宿主证据,再运行最终 Beta gate。 5. 确认 release candidate commit、远程 `develop` commit、测试证据和待发布 package version 完全一致。 6. 前五步全部成功后才允许执行 `npm publish`。不发布 `0.4.0-beta`、`0.4.0-rc` 或其他中间 npm 版本。 diff --git a/docs/platform-adapters.md b/docs/platform-adapters.md index 1e6a19e..6bacc47 100644 --- a/docs/platform-adapters.md +++ b/docs/platform-adapters.md @@ -41,6 +41,21 @@ Continuity 的 Claude Code bootstrap 位于根目录 `CLAUDE.md` 的 `mancode:co Windows 上的脚本与文件替换不能依赖 Bash、jq 或 Unix rename 行为。发布流程包含 CMD、PowerShell 和 Git Bash smoke test。 +## Session 发布证据 + +真实宿主证据必须显式选择 `--session-mode host` 或 `--session-mode explicit`。`host` 模式使用一次性宿主 key 比较双窗口,并且只有完整证明传播、继承和必要 hook approval 后才允许 `host_verified`。`explicit` 模式读取 `MANCODE_SPIKE_SESSION_ID` 与 `MANCODE_SPIKE_SECOND_SESSION_ID`,验证两个 session 已存在、active、互不相同且 client 与平台一致;写入证据前丢弃原始 ID。它可以得到 `explicit_session_verified` 发布证据,但运行时继续要求显式 `--session`。 + +```bash +MANCODE_SPIKE_SESSION_ID= \ +MANCODE_SPIKE_SECOND_SESSION_ID= \ +./node_modules/.bin/mancode context session spike \ + --platform cursor --session-mode explicit --host-session-source none \ + --command-propagation proven \ + --subagent-inheritance not_applicable \ + --subagent-inheritance-reason "Host has no child-agent API" \ + --host-version --release-candidate --json +``` + ## 发布声明 “文件能生成”不等于“宿主已验证”。每个平台的双窗口 session、子命令传播和子 agent 继承必须在同一发布候选上记录,才能通过内部 Beta gate。ZCode 在完成该验证前保持 provisional 描述。 diff --git a/docs/release-acceptance.md b/docs/release-acceptance.md index 2a0c024..ce1fb02 100644 --- a/docs/release-acceptance.md +++ b/docs/release-acceptance.md @@ -4,14 +4,14 @@ ## 发布条件 -- 在最终发布候选的干净 checkout 运行 `npm ci` 和 `npm run prepublishOnly`。 -- 先运行 `npm pack --dry-run` 检查包内容,再执行实际 `npm pack`,使用生成的 tarball 完成安装和 CLI 启动 smoke test;不使用 npm beta/rc 发布代替该验证。 +- 在最终发布候选运行 `npm run release:check -- --candidate <完整提交 SHA>`;该命令必须从 `origin/develop` 创建干净 checkout,运行 `npm ci`、`npm run prepublishOnly`、跨 clone、legacy、audit、pack 和安装 smoke,并输出绑定提交与 tarball SHA-256 的本地 JSON 证据。 +- release-check 先运行 `npm pack --dry-run`,再执行实际 `npm pack`,保留生成的 tarball 并完成 CLI/module smoke;npm beta/rc 不能替代该字节级验证。 - Windows required check 在 CMD、PowerShell 和 Git Bash 上通过。 -- Claude Code、Codex、Cursor、GitHub Copilot 和 ZCode 都完成真实双窗口 session 验证。 -- 每个平台证明子命令传播;支持子 agent 的平台还需证明继承,或记录合法的 `not_applicable` 原因。 +- Claude Code、Codex、Cursor、GitHub Copilot 和 ZCode 都完成真实双窗口 session 验证。每个平台可证明受信宿主 session,或证明两个真实显式 session 隔离;显式证据只满足发布验收,不授权运行时信任宿主 key。 +- 每个平台证明子命令传播;支持子 agent 的平台还需证明继承,或记录合法的 `not_applicable` 原因。缺失、伪造、错误 client、关闭或碰撞的显式 session 证据必须拒绝。 - 完成跨真实宿主 resume、claim、handoff 和恢复路径。 -- 两个独立 clone 完成 git-ref pull、并发 CAS、handoff、receipt recovery 和代码基线交接。 -- legacy fixture 完成 stage、activation、中断恢复和严格条件下的 rollback。 +- release-check 中两个真实独立 clone 完成 git-ref pull、并发 CAS、handoff、receipt recovery 和代码基线交接;不再重复要求同一流程的人工双 clone。 +- release-check 中的真实 0.3.18 legacy fixture 完成 stage、activation、每个中断点恢复和严格条件下的 rollback;人工 smoke 不能替代 crash matrix。 - 最终执行 `mancode context beta --release-candidate --json` 返回 `ready: true` 和空 blockers。 - 候选提交已经推送到 `origin/develop`,且本地 `HEAD`、`origin/develop`、全部验收证据和待发布 package version 指向同一提交。 - 记录验收前后的 `origin/main` commit,并证明它没有变化。禁止 push、merge、rebase 或创建以 `main` 为目标的发布操作。 @@ -22,7 +22,7 @@ 1. 在本地 `develop` 完成唯一 release candidate。 2. 完成全部自动化、跨平台、恢复和真实宿主验收。 3. 只执行 `git push origin develop`。 -4. 从远程 `develop` 的同一提交建立干净 checkout,并重跑 `npm ci`、`npm run prepublishOnly`、平台 smoke test、tarball 安装测试和最终 Beta gate。 +4. 从远程 `develop` 的同一提交运行 release-check,使用它保留的 tarball 完成真实宿主 spike,再运行最终 Beta gate。 5. 所有证据一致且 `origin/main` 未变化后,执行唯一一次正式 `npm publish`。 任何测试失败或候选提交变化都会使已有验收失效。修复后必须重新验证;不得先发布 npm 再补证据。 @@ -35,16 +35,15 @@ session evidence 不保存原始 key、token、绝对业务路径或任务正文 ## 当前未完成项 -- 本轮修复形成的新候选上的 Quality gate,以及 Windows CMD、PowerShell、Git Bash required gate。 +- 本轮发布门禁修复形成的新候选上的 Quality gate,以及 Windows CMD、PowerShell、Git Bash required gate。 - 五个平台在最终候选上的完整 session spike。 - 跨真实宿主协作与恢复验收。 -- 当前候选上的双 clone git-ref 人工验收。 -- legacy fixture 的 stage、activation、中断恢复和受约束 rollback 验收。 +- 最终候选上的 release-check,包括自动双 clone git-ref 和 legacy 验收。 - ZCode 项目级 skill 发现和 workspace command 路径确认。 -- `origin/develop` 候选提交上的干净 checkout、tarball 安装和 CLI 启动验收。 +- release-check 输出的候选 tarball、SHA-256、安装与 CLI/module smoke 证据。 - 验收前后 `origin/main` 未变化的记录。 - 汇总全部证据后的最终 Beta gate。 -开发候选证据:`4dc2e7e` 的 [Quality gate](https://github.com/whitelonng/mancode/actions/runs/29896302856) 和 [Windows compatibility gate](https://github.com/whitelonng/mancode/actions/runs/29896302904) 均已通过,后者覆盖 Windows CMD、PowerShell 和 Git Bash。该证据只适用于 `4dc2e7e`;后续代码、测试或文档修改进入新候选后,两个 required check 都必须重新执行。 +上一开发候选 `2c9d697` 的 [Quality gate](https://github.com/whitelonng/mancode/actions/runs/29930349142) 和 [Windows compatibility gate](https://github.com/whitelonng/mancode/actions/runs/29930353690) 均已通过,后者覆盖 Windows CMD、PowerShell 和 Git Bash。该证据是历史基线;本轮门禁修复形成新候选后必须重新执行。当前候选 SHA 和运行链接保存在外部发布证据中,避免把自引用 SHA 写进候选提交。 完成一项时更新本文件的未完成列表;不要创建新的平行验收计划。 diff --git a/package.json b/package.json index 1501e57..021e2a6 100644 --- a/package.json +++ b/package.json @@ -63,6 +63,7 @@ "test:windows-smoke": "node scripts/windows-smoke.mjs", "test:watch": "vitest", "test:coverage": "vitest run --coverage", + "release:check": "node scripts/release-check.mjs", "lint": "biome check src tests", "typecheck": "tsc --noEmit", "format": "biome format --write src tests", diff --git a/scripts/release-check.mjs b/scripts/release-check.mjs new file mode 100644 index 0000000..f7b8283 --- /dev/null +++ b/scripts/release-check.mjs @@ -0,0 +1,317 @@ +import { spawnSync } from 'node:child_process'; +import { createHash } from 'node:crypto'; +import { + copyFile, + mkdir, + mkdtemp, + readFile, + rm, + writeFile, +} from 'node:fs/promises'; +import { tmpdir } from 'node:os'; +import path from 'node:path'; +import process from 'node:process'; +import { fileURLToPath } from 'node:url'; + +const sourceRoot = path.resolve( + path.dirname(fileURLToPath(import.meta.url)), + '..', +); +const options = parseOptions(process.argv.slice(2)); + +if (options.help) { + console.log( + 'Usage: npm run release:check -- --candidate [--output ]', + ); + process.exit(0); +} + +const sourceStatus = runCaptured('git', ['status', '--porcelain'], sourceRoot); +assert(sourceStatus === '', 'release check requires a clean source checkout'); + +const candidate = normalizeCandidate( + options.candidate ?? runCaptured('git', ['rev-parse', 'HEAD'], sourceRoot), +); +const sourceHead = runCaptured('git', ['rev-parse', 'HEAD'], sourceRoot); +assert(sourceHead === candidate, 'release candidate must equal source HEAD'); + +const remote = runCaptured('git', ['remote', 'get-url', 'origin'], sourceRoot); +const originDevelop = remoteRef(remote, 'refs/heads/develop'); +const originMainBefore = remoteRef(remote, 'refs/heads/main'); +assert( + originDevelop === candidate, + 'release candidate must equal origin/develop', +); + +const outputPath = path.resolve( + sourceRoot, + options.output ?? + path.join( + '.mancode', + 'local', + 'release-evidence', + `${candidate}.json`, + ), +); +const outputDirectory = path.dirname(outputPath); +const temporaryRoot = await mkdtemp( + path.join(tmpdir(), 'mancode-release-check-'), +); +const checkout = path.join(temporaryRoot, 'checkout'); +const installFixture = path.join(temporaryRoot, 'install-smoke'); +const checks = []; + +try { + runCheck(checks, 'clean_clone', 'git', [ + 'clone', + '--branch', + 'develop', + '--single-branch', + remote, + checkout, + ], temporaryRoot); + assert( + runCaptured('git', ['rev-parse', 'HEAD'], checkout) === candidate, + 'clean checkout does not match the release candidate', + ); + + runCheck(checks, 'npm_ci', 'npm', ['ci'], checkout); + runCheck( + checks, + 'prepublish', + 'npm', + ['run', 'prepublishOnly'], + checkout, + ); + runCheck( + checks, + 'cross_clone', + 'npx', + [ + 'vitest', + 'run', + 'tests/git-ref-cross-clone-e2e.test.ts', + 'tests/git-ref-clock-skew-contracts.test.ts', + 'tests/git-ref-handoff-repair-contracts.test.ts', + ], + checkout, + ); + runCheck( + checks, + 'legacy_migration', + 'npx', + [ + 'vitest', + 'run', + 'tests/migrate-contracts.test.ts', + 'tests/migrate-command-contracts.test.ts', + 'tests/migration-parity-contracts.test.ts', + 'tests/legacy-cli-compatibility-contracts.test.ts', + ], + checkout, + ); + + const audit = JSON.parse( + runCaptured('npm', ['audit', '--omit=dev', '--json'], checkout), + ); + const vulnerabilities = audit.metadata?.vulnerabilities?.total; + assert(vulnerabilities === 0, 'production dependency audit is not clean'); + checks.push({ name: 'production_audit', status: 'passed' }); + + const dryRun = parseSinglePackResult( + runCaptured('npm', ['pack', '--dry-run', '--json'], checkout), + ); + checks.push({ name: 'pack_dry_run', status: 'passed' }); + const packed = parseSinglePackResult( + runCaptured('npm', ['pack', '--json'], checkout), + ); + const tarballPath = path.join(checkout, packed.filename); + const tarballBytes = await readFile(tarballPath); + const tarballSha256 = createHash('sha256') + .update(tarballBytes) + .digest('hex'); + + await mkdir(installFixture, { recursive: true }); + await writeFile( + path.join(installFixture, 'package.json'), + `${JSON.stringify({ name: 'mancode-release-install-smoke', private: true })}\n`, + ); + runCheck( + checks, + 'tarball_install', + 'npm', + ['install', '--no-audit', '--no-fund', tarballPath], + installFixture, + ); + const installedCli = path.join( + installFixture, + 'node_modules', + 'mancode', + 'dist', + 'cli.js', + ); + const installedVersion = runCaptured( + process.execPath, + [installedCli, '--version'], + installFixture, + ); + const packageMetadata = JSON.parse( + await readFile(path.join(checkout, 'package.json'), 'utf8'), + ); + assert( + installedVersion === packageMetadata.version, + 'installed CLI version does not match package.json', + ); + runCheck( + checks, + 'tarball_cli', + process.execPath, + [installedCli, 'init', '--empty', '--platform', 'all', '--lang', 'en'], + installFixture, + ); + const status = JSON.parse( + runCaptured( + process.execPath, + [installedCli, 'status', '--brief', '--json'], + installFixture, + ), + ); + assert( + status.runtime === 'mancode-continuity' && status.ready === true, + 'installed tarball did not produce a ready Continuity runtime', + ); + runCheck( + checks, + 'tarball_module', + process.execPath, + [ + '--input-type=module', + '--eval', + "const mod = await import('mancode'); if (Object.keys(mod).length === 0) process.exit(1);", + ], + installFixture, + ); + + const originMainAfter = remoteRef(remote, 'refs/heads/main'); + assert(originMainAfter === originMainBefore, 'origin/main changed during release check'); + checks.push({ name: 'origin_main_unchanged', status: 'passed' }); + + await mkdir(outputDirectory, { recursive: true }); + const artifactFile = `mancode-${packageMetadata.version}-${candidate.slice(0, 12)}.tgz`; + await copyFile(tarballPath, path.join(outputDirectory, artifactFile)); + const report = { + schemaVersion: 1, + localReady: true, + releaseCandidate: candidate, + packageVersion: packageMetadata.version, + generatedAt: new Date().toISOString(), + source: { + branch: 'develop', + originDevelop, + originMainBefore, + originMainAfter, + }, + environment: { + nodeVersion: process.version, + npmVersion: runCaptured('npm', ['--version'], checkout), + platform: process.platform, + arch: process.arch, + }, + tarball: { + artifactFile, + sha256: tarballSha256, + npmShasum: packed.shasum, + npmIntegrity: packed.integrity, + size: packed.size, + unpackedSize: packed.unpackedSize, + fileCount: packed.entryCount ?? packed.files?.length ?? null, + dryRunFileCount: dryRun.entryCount ?? dryRun.files?.length ?? null, + }, + checks, + externalGates: { + platformSessionEvidence: 'pending', + betaGate: 'pending', + githubQuality: 'pending', + githubWindows: 'pending', + }, + }; + await writeFile(outputPath, `${JSON.stringify(report, null, 2)}\n`); + console.log(`Local release check passed: ${outputPath}`); + console.log(`Candidate tarball: ${path.join(outputDirectory, artifactFile)}`); + console.log(`SHA-256: ${tarballSha256}`); +} finally { + await rm(temporaryRoot, { recursive: true, force: true }); +} + +function runCheck(checks, name, command, args, cwd) { + run(command, args, cwd, 'inherit'); + checks.push({ name, status: 'passed' }); +} + +function runCaptured(command, args, cwd) { + return run(command, args, cwd, 'pipe').trim(); +} + +function run(command, args, cwd, stdio) { + const result = spawnSync(command, args, { + cwd, + encoding: 'utf8', + stdio, + }); + if (result.error) throw result.error; + if (result.status !== 0) { + const detail = [result.stderr, result.stdout].filter(Boolean).join('\n'); + throw new Error( + `${command} ${args.join(' ')} failed (${result.status})${detail ? `:\n${detail}` : ''}`, + ); + } + return typeof result.stdout === 'string' ? result.stdout : ''; +} + +function remoteRef(remote, ref) { + const output = runCaptured('git', ['ls-remote', remote, ref], sourceRoot); + const [commit] = output.split(/\s+/u); + return normalizeCandidate(commit ?? ''); +} + +function parseSinglePackResult(output) { + const parsed = JSON.parse(output); + assert( + Array.isArray(parsed) && parsed.length === 1, + 'npm pack returned an unexpected result', + ); + return parsed[0]; +} + +function normalizeCandidate(value) { + const candidate = String(value).trim(); + assert( + /^[a-f0-9]{40}$/u.test(candidate), + 'release candidate must be a full Git commit SHA', + ); + return candidate; +} + +function parseOptions(args) { + const parsed = { candidate: null, output: null, help: false }; + for (let index = 0; index < args.length; index += 1) { + const argument = args[index]; + if (argument === '--help') { + parsed.help = true; + continue; + } + if (argument !== '--candidate' && argument !== '--output') { + throw new Error(`unknown release-check argument: ${argument}`); + } + const value = args[index + 1]; + assert(value !== undefined, `${argument} requires a value`); + if (argument === '--candidate') parsed.candidate = value; + else parsed.output = value; + index += 1; + } + return parsed; +} + +function assert(condition, message) { + if (!condition) throw new Error(message); +} diff --git a/scripts/windows-smoke.mjs b/scripts/windows-smoke.mjs index 1e5c71a..3f206b6 100644 --- a/scripts/windows-smoke.mjs +++ b/scripts/windows-smoke.mjs @@ -215,6 +215,8 @@ async function assertV3SessionEvidenceRenameUnderOpenWindowsHandle() { 'spike', '--platform', 'codex', + '--session-mode', + 'host', '--host-session-source', 'api', '--command-propagation', diff --git a/src/cli.ts b/src/cli.ts index 020cf94..320c2b7 100644 --- a/src/cli.ts +++ b/src/cli.ts @@ -320,9 +320,10 @@ contextSessionProgram '--platform ', 'claude-code, codex, cursor, copilot, or zcode', ) + .requiredOption('--session-mode ', 'Evidence path: host or explicit') .requiredOption( '--host-session-source ', - 'hook_stdin, environment, or api', + 'hook_stdin, environment, api, or none for explicit sessions', ) .requiredOption( '--command-propagation ', diff --git a/src/commands/context.ts b/src/commands/context.ts index d4af111..fbfc977 100644 --- a/src/commands/context.ts +++ b/src/commands/context.ts @@ -33,6 +33,7 @@ import { type HookApprovalStatus, type HostSessionSource, SESSION_SPIKE_PLATFORMS, + type SessionEvidenceMode, type SessionSpikePlatform, type SpikeEvidenceStatus, createPlatformSessionSpike, @@ -95,6 +96,7 @@ export interface ContextSessionShowOptions { export interface ContextSessionSpikeOptions { platform?: string; + sessionMode?: string; hostSessionSource?: string; commandPropagation?: string; subagentInheritance?: string; @@ -245,10 +247,8 @@ export async function contextSessionSpike( ): Promise { try { const platform = parseSpikePlatform(options.platform); + const sessionMode = parseSessionEvidenceMode(options.sessionMode); const hostSessionSource = parseHostSessionSource(options.hostSessionSource); - if (hostSessionSource === 'none') { - throw new Error('MANCODE_PLATFORM_SPIKE_HOST_SOURCE_REQUIRED'); - } const releaseCandidate = parseReleaseCandidate(options.releaseCandidate); const hostVersion = parseHostVersion(options.hostVersion); const commandPropagation = parseRequiredSpikeEvidenceStatus( @@ -259,23 +259,35 @@ export async function contextSessionSpike( options.subagentInheritance, 'subagent inheritance', ); - const firstWindowHostSessionKey = - process.env.MANCODE_SPIKE_HOST_SESSION_KEY ?? null; - const secondWindowHostSessionKey = - process.env.MANCODE_SPIKE_SECOND_WINDOW_HOST_SESSION_KEY ?? null; - if ( - firstWindowHostSessionKey === null || - secondWindowHostSessionKey === null - ) { + const project = await readV3CommandProject(rootDir); + const [firstWindowSessionKey, secondWindowSessionKey] = + sessionMode === 'host' + ? [ + process.env.MANCODE_SPIKE_HOST_SESSION_KEY ?? null, + process.env.MANCODE_SPIKE_SECOND_WINDOW_HOST_SESSION_KEY ?? null, + ] + : [ + process.env.MANCODE_SPIKE_SESSION_ID ?? null, + process.env.MANCODE_SPIKE_SECOND_SESSION_ID ?? null, + ]; + if (firstWindowSessionKey === null || secondWindowSessionKey === null) { throw new Error('MANCODE_PLATFORM_SPIKE_WINDOW_EVIDENCE_REQUIRED'); } - const project = await readV3CommandProject(rootDir); + if (sessionMode === 'explicit') { + await assertExplicitSpikeSessions( + project.projectRoot, + platform, + firstWindowSessionKey, + secondWindowSessionKey, + ); + } const spike = createPlatformSessionSpike({ platform, observedAt: new Date().toISOString(), + sessionMode, hostSessionSource, - firstWindowHostSessionKey, - secondWindowHostSessionKey, + firstWindowSessionKey, + secondWindowSessionKey, commandPropagation, subagentInheritance, subagentInheritanceReason: options.subagentInheritanceReason ?? null, @@ -315,6 +327,32 @@ export async function contextSessionSpike( } } +async function assertExplicitSpikeSessions( + projectRoot: string, + platform: SessionSpikePlatform, + firstSessionId: string, + secondSessionId: string, +): Promise { + if (firstSessionId === secondSessionId) { + throw new Error('MANCODE_PLATFORM_SPIKE_SESSION_COLLISION'); + } + const [first, second] = await Promise.all([ + readSession(projectRoot, firstSessionId), + readSession(projectRoot, secondSessionId), + ]); + if ( + first === null || + second === null || + first.status !== 'active' || + second.status !== 'active' + ) { + throw new Error('MANCODE_PLATFORM_SPIKE_SESSION_NOT_FOUND'); + } + if (first.client !== platform || second.client !== platform) { + throw new Error('MANCODE_PLATFORM_SPIKE_SESSION_CLIENT_MISMATCH'); + } +} + /** Reports internal release readiness and exits non-zero until every gate passes. */ export async function contextBeta( rootDir: string, @@ -947,6 +985,15 @@ function parseSpikePlatform(value: string | undefined): SessionSpikePlatform { return value as SessionSpikePlatform; } +function parseSessionEvidenceMode( + value: string | undefined, +): SessionEvidenceMode { + if (value !== 'host' && value !== 'explicit') { + throw new Error('MANCODE_PLATFORM_SPIKE_SESSION_MODE_REQUIRED'); + } + return value; +} + function parseHostSessionSource(value: string | undefined): HostSessionSource { if ( value !== 'hook_stdin' && diff --git a/src/runtime/platform-spike-store.ts b/src/runtime/platform-spike-store.ts index 965a130..1ee9268 100644 --- a/src/runtime/platform-spike-store.ts +++ b/src/runtime/platform-spike-store.ts @@ -73,7 +73,7 @@ export async function writePlatformSessionSpike( spike: PlatformSessionSpike, ): Promise { const parsed = parsePlatformSessionSpike(spike); - if (parsed.schemaVersion !== 2) { + if (parsed.schemaVersion !== 3) { throw new Error('MANCODE_PLATFORM_SPIKE_RECAPTURE_REQUIRED'); } const directory = await safeEvidenceDirectory(projectRoot, true); diff --git a/src/runtime/platform-spike.ts b/src/runtime/platform-spike.ts index 39bb8fa..2e781ca 100644 --- a/src/runtime/platform-spike.ts +++ b/src/runtime/platform-spike.ts @@ -11,6 +11,7 @@ export const SESSION_SPIKE_PLATFORMS = [ export type SessionSpikePlatform = (typeof SESSION_SPIKE_PLATFORMS)[number]; export type HostSessionSource = 'hook_stdin' | 'environment' | 'api' | 'none'; +export type SessionEvidenceMode = 'host' | 'explicit'; export type SpikeEvidenceStatus = | 'proven' | 'not_proven' @@ -65,18 +66,40 @@ export interface PlatformSessionSpikeV2 { evidence: PlatformSessionEvidenceBindingV1; } +/** + * Distinguishes trusted host identity from verified explicit sessions. Both + * can satisfy release evidence, but only host evidence may enable automatic + * host identity at runtime. + */ +export interface PlatformSessionSpikeV3 { + schemaVersion: 3; + platform: SessionSpikePlatform; + observedAt: string; + sessionMode: SessionEvidenceMode; + hostSessionSource: HostSessionSource; + hostSessionObserved: boolean; + distinctClientWindows: SpikeEvidenceStatus; + commandPropagation: SpikeEvidenceStatus; + subagentInheritance: SpikeEvidenceStatus; + subagentInheritanceReason: string | null; + hookApproval: HookApprovalStatus; + evidence: PlatformSessionEvidenceBindingV1; +} + export type PlatformSessionSpike = | PlatformSessionSpikeV1 - | PlatformSessionSpikeV2; + | PlatformSessionSpikeV2 + | PlatformSessionSpikeV3; export interface PlatformSessionSpikeInput { platform: SessionSpikePlatform; observedAt: string; + sessionMode: SessionEvidenceMode; hostSessionSource: HostSessionSource; - /** Ephemeral only; never copied into PlatformSessionSpikeV2. */ - firstWindowHostSessionKey: string | null; + /** Ephemeral host key or explicit session ID; never persisted. */ + firstWindowSessionKey: string | null; /** Ephemeral only; proves two same-client windows do not collide. */ - secondWindowHostSessionKey: string | null; + secondWindowSessionKey: string | null; /** Operator-attested result from a real host child command. */ commandPropagation: SpikeEvidenceStatus; /** Operator-attested result from a real host child agent, if applicable. */ @@ -98,6 +121,11 @@ export type PlatformSessionEvidenceState = | 'release_candidate_mismatch' | 'mancode_version_mismatch'; +export type PlatformReleaseEvidence = + | 'host_session_verified' + | 'explicit_session_verified' + | 'unverified'; + export interface PlatformSessionCapability { platform: SessionSpikePlatform; hostIdentity: HostIdentityCapability; @@ -106,61 +134,62 @@ export interface PlatformSessionCapability { subagentInheritance: SpikeEvidenceStatus; hookApproval: HookApprovalStatus; evidenceState: PlatformSessionEvidenceState; + releaseEvidence: PlatformReleaseEvidence; reason: string; } export interface PlatformSpikeFreezeStatus { missingPlatforms: SessionSpikePlatform[]; + /** Informational runtime policy; verified explicit evidence may still be release-ready. */ explicitRequiredPlatforms: SessionSpikePlatform[]; + unverifiedPlatforms: SessionSpikePlatform[]; evidenceMismatchPlatforms: SessionSpikePlatform[]; ready: boolean; } export function createPlatformSessionSpike( input: PlatformSessionSpikeInput, -): PlatformSessionSpikeV2 { +): PlatformSessionSpikeV3 { assertSessionSpikePlatform(input.platform); assertTimestamp(input.observedAt, 'platform session spike observedAt'); + assertSessionEvidenceMode(input.sessionMode); assertHostSessionSource(input.hostSessionSource); assertSpikeStatus(input.commandPropagation, 'commandPropagation'); assertSpikeStatus(input.subagentInheritance, 'subagentInheritance'); assertHookApproval(input.hookApproval); const evidence = parseEvidenceBinding(input.evidence); - const first = normalizeEphemeralHostKey(input.firstWindowHostSessionKey); - const second = normalizeEphemeralHostKey(input.secondWindowHostSessionKey); + const first = normalizeEphemeralSessionKey(input.firstWindowSessionKey); + const second = normalizeEphemeralSessionKey(input.secondWindowSessionKey); const subagentInheritanceReason = parseSubagentInheritanceReason( input.subagentInheritance, input.subagentInheritanceReason ?? null, ); - if (input.hostSessionSource === 'none' && first !== null) { + if (input.sessionMode === 'host' && input.hostSessionSource === 'none') { throw new Error( - 'platform session spike source none cannot carry a host key', + 'platform host session spike requires a host session source', ); } - if (input.hostSessionSource !== 'none' && first === null) { - throw new Error( - 'platform session spike host source requires an observed key', - ); + if (input.sessionMode === 'explicit' && input.hostSessionSource !== 'none') { + throw new Error('platform explicit session spike host source must be none'); } - if (second !== null && first === null) { - throw new Error( - 'platform session spike second window requires a first window', - ); + if (first === null) { + throw new Error('platform session spike requires a first window key'); } if ( - input.hostSessionSource === 'none' && - input.commandPropagation === 'proven' + input.sessionMode === 'explicit' && + input.hookApproval !== 'not_applicable' ) { throw new Error( - 'platform session spike cannot prove propagation without a host key', + 'platform explicit session spike hook approval must be not_applicable', ); } return { - schemaVersion: 2, + schemaVersion: 3, platform: input.platform, observedAt: input.observedAt, + sessionMode: input.sessionMode, hostSessionSource: input.hostSessionSource, - hostSessionObserved: first !== null, + hostSessionObserved: input.sessionMode === 'host', distinctClientWindows: second === null ? 'not_tested' @@ -181,7 +210,8 @@ export function parsePlatformSessionSpike( assertRecord(value, 'platform session spike'); if (value.schemaVersion === 1) return parsePlatformSessionSpikeV1(value); if (value.schemaVersion === 2) return parsePlatformSessionSpikeV2(value); - throw new Error('platform session spike schemaVersion must be 1 or 2'); + if (value.schemaVersion === 3) return parsePlatformSessionSpikeV3(value); + throw new Error('platform session spike schemaVersion must be 1, 2, or 3'); } /** Missing evidence is deliberately indistinguishable from insufficient evidence. */ @@ -195,18 +225,33 @@ export function evaluatePlatformSessionCapability( parsed.hostSessionSource !== 'hook_stdin' || parsed.hookApproval === 'approved'; const childInheritanceVerified = - parsed.schemaVersion === 2 && + parsed.schemaVersion !== 1 && (parsed.subagentInheritance === 'proven' || (parsed.subagentInheritance === 'not_applicable' && parsed.subagentInheritanceReason !== null)); - const hostVerified = + const commonEvidenceVerified = evidenceState === 'current' && - parsed.hostSessionObserved && - parsed.hostSessionSource !== 'none' && parsed.distinctClientWindows === 'proven' && parsed.commandPropagation === 'proven' && - childInheritanceVerified && + childInheritanceVerified; + const sessionMode = parsed.schemaVersion === 3 ? parsed.sessionMode : 'host'; + const hostVerified = + commonEvidenceVerified && + sessionMode === 'host' && + parsed.hostSessionObserved && + parsed.hostSessionSource !== 'none' && hostSourceApproved; + const explicitVerified = + commonEvidenceVerified && + parsed.schemaVersion === 3 && + sessionMode === 'explicit' && + parsed.hostSessionSource === 'none' && + !parsed.hostSessionObserved; + const releaseEvidence: PlatformReleaseEvidence = hostVerified + ? 'host_session_verified' + : explicitVerified + ? 'explicit_session_verified' + : 'unverified'; return { platform: parsed.platform, hostIdentity: hostVerified ? 'host_verified' : 'explicit_required', @@ -215,9 +260,12 @@ export function evaluatePlatformSessionCapability( subagentInheritance: parsed.subagentInheritance, hookApproval: parsed.hookApproval, evidenceState, + releaseEvidence, reason: hostVerified ? 'host identity, distinct windows, command propagation, and child inheritance are proven' - : capabilityReason(parsed, evidenceState, childInheritanceVerified), + : explicitVerified + ? 'explicit session isolation, command propagation, and child inheritance are proven' + : capabilityReason(parsed, evidenceState, childInheritanceVerified), }; } @@ -255,6 +303,9 @@ export function platformSpikeFreezeStatus( (platform) => capabilities.get(platform)?.hostIdentity === 'explicit_required', ); + const unverifiedPlatforms = SESSION_SPIKE_PLATFORMS.filter( + (platform) => capabilities.get(platform)?.releaseEvidence === 'unverified', + ); const evidenceMismatchPlatforms = SESSION_SPIKE_PLATFORMS.filter( (platform) => { const capability = capabilities.get(platform); @@ -264,9 +315,9 @@ export function platformSpikeFreezeStatus( return { missingPlatforms, explicitRequiredPlatforms, + unverifiedPlatforms, evidenceMismatchPlatforms, - ready: - missingPlatforms.length === 0 && explicitRequiredPlatforms.length === 0, + ready: missingPlatforms.length === 0 && unverifiedPlatforms.length === 0, }; } @@ -324,6 +375,52 @@ function parsePlatformSessionSpikeV2( }; } +function parsePlatformSessionSpikeV3( + value: Record, +): PlatformSessionSpikeV3 { + assertKnownKeys( + value, + [ + 'schemaVersion', + 'platform', + 'observedAt', + 'sessionMode', + 'hostSessionSource', + 'hostSessionObserved', + 'distinctClientWindows', + 'commandPropagation', + 'subagentInheritance', + 'subagentInheritanceReason', + 'hookApproval', + 'evidence', + ], + 'platform session spike', + ); + const common = parseCommonSpikeFields(value, 3); + assertSessionEvidenceMode(value.sessionMode); + if (value.sessionMode === 'host') { + if (common.hostSessionSource === 'none' || !common.hostSessionObserved) { + throw new Error('platform host session spike evidence is inconsistent'); + } + } else if ( + common.hostSessionSource !== 'none' || + common.hostSessionObserved || + common.hookApproval !== 'not_applicable' + ) { + throw new Error('platform explicit session spike evidence is inconsistent'); + } + return { + ...common, + schemaVersion: 3, + sessionMode: value.sessionMode, + subagentInheritanceReason: parseSubagentInheritanceReason( + common.subagentInheritance, + value.subagentInheritanceReason, + ), + evidence: parseEvidenceBinding(value.evidence), + }; +} + function parseCommonSpikeFields( value: Record, schemaVersion: 1, @@ -334,10 +431,21 @@ function parseCommonSpikeFields( ): Omit; function parseCommonSpikeFields( value: Record, - schemaVersion: 1 | 2, + schemaVersion: 3, +): Omit< + PlatformSessionSpikeV3, + 'sessionMode' | 'subagentInheritanceReason' | 'evidence' +>; +function parseCommonSpikeFields( + value: Record, + schemaVersion: 1 | 2 | 3, ): | PlatformSessionSpikeV1 - | Omit { + | Omit + | Omit< + PlatformSessionSpikeV3, + 'sessionMode' | 'subagentInheritanceReason' | 'evidence' + > { if (value.schemaVersion !== schemaVersion) { throw new Error( `platform session spike schemaVersion must be ${schemaVersion}`, @@ -370,7 +478,11 @@ function parseCommonSpikeFields( hookApproval: value.hookApproval, } as | PlatformSessionSpikeV1 - | Omit; + | Omit + | Omit< + PlatformSessionSpikeV3, + 'sessionMode' | 'subagentInheritanceReason' | 'evidence' + >; } function evidenceStateFor( @@ -408,6 +520,13 @@ function capabilityReason( if (spike.commandPropagation !== 'proven') { return 'command propagation is not proven; require --session or MANCODE_SESSION_ID'; } + if ( + spike.schemaVersion === 3 && + spike.sessionMode === 'explicit' && + spike.distinctClientWindows !== 'proven' + ) { + return 'explicit session isolation is not proven; require distinct active sessions'; + } return 'host identity is not fully proven; require --session or MANCODE_SESSION_ID'; } @@ -473,14 +592,22 @@ function parseSubagentInheritanceReason( return parseEvidenceText(value, 'subagentInheritanceReason'); } -function normalizeEphemeralHostKey(value: string | null): string | null { +function normalizeEphemeralSessionKey(value: string | null): string | null { if (value === null) return null; if (typeof value !== 'string' || !value.trim() || value.includes('\0')) { - throw new Error('platform session spike host key is invalid'); + throw new Error('platform session spike window key is invalid'); } return value.trim(); } +function assertSessionEvidenceMode( + value: unknown, +): asserts value is SessionEvidenceMode { + if (value !== 'host' && value !== 'explicit') { + throw new Error('platform session spike sessionMode is invalid'); + } +} + function assertSessionSpikePlatform( value: unknown, ): asserts value is SessionSpikePlatform { diff --git a/tests/beta-gate-contracts.test.ts b/tests/beta-gate-contracts.test.ts index 3c449c0..50aa38f 100644 --- a/tests/beta-gate-contracts.test.ts +++ b/tests/beta-gate-contracts.test.ts @@ -69,7 +69,7 @@ describe('V3 Beta gate', () => { } }); - it('passes only after every V3 adapter and every platform spike is present', async () => { + it('passes after every adapter and explicit-session platform spike is proven', async () => { await makeBetaReady(root); const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); try { @@ -216,9 +216,10 @@ async function makeBetaReady( createPlatformSessionSpike({ platform, observedAt: '2026-07-18T12:00:00.000Z', - hostSessionSource: 'api', - firstWindowHostSessionKey: `${platform}-window-a`, - secondWindowHostSessionKey: `${platform}-window-b`, + sessionMode: 'explicit', + hostSessionSource: 'none', + firstWindowSessionKey: `${platform}-session-a`, + secondWindowSessionKey: `${platform}-session-b`, commandPropagation: 'proven', subagentInheritance, hookApproval: 'not_applicable', diff --git a/tests/cli-v3-surface-contracts.test.ts b/tests/cli-v3-surface-contracts.test.ts index 75b5229..d24e8bb 100644 --- a/tests/cli-v3-surface-contracts.test.ts +++ b/tests/cli-v3-surface-contracts.test.ts @@ -52,6 +52,7 @@ describe('V3 CLI command surface', () => { requiredOptions(commandAt(cliProgram, 'context', 'session', 'spike')), ).toEqual([ '--platform', + '--session-mode', '--host-session-source', '--command-propagation', '--subagent-inheritance', diff --git a/tests/platform-spike-contracts.test.ts b/tests/platform-spike-contracts.test.ts index e4cd764..da94e1b 100644 --- a/tests/platform-spike-contracts.test.ts +++ b/tests/platform-spike-contracts.test.ts @@ -15,9 +15,10 @@ describe('platform session identity spike contract', () => { const spike = createPlatformSessionSpike({ platform: 'codex', observedAt: '2026-07-17T12:00:00.000Z', + sessionMode: 'host', hostSessionSource: 'api', - firstWindowHostSessionKey: 'desktop-window-a-private-key', - secondWindowHostSessionKey: 'desktop-window-b-private-key', + firstWindowSessionKey: 'desktop-window-a-private-key', + secondWindowSessionKey: 'desktop-window-b-private-key', commandPropagation: 'proven', subagentInheritance: 'not_tested', hookApproval: 'not_applicable', @@ -44,9 +45,10 @@ describe('platform session identity spike contract', () => { const collision = createPlatformSessionSpike({ platform: 'cursor', observedAt: '2026-07-17T12:00:00.000Z', + sessionMode: 'host', hostSessionSource: 'environment', - firstWindowHostSessionKey: 'same-window-key', - secondWindowHostSessionKey: 'same-window-key', + firstWindowSessionKey: 'same-window-key', + secondWindowSessionKey: 'same-window-key', commandPropagation: 'not_proven', subagentInheritance: 'proven', hookApproval: 'not_applicable', @@ -59,6 +61,50 @@ describe('platform session identity spike contract', () => { ready: false, missingPlatforms: expect.arrayContaining(['codex']), explicitRequiredPlatforms: expect.arrayContaining(['cursor']), + unverifiedPlatforms: expect.arrayContaining(['cursor']), + }); + }); + + it('accepts proven explicit-session isolation without trusting host identity', () => { + const spikes = ['claude-code', 'codex', 'cursor', 'copilot', 'zcode'].map( + (platform, index) => + createPlatformSessionSpike({ + platform: platform as + | 'claude-code' + | 'codex' + | 'cursor' + | 'copilot' + | 'zcode', + observedAt: '2026-07-17T12:00:00.000Z', + sessionMode: 'explicit', + hostSessionSource: 'none', + firstWindowSessionKey: `session-${index}-a`, + secondWindowSessionKey: `session-${index}-b`, + commandPropagation: 'proven', + subagentInheritance: 'not_applicable', + subagentInheritanceReason: 'This host exposes no child-agent API.', + hookApproval: 'not_applicable', + evidence: evidence(), + }), + ); + + const firstSpike = spikes[0]; + if (firstSpike === undefined) throw new Error('missing platform spike'); + expect(evaluatePlatformSessionCapability(firstSpike)).toMatchObject({ + hostIdentity: 'explicit_required', + releaseEvidence: 'explicit_session_verified', + }); + expect(platformSpikeFreezeStatus(spikes)).toMatchObject({ + ready: true, + missingPlatforms: [], + unverifiedPlatforms: [], + explicitRequiredPlatforms: [ + 'claude-code', + 'codex', + 'cursor', + 'copilot', + 'zcode', + ], }); }); @@ -67,9 +113,10 @@ describe('platform session identity spike contract', () => { createPlatformSessionSpike({ platform: 'claude-code', observedAt: '2026-07-17T12:00:00.000Z', + sessionMode: 'host', hostSessionSource: 'api', - firstWindowHostSessionKey: 'window-a', - secondWindowHostSessionKey: 'window-b', + firstWindowSessionKey: 'window-a', + secondWindowSessionKey: 'window-b', commandPropagation: 'proven', subagentInheritance: 'not_applicable', hookApproval: 'not_applicable', @@ -80,9 +127,10 @@ describe('platform session identity spike contract', () => { const documented = createPlatformSessionSpike({ platform: 'claude-code', observedAt: '2026-07-17T12:00:00.000Z', + sessionMode: 'host', hostSessionSource: 'api', - firstWindowHostSessionKey: 'window-a', - secondWindowHostSessionKey: 'window-b', + firstWindowSessionKey: 'window-a', + secondWindowSessionKey: 'window-b', commandPropagation: 'proven', subagentInheritance: 'not_applicable', subagentInheritanceReason: 'This host does not expose child agents.', @@ -98,9 +146,10 @@ describe('platform session identity spike contract', () => { const spike = createPlatformSessionSpike({ platform: 'zcode', observedAt: '2026-07-17T12:00:00.000Z', + sessionMode: 'host', hostSessionSource: 'api', - firstWindowHostSessionKey: 'window-a', - secondWindowHostSessionKey: 'window-b', + firstWindowSessionKey: 'window-a', + secondWindowSessionKey: 'window-b', commandPropagation: 'proven', subagentInheritance: 'proven', hookApproval: 'not_applicable', diff --git a/tests/platform-spike-store-contracts.test.ts b/tests/platform-spike-store-contracts.test.ts index 9d1fa7f..5b439d2 100644 --- a/tests/platform-spike-store-contracts.test.ts +++ b/tests/platform-spike-store-contracts.test.ts @@ -52,9 +52,10 @@ function fixtureSpike() { return createPlatformSessionSpike({ platform: 'codex', observedAt: '2026-07-18T12:00:00.000Z', + sessionMode: 'host', hostSessionSource: 'api', - firstWindowHostSessionKey: 'window-a', - secondWindowHostSessionKey: 'window-b', + firstWindowSessionKey: 'window-a', + secondWindowSessionKey: 'window-b', commandPropagation: 'proven', subagentInheritance: 'proven', hookApproval: 'not_applicable', diff --git a/tests/release-check-contracts.test.ts b/tests/release-check-contracts.test.ts new file mode 100644 index 0000000..781d93c --- /dev/null +++ b/tests/release-check-contracts.test.ts @@ -0,0 +1,38 @@ +import { execFile } from 'node:child_process'; +import { readFile } from 'node:fs/promises'; +import path from 'node:path'; +import { promisify } from 'node:util'; +import { describe, expect, it } from 'vitest'; + +const execFileAsync = promisify(execFile); +const root = process.cwd(); +const scriptPath = path.join(root, 'scripts', 'release-check.mjs'); + +describe('release candidate check', () => { + it('documents the immutable candidate input without publishing npm', async () => { + const { stdout } = await execFileAsync(process.execPath, [ + scriptPath, + '--help', + ]); + expect(stdout).toContain('--candidate '); + expect(stdout).toContain('--output '); + + const script = await readFile(scriptPath, 'utf8'); + expect(script).toContain("'cross_clone'"); + expect(script).toContain("'legacy_migration'"); + expect(script).toContain("'tarball_install'"); + expect(script).toContain("'origin_main_unchanged'"); + expect(script).toContain("createHash('sha256')"); + expect(script).not.toMatch(/['"]publish['"]/); + expect(script).not.toContain('dist-tag'); + }); + + it('is registered as an explicit package script', async () => { + const packageMetadata = JSON.parse( + await readFile(path.join(root, 'package.json'), 'utf8'), + ) as { scripts: Record }; + expect(packageMetadata.scripts['release:check']).toBe( + 'node scripts/release-check.mjs', + ); + }); +}); diff --git a/tests/v3-command-contracts.test.ts b/tests/v3-command-contracts.test.ts index 52c308a..2204a14 100644 --- a/tests/v3-command-contracts.test.ts +++ b/tests/v3-command-contracts.test.ts @@ -149,6 +149,7 @@ describe('V3 CLI command contracts', () => { expect( await contextSessionSpike(root, { platform: 'codex', + sessionMode: 'host', hostSessionSource: 'api', subagentInheritance: 'proven', hostVersion: 'fixture-host-1.0.0', @@ -178,6 +179,7 @@ describe('V3 CLI command contracts', () => { expect( await contextSessionSpike(root, { platform: 'codex', + sessionMode: 'host', hostSessionSource: 'api', commandPropagation: 'proven', subagentInheritance: 'proven', @@ -220,6 +222,102 @@ describe('V3 CLI command contracts', () => { } }); + it('records real explicit-session isolation without granting host trust', async () => { + const errors = vi.spyOn(console, 'error').mockImplementation(() => {}); + const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); + try { + await teamIdentityCreate(root, { name: 'Fixture User', json: true }); + await contextSessionNew(root, { client: 'codex', json: true }); + const first = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + }; + await contextSessionNew(root, { client: 'codex', json: true }); + const second = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + }; + vi.stubEnv('MANCODE_SPIKE_SESSION_ID', first.session.sessionId); + vi.stubEnv('MANCODE_SPIKE_SECOND_SESSION_ID', second.session.sessionId); + + expect( + await contextSessionSpike(root, { + platform: 'codex', + sessionMode: 'explicit', + hostSessionSource: 'none', + commandPropagation: 'proven', + subagentInheritance: 'not_applicable', + subagentInheritanceReason: 'This host exposes no child-agent API.', + hostVersion: 'fixture-host-1.0.0', + releaseCandidate: '5c40d6b', + json: true, + }), + ).toBe(0); + const evidence = String(logs.mock.calls.at(-1)?.[0]); + expect(evidence).toContain('explicit_session_verified'); + expect(evidence).toContain('explicit_required'); + expect(evidence).not.toContain(first.session.sessionId); + expect(evidence).not.toContain(second.session.sessionId); + } finally { + vi.unstubAllEnvs(); + errors.mockRestore(); + logs.mockRestore(); + } + }); + + it('rejects fabricated or wrong-client explicit session evidence', async () => { + const errors = vi.spyOn(console, 'error').mockImplementation(() => {}); + const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); + try { + await teamIdentityCreate(root, { name: 'Fixture User', json: true }); + vi.stubEnv('MANCODE_SPIKE_SESSION_ID', id(40)); + vi.stubEnv('MANCODE_SPIKE_SECOND_SESSION_ID', id(41)); + expect( + await contextSessionSpike(root, { + platform: 'codex', + sessionMode: 'explicit', + hostSessionSource: 'none', + commandPropagation: 'proven', + subagentInheritance: 'proven', + hostVersion: 'fixture-host-1.0.0', + releaseCandidate: '5c40d6b', + json: true, + }), + ).toBe(3); + expect(logs.mock.calls.flat().join(' ')).toContain( + 'MANCODE_PLATFORM_SPIKE_SESSION_NOT_FOUND', + ); + + await contextSessionNew(root, { client: 'cursor', json: true }); + const first = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + }; + await contextSessionNew(root, { client: 'cursor', json: true }); + const second = JSON.parse(String(logs.mock.calls.at(-1)?.[0])) as { + session: { sessionId: string }; + }; + vi.stubEnv('MANCODE_SPIKE_SESSION_ID', first.session.sessionId); + vi.stubEnv('MANCODE_SPIKE_SECOND_SESSION_ID', second.session.sessionId); + expect( + await contextSessionSpike(root, { + platform: 'codex', + sessionMode: 'explicit', + hostSessionSource: 'none', + commandPropagation: 'proven', + subagentInheritance: 'proven', + hostVersion: 'fixture-host-1.0.0', + releaseCandidate: '5c40d6b', + json: true, + }), + ).toBe(3); + expect(logs.mock.calls.flat().join(' ')).toContain( + 'MANCODE_PLATFORM_SPIKE_SESSION_CLIENT_MISMATCH', + ); + } finally { + vi.unstubAllEnvs(); + errors.mockRestore(); + logs.mockRestore(); + } + }); + it('keeps checkout runtime registration explicit and idempotent', async () => { const logs = vi.spyOn(console, 'log').mockImplementation(() => {}); const errors = vi.spyOn(console, 'error').mockImplementation(() => {});

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�FOw7D(r5G zV*Fl@yoaErChmQegYb?C&ft8pv}~H@pPB0tyXHD;mKOrJZh3Uhn79J zIuAcRwNY})TGidN?v&igVfCZ@^mCQH06|^=5F0uCP6mc6}b_dvBO%7RH(SEf@WH}j05!_cAgp!N5W=sKXKl< zada&<-0>B2bix%GgMj)e3#k%Sq6!VMZm6(p)4rgIpg+Je2U6o%v1UI9G}sEL*or1U zOx2tv>SHX2rSQXzIpk3WnsXoz^(t6HxAZLGerUTqgkn4EOo}-)KZ{(_6xet%J6J?^ z&GD{&X70Itz!%%?V`>NEA0fUtxW|#h4ODm*;<21YbsujXbTgPsku8-MhDl%d;Y^%^=?v^|kVt&A zFsB0AI9ewrnQQo1hS#3Wra72((w4G^>=@W54mP={U^+7p3JaY66+7;KOviY^&MnJw zzcrut&l{sm{)^<_FNSga&4ujXGMOwPYAH?nf>(e~jww&2WrVXTj^ocvd$Q4KZG1Wy z%?9IHq9vKA(ITCYAS{};NW9VWVZm1L;;G4ctPA1-d-#~d$*I9eAzRtNGG*$$Vaehv zVtiM|zze0Xu;XCat32l)Yt6RM{%p#GSH`nJe=Ors$V06sU(KH+=J7;vBxj~*IGgQIp%0;RAWopPSuOUJXM z43q;aRfMV9R`I`POB2|DH@{~LJ$78DpB)4h)U&4b2*_!tIY*JxBW;9%(=P#2D2#;^n;Ol8JHwaj4lLuYMy`3wU$R&s_D z6AO_29hW4PA+Gcq*Yt3eHBD#Jttn1!)pap0c*TSIV)qp!mO5-59ko0Af2O#%%JhXK z^!U3!VfaxIxP#F7xp;B9h zN^N0iSk_o%_dfUMiOPNTVz<-YIXdY4U9gOmz-L+IscgM-u(u}~iYv4$TE4fA{M4I8 zO0ioYzGRgTPrYh~s&a;B?t2N)5k4njsl+cH|Gh?jQ$3z%I6Ktybq_b;~MHsan4cAhZ z=x2Tb2pS5#t$52O0gUoZKz*QFjm_(fjz|J-WuZpsXS)#&kA?baxE!xY5A)Xbx}iQu zq7#}i7Cwpk?Z!GnwpnyFoy{kL!}xc4M80IMy>zgS_3TyJJu_*Ww30kDNs`&L>PMHV(Y36T7T7h$4y`q$5QeCZlOboVRptY`9))w~6^s7Q4&;kTv0z zgshvl>mlv?MNenHXrPKe;h0pbQnQj%=}#N+)ZV@4slGlK3MZ)7WR#_i{&-w{Py8lT znLk@Z=qB7*;Cs-mz{7gQ+1pJosou$ z;Q&TQ#oV)6m-OORO9$Xo-I)*#4s_&H+#@VeaaA}(e84W7PXvB?PPt+5(PkwwaQt-8 z`LTQ0+G+Qm@9w|Y-GAleD%RFOHEkh~|17OF>QG3o37gplnK^EKm1?GKa|2hyldfaW zbz{G?IUwA%OAlCm?r0U#yn>S@x6q{3!ODhL0r{1HuEBogN|$6he!WX~9Jc@@;VZmM z8<6cMT>mlf6)z7`3Pyf;2F@hVx#t%Q#Az1Q3$%rFWC2uwVQV3-i@|rAtf-z31<85r zqmSy|^t3wpfSR)>05-gHL!ZHO#dKi%F61!9$k>uNNoz}tbSS2UcZdxP2Vi?py89XzkHan>x*7i91l3k5dn09E= zHqA|SA}bYDC>>ECmMf6+HI)TSi$t%vP9CwvFnPm^T_hg_>hk5HBW;vN7)>(+K~9%l zk=hruA$but&Xxm}<=BL$u*DKVG4v67D-=+2h@GLkkT@G?N%V@c*~?D5{f~AI$tPg( zd_sOV_~2)g=9{q@kXxW%CMlFjx2m-WR@`@yEh5RMrMUq+;r8Ld&g(p0z+U0G^el&r z)ya&)KF?mf^NM)G0)OKu6!t?dfmW`Ublz^+uQGHnLGo%}lqv5jJD?<|8KXCW_9doC zOPY!W>N}+=PriLYDonHCr?X!KW8_x(RMp9m6LN$&RunHF!mWFQ7TupT@v0ueBXBF7 z?EQlyak>xw(cb4WT@j6R=;KN_9z*Iv+>0W{6_vbZ03UyFIUxtp;xAYioN7$5DeHo*S zw=j%Z2GFB?r9;H(fUI}0e0T?q2v&uFAE;~Q$g6UvzjQ0pvCmq5S-REhZ)gVZb{u7b z44V_Z5ooGuOhG`TZq+_W6R<0jW2k@z6mw0y7#!M&1I|iOUXL<)?`<8V69{w3XRhUF z((x%YL&kXW(5T#f)}J#Tl+`nsq>H`)Xg@bJj}-(mUqq|-*jhz8_J_SbQE^`G6ZBSM z!C1V37pvvZX-=$$C$WgF$WmAg*GV*XD_C>OTXD^HLW_>*5NTNbx|Lyas`PM4&{Sqp zC&W$8R=ps6XVXB%GSqU~O+qZxF=^tz;4tHZ@?$?sw;Q%a<#oIDg3u3uLNfpveRy?C z>6~L6Z~So#9jM)-hu)EO)Y1q!rV(!?qTbxdw`LB`5j7?`8O?%|<9ub1uvv(vM9a(3 zv>B;3#g}AA2=0cv0UvD!KSz-8IULT~NGD!SObgvLid9RVvyp|}dmE_IGnaJpn~PFH z?B($XDlAhs4@4$CX=&uYEhcn4%^S6$X91_FtJ%!;C7LN9aQahD{L{+6vuC#iZ&s2DApu5M(T?yb)lIcA7v z>G(qJn3@p+==|0%<#M-6*m#4385yWV4>ecas{o>Apd20T=`aL_}2I~E8vs_)=Tg6Ic+;-VA`kd-pZzsz8G%eiS%SC^1I3LaCM{8K$R^#7S zHJq(w;3_^i)yVOyg-(+7g7+o8-1+AmF4u~a+l~s+!9GJr@P5qAqVy3g&?()3LFu|S zvXIiPu*N)d%4I-DZjtDFz!;IG$@l&W5{$p5nB?L^H!iJ&;F=?$1m)|ffD%XvL*0+!zB7(hE0pM%IZ_qC zI#DlNSaQvU-(eZZuMVSC_kfD@D29hh3}3P@NHhs!72J>#T7#fGc%Xpm0p+ID2hL;q z1yTR0w&sC#A~VK-r+KP@QfAORgjvh#sRfak-7~_xBGk@vQ)PMM9@O}{zK60+DyWk;+Z)%Xl@PN)7->L z+JtScO+Phvc{A+IGf>1FYT7vmFYf!xzId}-$XDBqp9N!sz3UNsdcA~A^X0I-+1@V{ zfJ^h!YjVR8`)Wjl)C>Mfg~$R5q}FzjJNqwUg8iZ*$V!6Rv#^aazl+t}>`QfIUGH;@ za(SoLgQS7T3b-Gzj(<7i&#?q=MuCz8X?AK*%PS*fc|`@KH~XDNM=4Sw^BtJ8`OYSL z3Q&Qf$^pC=x@f7j((O=N>5vE~A4Prvj3UO9or+Km4&Bhzl)6dJ^D4R5iW$$mx?N%Z zvrO3)b0ADn0?SS@1O6p*sWBmv?OzAuWhOY5gL(V^mVM(YsrrLh$$V3I2%t4SDPFBB zvW+I;?h45!0?wFfM1Dis6eZOF&q4w{Sss(zRlDg-_+X@{Luf?e2Qg&sNU$FV^L=q` zey6vA-Gx)|4!%aVFdhgQQO;Egc-~}r}G#*IOK+- zY|x(%L;O20WMi{i715DoTcUv#pA=Rd#SCPy(Z~In2rFQE; zOV>HjW1PxXQVXVkFl9bAeE4WAV^fDz7ACFQgyS6M zsfn=M%CAI@sCG-aW*Xj@bj`jzo6kO`EE64Ke%dz$@l;nAe!`<>p;pvX;k8({vSL}f zzA4vm;{fL~%i8ZP;ECdRQa)3QHh1Z^wQ&gs=%KqG9rtUeyZ=fa(NAcFn#Z!WtQy)P zkDXoN1F)HE#i_xD)Wmj`?!z(Ex<*(MR3$-ND3=+d5G_z*gf?a{!((v(4^=%A`o6|K zB6b_w(lgs|0}`15S88~+BiS-yI&!TvK0HmVoNJ%S6HAF{CMw!FXqqj@i^t|LDjkv` zuq)`0@}_09NNx$(A`Md5Y{gr9`XlF{IW8#M+bqJRoF0}XmyCtKg%nCXB~a!K4^zb0$}6=6H_6mTvpuP5XujxBsJ)?T zhFrJ=;W<9}-&!E-k(Lh*1w?r>u1U7-}h^|-h4)UyP? zJbJ>uG1%oL`DI^(6a0o!{JNh7()+HDo&b8z>S9=di(RUzDI804DXNE6vX|?T$)_c9 zAZ|k6QkXmNPKmKeCB_DWoANl+Sd>%fK<5NC>CK)0Eb;4_gUr=9+mSpB>aBZ8KP$e+ z?YFLDMG!;$_i%6bsQ0|n+TD*ueD~*rQ!$2| zER~FHoxH5nCI$TOTyB|cp&I*aDM4e-JLMx zcQMu9kfehMUrDLdjjX=hkzTR=!6|rCM`OP0iR0O>JDdpYn2%)51G#C0!e>9n94)DH zr5_NbBxm}Y1Zgr5a<}}|RCJF*8zH$V*a_AbON1#`t?oSeI-im%M$Mfs84;BRa`&UE zz(=*%6tHprBy>UQ+mYKb-(8lu8|PS`in2Pc!ke$lcIBjlDXoyXQs$U4X&WON46Arr z@v^8pXX8r;3jd~5Fp8zE#Z@nBu`?@VGUT_utB?pVBLRg%nB9>nDZ=Yt1OgOg7p}EA z@_j#)l%|C8A&TqHIF7Qf#1T>AI!8M9dQxp{v=-o=4y-Fw2FPS!@?FUF zJ<1{7X{J}u<~&+Q34JUNypV2kSKG+Oqd{8zbM5kYJvH@Zr1o66PLC-iSdgc{t$EAQ zeJDW&h%VnM2%0fAK-G!~8lF4m){BGD(!_D`tW0J`(nHue7?SBAEVe_0t*HP+E8t@L zdZ`KUQwpM3nYt4W6a&#-`VmfsyLvg=?{)KA&~9{u7D0p(QCv|$%*1Pvfz(pO07ao> zd`5LPQhu7ylF4*wl`EnnEwg8A$J9c6+(8Ptvih}9^BPpPmd&8b6t64kTvu1OuBvHW zEek8xw+6pmUGp01hU;KSYRG#g2vn9k4c8V8R#_v(MAcP?1g{*qL%$e$KhScISGf*~ zNf=*Hn1sctDOqjp>eS8ip8M?)GXk&`XjWj8R-swyM+C3))lJ4tl54|^@`_--)|9_g zY5EB7!2|H`#aRsvBdc!X8>EMT4!sd{?n4z|P_X^+G5TZZ@La+|jKNn$nH=`UO+xrA z+OVv=;D5=|7{X^5h0mUQU%9CW$%pPM@+|;#o8(~(EnMybeGy{0X=9q@Fg^`U3+YBs z|Nn@qqS;Y{Y0jSLej_`zR)yA_+#D{|)5qfCUR=1#@fcjgU$C^dU@2e06+8t)u0)mFMnsmEW1BK>J-CY0yYLUBIBPnHC zn|mQowx3lp>AeUTgq;_qA$yo`xn!28i#r?G+3D3#9(r7faqZr#t6DQ6Sr3BkH zSR-0^$8%97O5BY*rRp2i+@<;U5l_XTNDkirj@#zW%I+yr(R8;rhK;-kG2t`5ATPOSThC9Us_Eg>P;` z)QCxA9#V7(vaWJ6wWlXDfd-%j6`!W+m(8awwT7>j{rM0&9*Ul3^KT1oK6;I!;f-xtWhXoh}satFpy!7bpMy=!tx57NlC~pEZ6i z<95KvnIyK$-C>5wyx-{awV9(z8os}mbA)dCSYpm^M?CRT)TlLRL#WMUw}M?AKXy#( zRF2j>Yq^7o{G|E^KSf<2ZvAue3Ny>O##|aLsBOW7bYf$NcxHxrYDnu6EJKS4@DSXX z;Mw+eG8+0y_mULIC30SNC`)wE1%svHH^W)N=bZ!F+VqfrwBhDn46vDFR5hD#c}Kgu z)b5OF#&~)$w*h)qh+gJPM$5Gcz{G=5Cns_^us}E1Sp5sbsV`(9DWCUd)A4yeDEZnM z^!TgW0-qW+`OcR|*kqvHjK(-C2Lo}@*Jky^Ak1P)Rw z5xd>mIXdX{4m$@gclYuW79dPZE>K%L-JL1pRG9fWJJ>;%J-}!ZhZm>c{iX3Qfja7> zVObL+c&kA47rUJ{tn}~dVFf#>c(S!VbtwJ+JRHrR{HaRDtP6}31aLWrTnCCWB9TH> zu;5t$I3pPciui&CX!-98Y;dmDiTG|)`r%*UW)(QvTY&sorD<}Ox^1;egJAQtKar@s zbFjB3AhCO}-*sFf)DnjdOxenz6K>D_n5EN2-Y3W3T)?a{tq{+z(7c_|?{mPcnVMnmV5hZ5 zvQmfAwrGL|pm_Aqhfdw#OYETgwL59qB66P1dLVMkBQ6%T-Kt09RFL550_Frit;0D! zWMo+k^4KopTuoYB-GYx2lowz|Gk1)#{n_H>Ox!q+|AKGLZTtSiQ=;vaFS*iIUlw9~ z)s~z>nA$lUL!6_MR+(^GqZ7F=Kd`(+MKTB#(S~D-@oG|)k<>Wos`9X&Y~goU3rHt$ zk^aYT$0Ko`Fg`h{s2xyUnJW+QU5 z?Z0Zj=)HK`+1-ED>p%q{hR}Lf8fVMww8}3jE4pE$r(tw<>dKbDXG#_s94g?@2E0tg zz#RSptKZ3Z_Dfc|)hI3m#vpoQ+W2z#P0$b3&<6W77!pG3ob-2#Z_VPz@bmHGDh0Or zu#S_e5tO?xzi*5(OI&K`5-J~e&nF*e;_U2=raxC}D*#fmoC3fU=3U53R9beM zWaklbmo7%ahXHJiSS}fgnHs(q40TwAp+KcMiq-MzaQVn3A3(*1g+TIDpo4^$tPUez zH3S5*{wGvVn7ay0VzLax!Q1^8^4bq!X`x%Ghqgp=jMNCY7CBMp_pcO7a-|K3&jn-z zpWf;m?YVEV76q*X;_{QE5b}wR#u5ahtxL;1^z~( zp?lNDO|8Px&uzXRV`3w!N_~Kf4J|svIGiQTc;J@tIKD^JR4XW{id0l+@|2eu1J;qL zl2J9#lAsm$oDHi)14D&7^gxE%0MQQxk7iDoDB1F&(26W4PpLk3#gP*Qg(~gD#HYbZ zmX3peaZhWVuuwueasjzq#?tAV9HaH8ZwJzH7$`y zwiJ|18dH8l?Z3%~M*Qf$W}7 z7yVz`v|R~)yuE(}3Jyf)CaM=6IDpIL937aNbf>MwY%&^rS5;R{Js~UsR~_Q6iXXuE zWBXcMi%4UG56At{)Ceh$BYhF&<074i6W{k_PoxdOnJ8p#d~<>Cp`0#la0##GGcX}H z&PGG{sqQ~X>cs2C_RU~J=-9FuVim|7U4`3Eb{7BxTMOP(`A@`=dWu%U!D=X zv0I1&T6&^#mU2A_ISRN3s$pZ4$s0m)YUa_(%8)o)5zi0Kb5PH#c^8cagT7C=LE>aV z!q?&}mhISr^%K5c0*Yb!S)z(+2)_uJrZe(R{MtC2{8ZFysrIa{r1+Zkan|D7(?U&) zB0$p4Cqo5w%tKXrMbv4~QkhiBbtg#3O5d_S8ZRMtg8oL;Uh2g#JIS(DqiBlk;Joa2 zff(yWu&&M3^0Y7@k1|tar;{$`2DmZiSH5O>WSojZYAJ4p8}j?9zsG?R%T{m1GAh)a z912ueRaKs-cETyPr6p3`kVvHJkyEco2C1_rftDm5J}|RQ6z#eUXp!6kQ3d*>GLvZS z@4jqzVK&|F?*1z#P5Nr1P}~>A6YZfb*s57J0^Z^INY=#LC8~gJ9WpJh!mUrEMN=?_ z1))rr$J(tf9wL=9cDZ;dPX>!bq1Bb%h%Nk>rnyqhE}Kfd^v#9*_wtza9Sxu=>Xmmh zoy{kbvpOP?Y*ncVLmik!k65fX$!~ezXi4EvlZPcOY$5FKwBH;YwcRqZ>~_+(3o~HQ zcs-m6CM6DPpRuKLBo^mqa6hS&fyH{kms(m0?#su50FNf>##X;aQ^9}_)2v$g=flc+ zN~6%4L;6_P{YZNiAmb6_&ca44k5!2orEm(B+2S;vSN!&hv$5@@mxSMpn80jXYj$Iv ztz@jLav#NVR9Jwa04)i|^(}r^WZeRb^2Ey^eo#^L+iIcYiegj%?0Ni|FUv8C_05Ik z!PO}nonYygy7D(o9@j4KaRTN$*c{xF*+)=FNlr&SrLtc|s@McOjPG2s*QZ@2%p+dZl{Gw~pQ&6C(a zXz!~@+xIx0(ydN8fFg`X@AmKWG>#pW6gl?Naalx6rSQV0Iw*$?kugv2My^m z=G)thuf%A&c=tq|43l6+eF>U1ul|nmG~92!X$!LY|GnMqv|kwAP6Z~IjC7#3(l6;7 zAxpNl0Ybz>g^i=As$EWl3!F#GA#m_!X+S4 z`>BCc^So@#XKJca%#mI%TItCX_UQ|kETEZCIET{DBZNCLj;+dIn_T#Dpg6HSh0BUt z_gOUoflu{QC&q(z>rHR>h1Rfk+AVQUzHII8iCs0(2@yYl?Sy*)G?U8PDL9%Zi<#bg zjSGzm-NwrhV#~0WPAceh1gW*&NR>Xo<|h1CI%Qg8UE5S!P%WzW2zbyKFo(gISwGUb zn-eyMs!unGpqT)xS{h4tV7~3D_Zm|zuxOfedGb`mYga(rMQgMfn{OMiEw!4H@>PXk zKC!{HkkcG{<)MX67;Wef@wg;Y$5jV4>51q#E)s^J)(c@@5n zNx<2osqukj&0LJ%WORl{i}8!45~9siMWdRnAsJlPj+k1j5r z#6dXs3YDlY!=)em0CL?vTye&$1o1@YMR#CwnN!L|?t#E@hE`>fYBiK9gHXBXv>JA- zaxD~OfHSzDLZewUuTk>Y_vR4|#krB2WoNIo`$q5y`|Y1La;r$}z=+1uH;PJid1H5q z9PaK``JLV>_AXI)aCaeG`9hF@yyaKI@1DZ%wOifxhG@Lp@YSfiB+@78{HDnK0>|4l zou`7kfW_v-cC}AZ!~lc=Z+ zw(9Rt%@TJ&@AT%XqtQyyY45am52Xq4P3vgqwO`j`LkxtwzCen6=lNH_E@;gBT13dQ zXJ&)Eg}d*Tjfi0c#|PU!j3>8{KQZ^-CKwcRJFX~)%H}sGhsuwxlRpu+c81@hks6G+ z{4H8@ugbj$nuvU6t1IofLAC|gOt}`E6 zt1|*vqOPBmxf5)TG}6F4Gnrs*Ha6YJNynBXEG2RzQ}V68i6lYYl*frh$I|za_ND5c z&SFj{*W_V=yW3_Rk>b^eMl)1YzD89#HU{7OU4~a^JT{^&FvV}PuC^dB7eJCnbl75OYtXC34j8(VM_#1hLPu*Mn;uB!o;Qgq2Q#4ip!)=G0~ne zVX&TO)1j2mvnDUPuC_p5Re)%M(6!~AH}s^1#u>zOoHyiBcifLNYRnpa?hnpQ6F1ql z5DY{|qXjlVRv6kaJ7 zmV_z_;S*W1%`)k-=|PsuvX{Jy+e(_YOp9nrZ>VaF6-aP5_|CZ@e&_;0*+W@RX)20M-Pj<>L0c-B?XFRX8kM+d^@m2a`$%&YO zBw2&nn{q|rYl%!<$GFekI_eOrG)@<(g~_f=rdM^UpeyYgzeZrjs)MQWw4Hp@U&&>el6ihJvW=}UY*8D(jsFCh5d z`p*=xY*yk}h(~}LEq9DHsT?YPz$`soyy%~2PInwt@^a|RA*UMi5s{08f~Hqs1UGP*kbF=vrhw**GT<%6 z9N6Q~#J?FIQ`C*qn^=TG_@;l(2u*aAYxSRRM4nhc3R`E}iEHvxzJ`R*Jb%3W13C_HbivQEHbcu9hGbrs%-U@TYei z)y;8KzbD4w#xHoAQE=l|y^+RC-}m+qr;Bo~_HzFVZ++@v-w1z8-RyNstCvvuPU%G- z)>*{nwW*ulZdUuK)Ll7{R8x7?3zEB3Cl zoEm+q=oBsCue9BS{adr-*1f2tLZgk)4c`iT7CdGK`P-`+N*m75~)gz zr?-GivaBCBN(F5a+|_6y);_}=A*&I^wY^x&IB2;RmWF*j`@{a(LQon%UaF}Dk zC0oIsbXc`PUM=3Wa=KTVAd`A=Io@P4j%T)%21VVxVIP)Vz}4?X?kF0z@Vaj9%rJOq z{SYD-h-;U@YtK4_so(zIvx{zHL3jGP<8Gfp*DO_Wps8ora0+SKh6-&04Y7EQjWlFM z6#Wm>bJ}tC^UiEJ4fmb>oMDM?=CvR$7a7(T`w$B$=-f8r1+_2-^4pN|A*%O^XUFa7zjvT5I{QcG1pHJ8PWiuHMPYC{=EB=ri=kP_m4S9;}*$JcGom}>{EBN=#e zl{g%p-@|meEq#}z*F&g=R9;bCjJ=n>(%oM7b*s~UAq&?BD>`Dy^PL;C(5&cqw#JyT zx5Q1&nNvxpGvv3h8`0Qv730^#Sc-7Zm($@`TB8)#u4pQ3bJgKxwX7*A$5#H*cFoR9P1r~P)P`+E1V_p-ge)8?i5Xj)DM zmj7G!1!^pW_zl&w4ZhgNh|FdmOZvwdNn`Hieo;Vjp)yV(#%Y*#QgJ>d{Zu#AQ)37` zCs3f}hSdz!>~?4mVa<>l-hv}|$(RaP)iBwYb-Xy?m-ZlYvj_s!d;WI+#U8{8y?_#3 zopx*Ib?ft3Cl|_g zBS_e;n_l=7(Pq1{5504`PTngwjZ@Ak<`m35-NCfIYGO?n%2=1tOK(*IZ3~e$hO!RA zaxI)-+UeLiS|#oYqQYf1#Ap~!AFt$)YY4a(ys@`8cU0II7w;kkA2;F;5%zS@Z;O2; zjIK$RarOu0?_p@I6*R&Jztx*jZYA+LcRuBuONe(7JHz6kLZi8ZsD{`#@3ZDaQkCgW zH_h*mkgZh!5@q8ezz|4yR;}Vq3si8GGaI}M3~i6x3MKCZmjc*n;BRx-YxOu8x_M9B zzwht#4&UzWZ78}}NO8s)H!UrRmP^s(2#rL?sBJ(;WCu5?btI7LzAmL_#895>H2GeI zLN?!umdp$c>$#FwEVstU8X%Iu z?il>eaIFGmVRXJ{79>M>M3Xo)pt6d5RvJ&0Y>zeGWV0m#mJh`SzV(7uZye?z4iQkFW7zc z$pl)R9gTZR=z6{47)gqCTU`ZX128(NVPPb$&uExbbnyXO0n^NK4q;tKB zieAsHKF3KPyZv&0_ZUX2(>80--~*kTj+#}11XXQN!KCJSW)Qy&dYCM?r@S=^4~i={ z`SaisO<*S2AZISvqWo-Bv@VOll_AADv)Oz&nkwU-xn?zm37P|53UYip6_m|MPtqU; z1L9sT1lSY!qT+0Q!|!mDxeo$xGv3Df-DO^6g_d`*NR<@)EQ%1hZ@`N)4Uiz}@Kf{^ z(o~Wv7nS?ZV0OlIiUa036xF)v%4hd=Ev!KH@`Nd5lfWL<*?ZYTYap0imDS(bG50n3 z*6MX@zND!U{^k>0AMC%}+ub?ZOaO>z4Sb&2;iBM=l821AHlNNWsWhpnB5A-2({I}{ zN#1MSh$Vbz%$MTrByFU;k-$7i!0Tju@Y4*8N7+L8tX0h{>>TT+&1>AtP^)_?AwZZ< zFsaqARo13WA&p=xr}9$p8-g?0U`FNF?VTSF4|ey7LmWG7_VFoL?4!Ld?8U@zf);RRgDZYsUN{cMk$W1 zlc5f0(@ zMaqtXW>&c|*Hwtjn=z|P^`tTQ>dHIgR<2ucY{QJ1-MnjLnDR=A8I_NDjZbcI*{@A- zG>8VJ3w@#T;KjUua&u~cjYa^yZtcG~c=@vTqSJa=PSQu^S2Bb}ug3jAED**=-0?at zuk)J0^^VVp^En!4Z-~>`2nPXP)9U!+Bw$@I1F6ka>d#OjR46ViaZ;y5s=Bvu&_CNM zij)DRF&2_qwyL@IwYe4SLsqVnS~|H)c=~(dzZA9$8p;8*AZ@)2p?&C7)p*^W zOshtQWmF}ru~q?Ar7U|@#9(Rli3brjlvbHkc5sRPX)>BX0a>_l2;e`aC!i*moj`#$ zi7STTX|P_YqNUPN(ebhXh3yWC)@cuF`L3Tq7Ev()xmlI4%QeLs+!LZidCD+vgNW>+ zGC^j?>l+d+5BjVYO~gCq3o+o$$YJm}@vuZe!;%0H2O^e#P7rlcj z5mu#$=gW&WHPI#>59nOR4eqE#qWyGe+U^kCv|xOheH1^(ya)==4bpr^xe#SehuLya zzB|*{>uj_9i^rPy5jWO;$@sBVxEvQanWMHXNb$tCLUf;1xwDq#;R!x62(CCH-K&!0 z5hJdIlV`!b4a^=xGTV+lUP*%uw8yY}D|345P?}ZP!4Q?%JeTJi_T58N>;h24!$nWf zV~_G=)^}nM{=#|jyKqC$d}nKCr+s*|A;mpl|LUA)C#6hEj_O|AT$!hlzt7(~B_FS< zlJB(t+TOwNqgFSlGiD0;xm*j?9OItOq_=R2nVb}{{7wjI>5j@IpKVb%$22#b&eUg4gKS-?{Xp#oZ8jgKJk9H;}$Q7);4 z3Mo*HRafz**R0Vi!4cnHwO$VIwr*bg8|Kk$++t|=^HSMU6jT}+lf_>Cv}~$LULVF< zO)B7b;3L#@%8S5#eSNHD1Q~C+?(aCrgMD+M0N+^5-kyos?DVs=TDwH1?09vi?AS78 zy6;QFmmNn!L-X!k${KiRE{%-Hkde9{?qx}uJ>}!(UE->qG@F1Ae;@iDBNy?iIQD%i zzPV6iUMAn0CC00M9jktF*tuG0wfXn{+N&+}aWEbZ3&WEI-5g4IIFw$p&oO8YL2?F$ z^D7ZYs!yUUp$^>UeUq>}>Zu@LvbVb<<|-qu-9qxFkgUpbb$O3;{;arjn-ufye(Rk$ zuPSF5iHgD$WIjBku!+P_2cK$%3JKp*4$jYP1mAR69KZKW$M0czQwd(x5%F3oO25!) z@3eOhkDSu-xGvcpTbF!dd3_hf!)KbxcXak~@2nhm^G*Ai6Y4;y0#37#CX^BK3^;YQ z1z%FRdZor7`xtSBkFOJxYEqHNUe>0||z(!y&%)u!&Ei zJRlROT?Md+zBu+DNw@ytFun%soW9o1(Ltx+^jT?aoe?y%m_J6Si&S&^-?|w}NWOeM zocz~eK;$zjdW1KGjN>uzp$z&#;^P$RBM)6Zs|4Tk27bnn0#`*Q8BW$Oi@Twgz|Pk4 ze>{DPQbWn?|MxxGP;SyBgSljN*aEboAaFHn^{5&h5-HB+qfeu0#YYqGo-TV4=<%dB z^uhlUnlI=(c#vXG-Up~0gu#cF#M#RLn+K_g`l=>`N&LQv-Co|i_uxU2%?A$#N=KMI z5Y!4}(DAsj$nK3MGCRkGRR3q0z<2!XJE^i7LgfN@sQ>=8*KLGA;_h?sO!9UtB{v=*MBCp@>ci$cY<_MPOaIbar@}TnubS#fa8^NNq-X6U^ z=Rxf(0tZ^?u~N|j6bZe(-P51=Vlg%TgPe;s9u z?2*8B(y^-{ppqYo*XjebBpIJ5iee)65yxV0SYv{b4X3H};I^xvpo}loK{`>Nnd2ZMq zjQaIh{MYsR$e@$Ze6uR%JQass`4_++G8UnxP!ABTc6sc&)l;AckEEsE25&T!#S8{% zEl@KMuwL)VHdG>lzxrm@`(joWz?ZsY%Q4tK#cB+0_2-MxiI5Sq3dgDO?2`obqbGm) z=kjIy;magBIvoj8HxeH!+z?<=Q@Ly$*Zi*mAB7+~-%@FOQ{`0-idxalnGmVc`R4#K z>rVlde;F-Kh2SM&AZuy%5jGJ**()4neZb|aOn02!TiKkBhPq9bwdU7^S7kbtdEd*%~*dj|39BYJ(oYRtY#^hU8 zJ0w^IkV(~j^l>@<+0G|Ig0u_`+ow>ZpJb!yCqbh>is@&IdH+mpsv%OQOCe0-1-Ii`$y@+fQ4&{7-1OnmGcO=Ov+4L;hNu)#KaDO1 z3meC7ra))tN@C9i7;8+m(Yg$fQ4wbZoy1Q{)S_j`&?p7dfA<7SW7)H95JG|bX&zuC zaZ$%?cvS#+q-f*S`??E=O~THe<{`T`RRym8I63JHrb!mp(^dD5S3Ik63L7W)mUX4~ zqJ=($T$Q|i8x6cEDbu7xMRuQrZ=@aBMB3#7msp_7$A3n&oiD@?d9nZUpDG%XcM#aMnxY^9aP5s>lUZAAN z(HYb?%B9B^A;Fmze<(sxE6u~?^D1WAT6B7l3`g@6)L-Xj(g;Q&23HH@u3Fs)P=Ji1 z&#VlGr2b7^-}f>X>H*xBUDGX9ZC<5QFpSH(rob~WEI_0GIPFhW>u$ObJi@1pwDKmA z*PM#A_zr6-r+nTM6Zs!7Z#mpL#Kg3x%J)%dL}cA^hOm%8$$ zodNLgZ3G#vHU>!S*H6Ry9>|Q|3Q2(W+OJwWe+Lcw+ZXL#_s8A6yCvBZ z7?}=3D0QFUl%te23jN5u@vO<%{qr;6_|#+6vZ}jT0kjfbVrWt9Jg&DiHjYIojpb?p z1KH|(foXLq+$fB;T6*z9Eks{rU~d2tD9|q3OF#7o=Wo;-m_8uXV2RY0oRVUzTImiN(0Nd3F6ysQ}b|{s|7r|=vvPP$IUW~;q zHafk$m%l$ejgRQiew{m5kzmroT3qg_ZN^=TXtT@u`cD_ zd~ob7fe{dfdN=j@2Dtqgt!AbuwV)BL%8^zc`$V`lY?j%7gVreKHQXX zcI8nCbH&h<+#@b4lU;%q^QCMb+AD?8xM7O5X?z+jPM06Gvn7h@TeKtCQ5`q3!lt@& zx#6w#hhKAp{f^e%W(iuzIe)e&x6@pg@l~8gD~8D!5d8TM>CK?M8oEa<@Mvgter$Kb zE!z7p@I93qzQVIDcd+-grj%e(#B|Kap49Aga^M8zk@z&;B3FVANYRmT0wL;J zpjL7R{KXbRTGsr$Rvw_d=}HOOn+9WH-EXNVMU!VmWNAAKUUJu$sI||$Cr@*knyk=2 zO^i8q`CeN1i!gr}K=e^X12K0onWRoUxgX+D1Lu-CZ=89Kawdd6%iwj`KR=){vyAIy z$Xn^N3ML}HO4`-tvF9OVrivd`DWRAO3V@MG#9!xe1KSc0ETdnCeY6dYmGJ?6+Mf?j zFOQ$PrV-6Te{=D!-2oSCw9&9eQ`LgZtT9i;FoU#O`3%$w%!}S@1=(#6q8$m=!IkBO}$-Oy)6y%6VVI(nV&4}Dc}zazsr zpOH5dWZDx(^Khcs^xYFU7ADhN_2QlvGK^Hh4H!0otNeW5bHaiVO?XgnI16O)L7_{= zju!L2D)hA{#EPtG3L3)n)QcZe!DCROV}hVawm!l56Ifp!liGMO!t#vd6$WjcPK{zm z<&?Fa_$}DHl!8#z9#rECyfMmKu*dytCb)t=_*-hvXqQKSFMC8PORJ&PlaF(8@d_S& z_EEW@fIb0c^T8m5U*{~*NF(^Q**x`AYy|=9e?w;y{I+gBGL_P5Btm>Bll9J)i|29? zRo$3oPcs>G%I%k4EM|%@T@DZ|p!TLCYj6d}R-1;LojRlBZhix&vOOMs8hsq6RSqPZ z6B71~{-7{xh@&e0{$viS);H@fa_Bx4jmgxy5)v|xk6sd@O#pj%-XETxTM)Hu(Vv`s ztE4dr8z6X#*>3j$oqE_8xRy7V8A*mu&3{(s-7N4>HFBWU2xcbJFFo>*klFclUs*=t zk4soGtXu9@AUSm2hB-^}6MfnlMeADWCwNZHs0!_x-nsRb*mPHW$(B2@@YZgo3g&Xb zdg|4p6^T{*8{nrnU2jWF8Y;abaEx2};TtRpYqrFl2eK71#J|aLhQ6}RA-lEL5FVOT z2kCrtf@yM{hV+%egK>YVONO(?@M60$l&^p}kixFcsqSP?ZxVP0_K_V$nP2c%N$t!t zdz@`nF9LP!%-$t5qc7tI{;HbT{!Ac}5Tl#ObMzFO)|0GX<@FX<8Ui(z7b9T029o)c4N0Qrmdjo+d1J$5m5{!i1zCn zi$R7mh&(F|8>@p7lA?5Q?PJOF{$w;C+K8lgSwG_J6%as~k-b@t)K>s($-7{B_Lu?h*AoObPq#(Yds3+$(snJ@_h}h{cQ6nqw#W{##Z1ODa{o`tSE9)YMLkFQXP-E5mW zXz%U5+BJ#bwCPPLg^2Ek)p?@|qcD&@_A7y=6b@Q$9EKXsmJ9JdcUYSgunVabuqL3a zlNRbRSY?i(k@+Zyd*DK`qIK~A?3%3?f3Ji>LY2i&?(t6uz)m_wa>F%phzhmhj61oT z?b|rf7N}JO&s>D$;ad=ZA?Wc+MGT&2mu?AlbI3suY1%|)Fpf+3*f?7S;P<4;@wBB8reD!mC zq|BJpUYXZ6(B!#=F%tM!J_=ZM}}|* zl)@LwcMGyZ?R-7Uh^kIMjTY8Gpe(m~PTY=rDs8wLBHV)eu@BjJ!z+Pz+YR_yn+=uB zg^o7Vm~1%*J0+im2yF}FG#coXubNZKra_(XRKqL~H@5Dj!%yivcP7v*JO{cHg&onx zygLd&*Zhu!iJud*PhT68_#lo*Wej}dkyMz68>_c;0ytpHd}0i>CgTB#uZx@Q?R{k= zW2;;!bB(7%h$=J1P8OzdJ&-v@6J{>r~P)?q8egTOMZ0aXcrd$)niPj&UuQ$z&-|`Xi(gbhGUr*Zk-i6=ne(ib>NSh_H~a(sxe|MLS=1 zTNH*xEWCIM7}2`E+kPdp^=e^L_;5Eh+^Us*| z0!$MOCuKr)$?T`Y9@J%6DhbrG%yKDjR0pskooUOUx~A>kgp{MC2|HFXkJI2BO5QPt zd#(N6&cXf>=ojDa@4Rm9ziK-P(bslmHvXRC3#Cro=}%`bXeV5leCtOes$(+o~7cucGba*aY8WXw$-pOgc^?SK>&8H^&iIA2(w_z6v2S2I z?woSha>|X0SF6iQR)ite7?0#TwYh%>j=fax>0|=EKJ|B43FIe`iR!d{?dv+l?#Rld z$OuuIUWLNALM?w)FWNh*Qf>KKg*mE5dv{O;0x4aX>&Yt@mET0_6w9sbr-ROqFZT|9 zij-nx(}_7&uQ(F8OSN{6cHgxl<52hO?~})XkimC9B;S@Bx_i_ z#anWp)i+H;j(34aO&g2$=^o1;1>Bw$%v$;u!hmdmSJUH6bI4_?tbbIb%eV_wIe)2ZcldDav~)YRBToREF!<6LntWXw~UgR%;YTWLHA|j9!dv1Frp`2CpztyfshC3Z*Rs4Q{&YJ z6P(k_-Od|bS=eQt?##qDZ6>A|_!3dy4U%(Iz*kG!L@^t_k!mzKGCOZ&jcf)zuV_EJ zvxEjMp^rr<$~@`+ zYGy{U9o&X~r}j2(BSQn2LibHt%9sI+cmEYy%_P4GU>%N7Z1PNI{j;<2IoQiA?5@pT z<_@7%DA!;kd$-&EDbG4~XRNw;V-@UmzIm$d>*p zYmwY~i_(*l7Ny&7J=$=b+}CJWLYOM~_uqX}lnqwhqEBsigkEpRFa`bf$PMLLrP%x$ zeO4q#d_7dEKHf?{57pb?E$y2PTc~ccC5mXF?#w9pW|TYo$({Y=&VF)dKUu|o5+bj+ z$9}MB+sSnsP3~+Lceab)UqsoRog&{(!Bh!WdvMy%AfD;Q1C>zUw24q9Hlltv5+7y>L?g<0`Wa;8;WNtV|iY+j@q76xo3>wYMY=T#$rRBww`;(N1~ld21Y?P zeA5*T`-t^H+LVQnj9UB~NsUj{m^Wcrx?Tek(F~U|9l47Bn9<0#%QqMK?OUJvBQeh% zMUtvhqP_?jFv_8dS`7;wD!>o3qH+eUC(NLAb0)0YYmU0J8kJ41o2&VgC&iZ4$j>$_ zy}->yWolk&m0r|K99b9~WGZuJ|2#VLSQdx9GX0`D5x(io<~_kvd?qp&)dF7V)#^{- zn+lv6mHgR^-B3?7FT?4s8X!XzY(w49^Q>_)8ZS~zyIRGkwdC0k3I46`bqOrl$q;mc z#tw%4Vs&>~M+iz3RMp_vS28=%^ROHpbYjLz0nrxc7ITu0gVTxlN6y+{xC-7- zB6Lry$Z#f5%2v#BHk#fc6SaAp^yutD%GrUx7U5$5*)I$ZF}{tVB$cHX7h8tI3y1g0DMtf&`tcgmNnyouNp2|I-fY`PWq zL&ibz@5rkPpY>GwL0B&XxfeU~E6rlwDn|pkEWb94E;uq6h(Tua9VqcGRlK@RkMqLw zS}=|ThMiF$x=5_easbJ@We;GlBflQk{h`UDLvgB7^=Bpy{WFAnc^3t;DSoXSTWO)DasR9@ zs}7D*anxp$Lxq4l;NSYmMazbCd;L`Np=8$b{G2RRa_+w*Z~AAs0BKA_gX#dFP#0)5 zOn;T!yk+&AF%Vu*Y0?GZd-?f?r{+_oh;ly+aI_^@h3?y(op!f-(CO{$wRYe1b`IX| zA8|b-Wf%#=`(7@tF;L_CWY$dhG5}j4>rB9|C{DM=Jx2E=`0#rLMF~FhnQZ1zPzzcK zb@Ma4k8sOZ*%E4g0^l69^G=vpVZi-JF3LY>;S(5Hwd_PJnzw$Uu`4u5>bi3~oT8d} zu5whb(Jb~++msX44R}oXR;^7}x!HhEmAqwoiXrXIQ;AoeS5*a;Vd~iR*f+AuO;1)C z%!}L42(#olMY)HLoWj6Go;X~df7&(q)Q2;y)4}zKpReGA320XKNyF#De@blwaLo6s8Jz*xD_Z+#vNSzJns%Mh`8$%(`}D>CUID^k7en|rVzQDlj3SFit9Qk7Pu!8k{EMHd|&D!K=TWr$V2I@SVYQctW2B; zd))@&)2is*P?SQ+!E&>t=yUbcCd+ ztA4h5Ae80Mt{Do%wkrn)%Wjx5xjvNS9tpWRD)u!`%)A2da+#`|gP6MKajhQ!bROLm ztjc_pX4RSnA8Jt1U!s89m4$Cj(;(ll4v%}uwo+Z3`CD1{ooudack`Liub9@}WObBc zp6v@zmLMzP5|(n<_~@Fkue8_sb)er>{K>E1liar=xnwVF%rS;l2LbN<&x8Kwj>AaA zfKNO|G#sg=w@n^XcDmlPw{Zb!doG#q2^z{xu+ss2IV8xuLC*#ql zQ=5xH&b}c{(L^rnPWxxs>C9MIXXk-#>+3=^);&g-_ zHqIFJ#C5recPOM&3-hk4{WfOXz)U!tqo&(P&WOai{%{u_AA;p`W|VVgA@1qH%`Eb7 zS=Ym*Tr!PNIt{BmIJWe+`OSsz)pU7GER0@?4em5%TPl}kib6ymCKX}F@=q}&vw2<~ zM>?VCMY;kjsn?n8=ANTI@e+Ty1~wI&5BDbm5;NI)cZ+XZZ(` zej7TCUNxyFxG;a~r*p>RI6t3**k1@9_P&?{MMx(zJf?(|)@XC`-bI zJnKXFn8$<0%S^R8P%BO?aCiT8yR&=L0_%OjI3wTjR(mpl<{%>vR)g;T!NFlA78hB< zA#p(DJbj-lsV8|B_uP7VFDyh3nA9jwki3xkT2zl7n4I;B)pm4^nZwquyQe&EK8JWbm4LuP5=w%L^KBx_IRH=Ttr~2gYGOPaKkVra4@pd(OLU!HaN|7 zy*I6_N5n7{D}w!Nn!RQBI7ydf)~yMg#GR=)e$AwE0)JQ7WshYH6~yJPszxPtRgv{h zTN0p92_ba)r&yiq$4*Kx>gc_JU@+8kC=!emG@%~a)S3H72yzj87<#Ly@8qBFD_B^v zBKk>xHGc|ZUXIhOf_zbA2p!48eexB6G9j{p?Mn1|HXaQ|TE&jzHSLn+B4uzvR%OL5 z>j{~iw6kbG@8T}74Obi$&FB5|#we5jYV0tTLNg%}R;wc+ax33M zRcsV~`?W^lDV7?IrW!ov)cKnWIV-`ny*(3r-Hv2+F7RSS6kSNw}*SXJFTO(T^hL`Bv=J_ z?KEoK&t3+=9Dz2Xf0D|j*OO!CG~vjX$AtFao)Z@EP&`qvbE2Q@*fH)=ei|y|3XITv zAti`vD>P)#0VqSP{(GS3jNb)VG)pruAEA)xiEm`qqqhAX~5I% z26Uml)hYJjZZ-8EGI$C%U(oB+IY)R2_NPN_ff^=#v3$^FCRCG#GFYP$PmvJHR}ppe zFH`N-S$H^eMP7b|K=eRyvW1*3%B51U=cGygmK)K5#BF`G5l98d4nU8i=`u~AUUTw` zxc+5BqXAQUptnGIV+@}Y|8i7hG>f962jfvnGs5a->N#Bt4$=~hS?J1T&8IW57_c)M z^A(D$v_^7GR*XQIL;_UmEMSY%9xtNG5>MC1ljs>r#8DZ=LnL%+6ONoLKY${m(kvdx zLt=MRMN?@c&`J>qRRFz+&V(WJPE2Nt)Y3(n;NUW(mS_pIm8X@Yj&W5IaMQg*XFSI$ zvW^;KZOuh!u3@c3hMa}#&1V^uM~;Gn^nGE_^OR{lEC3lmc2oytzU#vf>ZWf`g@7}V zt8X$KSEh`XZK*$&jw`R0{rS-Oz`m$kd!9ZTh~R`HbI`~=3QZ?4s))&n&<_35@IXyB zCQflg4uQ!H;-mSw_@txsBgWCv!xk)2pEi?V7$s&Jt)Ky7D9e;emR9f*bHfyrtFGd% zVpYB}K&)9X`Fb@?Vj+bQIc+n*R$fi%D&YI#fXWS73%HsBv9hP z9e%j>p`42OJ-0G*`?Bccp;o*F9Z1Ra^@XVC`95Yw{-CX>W+nk8kG^olAQ7lUN77?F ze%uIMTsx~y&r1jy-Af|p+u@L6dp;FYd3}`WfKc@m9FA3t5mb=DA=uCj$fV|hmk9^>&%meM%wXV!T}s$kP8d$_jL5tKJ%_x+)n zv#aG63-oWee7x~_O&@XB%yvXR3yp$blUE$z=&Lark4ISwk==kfka4OZxss|Aj}N=E zznpwb=Z#Ue-`}s&FUzXJk9Oa*yGN}zhcQ%!sDatpxhWi^a*9ArAbObn;;-?Rf%VPnNr6AOz4<$rZYmm6LFYQ+k>&c^sl$jxEt>`-IdV($`i>R=? z6pq&XU)CqW-ldqJ_GRzwe(POpcdzxF=BCvXcLw74%DukWbw;ind6AJYH+7ZagFpO1 zy@$kk=YgnEMpx|Ts6p6n*rVkr>iI<)n%DCsXe1kuUJl#n9mVgfw1xcMG^qvC+s($a zE%1Gwoty-UwMqNayC+@I>a}W=m!?h~$30Ln=%Q+|Vr^@tf7@U>HiyoL6($IWSXQ;K zxpnUWTB}l-$F$1Q^V0o_YJT0u^foKj2t)j) zQ77qCaG=Yyt2X8kK1}C_rk%UX0Y`1?Z(7b0~Mi z`|X!XL3G?YQ|Bzc;0*+cX)%c&?6+vevOz>}{N(+?+Lbu=g{RXwTd}J_9|!97ADXil z-i%HYmR7Y+L~9gtyj)YEB_xC(`WfNuISnR*CU!8A9n9=lJp%dPPduF7pgYd=_syB^ znEY!SW>0xyw>N$=)*%evGS|yWoNF%ksT8-65pSMS+Kd!Y#wZG5T>27VL&WH;N|8BX zVaaqgRgbyS6KqD-O;f|K#NC$SZ&&7U*W_{6<8l*goV{>^oha~|&eqvcp*WGUGI!Fm z{%CHFWK-SE!5FHY*%IdWFvQM9GXxLU7NYKCq~E8EG!Xaf{7yu=6Oryjq%R;M$+CO(`q@cx23bsH| z#vob7^plt>lsgcVPHL@FT8jaCD03l|D6A#M#UYZnTJQZ;opY!+uAfmlkWYH`tgud6 z_1GF37^LHA(qp!d49|Ki}~%ii9> zPHV4su)p_r&x)%C35C){EmCAP^uk~wg=GC@tsaWAPfJ$srG;u)OoR&Q6e8X@<*lMs zcUf1Y9xk-}wsb{YU6;;|C!o{T#c{(;%4R`;k0i8c0X!DDK^G@8SIj5i?+PKUv|Vd1 zXik3!)#2^KT5OH9QI`w=;S%SSGGCE`y754h)esd@OSJcPU+ofygCJ(+XrzMZ`Grss z_H~MTRj%|hyAtClw~fAo_lfUdymdnt{p)J}HHeUgyIl*9SKn!#M8tEeWLg&Da&CC= zYYLvsu=uOlz1v+1m*SAiQ?WobiV?Q+pxd__80L>2iU{+tteJQMlk{{^p5SJ~tn`HX zHF)dB+1-3B?=XUZ#aPF0hi4Xk?1d&lPHS=t@I&mM_^Tedjhqq#E*&OkZ`o$@7xhe5 zo0XbbEW>N`eK&KeBDfEUEa)3IYRO%igQ65Azcii(Y$Uc@GV8AsO)0Zl8bPmN&mG?1 zQ4T~+@k}j1?k_FJ5iUBaD8SCu$I%`y!g{F{6uu?Zy>7Zd+#%4Vx|#*^QtJO=ij|0t zt`KwqfH9q*qXkqCLGCIV;UbuY@}%j)HUf#DPTm}waxikeNM*ugjgA2~Qfse=@vd6w z_;%XqVTM%5kC^Jq)t!}MfwkpZsp3}F?%jYj->&drxfnopnuwVNcT6>M%H;9V*Uw1l zYw+1#JJ;gXvn}!za$nrWpJNcdGx6WFiJw<4RUrm-UX3*SX*3>plm*~meuS~a;ZKtv z@|*@%_k;-~L>!{3Q}wbs=!=R&7>l*Ng%4r*U%!CQps z)@;6|Gv3_VvbV~`!7y{C$?Gi`YvIQrdyKC)RtM+>?Sy_0I+$av;WSz-X%Oz?(t)+&(=j~=oDsG~v;^n4X z!l_fSo|b4j5WDVr*_L&w&X@P1zSYdYb6KYDBd0HSRU6AzZS*ZScSRe&wxW$HqZqk3 z#e@99jdvvr-^Ys!maPfMN(-`O$JIdZi;5mH*1CMTL2jIlWQ+{tDP)$2SZ+lxB1fz) zRFqJr$ac_>>zqh3I1@Qj&fI(xh4cyxM|V{|*7mq!Hm-HySSksx$!dH(X?Qo6de^to z5xAf&t^|NIZA7mG>Ws!5v!9`3_QyVuAsj#(vXZ9pd$?}D#xk?}E-B&vh)Za?5V%S2 z$eTMrF((u&O=*u4lg}{hpidx8xmt}7D-{b6|2}W^4&EN^9K2~qiV~^?(UOpQsQcbf z(Sb|_O+8k;RMQ%Ukn2oXotKF^FpDdtqNYhK^BED&sIQh~dXsskH5^YVOdF2(0)Nb`G+{G^`oT%O z&3I&H%a4=MVqv2Q-+9G!@LM`l6IOU1_Dn}8n!b#vqo-7yX!l*av-=W?1wzeFc|gEL zPn?W5t)rdSZj8a#oI5EhlKBGJI-(O7nv82F7nN4=@}vl1;^S6v7&E>?MnAL(A2*7Q zChzi&VyoCO3C$+t=47z9zVhO*I2Cwe4M(!m&TKgyM%wy5TWdO&5&t&Db!pz}+fw@z z0>W?6#qGD@$F>1?9SW45x>D9~+EIV@#`13H38)XH0il$W4mK_^3{e_mAmGtV#*O9{ zy4I1U&*G7#)CU?YFoQ+*lQimJ)Kfa#U8IwyHJ^e;nU_xr_!_}n-r#a`m~5+IW1CUY zx~^%T@hw0;tyBbf}Ml?qxRp9dflVeo|j2uIPaep;9L8*xviGq3N`mcL&(0IJk_A+W_h`VTSdm;JQ$Ei)xue3ok^Km>n^?; zZD7pI=Bkz~(D>zcs~iBXJy8-}dl#*|tiZgwe~L@gm#a#D?N(LSE@9G0D*6vLiO~ci z?j?N2usSgX^~d8UFv-c!!_gd`$v>X_xh@A09FE|2;j#Yv+sEn+sD9LQ`0J6}%K1b- znLPS$_$4`K{ki$^?UQ?g@0iafN#!JaaHaw~v&vIFzq9`0^iPkl1^f`N+||iNDT_-s z8>>_^VufyvPYvB2Y+l9soD`|~-R~f`c&5K$OoH42Evp@zLEruHi;+0qN@1kG0YsM- z!Ou-SQ6}LUJ4`U)9C!{0mPmgH=Beqz;~c$z|f>0`ntk7cB!)N z7*wbR65SY?NKa7zR>NqYG@>P}Kx&GfM3T9n|27M2^o3ps9PKOvT2Hd;=0TY_F5rp~ zf#1M84WN4Bp`h+H1VZABK(Q#Aw=jxNVuA#b@Fq*tSAkuz{EyvvTN;;O3#jT1ZqEcN zoNqUV=}CV%Uc6(CFg3{2K*wEKOgP-V_4`QNfmqRacRN87uA235I`UEa>zQ~qT2u)2 z4I-Y8cI1TIQ%I;lj@CVcbndz=bL8zDTU>AnX1=@^hMd95$azS|lh*<{dgjn4lCW03 zcBoYu8ltwlF1di|us@znQ>15ww8S}yjHDO}K!KkGMqxNj^&@ML8(d3d?CYmDfpZb2 z3r+*IedKABJjh6IZ-0`>5~^ZPPX&7<{#|6jJLf8N3unl#(=u~p9Tm=UwS(?KjXn0U zQN2K-fJ29Vl{mca4B6x;1xolmi&OAv4{N8N*$GfmFif+-d~~*$&5g8MOax=l(DEo} zkYAV~s&+KW2&-Z3JJsdT@MKmn;At~1fR9^>KRCd2&3d1-ntTCvL8KQ7Xx)c*U0qs< z*}{Ny!gok_i>?We=N)b31Zoh#}V{L#`ZFH-=eO z5fmjo&I_cKp*N0?pLf3X-l4XOem}~@`IhtNq$h{u#8W#5UosxKaBA#(e{$?PW>=e# zl)(HhgmZ1bt_#WdV>-5w)=ixCu*dr2*o2S2xsbhH!r7K13)yY7IF-~v(0!?!ABQeRx#Hmg& z8)l>6H!Jiv9$7}m`BuH7U#lmTt0zrlE>%HSDv}n_b#)^XG7ssT3Z-7vp(k*JvuT2A zAefBQnU)cEO$Rh_tj?T76#u1j#;<(^W>e}%c>_*ne(IDpnqW&JUyCuBNy&=Kd}01vCj{Abjl^3wAP%I;wGv#5OwR;@Tz#N#KIO0> zKws$escD~NlW?Ka^BjG{=c4Q0ISY}`NZj+dV_dXq;n z+RD#$@vfVSWB}=A81%>uhVwI1#H2tsx2@FHbs>qKUd9OGzJN?9nGarJ=in@xosQ1% zS}sn+oS%SMw*E9)Y|YaX*vN-shqP@@v!PAyK~8DIDp?82Z@p{n?zNu#)_m6wyzn#_(rrDOE|7r(j><4Yk1UGHegM5Rl*q$CtP2Yo zvpdEjTlCRtL{felpC)b4Tu|44wAhoUi zv*m(6yU2QfH_>$vxUv4@wdge+K zDH#P&W;)!nBr+*K*Pd}zU%^d%H5YXc&q3!XFg#Ehv*~2HFYq|G^)2raFY~e<=I(Ti zYk80b*KCsHB2zbH(l2OGYf19IHjNZBJlyBwTr&7I8Rn z1$b)XK+EvMs*wyRdbRA&;cDui^`#so@cQL^HbJF~?BG+CvsJamFXqb}?unO^#fw8< zzq822f;X}ARn74yid{=P@FUX!W~7F*+h3q7{OS#O6{p#Y^kg(u9!jPgM{+&nx{!35 zErmGHKar*Bx@=&#$6VP09?F^Z*&oQ;fdm7q;hZDromBGx*<<;sdUYZ7$d`Il9{X#) zb6zO|0ZfZ2B?NDE;cikAIv7A)UczLXa2{o&p+K5a~4`3 zGg4RFIc&!9z{^$A+Up2$>F>Sv-*&r4-HIP9lRJ!iAmihR<-FS6e+BNr{ZaO67-GiH9P=kCrQQ>ehtmgAZ|5RNjl3 zii$|&@Q1FSSgiCR)a@2T$BUOH{qbNJj|%FFba|&ql6!6}Xa6-qgzn3I@cpYN>cWj|Rv%K3v@6 z;PHa$kENpTkRZfj@1W&rKYNY_KgqbL6v5x>9%{T2gqkAcT2!^jw8zbp+*e}GFyNE&GslS#o-nZODD zupxytZfYP*X-8hIlvuA`{Is!J5!7(C)8hM+r!D2+^;Sb_c`_de-Qo{_2wuCMx4)Oq zTBjy-(^*?aH<-mb$lwHK@c*;-Zq02aX@b~3>sOqDE4F}c0FtP#s%}Us4Mb5@>=rLW zQmW}?b0`ovBu@(jI5+@R9ElNYhaI*fW@Goo9>;|JV2Ah3yMFO4?2XtTWB2UL)BXkL zcgf5zFX!L@q%KvZdMFVm@0nkI`Q5)5u}~P&`pUP*b9UXPLktCax579waar3f89~OE zf87exqs3)XuIO9T@}g@C8vqAyT76M7a@^W}E=&nr%$DSIt6eKZM`Y5};uvA@<(LLo z#fNqdVverN!(^_OggJ~2_}hz7XlQY^P>Do{hPkLcOmfYY7#A4_sydSTXK#IVeY?B4 z7a7mNBNlZ?HLBjuVrvu+>uU_&rR!%6QGC=c+%AK=riyuGpE6xYa zo%I*p)!(D!VSQ(Vyu1r8gO>HFNqyJLcUitX29-+b{O4bg-)^nPMimiPL!%Z5zZ&j> zK@EQGhY~Y@C@dSzL@?CF7Z;Avs1R>g;(*AiHCYit(Bivpph6g}Vr!gkv z_8g?PD6zG+t7rsi-PythQbanIso!Q(g|zn6+k`nPW6Lsz5x#zc+EP2c12{s%PVT9C z(@uf4p$Q(t&-sLan{WH+&f4yG0k+1G9vREcM#COI~U`_B1c?14i3r{6% z0ySWCG*OyruCbA|C_g1TCcDwAtnZ38)H{6Y8kJnjoP@Utx{SHr#jM)2Y?yt30NKeW zzR2sMKyEI)t{gvsYFE{NwbwVlTiaRR>p~RdvRK*jl`!m-^IW(DC5BSXt#4t9_J#Wg z(gYo|xW^3XApmj13sBv&IFkBqI5ASuEYZ9!)+A9(QFl=jA`l6$@=PjhCQ(@~1@z?k z<`eZ-Ezp6$V%w*^kix1GUtEsyLmV|+q31+QDi&m_N!UU~8f0 zm{|)F&WZREHv;PSM&psz4>IEl`767*mc|6X(7K$}D$9}NV$iCYHhd`~gsG)S^VDw8mL zj$@tW>`o+P&RwUU!ISYBgz8Z+Qv0h}5B`puxH+IN06Vne`gjnfJd!x@1&0;`!7wft z17gs+Q9S+vq0QpcUNqKOyqCGb&w>E)WkI(*$i6opRLfl^fYug2g_~@{b{$d_u7_9X zKw9K+6<8Q8;&^55n3UE=ax~qw82LOMz_&c4F-kHr*-ybWUo?7I!F7^Et#K5S=9a## zJ@*r_uXiPMfftlUwxk7pEP|BxN`}|&E#@qQvrA&*C19JHgl}-glp7e4S9XXDFAnA= z?}!f9RvV@1AU}kdRyGoQu^4tfl8vKTPCUT$u4@%cZhqEt^$pe?DNusuMoo3M=_#e| zT9a(5qu0clDBR$4;WKC|MpyBkW83B9;do7lI(7Xp+~f*|mU3N8CA0OYZFEVl8SqT8 z2)SYfjmeZxRXJ|XvREy45`U(uJYxbIFO(#sSg|QJn4!YbKKJ?%iubeQx{gM|7rR~x z+DV`wsIeFG!(oUuE9^4CRfJ7Wi=_lkyQ^EXgx3Y*u3Fp!rFs%SkvxF3U8? z{EmZHgzqj>0=N# z){V#r^~NI01CXpF`vPOC4~F_BR#F^)8$XfxBm9Xf&ib1q1LpwsyA7Ew&3UkBNWoI$ zCg{~5A!pp$%!UwSF4@f-O5Y6f2aS(z5t>6%wk~QCDOGKKH&NY{ru9j~>($adno1Gv z?*gu6QstALXsP{vt<7@2S~K)96so|ycA&kd^zJ;AhLxVak%s_%qaMv9sI|?7HyVF! z>gtZKOZr2WPt~><-8F{o-kNNxv-wgt6?#cqzrZS+LwtKp6VDFBDj+}8J+`yl*csOw zVA3W^b}!G4fFXXCjb7EO=qN!4__VtUI_16Z4xexCcAu`fb{{@S7TOZ|E=QzjXkugm z-}1xRJ*p@yJc8-=Dfn41@PdvKI0<+AqmB_#N2;=_VI(mzGo*3DS^1v$p+#<^8SQGG zD_5~^ebk(nD86RZS;u_keIwu{CqCEvJ!(iy^S2S#s-9gLFcmCbd+IkSN~naVO28uh zYCYsrJeXLO2;gsSR~P~S=jOQlHx1dYE)q({D4#N`p@%*A^7;oqpqkolblDYGc0~_t z(-&hcg?cb07vUrR5=TZ$prVNJSyex$<&J275&2D7KtZ%{TL=q8wG54BtheP6L4l@R zqJsG|k79yA-?-e==c0l--#{>3E6^rU4G%pOR(1q(L0+1VPuLhS!<%zp7JK0)Ok5$# z;y8&~QlyT#Sc0lKXu^EDK|CRR7IK@AeNsmhiGK^zQ%a>`FsaTlFXhe0({wU-ZCJ}$ zn*QRhOe}hkUXWt|R)k+-Lq=m!rhZ*>N0@x0Er|fmGVYIyqSeKnQ|CIfM?L1N_{)p# zb>f_g4xjM_hc!b2+4T#}b=U=y{SD*Out##gH|m1lA#E~yNk2)C(~0!FcD||I!%XMzgN-57^lc>E z6SZe*`nDNRs~;=3u9;|1bB@*sFzp$2$j07=ODT8v_fE@9K%AFZk*6ao0|FzV+mk>b z1rgvwRwyiVnm1Ugq)OTAwyqXCK#Ycji22pd$RL@9lQ9(G%OgKSPR)yJYz(6(XYOv{ zDlsw7Fh!AX!TO{^O1}c-+h5d=%widV8wM9+BEB2!uiC5hhlI9*wr(B12(cW?<8UYZ zj;vY)dU*gU%VKlx?X?~9724ff+jjjV_15S6*weuy)W35a9lfv$$xXd6^xLw!wXywd zZO`{kqBZC0{ZH$6nzR)Sa=`GGpIcW&F`GrFv$gYNZ6|aP)kfS#BucOgzxkwbVtO*` zbYc%5^4UEiRi3VHunW&Jxk^Z;8l*#+=fCe{FR388=XMr}^1}3Y-frvPLQ~G1)x{4U zB&31(*ucu1>#7&-y&1tB0XbHt} zNV0r$JbemAyZ7#JY2dUU2IY|WP1Zer`Wq;ZF<=fUTKgR+$@u(TZJ~F?)gU3_D3@V;~ zTbQmzh%xc7@i$Knx}o33yS(;?J0-7@b=eYGV=|Mja1gvm*n4b_l-`Bqm|lXNYt7MS z))Di18J!o8;L@5Q%t)ObJWSx-1_gwk$49Uc_`J|psm`mR&P%;dT&63v`z9Xv+UC~U z=3cEdyDZ_ONO~VCC`<2CmgB%N;%K<`DIB8Vp_Af>id;KhQKhj`61p z$_m0_qI;hRrrDVve0^U>mZE0AOD}aK%Lc{P)$w^>8@+=YQZtN(8QA2bT-Jj4b0^Vu z{gxAD5`ozZcVjX&IOe!9P;PpiMS}O}qBw`_sFN2mWc8)Xz7LC;qVBjX#6UfC&0)mT>;1oJhuhols9)#drAhJD))>n1h^c);qfpT)@S&t%$ zhCd4+F6Z@R8p~+wPEQNOS6@8Fy0fVSdK4ZJEHqmfMBUpU8**K5f^_t8r|P#X4a)8W zW|yJnO@Q`Ag0vT`#l&hCLG{W*G`erEf%s^g(D@-k-QMCjC>|y>fc3JFpuw#w7^>hZ zRD#u;U+5h8yGCS74t1^S>gXZQNBz^@=p-GOyX*&UVc4eX#_CF|gOKHNUliS@Qpn6O zOMncWSq^j!&yT>`AlT>29l9w-x~dd*GqRO#;7yt?m{xCy%lFdB8BA8{NYH<@IzzL!wzILm*?kto z?8A;$l863;fpGGMvr=qsv!LYKOh(J9;SW{#q#&}EGfqA`hk&Akg$CN*+1l7b;q(F{ zk!QahhHVTyrn2Zfoqcl~3DiPdy4NR%37nuI@Y}b^XKp!511cC)K7O{f`a1}mzO&Zd z-P$aV$%AZncQoiCB8x!s8_#KgH%sHrIExZtO$=zuXsNfnSVWJ*EeVpqM{89Ip6GAP z?p}BA`EH@QqT<#>H>SjyxX^>%nAKRjh%S)gQFAoeYMTXja~XL07pQ$znAsj=JCqnA#fG{eEp>M zdK31{48#GG-9e4$;K`*cd{t$haL_yz42+I&umEvmNK#qUI|A37QLIRyVJQ)Wuur!+ z!d=UV1#KRaNaAm#ktj@^-UtzODJ~*(!n^@#uo96Geo!eL%i4?pL3HDMTw2=4o6G^L zXct3~pJ*!Bm6mdASWut2;hj7s3Ad)Pk~siTw)3Y8v(E`>#} z;vTLIvlFn1SgF&>+lENx-^WBP+kMiVY>v0d`{z4yh|?XIJlsxRBqO~;&%IS}szdUP ze(zv5MEW|fAI=MobukoV(aeu#K#4cqAzhi++$8k|qO=G9wz|P7{h6ETbKmXbY&g}i zSir;uKBM|P1-(d*SBSg6J3GqLDODjL)O!pj(2!*)k~Bt70=rTCzD-!V>lfWK3fkDr zJqfPgxP%(=^MECZcU)~;QXbBpeZ@Ac1RB)*1(%CKtL~0bDvd6kY&abu3D50y82AEk zZ`MX0U;}<64jNi=Hnt0IK31k%f8)vwI^M1{J%M+pXzsD;=Cd>Kr0fJZf0qhO(f~D3 z*KsAbRX0tU6%}))ROd#v`E#%@9e;~l2{tmm8`XjeAx-8(NHn6yo8ml0iXHrD(=;eaI)K z<32deDmcCnyU&5DYL_>H=YrJ6!Rah|^I=CG2t1$A#!r6~rN&|2NN^YF(C)UV+gVLVC%6dO|~E++OaLLe;;P5F`4ws-Bv z&E(EyPI)O-zg8 zg($>|)GOELH#@J#mP%?fz1(jBOoJ4h7V}kMUX~@|79r!7CFHJ0%EcbgSRYXn7V(a{ zwiDhdb-bgtgP-FN7CdsV7_^vFfMi zW}4d!2y_tCy#Ik%sUHDXgfaIty83WzkwqsGKt2ZApOk;@qjGKP|C1SfG4D~)9R3pn zQb_Ip6ey@lM){@0RCROwPjuEtLT6Q^PHrtNT>eA>gcLxLd%?S>0gA0tc>wXM-{6a0 z_EZE9`#bTviYD`T=g&=H#M#gVVBm@+NG7=ZQj14KZI<|g7 z(+JM9??ihVpgr@RxWS}F8?T1R#Z^gTyL4`?IWes`qsUV$q z$zCj`i3CTbV~VfL$+bpw1N8`hFY?f6H$ius3!ubpv=z;pB(RH@J&By`b}F7I)%M3I z?)}^v7!W||2^|UANK|@C{%sM+hH>34d=iW5a1TLS5|unDO%Xzgo}gYsHf64|w6O*} zKl<82sTZ7pV{QfpfFLqW_6gByo~w=k>rg8B)jx_kQ*9?Fj?=7+UtjQsG~GN6lJXD8 zG{1`=mBXTgTC4ej0kG6(BXrt_(yZua1h?l1g_D%eRZCut>xS8}AjgEC*_?xiU_OSE zIWuCyN{`ll?d7Nl8M9dWwfXdf(D2#(YFw6=cOw(B1+1N)G9#KaBc3*+EOACWbw6Am3R|vvl#+@;5Re)Q! zSbJ!i=z(59Cw}l;UXZk-hHH*+btSh(KcOA_m=>_phDD5X*-N3R1#nVPDvk&%XZiMu zXH)^Z6rPhW5M)em_#=KGEz1ZM6nSmk%+1MFAxIY8XpevQ=&3MR!UAN@@`R2n8X&^K zC40?~ma+(xZ_I!Al;n}5u*(QZJiA9s{yd4w3C-j~QpQ@AN@B%Bnt3RL3Q4A@l#GHL z7%1Wo(Tl$r2uC1F!z^U3Nwf25)NW%ja$pIP12zPNIp3v2M#M3T3v%70-SGlQikN|> z##wL5?*Du%Lr3r;mV0MyV`~roSzTM--aFh_-`(i$t$r8vXnj*)KPz@NW<={JRyEb* zmxhn0Q+QzBYCDDdAT^FL?pu1tR|dcZXtW3rCZ6e$4D7Ke_$>#3B_Nm>nn0hv<70w2yOuT@m8f%NOg3OfcR9ZyTwwQ2kuHu<;e6D`i-TYQ)p*Oeo z4!f&+>o3+^uYE~F$MTL|H=}4UPAm;4tF$oGviPvrQeAgxXH1(0xh)eAvz!|X6@#1V z#JjaX01B-FOj|fD_3z$VcjIvTSr>vPY(8Dz*`V;g;ocC0ZxEnut6?}IQ9T%6XAO3p z+d~ILPb%8vSDj`p@@nB{$f_mFSxbQGyPl3L6HyAl4pA<79Qp+W*}=$5WFYm%r_~Cm zG*_m0R3u4^Cc2J>Evo=#MNbuv9)GA<69^Qtsmb5k5DUkl+(l3_vrtVf;~7EF;Z9OJ zhQB#)BysWlslr>n`mDRYq2LLFF2sOKr~Q&S>|(BkB6$Hhe!9NSWr0~0r#wqtS3Re@}JZoG0btFU!36-1CFk%xA!ad*0PjHb|Do7iQKxGL$~3kv&L5IRyPV_8Fu4Ct$2nh;;O zH6*$?>g8!LDfsvZt7+!VNfGZl$MR38S>r=iNF()b2L~ZgES!#wHAs4DM}T2XWPmvB zJ){?G9?p*72&`p{%if+`Rt@EkO|}Y@ckDDqZ39Z; z&_>F0LJV+*0IYQ2Y2>UApiu})<8hIQ!J0yuHo|uN>3Aaen7W*0;L7K03D|CWetEu7 zr;r8J>3d_WdU%SIUrmNC(G#-D(Bh*In;_4F;D$DWgH3P`LcU86TgTlFUTtU2sf8ZI zE-nddyc~4gTu4$miAobE^ZbcpTYcs2HNQ0C0_ULU5%iiVkFC#O^DZF~kS==16EukU_^ zrFL>y%k=KznhJMKkhmTUdGxJ!kn`zX@(L*+at;3k`WaxMI+lNG2B5^o2=3>GO^uBd zus?qpRJEq<_DLnn-d{F9c_o@V*r02Yv)D}`4O>dLmLQHI+SNS`ZT~0F#KS4h^B~Vl z;}q}I3eW(bT?`vIS+ykn+EtVRQb=K?c6dLM^*H+5$ zGdFf7t)^O!Tv=0`iR|c|goONnl9CF3Hw72*Lkq^tWDePu;UnDL!oUpH13`yhFp*f} zx)}kXQfjS1RXFL*lcK7BA9oM8p6{)0ZL9?XR5$UW9O5%?i1}WCdJGXJSME(1QzCRP zlk`rRSI%NSIex5}hi&sSI1c6YaSSkS+^^?Y+LjIqoK z;C{&Rsk-#cJMJoe%xq1-v^k8LbwN)mHFg$}W%uRT%>$oLp`yy19EQpi-jRU}FE zxPSjxVdUp&c_O>k@yZed#4rL*nMwcX6py9R!fWEu)rg<;I1MD z3yjA_V#~^=C?mQwaq8%o8Q(N z1xoov95c*rI8s&N!>PGgwScK~n zYllzPU##tXYc;rG(mUyOF7oot&(ubhH7W@+3VkLr3eBA}+xo0-ZSAOIbQFZUhr8c( z)ia0d3gWf%xUqD8g|1HKeD#;M^^>ZqG~e6lZtiYx?Vy>0y0u`i@Y}8R&9z7dTz{0} z$%Zag&JFdvv*y_7dBHK9$JGSNh&jEQL)9aRFaqUJ_k6SaqPzaA`}o2fdLpj#CE@1-#&c02G%7T>$|%GEtw6${sWHArBDq0 zA_%F+Gr*4R(pkdMGYjE*uE}nV0%-g;pTHZQyV$RZ%f5ji<$l0PRoP=-x2lJ zp_)#VX=s-{y`dB)qBt^y%yY7X)>?P(Y1{(|DjgjzW~vm3$(5nWS&?2$;3bjrM5iDE zf%R{9w>I09b0a&x^zfLhIsf$K=8>c%Ih(;1O%qJygkuHyS5h$4%K93shHF?6({Qg* zHXImV8`-X|J1sa5m#V!+KNTMbzp+WP2m!kLz`{`o?mNOgh)Xa?NL?sn!l)pMx0L<- z@|S`zMA~AGJ6c~aovkrVIk0K)*0%oG&s!IFYmpEifi%#h0^yxA5hI?DUa47+42cc! zbO$8g=%F$>W6?JeLt25|8;YLbCl%kZj*Ewn*M-s zG^wT|`Az$$xIx0IDjIlPcvFGPFoCI{mZ>4=p7De-hY|gy?SY)LMW1` zf9X4}40ss$Zh@q3LyGEgSy9CWgY>vJ8&2iS^`}MWyWn(jkOgOp#=X50_aNyL%{Ei5 z+!^ZfqLDzSpc=X3xS>RJGSr@8cFw0@zpx7KQVREod4z>UGZK3Sh3#w*Zk1Qir!I?6 zS4wKp>|sdXr@BFV^=Cw|;l` z4n2G36L1deo9lb)ir@cdYfrvb#dk$93jz+iJKx?@MJxAxPkTL1eKH=aJ(_^p_=soG zOnQ?OcxTnENyd0J;Mbcg`Ho-Q!`Q8^*A!U(ybuK_x?Ry@7;?#N3%hr5?~uiD9=)dL z`Ql#jOwA-6!|2c0_pUcRT?5HWt_WoK@zqKjTv%;)wKl)swI<5#6_t;fC>sqacy;C+ zCMMJXs=#*2UIf;`f~SYwTE_*$1-!U-`2EiM-kRlI(TE-SS&;ytws)H4+D{O|tit^S zYYLve2_bVdgOfPxWg{RjlfkSvB%7?W?1a-SCC~GeudvzTT;YdlHY7PMRjYaK6IKi@ zR@899Fph_5dpJI+d-U=fa(++UfABMPV)I1`|IkZ zb$^dJqQQSF;+M_pERw)FXvW7EFEyfB=c$;0k;QW|efyn>nE)Po4kpor7?KC7>08wF zy=7mlZ;}VVJ${qCb;uU_x<2@Zf|Ds^m$X{oxt~0MhYhL|eAtQ)0LQ&0=eD=pS4)ke zo`ko|^68&&tDy_JNw$kt3yhOnnx9f*L1+xH-+dc;6+s7luVoJk$Ev*;<9guw_!HDN z0dHZYgG}wp+x%5_Zsr8|O8o;rZPT|2L2=|@UAPV?qJro{i_scZ9&D-*ErZClfQ$j; zD!VTxU;JJX=@#?~NO!qjX$K3sMLeMTt<(`caz#C1>2g!#XRn}VdiIv<*+I|+{YwPB z+$eBeih2iMxMk;#k5u8Tp>(;P`H3l_!?AQpVAIi`i=c$dm%Jb#jw-w%)>3xKxkHGb z!ihuS4#tn%fFM9i0?K3zT8%u3rXAN$Q`!@%Q6OvAols;=^YWq zF(&lD*oIQicFWDvc02tMBThm$ZzZYj>o!K@FreR6)>r$ewwcQ#krqPyX((D zC2zvsK!YSxs|IeP(g>0YMvbS#&AEVv9F^snRo%&x@j7Ai^G56>^S9QPnfG7@y;8KF=VK|hLV;(lM zn@; z-`pxkxyEPN?>6*Fvofz!zz#uwE8eg4L27H_hF?hBD7(vUdbbeA;K?X1-_9t zK~>=U2_Ex4W#JPR0ZHKta~#LQ1z9<>uGMF2-Oa=2o4e1q!K%^laB`*$BU!DgR6u~pC{Dw%*i6OFMfWfWG`pDs!I5Bj;Vn3 zZMAev&6e?jdN6|T9D?nE;2GaC!}ylD#kaj95Zb6ONJHy40F=G(mOOxK@=bNBTGCC? zbYZ%1Zo;se+Fi;gW~zPf?IsIwbGus#e+K)ozYR((L0~Q)AhAyPa;@8av~Vkg<>Y;iUmGS`?X^{PDiA1beb)(+R^{eI@Xz@e zydW>YLSmYpq?2#nKVu#@6Gn#-K}BnRxIEL(Lno-8!egP^$-{`-iH8v2rGje)Y@^h2 zFPAXLDk-&jH^wAd5j%xGgl4mLse)dzuauR2gcmNnZ)Lab8h7m--ZU>)UzJ-nS5nC* zQFz1r`?XRgu+&wexq-pul7r0add}w{@|LYFq*OmHBghm8hJ4-=Y~tMm8IX(x=elsk@Q~ak#mL6gK0tVXCi;V)wu1<_dCwu$ zIf&)MC?PMRDBc`9wff!qGaw6hpFi6>+yIx}%KR#>E5UVxbs4O=<@2r&uu`iMOUqs8 z4^WF*+bZsFWPy3hh>=wvV3%5aF!XUrN`4!svoJ01cEXTq`p{?5cfU&v$>C*qG_{g# zCbidz(ymAQ2>1wp`ogumU~=z~*T9h(%`pTScEfNMF(3hEEdUGjmB`;e1M*Htf-^#B z0>v#%6j=O2p`9gnWXlXT?+eYKSKAadmZ30Q5cEqO=(C|eIjXOR5=~rj5nDFIiytwy z&=(o0bshWdXFyX#9-5mVD+qZ=s)C-SfyvLoE3ax+QN_&d8p37yplgwokr_wBHjfycwdY z;&zI4(z~T5(eI5wk#&T!$0JCS__Gr z8@;ZuKqu@jivvMblJej8sc?qi~wd`o&jo2*KkANkHD{smiVm4nG8xSadzl!+Rb zCSh)fh_N#u*Gy{(%}!)+g9)9=thbBk4s*QTd-Lf4^W2$S)P>0+a<%M0U_>wFQn|n4s28=@*|B(=zUSUTT##_n(T26-Quriy$QsO8j0%m+sCYEEW#hl zVGp8N0DB<8JJ%ArNETSdBe;@=aT@3ref1$3#F756h^tt^QoYR()#2KLESWgAvV#`J zv8D+p59spGHC3e;6qMB#rt;0t*S^l#zn_QvYrd%-4~APK=csq>w`$ulI_y&gNOjNG zE%H#xTjFP#|LK?n`lfsYRIVu>VzGB+&$om*p9u;2@f*;EO1pazrClO&BT}*fTiY)Y z`{1Nm5KX*-Pv(5@#GKD3%lrJy$8XJtGRL#wbAQB2?V{VUQg}NG?#4>d-S`Qs%^eEu zCa7bkJEE*Lk!KZc@a9J1`G781t6Lz~Tfq0qsN*VoU+uSA+RNtwdadc73wTrgR7hJi zZtRY+gX3QzS>>LYC;Ff^(jJ}<6KdvbV6_l=l zqx9N8JHtQS3B(n7aZm2a$7C%ROJLHeDvnLc3B5oht0QiIoUf9*1-h0KTi~bvA~}e2 zXKi(B=gG~O@8LZ#FOuBViZ9c=_{BexmkIFZTJ_+FIyU-pZxXfsdA~*kH$V4x2;l{A zENq68A?c%fh6rGPrVo%_yk&Yc zyY$e5!yBcI5CEU5OC4FM3wR7?V!;BimR^^>NYanc3AlE1VHj|!Pu5n84%S_+z9nM4 z?zJ$tA`yYj?8W$rTM^+NJxpRC`Y1w5T+ggXy&v^hT<{=bw~p=EKp1+|=H!z?Q-srY zLVuV~ZoJz=DfHE*yBTsvoVsN_*>sKBj4T@AM3GO`7x7pI8T#plmuIDoZ1(uk*pc-^m&KMZ} zQorNT^=JcK6n-C#4=1TYY5sT0JbO4* z-!0$0?cQXX^|SNdXv%Kdym`5|dwKcxiCl8D6oqPJKMED+c{-UsA7%sUuqkCFb`}Xc zhu8cRmDF1#(L`KAARpaCfCJ4jgL>ON$S0Tp75mjnJIlLAiW-_t&4qfzOX=t;OfJRx zzHcWA^MNV+>R#OpqZT`x9{;-5m@|Ku8Y)@?4}`h5@f_=AvXV$IWmz@nrS}!PD07j_ zai(nN!>pgy@9Km?Nv+YIPO`IlBjB6dUT;1f#p=%5BFR4HCiec3lJOK@a_fBR#yh3Y z$)iW!7kJUbjBFx+?q|{LBHUegj3ELu+COt-Xk`b+pPC8lBr{Y}aIX|3=K*o83IVZ) zD}AWNvQ;tbp2H5F;l%jIo;pxV#g7%RUIqkwo4)fuhIY?R6uFdZ)#pH=^!^mO>zYw^ zsY*rVXThjok~^9{>0Rn%sg}lrOHFCXI!XQZFOokyJluZ1vvzox{Ngrl@Do*9Z>SqL zUft&riA~_W-te*Rwn~pg8ENxCcelryG@( zYMUM}M2b3Im(5ydreSN@fUZu8I&LcS)`=iP_M=>h|9E%G9(Hjlb(swdUlbc69_C0} za2rO;0Q)=VKNn^@t3+lSWNPj(vcs4nJpd4Ai^By+8`xqGj$seZB0=By`-ckaz>ngM zSTfUtxnL*pDNbrf9tM*6JbB=Y23-o$+?Vh_RX0PrYQu0Mmb;)09FUQlEQtr1ACxDXxb#El=nEf3#BWyn7Yc?i#f7_l4rtXhp#!i zOTEG45$Q<|;+;9aH@1tj-sII_{Cd%D&IV2=Od&zdd*!_tX}_JwFrBIm%T8d+L15v3 z+u$h%-$mAK|0ypQ$hf!Wk)s3(#WUt$oM!j^(VVLh7ud9ZT`N;BA%d1@jO=q)s2gs% zFSn{0Y*I7Wp7Lz-Fj-v_oh5e_ zD{-vwUG5{5rn6g4CzN5R2pcs;7(_q0X2{;zlEvAsN)*k*hw|9rX3A59e=HEtAG)MkBJHE8v6XB}t&#PHja-&-!M!Awh0=+1I zub96Zo`5Auhj}_D|M*jbrd?g2eoe2E`sZ(MWIb1nXu9(1*~0;IO~%9FQLq1MePpA+ zC&xXtPI3I=diz2!@2(dW^X-e|JurxeClW&qyXkZ~Oa}%-z#`GIP2vE9C7KTEZZu09 zNxTuFF3}j#0wR-N`N+gyrH5WDf=S}rtv|MN&~=#+>&!nll84_|UfL!)R^ahRR0)>I z0X6&jZ~;Dd7OF`lWY+F4M9@T5{3v+|$-HsEtNZrkU-xp=pRV>&&4nv1;2!)FBD3E! ziCbmv(f~mRqNdd-npEJpmxXrB`RVwz8H!d&E?};XK#ap4L9x~HdZ~jTw($HFU>xmH zHq8iQ2Mf@5X*`=MY9}%&8rj!AL@_Y$1#Z5a#5T&lWeRQ#*zar_%n^hr0fPb6zruSG zEzpPUm;9z-z#~Z79aHYl=YI4^vVv9@FU$ftXJk0Sp3RC)`hwQQO33JZg{~X;=WmkN zrzv!BteT%Hf+R^VvH{q-)QYrL@FLQgTJQ=E!VP${5YWm%IEC90*%G8IoNeh1kvJ#< zUrWLi#m{lbe7lH{)-SkueD|D=06$hBZOV5+N(Nws0j~&%$C_XG>oeHI?o8xhZk5xa z=4$ABsc^H1sB@>3E(9P-f5;#*^2u^ojrUe}QgOc)#cd%>I05wu8iY?~(Okt^)kRAk zJo$7y*-@K2$Vj#)A|_EANu0q@k09WWuD&y#jRraFy|>}KKbkG+_50~Lk~NM1O5gTt zUAoWT@coC^S#EIcN*cq8DNuSXJ$T7Y3|*JN54|R*E153^lc(bWJAluoV+cz`mNmKt z=di>Y=b)Y$IPOBS__(Ji+2Ud!bywKD==LRgRdTO*A!ZG{V>~`h{4GuJt)7VJ)9j<& zNxE~U!zb$YX2bk`bQ^h?hjNp`J$xuO$=w8P_w$|Sp!U!-~FmCr`YgUQQ=q$55|Am^*{;A{s503 z10n+>?23w9*X?izbug|^n_Fb%IbVZr&|JPtv~#v#hp4C(Q|nTagF!ko zXhnh>5drWlb7-zTQ?qVlFogbuJxS9cm;I>p-e8R~veU17|HfG6GV74JT;wwHE|S_i zXI5^~QM&o&(ZT&rq?AGmKKRMI2(}6e+)mnox~)vjbt^b}p~k!AxN_(GK@7q*T;F-JWu!#@q-PpB0+Fizva4E`>5oFyklkh$=gwCPH4D1Z zD+a;tftdg6UM_*)F;T5*mQpC<+R$r>34T!MOEJo7haa^ugK7SKrp~^$FM;AfZdiUg zo(%^$jv9r7D9LeroDHO9q?(@2{g^tqe`;s~IT5Xtak`@&Q_sGf*&}QE#%;`i`kK1S z?<6nXH7itEWpR)6H~nNd#Owf7C=Mpp(_q{S^hUuM0>xrxFJ)fMVD7BPB@g4px#7rOPE4YWH?yYN;#vBAsX~U(bvz{tPXyw2En;ENZd{ zj^M#)o|e)(HA}|SILt+1pP8Nn(mh_=J1fTI*~p=?Ii1| zBI@(%wyDI+qwZB*3@mbCip3p8?A*9NFYw|gogeA^O3Cz>MpfcS6dakbQBd8a(y+#I z!s33H7ud?%6!vIjR;`1RYJ|Susov5t2+8cET7x40ghE!2a zO=ID0aRY7J0MU${b!KVaJuu5eI=xmNw2N17P1u1<*M4S&Rm4}2 zgt<&feydQPp`ixWv#>(ei1&NBHNtWTt}wlH8WC~O_1aZa5ZXIeu;Gd}q`(fw<}HY+ zlG3?Sj#S7tu7`vcKo@a@F*m7lr88YdKEme@^PZdUcnMXydS_`e~hf-!@1qvapYyvJCg#=00IVO!njTxL!wK?Zz5GIUR zt9(|vUuR)UpBFZdmBOS1mkr9#)%?QjAPH6`d85+tXl1`Vp8%_J6RcM)W2t{|Urk)U5Zspx_qWWCcd)oBgiBoE*QzST$j)@;UGK*eu?FphhHUymaF zP=a^)w3Lh71u@`>+3Bq>6thpnmVERA_PJv5cPLe-E5&B- zR7~es8QUWGtOZ{LZLtAg?r@|xu5+JngOHk00kbJast^+uj?dGPegdt)P(Qk^$dJF{ z5%J&75kX%L!f{1>dfH~1NG+=aBq}Ah1t!iDQ4L14XGMNm5#v?3kL%Hs%aLBS>$A0l zO<*GW^b7^BZr?TXLf69>9{(`75c>?{)7)t1=fiATuQk=5XT9@!UERbp+&cI}bI-nT zb#9QM3ZhBa8-*^?K~apMGht`8Jv&mIw&S$!v~MgMng|A2^rbgck0D>qFz^ZaH`z6L z#7_a~GdBtmq`9TwBrRNF|3ax}@anO)Vrht{=JP{w%=ThbK<>UW9NMkGIG}E`#^P%rGYYv1)Zxa~p{d8jt?R&~z_Bs;>$Z=nn1i^Ox9JNTp^Gl9hF;AX!o0 z!L^K%Y*%KhebuU)B1UR&HMWhO(#QqZcz_*$#onxb$)2$xPL+s7d~aYcziM1hr0Wt6 z5>ln5%6${PUR4Muer5Ebze3Z8&)+zEarLqoXuLDFzhXcW2G1zI%R52cl5QHyAMLgG zKSCY4x-EaQW!o9qp@&IvS4B6|QNoAYTUfP7U;lx&)=Aan!?vFIJm|DJ$fBvqqK_IA z-bIMb2oPAhENKpwmMtl;2_BP}IR@af6<1~G�Y^`oq~E&FfmWd@Utz&6-dMNvv^n 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%0D6F!uiXa)UyCvo&hLzQdzyz@OsD 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