Skip to content

Commit f56d23c

Browse files
authored
Merge pull request #4 from sopify-ai/feature/plan-b1-bootstrap-policy
feat(installer): tighten workspace bootstrap policy
2 parents d2e77ad + ec34c76 commit f56d23c

32 files changed

Lines changed: 1632 additions & 239 deletions

.sopify-skills/blueprint/background.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
# 知识布局 V2 蓝图背景
1+
# 蓝图背景与目标
22

3-
状态: 已与 runtime V2 目录契约对齐
3+
本文定位: 解释这套蓝图为什么存在、要解决什么问题,以及本轮明确的目标与非目标。
44

55
## 背景
66

.sopify-skills/blueprint/design.md

Lines changed: 158 additions & 62 deletions
Large diffs are not rendered by default.

.sopify-skills/blueprint/tasks.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
# 蓝图任务
1+
# 蓝图路线图与待办
22

33
状态: 只保留未完成长期项与明确延后项;已完成项不继续留在本文件。
4+
本文定位: 只记录仍未完成的长期事项与明确延后项,不替代当前 plan 的执行任务清单。
45

56
## 未完成长期项
67

.sopify-skills/plan/20260326_5-plan-20260326-phase1-2-3-plan-plan-20260326-ph/design.md

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@
2020
- B1 只承诺迁移可见性、提示与说明
2121
- B1 不承诺一键升级器,也不承诺完整 `deactivate / clean / prune`
2222

23+
4. installer Python 最低版本 preflight 移出本轮
24+
-`5.7` 的 installer 三入口 Python 最低版本 preflight 不纳入当前 B1 主线与 `feature/plan-b1-bootstrap-policy` 分支策略
25+
- 若后续需要推进,单独立项并补对应回归;本轮不借道扩大 `bootstrap policy + code matrix + CLI surface` 的实现面
26+
2327
## Part1 收口状态
2428
- 已落地:
2529
- 首次写入授权前移到 host ingress / workspace preflight,`~go / ~go plan / ~go init``~compare / ~go finalize / ~go exec` 的首写语义已落白名单/黑名单
@@ -60,6 +64,7 @@
6064
3. 显式强意图命令与 `confirm_bootstrap` 的优先级必须固定
6165
- `~go` / `~go plan``interactive + writable + target_root 无歧义 + 未命中 brake layer` 时,可直接写入 thin stub
6266
- 仅当 `monorepo root` 存在歧义、workspace 不可写、处于 `non-interactive / non-git` 场景、或命中 brake layer 时,宿主才应回退到 `confirm_bootstrap`
67+
- `non-git` 仅作为首次激活写入前的 `confirm_bootstrap` 触发原因之一;确认成功后回到普通成功路径,不单独抬为默认成功/失败主码,只在 warning/evidence 中暴露 `non_git_workspace``ignore_mode = noop`
6368

6469
4. 语义判定层只负责提议,不负责授权
6570
- 语义层只能输出结构化 intent proposal
@@ -88,6 +93,7 @@
8893
- 最低有效性 = `JSON 可解析 + schema_version 字段存在`
8994
- `schema_version` 值域、其他字段完整性与 bundle 兼容性仍由 `preflight / validate` 负责
9095
7. `non-interactive / readonly / non-git / monorepo` 场景必须有确定性降级,不得卡在确认、不得 silent activation、不得静默写到错误 root
96+
- 其中 `non-git` 的确定性降级必须分层:写入前触发 `confirm_bootstrap`,写入后仅在 warning/evidence 中可见,不额外生成默认结果主码
9197
8. 所有授权路径都必须产出稳定 reason code,禁止 silent bootstrap,禁止 silent downgrade
9298

9399
### 非目标
@@ -183,7 +189,7 @@ workspace-local `.sopify-runtime/manifest.json` 只保留最小控制面字段
183189
1. `ignore_mode` 由 bootstrap-time explicit choice 决定并写入 thin stub;它不是每次运行都要重复携带的 CLI flag,也不依赖首次可能不存在的配置文件
184190
2. git 仓库默认写 `.git/info/exclude``ignore_mode = exclude`
185191
3. 仅在显式 commit-lock 选择时才更新 `.gitignore``ignore_mode = gitignore`
186-
4. 非 git 仓库给出可见但不阻断的降级提示,并记录为 `ignore_mode = noop`
192+
4. 非 git 仓库在首次激活写入前作为 `confirm_bootstrap` 的触发原因之一;确认并写入成功后给出可见但不阻断的 warning/evidence,并记录为 `ignore_mode = noop`,但不额外抬升为默认结果主码
187193
5. `.git/info/exclude` 使用 managed block(`BEGIN/END sopify-managed`)承载 Sopify 条目,按 best-effort 幂等追加;不以严格去重或文件锁为前提
188194
6. 若后续切换 `ignore_mode`,必须通过显式 re-bootstrap / update 流程完成,并对 Sopify 可安全归属的旧模式条目做确定性处理;超出安全判定范围的残留给出可见提示与手动 remediation,不得静默遗留
189195

@@ -222,6 +228,8 @@ workspace-local `.sopify-runtime/manifest.json` 只保留最小控制面字段
222228
- `action_level``primary_code` 分离;消费侧仅可基于这三者做分支、渲染与测试断言
223229
- `global_bundle_missing / global_bundle_incompatible / global_index_corrupted / legacy_fallback_selected` 保持独立 `primary_code`,以支持不同的 actionable hint
224230
- `legacy_fallback_selected` 不得 silent downgrade;若允许继续执行,必须带有可见性或确认语义
231+
- `stub_invalid` 保持独立 `primary_code`;其 remediation 指向 workspace-local `.sopify-runtime/manifest.json`,不得与全局 bundle 问题混桶
232+
- `legacy_fallback_blocked` 不进入默认结果 `primary_code` 集合;仅作为对应 global failure outcome 的 `evidence` / doctor / status 补充诊断暴露
225233
- `message_hint` 仅作 `debug/unstable` 辅助文本;消费侧不得依赖它驱动逻辑、渲染用户提示或编写稳定测试断言
226234

227235
2. Host Ingress Contract
@@ -239,6 +247,12 @@ workspace-local `.sopify-runtime/manifest.json` 只保留最小控制面字段
239247
- `violations[].error_kind` 值集固定为 `missing | invalid_value | invalid_path | not_found | unreadable`
240248
- 当目标存在但不可作为目录使用时,`error_kind = not_found`,并可通过 `actual_kind = file | broken_symlink | other` 提供附加诊断;symlink 最终指向目录时视为合法
241249

250+
4. Result-Code Layering
251+
- `default primary codes` 只保留会改变默认 `next_step` 的结果:`stub_selected / stub_invalid / global_bundle_missing / global_bundle_incompatible / global_index_corrupted / legacy_fallback_selected / host_mismatch / ingress_contract_invalid / root_confirm_required / readonly / non_interactive`
252+
- `diagnostic-only identifiers` 只经 `evidence` 与 CLI warning surface 暴露,不新增新的稳定机器字段:`non_git_workspace / ignore_written / root_reuse_ancestor_marker / invalid_ancestor_marker / legacy_fallback_blocked`
253+
- `non_git_workspace` 不是默认成功主码,也不是默认失败主码;它只在首次激活写入前作为 `confirm_bootstrap` 触发原因,写入后只留在 warning/evidence,并同时暴露 `ignore_mode = noop`
254+
- `confirm_bootstrap` 的触发原因不得与结果主码混用:写入前由 checkpoint reason / evidence 表达,写入后成功路径回到 `stub_selected`
255+
242256
## CLI 渲染层补充冻结
243257
1. 渲染层职责
244258
- CLI 渲染层只消费稳定机器事实:`primary_code + action_level + evidence`,以及 `ingress_contract_invalid` 下的 `violations[]`
@@ -303,6 +317,7 @@ workspace-local `.sopify-runtime/manifest.json` 只保留最小控制面字段
303317
- 为 stub-first 与 legacy fallback 补 reason code 矩阵
304318
- 为 dual-host / old workspace / non-git 仓库补回归测试
305319
- 同步总纲与迁移说明(仅限可见性/说明;不包含一键迁移器)
320+
- installer `--workspace` 本轮仅保留 internal / maintainer prewarm,不作为 B1 正式用户入口;若后续要正式支持 monorepo `activation_root` / root confirm UX,需在 B1 后单独立项
306321

307322
## 验收门
308323
1. 新 workspace bootstrap 后只落 thin stub,不再复制整包 runtime

0 commit comments

Comments
 (0)